【问题标题】:Nest functions in Lisp `if` operatorLisp `if` 运算符中的嵌套函数
【发布时间】:2019-01-01 15:00:54
【问题描述】:

我在 Common Lisp 中有这个 if 代码:

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

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

如果条件(在本例中为 1 = 1)为真,那么我想打印“Hello”并返回 NIL。我怎样才能做到这一点?据我了解,我只能做这两个动作之一。

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

【问题讨论】:

  • 见特殊运算符PROGN
  • @RainerJoswig 非常感谢。欢迎回答

标签: lisp common-lisp


【解决方案1】:

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

最基本的构造是progn,它按顺序计算所有给定的形式,最后返回最后一个的值。 Common Lisp 中的许多构造都有一个隐式 progn,例如。 G。函数体、let 体等。还有prog1prog2 做同样的事情,但分别返回运算符后面的第一种或第二种形式的值。

所以,progn 是你应该在这里使用的。

但是,如果您只有一个 consequent,没有 else 子句,您可以使用 when 而不是 ifWhen 有一个隐含的progn。还有unless,因为当你只有一个 else 子句时,没有结果。

应该注意,还有其他组合结构可以满足其他需求:block 允许使用显式return-from 形式来确定运行时的值。 Tagbody 允许使用 go 在其中跳转(但不返回任何内容,您需要一个额外的块来执行此操作)。这些对于创建新的控制结构(例如在宏中)非常有用。

【讨论】:

    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2017-01-03
    • 2012-02-03
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多