試想一下,你寫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
和#f
在my-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的程序版本將被打印出來。這也是如何實現and
和or
。
除了你在這裏得到的答案之外,你可能會看到[(爲什麼(申請和'(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)。問題的主題與你的問題有點不同,但答案解釋了一些相同的概念。 –
謝謝!這兩個帖子非常有啓發性。現在我想我需要閱讀SICP。 – babel92
這是非常值得的閱讀,它[免費在線](http://mitpress.mit.edu/sicp/full-text/book/book.html)。 –