application/octet-stream
•
2.64 KB
•
77 lines
;; 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]]
]]