海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
http://blogs.yahoo.co.jp/hyuki0000/9372319.html
なるほどー。
たしかに、「レトリカル・クエスチョン」ばかりの人もいれば、 意図的に避けていると思われる人もいる。
意図的に避けるためにも、「レトリカル・クエスチョン」というラベルを貼って認識するのは いいことかもしれないですね。
「あの人は『レトリカル・クエスチョン』ばかりの人だ」とレッテルを貼るのは、 よくなさげ。
あー、そうだ。この、「レトリカル・クエスチョン」を使わないようにするには、 ある種の訓練が必要だと思う。 で、訓練してでも使わないで済ませられるようになる価値があるとも思う。
だけど、晴れて「レトリカル・クエスチョン」をまったく使わない境地に達すると、 「人の気持ちがわからないやつ」(←「善人」の常套句)にされちゃいがち……っぽいよね。
http://www.aoky.net/articles/danah_boyd/5_secrets_to_su.htm
読んでみて。ぼくは、5つめと、それに続く段落ですこし驚いた。 (それまでは、比較的普通の文章だった。ぼくにとって。)
Modern Compiler Implementation in ML の輪講初回。とにかくすぐに始めるのだと、Preface と Introduction を済ませてしまうの回。
時間切れ気味に挑んだので資料はなんか中途半端です。 ここにアップするのは多少手直ししてから……とか思ったのですが、 それはやめて、えいっとそのまま。
輪講では、これらの他に shiro さんの「なんでも再帰」 を印刷したものを配りました。
上記のプログラムは練習問題となった関数のみを含んでいますが、 データ構造定義、構文木 が別に与えられています。
maxargs は、プログラムに含まれる print 文の引数の個数のうち最大のものを答えるというもの。 実行結果は:
- maxargs(prog); val it = 2 : int
interp は、プログラムを翻訳せよというもの。実行すると次のようになりました。
- interp(prog); 8 7 80 val it = [IntegerRecord ("b",80),IntegerRecord ("a",8)] : ?.record list
型推論がらみのエラーになやまされて、なんか IntegerRecord なんて定義していますが、 これはふつーにタプルでいいはずなんだよなぁ。
SML/NJ でプログラムを書くのは、今回がはじめてで、 特に interp の方は、なかなかコンパイル通らなくて苦労しました。 (実は、そのせいで輪講時点では PrintStm の処理ができていませんでした。)
print の引数に整数を与えようとしたせいで、 全然関係ないところで型推論関連とおもわれるエラーが出たりするんですね。なるほど。
ところで、ぼくの書いたプログラムは、まったく SML っぽくない(たぶん)。 あなーきー・おーきゃむらの m.ukai さんのコード と全く似ていません……。
資料のなかで、作用素がうんちゃらかんちゃら書きましたが、 そのあとみた m.ukai さんのコードには、もっと変なのがあったぞ。
f(a, b)
は、作用素 f がタプル (a, b) に作用するというように読めるわけですが、 これを
f a b
と書いてもいいらしい。うへー。
f は、たとえば int * int に作用する作用素なんですが、それを一個の整数 a に作用させると、 f a は int に作用する作用素になると。 (追記:うそだったみたい。コメント欄参照)
ひょー。そういえばカリー化とか聞いたことだけあるー。
今回はここまで。
タプルの場合は<br> val f = fn : int * int -> rettype<br>後者は<br> val f = fn : int -> int -> rettype<br>で別物だお。
あらー、そうでしたか。<br>(同一の関数に対して)どっちの書き方も可能なのかと勝手におもってました。