天天看點

【SICP練習】28 練習1.34



練習1.34

這道題我一開始不用edwin的時候覺得是會陷入無限循環之中。後來在edwin上試了一下才發現會報錯,輸出如下:

(f f)

;the object 2 is notapplicable.

;to continue, call restartwith an option number:

; (restart 2) => specify a procedure to usein its place.

; (restart 1) => return to read-eval-printlevel 1.

; start debugger? (y or n):

我們先按地41頁的描述,将函數f用lambda和define寫出來。

(define f (lambda (g) (g2)))

當我們用f作為參數傳入f函數中的時候,編譯器将與f關聯的lambda表達式傳入函數f,如下:

(f (lambda (g) (g 2)))

此時參數已經具備了,編譯器又會将lambda表達式傳入f函數中,也就是和f相關的lambda表達式中的g。

((lambda (g) (g 2)) (lambda(g) (g 2)))

此時後者傳回2,随後前者也得出2。最終就是(2 2)了,但是2并不是一個函數,而編譯器嘗試着找出和2關聯的lambda表達式。嘗試無果,便傳回”the

object 2 is not applicable.”。

繼續閱讀