I would say it also benefits outside of EEx having a simpler if/else when matching on a single thing
On Thursday, October 17, 2019 at 1:39:14 PM UTC-6, José Valim wrote: > > I think I expressed myself poorly. I was not proposing to support <- on > if, I am saying with is already a great alternative which is very close to > what is being proposed. > > The only complaint about “with” would be: 1. you want an else clause, 2. > you find the else unpleasant on EEx, and 3. you *have* for some reason to > pattern match inside EEx. > > I don’t think it is a scenario frequent enough to add exceptions to > built-in constructs. In fact, the argument that something does not look > good in EEx is unlikely to be enough reason to change the language, > especially when you can extend it yourself. :) > > > On Thu, Oct 17, 2019 at 21:31 Kelvin Raffael Stinghen < > [email protected] <javascript:>> wrote: > >> > 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] <javascript:> >> >> On Oct 17, 2019, at 16:24, Michael St Clair <[email protected] >> <javascript:>> 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 >>> 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] <javascript:>. >> 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] <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/elixir-lang-core/DA1FAB7C-1040-4D08-8E9E-A8E045FD98A9%40gmail.com >> >> <https://groups.google.com/d/msgid/elixir-lang-core/DA1FAB7C-1040-4D08-8E9E-A8E045FD98A9%40gmail.com?utm_medium=email&utm_source=footer> >> . >> > -- > > > *José Valim* > www.plataformatec.com.br > Skype: jv.ptec > Founder and Director of R&D > -- 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/bf9ca31f-b6e7-405b-b534-f70a00cfdb9b%40googlegroups.com.
