[Vienna-pm] Hausbackene Syntaxerweiterung mit Perl5?

Roland Giersig rgiersig at cpan.org
Mon May 5 07:41:46 PDT 2008


Mein Beileid, wenn das dein Job ist, für .NET eine Umsetzung zu finden...

Das größte Problem scheint zu sein, dass die Listen-Operatoren in Perl 
rechts-nach-links funktionieren und .NET OO-mäßig links-nach-rechts, 
also verkettete Methodenaufrufe. Aber das kann man nachbilden:

@cleverlies = from(@ListOfObjects)
               ->where({$_->score() > 85})
               ->select({$_->matrikelnr()});

from() baut ein Objekt aus den Argumenten und die Methoden führen dann 
die Operationen durch, wobei sie Code-Refs als Parameter nehmen. Damit 
lässt sich alles nachbilden, da .NET eine normale OO-Syntax hat. Leider 
gibts noch kein Object::DotNet::Query auf CPAN...

Falls es nicht so strikt sein muss, kommt man wie gesagt mit dem 
Umdrehen der Reihenfolge und Aliasen für grep und map wahrscheinlich 
recht weit, insbesonders wenn man List::Utils einbezieht.

LG, Roland

Robert Barta wrote:
> On Wed, Apr 30, 2008 at 05:21:33PM +0200, Robert Barta wrote:
>> On Wed, Apr 30, 2008 at 04:26:19PM +0200, Roland Giersig wrote:
>>> und wie schaut das aus?
>>>
>>> @cleverlies = select {$_->{matrikelnr}} where {$_->{marks} > 85} from 
>>> @students;
>>>
>>> extra bonuspunkte für diejenigen, die jetzt lachend am boden liegen, 
>>> weil sie die implementation von select, where und from schon vor augen 
>>> haben... ;o)
>> Ja. Lustig. ;-/
> 
> Fuer alle, die lustig aus der Huefte schiessen: Es geht um diese
> Liste von Operatoren:
> 
>   http://download.microsoft.com/download/5/8/6/5868081c-68aa-40de-9a45-a3803d8134b8/standard_query_operators.doc
> 
> \rho
> 
>>> Robert Barta wrote:
>>>> On Wed, Apr 30, 2008 at 12:02:52PM +0200, Roland Giersig wrote:
>>>>> Oder das alles nur per SQL abhandeln, mit DBI und einer in-memory SQLite 
>>>>> DB im Hintergrund.
>>>> Um SQL geht's eigentlich nicht...
>>>>
>>>>> Der Punkt ist: für wen sind diese Syntax-Überlegungen? Für einen 
>>>>> Maintainer, der mehr SQL als Perl versteht?
>>>> ... sondern um einen Weg (persistente) Collections ueber _ein und
>>>> denselben_ Mechanismus anzusprechen. D.h. bei
>>>>
>>>>   @collection = from $s in @students .....
>>>>
>>>> ist es fuer den Programmierer egal, ob die Studis aus einer SQL
>>>> Datenkrank, aus dem memory oder einem XML Dokument, oder einem RDF
>>>> Graphen geholt werden.
>>>>
>>>>> Dem tust du keinen Gefallen, 
>>>>> wenn du ihm SQL-ishe Perl-Syntax bietest, die dann doch nicht genau SQL 
>>>>> ist. Da bist du besser dran, wenn du ihm einen Vereinfachungs-Wrapper um 
>>>>> DBI schreibst, sodass die Operationen echtes SQL sind.
>>>> Right. Aber fuer das gibt's ja schon nen Haufen.
>>>>
>>>> \rho
>>>>
>>>>> Robert Barta wrote:
>>>>>> On Wed, Apr 30, 2008 at 08:20:23AM +0200, Thomas Klausner wrote:
>>>>>>>> auf in-memory Objekte, relational DBs, XML structures, und - das
>>>>>>>> interessiert mich hier hauptsaechlich - auf Topic Map und RDF KBs
>>>>>>>> zugreifen kann. LINQ ist nun Teil von C# (das langsam Perl6 immer
>>>>>>>> aehnlicher wird, naja langsam).
>>>>>>> Naja, in Perl ist dieser Zugriffsmechanismus halt map, grep, each, etc, 
>>>>>>> mit dem man auf in-memory Objekte, DBs, XML, ... zugreift.
>>>>>> D.h., ich koennte das 1) einmal sehr Perl-ish angehen und etwas an
>>>>>>
>>>>>>    Tie::Array
>>>>>>
>>>>>> binden. Oder ...
>>>>>>
>>>>>>> In deinem konkreten Fall:
>>>>>>>
>>>>>>>>   my @students = ....;
>>>>>>>>   my @cleverlies = from $s in @students
>>>>>>>>                    where $s->{marks} > 85
>>>>>>>>                    select $s->{matrikelnr};
>>>>>>> koenntest du schon eine sub from { } machen, die die Parameterliste 
>>>>>>> durchgeht, andere "keywords" wie 'where' und 'select' identifziert, 
>>>>>> .... 2) 'from' in the namespace laden, oder ....
>>>>>>
>>>>>>> From: Stefan Weiss <spaceman at foo.at>
>>>>>>> Um deinen Sourcecode so umzuschreiben, dass nachher Perl rauskommt,
>>>>>>> schau dir mal die Source Filter in "perldoc perlfilter" an, oder das
>>>>>>> Modul Filter::Simple.
>>>>>> .... 3) ein Praeprozessor einschieben.
>>>>>>
>>>>>> Klingt alles gangbar. Ich haette auch nicht notfalls vor
>>>>>>
>>>>>>   @collection = new LINQ::TM ('from ...');
>>>>>>
>>>>>> zurueckgeschreckt.
>>>>>>
>>>>>> <loud-thinking>
>>>>>> 3) Bei preprocessors habe ich immer das Problem, dass sie nicht
>>>>>>    leicht immer miteinander kombinierbar sind.
>>>>>>
>>>>>> 2) mit dem 'from' als Routine muss man analysieren, ob die Parameterliste
>>>>>>    mit der Syntax, die ich erreichen will, halbwegs kompatibel ist. Bei
>>>>>>
>>>>>>      $s->{marks} > 85
>>>>>>
>>>>>>    hab ich schon das Problem, dass Perl das fuer mich auswerten will, bevor
>>>>>>    'from' zum Zug kommt.
>>>>>>
>>>>>> 1) Tie::Array ist halt SEHR perl-ish. Not bad per se, aber nicht Sinn der
>>>>>>    Uebung hier.
>>>>>>
>>>>>> </loud-thinking>
>>>>>>
>>>>>> \rho
>>>>>>
>>>>>> _______________________________________________
>>>>>> Vienna-pm mailing list
>>>>>> Vienna-pm at pm.org
>>>>>> http://mail.pm.org/mailman/listinfo/vienna-pm
>>>>>>
>>>>> _______________________________________________
>>>>> Vienna-pm mailing list
>>>>> Vienna-pm at pm.org
>>>>> http://mail.pm.org/mailman/listinfo/vienna-pm
>>>>>
>>> _______________________________________________
>>> Vienna-pm mailing list
>>> Vienna-pm at pm.org
>>> http://mail.pm.org/mailman/listinfo/vienna-pm
>>>
>> _______________________________________________
>> Vienna-pm mailing list
>> Vienna-pm at pm.org
>> http://mail.pm.org/mailman/listinfo/vienna-pm
>>
> 


More information about the Vienna-pm mailing list