mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
* 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>
32 lines
985 B
Nim
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)
|