Hex Artifact Content
Not logged in

Artifact b35cfd66e862f7bf189142d9927955d8905ac7b1:


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