Login
7 branches 0 tags
Ben (Win10) Nujel only uses pf now and fixed some pf bugs d4a5238 4 years ago 281 Commits
nujel / bootstrap / binlib.no
[do [def help [λ* help
        [i]
        "Describe 10 functions at offset 1"
        [do [def off [* [int i] 10]]
           [for-each [λ* #nil
               [l]
               ""
               [println [cat l " " [describe l]]]] [map cat [symbol-table off 10]]]
           [println [cat "Help page " [int i] " of " [/ [symbol-count] 10]]]
           #t]]]
    [def file/compile [λ* file/compile
        [path no-write environment]
        "Compile a Nujel source file into optimized object code"
        [do [def source [cons 'do [read [file/read path]]]]
           [def object-code [compile/forms source environment]]
           [if no-write
              #nil
              [file/write [cat [path/without-extension path] ".no"] [str/write object-code]]]
           object-code]]]
    [def file/eval [λ* file/eval
        [path environment]
        "Evaluate a Nujel source file in the current context"
        [do [if environmnet
              #nil
              [set! environment root-closure]]
           [def source [cons 'do [read [file/read path]]]]
           [compile/forms [cons 'do source] environment]]]]
    [def eval/forked [λ* eval/forked
        [nujel-binary raw-expr]
        "Evaluate @EXPR in a separate process running NUJEL-BINARY"
        [do [def expr [cat "[print [str/write " [str/write raw-expr]]]
           [def tmp-path [file/temp expr]]
           [def command [cat nujel-binary " " tmp-path]]
           [def res [popen command]]
           [file/remove tmp-path]
           [cons [car res] [cdr res]]]]]
    [def test-context "Nujel Bootstrap"]][do [def repl/exception-handler [λ* repl/exception-handler
        [error]
        ""
        [display/error error]]]
    [def repl/history #nil]
    [def repl/prompt [λ* repl/prompt
        []
        "> "
        "> "]]
    [def repl/wasm [λ* repl/wasm
        [line]
        "Evaluate LINE in the wasm context"
        [try repl/exception-handler [do [def raw [read line]]
           [def cexpr [list [compile [cons 'do raw]]]]
           [apply root-closure cexpr]]]]]
    [def repl/readline [λ* repl/readline
        [ctx]
        ""
        [do [def line [readline [repl/prompt]]]
           [if [nil? line]
              [do [display "Bye!\r\n"]
                 [exit 0]]
              #nil]
           [readline/history/add line]
           [def raw [read line]]
           [def expr [cons 'do raw]]
           [def cexpr [cons [compile expr]]]
           [def result [apply ctx cexpr]]
           [set! repl/history [cons line repl/history]]
           [display [cat [if [nil? result]
              ""
              [str/write result]] "\n"]]]]]
    [def repl [λ* repl
        []
        ""
        [do [readline/history/load [readline/history/path]]
           [while #t [do [try repl/exception-handler [repl/readline root-closure]]
              [readline/history/save [readline/history/path]]]]]]]
    [def repl/print-help [λ* repl/print-help
        []
        ""
        [do [println [cat [ansi-rainbow "Nujel"] " - A Lisp dialect for games.\n"]]
           [println [cat [ansi-green "Usage:"] " nujel [options] [command_string | file]\n"]]
           [println [cat [ansi-blue "n"] " - do not load any stdlib"]]
           [println [cat [ansi-blue "v"] " - be verbose"]]
           [println [cat [ansi-blue "r"] " - eval following file without compilation/expansion"]]
           [println [cat [ansi-blue "x"] " - Run the expression following this argument directly"]]]]]
    [def repl/run-forked* [λ* repl/run-forked*
        [expr]
        ""
        [do [def command [cat repl/executable-name " -x \"" [str/write expr] "\""]]
           [popen command]]]]
    [def repl/run-forked [μ* repl/run-forked [expr] "" [cons 'repl/run-forked* [cons [list 'quote expr] #nil]]]]
    [def repl/executable-name "nujel"]
    [def repl/parse-args/eval-next #f]
    [def repl/parse-args/run-repl #t]
    [def repl/parse-option [λ* repl/parse-option
        [option]
        ""
        [if [== option "x"]
           [do [set! repl/parse-args/eval-next #t]
              [set! repl/parse-args/run-repl #f]]
           [if [== option "h"]
              [do [repl/print-help]
                 [set! repl/parse-args/run-repl #f]]
              #nil]]]]
    [def repl/parse-options [λ* repl/parse-options
        [options]
        ""
        [for-each repl/parse-option [split options ""]]]]
    [def repl/parse-arg [λ* repl/parse-arg
        [arg]
        ""
        [if repl/parse-args/eval-next
           [do [apply root-closure [cons [compile [cons 'do [read arg]]]]]
              [set! repl/eval-next #f]]
           [if [== [char-at arg 0] 45]
              [repl/parse-options [substr arg 1]]
              [if #t
                 [do [try display/error [file/eval arg]]
                    [set! repl/parse-args/run-repl #f]]
                 #nil]]]]]
    [def repl/parse-args [λ* repl/parse-args
        [args]
        ""
        [if args
           [do [repl/parse-arg [car args]]
              [repl/parse-args [cdr args]]]
           repl/parse-args/run-repl]]]
    [def repl/init/wasm [λ* repl/init/wasm
        [args]
        ""
        [println [cat [ansi-rainbow "Nujel"] " wasm/REPL ready for input"]]]]
    [def repl/init/bin [λ* repl/init/bin
        [args]
        ""
        [do [set! repl/executable-name [car args]]
           [if [repl/parse-args [cdr args]]
              [repl]
              #nil]]]]
    [def repl/init [λ* repl/init
        [...args]
        ""
        [if [== ARCH "wasm"]
           [repl/init/wasm ...args]
           [repl/init/bin ...args]]]]][if [== ARCH "wasm"]
    #nil
    [do [test/add* '[0 . ""] '[do [repl/run-forked 1]]]
       [test/add* '[123 . ""] '[do [repl/run-forked [exit 123]]]]
       [test/add* '[0 . "123"] '[do [repl/run-forked [display 123]]]]]]