emacs lisp中的评估顺序

时间:2012-06-25 18:21:22

标签: emacs lisp elisp operator-precedence

我正在尝试在emacs lisp中写一些我的第一个代码而我无法理解以下行为

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

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

此评估结果为nil,但我期望的值为(9)

现在我猜* emacs lisp使用了应用程序顺序评估,那么为什么在应用函数之前没有评估列表呢?

由于我只需要测试一个非零条件,我终于可以按照以下方式工作了,

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

评估为(9 1 2 3 4)

我的问题是这是否有效,因为(sq 3)是一个函数(cons)的“直接”参数,而不像之前的例子那样它是参数中的一个元素?在这里使用cons是否是可接受的解决方法,或者是否有更好/正确的方法来获得所需的行为?

*虽然无法确定哪些订单评估emacs lisp使用,我在方案解释器中尝试了相同的表达式并得到了相同的答案,并且从SICP我知道该方案使用应用程序订单评估。现在我真的很困惑!

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:17)

问题在于您引用了列表,因此将评估其元素的 none ,但仅作为文字符号传递。如果你想以文字形式传递其他元素来评估列表中的某些元素,最方便的形式是使用反引号,即:

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

反引号的行为与普通引号相同,只是评估前面带有逗号的列表元素,并将评估结果替换回列表。

或者,您可以使用list函数来评估其参数(除非明确引用):

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