Login
7 branches 0 tags
Ben (X13/Arch) Improved the compiler/optimizer a bit fce058f 4 years ago 41 Commits
nujel / stdlib / compiler.nuj
;; 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 assemble
     [λ [source]
       "Assembles the forms in SOURCE into low level bytecode instructions"
       source]]

[def compile
     [λ [source]
       "Macroexpand, optimize and assemble the forms in SOURCE"
       [assemble [optimize [macroexpand source]]]]]

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

;[def +1 [λδ [α] "Add 1 to α" [+ 1 α]]]