[Vienna-pm] Hausbackene Syntaxerweiterung mit Perl5?

Josef Schmid e9427749 at stud4.tuwien.ac.at
Wed Apr 30 07:01:21 PDT 2008


Hi, allerseits!

Fühl mich mal wieder aufgerufen, auch meinem Senf dazuzugeben...

Robert Barta schrieb:
> On Wed, Apr 30, 2008 at 08:20:23AM +0200, Thomas Klausner wrote:
[...]
>> 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 ....

Hmm, mal sehen
wenn ich from ala "sub from (\$*\@*$*$);" deklarier,
dann könnte ich mal

my @students =();
freevars my $s;
my @cleverlies = from $s,in, at students,
                   where,$s->{marks} > 85,
                   select,$s->{matrikelnr};

schreiben, was aber
a) die zusätzlichen "," sehen ¬ gerade hübsch aus &
b) damit ich mit $s auch was anfangen kann, brauch
    ich noch was, z.B. ala sub freevars (\$;\$\$\$....)
c) keine Ahnung wie ich die extra "keywords" überprüfe
    (aber vielleicht könnte, dass wer posten)

Hmm 2. Versuch:
sub from (\$$);
sub in (\@$);
sub where ($$);
sub select ($); # mal abgesehen davon, daß es eh schon ...

freevars my $s;
my @cleverlies = from $s, in @students,
                  where $s->{marks} > 85,
                  select $s->{matrikelnr};

a) etwas weniger störende zusätzliche Beistriche.
b) dafür den Namensraum etwas mehr,
    mit "nichtssagende" Funktionsnamen verschmutzt.
c) immer noch Trick um mit $s was anfangen zu können
    nötig.

Hmm 3. Versuch:
Da uns der '&'-Prototyp nur was hilft wenn er an 1. Stelle steht...
müssten wir den Sytax abändern, z.B.
select { $a->{matrikelnr} } where { $a->{marks} } from @students;

Hmm, 4. Versuch:
Da wir ohnehin bei Versuch 1+2. wahrscheinlich um Operatorüberladung
¬ herumkommen, um where & select als Ausdruck wiederzubekommen.
Hmm, hmm, ...
...
<am kopf kratz/>
...
...

Also zu Versuch *Nr 5*:

my @cleverlies = do { from my $s, in @students;
                       select { $s->{matrikelnr} }
                       where { $s->{marks} > 85 }
                     };

Das hätte den vorteil das man die Namensraumverschmutzung
einschränken könnte.
Ein Trick den ich bisher noch nirgends angewandt gesehen habe.
<tamtam>
   my @cleverlies = do { use linq; .... }
   # %^H und so
   und auch noch ausbaufähig
</tamtam>

Noch 'ne Möglichkeit:
   freevars my $s;
   my @c=from($s)->in(@students)
             ->where($s->{marks}> 85)
             ->select($s->{matrikelnr});

...

>> 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. [...]
> <loud-thinking>
> 3) Bei preprocessors habe ich immer das Problem, dass sie nicht
>    leicht immer miteinander kombinierbar sind.

Neben Filter::Simple gibt es noch:
Module::Compile, Filter::Simple::Compile
und dann muss man aber noch Perl5 parsen: Parse::* oder PPI oder ...
<finger kreuz />


pfiateng,
   Jos "hoffentlich niemanden verschreckt" ef




More information about the Vienna-pm mailing list