我的Scheme程序中有一个非常简单的要求来执行更多操作 在一个'if'的 true 条件中,不止一个语句。 。所以我写了我的 代码,像这样:
(if (= 1 1)
((expression1) (expression2)) ; these 2 expressions are to be
; executed when the condition is true
(expression3))
显然,上述情况不起作用,因为我无意中 用#参数创建了一个#过程。所以,要得到我的 完成工作后,我只需将上述表达式放在一个新函数中 从那里调用它,代替expression1,expression2。它 的工作原理。
所以,我的观点是:是否还有其他条件构造 可能会支持我的要求吗?
答案 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