Artifact e50284fdcde212f791567715c0dd81f4b558f14c:
0000: 23 20 4c 69 66 74 20 74 6f 20 74 79 70 65 73 0a # Lift to types.
0010: 40 40 74 79 70 65 20 28 78 29 0a 7b 0a 09 69 66 @@type (x).{..if
0020: 20 5f 69 73 69 6e 74 28 78 29 3a 20 22 69 6e 74 _isint(x): "int
0030: 22 0a 09 65 6c 73 65 20 69 66 20 5f 69 73 73 74 "..else if _isst
0040: 72 28 78 29 3a 20 22 73 74 72 22 0a 09 65 6c 73 r(x): "str"..els
0050: 65 20 69 66 20 5f 69 73 62 6f 74 28 78 29 3a 20 e if _isbot(x):
0060: 22 52 45 22 0a 09 65 6c 73 65 20 69 66 20 5f 69 "RE"..else if _i
0070: 73 74 62 6c 28 78 29 3a 0a 09 09 69 66 20 78 2e stbl(x):...if x.
0080: 3f 63 61 72 20 26 26 20 78 2e 3f 63 64 72 3a 0a ?car && x.?cdr:.
0090: 09 09 09 6c 65 74 20 78 61 20 3d 20 78 2e 63 61 ...let xa = x.ca
00a0: 72 20 69 6e 20 6c 65 74 20 78 64 20 3d 20 78 2e r in let xd = x.
00b0: 63 64 72 20 69 6e 0a 09 09 09 09 6d 65 72 67 65 cdr in.....merge
00c0: 54 79 70 65 28 20 7b 6c 69 73 74 3a 20 40 74 79 Type( {list: @ty
00d0: 70 65 28 78 61 29 7d 2c 20 40 74 79 70 65 28 78 pe(xa)}, @type(x
00e0: 64 29 20 29 0a 09 09 65 6c 73 65 0a 09 09 09 7b d) )...else....{
00f0: 6c 69 73 74 3a 20 22 52 45 22 7d 20 23 20 74 65 list: "RE"} # te
0100: 6e 75 6b 69 0a 09 65 6c 73 65 20 2e 2e 2e 0a 7d nuki..else ....}
0110: 3b 0a 0a 23 20 75 6e 69 66 79 20 74 77 6f 20 74 ;..# unify two t
0120: 79 70 65 73 0a 64 65 66 20 6d 65 72 67 65 54 79 ypes.def mergeTy
0130: 70 65 28 61 2c 20 62 29 0a 7b 0a 09 69 66 20 61 pe(a, b).{..if a
0140: 20 3d 3d 20 22 52 45 22 3a 20 62 0a 09 65 6c 73 == "RE": b..els
0150: 65 20 69 66 20 62 20 3d 3d 20 22 52 45 22 3a 20 e if b == "RE":
0160: 61 0a 09 65 6c 73 65 20 69 66 20 5f 69 73 74 62 a..else if _istb
0170: 6c 28 61 29 20 26 26 20 5f 69 73 74 62 6c 28 62 l(a) && _istbl(b
0180: 29 3a 0a 09 09 69 66 20 20 61 2e 3f 6c 69 73 74 ):...if a.?list
0190: 20 26 26 20 62 2e 3f 6c 69 73 74 3a 0a 09 09 09 && b.?list:....
01a0: 6c 65 74 20 72 74 20 3d 20 6d 65 72 67 65 54 79 let rt = mergeTy
01b0: 70 65 28 61 2e 6c 69 73 74 2c 20 62 2e 6c 69 73 pe(a.list, b.lis
01c0: 74 29 20 69 6e 0a 09 09 09 09 69 66 20 72 74 3d t) in.....if rt=
01d0: 3d 22 54 45 22 20 7c 7c 20 72 74 3d 3d 22 52 45 ="TE" || rt=="RE
01e0: 22 20 74 68 65 6e 20 72 74 20 65 6c 73 65 20 7b " then rt else {
01f0: 6c 69 73 74 3a 20 72 74 7d 0a 09 09 65 6c 73 65 list: rt}...else
0200: 3a 0a 09 09 09 22 54 45 22 20 23 20 74 79 70 65 :...."TE" # type
0210: 20 65 72 72 6f 72 0a 09 65 6c 73 65 20 69 66 20 error..else if
0220: 61 20 3d 3d 20 62 3a 20 61 0a 09 65 6c 73 65 20 a == b: a..else
0230: 22 54 45 22 20 20 23 20 74 79 70 65 20 65 72 72 "TE" # type err
0240: 6f 72 0a 7d 3b 0a 0a 23 20 68 65 6c 70 65 72 20 or.};..# helper
0250: 66 75 6e 63 74 69 6f 6e 0a 64 65 66 20 54 75 6e function.def Tun
0260: 69 28 74 31 2c 20 74 30 29 0a 7b 0a 09 66 75 6e i(t1, t0).{..fun
0270: 28 78 29 20 7b 40 76 61 6c 75 65 28 0a 09 09 69 (x) {@value(...i
0280: 66 20 40 74 79 70 65 28 78 29 3d 3d 22 52 45 22 f @type(x)=="RE"
0290: 3a 20 22 52 45 22 0a 09 09 65 6c 73 65 20 69 66 : "RE"...else if
02a0: 20 40 74 79 70 65 28 78 29 3d 3d 22 54 45 22 3a @type(x)=="TE":
02b0: 20 22 54 45 22 0a 09 09 65 6c 73 65 20 69 66 20 "TE"...else if
02c0: 40 74 79 70 65 28 78 29 3d 3d 74 31 3a 20 74 30 @type(x)==t1: t0
02d0: 0a 09 09 65 6c 73 65 20 22 54 45 22 0a 09 29 7d ...else "TE"..)}
02e0: 0a 7d 3b 0a 64 65 66 20 54 75 6e 69 61 6e 79 28 .};.def Tuniany(
02f0: 74 30 29 0a 7b 0a 09 66 75 6e 28 78 29 20 7b 40 t0).{..fun(x) {@
0300: 76 61 6c 75 65 28 0a 09 09 69 66 20 40 74 79 70 value(...if @typ
0310: 65 28 78 29 3d 3d 22 52 45 22 3a 20 22 52 45 22 e(x)=="RE": "RE"
0320: 0a 09 09 65 6c 73 65 20 69 66 20 40 74 79 70 65 ...else if @type
0330: 28 78 29 3d 3d 22 54 45 22 3a 20 22 54 45 22 0a (x)=="TE": "TE".
0340: 09 09 65 6c 73 65 20 74 30 0a 09 29 7d 0a 7d 3b ..else t0..)}.};
0350: 0a 64 65 66 20 54 62 69 6e 28 74 31 2c 20 74 32 .def Tbin(t1, t2
0360: 2c 20 74 30 29 0a 7b 0a 09 66 75 6e 28 78 2c 79 , t0).{..fun(x,y
0370: 29 20 7b 40 76 61 6c 75 65 28 0a 09 09 69 66 20 ) {@value(...if
0380: 40 74 79 70 65 28 78 29 3d 3d 22 52 45 22 20 7c @type(x)=="RE" |
0390: 7c 20 40 74 79 70 65 28 79 29 3d 3d 22 52 45 22 | @type(y)=="RE"
03a0: 3a 20 22 52 45 22 0a 09 09 65 6c 73 65 20 69 66 : "RE"...else if
03b0: 20 40 74 79 70 65 28 78 29 3d 3d 22 54 45 22 20 @type(x)=="TE"
03c0: 7c 7c 20 40 74 79 70 65 28 79 29 3d 3d 22 54 45 || @type(y)=="TE
03d0: 22 3a 20 22 54 45 22 0a 09 09 65 6c 73 65 20 69 ": "TE"...else i
03e0: 66 20 40 74 79 70 65 28 78 29 3d 3d 74 31 20 26 f @type(x)==t1 &
03f0: 26 20 40 74 79 70 65 28 79 29 3d 3d 74 32 3a 20 & @type(y)==t2:
0400: 74 30 0a 09 09 65 6c 73 65 20 22 54 45 22 0a 09 t0...else "TE"..
0410: 29 7d 0a 7d 3b 0a 64 65 66 20 54 62 69 6e 61 6e )}.};.def Tbinan
0420: 79 28 74 30 29 0a 7b 0a 09 66 75 6e 28 78 2c 79 y(t0).{..fun(x,y
0430: 29 7b 40 76 61 6c 75 65 28 0a 09 09 69 66 20 40 ){@value(...if @
0440: 74 79 70 65 28 78 29 3d 3d 22 52 45 22 20 7c 7c type(x)=="RE" ||
0450: 20 40 74 79 70 65 28 79 29 3d 3d 22 52 45 22 3a @type(y)=="RE":
0460: 20 22 52 45 22 0a 09 09 65 6c 73 65 20 69 66 20 "RE"...else if
0470: 40 74 79 70 65 28 78 29 3d 3d 22 54 45 22 20 7c @type(x)=="TE" |
0480: 7c 20 40 74 79 70 65 28 79 29 3d 3d 22 54 45 22 | @type(y)=="TE"
0490: 3a 20 22 54 45 22 0a 09 09 65 6c 73 65 20 74 30 : "TE"...else t0
04a0: 0a 09 29 7d 0a 7d 3b 0a 0a 23 20 74 79 70 65 20 ..)}.};..# type
04b0: 61 6e 6e 6f 74 61 74 69 6f 6e 20 66 6f 72 20 62 annotation for b
04c0: 75 69 6c 74 2d 69 6e 20 6f 70 73 0a 40 74 79 70 uilt-in ops.@typ
04d0: 65 20 22 2b 22 20 3d 20 54 62 69 6e 28 22 69 6e e "+" = Tbin("in
04e0: 74 22 2c 20 22 69 6e 74 22 2c 20 22 69 6e 74 22 t", "int", "int"
04f0: 29 3b 0a 40 74 79 70 65 20 22 2d 22 20 3d 20 54 );.@type "-" = T
0500: 62 69 6e 28 22 69 6e 74 22 2c 20 22 69 6e 74 22 bin("int", "int"
0510: 2c 20 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 , "int");.@type
0520: 22 2a 22 20 3d 20 54 62 69 6e 28 22 69 6e 74 22 "*" = Tbin("int"
0530: 2c 20 22 69 6e 74 22 2c 20 22 69 6e 74 22 29 3b , "int", "int");
0540: 0a 40 74 79 70 65 20 22 2f 22 20 3d 20 54 62 69 .@type "/" = Tbi
0550: 6e 28 22 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 n("int", "int",
0560: 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 22 25 "int");.@type "%
0570: 22 20 3d 20 54 62 69 6e 28 22 69 6e 74 22 2c 20 " = Tbin("int",
0580: 22 69 6e 74 22 2c 20 22 69 6e 74 22 29 3b 0a 40 "int", "int");.@
0590: 74 79 70 65 20 22 26 26 22 20 3d 20 54 62 69 6e type "&&" = Tbin
05a0: 28 22 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 22 ("int", "int", "
05b0: 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 22 7c 7c int");.@type "||
05c0: 22 20 3d 20 54 62 69 6e 28 22 69 6e 74 22 2c 20 " = Tbin("int",
05d0: 22 69 6e 74 22 2c 20 22 69 6e 74 22 29 3b 0a 40 "int", "int");.@
05e0: 74 79 70 65 20 70 72 69 6e 74 20 3d 20 66 75 6e type print = fun
05f0: 28 78 29 7b 78 7d 3b 0a 40 74 79 70 65 20 67 65 (x){x};.@type ge
0600: 6e 73 79 6d 20 3d 20 66 75 6e 28 29 7b 22 73 74 nsym = fun(){"st
0610: 72 22 7d 3b 0a 40 74 79 70 65 20 61 72 67 76 20 r"};.@type argv
0620: 3d 20 7b 6c 69 73 74 3a 20 22 73 74 72 22 7d 3b = {list: "str"};
0630: 0a 40 74 79 70 65 20 72 61 6e 64 20 3d 20 54 75 .@type rand = Tu
0640: 6e 69 28 22 69 6e 74 22 2c 22 69 6e 74 22 29 3b ni("int","int");
0650: 0a 40 74 79 70 65 20 22 7e 22 20 3d 20 54 62 69 .@type "~" = Tbi
0660: 6e 61 6e 79 28 22 73 74 72 22 29 3b 0a 40 74 79 nany("str");.@ty
0670: 70 65 20 22 3c 22 20 3d 20 54 62 69 6e 61 6e 79 pe "<" = Tbinany
0680: 28 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 22 ("int");.@type "
0690: 3c 3d 22 20 3d 20 54 62 69 6e 61 6e 79 28 22 69 <=" = Tbinany("i
06a0: 6e 74 22 29 3b 0a 40 74 79 70 65 20 22 3e 22 20 nt");.@type ">"
06b0: 3d 20 54 62 69 6e 61 6e 79 28 22 69 6e 74 22 29 = Tbinany("int")
06c0: 3b 0a 40 74 79 70 65 20 22 3e 3d 22 20 3d 20 54 ;.@type ">=" = T
06d0: 62 69 6e 61 6e 79 28 22 69 6e 74 22 29 3b 0a 40 binany("int");.@
06e0: 74 79 70 65 20 22 3d 3d 22 20 3d 20 54 62 69 6e type "==" = Tbin
06f0: 61 6e 79 28 22 69 6e 74 22 29 3b 0a 40 74 79 70 any("int");.@typ
0700: 65 20 22 21 3d 22 20 3d 20 54 62 69 6e 61 6e 79 e "!=" = Tbinany
0710: 28 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 22 ("int");.@type "
0720: 69 66 22 20 28 63 2c 74 2c 65 29 20 7b 40 76 61 if" (c,t,e) {@va
0730: 6c 75 65 28 0a 09 69 66 20 40 74 79 70 65 28 63 lue(..if @type(c
0740: 29 3d 3d 22 52 45 22 3a 20 22 52 45 22 0a 09 65 )=="RE": "RE"..e
0750: 6c 73 65 20 69 66 20 40 74 79 70 65 28 63 29 21 lse if @type(c)!
0760: 3d 22 69 6e 74 22 3a 20 22 54 45 22 0a 09 65 6c ="int": "TE"..el
0770: 73 65 20 6d 65 72 67 65 54 79 70 65 28 20 40 74 se mergeType( @t
0780: 79 70 65 28 74 28 29 29 2c 20 40 74 79 70 65 28 ype(t()), @type(
0790: 65 28 29 29 20 29 3b 0a 29 7d 3b 0a 40 74 79 70 e()) );.)};.@typ
07a0: 65 20 5f 69 73 69 6e 74 20 3d 20 54 75 6e 69 61 e _isint = Tunia
07b0: 6e 79 28 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 ny("int");.@type
07c0: 20 5f 69 73 73 74 72 20 3d 20 54 75 6e 69 61 6e _isstr = Tunian
07d0: 79 28 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 y("int");.@type
07e0: 5f 69 73 66 75 6e 20 3d 20 54 75 6e 69 61 6e 79 _isfun = Tuniany
07f0: 28 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 5f ("int");.@type _
0800: 69 73 74 62 6c 20 3d 20 54 75 6e 69 61 6e 79 28 istbl = Tuniany(
0810: 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 5f 69 "int");.@type _i
0820: 73 62 6f 74 20 3d 20 54 75 6e 69 61 6e 79 28 22 sbot = Tuniany("
0830: 69 6e 74 22 29 3b 0a 0a 23 23 23 23 23 23 23 23 int");..########
0840: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0850: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 20 66 ###########..# f
0860: 6f 72 20 6c 69 73 74 73 0a 40 74 79 70 65 20 22 or lists.@type "
0870: 7b 7d 22 28 29 20 7b 40 76 61 6c 75 65 28 20 7b {}"() {@value( {
0880: 6c 69 73 74 3a 20 22 52 45 22 7d 20 29 7d 3b 0a list: "RE"} )};.
0890: 40 74 79 70 65 20 22 2e 3f 22 28 74 2c 20 73 29 @type ".?"(t, s)
08a0: 20 7b 40 76 61 6c 75 65 28 0a 09 69 66 20 40 74 {@value(..if @t
08b0: 79 70 65 28 74 29 3d 3d 22 52 45 22 3a 20 22 52 ype(t)=="RE": "R
08c0: 45 22 0a 09 65 6c 73 65 20 69 66 20 40 74 79 70 E"..else if @typ
08d0: 65 28 74 29 3d 3d 22 54 45 22 3a 20 22 54 45 22 e(t)=="TE": "TE"
08e0: 0a 09 65 6c 73 65 20 69 66 20 5f 69 73 74 62 6c ..else if _istbl
08f0: 28 20 40 74 79 70 65 28 74 29 20 29 3a 20 22 69 ( @type(t) ): "i
0900: 6e 74 22 0a 09 65 6c 73 65 20 22 54 45 22 0a 29 nt"..else "TE".)
0910: 7d 3b 0a 40 74 79 70 65 20 22 2e 3d 22 28 74 2c };.@type ".="(t,
0920: 20 73 40 76 61 6c 75 65 2c 20 76 29 20 7b 40 76 s@value, v) {@v
0930: 61 6c 75 65 28 0a 09 76 61 72 20 74 74 20 3d 20 alue(..var tt =
0940: 40 74 79 70 65 28 74 29 3b 0a 09 69 66 20 74 74 @type(t);..if tt
0950: 20 3d 3d 20 22 54 45 22 3a 20 22 54 45 22 0a 09 == "TE": "TE"..
0960: 65 6c 73 65 20 69 66 20 74 74 20 3d 3d 20 22 52 else if tt == "R
0970: 45 22 3a 20 22 52 45 22 0a 09 65 6c 73 65 20 69 E": "RE"..else i
0980: 66 20 5f 69 73 74 62 6c 28 74 74 29 20 26 26 20 f _istbl(tt) &&
0990: 74 74 2e 3f 6c 69 73 74 3a 0a 09 09 69 66 20 73 tt.?list:...if s
09a0: 20 3d 3d 20 22 63 61 72 22 3a 0a 09 09 09 6d 65 == "car":....me
09b0: 72 67 65 54 79 70 65 28 74 74 2c 20 7b 6c 69 73 rgeType(tt, {lis
09c0: 74 3a 20 40 74 79 70 65 28 76 29 7d 29 0a 09 09 t: @type(v)})...
09d0: 65 6c 73 65 20 69 66 20 73 20 3d 3d 20 22 63 64 else if s == "cd
09e0: 72 22 3a 0a 09 09 09 6d 65 72 67 65 54 79 70 65 r":....mergeType
09f0: 28 74 74 2c 20 40 74 79 70 65 28 76 29 29 0a 09 (tt, @type(v))..
0a00: 09 65 6c 73 65 3a 0a 09 09 09 74 74 0a 09 65 6c .else:....tt..el
0a10: 73 65 3a 0a 09 09 22 54 45 22 0a 29 7d 3b 0a 40 se:..."TE".)};.@
0a20: 74 79 70 65 20 22 2e 22 28 74 2c 20 73 40 76 61 type "."(t, s@va
0a30: 6c 75 65 29 20 7b 40 76 61 6c 75 65 28 0a 09 76 lue) {@value(..v
0a40: 61 72 20 74 74 20 3d 20 40 74 79 70 65 28 74 29 ar tt = @type(t)
0a50: 3b 0a 09 69 66 20 74 74 20 3d 3d 20 22 54 45 22 ;..if tt == "TE"
0a60: 3a 20 22 54 45 22 0a 09 65 6c 73 65 20 69 66 20 : "TE"..else if
0a70: 74 74 20 3d 3d 20 22 52 45 22 3a 20 22 52 45 22 tt == "RE": "RE"
0a80: 0a 09 65 6c 73 65 20 69 66 20 5f 69 73 74 62 6c ..else if _istbl
0a90: 28 74 74 29 20 26 26 20 74 74 2e 3f 6c 69 73 74 (tt) && tt.?list
0aa0: 3a 0a 09 09 69 66 20 73 20 3d 3d 20 22 63 61 72 :...if s == "car
0ab0: 22 3a 0a 09 09 09 74 74 2e 6c 69 73 74 0a 09 09 ":....tt.list...
0ac0: 65 6c 73 65 20 69 66 20 73 20 3d 3d 20 22 63 64 else if s == "cd
0ad0: 72 22 3a 0a 09 09 09 74 74 0a 09 09 65 6c 73 65 r":....tt...else
0ae0: 3a 0a 09 09 09 22 54 45 22 0a 09 65 6c 73 65 3a :...."TE"..else:
0af0: 0a 09 09 22 54 45 22 0a 29 7d 3b 0a 0a 23 23 23 ..."TE".)};..###
0b00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0b10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0b20: 0a 0a 64 65 66 20 66 69 62 28 78 29 20 7b 20 69 ..def fib(x) { i
0b30: 66 20 78 20 3c 20 32 20 74 68 65 6e 20 31 20 65 f x < 2 then 1 e
0b40: 6c 73 65 20 66 69 62 28 78 2d 31 29 20 2b 20 66 lse fib(x-1) + f
0b50: 69 62 28 78 2d 32 29 20 7d 3b 0a 64 65 66 20 66 ib(x-2) };.def f
0b60: 69 62 45 31 28 78 29 20 7b 20 69 66 20 22 74 72 ibE1(x) { if "tr
0b70: 75 65 21 22 20 74 68 65 6e 20 31 20 65 6c 73 65 ue!" then 1 else
0b80: 20 66 69 62 28 78 2d 31 29 20 2b 20 66 69 62 28 fib(x-1) + fib(
0b90: 78 2d 32 29 20 7d 3b 0a 64 65 66 20 66 69 62 45 x-2) };.def fibE
0ba0: 32 28 78 29 20 7b 20 69 66 20 78 3c 32 20 74 68 2(x) { if x<2 th
0bb0: 65 6e 20 22 69 63 68 69 22 20 65 6c 73 65 20 66 en "ichi" else f
0bc0: 69 62 28 78 2d 31 29 20 2b 20 66 69 62 28 78 2d ib(x-1) + fib(x-
0bd0: 32 29 20 7d 3b 0a 64 65 66 20 66 69 62 45 33 28 2) };.def fibE3(
0be0: 78 29 20 7b 20 69 66 20 78 3c 32 20 74 68 65 6e x) { if x<2 then
0bf0: 20 31 20 65 6c 73 65 20 66 69 62 28 78 2d 31 29 1 else fib(x-1)
0c00: 20 7e 20 66 69 62 28 78 2d 32 29 20 7d 3b 0a 64 ~ fib(x-2) };.d
0c10: 65 66 20 66 69 62 53 28 78 29 20 7b 20 69 66 20 ef fibS(x) { if
0c20: 78 3c 32 20 74 68 65 6e 20 22 31 22 20 65 6c 73 x<2 then "1" els
0c30: 65 20 66 69 62 28 78 2d 31 29 20 7e 20 66 69 62 e fib(x-1) ~ fib
0c40: 28 78 2d 32 29 20 7d 3b 0a 64 65 66 20 66 69 62 (x-2) };.def fib
0c50: 42 61 64 42 75 74 54 79 70 65 49 73 4f 4b 28 78 BadButTypeIsOK(x
0c60: 29 20 7b 20 69 66 20 78 20 3c 20 22 32 22 20 74 ) { if x < "2" t
0c70: 68 65 6e 20 31 20 65 6c 73 65 20 66 69 62 28 78 hen 1 else fib(x
0c80: 2d 31 29 20 2b 20 66 69 62 28 78 2d 32 29 20 7d -1) + fib(x-2) }
0c90: 3b 0a 0a 70 72 69 6e 74 28 20 40 74 79 70 65 28 ;..print( @type(
0ca0: 66 69 62 28 39 39 39 29 29 20 29 3b 0a 70 72 69 fib(999)) );.pri
0cb0: 6e 74 28 20 40 74 79 70 65 28 66 69 62 45 31 28 nt( @type(fibE1(
0cc0: 39 39 39 29 29 20 29 3b 0a 70 72 69 6e 74 28 20 999)) );.print(
0cd0: 40 74 79 70 65 28 66 69 62 45 32 28 39 39 39 29 @type(fibE2(999)
0ce0: 29 20 29 3b 0a 70 72 69 6e 74 28 20 40 74 79 70 ) );.print( @typ
0cf0: 65 28 66 69 62 45 33 28 39 39 39 29 29 20 29 3b e(fibE3(999)) );
0d00: 0a 70 72 69 6e 74 28 20 40 74 79 70 65 28 66 69 .print( @type(fi
0d10: 62 53 28 39 39 39 29 29 20 29 3b 0a 70 72 69 6e bS(999)) );.prin
0d20: 74 28 20 40 74 79 70 65 28 66 69 62 42 61 64 42 t( @type(fibBadB
0d30: 75 74 54 79 70 65 49 73 4f 4b 28 39 39 39 29 29 utTypeIsOK(999))
0d40: 20 29 3b 0a 0a 23 23 23 23 23 23 23 23 23 23 23 );..###########
0d50: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0d60: 23 23 23 23 23 23 23 23 0a 0a 64 65 66 20 6e 69 ########..def ni
0d70: 6c 20 3d 20 7b 7d 3b 0a 64 65 66 20 63 6f 6e 73 l = {};.def cons
0d80: 28 61 2c 20 64 29 20 7b 20 7b 63 61 72 3a 20 61 (a, d) { {car: a
0d90: 2c 20 63 64 72 3a 20 64 7d 20 7d 3b 0a 0a 70 72 , cdr: d} };..pr
0da0: 69 6e 74 28 20 40 74 79 70 65 28 6e 69 6c 29 20 int( @type(nil)
0db0: 29 3b 0a 70 72 69 6e 74 28 20 40 74 79 70 65 28 );.print( @type(
0dc0: 63 6f 6e 73 28 31 2c 6e 69 6c 29 29 20 29 3b 0a cons(1,nil)) );.
0dd0: 70 72 69 6e 74 28 20 40 74 79 70 65 28 63 6f 6e print( @type(con
0de0: 73 28 22 66 6f 6f 22 2c 6e 69 6c 29 29 20 29 3b s("foo",nil)) );
0df0: 0a 70 72 69 6e 74 28 20 40 74 79 70 65 28 63 6f .print( @type(co
0e00: 6e 73 28 31 32 33 2c 20 63 6f 6e 73 28 22 66 6f ns(123, cons("fo
0e10: 6f 22 2c 6e 69 6c 29 29 29 20 29 3b 20 23 20 54 o",nil))) ); # T
0e20: 45 0a 0a 64 65 66 20 72 65 76 28 78 73 29 20 7b E..def rev(xs) {
0e30: 0a 09 64 65 66 20 72 65 76 69 28 78 73 2c 20 79 ..def revi(xs, y
0e40: 73 29 20 7b 0a 09 09 63 61 73 65 20 78 73 0a 09 s) {...case xs..
0e50: 09 09 77 68 65 6e 20 7b 63 61 72 3a 20 78 2c 20 ..when {car: x,
0e60: 63 64 72 3a 20 78 73 7d 3a 20 72 65 76 69 28 78 cdr: xs}: revi(x
0e70: 73 2c 20 63 6f 6e 73 28 78 2c 79 73 29 29 0a 09 s, cons(x,ys))..
0e80: 09 09 77 68 65 6e 20 7b 7d 3a 20 79 73 0a 09 7d ..when {}: ys..}
0e90: 3b 0a 09 72 65 76 69 28 78 73 2c 20 7b 7d 29 0a ;..revi(xs, {}).
0ea0: 7d 3b 0a 0a 76 61 72 20 78 73 20 3d 20 63 6f 6e };..var xs = con
0eb0: 73 28 31 2c 20 63 6f 6e 73 28 32 2c 20 63 6f 6e s(1, cons(2, con
0ec0: 73 28 33 2c 20 6e 69 6c 29 29 29 3b 0a 70 72 69 s(3, nil)));.pri
0ed0: 6e 74 28 20 40 74 79 70 65 28 20 72 65 76 28 78 nt( @type( rev(x
0ee0: 73 29 20 29 20 29 3b 0a s) ) );.