Artifact 12b974146da199064d32689e2a25475a2e051659:
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 0a 64 65 66 20 66 69 62 or".)};..def fib
02b0: 28 78 29 0a 7b 0a 09 69 66 20 78 3c 32 20 74 68 (x).{..if x<2 th
02c0: 65 6e 20 31 20 65 6c 73 65 20 66 69 62 28 78 2d en 1 else fib(x-
02d0: 31 29 20 2b 20 66 69 62 28 78 2d 32 29 0a 7d 3b 1) + fib(x-2).};
02e0: 0a 0a 70 72 69 6e 74 28 20 40 74 79 70 65 28 66 ..print( @type(f
02f0: 69 62 28 31 30 29 29 20 29 3b 0a ib(10)) );.