Common Lisp処理系「XCL」についてのメモなど

一つ前の記事でビルド方法を書いた、Common Lisp処理系「XCL」のメモなどを書いておきます。

関数をコンパイルして高速に動作させる

とりあえず、

(defun tak (x y z)
  (if (<= x y)
      y
      (tak (tak (- x 1) y z)
           (tak (- y 1) z x)
           (tak (- z 1) x y))))

この関数をコンパイルしてみます。
これはLispなどの速度測定に使われることが多い「たらい回し関数」というものらしいです。
まず、コンパイルせずに実行します。

CL-USER(2): (time (tak 12 6 0))
Execution took:
  46.6169395 seconds of real time
  45.6588554 seconds of user run time
  0.0440020002 seconds of system run time
  806,713,296 bytes allocated
  0 cons cells
12

処理にかかった時間は46秒ぐらいです。
次に、

(compile 'tak)

としてコンパイルしてみます。

CL-USER(4): (time (tak 12 6 0))
Execution took:
  2.2319181 seconds of real time
  2.23213911 seconds of user run time
  0.0 seconds of system run time
  0 bytes allocated
  0 cons cells
12

今度は2秒ぐらいで処理が終わっています。

rlwrapを使って操作しやすくする

XCLは、「矢印キーを使って、入力履歴から文字列を入力する」のような機能が搭載されていません。
矢印キーを押すと、「^[[A」のような文字列が入力されてしまいます。
しかし、「rlwrap」というソフトを使えば、履歴などの機能を使えるようにすることができます。

rlwrapのインストール方法は、Ubuntuの場合、

sudo aptitude install rlwrap

というコマンドです。
rlwrapをインストールしたら、

rlwrap XCL-build/xcl/xcl

のようにして、rlwrapを通してXCLを起動します。
「XCL-build/xcl/xcl」の部分は、XCLの実行ファイルの場所にしてください。
こうすれば、矢印キーの上下で履歴から文字列を入力したりすることができます。