2

hunchentoot パッケージ (NAME という名前の関数を作成する) の define-easy-handler マクロを調べて、defun 部分が機能するようにしましたが、このマクロで NAME を という名前のリストにプッシュすることはできません*observers*

(defmacro add-observer (name params &body body)
  ;; add NAME to the list *observers*
  `(push ,name *observers*)
  ;; define a lisp function with the name NAME
  ;; with key arguments given in PARAMS
  `(defun ,name (&key ,@(loop for p in params
                                collect p))
       ,@body)))

呼び出しの例#'add-observerは次のとおりです。

(add-observer below-80 (id blood-sugar)
              (when (< blood-sugar 80)
                (format t "Patient No: ~A is hypoglycemic." id))

関数 NAME が定義され、正常に動作しますが、NAME はリストに追加されません*observers*。両方の s 式を progn 内に配置するかどうかは問題ではありません。macroexpand はpush、progn がある場合とない場合の呼び出しがないことを明確に示しています。私は何を間違って解釈していますか?

編集

次のようなprognでこれを試すと:

`(progn
  (push ...
  (defn ...

で失敗しUnbound variable: below-80ます。そして、バッククォートを #'push と #'defun に戻すと、再び #'push が機能しません。

4

1 に答える 1