(** The milestone-2 prelude, written in Flan. Printing is deliberately *not* a primitive (plan.org, Milestone-2 primitives): [write-stdout] is the one output primitive and everything above it is Flan. That is what keeps a second backend cheap — a primitive is the only thing implemented twice. It lives here as a string rather than as a file because there is no package loader yet; at milestone 3 it becomes an ordinary [core:] package and this module goes away. The acceptance programs may call anything defined here. No overloading: [print-f64] and [print-str] name the type, because compile-time overloading before the checker is stable is how a small language stops being one. A single [println] is milestone 5. *) let source = {flan| (defn print-bytes [b [u8]] (write-stdout b)) (defn print-str [s string] (write-stdout (bytes s))) (defn print-f64 [x f64] (write-stdout (f64->bytes x))) (defn print-i64 [x i64] (write-stdout (i64->bytes x))) (defn newline [] (write-stdout (bytes "\n"))) ;; Prints s and then a newline. Takes a string, not an Option or an any — ;; there is nothing to dispatch on yet. (defn print-line [s string] (print-str s) (newline)) |flan} let file = "" let forms () = Reader.read_all ~file source