Erlang で変数を shadow するとひどい目に遭う

send しているのに receive でブロックするの原因は変数の shadow が原因だった。

handle_call({search, ReturnToMe, Key}, _From, State) ->

上の handle_call の Key と下の receive の Key がかぶっているので別のノードから返ってきた Key が Key にマッチするわけもなくブロック。

                    receive
                        {ok, Key, Value} ->
                            ?L(),
                            {reply, {ok, Key, Value}, State};


そもそもの間違いは、どこかからかパクってきた Makefile のオプションで

+nowarn_shadow_vars

と指定していた事。 nowarn_shadow_vars はつけない方が良いという教訓を得た。

追記

よく考えると shadow ではないな。こういう状態は、意図的に発生する事もあるなあ。