我是Scheme語言的新手。我讀了「簡單計劃」一書,並在整個下一個例子就是:我不明白方案評估示例
(cond (empty? 3)
(square 7)
(else 9))
當我運行它,我得到了3我知道,每個COND表達需要服用2個ARGS:一爲「EVAL」條件,第二個是「答案」。 eval在哪裏?答案在哪裏?爲什麼?
我是Scheme語言的新手。我讀了「簡單計劃」一書,並在整個下一個例子就是:我不明白方案評估示例
(cond (empty? 3)
(square 7)
(else 9))
當我運行它,我得到了3我知道,每個COND表達需要服用2個ARGS:一爲「EVAL」條件,第二個是「答案」。 eval在哪裏?答案在哪裏?爲什麼?
這是不是一個真實的例子。
正如您正確理解的那樣,每個子句都有條件和結果。條件是:空?,square and else。答案是,和。
cond
將查找評估爲#t
的第一個條件。在計劃中,除#f
之外的所有內容均爲#t
。所以第一個條件計算爲真:
> (if empty? "true" "false")
"true"
和cond
返回的第一個結果,。
寫cond
表達正確的方法是這樣的:
(cond ((even? 3) 3)
((odd? 5) 5)
(else -1))
所以你看,謂詞表達式是每個子句的左側部分,如果其中任何一個爲真,則表達式的對權利進行評估,返回最後一個值;在上面的例子中返回5
。
關於你的代碼,這是發生了什麼:在empty?
函數作爲#t
(因爲在計劃什麼,這不是明確#f
被認爲是真實的),所以第一條是真實的表達,它的權評估,返回,這恰好是3
。您可以輕鬆地驗證此行爲,比如因爲再次函數名稱empty?
被認爲是真正的下列片段將返回"ok"
:
(if empty? "ok" "not ok")
的語法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>
。這不是你想要的。
問題中的原始代碼也是編寫cond語句的正確方法。 – WorBlux
@WorBlux語法上是的,但它是無用的條件 - 第一個條件將永遠是真實的(除非'empty?'被綁定到'#f',但仍然...) –