application/octet-stream
•
1.50 KB
•
61 lines
;; Contains the self-hosting Nujel compiler
[def optimize
[let []
[def optimize-do-args
[λ [args]
[if [nil? [cdr args]]
args
[if [pair? [car args]]
[let [[ocar [optimize [car args]]]]
[if [pair? ocar]
[cons ocar [optimize-do-args [cdr args]]]
[optimize-do-args [cdr args]]]]
[optimize-do-args [cdr args]]]]]]
[def optimize-do
[λ [source]
;[display ["Do: " [str/write source] "\n\n"]]
[let [[args [optimize-do-args [cdr source]]]]
[if [nil? [cdr args]]
[car args]
[cons 'do args]]]]]
[def optimize-def
[λ [source]
[list 'def [cadr source] [optimize [caddr source]]]]]
[def optimize-fun
[λ [source]
[list 'λ* [cadr source] source [optimize-do [cddr source]]]]]
[λ [source]
"Optimize the forms in source"
;[display ["Opt: " [str/write source] "\n\n"]]
[let [[op [resolve [car source]]]]
[cond [[eq? op do] [optimize-do source]]
[[eq? op def] [optimize-def source]]
[[eq? op λ] [optimize-fun source]]
[#t source]]]]
]]
[def macroexpand
[λ [source]
"Expand all macros in the forms contained in SOURCE"
source]]
[def compile
[λ [source]
"Macroexpand, optimize and assemble the forms in SOURCE"
[optimize [macroexpand source]]]]
[def λδ
[λ [@...λδ]
"Define a λ with the self-hosting Nujel compiler/optimizer"
[eval [compile [cons 'λ @...λδ]]]]]
;[def +1 [λδ [α] "Add 1 to α" [+ 1 α]]]