Hex Artifact Content
Not logged in

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                                ;..}..