本連載では、名前はよく耳にしていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、通常のプログラミング言語では構文として用意されているループや条件分岐が、すべてをメッセージ式のみで表わそうとするSmalltalkにおいて、どのように実現されているかを解説します。”この式は「3」が「4」より大きければ「5」、そうでなければ「6」を返します。3は4より大きくないので、ブロック[6]の評価結果である「6」を返すはずです。it(cmd-P)で実際に動作を確認できるので試してみてください。4」を送って「false」を返します。メッセージ式において、単項メッセージは二項メッセージに、二項メッセージはキーワードメッセージに優先して評価されます。4)の括弧は、ここでは読みやすくするために付けましたが、実際には不要です。6′′と書いても問題なく評価されます。キーワードメッセージに優先される単項メッセージも同じです。”のように、レシーバであるtrueやfalseを産生する式が、キーワードメッセージの場合(あるいは、もっと複雑な式の場合)は括弧は必要です。[6]」というメッセージ送信と解釈されてしまいます。#isDivisibleBy:ifTrue:ifFalse:などというセレクタは登録されていないのでこうしたコードがあっても、例外が生じて処理は中断しますし、そもそも評価時(メソッドならコンパイル時)に警告が出るので、ミスしたことには容易に気付くことができるはずです。”と書き換えても結果は同じです。[6]」は、#ifTure:ifFalseというセレクタ(メソッド名)と、[5]と[6]という2つのパラメータからなります。同じメッセージを、試しにtrueに送ってみましょう。”今度はブロック[5]の評価結果である「5」が返ります。ここで条件分岐について、もう少し掘り下げて考えてみることにします。[6]」によって起動される#ifTrue:ifFalse:というメソッドの中身はどんなものか、想像してみてください。オーソドックスには、レシーバがtrueなら第1パラメータとして与えられた真時ブロックを、falseなら第2パラメータの偽時ブロックを遅延評価して結果を返値として返す...というような手続きを記述した関数(メソッド)を用意すればよいように思います。Smalltalkではこれとは別のアプローチをとっています。Smalltalkでは真偽値(true、false)もオブジェクトです。[6]」というメッセージを受信できることからもお分かりいただけると思います。trueはクラスTrueの、falseはクラスFalseの、それぞれ唯一のインスタンスです。メソッド#ifTrue:ifFalse:は、実は、クラスTrue、クラスFalseに別々に定義されています。#ifTrue:ifFalseの2つが存在する...ということになります。#ifTrue:ifFalse:を起動します。#ifTrue:ifFalse:には、第2パラメータを無視し、第1パラメータとして渡されるブロックを評価した結果を返す手続きが記述されています。#ifTrue:ifFalse:には逆、つまり、第1パラメータを無視し、第2パラメータであるブロックを評価した結果を返す手続きだけが記述されています。>>#ifTrue:ifFalse:のソースコードを見て、実際にそうなっているか確認してみましょう。it(cmd-M)します。{controlling}と書かれた選択肢をクリックして選択すると、下のペインにそれに対応するメソッドのソースを呼び出すことができます。#ifTrue:ifFalse:のソースコードhttp://squab.no-ip.com:8080/mosaren/uploads/07c.pngSmalltalkのメソッドのソースコードの読み方をここで簡単に説明しておきましょう。falseAlternativeBlockは、メッセージパターンと呼ばれるもので、このメソッドを呼び出すためのメッセージの記述方法を示したものです。メソッド名(セレクタ。ここでは#ifTrue:ifFalse:)とパラメータ変数(trueAlternativeBlockとfalseAlternativeBlock)の宣言も兼ねています。2行目と3行目にはコメントとしてこのメソッドの説明が書かれています。3行目が、短いですがメソッド本体のソースコードです。「↑」は「^」(ハット)で入力できる記号で、メソッドの終了とそのときの返値を明示的にするときに使います。ちなみに返値を明示的にしないときはself(レシーバ自身)が返値として返ります。Smalltalkには返値のない関数(メソッド)というものはありません。#ifTrue:ifFalse:メソッド本体のコードを改めて見ていただくと、受け取ったブロックのうち一方を単純に評価(メッセージ「value」を送信)して値を返しているだけであることが、はっきりと見てとれると思います。条件分岐をメッセージ送信で表現することも特殊なら、その実装方法も特殊で、しかもとてもシンプルにそれを実現していることはたいへん興味深いですね。(実はこの話には“大きな嘘”があります。コンパイラの挙動やバイトコードに言及する必要があるので、またの機会に...)次回は、サンプルプログラムに話を戻して、描いた絵を保存する機能拡張を施します。#51承前、ということになる。前回はC++の多重継承が「空飛ぶコーモリはケモノでもあるがトリでもある」としちゃいがちな機構であり、ヘタに使うと(言うまでもないがうまく使えば問題はない、というかそもそもは「うまく使われる」ためにあるんだからね)スパゲティ・プログラムのOOP版......うまい比喩が思いつかぬが人知を超えた実験料理みたいなものになっちまうという話を書いた。これに比べて多重継承を許さないObjective-Cはそういう余地がないのでオレはこっちの方が好きである、と。ここでOOP理解はイマイチながらそれなりに頭のスルドいあなたは当然以下のような疑問を持ったはずである。「トリとケモノを多重継承せずにどうやってコーモリに空を飛ばせっつうのだ?」と、いうことですね。確かにコーモリもトリも空を飛ぶ。それを言ったらセミだってミツバチだって飛行機やヘリコプター、スーパーマンだって銃弾だって飛ぶんである。ミミズだっておけらだってあめんぼだってみんなみんな生きているんだトモダチなんである。ミミズとおけらは飛ばないけど......。「飛べる」という能力はトリだけの専売特許ではない。トリというクラスに固有の(ゆえにそれを継承するにはサブクラスするしかない)能力ではなく、クラス横断、複数のクラスにまたがって保持される類いの能力である。その「飛行能力」というモノ自体はなんらの実体を持たない抽象的な概念である、わかりますか。class)という仕組みが用意されている。「飛べる」という抽象クラスは以下のように定義する。定義部分にコメントしているが、この例のように「=0」(こいつを純粋指定子という)をくっつけて宣言した関数を「純粋仮想関数」といい、この純粋か相関数を一個でも持つクラスはそのまま自動的に抽象クラス、ということになってるんだが、そういう用語なんか暗記しなくてもいい(実はオレもここの用語は参考書で確認しながら書いた)。それよりこの抽象クラスというものの、文字通り「抽象性」というものをよっく味わってもらいたいのだ。他のことに関しては通常のクラスと同じでありながら、このクラスの使用にはひとつだけできないことがある。それは「直接このクラスのインスタンスを生成できない」ということ、つまりこの仕組みは例えば「飛べる」のような純粋に抽象的な能力を「多重継承を」を使って個々のオブジェクトに付与するためにあるのだ。以下に「コーモリを『飛べるケモノ』とする具体的な定義」を示しておく。*/}そしてこのコーモリのように抽象クラス「飛べる」を継承したクラスは抽象クラスの持つ純粋仮想関数を具体的に定義しなければならない。上で見たようにトリも飛行機もスーパーマンもそしてコーモリも飛ぶが、その方法はいろいろであり、それを記述する責任はサブクラス側にゆだねられている。ここまで説明すれば「コーモリを飛ばすためにトリを多重継承させる」ことの愚がわかってもらえたと思う。コーモリはトリと同じように「羽ばたいて」飛ぶが、やってることは「コーモリを飛ばすためにスーパーマンを多重継承しちゃう」のと同じことなんだってば......。X〜導入のお話〜こんにちは、高橋真人です。思いつくままに駄文を書き連ねてきたこの連載ですが、いつの間にか50回を数えることになりました。区切りのよい数を迎えたこととは全く関係ありませんが、かねてお話ししていたようにオブジェクト指向に関するお話に関してはいったんおしまいにし、今回からは少し切り口を変えてちょっとした役に立つ(かもしれない)小ネタをいくつか紹介していきたいと思います。いえ、私の中にためてきた小ネタで果たしてどのくらいの期間持つのかは皆目検討が付きませんので、再び突然の路線変更などということもあるかもしれません(笑)。XのUNIX的な側面に関して注目してのお話を展開していこうと思っています。XのUNIX面について解説している書籍も増えてきましたし、雑誌などでも特集が組まれることも多いので、それと同じではあまり面白くありません。それに、LinuxやOPENSTEPの環境でバリバリにやってきた方々に役立つような情報は到底私に提供できるわけもありませんので、ここはひとつ「プログラミング指南」らしく、プログラミング初心者の方にメリットのありそうな情報という観点で行きたいと思います。「MacがUNIXになる」。そんな話を聞いた数年前、私はかなり興奮したのを覚えています。Macにある程度慣れたころから、「そのうちUNIXに手を出してみたい」と思って、Linuxで遊ぶためにDOS/Vマシンを購入した(新しいマシンを買ってしまったため、Linuxがまだ対応しておらず、インストールの途中で撃沈)ことさえあったくらいですから、わざわざ新たにマシンを用意せずとも「Macで何でもできる」という状態は私にとってはまさに夢でした。当時はまだユーザーとしての視点しかなく、プログラミング的にどのようなメリットがあるのかなどということは考えてもみませんでした。最近になって、仕事で特にネットワークがらみの仕組みが必要になることが多く、改めてネットワークプログラミングについて勉強すると、この辺のメリットを実感することは多いのです。X対応となっていない本であっても、掲載されているサンプルソースを打ち込んでみるとほとんど修正も必要なく動作したりすることは多く、そんな時にこそ「夢が叶ったなぁ」と実感するのです。OSの延長として使っている人がことのほか多いようです。安定性だとかプリエンプティブマルチタスクという、さんざん強調されてきた特徴も、生産性の貢献という意味で大きな価値があることは疑いのないところです。PostgreSQLなどのちまたで人気のオープンソースのデータベースがネイティブで動作するとか、ApacheやPerl、Ruby、PostfixだのといったLinuxの世界でもとても人気のある製品が最初から標準機能として備わっているという、とても「おいしい」状態を興味を持たずに放っておくのももったいない話だと思うのです。いう人たちの中に、こんなことをおっしゃる方がいます。Xでも動作するので、必要な部分を読み替えろ』と書いてある。いざ実践しようとするとその読み替えをどのようにすればよいのかが皆目検討つかない。確かに、慣れない人にとってUNIXの文化は難しい部分もあるようです。歴史の長いOSですから、「知っている人しか知らない」状態の知識というものも多く、そこが初心者にとっては敷居を高くする要因であるのかもしれません。そんなわけで、皆さんと同じ「普通のMacユーザー」状態からスタートし、試行錯誤しながらも現在ではMacのUNIX機能をそれなりに享受することのできている私が自分の経験から取得したワザをいくつかご披露できれば、と思っているのです。1.5の正式版が発表されました。1.5」は、ADCメンバーサイトからダウンロードすることができます。Notesを読めば確認できます(Helpメニューからも表示可能)。Tools全体の詳細については、以下のToolsサイトを参照してください。Builderはv1.2から何も変化がありませんでした(涙)。Update」が登録されました。筆者の開発環境もv9.3へとアップデートしてみました。開発中の色々なプロジェクトを再コンパイル&リンクしてみたのですが、今のところ問題は発生していません。Apple社の最新の開発環境とv9.2の組み合わせでは、プロジェクトにcrt1.oを加えているとリンクが正常に終了しない問題が発生していましたが(mwcrt1.oの方は大丈夫)、v9.3ではそれもちゃんと改善されています。WWDC2004ではブースも出展していなかったMetrowerks社ですが、まだMacintoshユーザは忘れられていなかったようです(笑)。コンパイラのG5への最適化を含め、これからもちゃんとしたサポートの継続を望みたいところです。9という意味ではなくバージョン9の意味)を選択してください。Byteもありますので、ダウンロード時間には注意しましょう。1」がダウンロードできるようになりましたが、それに対応してADCメンバーサイトに「java142update1tools」が登録されました。Apple社のReleaseサイトには、以下の2つのドキュメントが追加されています。前回から8月20日の期間中、Apple社のDocumentationサイトには新規ドキュメントが9つ登録されました。加えて、デベロッパ向けの読み物として以下の3つの解説が登録されています。Workflow」(読み物)http://developer.apple.com/tools/xcode/reviewxcode.html前回から8月20日の期間中、新規のテクニカルノートは2つ登録されましたが、テクニカルQ&Aの方はひとつも登録されませんでした。10.3でカーネルパニックやハングアップが発生した時に、リモートでコアダンプを実行することでカーネルの状態を調べる方法が解説されています。Codeサイトには、新しいサンプルソースコードが5つ登録されました。APIへの移行を促すための例題としてWWDC2004のセッションでも紹介されていました。Apple社はこのレベルの例題を提示しておけば移行が可能だと本当に思っているのでしょうか(笑)。Kit」が登録されています。10.3.5用の最新ソースが登録されました。OSは米国アップルコンピュータ社の登録商標です。そのほかの各製品名等はそれぞれ各社の商標ならびに登録商標です。このメールの再配信、および掲載された記事の無断転載を禁じます。Artistsアクセスリンクについて個人情報の取り扱いについて支援のお願いお問い合せこのサイトに掲載されている文章、画像を含む一切のデータの無断転載を禁止します。