Hex Artifact Content
Not logged in

Artifact ff42bce4fb7dc674c6010f6c33e084067f8fb7b6:


0000: 2f 2a 2a 0d 0a 20 2a 20 41 75 74 68 6f 72 73 3a  /**.. * Authors:
0010: 20 6b 2e 69 6e 61 62 61 0d 0a 20 2a 20 4c 69 63   k.inaba.. * Lic
0020: 65 6e 73 65 3a 20 4e 59 53 4c 20 30 2e 39 39 38  ense: NYSL 0.998
0030: 32 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6b 6d 6f  2 http://www.kmo
0040: 6e 6f 73 2e 6e 65 74 2f 6e 79 73 6c 2f 0d 0a 20  nos.net/nysl/.. 
0050: 2a 0d 0a 20 2a 20 52 75 6e 74 69 6d 65 20 64 61  *.. * Runtime da
0060: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  ta structures fo
0070: 72 20 50 6f 6c 65 6d 79 20 70 72 6f 67 72 61 6d  r Polemy program
0080: 6d 69 6e 67 20 6c 61 6e 67 75 61 67 65 2e 0d 0a  ming language...
0090: 20 2a 2f 0d 0a 6d 6f 64 75 6c 65 20 70 6f 6c 65   */..module pole
00a0: 6d 79 2e 76 61 6c 75 65 3b 0d 0a 69 6d 70 6f 72  my.value;..impor
00b0: 74 20 70 6f 6c 65 6d 79 2e 5f 63 6f 6d 6d 6f 6e  t polemy._common
00c0: 3b 0d 0a 69 6d 70 6f 72 74 20 70 6f 6c 65 6d 79  ;..import polemy
00d0: 2e 6c 65 78 3b 0d 0a 69 6d 70 6f 72 74 20 70 6f  .lex;..import po
00e0: 6c 65 6d 79 2e 61 73 74 3b 0d 0a 0d 0a 2f 2f 2f  lemy.ast;....///
00f0: 20 52 61 69 73 65 64 20 77 68 65 6e 20 73 6f 6d   Raised when som
0100: 65 74 68 69 6e 67 20 77 65 6e 74 20 77 72 6f 6e  ething went wron
0110: 67 20 69 6e 20 72 75 6e 74 69 6d 65 0d 0a 0d 0a  g in runtime....
0120: 63 6c 61 73 73 20 52 75 6e 74 69 6d 65 45 78 63  class RuntimeExc
0130: 65 70 74 69 6f 6e 20 3a 20 45 78 63 65 70 74 69  eption : Excepti
0140: 6f 6e 0d 0a 7b 0d 0a 09 6d 69 78 69 6e 20 45 78  on..{...mixin Ex
0150: 63 65 70 74 69 6f 6e 57 69 74 68 50 6f 73 69 74  ceptionWithPosit
0160: 69 6f 6e 3b 0d 0a 7d 0d 0a 0d 0a 2f 2f 2f 20 52  ion;..}..../// R
0170: 75 6e 74 69 6d 65 20 76 61 6c 75 65 73 20 6f 66  untime values of
0180: 20 50 6f 6c 65 6d 79 0d 0a 0d 0a 61 62 73 74 72   Polemy....abstr
0190: 61 63 74 20 63 6c 61 73 73 20 56 61 6c 75 65 0d  act class Value.
01a0: 0a 7b 0d 0a 7d 0d 0a 0d 0a 2f 2f 2f 0d 0a 63 6c  .{..}....///..cl
01b0: 61 73 73 20 49 6e 74 56 61 6c 75 65 20 3a 20 56  ass IntValue : V
01c0: 61 6c 75 65 0d 0a 7b 0d 0a 09 42 69 67 49 6e 74  alue..{...BigInt
01d0: 20 64 61 74 61 3b 0d 0a 0d 0a 09 6d 69 78 69 6e   data;.....mixin
01e0: 20 53 69 6d 70 6c 65 43 6c 61 73 73 3b 0d 0a 09   SimpleClass;...
01f0: 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e 67 20  override string 
0200: 74 6f 53 74 72 69 6e 67 28 29 20 63 6f 6e 73 74  toString() const
0210: 20 7b 20 72 65 74 75 72 6e 20 73 74 64 2e 62 69   { return std.bi
0220: 67 69 6e 74 2e 74 6f 44 65 63 69 6d 61 6c 53 74  gint.toDecimalSt
0230: 72 69 6e 67 28 63 61 73 74 28 42 69 67 49 6e 74  ring(cast(BigInt
0240: 29 64 61 74 61 29 3b 20 7d 0d 0a 7d 0d 0a 0d 0a  )data); }..}....
0250: 2f 2f 2f 0d 0a 63 6c 61 73 73 20 53 74 72 56 61  ///..class StrVa
0260: 6c 75 65 20 3a 20 56 61 6c 75 65 0d 0a 7b 0d 0a  lue : Value..{..
0270: 09 73 74 72 69 6e 67 20 64 61 74 61 3b 0d 0a 0d  .string data;...
0280: 0a 09 6d 69 78 69 6e 20 53 69 6d 70 6c 65 43 6c  ..mixin SimpleCl
0290: 61 73 73 3b 0d 0a 09 6f 76 65 72 72 69 64 65 20  ass;...override 
02a0: 73 74 72 69 6e 67 20 74 6f 53 74 72 69 6e 67 28  string toString(
02b0: 29 20 63 6f 6e 73 74 20 7b 20 72 65 74 75 72 6e  ) const { return
02c0: 20 64 61 74 61 3b 20 7d 0d 0a 7d 0d 0a 0d 0a 2f   data; }..}..../
02d0: 2f 2f 0d 0a 63 6c 61 73 73 20 46 75 6e 56 61 6c  //..class FunVal
02e0: 75 65 20 3a 20 56 61 6c 75 65 0d 0a 7b 0d 0a 09  ue : Value..{...
02f0: 56 61 6c 75 65 20 64 65 6c 65 67 61 74 65 28 69  Value delegate(i
0300: 6d 6d 75 74 61 62 6c 65 20 4c 65 78 50 6f 73 69  mmutable LexPosi
0310: 74 69 6f 6e 20 70 6f 73 2c 20 73 74 72 69 6e 67  tion pos, string
0320: 20 6c 61 79 2c 20 56 61 6c 75 65 5b 5d 29 20 64   lay, Value[]) d
0330: 61 74 61 3b 0d 0a 0d 0a 09 6d 69 78 69 6e 20 53  ata;.....mixin S
0340: 69 6d 70 6c 65 43 6f 6e 73 74 72 75 63 74 6f 72  impleConstructor
0350: 3b 0d 0a 09 61 6c 69 61 73 20 64 61 74 61 20 63  ;...alias data c
0360: 61 6c 6c 3b 0d 0a 09 6f 76 65 72 72 69 64 65 20  all;...override 
0370: 73 74 72 69 6e 67 20 74 6f 53 74 72 69 6e 67 28  string toString(
0380: 29 20 63 6f 6e 73 74 20 7b 20 72 65 74 75 72 6e  ) const { return
0390: 20 73 70 72 69 6e 74 66 21 22 28 66 75 6e 63 74   sprintf!"(funct
03a0: 69 6f 6e 3a 25 73 3a 25 73 29 22 28 64 61 74 61  ion:%s:%s)"(data
03b0: 2e 70 74 72 2c 64 61 74 61 2e 66 75 6e 63 70 74  .ptr,data.funcpt
03c0: 72 29 3b 20 7d 0d 0a 7d 0d 0a 0d 0a 2f 2f 2f 0d  r); }..}....///.
03d0: 0a 63 6c 61 73 73 20 55 6e 64 56 61 6c 75 65 20  .class UndValue 
03e0: 3a 20 56 61 6c 75 65 0d 0a 7b 0d 0a 09 6d 69 78  : Value..{...mix
03f0: 69 6e 20 53 69 6d 70 6c 65 43 6c 61 73 73 3b 0d  in SimpleClass;.
0400: 0a 09 6f 76 65 72 72 69 64 65 20 73 74 72 69 6e  ..override strin
0410: 67 20 74 6f 53 74 72 69 6e 67 28 29 20 63 6f 6e  g toString() con
0420: 73 74 20 7b 20 72 65 74 75 72 6e 20 22 3c 75 6e  st { return "<un
0430: 64 65 66 69 6e 65 64 3e 22 3b 20 7d 0d 0a 7d 0d  defined>"; }..}.
0440: 0a 0d 0a 2f 2f 2f 20 4e 61 6d 65 64 20 43 6f 6e  .../// Named Con
0450: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 46 75 6e  structor for Fun
0460: 56 61 6c 75 65 0d 0a 0d 0a 46 75 6e 56 61 6c 75  Value....FunValu
0470: 65 20 6e 61 74 69 76 65 66 28 56 61 6c 75 65 20  e nativef(Value 
0480: 64 65 6c 65 67 61 74 65 28 69 6d 6d 75 74 61 62  delegate(immutab
0490: 6c 65 20 4c 65 78 50 6f 73 69 74 69 6f 6e 20 70  le LexPosition p
04a0: 6f 73 2c 20 4c 61 79 65 72 20 6c 61 79 2c 20 56  os, Layer lay, V
04b0: 61 6c 75 65 5b 5d 20 61 72 67 73 29 20 64 67 29  alue[] args) dg)
04c0: 0d 0a 7b 0d 0a 09 72 65 74 75 72 6e 20 6e 65 77  ..{...return new
04d0: 20 46 75 6e 56 61 6c 75 65 28 64 67 29 3b 0d 0a   FunValue(dg);..
04e0: 7d 0d 0a 0d 0a 2f 2f 2f 20 4e 61 6d 65 64 20 43  }..../// Named C
04f0: 6f 6e 73 74 72 75 63 74 6f 72 20 66 6f 72 20 46  onstructor for F
0500: 75 6e 56 61 6c 75 65 0d 0a 0d 0a 46 75 6e 56 61  unValue....FunVa
0510: 6c 75 65 20 6e 61 74 69 76 65 28 52 2c 54 2e 2e  lue native(R,T..
0520: 2e 29 28 52 20 64 65 6c 65 67 61 74 65 20 28 54  .)(R delegate (T
0530: 29 20 64 67 29 0d 0a 7b 0d 0a 09 72 65 74 75 72  ) dg)..{...retur
0540: 6e 20 6e 61 74 69 76 65 66 28 20 64 65 6c 65 67  n nativef( deleg
0550: 61 74 65 20 56 61 6c 75 65 28 69 6d 6d 75 74 61  ate Value(immuta
0560: 62 6c 65 20 4c 65 78 50 6f 73 69 74 69 6f 6e 20  ble LexPosition 
0570: 70 6f 73 2c 20 4c 61 79 65 72 20 6c 61 79 2c 20  pos, Layer lay, 
0580: 56 61 6c 75 65 5b 5d 20 61 72 67 73 29 20 7b 0d  Value[] args) {.
0590: 0a 09 09 69 66 28 20 6c 61 79 20 21 3d 20 22 40  ...if( lay != "@
05a0: 76 22 20 29 0d 0a 09 09 09 74 68 72 6f 77 20 67  v" ).....throw g
05b0: 65 6e 65 78 21 52 75 6e 74 69 6d 65 45 78 63 65  enex!RuntimeExce
05c0: 70 74 69 6f 6e 28 70 6f 73 2c 20 22 6f 6e 6c 79  ption(pos, "only
05d0: 20 40 76 20 6c 61 79 65 72 20 63 61 6e 20 63 61   @v layer can ca
05e0: 6c 6c 20 6e 61 74 69 76 65 20 66 75 6e 63 74 69  ll native functi
05f0: 6f 6e 22 29 3b 0d 0a 09 09 69 66 28 20 54 2e 6c  on");....if( T.l
0600: 65 6e 67 74 68 20 21 3d 20 61 72 67 73 2e 6c 65  ength != args.le
0610: 6e 67 74 68 20 29 0d 0a 09 09 09 74 68 72 6f 77  ngth ).....throw
0620: 20 67 65 6e 65 78 21 52 75 6e 74 69 6d 65 45 78   genex!RuntimeEx
0630: 63 65 70 74 69 6f 6e 28 70 6f 73 2c 20 22 61 72  ception(pos, "ar
0640: 67 75 6d 65 6e 74 20 6e 75 6d 62 65 72 20 6d 69  gument number mi
0650: 73 6d 61 74 63 68 21 22 29 3b 0d 0a 09 09 54 20  smatch!");....T 
0660: 74 79 70 65 64 5f 61 72 67 73 3b 0d 0a 09 09 66  typed_args;....f
0670: 6f 72 65 61 63 68 28 69 2c 20 54 69 3b 20 54 29  oreach(i, Ti; T)
0680: 0d 0a 09 09 7b 0d 0a 09 09 09 74 79 70 65 64 5f  ....{.....typed_
0690: 61 72 67 73 5b 69 5d 20 3d 20 63 61 73 74 28 54  args[i] = cast(T
06a0: 69 29 20 61 72 67 73 5b 69 5d 3b 0d 0a 09 09 09  i) args[i];.....
06b0: 69 66 28 20 74 79 70 65 64 5f 61 72 67 73 5b 69  if( typed_args[i
06c0: 5d 20 69 73 20 6e 75 6c 6c 20 29 0d 0a 09 09 09  ] is null ).....
06d0: 09 74 68 72 6f 77 20 67 65 6e 65 78 21 52 75 6e  .throw genex!Run
06e0: 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 28 70 6f  timeException(po
06f0: 73 2c 20 73 70 72 69 6e 74 66 21 22 74 79 70 65  s, sprintf!"type
0700: 20 6d 69 73 6d 61 74 63 68 20 6f 6e 20 74 68 65   mismatch on the
0710: 20 61 72 67 75 6d 65 6e 74 20 25 64 22 28 69 2b   argument %d"(i+
0720: 31 29 29 3b 0d 0a 09 09 7d 0d 0a 09 09 74 72 79  1));....}....try
0730: 20 7b 0d 0a 09 09 09 72 65 74 75 72 6e 20 64 67   {.....return dg
0740: 28 74 79 70 65 64 5f 61 72 67 73 29 3b 0d 0a 09  (typed_args);...
0750: 09 7d 20 63 61 74 63 68 28 20 52 75 6e 74 69 6d  .} catch( Runtim
0760: 65 45 78 63 65 70 74 69 6f 6e 20 65 20 29 20 7b  eException e ) {
0770: 0d 0a 09 09 09 74 68 72 6f 77 20 65 2e 70 6f 73  .....throw e.pos
0780: 20 69 73 20 6e 75 6c 6c 20 3f 20 6e 65 77 20 52   is null ? new R
0790: 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 28  untimeException(
07a0: 70 6f 73 2c 20 65 2e 6d 73 67 2c 20 65 2e 66 69  pos, e.msg, e.fi
07b0: 6c 65 2c 20 65 2e 6c 69 6e 65 29 20 3a 20 65 3b  le, e.line) : e;
07c0: 0d 0a 09 09 7d 0d 0a 09 7d 29 3b 0d 0a 7d 0d 0a  ....}...});..}..
07d0: 0d 0a 2f 2f 2f 20 4c 61 79 65 72 20 49 44 0d 0a  ../// Layer ID..
07e0: 0d 0a 61 6c 69 61 73 20 73 74 72 69 6e 67 20 4c  ..alias string L
07f0: 61 79 65 72 3b 0d 0a 0d 0a 2f 2f 2f 20 43 6f 6e  ayer;..../// Con
0800: 74 65 78 74 20 28 76 61 72 69 61 62 6c 65 20 65  text (variable e
0810: 6e 76 69 72 6f 6e 6d 65 6e 74 29 0d 0a 2f 2f 2f  nvironment)..///
0820: 20 53 69 6d 6c 61 72 20 74 6f 20 70 72 6f 74 6f   Simlar to proto
0830: 74 79 70 65 20 63 68 61 69 6e 20 6f 66 20 45 43  type chain of EC
0840: 4d 41 53 63 72 69 70 74 20 65 74 63 2e 0d 0a 2f  MAScript etc.../
0850: 2f 2f 20 42 75 74 20 65 78 74 65 6e 64 65 64 20  // But extended 
0860: 77 69 74 68 20 74 68 65 20 6e 6f 74 69 6f 6e 20  with the notion 
0870: 6f 66 20 22 4c 61 79 65 72 22 0d 0a 0d 0a 63 6c  of "Layer"....cl
0880: 61 73 73 20 54 61 62 6c 65 20 3a 20 56 61 6c 75  ass Table : Valu
0890: 65 0d 0a 7b 0d 0a 09 65 6e 75 6d 20 4b 69 6e 64  e..{...enum Kind
08a0: 20 7b 50 72 6f 70 61 67 61 74 65 53 65 74 2c 20   {PropagateSet, 
08b0: 4e 6f 74 50 72 6f 70 61 67 61 74 65 53 65 74 7d  NotPropagateSet}
08c0: 3b 0d 0a 0d 0a 09 74 68 69 73 28 20 54 61 62 6c  ;.....this( Tabl
08d0: 65 20 70 72 6f 74 6f 3d 6e 75 6c 6c 2c 20 4b 69  e proto=null, Ki
08e0: 6e 64 20 6b 20 3d 20 4b 69 6e 64 2e 50 72 6f 70  nd k = Kind.Prop
08f0: 61 67 61 74 65 53 65 74 20 29 0d 0a 09 09 7b 20  agateSet )....{ 
0900: 74 68 69 73 2e 70 72 6f 74 6f 74 79 70 65 20 3d  this.prototype =
0910: 20 70 72 6f 74 6f 3b 20 74 68 69 73 2e 6b 69 6e   proto; this.kin
0920: 64 20 3d 20 6b 3b 20 7d 0d 0a 0d 0a 09 76 6f 69  d = k; }.....voi
0930: 64 20 73 65 74 28 73 74 72 69 6e 67 20 69 2c 20  d set(string i, 
0940: 4c 61 79 65 72 20 6c 61 79 2c 20 56 61 6c 75 65  Layer lay, Value
0950: 20 76 2c 20 69 6e 20 4c 65 78 50 6f 73 69 74 69   v, in LexPositi
0960: 6f 6e 20 70 6f 73 3d 6e 75 6c 6c 29 0d 0a 09 7b  on pos=null)...{
0970: 0d 0a 09 09 69 66 28 20 73 65 74 49 66 45 78 69  ....if( setIfExi
0980: 73 74 28 69 2c 20 6c 61 79 2c 20 76 29 20 29 0d  st(i, lay, v) ).
0990: 0a 09 09 09 72 65 74 75 72 6e 3b 0d 0a 09 09 64  ....return;....d
09a0: 61 74 61 5b 69 5d 5b 6c 61 79 5d 20 3d 20 76 3b  ata[i][lay] = v;
09b0: 0d 0a 09 7d 0d 0a 0d 0a 09 62 6f 6f 6c 20 68 61  ...}.....bool ha
09c0: 73 28 73 74 72 69 6e 67 20 69 2c 20 4c 61 79 65  s(string i, Laye
09d0: 72 20 6c 61 79 2c 20 69 6e 20 4c 65 78 50 6f 73  r lay, in LexPos
09e0: 69 74 69 6f 6e 20 70 6f 73 3d 6e 75 6c 6c 29 0d  ition pos=null).
09f0: 0a 09 7b 0d 0a 09 09 69 66 28 20 69 20 69 6e 20  ..{....if( i in 
0a00: 64 61 74 61 20 29 20 7b 0d 0a 09 09 09 69 66 28  data ) {.....if(
0a10: 20 6c 61 79 20 21 69 6e 20 64 61 74 61 5b 69 5d   lay !in data[i]
0a20: 20 29 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 66   )......return f
0a30: 61 6c 73 65 3b 0d 0a 09 09 09 72 65 74 75 72 6e  alse;.....return
0a40: 20 74 72 75 65 3b 0d 0a 09 09 7d 0d 0a 09 09 69   true;....}....i
0a50: 66 28 20 70 72 6f 74 6f 74 79 70 65 20 69 73 20  f( prototype is 
0a60: 6e 75 6c 6c 20 29 0d 0a 09 09 09 72 65 74 75 72  null ).....retur
0a70: 6e 20 66 61 6c 73 65 3b 0d 0a 09 09 72 65 74 75  n false;....retu
0a80: 72 6e 20 70 72 6f 74 6f 74 79 70 65 2e 68 61 73  rn prototype.has
0a90: 28 69 2c 20 6c 61 79 2c 20 70 6f 73 29 3b 0d 0a  (i, lay, pos);..
0aa0: 09 7d 0d 0a 09 0d 0a 09 56 61 6c 75 65 20 67 65  .}......Value ge
0ab0: 74 28 73 74 72 69 6e 67 20 69 2c 20 4c 61 79 65  t(string i, Laye
0ac0: 72 20 6c 61 79 2c 20 69 6e 20 4c 65 78 50 6f 73  r lay, in LexPos
0ad0: 69 74 69 6f 6e 20 70 6f 73 3d 6e 75 6c 6c 29 0d  ition pos=null).
0ae0: 0a 09 7b 0d 0a 09 09 69 66 28 20 69 20 69 6e 20  ..{....if( i in 
0af0: 64 61 74 61 20 29 20 7b 0d 0a 09 09 09 2f 2f 20  data ) {.....// 
0b00: 5b 54 4f 44 4f 5d 20 63 6f 6e 73 69 64 65 72 20  [TODO] consider 
0b10: 66 6f 72 77 61 72 64 69 6e 67 20 74 6f 20 70 72  forwarding to pr
0b20: 6f 74 6f 20 61 6c 73 6f 20 69 6e 20 74 68 69 73  oto also in this
0b30: 20 63 61 73 65 0d 0a 09 09 09 69 66 28 20 6c 61   case.....if( la
0b40: 79 20 21 69 6e 20 64 61 74 61 5b 69 5d 20 29 0d  y !in data[i] ).
0b50: 0a 09 09 09 09 74 68 72 6f 77 20 67 65 6e 65 78  .....throw genex
0b60: 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f  !RuntimeExceptio
0b70: 6e 28 70 6f 73 2c 20 73 70 72 69 6e 74 66 21 22  n(pos, sprintf!"
0b80: 76 61 72 69 61 62 6c 65 20 25 73 20 69 73 20 6e  variable %s is n
0b90: 6f 74 20 73 65 74 20 69 6e 20 6c 61 79 65 72 20  ot set in layer 
0ba0: 25 73 22 28 69 2c 6c 61 79 29 29 3b 0d 0a 09 09  %s"(i,lay));....
0bb0: 09 72 65 74 75 72 6e 20 64 61 74 61 5b 69 5d 5b  .return data[i][
0bc0: 6c 61 79 5d 3b 0d 0a 09 09 7d 0d 0a 09 09 69 66  lay];....}....if
0bd0: 28 20 70 72 6f 74 6f 74 79 70 65 20 69 73 20 6e  ( prototype is n
0be0: 75 6c 6c 20 29 0d 0a 09 09 09 74 68 72 6f 77 20  ull ).....throw 
0bf0: 6e 65 77 20 52 75 6e 74 69 6d 65 45 78 63 65 70  new RuntimeExcep
0c00: 74 69 6f 6e 28 70 6f 73 2c 20 73 70 72 69 6e 74  tion(pos, sprint
0c10: 66 21 22 76 61 72 69 61 62 6c 65 20 25 73 20 6e  f!"variable %s n
0c20: 6f 74 20 66 6f 75 6e 64 22 28 69 29 29 3b 0d 0a  ot found"(i));..
0c30: 09 09 72 65 74 75 72 6e 20 70 72 6f 74 6f 74 79  ..return prototy
0c40: 70 65 2e 67 65 74 28 69 2c 20 6c 61 79 2c 20 70  pe.get(i, lay, p
0c50: 6f 73 29 3b 0d 0a 09 7d 0d 0a 0d 0a 09 54 20 61  os);...}.....T a
0c60: 63 63 65 73 73 28 54 2c 53 2e 2e 2e 29 28 20 4c  ccess(T,S...)( L
0c70: 61 79 65 72 20 6c 61 79 2c 20 73 74 72 69 6e 67  ayer lay, string
0c80: 20 70 61 74 68 2c 20 53 20 72 65 73 74 20 29 0d   path, S rest ).
0c90: 0a 09 7b 0d 0a 09 09 73 74 61 74 69 63 20 69 66  ..{....static if
0ca0: 28 20 72 65 73 74 2e 6c 65 6e 67 74 68 20 3d 3d  ( rest.length ==
0cb0: 20 30 20 29 0d 0a 09 09 7b 0d 0a 09 09 09 69 66   0 )....{.....if
0cc0: 28 20 74 68 69 73 2e 68 61 73 28 70 61 74 68 2c  ( this.has(path,
0cd0: 20 6c 61 79 29 20 29 0d 0a 09 09 09 09 72 65 74   lay) )......ret
0ce0: 75 72 6e 20 63 61 73 74 28 54 29 20 74 68 69 73  urn cast(T) this
0cf0: 2e 67 65 74 28 70 61 74 68 2c 20 6c 61 79 29 3b  .get(path, lay);
0d00: 0d 0a 09 09 7d 0d 0a 09 09 65 6c 73 65 0d 0a 09  ....}....else...
0d10: 09 7b 0d 0a 09 09 09 69 66 28 61 75 74 6f 20 6e  .{.....if(auto n
0d20: 65 78 74 20 3d 20 74 68 69 73 2e 61 63 63 65 73  ext = this.acces
0d30: 73 21 54 61 62 6c 65 28 6c 61 79 2c 70 61 74 68  s!Table(lay,path
0d40: 29 29 0d 0a 09 09 09 09 72 65 74 75 72 6e 20 6e  ))......return n
0d50: 65 78 74 2e 61 63 63 65 73 73 21 54 28 6c 61 79  ext.access!T(lay
0d60: 2c 72 65 73 74 29 3b 0d 0a 09 09 7d 0d 0a 09 09  ,rest);....}....
0d70: 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 09 7d  return null;...}
0d80: 0d 0a 0d 0a 09 73 74 72 69 6e 67 20 74 6f 53 74  .....string toSt
0d90: 72 69 6e 67 57 69 74 68 6f 75 74 50 61 72 65 6e  ringWithoutParen
0da0: 28 29 20 63 6f 6e 73 74 0d 0a 09 7b 0d 0a 09 09  () const...{....
0db0: 73 74 72 69 6e 67 20 72 65 73 75 6c 74 3b 0d 0a  string result;..
0dc0: 09 09 62 6f 6f 6c 20 66 69 72 73 74 20 3d 20 74  ..bool first = t
0dd0: 72 75 65 3b 0d 0a 09 09 66 6f 72 65 61 63 68 28  rue;....foreach(
0de0: 6b 2c 20 6c 32 64 3b 20 64 61 74 61 29 0d 0a 09  k, l2d; data)...
0df0: 09 09 66 6f 72 65 61 63 68 28 6c 2c 64 3b 20 6c  ..foreach(l,d; l
0e00: 32 64 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 69  2d).....{......i
0e10: 66 28 66 69 72 73 74 29 20 66 69 72 73 74 3d 66  f(first) first=f
0e20: 61 6c 73 65 3b 20 65 6c 73 65 20 72 65 73 75 6c  alse; else resul
0e30: 74 7e 3d 22 2c 20 22 3b 0d 0a 09 09 09 09 72 65  t~=", ";......re
0e40: 73 75 6c 74 20 7e 3d 20 6b 3b 0d 0a 09 09 09 09  sult ~= k;......
0e50: 72 65 73 75 6c 74 20 7e 3d 20 6c 3b 0d 0a 09 09  result ~= l;....
0e60: 09 09 72 65 73 75 6c 74 20 7e 3d 20 22 3a 22 3b  ..result ~= ":";
0e70: 0d 0a 09 09 09 09 72 65 73 75 6c 74 20 7e 3d 20  ......result ~= 
0e80: 74 65 78 74 28 63 61 73 74 28 56 61 6c 75 65 29  text(cast(Value)
0e90: 64 29 3b 0d 0a 09 09 09 7d 0d 0a 09 09 69 66 28  d);.....}....if(
0ea0: 20 70 72 6f 74 6f 74 79 70 65 20 21 69 73 20 6e   prototype !is n
0eb0: 75 6c 6c 20 29 0d 0a 09 09 7b 0d 0a 09 09 09 72  ull )....{.....r
0ec0: 65 73 75 6c 74 20 7e 3d 20 22 20 2f 20 22 3b 0d  esult ~= " / ";.
0ed0: 0a 09 09 09 72 65 73 75 6c 74 20 7e 3d 20 70 72  ....result ~= pr
0ee0: 6f 74 6f 74 79 70 65 2e 74 6f 53 74 72 69 6e 67  ototype.toString
0ef0: 57 69 74 68 6f 75 74 50 61 72 65 6e 28 29 3b 0d  WithoutParen();.
0f00: 0a 09 09 7d 0d 0a 09 09 72 65 74 75 72 6e 20 72  ...}....return r
0f10: 65 73 75 6c 74 3b 0d 0a 09 7d 0d 0a 09 0d 0a 09  esult;...}......
0f20: 73 74 72 69 6e 67 20 74 6f 53 74 72 69 6e 67 28  string toString(
0f30: 29 20 63 6f 6e 73 74 0d 0a 09 7b 0d 0a 09 09 72  ) const...{....r
0f40: 65 74 75 72 6e 20 22 7b 22 20 7e 20 74 6f 53 74  eturn "{" ~ toSt
0f50: 72 69 6e 67 57 69 74 68 6f 75 74 50 61 72 65 6e  ringWithoutParen
0f60: 28 29 20 7e 20 22 7d 22 3b 0d 0a 09 7d 0d 0a 0d  () ~ "}";...}...
0f70: 0a 70 72 69 76 61 74 65 3a 0d 0a 09 54 61 62 6c  .private:...Tabl
0f80: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
0f90: 20 70 72 6f 74 6f 74 79 70 65 3b 0d 0a 09 4b 69   prototype;...Ki
0fa0: 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
0fb0: 20 20 20 6b 69 6e 64 3b 0d 0a 09 56 61 6c 75 65     kind;...Value
0fc0: 5b 4c 61 79 65 72 5d 5b 73 74 72 69 6e 67 5d 20  [Layer][string] 
0fd0: 64 61 74 61 3b 0d 0a 0d 0a 09 62 6f 6f 6c 20 73  data;.....bool s
0fe0: 65 74 49 66 45 78 69 73 74 28 73 74 72 69 6e 67  etIfExist(string
0ff0: 20 69 2c 20 4c 61 79 65 72 20 6c 61 79 2c 20 56   i, Layer lay, V
1000: 61 6c 75 65 20 76 29 0d 0a 09 7b 0d 0a 09 09 69  alue v)...{....i
1010: 66 28 20 69 20 69 6e 20 64 61 74 61 20 29 0d 0a  f( i in data )..
1020: 09 09 7b 0d 0a 09 09 09 64 61 74 61 5b 69 5d 5b  ..{.....data[i][
1030: 6c 61 79 5d 20 3d 20 76 3b 0d 0a 09 09 09 72 65  lay] = v;.....re
1040: 74 75 72 6e 20 74 72 75 65 3b 0d 0a 09 09 7d 0d  turn true;....}.
1050: 0a 09 09 69 66 28 20 6b 69 6e 64 3d 3d 4b 69 6e  ...if( kind==Kin
1060: 64 2e 50 72 6f 70 61 67 61 74 65 53 65 74 20 26  d.PropagateSet &
1070: 26 20 70 72 6f 74 6f 74 79 70 65 20 21 69 73 20  & prototype !is 
1080: 6e 75 6c 6c 20 29 0d 0a 09 09 09 72 65 74 75 72  null ).....retur
1090: 6e 20 70 72 6f 74 6f 74 79 70 65 2e 73 65 74 49  n prototype.setI
10a0: 66 45 78 69 73 74 28 69 2c 20 6c 61 79 2c 20 76  fExist(i, lay, v
10b0: 29 3b 0d 0a 09 09 72 65 74 75 72 6e 20 66 61 6c  );....return fal
10c0: 73 65 3b 0d 0a 09 7d 0d 0a 7d 0d 0a 0d 0a 75 6e  se;...}..}....un
10d0: 69 74 74 65 73 74 0d 0a 7b 0d 0a 09 54 61 62 6c  ittest..{...Tabl
10e0: 65 20 63 30 20 3d 20 6e 65 77 20 54 61 62 6c 65  e c0 = new Table
10f0: 3b 0d 0a 09 54 61 62 6c 65 20 63 30 31 20 3d 20  ;...Table c01 = 
1100: 6e 65 77 20 54 61 62 6c 65 28 63 30 2c 20 54 61  new Table(c0, Ta
1110: 62 6c 65 2e 4b 69 6e 64 2e 4e 6f 74 50 72 6f 70  ble.Kind.NotProp
1120: 61 67 61 74 65 53 65 74 29 3b 0d 0a 09 54 61 62  agateSet);...Tab
1130: 6c 65 20 63 30 31 32 20 3d 20 6e 65 77 20 54 61  le c012 = new Ta
1140: 62 6c 65 28 63 30 31 2c 20 54 61 62 6c 65 2e 4b  ble(c01, Table.K
1150: 69 6e 64 2e 50 72 6f 70 61 67 61 74 65 53 65 74  ind.PropagateSet
1160: 29 3b 0d 0a 09 54 61 62 6c 65 20 63 30 31 33 20  );...Table c013 
1170: 3d 20 6e 65 77 20 54 61 62 6c 65 28 63 30 31 2c  = new Table(c01,
1180: 20 54 61 62 6c 65 2e 4b 69 6e 64 2e 50 72 6f 70   Table.Kind.Prop
1190: 61 67 61 74 65 53 65 74 29 3b 0d 0a 0d 0a 09 61  agateSet);.....a
11a0: 73 73 65 72 74 5f 6e 6f 74 68 72 6f 77 28 20 63  ssert_nothrow( c
11b0: 30 31 32 2e 73 65 74 28 22 78 22 2c 20 22 40 76  012.set("x", "@v
11c0: 22 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28  ", new IntValue(
11d0: 42 69 67 49 6e 74 28 31 32 29 29 29 20 29 3b 0d  BigInt(12))) );.
11e0: 0a 09 61 73 73 65 72 74 5f 74 68 72 6f 77 21 52  ..assert_throw!R
11f0: 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 28  untimeException(
1200: 20 63 30 31 33 2e 67 65 74 28 22 78 22 2c 20 22   c013.get("x", "
1210: 40 76 22 29 20 29 3b 0d 0a 09 61 73 73 65 72 74  @v") );...assert
1220: 5f 6e 6f 74 68 72 6f 77 28 20 63 30 31 33 2e 73  _nothrow( c013.s
1230: 65 74 28 22 78 22 2c 20 22 40 76 22 2c 20 6e 65  et("x", "@v", ne
1240: 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e  w IntValue(BigIn
1250: 74 28 31 33 29 29 29 20 29 3b 0d 0a 09 61 73 73  t(13))) );...ass
1260: 65 72 74 5f 65 71 28 20 63 30 31 33 2e 67 65 74  ert_eq( c013.get
1270: 28 22 78 22 2c 20 22 40 76 22 29 2c 20 6e 65 77  ("x", "@v"), new
1280: 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74   IntValue(BigInt
1290: 28 31 33 29 29 20 29 3b 0d 0a 09 61 73 73 65 72  (13)) );...asser
12a0: 74 5f 65 71 28 20 63 30 31 32 2e 67 65 74 28 22  t_eq( c012.get("
12b0: 78 22 2c 20 22 40 76 22 29 2c 20 6e 65 77 20 49  x", "@v"), new I
12c0: 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28 31  ntValue(BigInt(1
12d0: 32 29 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 5f  2)) );...assert_
12e0: 74 68 72 6f 77 21 52 75 6e 74 69 6d 65 45 78 63  throw!RuntimeExc
12f0: 65 70 74 69 6f 6e 28 20 63 30 31 2e 67 65 74 28  eption( c01.get(
1300: 22 78 22 2c 20 22 40 76 22 29 20 29 3b 0d 0a 0d  "x", "@v") );...
1310: 0a 09 61 73 73 65 72 74 5f 6e 6f 74 68 72 6f 77  ..assert_nothrow
1320: 28 20 63 30 31 2e 73 65 74 28 22 79 22 2c 20 22  ( c01.set("y", "
1330: 40 76 22 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75  @v", new IntValu
1340: 65 28 42 69 67 49 6e 74 28 31 29 29 29 20 29 3b  e(BigInt(1))) );
1350: 0d 0a 09 61 73 73 65 72 74 5f 65 71 28 20 63 30  ...assert_eq( c0
1360: 31 33 2e 67 65 74 28 22 79 22 2c 20 22 40 76 22  13.get("y", "@v"
1370: 29 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28  ), new IntValue(
1380: 42 69 67 49 6e 74 28 31 29 29 20 29 3b 0d 0a 09  BigInt(1)) );...
1390: 61 73 73 65 72 74 5f 65 71 28 20 63 30 31 32 2e  assert_eq( c012.
13a0: 67 65 74 28 22 79 22 2c 20 22 40 76 22 29 2c 20  get("y", "@v"), 
13b0: 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67  new IntValue(Big
13c0: 49 6e 74 28 31 29 29 20 29 3b 0d 0a 09 61 73 73  Int(1)) );...ass
13d0: 65 72 74 5f 65 71 28 20 63 30 31 2e 67 65 74 28  ert_eq( c01.get(
13e0: 22 79 22 2c 20 22 40 76 22 29 2c 20 6e 65 77 20  "y", "@v"), new 
13f0: 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28  IntValue(BigInt(
1400: 31 29 29 20 29 3b 0d 0a 0d 0a 09 61 73 73 65 72  1)) );.....asser
1410: 74 5f 6e 6f 74 68 72 6f 77 28 20 63 30 2e 73 65  t_nothrow( c0.se
1420: 74 28 22 7a 22 2c 20 22 40 76 22 2c 20 6e 65 77  t("z", "@v", new
1430: 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74   IntValue(BigInt
1440: 28 30 29 29 29 20 29 3b 0d 0a 09 61 73 73 65 72  (0))) );...asser
1450: 74 5f 65 71 28 20 63 30 31 33 2e 67 65 74 28 22  t_eq( c013.get("
1460: 7a 22 2c 20 22 40 76 22 29 2c 20 6e 65 77 20 49  z", "@v"), new I
1470: 6e 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28 30  ntValue(BigInt(0
1480: 29 29 20 29 3b 0d 0a 09 61 73 73 65 72 74 5f 65  )) );...assert_e
1490: 71 28 20 63 30 31 32 2e 67 65 74 28 22 7a 22 2c  q( c012.get("z",
14a0: 20 22 40 76 22 29 2c 20 6e 65 77 20 49 6e 74 56   "@v"), new IntV
14b0: 61 6c 75 65 28 42 69 67 49 6e 74 28 30 29 29 20  alue(BigInt(0)) 
14c0: 29 3b 0d 0a 09 61 73 73 65 72 74 5f 65 71 28 20  );...assert_eq( 
14d0: 63 30 31 2e 67 65 74 28 22 7a 22 2c 20 22 40 76  c01.get("z", "@v
14e0: 22 29 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  "), new IntValue
14f0: 28 42 69 67 49 6e 74 28 30 29 29 20 29 3b 0d 0a  (BigInt(0)) );..
1500: 09 61 73 73 65 72 74 5f 65 71 28 20 63 30 2e 67  .assert_eq( c0.g
1510: 65 74 28 22 7a 22 2c 20 22 40 76 22 29 2c 20 6e  et("z", "@v"), n
1520: 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49  ew IntValue(BigI
1530: 6e 74 28 30 29 29 20 29 3b 0d 0a 0d 0a 09 61 73  nt(0)) );.....as
1540: 73 65 72 74 5f 6e 6f 74 68 72 6f 77 28 20 63 30  sert_nothrow( c0
1550: 31 32 2e 73 65 74 28 22 79 22 2c 20 22 40 76 22  12.set("y", "@v"
1560: 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42  , new IntValue(B
1570: 69 67 49 6e 74 28 34 34 34 29 29 29 20 29 3b 0d  igInt(444))) );.
1580: 0a 09 61 73 73 65 72 74 5f 65 71 28 20 63 30 31  ..assert_eq( c01
1590: 33 2e 67 65 74 28 22 79 22 2c 20 22 40 76 22 29  3.get("y", "@v")
15a0: 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42  , new IntValue(B
15b0: 69 67 49 6e 74 28 34 34 34 29 29 20 29 3b 0d 0a  igInt(444)) );..
15c0: 09 61 73 73 65 72 74 5f 65 71 28 20 63 30 31 32  .assert_eq( c012
15d0: 2e 67 65 74 28 22 79 22 2c 20 22 40 76 22 29 2c  .get("y", "@v"),
15e0: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69   new IntValue(Bi
15f0: 67 49 6e 74 28 34 34 34 29 29 20 29 3b 0d 0a 09  gInt(444)) );...
1600: 61 73 73 65 72 74 5f 65 71 28 20 63 30 31 2e 67  assert_eq( c01.g
1610: 65 74 28 22 79 22 2c 20 22 40 76 22 29 2c 20 6e  et("y", "@v"), n
1620: 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49  ew IntValue(BigI
1630: 6e 74 28 34 34 34 29 29 20 29 3b 0d 0a 0d 0a 09  nt(444)) );.....
1640: 61 73 73 65 72 74 5f 6e 6f 74 68 72 6f 77 28 20  assert_nothrow( 
1650: 63 30 31 32 2e 73 65 74 28 22 7a 22 2c 20 22 40  c012.set("z", "@
1660: 76 22 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  v", new IntValue
1670: 28 42 69 67 49 6e 74 28 35 35 35 29 29 29 20 29  (BigInt(555))) )
1680: 3b 0d 0a 09 61 73 73 65 72 74 5f 65 71 28 20 63  ;...assert_eq( c
1690: 30 31 33 2e 67 65 74 28 22 7a 22 2c 20 22 40 76  013.get("z", "@v
16a0: 22 29 2c 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  "), new IntValue
16b0: 28 42 69 67 49 6e 74 28 30 29 29 20 29 3b 0d 0a  (BigInt(0)) );..
16c0: 09 61 73 73 65 72 74 5f 65 71 28 20 63 30 31 32  .assert_eq( c012
16d0: 2e 67 65 74 28 22 7a 22 2c 20 22 40 76 22 29 2c  .get("z", "@v"),
16e0: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69   new IntValue(Bi
16f0: 67 49 6e 74 28 35 35 35 29 29 20 29 3b 0d 0a 09  gInt(555)) );...
1700: 61 73 73 65 72 74 5f 65 71 28 20 63 30 31 2e 67  assert_eq( c01.g
1710: 65 74 28 22 7a 22 2c 20 22 40 76 22 29 2c 20 6e  et("z", "@v"), n
1720: 65 77 20 49 6e 74 56 61 6c 75 65 28 42 69 67 49  ew IntValue(BigI
1730: 6e 74 28 30 29 29 20 29 3b 0d 0a 09 61 73 73 65  nt(0)) );...asse
1740: 72 74 5f 65 71 28 20 63 30 2e 67 65 74 28 22 7a  rt_eq( c0.get("z
1750: 22 2c 20 22 40 76 22 29 2c 20 6e 65 77 20 49 6e  ", "@v"), new In
1760: 74 56 61 6c 75 65 28 42 69 67 49 6e 74 28 30 29  tValue(BigInt(0)
1770: 29 20 29 3b 0d 0a 0d 0a 09 2f 2f 20 5b 54 4f 44  ) );.....// [TOD
1780: 4f 5d 20 64 65 66 69 6e 65 20 74 68 65 20 73 65  O] define the se
1790: 6d 61 6e 74 69 63 73 20 61 6e 64 20 74 65 73 74  mantics and test
17a0: 20 40 6c 61 79 65 72 73 0d 0a 7d 0d 0a 0d 0a 69   @layers..}....i
17b0: 6d 6d 75 74 61 62 6c 65 28 4c 65 78 50 6f 73 69  mmutable(LexPosi
17c0: 74 69 6f 6e 29 20 65 78 74 72 61 63 74 50 6f 73  tion) extractPos
17d0: 28 20 54 61 62 6c 65 20 74 20 29 0d 0a 7b 0d 0a  ( Table t )..{..
17e0: 09 4c 61 79 65 72 20 74 68 65 4c 61 79 65 72 20  .Layer theLayer 
17f0: 3d 20 22 40 76 22 3b 0d 0a 09 69 66 28 61 75 74  = "@v";...if(aut
1800: 6f 20 74 74 20 3d 20 74 2e 61 63 63 65 73 73 21  o tt = t.access!
1810: 54 61 62 6c 65 28 74 68 65 4c 61 79 65 72 2c 20  Table(theLayer, 
1820: 22 70 6f 73 22 29 29 0d 0a 09 7b 0d 0a 09 09 61  "pos"))...{....a
1830: 75 74 6f 20 66 6e 20 3d 20 74 74 2e 61 63 63 65  uto fn = tt.acce
1840: 73 73 21 53 74 72 56 61 6c 75 65 28 74 68 65 4c  ss!StrValue(theL
1850: 61 79 65 72 2c 20 22 66 69 6c 65 6e 61 6d 65 22  ayer, "filename"
1860: 29 3b 0d 0a 09 09 61 75 74 6f 20 6c 6e 20 3d 20  );....auto ln = 
1870: 74 74 2e 61 63 63 65 73 73 21 49 6e 74 56 61 6c  tt.access!IntVal
1880: 75 65 28 74 68 65 4c 61 79 65 72 2c 20 22 6c 69  ue(theLayer, "li
1890: 6e 65 6e 6f 22 29 3b 0d 0a 09 09 61 75 74 6f 20  neno");....auto 
18a0: 63 6c 20 3d 20 74 74 2e 61 63 63 65 73 73 21 49  cl = tt.access!I
18b0: 6e 74 56 61 6c 75 65 28 74 68 65 4c 61 79 65 72  ntValue(theLayer
18c0: 2c 20 22 63 6f 6c 75 6d 6e 22 29 3b 0d 0a 09 09  , "column");....
18d0: 69 66 28 66 6e 20 21 69 73 20 6e 75 6c 6c 20 26  if(fn !is null &
18e0: 26 20 6c 6e 20 21 69 73 20 6e 75 6c 6c 20 26 26  & ln !is null &&
18f0: 20 63 6c 20 21 69 73 20 6e 75 6c 6c 29 0d 0a 09   cl !is null)...
1900: 09 09 72 65 74 75 72 6e 20 6e 65 77 20 69 6d 6d  ..return new imm
1910: 75 74 61 62 6c 65 28 4c 65 78 50 6f 73 69 74 69  utable(LexPositi
1920: 6f 6e 29 28 66 6e 2e 64 61 74 61 2c 63 61 73 74  on)(fn.data,cast
1930: 28 69 6e 74 29 6c 6e 2e 64 61 74 61 2e 74 6f 49  (int)ln.data.toI
1940: 6e 74 2c 63 61 73 74 28 69 6e 74 29 63 6c 2e 64  nt,cast(int)cl.d
1950: 61 74 61 2e 74 6f 49 6e 74 29 3b 0d 0a 09 7d 0d  ata.toInt);...}.
1960: 0a 09 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a  ..return null;..
1970: 7d 0d 0a 0d 0a 56 61 6c 75 65 5b 5d 20 74 61 62  }....Value[] tab
1980: 6c 65 41 73 43 6f 6e 73 4c 69 73 74 28 20 4c 61  leAsConsList( La
1990: 79 65 72 20 74 68 65 4c 61 79 65 72 2c 20 54 61  yer theLayer, Ta
19a0: 62 6c 65 20 74 20 29 0d 0a 7b 0d 0a 09 56 61 6c  ble t )..{...Val
19b0: 75 65 5b 5d 20 72 65 73 75 6c 74 3b 0d 0a 09 77  ue[] result;...w
19c0: 68 69 6c 65 28 74 29 0d 0a 09 09 69 66 28 61 75  hile(t)....if(au
19d0: 74 6f 20 76 20 20 3d 20 74 2e 61 63 63 65 73 73  to v  = t.access
19e0: 21 56 61 6c 75 65 28 74 68 65 4c 61 79 65 72 2c  !Value(theLayer,
19f0: 20 22 63 61 72 22 29 29 0d 0a 09 09 7b 0d 0a 09   "car"))....{...
1a00: 09 09 72 65 73 75 6c 74 20 7e 3d 20 76 3b 0d 0a  ..result ~= v;..
1a10: 09 09 09 74 20 3d 20 74 2e 61 63 63 65 73 73 21  ...t = t.access!
1a20: 54 61 62 6c 65 28 74 68 65 4c 61 79 65 72 2c 20  Table(theLayer, 
1a30: 22 63 64 72 22 29 3b 0d 0a 09 09 7d 0d 0a 09 09  "cdr");....}....
1a40: 65 6c 73 65 0d 0a 09 09 09 62 72 65 61 6b 3b 0d  else.....break;.
1a50: 0a 09 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b  ..return result;
1a60: 0d 0a 7d 0d 0a 0d 0a 41 53 54 5b 5d 20 74 61 62  ..}....AST[] tab
1a70: 6c 65 54 6f 41 53 54 4c 69 73 74 28 20 4c 61 79  leToASTList( Lay
1a80: 65 72 20 74 68 65 4c 61 79 65 72 2c 20 54 61 62  er theLayer, Tab
1a90: 6c 65 20 74 20 29 0d 0a 7b 0d 0a 09 41 53 54 5b  le t )..{...AST[
1aa0: 5d 20 72 65 73 75 6c 74 3b 0d 0a 09 66 6f 72 65  ] result;...fore
1ab0: 61 63 68 28 76 3b 20 74 61 62 6c 65 41 73 43 6f  ach(v; tableAsCo
1ac0: 6e 73 4c 69 73 74 28 74 68 65 4c 61 79 65 72 2c  nsList(theLayer,
1ad0: 20 74 29 29 0d 0a 09 09 69 66 28 61 75 74 6f 20   t))....if(auto 
1ae0: 74 20 3d 20 63 61 73 74 28 54 61 62 6c 65 29 76  t = cast(Table)v
1af0: 29 0d 0a 09 09 09 72 65 73 75 6c 74 20 7e 3d 20  ).....result ~= 
1b00: 74 61 62 6c 65 54 6f 41 53 54 28 74 68 65 4c 61  tableToAST(theLa
1b10: 79 65 72 2c 74 29 3b 0d 0a 09 09 65 6c 73 65 0d  yer,t);....else.
1b20: 0a 09 09 09 74 68 72 6f 77 20 67 65 6e 65 78 21  ....throw genex!
1b30: 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e  RuntimeException
1b40: 28 63 61 73 74 28 4c 65 78 50 6f 73 69 74 69 6f  (cast(LexPositio
1b50: 6e 29 6e 75 6c 6c 2c 20 22 49 6e 76 61 6c 69 64  n)null, "Invalid
1b60: 20 41 53 54 20 28 6e 6f 6e 2d 74 61 62 6c 65 20   AST (non-table 
1b70: 69 6e 20 63 6f 6e 73 2d 6c 69 73 74 29 22 29 3b  in cons-list)");
1b80: 0d 0a 09 72 65 74 75 72 6e 20 72 65 73 75 6c 74  ...return result
1b90: 3b 0d 0a 7d 0d 0a 0d 0a 41 53 54 20 74 61 62 6c  ;..}....AST tabl
1ba0: 65 54 6f 41 53 54 28 20 4c 61 79 65 72 20 74 68  eToAST( Layer th
1bb0: 65 4c 61 79 65 72 2c 20 56 61 6c 75 65 20 76 76  eLayer, Value vv
1bc0: 76 76 20 29 0d 0a 7b 0d 0a 09 54 61 62 6c 65 20  vv )..{...Table 
1bd0: 74 20 3d 20 63 61 73 74 28 54 61 62 6c 65 29 76  t = cast(Table)v
1be0: 76 76 76 3b 0d 0a 09 69 66 28 20 74 20 69 73 20  vvv;...if( t is 
1bf0: 6e 75 6c 6c 20 29 0d 0a 09 09 74 68 72 6f 77 20  null )....throw 
1c00: 67 65 6e 65 78 21 52 75 6e 74 69 6d 65 45 78 63  genex!RuntimeExc
1c10: 65 70 74 69 6f 6e 28 63 61 73 74 28 4c 65 78 50  eption(cast(LexP
1c20: 6f 73 69 74 69 6f 6e 29 6e 75 6c 6c 2c 20 22 49  osition)null, "I
1c30: 6e 76 61 6c 69 64 20 41 53 54 20 28 6e 6f 74 20  nvalid AST (not 
1c40: 61 20 74 61 62 6c 65 29 22 29 3b 0d 0a 0d 0a 09  a table)");.....
1c50: 61 75 74 6f 20 6e 6f 64 65 54 79 70 65 20 3d 20  auto nodeType = 
1c60: 74 2e 61 63 63 65 73 73 21 53 74 72 56 61 6c 75  t.access!StrValu
1c70: 65 28 74 68 65 4c 61 79 65 72 2c 20 22 69 73 22  e(theLayer, "is"
1c80: 29 3b 0d 0a 09 69 66 28 20 6e 6f 64 65 54 79 70  );...if( nodeTyp
1c90: 65 20 69 73 20 6e 75 6c 6c 20 29 0d 0a 09 09 74  e is null )....t
1ca0: 68 72 6f 77 20 67 65 6e 65 78 21 52 75 6e 74 69  hrow genex!Runti
1cb0: 6d 65 45 78 63 65 70 74 69 6f 6e 28 63 61 73 74  meException(cast
1cc0: 28 4c 65 78 50 6f 73 69 74 69 6f 6e 29 6e 75 6c  (LexPosition)nul
1cd0: 6c 2c 20 22 49 6e 76 61 6c 69 64 20 41 53 54 20  l, "Invalid AST 
1ce0: 7b 69 73 3a 28 6e 6f 74 20 73 74 72 69 6e 67 29  {is:(not string)
1cf0: 7d 22 29 3b 0d 0a 09 61 75 74 6f 20 70 6f 73 20  }");...auto pos 
1d00: 3d 20 65 78 74 72 61 63 74 50 6f 73 28 74 29 3b  = extractPos(t);
1d10: 0d 0a 09 73 77 69 74 63 68 28 6e 6f 64 65 54 79  ...switch(nodeTy
1d20: 70 65 2e 64 61 74 61 29 0d 0a 09 7b 0d 0a 09 63  pe.data)...{...c
1d30: 61 73 65 20 22 69 6e 74 22 3a 0d 0a 09 09 69 66  ase "int":....if
1d40: 28 61 75 74 6f 20 76 20 3d 20 74 2e 61 63 63 65  (auto v = t.acce
1d50: 73 73 21 49 6e 74 56 61 6c 75 65 28 74 68 65 4c  ss!IntValue(theL
1d60: 61 79 65 72 2c 20 22 64 61 74 61 22 29 29 0d 0a  ayer, "data"))..
1d70: 09 09 09 72 65 74 75 72 6e 20 6e 65 77 20 49 6e  ...return new In
1d80: 74 4c 69 74 65 72 61 6c 28 70 6f 73 2c 20 76 2e  tLiteral(pos, v.
1d90: 64 61 74 61 29 3b 0d 0a 09 09 74 68 72 6f 77 20  data);....throw 
1da0: 67 65 6e 65 78 21 52 75 6e 74 69 6d 65 45 78 63  genex!RuntimeExc
1db0: 65 70 74 69 6f 6e 28 63 61 73 74 28 4c 65 78 50  eption(cast(LexP
1dc0: 6f 73 69 74 69 6f 6e 29 6e 75 6c 6c 2c 20 60 49  osition)null, `I
1dd0: 6e 76 61 6c 69 64 20 41 53 54 20 7b 69 73 3a 22  nvalid AST {is:"
1de0: 69 6e 74 22 2c 20 64 61 74 61 3a 28 6e 6f 74 20  int", data:(not 
1df0: 69 6e 74 29 7d 60 29 3b 0d 0a 09 63 61 73 65 20  int)}`);...case 
1e00: 22 73 74 72 22 3a 0d 0a 09 09 69 66 28 61 75 74  "str":....if(aut
1e10: 6f 20 76 20 3d 20 74 2e 61 63 63 65 73 73 21 53  o v = t.access!S
1e20: 74 72 56 61 6c 75 65 28 74 68 65 4c 61 79 65 72  trValue(theLayer
1e30: 2c 20 22 64 61 74 61 22 29 29 0d 0a 09 09 09 72  , "data")).....r
1e40: 65 74 75 72 6e 20 6e 65 77 20 53 74 72 4c 69 74  eturn new StrLit
1e50: 65 72 61 6c 28 70 6f 73 2c 20 76 2e 64 61 74 61  eral(pos, v.data
1e60: 29 3b 0d 0a 09 09 74 68 72 6f 77 20 67 65 6e 65  );....throw gene
1e70: 78 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69  x!RuntimeExcepti
1e80: 6f 6e 28 63 61 73 74 28 4c 65 78 50 6f 73 69 74  on(cast(LexPosit
1e90: 69 6f 6e 29 6e 75 6c 6c 2c 20 60 49 6e 76 61 6c  ion)null, `Inval
1ea0: 69 64 20 41 53 54 20 7b 69 73 3a 22 73 74 72 22  id AST {is:"str"
1eb0: 2c 20 64 61 74 61 3a 28 6e 6f 74 20 73 74 72 69  , data:(not stri
1ec0: 6e 67 29 7d 60 29 3b 0d 0a 09 63 61 73 65 20 22  ng)}`);...case "
1ed0: 76 61 72 22 3a 0d 0a 09 09 69 66 28 61 75 74 6f  var":....if(auto
1ee0: 20 76 20 3d 20 74 2e 61 63 63 65 73 73 21 53 74   v = t.access!St
1ef0: 72 56 61 6c 75 65 28 74 68 65 4c 61 79 65 72 2c  rValue(theLayer,
1f00: 20 22 6e 61 6d 65 22 29 29 0d 0a 09 09 09 72 65   "name")).....re
1f10: 74 75 72 6e 20 6e 65 77 20 56 61 72 45 78 70 72  turn new VarExpr
1f20: 65 73 73 69 6f 6e 28 70 6f 73 2c 20 76 2e 64 61  ession(pos, v.da
1f30: 74 61 29 3b 0d 0a 09 09 74 68 72 6f 77 20 67 65  ta);....throw ge
1f40: 6e 65 78 21 52 75 6e 74 69 6d 65 45 78 63 65 70  nex!RuntimeExcep
1f50: 74 69 6f 6e 28 63 61 73 74 28 4c 65 78 50 6f 73  tion(cast(LexPos
1f60: 69 74 69 6f 6e 29 6e 75 6c 6c 2c 20 60 49 6e 76  ition)null, `Inv
1f70: 61 6c 69 64 20 41 53 54 20 7b 69 73 3a 22 76 61  alid AST {is:"va
1f80: 72 22 2c 20 6e 61 6d 65 3a 28 6e 6f 74 20 73 74  r", name:(not st
1f90: 72 69 6e 67 29 7d 60 29 3b 0d 0a 09 63 61 73 65  ring)}`);...case
1fa0: 20 22 6c 61 79 22 3a 0d 0a 09 09 69 66 28 61 75   "lay":....if(au
1fb0: 74 6f 20 76 20 3d 20 74 2e 61 63 63 65 73 73 21  to v = t.access!
1fc0: 53 74 72 56 61 6c 75 65 28 74 68 65 4c 61 79 65  StrValue(theLaye
1fd0: 72 2c 20 22 6c 61 79 65 72 22 29 29 0d 0a 09 09  r, "layer"))....
1fe0: 09 69 66 28 61 75 74 6f 20 65 20 3d 20 74 2e 61  .if(auto e = t.a
1ff0: 63 63 65 73 73 21 54 61 62 6c 65 28 74 68 65 4c  ccess!Table(theL
2000: 61 79 65 72 2c 20 22 65 78 70 72 22 29 29 0d 0a  ayer, "expr"))..
2010: 09 09 09 09 72 65 74 75 72 6e 20 6e 65 77 20 4c  ....return new L
2020: 61 79 65 72 65 64 45 78 70 72 65 73 73 69 6f 6e  ayeredExpression
2030: 28 70 6f 73 2c 20 76 2e 64 61 74 61 2c 20 74 61  (pos, v.data, ta
2040: 62 6c 65 54 6f 41 53 54 28 74 68 65 4c 61 79 65  bleToAST(theLaye
2050: 72 2c 65 29 29 3b 0d 0a 09 09 09 65 6c 73 65 0d  r,e));.....else.
2060: 0a 09 09 09 09 74 68 72 6f 77 20 67 65 6e 65 78  .....throw genex
2070: 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f  !RuntimeExceptio
2080: 6e 28 63 61 73 74 28 4c 65 78 50 6f 73 69 74 69  n(cast(LexPositi
2090: 6f 6e 29 6e 75 6c 6c 2c 20 60 49 6e 76 61 6c 69  on)null, `Invali
20a0: 64 20 41 53 54 20 7b 69 73 3a 22 6c 61 79 22 2c  d AST {is:"lay",
20b0: 20 65 78 70 72 3a 28 6e 6f 74 20 74 61 62 6c 65   expr:(not table
20c0: 29 7d 60 29 3b 0d 0a 09 09 74 68 72 6f 77 20 67  )}`);....throw g
20d0: 65 6e 65 78 21 52 75 6e 74 69 6d 65 45 78 63 65  enex!RuntimeExce
20e0: 70 74 69 6f 6e 28 63 61 73 74 28 4c 65 78 50 6f  ption(cast(LexPo
20f0: 73 69 74 69 6f 6e 29 6e 75 6c 6c 2c 20 60 49 6e  sition)null, `In
2100: 76 61 6c 69 64 20 41 53 54 20 7b 69 73 3a 22 6c  valid AST {is:"l
2110: 61 79 22 2c 20 6c 61 79 65 72 3a 28 6e 6f 74 20  ay", layer:(not 
2120: 73 74 72 69 6e 67 29 7d 60 29 3b 0d 0a 09 63 61  string)}`);...ca
2130: 73 65 20 22 6c 65 74 22 3a 0d 0a 09 09 69 66 28  se "let":....if(
2140: 61 75 74 6f 20 6e 20 3d 20 74 2e 61 63 63 65 73  auto n = t.acces
2150: 73 21 53 74 72 56 61 6c 75 65 28 74 68 65 4c 61  s!StrValue(theLa
2160: 79 65 72 2c 20 22 6e 61 6d 65 22 29 29 0d 0a 09  yer, "name"))...
2170: 09 69 66 28 61 75 74 6f 20 65 20 3d 20 74 2e 61  .if(auto e = t.a
2180: 63 63 65 73 73 21 54 61 62 6c 65 28 74 68 65 4c  ccess!Table(theL
2190: 61 79 65 72 2c 20 22 69 6e 69 74 22 29 29 0d 0a  ayer, "init"))..
21a0: 09 09 69 66 28 61 75 74 6f 20 62 20 3d 20 74 2e  ..if(auto b = t.
21b0: 61 63 63 65 73 73 21 54 61 62 6c 65 28 74 68 65  access!Table(the
21c0: 4c 61 79 65 72 2c 20 22 65 78 70 72 22 29 29 0d  Layer, "expr")).
21d0: 0a 09 09 7b 0d 0a 09 09 09 73 74 72 69 6e 67 20  ...{.....string 
21e0: 6e 6e 20 3d 20 6e 2e 64 61 74 61 3b 0d 0a 09 09  nn = n.data;....
21f0: 09 61 75 74 6f 20 65 65 20 3d 20 74 61 62 6c 65  .auto ee = table
2200: 54 6f 41 53 54 28 74 68 65 4c 61 79 65 72 2c 20  ToAST(theLayer, 
2210: 65 29 3b 0d 0a 09 09 09 61 75 74 6f 20 62 62 20  e);.....auto bb 
2220: 3d 20 74 61 62 6c 65 54 6f 41 53 54 28 74 68 65  = tableToAST(the
2230: 4c 61 79 65 72 2c 20 62 29 3b 0d 0a 09 09 09 4c  Layer, b);.....L
2240: 61 79 65 72 20 6c 61 79 3d 22 22 3b 0d 0a 09 09  ayer lay="";....
2250: 09 69 66 28 61 75 74 6f 20 6c 20 3d 20 74 2e 61  .if(auto l = t.a
2260: 63 63 65 73 73 21 53 74 72 56 61 6c 75 65 28 74  ccess!StrValue(t
2270: 68 65 4c 61 79 65 72 2c 20 22 6c 61 79 65 72 22  heLayer, "layer"
2280: 29 29 0d 0a 09 09 09 09 6c 61 79 20 3d 20 6c 2e  ))......lay = l.
2290: 64 61 74 61 3b 0d 0a 09 09 09 72 65 74 75 72 6e  data;.....return
22a0: 20 6e 65 77 20 4c 65 74 45 78 70 72 65 73 73 69   new LetExpressi
22b0: 6f 6e 28 70 6f 73 2c 20 6e 6e 2c 20 6c 61 79 2c  on(pos, nn, lay,
22c0: 20 65 65 2c 20 62 62 29 3b 0d 0a 09 09 7d 0d 0a   ee, bb);....}..
22d0: 09 09 74 68 72 6f 77 20 67 65 6e 65 78 21 52 75  ..throw genex!Ru
22e0: 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 28 63  ntimeException(c
22f0: 61 73 74 28 4c 65 78 50 6f 73 69 74 69 6f 6e 29  ast(LexPosition)
2300: 6e 75 6c 6c 2c 20 60 49 6e 76 61 6c 69 64 20 41  null, `Invalid A
2310: 53 54 20 7b 69 73 3a 22 6c 65 74 22 2c 20 6e 61  ST {is:"let", na
2320: 6d 65 3a 22 3f 3f 3f 22 2c 20 69 6e 69 74 3a 22  me:"???", init:"
2330: 3f 3f 3f 22 2c 20 65 78 70 72 3a 22 3f 3f 3f 22  ???", expr:"???"
2340: 7d 60 29 3b 0d 0a 09 63 61 73 65 20 22 61 70 70  }`);...case "app
2350: 22 3a 0d 0a 09 09 69 66 28 61 75 74 6f 20 66 20  ":....if(auto f 
2360: 3d 20 74 2e 61 63 63 65 73 73 21 54 61 62 6c 65  = t.access!Table
2370: 28 74 68 65 4c 61 79 65 72 2c 20 22 66 75 6e 22  (theLayer, "fun"
2380: 29 29 0d 0a 09 09 69 66 28 61 75 74 6f 20 61 20  ))....if(auto a 
2390: 3d 20 74 2e 61 63 63 65 73 73 21 54 61 62 6c 65  = t.access!Table
23a0: 28 74 68 65 4c 61 79 65 72 2c 20 22 61 72 67 22  (theLayer, "arg"
23b0: 29 29 0d 0a 09 09 09 72 65 74 75 72 6e 20 6e 65  )).....return ne
23c0: 77 20 46 75 6e 63 61 6c 6c 45 78 70 72 65 73 73  w FuncallExpress
23d0: 69 6f 6e 28 70 6f 73 2c 20 74 61 62 6c 65 54 6f  ion(pos, tableTo
23e0: 41 53 54 28 74 68 65 4c 61 79 65 72 2c 66 29 2c  AST(theLayer,f),
23f0: 20 74 61 62 6c 65 54 6f 41 53 54 4c 69 73 74 28   tableToASTList(
2400: 74 68 65 4c 61 79 65 72 2c 61 29 29 3b 0d 0a 09  theLayer,a));...
2410: 09 74 68 72 6f 77 20 67 65 6e 65 78 21 52 75 6e  .throw genex!Run
2420: 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 28 63 61  timeException(ca
2430: 73 74 28 4c 65 78 50 6f 73 69 74 69 6f 6e 29 6e  st(LexPosition)n
2440: 75 6c 6c 2c 20 60 49 6e 76 61 6c 69 64 20 41 53  ull, `Invalid AS
2450: 54 20 7b 69 73 3a 22 61 70 70 22 2c 20 66 75 6e  T {is:"app", fun
2460: 3a 3f 3f 3f 2c 20 61 72 67 3a 3f 3f 3f 7d 60 29  :???, arg:???}`)
2470: 3b 0d 0a 09 63 61 73 65 20 22 66 75 6e 22 3a 0d  ;...case "fun":.
2480: 0a 09 09 69 66 28 61 75 74 6f 20 70 20 3d 20 74  ...if(auto p = t
2490: 2e 61 63 63 65 73 73 21 54 61 62 6c 65 28 74 68  .access!Table(th
24a0: 65 4c 61 79 65 72 2c 20 22 70 61 72 61 6d 22 29  eLayer, "param")
24b0: 29 0d 0a 09 09 69 66 28 61 75 74 6f 20 62 20 3d  )....if(auto b =
24c0: 20 74 2e 61 63 63 65 73 73 21 54 61 62 6c 65 28   t.access!Table(
24d0: 74 68 65 4c 61 79 65 72 2c 20 22 62 6f 64 79 22  theLayer, "body"
24e0: 29 29 0d 0a 09 09 7b 0d 0a 09 09 09 50 61 72 61  ))....{.....Para
24f0: 6d 65 74 65 72 5b 5d 20 70 73 3b 0d 0a 09 09 09  meter[] ps;.....
2500: 66 6f 72 65 61 63 68 28 76 3b 20 74 61 62 6c 65  foreach(v; table
2510: 41 73 43 6f 6e 73 4c 69 73 74 28 74 68 65 4c 61  AsConsList(theLa
2520: 79 65 72 2c 20 70 29 29 0d 0a 09 09 09 7b 0d 0a  yer, p)).....{..
2530: 09 09 09 09 69 66 28 61 75 74 6f 20 74 74 20 3d  ....if(auto tt =
2540: 20 63 61 73 74 28 54 61 62 6c 65 29 76 29 0d 0a   cast(Table)v)..
2550: 09 09 09 09 69 66 28 61 75 74 6f 20 73 73 20 3d  ....if(auto ss =
2560: 20 74 74 2e 61 63 63 65 73 73 21 53 74 72 56 61   tt.access!StrVa
2570: 6c 75 65 28 74 68 65 4c 61 79 65 72 2c 20 22 6e  lue(theLayer, "n
2580: 61 6d 65 22 29 29 0d 0a 09 09 09 09 69 66 28 61  ame"))......if(a
2590: 75 74 6f 20 6c 6c 20 3d 20 74 74 2e 61 63 63 65  uto ll = tt.acce
25a0: 73 73 21 54 61 62 6c 65 28 74 68 65 4c 61 79 65  ss!Table(theLaye
25b0: 72 2c 20 22 6c 61 79 65 72 22 29 29 0d 0a 09 09  r, "layer"))....
25c0: 09 09 7b 0d 0a 09 09 09 09 09 4c 61 79 65 72 5b  ..{.......Layer[
25d0: 5d 20 6c 73 3b 0d 0a 09 09 09 09 09 66 6f 72 65  ] ls;.......fore
25e0: 61 63 68 28 6c 6c 6c 3b 20 74 61 62 6c 65 41 73  ach(lll; tableAs
25f0: 43 6f 6e 73 4c 69 73 74 28 74 68 65 4c 61 79 65  ConsList(theLaye
2600: 72 2c 20 6c 6c 29 29 0d 0a 09 09 09 09 09 09 69  r, ll))........i
2610: 66 28 61 75 74 6f 20 6c 20 3d 20 63 61 73 74 28  f(auto l = cast(
2620: 53 74 72 56 61 6c 75 65 29 6c 6c 6c 29 0d 0a 09  StrValue)lll)...
2630: 09 09 09 09 09 09 6c 73 20 7e 3d 20 6c 2e 64 61  ......ls ~= l.da
2640: 74 61 3b 0d 0a 09 09 09 09 09 09 65 6c 73 65 0d  ta;........else.
2650: 0a 09 09 09 09 09 09 09 74 68 72 6f 77 20 67 65  ........throw ge
2660: 6e 65 78 21 52 75 6e 74 69 6d 65 45 78 63 65 70  nex!RuntimeExcep
2670: 74 69 6f 6e 28 63 61 73 74 28 4c 65 78 50 6f 73  tion(cast(LexPos
2680: 69 74 69 6f 6e 29 6e 75 6c 6c 2c 20 73 70 72 69  ition)null, spri
2690: 6e 74 66 21 60 49 6e 76 61 6c 69 64 20 41 53 54  ntf!`Invalid AST
26a0: 20 7b 62 61 64 20 66 75 6e 20 70 61 72 61 6d 73   {bad fun params
26b0: 20 25 73 7d 60 28 6c 6c 6c 29 29 3b 0d 0a 09 09   %s}`(lll));....
26c0: 09 09 09 70 73 20 7e 3d 20 6e 65 77 20 50 61 72  ...ps ~= new Par
26d0: 61 6d 65 74 65 72 28 73 73 2e 64 61 74 61 2c 20  ameter(ss.data, 
26e0: 6c 73 29 3b 0d 0a 09 09 09 09 09 63 6f 6e 74 69  ls);.......conti
26f0: 6e 75 65 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 09  nue;......}.....
2700: 09 65 6c 73 65 0d 0a 09 09 09 09 7b 0d 0a 09 09  .else......{....
2710: 09 09 09 4c 61 79 65 72 5b 5d 20 65 6d 70 3b 0d  ...Layer[] emp;.
2720: 0a 09 09 09 09 09 70 73 20 7e 3d 20 6e 65 77 20  ......ps ~= new 
2730: 50 61 72 61 6d 65 74 65 72 28 73 73 2e 64 61 74  Parameter(ss.dat
2740: 61 2c 20 65 6d 70 29 3b 0d 0a 09 09 09 09 09 63  a, emp);.......c
2750: 6f 6e 74 69 6e 75 65 3b 0d 0a 09 09 09 09 7d 0d  ontinue;......}.
2760: 0a 09 09 09 09 74 68 72 6f 77 20 67 65 6e 65 78  .....throw genex
2770: 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f  !RuntimeExceptio
2780: 6e 28 63 61 73 74 28 4c 65 78 50 6f 73 69 74 69  n(cast(LexPositi
2790: 6f 6e 29 6e 75 6c 6c 2c 20 73 70 72 69 6e 74 66  on)null, sprintf
27a0: 21 60 49 6e 76 61 6c 69 64 20 41 53 54 20 7b 62  !`Invalid AST {b
27b0: 61 64 20 66 75 6e 20 70 61 72 61 6d 73 20 25 73  ad fun params %s
27c0: 7d 60 28 76 29 29 3b 0d 0a 09 09 09 7d 0d 0a 09  }`(v));.....}...
27d0: 09 09 61 75 74 6f 20 62 62 20 3d 20 74 61 62 6c  ..auto bb = tabl
27e0: 65 54 6f 41 53 54 28 74 68 65 4c 61 79 65 72 2c  eToAST(theLayer,
27f0: 20 62 29 3b 0d 0a 09 09 09 72 65 74 75 72 6e 20   b);.....return 
2800: 6e 65 77 20 46 75 6e 4c 69 74 65 72 61 6c 28 70  new FunLiteral(p
2810: 6f 73 2c 70 73 2c 62 62 29 3b 0d 0a 09 09 7d 0d  os,ps,bb);....}.
2820: 0a 09 09 74 68 72 6f 77 20 67 65 6e 65 78 21 52  ...throw genex!R
2830: 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 28  untimeException(
2840: 63 61 73 74 28 4c 65 78 50 6f 73 69 74 69 6f 6e  cast(LexPosition
2850: 29 6e 75 6c 6c 2c 20 60 49 6e 76 61 6c 69 64 20  )null, `Invalid 
2860: 41 53 54 20 7b 69 73 3a 22 66 75 6e 22 2c 20 70  AST {is:"fun", p
2870: 61 72 61 6d 3a 3f 3f 3f 2c 20 62 6f 64 79 3a 3f  aram:???, body:?
2880: 3f 3f 7d 60 29 3b 0d 0a 09 64 65 66 61 75 6c 74  ??}`);...default
2890: 3a 0d 0a 09 09 74 68 72 6f 77 20 67 65 6e 65 78  :....throw genex
28a0: 21 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f  !RuntimeExceptio
28b0: 6e 28 63 61 73 74 28 4c 65 78 50 6f 73 69 74 69  n(cast(LexPositi
28c0: 6f 6e 29 6e 75 6c 6c 2c 20 73 70 72 69 6e 74 66  on)null, sprintf
28d0: 21 60 49 6e 76 61 6c 69 64 20 41 53 54 20 7b 69  !`Invalid AST {i
28e0: 73 3a 20 22 25 73 22 7d 20 75 6e 6b 6e 6f 77 6e  s: "%s"} unknown
28f0: 60 28 6e 6f 64 65 54 79 70 65 2e 64 61 74 61 29  `(nodeType.data)
2900: 29 3b 0d 0a 09 7d 0d 0a 7d 0d 0a                 );...}..}..