我正在研究計劃中的作業MetaCircular評估者,並且我需要允許用戶通過將其添加到表中來安裝特殊的表單。這個想法是,當用戶輸入諸如(square 5)
之類的東西時,評估者將查找名爲square
的表格。如果找到,它將返回lambda
聲明,如(lambda (x) (* x x))
。計劃 - 作爲壞功能對象的Lambda
當代碼返回lambda
語句時出現問題。我收到以下錯誤信息:
Error: Bad function object:(lambda (x) (* x x))
真是個奇怪的是,我可以傳遞參數到從我的表中檢索功能,它只是我在之前定義的過程體作爲拉姆達聲明,不作爲以lambda
開頭的列表僅供參考,以下代碼不起作用。 exp
會像(install-special-form 'square (lambda (x) (* x x)))
,所以在這種情況下,name
計算結果爲square
和func
計算爲(lambda (x) (* x x))
:
(define (install-eval exp)
(define name (cadadr exp))
(define func (caddr exp))
(if (special-form-lookup (list name func))
#f
(begin
(append! special-forms-table (list name func))
name)))
下面是一些代碼,不工作:
(define (install exp-list)
(append! special-forms-table exp-list))
(install (list 'square (lambda (x) (* x x))))
我猜我的問題是,當使用不起作用的代碼時,lambda
被評估爲報價,而不是實際的lambda
?如何獲得我的用戶輸入以存儲可以檢索和使用的實際lambda
聲明?
工作完美!謝謝! – JazzBullets
而在一個使用'eval'的解釋器中,自由變量的工作原理是什麼? – Sylwester