gpt4 book ai didi

functional-programming - 使用方案本身实现内置方案函数 begin(),相同的代码在 MIT-SCHEME 和 Racket 中的行为不同?

转载 作者:行者123 更新时间:2023-12-04 08:40:41 25 4
gpt4 key购买 nike

我正在阅读r5rs方案标准,发现begin()其实是一个库语法,也就是说可以由scheme自己定义,标准在标准末尾给出了实现。

我按照 r5rs 使用如下定义语法实现了 begin():

(define-syntax mybegin
(syntax-rules ()
((mybegin expr) expr)
((mybegin expr1 expr2 ...)
(let ((x expr1))
(mybegin expr2 ...)))))

然后我尝试使用函数来实现它,这是我的代码:
(define begin-func
(lambda (expr1 expr2)
((lambda (x) expr2) expr1)))

这是我的测试用例:
(define x 3)
(define y 3)
(mybegin
(set! x 4)
(set! x 5))
(begin-func
(set! y 4)
(set! y 5))

我使用#lang 方案在 MIT-SCHEME 和 Racket 中运行我的代码,
x 在 MIT-SCHEME 和 Racket 中都是 5,然而,y 在 MIT-SCHEME 中是 4 而在 Racket 中是 5

所以,这是我的问题:
  • 我们真的可以使用 pure 来实现 begin()
    功能方案?
  • 我的代码有什么问题吗,使用宏的代码和使用的代码
    功能?
  • 为什么相同的代码在 MIT-SCHEME 和 Racket 中表现不同?
  • 最佳答案

    begin是一种特殊形式,按顺序计算每个元素,并计算到最后一个表达式。你永远不需要begin在纯功能方案中,但可以获得与 begin 类似的功能在没有 begin 的方案中以功能方式作为特殊形式或嵌入lambda表格或亲属。这只是一个异常(exception),那就是 define在里面。 define在顶级开始将被全局定义,而模仿将使用程序来按顺序进行评估和define然后只会成为当过程超出范围时死亡的本地绑定(bind)。
    begin必须将其定义为语法,因为如果您执行以下过程:

    (define (mybegin . args)
    ...)
    mybegin 时的所有参数调用将按照实现特定的顺序进行评估。该报告说评估需要随之而来,这样您就不会看到一个实现一次获得 4 个,另一个获得 5 个,但是您会看到其中一个每次都在相同的过程中发生。不能保证评估也会在两个不同的过程中以相同的顺序发生,但是许多 Scheme 实现通常以相同的顺序进行。

    Racket 总是 按顺序评估参数,这没关系,因为报告说您可以随心所欲地进行,而麻省理工学院至少有时会以相反的顺序进行评估。

    关于functional-programming - 使用方案本身实现内置方案函数 begin(),相同的代码在 MIT-SCHEME 和 Racket 中的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25235306/

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