Macros Scheme中define宏的变量捕获机制
考虑一下这个不卫生的计划:Macros Scheme中define宏的变量捕获机制,macros,scheme,Macros,Scheme,考虑一下这个不卫生的计划: (define-macro for (lambda (i i1 i2 . body) (let ((start (gensym)) (stop (gensym)) (loop (gensym))) `(let ((,start ,i1) (,stop ,i2)) (let ,loop ((,i ,start)) (if (<
(define-macro for
(lambda (i i1 i2 . body)
(let ((start (gensym))
(stop (gensym))
(loop (gensym)))
`(let ((,start ,i1)
(,stop ,i2))
(let ,loop ((,i ,start))
(if (< ,i ,stop)
(begin ,@body
(,loop (+ 1 ,i)))))))))
它开始计数,从不停止
现在,我试着对其进行宏扩展,但不明白为什么它会循环,而不仅仅是发出错误信号
没有if重新定义部分的扩展如下:
(let ((#:start15 1)
(#:stop16 5))
((letrec ((#:loop17 (lambda (i)
(if (< i #:stop16)
(begin (print i)
(#:loop17 (+ 1 i)))))))
#:loop17)
#:start15))))
粗俗地说:
(let ((:start4 1)
(:stop5 5))
(let :loop6 ((i :start4))
(if (< i :stop5)
(begin (print i)
(:loop6 (+ 1 i))))))
但是如果我在if所在的位置插入符号x,我会在需要特殊形式或过程的地方使用符号。。。为什么解释器不停下来抱怨呢?你将if绑定为一个普通值,这意味着if-blah-blah-blah不再是一种特殊的形式,这意味着它将转向函数应用程序。此应用程序显然会导致错误,但由于Scheme是严格的,因此在尝试应用此函数之前,需要计算该函数的参数。一旦函数表达式的计算结果为非函数,它可能会因错误而停止,但实现很少这样做。因此,首先计算递归循环调用,但这会导致另一个if函数调用,等等
但更重要的是:
定义宏对你的健康有害啊,谢谢!我错过了评估订单问题。至于定义宏和我的健康状况,我实际上是在试图挖掘定义宏的问题,以包括在课程笔记中-
(let ((#:start15 1)
(#:stop16 5))
((letrec ((#:loop17 (lambda (i)
(if (< i #:stop16)
(begin (print i)
(#:loop17 (+ 1 i)))))))
#:loop17)
#:start15))))
(let ((:start4 1)
(:stop5 5))
(let :loop6 ((i :start4))
(if (< i :stop5)
(begin (print i)
(:loop6 (+ 1 i))))))