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