Emacs ELisp:如何在';其他';块
在使用ELisp时,如何在Emacs ELisp:如何在';其他';块,emacs,elisp,Emacs,Elisp,在使用ELisp时,如何在if语句的else块中执行多个表达式?是正确且惯用的。如果您想在If的else块中执行多条语句,并且您只关心Emacs Lisp,请按照他的回答进行操作 在Emacs Lisp和Common Lisp中,当您希望按顺序执行多个操作(如更改变量、在屏幕上打印某些内容,通常是与函数返回值无关的内容),然后仅返回一个表达式的值时,使用或。它们都计算其中的所有表单,但只分别返回最后一个、第一个和第二个表达式的值 (程序12345)返回5,(程序12345)返回1,(程序1234
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-hfif
RET
if是“C源代码”中的一种特殊形式
(如果是COND,则为ELSE…)
如果COND生成非nil,则执行,否则执行…
返回THEN的值或ELSE的最后一个值。
那么必须是一个表达式,否则。。。可以是零个或多个表达式。
如果COND产生nil,并且没有其他值,则该值为nil
要重复使用sindikat的示例:
(如果(>12)
(信息“真实”)
(信息“假”)
(信息“我重复,完全错误”))
当然,如果您希望在THEN
表单中计算多个表达式,您可以使用progn
。这不是最佳答案。使用progn是可以的,但由于允许在else中使用多个表达式,因此更具可读性。事实上,elisp程序员经常故意围绕这个事实组织整个构造(如果您有一个成功步骤为多个步骤的肯定测试,那么在这些步骤为其他步骤的地方进行否定测试)。这取决于您想要返回的内容。如果要返回最后一个表达式的值,请使用phils的答案或此答案。如果要返回第一个表达式的值,prog1将起作用。如果要返回序列中任意表达式的值,请在progn中嵌套prog1。