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 2b 20 3d 20 54 62 69 6e 28 22 69 6e 74 22 e + = Tbin("int"
04e0: 2c 20 22 69 6e 74 22 2c 20 22 69 6e 74 22 29 3b , "int", "int");
04f0: 0a 40 74 79 70 65 20 2d 20 3d 20 54 62 69 6e 28 .@type - = Tbin(
0500: 22 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 22 69 "int", "int", "i
0510: 6e 74 22 29 3b 0a 40 74 79 70 65 20 2a 20 3d 20 nt");.@type * =
0520: 54 62 69 6e 28 22 69 6e 74 22 2c 20 22 69 6e 74 Tbin("int", "int
0530: 22 2c 20 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 ", "int");.@type
0540: 20 2f 20 3d 20 54 62 69 6e 28 22 69 6e 74 22 2c / = Tbin("int",
0550: 20 22 69 6e 74 22 2c 20 22 69 6e 74 22 29 3b 0a "int", "int");.
0560: 40 74 79 70 65 20 25 20 3d 20 54 62 69 6e 28 22 @type % = Tbin("
0570: 69 6e 74 22 2c 20 22 69 6e 74 22 2c 20 22 69 6e int", "int", "in
0580: 74 22 29 3b 0a 40 74 79 70 65 20 26 26 20 3d 20 t");.@type && =
0590: 54 62 69 6e 28 22 69 6e 74 22 2c 20 22 69 6e 74 Tbin("int", "int
05a0: 22 2c 20 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 ", "int");.@type
05b0: 20 7c 7c 20 3d 20 54 62 69 6e 28 22 69 6e 74 22 || = Tbin("int"
05c0: 2c 20 22 69 6e 74 22 2c 20 22 69 6e 74 22 29 3b , "int", "int");
05d0: 0a 40 74 79 70 65 20 70 72 69 6e 74 20 3d 20 66 .@type print = f
05e0: 75 6e 28 78 29 7b 78 7d 3b 0a 40 74 79 70 65 20 un(x){x};.@type
05f0: 67 65 6e 73 79 6d 20 3d 20 66 75 6e 28 29 7b 22 gensym = fun(){"
0600: 73 74 72 22 7d 3b 0a 40 74 79 70 65 20 61 72 67 str"};.@type arg
0610: 76 20 3d 20 7b 6c 69 73 74 3a 20 22 73 74 72 22 v = {list: "str"
0620: 7d 3b 0a 40 74 79 70 65 20 72 61 6e 64 20 3d 20 };.@type rand =
0630: 54 75 6e 69 28 22 69 6e 74 22 2c 22 69 6e 74 22 Tuni("int","int"
0640: 29 3b 0a 40 74 79 70 65 20 7e 20 3d 20 54 62 69 );.@type ~ = Tbi
0650: 6e 61 6e 79 28 22 73 74 72 22 29 3b 0a 40 74 79 nany("str");.@ty
0660: 70 65 20 3c 20 3d 20 54 62 69 6e 61 6e 79 28 22 pe < = Tbinany("
0670: 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 3c 3d 20 int");.@type <=
0680: 3d 20 54 62 69 6e 61 6e 79 28 22 69 6e 74 22 29 = Tbinany("int")
0690: 3b 0a 40 74 79 70 65 20 3e 20 3d 20 54 62 69 6e ;.@type > = Tbin
06a0: 61 6e 79 28 22 69 6e 74 22 29 3b 0a 40 74 79 70 any("int");.@typ
06b0: 65 20 3e 3d 20 3d 20 54 62 69 6e 61 6e 79 28 22 e >= = Tbinany("
06c0: 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 3d 3d 20 int");.@type ==
06d0: 3d 20 54 62 69 6e 61 6e 79 28 22 69 6e 74 22 29 = Tbinany("int")
06e0: 3b 0a 40 74 79 70 65 20 21 3d 20 3d 20 54 62 69 ;.@type != = Tbi
06f0: 6e 61 6e 79 28 22 69 6e 74 22 29 3b 0a 40 74 79 nany("int");.@ty
0700: 70 65 20 69 66 20 28 63 2c 74 2c 65 29 20 7b 40 pe if (c,t,e) {@
0710: 76 61 6c 75 65 28 0a 09 69 66 20 40 74 79 70 65 value(..if @type
0720: 28 63 29 3d 3d 22 52 45 22 3a 20 22 52 45 22 0a (c)=="RE": "RE".
0730: 09 65 6c 73 65 20 69 66 20 40 74 79 70 65 28 63 .else if @type(c
0740: 29 21 3d 22 69 6e 74 22 3a 20 22 54 45 22 0a 09 )!="int": "TE"..
0750: 65 6c 73 65 20 6d 65 72 67 65 54 79 70 65 28 20 else mergeType(
0760: 40 74 79 70 65 28 74 28 29 29 2c 20 40 74 79 70 @type(t()), @typ
0770: 65 28 65 28 29 29 20 29 3b 0a 29 7d 3b 0a 40 74 e(e()) );.)};.@t
0780: 79 70 65 20 5f 69 73 69 6e 74 20 3d 20 54 75 6e ype _isint = Tun
0790: 69 61 6e 79 28 22 69 6e 74 22 29 3b 0a 40 74 79 iany("int");.@ty
07a0: 70 65 20 5f 69 73 73 74 72 20 3d 20 54 75 6e 69 pe _isstr = Tuni
07b0: 61 6e 79 28 22 69 6e 74 22 29 3b 0a 40 74 79 70 any("int");.@typ
07c0: 65 20 5f 69 73 66 75 6e 20 3d 20 54 75 6e 69 61 e _isfun = Tunia
07d0: 6e 79 28 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 ny("int");.@type
07e0: 20 5f 69 73 74 62 6c 20 3d 20 54 75 6e 69 61 6e _istbl = Tunian
07f0: 79 28 22 69 6e 74 22 29 3b 0a 40 74 79 70 65 20 y("int");.@type
0800: 5f 69 73 62 6f 74 20 3d 20 54 75 6e 69 61 6e 79 _isbot = Tuniany
0810: 28 22 69 6e 74 22 29 3b 0a 0a 23 23 23 23 23 23 ("int");..######
0820: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0830: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23 #############..#
0840: 20 66 6f 72 20 6c 69 73 74 73 0a 40 74 79 70 65 for lists.@type
0850: 20 22 7b 7d 22 28 29 20 7b 40 76 61 6c 75 65 28 "{}"() {@value(
0860: 20 7b 6c 69 73 74 3a 20 22 52 45 22 7d 20 29 7d {list: "RE"} )}
0870: 3b 0a 40 74 79 70 65 20 2e 3f 20 28 74 2c 20 73 ;.@type .? (t, s
0880: 29 20 7b 40 76 61 6c 75 65 28 0a 09 69 66 20 40 ) {@value(..if @
0890: 74 79 70 65 28 74 29 3d 3d 22 52 45 22 3a 20 22 type(t)=="RE": "
08a0: 52 45 22 0a 09 65 6c 73 65 20 69 66 20 40 74 79 RE"..else if @ty
08b0: 70 65 28 74 29 3d 3d 22 54 45 22 3a 20 22 54 45 pe(t)=="TE": "TE
08c0: 22 0a 09 65 6c 73 65 20 69 66 20 5f 69 73 74 62 "..else if _istb
08d0: 6c 28 20 40 74 79 70 65 28 74 29 20 29 3a 20 22 l( @type(t) ): "
08e0: 69 6e 74 22 0a 09 65 6c 73 65 20 22 54 45 22 0a int"..else "TE".
08f0: 29 7d 3b 0a 40 74 79 70 65 20 2e 3d 20 28 74 2c )};.@type .= (t,
0900: 20 73 40 76 61 6c 75 65 2c 20 76 29 20 7b 40 76 s@value, v) {@v
0910: 61 6c 75 65 28 0a 09 76 61 72 20 74 74 20 3d 20 alue(..var tt =
0920: 40 74 79 70 65 28 74 29 3b 0a 09 69 66 20 74 74 @type(t);..if tt
0930: 20 3d 3d 20 22 54 45 22 3a 20 22 54 45 22 0a 09 == "TE": "TE"..
0940: 65 6c 73 65 20 69 66 20 74 74 20 3d 3d 20 22 52 else if tt == "R
0950: 45 22 3a 20 22 52 45 22 0a 09 65 6c 73 65 20 69 E": "RE"..else i
0960: 66 20 5f 69 73 74 62 6c 28 74 74 29 20 26 26 20 f _istbl(tt) &&
0970: 74 74 2e 3f 6c 69 73 74 3a 0a 09 09 69 66 20 73 tt.?list:...if s
0980: 20 3d 3d 20 22 63 61 72 22 3a 0a 09 09 09 6d 65 == "car":....me
0990: 72 67 65 54 79 70 65 28 74 74 2c 20 7b 6c 69 73 rgeType(tt, {lis
09a0: 74 3a 20 40 74 79 70 65 28 76 29 7d 29 0a 09 09 t: @type(v)})...
09b0: 65 6c 73 65 20 69 66 20 73 20 3d 3d 20 22 63 64 else if s == "cd
09c0: 72 22 3a 0a 09 09 09 6d 65 72 67 65 54 79 70 65 r":....mergeType
09d0: 28 74 74 2c 20 40 74 79 70 65 28 76 29 29 0a 09 (tt, @type(v))..
09e0: 09 65 6c 73 65 3a 0a 09 09 09 74 74 0a 09 65 6c .else:....tt..el
09f0: 73 65 3a 0a 09 09 22 54 45 22 0a 29 7d 3b 0a 40 se:..."TE".)};.@
0a00: 74 79 70 65 20 2e 20 28 74 2c 20 73 40 76 61 6c type . (t, s@val
0a10: 75 65 29 20 7b 40 76 61 6c 75 65 28 0a 09 76 61 ue) {@value(..va
0a20: 72 20 74 74 20 3d 20 40 74 79 70 65 28 74 29 3b r tt = @type(t);
0a30: 0a 09 69 66 20 74 74 20 3d 3d 20 22 54 45 22 3a ..if tt == "TE":
0a40: 20 22 54 45 22 0a 09 65 6c 73 65 20 69 66 20 74 "TE"..else if t
0a50: 74 20 3d 3d 20 22 52 45 22 3a 20 22 52 45 22 0a t == "RE": "RE".
0a60: 09 65 6c 73 65 20 69 66 20 5f 69 73 74 62 6c 28 .else if _istbl(
0a70: 74 74 29 20 26 26 20 74 74 2e 3f 6c 69 73 74 3a tt) && tt.?list:
0a80: 0a 09 09 69 66 20 73 20 3d 3d 20 22 63 61 72 22 ...if s == "car"
0a90: 3a 0a 09 09 09 74 74 2e 6c 69 73 74 0a 09 09 65 :....tt.list...e
0aa0: 6c 73 65 20 69 66 20 73 20 3d 3d 20 22 63 64 72 lse if s == "cdr
0ab0: 22 3a 0a 09 09 09 74 74 0a 09 09 65 6c 73 65 3a ":....tt...else:
0ac0: 0a 09 09 09 22 54 45 22 0a 09 65 6c 73 65 3a 0a ...."TE"..else:.
0ad0: 09 09 22 54 45 22 0a 29 7d 3b 0a 0a 23 23 23 23 .."TE".)};..####
0ae0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0af0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a ###############.
0b00: 0a 64 65 66 20 66 69 62 28 78 29 20 7b 20 69 66 .def fib(x) { if
0b10: 20 78 20 3c 20 32 20 74 68 65 6e 20 31 20 65 6c x < 2 then 1 el
0b20: 73 65 20 66 69 62 28 78 2d 31 29 20 2b 20 66 69 se fib(x-1) + fi
0b30: 62 28 78 2d 32 29 20 7d 3b 0a 64 65 66 20 66 69 b(x-2) };.def fi
0b40: 62 45 31 28 78 29 20 7b 20 69 66 20 22 74 72 75 bE1(x) { if "tru
0b50: 65 21 22 20 74 68 65 6e 20 31 20 65 6c 73 65 20 e!" then 1 else
0b60: 66 69 62 28 78 2d 31 29 20 2b 20 66 69 62 28 78 fib(x-1) + fib(x
0b70: 2d 32 29 20 7d 3b 0a 64 65 66 20 66 69 62 45 32 -2) };.def fibE2
0b80: 28 78 29 20 7b 20 69 66 20 78 3c 32 20 74 68 65 (x) { if x<2 the
0b90: 6e 20 22 69 63 68 69 22 20 65 6c 73 65 20 66 69 n "ichi" else fi
0ba0: 62 28 78 2d 31 29 20 2b 20 66 69 62 28 78 2d 32 b(x-1) + fib(x-2
0bb0: 29 20 7d 3b 0a 64 65 66 20 66 69 62 45 33 28 78 ) };.def fibE3(x
0bc0: 29 20 7b 20 69 66 20 78 3c 32 20 74 68 65 6e 20 ) { if x<2 then
0bd0: 31 20 65 6c 73 65 20 66 69 62 28 78 2d 31 29 20 1 else fib(x-1)
0be0: 7e 20 66 69 62 28 78 2d 32 29 20 7d 3b 0a 64 65 ~ fib(x-2) };.de
0bf0: 66 20 66 69 62 53 28 78 29 20 7b 20 69 66 20 78 f fibS(x) { if x
0c00: 3c 32 20 74 68 65 6e 20 22 31 22 20 65 6c 73 65 <2 then "1" else
0c10: 20 66 69 62 28 78 2d 31 29 20 7e 20 66 69 62 28 fib(x-1) ~ fib(
0c20: 78 2d 32 29 20 7d 3b 0a 64 65 66 20 66 69 62 42 x-2) };.def fibB
0c30: 61 64 42 75 74 54 79 70 65 49 73 4f 4b 28 78 29 adButTypeIsOK(x)
0c40: 20 7b 20 69 66 20 78 20 3c 20 22 32 22 20 74 68 { if x < "2" th
0c50: 65 6e 20 31 20 65 6c 73 65 20 66 69 62 28 78 2d en 1 else fib(x-
0c60: 31 29 20 2b 20 66 69 62 28 78 2d 32 29 20 7d 3b 1) + fib(x-2) };
0c70: 0a 0a 70 72 69 6e 74 28 20 40 74 79 70 65 28 66 ..print( @type(f
0c80: 69 62 28 39 39 39 29 29 20 29 3b 0a 70 72 69 6e ib(999)) );.prin
0c90: 74 28 20 40 74 79 70 65 28 66 69 62 45 31 28 39 t( @type(fibE1(9
0ca0: 39 39 29 29 20 29 3b 0a 70 72 69 6e 74 28 20 40 99)) );.print( @
0cb0: 74 79 70 65 28 66 69 62 45 32 28 39 39 39 29 29 type(fibE2(999))
0cc0: 20 29 3b 0a 70 72 69 6e 74 28 20 40 74 79 70 65 );.print( @type
0cd0: 28 66 69 62 45 33 28 39 39 39 29 29 20 29 3b 0a (fibE3(999)) );.
0ce0: 70 72 69 6e 74 28 20 40 74 79 70 65 28 66 69 62 print( @type(fib
0cf0: 53 28 39 39 39 29 29 20 29 3b 0a 70 72 69 6e 74 S(999)) );.print
0d00: 28 20 40 74 79 70 65 28 66 69 62 42 61 64 42 75 ( @type(fibBadBu
0d10: 74 54 79 70 65 49 73 4f 4b 28 39 39 39 29 29 20 tTypeIsOK(999))
0d20: 29 3b 0a 0a 23 23 23 23 23 23 23 23 23 23 23 23 );..############
0d30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
0d40: 23 23 23 23 23 23 23 0a 0a 64 65 66 20 6e 69 6c #######..def nil
0d50: 20 3d 20 7b 7d 3b 0a 64 65 66 20 63 6f 6e 73 28 = {};.def cons(
0d60: 61 2c 20 64 29 20 7b 20 7b 63 61 72 3a 20 61 2c a, d) { {car: a,
0d70: 20 63 64 72 3a 20 64 7d 20 7d 3b 0a 0a 70 72 69 cdr: d} };..pri
0d80: 6e 74 28 20 40 74 79 70 65 28 6e 69 6c 29 20 29 nt( @type(nil) )
0d90: 3b 0a 70 72 69 6e 74 28 20 40 74 79 70 65 28 63 ;.print( @type(c
0da0: 6f 6e 73 28 31 2c 6e 69 6c 29 29 20 29 3b 0a 70 ons(1,nil)) );.p
0db0: 72 69 6e 74 28 20 40 74 79 70 65 28 63 6f 6e 73 rint( @type(cons
0dc0: 28 22 66 6f 6f 22 2c 6e 69 6c 29 29 20 29 3b 0a ("foo",nil)) );.
0dd0: 70 72 69 6e 74 28 20 40 74 79 70 65 28 63 6f 6e print( @type(con
0de0: 73 28 31 32 33 2c 20 63 6f 6e 73 28 22 66 6f 6f s(123, cons("foo
0df0: 22 2c 6e 69 6c 29 29 29 20 29 3b 20 23 20 54 45 ",nil))) ); # TE
0e00: 0a 0a 64 65 66 20 72 65 76 28 78 73 29 20 7b 0a ..def rev(xs) {.
0e10: 09 64 65 66 20 72 65 76 69 28 78 73 2c 20 79 73 .def revi(xs, ys
0e20: 29 20 7b 0a 09 09 63 61 73 65 20 78 73 0a 09 09 ) {...case xs...
0e30: 09 77 68 65 6e 20 7b 63 61 72 3a 20 78 2c 20 63 .when {car: x, c
0e40: 64 72 3a 20 78 73 7d 3a 20 72 65 76 69 28 78 73 dr: xs}: revi(xs
0e50: 2c 20 63 6f 6e 73 28 78 2c 79 73 29 29 0a 09 09 , cons(x,ys))...
0e60: 09 77 68 65 6e 20 7b 7d 3a 20 79 73 0a 09 7d 3b .when {}: ys..};
0e70: 0a 09 72 65 76 69 28 78 73 2c 20 7b 7d 29 0a 7d ..revi(xs, {}).}
0e80: 3b 0a 0a 64 65 66 20 73 74 72 5f 61 70 70 28 78 ;..def str_app(x
0e90: 73 2c 20 79 73 29 20 7b 0a 09 63 61 73 65 20 78 s, ys) {..case x
0ea0: 73 0a 09 09 09 77 68 65 6e 20 7b 63 61 72 3a 20 s....when {car:
0eb0: 78 2c 20 63 64 72 3a 20 78 73 7d 3a 20 63 6f 6e x, cdr: xs}: con
0ec0: 73 28 22 22 7e 78 2c 20 73 74 72 5f 61 70 70 28 s(""~x, str_app(
0ed0: 78 73 2c 20 79 73 29 29 0a 09 09 09 77 68 65 6e xs, ys))....when
0ee0: 20 7b 7d 3a 20 79 73 0a 7d 3b 0a 0a 76 61 72 20 {}: ys.};..var
0ef0: 78 73 20 3d 20 63 6f 6e 73 28 31 2c 20 63 6f 6e xs = cons(1, con
0f00: 73 28 32 2c 20 63 6f 6e 73 28 33 2c 20 6e 69 6c s(2, cons(3, nil
0f10: 29 29 29 3b 0a 76 61 72 20 79 73 20 3d 20 63 6f )));.var ys = co
0f20: 6e 73 28 22 66 6f 75 72 22 2c 20 63 6f 6e 73 28 ns("four", cons(
0f30: 22 66 69 76 65 22 2c 20 63 6f 6e 73 28 22 73 69 "five", cons("si
0f40: 78 22 2c 20 6e 69 6c 29 29 29 3b 0a 70 72 69 6e x", nil)));.prin
0f50: 74 28 20 40 74 79 70 65 28 20 72 65 76 28 78 73 t( @type( rev(xs
0f60: 29 20 29 20 29 3b 0a 70 72 69 6e 74 28 20 40 74 ) ) );.print( @t
0f70: 79 70 65 28 20 72 65 76 28 79 73 29 20 29 20 29 ype( rev(ys) ) )
0f80: 3b 0a 70 72 69 6e 74 28 20 40 74 79 70 65 28 20 ;.print( @type(
0f90: 73 74 72 5f 61 70 70 28 78 73 2c 79 73 29 20 29 str_app(xs,ys) )
0fa0: 20 29 3b 0a 70 72 69 6e 74 28 20 40 74 79 70 65 );.print( @type
0fb0: 28 20 73 74 72 5f 61 70 70 28 78 73 2c 78 73 29 ( str_app(xs,xs)
0fc0: 20 29 20 29 3b 0a ) );.