[erlang-questions] Inconsistent shadowing of variables in a fun

Michel Boaventura <>
Mon Jan 30 01:31:29 CET 2017


I understand what you are saying. Probably this is allowed on bit matching
so you can use parts of the pattern to help match itself. It makes sense if
a piece's length depends on other piece value.

Em 29 de jan de 2017 22:15, "Robert Virding" <> escreveu:

> Yes, the variable bitsize variable must be bound. BUT it can also be bound
> if it matched "earlier" from inside the same binary. So
>
> b() -> fun (<<N, X:N, _/bitstring>>) -> {N,X} end.
>
> and
>
> 1> c("bt").
> {ok,bt}
> 2> F = bt:b().
> #Fun<bt.2.81949596>
> 3> F(<<8,1,2,3,4>>).
> {8,1}
> 4> F(<<5,1,2,3,4>>).
> {5,0}
>
> We see that N doesn't have to be imported. So variables in fun argument
> patterns aren't imported except for the binary bitsize, which is
> inconsistent and a bit hacky. Why that type?
>
> Robert
>
>
> On 30 January 2017 at 00:00, Michel Boaventura <
> > wrote:
>
>> According to Joe's Programming Erlang(page 103): Size must be an
>> expression that evaluates to an integer. In pattern matching, Size must be
>> an integer or a bound variable whose value is an integer.
>>
>> So the N on the pattern match is not a new variable like X.
>>
>>
>> Em 29 de jan de 2017 20:42, "José Valim" <>
>> escreveu:
>>
>> From my understanding, the N in this case can never be an unbound
>> variable. If you rename N to M, then it won't compile, so it would not be
>> possible for it to shadow anything.
>>
>> It is similar to map keys. They are always treated as values, even when
>> inside patterns.
>>
>>
>> On Sun, Jan 29, 2017 at 23:07 Robert Virding <> wrote:
>>
>>> When defining a fun the shadowing of variables occurring in arguments is
>>> inconsistent. So with
>>>
>>> a(X, N) ->
>>>     fun (<<X,Y:N,_/binary>>) -> {X,Y} end.
>>>
>>> the X in the fun arguments shadows the X from before it while the N is
>>> imported and used. An example:
>>>
>>> 1> c(bt).
>>> bt.erl:8: Warning: variable 'X' is unused
>>> bt.erl:9: Warning: variable 'X' shadowed in 'fun'
>>> {ok,bt}
>>> 2> f(G),G=bt:a(34,8).
>>> #Fun<bt.1.1070726>
>>> 3> G(<<1,2,3,4,5>>).
>>> {1,2}
>>> 4> f(G),G=bt:a(34,16).
>>> #Fun<bt.1.1070726>
>>> 5> G(<<1,2,3,4,5>>).
>>> {1,515}
>>>
>>> Why the difference? Shouldn't we be consistent in shadowing all
>>> variables?
>>>
>>> Robert
>>>
>>> _______________________________________________
>>> erlang-questions mailing list
>>> 
>>> http://erlang.org/mailman/listinfo/erlang-questions
>>>
>> --
>>
>>
>> *José Valim*
>> www.plataformatec.com.br
>> Skype: jv.ptec
>> Founder and Director of R&D
>>
>> _______________________________________________
>> erlang-questions mailing list
>> 
>> http://erlang.org/mailman/listinfo/erlang-questions
>>
>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20170129/a5f97e95/attachment.html>


More information about the erlang-questions mailing list