2010-11-18 104 views
3

假設我有一個功能解析符號

CL-USER> (defun trimmer (seq) "This trims seq and returns a list" 
     (cdr 
     (butlast seq))) 
TRIMMER 
CL-USER> (trimmer '(1 2 3 VAR1 VAR2)) 
(2 3 VAR1) 
CL-USER> 

注意如何,由於QUOTE,VAR1和VAR2都沒有解決。假設我想將符號VAR1和VAR2解析爲它們的值 - 是否有標準函數來執行此操作?

+3

而使用'list'而不是'quote'有什麼問題? – ffriend 2010-11-18 17:54:39

+0

在Lisp的背景下,「解析」意味着什麼? Lisp中用於計算值的原始操作稱爲評估。 – 2010-11-19 07:34:14

回答

4

Backquote是值插值到引用列表,這些通常的方式:

> (setq var1 4 var2 5) 
5 
> `(1 2 3 ,var1 ,var2) 
(1 2 3 4 5) 

編輯補充:如果你想處理一個列表中,這樣的符號與他們symbol-value代替,那麼你需要的功能的東西像這樣:

(defun interpolate-symbol-values (list) 
    "Return a copy of LIST with symbols replaced by their symbol-value." 
    (loop for x in list 
     collect (if (symbolp x) (symbol-value x) x))) 

> (interpolate-variables '(1 2 3 var1 var2)) 
(1 2 3 4 5) 

然而,這似乎是一件奇怪的事情。你能說更多關於你想要達到的目標嗎?幾乎肯定有比這更好的方法來做到這一點。

+0

我不知道列表中可能有多少個未解析的變量。 – 2010-11-18 18:06:22

+0

怎麼回事?在你的問題描述中你提到使用'QUOTE'。如果你可以使用'QUOTE',當然可以使用反引號? (也許你需要更明確地描述你的問題。) – 2010-11-18 18:31:34

+0

@Gareth:我正在使用引號來確保第一個參數不作爲函數進行計算。 – 2010-11-18 20:47:20

6

請勿使用quote創建包含變量的列表;使用list代替:

CL-USER> (trimmer (list 1 2 3 var1 var2)) 
(2 3 value-of-var1) 

(其中value-of-var1var1的值)。

Quote只能阻止評估它的任何論點。如果它的參數碰巧是一個列表文字,那麼返回。但是,要創建不僅是文字的列表,請使用list。你可以使用反引用語法,但是在這種情況下,這是相當模糊的。