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