blogこの広告は、90日以上更新していないブログに表示しています。LISPを訳してみました。まつもとさんによる反応もあり、そのエントリの中で原文はほぼ要約されています。一年前、私はRubyに注目してはいたものの、それを無視することにした。RubyはPythonほどポピュラーではないし、LISPほど強力というわけでもない。気にかけなければならないというのか。これらの評価基準は考えなおすこともできる。それはRubyを興味深いものにするに足るのではないか?この疑問に答える前に、LISPを強力たらしめているものは何なのかを定義しておくべきだろう。GrahamはLISPの美徳について雄弁に語ったが、ここでは議論のために次の2つに絞ることにしよう。LISPは濃い(dence)関数型言語であるLISPはプログラム可能なマクロを持っている結局のところ、Rubyは関数型言語とほぼ同等であり、私が考えていたよりも上手くマクロを模倣することが分かった。RubyはLISPよりも濃い関数型言語である濃い言語というのはソースを難読化することなく、物事を簡明に表現させる。あなたは一目でより多くのプログラムを見渡すことができ、自然そこにはバグの隠れる余地も少なくなる。ある一定のレベルを超えて、プログラムをより”濃く”するための唯一の方法は、より強力な抽象化を使用することだ。強力な抽象化の1つがlambdaだ。lambdaを使うことで、あなたはその場ですぐに新しい関数を作って、他の関数に渡したり、後で使うために格納することさえできる。mylist)mapcarはmylistの各要素を変換することによって新しいリストを作りだす。この場合の変換は「nのそれぞれの値について、nに2を掛ける」と読める。JavaScriptではlambdaはfunctionとして書かれる。mylist)もちろん、これはあなたがlambdaでできることに関する一つのヒントにすぎない。このようなプログラミングスタイルを支持する言語は関数型言語と呼ばれる。関数をベースとして動作するためだ。実際に、濃い関数型言語は非常に簡潔になりうる。ひとたび関数型言語の読み方を学べば、それはまったく明快なものになるだろう。どのようにしてRubyは関数型プログラミングという点でLISPに匹敵するものになっているのだろうか。Grahamによる規範的な例を考えてみよう。i)))このコードはRubyではわずかではあるがより短くなり、その表記はCハッカーにとってより親しみやすいものになる。14しかし、Rubyの場合、我々がよりタイピング量を節約できるような興味深い特別な場合がある。lambdaを引数に取るような、ごく単純な関数を考えよう。n)))しかし、我々はRubyでこれと同じことをより上手くやることができる。yieldを使うことでlambdaやfnを一掃してみよう。yieldは特殊目的のハックだ。それは一つのlambdaを引数に取る関数に対してのみ使える。重度の関数的コードにおいては、yieldは多くの手間を省いてくれる。次の2つを比較して欲しい。3)))大きなプログラムでは、この差が積み重なってくる。(LISPに対する弁護としては、lambdaをより簡潔にするリーダーマクロを書くことが可能だということだ。)Rubyはあなたがマクロでしたいことの約80%は与えてくれるLISPハッカーはこう言うだろう。「lambdaの良い構文があるのはわかった。マクロについてはどうか?」これは良い質問だ。LISPのマクロは次のような機能を持っている。コンパイラの中で走るカスタマイズされた構文を生のLISPに変換するLISPマクロの最も一般的な使用法は沢山のlambdaをタイプするのを避けることだ。n))defmacroは一つのリストを引数として取り、そして別のリストを返す関数を定義する。この例の中で我々のマクロは、コンパイラがwith-each-natural-numberを見る度に呼ばれる。このマクロ定義では、nとexprをテンプレートに埋め込み、素早くリストを構築するために、LISPのバッククォート構文を利用している。それから変換されたリストは再びコンパイラに渡される。このマクロはRubyにおいては役に立たない。Rubyでは生じない問題の周りで働くマクロだからだ。その次に最も一般的なLISPマクロの使われ方は、何かを定義するためのミニ言語を作ることだ。Railsを使えば、こう書くことができる。trueendここで、belongs_toはクラス関数だ。これが呼ばれたとき、メンバ関数の束をOrderに追加する。実装はかなり汚ないが、インターフェースはよくできている。どれくらいの頻度でミニ言語を作るのに使われるかということだ。Railsに加え、Rake(Makefileを書くのに使われる)、Needle(コンポーネントを接続するために)、OptionParser(コマンドラインオプションをパースするために)、DL(C言語のAPIと会話するために)、そしてその他にも数え切れないほどにある。RubyプログラマはなんでもRubyで書くのだ。簡単にRubyに輸出できないような高度なLISPマクロは沢山ある。ミニ言語を本当にコンパイルするようなマクロはRubyではまだ出てきていない。Davisはこの方向でParseTreeとRubyInlineと、いくつかの有望な仕事をしている。私はそれを理解し次第関連するテクニックについて書くつもりだ。LISPでプログラミングすることに対する典型的な異議は:十分なライブラリが無いLISPプログラマを集められないLISPは過去20年どこか分からない所に行ってしまったこれらは抗し難いほどの異議ではないが、確かに一考に値する。Lispの標準ライブラリは巨大なものだと考えられていた。今日では、それは痛々しいまでに小さい。Javaのマニュアルは壁を埋め尽していて、PerlのCPANアーカイブはあなたが想像し得るいかなるモジュールでも持っている。Lispはネットワークと語る標準的な方法さえ持っていないのだ。同様に、LISPプログラマーは稀少である。あなたがボストンの周辺にいるなら、ほとんど魔法に近い仕事をする灰色のハッカー達の小さなたまり場があるが、他の場所では好奇心をそそられた若いハッカーが薄く散在しているのみだ。LISPは常に少数派の言語として存在してきた。Rubyは急速に人気を得てきている。大きな推進力を与えているのはRailsのようだ。Railsの成長は2004年の暮れから始まった。あなたが会社を立ち上げようとするなら、可能性のある従業員は皆Rails愛好者だと言っても過言ではない。RailsはすぐにありふれたWEBコンサルティングへ浸透していき、いずれは大きなビジネスとなっていくだろう。Rubyもまた、良い標準ライブラリと追加ライブラリの豊富なアーカイブを開発するのに十分な時間を費してきた。APIを呼ぶことを必要としているなら、それらは全て用意されているのだ。強力な言語とポピュラーな言語との間で選択を迫られたとき、強力なものを選ぶことが素晴しい意味を成すことがあるかもしれない。強力さの点で差が小さいのなら、ポピュラーであることはもろもろの点で好ましい利点を持つ。2005年には、私はRubyよりもLISPを選ぶ前に、じっくり考えることにした。最適化されたコード、あるいは完全に独立したコンパイラとして作用するマクロが必要なときのみ、LISPを選ぶように。月別アーカイブはてなブログをはじめよう!masatoiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。