Hatena::Grouperlang

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

2010-01-13 (水)

lists:merge, lists:umerge にはソート済みリストを渡す

| 10:18

listsモジュールにある merge って名前が付く関数は、引数は "must be sorted prior to evaluating this function. " とマニュアルに書いてある。

それを守らなかった僕が悪いのです、ハイッ。

VoluntasVoluntas2010/01/13 11:57Erlang 自体のソースコードも列挙系が多いですよね。読みやすさと言うよりは速度の面もあるのかもしれません。
if の使いどころが未だによくわかってないです :-P

m-hiyamam-hiyama2010/01/13 12:07Voluntasさん、
> 読みやすさと言うよりは速度の面もあるのかもしれません。
定数列挙ならジャンプテーブルのような最適化が出来そうですね。パターンマッチの多方向分岐でも最適化手法があるんかしら?
> if の使いどころが未だによくわかってないです :-P
ifはなんだかワカランですね。whenガードと同じ感じの条件で多方向分岐ってことでしょうが、そんなん、あんまり出てこないし。

2010-01-12 (火)

久しぶりに使うと

| 15:27

すっかりErlangはご無沙汰。ものすごく久しぶりに使った。12月に使っていた機械が壊れたのでインストールからやり直し。おっ、GUIはwxになったんですか、GSより綺麗だ。unicodeってモジュールも入ったが、それで悲惨な日本語処理がどうにかなるかどうかは分からない。

さて、体験したこと感じたこと; 以前は、OSシェルや他のインタプリタ使っていても行末でピリオドを打ってしまって困ったが、今はピリオドを忘れて困る。データが全部イミュータブルだってことを忘れてイライラする。まー、これは以前からイライラしていたか。

一方、ガード付き関数節がたくさん書けること、引数パターンやcase式で場合分けが書けること、リスト処理が比較的充実していること、などはシミジミとありがたい。今はプロセス使う用途がないので、プロセスがありがく感じる状況じゃない。

2009-06-09 (火)

引数順序の誤解

| 11:30

lists:nth(List, N) だと思っていたら、lists:nth(N, List) だった。これが原因のバグデバッガを起動したら、デバッガが死んだ。lists:nth(0, List) とかもやりそう。

jj1bdxjj1bdx2009/06/09 18:04Armstrong先生も,関数名に属性を埋め込みたいねえ,という話をしてましたね.ただ現実には難しいだろうなあ.
http://www.erlang.org/cgi-bin/ezmlm-cgi?4:mss:44296:iabfbomcgoelhocacnai

m-hiyamam-hiyama2009/06/10 08:15jj1bdxさん、
名前付き引数のサポートですね。デフォルト値と組み合わせると確かに便利です。が、順序を憶えなくていい代わりに名前を憶える負担が。バランスが難しいですね。
> ただ現実には難しいだろうなあ.
これは無理みたいな、、、

2009-03-30 (月)

apply、アブネーー

| 09:21

オプショナルなコールバックを呼ぶとき:

try
 apply(Mod, callback, Args)
catch
 error:undef ->
  ok
end

つうコードだとえらいことになる。Mod:callbackが存在して、そのなかでundefが発生していると、わーーかりにくいバグになるのだ。スタックトレースを見て、Mod:callbackそのものがundefなことを確認しないと。そうじゃないときは、捕まえちゃいけないモノだからリスローする。

アレッ? それってどうやるんだっけ<忘れた。

2009-01-15 (木)

小なりイコール×、イコール小なり○

| 12:08

多くのプログラミング言語で比較演算子は、

  • <, >, <=, >=

<= と >= も、日本語の「小なりイコール」「大なりイコール」のママだから混乱はない。(x => y) はだいたい構文エラーになるが (x <= y) はふつうOK。だけど、Erlangでは、1 <= 2 . は構文エラー。なぜか「イコール小なり =<」が正しい。慣れればいいとはいえ、しばしば間違う。

で、ここからは何の根拠もないのだけど、「小なりイコール <=」は左向き矢印に見えるのがよくないのじゃないか、と思った。<=, => は将来使う記号としてとっておこうとか。そんな理由なハズはないと思うけど、そう妄想してみたら憶えた。

[追記]XMLリテラルを持つJavaScriptなどでは、 x =<y とか書いてしまうと、</y> というend tagの出現までパーザーが走ってしまうのだった。ヒョエー。[/追記]

2008-12-18 (木)

不等号でガードとか、ランタイムエラーとか

| 14:37

when X > 0 とかで正整数になると思ったらオオマチガイ!

> a > 0 .
true
> "" > 0 . 
true
> 

実は、timer_ext:wait_until/{3,2} のガードで僕やってるけどねーー (^^; 言い訳すれば、あれは範囲を明らかにするドキュメンテーションのつもり。正整数なら、when is_integer(X), X > 0

んで、これは?

max(X, Y) when X >= Y -> X;
max(X, Y) -> Y.

↑は間違いじゃないけど、整数に限定してない。整数に限定したいなら、

max(X, Y) when is_integer(X), is_integer(Y) ->
  if X >= Y -> 
      X;
     true ->
      Y
  end.

ちゃんとbadargを起こしたいなら:

max(X, Y) when is_integer(X), is_integer(Y) ->
  if X >= Y -> 
      X;
     true ->
      Y
  end;
max(_X, _Y) ->
  erlang:error(badarg).

badargがふさわしいから、その意味ではフォールバックの節を書いたほうが望ましいけど、いつでもそうしようとすると煩わしくてコーディング負担が大きい。これは、ほどほどだな。

badarg, badarith, function_clause, {case_clause,V}, if_clause はみんなお仲間みたいなもんで、理由を厳密に区別しても実際的ではない。たいていは外から渡したデータがまずかったとき。総じて呼び側が悪い

RasadRasad2012/02/09 19:39So much info in so few words. Tosotly could learn a lot.

fttosrpfqrfttosrpfqr2012/02/09 22:04xtmx4I <a href="http://dcwmuvowvxrk.com/">dcwmuvowvxrk</a>

qbwziqzqbwziqz2012/02/11 03:45EuHBqE , [url=http://vmxmmwylocyl.com/]vmxmmwylocyl[/url], [link=http://ewgoxruwespg.com/]ewgoxruwespg[/link], http://oyqkypsxrner.com/

zygmbyzygmby2012/02/12 23:23Gr6C5f <a href="http://foeilrknewxy.com/">foeilrknewxy</a>

iigwhkksnsiigwhkksns2012/02/14 01:05eCy3ac , [url=http://boynrsvpwqyg.com/]boynrsvpwqyg[/url], [link=http://dbgndaxgwozh.com/]dbgndaxgwozh[/link], http://pqhcxmcmdrlj.com/

2008-12-17 (水)

アトムは定義した方がいいぞ

| 10:51

アトムの名前が間違っていても、ずっと気付かないことがある。特にアトム名が長ければタイプミスをする。

-define(SHORT, very_long_named_atom).

としておくと、?SHORTで参照できるし、間違えばプリプロセッサエラーが起きる。文字列とかでも、とにかく打ち間違いの可能性がある定数に関しては同じこと。

2008-12-15 (月)

integerとかしてもエラーにならない。

| 17:07

型名にinteger, stringとしてもアトムと解釈されるだけ。

2008-12-12 (金)

カンマ忘れ

| 09:43

リストやタプルのカンマをしばしば忘れる。

これは、Lispのときの感覚が少し残っているせいかな?

可変引数

| 09:47

io:format("~s = ~p~n", Name, Value).

のような書き方をよくした(やっと最近減ってきた)。

Erlangに可変引数あるわきゃない! が、あるといいなとか妄想する。

2008-12-11 (木)

ピリオド忘れ

| 08:54

-define(FOO, "hoge")

と、ピリオドを忘れると、変なところで変な構文エラーが出て困惑する。

VoluntasVoluntas2008/12/17 17:08すーぱーばいざーつきの hello world に期待。

m-hiyamam-hiyama2008/12/17 18:08Voluntasさん、
はい、そのうち :-)