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 7c 7c 22 2c dPrimitive("||",
03b0: 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 49 6e ValueLayer, (In
03c0: 74 56 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 tValue lhs, IntV
03d0: 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e alue rhs){return
03e0: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 new IntValue(lh
03f0: 73 2e 64 61 74 61 21 3d 30 20 7c 7c 20 72 68 73 s.data!=0 || rhs
0400: 2e 64 61 74 61 21 3d 30 29 3b 7d 20 29 3b 0d 0a .data!=0);} );..
0410: 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 .e.addPrimitive(
0420: 22 26 26 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 "&&", ValueLayer
0430: 2c 20 28 49 6e 74 56 61 6c 75 65 20 6c 68 73 2c , (IntValue lhs,
0440: 20 49 6e 74 56 61 6c 75 65 20 72 68 73 29 7b 72 IntValue rhs){r
0450: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c eturn new IntVal
0460: 75 65 28 6c 68 73 2e 64 61 74 61 21 3d 30 20 26 ue(lhs.data!=0 &
0470: 26 20 72 68 73 2e 64 61 74 61 21 3d 30 29 3b 7d & rhs.data!=0);}
0480: 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 );...e.addPrimi
0490: 74 69 76 65 28 22 3c 22 2c 20 20 56 61 6c 75 65 tive("<", Value
04a0: 4c 61 79 65 72 2c 20 28 56 61 6c 75 65 20 6c 68 Layer, (Value lh
04b0: 73 2c 20 56 61 6c 75 65 20 72 68 73 29 7b 72 65 s, Value rhs){re
04c0: 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 turn new IntValu
04d0: 65 28 6c 68 73 20 3c 20 72 68 73 29 3b 7d 20 29 e(lhs < rhs);} )
04e0: 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 69 ;...e.addPrimiti
04f0: 76 65 28 22 3e 22 2c 20 20 56 61 6c 75 65 4c 61 ve(">", ValueLa
0500: 79 65 72 2c 20 28 56 61 6c 75 65 20 6c 68 73 2c yer, (Value lhs,
0510: 20 56 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 Value rhs){retu
0520: 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 rn new IntValue(
0530: 6c 68 73 20 3e 20 72 68 73 29 3b 7d 20 29 3b 0d lhs > rhs);} );.
0540: 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 ..e.addPrimitive
0550: 28 22 3c 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 ("<=", ValueLaye
0560: 72 2c 20 28 56 61 6c 75 65 20 6c 68 73 2c 20 56 r, (Value lhs, V
0570: 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e alue rhs){return
0580: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 new IntValue(lh
0590: 73 20 3c 3d 20 72 68 73 29 3b 7d 20 29 3b 0d 0a s <= rhs);} );..
05a0: 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 .e.addPrimitive(
05b0: 22 3e 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 ">=", ValueLayer
05c0: 2c 20 28 56 61 6c 75 65 20 6c 68 73 2c 20 56 61 , (Value lhs, Va
05d0: 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 lue rhs){return
05e0: 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 new IntValue(lhs
05f0: 20 3e 3d 20 72 68 73 29 3b 7d 20 29 3b 0d 0a 09 >= rhs);} );...
0600: 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 e.addPrimitive("
0610: 3d 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c ==", ValueLayer,
0620: 20 28 56 61 6c 75 65 20 6c 68 73 2c 20 56 61 6c (Value lhs, Val
0630: 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e ue rhs){return n
0640: 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 20 ew IntValue(lhs
0650: 3d 3d 20 72 68 73 29 3b 7d 20 29 3b 0d 0a 09 65 == rhs);} );...e
0660: 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 21 .addPrimitive("!
0670: 3d 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 =", ValueLayer,
0680: 28 56 61 6c 75 65 20 6c 68 73 2c 20 56 61 6c 75 (Value lhs, Valu
0690: 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e 65 e rhs){return ne
06a0: 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 20 21 w IntValue(lhs !
06b0: 3d 20 72 68 73 29 3b 7d 20 29 3b 0d 0a 09 65 2e = rhs);} );...e.
06c0: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 70 72 addPrimitive("pr
06d0: 69 6e 74 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 int", ValueLayer
06e0: 2c 20 28 56 61 6c 75 65 20 61 29 7b 0d 0a 09 09 , (Value a){....
06f0: 77 72 69 74 65 6c 6e 28 61 29 3b 0d 0a 09 09 72 writeln(a);....r
0700: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c eturn new IntVal
0710: 75 65 28 30 29 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 ue(0);...});...e
0720: 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 69 .addPrimitive("i
0730: 66 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 f", ValueLayer,
0740: 28 49 6e 74 56 61 6c 75 65 20 78 2c 20 46 75 6e (IntValue x, Fun
0750: 56 61 6c 75 65 20 66 74 2c 20 46 75 6e 56 61 6c Value ft, FunVal
0760: 75 65 20 66 65 29 7b 0d 0a 09 09 61 75 74 6f 20 ue fe){....auto
0770: 74 6f 52 75 6e 20 3d 20 28 78 2e 64 61 74 61 3d toRun = (x.data=
0780: 3d 30 20 3f 20 66 65 20 3a 20 66 74 29 3b 0d 0a =0 ? fe : ft);..
0790: 09 09 2f 2f 20 5b 54 4f 44 4f 5d 20 66 69 6c 6c ..// [TODO] fill
07a0: 20 70 6f 73 69 74 69 6f 6e 61 6c 20 69 6e 66 6f positional info
07b0: 72 6d 61 74 69 6f 6e 0d 0a 09 09 72 65 74 75 72 rmation....retur
07c0: 6e 20 74 6f 52 75 6e 2e 69 6e 76 6f 6b 65 28 56 n toRun.invoke(V
07d0: 61 6c 75 65 4c 61 79 65 72 2c 20 74 6f 52 75 6e alueLayer, toRun
07e0: 2e 64 65 66 69 6e 69 74 69 6f 6e 43 6f 6e 74 65 .definitionConte
07f0: 78 74 28 29 2c 20 6e 75 6c 6c 29 3b 0d 0a 09 7d xt(), null);...}
0800: 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 );...e.addPrimit
0810: 69 76 65 28 22 5f 69 73 69 6e 74 22 2c 20 56 61 ive("_isint", Va
0820: 6c 75 65 4c 61 79 65 72 2c 20 28 56 61 6c 75 65 lueLayer, (Value
0830: 20 76 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 v){return new I
0840: 6e 74 56 61 6c 75 65 28 63 61 73 74 28 49 6e 74 ntValue(cast(Int
0850: 56 61 6c 75 65 29 76 20 21 69 73 20 6e 75 6c 6c Value)v !is null
0860: 29 3b 7d 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 );} );...e.addPr
0870: 69 6d 69 74 69 76 65 28 22 5f 69 73 73 74 72 22 imitive("_isstr"
0880: 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 56 , ValueLayer, (V
0890: 61 6c 75 65 20 76 29 7b 72 65 74 75 72 6e 20 6e alue v){return n
08a0: 65 77 20 49 6e 74 56 61 6c 75 65 28 63 61 73 74 ew IntValue(cast
08b0: 28 53 74 72 56 61 6c 75 65 29 76 20 21 69 73 20 (StrValue)v !is
08c0: 6e 75 6c 6c 29 3b 7d 20 29 3b 0d 0a 09 65 2e 61 null);} );...e.a
08d0: 64 64 50 72 69 6d 69 74 69 76 65 28 22 5f 69 73 ddPrimitive("_is
08e0: 66 75 6e 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 fun", ValueLayer
08f0: 2c 20 28 56 61 6c 75 65 20 76 29 7b 72 65 74 75 , (Value v){retu
0900: 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 rn new IntValue(
0910: 63 61 73 74 28 46 75 6e 56 61 6c 75 65 29 76 20 cast(FunValue)v
0920: 21 69 73 20 6e 75 6c 6c 29 3b 7d 20 29 3b 0d 0a !is null);} );..
0930: 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 .e.addPrimitive(
0940: 22 5f 69 73 75 6e 64 65 66 69 6e 65 64 22 2c 20 "_isundefined",
0950: 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 56 61 6c ValueLayer, (Val
0960: 75 65 20 76 29 7b 72 65 74 75 72 6e 20 6e 65 77 ue v){return new
0970: 20 49 6e 74 56 61 6c 75 65 28 63 61 73 74 28 55 IntValue(cast(U
0980: 6e 64 65 66 69 6e 65 64 56 61 6c 75 65 29 76 20 ndefinedValue)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 74 61 62 6c 65 22 2c 20 56 61 6c 75 "_istable", Valu
09c0: 65 4c 61 79 65 72 2c 20 28 56 61 6c 75 65 20 76 eLayer, (Value v
09d0: 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 ){return new Int
09e0: 56 61 6c 75 65 28 63 61 73 74 28 54 61 62 6c 65 Value(cast(Table
09f0: 29 76 20 21 69 73 20 6e 75 6c 6c 29 3b 7d 20 29 )v !is null);} )
0a00: 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 69 ;...e.addPrimiti
0a10: 76 65 28 22 2e 22 2c 20 56 61 6c 75 65 4c 61 79 ve(".", ValueLay
0a20: 65 72 2c 20 28 54 61 62 6c 65 20 74 2c 20 53 74 er, (Table t, St
0a30: 72 56 61 6c 75 65 20 73 29 7b 0d 0a 09 09 72 65 rValue s){....re
0a40: 74 75 72 6e 20 28 74 2e 68 61 73 28 73 2e 64 61 turn (t.has(s.da
0a50: 74 61 2c 20 56 61 6c 75 65 4c 61 79 65 72 29 20 ta, ValueLayer)
0a60: 3f 20 74 2e 67 65 74 28 73 2e 64 61 74 61 2c 20 ? t.get(s.data,
0a70: 56 61 6c 75 65 4c 61 79 65 72 29 20 3a 20 6e 65 ValueLayer) : ne
0a80: 77 20 55 6e 64 65 66 69 6e 65 64 56 61 6c 75 65 w UndefinedValue
0a90: 29 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 2e 61 64 64 );...});...e.add
0aa0: 50 72 69 6d 69 74 69 76 65 28 22 2e 3f 22 2c 20 Primitive(".?",
0ab0: 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 54 61 62 ValueLayer, (Tab
0ac0: 6c 65 20 74 2c 20 53 74 72 56 61 6c 75 65 20 73 le t, StrValue s
0ad0: 29 7b 0d 0a 09 09 72 65 74 75 72 6e 20 6e 65 77 ){....return new
0ae0: 20 49 6e 74 56 61 6c 75 65 28 74 2e 68 61 73 28 IntValue(t.has(
0af0: 73 2e 64 61 74 61 2c 20 56 61 6c 75 65 4c 61 79 s.data, ValueLay
0b00: 65 72 29 29 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 2e er));...});...e.
0b10: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 2e 3d addPrimitive(".=
0b20: 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 ", ValueLayer, (
0b30: 54 61 62 6c 65 20 74 2c 20 53 74 72 56 61 6c 75 Table t, StrValu
0b40: 65 20 73 2c 20 56 61 6c 75 65 20 76 29 7b 0d 0a e s, Value v){..
0b50: 09 09 61 75 74 6f 20 74 32 20 3d 20 6e 65 77 20 ..auto t2 = new
0b60: 54 61 62 6c 65 28 74 2c 20 54 61 62 6c 65 2e 4b Table(t, Table.K
0b70: 69 6e 64 2e 4e 6f 74 50 72 6f 70 61 67 61 74 65 ind.NotPropagate
0b80: 53 65 74 29 3b 0d 0a 09 09 74 32 2e 73 65 74 28 Set);....t2.set(
0b90: 73 2e 64 61 74 61 2c 20 56 61 6c 75 65 4c 61 79 s.data, ValueLay
0ba0: 65 72 2c 20 76 29 3b 0d 0a 09 09 72 65 74 75 72 er, v);....retur
0bb0: 6e 20 74 32 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 2e n t2;...});...e.
0bc0: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 7b 7d addPrimitive("{}
0bd0: 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 ", ValueLayer, (
0be0: 29 7b 0d 0a 09 09 72 65 74 75 72 6e 20 6e 65 77 ){....return new
0bf0: 20 54 61 62 6c 65 3b 0d 0a 09 7d 29 3b 0d 0a 7d Table;...});..}
0c00: 0d 0a ..