アヤチノオト

覚書のこと

これは動的な弱い型けなのではと思ったけどそうでもないのか

すごいErlangゆかいに学ぼう!を読んでいるのですが、12章にでてくるregisterという関数の動作がちょっと気になったのでした。
registerは第一引数にatom、第二引数にpidをとってpidをatomで参照出来るようにする関数です。
しかし、すでに存在する関数名をregisterで名前をつけるとおかしなことが……

%% hello.erl
-module(hello).
-compile([export_all]).

start_link() ->
    register(loop, spawn_link(?MODULE, loop, [])).

hi() ->
    % loopという名前のプロセスにメッセージを送っている
    loop ! {self(), "Hi"},
    receive
	Mes -> Mes
    end.

loop() ->
    receive
	{Pid, Mes} ->  Pid ! Mes,
                       % こっちではloopを関数として呼び出している?
		       loop()
    end.

これは動的な弱い型付けなのでは?
と、ここまで書いて思ったのですが。

上のコードでloopがpidのように振る舞ったり関数のように振る舞ったりしているように見えるのはこういうことなのでしょうか。

  • loopはatom
  • !の左辺値はpidかpidと関連付けられたatom
  • loop()はloopというatomから関数オブジェクトを探してきて実行

つまり、atomとそれに関連付けられたものを同じものと思ってしまったからおかしく感じた、のかな。よくわかりません。