我是个口齿不清的新手。下面的宏出现了一些问题:
我拥有的:
假设我有一个全局变量*JAN2018*,它是:
(:NAME "*JAN2018*" :MONTH "Jan" :YEAR 2018 :EXPENSES (:VALUE NIL :TAGS NIL))如果我跑了
(setf (getf *jan2018* :expenses) '(:value 23 :tags '("a" "b")))我得到了*jan2018*
(:NAME "*JAN2018*" :MONTH "Jan" :YEAR 2018 :EXPENSES
(:VALUE 23 :TAGS '("a" "b")))问题:
现在我有了宏:
(defmacro test (sym)
(setf `(getf ,sym :expenses) '(:value 23 :tags '("a" "b"))))如果我跑了
(test *jan2018*)我得到(使用SBCL)
*The function (COMMON-LISP:SETF COMMON-LISP:LIST*) is undefined.
[Condition of type UNDEFINED-FUNCTION]*我想要做的是传递一个符号并更新它的一个字段。为什么我要得到这个错误,以及如何继续更新列表?
发布于 2018-01-07 20:30:24
你眼前的问题
要调试宏,请使用macroexpand
(macroexpand-1 '(test *jan2018*))
*** - FUNCTION: undefined function (SETF CONS)这是因为您试图在宏展开时执行(setf (list 'getf *jan2018* ...) ...)。
恐怕我不能提供任何具体的建议,因为不清楚你到底想通过宏观实现什么。
你的实际问题
你使用的是不正确的设施。使用函数而不是宏:
(defun test (sym)
(setf (getf sym :expenses) '(:value 23 :tags '("a" "b"))))https://stackoverflow.com/questions/48140829
复制相似问题