なんだこれは

はてなダイアリーから移転しました。

clispとeclで大きい数で遊んでみた

lispはかなり大きな数が扱えるとかで、フィボナッチの関数で大きいものを出して遊んでいた。というかlispになれる練習をしていた。


まず、こんなファイルを作成してみた。

(defun fibo (n &optional (a1 1 ) (a2 0))
  (if (< n 1)
      a1
      (fibo (1- n) (+ a1 a2) a1)))
(defun read-fibnum ()
  (or (parse-integer (read-line *query-io* ) :junk-allowed t) 0))

(format t "~A" (fibo (read-fibnum)))
(quit)

clispの(もちろんslime/Emacs)上にロードして、(fibo 2000)を実行すると、あっというまに二三行を数字で埋め尽くす程の大きな数が返ってきた。
さすがである。だが(fibo 10000)を実行するとうまくいかない。slimeのデバッグはまだよくわからないのでqで脱出した。

そこでeclでもやってみた。eclだったら、そうgmpが使えるはずだからである。
eclを起動して、

(compile-file "fib.lisp" :system-p t)
(c:build-program "fib.x" :lisp-files '("fib.o"))

すると、入力をとって数字ならフィボナッチ数を計算してくれる実行ファイルが作成されるはずだ。

./fib.x

10000を入れると、あっという間である。Terminal.appが数字でいっぱいになった。
しかし20000あたりが限界のようである。これでついにstack over flowしてしまうのだ。うむうむ。