2009-06-03 34 views
6

我正在學習計劃。下面的代碼有什麼問題?我想編寫一個程序,從列表中獲取第一個函數,然後將其應用於數字?如何在計劃中應用列表中的匿名函數?

(define num 3) 

    ;;I want to do something like this which returns 3 
    ((λ (x) x)num) 

    ;;but my functions are in a list so this should return3 
    ((first '((λ (x) x) (λ (x) (* x x)))) num) 

林收到這個錯誤對於上面的代碼:
過程應用:預期過程中,下式給出:(λ(x)的x)的;參數是:3

當我得到這些輸出時,這是什麼意思?

當我不應用任何東西時,我會得到一個很好的輸出結果。

(first '((λ(x) x)(λ(x) (*x x)))) 

回報率(λ(x)x)

回答

11

你報價,以'拉姆達,所以它不被評估。

如果你只是在提示符下輸入(λ(x)x),DrScheme會顯示你#<procedure>,這意味着它實際上已經評估了lambda表達式,並給出了返回閉包。通過引用它,你只給Scheme一個符號列表。

如果你想要把你的功能列表中,你可以這樣做:

((first (list (lambda (x) x) (lambda (x) (* x x)))) num) 

的報價,使您得到一個列表,是的,但一個其內容不會被評估。列表函數在所有參數被評估後產生一個列表。

你也可以quasiquote列表,如果你喜歡:

((first `(,(lambda (x) x) ,(lambda (x) (* x x)))) num) 
+0

謝謝。 – unj2 2009-06-03 00:59:17

2

是這些表現形式之間的區別?

> (procedure? (lambda (n) n)) 
#t 
> (procedure? (quote (lambda (n) n))) 
#f 
> (procedure? '(lambda (n) n)) 
#f 

傑伊爲你回答了這個問題,但是我還是無法支持他。

2

(lambda(x)x)不是一個過程。這是評估程序的一種形式。人們對術語有點鬆散,並且經常將lambda表單稱爲程序,作爲一種簡寫。 「Ceci n'est pas une pipe。」

+0

沒錯,但最終沒有用作解釋這些問題混淆的新手。請注意,自從那時起,球拍改變了它打印數值的方式,這導致了一個更清晰的錯誤:「......」預期程序,給出:'(λ(x)x)'...「 - 引用是新的。 – 2011-07-07 15:53:00

+1

當我是新手時,這正是我需要清除混淆的句子,所以我寫下來幫助別人。也許對於除了我之外的每個人來說,這只是「最終無用」。 – rptb1 2011-07-13 20:02:46

+1

事情是這樣的,Scheme在代碼和數據之間有一些(非常有意的!)混淆,你的解釋是正確的(正如我所說的),但它在元層次上是一種類似的混淆,其中「x」是數據,「綁定到* x *的值」是「代碼」。對於很多學生來說,這種二元性是非常混亂的,並且在他們經歷像元圓評估者之類的東西之前,大部分都不會完全清楚。 – 2011-07-14 02:20:28