如果我已经在我的方案解释器中实现了letrec*,我可以通过使其与letrec*相同来简单地实现letrec吗?这是计划标准所允许的吗?
发布于 2021-11-25 12:20:10
嗯..。
r6rs使用语言"It be possible to evaluate each without assigning or referring to the value of any " (强调了一下),但我认为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提供了一个扩展到let和set!的letrec宏(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 <undefined> 替换为0)使用此命令会产生:
> (letrec ([x 1]
[y (+ x 1)])
`(,x . ,y))
(1 . 1)
>(可以在Chez方案中使用(expand '(letrec ([x 1] [y (+ x 1)]) y))查看原因)
(编辑:Ghuloum & Dybvig 2009 Fixing Letrec (reloaded)讨论letrec和letrec*)
https://stackoverflow.com/questions/70108371
复制相似问题