(define-macro and
(lambda args
(if (null? args) #t
(if (null? (cdr args)) (car args)
(if (car args) `(and ,@(cdr args)) #f)))))
这是修改后的宏,在最后一行是不同的。我所知道的正确方法是正确的
`(if ,(car args) (and ,@(cdr args)) #f)))))
但我不知道这种变化将如何影响这个宏的行为。我认为它的作用是一样的,但如果它没有,你可以举一个例子,当它赢了吗?吨?enter code here
答案 0 :(得分:0)
所以你有宏扩展时间,你有运行时。让我们假设我使用and
与(and (pair? lst) (cdr lst))
的第一个定义。有效的代码是(if (car args) `(and ,@(cdr args)) #f))
,args是((pair? lst) (cdr lst))
。宏扩展时间(car args)
为(pair? lst)
且不是#f(除了#f之外的任何内容都是真的)但请注意您没有运行(pair? lst)
,您只是在向我保证没有写(and #f something)
。函数中运行的代码需要生成代码,并且它在运行时没有数据,而是具有源代码中表示的参数。
通过将您的最后一行更改为`(if ,(car args) (and ,@(cdr args)) #f)))))
,您不再检查数据(pair? lst)
是否为#f但是变为(if (pair? lst) (and (cdr lst)) #f)
并且在运行时if
将会产生结果或基于lst
的替代方案是否是一对。