« 情報処理 | Main | Erlangでのプロファイリング »

Tuesday, June 12, 2007

Erlangのレコードを書きやすく

Erlangのレコード(Cでいう構造体みたいなもの)は,いまいち使いづらい.

定義

-record(name, { sei, mei }).
-record(user, { userid, name }).

作成

User = #user{ userid = 1, name = #name{ sei = "sawatari", mei = "mikage"}}.

一部変更

IdChangedUser = User#user{ userid = 2 }.
NameChangedUser = User#user{ name = (User#user.name)#name { mei = "mika" }}.

参照

Mei = (User#user.name)#name.mei.

参照は

Mei = User#user.name#name.mei.

とかけそうだけど,こう書くとエラーになってしまう.

#演算子はレコード以外のところでは使われていないので,演算子の優先度をちょっといじれば直せそう・・・
ということで氷魚にゃさんにパッチを書いてもらった.

[erlang-patches] patch for better record syntax.

これで少しは使いやすく.

と,今気づいたけど

NameChangedUser = User#user{ name = User#user.name#name { mei = "mika" }}.

と書くのはまだエラーになってしまう模様...


レコードは全般的に使いにくいと感じてしまうんだけど,もともと破壊的な変更が出来ないので,一部を変更するときは全体をコピーする必要がある.というところに原因があるのかな?
これは関数型言語ではわりと仕方ないこと?
Haskellでも,結構似たような状況のようだし...

----

追記:

NameChangedUser = User#user{ name = User#user.name#name { mei = "mika" }}.

にも対応したパッチがリリースされました

これで()をネストしなくて済むようになります.

#はErlangではレコード以外には整数表現(16#ffff)くらいにしか使われてないようで,今のところ他に副作用も無い感じ.
本家にもこの修正反映されるといいけど...どうだろう(^^;

|

« 情報処理 | Main | Erlangでのプロファイリング »

Comments

I want to quote your post in my blog. It can? And you et an account on Twitter?

Posted by: smumrik | Sunday, December 27, 2009 11:39 AM

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference Erlangのレコードを書きやすく:

» [Prog [ひおにっき]
[Program] Erlangのれこーどぱっち#2 Erlangのレコードを書きやすく@みかログから。レコード更新時もかけるようにぱっちを修正。 NameChangedUser...... [Read More]

Tracked on Wednesday, June 13, 2007 12:03 PM

« 情報処理 | Main | Erlangでのプロファイリング »