gpt4 book ai didi

Scheme 中的宏和内部定义

转载 作者:行者123 更新时间:2023-12-04 21:14:58 25 4
gpt4 key购买 nike

Freenode 的#scheme channel 上提出了一个很好的问题。考虑 Scheme 中的以下代码:

(define alpha 1)

(define-syntax foo
(syntax-rules (quote alpha)
((_ alpha msg) (define bar 2))
((_ other msg) (syntax-error msg)) ) )

(define (beta)
(foo alpha "beta")
(define alpha 3)
'beta )

(define (gamma)
(define alpha 4)
(foo alpha "gamma")
'gamma )

(define (delta alpha)
(foo alpha "delta")
'delta )
beta 中的哪些, gamma , 和 delta应该产生语法错误吗?哪一个呢?我已经用 Chibi Scheme 进行了检查,其中 beta很好,而 gammadelta失败。我想知道这是有意的行为还是只是 Chibi 中的错误。

根据标准,似乎应该在内部定义被重写为 letrec* 之前扩展宏。 .所以 betagamma都应该失败为 foo将匹配内部定义的 alpha ,而不是全局的。

但是,标准中没有明确规定内部定义的实际工作方式,只是可以将它们视为 letrec 快捷方式。我在 Racket 的 R5RS 上得到了相同的行为,所以我似乎在标准中遗漏了一些需要这种行为的东西。

最佳答案

好的,我终于明白你的问题了。运行您的代码具有挑战性,因为您似乎有一个“语法错误”函数,仅当它以完全扩展的代码结束时才会发出语法错误信号。任何。

我认为你的问题的答案是这样的:

这些 Scheme 家伙(Dybvig、Felleisen、Hieb、Clinger、Rees、Wand、Flatt、Culpepper 等)非常聪明!

特别是,Scheme/Racket 以某种方式设法弄清楚绑定(bind)结构是如何工作的,即使它不知道什么将成为绑定(bind)。你是对的!太疯狂了!但是 Dybvig 等人概述的算法。做了一些非常聪明的事情来确保卫生跟踪标识符是“free-identifier-equal”还是“bound-identifier-equal”(Flatt 的术语),即使它还不知道哪个绑定(bind)了另一个。我个人建议阅读“协同工作的宏”(Flatt、Culpepper、Darais、Findler)以更好地理解这一点。

如果我误解了你的问题,或者我的语气不恰当,我深表歉意!

关于Scheme 中的宏和内部定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26006248/

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