2015-04-21 122 views
2

unquoting符号下面的一段代码给了我预期的结果:Common Lisp的:在反引号

(let ((name 'test) 
     (args '("arg1" "arg2"))) 
    `(defun ,name ,@args)) 

;; (DEFUN TEST "arg1" "arg2") 

为什么如果args是一个符号列表做了QUOTE出现?

(let ((name 'test) 
     (args '('arg1 'arg2))) 
    `(defun ,name ,@args)) 

;; (DEFUN TEST (QUOTE ARG1) 'ARG2) 
+2

'('arg1'arg2)'不是一个符号列表,它是一个列表列表。第一个列表是'(引用arg1)',第二个列表是'(引用arg2)'。 –

+1

我认为标准打印机通过将数据'(quote x)'打印为''x'来做一个大的破坏。 – Sylwester

回答

8

阅读器将'symbol扩展为(quote symbol)。所以你的情况

'('arg1 'arg2) 

相当于

(quote ((quote arg1) (quote arg2))) 

它评估这份名单:

((quote arg1) (quote arg2)) 

评估您的形式开始在拼接列表中的元素反引号结果((quote arg1)(quote arg2))在结果列表(defun ...)中的相同位置作为之前的字符串。

我不知道为什么你的实现打印第一个拼接元素扩大,但不是第二个。但是,如上所述,两种形式在阅读时是等同的。

+1

漂亮的打印机将尝试以最可读的方式打印以“defun”开头的列表。规范形式是('defun' <参数列表>),所以它将打印两个参数'quote'和'arg1'的'(quote arg1)',并且在主体中它将会;使用更短,可能更人性化的'arg2'。 – Vatine