Login
7 branches 0 tags
Ben (Mac) Changed testing framework to output file and linenumber e882c97 4 years ago 57 Commits
nujel / stdlib / z_compiler.nuj
;; Contains the self-hosting Nujel compiler


[def compile
     [let []

       [def compile-do-args
	    [λ [args]
	      [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 [cdr 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-fun
	    [λ [source]
	      ;[display ["[λ] " [str/write source] "\n\n"]]
	      [list 'λ* [cadr source] source [compile-do [cddr source]]]]]

       [λ [source]
	 "Compile the forms in source"
	 ;[display ["[opt] " [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 λ]   [compile-fun source]]
	         [#t source]]]]
]]

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

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