gpt4 book ai didi

macros - 方案:定义和定义语法规则之间的区别

转载 作者:行者123 更新时间:2023-12-03 11:21:19 25 4
gpt4 key购买 nike

我在 Racket 中得到了两个 if 语句指令:

(define (if-fun c thn els) (if c thn els))
(define-syntax-rule (if-mac c thn els) (if c thn els))

有人介意解释如何评估这两个 if 语句之间的差异,并提供使用每个 if 语句定义的示例吗?在这个例子中,我很难区分宏和函数参数的计算方式。我试过一些小例子,例如:
(if-fun (> 3 4) true false)  ;; #f
(if-mac (> 3 4) true false) ;; #f

但显然这并不能帮助我区分这两个定义。

-谢谢

最佳答案

从您的评论中,您似乎已经明白了这一点。关键问题是,什么时候(如果有的话)对事情进行评估?

另一个关键点是函数和宏是完全不同的,即使它们的定义和使用看起来是一样的。

  • 你使用函数和宏的方式看起来完全一样:(thing other stuff) .不清楚 thing是一个函数或一个宏。这有好有坏。大多数情况下它非常好。
  • 至于定义事物,使用 define-syntax-rule 定义宏的方式与您的方式极为相似 define一个函数。这有好有坏。我想说的是,当你第一次学习时,这通常很糟糕——因为它很容易忘记宏与函数的完全不同。这可能会令人困惑!


  • 当您调用函数 , 在运行时评估所有参数,然后将其提供给函数。这就是为什么要争论 if-fun喜欢 (/ 1 0)会导致错误。它在控制甚至进入内部之前被评估(并引发除以零错误)if-fun .

    (旁注:当您使用惰性求值或手动“thunk”调用函数时,会延迟求值。if-lazy 能够调用 thnels 过程参数,仅在需要时. 当条件为假时,它甚至不会尝试调用 els 。)
  • 当您调用宏 :
  • 时间:宏在您的程序运行之前就完成了它的工作。宏在编译时工作,而不是在运行时工作。
  • 什么:宏将代码段转换为其他代码段。但代码尚未评估。代码仅在稍后的运行时进行评估。所以“论据”到if-mac不被宏评估。他们只是插入真正的代码 if形式,这是一个宏(或原始的特殊形式),只评估所需的内容。


  • 最后一个令人困惑的部分是,因为您示例的 then 和 else 表达式没有任何副作用并且不会导致任何错误,因此差异并不明显。

    关于macros - 方案:定义和定义语法规则之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33106777/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com