Hex Artifact Content
Not logged in

Artifact 0e6e0e9d77fcbedc56431bf21b7a0486ed97153b:


0000: 2f 2a 2a 0a 20 2a 20 41 75 74 68 6f 72 73 3a 20  /**. * Authors: 
0010: 6b 2e 69 6e 61 62 61 0a 20 2a 20 4c 69 63 65 6e  k.inaba. * Licen
0020: 73 65 3a 20 4e 59 53 4c 20 30 2e 39 39 38 32 20  se: NYSL 0.9982 
0030: 68 74 74 70 3a 2f 2f 77 77 77 2e 6b 6d 6f 6e 6f  http://www.kmono
0040: 73 2e 6e 65 74 2f 6e 79 73 6c 2f 0a 20 2a 0a 20  s.net/nysl/. *. 
0050: 2a 20 45 76 61 6c 75 61 74 6f 72 20 66 6f 72 20  * Evaluator for 
0060: 50 6f 6c 65 6d 79 20 70 72 6f 67 72 61 6d 6d 69  Polemy programmi
0070: 6e 67 20 6c 61 6e 67 75 61 67 65 2e 0a 20 2a 2f  ng language.. */
0080: 0a 6d 6f 64 75 6c 65 20 70 6f 6c 65 6d 79 2e 65  .module polemy.e
0090: 76 61 6c 3b 0a 69 6d 70 6f 72 74 20 70 6f 6c 65  val;.import pole
00a0: 6d 79 2e 5f 63 6f 6d 6d 6f 6e 3b 0a 69 6d 70 6f  my._common;.impo
00b0: 72 74 20 70 6f 6c 65 6d 79 2e 66 61 69 6c 75 72  rt polemy.failur
00c0: 65 3b 0d 0a 69 6d 70 6f 72 74 20 70 6f 6c 65 6d  e;..import polem
00d0: 79 2e 61 73 74 3b 0a 69 6d 70 6f 72 74 20 70 6f  y.ast;.import po
00e0: 6c 65 6d 79 2e 70 61 72 73 65 3b 0a 69 6d 70 6f  lemy.parse;.impo
00f0: 72 74 20 70 6f 6c 65 6d 79 2e 76 61 6c 75 65 3b  rt polemy.value;
0100: 0a 69 6d 70 6f 72 74 20 70 6f 6c 65 6d 79 2e 6c  .import polemy.l
0110: 61 79 65 72 3b 0d 0a 69 6d 70 6f 72 74 20 73 74  ayer;..import st
0120: 64 2e 74 79 70 65 63 6f 6e 73 3b 0d 0a 69 6d 70  d.typecons;..imp
0130: 6f 72 74 20 73 74 64 2e 73 74 64 69 6f 3b 0a 0d  ort std.stdio;..
0140: 0a 2f 2f 2f 0a 54 61 62 6c 65 20 63 72 65 61 74  .///.Table creat
0150: 65 47 6c 6f 62 61 6c 43 6f 6e 74 65 78 74 28 29  eGlobalContext()
0160: 0a 7b 0d 0a 09 61 75 74 6f 20 63 74 78 20 3d 20  .{...auto ctx = 
0170: 6e 65 77 20 54 61 62 6c 65 3b 0d 0a 09 63 74 78  new Table;...ctx
0180: 2e 73 65 74 28 22 2b 22 2c 20 56 61 6c 75 65 4c  .set("+", ValueL
0190: 61 79 65 72 2c 20 6e 61 74 69 76 65 28 20 28 49  ayer, native( (I
01a0: 6e 74 56 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74  ntValue lhs, Int
01b0: 56 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72  Value rhs){retur
01c0: 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c  n new IntValue(l
01d0: 68 73 2e 64 61 74 61 20 2b 20 72 68 73 2e 64 61  hs.data + rhs.da
01e0: 74 61 29 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e  ta);} ));...ctx.
01f0: 73 65 74 28 22 2d 22 2c 20 56 61 6c 75 65 4c 61  set("-", ValueLa
0200: 79 65 72 2c 20 6e 61 74 69 76 65 28 20 28 49 6e  yer, native( (In
0210: 74 56 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56  tValue lhs, IntV
0220: 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e  alue rhs){return
0230: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68   new IntValue(lh
0240: 73 2e 64 61 74 61 20 2d 20 72 68 73 2e 64 61 74  s.data - rhs.dat
0250: 61 29 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73  a);} ));...ctx.s
0260: 65 74 28 22 2a 22 2c 20 56 61 6c 75 65 4c 61 79  et("*", ValueLay
0270: 65 72 2c 20 6e 61 74 69 76 65 28 20 28 49 6e 74  er, native( (Int
0280: 56 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 61  Value lhs, IntVa
0290: 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20  lue rhs){return 
02a0: 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73  new IntValue(lhs
02b0: 2e 64 61 74 61 20 2a 20 72 68 73 2e 64 61 74 61  .data * rhs.data
02c0: 29 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65  );} ));...ctx.se
02d0: 74 28 22 2f 22 2c 20 56 61 6c 75 65 4c 61 79 65  t("/", ValueLaye
02e0: 72 2c 20 6e 61 74 69 76 65 28 20 28 49 6e 74 56  r, native( (IntV
02f0: 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 61 6c  alue lhs, IntVal
0300: 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e  ue rhs){return n
0310: 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 2e  ew IntValue(lhs.
0320: 64 61 74 61 20 2f 20 72 68 73 2e 64 61 74 61 29  data / rhs.data)
0330: 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74  ;} ));...ctx.set
0340: 28 22 25 22 2c 20 56 61 6c 75 65 4c 61 79 65 72  ("%", ValueLayer
0350: 2c 20 6e 61 74 69 76 65 28 20 28 49 6e 74 56 61  , native( (IntVa
0360: 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 61 6c 75  lue lhs, IntValu
0370: 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e 65  e rhs){return ne
0380: 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 2e 64  w IntValue(lhs.d
0390: 61 74 61 20 25 20 72 68 73 2e 64 61 74 61 29 3b  ata % rhs.data);
03a0: 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28  } ));...ctx.set(
03b0: 22 7c 7c 22 2c 20 56 61 6c 75 65 4c 61 79 65 72  "||", ValueLayer
03c0: 2c 20 6e 61 74 69 76 65 28 20 28 49 6e 74 56 61  , native( (IntVa
03d0: 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 61 6c 75  lue lhs, IntValu
03e0: 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e 65  e rhs){return ne
03f0: 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e  w IntValue(BigIn
0400: 74 28 28 6c 68 73 2e 64 61 74 61 21 3d 30 29 20  t((lhs.data!=0) 
0410: 7c 7c 20 28 72 68 73 2e 64 61 74 61 21 3d 30 29  || (rhs.data!=0)
0420: 20 3f 20 31 3a 30 29 29 3b 7d 20 29 29 3b 0d 0a   ? 1:0));} ));..
0430: 09 63 74 78 2e 73 65 74 28 22 26 26 22 2c 20 56  .ctx.set("&&", V
0440: 61 6c 75 65 4c 61 79 65 72 2c 20 6e 61 74 69 76  alueLayer, nativ
0450: 65 28 20 28 49 6e 74 56 61 6c 75 65 20 6c 68 73  e( (IntValue lhs
0460: 2c 20 49 6e 74 56 61 6c 75 65 20 72 68 73 29 7b  , IntValue rhs){
0470: 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61  return new IntVa
0480: 6c 75 65 28 42 69 67 49 6e 74 28 28 6c 68 73 2e  lue(BigInt((lhs.
0490: 64 61 74 61 21 3d 30 29 20 26 26 20 28 72 68 73  data!=0) && (rhs
04a0: 2e 64 61 74 61 21 3d 30 29 20 3f 20 31 3a 30 29  .data!=0) ? 1:0)
04b0: 29 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65  );} ));...ctx.se
04c0: 74 28 22 3c 22 2c 20 56 61 6c 75 65 4c 61 79 65  t("<", ValueLaye
04d0: 72 2c 20 6e 61 74 69 76 65 28 20 28 56 61 6c 75  r, native( (Valu
04e0: 65 20 6c 68 73 2c 20 56 61 6c 75 65 20 72 68 73  e lhs, Value rhs
04f0: 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74  ){return new Int
0500: 56 61 6c 75 65 28 42 69 67 49 6e 74 28 6c 68 73  Value(BigInt(lhs
0510: 20 3c 20 72 68 73 20 3f 20 31 3a 20 30 29 29 3b   < rhs ? 1: 0));
0520: 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28  } ));...ctx.set(
0530: 22 3e 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c  ">", ValueLayer,
0540: 20 6e 61 74 69 76 65 28 20 28 56 61 6c 75 65 20   native( (Value 
0550: 6c 68 73 2c 20 56 61 6c 75 65 20 72 68 73 29 7b  lhs, Value rhs){
0560: 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61  return new IntVa
0570: 6c 75 65 28 42 69 67 49 6e 74 28 6c 68 73 20 3e  lue(BigInt(lhs >
0580: 20 72 68 73 20 3f 20 31 3a 20 30 29 29 3b 7d 20   rhs ? 1: 0));} 
0590: 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 3c  ));...ctx.set("<
05a0: 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20  =", ValueLayer, 
05b0: 6e 61 74 69 76 65 28 20 28 56 61 6c 75 65 20 6c  native( (Value l
05c0: 68 73 2c 20 56 61 6c 75 65 20 72 68 73 29 7b 72  hs, Value rhs){r
05d0: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c  eturn new IntVal
05e0: 75 65 28 42 69 67 49 6e 74 28 6c 68 73 20 3c 3d  ue(BigInt(lhs <=
05f0: 20 72 68 73 20 3f 20 31 3a 20 30 29 29 3b 7d 20   rhs ? 1: 0));} 
0600: 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 3e  ));...ctx.set(">
0610: 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20  =", ValueLayer, 
0620: 6e 61 74 69 76 65 28 20 28 56 61 6c 75 65 20 6c  native( (Value l
0630: 68 73 2c 20 56 61 6c 75 65 20 72 68 73 29 7b 72  hs, Value rhs){r
0640: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c  eturn new IntVal
0650: 75 65 28 42 69 67 49 6e 74 28 6c 68 73 20 3e 3d  ue(BigInt(lhs >=
0660: 20 72 68 73 20 3f 20 31 3a 20 30 29 29 3b 7d 20   rhs ? 1: 0));} 
0670: 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 3d  ));...ctx.set("=
0680: 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20  =", ValueLayer, 
0690: 6e 61 74 69 76 65 28 20 28 56 61 6c 75 65 20 6c  native( (Value l
06a0: 68 73 2c 20 56 61 6c 75 65 20 72 68 73 29 7b 72  hs, Value rhs){r
06b0: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c  eturn new IntVal
06c0: 75 65 28 42 69 67 49 6e 74 28 6c 68 73 20 3d 3d  ue(BigInt(lhs ==
06d0: 20 72 68 73 20 3f 20 31 3a 20 30 29 29 3b 7d 20   rhs ? 1: 0));} 
06e0: 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 21  ));...ctx.set("!
06f0: 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20  =", ValueLayer, 
0700: 6e 61 74 69 76 65 28 20 28 56 61 6c 75 65 20 6c  native( (Value l
0710: 68 73 2c 20 56 61 6c 75 65 20 72 68 73 29 7b 72  hs, Value rhs){r
0720: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c  eturn new IntVal
0730: 75 65 28 42 69 67 49 6e 74 28 6c 68 73 20 21 3d  ue(BigInt(lhs !=
0740: 20 72 68 73 20 3f 20 31 3a 20 30 29 29 3b 7d 20   rhs ? 1: 0));} 
0750: 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 70  ));...ctx.set("p
0760: 72 69 6e 74 22 2c 20 56 61 6c 75 65 4c 61 79 65  rint", ValueLaye
0770: 72 2c 20 6e 61 74 69 76 65 28 20 28 56 61 6c 75  r, native( (Valu
0780: 65 20 61 29 7b 0a 09 09 77 72 69 74 65 6c 6e 28  e a){...writeln(
0790: 61 29 3b 0a 09 09 72 65 74 75 72 6e 20 6e 65 77  a);...return new
07a0: 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74   IntValue(BigInt
07b0: 28 31 37 38 29 29 3b 0a 09 7d 29 29 3b 0a 09 63  (178));..}));..c
07c0: 74 78 2e 73 65 74 28 22 69 66 22 2c 20 56 61 6c  tx.set("if", Val
07d0: 75 65 4c 61 79 65 72 2c 20 6e 61 74 69 76 65 28  ueLayer, native(
07e0: 20 28 49 6e 74 56 61 6c 75 65 20 78 2c 20 46 75   (IntValue x, Fu
07f0: 6e 56 61 6c 75 65 20 66 74 2c 20 46 75 6e 56 61  nValue ft, FunVa
0800: 6c 75 65 20 66 65 29 7b 0d 0a 09 09 61 75 74 6f  lue fe){....auto
0810: 20 74 6f 52 75 6e 20 3d 20 28 78 2e 64 61 74 61   toRun = (x.data
0820: 3d 3d 30 20 3f 20 66 65 20 3a 20 66 74 29 3b 0d  ==0 ? fe : ft);.
0830: 0a 09 09 72 65 74 75 72 6e 20 74 6f 52 75 6e 2e  ...return toRun.
0840: 69 6e 76 6f 6b 65 28 6e 75 6c 6c 2c 20 56 61 6c  invoke(null, Val
0850: 75 65 4c 61 79 65 72 2c 20 74 6f 52 75 6e 2e 64  ueLayer, toRun.d
0860: 65 66 69 6e 69 74 69 6f 6e 43 6f 6e 74 65 78 74  efinitionContext
0870: 28 29 29 3b 0d 0a 2f 2f 09 09 72 65 74 75 72 6e  ());..//..return
0880: 20 74 6f 52 75 6e 2e 69 6e 76 6f 6b 65 28 70 6f   toRun.invoke(po
0890: 73 2c 20 6c 61 79 2c 20 74 6f 52 75 6e 2e 64 65  s, lay, toRun.de
08a0: 66 69 6e 69 74 69 6f 6e 43 6f 6e 74 65 78 74 28  finitionContext(
08b0: 29 29 3b 0d 0a 09 7d 29 29 3b 0a 09 63 74 78 2e  ));...}));..ctx.
08c0: 73 65 74 28 22 5f 69 73 69 6e 74 22 2c 20 56 61  set("_isint", Va
08d0: 6c 75 65 4c 61 79 65 72 2c 20 6e 61 74 69 76 65  lueLayer, native
08e0: 28 20 28 56 61 6c 75 65 20 76 29 7b 72 65 74 75  ( (Value v){retu
08f0: 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28  rn new IntValue(
0900: 42 69 67 49 6e 74 28 63 61 73 74 28 49 6e 74 56  BigInt(cast(IntV
0910: 61 6c 75 65 29 76 20 69 73 20 6e 75 6c 6c 20 3f  alue)v is null ?
0920: 20 30 20 3a 20 31 29 29 3b 7d 20 29 29 3b 0d 0a   0 : 1));} ));..
0930: 09 63 74 78 2e 73 65 74 28 22 5f 69 73 73 74 72  .ctx.set("_isstr
0940: 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 6e  ", ValueLayer, n
0950: 61 74 69 76 65 28 20 28 56 61 6c 75 65 20 76 29  ative( (Value v)
0960: 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56  {return new IntV
0970: 61 6c 75 65 28 42 69 67 49 6e 74 28 63 61 73 74  alue(BigInt(cast
0980: 28 53 74 72 56 61 6c 75 65 29 76 20 69 73 20 6e  (StrValue)v is n
0990: 75 6c 6c 20 3f 20 30 20 3a 20 31 29 29 3b 7d 20  ull ? 0 : 1));} 
09a0: 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 5f  ));...ctx.set("_
09b0: 69 73 66 75 6e 22 2c 20 56 61 6c 75 65 4c 61 79  isfun", ValueLay
09c0: 65 72 2c 20 6e 61 74 69 76 65 28 20 28 56 61 6c  er, native( (Val
09d0: 75 65 20 76 29 7b 72 65 74 75 72 6e 20 6e 65 77  ue v){return new
09e0: 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74   IntValue(BigInt
09f0: 28 63 61 73 74 28 46 75 6e 56 61 6c 75 65 29 76  (cast(FunValue)v
0a00: 20 69 73 20 6e 75 6c 6c 20 3f 20 30 20 3a 20 31   is null ? 0 : 1
0a10: 29 29 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73  ));} ));...ctx.s
0a20: 65 74 28 22 5f 69 73 75 6e 64 65 66 69 6e 65 64  et("_isundefined
0a30: 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 6e  ", ValueLayer, n
0a40: 61 74 69 76 65 28 20 28 56 61 6c 75 65 20 76 29  ative( (Value v)
0a50: 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56  {return new IntV
0a60: 61 6c 75 65 28 42 69 67 49 6e 74 28 63 61 73 74  alue(BigInt(cast
0a70: 28 55 6e 64 56 61 6c 75 65 29 76 20 69 73 20 6e  (UndValue)v is n
0a80: 75 6c 6c 20 3f 20 30 20 3a 20 31 29 29 3b 7d 20  ull ? 0 : 1));} 
0a90: 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 5f  ));...ctx.set("_
0aa0: 69 73 74 61 62 6c 65 22 2c 20 56 61 6c 75 65 4c  istable", ValueL
0ab0: 61 79 65 72 2c 20 6e 61 74 69 76 65 28 20 28 56  ayer, native( (V
0ac0: 61 6c 75 65 20 76 29 7b 72 65 74 75 72 6e 20 6e  alue v){return n
0ad0: 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49  ew IntValue(BigI
0ae0: 6e 74 28 63 61 73 74 28 54 61 62 6c 65 29 76 20  nt(cast(Table)v 
0af0: 69 73 20 6e 75 6c 6c 20 3f 20 30 20 3a 20 31 29  is null ? 0 : 1)
0b00: 29 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65  );} ));...ctx.se
0b10: 74 28 22 2e 22 2c 20 56 61 6c 75 65 4c 61 79 65  t(".", ValueLaye
0b20: 72 2c 20 6e 61 74 69 76 65 28 20 28 54 61 62 6c  r, native( (Tabl
0b30: 65 20 74 2c 20 53 74 72 56 61 6c 75 65 20 73 29  e t, StrValue s)
0b40: 7b 0d 0a 09 09 72 65 74 75 72 6e 20 28 74 2e 68  {....return (t.h
0b50: 61 73 28 73 2e 64 61 74 61 2c 20 56 61 6c 75 65  as(s.data, Value
0b60: 4c 61 79 65 72 29 20 3f 20 74 2e 67 65 74 28 73  Layer) ? t.get(s
0b70: 2e 64 61 74 61 2c 20 56 61 6c 75 65 4c 61 79 65  .data, ValueLaye
0b80: 72 29 20 3a 20 6e 65 77 20 55 6e 64 56 61 6c 75  r) : new UndValu
0b90: 65 29 3b 0d 0a 09 7d 29 20 29 3b 0d 0a 09 63 74  e);...}) );...ct
0ba0: 78 2e 73 65 74 28 22 2e 3f 22 2c 20 56 61 6c 75  x.set(".?", Valu
0bb0: 65 4c 61 79 65 72 2c 20 6e 61 74 69 76 65 28 20  eLayer, native( 
0bc0: 28 54 61 62 6c 65 20 74 2c 20 53 74 72 56 61 6c  (Table t, StrVal
0bd0: 75 65 20 73 29 7b 0d 0a 09 09 72 65 74 75 72 6e  ue s){....return
0be0: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69   new IntValue(Bi
0bf0: 67 49 6e 74 28 74 2e 68 61 73 28 73 2e 64 61 74  gInt(t.has(s.dat
0c00: 61 2c 20 56 61 6c 75 65 4c 61 79 65 72 29 20 3f  a, ValueLayer) ?
0c10: 20 31 20 3a 20 30 29 29 3b 0d 0a 09 7d 29 20 29   1 : 0));...}) )
0c20: 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 2e 3d 22  ;...ctx.set(".="
0c30: 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 6e 61  , ValueLayer, na
0c40: 74 69 76 65 28 20 28 54 61 62 6c 65 20 74 2c 20  tive( (Table t, 
0c50: 53 74 72 56 61 6c 75 65 20 73 2c 20 56 61 6c 75  StrValue s, Valu
0c60: 65 20 76 29 7b 0d 0a 09 09 61 75 74 6f 20 74 32  e v){....auto t2
0c70: 20 3d 20 6e 65 77 20 54 61 62 6c 65 28 74 2c 20   = new Table(t, 
0c80: 54 61 62 6c 65 2e 4b 69 6e 64 2e 4e 6f 74 50 72  Table.Kind.NotPr
0c90: 6f 70 61 67 61 74 65 53 65 74 29 3b 0d 0a 09 09  opagateSet);....
0ca0: 74 32 2e 73 65 74 28 73 2e 64 61 74 61 2c 20 56  t2.set(s.data, V
0cb0: 61 6c 75 65 4c 61 79 65 72 2c 20 76 29 3b 0d 0a  alueLayer, v);..
0cc0: 09 09 72 65 74 75 72 6e 20 74 32 3b 0d 0a 09 7d  ..return t2;...}
0cd0: 29 20 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22  ) );...ctx.set("
0ce0: 7b 7d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c  {}", ValueLayer,
0cf0: 20 6e 61 74 69 76 65 28 20 28 29 7b 0d 0a 09 09   native( (){....
0d00: 72 65 74 75 72 6e 20 6e 65 77 20 54 61 62 6c 65  return new Table
0d10: 3b 0d 0a 09 7d 29 20 29 3b 0d 0a 09 72 65 74 75  ;...}) );...retu
0d20: 72 6e 20 63 74 78 3b 0a 7d 0a 0a 2f 2f 2f 20 45  rn ctx;.}../// E
0d30: 6e 74 72 79 20 70 6f 69 6e 74 20 6f 66 20 74 68  ntry point of th
0d40: 69 73 20 6d 6f 64 75 6c 65 0d 0a 0d 0a 54 75 70  is module....Tup
0d50: 6c 65 21 28 56 61 6c 75 65 2c 22 76 61 6c 22 2c  le!(Value,"val",
0d60: 54 61 62 6c 65 2c 22 63 74 78 22 29 20 65 76 61  Table,"ctx") eva
0d70: 6c 53 74 72 69 6e 67 28 53 2c 54 2e 2e 2e 29 28  lString(S,T...)(
0d80: 53 20 73 74 72 2c 20 54 20 66 6e 5f 6c 6e 5f 63  S str, T fn_ln_c
0d90: 6e 29 0a 7b 0a 09 72 65 74 75 72 6e 20 65 76 61  n).{..return eva
0da0: 6c 28 20 70 6f 6c 65 6d 79 2e 70 61 72 73 65 2e  l( polemy.parse.
0db0: 70 61 72 73 65 53 74 72 69 6e 67 28 73 74 72 2c  parseString(str,
0dc0: 20 66 6e 5f 6c 6e 5f 63 6e 29 20 29 3b 0a 7d 0a   fn_ln_cn) );.}.
0dd0: 0a 2f 2f 2f 20 45 6e 74 72 79 20 70 6f 69 6e 74  ./// Entry point
0de0: 20 6f 66 20 74 68 69 73 20 6d 6f 64 75 6c 65 0d   of this module.
0df0: 0a 0d 0a 54 75 70 6c 65 21 28 56 61 6c 75 65 2c  ...Tuple!(Value,
0e00: 22 76 61 6c 22 2c 54 61 62 6c 65 2c 22 63 74 78  "val",Table,"ctx
0e10: 22 29 20 65 76 61 6c 46 69 6c 65 28 53 2c 20 54  ") evalFile(S, T
0e20: 2e 2e 2e 29 28 53 20 66 69 6c 65 6e 61 6d 65 2c  ...)(S filename,
0e30: 20 54 20 6c 6e 5f 63 6e 29 0a 7b 0a 09 72 65 74   T ln_cn).{..ret
0e40: 75 72 6e 20 65 76 61 6c 28 20 70 6f 6c 65 6d 79  urn eval( polemy
0e50: 2e 70 61 72 73 65 2e 70 61 72 73 65 46 69 6c 65  .parse.parseFile
0e60: 28 66 69 6c 65 6e 61 6d 65 2c 20 6c 6e 5f 63 6e  (filename, ln_cn
0e70: 29 20 29 3b 0a 7d 0a 0a 2f 2f 2f 20 45 6e 74 72  ) );.}../// Entr
0e80: 79 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20  y point of this 
0e90: 6d 6f 64 75 6c 65 0d 0a 0d 0a 54 75 70 6c 65 21  module....Tuple!
0ea0: 28 56 61 6c 75 65 2c 22 76 61 6c 22 2c 54 61 62  (Value,"val",Tab
0eb0: 6c 65 2c 22 63 74 78 22 29 20 65 76 61 6c 28 41  le,"ctx") eval(A
0ec0: 53 54 20 65 29 0a 7b 0a 09 54 61 62 6c 65 20 63  ST e).{..Table c
0ed0: 74 78 20 3d 20 63 72 65 61 74 65 47 6c 6f 62 61  tx = createGloba
0ee0: 6c 43 6f 6e 74 65 78 74 28 29 3b 0a 09 72 65 74  lContext();..ret
0ef0: 75 72 6e 20 74 79 70 65 6f 66 28 72 65 74 75 72  urn typeof(retur
0f00: 6e 29 28 65 76 61 6c 28 65 2c 20 63 74 78 2c 20  n)(eval(e, ctx, 
0f10: 66 61 6c 73 65 2c 20 56 61 6c 75 65 4c 61 79 65  false, ValueLaye
0f20: 72 29 2c 20 63 74 78 29 3b 0a 7d 0a 0d 0a 56 61  r), ctx);.}...Va
0f30: 6c 75 65 20 69 6e 76 6f 6b 65 46 75 6e 63 74 69  lue invokeFuncti
0f40: 6f 6e 28 69 6e 20 4c 65 78 50 6f 73 69 74 69 6f  on(in LexPositio
0f50: 6e 20 70 6f 73 2c 20 56 61 6c 75 65 20 5f 66 2c  n pos, Value _f,
0f60: 20 41 53 54 5b 5d 20 61 72 67 73 2c 20 54 61 62   AST[] args, Tab
0f70: 6c 65 20 63 61 6c 6c 65 72 43 74 78 2c 20 4c 61  le callerCtx, La
0f80: 79 65 72 20 6c 61 79 2c 20 62 6f 6f 6c 20 41 6c  yer lay, bool Al
0f90: 77 61 79 73 4d 61 63 72 6f 3d 66 61 6c 73 65 29  waysMacro=false)
0fa0: 0d 0a 7b 0d 0a 09 69 66 28 61 75 74 6f 20 66 20  ..{...if(auto f 
0fb0: 3d 20 63 61 73 74 28 46 75 6e 56 61 6c 75 65 29  = cast(FunValue)
0fc0: 5f 66 29 0d 0a 09 7b 0d 0a 09 09 54 61 62 6c 65  _f)...{....Table
0fd0: 20 63 74 78 20 3d 20 6e 65 77 20 54 61 62 6c 65   ctx = new Table
0fe0: 28 66 2e 64 65 66 69 6e 69 74 69 6f 6e 43 6f 6e  (f.definitionCon
0ff0: 74 65 78 74 28 29 2c 20 54 61 62 6c 65 2e 4b 69  text(), Table.Ki
1000: 6e 64 2e 4e 6f 74 50 72 6f 70 61 67 61 74 65 53  nd.NotPropagateS
1010: 65 74 29 3b 0d 0a 09 09 66 6f 72 65 61 63 68 28  et);....foreach(
1020: 69 2c 70 3b 20 66 2e 70 61 72 61 6d 73 28 29 29  i,p; f.params())
1030: 0d 0a 09 09 09 69 66 28 20 70 2e 6c 61 79 65 72  .....if( p.layer
1040: 73 2e 65 6d 70 74 79 20 29 0d 0a 09 09 09 09 69  s.empty )......i
1050: 66 28 6c 61 79 3d 3d 4d 61 63 72 6f 4c 61 79 65  f(lay==MacroLaye
1060: 72 29 0d 0a 09 09 09 09 09 63 74 78 2e 73 65 74  r).......ctx.set
1070: 28 70 2e 6e 61 6d 65 2c 20 6c 61 79 2c 20 6d 61  (p.name, lay, ma
1080: 63 72 6f 45 76 61 6c 28 61 72 67 73 5b 69 5d 2c  croEval(args[i],
1090: 20 63 61 6c 6c 65 72 43 74 78 2c 20 41 6c 77 61   callerCtx, Alwa
10a0: 79 73 4d 61 63 72 6f 29 29 3b 0d 0a 09 09 09 09  ysMacro));......
10b0: 65 6c 73 65 0d 0a 09 09 09 09 09 63 74 78 2e 73  else.......ctx.s
10c0: 65 74 28 70 2e 6e 61 6d 65 2c 20 6c 61 79 2c 20  et(p.name, lay, 
10d0: 65 76 61 6c 28 61 72 67 73 5b 69 5d 2c 20 63 61  eval(args[i], ca
10e0: 6c 6c 65 72 43 74 78 2c 20 74 72 75 65 2c 20 6c  llerCtx, true, l
10f0: 61 79 29 29 3b 0d 0a 09 09 09 65 6c 73 65 0d 0a  ay));.....else..
1100: 09 09 09 09 66 6f 72 65 61 63 68 28 61 72 67 4c  ....foreach(argL
1110: 61 79 3b 20 70 2e 6c 61 79 65 72 73 29 0d 0a 09  ay; p.layers)...
1120: 09 09 09 09 69 66 28 61 72 67 4c 61 79 3d 3d 4d  ....if(argLay==M
1130: 61 63 72 6f 4c 61 79 65 72 29 0d 0a 09 09 09 09  acroLayer)......
1140: 09 09 63 74 78 2e 73 65 74 28 70 2e 6e 61 6d 65  ..ctx.set(p.name
1150: 2c 20 61 72 67 4c 61 79 2c 20 6d 61 63 72 6f 45  , argLay, macroE
1160: 76 61 6c 28 61 72 67 73 5b 69 5d 2c 20 63 61 6c  val(args[i], cal
1170: 6c 65 72 43 74 78 2c 20 41 6c 77 61 79 73 4d 61  lerCtx, AlwaysMa
1180: 63 72 6f 29 29 3b 0d 0a 09 09 09 09 09 65 6c 73  cro));.......els
1190: 65 0d 0a 09 09 09 09 09 09 63 74 78 2e 73 65 74  e........ctx.set
11a0: 28 70 2e 6e 61 6d 65 2c 20 61 72 67 4c 61 79 2c  (p.name, argLay,
11b0: 20 65 76 61 6c 28 61 72 67 73 5b 69 5d 2c 20 63   eval(args[i], c
11c0: 61 6c 6c 65 72 43 74 78 2c 20 74 72 75 65 2c 20  allerCtx, true, 
11d0: 61 72 67 4c 61 79 29 29 3b 0d 0a 09 09 72 65 74  argLay));....ret
11e0: 75 72 6e 20 66 2e 69 6e 76 6f 6b 65 28 70 6f 73  urn f.invoke(pos
11f0: 2c 20 6c 61 79 2c 20 63 74 78 29 3b 0d 0a 09 7d  , lay, ctx);...}
1200: 0d 0a 09 74 68 72 6f 77 20 67 65 6e 65 78 21 52  ...throw genex!R
1210: 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 28  untimeException(
1220: 70 6f 73 2c 20 22 74 72 69 65 64 20 74 6f 20 63  pos, "tried to c
1230: 61 6c 6c 20 6e 6f 6e 2d 66 75 6e 63 74 69 6f 6e  all non-function
1240: 22 29 3b 0d 0a 7d 0d 0a 0d 0a 56 61 6c 75 65 20  ");..}....Value 
1250: 6c 69 66 74 28 69 6e 20 4c 65 78 50 6f 73 69 74  lift(in LexPosit
1260: 69 6f 6e 20 70 6f 73 2c 20 56 61 6c 75 65 20 76  ion pos, Value v
1270: 2c 20 4c 61 79 65 72 20 6c 61 79 2c 20 54 61 62  , Layer lay, Tab
1280: 6c 65 20 63 61 6c 6c 65 72 43 74 78 29 0d 0a 7b  le callerCtx)..{
1290: 0d 0a 09 2f 2f 20 73 69 6d 69 6c 61 72 20 74 6f  ...// similar to
12a0: 20 69 6e 76 6f 6b 65 20 46 75 6e 63 74 69 6f 6e   invoke Function
12b0: 2c 20 62 75 74 20 77 69 74 68 20 6f 6e 6c 79 20  , but with only 
12c0: 6f 6e 65 20 61 72 67 75 6d 65 6e 74 20 62 6f 75  one argument bou
12d0: 6e 64 20 74 6f 20 56 61 6c 75 65 4c 61 79 65 72  nd to ValueLayer
12e0: 0d 0a 09 56 61 6c 75 65 20 5f 66 20 3d 20 63 61  ...Value _f = ca
12f0: 6c 6c 65 72 43 74 78 2e 67 65 74 28 6c 61 79 2c  llerCtx.get(lay,
1300: 20 53 79 73 74 65 6d 4c 61 79 65 72 2c 20 70 6f   SystemLayer, po
1310: 73 29 3b 0d 0a 09 69 66 28 61 75 74 6f 20 66 20  s);...if(auto f 
1320: 3d 20 63 61 73 74 28 46 75 6e 56 61 6c 75 65 29  = cast(FunValue)
1330: 5f 66 29 0d 0a 09 7b 0d 0a 09 09 54 61 62 6c 65  _f)...{....Table
1340: 20 63 74 78 20 3d 20 6e 65 77 20 54 61 62 6c 65   ctx = new Table
1350: 28 66 2e 64 65 66 69 6e 69 74 69 6f 6e 43 6f 6e  (f.definitionCon
1360: 74 65 78 74 28 29 2c 20 54 61 62 6c 65 2e 4b 69  text(), Table.Ki
1370: 6e 64 2e 4e 6f 74 50 72 6f 70 61 67 61 74 65 53  nd.NotPropagateS
1380: 65 74 29 3b 0d 0a 09 09 61 75 74 6f 20 70 73 20  et);....auto ps 
1390: 3d 20 66 2e 70 61 72 61 6d 73 28 29 3b 0d 0a 09  = f.params();...
13a0: 09 69 66 28 20 70 73 2e 6c 65 6e 67 74 68 20 21  .if( ps.length !
13b0: 3d 20 31 20 29 0d 0a 09 09 09 74 68 72 6f 77 20  = 1 ).....throw 
13c0: 67 65 6e 65 78 21 52 75 6e 74 69 6d 65 45 78 63  genex!RuntimeExc
13d0: 65 70 74 69 6f 6e 28 70 6f 73 2c 20 22 6c 69 66  eption(pos, "lif
13e0: 74 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  t function must 
13f0: 74 61 6b 65 20 65 78 61 63 74 6c 79 20 6f 6e 65  take exactly one
1400: 20 61 72 67 75 6d 65 6e 74 20 61 74 20 22 7e 56   argument at "~V
1410: 61 6c 75 65 4c 61 79 65 72 7e 22 20 6c 61 79 65  alueLayer~" laye
1420: 72 22 29 3b 0d 0a 09 09 69 66 28 20 70 73 5b 30  r");....if( ps[0
1430: 5d 2e 6c 61 79 65 72 73 2e 6c 65 6e 67 74 68 3d  ].layers.length=
1440: 3d 30 20 7c 7c 20 70 73 5b 30 5d 2e 6c 61 79 65  =0 || ps[0].laye
1450: 72 73 2e 6c 65 6e 67 74 68 3d 3d 31 20 26 26 20  rs.length==1 && 
1460: 70 73 5b 30 5d 2e 6c 61 79 65 72 73 5b 30 5d 3d  ps[0].layers[0]=
1470: 3d 56 61 6c 75 65 4c 61 79 65 72 20 29 0d 0a 09  =ValueLayer )...
1480: 09 7b 0d 0a 09 09 09 63 74 78 2e 73 65 74 28 70  .{.....ctx.set(p
1490: 73 5b 30 5d 2e 6e 61 6d 65 2c 20 56 61 6c 75 65  s[0].name, Value
14a0: 4c 61 79 65 72 2c 20 76 29 3b 0d 0a 09 09 09 72  Layer, v);.....r
14b0: 65 74 75 72 6e 20 66 2e 69 6e 76 6f 6b 65 28 70  eturn f.invoke(p
14c0: 6f 73 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20  os, ValueLayer, 
14d0: 63 74 78 29 3b 0d 0a 09 09 7d 0d 0a 09 09 65 6c  ctx);....}....el
14e0: 73 65 0d 0a 09 09 09 74 68 72 6f 77 20 67 65 6e  se.....throw gen
14f0: 65 78 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74  ex!RuntimeExcept
1500: 69 6f 6e 28 70 6f 73 2c 20 22 6c 69 66 74 20 66  ion(pos, "lift f
1510: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b  unction must tak
1520: 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 61 72  e exactly one ar
1530: 67 75 6d 65 6e 74 20 61 74 20 22 7e 56 61 6c 75  gument at "~Valu
1540: 65 4c 61 79 65 72 7e 22 20 6c 61 79 65 72 22 29  eLayer~" layer")
1550: 3b 0d 0a 09 7d 0d 0a 09 74 68 72 6f 77 20 67 65  ;...}...throw ge
1560: 6e 65 78 21 52 75 6e 74 69 6d 65 45 78 63 65 70  nex!RuntimeExcep
1570: 74 69 6f 6e 28 70 6f 73 2c 20 22 74 72 69 65 64  tion(pos, "tried
1580: 20 74 6f 20 63 61 6c 6c 20 6e 6f 6e 2d 66 75 6e   to call non-fun
1590: 63 74 69 6f 6e 22 29 3b 0d 0a 7d 0d 0a 0d 0a 2f  ction");..}..../
15a0: 2f 2f 20 45 6e 74 72 79 20 70 6f 69 6e 74 20 6f  // Entry point o
15b0: 66 20 74 68 69 73 20 6d 6f 64 75 6c 65 0d 0a 2f  f this module../
15c0: 2f 2f 20 49 66 20 73 70 6c 69 74 43 74 78 20 3d  // If splitCtx =
15d0: 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6e 6e 65   true, then inne
15e0: 72 20 76 61 72 69 61 62 6c 65 20 64 65 63 6c 61  r variable decla
15f0: 72 61 74 69 6f 6e 20 64 6f 20 6e 6f 74 20 6f 76  ration do not ov
1600: 65 72 77 72 69 74 65 20 63 74 78 2e 0d 0a 2f 2f  erwrite ctx...//
1610: 2f 20 6c 61 79 20 69 73 20 74 68 65 20 6c 61 79  / lay is the lay
1620: 65 72 20 49 44 20 66 6f 72 20 65 76 61 6c 75 61  er ID for evalua
1630: 74 69 6f 6e 20 28 73 74 61 6e 64 61 72 64 20 76  tion (standard v
1640: 61 6c 75 65 20 73 65 6d 61 6e 74 69 63 73 20 75  alue semantics u
1650: 73 65 73 20 56 61 6c 75 65 4c 61 79 65 72 29 2e  ses ValueLayer).
1660: 0d 0a 0d 0a 56 61 6c 75 65 20 65 76 61 6c 28 41  ....Value eval(A
1670: 53 54 20 65 2c 20 54 61 62 6c 65 20 63 74 78 2c  ST e, Table ctx,
1680: 20 62 6f 6f 6c 20 73 70 6c 69 74 43 74 78 2c 20   bool splitCtx, 
1690: 4c 61 79 65 72 20 6c 61 79 29 0a 7b 0d 0a 09 72  Layer lay).{...r
16a0: 65 74 75 72 6e 20 65 2e 6d 61 74 63 68 28 0a 09  eturn e.match(..
16b0: 09 28 53 74 72 4c 69 74 65 72 61 6c 20 65 29 0a  .(StrLiteral e).
16c0: 09 09 7b 0d 0a 09 09 09 56 61 6c 75 65 20 76 20  ..{.....Value v 
16d0: 3d 20 6e 65 77 20 53 74 72 56 61 6c 75 65 28 65  = new StrValue(e
16e0: 2e 64 61 74 61 29 3b 0d 0a 09 09 09 69 66 28 20  .data);.....if( 
16f0: 6c 61 79 20 3d 3d 20 56 61 6c 75 65 4c 61 79 65  lay == ValueLaye
1700: 72 20 29 0a 09 09 09 09 72 65 74 75 72 6e 20 76  r ).....return v
1710: 3b 0d 0a 09 09 09 65 6c 73 65 0d 0a 09 09 09 09  ;.....else......
1720: 72 65 74 75 72 6e 20 6c 69 66 74 28 65 2e 70 6f  return lift(e.po
1730: 73 2c 76 2c 6c 61 79 2c 63 74 78 29 3b 0a 09 09  s,v,lay,ctx);...
1740: 7d 2c 0a 09 09 28 49 6e 74 4c 69 74 65 72 61 6c  },...(IntLiteral
1750: 20 65 29 0a 09 09 7b 0a 09 09 09 56 61 6c 75 65   e)...{....Value
1760: 20 76 20 3d 20 6e 65 77 20 49 6e 74 56 61 6c 75   v = new IntValu
1770: 65 28 65 2e 64 61 74 61 29 3b 0d 0a 09 09 09 69  e(e.data);.....i
1780: 66 28 20 6c 61 79 20 3d 3d 20 56 61 6c 75 65 4c  f( lay == ValueL
1790: 61 79 65 72 20 29 0d 0a 09 09 09 09 72 65 74 75  ayer )......retu
17a0: 72 6e 20 76 3b 0a 09 09 09 65 6c 73 65 20 2f 2f  rn v;....else //
17b0: 20 72 69 73 65 0d 0a 09 09 09 09 72 65 74 75 72   rise......retur
17c0: 6e 20 6c 69 66 74 28 65 2e 70 6f 73 2c 76 2c 6c  n lift(e.pos,v,l
17d0: 61 79 2c 63 74 78 29 3b 0d 0a 09 09 7d 2c 0a 09  ay,ctx);....},..
17e0: 09 28 56 61 72 45 78 70 72 65 73 73 69 6f 6e 20  .(VarExpression 
17f0: 65 29 0d 0a 09 09 7b 0d 0a 09 09 09 69 66 28 20  e)....{.....if( 
1800: 6c 61 79 20 3d 3d 20 56 61 6c 75 65 4c 61 79 65  lay == ValueLaye
1810: 72 20 29 0d 0a 09 09 09 09 72 65 74 75 72 6e 20  r )......return 
1820: 63 74 78 2e 67 65 74 28 65 2e 76 61 72 2c 20 6c  ctx.get(e.var, l
1830: 61 79 2c 20 65 2e 70 6f 73 29 3b 0d 0a 09 09 09  ay, e.pos);.....
1840: 74 72 79 20 7b 0d 0a 09 09 09 09 72 65 74 75 72  try {......retur
1850: 6e 20 63 74 78 2e 67 65 74 28 65 2e 76 61 72 2c  n ctx.get(e.var,
1860: 20 6c 61 79 2c 20 65 2e 70 6f 73 29 3b 0d 0a 09   lay, e.pos);...
1870: 09 09 7d 20 63 61 74 63 68 28 20 54 68 72 6f 77  ..} catch( Throw
1880: 61 62 6c 65 20 29 20 7b 20 2f 2f 20 5b 54 4f 44  able ) { // [TOD
1890: 4f 5d 20 6d 6f 72 65 20 70 72 65 63 69 73 65 2e  O] more precise.
18a0: 2e 2e 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 6c  ........return l
18b0: 69 66 74 28 65 2e 70 6f 73 2c 20 63 74 78 2e 67  ift(e.pos, ctx.g
18c0: 65 74 28 65 2e 76 61 72 2c 20 56 61 6c 75 65 4c  et(e.var, ValueL
18d0: 61 79 65 72 2c 20 65 2e 70 6f 73 29 2c 20 6c 61  ayer, e.pos), la
18e0: 79 2c 20 63 74 78 29 3b 0d 0a 09 09 09 7d 0d 0a  y, ctx);.....}..
18f0: 09 09 7d 2c 0d 0a 09 09 28 4c 61 79 65 72 65 64  ..},....(Layered
1900: 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 09  Expression e)...
1910: 09 7b 0d 0a 09 09 09 69 66 28 20 65 2e 6c 61 79  .{.....if( e.lay
1920: 20 3d 3d 20 4d 61 63 72 6f 4c 61 79 65 72 20 29   == MacroLayer )
1930: 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 6d 61 63  ......return mac
1940: 72 6f 45 76 61 6c 28 65 2e 65 78 70 72 2c 20 63  roEval(e.expr, c
1950: 74 78 2c 20 66 61 6c 73 65 29 3b 0d 0a 09 09 09  tx, false);.....
1960: 65 6c 73 65 0d 0a 09 09 09 09 72 65 74 75 72 6e  else......return
1970: 20 65 76 61 6c 28 65 2e 65 78 70 72 2c 20 63 74   eval(e.expr, ct
1980: 78 2c 20 74 72 75 65 2c 20 65 2e 6c 61 79 29 3b  x, true, e.lay);
1990: 0d 0a 09 09 7d 2c 0d 0a 09 09 28 4c 65 74 45 78  ....},....(LetEx
19a0: 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 09 09 7b  pression e)....{
19b0: 0d 0a 09 09 09 2f 2f 20 66 6f 72 20 6c 65 74 72  .....// for letr
19c0: 65 63 2c 20 77 65 20 6e 65 65 64 20 74 68 69 73  ec, we need this
19d0: 2c 20 62 75 74 20 73 68 6f 75 6c 64 20 61 76 6f  , but should avo
19e0: 69 64 20 6f 76 65 72 77 72 69 74 69 6e 67 3f 3f  id overwriting??
19f0: 3f 3f 0d 0a 09 09 09 2f 2f 20 63 74 78 2e 73 65  ??.....// ctx.se
1a00: 74 28 65 2e 76 61 72 2c 20 56 61 6c 75 65 4c 61  t(e.var, ValueLa
1a10: 79 65 72 2c 20 6e 65 77 20 55 6e 64 65 66 69 6e  yer, new Undefin
1a20: 65 64 56 61 6c 75 65 2c 20 65 2e 70 6f 73 29 3b  edValue, e.pos);
1a30: 0d 0a 09 09 09 69 66 28 73 70 6c 69 74 43 74 78  .....if(splitCtx
1a40: 29 0d 0a 09 09 09 09 63 74 78 20 3d 20 6e 65 77  )......ctx = new
1a50: 20 54 61 62 6c 65 28 63 74 78 2c 20 54 61 62 6c   Table(ctx, Tabl
1a60: 65 2e 4b 69 6e 64 2e 4e 6f 74 50 72 6f 70 61 67  e.Kind.NotPropag
1a70: 61 74 65 53 65 74 29 3b 0d 0a 09 09 09 56 61 6c  ateSet);.....Val
1a80: 75 65 20 76 20 3d 20 65 76 61 6c 28 65 2e 69 6e  ue v = eval(e.in
1a90: 69 74 2c 20 63 74 78 2c 20 74 72 75 65 2c 20 6c  it, ctx, true, l
1aa0: 61 79 29 3b 0d 0a 09 09 09 63 74 78 2e 73 65 74  ay);.....ctx.set
1ab0: 28 65 2e 76 61 72 2c 20 28 65 2e 6c 61 79 65 72  (e.var, (e.layer
1ac0: 2e 6c 65 6e 67 74 68 20 3f 20 65 2e 6c 61 79 65  .length ? e.laye
1ad0: 72 20 3a 20 6c 61 79 29 2c 20 76 2c 20 65 2e 70  r : lay), v, e.p
1ae0: 6f 73 29 3b 0d 0a 09 09 09 72 65 74 75 72 6e 20  os);.....return 
1af0: 65 76 61 6c 28 65 2e 65 78 70 72 2c 20 63 74 78  eval(e.expr, ctx
1b00: 2c 20 66 61 6c 73 65 2c 20 6c 61 79 29 3b 0d 0a  , false, lay);..
1b10: 09 09 7d 2c 0d 0a 09 09 28 46 75 6e 63 61 6c 6c  ..},....(Funcall
1b20: 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0a 09 09  Expression e)...
1b30: 7b 0a 09 09 09 72 65 74 75 72 6e 20 69 6e 76 6f  {....return invo
1b40: 6b 65 46 75 6e 63 74 69 6f 6e 28 65 2e 70 6f 73  keFunction(e.pos
1b50: 2c 20 65 76 61 6c 28 65 2e 66 75 6e 2c 20 63 74  , eval(e.fun, ct
1b60: 78 2c 20 74 72 75 65 2c 20 6c 61 79 29 2c 20 65  x, true, lay), e
1b70: 2e 61 72 67 73 2c 20 63 74 78 2c 20 6c 61 79 29  .args, ctx, lay)
1b80: 3b 0d 0a 09 09 7d 2c 0a 09 09 28 46 75 6e 4c 69  ;....},...(FunLi
1b90: 74 65 72 61 6c 20 65 29 0a 09 09 7b 0d 0a 09 09  teral e)...{....
1ba0: 09 56 61 6c 75 65 5b 56 61 6c 75 65 5b 5d 5d 5b  .Value[Value[]][
1bb0: 4c 61 79 65 72 5d 20 6d 65 6d 6f 3b 0d 0a 09 09  Layer] memo;....
1bc0: 09 41 53 54 20 6d 61 63 72 6f 4d 65 6d 6f 20 3d  .AST macroMemo =
1bd0: 20 6e 75 6c 6c 3b 20 2f 2f 20 63 61 63 68 65 0d   null; // cache.
1be0: 0a 0d 0a 09 09 09 2f 2f 20 66 75 6e 76 61 6c 75  ......// funvalu
1bf0: 65 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 72 69  e need not be ri
1c00: 73 65 64 0d 0a 09 09 09 2f 2f 20 6e 6f 2c 20 6e  sed.....// no, n
1c10: 65 65 64 20 74 6f 20 62 65 20 72 69 73 65 64 20  eed to be rised 
1c20: 21 21 20 20 73 75 70 70 6f 73 65 20 40 74 28 66  !!  suppose @t(f
1c30: 69 62 29 28 22 69 6e 74 22 29 0d 0a 09 09 09 72  ib)("int").....r
1c40: 65 74 75 72 6e 20 6e 65 77 20 55 73 65 72 44 65  eturn new UserDe
1c50: 66 69 6e 65 64 46 75 6e 56 61 6c 75 65 28 65 2c  finedFunValue(e,
1c60: 20 63 74 78 29 3b 0a 09 09 7d 2c 0d 0a 09 09 64   ctx);...},....d
1c70: 65 6c 65 67 61 74 65 20 56 61 6c 75 65 20 28 41  elegate Value (A
1c80: 53 54 20 65 29 0d 0a 09 09 7b 0a 09 09 09 74 68  ST e)....{....th
1c90: 72 6f 77 20 67 65 6e 65 78 21 52 75 6e 74 69 6d  row genex!Runtim
1ca0: 65 45 78 63 65 70 74 69 6f 6e 28 65 2e 70 6f 73  eException(e.pos
1cb0: 2c 20 73 70 72 69 6e 74 66 21 22 55 6e 6b 6e 6f  , sprintf!"Unkno
1cc0: 77 6e 20 4b 69 6e 64 20 6f 66 20 45 78 70 72 65  wn Kind of Expre
1cd0: 73 73 69 6f 6e 20 25 73 22 28 74 79 70 65 69 64  ssion %s"(typeid
1ce0: 28 65 29 29 29 3b 0d 0a 09 09 7d 0d 0a 09 29 3b  (e)));....}...);
1cf0: 0a 7d 0a 0d 0a 2f 2f 20 5b 54 4f 44 4f 5d 20 4f  .}...// [TODO] O
1d00: 70 74 69 6d 69 7a 61 74 69 6f 6e 0d 0a 56 61 6c  ptimization..Val
1d10: 75 65 20 6d 61 63 72 6f 45 76 61 6c 28 41 53 54  ue macroEval(AST
1d20: 20 65 2c 20 54 61 62 6c 65 20 63 74 78 2c 20 62   e, Table ctx, b
1d30: 6f 6f 6c 20 41 6c 77 61 79 73 4d 61 63 72 6f 29  ool AlwaysMacro)
1d40: 0d 0a 7b 0d 0a 09 4c 61 79 65 72 20 74 68 65 4c  ..{...Layer theL
1d50: 61 79 65 72 20 3d 20 56 61 6c 75 65 4c 61 79 65  ayer = ValueLaye
1d60: 72 3b 0d 0a 0d 0a 09 54 61 62 6c 65 20 70 6f 73  r;.....Table pos
1d70: 20 3d 20 6e 65 77 20 54 61 62 6c 65 3b 0d 0a 09   = new Table;...
1d80: 70 6f 73 2e 73 65 74 28 22 66 69 6c 65 6e 61 6d  pos.set("filenam
1d90: 65 22 2c 20 74 68 65 4c 61 79 65 72 2c 20 6e 65  e", theLayer, ne
1da0: 77 20 53 74 72 56 61 6c 75 65 28 65 2e 70 6f 73  w StrValue(e.pos
1db0: 2e 66 69 6c 65 6e 61 6d 65 29 29 3b 0d 0a 09 70  .filename));...p
1dc0: 6f 73 2e 73 65 74 28 22 6c 69 6e 65 6e 6f 22 2c  os.set("lineno",
1dd0: 20 20 20 74 68 65 4c 61 79 65 72 2c 20 6e 65 77     theLayer, new
1de0: 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74   IntValue(BigInt
1df0: 28 65 2e 70 6f 73 2e 6c 69 6e 65 6e 6f 29 29 29  (e.pos.lineno)))
1e00: 3b 0d 0a 09 70 6f 73 2e 73 65 74 28 22 63 6f 6c  ;...pos.set("col
1e10: 75 6d 6e 22 2c 20 20 20 74 68 65 4c 61 79 65 72  umn",   theLayer
1e20: 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42  , new IntValue(B
1e30: 69 67 49 6e 74 28 65 2e 70 6f 73 2e 63 6f 6c 75  igInt(e.pos.colu
1e40: 6d 6e 29 29 29 3b 0d 0a 09 72 65 74 75 72 6e 20  mn)));...return 
1e50: 65 2e 6d 61 74 63 68 28 0d 0a 09 09 28 53 74 72  e.match(....(Str
1e60: 4c 69 74 65 72 61 6c 20 65 29 0d 0a 09 09 7b 0d  Literal e)....{.
1e70: 0a 09 09 09 54 61 62 6c 65 20 74 20 3d 20 6e 65  ....Table t = ne
1e80: 77 20 54 61 62 6c 65 3b 0d 0a 09 09 09 74 2e 73  w Table;.....t.s
1e90: 65 74 28 22 70 6f 73 22 2c 20 20 74 68 65 4c 61  et("pos",  theLa
1ea0: 79 65 72 2c 20 70 6f 73 29 3b 0d 0a 09 09 09 74  yer, pos);.....t
1eb0: 2e 73 65 74 28 22 69 73 22 2c 20 20 20 74 68 65  .set("is",   the
1ec0: 4c 61 79 65 72 2c 20 6e 65 77 20 53 74 72 56 61  Layer, new StrVa
1ed0: 6c 75 65 28 22 73 74 72 22 29 29 3b 0d 0a 09 09  lue("str"));....
1ee0: 09 74 2e 73 65 74 28 22 64 61 74 61 22 2c 20 74  .t.set("data", t
1ef0: 68 65 4c 61 79 65 72 2c 20 6e 65 77 20 53 74 72  heLayer, new Str
1f00: 56 61 6c 75 65 28 65 2e 64 61 74 61 29 29 3b 0d  Value(e.data));.
1f10: 0a 09 09 09 72 65 74 75 72 6e 20 74 3b 0d 0a 09  ....return t;...
1f20: 09 7d 2c 0d 0a 09 09 28 49 6e 74 4c 69 74 65 72  .},....(IntLiter
1f30: 61 6c 20 65 29 0d 0a 09 09 7b 0d 0a 09 09 09 54  al e)....{.....T
1f40: 61 62 6c 65 20 74 20 3d 20 6e 65 77 20 54 61 62  able t = new Tab
1f50: 6c 65 3b 0d 0a 09 09 09 74 2e 73 65 74 28 22 70  le;.....t.set("p
1f60: 6f 73 22 2c 20 20 74 68 65 4c 61 79 65 72 2c 20  os",  theLayer, 
1f70: 70 6f 73 29 3b 0d 0a 09 09 09 74 2e 73 65 74 28  pos);.....t.set(
1f80: 22 69 73 22 2c 20 20 20 74 68 65 4c 61 79 65 72  "is",   theLayer
1f90: 2c 20 6e 65 77 20 53 74 72 56 61 6c 75 65 28 22  , new StrValue("
1fa0: 69 6e 74 22 29 29 3b 0d 0a 09 09 09 74 2e 73 65  int"));.....t.se
1fb0: 74 28 22 64 61 74 61 22 2c 20 74 68 65 4c 61 79  t("data", theLay
1fc0: 65 72 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  er, new IntValue
1fd0: 28 65 2e 64 61 74 61 29 29 3b 0d 0a 09 09 09 72  (e.data));.....r
1fe0: 65 74 75 72 6e 20 74 3b 0d 0a 09 09 7d 2c 0d 0a  eturn t;....},..
1ff0: 09 09 28 56 61 72 45 78 70 72 65 73 73 69 6f 6e  ..(VarExpression
2000: 20 65 29 0d 0a 09 09 7b 0d 0a 09 09 09 74 72 79   e)....{.....try
2010: 20 7b 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 63   {......return c
2020: 74 78 2e 67 65 74 28 65 2e 76 61 72 2c 20 4d 61  tx.get(e.var, Ma
2030: 63 72 6f 4c 61 79 65 72 2c 20 65 2e 70 6f 73 29  croLayer, e.pos)
2040: 3b 0d 0a 09 09 09 7d 20 63 61 74 63 68 28 20 54  ;.....} catch( T
2050: 68 72 6f 77 61 62 6c 65 20 29 20 7b 2f 2f 20 5b  hrowable ) {// [
2060: 54 4f 44 4f 5d 20 6d 6f 72 65 20 70 72 65 63 69  TODO] more preci
2070: 65 73 2e 2e 2e 0d 0a 09 09 09 09 54 61 62 6c 65  es.........Table
2080: 20 74 20 3d 20 6e 65 77 20 54 61 62 6c 65 3b 0d   t = new Table;.
2090: 0a 09 09 09 09 74 2e 73 65 74 28 22 70 6f 73 22  .....t.set("pos"
20a0: 2c 20 20 74 68 65 4c 61 79 65 72 2c 20 70 6f 73  ,  theLayer, pos
20b0: 29 3b 0d 0a 09 09 09 09 74 2e 73 65 74 28 22 69  );......t.set("i
20c0: 73 22 2c 20 20 20 74 68 65 4c 61 79 65 72 2c 20  s",   theLayer, 
20d0: 6e 65 77 20 53 74 72 56 61 6c 75 65 28 22 76 61  new StrValue("va
20e0: 72 22 29 29 3b 0d 0a 09 09 09 09 74 2e 73 65 74  r"));......t.set
20f0: 28 22 6e 61 6d 65 22 2c 20 74 68 65 4c 61 79 65  ("name", theLaye
2100: 72 2c 20 6e 65 77 20 53 74 72 56 61 6c 75 65 28  r, new StrValue(
2110: 65 2e 76 61 72 29 29 3b 0d 0a 09 09 09 09 72 65  e.var));......re
2120: 74 75 72 6e 20 63 61 73 74 28 56 61 6c 75 65 29  turn cast(Value)
2130: 74 3b 0d 0a 09 09 09 7d 0d 0a 09 09 7d 2c 0d 0a  t;.....}....},..
2140: 09 09 28 4c 61 79 65 72 65 64 45 78 70 72 65 73  ..(LayeredExpres
2150: 73 69 6f 6e 20 65 29 0d 0a 09 09 7b 0d 0a 09 09  sion e)....{....
2160: 09 69 66 28 20 41 6c 77 61 79 73 4d 61 63 72 6f  .if( AlwaysMacro
2170: 20 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 54 61   ).....{......Ta
2180: 62 6c 65 20 74 20 3d 20 6e 65 77 20 54 61 62 6c  ble t = new Tabl
2190: 65 3b 0d 0a 09 09 09 09 74 2e 73 65 74 28 22 70  e;......t.set("p
21a0: 6f 73 22 2c 20 20 74 68 65 4c 61 79 65 72 2c 20  os",  theLayer, 
21b0: 70 6f 73 29 3b 0d 0a 09 09 09 09 74 2e 73 65 74  pos);......t.set
21c0: 28 22 69 73 22 2c 20 20 20 74 68 65 4c 61 79 65  ("is",   theLaye
21d0: 72 2c 20 6e 65 77 20 53 74 72 56 61 6c 75 65 28  r, new StrValue(
21e0: 22 6c 61 79 22 29 29 3b 0d 0a 09 09 09 09 74 2e  "lay"));......t.
21f0: 73 65 74 28 22 6c 61 79 65 72 22 2c 20 20 20 74  set("layer",   t
2200: 68 65 4c 61 79 65 72 2c 20 6e 65 77 20 53 74 72  heLayer, new Str
2210: 56 61 6c 75 65 28 65 2e 6c 61 79 29 29 3b 0d 0a  Value(e.lay));..
2220: 09 09 09 09 74 2e 73 65 74 28 22 65 78 70 72 22  ....t.set("expr"
2230: 2c 20 74 68 65 4c 61 79 65 72 2c 20 6d 61 63 72  , theLayer, macr
2240: 6f 45 76 61 6c 28 65 2e 65 78 70 72 2c 63 74 78  oEval(e.expr,ctx
2250: 2c 41 6c 77 61 79 73 4d 61 63 72 6f 29 29 3b 0d  ,AlwaysMacro));.
2260: 0a 09 09 09 09 72 65 74 75 72 6e 20 63 61 73 74  .....return cast
2270: 28 56 61 6c 75 65 29 74 3b 0d 0a 09 09 09 7d 0d  (Value)t;.....}.
2280: 0a 09 09 09 65 6c 73 65 0d 0a 09 09 09 7b 0d 0a  ....else.....{..
2290: 09 09 09 09 69 66 28 20 65 2e 6c 61 79 20 3d 3d  ....if( e.lay ==
22a0: 20 4d 61 63 72 6f 4c 61 79 65 72 20 29 0d 0a 09   MacroLayer )...
22b0: 09 09 09 09 72 65 74 75 72 6e 20 6d 61 63 72 6f  ....return macro
22c0: 45 76 61 6c 28 65 2e 65 78 70 72 2c 20 63 74 78  Eval(e.expr, ctx
22d0: 2c 20 66 61 6c 73 65 29 3b 0d 0a 09 09 09 09 65  , false);......e
22e0: 6c 73 65 0d 0a 09 09 09 09 09 72 65 74 75 72 6e  lse.......return
22f0: 20 65 76 61 6c 28 65 2e 65 78 70 72 2c 20 63 74   eval(e.expr, ct
2300: 78 2c 20 74 72 75 65 2c 20 65 2e 6c 61 79 29 3b  x, true, e.lay);
2310: 0d 0a 09 09 09 7d 0d 0a 09 09 7d 2c 0d 0a 09 09  .....}....},....
2320: 28 4c 65 74 45 78 70 72 65 73 73 69 6f 6e 20 65  (LetExpression e
2330: 29 0d 0a 09 09 7b 0d 0a 09 09 09 54 61 62 6c 65  )....{.....Table
2340: 20 74 20 3d 20 6e 65 77 20 54 61 62 6c 65 3b 0d   t = new Table;.
2350: 0a 09 09 09 74 2e 73 65 74 28 22 70 6f 73 22 2c  ....t.set("pos",
2360: 20 20 74 68 65 4c 61 79 65 72 2c 20 70 6f 73 29    theLayer, pos)
2370: 3b 0d 0a 09 09 09 74 2e 73 65 74 28 22 69 73 22  ;.....t.set("is"
2380: 2c 20 20 20 74 68 65 4c 61 79 65 72 2c 20 6e 65  ,   theLayer, ne
2390: 77 20 53 74 72 56 61 6c 75 65 28 22 6c 65 74 22  w StrValue("let"
23a0: 29 29 3b 0d 0a 09 09 09 74 2e 73 65 74 28 22 6e  ));.....t.set("n
23b0: 61 6d 65 22 2c 20 74 68 65 4c 61 79 65 72 2c 20  ame", theLayer, 
23c0: 6e 65 77 20 53 74 72 56 61 6c 75 65 28 65 2e 76  new StrValue(e.v
23d0: 61 72 29 29 3b 0d 0a 09 09 09 74 2e 73 65 74 28  ar));.....t.set(
23e0: 22 69 6e 69 74 22 2c 20 74 68 65 4c 61 79 65 72  "init", theLayer
23f0: 2c 20 6d 61 63 72 6f 45 76 61 6c 28 65 2e 69 6e  , macroEval(e.in
2400: 69 74 2c 63 74 78 2c 41 6c 77 61 79 73 4d 61 63  it,ctx,AlwaysMac
2410: 72 6f 29 29 3b 0d 0a 09 09 09 74 2e 73 65 74 28  ro));.....t.set(
2420: 22 65 78 70 72 22 2c 20 74 68 65 4c 61 79 65 72  "expr", theLayer
2430: 2c 20 6d 61 63 72 6f 45 76 61 6c 28 65 2e 65 78  , macroEval(e.ex
2440: 70 72 2c 63 74 78 2c 41 6c 77 61 79 73 4d 61 63  pr,ctx,AlwaysMac
2450: 72 6f 29 29 3b 0d 0a 09 09 09 72 65 74 75 72 6e  ro));.....return
2460: 20 74 3b 0d 0a 09 09 7d 2c 0d 0a 09 09 28 46 75   t;....},....(Fu
2470: 6e 63 61 6c 6c 45 78 70 72 65 73 73 69 6f 6e 20  ncallExpression 
2480: 65 29 0d 0a 09 09 7b 0d 0a 09 09 09 56 61 6c 75  e)....{.....Valu
2490: 65 20 5f 66 20 3d 20 6d 61 63 72 6f 45 76 61 6c  e _f = macroEval
24a0: 28 65 2e 66 75 6e 2c 63 74 78 2c 41 6c 77 61 79  (e.fun,ctx,Alway
24b0: 73 4d 61 63 72 6f 29 3b 0d 0a 0d 0a 09 09 09 69  sMacro);.......i
24c0: 66 28 20 61 75 74 6f 20 66 20 3d 20 63 61 73 74  f( auto f = cast
24d0: 28 46 75 6e 56 61 6c 75 65 29 5f 66 20 29 0d 0a  (FunValue)_f )..
24e0: 09 09 09 09 72 65 74 75 72 6e 20 69 6e 76 6f 6b  ....return invok
24f0: 65 46 75 6e 63 74 69 6f 6e 28 65 2e 70 6f 73 2c  eFunction(e.pos,
2500: 20 66 2c 20 65 2e 61 72 67 73 2c 20 63 74 78 2c   f, e.args, ctx,
2510: 20 4d 61 63 72 6f 4c 61 79 65 72 2c 20 41 6c 77   MacroLayer, Alw
2520: 61 79 73 4d 61 63 72 6f 29 3b 0d 0a 0d 0a 09 09  aysMacro);......
2530: 09 54 61 62 6c 65 20 74 20 3d 20 6e 65 77 20 54  .Table t = new T
2540: 61 62 6c 65 3b 0d 0a 09 09 09 74 2e 73 65 74 28  able;.....t.set(
2550: 22 70 6f 73 22 2c 20 20 74 68 65 4c 61 79 65 72  "pos",  theLayer
2560: 2c 20 70 6f 73 29 3b 0d 0a 09 09 09 74 2e 73 65  , pos);.....t.se
2570: 74 28 22 69 73 22 2c 20 20 20 74 68 65 4c 61 79  t("is",   theLay
2580: 65 72 2c 20 6e 65 77 20 53 74 72 56 61 6c 75 65  er, new StrValue
2590: 28 22 61 70 70 22 29 29 3b 0d 0a 09 09 09 74 2e  ("app"));.....t.
25a0: 73 65 74 28 22 66 75 6e 22 2c 20 20 74 68 65 4c  set("fun",  theL
25b0: 61 79 65 72 2c 20 5f 66 29 3b 0d 0a 09 09 09 54  ayer, _f);.....T
25c0: 61 62 6c 65 20 61 72 67 73 20 3d 20 6e 65 77 20  able args = new 
25d0: 54 61 62 6c 65 3b 0d 0a 09 09 09 66 6f 72 65 61  Table;.....forea
25e0: 63 68 5f 72 65 76 65 72 73 65 28 61 3b 20 65 2e  ch_reverse(a; e.
25f0: 61 72 67 73 29 20 7b 0d 0a 09 09 09 09 54 61 62  args) {......Tab
2600: 6c 65 20 63 6f 6e 73 20 3d 20 6e 65 77 20 54 61  le cons = new Ta
2610: 62 6c 65 3b 0d 0a 09 09 09 09 63 6f 6e 73 2e 73  ble;......cons.s
2620: 65 74 28 22 63 61 72 22 2c 74 68 65 4c 61 79 65  et("car",theLaye
2630: 72 2c 6d 61 63 72 6f 45 76 61 6c 28 61 2c 63 74  r,macroEval(a,ct
2640: 78 2c 41 6c 77 61 79 73 4d 61 63 72 6f 29 29 3b  x,AlwaysMacro));
2650: 0d 0a 09 09 09 09 63 6f 6e 73 2e 73 65 74 28 22  ......cons.set("
2660: 63 64 72 22 2c 74 68 65 4c 61 79 65 72 2c 61 72  cdr",theLayer,ar
2670: 67 73 29 3b 0d 0a 09 09 09 09 61 72 67 73 20 3d  gs);......args =
2680: 20 63 6f 6e 73 3b 0d 0a 09 09 09 7d 0d 0a 09 09   cons;.....}....
2690: 09 74 2e 73 65 74 28 22 61 72 67 22 2c 20 74 68  .t.set("arg", th
26a0: 65 4c 61 79 65 72 2c 20 61 72 67 73 29 3b 0d 0a  eLayer, args);..
26b0: 09 09 09 72 65 74 75 72 6e 20 63 61 73 74 28 56  ...return cast(V
26c0: 61 6c 75 65 29 74 3b 0d 0a 09 09 7d 2c 0d 0a 09  alue)t;....},...
26d0: 09 28 46 75 6e 4c 69 74 65 72 61 6c 20 65 29 0d  .(FunLiteral e).
26e0: 0a 09 09 7b 0d 0a 09 09 09 54 61 62 6c 65 20 74  ...{.....Table t
26f0: 20 3d 20 6e 65 77 20 54 61 62 6c 65 3b 0d 0a 09   = new Table;...
2700: 09 09 74 2e 73 65 74 28 22 70 6f 73 22 2c 20 20  ..t.set("pos",  
2710: 20 74 68 65 4c 61 79 65 72 2c 20 70 6f 73 29 3b   theLayer, pos);
2720: 0d 0a 09 09 09 74 2e 73 65 74 28 22 69 73 22 2c  .....t.set("is",
2730: 20 20 20 20 74 68 65 4c 61 79 65 72 2c 20 6e 65      theLayer, ne
2740: 77 20 53 74 72 56 61 6c 75 65 28 22 66 75 6e 22  w StrValue("fun"
2750: 29 29 3b 0d 0a 09 09 09 74 2e 73 65 74 28 22 62  ));.....t.set("b
2760: 6f 64 79 22 2c 20 20 74 68 65 4c 61 79 65 72 2c  ody",  theLayer,
2770: 20 6d 61 63 72 6f 45 76 61 6c 28 65 2e 66 75 6e   macroEval(e.fun
2780: 62 6f 64 79 2c 63 74 78 2c 41 6c 77 61 79 73 4d  body,ctx,AlwaysM
2790: 61 63 72 6f 29 29 3b 0d 0a 09 09 09 54 61 62 6c  acro));.....Tabl
27a0: 65 20 70 61 72 61 6d 20 3d 20 6e 65 77 20 54 61  e param = new Ta
27b0: 62 6c 65 3b 0d 0a 09 09 09 66 6f 72 65 61 63 68  ble;.....foreach
27c0: 5f 72 65 76 65 72 73 65 28 70 3b 20 65 2e 70 61  _reverse(p; e.pa
27d0: 72 61 6d 73 29 0d 0a 09 09 09 7b 0d 0a 09 09 09  rams).....{.....
27e0: 09 54 61 62 6c 65 20 63 6f 6e 73 20 3d 20 6e 65  .Table cons = ne
27f0: 77 20 54 61 62 6c 65 3b 0d 0a 09 09 09 09 54 61  w Table;......Ta
2800: 62 6c 65 20 6b 76 20 3d 20 6e 65 77 20 54 61 62  ble kv = new Tab
2810: 6c 65 3b 0d 0a 09 09 09 09 6b 76 2e 73 65 74 28  le;......kv.set(
2820: 22 6e 61 6d 65 22 2c 20 74 68 65 4c 61 79 65 72  "name", theLayer
2830: 2c 20 6e 65 77 20 53 74 72 56 61 6c 75 65 28 70  , new StrValue(p
2840: 2e 6e 61 6d 65 29 29 3b 0d 0a 09 09 09 09 66 6f  .name));......fo
2850: 72 65 61 63 68 5f 72 65 76 65 72 73 65 28 6c 61  reach_reverse(la
2860: 79 3b 20 70 2e 6c 61 79 65 72 73 29 0d 0a 09 09  y; p.layers)....
2870: 09 09 7b 0d 0a 09 09 09 09 09 54 61 62 6c 65 20  ..{.......Table 
2880: 63 6f 6e 73 32 20 3d 20 6e 65 77 20 54 61 62 6c  cons2 = new Tabl
2890: 65 3b 0d 0a 09 09 09 09 09 63 6f 6e 73 32 2e 73  e;.......cons2.s
28a0: 65 74 28 22 63 61 72 22 2c 20 74 68 65 4c 61 79  et("car", theLay
28b0: 65 72 2c 20 6e 65 77 20 53 74 72 56 61 6c 75 65  er, new StrValue
28c0: 28 6c 61 79 29 29 3b 0d 0a 09 09 09 09 09 63 6f  (lay));.......co
28d0: 6e 73 32 2e 73 65 74 28 22 63 64 72 22 2c 20 74  ns2.set("cdr", t
28e0: 68 65 4c 61 79 65 72 2c 20 6b 76 29 3b 0d 0a 09  heLayer, kv);...
28f0: 09 09 09 09 6b 76 20 3d 20 63 6f 6e 73 32 3b 0d  ....kv = cons2;.
2900: 0a 09 09 09 09 7d 0d 0a 09 09 09 09 63 6f 6e 73  .....}......cons
2910: 2e 73 65 74 28 22 63 61 72 22 2c 20 74 68 65 4c  .set("car", theL
2920: 61 79 65 72 2c 20 6b 76 29 3b 0d 0a 09 09 09 09  ayer, kv);......
2930: 63 6f 6e 73 2e 73 65 74 28 22 63 64 72 22 2c 20  cons.set("cdr", 
2940: 74 68 65 4c 61 79 65 72 2c 20 70 61 72 61 6d 29  theLayer, param)
2950: 3b 0d 0a 09 09 09 09 70 61 72 61 6d 20 3d 20 63  ;......param = c
2960: 6f 6e 73 3b 0d 0a 09 09 09 7d 0d 0a 09 09 09 74  ons;.....}.....t
2970: 2e 73 65 74 28 22 70 61 72 61 6d 22 2c 20 74 68  .set("param", th
2980: 65 4c 61 79 65 72 2c 20 70 61 72 61 6d 29 3b 0d  eLayer, param);.
2990: 0a 09 09 09 72 65 74 75 72 6e 20 74 3b 0d 0a 09  ....return t;...
29a0: 09 7d 2c 0d 0a 09 09 64 65 6c 65 67 61 74 65 20  .},....delegate 
29b0: 56 61 6c 75 65 20 28 41 53 54 20 65 29 0d 0a 09  Value (AST e)...
29c0: 09 7b 0d 0a 09 09 09 74 68 72 6f 77 20 67 65 6e  .{.....throw gen
29d0: 65 78 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74  ex!RuntimeExcept
29e0: 69 6f 6e 28 65 2e 70 6f 73 2c 20 73 70 72 69 6e  ion(e.pos, sprin
29f0: 74 66 21 22 55 6e 6b 6e 6f 77 6e 20 4b 69 6e 64  tf!"Unknown Kind
2a00: 20 6f 66 20 45 78 70 72 65 73 73 69 6f 6e 20 25   of Expression %
2a10: 73 22 28 74 79 70 65 69 64 28 65 29 29 29 3b 0d  s"(typeid(e)));.
2a20: 0a 09 09 7d 0d 0a 09 29 3b 0d 0a 7d 0d 0a 0d 0a  ...}...);..}....
2a30: 75 6e 69 74 74 65 73 74 0a 7b 0d 0a 09 61 75 74  unittest.{...aut
2a40: 6f 20 72 20 3d 20 61 73 73 65 72 74 5f 6e 6f 74  o r = assert_not
2a50: 68 72 6f 77 28 20 65 76 61 6c 53 74 72 69 6e 67  hrow( evalString
2a60: 28 60 76 61 72 20 78 20 3d 20 32 31 3b 20 78 20  (`var x = 21; x 
2a70: 2b 20 78 2a 78 3b 60 29 20 29 3b 0a 09 61 73 73  + x*x;`) );..ass
2a80: 65 72 74 5f 65 71 28 20 72 2e 76 61 6c 2c 20 6e  ert_eq( r.val, n
2a90: 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49  ew IntValue(BigI
2aa0: 6e 74 28 32 31 2b 32 31 2a 32 31 29 29 20 29 3b  nt(21+21*21)) );
2ab0: 0a 09 61 73 73 65 72 74 5f 65 71 28 20 72 2e 63  ..assert_eq( r.c
2ac0: 74 78 2e 67 65 74 28 22 78 22 2c 56 61 6c 75 65  tx.get("x",Value
2ad0: 4c 61 79 65 72 29 2c 20 6e 65 77 20 49 6e 74 56  Layer), new IntV
2ae0: 61 6c 75 65 28 42 69 67 49 6e 74 28 32 31 29 29  alue(BigInt(21))
2af0: 20 29 3b 0a 09 61 73 73 65 72 74 5f 6e 6f 74 68   );..assert_noth
2b00: 72 6f 77 28 20 72 2e 63 74 78 2e 67 65 74 28 22  row( r.ctx.get("
2b10: 78 22 2c 56 61 6c 75 65 4c 61 79 65 72 29 20 29  x",ValueLayer) )
2b20: 3b 0a 09 61 73 73 65 72 74 5f 74 68 72 6f 77 21  ;..assert_throw!
2b30: 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e  RuntimeException
2b40: 28 20 72 2e 63 74 78 2e 67 65 74 28 22 79 22 2c  ( r.ctx.get("y",
2b50: 56 61 6c 75 65 4c 61 79 65 72 29 20 29 3b 0a 7d  ValueLayer) );.}
2b60: 0a 75 6e 69 74 74 65 73 74 0d 0a 7b 0d 0a 09 61  .unittest..{...a
2b70: 75 74 6f 20 72 20 3d 20 61 73 73 65 72 74 5f 6e  uto r = assert_n
2b80: 6f 74 68 72 6f 77 28 20 65 76 61 6c 53 74 72 69  othrow( evalStri
2b90: 6e 67 28 60 76 61 72 20 78 20 3d 20 32 31 3b 20  ng(`var x = 21; 
2ba0: 76 61 72 20 78 20 3d 20 78 20 2b 20 78 2a 78 3b  var x = x + x*x;
2bb0: 60 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 5f 65  `) );...assert_e
2bc0: 71 28 20 72 2e 76 61 6c 2c 20 6e 65 77 20 49 6e  q( r.val, new In
2bd0: 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28 32 31  tValue(BigInt(21
2be0: 2b 32 31 2a 32 31 29 29 20 29 3b 0d 0a 09 61 73  +21*21)) );...as
2bf0: 73 65 72 74 5f 65 71 28 20 72 2e 63 74 78 2e 67  sert_eq( r.ctx.g
2c00: 65 74 28 22 78 22 2c 56 61 6c 75 65 4c 61 79 65  et("x",ValueLaye
2c10: 72 29 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  r), new IntValue
2c20: 28 42 69 67 49 6e 74 28 32 31 2b 32 31 2a 32 31  (BigInt(21+21*21
2c30: 29 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 5f 6e  )) );...assert_n
2c40: 6f 74 68 72 6f 77 28 20 72 2e 63 74 78 2e 67 65  othrow( r.ctx.ge
2c50: 74 28 22 78 22 2c 56 61 6c 75 65 4c 61 79 65 72  t("x",ValueLayer
2c60: 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 5f 74 68  ) );...assert_th
2c70: 72 6f 77 21 52 75 6e 74 69 6d 65 45 78 63 65 70  row!RuntimeExcep
2c80: 74 69 6f 6e 28 20 72 2e 63 74 78 2e 67 65 74 28  tion( r.ctx.get(
2c90: 22 79 22 2c 56 61 6c 75 65 4c 61 79 65 72 29 20  "y",ValueLayer) 
2ca0: 29 3b 0d 0a 7d 0d 0a 75 6e 69 74 74 65 73 74 0d  );..}..unittest.
2cb0: 0a 7b 0d 0a 09 61 73 73 65 72 74 5f 65 71 28 20  .{...assert_eq( 
2cc0: 65 76 61 6c 53 74 72 69 6e 67 28 60 6c 65 74 20  evalString(`let 
2cd0: 78 3d 31 3b 20 6c 65 74 20 79 3d 28 6c 65 74 20  x=1; let y=(let 
2ce0: 78 3d 32 29 3b 20 78 60 29 2e 76 61 6c 2c 20 6e  x=2); x`).val, n
2cf0: 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49  ew IntValue(BigI
2d00: 6e 74 28 31 29 29 20 29 3b 20 0d 0a 09 61 73 73  nt(1)) ); ...ass
2d10: 65 72 74 5f 65 71 28 20 65 76 61 6c 53 74 72 69  ert_eq( evalStri
2d20: 6e 67 28 60 6c 65 74 20 78 3d 31 3b 20 6c 65 74  ng(`let x=1; let
2d30: 20 79 3d 28 6c 65 74 20 78 3d 32 3b 66 75 6e 28   y=(let x=2;fun(
2d40: 29 7b 78 7d 29 3b 20 79 28 29 60 29 2e 76 61 6c  ){x}); y()`).val
2d50: 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42  , new IntValue(B
2d60: 69 67 49 6e 74 28 32 29 29 20 29 3b 20 0d 0a 7d  igInt(2)) ); ..}
2d70: 0d 0a 75 6e 69 74 74 65 73 74 0d 0a 7b 0d 0a 09  ..unittest..{...
2d80: 61 73 73 65 72 74 5f 65 71 28 20 65 76 61 6c 53  assert_eq( evalS
2d90: 74 72 69 6e 67 28 60 40 61 20 78 3d 31 3b 20 40  tring(`@a x=1; @
2da0: 62 20 78 3d 32 3b 20 40 61 28 78 29 60 29 2e 76  b x=2; @a(x)`).v
2db0: 61 6c 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  al, new IntValue
2dc0: 28 42 69 67 49 6e 74 28 31 29 29 20 29 3b 0d 0a  (BigInt(1)) );..
2dd0: 09 61 73 73 65 72 74 5f 65 71 28 20 65 76 61 6c  .assert_eq( eval
2de0: 53 74 72 69 6e 67 28 60 40 61 20 78 3d 31 3b 20  String(`@a x=1; 
2df0: 40 62 20 78 3d 32 3b 20 40 62 28 78 29 60 29 2e  @b x=2; @b(x)`).
2e00: 76 61 6c 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75  val, new IntValu
2e10: 65 28 42 69 67 49 6e 74 28 32 29 29 20 29 3b 0d  e(BigInt(2)) );.
2e20: 0a 09 61 73 73 65 72 74 5f 65 71 28 20 65 76 61  ..assert_eq( eva
2e30: 6c 53 74 72 69 6e 67 28 60 6c 65 74 20 78 3d 31  lString(`let x=1
2e40: 3b 20 6c 65 74 20 5f 20 3d 20 28 40 61 20 78 3d  ; let _ = (@a x=
2e50: 32 3b 32 29 3b 20 78 60 29 2e 76 61 6c 2c 20 6e  2;2); x`).val, n
2e60: 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49  ew IntValue(BigI
2e70: 6e 74 28 31 29 29 20 29 3b 0d 0a 09 61 73 73 65  nt(1)) );...asse
2e80: 72 74 5f 74 68 72 6f 77 21 54 68 72 6f 77 61 62  rt_throw!Throwab
2e90: 6c 65 28 20 65 76 61 6c 53 74 72 69 6e 67 28 60  le( evalString(`
2ea0: 6c 65 74 20 78 3d 31 3b 20 6c 65 74 20 5f 20 3d  let x=1; let _ =
2eb0: 20 28 40 61 20 78 3d 32 3b 32 29 3b 20 40 61 28   (@a x=2;2); @a(
2ec0: 78 29 60 29 20 29 3b 0d 0a 7d 0d 0a 0a 75 6e 69  x)`) );..}...uni
2ed0: 74 74 65 73 74 0a 7b 0a 09 61 73 73 65 72 74 5f  ttest.{..assert_
2ee0: 65 71 28 20 65 76 61 6c 53 74 72 69 6e 67 28 60  eq( evalString(`
2ef0: 76 61 72 20 66 61 63 20 3d 20 66 75 6e 28 78 29  var fac = fun(x)
2f00: 7b 0a 09 09 69 66 28 78 29 0a 09 09 09 7b 20 78  {...if(x)....{ x
2f10: 2a 66 61 63 28 78 2d 31 29 3b 20 7d 0a 09 09 65  *fac(x-1); }...e
2f20: 6c 73 65 0a 09 09 09 7b 20 31 3b 20 7d 3b 0a 09  lse....{ 1; };..
2f30: 7d 3b 0a 09 66 61 63 28 31 30 29 3b 60 29 2e 76  };..fac(10);`).v
2f40: 61 6c 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  al, new IntValue
2f50: 28 42 69 67 49 6e 74 28 31 30 2a 39 2a 38 2a 35  (BigInt(10*9*8*5
2f60: 30 34 30 29 29 29 3b 0a 09 61 73 73 65 72 74 5f  040)));..assert_
2f70: 65 71 28 20 65 76 61 6c 53 74 72 69 6e 67 28 60  eq( evalString(`
2f80: 76 61 72 20 66 69 62 20 3d 20 66 75 6e 28 78 29  var fib = fun(x)
2f90: 7b 0a 09 09 69 66 28 78 3c 32 29 0a 09 09 09 7b  {...if(x<2)....{
2fa0: 20 31 3b 20 7d 0a 09 09 65 6c 73 65 0a 09 09 09   1; }...else....
2fb0: 7b 20 66 69 62 28 78 2d 31 29 20 2b 20 66 69 62  { fib(x-1) + fib
2fc0: 28 78 2d 32 29 3b 20 7d 3b 0a 09 7d 3b 0a 09 66  (x-2); };..};..f
2fd0: 69 62 28 35 29 3b 60 29 2e 76 61 6c 2c 20 6e 65  ib(5);`).val, ne
2fe0: 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e  w IntValue(BigIn
2ff0: 74 28 38 29 29 29 3b 0a 7d 0a 0d 0a 75 6e 69 74  t(8)));.}...unit
3000: 74 65 73 74 0d 0a 7b 0d 0a 09 61 73 73 65 72 74  test..{...assert
3010: 5f 74 68 72 6f 77 21 54 68 72 6f 77 61 62 6c 65  _throw!Throwable
3020: 28 20 65 76 61 6c 53 74 72 69 6e 67 28 60 40 40  ( evalString(`@@
3030: 73 28 78 29 7b 78 7d 3b 20 40 73 20 22 2b 22 3d  s(x){x}; @s "+"=
3040: 66 75 6e 28 78 2c 79 29 7b 78 2d 79 7d 3b 40 73  fun(x,y){x-y};@s
3050: 28 31 2b 32 29 60 29 20 29 3b 0d 0a 09 61 73 73  (1+2)`) );...ass
3060: 65 72 74 5f 65 71 28 20 65 76 61 6c 53 74 72 69  ert_eq( evalStri
3070: 6e 67 28 60 40 40 73 28 78 29 7b 78 7d 3b 20 40  ng(`@@s(x){x}; @
3080: 73 20 22 2b 22 3d 66 75 6e 28 78 2c 79 29 7b 78  s "+"=fun(x,y){x
3090: 2d 79 7d 3b 31 2b 32 60 29 2e 76 61 6c 2c 20 6e  -y};1+2`).val, n
30a0: 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49  ew IntValue(BigI
30b0: 6e 74 28 33 29 29 20 29 3b 0d 0a 09 61 73 73 65  nt(3)) );...asse
30c0: 72 74 5f 65 71 28 20 65 76 61 6c 53 74 72 69 6e  rt_eq( evalStrin
30d0: 67 28 60 40 40 73 28 78 29 7b 78 7d 3b 20 40 73  g(`@@s(x){x}; @s
30e0: 20 22 2b 22 3d 66 75 6e 28 78 2c 79 29 7b 40 76   "+"=fun(x,y){@v
30f0: 61 6c 75 65 28 40 73 28 78 29 2d 40 73 28 79 29  alue(@s(x)-@s(y)
3100: 29 7d 3b 31 2b 32 60 29 2e 76 61 6c 2c 20 6e 65  )};1+2`).val, ne
3110: 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e  w IntValue(BigIn
3120: 74 28 33 29 29 20 29 3b 0d 0a 09 61 73 73 65 72  t(3)) );...asser
3130: 74 5f 65 71 28 20 65 76 61 6c 53 74 72 69 6e 67  t_eq( evalString
3140: 28 60 40 40 73 28 78 29 7b 78 7d 3b 20 40 73 20  (`@@s(x){x}; @s 
3150: 22 2b 22 3d 66 75 6e 28 78 2c 79 29 7b 40 76 61  "+"=fun(x,y){@va
3160: 6c 75 65 28 40 73 28 78 29 2d 40 73 28 79 29 29  lue(@s(x)-@s(y))
3170: 7d 3b 40 73 28 31 2b 32 29 60 29 2e 76 61 6c 2c  };@s(1+2)`).val,
3180: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69   new IntValue(Bi
3190: 67 49 6e 74 28 2d 31 29 29 20 29 3b 0d 0a 7d 0d  gInt(-1)) );..}.
31a0: 0a 0d 0a 75 6e 69 74 74 65 73 74 0d 0a 7b 0d 0a  ...unittest..{..
31b0: 09 61 73 73 65 72 74 5f 65 71 28 20 65 76 61 6c  .assert_eq( eval
31c0: 53 74 72 69 6e 67 28 60 40 40 74 20 3d 20 66 75  String(`@@t = fu
31d0: 6e 28 78 29 7b 78 2b 31 7d 3b 20 40 74 28 31 32  n(x){x+1}; @t(12
31e0: 33 29 60 29 2e 76 61 6c 2c 20 6e 65 77 20 49 6e  3)`).val, new In
31f0: 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28 31 32  tValue(BigInt(12
3200: 34 29 29 20 29 3b 0d 0a 09 2f 2f 20 74 68 65 72  4)) );...// ther
3210: 65 20 77 61 73 20 61 20 62 75 67 20 74 68 61 74  e was a bug that
3220: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 20   declaration in 
3230: 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20 6f  the first line o
3240: 66 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  f function defin
3250: 69 74 69 6f 6e 0d 0a 09 2f 2f 20 63 61 6e 6e 6f  ition...// canno
3260: 74 20 62 65 20 72 65 63 75 72 73 69 76 65 0d 0a  t be recursive..
3270: 09 61 73 73 65 72 74 5f 6e 6f 74 68 72 6f 77 28  .assert_nothrow(
3280: 20 65 76 61 6c 53 74 72 69 6e 67 28 60 64 65 66   evalString(`def
3290: 20 66 6f 6f 28 29 20 7b 0d 0a 20 20 64 65 66 20   foo() {..  def 
32a0: 62 61 72 28 79 29 20 7b 20 69 66 28 79 3c 31 29  bar(y) { if(y<1)
32b0: 20 7b 30 7d 20 65 6c 73 65 20 7b 62 61 72 28 30   {0} else {bar(0
32c0: 29 7d 20 7d 3b 0d 0a 20 20 62 61 72 28 31 29 0d  )} };..  bar(1).
32d0: 0a 7d 3b 20 66 6f 6f 28 29 60 29 20 29 3b 0d 0a  .}; foo()`) );..
32e0: 7d 0d 0a                                         }..