初回の起動でしか実行されないフックを作成したい - lisp-cookbook-ja/common-lisp GitHub Wiki

オブジェクトシステム(CLOS)

初回の起動時に、自分自身を削除するbeforeメソッドを作成することにより可能です。

(defmethod foo ()
  (write-line "foo")
  (values))

(defmethod foo :before (&aux (me #'foo))
  ;; フック
  (write-line "***only once***")
  ;; 自身を削除
  (remove-method me (find-method me '(:before) '() )))

(foo)
;->  ***only once***
;    foo
;  
;=>  No value
(foo)
;->  foo
;
;=>  No value
(foo)
;->  foo
;
;=>  No value