【发布时间】:2018-04-03 14:11:31
【问题描述】:
有人能解释一下为什么这段代码会导致循环吗?
(define-macro proc
(lambda (n)
`(begin
(display ,n)
(set! ,n (+ ,n 1))
(if (< ,n 10)
(proc ,n)))))
(let ((x 5))
(proc x))
【问题讨论】:
-
连Scheme都没有,报告中找不到
define-macro。 -
我的意思是,有几个方案“确实”支持
define-macro,尽管它们通常(非常)不鼓励:gnu.org/software/guile/manual/html_node/Defmacros.html。 Racket 也有一个,尽管它也非常不鼓励:docs.racket-lang.org/compatibility/… -
@LeifAndersen 我认为 bipll 暗示
define-macro不在任何报告中,因此不是真正的方案形式。大多数实现都有宏,因为它是实现语言的唯一明智的方法,但这是事实上的。作为一个有效的比较:只知道在 PyPy 中工作的表单真的是 Python 代码吗?我投票赞成删除方案和 lisp 标签。 -
我的意思是,根据这个论点,我们还应该删除 Racket 标签。因为那不是真正的球拍代码,也不是球拍生态系统的一部分(除了兼容性库)。此外,Python 的标准是(afaict)CPython 实现。所以不,它不会是python。 Scheme 并没有真正的单一规范标准。正如 2017 年计划研讨会所见,计划社区无法真正决定 RNRS 文档实际上应该是什么。
-
一个阵营声称它是一个标准。但另一个人只是简单地声称它只是方案系统当前状态的一个描述符,大多数实现都试图使用它以使代码可移植性更容易。