MacでClozure CLを使ったGUIの作成 〜その1 サンプルを動かしてみよう〜
久々すぎて自分がどんなテンションで書いていたか忘れました。
唐突にMacintosh Common Lisp(MCL)について
Macintosh Common Lispは、Macで動くCommon Lispの実装です。2009年にオープンソースになって、Clozure CLが派生しました。MCLについては、『プログラミング言語Lisp入門からマルチメディアまで』をパラパラめくるとMacに特化されたトピック盛りだくさんで面白いのですが、当然、OS X Mountain Lionなんかでは動かないので歴史的資料みたいなことになってます。
Clozure CLでGUI
Macでアプリケーションを作りたいと思った場合は、Xcodeを使ってObjective-Cが一番楽だと思います。しかし、Common Lispで作ってみたいという思ったりするわけで、今回は、MCLの派生であるClozure CLに添付されたサンプルを使ってGUIを呼び出して喜んでみるのが目的です。ついでに、いちいちLispを使って呼び出すのは面倒なので、アプリ作成までやっていきたいと思います(Clozure CLのバージョンは1.9です)。
色々制限はあると思いますが。Common LispでGUIつきのMacのアプリを作成するには、多分これが一番楽だと思います。
Mac限定なのは、名目的に汎用性のあるCommonQtを使おうとしたけどClozure CLでは動かなかったし、QtのGUIが好きじゃなかったからです。
さっそく動かしてみる
今回はClozure CLに入っているexamplesの中のCurrencyConverterを動かしてみましょう。MacVimのSlimvで試したところですが、SilmeでもTerminalでもいいと思います。Clozure CL ver.1.9をHomebrewでいじらずに入れた場合は、/usr/local/Cellar/clozure-cl/1.9/ccl/examples/cocoa/currency-converter/にあります。
上のコード(2つのうち上)をccl64で実行すると、同じディレクトリにCurrencyConverter.appが作成されます。最後まで実行するとccl64は終了して60MB弱のファイルができます。
ちなみに、2番目であるccl::build-applicationのキーワードに「:directory #P"/Users/ユーザー名/Desktop/"」を追加したものを実行するとデスクトップに作成されます。
ccl::build-applicationのキーワードに、nibファイルというものをでてきましたが、アプリ画面の表示を設定するファイルでXcodeで作るものです。Xcodeでnibファイルを作成する場合、直接nibファイルを作成することはできないみたいなので、一度、xibファイルを作成して、それをエクスポートすることでnibファイルが作成できます。また、アプリのContentsを見ると、OpenMCLという単語が出てきますが、Clozure CLと同じものと受け取っていいみたいです。
CurrencyConverter.appを開いてみるとアプリが表示されます。22ドルを円換算(98.8924051)してみました。
解説が本家サイトのBuilding the Applicationにありますが、場所が違ったりして動かなかったり、(require :COCOA)がなかったりしますので注意してください。
cf. 5.6. The Application Builder
ロードしたcurrency-converter.lispの中身を見ると、objc:defmethodで、Objective-Cのmethodを#/に続ける形で定義しているのが分かります。ccl::build-applicationは、/usr/local/Cellar/clozure-cl/1.9/ccl/cocoa-ide/build-appcation.lispにあるので、これを眺めてもいいかもしれません。
cf. 14.6. Defining Objective-C Methods
問題点は、単純なアプリでも60MB弱あるということでしょうか。Objective-CとClozure CLとの連携がどのようになっているのかよくわかっていないので、今後、何か分かったらアップしたいと思います。Common LispファイルでObjective-Cの補完候補をどうやって出そうかな。