<div dir="ltr">> <span style="font-size:12.8px">So this can </span><span style="font-size:12.8px">not be described as a pattern.</span><div class="gmail_extra"><br></div><div class="gmail_extra">I'm saying let's fix that.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Prefix ++ Rest as a pattern does not need to be calling ++/2.</div><div class="gmail_extra">Instead, I am suggesting to allow "partial matches": adding support for these patterns.</div><div class="gmail_extra">What makes this hard? Why is this only sugar?</div><div class="gmail_extra">Why is a similar pattern allowed in binaries but not with lists? (the <<Prefix:PrefixSize/binary, Rest/binary>> pattern)</div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div><br></div><div>Cheers,</div><div>-- </div><div>Pierre Fenoll</div></div><div><br></div></div></div></div>
<br><div class="gmail_quote">On 25 October 2017 at 13:53, Raimo Niskanen <span dir="ltr"><<a href="mailto:raimo+erlang-questions@erix.ericsson.se" target="_blank">raimo+erlang-questions@erix.ericsson.se</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Wed, Oct 25, 2017 at 12:54:59PM +0200, Pierre Fenoll wrote:<br>
> It's the same with binaries:<br>
><br>
> <<"a", Rest/binary>> = <<"abc">><br>
> %%=> Rest = <<"bc">><br>
><br>
> a() -> <<"a">><br>
> Prefix = <<(a())/binary>><br>
> PrefixSize = byte_size(Prefix)  %% Compilation fails if size is not provided<br>
> <<Prefix:PrefixSize/binary, Rest/binary>> = <<"abc">><br>
> %%=> Rest = <<"bc">><br>
<br>
</span>The only time an unspecified size is allowed in the bit syntax is for the<br>
last field in a bit expression.<br>
<span class=""><br>
><br>
> Not sure what the differences may be due to compilation v. in the REPL.<br>
><br>
> I never understood however why this was "just sugar" or why PrefixSize is<br>
> explicitly needed:<br>
>   in<br>
>       f(Prefix) when is_list(Prefix) -><br>
>           Prefix ++ Rest = "my_list_thing",<br>
>           Rest.<br>
>   why isn't the compiler able to generate a pattern match? Is it missing<br>
> some concept, some structures?<br>
> What are the missing pieces and what can be done to add them?<br>
<br>
</span>    "abc" ++ Rest<br>
<br>
is compiled to<br>
<br>
    [$a, $b, $c | Rest]<br>
<br>
The variable Prefix is a complete list hence there is only a pointer to the<br>
head in runtime, so the only way to append to it is via lists:append/2 i.e<br>
the actual operator erlang:'++'/2, which creates a new list.  So this can<br>
not be described as a pattern.<br>
<br>
The visual appearence of "abc"++Rest vs Prefix++Rest is misleading:<br>
<br>
   [$a, $b, $c | Rest] vs lists:append(Prefix, Rest)<br>
<div class="HOEnZb"><div class="h5"><br>
<br>
><br>
> Same question with binaries:<br>
>   since we have a "prefix-match of binaries only providing PrefixSize at<br>
> runtime" instruction,<br>
>       * Why don't we have one for lists?<br>
>       * And oh God why do we have to provide that PrefixSize "manually"?<br>
> (binding the variable ourselves, when the compiler could do that itself)<br>
>       * Why isn't suffix-matching of binaries implemented yet? (how<br>
> different to prefix-matching can it be?)<br>
><br>
> I could never find the answer to all of these questions.<br>
> WRT binaries my thinking is that they are actually a mix of "bytes" and<br>
> references to binaries,<br>
> making some crucial operations O(log n) instead of O(1)... but prefix match<br>
> exists...<br>
><br>
> I really want to be able to write things like:<br>
>     <<"{", Name/binary, "}">> = PathToken<br>
><br>
> %%=> Name = <<"id">> given PathToken = <<"{id}">><br>
><br>
><br>
><br>
> Cheers,<br>
> --<br>
> Pierre Fenoll<br>
><br>
><br>
> On 25 October 2017 at 09:27, Kostis Sagonas <<a href="mailto:kostis@cs.ntua.gr">kostis@cs.ntua.gr</a>> wrote:<br>
><br>
> > On 10/25/2017 08:56 AM, Stefan Hellkvist wrote:<br>
> ><br>
> >> Is it because this syntactic sugar is transformed more or less as a<br>
> >> preprocessing step where the value of Prefix needs to be known,<br>
> >><br>
> ><br>
> > Yes, that's the reason.  It's a purely _syntactic_ thing.<br>
> ><br>
> > Kostis<br>
> > ______________________________<wbr>_________________<br>
> > erlang-questions mailing list<br>
> > <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
> > <a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/<wbr>listinfo/erlang-questions</a><br>
> ><br>
<br>
> ______________________________<wbr>_________________<br>
> erlang-questions mailing list<br>
> <a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
> <a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/<wbr>listinfo/erlang-questions</a><br>
<br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
<br>
/ Raimo Niskanen, Erlang/OTP, Ericsson AB<br>
</font></span><div class="HOEnZb"><div class="h5">______________________________<wbr>_________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" rel="noreferrer" target="_blank">http://erlang.org/mailman/<wbr>listinfo/erlang-questions</a><br>
</div></div></blockquote></div><br></div></div>