Dozer is another programming language I’m probably never going to finish.
fn main() [
io.print-ln("Hello, world.");
Nothing
];
fn main() [ "Hello, world.\n" # ~(r: Rune) r :> io.out; Nothing ];
fn receive(c: Channel(Maybe(String))) loop! [
s ::- <: c;
match! s [
Just(s) |> [
s # ~(r: Rune) r :> io.out;
Again
];
Nothing |> Stop(Nothing);
]
];
fn main() [
c ::- new(Channel(Maybe(String)));
process(receive, (c));
Just("Hello, world.\n") :> c;
Nothing :> c;
Nothing
];
Dozer’s statements are sometimes ;-separated, and sometimes ;-terminated. Top-level statements are ;-terminated, and so are match statements. Most other statements are ;-separated. Dozer’s control flow is done with built-in macros (e.g. loop!). Blocks are expressions that evaluate to their last statement. The following is a loop! implementation:
fn loop(b: Expr(std.loops.State)) [
match! eval! b [
Again |> loop(b);
Stop(r) |> r;
]
];