Hex Artifact Content
Not logged in

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