我在Common Lisp中有此if
代码:
(if (= 1 1) ((write "Hello") NIL) (else-function...))
很显然,我想这样做:1 = 1
如果条件(在这种情况下为1 = 1)为true,那么我想打印“ Hello”并返回NIL
。我怎样才能做到这一点?据我了解,我只能执行以下两项操作之一。
我应该使用lambda打印并同时返回NIL
吗?
答案 0 :(得分:5)
为了将表达式组成顺序执行(首先执行此操作,然后执行此操作,最后返回此操作),除非您或多或少在顶层编写了脚本,否则需要将它们包装成某种东西。
最基本的构造是progn
,它按顺序评估所有给定的形式,最后返回最后一个的值。 Common Lisp中的许多构造都有一个隐式 progn
,例如。 G。函数主体,let主体等。还有prog1
和prog2
都执行相同的操作,但是分别返回运算符之后的第一种或第二种形式的值。
因此,progn
是您应该在这里使用的
但是,如果只有一个后续的no子句,则可以使用when
代替if
。 When
有一个隐式progn
。还有unless
,因为当您只有else子句时,则没有结果。
应注意,还有其他满足其他需求的结构:block
允许使用显式return-from
形式在运行时确定值。 Tagbody
允许使用go
在其中跳来跳去(但不会返回任何内容,您需要在周围加上一个额外的代码块才能做到这一点)。这些对于创建新的控件结构(例如在宏中)非常有用。