トップ «前の日記(2007-02-20) 最新 次の日記(2007-02-22)» 編集

じじぃの日記、ツッコミ可

Twitter: @jijixi_org
Xbox Live: jijixi

初心者が書いた OCaml 入門
Spotlight tips サイト内リンク集
1970|01|02|
2003|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|11|
2011|05|
2012|01|

2007-02-21 [長年日記]

% [OCaml][Erlang] 変換関数がややこしい

OCaml だと dest_of_src なんだけど、Erlang は src_to_dest なのね。 もうごっちゃになって、間違えまくるったら。 しかも OCaml の場合、場合によっては Array.to_list とかだったりするから手に負えない。

ところで Erlang では / 演算子は浮動小数点演算になる。 整数として割り算したいときは、中置の div を使わないといけない。 むー、ゴルフ向きじゃないな。

% [雑談][OCaml] rec で間違い発見しやすくなるか?

あー、それはあんまり深く考えずにノリで書いてしまった話なので、具体的に間違いを発見しやすくなる実例が思い浮かんでたわけじゃなかったり。 ただ、rec のおかげで凡ミスに気付いたということが何度かあった気がするのは確かなので、コストパフォーマンスはともかく、それなりに意味があるんだろうとは思ってますが。 でも、それは人によるのかも。

ところで『akr さんのハフマン符号がどうこうの精神』ってどんなのか思い出せない (読んだことある気はするんだけど) けど、「よく使うものの記述量は少なく」とかって話かな。 たしかにそういう意味では OCaml は失格だ。 Haskell のラムダ表記とか、たまにうらやましくなるし(苦笑

ただまあ、それって「書く側」の視点で言えばまさしく正義だけど、「読む側」の視点も混じえれば、必ずしも正義とは言えない気も。 Haskell でポイントフリースタイルを多用したコードとか、全く読みやすいとは思えないし。 Ruby が愛されるのって、書きやすいってだけじゃなく「書きやすくて、かつ、読みやすい」っていうのが理由な気がする。

% [あなごる][Erlang] Erlang は予想以上にゴルフ的に厳しい特徴を孕んでいる

昨日も書いたとおり、io:get_line は EOF が来ても勝手に死んでくれないので、勝手に死んでくれる他の言語に比べて厳しい。 io:get_line を囲む case 文を関数の返り値そのものにできる場合は eof の時の値を halt() じゃなく 0 とかにして短縮できるけど、それでも…

case of eof->0;end

これだけで 18B も食う。ただでさえ 34B のハンデがあるのに、さらにこれだと厳しいを通りこしてイジメじゃないのかと(苦笑

あとは OCaml の open みたいにモジュール名を簡単に省略する方法が無いのもツラい。 一応 -import() ディレクティブ (Erlang 的には Module Attributes と呼ぶのが正しいらしいが) ってのがあるけど、これって -export と同様に関数ごとに書かなきゃならない。 はっきり言って、短かくするためには全く無意味。

あとモジュール名の省略に使えそうな要素としてはマクロがあるけど、

-define(L,lists).
... ?L:map(...),?L:seq(...)

こんな感じなので、同じモジュール名をやたらたくさん使ってるとか、モジュール名が異様に長いとか、っていう状況じゃないと役に立たない。 実際、e を計算で求めるバージョンを書いたときには lists モジュールの関数を 5 回使ってるんだけど、5 文字のモジュールを 5 回じゃ元が取れなかった。 ゴルフで使いそうなモジュールで一番長そうな名前なんて、せいぜい string とか regexp とかだと思うけど、それだと 5 回以上使わないと元が取れない。

まあ、そんなこんなで、厳しいっす(苦笑

% [あなごる][Erlang] Expression でタイムアウト

なぜかいまだに OCaml でわしが単独一位の (や、一人だからあたりまえだが) Expression のコードを Erlang に移植して submit してみたんだけど、手元では普通にうまく行くにもかかわらず、どういうわけかタイムアウトで失敗する。うーん、なんでだろ?

submit サーバの調子がおかしいのかとも思ったが、試しに OCaml のコードを投げると普通に通るので、何か Erlang に特有の問題がある模様。 現状のコードは io:get_line の eof チェックをしてないんだけど (どうせ一回こっきりだから)、その前に eof チェック有りで submit したときも同様にタイムアウトだったんで、クラッシュしてるわけではなさそう。 無限ループは無くて、処理速度も問題が無いのにタイムアウトになるということは、io:get_line でブロックしてるくらいしか思い付かないが、だとするとどういうことだ?

うーん、stdin にデータが流れるタイミングの問題かなあ。 io:get_line がデータ待ちに入る前に入力データが流れちゃって因果地平の彼方へ→そこで io:get_line がデータを読みにいく→すでに行っちゃてるんでデータ来ずにブロック→タイムアウト、って感じ? よくわからん。

本日のツッコミ(全3件) [ツッコミを入れる]
% ksk (2007-02-21 18:15)

recは間違いが発見しやすいというよりも,毎回再帰だと思われると困るというのがあるのだと思います.<br>let s=s^"ふが" in<br>let s=s^"ほげ" in<br>とか書いたりしてつないでいったりすることがあったり,関数定義のときでも,<br>http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4/mltext/ocaml.html#htoc36<br>の3.3.3の最後にあるような「常套テクニック」が使えなくなったりして結構不便だと思います.

% jijixi (2007-02-21 18:39)

あー、そうですよね。<br>どの言語だったか忘れましたけど、他の言語でまさにそういうことをやろうとしてハマって、暗黙に再帰すんなーと怒ったことがあったのを思い出しました(苦笑

% m.ukai (2007-02-22 14:32)

Expression は手元で書いてみたんですが時間がかかりすぎて Timeout 食らうだろうと思って投げてません。まだコードも長いし。

お名前:
E-mail:
コメント:

トップ «前の日記(2007-02-20) 最新 次の日記(2007-02-22)» 編集

日記ってのは本来、自分で読み返すためにあるもんだよなあ……
もしくは有名人になったら死後に本になったりとかか?

RSS はこちら

jijixi at azito.com