Hex Artifact Content
Not logged in

Artifact f71ff7dc6628e4237c43db2d9387c9ed33875124:


0000: 0d 0a 2f 2a 2a 0a 20 2a 20 41 75 74 68 6f 72 73  ../**. * Authors
0010: 3a 20 6b 2e 69 6e 61 62 61 0a 20 2a 20 4c 69 63  : k.inaba. * Lic
0020: 65 6e 73 65 3a 20 4e 59 53 4c 20 30 2e 39 39 38  ense: NYSL 0.998
0030: 32 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6b 6d 6f  2 http://www.kmo
0040: 6e 6f 73 2e 6e 65 74 2f 6e 79 73 6c 2f 0a 20 2a  nos.net/nysl/. *
0050: 0a 20 2a 20 52 75 6e 74 69 6d 65 20 6c 69 62 72  . * Runtime libr
0060: 61 72 79 20 66 6f 72 20 50 6f 6c 65 6d 79 20 70  ary for Polemy p
0070: 72 6f 67 72 61 6d 6d 69 6e 67 20 6c 61 6e 67 75  rogramming langu
0080: 61 67 65 2e 0a 20 2a 2f 0a 6d 6f 64 75 6c 65 20  age.. */.module 
0090: 70 6f 6c 65 6d 79 2e 72 75 6e 74 69 6d 65 3b 0a  polemy.runtime;.
00a0: 69 6d 70 6f 72 74 20 70 6f 6c 65 6d 79 2e 5f 63  import polemy._c
00b0: 6f 6d 6d 6f 6e 3b 0a 69 6d 70 6f 72 74 20 70 6f  ommon;.import po
00c0: 6c 65 6d 79 2e 6c 61 79 65 72 3b 0d 0a 69 6d 70  lemy.layer;..imp
00d0: 6f 72 74 20 70 6f 6c 65 6d 79 2e 66 61 69 6c 75  ort polemy.failu
00e0: 72 65 3b 0d 0a 69 6d 70 6f 72 74 20 70 6f 6c 65  re;..import pole
00f0: 6d 79 2e 66 72 65 73 68 3b 0d 0a 69 6d 70 6f 72  my.fresh;..impor
0100: 74 20 70 6f 6c 65 6d 79 2e 76 61 6c 75 65 3b 0d  t polemy.value;.
0110: 0a 69 6d 70 6f 72 74 20 70 6f 6c 65 6d 79 2e 65  .import polemy.e
0120: 76 61 6c 3b 0a 69 6d 70 6f 72 74 20 73 74 64 2e  val;.import std.
0130: 73 74 64 69 6f 3b 0a 69 6d 70 6f 72 74 20 73 74  stdio;.import st
0140: 64 2e 72 61 6e 64 6f 6d 3b 0d 0a 0d 0a 2f 2f 2f  d.random;....///
0150: 20 65 6e 72 6f 6c 6c 20 74 68 65 20 6e 61 74 69   enroll the nati
0160: 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ve implementatio
0170: 6e 73 20 6f 66 20 70 72 69 6d 69 74 69 76 65 20  ns of primitive 
0180: 66 75 6e 63 74 69 6f 6e 73 0d 0a 0d 0a 76 6f 69  functions....voi
0190: 64 20 65 6e 72 6f 6c 6c 52 75 6e 74 69 6d 65 4c  d enrollRuntimeL
01a0: 69 62 72 61 72 79 28 20 45 76 61 6c 75 61 74 6f  ibrary( Evaluato
01b0: 72 20 65 20 29 0d 0a 7b 0d 0a 09 2f 2f 20 61 72  r e )..{...// ar
01c0: 69 74 68 6d 65 74 69 63 20 6f 70 65 72 61 74 69  ithmetic operati
01d0: 6f 6e 73 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69  ons...e.addPrimi
01e0: 74 69 76 65 28 22 2b 22 2c 20 20 56 61 6c 75 65  tive("+",  Value
01f0: 4c 61 79 65 72 2c 0d 0a 09 09 28 49 6e 74 56 61  Layer,....(IntVa
0200: 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 61 6c 75  lue lhs, IntValu
0210: 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e 65  e rhs){return ne
0220: 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 2e 64  w IntValue(lhs.d
0230: 61 74 61 20 2b 20 72 68 73 2e 64 61 74 61 29 3b  ata + rhs.data);
0240: 7d 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d  } );...e.addPrim
0250: 69 74 69 76 65 28 22 2d 22 2c 20 20 56 61 6c 75  itive("-",  Valu
0260: 65 4c 61 79 65 72 2c 0d 0a 09 09 28 49 6e 74 56  eLayer,....(IntV
0270: 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 61 6c  alue lhs, IntVal
0280: 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e  ue rhs){return n
0290: 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 2e  ew IntValue(lhs.
02a0: 64 61 74 61 20 2d 20 72 68 73 2e 64 61 74 61 29  data - rhs.data)
02b0: 3b 7d 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69  ;} );...e.addPri
02c0: 6d 69 74 69 76 65 28 22 2a 22 2c 20 20 56 61 6c  mitive("*",  Val
02d0: 75 65 4c 61 79 65 72 2c 0d 0a 09 09 28 49 6e 74  ueLayer,....(Int
02e0: 56 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 61  Value lhs, IntVa
02f0: 6c 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20  lue rhs){return 
0300: 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73  new IntValue(lhs
0310: 2e 64 61 74 61 20 2a 20 72 68 73 2e 64 61 74 61  .data * rhs.data
0320: 29 3b 7d 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72  );} );...e.addPr
0330: 69 6d 69 74 69 76 65 28 22 2f 22 2c 20 20 56 61  imitive("/",  Va
0340: 6c 75 65 4c 61 79 65 72 2c 0d 0a 09 09 28 49 6e  lueLayer,....(In
0350: 74 56 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56  tValue lhs, IntV
0360: 61 6c 75 65 20 72 68 73 29 7b 0d 0a 09 09 09 69  alue rhs){.....i
0370: 66 28 20 72 68 73 2e 64 61 74 61 20 3d 3d 20 30  f( rhs.data == 0
0380: 20 29 0d 0a 09 09 09 09 74 68 72 6f 77 20 67 65   )......throw ge
0390: 6e 65 78 21 52 75 6e 74 69 6d 65 45 78 63 65 70  nex!RuntimeExcep
03a0: 74 69 6f 6e 28 22 64 69 76 69 73 69 6f 6e 20 62  tion("division b
03b0: 79 20 30 22 29 3b 0d 0a 09 09 09 72 65 74 75 72  y 0");.....retur
03c0: 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 6c  n new IntValue(l
03d0: 68 73 2e 64 61 74 61 20 2f 20 72 68 73 2e 64 61  hs.data / rhs.da
03e0: 74 61 29 3b 0d 0a 09 09 7d 29 3b 0d 0a 09 65 2e  ta);....});...e.
03f0: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 25 22  addPrimitive("%"
0400: 2c 20 20 56 61 6c 75 65 4c 61 79 65 72 2c 0d 0a  ,  ValueLayer,..
0410: 09 09 28 49 6e 74 56 61 6c 75 65 20 6c 68 73 2c  ..(IntValue lhs,
0420: 20 49 6e 74 56 61 6c 75 65 20 72 68 73 29 7b 72   IntValue rhs){r
0430: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c  eturn new IntVal
0440: 75 65 28 6c 68 73 2e 64 61 74 61 20 25 20 72 68  ue(lhs.data % rh
0450: 73 2e 64 61 74 61 29 3b 7d 20 29 3b 0d 0a 09 65  s.data);} );...e
0460: 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 7c  .addPrimitive("|
0470: 7c 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 0d  |", ValueLayer,.
0480: 0a 09 09 28 49 6e 74 56 61 6c 75 65 20 6c 68 73  ...(IntValue lhs
0490: 2c 20 49 6e 74 56 61 6c 75 65 20 72 68 73 29 7b  , IntValue rhs){
04a0: 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61  return new IntVa
04b0: 6c 75 65 28 6c 68 73 2e 64 61 74 61 21 3d 30 20  lue(lhs.data!=0 
04c0: 7c 7c 20 72 68 73 2e 64 61 74 61 21 3d 30 29 3b  || rhs.data!=0);
04d0: 7d 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d  } );...e.addPrim
04e0: 69 74 69 76 65 28 22 26 26 22 2c 20 56 61 6c 75  itive("&&", Valu
04f0: 65 4c 61 79 65 72 2c 0d 0a 09 09 28 49 6e 74 56  eLayer,....(IntV
0500: 61 6c 75 65 20 6c 68 73 2c 20 49 6e 74 56 61 6c  alue lhs, IntVal
0510: 75 65 20 72 68 73 29 7b 72 65 74 75 72 6e 20 6e  ue rhs){return n
0520: 65 77 20 49 6e 74 56 61 6c 75 65 28 6c 68 73 2e  ew IntValue(lhs.
0530: 64 61 74 61 21 3d 30 20 26 26 20 72 68 73 2e 64  data!=0 && rhs.d
0540: 61 74 61 21 3d 30 29 3b 7d 20 29 3b 0d 0a 09 2f  ata!=0);} );.../
0550: 2f 20 73 74 72 69 6e 67 20 6f 70 65 72 61 74 69  / string operati
0560: 6f 6e 28 73 29 0d 0a 09 65 2e 61 64 64 50 72 69  on(s)...e.addPri
0570: 6d 69 74 69 76 65 28 22 7e 22 2c 20 20 56 61 6c  mitive("~",  Val
0580: 75 65 4c 61 79 65 72 2c 0d 0a 09 09 28 56 61 6c  ueLayer,....(Val
0590: 75 65 20 6c 68 73 2c 20 56 61 6c 75 65 20 72 68  ue lhs, Value rh
05a0: 73 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 53 74  s){return new St
05b0: 72 56 61 6c 75 65 28 6c 68 73 2e 74 6f 53 74 72  rValue(lhs.toStr
05c0: 69 6e 67 20 7e 20 72 68 73 2e 74 6f 53 74 72 69  ing ~ rhs.toStri
05d0: 6e 67 29 3b 7d 20 29 3b 0d 0a 09 2f 2f 20 63 6f  ng);} );...// co
05e0: 6d 70 61 72 69 73 6f 6e 0d 0a 09 65 2e 61 64 64  mparison...e.add
05f0: 50 72 69 6d 69 74 69 76 65 28 22 3c 22 2c 20 20  Primitive("<",  
0600: 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 56 61 6c  ValueLayer, (Val
0610: 75 65 20 6c 68 73 2c 20 56 61 6c 75 65 20 72 68  ue lhs, Value rh
0620: 73 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e  s){return new In
0630: 74 56 61 6c 75 65 28 6c 68 73 20 3c 20 72 68 73  tValue(lhs < rhs
0640: 29 3b 7d 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72  );} );...e.addPr
0650: 69 6d 69 74 69 76 65 28 22 3e 22 2c 20 20 56 61  imitive(">",  Va
0660: 6c 75 65 4c 61 79 65 72 2c 20 28 56 61 6c 75 65  lueLayer, (Value
0670: 20 6c 68 73 2c 20 56 61 6c 75 65 20 72 68 73 29   lhs, Value rhs)
0680: 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56  {return new IntV
0690: 61 6c 75 65 28 6c 68 73 20 3e 20 72 68 73 29 3b  alue(lhs > rhs);
06a0: 7d 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d  } );...e.addPrim
06b0: 69 74 69 76 65 28 22 3c 3d 22 2c 20 56 61 6c 75  itive("<=", Valu
06c0: 65 4c 61 79 65 72 2c 20 28 56 61 6c 75 65 20 6c  eLayer, (Value l
06d0: 68 73 2c 20 56 61 6c 75 65 20 72 68 73 29 7b 72  hs, Value rhs){r
06e0: 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c  eturn new IntVal
06f0: 75 65 28 6c 68 73 20 3c 3d 20 72 68 73 29 3b 7d  ue(lhs <= rhs);}
0700: 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69   );...e.addPrimi
0710: 74 69 76 65 28 22 3e 3d 22 2c 20 56 61 6c 75 65  tive(">=", Value
0720: 4c 61 79 65 72 2c 20 28 56 61 6c 75 65 20 6c 68  Layer, (Value lh
0730: 73 2c 20 56 61 6c 75 65 20 72 68 73 29 7b 72 65  s, Value rhs){re
0740: 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75  turn new IntValu
0750: 65 28 6c 68 73 20 3e 3d 20 72 68 73 29 3b 7d 20  e(lhs >= rhs);} 
0760: 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74  );...e.addPrimit
0770: 69 76 65 28 22 3d 3d 22 2c 20 56 61 6c 75 65 4c  ive("==", ValueL
0780: 61 79 65 72 2c 20 28 56 61 6c 75 65 20 6c 68 73  ayer, (Value lhs
0790: 2c 20 56 61 6c 75 65 20 72 68 73 29 7b 72 65 74  , Value rhs){ret
07a0: 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  urn new IntValue
07b0: 28 6c 68 73 20 3d 3d 20 72 68 73 29 3b 7d 20 29  (lhs == rhs);} )
07c0: 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 69  ;...e.addPrimiti
07d0: 76 65 28 22 21 3d 22 2c 20 56 61 6c 75 65 4c 61  ve("!=", ValueLa
07e0: 79 65 72 2c 20 28 56 61 6c 75 65 20 6c 68 73 2c  yer, (Value lhs,
07f0: 20 56 61 6c 75 65 20 72 68 73 29 7b 72 65 74 75   Value rhs){retu
0800: 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28  rn new IntValue(
0810: 6c 68 73 20 21 3d 20 72 68 73 29 3b 7d 20 29 3b  lhs != rhs);} );
0820: 0d 0a 09 2f 2f 20 63 6f 6e 74 72 6f 6c 20 66 6c  ...// control fl
0830: 6f 77 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74  ow...e.addPrimit
0840: 69 76 65 28 22 69 66 22 2c 20 56 61 6c 75 65 4c  ive("if", ValueL
0850: 61 79 65 72 2c 20 28 49 6e 74 56 61 6c 75 65 20  ayer, (IntValue 
0860: 78 2c 20 46 75 6e 56 61 6c 75 65 20 66 74 2c 20  x, FunValue ft, 
0870: 46 75 6e 56 61 6c 75 65 20 66 65 29 7b 0d 0a 09  FunValue fe){...
0880: 09 61 75 74 6f 20 74 6f 52 75 6e 20 3d 20 28 78  .auto toRun = (x
0890: 2e 64 61 74 61 3d 3d 30 20 3f 20 66 65 20 3a 20  .data==0 ? fe : 
08a0: 66 74 29 3b 0d 0a 09 09 72 65 74 75 72 6e 20 74  ft);....return t
08b0: 6f 52 75 6e 2e 69 6e 76 6f 6b 65 28 56 61 6c 75  oRun.invoke(Valu
08c0: 65 4c 61 79 65 72 2c 20 74 6f 52 75 6e 2e 64 65  eLayer, toRun.de
08d0: 66 69 6e 69 74 69 6f 6e 43 6f 6e 74 65 78 74 28  finitionContext(
08e0: 29 2c 20 6e 75 6c 6c 29 3b 0d 0a 09 7d 29 3b 0d  ), null);...});.
08f0: 0a 09 2f 2f 20 74 79 70 65 20 74 65 73 74 0d 0a  ..// type test..
0900: 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28  .e.addPrimitive(
0910: 22 5f 69 73 69 6e 74 22 2c 20 56 61 6c 75 65 4c  "_isint", ValueL
0920: 61 79 65 72 2c 0d 0a 09 09 28 56 61 6c 75 65 20  ayer,....(Value 
0930: 76 29 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e  v){return new In
0940: 74 56 61 6c 75 65 28 63 61 73 74 28 49 6e 74 56  tValue(cast(IntV
0950: 61 6c 75 65 29 76 20 21 69 73 20 6e 75 6c 6c 29  alue)v !is null)
0960: 3b 7d 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69  ;} );...e.addPri
0970: 6d 69 74 69 76 65 28 22 5f 69 73 73 74 72 22 2c  mitive("_isstr",
0980: 20 56 61 6c 75 65 4c 61 79 65 72 2c 0d 0a 09 09   ValueLayer,....
0990: 28 56 61 6c 75 65 20 76 29 7b 72 65 74 75 72 6e  (Value v){return
09a0: 20 6e 65 77 20 49 6e 74 56 61 6c 75 65 28 63 61   new IntValue(ca
09b0: 73 74 28 53 74 72 56 61 6c 75 65 29 76 20 21 69  st(StrValue)v !i
09c0: 73 20 6e 75 6c 6c 29 3b 7d 20 29 3b 0d 0a 09 65  s null);} );...e
09d0: 2e 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 5f  .addPrimitive("_
09e0: 69 73 66 75 6e 22 2c 20 56 61 6c 75 65 4c 61 79  isfun", ValueLay
09f0: 65 72 2c 0d 0a 09 09 28 56 61 6c 75 65 20 76 29  er,....(Value v)
0a00: 7b 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56  {return new IntV
0a10: 61 6c 75 65 28 63 61 73 74 28 46 75 6e 56 61 6c  alue(cast(FunVal
0a20: 75 65 29 76 20 21 69 73 20 6e 75 6c 6c 29 3b 7d  ue)v !is null);}
0a30: 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69   );...e.addPrimi
0a40: 74 69 76 65 28 22 5f 69 73 75 6e 64 65 66 69 6e  tive("_isundefin
0a50: 65 64 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c  ed", ValueLayer,
0a60: 0d 0a 09 09 28 56 61 6c 75 65 20 76 29 7b 72 65  ....(Value v){re
0a70: 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75  turn new IntValu
0a80: 65 28 63 61 73 74 28 55 6e 64 65 66 69 6e 65 64  e(cast(Undefined
0a90: 56 61 6c 75 65 29 76 20 21 69 73 20 6e 75 6c 6c  Value)v !is null
0aa0: 29 3b 7d 20 29 3b 0d 0a 09 65 2e 61 64 64 50 72  );} );...e.addPr
0ab0: 69 6d 69 74 69 76 65 28 22 5f 69 73 74 61 62 6c  imitive("_istabl
0ac0: 65 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 0d  e", ValueLayer,.
0ad0: 0a 09 09 28 56 61 6c 75 65 20 76 29 7b 72 65 74  ...(Value v){ret
0ae0: 75 72 6e 20 6e 65 77 20 49 6e 74 56 61 6c 75 65  urn new IntValue
0af0: 28 63 61 73 74 28 54 61 62 6c 65 29 76 20 21 69  (cast(Table)v !i
0b00: 73 20 6e 75 6c 6c 29 3b 7d 20 29 3b 0d 0a 09 2f  s null);} );.../
0b10: 2f 20 74 61 62 6c 65 0d 0a 09 65 2e 61 64 64 50  / table...e.addP
0b20: 72 69 6d 69 74 69 76 65 28 22 2e 22 2c 20 56 61  rimitive(".", Va
0b30: 6c 75 65 4c 61 79 65 72 2c 20 28 54 61 62 6c 65  lueLayer, (Table
0b40: 20 74 2c 20 53 74 72 56 61 6c 75 65 20 73 29 7b   t, StrValue s){
0b50: 0d 0a 09 09 69 66 28 20 74 2e 68 61 73 28 73 2e  ....if( t.has(s.
0b60: 64 61 74 61 2c 20 56 61 6c 75 65 4c 61 79 65 72  data, ValueLayer
0b70: 29 20 29 0d 0a 09 09 09 72 65 74 75 72 6e 20 74  ) ).....return t
0b80: 2e 67 65 74 28 73 2e 64 61 74 61 2c 20 56 61 6c  .get(s.data, Val
0b90: 75 65 4c 61 79 65 72 29 3b 0d 0a 09 09 74 68 72  ueLayer);....thr
0ba0: 6f 77 20 67 65 6e 65 78 21 52 75 6e 74 69 6d 65  ow genex!Runtime
0bb0: 45 78 63 65 70 74 69 6f 6e 28 74 65 78 74 28 22  Exception(text("
0bc0: 74 61 62 6c 65 20 64 6f 20 6e 6f 74 20 68 61 76  table do not hav
0bd0: 65 20 74 68 65 20 66 69 65 6c 64 20 22 2c 73 29  e the field ",s)
0be0: 29 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 2e 61 64 64  );...});...e.add
0bf0: 50 72 69 6d 69 74 69 76 65 28 22 2e 3f 22 2c 20  Primitive(".?", 
0c00: 56 61 6c 75 65 4c 61 79 65 72 2c 20 28 54 61 62  ValueLayer, (Tab
0c10: 6c 65 20 74 2c 20 53 74 72 56 61 6c 75 65 20 73  le t, StrValue s
0c20: 29 7b 0d 0a 09 09 72 65 74 75 72 6e 20 6e 65 77  ){....return new
0c30: 20 49 6e 74 56 61 6c 75 65 28 74 2e 68 61 73 28   IntValue(t.has(
0c40: 73 2e 64 61 74 61 2c 20 56 61 6c 75 65 4c 61 79  s.data, ValueLay
0c50: 65 72 29 29 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 2e  er));...});...e.
0c60: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 2e 3d  addPrimitive(".=
0c70: 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28  ", ValueLayer, (
0c80: 54 61 62 6c 65 20 74 2c 20 53 74 72 56 61 6c 75  Table t, StrValu
0c90: 65 20 73 2c 20 56 61 6c 75 65 20 76 29 7b 0d 0a  e s, Value v){..
0ca0: 09 09 61 75 74 6f 20 74 32 20 3d 20 6e 65 77 20  ..auto t2 = new 
0cb0: 54 61 62 6c 65 28 74 2c 20 54 61 62 6c 65 2e 4b  Table(t, Table.K
0cc0: 69 6e 64 2e 4e 6f 74 50 72 6f 70 61 67 61 74 65  ind.NotPropagate
0cd0: 53 65 74 29 3b 0d 0a 09 09 74 32 2e 73 65 74 28  Set);....t2.set(
0ce0: 73 2e 64 61 74 61 2c 20 56 61 6c 75 65 4c 61 79  s.data, ValueLay
0cf0: 65 72 2c 20 76 29 3b 0d 0a 09 09 72 65 74 75 72  er, v);....retur
0d00: 6e 20 74 32 3b 0d 0a 09 7d 29 3b 0d 0a 09 65 2e  n t2;...});...e.
0d10: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 7b 7d  addPrimitive("{}
0d20: 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28  ", ValueLayer, (
0d30: 29 7b 0d 0a 09 09 72 65 74 75 72 6e 20 6e 65 77  ){....return new
0d40: 20 54 61 62 6c 65 3b 0d 0a 09 7d 29 3b 0d 0a 09   Table;...});...
0d50: 2f 2f 20 49 4f 20 61 6e 64 20 6f 74 68 65 72 73  // IO and others
0d60: 0d 0a 09 65 2e 61 64 64 50 72 69 6d 69 74 69 76  ...e.addPrimitiv
0d70: 65 28 22 70 72 69 6e 74 22 2c 20 56 61 6c 75 65  e("print", Value
0d80: 4c 61 79 65 72 2c 20 28 56 61 6c 75 65 20 61 29  Layer, (Value a)
0d90: 7b 20 77 72 69 74 65 6c 6e 28 61 29 3b 20 72 65  { writeln(a); re
0da0: 74 75 72 6e 20 61 3b 20 7d 29 3b 0d 0a 09 65 2e  turn a; });...e.
0db0: 61 64 64 50 72 69 6d 69 74 69 76 65 28 22 67 65  addPrimitive("ge
0dc0: 6e 73 79 6d 22 2c 20 56 61 6c 75 65 4c 61 79 65  nsym", ValueLaye
0dd0: 72 2c 20 28 29 7b 20 72 65 74 75 72 6e 20 6e 65  r, (){ return ne
0de0: 77 20 53 74 72 56 61 6c 75 65 28 66 72 65 73 68  w StrValue(fresh
0df0: 56 61 72 4e 61 6d 65 28 29 29 3b 20 7d 29 3b 0d  VarName()); });.
0e00: 0a 09 61 75 74 6f 20 72 61 6e 64 20 3d 20 4d 74  ..auto rand = Mt
0e10: 31 39 39 33 37 28 75 6e 70 72 65 64 69 63 74 61  19937(unpredicta
0e20: 62 6c 65 53 65 65 64 29 3b 0d 0a 09 65 2e 61 64  bleSeed);...e.ad
0e30: 64 50 72 69 6d 69 74 69 76 65 28 22 72 61 6e 64  dPrimitive("rand
0e40: 22 2c 20 56 61 6c 75 65 4c 61 79 65 72 2c 20 28  ", ValueLayer, (
0e50: 49 6e 74 56 61 6c 75 65 20 6e 29 7b 0d 0a 09 09  IntValue n){....
0e60: 72 65 74 75 72 6e 20 6e 65 77 20 49 6e 74 56 61  return new IntVa
0e70: 6c 75 65 28 20 75 6e 69 66 6f 72 6d 28 30 2c 63  lue( uniform(0,c
0e80: 61 73 74 28 69 6e 74 29 6e 2e 64 61 74 61 2e 74  ast(int)n.data.t
0e90: 6f 49 6e 74 28 29 2c 72 61 6e 64 29 20 29 3b 0d  oInt(),rand) );.
0ea0: 0a 09 7d 29 3b 0d 0a 7d 0d 0a                    ..});..}..