練習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.”。