我在尝试一个关于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))上的定义值应该返回一个lambda函数
( (definition-value '(define (double x) (+ x x))) 10)
球拍输出
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
会有什么值?关于functional-programming - SICP示例在 Racket 上不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16539398/