Hatena::Grouperlang

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

 | 

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/

 |