0

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

4

1 回答 1

2

嗯……

r6rs 使用的语言应该可以在不分配或引用任何 <variable> 的值的情况下评估每个 <init>” (添加了重点),但我认为形式语义 表明实现必须引发异常:

$ 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扩展为letand的宏( PDFset! 的第 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<undefined>被 0 替换)使用它会产生:

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

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

(编辑:Ghuloum & Dybvig 2009 Fixing Letrec(重新加载)(PDF)讨论了 letrec 和 letrec*)

于 2021-11-25T12:20:09.563 回答