people[name=="Andrew"].friends ~= peter
antonio
antonio at abrevia.net
Fri May 5 16:35:30 PDT 2006
Daniel Keep escribió:
> antonio wrote:
>
>> As I introduced in http://www.dsource.org/forums/viewtopic.php?t=967
>> object relations could be seen as hierarchycal structures.
>>
>> ¿Why not to introduce native syntax to "navigate into"/"Selec from" this
>> kind of hierarchies?
>>
>>
>> ex 1: Add Peter to the friends of people named Andrew and older than 18.
>>
>> Person peter = ...;
>> Person[] people = ...;
>>
>> people[name=="Andrew" && age>18].friends ~= peter;
>>
>>
>>
...
>> ---
>>
>> The main discussion about this idea was focused in 2 points:
>> 1. "dot" or "not dot":
>> people[.married && .age>18]
>> vs
>> people[married && age>18]
>>
>> "not dot" is more "D" syntax compliat (thanks to csaul).
>>
>> 2.Array syntax vs "Template" syntax:
>> people[married && age>18]
>> vs
>> people![married && age>18]
>>
>> Personally, I prefer "Array syntax":
>> Person p = people[5];
>> Person[] p = people[3..5]; // 3..5 is a "condition"
>> Person[] p = people[5]; // ¿why not?
>> Person[] p = people[married];
>> Person[] p = people[age>18 && married];
>>
>>
>>
...
> As I said, I agree with the idea: it's a very nice piece of syntactic
> sugar. The problem is with the syntax you've chosen. One of D's
> strengths is that the grammar is context-free, making it easy to implement.
>
> But, without knowing anything about context, what does this mean:
>
> people[i]
>
> Well, if "i" is an integer, then it's indexing the array. If "i" is a
> member of the elements of the people array, then it would be a
> conditional expression. But what if it's a member, and "i" is an
> integer? Is it a conditional or an index then?
>
integer expresion refers always to the index. a char[] expresion refers
to a key (associative array), etc...
> And what if both are defined?
>
class Person {
public in i;
}
void main( ) {
int i;
Person p = new Person();
with( p ) {
i = 5; // property of p
.i = 3; // dot signifies: one level out of this scope... the int
i declared one.
}
}
then
people[i] for member
people[.i] for out of scope declared integer
> Even if the compiler can work out a way to distinguish this, the syntax
> in its current form looks very hard for humans to parse in certain
> fringe cases.
>
> As you said, an alternative is "templateish" syntax:
>
> people![i]
>
> I like this more, since it's *explicit* about what's going on. That "!"
> means "Hey, don't actually index the array; select elements of it only".
>
Yes... I think explicit yntax is really more clean:: *you convinced to
me :-)*
Let's go with the new proposed syntax:
_*STEP 0*: drinking from oter sources... XPATH syntax..._
xmlNode.SelectNodes("tagNameA[conditionA]/tagNameB[conditionB]")...
* "[condition]" signifies: evaluate this condition on left side
tagNode contents.
* When no condition is imposed XPath assumes "[true]";
then xmlNode.SelectNodes("*tagNameA/tagNameB[conditionB]*") is
equivalent to
xmlNode.SelectNodes("*tagNameA[true]/tagNameB[conditionB]*")...
_*STEP 1*: lets propose something:_
The syntax used by the XPath D expression must be "autodefined", becuse
whe dont want to use the "xmlNode.SelectNodes( ... )" method :-p. One
solution is using specific *![Condition]* that defines "this is an XPath
condition"...
.
*AggregateExpression*![*condition*] signifies: evaluate the condition on
left side aggregated elements and build an aggregated result with
elements that passed condition (the result could be a dynamic array)
_*STEP 2* : what to do with not aggregate expressions :-(_
*
ex:
*Person[] youngGrandmothers = people![childs.length!=0].*mother![age<36]*
*NotAggregateExpression*![*condition*] signifies: evaluate the condition
on left side Element and build a dynamic result array with 0 or 1
elements (depending on the condition evaluation result).
_*STEP 3:* whe have to use ![] in all hierarchy node:_
ex:
// whe can asume than *![] is equivalent to ![true]*
countries![population>10000000].people![age<3].mother![].mainHome![].rooms![windows>2]
**
some exceptions: the last hierarchy node doesn't need to be followed by
the ![] in some cases:
* When the node is a Method:
ex:
people![married].*doSomething();*
**
* When the node is a property and it's on the left side of an
assignment
ex:
people![married]*.name = "Peter";*
people![married]*.childs ~= new Person();*
people![birdtha=today]*.age++; *// This introduce an
implicit right side assignment property evaluation... I suppouse
this is an "exception" because compiler can solve this easily.
_*STEP 4: *right side must be a member. _
Expression![condition].*member*
**
_*STEP 5:* How compiler expands this expression._
I suppouse Walter must decide between a preorder or inorder evaluation
* preorder: first all parents, then their childs :
A![].B![].C![]
could be evaluated like this:
foreach(a in A)
tmpA~=a;
foreach(a in tmpA) foreach(b in a.B)
tmpB~=b;
foreach(b in tmpB) foreach(c in b.C)
tmpC~=c
* inorder: first parent, then their chids... when childs evaluated
next parent... and so on
A![].B![].C![]
could be evaluated like this
foreach(a in A)
foreach(b in a.B)
foreach (c in b.C)
Well... I'm not an expert, but how hierarchy is evaluated is a compiler
work and programmer must be isolated about the compiler solution.
We can assume than *result elements order can't be predicted* (like
realtional model). Results needs to be postprocessed (distinct, sort,
...) if needed.
> At any rate, nice proposal, and I look forward to seeing something come
> of it :)
>
>
I agree... this is, basically, my dream: People writes constantly FOR +
IF structures that can be easily expressed with this propossal.
> Oh, one other thing that suddenly occured to me: what if "people" isn't
> an array? You use 'foreach' in your expansions, but what if "people"
> CAN be iterated over, but isn't an array in of itself? Then the syntax
> becomes downright misleading!
>
D propose an standard implementation for "aggregate" classes... the main
goal now is to propose something D compatible:
* Is there a standard I_Iterable interface?
* foreach( ) recognizes this I_Iterable interface?
* Array acomplish with the I_Iterable interface?
I_Iterable is not part of D programming Language.... and this is another
discussion :-):
* It could be perfect some standard Interfaces recognized by the
compiler, like c# foreach or using staments (IIterable and
IDisposable interfaces).
> P.S. Your English is better than many people I've seen who don't know
> any other languages. Also, that upside-down "?" is nifty :)
>
Spanish sintax :-). thanks a lot
Antonio
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20060506/6aad675d/attachment.html>
More information about the Digitalmars-d
mailing list