Files
Nim/lib/std/decls.nim
metagn 739e1badb6 stdlib organization & documentation improvements (#20971)
* stdlib organization & documentation improvements

* fix CI

* Update doc/lib.md

Co-authored-by: Juan Carlos <juancarlospaco@gmail.com>

* fix ci, remove jshttpcore, export in jsfetch instead

* fix alphabetical order violations

* add cmdline, db_odbc

Co-authored-by: Juan Carlos <juancarlospaco@gmail.com>
2022-12-06 09:37:03 +01:00

32 lines
985 B
Nim

## This module implements syntax sugar for some declarations.
import macros
macro byaddr*(sect) =
## Allows a syntax for l-value references, being an exact analog to
## `auto& a = ex;` in C++.
##
## .. warning:: This makes use of 2 experimental features, namely nullary
## templates instantiated as symbols and variable macro pragmas.
## For this reason, its behavior is not stable. The current implementation
## allows redefinition, but this is not an intended consequence.
runnableExamples:
var s = @[10, 11, 12]
var a {.byaddr.} = s[0]
a += 100
assert s == @[110, 11, 12]
assert a is int
var b {.byaddr.}: int = s[0]
assert a.addr == b.addr
expectLen sect, 1
let def = sect[0]
let
lhs = def[0]
typ = def[1]
ex = def[2]
addrTyp = if typ.kind == nnkEmpty: typ else: newTree(nnkPtrTy, typ)
result = quote do:
let tmp: `addrTyp` = addr(`ex`)
template `lhs`: untyped = tmp[]
result.copyLineInfo(def)