>
>本の妖精トモトモのお勧め
>
にしたがい読んでみたら、予想通りというより予想以上のアレっぷりが楽しめました。
>
>ちなみにチョコレート工場の秘密は小学生のときに読みましたが、あれもすばらしいですね。関連はぜんぜんないですけど。
>
>ふと、 OCaml でオブジェクトのパターンマッチができないか、ということが気になる。
>
>ちょっと試してみようとして、
>
>class c1 = object method m1 = 1 end
class c2 = object method m2 = 1. end
let f = function
| #c1 as o -> o#m1
| #c2 as o -> int_of_float o#m2
>
>のようなコードを書いてみたが、パターンマッチにおける # は多相バリアントの省略形で、クラスパスじゃなかった。
>
>型の指定はどうか?ということで、
>
>let f = function
| (o : #c1) -> o#m1
| (o : #c2) -> int_of_float o#m2
>
>としてみたが、これは引数が直積型になるだけで、無条件に c1 にマッチしちゃうからまったく意味がない。
>
>つうかそもそも「メソッドとして m1 または m2 を持つオブジェクト型」という型の表現がないので無理なんですが。 GCaml ならできるのかなあ。
>
>うわ、これは面白いわ。『よくわかる現代魔法』はイマイチだったし、S-Fマガジンに掲載されてたのもダメだったけど、これは面白いです。
>
>新兵の主人公が戦場に出て死ぬ。ところがいつのまにか記憶が少し前に戻されている……?というところから「ゲームを繰り返しプレイして最も上手い動き方を学ぶ」ということを題材に扱った時間SF。次の自分はもう少し上手く動くことができる、というか。
>
>面白いのは、誰がどんな「ゲーム」をしているのか、というところになるか。
>
>細かいことを言えば、最後の展開は性急な気がしたし、なんというか「それなら一人いようが二人いようが同じじゃね?」と思うわけですが、非常によく書けています。
>
>ふむ、いろいろ書けるってのは器用だということだし、それぞれそれなりに(作者としての)テーマを持って書いてるみたいだし、面白いのかも桜坂洋。『よくわかる〜』を読む気はないのですが、だからといって全てがダメというわけではないようす。
>
>ふむ、確かに「言い分」であってそれ以上のものではない、と思った。
>
>それは端的に言えば、長山さんの描く「人間嫌い」像が、割と一方的に理想化されていることであり、あるいは何が人間嫌いで何が人間嫌いでないか、人間嫌い的なものとは何か、ということがいまひとつ伝わらないことであり、人間嫌いの何が良いか、という視点がけっこう恣意的なものだからである。
>
>基本的には、明治の偉人たちの人間嫌いブリを描写することで人間嫌いの良いところを描写するという試みと読めるのだが、ついつい筆が滑ったようないらぬことまで書いてしまって、果たして何が人間嫌いなのかわからなくなるという。
>
>……というのはしかし、人間嫌いでない人間の視点だ。
>
>一定の層いると確信しているが、これを読んで「ああ自分は人間嫌いなのだな」と自覚する人がいるはずだ。僕もそうだった。そのような読者にとっては共感を与える本となっている。ここが、本書のタイトルが「人間嫌いは「買い」である」ではなくて「言い分」であるポイントだ(いやあの本に含むところはないよ、未読だし)。
>
>人間嫌いというのは実は有意義である、こんな美点もある、という話も、共感を引出すための文章であると考えれば、よくわかるし、実は人間嫌いとしては共感を持って読めてしまうわけである。そういう本としてこの本は実に面白いし、機能している。だからこの本の目的とは、人間嫌いという人種がこんなに良いという話ではなく、潜在的な人間嫌いに対して「あッ、オレは人間嫌いであったのか」と自覚を持たせるということであろうという気がする。その背景には、長山氏は若年層に潜在的な「人間嫌い」が多数おり、そのことで苦しんでいるのではないかという直感があるように思う。それが正しいのかどうかは知らない。
>
>人間嫌いである、または、人間嫌いかもしれない、と思う人には一読をおすすめする。そうでない人には無駄な時間を過ごすだけだろう。
>
>今日の昼ころに大手町のWIDEのマシン(の一部?)が止まっていたらしい。ネットワーク的に死んでしまったのだが、自分の諸々がいかにインターネットに影響を受けていたかがわかる。管理者は大変だったろうなあ。ウチの大学だけじゃなくて、けっこう広範な影響を与えたんじゃないかという気がするし。
>
>にしてもやっぱ、大手町アタックって本当にやったらけっこうヤヴァイことになりそうですね。たかだかサーバが止まったくらいでコレだし。
>
>面白いんだけど、基本的に福井晴敏という男は話が長いと思った。
>
>米軍のアイツの過去の話とか、書く意味あるのか? いや意味はあるだろうし作者が意味を見出しているのだからとやかく反論する資格は読者にはないのだが、なんというかこの、少年マンガ的に言うと「縁が黒いページ」が多い気がする。そのため、内容的にもそうだが物理的にも厚みが増していたように思った。もう少し、「読者に悟らせる」ことによる省略をしてもよかったように思う。
>
>それから終章が無駄に長い。なるほど、著者の意図を汲み取ればこの終章はあった方がいい。しかしながら、太平洋戦争の描写でこの思いを読者に与えるのが正しいやり方なのではないか。敢えて何が、というところは未読の人のためにぼかすけれども、「肯定的に捉える」というところまでは、本編ではついに書けなかった。だから終章がここまで長い。ように読めてしまう。
>
>つうわけで、エンターテイメント大作としてよく書けていて面白いけど、そういう細かいところがいろいろ疑問。つまりは読者をあまり信用していないような気がするってことかもしれない。しかし、読者の読解力を信用しないということと、ちゃんと説明できる丁寧さや細やかさは表裏一体であり、福井晴敏のエンターテイメントとはそのようなものである、ということでつまりは「確かに面白いのだがハマれない」という相性問題に帰着できる事柄なのかもしれない。
>
>ちなみに映画は未見。
>
>あー Map 使うのか。そういえばそんなものもあったなぁ。成程。
>
>以下、思うこと。
>
>
>「デフォルト値あり」という処理がどっちみち汚い
>
>
>
>string は string であって char array でも char list でもないってのはどうにかならんのかなぁ
>
>
>
>
>デフォルト値ありでツッコむのは、それ用の関数を用意するのが綺麗か。
>
>let update tbl key def func =
if mem tbl key then
replace tbl key (func(find tbl key))
else
add tbl key def
>
>string を変換して char list に仕立て、 combine (zipと同じ)を利用する方法もあるが、たぶん激しく遅くなる。といっても、おそらく for が最速なのは変わらなくて、他にどんな方法を使っても遅いことに変わりはない。ならアルゴリズムの見通しを良くするために list でもいいか、という話はある。
>
>どっちかというと、むしろ String.iter を定義しておいて、
>
>let bigram s =
let c = ref '\000' in
let h = Hashtbl.create (String.length s) in
String.iter (fun c' -> if !c != '\000' then update h (!c, c') 1 ((+) 1); c := c') s
>
>のように参照を使うのが OCaml 式かも。 String.iter じたいは for で実装しようが何しようが感知しないわけで。
>
>ただもちろん、↑のコードでは文字列の中にヌル文字が含まれるようなものはうまく行かないので問題。本当は option を使うんだろうけれど、 option はこういう場合には面倒なので略した。 Haskell みたいに Maybe がモナドだと楽なんだろうけれどね。いちおう昨日紹介した ExtLib の
>Option
> モジュールがあれば、もうちと綺麗に書けるか。
>
>例の Google のアレとは違うもん?
>
>こういうイベントは興味深くはあるし、カネも欲しいし(笑)。大学院生だから要項は満たしてるよなぁ。面白そうなんだけど、でもきっと時間がない気がして悩み中。いいかげん研究してないし……。
>
>応募テーマが「○○しなさい」と命令調で整えられている点が、少し気になっており、なんとなく「○○する」という調子の方がそれっぽい気がした。どうでもいいことなんだけど。
>
>挙げられた応募テーマの中で面白そうなのは gonzui のサポート言語の充実と、 mod_estraier かな。けっきょく、自分の使う範囲でないと興味が湧かないということだろう。でも Ruby はあんまし使ってないし、 apache のモジュールなんてコード読んだこともねぇですよ。
>
>これは話を振られたのかな?(笑)
>
>OCaml の場合に、関数的に書くのに拘りがなければ、次のように書くのがたぶん一番速い。
>
>(* bigram : string -> (char * char, int) Hashtbl.t *)
let bigram s =
let h = Hashtbl.create (String.length s) in
for i = 0 to String.length s - 2 do
let c = s.[i], s[i+1] in
if Hashtbl.mem h c then
Hashtbl.replace h c (Hashtbl.find h c + 1)
else
Hashtbl.add h c 1
done;
h
let _ =
let h = bigram Sys.argv.(0) in
Hashtbl.iter (fun (c1, c2) v -> Printf.printf "(%c, %c)\t%d\n" c1 c2 v) h
>
>「for って……」というのは禁句(笑)。関数的に書くとしても、↑の繰返しを末尾再帰で書くくらいかなという気が。綺麗じゃないなあ。これは、文字列型がリストでも配列でもない独自の型であり、相互に変換する関数が(実は)用意されていない、ということにある気がします。や、作るのは簡単ですし
>ExtLib
> とかを使えば標準で備わっているんですが。
>
>でまぁ他には、というと、うーん、個人的には fold が好きなので、 fold を使うかなぁ。
>
>open ExtString
let bigram s =
let h = Hashtbl.create (String.length s) in
snd
(String.fold_left
(function
| (Some c1, h) c2 ->
if Hashtbl.mem h (c1, c2) then
Hashtbl.replace h (c1, c2) (Hashtbl.find h (c1, c2) + 1)
else
Hashtbl.add h (c1, c2) 1;
(Some c2, h)
| (None, h) c2 -> (Some c2, h))
s)
>
>うーん無理矢理。これは「普通」ではないです。たぶん。でもって String.fold 系も標準じゃないから ExtLib を入れないと無理。
>
>結論的には、 OCaml では「関数的に書くと遅い上に書きづらい」という悩みがあったりする悪寒。ストリームパーサが使えそうで微妙に使えないあたりも腹立たしい。
>
>拙作の LazyList を使えばもう少しマシになるでしょうが「リストから数を数えながらハッシュを構成」する部分はこれ以上の書きようはないので仕方ないところですね。 ((x ->
>
>すまん、傍観者っぽいつもりで irc.freenode.net の #scim のチャンネルにつないでみたけど全然英語が書けなくてすまん。やっぱりメールで書くのとチャットは違うよね。日本語だとほとんど意識しないけど……。とほほ。
>