Erlang のリスト処理は最適化されまくっとるらしい

This entry was posted by on Wednesday, 16 May, 2007

Erlangの++はドーピングされている件

ちょっと関係ない話なのでコメントするかどうしようかなあと思っていたんですが、 Programming Erlang 3章にもこんなことが書いてありました。

>

Note: whenever you want to reverse a list you should call lists:reverse and nothing else. If you look in the source code for the module lists you’ll find a definition of reverse. However, this definition is simply used for illustration. The compiler, when it finds a call to lists:reverse calls a more efficient internal version of the function. >

(訳) 注意: リストを逆転させたいときは lists:reverse を使うべきであり、ほかのものは使わないこと。 lists モジュールのソースコードを見れば、 reverse の定義を発見できる。しかし、この定義は単に説明のために使われる。コンパイラは lists:reverse の呼び出しを発見すると、もっと効果的な最適化版の関数を呼び出す。

ということだそうです。リスト系って実はいろいろ最適化しているんですかね。やっぱヘンな処理系だなー。

あと例外処理についてですが、 catch が昔の書き方であり、これだとまずい場合が発見されたので try…catch 式が導入されたんだそうです。

ちなみに、まずい場合というのはどういうのかというと、 catch は内部で例外が発生すると、 {‘EXIT’, Why} というタプルを返すのですね。それを case とかで捕捉して処理するのが昔の定型だったと。でも、catch 内部の式が正しく終了してその返り値が {‘EXIT’, …} だったときに区別できないじゃん、ということみたいですね(そんなことありうるのかというのはさておき)。

ともかく catch は deprecated だということで、ぼくら newbie は try…catch だけを使っていればいいよっていうことのようですね。

Comments are closed.