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

Dmitry Kolesnikov <>
Fri Dec 13 09:10:36 CET 2013


Hello,

Essentially you are trying to use parametrized modules, which get deprecated in R14/15 and dropped from R16.
See for details: 
 * http://www.erlang.org/news/35
 * http://www.erlang.se/workshop/2003/paper/p29-carlsson.pdf

This type of problems are solvable either via pattern match or currying:

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

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

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

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


Best Regards,
Dmitry

On Dec 13, 2013, at 8:31 AM, Kaveh Shahbazian <> wrote:

> 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
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20131213/2f1d7ff5/attachment.html>


More information about the erlang-questions mailing list