繁体   English   中英

和宏修改

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM