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