2008-10-21 28 views
3

問:有人可以幫忙解釋一下這個方案的過程

((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3)) 

這是期中考試#1,我把「81 9」他以爲我忘了跨越一出lawl,所以我過了81,和他去了噢。無論如何,我不明白爲什麼它是81.

我明白爲什麼(lambda (x) (* x x)) (* 3 3) = 81,但第一lambda我不明白什麼是x和y值在那裏,以及[body] (x y)做什麼。

所以我希望有人能向我解釋爲什麼第一部分看起來並不像它做什麼。

+0

你爲什麼要添加標籤作業ddaa?它不是作業這是一個測試問題,我錯了,我正在尋找信息爲什麼。 – chicken 2008-10-21 21:20:36

回答

9

這需要一些壓痕,以澄清

((lambda (x y) (x y)) 
(lambda (x) (* x x)) 
(* 3 3)) 
  • (lambda (x y) (x y));作爲唯一參數,請撥xy
  • (lambda (x) (* x x));評估其參數的平方。
  • (* 3 3);評估爲9

因此,整個事情的意思是:「用9作爲參數調用平方函數」。

編輯:同樣的事情可以寫成

((lambda (x) (* x x)) 
(* 3 3)) 

我想這次演習的目的是要突出如何評估方案的形式涉及的隱函數的應用程序。

6

讓我們看看這再次...

((lambda (x y) (x y)) (lambda (x) (* x x)) (* 3 3)) 

評價我們評價又將它的每一部分的形式。我們的形式有三個要素。這一個是在第一(功能)位置:

(lambda (x y) (x y)) 

這是一種形式的第二元件和第一函數參數:

(lambda (x) (* x x)) 

最後形式的元件,因此第二該函數的參數。

(* 3 3) 

評估順序在這種情況下並不重要,所以我們從左側開始。

(lambda (x y) (x y)) 

LAMBDA創建了一個函數,所以這計算爲的是有兩個參數,x和y,然後應用x至y(換言之,帶一個參數調用Ýx)的函數。我們稱之爲call-1

(lambda (x) (* x x)) 

這個計算結果爲一個函數,它接受一個參數並返回該參數的平方。所以我們可以稱之爲廣場

(* 3 3) 

這顯然計算結果爲。

OK,所以評價的第一次運行之後,我們有:

(call-1 square 9) 

爲了評估這一點,我們稱之爲呼叫1有兩個參數,和。應用呼叫1給我們:

(square 9) 

因爲這正是呼叫1那樣 - 它調用它與它的第二個參數的第一個參數。現在,的平方爲,這是整個表達式的值。

2

也許翻譯該代碼Common Lisp的幫助澄清其行爲:

((lambda (x y) (funcall x y)) (lambda (x) (* x x)) (* 3 3)) 

甚至更​​明確:

(funcall (lambda (x y) (funcall x y)) 
     (lambda (x) (* x x)) 
     (* 3 3)) 

事實上,這第一拉姆達沒有做任何有用的,因爲它的沸點降至:

(funcall (lambda (x) (* x x)) (* 3 3)) 

它等於

(let ((x (* 3 3))) 
    (* x x)) 

等於

(let ((x 9)) 
    (* x x)) 

等於

(* 9 9) 

等於81

1

到目前爲止發佈的回答都不錯,因此而不是重複他們已經說了,也許這裏是另一個你可以看看程序的方式:

(define (square x) (* x x)) 

(define (call-with arg fun) (fun arg)) 

(call-with (* 3 3) square) 

它仍然看起來很奇怪嗎?

相關問題