Hex Artifact Content
Not logged in

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