Artifact 6a40040679ba714c9849a7da3b21b78c375448cf:
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 3a 20 22 61 6e 79 22 " . else: "any"
0050: 0a 7d 3b 0a 0a 64 65 66 20 62 69 6e 6f 70 28 61 .};..def binop(a
0060: 2c 62 2c 63 29 20 7b 0a 20 20 66 75 6e 28 78 2c ,b,c) {. fun(x,
0070: 79 29 7b 40 76 61 6c 75 65 28 0a 20 20 20 20 69 y){@value(. i
0080: 66 28 20 5f 69 73 62 6f 74 28 20 40 74 79 70 65 f( _isbot( @type
0090: 28 78 29 20 29 20 7c 7c 20 5f 69 73 62 6f 74 28 (x) ) || _isbot(
00a0: 20 40 74 79 70 65 28 79 29 20 29 20 29 20 74 68 @type(y) ) ) th
00b0: 65 6e 20 40 74 79 70 65 28 2e 2e 2e 29 20 65 6c en @type(...) el
00c0: 73 65 0a 20 20 20 20 20 20 69 66 28 20 40 74 79 se. if( @ty
00d0: 70 65 28 78 29 3d 3d 61 20 26 26 20 40 74 79 70 pe(x)==a && @typ
00e0: 65 28 79 29 3d 3d 62 20 29 20 74 68 65 6e 20 63 e(y)==b ) then c
00f0: 20 65 6c 73 65 20 22 65 72 72 6f 72 22 0a 20 20 else "error".
0100: 29 7d 0a 7d 3b 0a 0a 40 74 79 70 65 20 22 2b 22 )}.};..@type "+"
0110: 20 3d 20 62 69 6e 6f 70 28 22 69 6e 74 22 2c 20 = binop("int",
0120: 22 69 6e 74 22 2c 20 22 69 6e 74 22 29 3b 0a 40 "int", "int");.@
0130: 74 79 70 65 20 22 2d 22 20 3d 20 62 69 6e 6f 70 type "-" = binop
0140: 28 22 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 22 ("int", "int", "
0150: 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 22 3c 22 int");.@type "<"
0160: 20 3d 20 62 69 6e 6f 70 28 22 69 6e 74 22 2c 20 = binop("int",
0170: 22 69 6e 74 22 2c 20 22 69 6e 74 22 29 3b 0a 40 "int", "int");.@
0180: 74 79 70 65 20 22 3e 22 20 3d 20 62 69 6e 6f 70 type ">" = binop
0190: 28 22 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 22 ("int", "int", "
01a0: 69 6e 74 22 29 3b 0a 0a 64 65 66 20 6d 65 72 67 int");..def merg
01b0: 65 54 79 70 65 28 61 2c 62 29 20 7b 0a 20 20 69 eType(a,b) {. i
01c0: 66 28 20 5f 69 73 62 6f 74 28 61 29 20 29 3a 20 f( _isbot(a) ):
01d0: 28 20 69 66 28 20 5f 69 73 62 6f 74 28 62 29 20 ( if( _isbot(b)
01e0: 29 3a 22 65 72 72 6f 72 22 20 65 6c 73 65 20 62 ):"error" else b
01f0: 20 20 29 20 65 6c 73 65 20 28 20 61 20 29 0a 7d ) else ( a ).}
0200: 3b 0a 0a 40 74 79 70 65 20 22 69 66 22 20 3d 20 ;..@type "if" =
0210: 66 75 6e 28 63 2c 74 2c 65 29 20 7b 40 76 61 6c fun(c,t,e) {@val
0220: 75 65 28 0a 20 69 66 28 40 74 79 70 65 28 63 29 ue(. if(@type(c)
0230: 3d 3d 22 69 6e 74 22 20 29 3a 20 6d 65 72 67 65 =="int" ): merge
0240: 54 79 70 65 28 40 74 79 70 65 28 74 28 29 29 2c Type(@type(t()),
0250: 20 40 74 79 70 65 28 65 28 29 29 29 20 65 6c 73 @type(e())) els
0260: 65 20 3a 20 22 65 72 72 6f 72 22 0a 29 7d 3b 0a e : "error".)};.
0270: 0a 64 65 66 20 66 69 62 28 78 29 0a 7b 0a 09 69 .def fib(x).{..i
0280: 66 20 78 3c 32 20 74 68 65 6e 20 31 20 65 6c 73 f x<2 then 1 els
0290: 65 20 66 69 62 28 78 2d 31 29 20 2b 20 66 69 62 e fib(x-1) + fib
02a0: 28 78 2d 32 29 0a 7d 3b 0a 0a 70 72 69 6e 74 28 (x-2).};..print(
02b0: 20 40 74 79 70 65 28 66 69 62 28 31 30 29 29 20 @type(fib(10))
02c0: 29 3b 0a );.