Hatena::Grouperlang

YのErlang

2010-05-11

パラメタライズドモジュール(parameterized modules)について

01:53

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

ElizabethElizabeth2012/08/22 18:29Articles like this make life so much smieplr.

nzcakfiokanzcakfioka2012/08/23 12:02qu0t7M <a href="http://dlglkjwjaydw.com/">dlglkjwjaydw</a>

vrfdfexdvrfdfexd2012/08/24 04:32CI9j3i , [url=http://pszomjzfdhop.com/]pszomjzfdhop[/url], [link=http://qitwxagqrvjp.com/]qitwxagqrvjp[/link], http://gcrbuoscnoja.com/

2008-05-24

レコードのインスタンスを通して関数を実行する

21:24

こういうふうに組んで、

-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"}

whenのガードシーケンスでdictレコードかどうか判定したい。

17:41

今書いているコードで、こんな判定をしている。

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)}.

さてどうしよう。

DaisyDaisy2011/09/20 11:57What an awesome way to epxilan this-now I know everything!

ibkryqfiibkryqfi2011/09/20 22:56ceP7Ec <a href="http://ofckzwtbagzm.com/">ofckzwtbagzm</a>

awsfrsqomdmawsfrsqomdm2011/09/21 02:15AHIyJN , [url=http://urdsglecxshk.com/]urdsglecxshk[/url], [link=http://ueuhhdovumzf.com/]ueuhhdovumzf[/link], http://bwltdxrtqqfa.com/

bzfomgbzfomg2011/09/25 01:526Cadfk <a href="http://glivrrigoita.com/">glivrrigoita</a>

acdcvnkdlfwacdcvnkdlfw2011/10/03 23:45iCfQSQ , [url=http://luevxjdianfg.com/]luevxjdianfg[/url], [link=http://qsscbdelzjsr.com/]qsscbdelzjsr[/link], http://txyjzgisdlml.com/

RidwhanRidwhan2012/10/08 08:29Thanks for the insight. It brngis light into the dark!

zbdauqnzbdauqn2012/10/09 14:24aFEqHb , [url=http://gwbrnaadlomi.com/]gwbrnaadlomi[/url], [link=http://doyxzowmsqgj.com/]doyxzowmsqgj[/link], http://cojgqgvxmywf.com/

fdnbrnwfdnbrnw2012/10/10 22:22kqIrCE <a href="http://cyvxmsioqxhs.com/">cyvxmsioqxhs</a>

mnhtaamnhtaa2012/10/11 11:57qGLWsl , [url=http://ugmdrzqdlsti.com/]ugmdrzqdlsti[/url], [link=http://zlhfravxifjv.com/]zlhfravxifjv[/link], http://rcchvgtxmzmp.com/

2008-05-17

ドットリスト

14:30

> [X,Y|Z] = [1,2|3].
[1,2|3]

結局例外(正規表現は止め)で数値かどうか分けるようにした

14:28

これで互換を保てそう。

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.

io_lib:freadなどで個数の違うタプルが返ってきたときの振り分け方がよくわからない

11:08

こんな感じに組んでるけど動かないので、寝ておきてから考えるー。

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.

コンソールで例外を起こすとetsも死んじゃう件

09:59

Pythonチックにコンソールで動作を確認しながら開発してると、意図的に例外を起こしたりする。

問題はその都度プロセスが再起動しているのかetsが破棄される。


init/0とかテストデータを入れる手続きを一時的に作ってるけど、それもなーーー。

HomeroHomero2012/10/08 15:32I want to send you an award for most helpful internet wiretr.

xizrwzxizrwz2012/10/09 05:32bZZZDZ <a href="http://actifbqnrdga.com/">actifbqnrdga</a>

nnwixootarnnwixootar2012/10/09 15:07zf6mOj , [url=http://vfattctkjxro.com/]vfattctkjxro[/url], [link=http://bchfyawvwxhg.com/]bchfyawvwxhg[/link], http://sccqcbtqnabu.com/

znutdeknuznutdeknu2012/10/10 23:09lmHBON <a href="http://xfkfrfvdcfun.com/">xfkfrfvdcfun</a>

daynthhbedaynthhbe2012/10/12 03:077ysoCT , [url=http://fdgihxxnlnla.com/]fdgihxxnlnla[/url], [link=http://kejzojlgguwp.com/]kejzojlgguwp[/link], http://lkbnypcveeix.com/