“if”的方案中的等价性是什么?

时间:2013-11-24 19:30:31

标签: if-statement scheme

以下代码的方案中的等价性是什么?

if (condition)
{
  function1;
  function2;
}
else
{
  function3;
  function4;
}

感谢。

5 个答案:

答案 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();
    }
}

在这里,为了让function1function3做任何有用的事情,它必须改变,读或写一些东西,也称为副作用。您应该尽量避免这种情况,因此在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))whenunless中有明确的开头:

(when expression
      consequent-side-effect-expression
      ...
      consequent-tail-expression)

(unless expression
        consequent-side-effect-expression
        ...
        consequent-tail-expression)

letprocedure也有明确的开头:

(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