如果我這樣做,我會得到什麼樣的東西?(list lambda lambda)
(car (list lambda lambda))
我想我會得到lambda
回來了,這意味着我可以做
(define my_lambda (car (list lambda lambda)))
(define foo (my_lambda (n) (+ n n)))
但沒有工作! 謝謝,
如果我這樣做,我會得到什麼樣的東西?(list lambda lambda)
(car (list lambda lambda))
我想我會得到lambda
回來了,這意味着我可以做
(define my_lambda (car (list lambda lambda)))
(define foo (my_lambda (n) (+ n n)))
但沒有工作! 謝謝,
lambda
是一種特殊形式(意爲:標準評價規則並不適用於它),在語言的核心原語的一部分,而不是可分配的價值符號或其他種類到一個變量。
回答你的問題,評估表達式(list lambda)
後得到的「種類」將取決於你正在使用的Scheme解釋器,但通常你會得到一個錯誤。例如,DrRacket抱怨是這樣的:
lambda: bad syntax in: lambda
在某種意義上,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代碼來定義宏,這會涉及更多的複雜性。