2011-05-22

初体験!Lispする

初体験!て奴は、いくつになってもゾクゾクさせやがる。
さてLispだが、前々から触れてみたいと考えていた。ポール・グレアム氏の著書「ハッカーと画家」の影響である。そこには、Lispを学べば実際にLispプログラムを書くことがなくても良いプログラマになれると熱く語られていた。
だが、いまいち踏み切れないでいる。いかんせん他のプログラミング言語と見た目が違う。
S式とかいうヘンテコな宣教師が「カッコカッコ...コッカコッカ」と呪文を唱えれば、カッコの奥からletとかいう控えめな教職者がlambda(ラムダ)とかいう名もない浮浪者に見返り(返り値)をねだってやがる。鬱陶しい奴らだ。
今日ではプログラミング言語も多様化し、しかもその多くがLispの特徴を取り入れつつある。わざわざこの古い言語に立ち返らなくても...という意識がどこかにある。プログラマでもないし。
とはいっても、アルゴリズムの勉強のついでに試してみる分には問題はなかろう。そこで、視覚的に遊べそうなスプライン補間とベジエ曲線を題材にしてみた。
詳細は、アル中ハイマーなページ「スプライン補間とベジエ曲線をLispしてみる」を参照されたし。
これでLispの書籍を読んでもなんとかなるだろうか???

1. 戸惑い
まず、Lispの外観を眺めるために、C言語用のアルゴリズムを書き換えるところから始めてみた。その出来具合があまりに気に入らないので、Rubyのコードを書いて比べてみた。
当初、変数のスコープの感覚がいまいち掴めないでいたが、あの忌々しい let が解決してくれる。ただ、letというキーワードはニュアンスの掴みどころがない。英語力が乏しいからそう思うのだろうけど。ちなみに、好きなフレーズに「let it be.」というのがあるが、強制や説得などをまったく感じさせない。とても変数の束縛とは相容れないような気もするが、逆に「let内は自由の楽園」といった感覚であろうか。スコープといえば、Rubyの気に入っている機能の一つに、ループ系などでイテレータを使うとスコープを生成してくれるというのがある。変数の奇妙な使い回しを未然に防いでくれるのがいい。だから、for文はあまり使わなくなった。Rubyに限らず他の言語にもイテレータ的な思想はあるが、Lispにもあるのだろうか?近代言語の思想的な話をすると、だいたいLispに辿り着くという話も聞くが...自分で作れってことか?
また、関数もマクロもリスト型データで抽象化されるので、すべてがカッコの中に収まるのがおもしろい。これが呪文の根源だ。リスト型データ構造の本質はカッコにあるのかもしれない。ちなみに、lispの終了コマンドも(exit)とカッコで囲まれる。すべてがリスト型の要素というわけだ。関数の返り値は、複数のデータ群を渡すことができるし、リスト型で表現できるものならなんでもありの感がある。
それにしても、関数とマクロの違いは見た目では分かりづらい。抽象度が高いと言えばそうなのだが、その分どちらで実装したらいいか悩ましいところか。
さらに、ちょっと敷居を感じるのが、演算式の前置記法であろうか。スプライン補間では、演算コードを思いっきり見づらくするのだが、ベジエ曲線ではそこそこすっきりする。与えられた座標から滑らかな曲線を得るための補間法という意味では、どちらも似たようなアルゴリズムなのだが。ただ、C言語的な思考で構築されているアルゴリズムであることは確かである。
関心させられたことは、初期値を埋め込む癖が自然につくことだ。最近の言語はその傾向にあるのだが、古くからある思想としては素晴らしい。

2. 道は遠い!
やはり最大の問題は、いかにLisp風に思考できるかにかかっているようだ。むかーしから気づいていたことだが、改めて頭の固さを思い知らされる。
試しているうちに、汎用的な関数があると便利だということが分かってくる。map系の関数が充実してそうだし、このあたりを変形すると効率が大幅に改善されそうだ。そんなことはどんな言語でも言えることだが、特にLispは自由度が高い分、ユーザ任せなところが多いような気がする。拡張性とは自由を重んじるということか。なるほど、自由への道が険しいことは歴史が示している。それだけに大人の言語と言えるかもしれない。
言語とは、自然言語も含めて表現の手段に過ぎない。だが、その手段が精神と結びついた時に恐ろしく合理性を発揮する。プログラミング言語では、自然言語と違って客観性を重んじる。しかし、純粋な客観性は純粋数学にしか見当たらない。あらゆる物理現象は観測系が加わって認識され、その観測系は人間認識によって構築される。いくら客観性を強調したところで、主観性から逃れる術がないのだ。となれば、主観性と客観性のバランスが重要となる。
プログラミング言語においても、言語に適合した主観的思考方法というものがあるのだろう。Cのコードを単純に書き換えたところで、Lispの長所が浮き彫りになるとも思えない。ましてや文化が違い過ぎれば、長所どころか短所の方が目立つかもしれない。まだまだ道は遠い!
人類が相対的な価値観しか構築できないのであれば、思考を広げるためにも言語の多様化は歓迎するべきであろう。異なる言語で書き換えてみることで見えてくる文化もある。翻訳の意義とは、言語の特徴を再認識させることであろうか。

3. 今後、読んでみたい書籍
これでLispの書籍を読む下地ができたであろうか?今のところ購入予定の書籍は…
  • 「初めての人のためのLISP」 竹内郁雄 著
  • 「On Lisp」 Paul Graham 著
  • 「実践Common Lisp」 Peter Seibel 著
これらを読んだ後でも感想を書いてみたい。さて、いつになることやら...

0 コメント:

コメントを投稿