Artifact c5ee9ab6830c78bdbbebc895ad0d144c57c13217:
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 70 61 72 73 65 3b 0d t polemy.parse;.
00e0: 0a 69 6d 70 6f 72 74 20 70 6f 6c 65 6d 79 2e 72 .import polemy.r
00f0: 75 6e 74 69 6d 65 3b 0d 0a 0d 0a 43 6f 6e 74 65 untime;....Conte
0100: 78 74 20 63 72 65 61 74 65 47 6c 6f 62 61 6c 43 xt createGlobalC
0110: 6f 6e 74 65 78 74 28 29 0d 0a 7b 0d 0a 09 61 75 ontext()..{...au
0120: 74 6f 20 63 74 78 20 3d 20 6e 65 77 20 43 6f 6e to ctx = new Con
0130: 74 65 78 74 3b 0d 0a 09 63 74 78 2e 61 64 64 28 text;...ctx.add(
0140: 22 2b 22 2c 20 6e 65 77 20 50 72 69 6d 69 74 69 "+", new Primiti
0150: 76 65 46 75 6e 63 74 69 6f 6e 28 64 65 6c 65 67 veFunction(deleg
0160: 61 74 65 20 56 61 6c 75 65 28 56 61 6c 75 65 5b ate Value(Value[
0170: 5d 20 61 72 67 73 29 7b 0d 0a 09 09 69 66 28 20 ] args){....if(
0180: 61 72 67 73 2e 6c 65 6e 67 74 68 20 21 3d 20 32 args.length != 2
0190: 20 29 0d 0a 09 09 09 74 68 72 6f 77 20 6e 65 77 ).....throw new
01a0: 20 50 6f 6c 65 6d 79 52 75 6e 74 69 6d 65 45 78 PolemyRuntimeEx
01b0: 63 65 70 74 69 6f 6e 28 22 2b 20 74 61 6b 65 73 ception("+ takes
01c0: 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 21 21 two arguments!!
01d0: 22 29 3b 20 2f 2f 20 54 4f 44 4f 20 69 6d 70 72 "); // TODO impr
01e0: 6f 76 65 20 74 68 69 73 20 6d 65 73 73 61 67 65 ove this message
01f0: 0d 0a 09 09 69 66 28 20 61 75 74 6f 20 78 20 3d ....if( auto x =
0200: 20 63 61 73 74 28 49 6e 74 56 61 6c 75 65 29 61 cast(IntValue)a
0210: 72 67 73 5b 30 5d 20 29 0d 0a 09 09 09 69 66 28 rgs[0] ).....if(
0220: 20 61 75 74 6f 20 79 20 3d 20 63 61 73 74 28 49 auto y = cast(I
0230: 6e 74 56 61 6c 75 65 29 61 72 67 73 5b 31 5d 20 ntValue)args[1]
0240: 29 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 6e 65 )......return ne
0250: 77 20 49 6e 74 56 61 6c 75 65 28 78 2e 64 61 74 w IntValue(x.dat
0260: 61 2b 79 2e 64 61 74 61 29 3b 0d 0a 09 09 74 68 a+y.data);....th
0270: 72 6f 77 20 6e 65 77 20 50 6f 6c 65 6d 79 52 75 row new PolemyRu
0280: 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 28 22 ntimeException("
0290: 63 61 6e 6e 6f 74 20 61 64 64 20 6e 6f 6e 2d 69 cannot add non-i
02a0: 6e 74 65 67 65 72 73 22 29 3b 20 2f 2f 20 54 4f ntegers"); // TO
02b0: 44 4f 20 69 6d 70 72 6f 76 65 20 74 68 69 73 20 DO improve this
02c0: 6d 65 73 73 61 67 65 0d 0a 09 7d 29 29 3b 0d 0a message...}));..
02d0: 09 63 74 78 2e 61 64 64 28 22 2d 22 2c 20 6e 65 .ctx.add("-", ne
02e0: 77 20 50 72 69 6d 69 74 69 76 65 46 75 6e 63 74 w PrimitiveFunct
02f0: 69 6f 6e 28 64 65 6c 65 67 61 74 65 20 56 61 6c ion(delegate Val
0300: 75 65 28 56 61 6c 75 65 5b 5d 20 61 72 67 73 29 ue(Value[] args)
0310: 7b 0d 0a 09 09 69 66 28 20 61 72 67 73 2e 6c 65 {....if( args.le
0320: 6e 67 74 68 20 21 3d 20 32 20 29 0d 0a 09 09 09 ngth != 2 ).....
0330: 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c 65 6d 79 throw new Polemy
0340: 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e RuntimeException
0350: 28 22 2d 20 74 61 6b 65 73 20 74 77 6f 20 61 72 ("- takes two ar
0360: 67 75 6d 65 6e 74 73 21 21 22 29 3b 20 2f 2f 20 guments!!"); //
0370: 54 4f 44 4f 20 69 6d 70 72 6f 76 65 20 74 68 69 TODO improve thi
0380: 73 20 6d 65 73 73 61 67 65 0d 0a 09 09 69 66 28 s message....if(
0390: 20 61 75 74 6f 20 78 20 3d 20 63 61 73 74 28 49 auto x = cast(I
03a0: 6e 74 56 61 6c 75 65 29 61 72 67 73 5b 30 5d 20 ntValue)args[0]
03b0: 29 0d 0a 09 09 09 69 66 28 20 61 75 74 6f 20 79 ).....if( auto y
03c0: 20 3d 20 63 61 73 74 28 49 6e 74 56 61 6c 75 65 = cast(IntValue
03d0: 29 61 72 67 73 5b 31 5d 20 29 0d 0a 09 09 09 09 )args[1] )......
03e0: 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 return new IntVa
03f0: 6c 75 65 28 78 2e 64 61 74 61 2d 79 2e 64 61 74 lue(x.data-y.dat
0400: 61 29 3b 0d 0a 09 09 74 68 72 6f 77 20 6e 65 77 a);....throw new
0410: 20 50 6f 6c 65 6d 79 52 75 6e 74 69 6d 65 45 78 PolemyRuntimeEx
0420: 63 65 70 74 69 6f 6e 28 22 63 61 6e 6e 6f 74 20 ception("cannot
0430: 61 64 64 20 6e 6f 6e 2d 69 6e 74 65 67 65 72 73 add non-integers
0440: 22 29 3b 20 2f 2f 20 54 4f 44 4f 20 69 6d 70 72 "); // TODO impr
0450: 6f 76 65 20 74 68 69 73 20 6d 65 73 73 61 67 65 ove this message
0460: 0d 0a 09 7d 29 29 3b 0d 0a 09 63 74 78 2e 61 64 ...}));...ctx.ad
0470: 64 28 22 2a 22 2c 20 6e 65 77 20 50 72 69 6d 69 d("*", new Primi
0480: 74 69 76 65 46 75 6e 63 74 69 6f 6e 28 64 65 6c tiveFunction(del
0490: 65 67 61 74 65 20 56 61 6c 75 65 28 56 61 6c 75 egate Value(Valu
04a0: 65 5b 5d 20 61 72 67 73 29 7b 0d 0a 09 09 69 66 e[] args){....if
04b0: 28 20 61 72 67 73 2e 6c 65 6e 67 74 68 20 21 3d ( args.length !=
04c0: 20 32 20 29 0d 0a 09 09 09 74 68 72 6f 77 20 6e 2 ).....throw n
04d0: 65 77 20 50 6f 6c 65 6d 79 52 75 6e 74 69 6d 65 ew PolemyRuntime
04e0: 45 78 63 65 70 74 69 6f 6e 28 22 2a 20 74 61 6b Exception("* tak
04f0: 65 73 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 es two arguments
0500: 21 21 22 29 3b 20 2f 2f 20 54 4f 44 4f 20 69 6d !!"); // TODO im
0510: 70 72 6f 76 65 20 74 68 69 73 20 6d 65 73 73 61 prove this messa
0520: 67 65 0d 0a 09 09 69 66 28 20 61 75 74 6f 20 78 ge....if( auto x
0530: 20 3d 20 63 61 73 74 28 49 6e 74 56 61 6c 75 65 = cast(IntValue
0540: 29 61 72 67 73 5b 30 5d 20 29 0d 0a 09 09 09 69 )args[0] ).....i
0550: 66 28 20 61 75 74 6f 20 79 20 3d 20 63 61 73 74 f( auto y = cast
0560: 28 49 6e 74 56 61 6c 75 65 29 61 72 67 73 5b 31 (IntValue)args[1
0570: 5d 20 29 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 ] )......return
0580: 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 78 2e 64 new IntValue(x.d
0590: 61 74 61 2a 79 2e 64 61 74 61 29 3b 0d 0a 09 09 ata*y.data);....
05a0: 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c 65 6d 79 throw new Polemy
05b0: 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e RuntimeException
05c0: 28 22 63 61 6e 6e 6f 74 20 61 64 64 20 6e 6f 6e ("cannot add non
05d0: 2d 69 6e 74 65 67 65 72 73 22 29 3b 20 2f 2f 20 -integers"); //
05e0: 54 4f 44 4f 20 69 6d 70 72 6f 76 65 20 74 68 69 TODO improve thi
05f0: 73 20 6d 65 73 73 61 67 65 0d 0a 09 7d 29 29 3b s message...}));
0600: 0d 0a 09 63 74 78 2e 61 64 64 28 22 2f 22 2c 20 ...ctx.add("/",
0610: 6e 65 77 20 50 72 69 6d 69 74 69 76 65 46 75 6e new PrimitiveFun
0620: 63 74 69 6f 6e 28 64 65 6c 65 67 61 74 65 20 56 ction(delegate V
0630: 61 6c 75 65 28 56 61 6c 75 65 5b 5d 20 61 72 67 alue(Value[] arg
0640: 73 29 7b 0d 0a 09 09 69 66 28 20 61 72 67 73 2e s){....if( args.
0650: 6c 65 6e 67 74 68 20 21 3d 20 32 20 29 0d 0a 09 length != 2 )...
0660: 09 09 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c 65 ..throw new Pole
0670: 6d 79 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 myRuntimeExcepti
0680: 6f 6e 28 22 2f 20 74 61 6b 65 73 20 74 77 6f 20 on("/ takes two
0690: 61 72 67 75 6d 65 6e 74 73 21 21 22 29 3b 20 2f arguments!!"); /
06a0: 2f 20 54 4f 44 4f 20 69 6d 70 72 6f 76 65 20 74 / TODO improve t
06b0: 68 69 73 20 6d 65 73 73 61 67 65 0d 0a 09 09 69 his message....i
06c0: 66 28 20 61 75 74 6f 20 78 20 3d 20 63 61 73 74 f( auto x = cast
06d0: 28 49 6e 74 56 61 6c 75 65 29 61 72 67 73 5b 30 (IntValue)args[0
06e0: 5d 20 29 0d 0a 09 09 09 69 66 28 20 61 75 74 6f ] ).....if( auto
06f0: 20 79 20 3d 20 63 61 73 74 28 49 6e 74 56 61 6c y = cast(IntVal
0700: 75 65 29 61 72 67 73 5b 31 5d 20 29 0d 0a 09 09 ue)args[1] )....
0710: 09 09 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 ..return new Int
0720: 56 61 6c 75 65 28 78 2e 64 61 74 61 2f 79 2e 64 Value(x.data/y.d
0730: 61 74 61 29 3b 0d 0a 09 09 74 68 72 6f 77 20 6e ata);....throw n
0740: 65 77 20 50 6f 6c 65 6d 79 52 75 6e 74 69 6d 65 ew PolemyRuntime
0750: 45 78 63 65 70 74 69 6f 6e 28 22 63 61 6e 6e 6f Exception("canno
0760: 74 20 61 64 64 20 6e 6f 6e 2d 69 6e 74 65 67 65 t add non-intege
0770: 72 73 22 29 3b 20 2f 2f 20 54 4f 44 4f 20 69 6d rs"); // TODO im
0780: 70 72 6f 76 65 20 74 68 69 73 20 6d 65 73 73 61 prove this messa
0790: 67 65 0d 0a 09 7d 29 29 3b 0d 0a 09 72 65 74 75 ge...}));...retu
07a0: 72 6e 20 63 74 78 3b 0d 0a 7d 0d 0a 0d 0a 43 6f rn ctx;..}....Co
07b0: 6e 74 65 78 74 20 65 76 61 6c 53 74 72 69 6e 67 ntext evalString
07c0: 28 54 2e 2e 2e 29 28 54 20 70 61 72 61 6d 73 29 (T...)(T params)
07d0: 0d 0a 7b 0d 0a 09 72 65 74 75 72 6e 20 65 76 61 ..{...return eva
07e0: 6c 28 20 70 61 72 73 65 72 46 72 6f 6d 53 74 72 l( parserFromStr
07f0: 69 6e 67 28 70 61 72 61 6d 73 29 2e 70 61 72 73 ing(params).pars
0800: 65 50 72 6f 67 72 61 6d 28 29 20 29 3b 0d 0a 7d eProgram() );..}
0810: 0d 0a 0d 0a 43 6f 6e 74 65 78 74 20 65 76 61 6c ....Context eval
0820: 46 69 6c 65 28 54 2e 2e 2e 29 28 54 20 70 61 72 File(T...)(T par
0830: 61 6d 73 29 0d 0a 7b 0d 0a 09 72 65 74 75 72 6e ams)..{...return
0840: 20 65 76 61 6c 28 20 70 61 72 73 65 72 46 72 6f eval( parserFro
0850: 6d 46 69 6c 65 28 70 61 72 61 6d 73 29 2e 70 61 mFile(params).pa
0860: 72 73 65 50 72 6f 67 72 61 6d 28 29 20 29 3b 0d rseProgram() );.
0870: 0a 7d 0d 0a 0d 0a 43 6f 6e 74 65 78 74 20 65 76 .}....Context ev
0880: 61 6c 28 50 72 6f 67 72 61 6d 20 70 72 6f 67 29 al(Program prog)
0890: 0d 0a 7b 0d 0a 09 72 65 74 75 72 6e 20 65 76 61 ..{...return eva
08a0: 6c 28 70 72 6f 67 2c 20 63 72 65 61 74 65 47 6c l(prog, createGl
08b0: 6f 62 61 6c 43 6f 6e 74 65 78 74 28 29 29 3b 0d obalContext());.
08c0: 0a 7d 0d 0a 0d 0a 43 6f 6e 74 65 78 74 20 65 76 .}....Context ev
08d0: 61 6c 28 50 72 6f 67 72 61 6d 20 70 72 6f 67 2c al(Program prog,
08e0: 20 43 6f 6e 74 65 78 74 20 63 74 78 29 0d 0a 7b Context ctx)..{
08f0: 0d 0a 09 66 6f 72 65 61 63 68 28 73 3b 20 70 72 ...foreach(s; pr
0900: 6f 67 29 0d 0a 09 09 63 74 78 20 3d 20 65 76 61 og)....ctx = eva
0910: 6c 28 73 2c 20 63 74 78 29 3b 0d 0a 09 72 65 74 l(s, ctx);...ret
0920: 75 72 6e 20 63 74 78 3b 0d 0a 7d 0d 0a 0d 0a 43 urn ctx;..}....C
0930: 6f 6e 74 65 78 74 20 65 76 61 6c 28 53 74 61 74 ontext eval(Stat
0940: 65 6d 65 6e 74 20 5f 73 2c 20 43 6f 6e 74 65 78 ement _s, Contex
0950: 74 20 63 74 78 29 0d 0a 7b 0d 0a 09 69 66 28 20 t ctx)..{...if(
0960: 61 75 74 6f 20 73 20 3d 20 63 61 73 74 28 44 65 auto s = cast(De
0970: 63 6c 53 74 61 74 65 6d 65 6e 74 29 5f 73 20 29 clStatement)_s )
0980: 0d 0a 09 7b 0d 0a 09 09 61 75 74 6f 20 76 20 3d ...{....auto v =
0990: 20 65 76 61 6c 28 73 2e 65 78 70 72 2c 20 63 74 eval(s.expr, ct
09a0: 78 29 3b 0d 0a 09 09 63 74 78 2e 61 64 64 28 73 x);....ctx.add(s
09b0: 2e 76 61 72 2c 20 76 29 3b 0d 0a 09 09 72 65 74 .var, v);....ret
09c0: 75 72 6e 20 63 74 78 3b 0d 0a 09 7d 0d 0a 09 65 urn ctx;...}...e
09d0: 6c 73 65 0d 0a 09 69 66 28 20 61 75 74 6f 20 73 lse...if( auto s
09e0: 20 3d 20 63 61 73 74 28 45 78 70 72 53 74 61 74 = cast(ExprStat
09f0: 65 6d 65 6e 74 29 5f 73 20 29 0d 0a 09 7b 0d 0a ement)_s )...{..
0a00: 09 09 65 76 61 6c 28 73 2e 65 78 70 72 2c 20 63 ..eval(s.expr, c
0a10: 74 78 29 3b 0d 0a 09 09 72 65 74 75 72 6e 20 63 tx);....return c
0a20: 74 78 3b 0d 0a 09 7d 0d 0a 09 74 68 72 6f 77 20 tx;...}...throw
0a30: 6e 65 77 20 50 6f 6c 65 6d 79 52 75 6e 74 69 6d new PolemyRuntim
0a40: 65 45 78 63 65 70 74 69 6f 6e 28 73 70 72 69 6e eException(sprin
0a50: 74 66 21 22 55 6e 6b 6e 6f 77 6e 20 4b 69 6e 64 tf!"Unknown Kind
0a60: 20 6f 66 20 53 74 61 74 65 6d 65 6e 74 20 25 73 of Statement %s
0a70: 20 61 74 20 5b 25 73 5d 22 28 74 79 70 65 69 64 at [%s]"(typeid
0a80: 28 5f 73 29 2c 20 5f 73 2e 70 6f 73 29 29 3b 0d (_s), _s.pos));.
0a90: 0a 7d 0d 0a 0d 0a 56 61 6c 75 65 20 65 76 61 6c .}....Value eval
0aa0: 28 45 78 70 72 65 73 73 69 6f 6e 20 5f 65 2c 20 (Expression _e,
0ab0: 43 6f 6e 74 65 78 74 20 63 74 78 29 0d 0a 7b 0d Context ctx)..{.
0ac0: 0a 09 69 66 28 20 61 75 74 6f 20 65 20 3d 20 63 ..if( auto e = c
0ad0: 61 73 74 28 53 74 72 4c 69 74 65 72 61 6c 45 78 ast(StrLiteralEx
0ae0: 70 72 65 73 73 69 6f 6e 29 5f 65 20 29 0d 0a 09 pression)_e )...
0af0: 7b 0d 0a 09 09 72 65 74 75 72 6e 20 6e 65 77 20 {....return new
0b00: 53 74 72 56 61 6c 75 65 28 65 2e 64 61 74 61 29 StrValue(e.data)
0b10: 3b 0d 0a 09 7d 0d 0a 09 65 6c 73 65 0d 0a 09 69 ;...}...else...i
0b20: 66 28 20 61 75 74 6f 20 65 20 3d 20 63 61 73 74 f( auto e = cast
0b30: 28 49 6e 74 4c 69 74 65 72 61 6c 45 78 70 72 65 (IntLiteralExpre
0b40: 73 73 69 6f 6e 29 5f 65 20 29 0d 0a 09 7b 0d 0a ssion)_e )...{..
0b50: 09 09 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 ..return new Int
0b60: 56 61 6c 75 65 28 65 2e 64 61 74 61 29 3b 0d 0a Value(e.data);..
0b70: 09 7d 0d 0a 09 65 6c 73 65 0d 0a 09 69 66 28 20 .}...else...if(
0b80: 61 75 74 6f 20 65 20 3d 20 63 61 73 74 28 56 61 auto e = cast(Va
0b90: 72 45 78 70 72 65 73 73 69 6f 6e 29 5f 65 20 29 rExpression)_e )
0ba0: 0d 0a 09 7b 0d 0a 09 09 72 65 74 75 72 6e 20 63 ...{....return c
0bb0: 74 78 5b 65 2e 76 61 72 5d 3b 0d 0a 09 7d 0d 0a tx[e.var];...}..
0bc0: 09 65 6c 73 65 0d 0a 09 69 66 28 20 61 75 74 6f .else...if( auto
0bd0: 20 65 20 3d 20 63 61 73 74 28 41 73 73 69 67 6e e = cast(Assign
0be0: 45 78 70 72 65 73 73 69 6f 6e 29 5f 65 20 29 0d Expression)_e ).
0bf0: 0a 09 7b 0d 0a 09 09 69 66 28 20 61 75 74 6f 20 ..{....if( auto
0c00: 65 76 20 3d 20 63 61 73 74 28 56 61 72 45 78 70 ev = cast(VarExp
0c10: 72 65 73 73 69 6f 6e 29 65 2e 6c 68 73 20 29 0d ression)e.lhs ).
0c20: 0a 09 09 7b 0d 0a 09 09 09 56 61 6c 75 65 20 72 ...{.....Value r
0c30: 20 3d 20 65 76 61 6c 28 65 2e 72 68 73 2c 20 63 = eval(e.rhs, c
0c40: 74 78 29 3b 0d 0a 09 09 09 63 74 78 5b 65 76 2e tx);.....ctx[ev.
0c50: 76 61 72 5d 20 3d 20 72 3b 0d 0a 09 09 09 72 65 var] = r;.....re
0c60: 74 75 72 6e 20 72 3b 0d 0a 09 09 7d 0d 0a 09 09 turn r;....}....
0c70: 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c 65 6d 79 throw new Polemy
0c80: 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e RuntimeException
0c90: 28 73 70 72 69 6e 74 66 21 22 4c 68 73 20 6f 66 (sprintf!"Lhs of
0ca0: 20 61 73 73 69 67 6e 6d 65 6e 74 20 6d 75 73 74 assignment must
0cb0: 20 62 65 20 61 20 76 61 72 69 61 62 6c 65 3a 20 be a variable:
0cc0: 25 73 22 28 65 2e 70 6f 73 29 29 3b 0d 0a 09 7d %s"(e.pos));...}
0cd0: 0d 0a 09 65 6c 73 65 0d 0a 09 69 66 28 20 61 75 ...else...if( au
0ce0: 74 6f 20 65 20 3d 20 63 61 73 74 28 46 75 6e 63 to e = cast(Func
0cf0: 61 6c 6c 45 78 70 72 65 73 73 69 6f 6e 29 5f 65 allExpression)_e
0d00: 20 29 0d 0a 09 7b 0d 0a 09 09 56 61 6c 75 65 20 )...{....Value
0d10: 5f 66 20 3d 20 65 76 61 6c 28 65 2e 66 75 6e 2c _f = eval(e.fun,
0d20: 20 63 74 78 29 3b 0d 0a 09 09 69 66 28 20 61 75 ctx);....if( au
0d30: 74 6f 20 66 20 3d 20 63 61 73 74 28 46 75 6e 56 to f = cast(FunV
0d40: 61 6c 75 65 29 5f 66 20 29 20 7b 0d 0a 09 09 09 alue)_f ) {.....
0d50: 56 61 6c 75 65 5b 5d 20 61 72 67 73 3b 0d 0a 09 Value[] args;...
0d60: 09 09 66 6f 72 65 61 63 68 28 61 3b 20 65 2e 61 ..foreach(a; e.a
0d70: 72 67 73 29 0d 0a 09 09 09 09 61 72 67 73 20 7e rgs)......args ~
0d80: 3d 20 65 76 61 6c 28 61 2c 20 63 74 78 29 3b 0d = eval(a, ctx);.
0d90: 0a 09 09 09 72 65 74 75 72 6e 20 66 2e 63 61 6c ....return f.cal
0da0: 6c 28 61 72 67 73 29 3b 0d 0a 09 09 7d 20 65 6c l(args);....} el
0db0: 73 65 0d 0a 09 09 09 74 68 72 6f 77 20 6e 65 77 se.....throw new
0dc0: 20 50 6f 6c 65 6d 79 52 75 6e 74 69 6d 65 45 78 PolemyRuntimeEx
0dd0: 63 65 70 74 69 6f 6e 28 73 70 72 69 6e 74 66 21 ception(sprintf!
0de0: 22 4e 6f 6e 2d 66 75 6e 63 69 6f 6e 20 69 73 20 "Non-funcion is
0df0: 61 70 70 6c 69 65 64 20 61 74 20 5b 25 73 5d 22 applied at [%s]"
0e00: 28 65 2e 70 6f 73 29 29 3b 0d 0a 09 7d 0d 0a 09 (e.pos));...}...
0e10: 74 68 72 6f 77 20 6e 65 77 20 50 6f 6c 65 6d 79 throw new Polemy
0e20: 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e RuntimeException
0e30: 28 73 70 72 69 6e 74 66 21 22 55 6e 6b 6e 6f 77 (sprintf!"Unknow
0e40: 6e 20 4b 69 6e 64 20 6f 66 20 45 78 70 72 65 73 n Kind of Expres
0e50: 73 69 6f 6e 20 25 73 20 61 74 20 5b 25 73 5d 22 sion %s at [%s]"
0e60: 28 74 79 70 65 69 64 28 5f 65 29 2c 20 5f 65 2e (typeid(_e), _e.
0e70: 70 6f 73 29 29 3b 0d 0a 7d 0d 0a 0d 0a 0d 0a 76 pos));..}......v
0e80: 65 72 73 69 6f 6e 28 75 6e 69 74 74 65 73 74 29 ersion(unittest)
0e90: 20 69 6d 70 6f 72 74 20 70 6f 6c 65 6d 79 2e 70 import polemy.p
0ea0: 61 72 73 65 3b 0d 0a 76 65 72 73 69 6f 6e 28 75 arse;..version(u
0eb0: 6e 69 74 74 65 73 74 29 20 69 6d 70 6f 72 74 20 nittest) import
0ec0: 73 74 64 2e 73 74 64 69 6f 3b 0d 0a 76 65 72 73 std.stdio;..vers
0ed0: 69 6f 6e 28 75 6e 69 74 74 65 73 74 29 20 69 6d ion(unittest) im
0ee0: 70 6f 72 74 20 73 74 64 2e 65 78 63 65 70 74 69 port std.excepti
0ef0: 6f 6e 3b 0d 0a 75 6e 69 74 74 65 73 74 0d 0a 7b on;..unittest..{
0f00: 0d 0a 09 61 75 74 6f 20 63 74 78 20 3d 20 65 76 ...auto ctx = ev
0f10: 61 6c 53 74 72 69 6e 67 28 60 76 61 72 20 78 20 alString(`var x
0f20: 3d 20 32 31 3b 20 78 20 3d 20 78 20 2b 20 78 2a = 21; x = x + x*
0f30: 78 3b 60 29 3b 0d 0a 09 61 73 73 65 72 74 28 20 x;`);...assert(
0f40: 63 74 78 5b 22 78 22 5d 20 3d 3d 20 6e 65 77 20 ctx["x"] == new
0f50: 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28 IntValue(BigInt(
0f60: 32 31 2b 32 31 2a 32 31 29 29 20 29 3b 0d 0a 09 21+21*21)) );...
0f70: 61 73 73 65 72 74 28 20 21 63 6f 6c 6c 65 63 74 assert( !collect
0f80: 45 78 63 65 70 74 69 6f 6e 28 63 74 78 5b 22 78 Exception(ctx["x
0f90: 22 5d 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 28 "]) );...assert(
0fa0: 20 63 6f 6c 6c 65 63 74 45 78 63 65 70 74 69 6f collectExceptio
0fb0: 6e 28 63 74 78 5b 22 79 22 5d 29 20 29 3b 0d 0a n(ctx["y"]) );..
0fc0: 7d 0d 0a 75 6e 69 74 74 65 73 74 0d 0a 7b 0d 0a }..unittest..{..
0fd0: 09 61 73 73 65 72 74 28 20 63 6f 6c 6c 65 63 74 .assert( collect
0fe0: 45 78 63 65 70 74 69 6f 6e 28 65 76 61 6c 53 74 Exception(evalSt
0ff0: 72 69 6e 67 28 60 76 61 72 20 78 20 3d 20 32 31 ring(`var x = 21
1000: 3b 20 78 20 3d 20 78 20 2b 20 78 2a 79 3b 60 29 ; x = x + x*y;`)
1010: 29 20 29 3b 0d 0a 7d 0d 0a 75 6e 69 74 74 65 73 ) );..}..unittes
1020: 74 0d 0a 7b 0d 0a 09 61 73 73 65 72 74 28 20 63 t..{...assert( c
1030: 6f 6c 6c 65 63 74 45 78 63 65 70 74 69 6f 6e 28 ollectException(
1040: 65 76 61 6c 53 74 72 69 6e 67 28 60 76 61 72 20 evalString(`var
1050: 78 20 3d 20 32 31 3b 20 79 20 3d 20 78 20 2b 20 x = 21; y = x +
1060: 78 2a 78 3b 60 29 29 20 29 3b 0d 0a 7d 0d 0a x*x;`)) );..}..