2007-01-25

_ Lisp:S式の理由

shiroさんがLispの拡張性について語っておられますが、 この点について、Lispが他の追随を許さないほど強力なのは全くもってその通りです。 ただ実用性という観点において、いくら原理的に可能であっても、 実装されていない機能ばかりで自分で作るものが多いと使わないんですよね、 大抵の人は。 時間もエネルギーも有限ですから。

例えば、最近の私はもはや名前つきパラメータのない処理系なんて使っていられない体になってしまってますが、 Schemeだと SRFI 89 として去年ようやく提案されたばかりで、 Gaucheでもまだ実装されていないのではないかと思います (違ったらごめんなさい)。

もちろん、作ろうと思えば理論的に可能なのだから、 自分で作ってしまえばよいという考え方もできます。 でも私はあんまりやりたいと思いません。 自分の関心はそこにはないので、 すでにサポートしてくれている処理系を採用した方が手っ取り早いからです。

ではなぜSchemeが、 今すぐ直ちに使える実装を備えているかという意味において、 他の言語に遅れをとっているケースが見られるのでしょうか。

かつてRMSはまさにトランスレータによって他の言語をSchemeに変換することによって、Guileをユニバーサルな言語処理系にするという野望を抱いていました。 まわりを見渡せば分かるように、この計画は完全に失敗しました。 (もっともTclを撃退するという方の野望は達成したので半分成功したとも言えます。) GNUの中でもGuileやSchemeを利用しているプロジェクトはほとんど存在しません。 それはなぜなのでしょうか。

いくつか理由が考えられます。 私なりに考えてみると、

  • Schemeという言語ではなく、Schemeの処理系の実装が良くなかった。だからウケが良くなかった。これはGuileにはすごく当てはまる。
  • Schemeの開発者人口が少ない。だから開発速度が他に劣る。これは技術オタク的につまらない理由だけど、真実でもある。
  • Schemeやその他のLisp系からアイデアを頂戴することによって、他の言語でも実際的に矛盾なく言語拡張が行えてしまったので、敢えてSchemeに拘る理由がなかった。あるいは拡張すべきシーンにさっぱり出会わなかった。
  • Lisperの能力が高すぎて、あまりにさっくり機能を追加できてしまうので、普通の人がすでに存在することを期待する機能を提供することに関心がない。

何だかネガティブなことばかり書いて申し訳ありませんが、 本当はSchemeがとても好きです。 しかし実用性という点で、私にとって現時点では、御世辞にも使いやすい言語とは言えません。 Gaucheのおかげで性能的にはようやく満足できるようになったので (Guileをやめたのはこれのせい)、 さらなる機能の充実を期待しています。

でも、Schemeには今のまま大衆に迎合しない路線を突き進んでもらうのも、それはそれで面白いかな。

本日のツッコミ(全1件) [ツッコミを入れる]
_ shiro (2007-01-25 17:35)

おっしゃる通りで、たとえ簡単に書ける機能であっても処理系に標準でついてくるかどうかで使い勝手は大きく変わるものです。なのでGaucheでも、汎用的で有用だと思われる機能はたとえ実装がtrivialであっても提供するのが基本方針です。 <br> <br>で、キーワード引数なのですが、これは「臆病さ」のひとつの例です。今のところキーワード引数のパージングはlet-keywords*というマクロで提供されてまして、関数定義では不定長引数で受け手もらってこのマクロでキーワード引数を取り出す、というふうに書いてもらっています。これをまとめてひとつのマクロにするのは簡単なのですが… <br> <br>引数のパージングについては標準のlambda以外にも、引数の個数でマッチをかけられるcase-lambda (srfi-16) および、さらに汎用的なパターンマッチがかけられるmatch-lambdaがあります。そこにさらに、Common Lisp風のキーワード引数やオプショナル引数のサポート構文を持つ新たな拡張構文が入る、というのがどうもすっきりしないな、引数のパージングという基本機能をひとつのマクロで統一的に提供できる方法は無いだろうか、などと考えてしまうわけです。match-lambdaとlet-keywords*マクロは組み合わせて使えるという意味で直交していますが、CL風キーワード引数構文とmatch-lambdaとの組み合わせは自明ではない、ような気がします。まだ真剣に考えたことはないんで、ちゃんと考えれば答えが見つかるかもしれませんが。 <br> <br>似たような臆病さのもう一つの例として、最近ようやくオフィシャルにサポートしたwhile, untilマクロがあります。ごく基本的なもの (マニュアルにあがっている最初のフォーム) ならマクロ数行で書けるわけですが、広い範囲で応用が効くようにしようとしたら結局2番目と3番目のフォームが必要であるとわかりました。しかし実はここでの '=>' の用法が他の構文での用法と異なっていて、ちょっと後悔してます。こういうことがあるんで、構文の追加は極端に慎重になってしまうのです。 <br>http://practical-scheme.net/gauche/man/?p=while <br>

[]