2015-04-21 96 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