« 情報処理 | 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

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



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でのプロファイリング »