2013-10-14 22 views
2

我在閱讀The Little Schemer。並感謝我的英文破碎,我很困惑這一段:「cond」,「and」和「or」in Scheme

(cond ...)也有不考慮其所有參數 的財產。但是,由於此屬性,((...)和 (或...)都可以被定義爲(cond ...)的函數,儘管 (和...)和(或) ..)可以表示爲 (條件縮寫...)-expressions:

(and a b) = (cond (a b) (else #f) 
    and 
(or a b) = (cond (a #t) (else (b)) 

如果我理解正確的話,它說(和...)和(或...)可以被(cond ...)表達式替換,但不能被定義爲包含(cond ...)的函數。爲什麼這樣?它與變體參數有什麼關係?謝謝。

p.s.我做了一些搜索,但只發現(cond ...)在它的一個條件評估爲#f時忽略了表達式。

+1

除了你在這裏得到的答案之外,你可能會看到[(爲什麼(申請和'(1 2 3))在(和1 2 3)在R5RS中工作時不起作用?](http ://堆棧溢出。com/q/17232240/1281433)和[在Scheme中使用AND與apply函數](http://stackoverflow.com/questions/387775/using-and-with-the-apply-function-in-scheme)。問題的主題與你的問題有點不同,但答案解釋了一些相同的概念。 –

+0

謝謝!這兩個帖子非常有啓發性。現在我想我需要閱讀SICP。 – babel92

+0

這是非常值得的閱讀,它[免費在線](http://mitpress.mit.edu/sicp/full-text/book/book.html)。 –

回答

4

試想一下,你寫if作爲函數/過程,而不是一個用戶定義的宏/語法:

;; makes if in terms of cond 
(define (my-if predicate consequent alternative) 
    (cond (predicate consequent) 
     (else alternative))) 

;; example that works 
(define (atom? x) 
    (my-if (not (pair? x)) 
     #t 
     #f)) 

;; example that won't work 
;; peano arithemtic 
(define (add a b) 
    (my-if (zero? a) 
     b 
     (add (- a 1) (+ b 1)))) 

my-if的問題是,作爲一個過程的程序體被執行之前,每個參數被評估。因此在atom?部分(not (pair? x))#t#fmy-if的主體得到執行之前被評估。

對於最後一個例子,意味着(add (- a 1) (+ b 1))得到評估,不管是什麼,即使a爲零,所以過程永遠不會結束。

你可以讓你自己是否有語法:

(define-syntax my-if 
    (syntax-rules() 
    ((my-if predicate consequent alternative) 
    (cond (predicate consequent) 
      (else alternative))))) 

現在,你怎麼看這是第一部分是一個模板在謂語結果和替代代表未評估的表達式。它取代對方只是重用的表情讓:

(my-if (check-something) (display 10) (display 20)) 

將與此進行更換:

(cond ((check-something) (display 10)) 
     (else (display 20))) 

隨着my-if兩個10和20的程序版本將被打印出來。這也是如何實現andor

1

不能定義condandorif功能因爲功能評估所有的參數。 (你可以將它們中的一些定義爲宏)。

請同時閱讀着名的SICPLisp In Small Piecesoriginal法文)。

+0

謝謝!這本書很棒,只是它沒有講述這麼多關於這門語言的細節。 – babel92