由於您提到statement-1
和statement-2
我認爲您的代碼可以進行大量優化,因爲嵌套if
已經確定了statement-1
的狀態。這裏是我如何看待它:
(if statement-1
(if statement-2 ; statement-1 consequent
consequent-1-2-true
alternative-1-true-2-false)
(if statement-2 ; statement-1-alternative
consequent-1-false-2-true
alternative-1-2-false))
statement-2
只會因爲statement-1
評估一次要麼是虛假的或真實的。
A cond
更有用,當你有一個簡單的if-elseif,其中只有替代方案嵌套ifs。
(cond (predicate-1 consequent-1)
(predicate-2 consequent-2)
...
(predicate-n consequent-2)
(else alternative))
現在你可以使用一個let
來計算先進的陳述和使用and
檢查不止一個爲真:
(let ((result-1 statement-1) (result-2 statement-2))
(cond ((and result-1 result-2) consequent-1-2-true)
(result-1 consequent-1-true-2-false)
(result-2 consequent-1-false-2-true)
(else alternative-1-2-false)))
當然這let
是沒有必要的,如果聲明變量他們自己並因此被緩存。請注意,第一個之後的測試不需要檢查一個是否爲真,而第二個不是這樣,因爲我們知道這兩個都不是真的,那麼之前的結果就會被解僱並且cond已經完成。所有的派生人員都可以假設所有先前的謂詞都是錯誤的。
在編寫代碼時,最好考慮一下代碼更易於閱讀和理解的原因。在這種情況下,我不會使用cond
,因爲問題的性質甚至嵌套在後果和替代方案上。
簡單的布爾代數...'和','或','不是'。然後寫一個真值表。你只有2個輸入,所以你只能有4個可能的結果。編輯:一個真值表可能會導致4個'cond'子句(包括'else'),但仍然會比嵌套的'if'更清晰。 – leppie
或者,您不必檢查嵌套的if語句中的「語句1」,因爲它們已經被評估。 – leppie
這是我對@leppie感到困惑的語法本身 –