[m-dev.] Is this a bug?
Julien Fischer
juliensf at csse.unimelb.edu.au
Mon Jun 18 13:59:45 AEST 2007
On Mon, 18 Jun 2007, Ralph Becket wrote:
> Ralph Becket, Monday, 18 June 2007:
>> I'm trying to use field update syntax to update a map of maps, but it
>> isn't working:
>>
>> ::: map_map_update_test.m :::
>>
>> :- module map_map_update_test.
>> :- interface.
>> :- import_module io.
>>
>> :- pred main(io::di, io::uo) is det.
>>
>> :- implementation.
>> :- import_module map.
>>
>> main(!IO) :-
>> A0 = map.init,
>> A = A0 ^ elem(42) ^ elem(99) := 123,
>> io.write_int(A ^ det_elem(42) ^ det_elem(99), !IO),
>> io.nl(!IO).
>>
>> ::: end of map_map_update_test.m :::
>
> Ah, I've understood the problem:
>
> A = A0 ^ elem(42) ^ elem(99) := 123
>
> expands according to the following rule in the reference manual
>
> transform(Term ^ Field(Arg1, ...) := FieldValue) =
> 'Field :='(Arg1, ..., Term, FieldValue)).
>
> transform(Term0 ^ Field(Arg1, ...) ^ Rest := FieldValue) = Term :-
> OldFieldValue = Field(Arg1, ..., Term0),
> NewFieldValue = transform(OldFieldValue ^ Rest := FieldValue),
> Term = 'Field :='(Arg1, ..., Term0, NewFieldValue).
>
> The OldFieldValue uses the `elem' field access function which is
> semidet.
>
> This is somewhat counterintuitive.
How so? If there were two updates being done, then shouldn't I
expect to see two `:='s.
Julien.
--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to: mercury-developers at csse.unimelb.edu.au
Administrative Queries: owner-mercury-developers at csse.unimelb.edu.au
Subscriptions: mercury-developers-request at csse.unimelb.edu.au
--------------------------------------------------------------------------
More information about the developers
mailing list