【问题标题】:Order of evaluation in emacs lispemacs lisp 中的求值顺序
【发布时间】:2012-06-25 18:21:21
【问题描述】:

我正在尝试用 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 是一种可接受的解决方法,还是有更好/正确的方法来获得所需的行为?

* 虽然无法确定 emacs lisp 使用什么顺序评估,但我在方案解释器中尝试了相同的表达式并得到了相同的答案,并且从 SICP 我知道该方案使用应用顺序评估。现在我真的很迷茫!

任何帮助表示赞赏。

【问题讨论】:

    标签: emacs lisp elisp operator-precedence


    【解决方案1】:

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

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

    反引号的行为与普通引号相同,不同之处在于对以逗号开头的列表元素进行求值,并将求值结果替换回列表中。

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

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

    【讨论】:

    • 非常感谢。这很有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多