Functional programming SICP示例没有';不要在球拍上工作

Functional programming SICP示例没有';不要在球拍上工作,functional-programming,lisp,scheme,racket,Functional Programming,Lisp,Scheme,Racket,我正在尝试SICP第4章的一个例子(编写LISP解释器的一部分) 我对它进行了测试,'(define(double x)(+x x)))上的定义值应该返回一个lambda函数 ( (definition-value '(define (double x) (+ x x))) 10) 球拍输出 procedure application: expected procedure, given: (lambda (x) (+ x x)); arguments were: 10 “lambda(x)

我正在尝试SICP第4章的一个例子(编写LISP解释器的一部分)

我对它进行了测试,'(define(double x)(+x x)))上的定义值应该返回一个lambda函数

( (definition-value '(define (double x) (+ x x))) 10)
球拍输出

procedure application: expected procedure, given: (lambda (x) (+ x x)); arguments were: 10

“lambda(x)(+x))”不是一个程序吗?或者它是一个参考?如果它是引用,是否有任何“取消引用”的方法?

定义值返回定义表达式中作为参数提供给它的值:

(definition-value '(define x 42))  
=> 42

(definition-value '(define (qq x) (+ x y 42))) 
=> (make-lambda '(x) '((+ x y 42)))
=> '(lambda (x) (+ x y 42))
您不能将引用列表作为函数调用,因为:
('(lambda(x)(+x y 42))10
无效。它不是一个函数,它只是一个函数


定义值是的一部分。此解释器是“解引用”的方式,即解释函数定义。不同的解释器可以有不同的方法来解释相同的函数定义,从而为生成的语言提供不同的语义


表达式的求值必须在上下文中完成-它们出现在特定的(代码中变量可见的区域)内,这会导致(同样,)。在上面的例子中,
y
是在被解释程序的某个封闭范围内定义的。试图通过调用来解释REPL中的表达式,
y
的值是多少

我找到了答案,如果在文件中执行Racket脚本,Racket解释器不知道名称空间,但是REPL知道它。解决方案是在文件开头添加这一行

(define ns (make-base-namespace))
然后在使用时将ns传递给eval

(eval <what ever code reference here> ns)
(eval ns)

这将使我上面提到的例子起作用

这是我的第一个猜测,定义值返回一个引用。但是,我尝试了((eval’(lambda(x)(+x)))10)=>20,这个eval是内置的eval。但是((eval(definition value)(define(double x)(+x)))10)=>compile:unbound标识符(并且没有绑定#%app语法转换器)at:lambda in:(lambda(x)(+x))。我正在努力学习这一章,我知道最后我应该有一个有效的eval版本。然而,这确实很长,我想分别学习和测试每个函数。每个函数都做它所做的<代码>定义值
操作s表达式。评估它们并不是其讨论范围的一部分。我很困惑,如果定义值真的返回一个s表达式(lambda(x)(+x)))10,那么内置的评估函数(一旦返回值,就不再与定义值有关)应该能够评估它,不是吗?谁知道Racket在其REPL时做了什么?您可以尝试将其分为两个步骤:
(setq x(定义值)(define(double x)(+x x)))
。然后,
((eval x)10)
。然后呢?(但这测试
eval
和测试
definition value
一样多;在这里,只检查
x
的值就足够了)。它实际上是这样工作的,(define x(definition value)(define(double x)(+x)),((eval f)10)=>20,没有错误最初的问题是“不是”(lambda(x)(+x))“一个过程?”,不是“如何计算引用的lambda表达式?”。你应该问一个新问题,所以当你改变主意的时候。
(eval <what ever code reference here> ns)