1

从 Cadence 文档中看,两者之间的区别并不是很清楚。有人可以详细说明两者之间的区别吗?

4

2 回答 2

1

使用define asdefine as 计算宏都可以定义给定句法类别的新句法构造(例如,<statement><action>),并实现替换代码以替换与宏匹配表达式(或模式)匹配的构造。在这两种情况下,宏匹配表达式都可以具有在替换代码中使用的语法参数,并替换为匹配代码中使用的实际代码字符串。

不同之处在于定义为宏时,替换代码只是写在宏体中。使用定义为计算的宏,您可以编写一个程序代码来计算所需的替换代码文本并将其作为字符串返回。它实际上是一个返回string的方法,您甚至可以使用result关键字来分配结果字符串,就像在任何e方法中一样。定义为计算宏在替换代码不固定时很有用,并且可以根据确切的宏参数值甚至语义上下文而有所不同(例如,在某些情况下,可以使用反射查询来确定确切的替换代码)。(但重要的是要记住,即使定义为计算的宏也是在编译期间而不是在运行时执行的,因此它们无法查询字段或变量的实际运行时值来决定生成的替换代码)。

以下是这两种宏类型之间的一些重要区别。

  • 定义宏更具可读性并且通常更易于编写。您只需写下要创建的代码。
  • 定义为计算宏更强。所有可以用define as实现的东西,也可以用define as computed实现,但反之则不行。当替换代码不固定时,定义为是不够的。
  • 定义为宏可以在定义后立即使用。如果它引入的结构被用于紧跟在宏后面的语句中,那么它已经被匹配了。定义为计算的宏只能在下一个文件中使用,并且不能在定义宏的同一文件中使用。
于 2014-06-22T08:24:28.700 回答
1

define as宏只是您可能从其他编程语言中知道的普通旧宏。这只是意味着在宏代码中的某些选定位置,您可以替换自己的代码。

宏允许您通过define as computed使用控制流语句(if、for 等)以编程方式构建输出代码。它的行为有点像一个返回字符串的函数,返回值是将由预处理器插入到其位置的代码。

于 2014-06-20T08:05:02.970 回答