首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在通用lisp中获取“公共-lisp:setf公共-lisp:list*是未定义的”

在通用lisp中获取“公共-lisp:setf公共-lisp:list*是未定义的”
EN

Stack Overflow用户
提问于 2018-01-07 19:36:41
回答 1查看 292关注 0票数 0

我是个口齿不清的新手。下面的宏出现了一些问题:

我拥有的:

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

代码语言:javascript
复制
(:NAME "*JAN2018*" :MONTH "Jan" :YEAR 2018 :EXPENSES (:VALUE NIL :TAGS NIL))

如果我跑了

代码语言:javascript
复制
(setf (getf *jan2018* :expenses) '(:value 23 :tags '("a" "b")))

我得到了*jan2018*

代码语言:javascript
复制
(:NAME "*JAN2018*" :MONTH "Jan" :YEAR 2018 :EXPENSES
 (:VALUE 23 :TAGS '("a" "b")))

问题:

现在我有了宏:

代码语言:javascript
复制
(defmacro test (sym)
  (setf `(getf ,sym :expenses) '(:value 23 :tags '("a" "b"))))

如果我跑了

代码语言:javascript
复制
(test *jan2018*)

我得到(使用SBCL)

代码语言:javascript
复制
*The function (COMMON-LISP:SETF COMMON-LISP:LIST*) is undefined.
   [Condition of type UNDEFINED-FUNCTION]*

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-07 20:30:24

你眼前的问题

要调试宏,请使用macroexpand

代码语言:javascript
复制
(macroexpand-1 '(test *jan2018*))

*** - FUNCTION: undefined function (SETF CONS)

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

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

你的实际问题

你使用的是不正确的设施。使用函数而不是宏:

代码语言:javascript
复制
(defun test (sym)
  (setf (getf sym :expenses) '(:value 23 :tags '("a" "b"))))
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48140829

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档