12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- import macros
- var destroyCalled = false
- macro bar() =
- let s = newTree(nnkAccQuoted, ident"=destroy")
- # let s = ident"`=destroy`" # this would not work
- result = quote do:
- type Foo = object
- # proc `=destroy`(a: var Foo) = destroyCalled = true # this would not work
- proc `s`(a: var Foo) = destroyCalled = true
- block:
- let a = Foo()
- bar()
- doAssert destroyCalled
- # custom `op`
- var destroyCalled2 = false
- macro bar(ident) =
- var x = 1.5
- result = quote("@") do:
- type Foo = object
- let `@ident` = 0 # custom op interpolated symbols need quoted (``)
- proc `=destroy`(a: var Foo) =
- doAssert @x == 1.5
- doAssert compiles(@x == 1.5)
- let b1 = @[1,2]
- let b2 = @@[1,2]
- doAssert $b1 == "[1, 2]"
- doAssert $b2 == "@[1, 2]"
- destroyCalled2 = true
- block:
- let a = Foo()
- bar(someident)
- doAssert destroyCalled2
- proc `&%`(x: int): int = 1
- proc `&%`(x, y: int): int = 2
- macro bar2() =
- var x = 3
- result = quote("&%") do:
- var y = &%x # quoting operator
- doAssert &%&%y == 1 # unary operator => need to escape
- doAssert y &% y == 2 # binary operator => no need to escape
- doAssert y == 3
- bar2()
|