【问题标题】:Is define implementation dependent in R7RS?定义实现是否依赖于 R7RS?
【发布时间】:2021-12-28 00:09:24
【问题描述】:

我早就知道define is scary and should be used with caution unless you know for sure how your implementation handles it。出于兴趣,我最近打开了 R7RS 并阅读了我能找到的关于 define 的所有内容,但没有任何东西让我觉得其中任何一个都依赖于实现。我是否遗漏了什么或者define 在 R7RS 中不再依赖于实现?

【问题讨论】:

  • 不,它不依赖于实现。我认为早期版本的 Scheme 使速记格式成为可选的,但很长一段时间以来都不是这样。
  • 允许实现在语言的任何地方添加扩展。因此,如果 Racket 添加了在 R7RS 中未指定的使用 define 的方法,则该扩展是依赖于实现的。但这并不特定于define。 Racket 还允许 [] 作为 () 的替代品,但这也不在 R7RS 中。
  • 我从没听过有人说define 很可怕。只要您遵循适当的 RnRS 规范,它就应该像在任何符合实现中所宣传的那样工作。当然,不同的实现可能会增加一些功能。

标签: scheme r7rs


【解决方案1】:

您似乎正在向answer you linked 读取一些不存在的内容。

define 一直被很好地定义,就像let 一样被很好地定义。大多数人选择仅在模块的顶层使用define 来创建顶层绑定,但这是一种风格上的选择——它也能够创建本地绑定,就像let 一样,如果你在内部和在“内部”主体的顶部,例如在过程或let 或类似的内部。正如另一个答案指出的那样,在这种情况下,多个defines 在技术上等同于letrec*

【讨论】:

  • 是的,我总结一下,在较低级别,definebindset! 运算符的组合,通常使用 letrec* 的语义创建。跨度>
【解决方案2】:

define 最常见的解释是将其替换为letrec*

但是这个问题确实有很多可能的解释,语言并没有强加任何解释。从语言的角度来看,任何解释都是有效的。

【讨论】:

  • “define 最常见的解释是用 letrec* 代替它”——这不只适用于内部定义吗?据我了解,在程序的最外层,define 的行为与set! 非常相似。
  • @Flux 是的,在内部,当您将其解释为 letlec* 时,它也会被 set! 替换。这就是letrec* 所做的。您可以将其解释为letrec* 任何地方都可以。
猜你喜欢
  • 1970-01-01
  • 2017-03-09
  • 1970-01-01
  • 2018-07-22
  • 1970-01-01
  • 2015-09-22
  • 2015-01-09
  • 2017-02-21
  • 1970-01-01
相关资源
最近更新 更多