和宏修改

时间:2014-05-18 20:37:29

标签: macros scheme

(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

1 个答案:

答案 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的替代方案是否是一对。