Common lisp 获得;公共lisp:setf公共lisp:list*未定义;通用口齿不清

Common lisp 获得;公共lisp:setf公共lisp:list*未定义;通用口齿不清,common-lisp,Common Lisp,我是一个普通的口齿不清的新手。我对以下宏有一些问题: 我所拥有的: 假设我有一个全局变量*JAN2018*,它是: (:NAME "*JAN2018*" :MONTH "Jan" :YEAR 2018 :EXPENSES (:VALUE NIL :TAGS NIL)) 如果我跑 (setf (getf *jan2018* :expenses) '(:value 23 :tags '("a" "b"))) (test *jan2018*) 2018年1月我拿到了 (:NAME "*JAN20

我是一个普通的口齿不清的新手。我对以下宏有一些问题:

我所拥有的:

假设我有一个全局变量
*JAN2018*
,它是:

(:NAME "*JAN2018*" :MONTH "Jan" :YEAR 2018 :EXPENSES (:VALUE NIL :TAGS NIL))
如果我跑

(setf (getf *jan2018* :expenses) '(:value 23 :tags '("a" "b")))
(test *jan2018*)
2018年1月我拿到了

(:NAME "*JAN2018*" :MONTH "Jan" :YEAR 2018 :EXPENSES
 (:VALUE 23 :TAGS '("a" "b")))
问题:

现在我有了宏:

(defmacro test (sym)
  (setf `(getf ,sym :expenses) '(:value 23 :tags '("a" "b"))))
如果我跑

(setf (getf *jan2018* :expenses) '(:value 23 :tags '("a" "b")))
(test *jan2018*)
我得到(使用SBCL)

我要做的是传递一个符号并更新它的一个字段。为什么会出现此错误,以及如何继续更新列表?

您当前的问题 要调试宏,请使用:

这是因为您试图在宏展开时执行
(setf(列出'getf*jan2018*…)

恐怕我不能提供任何具体的建议,因为不清楚你到底想通过宏观实现什么

你的实际问题 您使用的设施不正确。 使用函数而不是宏:

(defun test (sym)
  (setf (getf sym :expenses) '(:value 23 :tags '("a" "b"))))
你眼前的问题 要调试宏,请使用:

这是因为您试图在宏展开时执行
(setf(列出'getf*jan2018*…)

恐怕我不能提供任何具体的建议,因为不清楚你到底想通过宏观实现什么

你的实际问题 您使用的设施不正确。 使用函数而不是宏:

(defun test (sym)
  (setf (getf sym :expenses) '(:value 23 :tags '("a" "b"))))

你的意思是
`(setf(getf,sym:expenses)(:value 23:tags)(“a”“b”))
?哈!我知道发生了什么事。getf之前的后引号使setf的参数成为一个列表。是的,我似乎是这个意思。你是说
`(setf(getf,sym:expenses)'(:value 23:tags)(“a”“b”))
?哈!我知道发生了什么事。getf之前的后引号使setf的参数成为一个列表。是的,看来我是那个意思。谢谢。我认为我没有展示代码的其余部分是不公平的。我去掉了一些代码,这使得我选择使用宏的方法不得而知。话虽如此,你的回答从宏观上暴露了我的问题。谢谢。我认为我没有展示代码的其余部分是不公平的。我去掉了一些代码,这使得我选择使用宏的方法不得而知。话虽如此,你的回答暴露了我在宏观上的问题。