我在尝试一个关于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-valuean interpreter的一部分这个解释器是“解引用”的方法,即解释函数定义。不同的解释器可以有不同的方式来解释相同的函数定义,从而为生成的语言提供不同的语义。
表达式的求值必须在上下文中完成-它们出现在特定的lexical scope(代码中变量可见的区域)内,这会导致environments(也就是this)在上面的例子中,y是在被解释的程序的一些封闭作用域中定义的试图通过调用Racket's eval来解释REPL中的表达式,y会有什么值?

关于functional-programming - SICP示例在 Racket 上不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16539398/

10-09 02:55