我if在Common Lisp中有这个代码:
(if (= 1 1) ((write "Hello") NIL) (else-function...))
Run Code Online (Sandbox Code Playgroud)
显然,1 = 1,我想这样做:
如果条件(在这种情况下1 = 1)为真,那么我想打印"Hello"并返回NIL.我怎样才能做到这一点?根据我的理解,我只能做这两个动作中的一个.
我应该使用lambda同时打印和返回NIL吗?
为了将表达式组合成顺序执行(首先执行此操作,然后执行此操作,最后返回此操作),您需要将它们包装成某些内容,除非您或多或少地编写了toplevel脚本.
最基本的构造是progn,它按顺序评估所有给定的形式,最后返回最后一个的值.Common Lisp中有许多结构有一个隐含的 progn,如函数体,让机构等也有prog1和prog2它做同样的,但运营商后,分别返回第一或第二形式的值.
所以,progn你应该在这里使用.
但是,如果您只有一个结果,没有else子句,则可以使用when而不是if. When有隐含的progn.还有unless,因为当你只有一个else子句时,没有结果.
应该注意的是,还有其他组合构造用于其他需求:block允许使用显式return-from形式在运行时确定值. Tagbody允许使用go它在其中跳转(但不返回任何东西,你需要一个额外的块来做到这一点).这些对于创建新的控制结构(例如在宏中)非常有用.