2年前くらいに書いた最後のエントリについて時を超えて答えが見つかったので、メモしておきます。
結論からいうとパラメタライズドモジュール(parameterlized modules)というアンドキュメントなErlangの機能でググれば情報がみつかります。
http://userprimary.net/posts/2009/03/04/two-erlang-finds-atomic-names-and-parameterized-modules/
http://www.erlang.se/workshop/2003/paper/p29-carlsson.pdf
使い方は簡単でまずOOで扱いたいモジュールを作成して、
-module(foo, [Name]). -export([hello/0]). hello() -> io:format("Hello ~p~n", [Name]).
あとはコンパイルするだけで使えます。new/-moduleの第2引数で指定した要素の数、な関数ができているのでそれを使用すると中身的にはタプルなものができて、それを通すと不思議なことにアクセサのように使えます。
1> c(foo). {ok,foo}. 2> Obj = foo:new("Bar"). {foo,"Bar"} 3> Obj:hello(). Hello "Bar" ok
Elizabeth2012/08/22 18:29Articles like this make life so much smieplr.
nzcakfioka2012/08/23 12:02qu0t7M <a href="http://dlglkjwjaydw.com/">dlglkjwjaydw</a>
vrfdfexd2012/08/24 04:32CI9j3i , [url=http://pszomjzfdhop.com/]pszomjzfdhop[/url], [link=http://qitwxagqrvjp.com/]qitwxagqrvjp[/link], http://gcrbuoscnoja.com/
こういうふうに組んで、
-module(rec_demo). -compile(export_all). -record(rec_demo, {foo}). new(X) -> #rec_demo{foo=X}. fun1(#rec_demo{foo=X}) -> {X, 0}. fun2(#rec_demo{foo=X}) -> {X, "foo"}.
こういうふうにモジュール名とレコード名を合わせると関数を実行できるのって、どこかのドキュメント書いてある?
> c(rec_demo). {ok,rec_demo} > R = rec_demo:new(5). {rec_demo,5} > R:fun1(). {5,0} > R:fun2(). {5,"foo"}
今書いているコードで、こんな判定をしている。
create(Env) -> #proc{pid=spawn(fun() -> loop(Env) end)}.
本当はここで渡されるのをdictのインスタンスに制限したい。
create(Env) when is_record(Env, dict#dict) -> #proc{pid=spawn(fun() -> loop(Env) end)}.
さてどうしよう。
DaisyWhat an awesome way to epxilan this-now I know everything!
ibkryqficeP7Ec <a href="http://ofckzwtbagzm.com/">ofckzwtbagzm</a>
awsfrsqomdmAHIyJN , [url=http://urdsglecxshk.com/]urdsglecxshk[/url], [link=http://ueuhhdovumzf.com/]ueuhhdovumzf[/link], http://bwltdxrtqqfa.com/
bzfomg6Cadfk <a href="http://glivrrigoita.com/">glivrrigoita</a>
acdcvnkdlfwiCfQSQ , [url=http://luevxjdianfg.com/]luevxjdianfg[/url], [link=http://qsscbdelzjsr.com/]qsscbdelzjsr[/link], http://txyjzgisdlml.com/
RidwhanThanks for the insight. It brngis light into the dark!
zbdauqnaFEqHb , [url=http://gwbrnaadlomi.com/]gwbrnaadlomi[/url], [link=http://doyxzowmsqgj.com/]doyxzowmsqgj[/link], http://cojgqgvxmywf.com/
fdnbrnwkqIrCE <a href="http://cyvxmsioqxhs.com/">cyvxmsioqxhs</a>
mnhtaaqGLWsl , [url=http://ugmdrzqdlsti.com/]ugmdrzqdlsti[/url], [link=http://zlhfravxifjv.com/]zlhfravxifjv[/link], http://rcchvgtxmzmp.com/
これで互換を保てそう。
symbol(Value) -> try case string:str(Value, ".") of 0 -> Fun = fun list_to_integer/1; _ -> Fun = fun list_to_float/1 end, #symbol{v=Fun(Value)} catch _:_ -> #symbol{v=string:to_lower(Value)} end.
こんな感じに組んでるけど動かないので、寝ておきてから考えるー。
symbol(Value) -> {X1, Y1, [Z1]} = io_lib:fread("~f", Value), case X1 of ok -> {[Num|_], []} = {Y1, Z1}, #symbol{v=Num}; _ -> {X2, Y2, Z2} = io_lib:fread("~d", Value), case X2 of ok -> {[Num|_], []} = {Y2, Z2}, #symbol{v=Num}; _ -> #symbol{v=string:to_lower(Value)} end end.
Pythonチックにコンソールで動作を確認しながら開発してると、意図的に例外を起こしたりする。
問題はその都度プロセスが再起動しているのかetsが破棄される。
init/0とかテストデータを入れる手続きを一時的に作ってるけど、それもなーーー。
HomeroI want to send you an award for most helpful internet wiretr.
xizrwzbZZZDZ <a href="http://actifbqnrdga.com/">actifbqnrdga</a>
nnwixootarzf6mOj , [url=http://vfattctkjxro.com/]vfattctkjxro[/url], [link=http://bchfyawvwxhg.com/]bchfyawvwxhg[/link], http://sccqcbtqnabu.com/
znutdeknulmHBON <a href="http://xfkfrfvdcfun.com/">xfkfrfvdcfun</a>
daynthhbe7ysoCT , [url=http://fdgihxxnlnla.com/]fdgihxxnlnla[/url], [link=http://kejzojlgguwp.com/]kejzojlgguwp[/link], http://lkbnypcveeix.com/