遅れてきた人によるメモ

遅れてきた人は危険がいっぱい

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 LispGUIつきのMacのアプリを作成するには、多分これが一番楽だと思います。

Mac限定なのは、名目的に汎用性のあるCommonQtを使おうとしたけどClozure CLでは動かなかったし、QtのGUIが好きじゃなかったからです。

さっそく動かしてみる 

f:id:jiroukaja:20130414221405j:plain

今回は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/"」を追加したものを実行するとデスクトップに作成されます。

f:id:jiroukaja:20130414222546j:plain

ccl::build-applicationのキーワードに、nibファイルというものをでてきましたが、アプリ画面の表示を設定するファイルでXcodeで作るものです。Xcodeでnibファイルを作成する場合、直接nibファイルを作成することはできないみたいなので、一度、xibファイルを作成して、それをエクスポートすることでnibファイルが作成できます。また、アプリのContentsを見ると、OpenMCLという単語が出てきますが、Clozure CLと同じものと受け取っていいみたいです。

CurrencyConverter.appを開いてみるとアプリが表示されます。22ドルを円換算(98.8924051)してみました。

f:id:jiroukaja:20130415000030j:plain

解説が本家サイトの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の補完候補をどうやって出そうかな。