aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJJ2023-07-14 16:44:18 +0000
committerJJ2023-07-14 16:44:18 +0000
commit022b597f56dff2c94fe6aeccd297c294a8348520 (patch)
tree2d6f50e40defa5390723042d9b689a47cc197259
parent182574d7eecf4d19a94a695c4c60baddaa1758a8 (diff)
Add Nim metaprogramming examplesHEADmain
-rw-r--r--entries/omentic/nim/fib.nim28
1 files changed, 27 insertions, 1 deletions
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