全カテゴリ
  ■ コンピュータソフト
    ▼ Revised(5) Scheme

  • 新着リスト
  • 新着コメント

    登録

  • Revised(5) Scheme

    傑作(30点)
    2003年3月26日
    ひっちぃ

    Lisp のもっともスマートな亜流として知られる Scheme の正式な仕様書の最新版。亜流としての主な特徴は、静的スコープの明快さ、変数と関数を区別しない、命名規則のシンプルさ、柔軟なフロー制御など。

    入院中暇にしていたら友人が見舞いに来てくれてこれを置いていってくれた。実のところそんなシチュエーションでなければ流し読みしていたかもしれない。

    なにしろあの GNU やその筋の人たちが一番好きな通好みの言語らしいのだが、通読してみて私も好きにならずにはいられなかった。とはいっても私自身はそんなに Lisp 系のコードは書いたことがない。

    静的スコープというとなぜそんなことが問題になるのかよくわからない人もいるだろうから解説しておこう。動的スコープだとコードが実行されたときにスコープが決まるが、静的スコープだとコードを読み込んだときにスコープが決まる。スコープが違ってくると、同じ変数名なのに違う変数を指したりしてややこしい。Lisp は概して動的スコープで、しかも二通りの仕様があって混乱している。動的スコープのほうが柔軟な動きができるのかもしれないが、静的スコープの方が分かりやすいと思う。コードサンプルを見ていても数学的パズルをやっている気分にさせられるのはごめんだ。

    変数と関数を区別しないのもシンプルでいい。本家 Lisp では、文脈によってシンボルを変数として解釈したり関数として解釈したりする。また他の解釈のあるものもあるようなこともどこかで読んだような。ともかくシンボルは単なるタグという認識だ。これは柔軟性があるが不要な誤解を招く。

    柔軟なフロー制御というと「継続(continuation)」のことだ。こんにち主要な開発環境で実装されている例外処理なんかの構文を含んだ汎用的で柔軟な仕組みらしい。今回初めて通読してみて思ったのは、Scheme には「継続」は必要ないと思う。確かに強力な仕組みなのだが、たとえばC言語の goto文の飛び先を変数でダイナミックに決めることが出来たところで、どこの誰が喜ぶのだろうか。また、変数に保存しておいた継続を忘れたころに呼び出してもフローを戻すことができてしまう。もし次の仕様書ができるのならば、なるべく継続は隠して、内部に継続を使った何パターンかのフロー制御文をマクロかなにかで実現したものを標準にしたほうがいいと思う。

    コードを書く者としてみた場合、Lisp 系はやはり相変わらず括弧がウザい。Scheme もその点かわりない。ただ、水道管をつなぐようにプログラミングできるところはすばらしいと思う。手続き言語だと、共通部分はどうしても別の関数にしてどっかに飛ばされるのだが、Lisp には無名関数や強力なマクロがある。Scheme とは関係ないが、理想的な言語は一つのデータや処理がどことどことどこで使われるのかが一目瞭然であってほしいと思う。

    実装する者としてみた場合、構文解析は楽っぽかったが、ところどころめんどくさそうな部分があった。特に、文脈自由文法でない Quasiquotation だとか、マクロ定義、継続。趣味で作るなら削ってもいいんじゃないかとは思う。Lisp自体がAI言語として生まれたこともあり、AI同士を戦わせるゲームの処理系として使ってみたいなと思わされたが、やはり自分で作るのは面倒なので、どこかで PHP か Perl で動く処理系を拾ってきた方が早いかなと思った。なぜこの二つかというと、ウェブアプリにしたいからだ。

    最後に、私はこの言語を好きかと訊かれたら Yes だが、一番好きかと訊かれたら No だ。Java の方がすばらしいと思う。Scheme で Java のようなコーディングだって出来るのだが、そうでないコーディングもできてしまうし、可読性だって効率だって低くなるだろう。

    この歴史ある言語はまた、XML のようなデータ記述形式の持つ可能性への示唆にも富んでいると思う。データとコードが一体でツリー状の構造を持った Lisp/Scheme は、XML をプログラミング言語にしてしまうことすら「想像の範囲内」にしてしまっている。

    Scheme は過去の名作言語をスマートにしたものであり、オリジナルの神々しいまでの輝きに比べればその光はにぶいと言わざるを得ない。しかし、オリジナルの持つ不確かで曖昧なところを、現代の優れた人々がキッチリと手を入れており、まあ私は最近の言語事情を知らないが、小さくまとまっている最近の Python や Ruby とかよりも野心的でかつ新しいように思う。Perl はオブジェクト志向のパラダイムで旧式化したが、Lisp/Scheme はまた別の流れの中に漂い続けている。

    [参考]
    http://www.swiss.ai.mit.edu/
    ~jaffer/
    r5rs_toc.html

    コメントはありません

    manuke.com