2013-04-22 53 views
1

問候,我是新來的所以請照顧我。簡單計劃練習。第06章對與錯

鍛鍊6.1Simply Scheme有表達:

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

我的心說,這應該評估(方7)並返回。 (空??3)將被評估(返回原子 - 嘗試與其他原子和列表,同樣的交易)。

我很困惑。

我所知道的:在方案

  1. 的一切,是不是假的是真的。如果3爲真且不爲空(#f),爲什麼cond表達式返回(空?3)?
  2. 對cond表達式的第一個參數進行評估,如果它爲true,則返回#t,定義的值或依賴於上下文的#undefined。如果爲false,則繼續評估cond參數,直到它發生(或找不到合適的返回值),然後退出cond。

我不知道是什麼:

  1. (?空3)對自己的回報#F。爲什麼cond在這裏終止而不是評估(方塊7)?
  2. 爲什麼在cond中(空的?3)的評估返回原子,而不是#t或#f?

我正在使用帶Slib的SCM和Simply Scheme提供的附加庫(簡單的.scm,函數.scm,ttt.scm,match.scm,database.scm)。

空嗎?在simple.scm中的定義超出了我在這一點上的方案把握。

+0

你仍然可以發佈'empty?'的定義?這些庫很難找到。 – 2013-04-22 10:28:16

+0

@ [larsmans](http://stackoverflow.com/users/166749/larsmans)當然。[簡單]中的函數定義(http://www.eecs.berkeley.edu/~bh/downloads/simply/simply.scm)。整個[圖書館](http://www.eecs.berkeley.edu/~bh/downloads/simply/)。 – usernvk 2013-04-22 12:42:49

回答

2

cond形式是這樣的:

(cond (something-to-check-for-truthiness value-if-truthiness-succeed) 
     ...other checks in the same format as above ) 

現在,如果你把你的代碼格式即可。 empty?即只是功能爲空(不是它的調用)適合於something-to-check-for-truthiness的地方,並且功能總是一個真值,因此返回的3是在empty?之後並且適合於value-if-truthiness-succeed時隙。所以,根本沒有呼叫empty?功能。

+0

@ [ankur](http://stackoverflow.com/users/553209/ankur)我閱讀你的解釋並立即得到它。經過數週的跋涉進入第15章,收集了可怕的嵌套if表達式。爲什麼不是這樣的書? – usernvk 2013-04-22 12:40:06

+1

如果你已經把它與其他'cond'例子進行了比較,那麼你可能已經有了它,當你練習更多的時候,你的大腦的s表達式解析能力將會增加,然後這個世界就會在你的腳上:) – Ankur 2013-04-22 12:50:39

+0

你可能是對的,哈哈隨着時間的推移,雙括號讓我倍感欣慰。現在清楚,白天,謝謝你的小部分。另外,我有3個代表。我可以+1嗎?怎麼樣? – usernvk 2013-04-22 13:10:38

1

這不是什麼cond做的。 cond接受一個或多個參數,每個參數必須是方案表達式的列表。

(cond(#t))是一個有效的cond語句。

它評估第一個表達式,如果爲true,則評估該列表中的許多附加s-epressions,並返回最後一個評估表達式的值。

(條件(#T 1 2 3 4(如果(號碼是多少?0) 「是啊,理智!」 「它磨它的皮膚洗劑」)))是一個有效的COND聲明

+0

哈哈,用這個'((lambda(測試)(cond(測試1 2 3 4「是啊,理智!」「它擦皮膚上的潤膚液」)(否則(退出))))#f)'真的很對。認爲兩個表達式的每個cond參數都有一個限制。奇怪的行爲。這有用嗎?我的意思是,你的例子中的'1 2 3 4'被評估,但不影響cond返回值。看起來像是浪費,特別是如果它是CPU密集型的程序。 – usernvk 2013-05-01 02:41:32

+1

@usernvk是的,在一個純函數中,只有一個或兩個表達式是有用的,但如果每個中間表達式產生副作用,比如寫入文件,打印屏幕或調用某種組!程序。 – WorBlux 2013-05-02 23:07:21