Memo

Y-combinator の最大の実利は、letrec を実装していなくてもフィボナッチ数列が計算できることだ。たぶん。

VSECD> (run '(((lambda (f)
		 ((lambda (g)
		    (f (lambda (arg) ((g g) arg))))
		  (lambda (g)
		    (f (lambda (arg) ((g g) arg))))))
	       (lambda (f)
		 (lambda (n)
		   (if (< n 1)
		       1
		       (+ (f (- n 1)) (f (- n 2))))))) 27))
#<VM S: (514229 . S) E: E C: #(NIL LDC 27 CONS NIL LDF 8 52 LDF 11 51 LDC 1 LD
                               1 1 < SEL 21 24 50 LDC 1 JOIN NIL LDC 2 LD 1 1 -
                               CONS LD 2 1 AP NIL LDC 1 LD 1 1 - CONS LD 2 1 AP
                               + JOIN RTN RTN CONS LDF 56 118 NIL LDF 60 86 NIL
                               LDF 64 80 NIL LD 1 1 CONS NIL LD 2 1 CONS LD 2 1
                               AP AP RTN CONS LD 2 1 AP RTN CONS LDF 90 116 NIL
                               LDF 94 110 NIL LD 1 1 CONS NIL LD 2 1 CONS LD 2
                               1 AP AP RTN CONS LD 2 1 AP RTN AP RTN AP AP STOP) D:D>
VSECD> 
VSECD> (describe *)
#<VM S: (514229 . S) E: E C: #(NIL LDC 27 CONS NIL LDF 8 52 LDF 11 51..
  [standard-object]

Slots with :INSTANCE allocation:
  STACK    = (514229 . S)
  ENV      = E
  PC       = 121
  CODE     = #(:NIL :LDC 27 :CONS :NIL :LDF 8 52 :LDF 11 51 :LDC 1 :LD 1 1 :< :SEL..
  DUMP     = D
  PROFILE  = #<HASH-TABLE :TEST EQL :COUNT 13 {1003B42771}>

スタックトップは514229コードの長さは 121、PC は 121
PC はコードの範囲外
プロファイル:
NIL: 4113828
LDC: 2571143
CONS: 4113828
LDF: 2056918
AP: 4113828
LD: 7199194
RTN: 4113828
<: 1028457
SEL: 1028457
-: 1028456
JOIN: 1028457
+: 514228
STOP: 1
; No value