【问题标题】:Can letrec be the same as letrec*?letrec 可以和 letrec* 一样吗?
【发布时间】:2021-11-25 09:05:50
【问题描述】:

如果我在我的 Scheme 解释器中实现了letrec*,我是否可以简单地实现letrec,使其与letrec* 相同?方案标准是否允许这样做?

【问题讨论】:

  • 不,在很多情况下您不希望这种作用域行为。
  • 你用哪种语言实现解释器?
  • @alinsoar 解释器将在 Scheme 或 OCaml 中实现。有关系吗?
  • @Flux 当然,差别很大。
  • @SK-logic 你能提供一个letrec 不能被letrec* 替换的小例子吗?

标签: scheme language-lawyer letrec


【解决方案1】:

嗯……

r6rs 使用语言"It should be possible to evaluate each <init> without assigning or referring to the value of any <variable>" (强调添加),但我认为formal semantics 表示实现必须引发异常:

$ scheme
> (letrec ([x 1]
           [y (+ x 1)])
    y)
Exception: attempt to reference undefined variable x

> (alias letrec letrec*)
> (letrec ([x 1]
           [y (+ x 1)])
    y)
2
> 

(alias letrec letrec*) 是 Chez 使 letrec 与 letrec* 相同)

r7rs 提供了一个 letrec 宏扩展为 letset!PDF第69页):

(define-syntax letrec
        (syntax-rules ()
  ((letrec ((var1 init1) ...) body ...)
    (letrec "generate temp names"
             (var1 ...)
             ()
             ((var1 init1) ...)
             body ...))
  ((letrec "generate temp names" ()
             (temp1 ...)
             ((var1 init1) ...)
             body ...)
           (let ((var1 0 #|<undefined>|#) ...)
             (let ((temp1 init1) ...)
               (set! var1 temp1)
               ...
               body ...)))
  ((letrec "generate temp names" (x y ...)
             (temp ...)
             ((var1 init1) ...)
             body ...)
  (letrec "generate temp names" (y ...)
             (newtemp temp ...)
             ((var1 init1) ...)
             body ...))))

(nb &lt;undefined&gt; 被 0 替换) 使用这个产生:

> (letrec ([x 1]
           [y (+ x 1)])
    `(,x . ,y))
(1 . 1)
>

(可以在 Chez Scheme 中 (expand '(letrec ([x 1] [y (+ x 1)]) y)) 了解原因)

(编辑:Ghuloum & Dybvig 2009 Fixing Letrec (reloaded) (PDF) 讨论 letrec 和 letrec*)

【讨论】:

  • “应该”的下一段开始于“实现职责:实现必须在 表达式的求值期间检测对 的引用(使用一种特定的求值顺序和求值顺序) 表达式)。如果实现检测到这种违反限制的行为,它必须引发异常 [...]'。我认为这清楚地表明“应该”应该是“必须”,即使没有阅读形式语义。
猜你喜欢
  • 2011-01-04
  • 2021-01-28
  • 2018-11-10
  • 2012-01-29
  • 2012-01-18
  • 2011-04-13
  • 2013-05-07
  • 2021-04-30
  • 2020-07-24
相关资源
最近更新 更多