about summary refs log tree commit diff stats
path: root/shell/iterative-definitions.limg
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2021-04-23 21:36:48 -0700
committerKartik Agaram <vc@akkartik.com>2021-04-23 21:36:48 -0700
commitfa8d337d90780c61bc63927cf1c3b2b208f1edc7 (patch)
tree335a0ae69f46fd3d570a6a25bdc9dcbc3feecb29 /shell/iterative-definitions.limg
parent59151049263ce58a8c80c26d188c0852bb285b82 (diff)
downloadmu-fa8d337d90780c61bc63927cf1c3b2b208f1edc7.tar.gz
shell: some example definitions
Diffstat (limited to 'shell/iterative-definitions.limg')
-rw-r--r--shell/iterative-definitions.limg80
1 files changed, 80 insertions, 0 deletions
diff --git a/shell/iterative-definitions.limg b/shell/iterative-definitions.limg
new file mode 100644
index 00000000..315f12b0
--- /dev/null
+++ b/shell/iterative-definitions.limg
@@ -0,0 +1,80 @@
+(
+  (globals . (
+    (hline1 . (fn () (screen y lo hi color)
+                (while (< lo hi)
+                  (pixel screen lo y color)
+                  (set lo (+ lo 1)))))
+    (vline1 . (fn () (screen x lo hi color)
+                (while (< lo hi)
+                  (pixel screen x lo color)
+                  (set lo (+ lo 1)))))
+    (hline . (fn () (screen y color)
+               (hline1 screen y 0 (width screen) color)))
+    (vline . (fn () (screen y color)
+               (vline1 screen y 0 (height screen) color)))
+    (andf . (fn () (a b)
+              (if a
+                (if b
+                  1
+                  ())
+                ())))
+    (orf . (fn () (a b)
+             (if a
+               a
+               b)))
+    (brline . (fn () (screen x0 y0 x1 y1 color)
+                 ((fn (dx dy sx sy)
+                    ((fn (err)
+                       (brline1 screen x0 y0 x1 y1 dx dy sx sy err color))
+                     (+ dx dy)))
+                  (abs (- x1 x0))
+                  (- 0 (abs (- y1 y0)))
+                  (sgn (- x1 x0))
+                  (sgn (- y1 y0)))))
+    (brline1 . (fn () (screen x y xmax ymax dx dy sx sy err color)
+                 (while (orf (< x xmax) (< y ymax))
+                   (pixel screen x y color)
+                   ((fn (e2)
+                      (if (>= e2 dy)
+                        (set x (+ x sx))
+                        ())
+                      (if (<= e2 dx)
+                        (set y (+ y sy)))
+                      (set err (+ err
+                           (+
+                             (if (>= e2 dy)
+                               dy
+                               0)
+                             (if (<= e2 dx)
+                               dx
+                               0)))))
+                    (* err 2)))))
+    (read_line_2 . (fn () (keyboard stream)
+                     ((fn (c)
+                       (if (= c 10)
+                         stream
+                         (if (= c 0)
+                           stream
+                           (read_line_2 keyboard (write stream c)))))
+                      (key keyboard))))
+    (read_line . (fn () (keyboard)
+                   (read_line_2 keyboard (stream))))
+    (fill_rect . (fn () (screen x1 y1 x2 y2 fill_color)
+                   (while (< y1 y2)
+                     (hline1 screen y1 x1 x2 fill_color)
+                     (set y1 (+ y1 1)))))
+    (chessboard . (fn () (screen px)
+                    (chessboard1 screen px 0 15)))
+    (chessboard1 . (fn () (screen px y color)
+                     (while (< y (height screen))
+                       (chessboard2 screen px y 0 color)
+                       (set y (+ y px))
+                       (set color (- 15 color)))))
+    (chessboard2 . (fn () (screen px y x color)
+                     (while (< x (width screen))
+                       (fill_rect screen x y (+ x px) (+ y px) color)
+                       (set x (+ x px))
+                       (set color (- 15 color)))))
+  ))
+  (sandbox . (+ 1 2))
+)