Estou tentando usar nnkDotExpr em uma macro e estou recebendo um erro. Especificamente, estou tentando escrever uma macro que escreverá um procedimento que retorne um campo específico. Eu tentei três abordagens que parecem falhar e não sei por quê.
Este é o código que tenho.
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
Quando uso Name_MacroA recebo o erro:
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 é uma tentativa de corresponder ao código da referência nnkDotExpr em Nim Macros .
Quando uso Name_MacroB ou Name_MacroC recebo o erro:
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 é uma tentativa de corresponder ao código do Nim Macros
Name_MacroC é uma tentativa de combinar o código do Nim Macros