Thread Neugkeiten!? Modern OOP bald in Perl dank Ovids Cor (9 answers)
Opened by GwenDragon at 2022-01-24 14:08

haj
 2022-01-27 00:15
#194215 #194215
User since
2015-01-07
557 Artikel
BenutzerIn

user image
Da sprichst Du viele wichtige Punkte an!

Zu einigen kann ich auch etwas sagen:
2022-01-26T12:31:46 hlubenow
Gibt ja mehrere solcher Ansätze, wie z.B. "Moose".

Ja. CPAN:Moose war für mich ein "Game Changer". Ich war da erst skeptisch, hab's dann mal für ein paar Komponenten ausprobiert... und festgestellt, dass bei denen die Weiterentwicklung viel einfacher ist. Das wichtigste ist, dass vieles, was man im "traditionellen" Perl-OO ausprogrammieren muss, bei Moose als Deklaration hingeschrieben wird, dadurch sieht das aufgeräumter aus.

2022-01-26T12:31:46 hlubenow
Ich denke, in den Core sollte es erst, wenn man sich wirklich sicher sein kann, daß es auch das Richtige ist. Nicht, daß es eine Verschlimmbesserung wird. Die anderen Ansätze sind ja in Modulen. Das wäre zum Ausprobieren wohl erstmal besser. Und dann sehen, wie es in der Community so ankommt.

Das findet ja seit geraumer Zeit statt! CPAN:Object::Pad ist das Modul zum Ausprobieren. In den Diskussionen zu den Links, die GwenDragon geschickt hat, den Fehlermeldungen zu dem CPAN-Modul, im IRC unter #cor und gelegentlich auf reddit und anderen Foren sammelt der Autor Feedback ein. Die letzten großräumigen Änderungen kamen nach einem epischen Kommentar von Damian Conway im perl.org Blog, und inzwischen ist es als RFC bei den Perl 5 Porters eingereicht.

2022-01-26T12:31:46 hlubenow
Wichtig wäre halt, daß die Dinge dadurch nicht komplizierter und langsamer werden, so daß man das Gefühl hat, daß die alte Perl-OOP immer noch schneller und direkter ist. Dann wird die nämlich weiterhin bevorzugt.

Es wird definitiv schneller als Moose und nicht langsamer als traditionelles OO. "Im Core" heißt ja: In C implementiert. Die anderen OO-Systeme werden noch lange am Leben bleiben, weil sie jede Menge Magie dazugebastelt haben, immer wohl wissend, dass das alles "nur" Hashes und Unterprogramme sind. Diese Magie wird anfangs bei Cor fehlen.

2022-01-26T12:31:46 hlubenow
[...] Was mich stört, sind die vielen "$self->{beispiel}", die man schreiben muß. Da ist das Pendant "self.beispiel" in Python doch sehr viel einfacher zu schreiben, und es macht die Programme auch angenehmer zu lesen.

In Cor schreibt man einfach $beispiel, weil solche Objektattribute als field $beispiel; deklariert werden.

2022-01-26T12:31:46 hlubenow
Das Zweite ist der AoA-Mechanismus mit Referenzen, der schon sehr gewöhnungsbedürftig ist. "$self" selbst ist ja eine "Referenz auf einen anonymen Hash". Da muß man erstmal begreifen, was das überhaupt ist und wie man damit umgeht. Das ist wohl das eigentliche Problem. Wenn man schon in den Core eingreifen würde, dann sollte man das wohl grundsätzlich überarbeiten, damit auch solche Verrenkungen wie
Code (perl): (dl )
1
2
3
for $i (@{$self->{beispiel}}) {
    print "$i\n";
}

nicht mehr nötig wären.

In Cor wäre das:
Code (perl): (dl )
1
2
3
4
field @beispiel;
for $i (@beispiel) {
    print "$i\n";
}

Womit wir bei einem wesentlichen Unterschied zu traditionellem OO und Moose wären: Objektattribute können auch Arrays und Hashes sein.

2022-01-26T12:31:46 hlubenow
Aber wahrscheinlich geht das nicht, denn dafür ist Perl eben Perl.

Doch, das geht eben schon, wenn es "im Core" ist! Eine der großen Leistungen von Moose ist, dass es "Pure Perl" ist und auf prähistorischen Perl-Versionen läuft. Cor ist da anders und wird nur mit entsprechend aktueller Perl-Version laufen.

2022-01-26T12:31:46 hlubenow
Ansonsten, ob da nun "class" statt "package" steht, und "method" statt "sub", wäre (obwohl's schon schöner ist) nicht so wichtig, wenn die anderen Probleme nicht gelöst werden können.

Diese neuen Schlüsselwörter sind es, die field etc. möglich machen. Innerhalb eines class Beispiel { ... } oder method beispiel { ... } gelten Syntax-Regeln, die in "Pure Perl" gar nicht zu schreiben sind!

Das ist ein weiterer Unterschied zu Moose: Die "Schlüsselwörter" von Moose sind gar keine. Das sind Perl-Unterprogramme, die Moose exportiert. Deswegen kann has in einer Moose-Deklaration has beispiel => ( is => 'ro' ); auch nur das, was ein Perl Unterprogramm kann. Das wird recht geschickt mit den "fat commas" => versteckt, aber tatsächlich ist es ein Aufruf Moose::has ('beispiel','is','ro');. Ein Array als Attribut kann bei Moose deswegen nicht so geschrieben werden: has @beispiel würde die ersten Elemente des Array @beispiel an has übergeben und ziemlich zufällige Ergebnisse produzieren.

2022-01-26T12:31:46 hlubenow
In Python sind diese Punkte seit langem alle sehr gut gelöst, da steht dann nur:
Code (python): (dl )
1
2
for i in self.beispiel:
    print i

Das ist praktisch optimal, aber dafür ist Python insgesamt sehr dogmatisch, und die Community leider auch. Perl ist - bisher - offener, freier, und das schätze ich. Heute mehr denn je.

Eben - dieses Beispiel wäre in Cor auch noch kürzer:
Code (perl): (dl )
1
2
field @beispiel; # Werte sollten dann noch rein :)
print @beispiel;

View full thread Neugkeiten!? Modern OOP bald in Perl dank Ovids Cor