Hex Artifact Content
Not logged in

Artifact 7110e96fc2a7a412838f3acb61316cc72e61b36b:


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                                            ..