application/octet-stream
•
6.00 KB
•
202 lines
;; Contains the self-hosting Nujel compiler
[defun compile/do/args [args]
[if [last? 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]]]]
]
[defun compile/do [source]
[let* [def args [compile/do/args source]]
[if [last? args]
[car args]
[cons 'do args]]
]
]
[defun compile/def [source]
[list 'def [cadr source] [compile [caddr source]]]
]
[defun compile/set! [source]
[list 'set! [cadr source] [compile [caddr source]]]
]
[defun compile/λ [source]
[if [string? [caddr source]]
[list 'λ* [cadr source] [caddr source] [compile/do [cddr source]]]
[list 'λ* [cadr source] "" [compile/do [cddr source]]]]
]
[defun compile/λ* [source]
source
]
[defun compile/δ [source]
[if [string? [caddr source]]
[list 'δ* [cadr source] [caddr source] [compile/do [cddr source]]]
[list 'δ* [cadr source] "" [compile/do [cddr source]]]]
]
[defun compile/δ* [source]
source
]
[defun compile/μ [source]
[if [string? [caddr source]]
[list 'μ* [cadr source] [caddr source] [compile/do [cddr source]]]
[list 'μ* [cadr source] "" [compile/do [cddr source]]]]
]
[defun compile/μ* [source]
source
]
[defun compile/ω [source]
[list 'ω [compile/do [cdr source]]]
]
[defun compile/try [source]
[list 'try [compile [cadr source]] [compile/do [cddr source]]]
]
[defun compile/if [source]
[list 'if [compile [cadr source]] [compile [caddr source]] [compile [cadddr source]]]
]
[defun compile/let/arg [source]
source
[list [car source] [compile [cadr source]]]
]
[defun compile/let/args [source]
[if source
[cons [compile/let/arg [car source]]
[compile/let/args [cdr source]]]]
]
[defun compile/let [source]
[list 'let [compile/let/args [cadr source]] [compile/do [cddr source]]]
]
[defun compile/let* [source]
[list 'let* [compile/do [cdr source]]]
]
[defun compile/cond/clause [source]
[cons [compile [car source]]
[cons [compile/do [cdr source]]]]
]
[defun compile/cond/clauses [source]
[when source
[cons [compile/cond/clause [car source]]
[compile/cond/clauses [cdr source]]]
]
]
[defun compile/cond [source]
[cons 'cond [compile/cond/clauses [cdr source]]]
]
[defun compile/when [source]
[list 'when [compile [cadr source]] [compile/do [cddr source]]]
]
[defun compile/and [source]
[compile/procedure/arg source]
]
[defun compile/or [source]
[compile/procedure/arg source]
]
[defun compile/while [source]
[list 'while [compile [cadr source]] [compile/do [cddr source]]]
]
[defun compile/macro [macro source]
[compile [macro-apply macro [cdr source]]]
]
[defun compile/procedure/arg [source]
[if [pair? source]
[cons [compile [car source]]
[compile/procedure/arg [cdr source]]]
#nil]
]
[defun compile/procedure [proc source]
[compile/procedure/arg source]
]
[defun compile [source environment]
"Compile the forms in source"
[let* [def op [if [resolves? [car source]]
[resolve [car source]]
[car source]]]
[cond [[special-form? op]
[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/δ* source]]
[[eq? op λ] [compile/λ source]]
[[eq? op λ*] [compile/λ* source]]
[[eq? op μ] [compile/μ source]]
[[eq? op μ*] [compile/μ* source]]
[[eq? op ω] [compile/ω source]]
[[eq? op if] [compile/if source]]
[[eq? op try] [compile/try source]]
[[eq? op cond] [compile/cond source]]
[[eq? op and] [compile/and source]]
[[eq? op or] [compile/or source]]
[[eq? op while] [compile/while source]]
[[eq? op quote] source ]
[#t [throw [list :unknown-special-form "The compiler does not know the current special form, please fix the compiler!" [car source]]]]
]]
[[macro? op] [compile/macro op source]]
[[procedure? op] [compile/procedure op source]]
[[pair? op] [compile/procedure/arg source]]
[[numeric? op] [compile/procedure/arg source]]
[[arr? op] [compile/procedure/arg source]]
[[string? op] [compile/procedure/arg source]]
[[tree? op] [compile/procedure/arg source]]
[#t source]]
]
]
[def defmacro [μ [name args ...body]
[list 'def name [compile [cons 'μ [cons args ...body]]]]
]]
[defmacro defun [name args ...body]
[list 'def name [compile [cons 'λ [cons args ...body]]]]
]
[defmacro \ [...body]
"Define a λ with the self-hosting Nujel compiler"
[compile [cons 'λ ...body]]
]
[defmacro δ [...body]
"Define a δ with the self-hosting Nujel compiler"
[compile [cons 'δ ...body]]
]
[defmacro eval [expr]
"Compile, Evaluate and then return the result of EXPR"
`[eval* [compile ,expr]]
]
[defmacro +1 [v]
`[+ 1 ,v]
]