users@el-spec.java.net

[el-spec users] [jsr341-experts] Re: Identifiers with namespace

From: Kin-man Chung <kinman.chung_at_oracle.com>
Date: Wed, 15 Aug 2012 15:01:35 -0700

On 08/14/12 15:30, Mark Thomas wrote:
> On 14/08/2012 22:46, Kin-man Chung wrote:
>
>> On 08/14/12 14:18, Mark Thomas wrote:
>>
>>> On 10/08/2012 23:13, Kin-man Chung wrote:
>>>
>>>
>>>> There are some feedbacks from the public review. One of them is a
>>>> request for adding namespaces to idendifiers.
>>>>
>>>> I know CDI has been using a.b.c.d as namespaced identifiers, but that
>>>> creates ambiguities in both the syntax and semantics.
>>>>
>>>> Since we already have namespace for functions, its only logical to use
>>>> the same syntax and notation for identifiers. For example,
>>>>
>>>> ns:obj.foo denotes the property foo of an object with a
>>>> namespace ns.
>>>>
>>>> Obviously, namespaces are only allowed for top level objections.
>>>>
>>>> Note that there is an ambiguity with the ?: operator.
>>>>
>>>> What does a? b: d : e mean, a? (b:c): e or a? b: (c: d)?
>>>>
>>>> I think we already have similar problem with namespaced function in :?
>>>> operators, so maybe we can reosslve this similarily. Let think about
>>>> this more.
>>>>
>>>>
>>> Could we just define a precedence order and require use of () to
>>> change it?
>>>
>>>
>> I was thinking about this also. It probably makes sense to have
>> namespace higher precedence than :? operator.
>>
> I was leaning the other way but having thought about it some more, I
> think that is the better approach. That said, I reserve the right to
> change my mind if writing the parser is a lot easier the other way ;)
>
>
The only problem is with this, then a?b:c becomes illegal, because it is
parsed as a?(b:c), which is somewhat unexpected. So maybe the other
ways is better. :-)

You can certainly change your mind, but you better hurry before the spec
is released! :-)

Kin-man

>>>> How can we fit this into our ELResolver? When an
>>>> ELResolver.getValue(Object base, Object property) is invoked, property
>>>> is the identifier, as before, but instead of a null base, we can
>>>> encapsulate the namespace in "base". So the code will be like
>>>>
>>>> Object getValue(ELContext context, Object base, Object property) {
>>>> String namespace = null;
>>>> if (base != null&& base instance ELNameSpace)
>>>> namespace = ((ELNameSpace)base).getNameSpace();
>>>> }
>>>> ...
>>>>
>>>> What do you think?
>>>>
>>>>
>>> Seems like a bit of a hack but I don't have any better ideas right now.
>>>
>>>
>> The other option is to leave base null, and to have property a String of
>> the form "ns:foo". I think this is more nature.
>>
> Agreed.
>
> Mark
>
>