[Proposal] Map.drop : friendlier error message if atom given instead of list

48 views
Skip to first unread message

Edouard Mnd

unread,
Jan 12, 2019, 1:10:14 PM1/12/19
to elixir-lang-core
 Hi,

I have been running into the same issue again and again with elixir where I get a weird error like
(Protocol.UndefinedError) protocol Enumerable not implemented for "foo". This protocol is implemented for: DBConnection.PrepareStream, DBCo nnection.Stream, Date.Range, Ecto.Adapters.SQL.Stream, File.Stream, Function, GenEvent.Stream, HashDict, HashSet, IO.Stream, List, Map, MapSet, Postgr ex.Stream, Range, Stream, StreamData, Timex.Interval
when doing `Map.drop(foo, :sth).
Obviously i'm doing something wrong : I should give a list as a second argument but I keep forgetting and I bet i'm not the only one.
My proposal would consist in handling this case explicitly either by allowing for such a case to work or giving back a clear error message such as "Are you trying to do Map.drop(foo,[:sth]) ?".
I'm greatly inspired by the rust language in asking this, indeed rust gives you really great error messages when doing silly things.

I hope you find my proposal clear and interesting as it clearly is not just about Map.drop but also about giving better error messages to the developer when doing silly things which I think is important.

Andrea Leopardi

unread,
Jan 12, 2019, 2:38:20 PM1/12/19
to elixir-l...@googlegroups.com
The problem here is that Map.drop/2 expects a term as the second argument that implements the Enumerable protocol. This means that realistically we can't check for a specifically supported data type or types, since anything could implement the Enumerable protocol. For example, I might implement Enumerable for atoms and then your code would work.

--
You received this message because you are subscribed to the Google Groups "elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email to elixir-lang-co...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/elixir-lang-core/550f8801-c0d9-41ea-947a-8c3ee483c76a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
--

Andrea Leopardi

Edouard Mnd

unread,
Jan 13, 2019, 6:42:16 AM1/13/19
to elixir-lang-core
Oh i see so the only simple option would be to add something along the line `drop(map, a) when is_atom(a)` but it would mean making the widening the api surface.
Maybe the answer does not lie directly in elixir core but in something that would run after the elixir compiler able to give suggestions about the errors ? It clearly is not the scope of the discussion but I would be interested to know what you think about it and what elixir api could be used to make such a hint/suggestion layer.

José Valim

unread,
Jan 13, 2019, 7:02:47 AM1/13/19
to elixir-l...@googlegroups.com
It would be possible only if you manually write error messages for every existing function. There is no trivial way to automate it without adding a type system.


José Valim
Skype: jv.ptec
Founder and Director of R&D


Louis Pilfold

unread,
Jan 13, 2019, 7:38:16 AM1/13/19
to elixir-l...@googlegroups.com
Hi

Perhaps the error message for an unimplemented protocol could be made more friendly. I don't have any suggestions myself, but perhaps Edouard had some ideas for Map.drop that could be generalised to all protocols.

Cheers,
Louis

José Valim

unread,
Jan 13, 2019, 7:57:16 AM1/13/19
to elixir-l...@googlegroups.com
That's a good point Louis, apologies for rushing to the conclusion. Suggestions are welcome!

Edouard Mnd

unread,
Jan 14, 2019, 5:35:42 AM1/14/19
to elixir-lang-core
I must admit I don't have general suggestions for protocols errors : I think the actual error message make sense as long as you understand why it's happening.
If we can't help the cases where it's not obvious I think this proposal is going nowhere.
Reply all
Reply to author
Forward
0 new messages