@@ -203,8 +203,36 @@ def emit(self, ctx):
203203
204204
205205
206-
207-
206+ def resolve_var (ctx , name ):
207+ var = code .get_var_if_defined (ctx .ns , name )
208+ if var is None :
209+ var = code .get_var_if_defined (u"pixie.stdlib" , name )
210+ return var
211+
212+ def resolve_local (ctx , name ):
213+ return ctx .get_local (name )
214+
215+
216+ def is_macro_call (form , ctx ):
217+ if rt .seq_QMARK_ (form ) is true and isinstance (rt .first (form ), symbol .Symbol ):
218+ name = rt .first (form )._str
219+ if resolve_local (ctx , name ):
220+ return None
221+ var = resolve_var (ctx , name )
222+
223+ if var and var .is_defined ():
224+ val = var .deref ()
225+ if isinstance (val , code .BaseCode ) and val .is_macro ():
226+ return val
227+ return None
228+
229+ def call_macro (var , form , ctx ):
230+ form = rt .next (form )
231+ args = []
232+ while form is not nil :
233+ args .append (rt .first (form ))
234+ form = rt .next (form )
235+ return var .invoke (args )
208236
209237def compile_form (form , ctx ):
210238 if rt .instance_QMARK_ (form , rt .ISeq .deref ()) is true and form is not nil :
@@ -215,12 +243,9 @@ def compile_form(form, ctx):
215243
216244 if isinstance (form , symbol .Symbol ):
217245 name = form ._str
218- loc = ctx . get_local ( name )
246+ loc = resolve_local ( ctx , name )
219247 if loc is None :
220- var = code .get_var_if_defined (ctx .ns , name )
221- if var is None :
222- var = code .get_var_if_defined (u"pixie.stdlib" , name )
223-
248+ var = resolve_var (ctx , name )
224249 if var is None :
225250 var = _type_registry .get_by_name (name , None )
226251 if var is not None :
@@ -412,10 +437,10 @@ def compile_if(form, ctx):
412437 ctx .mark (else_lbl )
413438
414439def compile_def (form , ctx ):
415- form = form .next ()
416- name = form .first ()
417- form = form .next ()
418- val = form .first ()
440+ form = rt .next (form )
441+ name = rt .first (form )
442+ form = rt .next (form )
443+ val = rt .first (form )
419444
420445 assert isinstance (name , symbol .Symbol )
421446
@@ -426,12 +451,12 @@ def compile_def(form, ctx):
426451 ctx .sub_sp (1 )
427452
428453def compile_do (form , ctx ):
429- form = form .next ()
454+ form = rt .next (form )
430455 assert form is not nil
431456
432457 while True :
433- compile_form (form .first (), ctx )
434- form = form .next ()
458+ compile_form (rt .first (form ), ctx )
459+ form = rt .next (form )
435460
436461 if form is nil :
437462 return
@@ -546,10 +571,15 @@ def compile_loop(form, ctx):
546571 u"let" : compile_let ,
547572 u"loop" : compile_loop }
548573
574+
549575def compile_cons (form , ctx ):
550576 if isinstance (form .first (), symbol .Symbol ) and form .first ()._str in builtins :
551577 return builtins [form .first ()._str ](form , ctx )
552578
579+ macro = is_macro_call (form , ctx )
580+ if macro :
581+ return compile_cons (call_macro (macro , form , ctx ), ctx )
582+
553583 cnt = 0
554584 ctc = ctx .can_tail_call
555585 while form is not nil :
0 commit comments