mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-19 05:50:30 +00:00
@@ -708,6 +708,10 @@ proc genAddSubInt(c: PCtx; n: PNode; dest: var TDest; opc: TOpcode) =
|
||||
c.genNarrow(n, dest)
|
||||
|
||||
proc genConv(c: PCtx; n, arg: PNode; dest: var TDest; opc=opcConv) =
|
||||
if n.typ.kind == arg.typ.kind and arg.typ.kind == tyProc:
|
||||
# don't do anything for lambda lifting conversions:
|
||||
gen(c, arg, dest)
|
||||
return
|
||||
let tmp = c.genx(arg)
|
||||
if dest < 0: dest = c.getTemp(n.typ)
|
||||
c.gABC(n, opc, dest, tmp)
|
||||
@@ -1740,9 +1744,9 @@ proc gen(c: PCtx; n: PNode; dest: var TDest; flags: TGenFlags = {}) =
|
||||
of declarativeDefs:
|
||||
unused(n, dest)
|
||||
of nkLambdaKinds:
|
||||
let s = n.sons[namePos].sym
|
||||
discard genProc(c, s)
|
||||
genLit(c, n.sons[namePos], dest)
|
||||
#let s = n.sons[namePos].sym
|
||||
#discard genProc(c, s)
|
||||
genLit(c, newSymNode(n.sons[namePos].sym), dest)
|
||||
of nkChckRangeF, nkChckRange64, nkChckRange:
|
||||
let
|
||||
tmp0 = c.genx(n.sons[0])
|
||||
|
||||
52
tests/vm/tanonproc.nim
Normal file
52
tests/vm/tanonproc.nim
Normal file
@@ -0,0 +1,52 @@
|
||||
discard """
|
||||
output: '''`Test`'''
|
||||
"""
|
||||
|
||||
# bug #3561
|
||||
|
||||
import macros, future, strutils
|
||||
|
||||
type
|
||||
Option[T] = ref object
|
||||
case valid: bool
|
||||
of true:
|
||||
data: T
|
||||
else:
|
||||
discard
|
||||
|
||||
proc some[T](v: T): Option[T] = Option[T](valid: true, data: v)
|
||||
proc none[T](v: T): Option[T] = Option[T](valid: false)
|
||||
proc none(T: typedesc): Option[T] = Option[T](valid: false)
|
||||
|
||||
proc map[T,U](o: Option[T], f: T -> U): Option[U] =
|
||||
case o.valid
|
||||
of true:
|
||||
f(o.data).some
|
||||
else:
|
||||
U.none
|
||||
|
||||
proc notEmpty(o: Option[string]): Option[string] =
|
||||
case o.valid
|
||||
of true:
|
||||
if o.data.strip == "": string.none else: o.data.strip.some
|
||||
else:
|
||||
o
|
||||
|
||||
proc getOrElse[T](o: Option[T], def: T): T =
|
||||
case o.valid
|
||||
of true:
|
||||
o.data
|
||||
else:
|
||||
def
|
||||
|
||||
proc quoteStr(s: string): Option[string] =
|
||||
s.some.notEmpty.map(v => "`" & v & "`")
|
||||
|
||||
macro str(s: string): stmt =
|
||||
let x = s.strVal
|
||||
let y = quoteStr(x)
|
||||
let sn = newStrLitNode(y.getOrElse("NONE"))
|
||||
result = quote do:
|
||||
echo `sn`
|
||||
|
||||
str"Test"
|
||||
Reference in New Issue
Block a user