Hello!

I'm new to Elixir development, so I'm approaching the language with fresh 
eyes. One of the issues I've run into is difficulty understand the error 
messages from the standard library. For example, today I ran this code:

string
|> String.replace(string, ~r/[^\[\](){}]/, "")
|> IO.inspect(label: "\n")
|> String.codepoints
|> check_brackets([])

When I run this code through one of my test cases, I get the following 
error:

  1) test math expression (BracketPushTest)
     test/bracket_push_test.exs:52
     ** (FunctionClauseError) no function clause matching in Keyword.get/3
     The following arguments were given to Keyword.get/3:


         # 1                                                               
                                                                            
                ""


         # 2
         :insert_replaced


         # 3
         nil
                                                                            
                                                                            
           Attempted function clauses (showing 1 out of 1):


         def get(keywords, key, default) when is_list(keywords) and is_atom(
key)


     code: assert BracketPush.check_brackets("(((185 + 223.85) * 15) - 
543)/2") == true
     stacktrace:
       (elixir) lib/keyword.ex:195: Keyword.get/3
       (elixir) lib/string.ex:1372: String.replace/4
       (bracket_push) lib/bracket_push.ex:15: BracketPush.check_brackets/1
       test/bracket_push_test.exs:53: (test)

     test/bracket_push_test.exs:52
     ** (FunctionClauseError) no function clause matching in Keyword.get/3
     The following arguments were given to Keyword.get/3:


         # 1                                                               
                                                                            
                ""


         # 2
         :insert_replaced


         # 3
         nil
                                                                            
                                                                            
           Attempted function clauses (showing 1 out of 1):


         def get(keywords, key, default) when is_list(keywords) and is_atom(
key)


     code: assert BracketPush.check_brackets("(((185 + 223.85) * 15) - 
543)/2") == true
     stacktrace:
       (elixir) lib/keyword.ex:195: Keyword.get/3
       (elixir) lib/string.ex:1372: String.replace/4
       (bracket_push) lib/bracket_push.ex:15: BracketPush.check_brackets/1

As a new language user, it's really hard to understand what I did wrong 
when the error is thrown from inside the inner implementation of 
String.replace/4. In order to debug this, I'd either have to look at the 
inner implementation of String.replace/4 or attempt to fiddle with the 
arguments. My preference would be for standard library functions to guard 
their own interfaces, and throw specific and actionable messages back to 
the developer.

Thanks for taking the time to read!

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/ec0892c5-04b8-4fe7-88b5-e12312483fa6%40googlegroups.com.

Reply via email to