2012-06-25 123 views
7

我想寫一些我的第一個代碼中的Emacs Lisp,我無法理解以下行爲秩序emacs的評價口齒不清

(defun sq (x) (* x x)) 

(member 9 '(1 2 3 4 (sq 3))) 

這個計算結果爲nil,但我期待的價值爲(9)

現在我猜emacs lisp使用applicative-order評估,那麼爲什麼在函數應用之前未對列表進行評估?

因爲我需要它只是用於測試非空條件下,我終於可以讓它工作如下,

(member 9 (cons (sq 3) '(1 2 3 4))) 

計算結果爲(9 1 2 3 4)

我的問題是做這項工作,因爲(sq 3)是一個函數(cons)的「直接」參數不像前面的例子中它是一個參數內的元素?在此使用cons是一種可接受的解決方法,還是有更好/正確的方法來獲得所需的行爲?

*雖然無法確定emacs lisp使用的順序評估,但我在方案解釋器中嘗試了相同的表達式,並從SICP獲得了相同的答案,我知道該方案使用適用的順序評估。現在我真的很困惑!

任何幫助表示讚賞。

回答

16

問題是,你正在引用列表,因此沒有它的元素將被評估,但只會作爲文字符號傳入。如果您想同時使其它作爲文字評估清單中的某些元素,最方便的方式是使用反引號,即:

(member 9 `(1 2 3 4 ,(sq 3))) 

反引號的行爲與正常報價,除了前面那個名單元素通過逗號進行評估,並將評估結果代入列表中。

或者,你可以使用list功能,評估其參數(除非有明確的引用):

(member 9 (list 1 2 3 4 (sq 3))) 
+0

非常感謝。這很有幫助:) – naiquevin

+1

@naiquevin,我的榮幸。 –