[erlang-bugs] Parser bug: if missing ", " in list between records, the first is ignored, and no parser warnings are given.
Mattias Waldau
mattias.waldau@REDACTED
Sun Nov 9 16:48:33 CET 2014
Forget the comment below. After talking to a friend, I at last
understood why this is ok.
In the expression #{}#{}, the first #{} is the record creation, and the
2nd #{} is record copying, so in Erlang, the same syntax is used for 2
separate things.
For example in Ocaml, you use {X with ..}
Thanks for the help. Yes, this is not a bug.
/mattias
On 09/11/2014 14:27, Mattias Waldau wrote:
> Thank you Loic and Roland for the explanations, I really appreciate it.
>
> The trick to understand why this is and should be ok is that #{} is n
> operator and then it makes sense. Then, there is another question why
> #{} is an operator.
>
> This is what the Erlang reference manual says about record creation,
> it doesn't mention #rec{}#rec{}
>
> So, until you explained, I just thought is was a parser bug.
>
> /mattias
>
>
> 10.2 Creating Records
>
> The following expression creates a new Name record where the value of
> each field FieldI is the value of evaluating the corresponding
> expression ExprI:
>
> #Name{Field1=Expr1,...,FieldK=ExprK}
>
> The fields may be in any order, not necessarily the same order as in
> the record definition, and fields can be omitted. Omitted fields will
> get their respective default value instead.
>
> If several fields should be assigned the same value, the following
> construction can be used:
>
> #Name{Field1=Expr1,...,FieldK=ExprK, _=ExprL}
>
> Omitted fields will then get the value of evaluating ExprL instead of
> their default values. This feature was added in Erlang 5.1/OTP R8 and
> is primarily intended to be used to create patterns for ETS and Mnesia
> match functions. Example:
>
> -record(person, {name, phone, address}).
>
> ...
>
> lookup(Name, Tab) ->
> ets:match_object(Tab, #person{name=Name, _='_'}).
>
>
> /mattias
>
>
> On 09/11/2014 14:09, Loïc Hoguin wrote:at
>> There are already warnings on otherwise correct syntax. Syntax being
>> correct is why they are warnings and not errors. +warn_export_vars and
>> +warn_shadow_vars are the most obvious examples.
>>
>> I also want to note in addition to everything I mentioned that if such a
>> warning is introduced, it needs to apply to both records and maps, as
>> they both suffer from the same syntactic fragility.
>>
>> On 11/09/2014 03:02 PM, Roland Karlsson wrote:
>>> Hi Mattias and Loïc.
>>>
>>> That #rec{}#rec{} is correct syntax is a result of how operators work.
>>> Making it not correct syntax needs a special treatment of this case.
>>> Which should be weird. Even more weird if it would be correct syntax in
>>> "advanced macros" only.
>>>
>>> Having a warning is another issue, warnings are based on heuristics
>>> and opinions.
>>>
>>> Loïc - have you seen a warning if you e.g. write A*B+C ?
>>> This expression (in principle) takes A*B, creating an unnamed
>>> variable. This unnamed variable is then added with C. Have you
>>> seen any warnings that this unnamed variable is unused?
>>> The same goes for #rec{}#rec{}. The first #rec{} creates an
>>> unnamed record of type rec. The second #rec{} modifies
>>> the unnamed record. You might not like the record syntax, and find
>>> the #rec{}#rec{} unreadable - but it is very clear what it does.
>>> BTW - the bit syntax and list comprehensions are even more hairy.
>>>
>>> Now, I am not a part of the OTP group or developing Erlang syntax, so
>>> it feels a bit awkward to defend it and be forced to come with
>>> motivations and proofs for being right.
>>>
>>> So - this is my last post on this subject.
>>>
>>>
>>> /Roland
>>>
>>>
>>>
>>>
>>> On Sun, 9 Nov 2014 13:23:59 +0100
>>> Mattias Waldau<mattias.waldau@REDACTED> wrote:
>>>
>>>> Hi All,
>>>>
>>>> I think the discussion went overboard. I made a small typo, forgetting a single comma in a static list.
>>>>
>>>> I know realize that
>>>>
>>>> #rec{}#rec{}
>>>>
>>>> is correct syntax, and I do not understand why it should be.
>>>>
>>>> Why not just say that it isn't ok? Who needs this syntax, except a advanced macro?
>>>>
>>>> /mattias
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20141109/7848f9d5/attachment.htm>
More information about the erlang-bugs
mailing list