関数が定義されているか判断する

特定のモジュールに関数が定義されているかはerlang:function_exported/3という関数で判断できる(正確にはエクスポートされているかどうか). だけどコレ, モジュールがロード済みじゃないと効果ないんだよねー. 今まで"それなら使えないじゃん!"とか思っていたけど, "それならモジュールをロードすればいいじゃん!"ってコトを今しがた思いついた.

exists_function(Module, Function, Arity) ->
    case module_loaded(Module) of
        true ->
            erlang:function_exported(Module, Function, Arity);
        false ->
            case code:load_file(Module) of
                {module, _} -> erlang:function_exported(Module, Function, Arity);
                _           -> false
            end
    end.

関数が定義(エクスポート)されていないのか, そもそもモジュール自体が存在しないのかわからなくなるけど, とりあえずコレでOK. あとそのモジュールがロードされっぱなしになるけど.

そういやerlangモジュールの一部はモジュール名なしでも関数を呼べる(モジュール名:関数名と書かなくてもよい)けど, それらの関数とそうでない関数の差はなんだろう? よく呼ぶ/呼ばないとか? うーん.

あとそもそもなぜ関数が定義されているか知りたい理由を忘れてしまった……!