以下代码的方案中的等价性是什么?
if (condition)
{
function1;
function2;
}
else
{
function3;
function4;
}
感谢。
答案 0 :(得分:4)
代码为每个true和false分支执行块的并行代码是:
(if (condition)
(begin
(function1)
(function2))
(begin
(function3)
(function4)))
答案 1 :(得分:3)
这取决于。你真的应该尝试用方案中的实际问题进一步缩小你的问题,因为答案将取决于你想要做什么。
在惯用方案中,大多数应该没有副作用,所以你有
(if predicate-expression
consequent-expression
alternative-expression) ;; alternative is optional but should be used anyway.
但是使用你的代码,你在分支中有不止一件事,比如:
int test (condition)
{
if (condition)
{
function1();
return function2();
}
else
{
function3();
return function4();
}
}
在这里,为了让function1
和function3
做任何有用的事情,它必须改变,读或写一些东西,也称为副作用。您应该尽量避免这种情况,因此在Scheme中您可以使用let
来存储临时变量,然后在返回时执行调用,就像这样使用:
(define (test condition)
(if condition
(let ((tmp (function3)))
(function4 tmp))
(function4 (function3))))
现在。您最终需要针对一些程序的副作用,然后您需要使用begin
或使用具有明确开头的cond
。
(if predicate-expression
(begin
consequent-side-effect-expression
consequent-tail-expression)
(begin
alternative-side-effect-expression
alternative-tail-expression))
现在begin
将几个表达式连接在一起,而开始块的结果是它的最后一个表达式,因此您甚至可以在谓词中使用它。 Cond在每个结果中都有明确的开头因此,当我需要多个结果或开头时,我经常从if
切换到cond
:
(cond (predicate-expression consequent-side-effect-expression
consequent-tail-expression)
(predicate2-expression consequent2-tail-expression2)
(else alternative-side-effect-expression
alternative-tail-expression))
通常当有副作用时,你并不总是需要替代品。例如。你实际上对if
返回的内容不感兴趣,因为它也可能不在尾部位置。在这些情况下,您在(rnrs control (6))
库when
和unless
中有明确的开头:
(when expression
consequent-side-effect-expression
...
consequent-tail-expression)
(unless expression
consequent-side-effect-expression
...
consequent-tail-expression)
let
或procedure
也有明确的开头:
(let ()
(display "hello") ; displays "hello"
5) ; returns 5
(define (test x)
(display x) ; display x
(+ x 5)) ; return x+5
答案 2 :(得分:1)
怎么样
(if condition
then-code
else-code)
Scheme也有更通用的
(cond
((test1) case-1)
((test2) case-2)
...
(else else-case))
如果您使用的是Racket,那么
(when test then-code)
是if
没有其他。
答案 3 :(得分:0)
有几个Intro to Scheme网站涵盖了这类事情。以下是包含链接的示例:
(define (min a b)
(if (< a b)
a
b))
答案 4 :(得分:0)
WorBlux replied in another thread:
(如果是condition1(开始function1 function2)(开始function3 function4))&#39;开始&#39;是一个强制顺序的过程/宏 从左到右评估每个参数,并返回 评估的最后一个参数的值。在每个条款的cond形式 包含在一个隐含的开头。定义特殊形式也是 如此包装,所以你可以做(cond(condition1 function1 function2)(否则 function3 function4)) - WorBlux