【问题标题】:And macro modification以及宏修改
【发布时间】:2014-05-18 20:37:29
【问题描述】:
(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

【问题讨论】:

    标签: macros scheme


    【解决方案1】:

    所以你有宏扩展时间和运行时间。让我们想象一下,我将and 的第一个定义与(and (pair? lst) (cdr lst)) 一起使用。有效的代码是(if (car args) `(and ,@(cdr args)) ‪#‎f‬)),参数是((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 进行后续或替代一对与否。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-22
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      相关资源
      最近更新 更多