2013-11-24 50 views
-6

以下代碼在方案中的等價性是什麼?'if'方案中的等價性是什麼?

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

謝謝。

+3

這個問題似乎是題外話,因爲它是關於一個基本的編程控制結構(if/then/else)。 –

+0

這是非常基礎的知識,它有大量的資源。隨意閱讀SICP它應該回答你的大部分問題。 –

+0

可能的重複[如何\'如果\'語句工作在計劃?](http://stackoverflow.com/questions/5751052/how-does-if-statement-work-in-scheme) –

回答

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做任何有用的事情,它必須改變,讀取或寫入一些東西,也稱爲副作用。你應該儘量避免這樣的方案你要麼使用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連接在一起的幾個表達式爲一年開始塊的結果是它的最後一個表達式,所以你甚至可以用它的謂語。電導率已明確開始在每一個隨之而來的,所以我經常從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 
0

有幾個Intro to Scheme網站涵蓋了這類事情。這裏有包括來自鏈接的示例:

(define (min a b) 
    (if (< a b) 
     a 
     b)) 
1

如何

(if condition 
    then-code 
    else-code) 

方案還具有更普遍的

(cond 
    ((test1) case-1) 
    ((test2) case-2) 
    ... 
    (else else-case)) 

如果您正在使用的球拍,然後

(when test then-code) 

if沒有其他。

0

WorBlux replied in another thread

(如果條件1(開始功能1函數2)(開始功能3 function4))「開始」是一個過程/宏迫使每個參數的順序 評價從左至右,並返回 評估的最後一個參數的值。在條件形式中,每個子句 都包含在一個隱式開始中。另外,定義特殊形式也是 因此包裹,這樣就可以做(COND(條件1功能1函數2)(否則 功能3 function4)) - WorBlux

4

並行代碼,其中所述代碼執行的塊的每個的真假分支是:

(if (condition) 
     (begin 
      (function1) 
      (function2)) 
     (begin 
      (function3) 
      (function4))) 
+0

這是唯一的迄今爲止的回答解決了當時和其他部分中多個表達式的問題。 –

相關問題