Hatena::Grouperlang

檜山正幸のErlang未確認情報 RSSフィード

2009-04-15 (水)

Erlang modeのインデント

| 09:11

foo() ->
  Q = $",

うまくインデントできない。

foo() ->
  Q = $", % "

としてもダメだーー。

-define(QUOT, 34).
foo() ->
  Q = ?QUOT,

だせっ!

2009-04-14 (火)

日本語とか雑多なライブラリとか

| 12:01

Erlangは、以前から僕がやりたかったこと、例えば「がんがん実稼働させながら、ゆるゆるデバッグ」とか、「猿を1000匹くらい雇ってモンキーテストしたい」とか、まー「おまえはアホかっ!?」的な妄想を実現してくれそうな気がして、頭を突っこんでいるわけだが、

  • 日本語の扱いがやっぱり辛いなー、UTF-8がサポートされりゃいいって問題でもない、
  • ちょっとしたことをやる雑多なライブラリがあまりころがっていない。

ここらは苦労しますわ。しょうがないけど。


ころがってないか探す場所(再掲):

2009-03-31 (火)

コマンドセットの仕様を表すデータ

| 10:34

EUnitもいいんだが、僕のイメージとは違うなー。やっぱ作るしかないのかなー。

  • 事前条件は思い切って捨てよう。
  • 不変条件と事後条件は必ずチェックするようにする。
  • 事後条件をパスすると、付随したアクション(があれば)実行する。

条件=表明の書き方が問題だ。この部分は、EUnitのテスト表現(test representation)が参考になるかも。

コマンド仕様はタプルで記述することにして:

FunSpec = {Mod, FunName, ArgSpec, HelpString?}
Mod = atom()
FunName = atom()
HelpString = string()

ArgSpec = [ (integer() | s | a) ]

CmdSpec = {Cmd, Arity, FunSpec, RplyKind, Assertion?, Action?}
Cmd = atom()
Arity = integer()
RplyKind = v | s | m | vs | vm | sm | vsm 

疑問符は省略可能を表す。AssertionとActionは未定。1文字のアトムの意味は:

  • a 引数全体
  • s 状態
  • v 値
  • m メッセージ

インボーカー(invoker)は、レジスタ(状態)として次を持つ。

  • Value = {value, term()} | no_value
  • State = term()
  • Message = [term()]
  • Exception = {Class::atom(), term()} | no_exception

アサーション関数は、(Value, State, Message, Exception) -> bool() となるだろう。アサーション関数が例外のときは、インボーカーは死ぬ(もう知らん! と)。

[追記]http://d.hatena.ne.jp/m-hiyama-memo/20090331/1238474706 も参照。

事前条件に関しては、関数定義の入り口でassertしてもいいと思う。[/追記]

ValentinaValentina2012/08/24 18:51This piece was cogent, well-witrten, and pithy.

hzkiyhzhzkiyhz2012/08/25 15:48ulmEt6 <a href="http://gcoiyuwzcreu.com/">gcoiyuwzcreu</a>

kpyqduozykpyqduozy2012/08/27 00:13KrkVK3 <a href="http://dmuynnkjqulo.com/">dmuynnkjqulo</a>

dajugzudajugzu2012/08/27 22:29aIT0Zi , [url=http://jjbybzuabnzb.com/]jjbybzuabnzb[/url], [link=http://dffjjwepljnx.com/]dffjjwepljnx[/link], http://nbseayfagmif.com/

2009-03-30 (月)

テキスト型の対話とバッチ処理

| 09:01

to_upper() ->
  Input = io:get_line("to_upper> "),
  if Input =:= eof orelse Input =:= "" orelse Input =:= "\n" ->
      ok;
     true ->
      io:format(string:to_upper(Input)), % 改行はもともと付いている
      to_upper()
  end.

もちろんEシェルで対話できる。

OS> erl -noshell -s foo to_upper -s init stop

としても対話できる。

OS> erl -noshell -s foo to_upper -s init stop <input.txt > output.txt

でもOK。だが、プロンプトがファイルに出てしまう、、、だから isattyが欲しかった。

テストと仕様の融合

| 09:32

EDocとEUnitとナニヤラカニヤラを組み合わせて、最初から「テスト容易=理解容易」なモジュールを書きたいのだが、、、、

2009-03-27 (金)

更新が辛い、辛すぎる

| 15:13

データ構造の一部分をどんどん書き換えていくような操作が非常に辛いな。Erlangの普通のデータはイミュータブルだから、どんなに小さく書き換えても、データ全体を作り直さなくてはならない。パフォーマンスもさることながら、再構築のアルゴリズムもかなり面倒になる。特に入れ子のデータは扱いにくい。ポインタがないから、子から親を指すことができないし、循環的な構造も作れないし。

ポインタと破壊的代入ってなんて便利なんでしょ、、、、

[追記]まー、イミュータブルの宿命だと思ってあきらめよう。1バイト書き換えるのにも、メモリのなかじゃ大騒動![/追記]

[追記]ザッと書いてみた感じでは、これはもう死にそうに遅いだろう。実用になるのかいな? 使えても心理的に耐え難い、つうほどにトンデモナイ作業をしている。あーーー、このへんでErlangは嫌われそうだな。僕は我慢するけど。[/追記]

jj1bdxjj1bdx2009/03/28 11:33あまり細かいオペレーションは,別の言語で外部に出してしまう,というのが得策かもしれませんね.

m-hiyamam-hiyama2009/03/28 12:33jj1bdxさん、
> 別の言語で
そうですね。どうせ必要そうなので、リンクインドライバの書き方を習おうかと思ってます。それとは別に、Erlangによる非破壊的操作のノウハウも必要ですね。パフォーマンスが深刻じゃない状況では、Erlangで書く方がさすがに容易ですから。