Artifact 4438bc82733dcb164a3d01caf3d1a679574a8395:
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 22 3c g(x))} };.var "<
00c0: 3c 22 20 3d 20 63 6f 6d 70 6f 73 65 3b 0a 0a 75 <" = compose;..u
00d0: 70 74 6f 28 31 38 2c 20 70 72 69 6e 74 3c 3c 66 pto(18, print<<f
00e0: 69 62 29 3b 0a 0a 0a 23 23 23 23 23 23 23 23 23 ib);...#########
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 23 23 0a 23 20 #############.#
0110: 4f 6d 61 6b 65 2e 20 46 65 65 6c 20 74 68 65 20 Omake. Feel the
0120: 61 75 74 6f 6d 61 74 69 63 20 6d 65 6d 6f 69 7a automatic memoiz
0130: 61 74 69 6f 6e 21 0a 0a 23 20 53 65 74 20 75 70 ation!..# Set up
0140: 20 61 20 6d 69 72 72 6f 72 20 6c 61 79 65 72 20 a mirror layer
0150: 28 64 6f 2d 74 68 65 2d 73 61 6d 65 2d 74 68 69 (do-the-same-thi
0160: 6e 67 20 6c 61 79 65 72 29 20 6f 66 20 40 76 61 ng layer) of @va
0170: 6c 75 65 0a 40 40 6d 28 78 29 7b 78 7d 3b 0a 40 lue.@@m(x){x};.@
0180: 6d 20 22 2b 22 20 28 78 2c 79 29 20 7b 20 40 76 m "+" (x,y) { @v
0190: 61 6c 75 65 28 40 6d 28 78 29 2b 40 6d 28 79 29 alue(@m(x)+@m(y)
01a0: 29 20 7d 3b 0a 40 6d 20 22 2d 22 20 28 78 2c 79 ) };.@m "-" (x,y
01b0: 29 20 7b 20 40 76 61 6c 75 65 28 40 6d 28 78 29 ) { @value(@m(x)
01c0: 2d 40 6d 28 79 29 29 20 7d 3b 0a 40 6d 20 22 3c -@m(y)) };.@m "<
01d0: 22 20 28 78 2c 79 29 20 7b 20 40 76 61 6c 75 65 " (x,y) { @value
01e0: 28 40 6d 28 78 29 3c 40 6d 28 79 29 29 20 7d 3b (@m(x)<@m(y)) };
01f0: 0a 40 6d 20 22 69 66 22 20 28 63 2c 74 2c 65 29 .@m "if" (c,t,e)
0200: 20 7b 20 40 76 61 6c 75 65 28 69 66 20 40 6d 28 { @value(if @m(
0210: 63 29 20 74 68 65 6e 20 40 6d 28 74 28 29 29 20 c) then @m(t())
0220: 65 6c 73 65 20 40 6d 28 65 28 29 29 29 20 7d 3b else @m(e())) };
0230: 0a 0a 23 20 48 65 6c 70 65 72 20 66 75 6e 63 74 ..# Helper funct
0240: 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 66 69 62 20 ion to call fib
0250: 69 6e 20 6c 61 79 65 72 20 40 6d 0a 64 65 66 20 in layer @m.def
0260: 66 69 62 6d 28 78 20 40 76 61 6c 75 65 29 20 7b fibm(x @value) {
0270: 20 40 6d 28 66 69 62 28 40 76 61 6c 75 65 28 78 @m(fib(@value(x
0280: 29 29 29 20 7d 3b 0a 0a 23 20 55 73 65 72 20 64 ))) };..# User d
0290: 65 66 69 6e 65 64 20 6c 61 79 65 72 73 20 61 72 efined layers ar
02a0: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 e automatically
02b0: 6d 65 6d 6f 69 7a 65 64 2e 0a 23 20 53 6f 20 74 memoized..# So t
02c0: 68 69 73 20 69 73 20 6d 75 63 68 20 66 61 73 74 his is much fast
02d0: 65 72 2e 0a 75 70 74 6f 28 31 38 2c 20 70 72 69 er..upto(18, pri
02e0: 6e 74 3c 3c 66 69 62 6d 29 3b 0a nt<<fibm);.