Emacs ELisp:如何在';其他';块

Emacs ELisp:如何在';其他';块,emacs,elisp,Emacs,Elisp,在使用ELisp时,如何在if语句的else块中执行多个表达式?是正确且惯用的。如果您想在If的else块中执行多条语句,并且您只关心Emacs Lisp,请按照他的回答进行操作 在Emacs Lisp和Common Lisp中,当您希望按顺序执行多个操作(如更改变量、在屏幕上打印某些内容,通常是与函数返回值无关的内容),然后仅返回一个表达式的值时,使用或。它们都计算其中的所有表单,但只分别返回最后一个、第一个和第二个表达式的值 (程序12345)返回5,(程序12345)返回1,(程序1234

在使用ELisp时,如何在
if
语句的
else
块中执行多个表达式?

是正确且惯用的。如果您想在
If
else
块中执行多条语句,并且您只关心Emacs Lisp,请按照他的回答进行操作

在Emacs Lisp和Common Lisp中,当您希望按顺序执行多个操作(如更改变量、在屏幕上打印某些内容,通常是与函数返回值无关的内容),然后仅返回一个表达式的值时,使用或。它们都计算其中的所有表单,但只分别返回最后一个、第一个和第二个表达式的值

(程序12345)
返回5,
(程序12345)
返回1,
(程序12345)
返回2。这显然是无用的,因为在
progn
prog1
prog2
中评估表单的目的是为了获得副作用。因此,以下所有内容都将在(和缓冲区中)中打印字符串
α
β
γ
δ
,但只返回其中一个字符串:

(progn (message "α") (message "β") (message "γ") (message "δ")) ; => "δ"
(prog1 (message "α") (message "β") (message "γ") (message "δ")) ; => "α"
(prog2 (message "α") (message "β") (message "γ") (message "δ")) ; => "β"
所有3个函数都存在于Emacs Lisp和Common Lisp中。但是如果要返回第三个表达式的值呢?没有
prog3
。合并现有的!以下所有返回值
γ

(progn (message "α") (message "β") (prog1 (message "γ") (message "δ"))) ; => "γ"
(prog1 (progn (message "α") (message "β") (message "γ")) (message "δ")) ; => "γ"
(prog2 (message "α") (progn (message "β") (message "γ")) (message "δ")) ; => "γ"
(prog2 (message "α") (prog2 (message "β") (message "γ") (message "δ"))) ; => "γ"
在Common Lisp中,如果要将语句分组并在
中仅返回最后一个语句的值,请执行以下操作:

(if t
    (progn (message "ε") (message "ζ"))
    (progn (message "η") (message "θ"))) ; returns ζ
(if nil
    (progn (message "ε") (message "ζ"))
    (progn (message "η") (message "θ"))) ; returns θ
在Emacs Lisp中,您仍然必须将语句分组到
中,然后用
progn
prog1
prog2
,但您不必在
中的
块中分组,因此phils给出了答案。在Emacs Lisp中
(如果为nil 1 2 3)
将返回3,而在普通Lisp中,如果
特殊运算符的参数过多,则会出错


另请参见:部分“来自”。

您不需要
progn
,因为这已经是默认行为:

C-hf
if
RET

if是“C源代码”中的一种特殊形式

(如果是COND,则为ELSE…)

如果COND生成非nil,则执行,否则执行…
返回THEN的值或ELSE的最后一个值。
那么必须是一个表达式,否则。。。可以是零个或多个表达式。
如果COND产生nil,并且没有其他值,则该值为nil

要重复使用sindikat的示例:

(如果(>12)
(信息“真实”)
(信息“假”)
(信息“我重复,完全错误”))

当然,如果您希望在
THEN
表单中计算多个表达式,您可以使用
progn

这不是最佳答案。使用progn是可以的,但由于允许在else中使用多个表达式,因此更具可读性。事实上,elisp程序员经常故意围绕这个事实组织整个构造(如果您有一个成功步骤为多个步骤的肯定测试,那么在这些步骤为其他步骤的地方进行否定测试)。这取决于您想要返回的内容。如果要返回最后一个表达式的值,请使用phils的答案或此答案。如果要返回第一个表达式的值,prog1将起作用。如果要返回序列中任意表达式的值,请在progn中嵌套prog1。