Hex Artifact Content
Not logged in

Artifact 6af5a0863b67aa85a9f4f2b89998be1f07228b71:


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