Hex Artifact Content
Not logged in

Artifact 97875541a42dbc7aff2baf4144ff02baa4fdbbc1:


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 73 74 64 2e 74 79 70 65  .import std.type
0110: 63 6f 6e 73 3b 0d 0a 69 6d 70 6f 72 74 20 73 74  cons;..import st
0120: 64 2e 73 74 64 69 6f 3b 0a 0d 0a 2f 2f 2f 0a 54  d.stdio;...///.T
0130: 61 62 6c 65 20 63 72 65 61 74 65 47 6c 6f 62 61  able createGloba
0140: 6c 43 6f 6e 74 65 78 74 28 29 0a 7b 0d 0a 09 61  lContext().{...a
0150: 75 74 6f 20 63 74 78 20 3d 20 6e 65 77 20 54 61  uto ctx = new Ta
0160: 62 6c 65 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22  ble;...ctx.set("
0170: 2b 22 2c 20 22 40 76 22 2c 20 6e 61 74 69 76 65  +", "@v", native
0180: 28 20 28 49 6e 74 56 61 6c 75 65 20 6c 68 73 2c  ( (IntValue lhs,
0190: 20 49 6e 74 56 61 6c 75 65 20 72 68 73 29 7b 72   IntValue rhs){r
01a0: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c  eturn new IntVal
01b0: 75 65 28 6c 68 73 2e 64 61 74 61 20 2b 20 72 68  ue(lhs.data + rh
01c0: 73 2e 64 61 74 61 29 3b 7d 20 29 29 3b 0d 0a 09  s.data);} ));...
01d0: 63 74 78 2e 73 65 74 28 22 2d 22 2c 20 22 40 76  ctx.set("-", "@v
01e0: 22 2c 20 6e 61 74 69 76 65 28 20 28 49 6e 74 56  ", native( (IntV
01f0: 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 61 6c  alue lhs, IntVal
0200: 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e  ue rhs){return n
0210: 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 2e  ew IntValue(lhs.
0220: 64 61 74 61 20 2d 20 72 68 73 2e 64 61 74 61 29  data - rhs.data)
0230: 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74  ;} ));...ctx.set
0240: 28 22 2a 22 2c 20 22 40 76 22 2c 20 6e 61 74 69  ("*", "@v", nati
0250: 76 65 28 20 28 49 6e 74 56 61 6c 75 65 20 6c 68  ve( (IntValue lh
0260: 73 2c 20 49 6e 74 56 61 6c 75 65 20 72 68 73 29  s, IntValue rhs)
0270: 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56  {return new IntV
0280: 61 6c 75 65 28 6c 68 73 2e 64 61 74 61 20 2a 20  alue(lhs.data * 
0290: 72 68 73 2e 64 61 74 61 29 3b 7d 20 29 29 3b 0d  rhs.data);} ));.
02a0: 0a 09 63 74 78 2e 73 65 74 28 22 2f 22 2c 20 22  ..ctx.set("/", "
02b0: 40 76 22 2c 20 6e 61 74 69 76 65 28 20 28 49 6e  @v", native( (In
02c0: 74 56 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56  tValue lhs, IntV
02d0: 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e  alue rhs){return
02e0: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68   new IntValue(lh
02f0: 73 2e 64 61 74 61 20 2f 20 72 68 73 2e 64 61 74  s.data / rhs.dat
0300: 61 29 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73  a);} ));...ctx.s
0310: 65 74 28 22 25 22 2c 20 22 40 76 22 2c 20 6e 61  et("%", "@v", na
0320: 74 69 76 65 28 20 28 49 6e 74 56 61 6c 75 65 20  tive( (IntValue 
0330: 6c 68 73 2c 20 49 6e 74 56 61 6c 75 65 20 72 68  lhs, IntValue rh
0340: 73 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e  s){return new In
0350: 74 56 61 6c 75 65 28 6c 68 73 2e 64 61 74 61 20  tValue(lhs.data 
0360: 25 20 72 68 73 2e 64 61 74 61 29 3b 7d 20 29 29  % rhs.data);} ))
0370: 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 7c 7c 22  ;...ctx.set("||"
0380: 2c 20 22 40 76 22 2c 20 6e 61 74 69 76 65 28 20  , "@v", native( 
0390: 28 49 6e 74 56 61 6c 75 65 20 6c 68 73 2c 20 49  (IntValue lhs, I
03a0: 6e 74 56 61 6c 75 65 20 72 68 73 29 7b 72 65 74  ntValue rhs){ret
03b0: 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  urn new IntValue
03c0: 28 42 69 67 49 6e 74 28 28 6c 68 73 2e 64 61 74  (BigInt((lhs.dat
03d0: 61 21 3d 30 29 20 7c 7c 20 28 72 68 73 2e 64 61  a!=0) || (rhs.da
03e0: 74 61 21 3d 30 29 20 3f 20 31 3a 30 29 29 3b 7d  ta!=0) ? 1:0));}
03f0: 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22   ));...ctx.set("
0400: 26 26 22 2c 20 22 40 76 22 2c 20 6e 61 74 69 76  &&", "@v", nativ
0410: 65 28 20 28 49 6e 74 56 61 6c 75 65 20 6c 68 73  e( (IntValue lhs
0420: 2c 20 49 6e 74 56 61 6c 75 65 20 72 68 73 29 7b  , IntValue rhs){
0430: 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61  return new IntVa
0440: 6c 75 65 28 42 69 67 49 6e 74 28 28 6c 68 73 2e  lue(BigInt((lhs.
0450: 64 61 74 61 21 3d 30 29 20 26 26 20 28 72 68 73  data!=0) && (rhs
0460: 2e 64 61 74 61 21 3d 30 29 20 3f 20 31 3a 30 29  .data!=0) ? 1:0)
0470: 29 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65  );} ));...ctx.se
0480: 74 28 22 3c 22 2c 20 22 40 76 22 2c 20 6e 61 74  t("<", "@v", nat
0490: 69 76 65 28 20 28 56 61 6c 75 65 20 6c 68 73 2c  ive( (Value lhs,
04a0: 20 56 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75   Value rhs){retu
04b0: 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28  rn new IntValue(
04c0: 42 69 67 49 6e 74 28 6c 68 73 20 3c 20 72 68 73  BigInt(lhs < rhs
04d0: 20 3f 20 31 3a 20 30 29 29 3b 7d 20 29 29 3b 0d   ? 1: 0));} ));.
04e0: 0a 09 63 74 78 2e 73 65 74 28 22 3e 22 2c 20 22  ..ctx.set(">", "
04f0: 40 76 22 2c 20 6e 61 74 69 76 65 28 20 28 56 61  @v", native( (Va
0500: 6c 75 65 20 6c 68 73 2c 20 56 61 6c 75 65 20 72  lue lhs, Value r
0510: 68 73 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49  hs){return new I
0520: 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28 6c  ntValue(BigInt(l
0530: 68 73 20 3e 20 72 68 73 20 3f 20 31 3a 20 30 29  hs > rhs ? 1: 0)
0540: 29 3b 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65  );} ));...ctx.se
0550: 74 28 22 3c 3d 22 2c 20 22 40 76 22 2c 20 6e 61  t("<=", "@v", na
0560: 74 69 76 65 28 20 28 56 61 6c 75 65 20 6c 68 73  tive( (Value lhs
0570: 2c 20 56 61 6c 75 65 20 72 68 73 29 7b 72 65 74  , Value rhs){ret
0580: 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  urn new IntValue
0590: 28 42 69 67 49 6e 74 28 6c 68 73 20 3c 3d 20 72  (BigInt(lhs <= r
05a0: 68 73 20 3f 20 31 3a 20 30 29 29 3b 7d 20 29 29  hs ? 1: 0));} ))
05b0: 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 3e 3d 22  ;...ctx.set(">="
05c0: 2c 20 22 40 76 22 2c 20 6e 61 74 69 76 65 28 20  , "@v", native( 
05d0: 28 56 61 6c 75 65 20 6c 68 73 2c 20 56 61 6c 75  (Value lhs, Valu
05e0: 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e 65  e rhs){return ne
05f0: 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e  w IntValue(BigIn
0600: 74 28 6c 68 73 20 3e 3d 20 72 68 73 20 3f 20 31  t(lhs >= rhs ? 1
0610: 3a 20 30 29 29 3b 7d 20 29 29 3b 0d 0a 09 63 74  : 0));} ));...ct
0620: 78 2e 73 65 74 28 22 3d 3d 22 2c 20 22 40 76 22  x.set("==", "@v"
0630: 2c 20 6e 61 74 69 76 65 28 20 28 56 61 6c 75 65  , native( (Value
0640: 20 6c 68 73 2c 20 56 61 6c 75 65 20 72 68 73 29   lhs, Value rhs)
0650: 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56  {return new IntV
0660: 61 6c 75 65 28 42 69 67 49 6e 74 28 6c 68 73 20  alue(BigInt(lhs 
0670: 3d 3d 20 72 68 73 20 3f 20 31 3a 20 30 29 29 3b  == rhs ? 1: 0));
0680: 7d 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28  } ));...ctx.set(
0690: 22 21 3d 22 2c 20 22 40 76 22 2c 20 6e 61 74 69  "!=", "@v", nati
06a0: 76 65 28 20 28 56 61 6c 75 65 20 6c 68 73 2c 20  ve( (Value lhs, 
06b0: 56 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72  Value rhs){retur
06c0: 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42  n new IntValue(B
06d0: 69 67 49 6e 74 28 6c 68 73 20 21 3d 20 72 68 73  igInt(lhs != rhs
06e0: 20 3f 20 31 3a 20 30 29 29 3b 7d 20 29 29 3b 0d   ? 1: 0));} ));.
06f0: 0a 09 63 74 78 2e 73 65 74 28 22 70 72 69 6e 74  ..ctx.set("print
0700: 22 2c 20 22 40 76 22 2c 20 6e 65 77 20 46 75 6e  ", "@v", new Fun
0710: 56 61 6c 75 65 28 64 65 6c 65 67 61 74 65 20 56  Value(delegate V
0720: 61 6c 75 65 28 69 6d 6d 75 74 61 62 6c 65 20 4c  alue(immutable L
0730: 65 78 50 6f 73 69 74 69 6f 6e 20 70 6f 73 2c 20  exPosition pos, 
0740: 4c 61 79 65 72 20 6c 61 79 2c 20 56 61 6c 75 65  Layer lay, Value
0750: 5b 5d 20 61 72 67 73 29 7b 0a 09 09 66 6f 72 65  [] args){...fore
0760: 61 63 68 28 61 3b 20 61 72 67 73 29 0a 09 09 09  ach(a; args)....
0770: 77 72 69 74 65 28 61 29 3b 0a 09 09 77 72 69 74  write(a);...writ
0780: 65 6c 6e 28 22 22 29 3b 0a 09 09 72 65 74 75 72  eln("");...retur
0790: 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42  n new IntValue(B
07a0: 69 67 49 6e 74 28 31 37 38 29 29 3b 0a 09 7d 29  igInt(178));..})
07b0: 29 3b 0a 09 63 74 78 2e 73 65 74 28 22 69 66 22  );..ctx.set("if"
07c0: 2c 20 22 40 76 22 2c 20 6e 65 77 20 46 75 6e 56  , "@v", new FunV
07d0: 61 6c 75 65 28 64 65 6c 65 67 61 74 65 20 56 61  alue(delegate Va
07e0: 6c 75 65 28 69 6d 6d 75 74 61 62 6c 65 20 4c 65  lue(immutable Le
07f0: 78 50 6f 73 69 74 69 6f 6e 20 70 6f 73 2c 20 4c  xPosition pos, L
0800: 61 79 65 72 20 6c 61 79 2c 20 56 61 6c 75 65 5b  ayer lay, Value[
0810: 5d 20 61 72 67 73 29 7b 0a 09 09 69 66 28 20 61  ] args){...if( a
0820: 72 67 73 2e 6c 65 6e 67 74 68 20 21 3d 20 33 20  rgs.length != 3 
0830: 29 0a 09 09 09 74 68 72 6f 77 20 67 65 6e 65 78  )....throw genex
0840: 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f  !RuntimeExceptio
0850: 6e 28 70 6f 73 2c 20 22 69 66 20 74 61 6b 65 73  n(pos, "if takes
0860: 20 74 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73   three arguments
0870: 21 21 22 29 3b 0a 09 09 69 66 28 20 61 75 74 6f  !!");...if( auto
0880: 20 78 20 3d 20 63 61 73 74 28 49 6e 74 56 61 6c   x = cast(IntVal
0890: 75 65 29 61 72 67 73 5b 30 5d 20 29 0a 09 09 69  ue)args[0] )...i
08a0: 66 28 20 61 75 74 6f 20 66 74 20 3d 20 63 61 73  f( auto ft = cas
08b0: 74 28 46 75 6e 56 61 6c 75 65 29 61 72 67 73 5b  t(FunValue)args[
08c0: 31 5d 20 29 0a 09 09 69 66 28 20 61 75 74 6f 20  1] )...if( auto 
08d0: 66 65 20 3d 20 63 61 73 74 28 46 75 6e 56 61 6c  fe = cast(FunVal
08e0: 75 65 29 61 72 67 73 5b 32 5d 20 29 0a 09 09 09  ue)args[2] )....
08f0: 72 65 74 75 72 6e 20 28 78 2e 64 61 74 61 20 3d  return (x.data =
0900: 3d 20 30 20 3f 20 66 65 20 3a 20 66 74 29 2e 63  = 0 ? fe : ft).c
0910: 61 6c 6c 28 70 6f 73 2c 6c 61 79 2c 5b 5d 29 3b  all(pos,lay,[]);
0920: 0a 09 09 74 68 72 6f 77 20 67 65 6e 65 78 21 52  ...throw genex!R
0930: 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 28  untimeException(
0940: 70 6f 73 2c 20 22 74 79 70 65 20 6d 69 73 6d 61  pos, "type misma
0950: 74 63 68 20 69 6e 20 69 66 22 29 3b 0d 0a 09 7d  tch in if");...}
0960: 29 29 3b 0a 09 63 74 78 2e 73 65 74 28 22 5f 69  ));..ctx.set("_i
0970: 73 69 6e 74 22 2c 20 22 40 76 22 2c 20 6e 61 74  sint", "@v", nat
0980: 69 76 65 28 20 28 56 61 6c 75 65 20 76 29 7b 72  ive( (Value v){r
0990: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c  eturn new IntVal
09a0: 75 65 28 42 69 67 49 6e 74 28 63 61 73 74 28 49  ue(BigInt(cast(I
09b0: 6e 74 56 61 6c 75 65 29 76 20 69 73 20 6e 75 6c  ntValue)v is nul
09c0: 6c 20 3f 20 30 20 3a 20 31 29 29 3b 7d 20 29 29  l ? 0 : 1));} ))
09d0: 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 5f 69 73  ;...ctx.set("_is
09e0: 73 74 72 22 2c 20 22 40 76 22 2c 20 6e 61 74 69  str", "@v", nati
09f0: 76 65 28 20 28 56 61 6c 75 65 20 76 29 7b 72 65  ve( (Value v){re
0a00: 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75  turn new IntValu
0a10: 65 28 42 69 67 49 6e 74 28 63 61 73 74 28 53 74  e(BigInt(cast(St
0a20: 72 56 61 6c 75 65 29 76 20 69 73 20 6e 75 6c 6c  rValue)v is null
0a30: 20 3f 20 30 20 3a 20 31 29 29 3b 7d 20 29 29 3b   ? 0 : 1));} ));
0a40: 0d 0a 09 63 74 78 2e 73 65 74 28 22 5f 69 73 66  ...ctx.set("_isf
0a50: 75 6e 22 2c 20 22 40 76 22 2c 20 6e 61 74 69 76  un", "@v", nativ
0a60: 65 28 20 28 56 61 6c 75 65 20 76 29 7b 72 65 74  e( (Value v){ret
0a70: 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  urn new IntValue
0a80: 28 42 69 67 49 6e 74 28 63 61 73 74 28 46 75 6e  (BigInt(cast(Fun
0a90: 56 61 6c 75 65 29 76 20 69 73 20 6e 75 6c 6c 20  Value)v is null 
0aa0: 3f 20 30 20 3a 20 31 29 29 3b 7d 20 29 29 3b 0d  ? 0 : 1));} ));.
0ab0: 0a 09 63 74 78 2e 73 65 74 28 22 5f 69 73 75 6e  ..ctx.set("_isun
0ac0: 64 65 66 69 6e 65 64 22 2c 20 22 40 76 22 2c 20  defined", "@v", 
0ad0: 6e 61 74 69 76 65 28 20 28 56 61 6c 75 65 20 76  native( (Value v
0ae0: 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74  ){return new Int
0af0: 56 61 6c 75 65 28 42 69 67 49 6e 74 28 63 61 73  Value(BigInt(cas
0b00: 74 28 55 6e 64 56 61 6c 75 65 29 76 20 69 73 20  t(UndValue)v is 
0b10: 6e 75 6c 6c 20 3f 20 30 20 3a 20 31 29 29 3b 7d  null ? 0 : 1));}
0b20: 20 29 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22   ));...ctx.set("
0b30: 5f 69 73 74 61 62 6c 65 22 2c 20 22 40 76 22 2c  _istable", "@v",
0b40: 20 6e 61 74 69 76 65 28 20 28 56 61 6c 75 65 20   native( (Value 
0b50: 76 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e  v){return new In
0b60: 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28 63 61  tValue(BigInt(ca
0b70: 73 74 28 54 61 62 6c 65 29 76 20 69 73 20 6e 75  st(Table)v is nu
0b80: 6c 6c 20 3f 20 30 20 3a 20 31 29 29 3b 7d 20 29  ll ? 0 : 1));} )
0b90: 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22 2e 22  );...ctx.set("."
0ba0: 2c 20 22 40 76 22 2c 20 6e 61 74 69 76 65 28 20  , "@v", native( 
0bb0: 28 54 61 62 6c 65 20 74 2c 20 53 74 72 56 61 6c  (Table t, StrVal
0bc0: 75 65 20 73 29 7b 0d 0a 09 09 72 65 74 75 72 6e  ue s){....return
0bd0: 20 28 74 2e 68 61 73 28 73 2e 64 61 74 61 2c 20   (t.has(s.data, 
0be0: 22 40 76 22 29 20 3f 20 74 2e 67 65 74 28 73 2e  "@v") ? t.get(s.
0bf0: 64 61 74 61 2c 20 22 40 76 22 29 20 3a 20 6e 65  data, "@v") : ne
0c00: 77 20 55 6e 64 56 61 6c 75 65 29 3b 0d 0a 09 7d  w UndValue);...}
0c10: 29 20 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28 22  ) );...ctx.set("
0c20: 2e 3f 22 2c 20 22 40 76 22 2c 20 6e 61 74 69 76  .?", "@v", nativ
0c30: 65 28 20 28 54 61 62 6c 65 20 74 2c 20 53 74 72  e( (Table t, Str
0c40: 56 61 6c 75 65 20 73 29 7b 0d 0a 09 09 72 65 74  Value s){....ret
0c50: 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  urn new IntValue
0c60: 28 42 69 67 49 6e 74 28 74 2e 68 61 73 28 73 2e  (BigInt(t.has(s.
0c70: 64 61 74 61 2c 20 22 40 76 22 29 20 3f 20 31 20  data, "@v") ? 1 
0c80: 3a 20 30 29 29 3b 0d 0a 09 7d 29 20 29 3b 0d 0a  : 0));...}) );..
0c90: 09 63 74 78 2e 73 65 74 28 22 2e 3d 22 2c 20 22  .ctx.set(".=", "
0ca0: 40 76 22 2c 20 6e 61 74 69 76 65 28 20 28 54 61  @v", native( (Ta
0cb0: 62 6c 65 20 74 2c 20 53 74 72 56 61 6c 75 65 20  ble t, StrValue 
0cc0: 73 2c 20 56 61 6c 75 65 20 76 29 7b 0d 0a 09 09  s, Value v){....
0cd0: 61 75 74 6f 20 74 32 20 3d 20 6e 65 77 20 54 61  auto t2 = new Ta
0ce0: 62 6c 65 28 74 2c 20 54 61 62 6c 65 2e 4b 69 6e  ble(t, Table.Kin
0cf0: 64 2e 4e 6f 74 50 72 6f 70 61 67 61 74 65 53 65  d.NotPropagateSe
0d00: 74 29 3b 0d 0a 09 09 74 32 2e 73 65 74 28 73 2e  t);....t2.set(s.
0d10: 64 61 74 61 2c 20 22 40 76 22 2c 20 76 29 3b 0d  data, "@v", v);.
0d20: 0a 09 09 72 65 74 75 72 6e 20 74 32 3b 0d 0a 09  ...return t2;...
0d30: 7d 29 20 29 3b 0d 0a 09 63 74 78 2e 73 65 74 28  }) );...ctx.set(
0d40: 22 7b 7d 22 2c 20 22 40 76 22 2c 20 6e 61 74 69  "{}", "@v", nati
0d50: 76 65 28 20 28 29 7b 0d 0a 09 09 72 65 74 75 72  ve( (){....retur
0d60: 6e 20 6e 65 77 20 54 61 62 6c 65 3b 0d 0a 09 7d  n new Table;...}
0d70: 29 20 29 3b 0d 0a 09 72 65 74 75 72 6e 20 63 74  ) );...return ct
0d80: 78 3b 0a 7d 0a 0a 2f 2f 2f 20 45 6e 74 72 79 20  x;.}../// Entry 
0d90: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 6d 6f  point of this mo
0da0: 64 75 6c 65 0d 0a 0d 0a 54 75 70 6c 65 21 28 56  dule....Tuple!(V
0db0: 61 6c 75 65 2c 22 76 61 6c 22 2c 54 61 62 6c 65  alue,"val",Table
0dc0: 2c 22 63 74 78 22 29 20 65 76 61 6c 53 74 72 69  ,"ctx") evalStri
0dd0: 6e 67 28 53 2c 54 2e 2e 2e 29 28 53 20 73 74 72  ng(S,T...)(S str
0de0: 2c 20 54 20 66 6e 5f 6c 6e 5f 63 6e 29 0a 7b 0a  , T fn_ln_cn).{.
0df0: 09 72 65 74 75 72 6e 20 65 76 61 6c 28 20 70 6f  .return eval( po
0e00: 6c 65 6d 79 2e 70 61 72 73 65 2e 70 61 72 73 65  lemy.parse.parse
0e10: 53 74 72 69 6e 67 28 73 74 72 2c 20 66 6e 5f 6c  String(str, fn_l
0e20: 6e 5f 63 6e 29 20 29 3b 0a 7d 0a 0a 2f 2f 2f 20  n_cn) );.}../// 
0e30: 45 6e 74 72 79 20 70 6f 69 6e 74 20 6f 66 20 74  Entry point of t
0e40: 68 69 73 20 6d 6f 64 75 6c 65 0d 0a 0d 0a 54 75  his module....Tu
0e50: 70 6c 65 21 28 56 61 6c 75 65 2c 22 76 61 6c 22  ple!(Value,"val"
0e60: 2c 54 61 62 6c 65 2c 22 63 74 78 22 29 20 65 76  ,Table,"ctx") ev
0e70: 61 6c 46 69 6c 65 28 53 2c 20 54 2e 2e 2e 29 28  alFile(S, T...)(
0e80: 53 20 66 69 6c 65 6e 61 6d 65 2c 20 54 20 6c 6e  S filename, T ln
0e90: 5f 63 6e 29 0a 7b 0a 09 72 65 74 75 72 6e 20 65  _cn).{..return e
0ea0: 76 61 6c 28 20 70 6f 6c 65 6d 79 2e 70 61 72 73  val( polemy.pars
0eb0: 65 2e 70 61 72 73 65 46 69 6c 65 28 66 69 6c 65  e.parseFile(file
0ec0: 6e 61 6d 65 2c 20 6c 6e 5f 63 6e 29 20 29 3b 0a  name, ln_cn) );.
0ed0: 7d 0a 0a 2f 2f 2f 20 45 6e 74 72 79 20 70 6f 69  }../// Entry poi
0ee0: 6e 74 20 6f 66 20 74 68 69 73 20 6d 6f 64 75 6c  nt of this modul
0ef0: 65 0d 0a 0d 0a 54 75 70 6c 65 21 28 56 61 6c 75  e....Tuple!(Valu
0f00: 65 2c 22 76 61 6c 22 2c 54 61 62 6c 65 2c 22 63  e,"val",Table,"c
0f10: 74 78 22 29 20 65 76 61 6c 28 41 53 54 20 65 29  tx") eval(AST e)
0f20: 0a 7b 0a 09 54 61 62 6c 65 20 63 74 78 20 3d 20  .{..Table ctx = 
0f30: 63 72 65 61 74 65 47 6c 6f 62 61 6c 43 6f 6e 74  createGlobalCont
0f40: 65 78 74 28 29 3b 0a 09 72 65 74 75 72 6e 20 74  ext();..return t
0f50: 79 70 65 6f 66 28 72 65 74 75 72 6e 29 28 65 76  ypeof(return)(ev
0f60: 61 6c 28 65 2c 20 63 74 78 2c 20 66 61 6c 73 65  al(e, ctx, false
0f70: 2c 20 22 40 76 22 29 2c 20 63 74 78 29 3b 0a 7d  , "@v"), ctx);.}
0f80: 0a 0a 2f 2f 2f 20 45 6e 74 72 79 20 70 6f 69 6e  ../// Entry poin
0f90: 74 20 6f 66 20 74 68 69 73 20 6d 6f 64 75 6c 65  t of this module
0fa0: 0d 0a 2f 2f 2f 20 49 66 20 73 70 6c 69 74 43 74  ../// If splitCt
0fb0: 78 20 3d 20 74 72 75 65 2c 20 74 68 65 6e 20 69  x = true, then i
0fc0: 6e 6e 65 72 20 76 61 72 69 61 62 6c 65 20 64 65  nner variable de
0fd0: 63 6c 61 72 61 74 69 6f 6e 20 64 6f 20 6e 6f 74  claration do not
0fe0: 20 6f 76 65 72 77 72 69 74 65 20 63 74 78 2e 0d   overwrite ctx..
0ff0: 0a 2f 2f 2f 20 6c 61 79 20 69 73 20 74 68 65 20  ./// lay is the 
1000: 6c 61 79 65 72 20 49 44 20 66 6f 72 20 65 76 61  layer ID for eva
1010: 6c 75 61 74 69 6f 6e 20 28 73 74 61 6e 64 61 72  luation (standar
1020: 64 20 76 61 6c 75 65 20 73 65 6d 61 6e 74 69 63  d value semantic
1030: 73 20 75 73 65 73 20 22 40 76 22 29 2e 0d 0a 0d  s uses "@v")....
1040: 0a 56 61 6c 75 65 20 65 76 61 6c 28 41 53 54 20  .Value eval(AST 
1050: 65 2c 20 54 61 62 6c 65 20 63 74 78 2c 20 62 6f  e, Table ctx, bo
1060: 6f 6c 20 73 70 6c 69 74 43 74 78 2c 20 4c 61 79  ol splitCtx, Lay
1070: 65 72 20 6c 61 79 29 0a 7b 0d 0a 09 72 65 74 75  er lay).{...retu
1080: 72 6e 20 65 2e 6d 61 74 63 68 28 0a 09 09 28 53  rn e.match(...(S
1090: 74 72 4c 69 74 65 72 61 6c 20 65 29 0a 09 09 7b  trLiteral e)...{
10a0: 0d 0a 09 09 09 56 61 6c 75 65 20 76 20 3d 20 6e  .....Value v = n
10b0: 65 77 20 53 74 72 56 61 6c 75 65 28 65 2e 64 61  ew StrValue(e.da
10c0: 74 61 29 3b 0d 0a 09 09 09 69 66 28 20 6c 61 79  ta);.....if( lay
10d0: 20 3d 3d 20 22 40 76 22 20 29 0a 09 09 09 09 72   == "@v" ).....r
10e0: 65 74 75 72 6e 20 76 3b 0d 0a 09 09 09 65 6c 73  eturn v;.....els
10f0: 65 20 2f 2f 20 72 69 73 65 0d 0a 09 09 09 09 72  e // rise......r
1100: 65 74 75 72 6e 20 28 63 61 73 74 28 46 75 6e 56  eturn (cast(FunV
1110: 61 6c 75 65 29 63 74 78 2e 67 65 74 28 6c 61 79  alue)ctx.get(lay
1120: 2c 20 22 28 73 79 73 74 65 6d 29 22 2c 20 65 2e  , "(system)", e.
1130: 70 6f 73 29 29 2e 63 61 6c 6c 28 65 2e 70 6f 73  pos)).call(e.pos
1140: 2c 20 22 40 76 22 2c 20 5b 76 5d 29 3b 0a 09 09  , "@v", [v]);...
1150: 7d 2c 0a 09 09 28 49 6e 74 4c 69 74 65 72 61 6c  },...(IntLiteral
1160: 20 65 29 0a 09 09 7b 0a 09 09 09 56 61 6c 75 65   e)...{....Value
1170: 20 76 20 3d 20 6e 65 77 20 49 6e 74 56 61 6c 75   v = new IntValu
1180: 65 28 65 2e 64 61 74 61 29 3b 0d 0a 09 09 09 69  e(e.data);.....i
1190: 66 28 20 6c 61 79 20 3d 3d 20 22 40 76 22 20 29  f( lay == "@v" )
11a0: 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 76 3b 0a  ......return v;.
11b0: 09 09 09 65 6c 73 65 20 2f 2f 20 72 69 73 65 0d  ...else // rise.
11c0: 0a 09 09 09 09 72 65 74 75 72 6e 20 28 63 61 73  .....return (cas
11d0: 74 28 46 75 6e 56 61 6c 75 65 29 63 74 78 2e 67  t(FunValue)ctx.g
11e0: 65 74 28 6c 61 79 2c 20 22 28 73 79 73 74 65 6d  et(lay, "(system
11f0: 29 22 2c 20 65 2e 70 6f 73 29 29 2e 63 61 6c 6c  )", e.pos)).call
1200: 28 65 2e 70 6f 73 2c 20 22 40 76 22 2c 20 5b 76  (e.pos, "@v", [v
1210: 5d 29 3b 0d 0a 09 09 7d 2c 0a 09 09 28 56 61 72  ]);....},...(Var
1220: 45 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 09  Expression e)...
1230: 09 7b 0d 0a 09 09 09 69 66 28 20 6c 61 79 20 3d  .{.....if( lay =
1240: 3d 20 22 40 76 22 20 29 0d 0a 09 09 09 09 72 65  = "@v" )......re
1250: 74 75 72 6e 20 63 74 78 2e 67 65 74 28 65 2e 76  turn ctx.get(e.v
1260: 61 72 2c 20 6c 61 79 2c 20 65 2e 70 6f 73 29 3b  ar, lay, e.pos);
1270: 0d 0a 09 09 09 74 72 79 20 7b 0d 0a 09 09 09 09  .....try {......
1280: 72 65 74 75 72 6e 20 63 74 78 2e 67 65 74 28 65  return ctx.get(e
1290: 2e 76 61 72 2c 20 6c 61 79 2c 20 65 2e 70 6f 73  .var, lay, e.pos
12a0: 29 3b 0d 0a 09 09 09 7d 20 63 61 74 63 68 28 20  );.....} catch( 
12b0: 54 68 72 6f 77 61 62 6c 65 20 29 20 7b 20 2f 2f  Throwable ) { //
12c0: 20 5b 54 4f 44 4f 5d 20 6d 6f 72 65 20 70 72 65   [TODO] more pre
12d0: 63 69 73 65 2e 2e 2e 0d 0a 09 09 09 09 2f 2f 20  cise.........// 
12e0: 72 69 73 65 20 66 72 6f 6d 20 40 76 0d 0a 09 09  rise from @v....
12f0: 09 09 72 65 74 75 72 6e 20 28 63 61 73 74 28 46  ..return (cast(F
1300: 75 6e 56 61 6c 75 65 29 63 74 78 2e 67 65 74 28  unValue)ctx.get(
1310: 6c 61 79 2c 20 22 28 73 79 73 74 65 6d 29 22 2c  lay, "(system)",
1320: 20 65 2e 70 6f 73 29 29 2e 63 61 6c 6c 28 65 2e   e.pos)).call(e.
1330: 70 6f 73 2c 20 22 40 76 22 2c 20 0d 0a 09 09 09  pos, "@v", .....
1340: 09 09 5b 63 74 78 2e 67 65 74 28 65 2e 76 61 72  ..[ctx.get(e.var
1350: 2c 20 22 40 76 22 2c 20 65 2e 70 6f 73 29 5d 0d  , "@v", e.pos)].
1360: 0a 09 09 09 09 29 3b 0d 0a 09 09 09 7d 0d 0a 09  .....);.....}...
1370: 09 7d 2c 0d 0a 09 09 28 4c 61 79 65 72 65 64 45  .},....(LayeredE
1380: 78 70 72 65 73 73 69 6f 6e 20 65 29 0d 0a 09 09  xpression e)....
1390: 7b 0d 0a 09 09 09 69 66 28 20 65 2e 6c 61 79 20  {.....if( e.lay 
13a0: 3d 3d 20 22 40 6d 61 63 72 6f 22 20 29 0d 0a 09  == "@macro" )...
13b0: 09 09 09 72 65 74 75 72 6e 20 6d 61 63 72 6f 45  ...return macroE
13c0: 76 61 6c 28 65 2e 65 78 70 72 2c 20 63 74 78 2c  val(e.expr, ctx,
13d0: 20 66 61 6c 73 65 29 3b 0d 0a 09 09 09 65 6c 73   false);.....els
13e0: 65 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 65 76  e......return ev
13f0: 61 6c 28 65 2e 65 78 70 72 2c 20 63 74 78 2c 20  al(e.expr, ctx, 
1400: 74 72 75 65 2c 20 65 2e 6c 61 79 29 3b 0d 0a 09  true, e.lay);...
1410: 09 7d 2c 0d 0a 09 09 28 4c 65 74 45 78 70 72 65  .},....(LetExpre
1420: 73 73 69 6f 6e 20 65 29 0d 0a 09 09 7b 0d 0a 09  ssion e)....{...
1430: 09 09 2f 2f 20 66 6f 72 20 6c 65 74 72 65 63 2c  ..// for letrec,
1440: 20 77 65 20 6e 65 65 64 20 74 68 69 73 2c 20 62   we need this, b
1450: 75 74 20 73 68 6f 75 6c 64 20 61 76 6f 69 64 20  ut should avoid 
1460: 6f 76 65 72 77 72 69 74 69 6e 67 3f 3f 3f 3f 0d  overwriting????.
1470: 0a 09 09 09 2f 2f 20 63 74 78 2e 73 65 74 28 65  ....// ctx.set(e
1480: 2e 76 61 72 2c 20 22 40 76 22 2c 20 6e 65 77 20  .var, "@v", new 
1490: 55 6e 64 65 66 69 6e 65 64 56 61 6c 75 65 2c 20  UndefinedValue, 
14a0: 65 2e 70 6f 73 29 3b 0d 0a 09 09 09 69 66 28 73  e.pos);.....if(s
14b0: 70 6c 69 74 43 74 78 29 0d 0a 09 09 09 09 63 74  plitCtx)......ct
14c0: 78 20 3d 20 6e 65 77 20 54 61 62 6c 65 28 63 74  x = new Table(ct
14d0: 78 2c 20 54 61 62 6c 65 2e 4b 69 6e 64 2e 4e 6f  x, Table.Kind.No
14e0: 74 50 72 6f 70 61 67 61 74 65 53 65 74 29 3b 0d  tPropagateSet);.
14f0: 0a 09 09 09 56 61 6c 75 65 20 76 20 3d 20 65 76  ....Value v = ev
1500: 61 6c 28 65 2e 69 6e 69 74 2c 20 63 74 78 2c 20  al(e.init, ctx, 
1510: 74 72 75 65 2c 20 6c 61 79 29 3b 0d 0a 09 09 09  true, lay);.....
1520: 63 74 78 2e 73 65 74 28 65 2e 76 61 72 2c 20 28  ctx.set(e.var, (
1530: 65 2e 6c 61 79 65 72 2e 6c 65 6e 67 74 68 20 3f  e.layer.length ?
1540: 20 65 2e 6c 61 79 65 72 20 3a 20 6c 61 79 29 2c   e.layer : lay),
1550: 20 76 2c 20 65 2e 70 6f 73 29 3b 0d 0a 09 09 09   v, e.pos);.....
1560: 72 65 74 75 72 6e 20 65 76 61 6c 28 65 2e 65 78  return eval(e.ex
1570: 70 72 2c 20 63 74 78 2c 20 66 61 6c 73 65 2c 20  pr, ctx, false, 
1580: 6c 61 79 29 3b 0d 0a 09 09 7d 2c 0d 0a 09 09 28  lay);....},....(
1590: 46 75 6e 63 61 6c 6c 45 78 70 72 65 73 73 69 6f  FuncallExpressio
15a0: 6e 20 65 29 0a 09 09 7b 0a 09 09 09 56 61 6c 75  n e)...{....Valu
15b0: 65 20 5f 66 20 3d 20 65 76 61 6c 28 65 2e 66 75  e _f = eval(e.fu
15c0: 6e 2c 20 63 74 78 2c 20 74 72 75 65 2c 20 6c 61  n, ctx, true, la
15d0: 79 29 3b 0a 09 09 09 69 66 28 20 61 75 74 6f 20  y);....if( auto 
15e0: 66 20 3d 20 63 61 73 74 28 46 75 6e 56 61 6c 75  f = cast(FunValu
15f0: 65 29 5f 66 20 29 20 7b 0a 09 09 09 09 56 61 6c  e)_f ) {.....Val
1600: 75 65 5b 5d 20 61 72 67 73 3b 0a 09 09 09 09 66  ue[] args;.....f
1610: 6f 72 65 61 63 68 28 61 3b 20 65 2e 61 72 67 73  oreach(a; e.args
1620: 29 0a 09 09 09 09 09 61 72 67 73 20 7e 3d 20 65  )......args ~= e
1630: 76 61 6c 28 61 2c 20 63 74 78 2c 20 74 72 75 65  val(a, ctx, true
1640: 2c 20 6c 61 79 29 3b 0a 09 09 09 09 72 65 74 75  , lay);.....retu
1650: 72 6e 20 66 2e 63 61 6c 6c 28 65 2e 70 6f 73 2c  rn f.call(e.pos,
1660: 20 6c 61 79 2c 20 61 72 67 73 29 3b 0a 09 09 09   lay, args);....
1670: 7d 0d 0a 09 09 09 74 68 72 6f 77 20 67 65 6e 65  }.....throw gene
1680: 78 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69  x!RuntimeExcepti
1690: 6f 6e 28 65 2e 70 6f 73 2c 20 22 4e 6f 6e 2d 66  on(e.pos, "Non-f
16a0: 75 6e 63 69 6f 6e 20 69 73 20 61 70 70 6c 69 65  uncion is applie
16b0: 64 22 29 3b 0a 09 09 7d 2c 0a 09 09 28 46 75 6e  d");...},...(Fun
16c0: 4c 69 74 65 72 61 6c 20 65 29 0a 09 09 7b 0d 0a  Literal e)...{..
16d0: 09 09 09 56 61 6c 75 65 5b 56 61 6c 75 65 5b 5d  ...Value[Value[]
16e0: 5d 5b 4c 61 79 65 72 5d 20 6d 65 6d 6f 3b 0d 0a  ][Layer] memo;..
16f0: 09 09 09 41 53 54 20 6d 61 63 72 6f 4d 65 6d 6f  ...AST macroMemo
1700: 20 3d 20 6e 75 6c 6c 3b 20 2f 2f 20 63 61 63 68   = null; // cach
1710: 65 0d 0a 0d 0a 09 09 09 2f 2f 20 66 75 6e 76 61  e.......// funva
1720: 6c 75 65 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  lue need not be 
1730: 72 69 73 65 64 0d 0a 09 09 09 2f 2f 20 6e 6f 2c  rised.....// no,
1740: 20 6e 65 65 64 20 74 6f 20 62 65 20 72 69 73 65   need to be rise
1750: 64 20 21 21 20 20 73 75 70 70 6f 73 65 20 40 74  d !!  suppose @t
1760: 28 66 69 62 29 28 22 69 6e 74 22 29 0a 09 09 09  (fib)("int")....
1770: 72 65 74 75 72 6e 20 6e 65 77 20 46 75 6e 56 61  return new FunVa
1780: 6c 75 65 28 64 65 6c 65 67 61 74 65 20 56 61 6c  lue(delegate Val
1790: 75 65 28 69 6d 6d 75 74 61 62 6c 65 20 4c 65 78  ue(immutable Lex
17a0: 50 6f 73 69 74 69 6f 6e 20 70 6f 73 2c 20 73 74  Position pos, st
17b0: 72 69 6e 67 20 6c 61 79 2c 20 56 61 6c 75 65 5b  ring lay, Value[
17c0: 5d 20 61 72 67 73 29 7b 0d 0a 09 09 09 09 2f 2f  ] args){......//
17d0: 20 54 4f 44 4f 3a 20 6f 6e 6c 79 20 61 75 74 6f   TODO: only auto
17e0: 20 72 61 69 73 65 64 20 6f 6e 65 73 20 6e 65 65   raised ones nee
17f0: 64 20 6d 65 6d 6f 3f 20 6e 6f 3f 0d 0a 09 09 09  d memo? no?.....
1800: 09 2f 2f 20 61 75 74 6f 20 6d 65 6d 6f 69 7a 61  .// auto memoiza
1810: 74 69 6f 6e 0d 0a 09 09 09 09 69 66 28 20 6c 61  tion......if( la
1820: 79 20 21 3d 20 22 40 76 22 20 26 26 20 6c 61 79  y != "@v" && lay
1830: 20 21 3d 20 22 40 6d 61 63 72 6f 22 20 29 0d 0a   != "@macro" )..
1840: 09 09 09 09 7b 0d 0a 09 09 09 09 09 69 66 28 20  ....{.......if( 
1850: 61 75 74 6f 20 6d 65 6d 6f 6c 61 79 20 3d 20 6c  auto memolay = l
1860: 61 79 20 69 6e 20 6d 65 6d 6f 20 29 0d 0a 09 09  ay in memo )....
1870: 09 09 09 09 69 66 28 20 61 75 74 6f 20 70 76 20  ....if( auto pv 
1880: 3d 20 61 72 67 73 20 69 6e 20 2a 6d 65 6d 6f 6c  = args in *memol
1890: 61 79 20 29 0d 0a 09 09 09 09 09 09 09 72 65 74  ay ).........ret
18a0: 75 72 6e 20 2a 70 76 3b 0d 0a 09 09 09 09 09 6d  urn *pv;.......m
18b0: 65 6d 6f 5b 6c 61 79 5d 5b 61 72 67 73 5d 20 3d  emo[lay][args] =
18c0: 20 28 63 61 73 74 28 46 75 6e 56 61 6c 75 65 29   (cast(FunValue)
18d0: 63 74 78 2e 67 65 74 28 6c 61 79 2c 20 22 28 73  ctx.get(lay, "(s
18e0: 79 73 74 65 6d 29 22 2c 20 65 2e 70 6f 73 29 29  ystem)", e.pos))
18f0: 2e 63 61 6c 6c 28 65 2e 70 6f 73 2c 20 22 40 76  .call(e.pos, "@v
1900: 22 2c 20 0d 0a 09 09 09 09 09 09 5b 6e 65 77 20  ", ........[new 
1910: 55 6e 64 56 61 6c 75 65 5d 0d 0a 09 09 09 09 09  UndValue].......
1920: 29 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 09 09 0a  );......}.......
1930: 09 09 09 09 69 66 28 20 65 2e 70 61 72 61 6d 73  ....if( e.params
1940: 2e 6c 65 6e 67 74 68 20 21 3d 20 61 72 67 73 2e  .length != args.
1950: 6c 65 6e 67 74 68 20 29 0a 09 09 09 09 09 74 68  length )......th
1960: 72 6f 77 20 67 65 6e 65 78 21 52 75 6e 74 69 6d  row genex!Runtim
1970: 65 45 78 63 65 70 74 69 6f 6e 28 65 2e 70 6f 73  eException(e.pos
1980: 2c 20 73 70 72 69 6e 74 66 21 22 41 72 67 75 6d  , sprintf!"Argum
1990: 65 6e 74 20 4e 75 6d 62 65 72 20 4d 69 73 6d 61  ent Number Misma
19a0: 74 63 68 20 28 25 64 20 72 65 71 75 69 72 65 64  tch (%d required
19b0: 20 62 75 74 20 25 64 20 67 69 76 65 6e 29 22 0a   but %d given)".
19c0: 09 09 09 09 09 09 28 65 2e 70 61 72 61 6d 73 2e  ......(e.params.
19d0: 6c 65 6e 67 74 68 2c 20 61 72 67 73 2e 6c 65 6e  length, args.len
19e0: 67 74 68 29 29 3b 0a 09 09 09 09 54 61 62 6c 65  gth));.....Table
19f0: 20 63 74 78 4e 65 6f 20 3d 20 6e 65 77 20 54 61   ctxNeo = new Ta
1a00: 62 6c 65 28 63 74 78 2c 20 54 61 62 6c 65 2e 4b  ble(ctx, Table.K
1a10: 69 6e 64 2e 4e 6f 74 50 72 6f 70 61 67 61 74 65  ind.NotPropagate
1a20: 53 65 74 29 3b 0a 09 09 09 09 66 6f 72 65 61 63  Set);.....foreac
1a30: 68 28 69 2c 70 3b 20 65 2e 70 61 72 61 6d 73 29  h(i,p; e.params)
1a40: 0a 09 09 09 09 09 63 74 78 4e 65 6f 2e 73 65 74  ......ctxNeo.set
1a50: 28 70 2e 6e 61 6d 65 2c 20 6c 61 79 2c 20 61 72  (p.name, lay, ar
1a60: 67 73 5b 69 5d 29 3b 0d 0a 0d 0a 09 09 09 09 2f  gs[i]);......../
1a70: 2f 20 40 6d 61 63 72 6f 20 72 75 6e 21 21 21 0d  / @macro run!!!.
1a80: 0a 09 09 09 09 69 66 28 20 6c 61 79 20 3d 3d 20  .....if( lay == 
1a90: 22 40 6d 61 63 72 6f 22 20 29 0d 0a 09 09 09 09  "@macro" )......
1aa0: 09 72 65 74 75 72 6e 20 6d 61 63 72 6f 45 76 61  .return macroEva
1ab0: 6c 28 65 2e 66 75 6e 62 6f 64 79 2c 20 63 74 78  l(e.funbody, ctx
1ac0: 4e 65 6f 2c 20 66 61 6c 73 65 29 3b 0d 0a 09 09  Neo, false);....
1ad0: 09 09 69 66 28 20 6d 61 63 72 6f 4d 65 6d 6f 20  ..if( macroMemo 
1ae0: 69 73 20 6e 75 6c 6c 20 29 0d 0a 09 09 09 09 09  is null ).......
1af0: 6d 61 63 72 6f 4d 65 6d 6f 20 3d 20 74 61 62 6c  macroMemo = tabl
1b00: 65 54 6f 41 53 54 28 22 40 76 22 2c 6d 61 63 72  eToAST("@v",macr
1b10: 6f 45 76 61 6c 28 65 2e 66 75 6e 62 6f 64 79 2c  oEval(e.funbody,
1b20: 20 63 74 78 4e 65 6f 2c 20 74 72 75 65 29 29 3b   ctxNeo, true));
1b30: 0d 0a 09 09 09 09 61 75 74 6f 20 76 20 3d 20 65  ......auto v = e
1b40: 76 61 6c 28 6d 61 63 72 6f 4d 65 6d 6f 2c 20 63  val(macroMemo, c
1b50: 74 78 4e 65 6f 2c 20 74 72 75 65 2c 20 6c 61 79  txNeo, true, lay
1b60: 29 3b 0d 0a 0d 0a 09 09 09 09 2f 2f 61 75 74 6f  );........//auto
1b70: 20 76 20 3d 20 65 76 61 6c 28 65 2e 66 75 6e 62   v = eval(e.funb
1b80: 6f 64 79 2c 20 63 74 78 4e 65 6f 2c 20 74 72 75  ody, ctxNeo, tru
1b90: 65 2c 20 6c 61 79 29 3b 0d 0a 09 09 09 09 2f 2f  e, lay);......//
1ba0: 20 61 75 74 6f 20 6d 65 6d 6f 69 7a 61 74 69 6f   auto memoizatio
1bb0: 6e 0d 0a 09 09 09 09 69 66 28 20 6c 61 79 20 21  n......if( lay !
1bc0: 3d 20 22 40 76 22 20 26 26 20 6c 61 79 20 21 3d  = "@v" && lay !=
1bd0: 20 22 40 6d 61 63 72 6f 22 20 29 0d 0a 09 09 09   "@macro" ).....
1be0: 09 09 6d 65 6d 6f 5b 6c 61 79 5d 5b 61 72 67 73  ..memo[lay][args
1bf0: 5d 20 3d 20 76 3b 0d 0a 09 09 09 09 72 65 74 75  ] = v;......retu
1c00: 72 6e 20 76 3b 0a 09 09 09 7d 29 3b 0a 09 09 7d  rn v;....});...}
1c10: 2c 0d 0a 09 09 64 65 6c 65 67 61 74 65 20 56 61  ,....delegate Va
1c20: 6c 75 65 20 28 41 53 54 20 65 29 0d 0a 09 09 7b  lue (AST e)....{
1c30: 0a 09 09 09 74 68 72 6f 77 20 67 65 6e 65 78 21  ....throw genex!
1c40: 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e  RuntimeException
1c50: 28 65 2e 70 6f 73 2c 20 73 70 72 69 6e 74 66 21  (e.pos, sprintf!
1c60: 22 55 6e 6b 6e 6f 77 6e 20 4b 69 6e 64 20 6f 66  "Unknown Kind of
1c70: 20 45 78 70 72 65 73 73 69 6f 6e 20 25 73 22 28   Expression %s"(
1c80: 74 79 70 65 69 64 28 65 29 29 29 3b 0d 0a 09 09  typeid(e)));....
1c90: 7d 0d 0a 09 29 3b 0a 7d 0a 0d 0a 2f 2f 20 5b 54  }...);.}...// [T
1ca0: 4f 44 4f 5d 20 4f 70 74 69 6d 69 7a 61 74 69 6f  ODO] Optimizatio
1cb0: 6e 0d 0a 56 61 6c 75 65 20 6d 61 63 72 6f 45 76  n..Value macroEv
1cc0: 61 6c 28 41 53 54 20 65 2c 20 54 61 62 6c 65 20  al(AST e, Table 
1cd0: 63 74 78 2c 20 62 6f 6f 6c 20 41 6c 77 61 79 73  ctx, bool Always
1ce0: 4d 61 63 72 6f 29 0d 0a 7b 0d 0a 09 4c 61 79 65  Macro)..{...Laye
1cf0: 72 20 74 68 65 4c 61 79 65 72 20 3d 20 22 40 76  r theLayer = "@v
1d00: 22 3b 0d 0a 0d 0a 09 54 61 62 6c 65 20 70 6f 73  ";.....Table pos
1d10: 20 3d 20 6e 65 77 20 54 61 62 6c 65 3b 0d 0a 09   = new Table;...
1d20: 70 6f 73 2e 73 65 74 28 22 66 69 6c 65 6e 61 6d  pos.set("filenam
1d30: 65 22 2c 20 74 68 65 4c 61 79 65 72 2c 20 6e 65  e", theLayer, ne
1d40: 77 20 53 74 72 56 61 6c 75 65 28 65 2e 70 6f 73  w StrValue(e.pos
1d50: 2e 66 69 6c 65 6e 61 6d 65 29 29 3b 0d 0a 09 70  .filename));...p
1d60: 6f 73 2e 73 65 74 28 22 6c 69 6e 65 6e 6f 22 2c  os.set("lineno",
1d70: 20 20 20 74 68 65 4c 61 79 65 72 2c 20 6e 65 77     theLayer, new
1d80: 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74   IntValue(BigInt
1d90: 28 65 2e 70 6f 73 2e 6c 69 6e 65 6e 6f 29 29 29  (e.pos.lineno)))
1da0: 3b 0d 0a 09 70 6f 73 2e 73 65 74 28 22 63 6f 6c  ;...pos.set("col
1db0: 75 6d 6e 22 2c 20 20 20 74 68 65 4c 61 79 65 72  umn",   theLayer
1dc0: 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42  , new IntValue(B
1dd0: 69 67 49 6e 74 28 65 2e 70 6f 73 2e 63 6f 6c 75  igInt(e.pos.colu
1de0: 6d 6e 29 29 29 3b 0d 0a 09 72 65 74 75 72 6e 20  mn)));...return 
1df0: 65 2e 6d 61 74 63 68 28 0d 0a 09 09 28 53 74 72  e.match(....(Str
1e00: 4c 69 74 65 72 61 6c 20 65 29 0d 0a 09 09 7b 0d  Literal e)....{.
1e10: 0a 09 09 09 54 61 62 6c 65 20 74 20 3d 20 6e 65  ....Table t = ne
1e20: 77 20 54 61 62 6c 65 3b 0d 0a 09 09 09 74 2e 73  w Table;.....t.s
1e30: 65 74 28 22 70 6f 73 22 2c 20 20 74 68 65 4c 61  et("pos",  theLa
1e40: 79 65 72 2c 20 70 6f 73 29 3b 0d 0a 09 09 09 74  yer, pos);.....t
1e50: 2e 73 65 74 28 22 69 73 22 2c 20 20 20 74 68 65  .set("is",   the
1e60: 4c 61 79 65 72 2c 20 6e 65 77 20 53 74 72 56 61  Layer, new StrVa
1e70: 6c 75 65 28 22 73 74 72 22 29 29 3b 0d 0a 09 09  lue("str"));....
1e80: 09 74 2e 73 65 74 28 22 64 61 74 61 22 2c 20 74  .t.set("data", t
1e90: 68 65 4c 61 79 65 72 2c 20 6e 65 77 20 53 74 72  heLayer, new Str
1ea0: 56 61 6c 75 65 28 65 2e 64 61 74 61 29 29 3b 0d  Value(e.data));.
1eb0: 0a 09 09 09 72 65 74 75 72 6e 20 74 3b 0d 0a 09  ....return t;...
1ec0: 09 7d 2c 0d 0a 09 09 28 49 6e 74 4c 69 74 65 72  .},....(IntLiter
1ed0: 61 6c 20 65 29 0d 0a 09 09 7b 0d 0a 09 09 09 54  al e)....{.....T
1ee0: 61 62 6c 65 20 74 20 3d 20 6e 65 77 20 54 61 62  able t = new Tab
1ef0: 6c 65 3b 0d 0a 09 09 09 74 2e 73 65 74 28 22 70  le;.....t.set("p
1f00: 6f 73 22 2c 20 20 74 68 65 4c 61 79 65 72 2c 20  os",  theLayer, 
1f10: 70 6f 73 29 3b 0d 0a 09 09 09 74 2e 73 65 74 28  pos);.....t.set(
1f20: 22 69 73 22 2c 20 20 20 74 68 65 4c 61 79 65 72  "is",   theLayer
1f30: 2c 20 6e 65 77 20 53 74 72 56 61 6c 75 65 28 22  , new StrValue("
1f40: 69 6e 74 22 29 29 3b 0d 0a 09 09 09 74 2e 73 65  int"));.....t.se
1f50: 74 28 22 64 61 74 61 22 2c 20 74 68 65 4c 61 79  t("data", theLay
1f60: 65 72 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  er, new IntValue
1f70: 28 65 2e 64 61 74 61 29 29 3b 0d 0a 09 09 09 72  (e.data));.....r
1f80: 65 74 75 72 6e 20 74 3b 0d 0a 09 09 7d 2c 0d 0a  eturn t;....},..
1f90: 09 09 28 56 61 72 45 78 70 72 65 73 73 69 6f 6e  ..(VarExpression
1fa0: 20 65 29 0d 0a 09 09 7b 0d 0a 09 09 09 74 72 79   e)....{.....try
1fb0: 20 7b 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 63   {......return c
1fc0: 74 78 2e 67 65 74 28 65 2e 76 61 72 2c 20 22 40  tx.get(e.var, "@
1fd0: 6d 61 63 72 6f 22 2c 20 65 2e 70 6f 73 29 3b 0d  macro", e.pos);.
1fe0: 0a 09 09 09 7d 20 63 61 74 63 68 28 20 54 68 72  ....} catch( Thr
1ff0: 6f 77 61 62 6c 65 20 29 20 7b 2f 2f 20 5b 54 4f  owable ) {// [TO
2000: 44 4f 5d 20 6d 6f 72 65 20 70 72 65 63 69 65 73  DO] more precies
2010: 2e 2e 2e 0d 0a 09 09 09 09 54 61 62 6c 65 20 74  .........Table t
2020: 20 3d 20 6e 65 77 20 54 61 62 6c 65 3b 0d 0a 09   = new Table;...
2030: 09 09 09 74 2e 73 65 74 28 22 70 6f 73 22 2c 20  ...t.set("pos", 
2040: 20 74 68 65 4c 61 79 65 72 2c 20 70 6f 73 29 3b   theLayer, pos);
2050: 0d 0a 09 09 09 09 74 2e 73 65 74 28 22 69 73 22  ......t.set("is"
2060: 2c 20 20 20 74 68 65 4c 61 79 65 72 2c 20 6e 65  ,   theLayer, ne
2070: 77 20 53 74 72 56 61 6c 75 65 28 22 76 61 72 22  w StrValue("var"
2080: 29 29 3b 0d 0a 09 09 09 09 74 2e 73 65 74 28 22  ));......t.set("
2090: 6e 61 6d 65 22 2c 20 74 68 65 4c 61 79 65 72 2c  name", theLayer,
20a0: 20 6e 65 77 20 53 74 72 56 61 6c 75 65 28 65 2e   new StrValue(e.
20b0: 76 61 72 29 29 3b 0d 0a 09 09 09 09 72 65 74 75  var));......retu
20c0: 72 6e 20 63 61 73 74 28 56 61 6c 75 65 29 74 3b  rn cast(Value)t;
20d0: 0d 0a 09 09 09 7d 0d 0a 09 09 7d 2c 0d 0a 09 09  .....}....},....
20e0: 28 4c 61 79 65 72 65 64 45 78 70 72 65 73 73 69  (LayeredExpressi
20f0: 6f 6e 20 65 29 0d 0a 09 09 7b 0d 0a 09 09 09 69  on e)....{.....i
2100: 66 28 20 41 6c 77 61 79 73 4d 61 63 72 6f 20 29  f( AlwaysMacro )
2110: 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 54 61 62 6c  .....{......Tabl
2120: 65 20 74 20 3d 20 6e 65 77 20 54 61 62 6c 65 3b  e t = new Table;
2130: 0d 0a 09 09 09 09 74 2e 73 65 74 28 22 70 6f 73  ......t.set("pos
2140: 22 2c 20 20 74 68 65 4c 61 79 65 72 2c 20 70 6f  ",  theLayer, po
2150: 73 29 3b 0d 0a 09 09 09 09 74 2e 73 65 74 28 22  s);......t.set("
2160: 69 73 22 2c 20 20 20 74 68 65 4c 61 79 65 72 2c  is",   theLayer,
2170: 20 6e 65 77 20 53 74 72 56 61 6c 75 65 28 22 6c   new StrValue("l
2180: 61 79 22 29 29 3b 0d 0a 09 09 09 09 74 2e 73 65  ay"));......t.se
2190: 74 28 22 6c 61 79 65 72 22 2c 20 20 20 74 68 65  t("layer",   the
21a0: 4c 61 79 65 72 2c 20 6e 65 77 20 53 74 72 56 61  Layer, new StrVa
21b0: 6c 75 65 28 65 2e 6c 61 79 29 29 3b 0d 0a 09 09  lue(e.lay));....
21c0: 09 09 74 2e 73 65 74 28 22 65 78 70 72 22 2c 20  ..t.set("expr", 
21d0: 74 68 65 4c 61 79 65 72 2c 20 6d 61 63 72 6f 45  theLayer, macroE
21e0: 76 61 6c 28 65 2e 65 78 70 72 2c 63 74 78 2c 41  val(e.expr,ctx,A
21f0: 6c 77 61 79 73 4d 61 63 72 6f 29 29 3b 0d 0a 09  lwaysMacro));...
2200: 09 09 09 72 65 74 75 72 6e 20 63 61 73 74 28 56  ...return cast(V
2210: 61 6c 75 65 29 74 3b 0d 0a 09 09 09 7d 0d 0a 09  alue)t;.....}...
2220: 09 09 65 6c 73 65 0d 0a 09 09 09 7b 0d 0a 09 09  ..else.....{....
2230: 09 09 72 65 74 75 72 6e 20 65 76 61 6c 28 65 2e  ..return eval(e.
2240: 65 78 70 72 2c 20 63 74 78 2c 20 74 72 75 65 2c  expr, ctx, true,
2250: 20 65 2e 6c 61 79 29 3b 0d 0a 09 09 09 7d 0d 0a   e.lay);.....}..
2260: 09 09 7d 2c 0d 0a 09 09 28 4c 65 74 45 78 70 72  ..},....(LetExpr
2270: 65 73 73 69 6f 6e 20 65 29 0d 0a 09 09 7b 0d 0a  ession e)....{..
2280: 09 09 09 54 61 62 6c 65 20 74 20 3d 20 6e 65 77  ...Table t = new
2290: 20 54 61 62 6c 65 3b 0d 0a 09 09 09 74 2e 73 65   Table;.....t.se
22a0: 74 28 22 70 6f 73 22 2c 20 20 74 68 65 4c 61 79  t("pos",  theLay
22b0: 65 72 2c 20 70 6f 73 29 3b 0d 0a 09 09 09 74 2e  er, pos);.....t.
22c0: 73 65 74 28 22 69 73 22 2c 20 20 20 74 68 65 4c  set("is",   theL
22d0: 61 79 65 72 2c 20 6e 65 77 20 53 74 72 56 61 6c  ayer, new StrVal
22e0: 75 65 28 22 6c 65 74 22 29 29 3b 0d 0a 09 09 09  ue("let"));.....
22f0: 74 2e 73 65 74 28 22 6e 61 6d 65 22 2c 20 74 68  t.set("name", th
2300: 65 4c 61 79 65 72 2c 20 6e 65 77 20 53 74 72 56  eLayer, new StrV
2310: 61 6c 75 65 28 65 2e 76 61 72 29 29 3b 0d 0a 09  alue(e.var));...
2320: 09 09 74 2e 73 65 74 28 22 69 6e 69 74 22 2c 20  ..t.set("init", 
2330: 74 68 65 4c 61 79 65 72 2c 20 6d 61 63 72 6f 45  theLayer, macroE
2340: 76 61 6c 28 65 2e 69 6e 69 74 2c 63 74 78 2c 41  val(e.init,ctx,A
2350: 6c 77 61 79 73 4d 61 63 72 6f 29 29 3b 0d 0a 09  lwaysMacro));...
2360: 09 09 74 2e 73 65 74 28 22 65 78 70 72 22 2c 20  ..t.set("expr", 
2370: 74 68 65 4c 61 79 65 72 2c 20 6d 61 63 72 6f 45  theLayer, macroE
2380: 76 61 6c 28 65 2e 65 78 70 72 2c 63 74 78 2c 41  val(e.expr,ctx,A
2390: 6c 77 61 79 73 4d 61 63 72 6f 29 29 3b 0d 0a 09  lwaysMacro));...
23a0: 09 09 72 65 74 75 72 6e 20 74 3b 0d 0a 09 09 7d  ..return t;....}
23b0: 2c 0d 0a 09 09 28 46 75 6e 63 61 6c 6c 45 78 70  ,....(FuncallExp
23c0: 72 65 73 73 69 6f 6e 20 65 29 0d 0a 09 09 7b 0d  ression e)....{.
23d0: 0a 09 09 09 56 61 6c 75 65 20 5f 66 20 3d 20 6d  ....Value _f = m
23e0: 61 63 72 6f 45 76 61 6c 28 65 2e 66 75 6e 2c 63  acroEval(e.fun,c
23f0: 74 78 2c 41 6c 77 61 79 73 4d 61 63 72 6f 29 3b  tx,AlwaysMacro);
2400: 0d 0a 0d 0a 09 09 09 2f 2f 20 63 6f 70 79 20 26  .......// copy &
2410: 20 70 61 73 65 20 66 72 6f 6d 20 6e 6f 72 6d 61   pase from norma
2420: 6c 20 65 76 61 6c 0d 0a 09 09 09 2f 2f 20 5b 54  l eval.....// [T
2430: 4f 44 4f 5d 20 73 79 6e 63 20 77 69 74 68 20 40  ODO] sync with @
2440: 6c 61 79 65 72 64 20 70 61 72 61 6d 65 74 65 72  layerd parameter
2450: 73 2e 0d 0a 09 09 09 69 66 28 20 61 75 74 6f 20  s......if( auto 
2460: 66 20 3d 20 63 61 73 74 28 46 75 6e 56 61 6c 75  f = cast(FunValu
2470: 65 29 5f 66 20 29 20 7b 0d 0a 09 09 09 09 56 61  e)_f ) {......Va
2480: 6c 75 65 5b 5d 20 61 72 67 73 3b 0d 0a 09 09 09  lue[] args;.....
2490: 09 66 6f 72 65 61 63 68 28 61 3b 20 65 2e 61 72  .foreach(a; e.ar
24a0: 67 73 29 0d 0a 09 09 09 09 09 61 72 67 73 20 7e  gs).......args ~
24b0: 3d 20 6d 61 63 72 6f 45 76 61 6c 28 61 2c 20 63  = macroEval(a, c
24c0: 74 78 2c 20 41 6c 77 61 79 73 4d 61 63 72 6f 29  tx, AlwaysMacro)
24d0: 3b 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 66 2e  ;......return f.
24e0: 63 61 6c 6c 28 65 2e 70 6f 73 2c 20 22 40 6d 61  call(e.pos, "@ma
24f0: 63 72 6f 22 2c 20 61 72 67 73 29 3b 20 2f 2f 20  cro", args); // 
2500: 65 78 70 6c 69 63 69 74 20 40 6d 61 63 72 6f 20  explicit @macro 
2510: 69 73 20 74 68 65 20 62 65 73 74 3f 3f 3f 0d 0a  is the best???..
2520: 09 09 09 7d 0d 0a 09 09 09 0d 0a 09 09 09 54 61  ...}..........Ta
2530: 62 6c 65 20 74 20 3d 20 6e 65 77 20 54 61 62 6c  ble t = new Tabl
2540: 65 3b 0d 0a 09 09 09 74 2e 73 65 74 28 22 70 6f  e;.....t.set("po
2550: 73 22 2c 20 20 74 68 65 4c 61 79 65 72 2c 20 70  s",  theLayer, p
2560: 6f 73 29 3b 0d 0a 09 09 09 74 2e 73 65 74 28 22  os);.....t.set("
2570: 69 73 22 2c 20 20 20 74 68 65 4c 61 79 65 72 2c  is",   theLayer,
2580: 20 6e 65 77 20 53 74 72 56 61 6c 75 65 28 22 61   new StrValue("a
2590: 70 70 22 29 29 3b 0d 0a 09 09 09 74 2e 73 65 74  pp"));.....t.set
25a0: 28 22 66 75 6e 22 2c 20 20 74 68 65 4c 61 79 65  ("fun",  theLaye
25b0: 72 2c 20 5f 66 29 3b 0d 0a 09 09 09 54 61 62 6c  r, _f);.....Tabl
25c0: 65 20 61 72 67 73 20 3d 20 6e 65 77 20 54 61 62  e args = new Tab
25d0: 6c 65 3b 0d 0a 09 09 09 66 6f 72 65 61 63 68 5f  le;.....foreach_
25e0: 72 65 76 65 72 73 65 28 61 3b 20 65 2e 61 72 67  reverse(a; e.arg
25f0: 73 29 20 7b 0d 0a 09 09 09 09 54 61 62 6c 65 20  s) {......Table 
2600: 63 6f 6e 73 20 3d 20 6e 65 77 20 54 61 62 6c 65  cons = new Table
2610: 3b 0d 0a 09 09 09 09 63 6f 6e 73 2e 73 65 74 28  ;......cons.set(
2620: 22 63 61 72 22 2c 74 68 65 4c 61 79 65 72 2c 6d  "car",theLayer,m
2630: 61 63 72 6f 45 76 61 6c 28 61 2c 63 74 78 2c 41  acroEval(a,ctx,A
2640: 6c 77 61 79 73 4d 61 63 72 6f 29 29 3b 0d 0a 09  lwaysMacro));...
2650: 09 09 09 63 6f 6e 73 2e 73 65 74 28 22 63 64 72  ...cons.set("cdr
2660: 22 2c 74 68 65 4c 61 79 65 72 2c 61 72 67 73 29  ",theLayer,args)
2670: 3b 0d 0a 09 09 09 09 61 72 67 73 20 3d 20 63 6f  ;......args = co
2680: 6e 73 3b 0d 0a 09 09 09 7d 0d 0a 09 09 09 74 2e  ns;.....}.....t.
2690: 73 65 74 28 22 61 72 67 22 2c 20 74 68 65 4c 61  set("arg", theLa
26a0: 79 65 72 2c 20 61 72 67 73 29 3b 0d 0a 09 09 09  yer, args);.....
26b0: 72 65 74 75 72 6e 20 63 61 73 74 28 56 61 6c 75  return cast(Valu
26c0: 65 29 74 3b 0d 0a 09 09 7d 2c 0d 0a 09 09 28 46  e)t;....},....(F
26d0: 75 6e 4c 69 74 65 72 61 6c 20 65 29 0d 0a 09 09  unLiteral e)....
26e0: 7b 0d 0a 09 09 09 54 61 62 6c 65 20 74 20 3d 20  {.....Table t = 
26f0: 6e 65 77 20 54 61 62 6c 65 3b 0d 0a 09 09 09 74  new Table;.....t
2700: 2e 73 65 74 28 22 70 6f 73 22 2c 20 20 20 74 68  .set("pos",   th
2710: 65 4c 61 79 65 72 2c 20 70 6f 73 29 3b 0d 0a 09  eLayer, pos);...
2720: 09 09 74 2e 73 65 74 28 22 69 73 22 2c 20 20 20  ..t.set("is",   
2730: 20 74 68 65 4c 61 79 65 72 2c 20 6e 65 77 20 53   theLayer, new S
2740: 74 72 56 61 6c 75 65 28 22 66 75 6e 22 29 29 3b  trValue("fun"));
2750: 0d 0a 09 09 09 74 2e 73 65 74 28 22 62 6f 64 79  .....t.set("body
2760: 22 2c 20 20 74 68 65 4c 61 79 65 72 2c 20 6d 61  ",  theLayer, ma
2770: 63 72 6f 45 76 61 6c 28 65 2e 66 75 6e 62 6f 64  croEval(e.funbod
2780: 79 2c 63 74 78 2c 41 6c 77 61 79 73 4d 61 63 72  y,ctx,AlwaysMacr
2790: 6f 29 29 3b 0d 0a 09 09 09 54 61 62 6c 65 20 70  o));.....Table p
27a0: 61 72 61 6d 20 3d 20 6e 65 77 20 54 61 62 6c 65  aram = new Table
27b0: 3b 0d 0a 09 09 09 66 6f 72 65 61 63 68 5f 72 65  ;.....foreach_re
27c0: 76 65 72 73 65 28 70 3b 20 65 2e 70 61 72 61 6d  verse(p; e.param
27d0: 73 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 54 61  s).....{......Ta
27e0: 62 6c 65 20 63 6f 6e 73 20 3d 20 6e 65 77 20 54  ble cons = new T
27f0: 61 62 6c 65 3b 0d 0a 09 09 09 09 54 61 62 6c 65  able;......Table
2800: 20 6b 76 20 3d 20 6e 65 77 20 54 61 62 6c 65 3b   kv = new Table;
2810: 0d 0a 09 09 09 09 6b 76 2e 73 65 74 28 22 6e 61  ......kv.set("na
2820: 6d 65 22 2c 20 74 68 65 4c 61 79 65 72 2c 20 6e  me", theLayer, n
2830: 65 77 20 53 74 72 56 61 6c 75 65 28 70 2e 6e 61  ew StrValue(p.na
2840: 6d 65 29 29 3b 0d 0a 09 09 09 09 66 6f 72 65 61  me));......forea
2850: 63 68 5f 72 65 76 65 72 73 65 28 6c 61 79 3b 20  ch_reverse(lay; 
2860: 70 2e 6c 61 79 65 72 73 29 0d 0a 09 09 09 09 7b  p.layers)......{
2870: 0d 0a 09 09 09 09 09 54 61 62 6c 65 20 63 6f 6e  .......Table con
2880: 73 32 20 3d 20 6e 65 77 20 54 61 62 6c 65 3b 0d  s2 = new Table;.
2890: 0a 09 09 09 09 09 63 6f 6e 73 32 2e 73 65 74 28  ......cons2.set(
28a0: 22 63 61 72 22 2c 20 74 68 65 4c 61 79 65 72 2c  "car", theLayer,
28b0: 20 6e 65 77 20 53 74 72 56 61 6c 75 65 28 6c 61   new StrValue(la
28c0: 79 29 29 3b 0d 0a 09 09 09 09 09 63 6f 6e 73 32  y));.......cons2
28d0: 2e 73 65 74 28 22 63 64 72 22 2c 20 74 68 65 4c  .set("cdr", theL
28e0: 61 79 65 72 2c 20 6b 76 29 3b 0d 0a 09 09 09 09  ayer, kv);......
28f0: 09 6b 76 20 3d 20 63 6f 6e 73 32 3b 0d 0a 09 09  .kv = cons2;....
2900: 09 09 7d 0d 0a 09 09 09 09 63 6f 6e 73 2e 73 65  ..}......cons.se
2910: 74 28 22 63 61 72 22 2c 20 74 68 65 4c 61 79 65  t("car", theLaye
2920: 72 2c 20 6b 76 29 3b 0d 0a 09 09 09 09 63 6f 6e  r, kv);......con
2930: 73 2e 73 65 74 28 22 63 64 72 22 2c 20 74 68 65  s.set("cdr", the
2940: 4c 61 79 65 72 2c 20 70 61 72 61 6d 29 3b 0d 0a  Layer, param);..
2950: 09 09 09 09 70 61 72 61 6d 20 3d 20 63 6f 6e 73  ....param = cons
2960: 3b 0d 0a 09 09 09 7d 0d 0a 09 09 09 74 2e 73 65  ;.....}.....t.se
2970: 74 28 22 70 61 72 61 6d 22 2c 20 74 68 65 4c 61  t("param", theLa
2980: 79 65 72 2c 20 70 61 72 61 6d 29 3b 0d 0a 09 09  yer, param);....
2990: 09 72 65 74 75 72 6e 20 74 3b 0d 0a 09 09 7d 2c  .return t;....},
29a0: 0d 0a 09 09 64 65 6c 65 67 61 74 65 20 56 61 6c  ....delegate Val
29b0: 75 65 20 28 41 53 54 20 65 29 0d 0a 09 09 7b 0d  ue (AST e)....{.
29c0: 0a 09 09 09 74 68 72 6f 77 20 67 65 6e 65 78 21  ....throw genex!
29d0: 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e  RuntimeException
29e0: 28 65 2e 70 6f 73 2c 20 73 70 72 69 6e 74 66 21  (e.pos, sprintf!
29f0: 22 55 6e 6b 6e 6f 77 6e 20 4b 69 6e 64 20 6f 66  "Unknown Kind of
2a00: 20 45 78 70 72 65 73 73 69 6f 6e 20 25 73 22 28   Expression %s"(
2a10: 74 79 70 65 69 64 28 65 29 29 29 3b 0d 0a 09 09  typeid(e)));....
2a20: 7d 0d 0a 09 29 3b 0d 0a 7d 0d 0a 0d 0a 75 6e 69  }...);..}....uni
2a30: 74 74 65 73 74 0a 7b 0d 0a 09 61 75 74 6f 20 72  ttest.{...auto r
2a40: 20 3d 20 61 73 73 65 72 74 5f 6e 6f 74 68 72 6f   = assert_nothro
2a50: 77 28 20 65 76 61 6c 53 74 72 69 6e 67 28 60 76  w( evalString(`v
2a60: 61 72 20 78 20 3d 20 32 31 3b 20 78 20 2b 20 78  ar x = 21; x + x
2a70: 2a 78 3b 60 29 20 29 3b 0a 09 61 73 73 65 72 74  *x;`) );..assert
2a80: 5f 65 71 28 20 72 2e 76 61 6c 2c 20 6e 65 77 20  _eq( r.val, new 
2a90: 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28  IntValue(BigInt(
2aa0: 32 31 2b 32 31 2a 32 31 29 29 20 29 3b 0a 09 61  21+21*21)) );..a
2ab0: 73 73 65 72 74 5f 65 71 28 20 72 2e 63 74 78 2e  ssert_eq( r.ctx.
2ac0: 67 65 74 28 22 78 22 2c 22 40 76 22 29 2c 20 6e  get("x","@v"), n
2ad0: 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49  ew IntValue(BigI
2ae0: 6e 74 28 32 31 29 29 20 29 3b 0a 09 61 73 73 65  nt(21)) );..asse
2af0: 72 74 5f 6e 6f 74 68 72 6f 77 28 20 72 2e 63 74  rt_nothrow( r.ct
2b00: 78 2e 67 65 74 28 22 78 22 2c 22 40 76 22 29 20  x.get("x","@v") 
2b10: 29 3b 0a 09 61 73 73 65 72 74 5f 74 68 72 6f 77  );..assert_throw
2b20: 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f  !RuntimeExceptio
2b30: 6e 28 20 72 2e 63 74 78 2e 67 65 74 28 22 79 22  n( r.ctx.get("y"
2b40: 2c 22 40 76 22 29 20 29 3b 0a 7d 0a 75 6e 69 74  ,"@v") );.}.unit
2b50: 74 65 73 74 0d 0a 7b 0d 0a 09 61 75 74 6f 20 72  test..{...auto r
2b60: 20 3d 20 61 73 73 65 72 74 5f 6e 6f 74 68 72 6f   = assert_nothro
2b70: 77 28 20 65 76 61 6c 53 74 72 69 6e 67 28 60 76  w( evalString(`v
2b80: 61 72 20 78 20 3d 20 32 31 3b 20 76 61 72 20 78  ar x = 21; var x
2b90: 20 3d 20 78 20 2b 20 78 2a 78 3b 60 29 20 29 3b   = x + x*x;`) );
2ba0: 0d 0a 09 61 73 73 65 72 74 5f 65 71 28 20 72 2e  ...assert_eq( r.
2bb0: 76 61 6c 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75  val, new IntValu
2bc0: 65 28 42 69 67 49 6e 74 28 32 31 2b 32 31 2a 32  e(BigInt(21+21*2
2bd0: 31 29 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 5f  1)) );...assert_
2be0: 65 71 28 20 72 2e 63 74 78 2e 67 65 74 28 22 78  eq( r.ctx.get("x
2bf0: 22 2c 22 40 76 22 29 2c 20 6e 65 77 20 49 6e 74  ","@v"), new Int
2c00: 56 61 6c 75 65 28 42 69 67 49 6e 74 28 32 31 2b  Value(BigInt(21+
2c10: 32 31 2a 32 31 29 29 20 29 3b 0d 0a 09 61 73 73  21*21)) );...ass
2c20: 65 72 74 5f 6e 6f 74 68 72 6f 77 28 20 72 2e 63  ert_nothrow( r.c
2c30: 74 78 2e 67 65 74 28 22 78 22 2c 22 40 76 22 29  tx.get("x","@v")
2c40: 20 29 3b 0d 0a 09 61 73 73 65 72 74 5f 74 68 72   );...assert_thr
2c50: 6f 77 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74  ow!RuntimeExcept
2c60: 69 6f 6e 28 20 72 2e 63 74 78 2e 67 65 74 28 22  ion( r.ctx.get("
2c70: 79 22 2c 22 40 76 22 29 20 29 3b 0d 0a 7d 0d 0a  y","@v") );..}..
2c80: 75 6e 69 74 74 65 73 74 0d 0a 7b 0d 0a 09 61 73  unittest..{...as
2c90: 73 65 72 74 5f 65 71 28 20 65 76 61 6c 53 74 72  sert_eq( evalStr
2ca0: 69 6e 67 28 60 6c 65 74 20 78 3d 31 3b 20 6c 65  ing(`let x=1; le
2cb0: 74 20 79 3d 28 6c 65 74 20 78 3d 32 29 3b 20 78  t y=(let x=2); x
2cc0: 60 29 2e 76 61 6c 2c 20 6e 65 77 20 49 6e 74 56  `).val, new IntV
2cd0: 61 6c 75 65 28 42 69 67 49 6e 74 28 31 29 29 20  alue(BigInt(1)) 
2ce0: 29 3b 20 0d 0a 09 61 73 73 65 72 74 5f 65 71 28  ); ...assert_eq(
2cf0: 20 65 76 61 6c 53 74 72 69 6e 67 28 60 6c 65 74   evalString(`let
2d00: 20 78 3d 31 3b 20 6c 65 74 20 79 3d 28 6c 65 74   x=1; let y=(let
2d10: 20 78 3d 32 3b 66 75 6e 28 29 7b 78 7d 29 3b 20   x=2;fun(){x}); 
2d20: 79 28 29 60 29 2e 76 61 6c 2c 20 6e 65 77 20 49  y()`).val, new I
2d30: 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28 32  ntValue(BigInt(2
2d40: 29 29 20 29 3b 20 0d 0a 7d 0d 0a 75 6e 69 74 74  )) ); ..}..unitt
2d50: 65 73 74 0d 0a 7b 0d 0a 09 61 73 73 65 72 74 5f  est..{...assert_
2d60: 65 71 28 20 65 76 61 6c 53 74 72 69 6e 67 28 60  eq( evalString(`
2d70: 40 61 20 78 3d 31 3b 20 40 62 20 78 3d 32 3b 20  @a x=1; @b x=2; 
2d80: 40 61 28 78 29 60 29 2e 76 61 6c 2c 20 6e 65 77  @a(x)`).val, new
2d90: 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74   IntValue(BigInt
2da0: 28 31 29 29 20 29 3b 0d 0a 09 61 73 73 65 72 74  (1)) );...assert
2db0: 5f 65 71 28 20 65 76 61 6c 53 74 72 69 6e 67 28  _eq( evalString(
2dc0: 60 40 61 20 78 3d 31 3b 20 40 62 20 78 3d 32 3b  `@a x=1; @b x=2;
2dd0: 20 40 62 28 78 29 60 29 2e 76 61 6c 2c 20 6e 65   @b(x)`).val, ne
2de0: 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e  w IntValue(BigIn
2df0: 74 28 32 29 29 20 29 3b 0d 0a 09 61 73 73 65 72  t(2)) );...asser
2e00: 74 5f 65 71 28 20 65 76 61 6c 53 74 72 69 6e 67  t_eq( evalString
2e10: 28 60 6c 65 74 20 78 3d 31 3b 20 6c 65 74 20 5f  (`let x=1; let _
2e20: 20 3d 20 28 40 61 20 78 3d 32 3b 32 29 3b 20 78   = (@a x=2;2); x
2e30: 60 29 2e 76 61 6c 2c 20 6e 65 77 20 49 6e 74 56  `).val, new IntV
2e40: 61 6c 75 65 28 42 69 67 49 6e 74 28 31 29 29 20  alue(BigInt(1)) 
2e50: 29 3b 0d 0a 09 61 73 73 65 72 74 5f 74 68 72 6f  );...assert_thro
2e60: 77 21 54 68 72 6f 77 61 62 6c 65 28 20 65 76 61  w!Throwable( eva
2e70: 6c 53 74 72 69 6e 67 28 60 6c 65 74 20 78 3d 31  lString(`let x=1
2e80: 3b 20 6c 65 74 20 5f 20 3d 20 28 40 61 20 78 3d  ; let _ = (@a x=
2e90: 32 3b 32 29 3b 20 40 61 28 78 29 60 29 20 29 3b  2;2); @a(x)`) );
2ea0: 0d 0a 7d 0d 0a 0a 75 6e 69 74 74 65 73 74 0a 7b  ..}...unittest.{
2eb0: 0a 09 61 73 73 65 72 74 5f 65 71 28 20 65 76 61  ..assert_eq( eva
2ec0: 6c 53 74 72 69 6e 67 28 60 76 61 72 20 66 61 63  lString(`var fac
2ed0: 20 3d 20 66 75 6e 28 78 29 7b 0a 09 09 69 66 28   = fun(x){...if(
2ee0: 78 29 0a 09 09 09 7b 20 78 2a 66 61 63 28 78 2d  x)....{ x*fac(x-
2ef0: 31 29 3b 20 7d 0a 09 09 65 6c 73 65 0a 09 09 09  1); }...else....
2f00: 7b 20 31 3b 20 7d 3b 0a 09 7d 3b 0a 09 66 61 63  { 1; };..};..fac
2f10: 28 31 30 29 3b 60 29 2e 76 61 6c 2c 20 6e 65 77  (10);`).val, new
2f20: 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74   IntValue(BigInt
2f30: 28 31 30 2a 39 2a 38 2a 35 30 34 30 29 29 29 3b  (10*9*8*5040)));
2f40: 0a 09 61 73 73 65 72 74 5f 65 71 28 20 65 76 61  ..assert_eq( eva
2f50: 6c 53 74 72 69 6e 67 28 60 76 61 72 20 66 69 62  lString(`var fib
2f60: 20 3d 20 66 75 6e 28 78 29 7b 0a 09 09 69 66 28   = fun(x){...if(
2f70: 78 3c 32 29 0a 09 09 09 7b 20 31 3b 20 7d 0a 09  x<2)....{ 1; }..
2f80: 09 65 6c 73 65 0a 09 09 09 7b 20 66 69 62 28 78  .else....{ fib(x
2f90: 2d 31 29 20 2b 20 66 69 62 28 78 2d 32 29 3b 20  -1) + fib(x-2); 
2fa0: 7d 3b 0a 09 7d 3b 0a 09 66 69 62 28 35 29 3b 60  };..};..fib(5);`
2fb0: 29 2e 76 61 6c 2c 20 6e 65 77 20 49 6e 74 56 61  ).val, new IntVa
2fc0: 6c 75 65 28 42 69 67 49 6e 74 28 38 29 29 29 3b  lue(BigInt(8)));
2fd0: 0a 7d 0a 0d 0a 75 6e 69 74 74 65 73 74 0d 0a 7b  .}...unittest..{
2fe0: 0d 0a 09 61 73 73 65 72 74 5f 74 68 72 6f 77 21  ...assert_throw!
2ff0: 54 68 72 6f 77 61 62 6c 65 28 20 65 76 61 6c 53  Throwable( evalS
3000: 74 72 69 6e 67 28 60 40 40 73 28 78 29 7b 78 7d  tring(`@@s(x){x}
3010: 3b 20 40 73 20 22 2b 22 3d 66 75 6e 28 78 2c 79  ; @s "+"=fun(x,y
3020: 29 7b 78 2d 79 7d 3b 40 73 28 31 2b 32 29 60 29  ){x-y};@s(1+2)`)
3030: 20 29 3b 0d 0a 09 61 73 73 65 72 74 5f 65 71 28   );...assert_eq(
3040: 20 65 76 61 6c 53 74 72 69 6e 67 28 60 40 40 73   evalString(`@@s
3050: 28 78 29 7b 78 7d 3b 20 40 73 20 22 2b 22 3d 66  (x){x}; @s "+"=f
3060: 75 6e 28 78 2c 79 29 7b 78 2d 79 7d 3b 31 2b 32  un(x,y){x-y};1+2
3070: 60 29 2e 76 61 6c 2c 20 6e 65 77 20 49 6e 74 56  `).val, new IntV
3080: 61 6c 75 65 28 42 69 67 49 6e 74 28 33 29 29 20  alue(BigInt(3)) 
3090: 29 3b 0d 0a 09 61 73 73 65 72 74 5f 65 71 28 20  );...assert_eq( 
30a0: 65 76 61 6c 53 74 72 69 6e 67 28 60 40 40 73 28  evalString(`@@s(
30b0: 78 29 7b 78 7d 3b 20 40 73 20 22 2b 22 3d 66 75  x){x}; @s "+"=fu
30c0: 6e 28 78 2c 79 29 7b 40 76 28 40 73 28 78 29 2d  n(x,y){@v(@s(x)-
30d0: 40 73 28 79 29 29 7d 3b 31 2b 32 60 29 2e 76 61  @s(y))};1+2`).va
30e0: 6c 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28  l, new IntValue(
30f0: 42 69 67 49 6e 74 28 33 29 29 20 29 3b 0d 0a 09  BigInt(3)) );...
3100: 61 73 73 65 72 74 5f 65 71 28 20 65 76 61 6c 53  assert_eq( evalS
3110: 74 72 69 6e 67 28 60 40 40 73 28 78 29 7b 78 7d  tring(`@@s(x){x}
3120: 3b 20 40 73 20 22 2b 22 3d 66 75 6e 28 78 2c 79  ; @s "+"=fun(x,y
3130: 29 7b 40 76 28 40 73 28 78 29 2d 40 73 28 79 29  ){@v(@s(x)-@s(y)
3140: 29 7d 3b 40 73 28 31 2b 32 29 60 29 2e 76 61 6c  )};@s(1+2)`).val
3150: 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42  , new IntValue(B
3160: 69 67 49 6e 74 28 2d 31 29 29 20 29 3b 0d 0a 7d  igInt(-1)) );..}
3170: 0d 0a 0d 0a 75 6e 69 74 74 65 73 74 0d 0a 7b 0d  ....unittest..{.
3180: 0a 09 61 73 73 65 72 74 5f 65 71 28 20 65 76 61  ..assert_eq( eva
3190: 6c 53 74 72 69 6e 67 28 60 40 40 74 20 3d 20 66  lString(`@@t = f
31a0: 75 6e 28 78 29 7b 78 2b 31 7d 3b 20 40 74 28 31  un(x){x+1}; @t(1
31b0: 32 33 29 60 29 2e 76 61 6c 2c 20 6e 65 77 20 49  23)`).val, new I
31c0: 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28 31  ntValue(BigInt(1
31d0: 32 34 29 29 20 29 3b 0d 0a 09 2f 2f 20 74 68 65  24)) );...// the
31e0: 72 65 20 77 61 73 20 61 20 62 75 67 20 74 68 61  re was a bug tha
31f0: 74 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e  t declaration in
3200: 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 20   the first line 
3210: 6f 66 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69  of function defi
3220: 6e 69 74 69 6f 6e 0d 0a 09 2f 2f 20 63 61 6e 6e  nition...// cann
3230: 6f 74 20 62 65 20 72 65 63 75 72 73 69 76 65 0d  ot be recursive.
3240: 0a 09 61 73 73 65 72 74 5f 6e 6f 74 68 72 6f 77  ..assert_nothrow
3250: 28 20 65 76 61 6c 53 74 72 69 6e 67 28 60 64 65  ( evalString(`de
3260: 66 20 66 6f 6f 28 29 20 7b 0d 0a 20 20 64 65 66  f foo() {..  def
3270: 20 62 61 72 28 79 29 20 7b 20 69 66 28 79 3c 31   bar(y) { if(y<1
3280: 29 20 7b 30 7d 20 65 6c 73 65 20 7b 62 61 72 28  ) {0} else {bar(
3290: 30 29 7d 20 7d 3b 0d 0a 20 20 62 61 72 28 31 29  0)} };..  bar(1)
32a0: 0d 0a 7d 3b 20 66 6f 6f 28 29 60 29 20 29 3b 0d  ..}; foo()`) );.
32b0: 0a 7d 0d 0a                                      .}..