about summary refs log tree commit diff stats
path: root/shell/recursive-definitions.limg
diff options
context:
space:
mode:
Diffstat (limited to 'shell/recursive-definitions.limg')
-rw-r--r--shell/recursive-definitions.limg94
1 files changed, 94 insertions, 0 deletions
diff --git a/shell/recursive-definitions.limg b/shell/recursive-definitions.limg
new file mode 100644
index 00000000..cef17c49
--- /dev/null
+++ b/shell/recursive-definitions.limg
@@ -0,0 +1,94 @@
+(
+  (globals . (
+    (hline1 . (fn () (screen y lo hi color)
+                (if (>= lo hi)
+                  ()
+                  ((fn ()
+                     (pixel screen lo y color)
+                     (hline1 screen y (+ lo 1) hi color))))))
+    (vline1 . (fn () (screen x lo hi color)
+                (if (>= lo hi)
+                  ()
+                  ((fn ()
+                     (pixel screen x lo color)
+                     (vline1 screen x (+ lo 1) hi color))))))
+    (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
+                  ())
+                ())))
+    (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)
+                 (pixel screen x y color)
+                 (if (andf (= x xmax) (= y ymax))
+                   ()
+                   ((fn (e2)
+                      (brline1 screen
+                        (if (>= e2 dy)
+                          (+ x sx)
+                          x)
+                        (if (<= e2 dx)
+                          (+ y sy)
+                          y)
+                        xmax
+                        ymax
+                        dx
+                        dy
+                        sx
+                        sy
+                        (+ err
+                           (+
+                             (if (>= e2 dy)
+                               dy
+                               0)
+                             (if (<= e2 dx)
+                               dx
+                               0)))
+                        color))
+                    (* 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)
+                   (if (>= y1 y2)
+                     ()
+                     ((fn ()
+                        (hline1 screen y1 x1 x2 fill_color)
+                        (fill_rect screen x1 (+ y1 1) x2 y2 fill_color))))))
+    (chessboard . (fn () (screen px)
+                    (chessboard1 screen px 0 15)))
+    (chessboard1 . (fn () (screen px y color)
+                    (if (>= y (height screen))
+                      ()
+                      ((fn ()
+                         (chessboard2 screen px y 0 color)
+                         (chessboard1 screen px (+ y px) (- 15 color)))))))
+    (chessboard2 . (fn () (screen px y x color)
+                    (if (>= x (width screen))
+                      ()
+                      ((fn ()
+                         (fill_rect screen x y (+ x px) (+ y px) color)
+                         (chessboard2 screen px y (+ x px) (- 15 color)))))))
+  ))
+  (sandbox . (+ 1 2))
+)