aboutsummaryrefslogtreecommitdiffstats
path: root/examples/fibonacci.fp
diff options
context:
space:
mode:
Diffstat (limited to 'examples/fibonacci.fp')
-rw-r--r--examples/fibonacci.fp56
1 files changed, 56 insertions, 0 deletions
diff --git a/examples/fibonacci.fp b/examples/fibonacci.fp
new file mode 100644
index 0000000..493ca87
--- /dev/null
+++ b/examples/fibonacci.fp
@@ -0,0 +1,56 @@
+(
+ ; core utilities
+ ($x ^x ^x) $dup
+ ($_) $drop
+ ($x $y ^x ^y) $swap
+ ($a $b $c ^b ^a ^c) $rot
+ (sub) $-
+ (0 swap - -) $+
+ (()) $nil
+ (nil eq) $null?
+ ($x x) $force
+ (10 emit) $cr
+ (print) $print
+ (4 +) $cell+
+ ($a $d 2 alloc $p
+ ^a ^p poke
+ ^d ^p cell+ poke
+ ^p
+ ) $cons
+ (peek) $car
+ (cell+ peek) $cdr
+
+ ; if-stmt
+ ($c $t $f c ^f ^t rot cswap $_ force) $if
+ ($f $t $c $fn ^f ^t ^c fn) $endif
+
+ ; range
+ ($self $start $end
+ ^if (^start ^end eq)
+ ^nil
+ (^start ^end ^start 1 + self swap cons)
+ endif
+ ) $range
+
+ ; map [$fn $list -> $out-list]
+ ($self $fn $list
+ ^if (^list null?)
+ ^nil
+ (^list car fn ^list cdr ^fn self swap cons)
+ endif
+ ) $map
+
+ ; each [$fn $list]
+ ($fn (fn ^nil) map drop) $each
+
+ ; implementation
+ (0 1 ($self $a $b $n
+ ^if (^n 0 eq) (^b) (
+ ^n 1 - ^a ^b + ^b self
+ ) endif
+ ) force) $fibonacci
+
+ 30 10 range
+ ^fibonacci map
+ ^print each
+)