Hex Artifact Content
Not logged in

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                                         );.