Hex Artifact Content
Not logged in

Artifact f80a12af3228ea33de3581cfd28314567c98d1a1:


0000: 40 40 74 79 70 65 20 3d 20 66 75 6e 28 78 29 7b  @@type = fun(x){
0010: 0a 20 20 69 66 20 5f 69 73 69 6e 74 28 78 29 3a  .  if _isint(x):
0020: 20 22 69 6e 74 22 0a 20 20 65 6c 73 65 20 69 66   "int".  else if
0030: 20 5f 69 73 73 74 72 28 78 29 3a 20 22 73 74 72   _isstr(x): "str
0040: 22 20 0a 20 20 65 6c 73 65 20 69 66 20 5f 69 73  " .  else if _is
0050: 75 6e 64 65 66 69 6e 65 64 28 78 29 3a 20 22 75  undefined(x): "u
0060: 6e 64 65 66 69 6e 65 64 22 0a 20 20 65 6c 73 65  ndefined".  else
0070: 3a 20 22 61 6e 79 22 0a 7d 3b 0a 0a 64 65 66 20  : "any".};..def 
0080: 62 69 6e 6f 70 28 61 2c 62 2c 63 29 20 7b 0a 20  binop(a,b,c) {. 
0090: 20 66 75 6e 28 78 2c 79 29 7b 40 76 61 6c 75 65   fun(x,y){@value
00a0: 28 0a 20 20 20 20 69 66 28 20 40 74 79 70 65 28  (.    if( @type(
00b0: 78 29 3d 3d 22 75 6e 64 65 66 69 6e 65 64 22 20  x)=="undefined" 
00c0: 7c 7c 20 40 74 79 70 65 28 79 29 3d 3d 22 75 6e  || @type(y)=="un
00d0: 64 65 66 69 6e 65 64 22 20 29 20 74 68 65 6e 20  defined" ) then 
00e0: 22 75 6e 64 65 66 69 6e 65 64 22 20 65 6c 73 65  "undefined" else
00f0: 0a 20 20 20 20 20 20 69 66 28 20 40 74 79 70 65  .      if( @type
0100: 28 78 29 3d 3d 61 20 26 26 20 40 74 79 70 65 28  (x)==a && @type(
0110: 79 29 3d 3d 62 20 29 20 74 68 65 6e 20 63 20 65  y)==b ) then c e
0120: 6c 73 65 20 22 65 72 72 6f 72 22 0a 20 20 29 7d  lse "error".  )}
0130: 0a 7d 3b 0a 0a 40 74 79 70 65 20 22 2b 22 20 3d  .};..@type "+" =
0140: 20 62 69 6e 6f 70 28 22 69 6e 74 22 2c 20 22 69   binop("int", "i
0150: 6e 74 22 2c 20 22 69 6e 74 22 29 3b 0a 40 74 79  nt", "int");.@ty
0160: 70 65 20 22 2d 22 20 3d 20 62 69 6e 6f 70 28 22  pe "-" = binop("
0170: 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 22 69 6e  int", "int", "in
0180: 74 22 29 3b 0a 40 74 79 70 65 20 22 3c 22 20 3d  t");.@type "<" =
0190: 20 62 69 6e 6f 70 28 22 69 6e 74 22 2c 20 22 69   binop("int", "i
01a0: 6e 74 22 2c 20 22 69 6e 74 22 29 3b 0a 40 74 79  nt", "int");.@ty
01b0: 70 65 20 22 3e 22 20 3d 20 62 69 6e 6f 70 28 22  pe ">" = binop("
01c0: 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 22 69 6e  int", "int", "in
01d0: 74 22 29 3b 0a 0a 64 65 66 20 6d 65 72 67 65 54  t");..def mergeT
01e0: 79 70 65 28 61 2c 62 29 20 7b 0a 20 20 69 66 28  ype(a,b) {.  if(
01f0: 20 61 20 3d 3d 20 22 75 6e 64 65 66 69 6e 65 64   a == "undefined
0200: 22 20 29 3a 20 28 20 69 66 28 62 3d 3d 22 75 6e  " ): ( if(b=="un
0210: 64 65 66 69 6e 65 64 22 29 3a 22 65 72 72 6f 72  defined"):"error
0220: 22 20 65 6c 73 65 20 62 20 20 29 20 65 6c 73 65  " else b  ) else
0230: 20 28 20 61 20 29 0a 7d 3b 0a 0a 40 74 79 70 65   ( a ).};..@type
0240: 20 22 69 66 22 20 3d 20 66 75 6e 28 63 2c 74 2c   "if" = fun(c,t,
0250: 65 29 20 7b 40 76 61 6c 75 65 28 0a 20 69 66 28  e) {@value(. if(
0260: 40 74 79 70 65 28 63 29 3d 3d 22 69 6e 74 22 20  @type(c)=="int" 
0270: 29 3a 20 6d 65 72 67 65 54 79 70 65 28 40 74 79  ): mergeType(@ty
0280: 70 65 28 74 28 29 29 2c 20 40 74 79 70 65 28 65  pe(t()), @type(e
0290: 28 29 29 29 20 65 6c 73 65 20 3a 20 22 65 72 72  ())) else : "err
02a0: 6f 72 22 0a 29 7d 3b 0a                          or".)};.