on master help sign in
.
e47b21diko
zod/luau/lib/lua.hoon+113−17
@@ -75,6 +75,7 @@
75 %double [%binop val.l sep.l (process-expr-list tail.l)]
75 %double [%binop val.l sep.l (process-expr-list tail.l)]
76 ==
76 ==
77++ parse-expr
77++ parse-expr
78+ ~& "parse-exp"
78 %+ knee *expr
79 %+ knee *expr
79 |.
80 |.
80 %+ cook process-expr-list parse-expr-list
81 %+ cook process-expr-list parse-expr-list
@@ -351,6 +352,7 @@
351 %- commaed
352 %- commaed
352 %+ turn exprlist print-expr
353 %+ turn exprlist print-expr
353++ parse-exprlist
354++ parse-exprlist
355+ ~& "parse-exprlist"
354 %+ knee *exprlist
356 %+ knee *exprlist
355 |.
357 |.
356 %+ most (ifix [ws ws] com) parse-expr
358 %+ most (ifix [ws ws] com) parse-expr
@@ -436,15 +438,28 @@
436+$ prefix-expr
438+$ prefix-expr
437 $%
439 $%
438 [%expr expr]
440 [%expr expr]
441+ [%call functioncall]
439 [%var var]
442 [%var var]
440 ==
443 ==
444+++ parse-simple-prefix-expr
445+ ~& "parse-simple-prefix-expr"
446+ %+ knee *$%([%expr expr] [%var var])
447+ |.
448+ ;~ pose
449+ parse-parened-expr
450+ ::
451+ %+ cook |=([=var] [%var var]) parse-var
452+ ==
441++ parse-prefix-expr
453++ parse-prefix-expr
454+ ~& "parse-prefix-expr"
442 %+ knee *prefix-expr
455 %+ knee *prefix-expr
443 |.
456 |.
457+ ;< prefix=$%([%expr expr] [%var var]) bind parse-simple-prefix-expr
444 ;~ pose
458 ;~ pose
445− %+ cook |=([=var] [%var var]) parse-var
459+ %+ cook |=(=functioncall [%call functioncall])
460+ (parse-functioncall-args prefix)
446 ::
461 ::
447− parse-parened-expr
462+ (easy prefix)
448 ==
463 ==
449++ print-prefix-expr
464++ print-prefix-expr
450 |= [=prefix-expr]
465 |= [=prefix-expr]
@@ -457,6 +472,7 @@
457 (print-expr +.prefix-expr)
472 (print-expr +.prefix-expr)
458 ")"
473 ")"
459 ==
474 ==
475+ %call (print-functioncall +.prefix-expr)
460 ==
476 ==
461:: stat
477:: stat
462::
478::
@@ -469,6 +485,7 @@
469 [%func-call functioncall]
485 [%func-call functioncall]
470 [%while cond=expr body=blok]
486 [%while cond=expr body=blok]
471 [%repeat body=blok cond=expr]
487 [%repeat body=blok cond=expr]
488+ [%if if]
472 [%break ~]
489 [%break ~]
473 [%empty ~]
490 [%empty ~]
474 ==
491 ==
@@ -506,6 +523,10 @@
506 parse-name
523 parse-name
507 ==
524 ==
508 ::
525 ::
526+ %+ cook
527+ |= =if [%if if]
528+ parse-if
529+ ::
509 %+ cook
530 %+ cook
510 |= =label [%label label]
531 |= =label [%label label]
511 parse-label
532 parse-label
@@ -568,6 +589,73 @@
568 "until "
589 "until "
569 (print-expr cond.stat)
590 (print-expr cond.stat)
570 ==
591 ==
592+ %if (print-if +.stat)
593+ ==
594+:: if
595+::
596++$ if [cond=expr body=blok elsa=(list [cond=expr body=blok]) else=(unit blok)]
597+++ print-if
598+ |= =if
599+ ^- tape
600+ %- zing
601+ :~
602+ "if "
603+ (print-expr cond.if)
604+ " then\0a"
605+ (print-blok body.if)
606+ ::
607+ ^- tape
608+ %- zing
609+ %+ turn elsa.if
610+ |= [cond=expr body=blok]
611+ %- zing
612+ :~
613+ "\0aelseif"
614+ (print-expr cond)
615+ " then\0a"
616+ (print-blok body)
617+ ==
618+ ::
619+ ?~ else.if ""
620+ ^- tape
621+ %- zing
622+ :~
623+ "\0aelse\0a"
624+ (print-blok u.else.if)
625+ ==
626+ ::
627+ "\0aend"
628+ ==
629+++ parse-if
630+ %+ knee *if
631+ |.
632+ %+ cook
633+ |= [* cond=expr * body=blok elsa=(list [cond=expr body=blok]) else=(unit blok) *]
634+ [cond body elsa else]
635+ ;~ (glue wss)
636+ (jest 'if')
637+ parse-expr
638+ (jest 'then')
639+ parse-blok
640+ ::
641+ %- star
642+ %+ cook
643+ |= [* cond=expr * body=blok] [cond body]
644+ ;~ (glue wss)
645+ (jest 'elseif')
646+ parse-expr
647+ (jest 'then')
648+ parse-blok
649+ ==
650+ ::
651+ %- punt
652+ %+ cook
653+ |= [* =blok] blok
654+ ;~ (glue wss)
655+ (jest 'else')
656+ parse-blok
657+ ==
658+ (jest 'end')
571 ==
659 ==
572:: functioncall
660:: functioncall
573::
661::
@@ -598,22 +686,29 @@
598++ parse-functioncall
686++ parse-functioncall
599 %+ knee *functioncall
687 %+ knee *functioncall
600 |.
688 |.
689+ ;< prefix=prefix-expr bind parse-prefix-expr
690+ ~& > prefix
691+ (parse-functioncall-args prefix)
692+++ parse-functioncall-args
693+ ~& "parse-functioncall-args"
694+ |= =prefix-expr
695+ %+ knee *functioncall
696+ |.
697+ ;~ pfix
698+ ws
601− ;~ pose
699+ ;~ pose
602− %+ cook
700+ %+ cook
603− |= [func=prefix-expr =args] [%call func args]
604− ;~ (glue ws)
605− parse-prefix-expr
701+ |= =args [%call prefix-expr args]
606− parse-args
607− ==
608− ::
609− %+ cook
610− |= [obj=prefix-expr * method=name =args]
611− [%method obj method args]
612− ;~ (glue ws)
613− parse-prefix-expr
614− (just ':')
615− parse-name
616 parse-args
702 parse-args
703+ ::
704+ %+ cook
705+ |= [* method=name =args]
706+ [%method prefix-expr method args]
707+ ;~ (glue ws)
708+ (just ':')
709+ parse-name
710+ parse-args
711+ ==
617 ==
712 ==
618 ==
713 ==
619:: args
714:: args
@@ -629,6 +724,7 @@
629 ")"
724 ")"
630 ==
725 ==
631++ parse-args
726++ parse-args
727+ ~& "parse-args"
632 %+ knee *args
728 %+ knee *args
633 |.
729 |.
634 ;~ pose
730 ;~ pose
zod/luau/tests/foo.lua+5
@@ -71,3 +71,8 @@ do
71end
71end
72until true
72until true
73
73
74+
75+if l == 3 then a = a + 1 ; assert(getlocal(2, 1) == "(temporary)")
76+elseif l == 4 then a = a + 1; assert(getlocal(2, 1) == "A")
77+end
78+