2012-10-18 75 views
3

如果我這樣做,我會得到什麼樣的東西?(list lambda lambda)

(car (list lambda lambda)) 

我想我會得到lambda回來了,這意味着我可以做

(define my_lambda (car (list lambda lambda))) 
(define foo (my_lambda (n) (+ n n))) 

但沒有工作! 謝謝,

回答

5

lambda是一種特殊形式(意爲:標準評價規則並不適用於它),在語言的核心原語的一部分,而不是可分配的價值符號或其他種類到一個變量。

回答你的問題,評估表達式(list lambda)後得到的「種類」將取決於你正在使用的Scheme解釋器,但通常你會得到一個錯誤。例如,DrRacket抱怨是這樣的:

lambda: bad syntax in: lambda 
2

在某種意義上,lambda在運行時不存在(當然,由拉姆達語句創建的功能存在的,但是這是一個不同的問題,它們不是lambda本身)。

其原因是lambda語句操作運行時不存在的其他事物;特別是它改變了變量名的含義(在你的例子中,n)。

要回答你關於lambda是什麼樣的問題,通常的答案是「語法」。幸運的是,Scheme提供了一種抽象語法的機制:宏。宏可以僅通過編譯時實體進行抽象,如變量名稱,lambda表達式和其他宏。所以,你可以寫(在球拍REPL,在這種情況下):

> (define-syntax-rule (mylambda (x ...) body) 
    (lambda (x ...) body)) 
> (define foo (mylambda (n) (+ n n))) 
> (foo 71) 
142 

有定義的宏方案的多個系統; syntax-rules系統以不尋常的方式使用...,但最終非常直觀。也可以通過編寫發佈Scheme的Scheme代碼來定義宏,這會涉及更多的複雜性。