Hex Artifact Content
Not logged in

Artifact fd8a6f88bc7a9f4ad60cbd8ec0c6c9d4b82cbd4f:


0000: 23 20 53 74 61 6e 64 61 72 64 20 46 69 62 6f 6e  # Standard Fibon
0010: 61 63 63 69 20 66 75 6e 63 74 69 6f 6e 0a 64 65  acci function.de
0020: 66 20 66 69 62 28 78 29 0a 7b 0a 09 69 66 20 78  f fib(x).{..if x
0030: 3c 32 20 74 68 65 6e 20 31 20 65 6c 73 65 20 66  <2 then 1 else f
0040: 69 62 28 78 2d 31 29 20 2b 20 66 69 62 28 78 2d  ib(x-1) + fib(x-
0050: 32 29 0a 7d 3b 0a 0a 6c 65 74 20 75 70 74 6f 20  2).};..let upto 
0060: 3d 20 66 75 6e 28 6e 2c 20 66 29 7b 0a 09 69 66  = fun(n, f){..if
0070: 20 6e 20 3e 20 30 3a 20 75 70 74 6f 28 6e 2d 31   n > 0: upto(n-1
0080: 2c 66 29 3b 0a 09 66 28 6e 29 0a 7d 3b 0a 0a 76  ,f);..f(n).};..v
0090: 61 72 20 63 6f 6d 70 6f 73 65 20 3d 20 66 75 6e  ar compose = fun
00a0: 28 66 2c 67 29 7b 20 66 75 6e 28 78 29 7b 66 28  (f,g){ fun(x){f(
00b0: 67 28 78 29 29 7d 20 7d 3b 0a 76 61 72 20 3c 3c  g(x))} };.var <<
00c0: 20 3d 20 63 6f 6d 70 6f 73 65 3b 0a 0a 75 70 74   = compose;..upt
00d0: 6f 28 31 38 2c 20 70 72 69 6e 74 3c 3c 66 69 62  o(18, print<<fib
00e0: 29 3b 0a 0a 0a 23 23 23 23 23 23 23 23 23 23 23  );...###########
00f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0100: 23 23 23 23 23 23 23 23 23 23 23 0a 23 20 4f 6d  ###########.# Om
0110: 61 6b 65 2e 20 46 65 65 6c 20 74 68 65 20 61 75  ake. Feel the au
0120: 74 6f 6d 61 74 69 63 20 6d 65 6d 6f 69 7a 61 74  tomatic memoizat
0130: 69 6f 6e 21 0a 0a 23 20 53 65 74 20 75 70 20 61  ion!..# Set up a
0140: 20 6d 69 72 72 6f 72 20 6c 61 79 65 72 20 28 64   mirror layer (d
0150: 6f 2d 74 68 65 2d 73 61 6d 65 2d 74 68 69 6e 67  o-the-same-thing
0160: 20 6c 61 79 65 72 29 20 6f 66 20 40 76 61 6c 75   layer) of @valu
0170: 65 0a 40 40 6d 28 78 29 7b 78 7d 3b 0a 40 6d 20  e.@@m(x){x};.@m 
0180: 2b 20 28 78 2c 79 29 20 7b 20 40 76 61 6c 75 65  + (x,y) { @value
0190: 28 40 6d 28 78 29 2b 40 6d 28 79 29 29 20 7d 3b  (@m(x)+@m(y)) };
01a0: 0a 40 6d 20 2d 20 28 78 2c 79 29 20 7b 20 40 76  .@m - (x,y) { @v
01b0: 61 6c 75 65 28 40 6d 28 78 29 2d 40 6d 28 79 29  alue(@m(x)-@m(y)
01c0: 29 20 7d 3b 0a 40 6d 20 3c 20 28 78 2c 79 29 20  ) };.@m < (x,y) 
01d0: 7b 20 40 76 61 6c 75 65 28 40 6d 28 78 29 3c 40  { @value(@m(x)<@
01e0: 6d 28 79 29 29 20 7d 3b 0a 40 6d 20 69 66 20 28  m(y)) };.@m if (
01f0: 63 2c 74 2c 65 29 20 7b 20 40 76 61 6c 75 65 28  c,t,e) { @value(
0200: 69 66 20 40 6d 28 63 29 20 74 68 65 6e 20 40 6d  if @m(c) then @m
0210: 28 74 28 29 29 20 65 6c 73 65 20 40 6d 28 65 28  (t()) else @m(e(
0220: 29 29 29 20 7d 3b 0a 0a 23 20 48 65 6c 70 65 72  ))) };..# Helper
0230: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   function to cal
0240: 6c 20 66 69 62 20 69 6e 20 6c 61 79 65 72 20 40  l fib in layer @
0250: 6d 0a 64 65 66 20 66 69 62 6d 28 78 20 40 76 61  m.def fibm(x @va
0260: 6c 75 65 29 20 7b 20 40 6d 28 66 69 62 28 40 76  lue) { @m(fib(@v
0270: 61 6c 75 65 28 78 29 29 29 20 7d 3b 0a 0a 23 20  alue(x))) };..# 
0280: 55 73 65 72 20 64 65 66 69 6e 65 64 20 6c 61 79  User defined lay
0290: 65 72 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  ers are automati
02a0: 63 61 6c 6c 79 20 6d 65 6d 6f 69 7a 65 64 2e 0a  cally memoized..
02b0: 23 20 53 6f 20 74 68 69 73 20 69 73 20 6d 75 63  # So this is muc
02c0: 68 20 66 61 73 74 65 72 2e 0a 75 70 74 6f 28 31  h faster..upto(1
02d0: 38 2c 20 70 72 69 6e 74 3c 3c 66 69 62 6d 29 3b  8, print<<fibm);
02e0: 0a                                               .