Keys:
q - quit
c - clear
i - invert brush
1 - blotter brush
2 - reverse-direction blotter brush
3 - Chisel brush
4 - Pencil
5 - shimmer
?(?-) (A drawing program, with multiple brushes)
<> ($screen-size) ((number 512))
<> ($screen-color) ((color #FFFFFF))
<> ($brush-color) ((color #000000))
<> (!clear-screen) ((number 0) (number 0) $screen-size $screen-size $screen-color draw fill-rect)
?((?0 ?1 ?:) ?:) 512 512 size
?(?-) (Keybinds:
q - quit
c - clear
i - invert brush
1 - blotter brush
2 - reverse-direction blotter brush
3 - Chisel brush
4 - Pencil
5 - shimmer)
<> ((state ?s ?f) handle-event (Key (?x q))) (cmd quit)
<> (?s handle-event (Key (?x c))) (!clear-screen ?s)
<> ((state (?a ?b ?c ?d ?e ?f) ?p) handle-event (Key (?x 1))) ((state (?a ?b ?c ?d ?e Blotter) ?p))
<> ((state (?a ?b ?c ?d ?e ?f) ?p) handle-event (Key (?x 2))) ((state (?a ?b ?c ?d ?e ReverseBlotter) ?p))
<> ((state (?a ?b ?c ?d ?e ?f) ?p) handle-event (Key (?x 3))) ((state (?a ?b ?c ?d ?e Chisel) ?p))
<> ((state (?a ?b ?c ?d ?e ?f) ?p) handle-event (Key (?x 4))) ((state (?a ?b ?c ?d ?e Pencil) ?p))
<> ((state (?a ?b ?c ?d ?e ?f) ?p) handle-event (Key (?x 5))) ((state (?a ?b ?c ?d ?e Shimmer) ?p))
<> ((state (?a ?b ?c ?d ?e Blotter) ?p) handle-event (Key (?x r))) ((state (?a ?b ?c ?d ?e InverseBlotter) ?p))
<> ((state (?a ?b ?c ?d ?e ReverseBlotter) ?p) handle-event (Key (?x r))) ((state (?a ?b ?c ?d ?e InverseReverseBlotter) ?p))
<> ((state (?a ?b ?c ?d ?e Chisel) ?p) handle-event (Key (?x r))) ((state (?a ?b ?c ?d ?e InverseChisel) ?p))
<> ((state (?a ?b ?c ?d ?e Pencil) ?p) handle-event (Key (?x r))) ((state (?a ?b ?c ?d ?e InversePencil) ?p))
<> ((state (?a ?b ?c ?d ?e Shimmer) ?p) handle-event (Key (?x r))) ((state (?a ?b ?c ?d ?e InverseShimmer) ?p))
<> ((state (?a ?b ?c ?d ?e InverseBlotter) ?p) handle-event (Key (?x r))) ((state (?a ?b ?c ?d ?e Blotter) ?p))
<> ((state (?a ?b ?c ?d ?e InverseReverseBlotter) ?p) handle-event (Key (?x r))) ((state (?a ?b ?c ?d ?e ReverseBlotter) ?p))
<> ((state (?a ?b ?c ?d ?e InverseChisel) ?p) handle-event (Key (?x r))) ((state (?a ?b ?c ?d ?e Chisel) ?p))
<> ((state (?a ?b ?c ?d ?e InversePencil) ?p) handle-event (Key (?x r))) ((state (?a ?b ?c ?d ?e Pencil) ?p))
<> ((state (?a ?b ?c ?d ?e InverseShimmer) ?p) handle-event (Key (?x r))) ((state (?a ?b ?c ?d ?e Shimmer) ?p))
<> (cmd ?:) ?:
<> (read-event ?~) (handle-event ?~ read-event Any)
<> ((state (?a ?b ?c ?d ?e ?f) polling) handle-event (Move (?x ?y ?z))) ((state (?c ?d ?x ?y ?e ?f) drawing))
<> ((state (?a ?b ?c ?d MouseUp ?f) polling) handle-event (Touch (?x ?y 1))) ((state (?c ?d ?x ?y MouseDown ?f) drawing))
<> ((state (?a ?b ?c ?d MouseDown ?f) polling) handle-event (Touch (?x ?y 0))) ((state (?c ?d ?x ?y MouseUp ?f) drawing))
<> (handle-event ?x) ()
?(?-) (I will use a type system to enforce evaluation order, because I am not that clever)
<> ((number ?0) (number ?1) `?:) ((number ?:))
<> ((number ?0) (number ?1) (number ?2) (number ?3) (color ?4) draw ?:) ?:
<> ((draw ?: (number ?0) (number ?1) (color ?2))) ?:
<> ((draw ?: (number ?0) (number ?1) (number ?2) (color ?3))) ?:
<> ((draw ?: (number ?0) (number ?1) (number ?2) (number ?3) (color ?4))) ?:
?(?-) (
<> (state (?a ?b ?c ?d) drawing) (
!clear-screen
(number ?c)
(number ?d)
(number ?c) (number 2) `* (number ?a) `-
(number ?d) (number 2) `* (number ?b) `-
(color #ff0000)
draw line
state (?a ?b ?c ?d MouseDown) polling)
<> (state (?a ?b ?c ?d MouseUp ?f) drawing) (
(draw circ
(number ?c)
(number ?d)
(number ?d) (number ?b) `-
(number ?a) (number ?c) `- `+
$brush-color)
state (?a ?b ?c ?d MouseUp ?f) polling)
)
<> (state (?a ?b ?c ?d MouseUp ?f) drawing) (
state (?a ?b ?c ?d MouseUp ?f) polling)
<> (state (?a ?b ?c ?d MouseDown Blotter) drawing) (
(draw fill-circ
(number ?c)
(number ?d)
(number ?d) (number ?b) `-
(number ?a) (number ?c) `- `+
$brush-color)
state (?a ?b ?c ?d MouseDown Blotter) polling)
<> (state (?a ?b ?c ?d MouseDown ReverseBlotter) drawing) (
(draw fill-circ
(number ?c)
(number ?d)
(number ?d) (number ?b) `-
(number ?a) (number ?c) `- `-
$brush-color)
state (?a ?b ?c ?d MouseDown ReverseBlotter) polling)
<> (state (?a ?b ?c ?d MouseDown Shimmer) drawing) (
(draw circ (number ?c) (number ?d) (number ?d) (number ?b) `- (number ?a) (number ?c) `- `+ $brush-color)
state (?a ?b ?c ?d MouseDown Shimmer) polling)
<> (state (?a ?b ?c ?d MouseDown Chisel) drawing) (
(draw line (number ?c) (number 2) `- (number ?d) (number 2) `+ (number ?c) (number 2) `+ (number ?d) (number 2) `- $brush-color)
(draw line (number ?c) (number 2) `- (number ?d) (number 1) `+ (number ?c) (number 1) `+ (number ?d) (number 2) `- $brush-color)
(draw line (number ?c) (number 0) `- (number ?d) (number 1) `+ (number ?c) (number 2) `+ (number ?d) (number 1) `- $brush-color)
state (?a ?b ?c ?d MouseDown Chisel) polling)
<> (state (?a ?b ?c ?d MouseDown Pencil) drawing) (
(draw fill-circ (number ?c) (number ?d) (number 1) $brush-color)
state (?a ?b ?c ?d MouseDown Pencil) polling)
<> (state (?a ?b ?c ?d MouseDown InverseBlotter) drawing) (
(draw fill-circ
(number ?c)
(number ?d)
(number ?d) (number ?b) `-
(number ?a) (number ?c) `- `+
$screen-color)
state (?a ?b ?c ?d MouseDown InverseBlotter) polling)
<> (state (?a ?b ?c ?d MouseDown InverseReverseBlotter) drawing) (
(draw fill-circ
(number ?c)
(number ?d)
(number ?d) (number ?b) `-
(number ?a) (number ?c) `- `-
$screen-color)
state (?a ?b ?c ?d MouseDown InverseReverseBlotter) polling)
<> (state (?a ?b ?c ?d MouseDown InverseShimmer) drawing) (
(draw circ (number ?c) (number ?d) (number ?d) (number ?b) `- (number ?a) (number ?c) `- `+ $screen-color)
state (?a ?b ?c ?d MouseDown InverseShimmer) polling)
<> (state (?a ?b ?c ?d MouseDown InverseChisel) drawing) (
(draw line (number ?c) (number 2) `- (number ?d) (number 2) `+ (number ?c) (number 2) `+ (number ?d) (number 2) `- $screen-color)
(draw line (number ?c) (number 2) `- (number ?d) (number 1) `+ (number ?c) (number 1) `+ (number ?d) (number 2) `- $screen-color)
(draw line (number ?c) (number 0) `- (number ?d) (number 1) `+ (number ?c) (number 2) `+ (number ?d) (number 1) `- $screen-color)
(draw pixel (number ?c) (number ?c) (number ?a) `- `+ (number 1) `+ (number ?d) (number ?d) (number ?b) `- `+ (number 1) `+ $screen-color)
state (?a ?b ?c ?d MouseDown InverseChisel) polling)
<> (state (?a ?b ?c ?d MouseDown InversePencil) drawing) (
(draw fill-circ (number ?c) (number ?d) (number 1) $screen-color)
state (?a ?b ?c ?d MouseDown InversePencil) polling)
!clear-screen
(state (0 0 1 1 MouseUp Blotter) polling) read-event Any