[index]

Stairway to Functional Programming for Macintosh


以下では,『Mac 版が真っ先に開発されている』というタワケた理由で Concurrent Clean をイチオシにしてますが,最近の (1.3.2 以降) 版では,やはりというか「ナイメーヘンよ,お前もか!」てな訳で Windows 版が最初に開発されるようになっちまいました. まぁ,それでも GUI も作れるということで, Macintosh 環境上での Concurrent Clean の優位性は揺らいでいないとは思うものの,いささか入れ込み具合がショタくれるのもむべなるかな.というわけで,今現在 (May 22, 2000) では, Haskell の方に興味が行ってます.エエぢゃん,それでも.潔くて. GUI なんて「澱みに浮かぶ泡沫」さね (暴言).

『関数型言語をやりなさい』

承前 師曰 [*2]

まぁ、最後のは J 師が激昂して叫んだ言葉ですのでアレであるが、かように今現在、ワタクシの周囲では関数型言語という言葉が飛び交っているのである。と言っても騒いでるのはワタクシだけだが。他の人にとっては常識なのかも知れぬ。ちょっと焦るのである (冷汗)。 1996 年 3 月には、ある意味でもっともメジャーな ML の本 Jeffrey D. Ullman, "Elements of ML Programming", 1994 の翻訳書 [*3] が出たんで、ハマっている方もおられる方も多いかと思われる。ちなみに、ワタクシはこれに遅れること 3 年半。ようやく 1999 年の 10 月に至って読んだ。ほんまに冷汗モノであることよ。


「関数プログラミング」とはなんぞや

「関数プログラミング」ってなに? 「関数型言語」って、 C (とか) の「関数」と関係あんの?

関数プログラミングを一言でいえば、関数の定義と関数の呼出しだけでプログラムを書く、というものである。 ここでいう関数とは、 C などのプログラム言語でよく使われている「関数」ではなく、数学の関数である。 そこには、手続き型プログラミングに代表的な代入操作や、いくつかの文の逐次実行という概念はない。 むしろ、そのような言語の中の式だけでプログラムを書くというようなものである。
竹市正人, "関数プログラミング", bit, vol. 31, No. 3, 共立出版, 1999, ISSN0385-6984, p. 7.

ここでの関数とは、ある値を与えると関数の値として常に決まった値が返ってくる、領域の要素に対して値域の要素がただ一つ決まるような「対応の規則」のことですな。この「対応の規則」を組み合わせて目的とする動作を得るように書かれた「関数プログラム」を解釈実行するのが関数型言語。 「そんなことができるのか、また、なぜそれほどまでに無理をするのか」 (ibid, p. 7) とかいう話も聞こえてくるんだけれども、やっぱ、そうまでして得たいものがあるわけで、

形式仕様技術 (Formal Specification) はオブジェクト指向技術と異なり、数学を基盤とした「証明可能な」技術基盤の上に構築されてきた技術である。参照の透過性がある宣言的仕様記述を主として使う。 生命に関わる (Safety Critical) システム向きの技術で、そのようなシステムの構築ではオブジェクト指向より優れた面が多い。 形式技術は、仕様記述言語と開発方法論からなり、実装は、 参照の透過性 があり 副作用のない 関数型言語 で行うことが多い。
佐原伸, "デザインパターン オブジェクト指向分析/設計技法", SRC, 1999, ISBN4-88373-119-7, p. 202.

安全だという話はよく聞く。代入がない (必要悪としてなら存在する関数型言語もある) というのも、よく聞く。 代入が一般的、というより、一般的にそれがなければ手も足も出ない C, Pascal その他もろもろがおおきに使われている現世であるがゆえに、「関数プログラミング」「関数型言語」という言葉には、なにやら秘術的な雰囲気がまとわりつく。それだけに、「代入がない言語」というだけで、何やら妖しげな雰囲気が漂うのである。だって、あ〜た、メモリ管理不要、ポインタ不要ってだけで、拒否反応 (話を聞かない) を起こしてゲシュタルト崩壊するやつらがいるんだぜ。 おまけに、関数型言語の特徴となるキーワードは、やたら妖し気に聞こえるのが多い。だもんで、聴き手はますます引いてしまうのであ〜る。曰く、

ううむ、音だけ聴いてもエエ感じ (妖し気) だ。 実際には、ほんの少しかじっただけでも、「おお」とか「へぇ〜」とか (まぁ、「ズルいっ!」とかいうヤツもいるが) 感嘆詞が出てくるのが普通だけれど、先の 4 師が薦める意図というのは、案外この辺 (感嘆詞を出して、なおかつ、体感すること) ではないのか、という気もする。 だもんで、上記の聖言は自分で調べてくれ。やっぱ、「おお」とか「へぇ〜」とか「ズルいっ!」とか、感嘆詞を発語するだけでなく、体感せねばダメなのだ!

Pascal で計算機入門をした人は Pascal を究極的言語だと思いたがる。事実 Pascal はよい言語だから、ある程度まではそれでも大過ないが、計算機技術のほんとうのプロになりたいなら、そこで立ち停ってはこまる。 Pascal にも限界がある。 (中略) その限界がおのずと目に見えてくるだけの修養を積まねばならぬ。
木村泉, 米澤明憲, "算法表現論", 岩波書店, 1982,. p. 56.

上記の "Pascal" を自分が今使っている、惚れている、のめり込んでいる言語に置き換えてみれば佳い。


処理系

で。 まずは処理系なんだけれど、これがけっこう困るのであった。 Mac 用の環境って、あるにはあるんだけれど、 Concurrent Clean 以外にはフル・サポートっつーのが、なかなか見つからないですな。ほとんどがテキスト・ベースなのでありゅ。 以下の分類は FAQ for comp.lang.functional に従っており、よって Scheme も入っているのだ。 win, unix-box なら、もっといっぱいありゃ〜すんで、上記から辿るがよい。 おっと、ちなみに、選考基準は「フリー」または「準フリー (非商用ならフリーとか)」でありゅ。


見栄講座

次のサンプルを好きな (適当な) 関数型言語で書いてみるべし。

(progn
(defun f (x y z)
          (cond ((> x y)
                  (f (f (1- x) y z)
                     (f (1- y) z x)
                     (f (1- z) x y) ))
                (t y)  ))
(f 12 6 0)  )
竹内郁雄, "初めての人のための LISP", サイエンス社, 1986, 1989., ISBN4-7819-0454-8, p. 4.

Concurrent Clean しか試してないけど、まず間違いなく、プラットフォームを問わずに動く。 って、もちろんソースコード・レベルだけど。 ML 系はちょっと判らん (バイナリ互換あるような気がせんでもない) が。 やっぱ、気持ち佳い。

ML 系、 Scheme 系、 Haskell 系、 Concurrent Clean で、ほとんどソースは同じ、と言って佳いかも。 Haskell 系と Concurrent Clean にしたって、実質的に異なるのは Start 関数だけである。 モジュール宣言は Hugs でも構文はちょっと違うが使用可能 (たぶん MacGofer もそうだ)、インポート宣言も Hugs, MacGofer で構文も同じく使用可能。あとはまったく同じ。しかも Miranda にも似ているという、恐るべき相似性。 (ただし、 Concurrent Clean ではモジュール宣言して、適切なモジュールをインポートしないとまともに動かない。暗黙のインポートは「ない」みたい)


心と口と行いと命もて

と、まぁ、いろいろな処理系があるわけであるが、 無難なところでは ML かな。浄く正しく、であれば Haskell (Hugs) なんて佳さそうだし。

「にも関わらず」

ここではいっちょ Concurrent Clean でもつついてみようかいの、ということにしませうか。題して

「悶絶の小僧 判らぬ Clean をつつく」

Language Report の謳い文句には、 Concurrent Clean は

a general purpose, higher order, pure and lazy functional programming language based on graph rewriting designed for the development of sequential, parallel and distributed real world applications

であるとあり、 FAQ for comp.lang.functional でも、 Concurrent Clean の特徴として

などと揚がっているんだけれど、ナニ、「関数型言語」 or: 「関数プログラミング」って何それ? というレベルでは、

「猫に小判」

で、ぜんぜん説得力ないっすね (笑)。だいたい「関数型言語とは何か」、「関数プログラミングとは何か」という設問にすらすら答えられるようなら、こんなページ作らんし、読まないって。 むしろ 「Macintosh 上で」 という制限つきで

S 師が推薦する言語

というのがいちばん大きいでしょう。 (今現在でも推薦していると思うんだけど、確認を取っていない)

おまけ: 日本語で読める関数型言語のページ

ちょっとばかし日本語で読める関数型言語のページを探してみた。 (プラットフォーム不問)
ML の邦文ページ
ブレイクした ML だけに、日本語のページもけっこう見つかる。みんなリキ入っている。とくに「初級ML講座」のエネルギーは凄い。
Objective Caml の邦文ページ
Caml Special Light ベース (with Tcl/Tk, BLT) の web ブラウザとかもある。 ふと湧いた疑問なのだが、 "meddle's functional page" のページ作者は Pink Floyd ファンなのか?
Haskell の邦文ページ
Haskell も日本語ページが見つかるのであった。以下はまだ工事中ページが多いとはいえ、期待度大。
Concurrent Clean の邦文ページ
これが、 Concurrent Clean だと、実質的に佐原さんのページしか見つからないんですな。

みんな真面目なページなので、ここは一つ

  1. Mac 版が最優先されていて気分が佳い
  2. Concurrent Clean だけの日本語ページは (まだ) ない

ということで、 3 秒考えて、下世話な Concurrent Clean ページを作ろうと決めたのであ〜る。 「下世話」をキーワードにすれば、もし佐原さんがページを公開したとしても、まず間違いなくバティングしないはずだし。


  1. 調べてみると、 1997 年 1 月にリリースされた Concurrent Clean 1.2 が MO の奥底から出て来た。 MO の日付からすると、出てまもなく入手したようである。インタネに繋げるようになって 1 年くらい経った頃のお話。 今ごろ騒いでるぐらいだから、当然その頃『関数型言語』云々を認識していたとは思えん。
  2. これらはすべて師の言葉を直接耳で聞いたものである。
  3. "Elements of ML Programming", 1994 の翻訳書 余談。上記の翻訳本の腰巻きにはかくのごとし。
    史上最強の
    関数型言語ついに登場!
    ML は、高階関数、多相型 (polymorphism)、抽象データ型、強い型づけ、高度にパラメータ化されたモジュール機構、精密な例外処理など、プログラミング言語の最新トレンドを満載したプログラミング言語である。スタンドード大学のプログラミング教育用に採用された学びやすさを知ってもらいたい。
    ちなみに背文字は『プログラミング言語の最新トレンド』。をいをい、そりゃ違うだろうがという感じっす。でも、中身は佳い本だと思いますぜ。
  4. 正格・逐次実行系には、 APL 系とでも言うべき J という言語の PowerPC Mac 版 (ただし、時限爆弾付き) が存在するのだけれど、開発元から、いちいちキーコードもらわなきゃいけないので試してない。 もっと古いヤツ (1992 年 12 月) の J 6.2 というのもあるんだが (Copyright (c) 1989 1990, Roger K.W. Hui & K.E. Iverson, Copyright (c) 1990-1992, Iverson Software Inc.)、というのがあるんだが、これまた G3 Mac ではまともに動かん (正確には立ち上がるんだけどもキー入力が利かない)。 IVERSON SOFTWARE INC. is an APL technology company とのことだし、 J Software には Iverson の名前があったような記憶があるので、ご先祖さまだと思うが。
  5. Standard ML は (も) Mac ではなかなか厳しいものがある。
    1. SML/NJ 93 は G3 Mac では、 SoftwareFPU を入れると動く。 68K Mac なら要コプロ。
    2. SML/NJ 110 は "Should be ready for beta testing by the end of the year. You will needMacOS 8.6 or 9.0." だとか。早い話が、今は SML/NJ 110 は MacOS では「まだ動かない」。
    3. SoftwareFPU は http://www.jna.com/ から辿ることができる。 Version 3.07 は、non-commercial use ならば free.
  6. Moscow ML は SML97 のサブセット。主要な Basis Library はサポートされている。けっこう軽快に動くので快適。 Caml Light がベースになってるというのがなかなか興味深い。
  7. Objective Caml は Caml Light のコアをベースに、強力なモジュール・システム、オブジェクト指向パラダイム、最適化コンパイラを持つ、とある。付属する例題は、ウィンドウを 1 個開いてぐにぐにするというもので、けっこういろんなことができるのかも知れないが、突っ込んで調べていない。けっこう未実装のメニュー・アイテムとかもあるし。ただ、これが 4MB のメモリで動くとは、驚異なのでは (SML/NJ 93 は要 12MB, Moscow ML は要 8MB)。ちなみに、開発元は INRIA で、 Squeak ユーザには、 Jitter の開発者 Ian Piumarta 氏の所属するところ、ということで、有名処。
  8. ライス大学のプログラミング言語チームの逸品。 高校生に Scheme を使ってプログラミングを教えるプロジェクト (TeachScheme! Project) でも使われている処理系で、見栄えがする。ただ、ちょっと重いかな。
  9. これ (MacGambit) の昔のヤツ、 Monty Python の Gumby のアイコン背負ってたか、もしくはアバウトに Michael Palin の Gumby の Pict があったような記憶があるんだけれど、記憶違いだろうか? と、 1995 年以来アップデートされていない。が、ちゃんと G3 Mac でも動く。
  10. これ (SCM)、イマイチよう判らん。メニューの open アイテムも disable になってるしぃ。ヘッドレスのアプリケーションも用意されてるし、 Apple Scriptable という特徴があるんだけれど。なお、 Dec 1, 1999 に本が出た。 CD-ROM 付き。 Unix-box 用らしいけど、 Mac でも使える……のかな? 出版社から以下のページが提供されている。 ネタ提供は M さん。お世話になってます。ぺこり。
  11. これ (Mini-Scheme) は、あの森脇さん作 AM-Scheme のサブセットで、名作 ASLEdit+ に付属する。エディタから、ぽよんとウィンドウを開いて、そこでごそごそやるのだ。けっこう面白いよん。あと、 SECDR-Scheme は G3 Mac では動かん X-(
  12. Erlang, Oz, Sisal なんぞが該当するらしい。
  13. Hugs 98 PPC Mac は、 The Haskell Home Page からはリンクが壊れてるので入手できない。メール送ったんだけど、全然直ってない。とかブーたれていたが、 Dec 7, 1999 に試したらブッ壊れたリンクは直っていた。しかも Nov 21, 1999 付けでファイルも新しくなっている。 Hugs Online - Embracing Functional Programmingダウンロード・ページ からも取得できる。 http://haskell.org/ からも Hugs 関連はここに飛んでくるので、同じこと。 えーと、 Hugs とは、 the Haskell User's Gofer System の頭文字を取ったものである。
  14. MacGofer は、 1992 年の 0.22c (unix 版の 2.28b+ に相当) 以来アップデートされていない。が、ちゃんと G3 Mac でも動く。ちなみに、 0.22c は Haskell standard prelude version 1.2 ベースなので、コードが動くのは当たり前と言えば当たり前。
  15. FAQ for comp.lang.functional によれば、 Concurrent Clean は、非正格・並行実行 (コンカレント) 系としては、事実上唯一の実装。これがちゃんと MacOS (68K 含む) でバキバキに動くとは、うれしいじゃありませんか。しかも、 MkLinux, LinuxPPC でも動くという。 動くだけではない。 Mac 版が真っ先に開発されてリリースされるのだ。 ありがたやありがたや。拍手喝采、万歳千唱ものでしょう。

サムくてすまねぃ

このページのタイトルは、 Led Zeppelin の大名曲のタイトルのもじりだが、参照してるのは 4th アルバムではなくて、 Frank Zappa のカバー版ライヴ・ヴァージョンである。同じアルバムに入ってる、これまた超有名な Cream のタイトルを拝借して "Functional of your Love" というのも考えたんだけれども。あと、 "In the Court of The Functional Programming" というのも浮かんだんですが、却下ですな、これは。

これの最後に入っている "Stairway to Heaven" を聴くと、まさに『悶絶』ものである。あの Jimmy Page のギター・ソロを、完全コピーで、しかもブラス・アンサンブルで演ってくれちゃっているのだ (しかも、これがめちゃくちゃ巧い!!)。おまけに基本リズムはレゲエ。必聴。

論理的にこの 上のページ タイトルの元ネタは、 (よせばいいのに) Hadfield and the North の大名曲 "Halfway Between Heaven and Earth" である。

Hadfield and the North は 2 枚のアルバムと 1 枚の編集アルバムを残して解散してしまった (ただし、 CD 化に際し、編集アルバム "Afters" の大半の曲は、ボーナス・トラックとして 2 枚のオリジナル・アルバムの余白に収められている)。この曲は、それらとは別の、レインボー・シアターの閉舘残念コンサートのオムニバス・ライヴに収められていたものである。スタジオ盤には収録されなかったけれど、 15 年近く経って突如出て来た一夜限りの再結成ライヴでも取り上げているように、お気に入りの曲だったようだ。実際、佳い曲なのである。抒情的でしかもスリリングさを兼ね備えた曲というのは、なかなかない。フェイド・アウトが口惜しい大名曲である。 一般にカンタベリーというと、 Soft Machine, Caravan を中心とする人脈が繰り広げる音楽体系ということになるが、たぶん、日本では、カンタベリーと一言言ったときに、 Hadfield and the North の音楽を思い浮かべる人はかなり多いのではないかと思われる。ある意味、カンタベリーの代名詞と言っても佳いかも知れない。なにしろメンバーが凄い。 Rober Wyatt 親衛隊が結成したこのバンドのメンツは、 Dave Stewart, Richard Sinclair, Phil Miller, Pip Pyle なのである。 Richard Sinclair は「ミスター・カンタベリー」の称号を戴いているほど。


Created: Dec 10, 1999.
[index]