Artifact 0a7ac481ec249b420c4943a5102a4793425b4538:
0000: ef bb bf 2f 2a 2a 0d 0a 20 2a 20 41 75 74 68 6f .../**.. * Autho
0010: 72 73 3a 20 6b 2e 69 6e 61 62 61 0d 0a 20 2a 20 rs: k.inaba.. *
0020: 4c 69 63 65 6e 73 65 3a 20 4e 59 53 4c 20 30 2e License: NYSL 0.
0030: 39 39 38 32 20 68 74 74 70 3a 2f 2f 77 77 77 2e 9982 http://www.
0040: 6b 6d 6f 6e 6f 73 2e 6e 65 74 2f 6e 79 73 6c 2f kmonos.net/nysl/
0050: 0d 0a 20 2a 0d 0a 20 2a 20 45 76 61 6c 75 61 74 .. *.. * Evaluat
0060: 6f 72 20 66 6f 72 20 50 6f 6c 65 6d 79 20 70 72 or for Polemy pr
0070: 6f 67 72 61 6d 6d 69 6e 67 20 6c 61 6e 67 75 61 ogramming langua
0080: 67 65 2e 0d 0a 20 2a 2f 0d 0a 6d 6f 64 75 6c 65 ge... */..module
0090: 20 70 6f 6c 65 6d 79 2e 65 76 61 6c 3b 0d 0a 69 polemy.eval;..i
00a0: 6d 70 6f 72 74 20 70 6f 6c 65 6d 79 2e 5f 63 6f mport polemy._co
00b0: 6d 6d 6f 6e 3b 0d 0a 69 6d 70 6f 72 74 20 70 6f mmon;..import po
00c0: 6c 65 6d 79 2e 61 73 74 3b 0d 0a 69 6d 70 6f 72 lemy.ast;..impor
00d0: 74 20 70 6f 6c 65 6d 79 2e 72 75 6e 74 69 6d 65 t polemy.runtime
00e0: 3b 0d 0a 0d 0a 43 6f 6e 74 65 78 74 20 63 72 65 ;....Context cre
00f0: 61 74 65 47 6c 6f 62 61 6c 43 6f 6e 74 65 78 74 ateGlobalContext
0100: 28 29 0d 0a 7b 0d 0a 09 61 75 74 6f 20 63 74 78 ()..{...auto ctx
0110: 20 3d 20 6e 65 77 20 43 6f 6e 74 65 78 74 3b 0d = new Context;.
0120: 0a 09 63 74 78 2e 61 64 64 28 22 2b 22 2c 20 6e ..ctx.add("+", n
0130: 65 77 20 50 72 69 6d 69 74 69 76 65 46 75 6e 63 ew PrimitiveFunc
0140: 74 69 6f 6e 28 64 65 6c 65 67 61 74 65 20 56 61 tion(delegate Va
0150: 6c 75 65 28 56 61 6c 75 65 5b 5d 20 61 72 67 73 lue(Value[] args
0160: 29 7b 0d 0a 09 09 69 66 28 20 61 72 67 73 2e 6c ){....if( args.l
0170: 65 6e 67 74 68 20 21 3d 20 32 20 29 0d 0a 09 09 ength != 2 )....
0180: 09 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c 65 6d .throw new Polem
0190: 79 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f yRuntimeExceptio
01a0: 6e 28 22 2b 20 74 61 6b 65 73 20 74 77 6f 20 61 n("+ takes two a
01b0: 72 67 75 6d 65 6e 74 73 21 21 22 29 3b 20 2f 2f rguments!!"); //
01c0: 20 54 4f 44 4f 20 69 6d 70 72 6f 76 65 20 74 68 TODO improve th
01d0: 69 73 20 6d 65 73 73 61 67 65 0d 0a 09 09 69 66 is message....if
01e0: 28 20 61 75 74 6f 20 78 20 3d 20 63 61 73 74 28 ( auto x = cast(
01f0: 49 6e 74 56 61 6c 75 65 29 61 72 67 73 5b 30 5d IntValue)args[0]
0200: 20 29 0d 0a 09 09 09 69 66 28 20 61 75 74 6f 20 ).....if( auto
0210: 79 20 3d 20 63 61 73 74 28 49 6e 74 56 61 6c 75 y = cast(IntValu
0220: 65 29 61 72 67 73 5b 31 5d 20 29 0d 0a 09 09 09 e)args[1] ).....
0230: 09 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 .return new IntV
0240: 61 6c 75 65 28 78 2e 64 61 74 61 2b 79 2e 64 61 alue(x.data+y.da
0250: 74 61 29 3b 0d 0a 09 09 74 68 72 6f 77 20 6e 65 ta);....throw ne
0260: 77 20 50 6f 6c 65 6d 79 52 75 6e 74 69 6d 65 45 w PolemyRuntimeE
0270: 78 63 65 70 74 69 6f 6e 28 22 63 61 6e 6e 6f 74 xception("cannot
0280: 20 61 64 64 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 add non-integer
0290: 73 22 29 3b 20 2f 2f 20 54 4f 44 4f 20 69 6d 70 s"); // TODO imp
02a0: 72 6f 76 65 20 74 68 69 73 20 6d 65 73 73 61 67 rove this messag
02b0: 65 0d 0a 09 7d 29 29 3b 0d 0a 09 63 74 78 2e 61 e...}));...ctx.a
02c0: 64 64 28 22 2d 22 2c 20 6e 65 77 20 50 72 69 6d dd("-", new Prim
02d0: 69 74 69 76 65 46 75 6e 63 74 69 6f 6e 28 64 65 itiveFunction(de
02e0: 6c 65 67 61 74 65 20 56 61 6c 75 65 28 56 61 6c legate Value(Val
02f0: 75 65 5b 5d 20 61 72 67 73 29 7b 0d 0a 09 09 69 ue[] args){....i
0300: 66 28 20 61 72 67 73 2e 6c 65 6e 67 74 68 20 21 f( args.length !
0310: 3d 20 32 20 29 0d 0a 09 09 09 74 68 72 6f 77 20 = 2 ).....throw
0320: 6e 65 77 20 50 6f 6c 65 6d 79 52 75 6e 74 69 6d new PolemyRuntim
0330: 65 45 78 63 65 70 74 69 6f 6e 28 22 2d 20 74 61 eException("- ta
0340: 6b 65 73 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 kes two argument
0350: 73 21 21 22 29 3b 20 2f 2f 20 54 4f 44 4f 20 69 s!!"); // TODO i
0360: 6d 70 72 6f 76 65 20 74 68 69 73 20 6d 65 73 73 mprove this mess
0370: 61 67 65 0d 0a 09 09 69 66 28 20 61 75 74 6f 20 age....if( auto
0380: 78 20 3d 20 63 61 73 74 28 49 6e 74 56 61 6c 75 x = cast(IntValu
0390: 65 29 61 72 67 73 5b 30 5d 20 29 0d 0a 09 09 09 e)args[0] ).....
03a0: 69 66 28 20 61 75 74 6f 20 79 20 3d 20 63 61 73 if( auto y = cas
03b0: 74 28 49 6e 74 56 61 6c 75 65 29 61 72 67 73 5b t(IntValue)args[
03c0: 31 5d 20 29 0d 0a 09 09 09 09 72 65 74 75 72 6e 1] )......return
03d0: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 78 2e new IntValue(x.
03e0: 64 61 74 61 2d 79 2e 64 61 74 61 29 3b 0d 0a 09 data-y.data);...
03f0: 09 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c 65 6d .throw new Polem
0400: 79 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f yRuntimeExceptio
0410: 6e 28 22 63 61 6e 6e 6f 74 20 61 64 64 20 6e 6f n("cannot add no
0420: 6e 2d 69 6e 74 65 67 65 72 73 22 29 3b 20 2f 2f n-integers"); //
0430: 20 54 4f 44 4f 20 69 6d 70 72 6f 76 65 20 74 68 TODO improve th
0440: 69 73 20 6d 65 73 73 61 67 65 0d 0a 09 7d 29 29 is message...}))
0450: 3b 0d 0a 09 63 74 78 2e 61 64 64 28 22 2a 22 2c ;...ctx.add("*",
0460: 20 6e 65 77 20 50 72 69 6d 69 74 69 76 65 46 75 new PrimitiveFu
0470: 6e 63 74 69 6f 6e 28 64 65 6c 65 67 61 74 65 20 nction(delegate
0480: 56 61 6c 75 65 28 56 61 6c 75 65 5b 5d 20 61 72 Value(Value[] ar
0490: 67 73 29 7b 0d 0a 09 09 69 66 28 20 61 72 67 73 gs){....if( args
04a0: 2e 6c 65 6e 67 74 68 20 21 3d 20 32 20 29 0d 0a .length != 2 )..
04b0: 09 09 09 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c ...throw new Pol
04c0: 65 6d 79 52 75 6e 74 69 6d 65 45 78 63 65 70 74 emyRuntimeExcept
04d0: 69 6f 6e 28 22 2a 20 74 61 6b 65 73 20 74 77 6f ion("* takes two
04e0: 20 61 72 67 75 6d 65 6e 74 73 21 21 22 29 3b 20 arguments!!");
04f0: 2f 2f 20 54 4f 44 4f 20 69 6d 70 72 6f 76 65 20 // TODO improve
0500: 74 68 69 73 20 6d 65 73 73 61 67 65 0d 0a 09 09 this message....
0510: 69 66 28 20 61 75 74 6f 20 78 20 3d 20 63 61 73 if( auto x = cas
0520: 74 28 49 6e 74 56 61 6c 75 65 29 61 72 67 73 5b t(IntValue)args[
0530: 30 5d 20 29 0d 0a 09 09 09 69 66 28 20 61 75 74 0] ).....if( aut
0540: 6f 20 79 20 3d 20 63 61 73 74 28 49 6e 74 56 61 o y = cast(IntVa
0550: 6c 75 65 29 61 72 67 73 5b 31 5d 20 29 0d 0a 09 lue)args[1] )...
0560: 09 09 09 72 65 74 75 72 6e 20 6e 65 77 20 49 6e ...return new In
0570: 74 56 61 6c 75 65 28 78 2e 64 61 74 61 2a 79 2e tValue(x.data*y.
0580: 64 61 74 61 29 3b 0d 0a 09 09 74 68 72 6f 77 20 data);....throw
0590: 6e 65 77 20 50 6f 6c 65 6d 79 52 75 6e 74 69 6d new PolemyRuntim
05a0: 65 45 78 63 65 70 74 69 6f 6e 28 22 63 61 6e 6e eException("cann
05b0: 6f 74 20 61 64 64 20 6e 6f 6e 2d 69 6e 74 65 67 ot add non-integ
05c0: 65 72 73 22 29 3b 20 2f 2f 20 54 4f 44 4f 20 69 ers"); // TODO i
05d0: 6d 70 72 6f 76 65 20 74 68 69 73 20 6d 65 73 73 mprove this mess
05e0: 61 67 65 0d 0a 09 7d 29 29 3b 0d 0a 09 63 74 78 age...}));...ctx
05f0: 2e 61 64 64 28 22 2f 22 2c 20 6e 65 77 20 50 72 .add("/", new Pr
0600: 69 6d 69 74 69 76 65 46 75 6e 63 74 69 6f 6e 28 imitiveFunction(
0610: 64 65 6c 65 67 61 74 65 20 56 61 6c 75 65 28 56 delegate Value(V
0620: 61 6c 75 65 5b 5d 20 61 72 67 73 29 7b 0d 0a 09 alue[] args){...
0630: 09 69 66 28 20 61 72 67 73 2e 6c 65 6e 67 74 68 .if( args.length
0640: 20 21 3d 20 32 20 29 0d 0a 09 09 09 74 68 72 6f != 2 ).....thro
0650: 77 20 6e 65 77 20 50 6f 6c 65 6d 79 52 75 6e 74 w new PolemyRunt
0660: 69 6d 65 45 78 63 65 70 74 69 6f 6e 28 22 2f 20 imeException("/
0670: 74 61 6b 65 73 20 74 77 6f 20 61 72 67 75 6d 65 takes two argume
0680: 6e 74 73 21 21 22 29 3b 20 2f 2f 20 54 4f 44 4f nts!!"); // TODO
0690: 20 69 6d 70 72 6f 76 65 20 74 68 69 73 20 6d 65 improve this me
06a0: 73 73 61 67 65 0d 0a 09 09 69 66 28 20 61 75 74 ssage....if( aut
06b0: 6f 20 78 20 3d 20 63 61 73 74 28 49 6e 74 56 61 o x = cast(IntVa
06c0: 6c 75 65 29 61 72 67 73 5b 30 5d 20 29 0d 0a 09 lue)args[0] )...
06d0: 09 09 69 66 28 20 61 75 74 6f 20 79 20 3d 20 63 ..if( auto y = c
06e0: 61 73 74 28 49 6e 74 56 61 6c 75 65 29 61 72 67 ast(IntValue)arg
06f0: 73 5b 31 5d 20 29 0d 0a 09 09 09 09 72 65 74 75 s[1] )......retu
0700: 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 rn new IntValue(
0710: 78 2e 64 61 74 61 2f 79 2e 64 61 74 61 29 3b 0d x.data/y.data);.
0720: 0a 09 09 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c ...throw new Pol
0730: 65 6d 79 52 75 6e 74 69 6d 65 45 78 63 65 70 74 emyRuntimeExcept
0740: 69 6f 6e 28 22 63 61 6e 6e 6f 74 20 61 64 64 20 ion("cannot add
0750: 6e 6f 6e 2d 69 6e 74 65 67 65 72 73 22 29 3b 20 non-integers");
0760: 2f 2f 20 54 4f 44 4f 20 69 6d 70 72 6f 76 65 20 // TODO improve
0770: 74 68 69 73 20 6d 65 73 73 61 67 65 0d 0a 09 7d this message...}
0780: 29 29 3b 0d 0a 09 72 65 74 75 72 6e 20 63 74 78 ));...return ctx
0790: 3b 0d 0a 7d 0d 0a 0d 0a 43 6f 6e 74 65 78 74 20 ;..}....Context
07a0: 65 76 61 6c 28 50 72 6f 67 72 61 6d 20 70 72 6f eval(Program pro
07b0: 67 29 0d 0a 7b 0d 0a 09 72 65 74 75 72 6e 20 65 g)..{...return e
07c0: 76 61 6c 28 70 72 6f 67 2c 20 63 72 65 61 74 65 val(prog, create
07d0: 47 6c 6f 62 61 6c 43 6f 6e 74 65 78 74 28 29 29 GlobalContext())
07e0: 3b 0d 0a 7d 0d 0a 0d 0a 43 6f 6e 74 65 78 74 20 ;..}....Context
07f0: 65 76 61 6c 28 50 72 6f 67 72 61 6d 20 70 72 6f eval(Program pro
0800: 67 2c 20 43 6f 6e 74 65 78 74 20 63 74 78 29 0d g, Context ctx).
0810: 0a 7b 0d 0a 09 66 6f 72 65 61 63 68 28 73 3b 20 .{...foreach(s;
0820: 70 72 6f 67 29 0d 0a 09 09 63 74 78 20 3d 20 65 prog)....ctx = e
0830: 76 61 6c 28 73 2c 20 63 74 78 29 3b 0d 0a 09 72 val(s, ctx);...r
0840: 65 74 75 72 6e 20 63 74 78 3b 0d 0a 7d 0d 0a 0d eturn ctx;..}...
0850: 0a 43 6f 6e 74 65 78 74 20 65 76 61 6c 28 53 74 .Context eval(St
0860: 61 74 65 6d 65 6e 74 20 5f 73 2c 20 43 6f 6e 74 atement _s, Cont
0870: 65 78 74 20 63 74 78 29 0d 0a 7b 0d 0a 09 69 66 ext ctx)..{...if
0880: 28 20 61 75 74 6f 20 73 20 3d 20 63 61 73 74 28 ( auto s = cast(
0890: 44 65 63 6c 53 74 61 74 65 6d 65 6e 74 29 5f 73 DeclStatement)_s
08a0: 20 29 0d 0a 09 7b 0d 0a 09 09 61 75 74 6f 20 76 )...{....auto v
08b0: 20 3d 20 65 76 61 6c 28 73 2e 65 78 70 72 2c 20 = eval(s.expr,
08c0: 63 74 78 29 3b 0d 0a 09 09 63 74 78 2e 61 64 64 ctx);....ctx.add
08d0: 28 73 2e 76 61 72 2c 20 76 29 3b 0d 0a 09 09 72 (s.var, v);....r
08e0: 65 74 75 72 6e 20 63 74 78 3b 0d 0a 09 7d 0d 0a eturn ctx;...}..
08f0: 09 65 6c 73 65 0d 0a 09 69 66 28 20 61 75 74 6f .else...if( auto
0900: 20 73 20 3d 20 63 61 73 74 28 45 78 70 72 53 74 s = cast(ExprSt
0910: 61 74 65 6d 65 6e 74 29 5f 73 20 29 0d 0a 09 7b atement)_s )...{
0920: 0d 0a 09 09 65 76 61 6c 28 73 2e 65 78 70 72 2c ....eval(s.expr,
0930: 20 63 74 78 29 3b 0d 0a 09 09 72 65 74 75 72 6e ctx);....return
0940: 20 63 74 78 3b 0d 0a 09 7d 0d 0a 09 74 68 72 6f ctx;...}...thro
0950: 77 20 6e 65 77 20 50 6f 6c 65 6d 79 52 75 6e 74 w new PolemyRunt
0960: 69 6d 65 45 78 63 65 70 74 69 6f 6e 28 73 70 72 imeException(spr
0970: 69 6e 74 66 21 22 55 6e 6b 6e 6f 77 6e 20 4b 69 intf!"Unknown Ki
0980: 6e 64 20 6f 66 20 53 74 61 74 65 6d 65 6e 74 20 nd of Statement
0990: 25 73 20 61 74 20 5b 25 73 5d 22 28 74 79 70 65 %s at [%s]"(type
09a0: 69 64 28 5f 73 29 2c 20 5f 73 2e 70 6f 73 29 29 id(_s), _s.pos))
09b0: 3b 0d 0a 7d 0d 0a 0d 0a 56 61 6c 75 65 20 65 76 ;..}....Value ev
09c0: 61 6c 28 45 78 70 72 65 73 73 69 6f 6e 20 5f 65 al(Expression _e
09d0: 2c 20 43 6f 6e 74 65 78 74 20 63 74 78 29 0d 0a , Context ctx)..
09e0: 7b 0d 0a 09 69 66 28 20 61 75 74 6f 20 65 20 3d {...if( auto e =
09f0: 20 63 61 73 74 28 53 74 72 4c 69 74 65 72 61 6c cast(StrLiteral
0a00: 45 78 70 72 65 73 73 69 6f 6e 29 5f 65 20 29 0d Expression)_e ).
0a10: 0a 09 7b 0d 0a 09 09 72 65 74 75 72 6e 20 6e 65 ..{....return ne
0a20: 77 20 53 74 72 56 61 6c 75 65 28 65 2e 64 61 74 w StrValue(e.dat
0a30: 61 29 3b 0d 0a 09 7d 0d 0a 09 65 6c 73 65 0d 0a a);...}...else..
0a40: 09 69 66 28 20 61 75 74 6f 20 65 20 3d 20 63 61 .if( auto e = ca
0a50: 73 74 28 49 6e 74 4c 69 74 65 72 61 6c 45 78 70 st(IntLiteralExp
0a60: 72 65 73 73 69 6f 6e 29 5f 65 20 29 0d 0a 09 7b ression)_e )...{
0a70: 0d 0a 09 09 72 65 74 75 72 6e 20 6e 65 77 20 49 ....return new I
0a80: 6e 74 56 61 6c 75 65 28 65 2e 64 61 74 61 29 3b ntValue(e.data);
0a90: 0d 0a 09 7d 0d 0a 09 65 6c 73 65 0d 0a 09 69 66 ...}...else...if
0aa0: 28 20 61 75 74 6f 20 65 20 3d 20 63 61 73 74 28 ( auto e = cast(
0ab0: 56 61 72 45 78 70 72 65 73 73 69 6f 6e 29 5f 65 VarExpression)_e
0ac0: 20 29 0d 0a 09 7b 0d 0a 09 09 72 65 74 75 72 6e )...{....return
0ad0: 20 63 74 78 5b 65 2e 76 61 72 5d 3b 0d 0a 09 7d ctx[e.var];...}
0ae0: 0d 0a 09 65 6c 73 65 0d 0a 09 69 66 28 20 61 75 ...else...if( au
0af0: 74 6f 20 65 20 3d 20 63 61 73 74 28 41 73 73 69 to e = cast(Assi
0b00: 67 6e 45 78 70 72 65 73 73 69 6f 6e 29 5f 65 20 gnExpression)_e
0b10: 29 0d 0a 09 7b 0d 0a 09 09 69 66 28 20 61 75 74 )...{....if( aut
0b20: 6f 20 65 76 20 3d 20 63 61 73 74 28 56 61 72 45 o ev = cast(VarE
0b30: 78 70 72 65 73 73 69 6f 6e 29 65 2e 6c 68 73 20 xpression)e.lhs
0b40: 29 0d 0a 09 09 7b 0d 0a 09 09 09 56 61 6c 75 65 )....{.....Value
0b50: 20 72 20 3d 20 65 76 61 6c 28 65 2e 72 68 73 2c r = eval(e.rhs,
0b60: 20 63 74 78 29 3b 0d 0a 09 09 09 63 74 78 5b 65 ctx);.....ctx[e
0b70: 76 2e 76 61 72 5d 20 3d 20 72 3b 0d 0a 09 09 09 v.var] = r;.....
0b80: 72 65 74 75 72 6e 20 72 3b 0d 0a 09 09 7d 0d 0a return r;....}..
0b90: 09 09 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c 65 ..throw new Pole
0ba0: 6d 79 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 myRuntimeExcepti
0bb0: 6f 6e 28 73 70 72 69 6e 74 66 21 22 4c 68 73 20 on(sprintf!"Lhs
0bc0: 6f 66 20 61 73 73 69 67 6e 6d 65 6e 74 20 6d 75 of assignment mu
0bd0: 73 74 20 62 65 20 61 20 76 61 72 69 61 62 6c 65 st be a variable
0be0: 3a 20 25 73 22 28 65 2e 70 6f 73 29 29 3b 0d 0a : %s"(e.pos));..
0bf0: 09 7d 0d 0a 09 65 6c 73 65 0d 0a 09 69 66 28 20 .}...else...if(
0c00: 61 75 74 6f 20 65 20 3d 20 63 61 73 74 28 46 75 auto e = cast(Fu
0c10: 6e 63 61 6c 6c 45 78 70 72 65 73 73 69 6f 6e 29 ncallExpression)
0c20: 5f 65 20 29 0d 0a 09 7b 0d 0a 09 09 56 61 6c 75 _e )...{....Valu
0c30: 65 20 5f 66 20 3d 20 65 76 61 6c 28 65 2e 66 75 e _f = eval(e.fu
0c40: 6e 2c 20 63 74 78 29 3b 0d 0a 09 09 69 66 28 20 n, ctx);....if(
0c50: 61 75 74 6f 20 66 20 3d 20 63 61 73 74 28 46 75 auto f = cast(Fu
0c60: 6e 56 61 6c 75 65 29 5f 66 20 29 20 7b 0d 0a 09 nValue)_f ) {...
0c70: 09 09 56 61 6c 75 65 5b 5d 20 61 72 67 73 3b 0d ..Value[] args;.
0c80: 0a 09 09 09 66 6f 72 65 61 63 68 28 61 3b 20 65 ....foreach(a; e
0c90: 2e 61 72 67 73 29 0d 0a 09 09 09 09 61 72 67 73 .args)......args
0ca0: 20 7e 3d 20 65 76 61 6c 28 61 2c 20 63 74 78 29 ~= eval(a, ctx)
0cb0: 3b 0d 0a 09 09 09 72 65 74 75 72 6e 20 66 2e 63 ;.....return f.c
0cc0: 61 6c 6c 28 61 72 67 73 29 3b 0d 0a 09 09 7d 20 all(args);....}
0cd0: 65 6c 73 65 0d 0a 09 09 09 74 68 72 6f 77 20 6e else.....throw n
0ce0: 65 77 20 50 6f 6c 65 6d 79 52 75 6e 74 69 6d 65 ew PolemyRuntime
0cf0: 45 78 63 65 70 74 69 6f 6e 28 73 70 72 69 6e 74 Exception(sprint
0d00: 66 21 22 4e 6f 6e 2d 66 75 6e 63 69 6f 6e 20 69 f!"Non-funcion i
0d10: 73 20 61 70 70 6c 69 65 64 20 61 74 20 5b 25 73 s applied at [%s
0d20: 5d 22 28 65 2e 70 6f 73 29 29 3b 0d 0a 09 7d 0d ]"(e.pos));...}.
0d30: 0a 09 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c 65 ..throw new Pole
0d40: 6d 79 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 myRuntimeExcepti
0d50: 6f 6e 28 73 70 72 69 6e 74 66 21 22 55 6e 6b 6e on(sprintf!"Unkn
0d60: 6f 77 6e 20 4b 69 6e 64 20 6f 66 20 45 78 70 72 own Kind of Expr
0d70: 65 73 73 69 6f 6e 20 25 73 20 61 74 20 5b 25 73 ession %s at [%s
0d80: 5d 22 28 74 79 70 65 69 64 28 5f 65 29 2c 20 5f ]"(typeid(_e), _
0d90: 65 2e 70 6f 73 29 29 3b 0d 0a 7d 0d 0a 0d 0a 0d e.pos));..}.....
0da0: 0a 76 65 72 73 69 6f 6e 28 75 6e 69 74 74 65 73 .version(unittes
0db0: 74 29 20 69 6d 70 6f 72 74 20 70 6f 6c 65 6d 79 t) import polemy
0dc0: 2e 70 61 72 73 65 3b 0d 0a 76 65 72 73 69 6f 6e .parse;..version
0dd0: 28 75 6e 69 74 74 65 73 74 29 20 69 6d 70 6f 72 (unittest) impor
0de0: 74 20 73 74 64 2e 73 74 64 69 6f 3b 0d 0a 76 65 t std.stdio;..ve
0df0: 72 73 69 6f 6e 28 75 6e 69 74 74 65 73 74 29 20 rsion(unittest)
0e00: 69 6d 70 6f 72 74 20 73 74 64 2e 65 78 63 65 70 import std.excep
0e10: 74 69 6f 6e 3b 0d 0a 75 6e 69 74 74 65 73 74 0d tion;..unittest.
0e20: 0a 7b 0d 0a 09 61 75 74 6f 20 70 61 72 73 65 72 .{...auto parser
0e30: 20 3d 20 70 61 72 73 65 72 46 72 6f 6d 53 74 72 = parserFromStr
0e40: 69 6e 67 28 60 76 61 72 20 78 20 3d 20 32 31 3b ing(`var x = 21;
0e50: 20 78 20 3d 20 78 20 2b 20 78 2a 78 3b 60 29 3b x = x + x*x;`);
0e60: 0d 0a 09 61 75 74 6f 20 70 72 6f 67 20 3d 20 70 ...auto prog = p
0e70: 61 72 73 65 72 2e 70 61 72 73 65 50 72 6f 67 72 arser.parseProgr
0e80: 61 6d 28 29 3b 0d 0a 09 61 75 74 6f 20 63 74 78 am();...auto ctx
0e90: 20 3d 20 65 76 61 6c 28 70 72 6f 67 29 3b 0d 0a = eval(prog);..
0ea0: 09 61 73 73 65 72 74 28 20 63 74 78 5b 22 78 22 .assert( ctx["x"
0eb0: 5d 20 3d 3d 20 6e 65 77 20 49 6e 74 56 61 6c 75 ] == new IntValu
0ec0: 65 28 42 69 67 49 6e 74 28 32 31 2b 32 31 2a 32 e(BigInt(21+21*2
0ed0: 31 29 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 28 1)) );...assert(
0ee0: 20 21 63 6f 6c 6c 65 63 74 45 78 63 65 70 74 69 !collectExcepti
0ef0: 6f 6e 28 63 74 78 5b 22 78 22 5d 29 20 29 3b 0d on(ctx["x"]) );.
0f00: 0a 09 61 73 73 65 72 74 28 20 63 6f 6c 6c 65 63 ..assert( collec
0f10: 74 45 78 63 65 70 74 69 6f 6e 28 63 74 78 5b 22 tException(ctx["
0f20: 79 22 5d 29 20 29 3b 0d 0a 7d 0d 0a 75 6e 69 74 y"]) );..}..unit
0f30: 74 65 73 74 0d 0a 7b 0d 0a 09 61 75 74 6f 20 70 test..{...auto p
0f40: 61 72 73 65 72 20 3d 20 70 61 72 73 65 72 46 72 arser = parserFr
0f50: 6f 6d 53 74 72 69 6e 67 28 60 76 61 72 20 78 20 omString(`var x
0f60: 3d 20 32 31 3b 20 78 20 3d 20 78 20 2b 20 78 2a = 21; x = x + x*
0f70: 79 3b 60 29 3b 0d 0a 09 61 75 74 6f 20 70 72 6f y;`);...auto pro
0f80: 67 20 3d 20 70 61 72 73 65 72 2e 70 61 72 73 65 g = parser.parse
0f90: 50 72 6f 67 72 61 6d 28 29 3b 0d 0a 09 61 73 73 Program();...ass
0fa0: 65 72 74 28 20 63 6f 6c 6c 65 63 74 45 78 63 65 ert( collectExce
0fb0: 70 74 69 6f 6e 28 65 76 61 6c 28 70 72 6f 67 29 ption(eval(prog)
0fc0: 29 20 29 3b 0d 0a 7d 0d 0a 75 6e 69 74 74 65 73 ) );..}..unittes
0fd0: 74 0d 0a 7b 0d 0a 09 61 75 74 6f 20 70 61 72 73 t..{...auto pars
0fe0: 65 72 20 3d 20 70 61 72 73 65 72 46 72 6f 6d 53 er = parserFromS
0ff0: 74 72 69 6e 67 28 60 76 61 72 20 78 20 3d 20 32 tring(`var x = 2
1000: 31 3b 20 79 20 3d 20 78 20 2b 20 78 2a 78 3b 60 1; y = x + x*x;`
1010: 29 3b 0d 0a 09 61 75 74 6f 20 70 72 6f 67 20 3d );...auto prog =
1020: 20 70 61 72 73 65 72 2e 70 61 72 73 65 50 72 6f parser.parsePro
1030: 67 72 61 6d 28 29 3b 0d 0a 09 61 73 73 65 72 74 gram();...assert
1040: 28 20 63 6f 6c 6c 65 63 74 45 78 63 65 70 74 69 ( collectExcepti
1050: 6f 6e 28 65 76 61 6c 28 70 72 6f 67 29 29 20 29 on(eval(prog)) )
1060: 3b 0d 0a 7d 0d 0a ;..}..