gpt4 book ai didi

functional-programming - SICP 示例不适用于 Racket

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:52 24 4
gpt4 key购买 nike

我正在尝试 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-valuean interpreter 的一部分.该解释器是“取消引用”的方式,即解释函数定义。不同的解释器可以用不同的方式来解释相同的函数定义,从而为生成的语言提供不同的语义。

表达式的计算必须在上下文中进行 - 它们出现在某些 lexical scope 中(代码中变量可见的区域),这会产生 environments (还有,this)。在上面的示例中,y 是在正在解释的程序中 的某个封闭范围内定义的。尝试通过调用 Racket's eval 在 REPL 中解释该表达式,y 有什么值(value)?

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com