2014-03-01 78 views
0

我是Scheme語言的新手。我讀了「簡單計劃」一書,並在整個下一個例子就是:我不明白方案評估示例

(cond (empty? 3) 
     (square 7) 
     (else 9)) 

當我運行它,我得到了3我知道,每個COND表達需要服用2個ARGS:一爲「EVAL」條件,第二個是「答案」。 eval在哪裏?答案在哪裏?爲什麼?

回答

2

這是不是一個真實的例子。

正如您正確理解的那樣,每個子句都有條件結果。條件是:空?,square and else。答案是,和。

cond將查找評估爲#t的第一個條件。在計劃中,除#f之外的所有內容均爲#t。所以第一個條件計算爲真:

> (if empty? "true" "false") 
"true" 

cond返回的第一個結果,。

1

cond表達正確的方法是這樣的:

(cond ((even? 3) 3) 
     ((odd? 5) 5) 
     (else -1)) 

所以你看,謂詞表達式是每個子句的左側部分,如果其中任何一個爲真,則表達式的對權利進行評估,返回最後一個值;在上面的例子中返回5

關於你的代碼,這是發生了什麼:在empty?函數作爲#t(因爲在計劃什麼,這不是明確#f被認爲是真實的),所以第一條是真實的表達,它的權評估,返回,這恰好是3。您可以輕鬆地驗證此行爲,比如因爲再次函數名稱empty?被認爲是真正的下列片段將返回"ok"

(if empty? "ok" "not ok") 
+0

問題中的原始代碼也是編寫cond語句的正確方法。 – WorBlux

+0

@WorBlux語法上是的,但它是無用的條件 - 第一個條件將永遠是真實的(除非'empty?'被綁定到'#f',但仍然...) –

1

的語法cond是:

(cond <clause1> <clause2> …) 

where子句是:

(<test> <expression1> …) 

(<test> => <expression>) 

和最後<clause>可以(else <expression1> <expresssion2> …)。因此,忽略=>情況下,cond表達式如下:

(cond (<test> <exp1> <exp2> …) 
     … 
     (else <exp1> <exp2> …)) 

如果你與你的表達式匹配這件事:

(cond (empty? 3) 
     (square 7) 
     (else 9)) 

你看到empty?,標識符,是一個<test>這將永遠如果empty?被綁定,那麼這是真的。標識square是另一個<test>。這不是你想要的。