- From: <bugzilla@jessica.w3.org>
- Date: Tue, 04 Nov 2014 20:57:54 +0000
- To: public-qt-comments@w3.org
https://www.w3.org/Bugs/Public/show_bug.cgi?id=26958
--- Comment #16 from Jonathan Robie <jonathan.robie@gmail.com> ---
(In reply to Michael Kay from comment #14)
> I do not want F+O discussions of operators such as map:merge to contain any
> mention of concepts like "copying" a map or array. It's a meaningless
> concept at that level.
They already do that, and even specify most of the details. For instance:
<quote>
17.1.1 map:merge
Creates a new map that combines entries from a number of existing maps.
</quote>
<quote>
17.1.8 map:remove
Constructs a new map by removing an entry from an existing map
</quote>
Sometimes this is a little confused:
<quote>
17.1.6 map:put
Creates a map that adds a single entry to an existing map, or replaces a single
entry in an existing map.
</quote>
Does it really "replace a single entry in an existing map", or does it create a
new map? Later text clarifies that a new map is created.
<quote>
The function map:put returns a new ·map· The new map contains all entries from
the supplied $map, with the exception of any entry whose key is $key, together
with a new entry whose key is $key and whose associated value is $value.
</quote>
> Specs should be testable, and there is no way of
> testing whether map:merge has copied a map or array or not, therefore the
> spec should have nothing to say on the subject.
I believe the above assertions are testable without updates. The level of
clarity we need for updates is also needed for these functions.
For instance, variable references clearly show us whether a new copy has been
made by map:merge, map:put, or map:remove. Some examples:
declare variable $element := <e/>;
declare variable $map := map { "one" : 1, "two" : 2 }
declare variable $array := [ 1, 2 ]
* Query 1 - identity of elements placed in a map
let $map1 := map { "value" : 1, "map" : $map, "array" : $array, "element" :
$element }
let $map2 := map { "value" : 1, "map" : $map, "array" : $array, "element" :
$element }
return $map1("element") is $map2("element")
If this returns 'true', then we have the same element in each case, and the map
constructor does not create a new node with a new identity, as element
constructors do.
* Query 2 - does map:put return a new map or not?
let $map1 := map { "value" : 1, "map" : $map, "array" : $array, "element" :
$element }
let $map2 := map:put($map1, "color", "white")
return $map1("color")
The reference to $map1 shows that $map2 is not a modified copy of $map1, but a
new map.
* Query 3 - does map:merge return a new map or not?
let $map1 := map { "value" : 1, "map" : $map, "array" : $array, "element" :
$element }
let $map2 := map:merge($map1, map:entry("color", "white"))
return $map1("color")
The reference to $map1 shows that $map2 is not a modified copy of $map1, but a
new map.
* Query 4 - does map:remove return a new map or not?
let $map1 := map { "value" : 1, "map" : $map, "array" : $array, "element" :
$element }
let $map2 := map:remove($map1, "value")
return $map1("value")
The reference to $map1 shows that $map2 is not a modified copy of $map1, but a
new map.
--
You are receiving this mail because:
You are the QA Contact for the bug.
Received on Tuesday, 4 November 2014 20:57:57 UTC