Macros 宏观调控

Macros 宏观调控,macros,scheme,Macros,Scheme,这是已修改的宏,与最后一行不同。我知道的正确方法是 (define-macro and (lambda args (if (null? args) ‪#‎t‬ (if (null? (cdr args)) (car args) (if (car args) `(and ,@(cdr args)) ‪#‎f‬))))) 但我不知道这种改变会如何影响这个宏的行为。。我认为它的工作原理是一样的,但是如果没有,你能给出一个它不工作的例子吗?在这

这是已修改的宏,与最后一行不同。我知道的正确方法是

(define-macro and
  (lambda args
     (if (null? args) ‪#‎t‬
         (if (null? (cdr args)) (car args)
             (if (car args) `(and ,@(cdr args)) ‪#‎f‬)))))

但我不知道这种改变会如何影响这个宏的行为。。我认为它的工作原理是一样的,但是如果没有,你能给出一个它不工作的例子吗?
在这里输入code

这样你就有了宏扩展时间和运行时间。让我们想象一下,我将您对
的第一个定义与
(和(pair?lst)(cdr lst))
一起使用。有效的代码是
(if(car args)`(and@(cdr args))‪#‎F‬))和参数是
((pair?lst)(cdr-lst))
(car-args)
在宏扩展中时间是
(pair?lst)
,它不是#f(除了#f之外的任何东西都是真的),但是请注意,您没有运行
(pair?lst)
,您只是确保我没有编写
(和#f某事)
。函数中运行的代码需要生成代码,并且它在运行时没有数据,而是具有源代码中表示的参数

将最后一行更改为
`(if,(car args)(and,@(cdr args))‪#‎F‬)))))
您不再检查数据
(pair?lst)
是否为#f,但它会变成
(if(pair?lst)(and(cdr lst))#f)
并且在运行时
如果
将根据
lst
是否为一对执行后续或替代操作

  `(if ,(car args) (and ,@(cdr args)) ‪#‎f‬)))))