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 52 75 6e 74 69 6d 65 20 6c 69 62 72 61 72 * Runtime librar
0060: 79 20 66 6f 72 20 50 6f 6c 65 6d 79 20 70 72 6f y for Polemy pro
0070: 67 72 61 6d 6d 69 6e 67 20 6c 61 6e 67 75 61 67 gramming languag
0080: 65 2e 0a 20 2a 2f 0a 6d 6f 64 75 6c 65 20 70 6f e.. */.module po
0090: 6c 65 6d 79 2e 72 75 6e 74 69 6d 65 3b 0a 69 6d lemy.runtime;.im
00a0: 70 6f 72 74 20 70 6f 6c 65 6d 79 2e 5f 63 6f 6d port polemy._com
00b0: 6d 6f 6e 3b 0a 69 6d 70 6f 72 74 20 70 6f 6c 65 mon;.import pole
00c0: 6d 79 2e 6c 61 79 65 72 3b 0d 0a 69 6d 70 6f 72 my.layer;..impor
00d0: 74 20 70 6f 6c 65 6d 79 2e 76 61 6c 75 65 3b 0a t polemy.value;.
00e0: 69 6d 70 6f 72 74 20 70 6f 6c 65 6d 79 2e 65 76 import polemy.ev
00f0: 61 6c 3b 0a 69 6d 70 6f 72 74 20 73 74 64 2e 73 al;.import std.s
0100: 74 64 69 6f 3b 0a 0d 0a 2f 2f 2f 20 65 6e 72 6f tdio;.../// enro
0110: 6c 6c 20 74 68 65 20 6e 61 74 69 76 65 20 69 6d ll the native im
0120: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 plementations of
0130: 20 70 72 69 6d 69 74 69 76 65 20 66 75 6e 63 74 primitive funct
0140: 69 6f 6e 73 0d 0a 0d 0a 76 6f 69 64 20 65 6e 72 ions....void enr
0150: 6f 6c 6c 52 75 6e 74 69 6d 65 4c 69 62 72 61 72 ollRuntimeLibrar
0160: 79 28 20 45 76 61 6c 75 61 74 6f 72 20 65 20 29 y( Evaluator e )
0170: 0d 0a 7b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 ..{...e.addPrimi
0180: 74 69 76 65 28 22 2b 22 2c 20 20 56 61 6c 75 65 tive("+", Value
0190: 4c 61 79 65 72 2c 20 28 49 6e 74 56 61 6c 75 65 Layer, (IntValue
01a0: 20 6c 68 73 2c 20 49 6e 74 56 61 6c 75 65 20 72 lhs, IntValue r
01b0: 68 73 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 hs){return new I
01c0: 6e 74 56 61 6c 75 65 28 6c 68 73 2e 64 61 74 61 ntValue(lhs.data
01d0: 20 2b 20 72 68 73 2e 64 61 74 61 29 3b 7d 20 29 + rhs.data);} )
01e0: 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 69 ;...e.addPrimiti
01f0: 76 65 28 22 2d 22 2c 20 20 56 61 6c 75 65 4c 61 ve("-", ValueLa
0200: 79 65 72 2c 20 28 49 6e 74 56 61 6c 75 65 20 6c yer, (IntValue l
0210: 68 73 2c 20 49 6e 74 56 61 6c 75 65 20 72 68 73 hs, IntValue rhs
0220: 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 ){return new Int
0230: 56 61 6c 75 65 28 6c 68 73 2e 64 61 74 61 20 2d Value(lhs.data -
0240: 20 72 68 73 2e 64 61 74 61 29 3b 7d 20 29 3b 0d rhs.data);} );.
0250: 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 ..e.addPrimitive
0260: 28 22 2a 22 2c 20 20 56 61 6c 75 65 4c 61 79 65 ("*", ValueLaye
0270: 72 2c 20 28 49 6e 74 56 61 6c 75 65 20 6c 68 73 r, (IntValue lhs
0280: 2c 20 49 6e 74 56 61 6c 75 65 20 72 68 73 29 7b , IntValue rhs){
0290: 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 return new IntVa
02a0: 6c 75 65 28 6c 68 73 2e 64 61 74 61 20 2a 20 72 lue(lhs.data * r
02b0: 68 73 2e 64 61 74 61 29 3b 7d 20 29 3b 0d 0a 09 hs.data);} );...
02c0: 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 e.addPrimitive("
02d0: 2f 22 2c 20 20 56 61 6c 75 65 4c 61 79 65 72 2c /", ValueLayer,
02e0: 20 28 49 6e 74 56 61 6c 75 65 20 6c 68 73 2c 20 (IntValue lhs,
02f0: 49 6e 74 56 61 6c 75 65 20 72 68 73 29 7b 72 65 IntValue rhs){re
0300: 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 turn new IntValu
0310: 65 28 6c 68 73 2e 64 61 74 61 20 2f 20 72 68 73 e(lhs.data / rhs
0320: 2e 64 61 74 61 29 3b 7d 20 29 3b 0d 0a 09 65 2e .data);} );...e.
0330: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 25 22 addPrimitive("%"
0340: 2c 20 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 , ValueLayer, (
0350: 49 6e 74 56 61 6c 75 65 20 6c 68 73 2c 20 49 6e IntValue lhs, In
0360: 74 56 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 tValue rhs){retu
0370: 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 rn new IntValue(
0380: 6c 68 73 2e 64 61 74 61 20 25 20 72 68 73 2e 64 lhs.data % rhs.d
0390: 61 74 61 29 3b 7d 20 29 3b 0d 0a 09 65 2e 61 64 ata);} );...e.ad
03a0: 64 50 72 69 6d 69 74 69 76 65 28 22 7e 22 2c 20 dPrimitive("~",
03b0: 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 56 61 ValueLayer, (Va
03c0: 6c 75 65 20 6c 68 73 2c 20 56 61 6c 75 65 20 72 lue lhs, Value r
03d0: 68 73 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 53 hs){return new S
03e0: 74 72 56 61 6c 75 65 28 6c 68 73 2e 74 6f 53 74 trValue(lhs.toSt
03f0: 72 69 6e 67 20 7e 20 72 68 73 2e 74 6f 53 74 72 ring ~ rhs.toStr
0400: 69 6e 67 29 3b 7d 20 29 3b 0d 0a 09 65 2e 61 64 ing);} );...e.ad
0410: 64 50 72 69 6d 69 74 69 76 65 28 22 7c 7c 22 2c dPrimitive("||",
0420: 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 49 6e ValueLayer, (In
0430: 74 56 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 tValue lhs, IntV
0440: 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e alue rhs){return
0450: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 new IntValue(lh
0460: 73 2e 64 61 74 61 21 3d 30 20 7c 7c 20 72 68 73 s.data!=0 || rhs
0470: 2e 64 61 74 61 21 3d 30 29 3b 7d 20 29 3b 0d 0a .data!=0);} );..
0480: 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 .e.addPrimitive(
0490: 22 26 26 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 "&&", ValueLayer
04a0: 2c 20 28 49 6e 74 56 61 6c 75 65 20 6c 68 73 2c , (IntValue lhs,
04b0: 20 49 6e 74 56 61 6c 75 65 20 72 68 73 29 7b 72 IntValue rhs){r
04c0: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c eturn new IntVal
04d0: 75 65 28 6c 68 73 2e 64 61 74 61 21 3d 30 20 26 ue(lhs.data!=0 &
04e0: 26 20 72 68 73 2e 64 61 74 61 21 3d 30 29 3b 7d & rhs.data!=0);}
04f0: 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 );...e.addPrimi
0500: 74 69 76 65 28 22 3c 22 2c 20 20 56 61 6c 75 65 tive("<", Value
0510: 4c 61 79 65 72 2c 20 28 56 61 6c 75 65 20 6c 68 Layer, (Value lh
0520: 73 2c 20 56 61 6c 75 65 20 72 68 73 29 7b 72 65 s, Value rhs){re
0530: 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 turn new IntValu
0540: 65 28 6c 68 73 20 3c 20 72 68 73 29 3b 7d 20 29 e(lhs < rhs);} )
0550: 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 69 ;...e.addPrimiti
0560: 76 65 28 22 3e 22 2c 20 20 56 61 6c 75 65 4c 61 ve(">", ValueLa
0570: 79 65 72 2c 20 28 56 61 6c 75 65 20 6c 68 73 2c yer, (Value lhs,
0580: 20 56 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 Value rhs){retu
0590: 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 rn new IntValue(
05a0: 6c 68 73 20 3e 20 72 68 73 29 3b 7d 20 29 3b 0d lhs > rhs);} );.
05b0: 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 ..e.addPrimitive
05c0: 28 22 3c 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 ("<=", ValueLaye
05d0: 72 2c 20 28 56 61 6c 75 65 20 6c 68 73 2c 20 56 r, (Value lhs, V
05e0: 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e alue rhs){return
05f0: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 new IntValue(lh
0600: 73 20 3c 3d 20 72 68 73 29 3b 7d 20 29 3b 0d 0a s <= rhs);} );..
0610: 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 .e.addPrimitive(
0620: 22 3e 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 ">=", ValueLayer
0630: 2c 20 28 56 61 6c 75 65 20 6c 68 73 2c 20 56 61 , (Value lhs, Va
0640: 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 lue rhs){return
0650: 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 new IntValue(lhs
0660: 20 3e 3d 20 72 68 73 29 3b 7d 20 29 3b 0d 0a 09 >= rhs);} );...
0670: 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 e.addPrimitive("
0680: 3d 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c ==", ValueLayer,
0690: 20 28 56 61 6c 75 65 20 6c 68 73 2c 20 56 61 6c (Value lhs, Val
06a0: 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e ue rhs){return n
06b0: 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 20 ew IntValue(lhs
06c0: 3d 3d 20 72 68 73 29 3b 7d 20 29 3b 0d 0a 09 65 == rhs);} );...e
06d0: 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 21 .addPrimitive("!
06e0: 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 =", ValueLayer,
06f0: 28 56 61 6c 75 65 20 6c 68 73 2c 20 56 61 6c 75 (Value lhs, Valu
0700: 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e 65 e rhs){return ne
0710: 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 20 21 w IntValue(lhs !
0720: 3d 20 72 68 73 29 3b 7d 20 29 3b 0d 0a 09 65 2e = rhs);} );...e.
0730: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 70 72 addPrimitive("pr
0740: 69 6e 74 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 int", ValueLayer
0750: 2c 20 28 56 61 6c 75 65 20 61 29 7b 0d 0a 09 09 , (Value a){....
0760: 77 72 69 74 65 6c 6e 28 61 29 3b 0d 0a 09 09 72 writeln(a);....r
0770: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c eturn new IntVal
0780: 75 65 28 30 29 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 ue(0);...});...e
0790: 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 69 .addPrimitive("i
07a0: 66 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 f", ValueLayer,
07b0: 28 49 6e 74 56 61 6c 75 65 20 78 2c 20 46 75 6e (IntValue x, Fun
07c0: 56 61 6c 75 65 20 66 74 2c 20 46 75 6e 56 61 6c Value ft, FunVal
07d0: 75 65 20 66 65 29 7b 0d 0a 09 09 61 75 74 6f 20 ue fe){....auto
07e0: 74 6f 52 75 6e 20 3d 20 28 78 2e 64 61 74 61 3d toRun = (x.data=
07f0: 3d 30 20 3f 20 66 65 20 3a 20 66 74 29 3b 0d 0a =0 ? fe : ft);..
0800: 09 09 2f 2f 20 5b 54 4f 44 4f 5d 20 66 69 6c 6c ..// [TODO] fill
0810: 20 70 6f 73 69 74 69 6f 6e 61 6c 20 69 6e 66 6f positional info
0820: 72 6d 61 74 69 6f 6e 0d 0a 09 09 72 65 74 75 72 rmation....retur
0830: 6e 20 74 6f 52 75 6e 2e 69 6e 76 6f 6b 65 28 56 n toRun.invoke(V
0840: 61 6c 75 65 4c 61 79 65 72 2c 20 74 6f 52 75 6e alueLayer, toRun
0850: 2e 64 65 66 69 6e 69 74 69 6f 6e 43 6f 6e 74 65 .definitionConte
0860: 78 74 28 29 2c 20 6e 75 6c 6c 29 3b 0d 0a 09 7d xt(), null);...}
0870: 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 );...e.addPrimit
0880: 69 76 65 28 22 5f 69 73 69 6e 74 22 2c 20 56 61 ive("_isint", Va
0890: 6c 75 65 4c 61 79 65 72 2c 20 28 56 61 6c 75 65 lueLayer, (Value
08a0: 20 76 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 v){return new I
08b0: 6e 74 56 61 6c 75 65 28 63 61 73 74 28 49 6e 74 ntValue(cast(Int
08c0: 56 61 6c 75 65 29 76 20 21 69 73 20 6e 75 6c 6c Value)v !is null
08d0: 29 3b 7d 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 );} );...e.addPr
08e0: 69 6d 69 74 69 76 65 28 22 5f 69 73 73 74 72 22 imitive("_isstr"
08f0: 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 56 , ValueLayer, (V
0900: 61 6c 75 65 20 76 29 7b 72 65 74 75 72 6e 20 6e alue v){return n
0910: 65 77 20 49 6e 74 56 61 6c 75 65 28 63 61 73 74 ew IntValue(cast
0920: 28 53 74 72 56 61 6c 75 65 29 76 20 21 69 73 20 (StrValue)v !is
0930: 6e 75 6c 6c 29 3b 7d 20 29 3b 0d 0a 09 65 2e 61 null);} );...e.a
0940: 64 64 50 72 69 6d 69 74 69 76 65 28 22 5f 69 73 ddPrimitive("_is
0950: 66 75 6e 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 fun", ValueLayer
0960: 2c 20 28 56 61 6c 75 65 20 76 29 7b 72 65 74 75 , (Value v){retu
0970: 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 rn new IntValue(
0980: 63 61 73 74 28 46 75 6e 56 61 6c 75 65 29 76 20 cast(FunValue)v
0990: 21 69 73 20 6e 75 6c 6c 29 3b 7d 20 29 3b 0d 0a !is null);} );..
09a0: 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 .e.addPrimitive(
09b0: 22 5f 69 73 75 6e 64 65 66 69 6e 65 64 22 2c 20 "_isundefined",
09c0: 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 56 61 6c ValueLayer, (Val
09d0: 75 65 20 76 29 7b 72 65 74 75 72 6e 20 6e 65 77 ue v){return new
09e0: 20 49 6e 74 56 61 6c 75 65 28 63 61 73 74 28 55 IntValue(cast(U
09f0: 6e 64 65 66 69 6e 65 64 56 61 6c 75 65 29 76 20 ndefinedValue)v
0a00: 21 69 73 20 6e 75 6c 6c 29 3b 7d 20 29 3b 0d 0a !is null);} );..
0a10: 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 .e.addPrimitive(
0a20: 22 5f 69 73 74 61 62 6c 65 22 2c 20 56 61 6c 75 "_istable", Valu
0a30: 65 4c 61 79 65 72 2c 20 28 56 61 6c 75 65 20 76 eLayer, (Value v
0a40: 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 ){return new Int
0a50: 56 61 6c 75 65 28 63 61 73 74 28 54 61 62 6c 65 Value(cast(Table
0a60: 29 76 20 21 69 73 20 6e 75 6c 6c 29 3b 7d 20 29 )v !is null);} )
0a70: 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 69 ;...e.addPrimiti
0a80: 76 65 28 22 2e 22 2c 20 56 61 6c 75 65 4c 61 79 ve(".", ValueLay
0a90: 65 72 2c 20 28 54 61 62 6c 65 20 74 2c 20 53 74 er, (Table t, St
0aa0: 72 56 61 6c 75 65 20 73 29 7b 0d 0a 09 09 72 65 rValue s){....re
0ab0: 74 75 72 6e 20 28 74 2e 68 61 73 28 73 2e 64 61 turn (t.has(s.da
0ac0: 74 61 2c 20 56 61 6c 75 65 4c 61 79 65 72 29 20 ta, ValueLayer)
0ad0: 3f 20 74 2e 67 65 74 28 73 2e 64 61 74 61 2c 20 ? t.get(s.data,
0ae0: 56 61 6c 75 65 4c 61 79 65 72 29 20 3a 20 6e 65 ValueLayer) : ne
0af0: 77 20 55 6e 64 65 66 69 6e 65 64 56 61 6c 75 65 w UndefinedValue
0b00: 29 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 2e 61 64 64 );...});...e.add
0b10: 50 72 69 6d 69 74 69 76 65 28 22 2e 3f 22 2c 20 Primitive(".?",
0b20: 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 54 61 62 ValueLayer, (Tab
0b30: 6c 65 20 74 2c 20 53 74 72 56 61 6c 75 65 20 73 le t, StrValue s
0b40: 29 7b 0d 0a 09 09 72 65 74 75 72 6e 20 6e 65 77 ){....return new
0b50: 20 49 6e 74 56 61 6c 75 65 28 74 2e 68 61 73 28 IntValue(t.has(
0b60: 73 2e 64 61 74 61 2c 20 56 61 6c 75 65 4c 61 79 s.data, ValueLay
0b70: 65 72 29 29 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 2e er));...});...e.
0b80: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 2e 3d addPrimitive(".=
0b90: 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 ", ValueLayer, (
0ba0: 54 61 62 6c 65 20 74 2c 20 53 74 72 56 61 6c 75 Table t, StrValu
0bb0: 65 20 73 2c 20 56 61 6c 75 65 20 76 29 7b 0d 0a e s, Value v){..
0bc0: 09 09 61 75 74 6f 20 74 32 20 3d 20 6e 65 77 20 ..auto t2 = new
0bd0: 54 61 62 6c 65 28 74 2c 20 54 61 62 6c 65 2e 4b Table(t, Table.K
0be0: 69 6e 64 2e 4e 6f 74 50 72 6f 70 61 67 61 74 65 ind.NotPropagate
0bf0: 53 65 74 29 3b 0d 0a 09 09 74 32 2e 73 65 74 28 Set);....t2.set(
0c00: 73 2e 64 61 74 61 2c 20 56 61 6c 75 65 4c 61 79 s.data, ValueLay
0c10: 65 72 2c 20 76 29 3b 0d 0a 09 09 72 65 74 75 72 er, v);....retur
0c20: 6e 20 74 32 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 2e n t2;...});...e.
0c30: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 7b 7d addPrimitive("{}
0c40: 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 ", ValueLayer, (
0c50: 29 7b 0d 0a 09 09 72 65 74 75 72 6e 20 6e 65 77 ){....return new
0c60: 20 54 61 62 6c 65 3b 0d 0a 09 7d 29 3b 0d 0a 7d Table;...});..}
0c70: 0d 0a ..