著作一覧 |
オーム社さんからもらっちゃった。
ちょうどAbout Face 3の、パターンのこまごましたとこ以外は読了したので、読み始める。
まず、苦言というかなんというか。
どうして、こうもまたLisperってのは押しつけがましいのだろうか?
もしかしたら、それは、翻訳する人の愛情がまったくビジネス的な政治的正しさを無視しているからかも知れないけど、他の翻訳書とはちょっと違う。野田さんが訳されたポールグレアムのにもそういう印象を受けるけど。というかLLのときにも感じたり、GNのときにも感じたりしたのだが。
おそらくそれは、本書いわくの
「プログラム可能なプログラミング言語」という禅問答にも似た記述がCommon Lispでの座右の銘に近い。
が理由なのかも。
プログラミング言語を利用しているときの全能感が異なるレベル(メタなところに)あるからかも知れない。
おかげで、普通の感覚とはずれがあったりするわけだ。あるいはあえて無視して言ってるだけなのかも知れないけど。
複合的な名前をハイフンを使って組み立てるのはLispの標準的なスタイルで、hello_worldのようにアンダースコアを使うとか、helloWorldのように大文字小文字を組み合わせるよりも、hello-worldのようにハイフンで区切られた名前を使う(こっちのほうが英語の書法にも近い)。
とか書いているけど、それは引き算を(- 8 4)とか、書くからじゃん。8-4と書けるようにする代償が、hello-worldが減算として読み込まれるということで、どっちが英語の書法にも近いのかとか。
なんかメタプログラミングのし過ぎで、アトムを眺めるときは地に足がついているけど、S式を眺めるときは、すでに宇宙飛行士的飛翔をしているために、全然気にならないんじゃないか? でもフツーのプログラマはコードを地に足をつけて書いていたりするわけでね。
もっとも、このあたりは重力がたいして無いから(歴史の問題としてたかだか100年にも満たない)、わりとすぐに体は浮いてくるわけだが、成層圏を突破するのはなかなか難しいかもね。いずれにしろ、地上への錘となる言語はあまりうれしくはないということは認めるけど。酸素ボンベ抜きに適当にふわふわしているくらいがちょうど良いという気はする。
この本の特徴で良いところは、想定する実行環境が、Lisp in BoxというEmacsをエディタとしたパッケージ(らしい。実際のところ、スルーしたけど)なので、Emacsの編集についても少しばかり書いてあったりすることだ。つまり、Emacsのごくごく基本的な操作は覚えることができる(もちろん、elispの本ではないので、elispをどうこうするわけではない)。LispとEmacs(の基本操作と、バッファのような基本的な概念)を覚えられるというわけで、確かに名前のとおり、いきなり実践的だ。というか実用的だ。
おもしろかったのは、13ページで、Hello Worldを書かせるのだが、そこに、うんちくが出ていて、世界最初のHello WorldはCではないことが示されている(脚注にだが)。
class FooBar : IEnumerable<Bar> { IEnumerator<Bar> GetEnumerator() { yield return bar++; // とか、何か実装してある } }
コンパイルエラーになる。
いろいろ試すと、IEnumerable.GetEnumeratorとIEnumerable<Bar>.GetEnumeratorのどちらかでエラーになる。
いやな予感を覚えながら、次のようにしてみる。
class FooBar : IEnumerable<Bar> { public IEnumerator<Bar> GetEnumerator() { yield return bar++; // とか、何か実装してある } /*private*/ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } }
privateを付けたかどうかはちょっと忘れた(付けられない)。publicにしたくないなぁと思って何かした記憶はあるが、コンパイルに通った時点であっさり忘れてしまったのであった。
で、ズ・バ・リ(フータ君の化石をどーんと鑑定してみよう!のマネ)、これいやなんだけど。何、この最後の冗長なGetEnumerator() ?
というわけで、なんか見落として上手なIEnumerable<T>の実装方法をわかっていないだけのような気がしてならない。
と、教えてグーでした。答えてパー、直してチョキでした。とふざけた書き方をしているけれど、知りたいのは本当。
ジェズイットを見習え |
こう書くより他にないんじゃないですかねえ。IEnumerable<T>がIEnumerableから派生しているから、実装する時に両方のGetEnumerator()を実装しないといけなくて、名前も引数も同じだから一方はインターフェースの明示的な実装にしないといけないワケです。<br>IEnumerable<T>がIEnumerableから派生しているのがイケてないと言ってしまえばそれまでですが(IEnumerableを扱う言語処理系がややこしくなる)。IEnumerable<T>を直接実装する機会は.NET 1.xの頃よりは減っている気はします。<br><br>.NET 3.5になると、extension methodを使ってAsEnumerable()とか作ってしまうというやっつけ方もあるかもしれませんね。つまり自分ではIEnumerable<T>の実装は書かない、と。
どうもありがとうございます。拡張メソッドってそうも使えるものなんですか。<br>やっぱりしょうがないのかなぁ。<br>それでメソッド名による解決なのか。
> privateを付けたかどうかはちょっと忘れた。publicにしたくないなぁと思って何かした記憶はあるが、コンパイルに通った時点であっさり忘れてしまったのであった。<br><br>インターフェイスの明示的な実装は強制 public になるので、何もつけない (つけられない) のが正解です。
おお、どうも。C#だからそのあたりは何かよろしくしてくれるかと期待したけど(プロジェクト内のソースの見せ方と、キャストしたときの解決とか)、普通でしたか。
ECMA 334の20.4.1に明記してありますが、インターフェースの明示的実装は、正確に言えば「ある意味」publicであり、「ある意味」privateです。ILレベルではむしろprivateスコープだったかと思います。