123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- discard """
- output: '''
- noReturn
- calling mystuff
- yes
- calling mystuff
- yes
- calling sugarWithPragma
- sugarWithPragma called
- '''
- """
- import sugar, macros
- proc twoParams(x: (int, int) -> int): int =
- result = x(5, 5)
- proc oneParam(x: int -> int): int =
- x(5)
- proc noParams(x: () -> int): int =
- result = x()
- proc noReturn(x: () -> void) =
- x()
- proc doWithOneAndTwo(f: (int, int) -> int): int =
- f(1,2)
- doAssert twoParams(proc (a, b: auto): auto = a + b) == 10
- doAssert twoParams((x, y) => x + y) == 10
- doAssert oneParam(x => x+5) == 10
- doAssert noParams(() => 3) == 3
- doAssert doWithOneAndTwo((x, y) => x + y) == 3
- noReturn((() -> void) => echo("noReturn"))
- proc pass2(f: (int, int) -> int): (int) -> int =
- ((x: int) -> int) => f(2, x)
- doAssert pass2((x, y) => x + y)(4) == 6
- fun(x, y: int) {.noSideEffect.} => x + y
- doAssert typeof(fun) is (proc (x, y: int): int {.nimcall.})
- doAssert fun(3, 4) == 7
- proc register(name: string; x: proc()) =
- echo "calling ", name
- x()
- register("mystuff", proc () =
- echo "yes"
- )
- proc helper(x: NimNode): NimNode =
- if x.kind == nnkProcDef:
- result = copyNimTree(x)
- result[0] = newEmptyNode()
- result = newCall("register", newLit($x[0]), result)
- else:
- result = copyNimNode(x)
- for i in 0..<x.len:
- result.add helper(x[i])
- macro m(x: untyped): untyped =
- result = helper(x)
- m:
- proc mystuff() =
- echo "yes"
- sugarWithPragma() {.m.} => echo "sugarWithPragma called"
- typedParamAndPragma(x, y: int) {.used.} -> int => x + y
- doAssert typedParamAndPragma(1, 2) == 3
- type
- Bot = object
- call: proc (): string {.noSideEffect.}
- var myBot = Bot()
- myBot.call = () {.noSideEffect.} => "I'm a bot."
- doAssert myBot.call() == "I'm a bot."
|