[英]And macro modification
(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
因此,您具有宏扩展时间,并且具有运行时。 让我们想象一下,我(and (pair? lst) (cdr lst))
使用了and
的第一个定义。 有效的代码是(if (car args) `(and ,@(cdr args)) #f))
和args是((pair? lst) (cdr lst))
。 宏扩展时间中的(car args)
是(pair? lst)
,它不是#f(除了#f以外的任何东西都为true),但是请注意,您没有在运行(pair? lst)
,您只是在确保我没有写过(and #f something)
。 函数中运行的代码需要编写代码,并且在运行时没有数据,而是具有源代码中表示的参数。
通过将最后一行更改为`(if ,(car args) (and ,@(cdr args)) #f)))))
您不再检查数据(pair? lst)
是否为#f,但是它会变成(if (pair? lst) (and (cdr lst)) #f)
并且在运行时if
会基于lst
做结果或替代。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.