summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornodist <kevin.comas.git@gmail.com>2026-05-19 12:30:40 -0400
committernodist <kevin.comas.git@gmail.com>2026-05-19 12:30:40 -0400
commita496efcd5d4660da359ce4702b5293698f115dda (patch)
treec07a9ba92f301c9c6854d9a2c271bb70412760bc
parent0e12eb8f94783800247d20b4c29546d1941af020 (diff)
add ackerman example
-rw-r--r--ack.kpl29
-rw-r--r--fib.kpl8
-rw-r--r--fib_import.kpl2
3 files changed, 35 insertions, 4 deletions
diff --git a/ack.kpl b/ack.kpl
new file mode 100644
index 0000000..80a3a74
--- /dev/null
+++ b/ack.kpl
@@ -0,0 +1,29 @@
+
+// Ackermann function
+
+`export ack : Fn[m; n] $ (
+ ? !=(`type m; `type n) {
+ `exit "m and n must be the same type and above zero"
+ }
+ ? {
+ m = 0 { n + 1 }
+ &(m > 0; n = 0) { ack `call_sync (m - 1; 1) }
+ &(m > 0; n > 0) { ack `call_sync (m - 1; ack `call_sync (m; n - 1)) }
+ { 0 }
+ }
+)
+
+`export ack_string : Fn[m; n] $ (
+ String $ ("ack("; m; " "; n; ") = "; ack `call_sync (m; n); "\n")
+)
+
+`is_main Fn $ (
+ ( args ) : `use "sys"
+ ? 4 != `length args {
+ `return `error String $ (
+ "Got: "; " " `join args; "\n"
+ "Usage: "; args `get 0; " "; args `get 1; " <m> <n>\n"
+ )
+ }
+ `print ack_string `call_sync (I64 $ args `get -2; I64 $ args `get -1)
+)
diff --git a/fib.kpl b/fib.kpl
index 16edbb4..f049ba0 100644
--- a/fib.kpl
+++ b/fib.kpl
@@ -1,5 +1,8 @@
-// Fibonacci sequence for all numeric types
+/*
+ Fibonacci sequence
+ n can be any signed or unsigned integer type
+*/
`export fib : Fn[n] $ (
? {
@@ -9,7 +12,6 @@
}
)
-
`export fib_string Fn[n] $ (
String $ ("fib("; n; ") = "; fib `call_sync n; "\n")
)
@@ -22,5 +24,5 @@
"Usage: "; args `get 0; " "; args `get 1; " <number>\n"
)
}
- `print `call_sync fib_string `call_sync I64 $ args `get -1
+ `print fib_string `call_sync I64 $ args `get -1
)
diff --git a/fib_import.kpl b/fib_import.kpl
index 86b6824..6d900b3 100644
--- a/fib_import.kpl
+++ b/fib_import.kpl
@@ -4,5 +4,5 @@
( fib_string ) : `import "./fib.kpl"
@ 0 .. 30 {
- `print `call_sync fib_string `call_sync n
+ `print fib_string `call_sync n
}[n]