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

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

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-19 [長年日記]

% [OCaml] printf and positional specifier

当時は大して気にも留めてなかったんだけど、あなごるのせいでちょっと思い出したんでアーカイブから発掘。 要するに、Printf のマニュアルには、

The optional positional specifier consists of an integer followed by a $; the integer indicates which argument to use, the first argument being denoted by 1.

とか書いてあって、

# open Printf;;
# printf "%2$d %1$s" "abc" 2;;

とか書けそうな気がするんだけど、

Bad conversion %$, at char number 0 in format string ``%2$d %1$s''

って怒られる。どしたらいいの? という話。 結局何も解決策が無いままフェードアウトしちゃったんだけど、これが例えば、

printf "%1$s %1$s %1$s" "hoge"

とか書けて、

hoge hoge hoge

って表示されるみたいな感じだと、あなごるで役に立ちそうだよなー……とか思ったのであった。 まあ、実際は使い方わからんのだから、絵に書いた餅なんだけど。 もしかして知ってる人いませんか?

% [あなごる][Erlang] とりあえずコード書く前に…

使えそうな武器を物色するべくリファレンスを眺めてるところ。 ちょっとしたものなら書ける程度には知識があるつもりだけど、それだけじゃゴルフには足りないしね。 とりあえず眺めておく必要がありそうなところをメモ。

こんな感じか。 あと、場合によっては、

この辺りも。 それと sets, dict と同じインターフェイスで ordsets, orddict というのもある。

他には単品物で os:cmd/1 とか (インチキ用にはイマイチ向かないけど)。 あと string:strip(Str,both,$\n) の代わりに lib:nonl(Str) とか。

% [あなごる][Erlang] とりあえず頭使わないところは埋めとこう、とか思ったんだけど…

e で、↓こんなコードが、

-module(e).
-export([m/0]).
m()->io:fwrite("27182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274").

exec is denied! って言われて通らん(死

何が起こってるんだ? と思って io モジュールとか、そっから参照されるその他のソースを見てみたけど、いまいちハッキリ原因は掴めない。 ただ、斜め読みした感じだと、io モジュール用のサーバプロセスにメッセージを送ってるみたいで、そのサーバプロセスは最終的に erlang:open_port で外部ポートを開いているっぽい。

open_port 関数は VM 組み込みらしくて、さすがにそこまで追いかける気にならなかったんだけど、リファレンスの説明を読む限り、外部コマンドを呼ぶものらしいので、どうやら exec 系のことをやってる予感。 っていうか vfork とか fork とか使ってるとか書いてあるのかな。

ってことは…… exec is denied な問題は Erlang で解くの不可能ってことでつか。 そ〜れ〜は〜死〜ね〜る〜...orz

えーと、もしできるなら、Erlang だけは exec is denied 縛りは無効に…とかしてもらえると嬉しいんですががが。 どうせインチキしても 34B のハンデがあるんで、少なくとも他の言語に対する脅威にはあまりならないんじゃないかと。 open_port は、やたら使うのめんどくさそうだし、os:cmd で echo とか使っても速攻で戻ってくるから意味無いし。

% [Erlang] IO 処理は外部におまかせ…に、なっている理由

たぶん、言語として副作用を排除するためなんだろうな。 つまるところ Haskell のモナドみたいなもんで。

io:format の説明を読めばわかるけど、この関数が返すのは ok っていう atom だけなんだよね。 どっかわかんないところに出力のためのリクエスト投げて、あとは知らんというスタイル。 Haskell で IO() が返ってくるようなもん。 まあ、実際にはリクエスト投げたあと、しばらく終了ステータスが返ってくるのを待ってるみたいだから、Haskell ほど知らんぷりではないみたいだけど。

というわけで、Erlang は OCaml に比べると随分と純粋に近い関数型言語なんだけど、プロセス毎に辞書を持っていて、それを使えば大域変数のようなものも可能なんで厳密に参照透明性が保証されてるわけではない。 ただ、プロセス辞書に別のプロセスが直接変更を加えたりはできないので (何にせよ他のプロセスに作用を及ぼすには、メッセージを投げて、あとは投げた先のプロセスが自分でなんとかしてくれるのを期待するしかない)、排他制御なんかが必要になることは無い。

そういえば、用意されてるデータ構造の中に、queue はあるのに stack が無いのは何でだ? と思ったことがあったけど、Erlang のデータ構造は全て関数的に作られてるので (要は更新する関数は、中身を直接いじるんじゃなくて、更新した結果の新しい構造を返す)、そういう形で stack を表現するなら結局 list で間に合っちゃうということなんだろう。

% [雑談] ところで Rimo は…

4ch がお薦めだよね。

% [あなごる][OCaml] 通常時は好きな言語ベスト 3 に入る OCaml だが

ゴルフ中だけはクソッタレと思うことも多いよね(笑

他の言語ならフリップフロップなんて n^1 で良いのに、なんだよ n lxor 1 って長すぎ。 かと言って even とか odd みたいな関数があるわけでもなく。 交互にどうのこうのって問題で、みんなはどうしてるんだろ。 やっぱ m.ukai さんの、

n/2*2=n

が一番短かいんだろうか。

本日のツッコミ(全10件) [ツッコミを入れる]
% ma (2007-02-19 21:21)

1-nじゃだめなんですか?

% jijixi (2007-02-19 21:25)

すんません、自分のアタマの悪さに完敗です...orz

% ma (2007-02-19 21:39)

あぅ…楽しみを奪っちゃってすいませんでした。<br>Schemeで参加してるものです(さびしい)。<br>関数型言語なら他にも手がありますよ…きっと。

% jijixi (2007-02-19 21:45)

いやいや、このままだときっとずっと気付かなかった気がするんで、助かりました(苦笑<br>全然他の人たちに追い付けないんで、精進します。

% shinh (2007-02-20 00:15)

ご報告ありがとうございますー。なんか軽く見てみたところ、 Erlang は execve 13 回とか呼んでやがりまして (ちなみに Common LISP が 3回でその他は全て 2回) 、つまり execve が呼ばれるのは前提の言語なのねーと理解しました。というわけで制限外しておきましたのでご確認下さいませ。ちなみに、ひょっとして Erlang って C で言うところの system みたいなのって無かったりしますか?<br><br>あと 1-x とかは BASIC とかでプログラム書いてた時に、当時 XOR とか知らなかったので、そういうのでやるのが大好きでなつかしいなぁと思い出しました。 Player1 と Player2 の交代を p=3-p とかでやるっていう。

% jijixi (2007-02-20 14:26)

どうもです。e で例のコードが Success になるのを確認しました。<br>system に関しては件の open_port を使えばできるのかも知れないですけど、確認はしてないです。<br>os:cmd は終了ステータスじゃなく呼び出したコマンドの出力を返すものなので、system というより Ruby の `` ですね。<br>ちなみに os:cmd("echo") とか呼んでも、速攻で "&#165;n" が帰ってくるだけでした(苦笑

% jijixi (2007-02-20 14:34)

ぐ、OmniWeb からツッコミしたら \n が化けた。<br>これだから WebKit アプリは……

% shinh (2007-02-21 01:58)

ふむふむ。となると Erlang はユーザ側で自制してちょ、って感じの方針しか無い気がしますねぇ…今度少し調べてみます。情報ありがとうございます。

% m.ukai (2007-02-23 21:35)

Printf の $ による引数並べ替えは魔法使えばとおせるようです。<br><br># Obj.magic Printf.printf "%2$d %1$s\n" "abc" 2;;<br>2 abc<br>- : 'a = <poly><br>#<br><br><br>ソースのコメントに、型チェックの問題があるからサポートしないとか書いてありました。(ならマニュアルに載せるなよ、という気はしますがー)<br><br>swap lines で使えるかと思ったけど Obj.magic 自体の長さに負けました。

% jijixi (2007-02-23 21:42)

それは何ともがっかりな結果ですな(苦笑

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

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

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

RSS はこちら

jijixi at azito.com