gpt4 book ai didi

let 语句的 Lisp 评估

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

我正在编写一个 Scheme 解释器,我遇到了一个有效的 let 语句,例如:

;; should print 7
(let ((a 4) (b 3))
(let ((a (* a a))
(b (* b b)))
(+ a b)
(- a b)))

我的解释器只实现了 Scheme 的一个纯函数子集,所以不会有像 set! 这样的副作用。在纯函数式语言中,为什么要在上面的 let 语句中允许多个表达式?

在编写我的解释器时,除了 let 中的最后一个表达式,我有什么理由应该计算任何东西吗?似乎它们永远不会影响最后评估的语句的结果。

最佳答案

实际上你不能“删除”除了最后一条语句之外的所有语句,因为前面的语句可能是非终止的。例如:

(define (func) (func))

(let ()
(func) ;; does not return
1)

在这里,如果您不对 (func) 求值,您会得到错误的结果(即 1),而您应该得到非终止计算。

另一个问题是 call/cc(call-with-current-continuation)(是的,它属于功能子集)可用于从非尾计算中实际返回位置,例如:

(call-with-current-continuation
(lambda (ret)
(let ()
(ret 3)
4)))

这将返回 3 而不是 4。这仍然是纯粹的功能。

顺便说一句,(let () x y z) 等同于单语句形式 (let () (begin xy z)) 所以真正的问题是如果你需要开始 :)

关于let 语句的 Lisp 评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/652901/

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