16

我的 Scheme 程序中有一个非常简单的要求,即在“if”的真实条件下执行多个语句。. 所以我写了我的代码,如下所示:

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

显然,上述方法不起作用,因为我无意中创建了一个带有 # 参数的 # 过程。因此,为了完成我的工作,我只需将上述表达式放入一个新函数中并从那里调用它,而不是表达式 1、表达式 2。有用。

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

4

5 回答 5

23

在 MIT-Scheme 中,这并没有太大的不同,您可以使用begin

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

或使用条件:

(cond ((= 1 1) expression1 expression2)
      (else expression3))
于 2009-07-17T15:48:43.897 回答
2

(begin ...)是您评估多个表达式并返回最后一个表达式的方式。许多其他构造充当“隐式”begin块(它们允许多个表达式,就像begin块一样,但您不需要说begin),例如cond子句的主体,definefor 函数的主体,alambda的主体,的主体一等let;您可能一直在使用它而没有意识到它。但是对于if,这在语法中是不可能的,因为有两个表达式(一个表示真,一个表示假)彼此相邻,因此允许多个表达式会使其模棱两可。因此,您必须使用显式begin构造。

于 2009-07-17T18:22:34.897 回答
1

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

COND 在 Scheme 中看起来像这样:

(cond [(= 1 1)
       (expression1)
       (expression2)]
      [else
       (expression3)])
于 2009-07-17T15:48:04.337 回答
1

您可以使用 (begin ...) 在 if 语句的真正分支中获取您想要的内容。看这里

于 2009-07-17T15:51:36.793 回答
0

使用具有if两种以上情况的语句涉及嵌套,例如:

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

usingcond似乎是表达条件语句的首选方式,因为它比一堆嵌套if的 s 更容易阅读,并且您还可以执行多个语句而无需使用该begin子句:

(cond ((test-1)
       (expression-1))
      ((test-2) 
       (expression-2)
       (expression-3))
      (else 
       (default-expression)))
于 2012-09-16T12:06:18.040 回答