[erlang-questions] "prefix" ++ Rest = Something

Pierre Fenoll pierrefenoll@REDACTED
Wed Oct 25 16:11:18 CEST 2017


> So this can not be described as a pattern.

I'm saying let's fix that.

Prefix ++ Rest as a pattern does not need to be calling ++/2.
Instead, I am suggesting to allow "partial matches": adding support for
these patterns.
What makes this hard? Why is this only sugar?
Why is a similar pattern allowed in binaries but not with lists? (the
<<Prefix:PrefixSize/binary, Rest/binary>> pattern)


Cheers,
-- 
Pierre Fenoll


On 25 October 2017 at 13:53, Raimo Niskanen <
raimo+erlang-questions@REDACTED> wrote:

> On Wed, Oct 25, 2017 at 12:54:59PM +0200, Pierre Fenoll wrote:
> > It's the same with binaries:
> >
> > <<"a", Rest/binary>> = <<"abc">>
> > %%=> Rest = <<"bc">>
> >
> > a() -> <<"a">>
> > Prefix = <<(a())/binary>>
> > PrefixSize = byte_size(Prefix)  %% Compilation fails if size is not
> provided
> > <<Prefix:PrefixSize/binary, Rest/binary>> = <<"abc">>
> > %%=> Rest = <<"bc">>
>
> The only time an unspecified size is allowed in the bit syntax is for the
> last field in a bit expression.
>
> >
> > Not sure what the differences may be due to compilation v. in the REPL.
> >
> > I never understood however why this was "just sugar" or why PrefixSize is
> > explicitly needed:
> >   in
> >       f(Prefix) when is_list(Prefix) ->
> >           Prefix ++ Rest = "my_list_thing",
> >           Rest.
> >   why isn't the compiler able to generate a pattern match? Is it missing
> > some concept, some structures?
> > What are the missing pieces and what can be done to add them?
>
>     "abc" ++ Rest
>
> is compiled to
>
>     [$a, $b, $c | Rest]
>
> The variable Prefix is a complete list hence there is only a pointer to the
> head in runtime, so the only way to append to it is via lists:append/2 i.e
> the actual operator erlang:'++'/2, which creates a new list.  So this can
> not be described as a pattern.
>
> The visual appearence of "abc"++Rest vs Prefix++Rest is misleading:
>
>    [$a, $b, $c | Rest] vs lists:append(Prefix, Rest)
>
>
> >
> > Same question with binaries:
> >   since we have a "prefix-match of binaries only providing PrefixSize at
> > runtime" instruction,
> >       * Why don't we have one for lists?
> >       * And oh God why do we have to provide that PrefixSize "manually"?
> > (binding the variable ourselves, when the compiler could do that itself)
> >       * Why isn't suffix-matching of binaries implemented yet? (how
> > different to prefix-matching can it be?)
> >
> > I could never find the answer to all of these questions.
> > WRT binaries my thinking is that they are actually a mix of "bytes" and
> > references to binaries,
> > making some crucial operations O(log n) instead of O(1)... but prefix
> match
> > exists...
> >
> > I really want to be able to write things like:
> >     <<"{", Name/binary, "}">> = PathToken
> >
> > %%=> Name = <<"id">> given PathToken = <<"{id}">>
> >
> >
> >
> > Cheers,
> > --
> > Pierre Fenoll
> >
> >
> > On 25 October 2017 at 09:27, Kostis Sagonas <kostis@REDACTED> wrote:
> >
> > > On 10/25/2017 08:56 AM, Stefan Hellkvist wrote:
> > >
> > >> Is it because this syntactic sugar is transformed more or less as a
> > >> preprocessing step where the value of Prefix needs to be known,
> > >>
> > >
> > > Yes, that's the reason.  It's a purely _syntactic_ thing.
> > >
> > > Kostis
> > > _______________________________________________
> > > erlang-questions mailing list
> > > erlang-questions@REDACTED
> > > http://erlang.org/mailman/listinfo/erlang-questions
> > >
>
> > _______________________________________________
> > erlang-questions mailing list
> > erlang-questions@REDACTED
> > http://erlang.org/mailman/listinfo/erlang-questions
>
>
> --
>
> / Raimo Niskanen, Erlang/OTP, Ericsson AB
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20171025/ca0f12f8/attachment.htm>


More information about the erlang-questions mailing list