2015-11-04 67 views
0

我正在阅读通用的lisp书,并使用三种书写风格来编写宏。但是这些之间有些不同。这些lisp-macro写作风格之间的区别是什么?

(defmacro test_var (var) 
    (list 'format 't var)) 

(defmacro test_var2 (var) 
    `(format t ,var)) 

(defmacro test_var3 (var) 
    '(format t) 
    var) 

,我测试这三个宏:

CL-USER> (test_var "ss") 
ss 
NIL 

CL-USER> (test_var2 "ss") 
ss 
NIL 

CL-USER> (test_var3 "ss") 
ss 

CL-USER> 

为什么剂量的第三个 “无” 基本消失?发生了什么??

供参考:下次如果我发现有关宏的一些有趣的事情,我怎么能找到它的工作细节呢?

+0

test_var3应该做什么? –

+0

这是什么书? –

+0

本书中的示例仅显示包含test_var和test_var2的语法。我写test_var3来测试它是否工作。然后我发现这个问题。 – ccQpein

回答

4

3是不是等价。使用macroexpand-1,看看您的通话将扩展为:

? (macroexpand-1 '(test_var "ss")) 
(FORMAT T "ss") 
T 

? (macroexpand-1 '(test_var2 "ss")) 
(FORMAT T "ss") 
T 

? (macroexpand-1 '(test_var3 "ss")) 
"ss" 
T 

所以(test_var "ss")(test_var2 "ss")在编译时被转换为(format t "ss")。在执行时,对format的调用打印参数作为副作用,并且REPL打印NIL,这是表达式的值(即,什么format)返回。

(test_var3 "ss")被简单地翻译为"ss"其自身评估。这里没有副作用,REPL输出这个值。

+0

这意味着宏'test_var3'看起来像返回最后一行的函数。 – ccQpein

+1

再次浏览你的书。我很肯定你在复制'test_var3'时犯了一个错误。 – uselpa

相关问题