我研究了 hunchentoot 包中的 define-easy-handler 宏(它创建了一个名为 NAME 的函数),并让 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 未添加到 list *observers*
。我是否将两个 s 表达式都放在一个 progn 中并不重要。macroexpand 清楚地显示了在push
有和没有 progn 的情况下都没有调用。我在解释什么错误?
编辑
当我用这样的progn尝试这个时:
`(progn
(push ...
(defn ...
它失败了Unbound variable: below-80
。当我将反引号放回#'push 和#'defun 时,再次#'push 不起作用。