summary refs log tree commit diff stats
path: root/lib/std/logic.nim
blob: 84640d3807fff13a6b28739d964d68ae7b2f14f6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
## This module provides further logic operators like 'forall' and 'exists'
## They are only supported in `.ensures` etc pragmas.

proc `->`*(a, b: bool): bool {.magic: "Implies".}
proc `<->`*(a, b: bool): bool {.magic: "Iff".}

proc forall*(args: varargs[untyped]): bool {.magic: "Forall".}
proc exists*(args: varargs[untyped]): bool {.magic: "Exists".}

proc old*[T](x: T): T {.magic: "Old".}
.}: cstring {.emit: "`name` = __func__;".} $name template getPFrame*(): PFrame = ## avoids a function call (unlike `getFrame()`) block: when NimStackTrace: var framePtr {.inject, noinit.}: PFrame {.emit: "`framePtr` = &FR_;".} framePtr template setFrameMsg*(msg: string, prefix = " ") = ## attach a msg to current `PFrame`. This can be called multiple times ## in a given PFrame. Noop unless passing --stacktraceMsgs and --stacktrace when NimStackTrace and NimStackTraceMsgs: block: var fr {.inject, noinit.}: PFrame {.emit: "`fr` = &FR_;".} # consider setting a custom upper limit on size (analog to stack overflow) frameMsgBuf.setLen fr.frameMsgLen frameMsgBuf.add prefix frameMsgBuf.add msg fr.frameMsgLen += prefix.len + msg.len