我试图在宏中使用 nnkDotExpr 并收到错误。具体来说,我正在尝试编写一个宏,它将编写一个返回特定字段的过程。我尝试了三种方法,但似乎都失败了,我不知道为什么。
这是我的代码。
import macros
type
Test_Type = object of RootObj
Name_HIDDEN: string
macro Name_MacroA*(vType: untyped): untyped =
var tName = nnkDotExpr(ident("self"), ident("Name_HIDDEN"))
quote do:
proc Name*(self: var `vType`): string =
return `tName`
macro Name_MacroB*(vType: untyped): untyped =
var tName = newNimNode(nnkDotExpr)
tName.add(ident("self"))
tName.add(ident("Name_HIDDEN"))
quote do:
proc Name*(self: var `vType`): string =
return `tName`
macro Name_MacroC*(vType: untyped): untyped =
var tName = nnkDotExpr.newTree(ident("self"), ident("Name_HIDDEN"))
quote do:
proc Name*(self: var `vType`): string =
return `tName`
Name_MacroB(Test_Type)
var tTest: Test_Type
tTest.Name_HIDDEN = "Hello"
echo tTest.Name
当我使用 Name_MacroA 时,出现错误:
Error: attempting to call routine: 'nnkDotExpr'
found 'nnkDotExpr' [enumField declared in /usr/local/Cellar/nim/2.0.0_1/nim/lib/core/macros.nim(45, 5)]
Name_MacroA 尝试匹配 Nim Macros中 nnkDotExpr 引用中的代码。
当我使用 Name_MacroB 或 Name_MacroC 时,出现错误:
template/generic instantiation of `Name_MacroB` from here test4.nim(17, 20) Error: undeclared identifier: 'self'
candidates (edit distance, scope distance); see '--spellSuggest':
(2, 4): 'del'
(2, 4): 'ref'
(2, 4): 'send'
Name_MacroB 是尝试匹配Nim Macros中的代码
Name_MacroC 是尝试匹配来自Nim Macros 的代码
第一个问题是你试图
nnkDotExpr
在它是枚举时调用。对于NimNodeKind之类的,nnkDotExpr
您需要使用newTree。第二个问题是为参数
quote do
生成一个唯一的符号self
,因此您需要让它使用您自己的标识,如下所示还有newDotExpr可以更简单地创建点表达式