[erlang-questions] Elixir Protocols in Erlang & a Strange Warning

Kaveh Shahbazian <>
Fri Dec 13 07:31:45 CET 2013


I wanted to write something like ((IStringer)object).ToString() (in C#) in
Erlang. After some studying I've learnt that Elixir has something called
Protocols that pretty much resembles the same thing of C# (in an inside-out
manner). Then I came up with this idea/code in Erlang - which is nice
enough to me like:

?stringer(my_val):to_string().

And it either returns the expected value or not_implemented atom!

But 2 questions:

1 - Why nobody use this or promote things based on stateful modules in
Erlang? (OTP aside and from talking to some Erlangers they did not know
that actually OTP is built around this! So really there is a need to change
how Erlang is being taught and promoted. It's possible that I am confused.).

2 - Why I get this warning? That call actually never fails.

The warning:

stringer.erl:18: Warning: invalid module and/or function name; this
call will always fail
stringer.erl:19: Warning: invalid module and/or function name; this
call will always fail
stringer.erl:20: Warning: invalid module and/or function name; this
call will always fail

The code:

-module(stringer).
-export([to_string/1,sample/0]).

-define(stringer(V), {stringer, V}).

to_string({stringer, V}) when is_list(V) ->
    to_string(V, nop);
to_string({stringer, V}) when is_atom(V) ->
    to_string(V, nop);
to_string({stringer, _V}) ->
    not_implemented.

to_string(V, _Nop) ->
    Buffer = io_lib:format("~p",[V]),
    lists:flatten(Buffer).

sample() ->
    io:format("~p~n", [?stringer([1,2]):to_string()]),
    io:format("~p~n", [?stringer(cute_atom):to_string()]),
    io:format("~p~n", [?stringer(13):to_string()]).

And the output is:

"[1,2]"
"cute_atom"
not_implemented
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20131213/29d99214/attachment.html>


More information about the erlang-questions mailing list