Login
7 branches 0 tags
Ben (X13/Arch) Improved reader and updated bootstrap stdlib 36b07e9 4 years ago 112 Commits
nujel / stdlib / z_compiler.nuj
;; Contains the self-hosting Nujel compiler

[def compile [let*
    [def compile-do-args [λ [args]
        ;[display ["[do-args] " [str/write args] "\n\n"]]
        [if [nil? [cdr args]]
            [cons [compile [car args]] #nil]
            [if [pair? [car args]]
                [let* [def ocar [compile [car args]]]
                     [if [pair? ocar]
                         [cons ocar [compile-do-args [cdr args]]]
                         [compile-do-args [cdr args]]]
                ]
                [compile-do-args [cdr args]]]]
        ]]

    [def compile-do [λ [source]
        ;[display ["[do] " [str/write source] "\n\n"]]
        [let* [def args [compile-do-args source]]
              [if [nil? [cdr args]]
                  [car args]
                  [cons 'do args]]
        ]
    ]]

    [def compile-def [λ [source]
        ;[display ["[def] " [str/write source] "\n\n"]]
        [list 'def [cadr source] [compile [caddr source]]]
    ]]

    [def compile-set! [λ [source]
        ;[display ["[set] " [str/write source] "\n\n"]]
        [list 'set! [cadr source] [compile [caddr source]]]
    ]]

    [def compile-fun [λ [source]
        ;[display ["[λ] " [str/write source] "\n\n"]]
        [if [string?  [caddr source]]
            [list 'λ* [cadr source] [caddr source] [compile-do [cddr source]]]
            [list 'λ* [cadr source]             "" [compile-do [cddr source]]]]
    ]]

    [def compile-let [λ [source]
        ;[display ["[let] " [str/write source] "\n\n"]]
        [list 'let [cadr source] [compile-do [cddr source]]]
    ]]

    [def compile-let* [λ [source]
        ;[display ["[let*] " [str/write source] "\n\n"]]
        [list 'let* [compile-do [cdr source]]]
    ]]

    [λ [source]
        "Compile the forms in source"
        ;[display ["[opt] " [str/write [resolve [car source]]] "\n"  [str/write source] "\n\n"]]
        [let* [def op [resolve [car source]]]
              [cond [[eq? op do]           [compile-do   source]]
                    [[eq? op def]          [compile-def  source]]
                    [[eq? op set!]         [compile-set! source]]
                    [[eq? op let]          [compile-let  source]]
                    [[eq? op let*]         [compile-let* source]]
                    [[eq? op λ]            [compile-fun  source]]
                    [[eq? [car source] 'λ] [compile-fun  source]]
                    [#t source]]
	]
    ]
]]

[def λδ
     [λ [@...λδ]
       "Define a λ with the self-hosting Nujel compiler"
       [eval [compile [cons 'λ @...λδ]]]]]

[def eval [λ [expr]
	"Compile, Evaluate and then return the result of EXPR"
	[eval* [compile expr]]
]]