原因判明

前回のAllegorCLで生成したアプリのランタイムエラーの原因がやっと判明.原因は,compile-fileが含まれるということではなく,いつの間にかコンパイラを呼び出す関数(マクロ?)を呼び出すプログラミングになっていた模様.まあ,Lispですから.
OpenGL(GLUT)アプリケーションなので,コールバック関数を登録しないといけないが,GLUTオブジェクト指向ではない.そこで呼び出されるlisp関数を生成するマクロff:defun-foreign-callableをGLUTのWindowのためのCLOSオブジェクトを生成するたびにevalするようにしていたことが原因.マルチウィンドウは実は使ってないけど,将来を考えて,ついついそうしてしまっていた.
コールバック関数を1つだけに変更して修正完了.これでうまく動くようになった!と思いきや,新たな実行時エラーが発生.

GLUT Fatal Error: glutInit can't open GLUT.nib

意味不明なので,「glutInit can't open GLUT.nib」で検索するとADCのglutのページ1件だけにヒット.

void APIENTRY glutInit(int *argcp, char **argv)
{
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
      /* Initialize our application instance */
   NSApp = [GLUTApplication sharedApplication];
   if (![NSBundle loadNibNamed:@"GLUT" owner:NSApp]) {
      __glutFatalError("glutInit can't open GLUT.nib"); // will exit
   }

うーん,nibって何?

まずはACLのマニュアルをカスタマイズ

ACLでアプリを作るというのが現在の課題.作れたのは作れたが,何故か,うまく起動しないのであった.だいたい,マニュアルがなんでこんなに読みにくいんだ!と思ったら,スタイルシートacldoc-styles.cssが空.日本語のフォントが設定されたブラウザで見ると字間が空いて,英語が間が抜けて見えるというわけでした.

body {
    font-family: "Times";
    background-color: lightyellow;
}

pre {
    padding: 1em;
    margin-left: 1em;
    font-family: "Courier";
    background-color: lightgray;
}

code {
    font-family: "Courier";
}

h2 {
    border-left: 1em navy solid;
    border-bottom: 2px navy solid:
}

だいたい,こんなもんでかなり見やすくなります.

Meadow,CLISP,SLIME

最近,やたらと忙しくてLispをさわる暇もほとんどないmacLisperなのだが,そんな中,WindowsLisp環境もセットアップするはめに...しかし,かなりハマってしまったのであった.
そんなところ,トイレで入門CommonLISPを見てたら,コラム?にMeaddow+CLISPのやり方が出ていたので,いろいろやってみる.

Meadow+CLISP

これは以下のようなinferior-lisp.emacsに追加するだけでOK.Windows.emacsをどこに置いていいかわからなかったのだが,Meadowフォルダ内に置くみたい.個人設定は無視するようで.

(setq inferior-lisp-program "C:/clisp-2.41/clisp.exe")

Meadow+CLISP+SLIME

上記のinferior-lisp-program以外に以下の記述を追加するだけ.

(add-to-list 'load-path "C:/Meadow/slime-2.0/")
(require 'slime)
(slime-setup)

Windows初心者は.emacsの置き場とかパスの表記とかそういう些細なところでつまづいてしまうのでありました.
さらにmemo/Emacsでしょでしょ?/SLIMEでCommonLISPを参考に使いやすくするには,以下をさらに追加.

(setq slime-net-coding-system 'utf-8-unix)
(add-hook 'inferior-lisp-mode-hook (lambda () (inferior-slime-mode t)))
(add-hook 'lisp-mode-hook (lambda ()
			    (slime-mode t)
			    (show-paren-mode)))
(slime-autodoc-mode)

^C+^Cで実行中のLispに読み込まれるのでとても便利.入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算

SLIMEのインストール

SLIMEEmacs内でLispを動かすシステム.エディタ内から編集中のコードを読み込ませたりできるみたいである.
ダウンロードして,展開して,/usr/local/libなどにコピーする.この作業は手作業でやるほかなさそうである.
また,以下のようなコードを.emacsに追加して,slimeをコピーしたパスやプログラム実行に使うlispなどを登録してやる必要がある.

;; Lispシステム
(setq inferior-lisp-program "/usr/local/bin/sbcl --noinform")

;; SLIME
(add-to-list 'load-path "/usr/local/lib/slime-2.0/")
(require 'slime)
(slime-setup)

起動はEscを押した後,xを押して,slimeと入力.
うまく起動すれば,画像のように入力した関数の引数が表示されるなど,MCLの内蔵エディタFRED並の使いやすさ!で使えます.
sbclなど,素で使うよりかなり作業が軽減されます.
使い方はLispUser.netさんに日本語で詳しいものがあります.

finkでEmacsをインストール

Lispでの開発にはEmacsのような高機能エディタであれば,カーソル位置の対括弧を表示したり,括弧に即したインデントをつけるなどの機能が利用できる.
しかし,MacOSX付属のEmacs(ターミナルで起動するもの)は日本語には対応していないので,新たにEmacsを導入する必要がある.
Finkをインストールした上で以下のようにmuleのパッケージを読み込めば,emacsがインストールされる.

$ sudo apt-get install mule-ucs

デフォルト状態では,日本語には対応していないので,以下のような設定を.emacsに書いておく必要がある.

;;; 日本語
(set-language-environment 'Japanese)
(set-default-coding-systems 'utf-8)
(set-terminal-coding-system 'utf-8)
(set-keyboard-coding-system 'utf-8)
(set-clipboard-coding-system 'utf-8)

(setq auto-mode-alist
      (append (list (cons "\\.asd$" 'lisp-mode)
                    (cons "\\.sbclrc$" 'lisp-mode))
              auto-mode-alist))

;;; その他設定

(show-paren-mode t)

デフォルトでC-\による日本語入力のON/OFFにも対応しているようでした.
#このときのFEPは何なんでしょう?ことえり