application/octet-stream
•
2.16 KB
•
63 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 [[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 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]]]
]]
[λ [source]
"Compile the forms in source"
;[display ["[opt] " [str/write [resolve [car source]]] "\n" [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 set!][compile-set source]]
[[eq? op let] [compile-let source]]
[[eq? op λ] [compile-fun source]]
[#t source]]]
]
]]
[def λδ
[λ [@...λδ]
"Define a λ with the self-hosting Nujel compiler"
[eval [compile [cons 'λ @...λδ]]]]]