> With does seem like the right thing in this case.
His argument is that using a `case` for that is quite noisy, and `with` would
be no different, since he would need to do something like:
with %{bar: “baz”} <- foo do
“hello i match”
else
_ -> nil
end
Since when `with` does not match and no `else` clause is given, the return
value is the unmatched value, instead of `nil` as I would expect it to be on
something like:
if %{bar: “baz”} <- foo do
“hello i match”
end
Best,
Kelvin Stinghen
[email protected]
> On Oct 17, 2019, at 16:24, Michael St Clair <[email protected]> wrote:
>
> With does seem like the right thing in this case.
>
> Although to add I don't think I have ever done pattern matching in an if for
> this reason. Seems like if you are wrapping pattern matching in an if you
> want to know if the match works. I think supporting `<-` in an `if` would be
> good if there are issues with just using `=` to make things simpler.
> Specifically when using with and an else statement when only checking a
> single match.
>
> On Thursday, October 17, 2019 at 1:15:41 PM UTC-6, José Valim wrote:
> Thanks Joel for the proposal.
>
> I am not a big fan of a macro changing what = means. = typically means
> pattern matching and a MatchClause error in case they don't match. Sure, we
> can change what it means, but if = starts meaning different things in
> different places, developers would constantly start to second guess
> themselves.
>
> Even inside for and with-comprehensions, = means MatchClause error and they
> introduce an explicit <- construct for "soft matching". So maybe we could do:
>
> <%= if %{bar: bar} <- foo do %>
> ...
> <% end %>
>
> But then you might as well use with:
>
> <%= with %{bar: bar} <- foo do %>
> Do that
> <% end %>
>
> Although the best solution here would be to move the logic to helper
> functions. I would prefer to avoid pattern matching in templates.
>
>
> José Valim
> www.plataformatec.com.br <http://www.plataformatec.com.br/>
> Skype: jv.ptec
> Founder and Director of R&D
>
>
> On Thu, Oct 17, 2019 at 9:04 PM Joel Wietelmann <[email protected] <>> wrote:
> Scenario: You have one pattern you want to match. You do not want to raise a
> NoMatchError when the value fails to match this pattern.
>
> Probably the best available thing to do is to use a `case` statement:
>
> case foo do
> %{bar: "baz"} -> "hello i match"
> _ -> nil
> end
>
> However, that default case can get pretty repetitive when it's frequently
> nothing, and it gets even more awkward inside of EEx:
>
> <%= case foo do %>
> <% %{bar: "baz"} -> %>
> hello i match
> <% _ -> %>
> <% end %>
>
> There's also `Kernel.match?/2`, which is awkward to use in an `if` statement
> because it doesn't read like any pattern matching expression that an Elixir
> developer has typically ever written:
>
> if match?(%{bar: "baz"}, foo) do
> "yes"
> end
>
> Here is an alternative idea, which I think is significantly easier to read
> than the above options:
>
> if_match %{bar: "baz"} = foo do
> "yes"
> else
> "no"
> end
>
> if_match %{bar: "not baz"} = foo do
> "yes"
> end
>
> <%= if_match %{bar: "baz"} = foo do %>
> hello i match
> <% end %>
>
> Proof of concept code:
>
> defmacro if_match(expression, do: do_clause) do
> quote do
> match(unquote(expression), do: unquote(do_clause), else: nil)
> end
> end
>
> defmacro if_match({:=, _, [pattern, value]}, do: do_clause, else:
> else_clause) do
> quote do
> case unquote(value) do
> unquote(pattern) ->
> unquote(do_clause)
>
> _ ->
> unquote(else_clause)
> end
> end
> end
>
> --
> 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/4944626e-7cde-4200-ae3a-e573102246a2%40googlegroups.com
>
> <https://groups.google.com/d/msgid/elixir-lang-core/4944626e-7cde-4200-ae3a-e573102246a2%40googlegroups.com?utm_medium=email&utm_source=footer>.
>
> --
> 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]
> <mailto:[email protected]>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/elixir-lang-core/c3e612e7-507e-4ede-9175-7c8809d05eee%40googlegroups.com
>
> <https://groups.google.com/d/msgid/elixir-lang-core/c3e612e7-507e-4ede-9175-7c8809d05eee%40googlegroups.com?utm_medium=email&utm_source=footer>.
--
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/DA1FAB7C-1040-4D08-8E9E-A8E045FD98A9%40gmail.com.