Login
7 branches 0 tags
Ben (X13/Arch) Some minor cleanup 099e262 4 years ago 75 Commits
nujel / stdlib / z_compiler.nuj
;; Contains the self-hosting Nujel compiler


[def compile [let []
    
    [def compile-do-args [λ [args]
        [if [nil? [cdr args]]
            [cons [compile [car args]] #nil]
            [if [pair? [car args]]
                [let [[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 [[args [compile-do-args [cdr 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-fun [λ [source]
        ;[display ["[λ] " [str/write source] "\n\n"]]
        [if [string? [cadr source]]
            [list 'λ* [cadr source] source [compile-do [cdr source]]]
            [list 'λ* [cadr source] source [compile-do [cdr source]]]]
    ]]

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

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