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)くらいにしか使われてないようで,今のところ他に副作用も無い感じ.
本家にもこの修正反映されるといいけど...どうだろう(^^;
The comments to this entry are closed.
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