[Swift-devel] multiple arguments
Ben Clifford
benc at hawaga.org.uk
Fri May 4 06:15:07 CDT 2007
On Wed, 2 May 2007, Ben Clifford wrote:
> The semantics of these 'multiple valued' language constructs ([*] and how
> that passes through @filenames, for example) seems (still) quite poorly
> defined...
So I thought about this for a while.
I believe that the problem is there is a tension between C/Java like
structure/array access constructs (which is the syntax, but not
necessarily the semantics, that SwiftScript uses) and XPath-like XML
selection constructs (which is the semantics that let you write [*]).
That tension for the most part has not been a problem in the way that
we've written code so far, except in the presence of [*].
In the C/Java like model, an expression like
v
or
v.image
identifies exactly one entity - in the first case to a variable v, in the
second case (assuming that v is a structure) to the unique element of the
structure in variable v that is called image.
In the XML/XPath model, we can make similar looking expressions, such as:
v/image.
However, XPath expressions do not identify exactly one entity. XPath
expressions select nodes in an xml document; the identified entities are
XML nodes. But they are not constrained to selecting exactly one node.
They can select none, or they can select one, or they can select many.
Consider the XPath query: v/image when applied to the XML document:
<v>
<image>theimage</image>
<header>theheader</header>
</v>
The above query will select the node <image>theimage</image>
However, consider the same query with the document:
<v>
<image>theimage</image>
<header>theheader</header>
<image>more</image>
<foo>bar</foo>
</v>
The query will select two nodes. One of the nodes selected will be
<image>theimage</image> and the other will be <image>more</image>.
We have not uniquely identified an entity. We have selected several.
Similar things happen if we use what Swift refers to as arrays. Consider
an XML document like this:
<lifeforms>
<foo>tree</foo>
<foo>plant</foo>
<foo>fish</foo>
<foo>dog</foo>
</lifeforms>
We can say lifeforms[1] and have the element <foo>plant</foo> uniquely
identified.
or we can say lifeforms[*] and have all four foo elements selected.
But what is the 'value' and 'type' of lifeforms[*], for the purposes of
feeding into other swift expressions?
When we say lifeforms[1] we can say the 'value' is the uniquely selected
node <foo>plant</foo>, and that lifeforms[1] evaluates to
<foo>plant</foo>.
But there is no definition of 'value' at the moment in SwiftScript for
expressions like this that select multiple expressions. And without a
definition of what the value of such an expression is, then we can't use
such an expression as a value to pass into some other bigger expression,
for example @filenames(lifeforms[*]).
One solution is to define a data type that can hold (as a single value)
the complete set of results (for example an unbounded sequence of XML
<any>, or in something more like SwiftScript syntax any[] ).
This would allows expressions such as lifeforms[*] to return a single
value (an instance of the above type, containing all of the selected
nodes) and would give a stronger formalisation of what expressions like
@filenames(lifeforms[*]) actually mean.
There may be other ways, which I'd be interested to hear about.
--
More information about the Swift-devel
mailing list