From 022b597f56dff2c94fe6aeccd297c294a8348520 Mon Sep 17 00:00:00 2001
From: JJ
Date: Fri, 14 Jul 2023 09:44:18 -0700
Subject: Add Nim metaprogramming examples

---
 entries/omentic/nim/fib.nim | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

(limited to 'entries/omentic/nim')

diff --git a/entries/omentic/nim/fib.nim b/entries/omentic/nim/fib.nim
index a12f8e6..7552e42 100644
--- a/entries/omentic/nim/fib.nim
+++ b/entries/omentic/nim/fib.nim
@@ -1,12 +1,15 @@
+## standard
 func fib(n: Natural): Natural =
   if n < 2:
     return n
   else:
     return fib(n-1) + fib(n-2)
 
+## tail-recursive
 func fib2(n: int, a = 0, b = 1): int =
-  return if n == 0: a else: fib2(n-1, b, a+b)
+  if n == 0: a else: fib2(n-1, b, a+b)
 
+## iterable
 iterator fib3: int =
   var a = 0
   var b = 1
@@ -15,3 +18,26 @@ iterator fib3: int =
     swap a, b
     b += a
 
+## compile-time, list stuff
+import std/sugar
+static:
+  proc scan[T, U](list: var seq[T], first, second: U, fun: (U, U) -> U) =
+    var prev = (first, second)
+    for i, elem in list:
+      list[i] = fun(prev[0], prev[1])
+      prev[0] = prev[1]
+      prev[1] = list[i]
+
+  proc fib4(n: int): seq[int] =
+    result = newSeq[int](n)
+    result.scan(0, 1, (p, c) => p + c)
+
+## stupid. macro expansions, outputs (0+1)+((0+1)+(0+1)) etc
+import std/macros
+macro fib5(n: static[int]): untyped =
+  var a = quote do: 0
+  var b = quote do: 1
+  for _ in 0 ..< n:
+    swap a, b
+    b = infix(a, "+", b)
+  return a
-- 
cgit v1.2.3-70-g09d2