Lisp`if`运算符中的Nest函数

时间:2019-01-01 15:00:54

标签: lisp common-lisp

我在Common Lisp中有此if代码:

(if (= 1 1) ((write "Hello") NIL)  (else-function...)) 

很显然,我想这样做:1 = 1

如果条件(在这种情况下为1 = 1)为true,那么我想打印“ Hello”并返回NIL。我怎样才能做到这一点?据我了解,我只能执行以下两项操作之一。

我应该使用lambda打印并同时返回NIL吗?

1 个答案:

答案 0 :(得分:5)

为了将表达式组成顺序执行(首先执行此操作,然后执行此操作,最后返回此操作),除非您或多或少在顶层编写了脚本,否则需要将它们包装成某种东西。

最基本的构造是progn,它按顺序评估所有给定的形式,最后返回最后一个的值。 Common Lisp中的许多构造都有一个隐式 progn,例如。 G。函数主体,let主体等。还有prog1prog2都执行相同的操作,但是分别返回运算符之后的第一种或第二种形式的值。

因此,progn是您应该在这里使用的

但是,如果只有一个后续的no子句,则可以使用when代替ifWhen有一个隐式progn。还有unless,因为当您只有else子句时,则没有结果。

应注意,还有其他满足其他需求的结构:block允许使用显式return-from形式在运行时确定值。 Tagbody允许使用go在其中跳来跳去(但不会返回任何内容,您需要在周围加上一个额外的代码块才能做到这一点)。这些对于创建新的控件结构(例如在宏中)非常有用。