2015-05-10 105 views
5

我有這個宏,它重寫定義。如果我刪除「`」反向,它將無法工作。什麼是解釋?LISP中的反撥意味着什麼?

(defmacro define ((name &rest r) body) 
    `(defun ,name ,r ,body)) 

回答

10

單引號後跟一個值 的書面陳述將產生值:

實施例: 「(1בfoo’的) 將產生作爲打印(1 x "foo")的值。

現在假設我不希望文字符號x在列表中。 我的程序中有一個變量x,我想插入 的值,其中的值爲x

爲了紀念,我想的x價值,而不是符號x, 我x前插入一個逗號:

'(1 ,x "foo") 

它將無法正常工作,雖然是 - 我現在得到的值有一個字面逗號以及一個符號x。問題是quote不知道逗號規則。

BACKTICK或backquote知道逗號慣例,到會給出正確的結果:

> `(1 ,x "foo") 
(1 3 "foo")   ; if the value of x is 3 

在這裏閱讀更多:http://www.lispworks.com/documentation/HyperSpec/Body/02_df.htm

+0

太好了,我知道了,謝謝。還有一件事。休息之前那個&運營商做什麼? (&rest) – Alex

+1

'&rest'允許你定義具有可變參數的函數。假設你想定義一個加功能,其中(加2 3)和(加2 3 4)都起作用。這個頁面有一個很好的解釋:http://www.gigamonkeys.com/book/functions.html – soegaard

+1

我認爲值得注意的是,這個功能被稱爲** quasiquoting **或**準引用**。 –

5

反向/反向引用禁止評估每個子表達式的前面沒有跟隨運算符列表的逗號。

來自普通的lisp食譜,explanation and a few examples