Scheme-Lambda作为坏函数对象

Scheme-Lambda作为坏函数对象,lambda,scheme,lisp,r5rs,Lambda,Scheme,Lisp,R5rs,我正在为家庭作业计划开发一个元循环计算器,我需要允许用户通过将特殊表单添加到表中来安装它们。其思想是,当用户输入类似于(square 5)的内容时,计算器将查找名为square的表单。如果找到它,它将返回一个lambda语句,类似于(lambda(x)(*x)) 当代码返回lambda语句时,我遇到了一个问题。我收到以下错误消息: Error: Bad function object:(lambda (x) (* x x)) 真正奇怪的是,我可以将参数传递到从表中检索到的函数中,只是我以前必须

我正在为家庭作业计划开发一个元循环计算器,我需要允许用户通过将特殊表单添加到表中来安装它们。其思想是,当用户输入类似于
(square 5)
的内容时,计算器将查找名为
square
的表单。如果找到它,它将返回一个
lambda
语句,类似于
(lambda(x)(*x))

当代码返回
lambda
语句时,我遇到了一个问题。我收到以下错误消息:

Error: Bad function object:(lambda (x) (* x x))
真正奇怪的是,我可以将参数传递到从表中检索到的函数中,只是我以前必须将过程体定义为lambda语句,而不是以
lambda

作为参考,这里的代码不起作用
exp
将类似于
(安装特殊形式的'square(lambda(x)(*x)))
,因此在本例中,
name
计算为
square
func
计算为
(lambda(x)(*x))

下面是一些有效的代码:

(define (install exp-list)
  (append! special-forms-table exp-list))
(install (list 'square (lambda (x) (* x x))))

我猜我的问题是,当使用不起作用的代码时,
lambda
被作为引号计算,而不是实际的
lambda
?如何让用户输入来存储可检索和使用的实际
lambda
语句?

您可能将lambda存储为符号列表,而不是实际过程。这就是为什么这行不通的原因:

(define f '(lambda (x) (* x x)))
(f 10)
=> Error: Bad function object: (lambda (x) (* x x))
首先尝试评估它:

((eval f) 10)
=> 100

您可能将lambda存储为符号列表,而不是实际的过程。这就是为什么这行不通的原因:

(define f '(lambda (x) (* x x)))
(f 10)
=> Error: Bad function object: (lambda (x) (* x x))
首先尝试评估它:

((eval f) 10)
=> 100

返回列表时
(lambda(x)(*x))
无法将其应用于主机,因为这类似于执行
('(lambda(x)(*x))5)
。试试看。你会得到同样的错误


当Scheme计算特殊表单
(lambda(x)(*x))
时,它返回一个闭包对象,该对象与创建它时的环境一致。当您调用它时,它将在该环境中运行主体,并将bingind添加到
x
。这需要在解释器中模拟,因此通常将
(lamba(args…)body)
计算为
(closure tag(args…)environment body)
。您的应用程序需要能够在正确的环境下在主体上调用
eval
。奥斯卡建议使用<代码> EVA<代码>从长远来看是行不通的,因为你不能用“代码> EVA 返回列表时
(lambda(x)(*x))
无法将其应用于主机,因为这类似于执行
('(lambda(x)(*x))5)
。试试看。你会得到同样的错误


当Scheme计算特殊表单
(lambda(x)(*x))
时,它返回一个闭包对象,该对象与创建它时的环境一致。当您调用它时,它将在该环境中运行主体,并将bingind添加到
x
。这需要在解释器中模拟,因此通常将
(lamba(args…)body)
计算为
(closure tag(args…)environment body)
。您的应用程序需要能够在正确的环境下在主体上调用
eval
。奥斯卡建议使用<代码> EVA<代码>从长远来看是行不通的,因为你不能用“代码> EVA 工作得很好!非常感谢。在使用
eval
的解释器中,自由变量如何工作?工作得非常好!非常感谢。在使用
eval
的解释器中,自由变量是如何工作的?