Hex Artifact Content
Not logged in

Artifact 5f72922a0ac6e2124a526c8834cec2e3b1e022ab:


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