I am a newbie to Elixir so please forgive any foolishness.
I have an ‘outer’ function called foo that needs to provide two main variants, that I want to be selected using a single-entry Keyword list, e.g. do_it: :one, or do_it: :two, with :two being the default case.
The two variants are such that one is a trivial extension of the other, so that the extended form can call the non-extended form, after performing a small amount of pre-processing on the input argument.
I have attempted to implement this behaviour as follows:
# the extended case, indicated by the option: keyword def foo(value, do_it: :one) do # do some pre-processing # then call the 'core' processing, with no keyword foo(val) end # the non-extended case, called by the extended case, keyword defaults to nil def foo(value, _opt \\ nil) do # do the main work end # the 'parent' case, which may optionally be passed the do_it: keyword pair def bar(value, opt \\ nil) do case foo(value, opt) do case1 -> ... case2 -> ... end end # a typical call, invoking the extended case bar(my_value, do_it: :one)
Unfortunately, when I use this approach, I get the following compiler warning.
warning: def foo/2 has multiple clauses and also declares default values. In such cases, the default values should be defined in a header. Instead of: def foo(:first_clause, b \\ :default) do ... end def foo(:second_clause, b) do ... end one should write: def foo(a, b \\ :default) def foo(:first_clause, b) do ... end def foo(:second_clause, b) do ... end
Now, I am sure that this explanation is meant to clarify things, but to me it is just
adding confusion. I realise it’s a big ask, but could somebody sugest how my code should
be structured to avoid this warning? The suggested improvment just doesn’t make
sense to me - e.g. what are :first_clause and :second_clause??