ECL 可以计算 fac(1000) 真是太棒了!ECL 怎么做呢?
>(defun fac (n) (if (= n 1) 1 (* n (fac (- n 1)))))
>(disassemble #'fac)
#(FAC N = - * #<bytecompiled-function FAC> SI:FSET)
Name: FAC
0 POP REQ
1 BIND N
3 NOMORE
4 PUSHV 0
6 PUSH 1
8 CALLG 2,=
11 JNIL 18
13 QUOTE 1
15 SET VALUES(0),REG0
16 JMP 35
18 PUSHV 0
20 PUSHV 0
22 PUSH 1
24 CALLG 2,-
27 PUSH VALUES(0)
28 CALLG 1,FAC
31 PUSH VALUES(0)
32 CALLG 2,*
35 EXIT
我对 ECL 字节码知之甚少。似乎没有尾递归优化。有高手能解释一下吗?
真挚地!