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バイトコードについてはほとんど知りません。末尾再帰の最適化はないようです。専門家はそれを説明できますか?
心から!