私は(nameという名前の関数を作成します)define-easy-handler macro from the hunchentoot packageを学び、仕事に関数定義の一部を得たが、私はこのマクロは*observers*
と呼ばれるリストに名前をプッシュすることができません。例をなぜこの共通のlispマクロは最初のs-expを評価しないのですか?
(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 below-80 (id blood-sugar)
(when (< blood-sugar 80)
(format t "Patient No: ~A is hypoglycemic." id))
関数名が定義されていると正常に動作しますが、名前がリスト*observers*
に追加されません:#'add-observer
に呼んでいます。両方のs式をprognの中に入れるかどうかは関係ありません。マクロエキスパンドは、push
への呼び出しがないことを明確に示しています。私は間違った解釈をしていますか?
EDIT
のように私はprognのでこれを試してみてください。それはUnbound variable: below-80
で失敗
`(progn
(push ...
(defn ...
。そして私がバッククォートを# 'pushと#' defunに戻すと、再び# 'pushは機能しません。
'progn'を使ってうまく動作します。あなたがそれを追加するとき何を観察していますか? –
@Madara Uchiha私はprognの使用に間違いを付け加えました。おそらく私は予言を悪用するでしょう。 – barerd
これがあなたの本当のマクロであれば、 '(pのparams collect pは)'は単に '(copy-list params)'です。しかし、コピーはここでは不要です。 – coredump