emacs lisp中的评估顺序

nai*_*vin 8 lisp emacs elisp operator-precedence

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

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

(member 9 '(1 2 3 4 (sq 3)))
Run Code Online (Sandbox Code Playgroud)

这评估到nil但我期待的价值是(9)

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

因为我只是为了测试非零条件而需要它,所以我最终可以使其工作如下,

(member 9 (cons (sq 3) '(1 2 3 4)))
Run Code Online (Sandbox Code Playgroud)

评估为 (9 1 2 3 4)

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

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

任何帮助赞赏.

Gre*_* E. 17

问题是你引用了列表,因此不会评估它的元素,而只是作为文字符号传递.如果您想要在将其他元素作为文字传递时评估列表中的某些元素,则最方便的形式是使用反引号,即:

(member 9 `(1 2 3 4 ,(sq 3)))
Run Code Online (Sandbox Code Playgroud)

反引号的行为与普通引号相同,除了以逗号开头的列表元素进行评估,评估结果替换回列表.

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

(member 9 (list 1 2 3 4 (sq 3)))
Run Code Online (Sandbox Code Playgroud)