On thing to think about though is the expression: `if nil <- nil, do: :hello, else: :world`. What should it return?
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 <jo...@ <>revelry.co > <http://revelry.co/>> 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 elixir-l...@ <>googlegroups.com <http://googlegroups.com/>. > 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/63CFD184-ADA2-443B-BA16-5E8783552557%40gmail.com.
