about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--shell/README.md6
-rw-r--r--shell/iterative-definitions.limg80
-rw-r--r--shell/recursive-definitions.limg94
3 files changed, 180 insertions, 0 deletions
diff --git a/shell/README.md b/shell/README.md
index 3da63cf4..511a7348 100644
--- a/shell/README.md
+++ b/shell/README.md
@@ -26,6 +26,12 @@ Load an s-expression into it:
 $ echo '(+ 1 1)' |dd of=data.img conv=notrunc
 ```
 
+You can also try one of the files of definitions in this directory (`*.limg`).
+
+```sh
+$ cat iter.limg |dd of=data.img conv=notrunc
+```
+
 Now run with both code and data disks:
 ```sh
 $ qemu-system-i386 -enable-kvm -hda code.img -hdb data.img
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))
+)
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))
+)