summary refs log tree commit diff stats
path: root/lib/std/decls.nim
diff options
context:
space:
mode:
Diffstat (limited to 'lib/std/decls.nim')
-rw-r--r--lib/std/decls.nim31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/std/decls.nim b/lib/std/decls.nim
new file mode 100644
index 000000000..bb7ec3593
--- /dev/null
+++ b/lib/std/decls.nim
@@ -0,0 +1,31 @@
+## This module implements syntax sugar for some declarations.
+
+import std/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)