关于Scheme中的“If ..”(plt-scheme)

时间:2009-07-17 15:44:29

标签: lisp scheme racket

我的Scheme程序中有一个非常简单的要求来执行更多操作 在一个'if'的 true 条件中,不止一个语句。 。所以我写了我的 代码,像这样:

(if (= 1 1)
 ((expression1) (expression2))  ; these 2 expressions are to be
                                ; executed when the condition is true
  (expression3))

显然,上述情况不起作用,因为我无意中 用#参数创建了一个#过程。所以,要得到我的 完成工作后,我只需将上述表达式放在一个新函数中 从那里调用它,代替expression1,expression2。它 的工作原理。

所以,我的观点是:是否还有其他条件构造 可能会支持我的要求吗?

5 个答案:

答案 0 :(得分:22)

在MIT-Scheme中,您可以使用begin

(if (= 1 1)
    (begin expression1 expression2)
    expression3)

或使用Cond:

(cond ((= 1 1) expression1 expression2)
      (else expression3))

答案 1 :(得分:2)

(begin ...)是评估多个表达式并返回最后一个表达式的方法。许多其他构造充当“隐式”begin块(它们允许多个表达式,就像begin块一样,但您不需要说begin),就像{{1}的主体一样1}}子句,函数cond的正文,define的正文,lambda的正文等;你可能在没有意识到的情况下使用它。但对于let,这在语法中是不可能的,因为有两个表达式(一个用于true,一个用于false)彼此相邻,因此允许多个表达式会使其不明确。所以你必须使用一个明确的if结构。

答案 2 :(得分:1)

您可以使用COND,或者将表达式放入Lisp中的PROGN(我不确定它是如何在PLT Scheme中调用的。编辑:它被称为BEGIN )。

COND在Scheme中看起来像这样:

(cond [(= 1 1)
       (expression1)
       (expression2)]
      [else
       (expression3)])

答案 3 :(得分:1)

你可以使用(开始......)在if语句的真正分支中获得你想要的东西。见here

答案 4 :(得分:0)

使用包含两个以上案例的if语句涉及嵌套,例如:

(if (test-1)               ; "if"
    (expression-1)
    (if (test-2)           ; "else-if"
        (expression-2)
        (expression-3)))  ; "else"

使用cond似乎是表达条件语句的首选方式,因为它比一堆嵌套的if更容易阅读,你也可以执行多个语句而不必使用{{ 1}}子句:

begin