DEFINE
fac == (* primitive-recursive factorial *)
[1] [*] primrec ;
fac-i == (* iterative factorial: *)
[1 1] (* → n [1 1]│ *)
dip (* → 1 1 n│ *)
[dup [*]dip succ] (* → 1 1 n [dup [*]dip succ]│ *)
times (* → ({(×/⍵),1↓⍵+1}⍣n⊢1 1)│ *)
pop ; (* → ({(×/⍵),1↓⍵+1}⍣n⊢1)│ *)
fac-r == (* recursive factorial: *)
[small] (* test for 0 or 1 *)
[] (* 0 → 0; 1 → 1 *)
[ (* n│ *)
dup (* → n n│ *)
pred (* → n (n-1)│ *)
fac-r (* → n (!n-1)│ *)
* (* → (n×∇ n-1)│ *)
]
ifte ; (* if-then-else *)
Y == [dup cons] swoncat dup cons i ; (* Y combinator *)
fac-y == (* Y-combinator factorial: *)
[
[pop null]
[pop succ]
[[dup pred] dip i *]
ifte
] Y ;
fib == (* binary recursive fibonacci *)
[small] [] (* 0 → 0; 1 →1 *)
[pred dup pred] (* → (n-1 2)│ *)
[+] (* → (+/n-1 2)│ *)
binrec ;
fib-i == (* iterative fibonacci: *)
[0 1] (* → n [0 1]│ *)
dip (* → 0 1 n│ *)
[dup [+]dip swap] (* → 0 1 n [dup [+]dip swap]│ *)
times (* → ({1↓⍵,+/⍵}⍣n⊢0 1)│ *)
pop ;
fib-r == (* recursive fibonacci: *)
[small] (* test for 0 or 1 *)
[] (* 0 → 0; 1 → 1 *)
[ (* n│ *)
pred (* → (n-1)│ *)
dup (* → (n-1)(n-1)│ *)
[fib-r]dip (* → (∇ n-1)(n-1)│ *)
pred (* → (∇ n-1)(n-2)│ *)
fib-r (* → (∇ n-1)(∇ n-2)│ *)
+ (* → ((∇ n-1)+∇ n-2)│ *)
]
ifte ; (* if-then-else *)
2∧ == (* 2-to-the-power *)
[1]dip (* → 1 n│ *)
[dup +] (* → 1 n [dup +]│ *)
times ; (* → {⍵+⍵}⍣n⊢1│ *)
seq == (* [m .. n] *)
[>] [pop2 []] (* m>n: []│ *)
[
[dup succ]dip (* → m ++m n│ *)
seq (* → m [++m .. n]│ *)
cons (* → [m .. n]│ *)
]
ifte ; (* if-then-else *)
(* Ackermann's function:
* ack 0 n → n+1
* ack m 0 → ack (m-1) 1
* ack m n → ack (m-1) (ack m (n-1))
*)
ack == (* recursive Ackermann *)
[
[[pop null] popd succ]
[[ null] pop pred 1 ack]
[ [dup pred swap] dip pred ack ack]
]cond ;
ack-y == (* Y-combinator Ackermann *)
[ (* Kubica M. *)
[
[[pop pop null] pop popd succ]
[[ pop null] [pop pred 1]dip i]
[
[[dup pred swap]dip pred]dip
dup [i]dip i (* ack ack *)
]
] cond
] Y ;
qsort == (* quicksort *)
[small] []
[uncons [>] split]
[enconcat]
binrec ;
→ == (* rest│ *) (* clear stack *)
[] (* → rest []│ *)
unstack ; (* → │ *)
.
Back to: code
Back to: Workspaces