我正在尝试 SICP 第 4 章的示例(编写 LISP 解释器的一部分)
(define (definition-value exp)
(if (symbol? (cadr exp))
(caddr exp)
(make-lambda
(cdadr exp) ; formal parameters
(cddr exp) ; body
)
)
)
(define (make-lambda parameters body)
(cons 'lambda (cons parameters body))
)
我测试过,'(define (double x) (+ x x))) 上的 definition-value 应该返回一个 lambda 函数
( (definition-value '(define (double x) (+ x x))) 10)
Racket 输出
procedure application: expected procedure, given: (lambda (x) (+ x x)); arguments were: 10
“(lambda (x) (+ x x))”不是一个过程吗?或者它是一个引用?如果它是引用,有什么方法可以“取消引用”它?
definition-value
返回作为参数提供给它的定义表达式中的值:
(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)
无效。它不是一个函数,它只是一个 s-expression .
definition-value
是 an interpreter 的一部分.该解释器是“取消引用”的方式,即解释函数定义。不同的解释器可以用不同的方式来解释相同的函数定义,从而为生成的语言提供不同的语义。
表达式的计算必须在上下文中进行 - 它们出现在某些 lexical scope 中(代码中变量可见的区域),这会产生 environments (还有,this)。在上面的示例中,y
是在正在解释的程序中 的某个封闭范围内定义的。尝试通过调用 Racket's eval
在 REPL 中解释该表达式,y
有什么值(value)?
我是一名优秀的程序员,十分优秀!