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] 
> <javascript:>> 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] <javascript:>.
>> 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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/c3e612e7-507e-4ede-9175-7c8809d05eee%40googlegroups.com.

Reply via email to