【问题标题】:Lisp SBCL macro quoted list as parameterLisp SBCL 宏引用列表作为参数
【发布时间】:2015-03-26 18:19:37
【问题描述】:

假设我有一个像

这样的宏
(defmacro repeat (times &body body)
 (let ((x (gensym)))
  `(dotimes (,x ,times)
    ,@body)))

然后我可以在repl上运行

CL-USER> (repeat 2 (print "Hi"))

"Hi"
"Hi"
NIL

如果我跑了

CL-USER> (list 'print "Hi")
(PRINT "Hi")

那为什么我不能运行

CL-USER> (repeat 2 (list 'print "hi"))
NIL

反引号只是给了我一个列表,不是吗?这与我不使用反引号(s 表达式列表)时传递给 body 参数的内容不同吗?

【问题讨论】:

    标签: macros common-lisp quote


    【解决方案1】:

    您的代码运行良好,只是没有按照您认为的方式运行。

    (repeat 2 (print "Hi")) 对其第二个参数求值两次,因此它会打印两次"Hi"。它还返回两次"Hi",但dolist,因此repeat 丢弃了print 的返回值。

    (repeat 2 (list 'print "hi")) 对其第二个参数求值两次,因此它创建列表(print "hi") 两次并丢弃它。要让它真正打印"hi",你必须评估它两次次(一次产生code(print "hi")第二次评估打印代码"hi")。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-30
    • 1970-01-01
    相关资源
    最近更新 更多