arton さんネタふりどうもです (^^;;; (ところで「ネタ」って「RHG のネタ」ということですか?) とりあえず参考 URL を再掲。
「引数 n を累積加算する関数を返す関数を書け」かあ。 Shiro さん紹介のページの例によると Ruby の例はこうらしい。
def foo (n) lambda {|i| n += i } end
……endを文の後ろに書くのはやめてほしいと思ったのはぼくだけですか? Lisp が好きなのはわかるけどなぁ、「郷に入れば郷に従え」という 言葉を知らないのかっ。あ、そりゃ知らないか (日本語使えないだろうからね)。
Ruby の Proc を Lisp と同じような意味での「関数」と言って いいのかどうかも考慮の余地がある。呼ぶときに call いるし。
というかそもそもこの問題はそもそも卑怯だよなあ。 Lisp がうまく当てはまる問題を出してるようにしか見えないんだけど。 (そういう反論の反論があるのも見たけど、それでもやっぱりそう思う。) なんで accumulator なのか全然理由が書いてないじゃん。
「 Succinctness is Power (簡潔さこそ力)」のほうも納得できねえ。 特に一番納得できないのは
苦労の合計 = 各行を読む苦労×行数
この等式には全く、全然、少しも、まるで、微塵も、小指の爪の先ほども、 納得できない。証明するにはおれが RHG 書いてる過程を見るだけでいいでしょ。 ある一行は一瞬眺めただけで通りすぎるけど、別の一行は一日かかることもある。 どんな言語で書こうと、どんなにうまく書いても、各行の難しさは絶対に 均一にならないね。
[ruby-talk:48813] RubyConference 2002 のアナウンス。 11/1 から三日間、シアトルでやるらしい。
ぼくは今年はどう見ても無理です。 そのころってちょうど某書の締切だし、なにより金がないです。 なんたっていまの全財産マイナス 6 万円ですから。
誰かシアトルに殴り込みをかける強者はいない?
うわあっ、妙にたくさんツッコミが入ってるっ。
あ、いや、ぼくのほうも半ばギャクですし。 ちなみにぼくはわりと Lisp 好きです。 どうせなら「俺は括弧書きたいんだ! viva 括弧!」 とか 「諸君、我々はもっとたくさんのλを必要としている」 とか言ってくれたら文句ゼロで賛同するんですけどねえ。
しかしです。end をくっつけるのが皮肉だとしても、 あんまり整合性がある皮肉ではないですよ。 だって元の文章だと「ポーランド記法とか括弧は重要ではない、 作られる構造の数が重要なのだ」と言ってるわけじゃないですか。 つまり記法の短さじゃなくて文法構造の短さが問題のはず。 それなのにパーサで落とされる end に八つ当たりするのは変です。 もちろん書いたのはそれぞれ別の人ってのはありますが、 整合性がないことに違いはない。
まじめに考えると、Σでもまずいでしょうねえ。 単発の文をいくらたくさん並べて書いてたところで総和は難しくないですから。 if がやたらとたくさん必要でネストが深くなるとか、 妙なふうに再帰してるとか、 作られるデータ構造が全部ダイナミックでめちゃくちゃ細かいとか、 そういうことになると難しくなるわけです。
つまりあれですよ、トポロジーってあるじゃないですか (よく知らないですけど)。 ああいう感じの、構造を制御する数学を使って解くべきなんじゃないですかね。 最適化のフロー解析みたいなことをして構造を最小まで絞りこんだあと、 制御の線が多いかどうか、線がどのくらい交差するか、ということをしないといけない。
それも、言語の隠してる部分まで考えて計算するべきですね。 違う言語を使ったらプログラムが短くなったと言うなら、 逆に言えばそのプログラム言語はある部分を隠しているとも言えます。 その隠した部分が想像しやすいものであれば、プログラマは動きを想像しやすくなります。 想像しにくいものであれば、想像しにくくなります。つまり難しくなります。
えー、本当はこんなこと書いてる余裕はティッシュペーパーの厚さほども ないわけですが、思いついてしまったので思いつくままにいろいろ言ってみました。 で、もう一個。
なぜぼくがこんなに反発しまくるのだろうかと考えてみたところ、 例の accumulator が例として適切でないのが一番の問題ではないかと 思うのですね。たとえば
class Accumulator def initialize @n = 0 end def add( n ) @n += n end end
と書いたところで、言語のやってることまで考えたら構造的には 大差ないんじゃないでしょうか。でもこちらのほうが (foo なんて無意味な名前はないし) 明らかに意図が明確です。
言語で短くするってことは言語が隠してしまうってことであって、 その部分は自分が想像しなければならなくなる。それがどのくらい 想像しやすいかが、わかりやすさを決めるんじゃないでしょうか。 そして lambda スコープってのはそんなに想像しやすいものでは ないと思います。だからあの accumulator は納得できない。
それに簡潔にするにしたって、普通の処理と同じように、ボトルネックが あるはずです。つまり一番多用する処理から簡潔にすべきです。たとえば それはオブジェクトかもしれない。すると同じメソッドセットを持った オブジェクトがたくさん見付かるので、クラスを作るべきだろう、となる。 今度はクラスも似たようなのがあるんで継承しようってことになる。 単一継承だとまだ共有できないところがある。それでは多重継承とか mix-in を使おうということになる。でもまだ足りない、それじゃあ 今度はデザインパターンで……
詳しくは言えないんですが、実はその他に個人的な事情がありまして、 今年はどうしても金がいるんです。それは RubyConference よりも 遥かに重要なことなので、RC を切りました。来年また開かれるなら 行こうと思ってます。
いや、もちろん常に全部考える必要はないと思いますよ。 でも、それが「中身を考えなくてすむほど簡単/想像しやすい」 ならば考えなくていいっていうことだと思うんです。 んで、lambda 抽象ってそんな想像しやすいもんかな? と。
ん? 「売れる」ってなんでしょ。 RHG のことならそんなにたくさん売れる予定はないっすよ (マテ)。 ちなみに、消費者金融で借りすぎて借金取りに追われている…… というわけでもないです (^^;;;
あ、もしかして就職するってことかなあ。それもないです。 まだまだ Ruby 界一の暇人でありつづけるでしょう。
……嬉しくないよ、ぜんぜん嬉しくないよ……
ブチキレた。 23 年生きてきてこれほど本気でキレたことはないね。 これほど本気で息の根止めてやると思ったことはないね。
今日、食事とってないんですよ。昨日は一食しか食ってないんですよ。 どれだけ夕飯を待ってたかわかります? しかも今日トンカツですよ。 それが金のないおれにとってどれだけ重大な事実かわかります? 人間、食いもんのためならやすやすと人も殺すんですよ。
それが! それが! 食いやがったんだよ! あいつが! 台所に出る奴だよ! 黒くて光る奴だよ! おれがこの世で一番嫌いで名前を呼ぶのも汚らわしい奴だよ!
殺してやる。殺してやる。殺してやる。殺してやる。殺してやる。 あー、この「混ぜるな危険」の洗剤で薬殺してやろうじゃねえか。 こんなもん、うっかり飲めば人間だって死ぬんだぜ? きさまごときが何秒生きてられると思ってんだぁ?! あああああ、コソコソ逃げまわってんじゃねえよ死にくされこの虫ケラがぁぁぁぁっっ!! (文字通り)
つーわけで手段を選ばず瞬殺しました。 でも恨みをはらしてもトンカツはもう返ってこないのです。 残ったのは奴をブチ殺すために荒れてしまった台所だけです。
……あぁ、今日の夕飯どうしたらいいんだろう。
いまごろ米が炊けた。遅いよ……。
く、くるしいたたかいだったが薬殺ののち掃除器への封印に成功。 我が軍はここに完全勝利を収めたのであった、まる。
本気で恐かった。ショック死するかと思った。なんか後ろで カリカリ……カリカリ……って音がするから、なにかと思ってふと見たら、 いたんだよそこにぃぃ! 本棚にへばりついてんのが! 誇張でなく 5cm はありました。しかも一発目の洗剤あてたら飛ぶし。
もう嫌だ。 もう東京は熱帯みたいだから嫌だ、だからあんなのがでるんだ、 北海道はあんなものいないっていうから将来はぜったい北海道に行く、 それも最近は札幌には出るっていうからもっと奥地の寒いところに行く、 北海道在住のお嫁さん募集。
そういえばファミマでも奴にはよく会いました。なぜかファミマで合うと わりと大丈夫なんですね。あまりに数が多すぎて麻痺するのか、 武器が多いからか、あるいは靴をはいてるからかもしれない。 家の中だと踏んだから嫌だから近付けない。でもファミマでは 底の厚い靴をはいてるのでうっかり踏んでも大丈夫です。
というか一度踏みました。レジから呼ばれたからなにかなーと思って 行ってみたらレジに入るところで、「グシャッ」と、実に嫌な感蝕が 伝わってきたんですよ。んで、レジが呼んだのはそれを退治してほしかった からだという……。
ああ。だめだ。寒けがする。恐くて集中できない。 どうしたらいいんだ。 どうしたらいいんだー!
やばいよ……。 なんで LaTeX にしたらいきなり 550 ページになってんだよ! やばい。これは本当にやばい。下手すると出版できなくなる。 どうしよう。今日は本当に最悪だ。
■
kjana [隠している詳細っていうのは見る必要ないんじゃ?
適当な抽象を用意してくれているならそこは抽象の
まま受け止めておくべきで.
そのへん展開していくんだっていうと,チューリン
グマシンとかラムダ計算とかまで落ちませんか?]
■ うおっ [まさかあおきさんまで売れちゃうの?(一人レベル低いツッコミのなひ]
■
たむら [量が多いのは望むところなんですが>RHG。出版的にヤバイんでしたっけ ?
# 私も!!ゴ!!キライ]
■
あおき [ページ数が多すぎると値段が上がるっていうのが一番の問題ですね。
ついでにこないだの打ち合わせで「450ページもいりませんよーはははは」
って言ったばかりだというのもそれはそれでかなりヤヴァいですね。]
■
なかだ [一度、飲み屋で叩きつぶしたことがあります。拳で。
折角ですが、その座は譲れませんな(謎)。]
■ (う) [どんなに分厚くてどんなに高くても買うです。いや、限度はありますが、常識の範囲なら...]
昨日の夜に母親が「焼肉の添えもの」ってことでキャベツをゆでて 置いていったんですよ。でも昨日は夕飯食べるのすっかり忘れてて 食べなかったんですよ。そうしたら当然今日それがあまってるわけじゃ ないですか。そうしたらもったいないと思うじゃないですか誰でも。 しかも肉もそのまま余ってるわけでしょう。添えものがいるでしょう。 そうしたら昨日食べるはずだった焼肉とキャベツを今日の夕飯にするのは ごく当然のことじゃないですか。
なのに……なのに……
なんか変なんです。なんか食べてると納豆ぽいにおいがするんです。 さすがのわたしも動物としての直感により危険を察知しました。 そこでよく観察すると! すると! おかしいです! キャベツが糸ひいてます! これはヤヴァイです!
一言で言うと腐ってました。いやあ、危なかったなあ。
ちなみに肉のほうは焼き直して食べました。 こっちも 15 日が賞味期限でしたが、 まあそのくらいはよくあることです。問題なしです。
RHG の原稿を B5変 9pt で処理したいので 『LaTeX2e 美文書作成入門』に付いてる jsbook.cls が使いたいのだけど、 家のマシンの LaTeX は古いので動かない。 そんなわけで急遽 LaTeX のインストールをすることになった。
まっ、configure 化されてるみたいだし、たいしたことはなかろう。 一気にインストー……
……
……
……
……
……
ぶはっ! な、なんでこんな面倒なんだよっ! うぜえええええええええええええ! ls-R でハマること 20 分。ptex をインストールしたらもう一回 ls-R が復活してて また 20 分。さらに jsbook.cls その他が SJIS なのに気付かなくてもう 10 分。 ちくしょう、スクラッチから二回もインストールしちまったじゃねえか。この クソ忙しいときに……。
だいたいなんなんですか? あれを展開しろー、これを展開しろー、と散々展 開させてパッチあててコンパイルしてそのあと大量のファイルの手動コピーが 入り、挙句は「ソースコードが一年以上たってるからアップデートしろ」と エラー出して make が止まる (キレてチェック文ごと抹殺)。勘弁してよ……
と文句をたれるだけでは情報がないと気付いたわたしは無理矢理情報を 追加することにしたのであった。ls-R を無効にする方法でも書いてみよう。 たしか高林さんの文書がネタ元だったような気がするのだが……
以上。web2c/texmf.cnf ってのが tex のメインコンフィグファイル みたいね。ptex をインストールするときは tetex のインストールと ptex のインストールの二段階に分かれてるんだけども、ptex の インストールまで全部終えてからこの作業をしないとまずいことになる模様。 模様、というかようするにそれでハマった。はあ……
tetex と ptex の区別、とかいうあたりもどうもイマイチ わかんないんだよなあ。web2c と tetex の違いとかも。
■
かねみつ [『LaTeX2e 美文書作成入門』に付いてる jsbook.cls かぁ。
Windows版のLaTeXでも動くかな? ま、それはいいとして、.tex文書ができたら、メイルくれ〜]
やっと二十章『スレッド』まで終わって一安心。 あとは allocation framework のとこを直して、 GC の章のスタックフレームの話をてきとーにデッチあげて (をい)、 図書いて (最終的に 134 枚になった)、 プリプロセスかけてアップデートして (これは自動でできる)、 CD-ROM のマスタをあげればおしまいです。
あと 108 時間でね☆
俺、死ぬかもしれません。みなさんあとのことはよろしく。
突如としてありとあらゆる端末にゴミが残るようになってしまった。 Emacs にまで現れている。前から下線が残ったりしてどことなくおかしかったが、 ついにここまで……。
ncurses がおかしいのかなあ。 でもいま入れ換えて変なことになったらシャレになんないしな。
■
かねみつ [し、死なないでくれ〜
図、134枚は、俺の(「Smalltalk入門」のときの)150枚にせまる、すごい記録だっ!!!
あと108時間……2日強か。。。 なんとかなるか?]
■
kjana [その一日が 50 時間ぐらいありそうな見積りはなんだと
つっこまずにはいられない....]
■ さかい [そういえば、知り合いに48時間を「一日」として生活してたのがいたなぁ……]
■ たむら [あおきさんくらいになると自分自身の時間の流れを調節して生活出来るに違いない。(意訳:最後の追い込みですな。)]
■ たけうち [死なないでください(^^; RHGとっても楽しみにしています。]
■
きた [私もRHG,とても楽しみにしています.
死なない程度に頑張ってください!]
うう、ありがとうございます。 あと四日、いい本をお届けできるようがんばります。
ずっと前に登録して忘れていた RC5-64 ML からメールが来た。 どうやら RC5-64 が終わったらしい。
RC5-64 つーのはあれっすね。 RSA の 64ビット鍵を力まかせ検索で解こうというやつ。 1757 日で解き終わったとのこと。
ヨード卵「光」が六個あるんですが賞味期限 9 月 17 日となってます。 もう一つ、冷蔵庫のトビラに置いてあるのですが、これは先月から 置いてあるような気がします。
さすがに生は恐いのでトビラのはゆでたまごに。 「光」は味噌汁にぶちこんで食べました。一時間ほどたちますが 体に異変は現れていないので大丈夫そうです。
ちょっとわけあって RHG の文章全体で使われる文字 (アスキー文字のみ) の 出現頻度を調べた。まあ部品は揃ってるから簡単だろうなーとは思ったけど、 まさか三分でできるとは思いませんでしたよ?
つーわけで頻度。
^: 0 `: 6 Z: 12 ~: 18 ?: 19 ;: 21 Q: 22 !: 24 |: 24 z: 26 \: 29 7: 29 ]: 33 @: 34 [: 39 5: 43 9: 43 8: 44 }: 44 <: 44 q: 47 ,: 47 &: 50 6: 51 {: 54 4: 55 J: 66 #: 66 %: 68 ": 83 Y: 89 :: 93 3: 97 =: 101 >: 104 W: 121 K: 127 +: 130 $: 132 H: 135 /: 166 2: 176 X: 183 V: 195 ': 198 j: 200 -: 213 w: 225 1: 232 B: 260 0: 286 F: 287 *: 304 M: 333 U: 339 G: 364 k: 371 .: 411 x: 446 T: 487 I: 497 P: 538 h: 558 D: 563 S: 599 L: 606 v: 609 g: 617 N: 648 O: 705 f: 727 A: 785 m: 876 C: 900 p: 992 ): 1106 (: 1108 : 1109 R: 1138 E: 1165 d: 1265 y: 1461 o: 1704 i: 1759 u: 1838 n: 1849 b: 1962 c: 2092 s: 2344 l: 2475 t: 2552 a: 2860 _: 2925 r: 3362 e: 3864
普通の英文で多いのは確か est だからだいたい常識的だ。 r が多いのは明らかに rb のせいだね。アンダースコアより多いとは……。
いやね、これを何に使うかと言いますと、//tt あるじゃないですか、//tt。 LaTeX だと \texttt{...}。よーするにテレタイプ文字の指定っす。 これから //tt を入れようとしてるんですが、// を使うとブロックレベルの 命令と混じってなにかと不便。かと言って今使ってる @<footnote>{...} で //tt をかけるのはさらに面倒。数がたくさんあるのはわかりきってるし、 それならいっそのこと一文字で指定できると便利でしょ。とすれば、 できるだけ出現頻度の低い文字を使うほうがエスケープが減るじゃないですか。
んで、結果としては ^ がよさそうだ。
しかし、~ は 18 個も使ってるんだなあ。何に使ったんだっけ? ……なるほど。ホームディレクトリと $~ のせいであった。
じゃあ ? は文字リテラルと $? だろうか。 違った。メソッド名の name? と条件演算子 (a?b:c) だった。 条件演算子はパーサのとこでさんざん使ったからな。
; はなんだろう。これは意外に使ってないと思うんだが。 ……全部「条件付きスキャナ」の章じゃねえかよ! EXPR_BEG 恐るべし。
つーかそんなことより、早くマークアップ、やれ。
ソースコードの pretty print はできるだろうか。
いや、できるかできないか、なら「できる」に決まってるんだが、 あと四日でできるかとなるとかなり怪しい。 文章書いて図書いて、まだ時間があまってたらやることにしよう。
でも C のプログラムを pretty print するのは邪道かねえ。 だいたい struct FRAME の struct だけ bold になっても 嬉しくないかもしれぬ。
Copyright (c) 2002-2007 青木峰郎 / Minero Aoki. All rights reserved.
■ たむら [工数計算みたいで大嫌い>各行を読む苦労×行数
「各行の難しさは絶対に 均一にならない」プログラム言語だけに関わらずですよね。(行で言うなら)それぞれに違った役割があるわけだし。]
■ matz [シアトルでも原稿は書けるし、お金はなんとでもできると思うよ。
実際去年はフロリダでRuby in a Nutshellのゲラ直してました。]
■ Shiro [まあ、flameを始めるつもりはないんですが、ちょっと誤解が
あるかなと思ったので。
- 例のページのrubyのコードを書いたのはPaul GrahamではなくてStephan Schmidtという方なんですが(ページの下方に書いてあります)、彼はLisperなのかな。RAAにプロジェクト登録しているみたいだけど。
- 例の式は半分ジョークで、冗長な言語の見掛けの易しさを皮肉っているだけだと思いますよ。だいいち「行」という単位にあまり意味が無いことは同文章中に書いてあるし。]
■ さく ["郷に入っては郷に従え" は、ラテン語で "cum fueris Romae, Romano vivito more, cum fueris alibi, vivito sicut ibi." (ローマにいるときはローマ人のように暮らせ、他の土地ではそこに住む人のやり方で暮らせ)、前半を英訳して "When in Rome, do as the Romans do." というのもあります。]
■ さく [単なるかけ算ではなく、Σで苦労の総和を求めていたら納得しますか?(笑)]
■ たむら [リンク先を読んでみると「各行を読む苦労×行数」は、Basic言語に対してと読めますね。(読んでからツッコメよ)だったら、少し納得。
「苦労の総和」というのは、やはり行数とは比例しないと思われ(するかな?)]
■ kjana [抽象度の高い記述の方が抽象度の低い記述の羅列よりも
意味をとりやすいという話はあるんじゃないかと.プロ
グラムの意味を考える時に逐一低レベルな操作を並べる
より,問題を記述した方がわかりやすいように.
そういう意味でプログラムの読みにくさは行数に比例し
ないどころか各行の読みにくさの総和ですらなく,もっ
と指数関数的だか幾何級数的だか,ずっとオーダーが大
きいのではないかっていう気がする.
# なんか同意にも反論にもなってない変なことを書いて
# いる気もする :-P]