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))))))