gpt4 book ai didi

emacs - emacs lisp 中的评估顺序

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:42 27 4
gpt4 key购买 nike

我正在尝试用 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 我知道该方案使用应用顺序评估。现在我真的很困惑!

感谢任何帮助。

最佳答案

问题是您引用了列表,因此没有 的元素将被评估,而只是作为文字符号传入。如果您想评估列表的某些元素,同时将其他元素作为文字传递,最方便的形式是使用反引号,即:

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

反引号的行为与普通引号相同,除了对逗号前面的列表元素进行求值,并将求值结果代回列表。

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

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

关于emacs - emacs lisp 中的评估顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11195003/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com