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