endgültige Antwort
den Code Cleanup erklärt in der Ihre Antwort gereinigt Abschnitt weiter unten mit Pepe Schwarzs genannten Verbesserungen in der Erwartung Alarm Kombination Abschnitt unten erhalten wir:
use java::util::zip::CRC32:from<Java>;
my $crc = CRC32.new();
for 'Hello, Java'.encode('utf-8').list {
$crc.update($_);
}
say $crc.getValue();
Ihre Antwort gereinigt
use v6;
use java::util::zip::CRC32:from<Java>;
my $crc = CRC32.new();
for 'Hello, Java'.encode('utf-8').list { # Appended `.list`
$crc.'method/update/(I)V'($_);
}
say $crc.getValue();
Ein wichtiges geändert Bit der beigefügten .list
ist.
Das 'Hello, Java'.encode('utf-8')
Fragment gibt ein Objekt zurück, utf8
. Dieses Objekt gibt nur einen Wert (selbst) an die for
-Anweisung zurück. So iteriert der for
nur einmal und übergibt das Objekt an den Codeblock mit der update
Zeile.
Iterieren nur einmal könnte Sinn machen, wenn die update
Linie .'method/update/([B)V'
war, die Karten auf eine Java-Methode, die einen Puffer von 8-Bit-Ints erwartet, die im Wesentlichen ist, was ein Perl 6 utf8
ist.Das würde jedoch etwas Unterstützung für Perl 6 Code (vermutlich im Kerncompiler) erfordern, um das Perl 6 utf8
in ein Java buf[]
zu marshalieren und wenn dieser Code jemals existiert/gearbeitet hat, funktioniert er sicher nicht, wenn ich mit dem Testcode teste neueste Rakudo.
Aber wenn man einen vernünftigen .list
anfügt, wie oben gezeigt, und den Code-Block ändert, um zu entsprechen, funktionieren die Dinge.
Zuerst die .list
Ergebnisse in der for
Anweisung durchlaufen über eine Reihe von ganzen Zahlen.
Zweitens, wie Sie, rief ich die Integer arg-Version der Java-Methode (.'method/update/(I)V'
) anstelle der ursprünglichen Puffer arg Version und der Code hat dann richtig funktioniert. (Dies bedeutet, dass die binäre Darstellung des unsigned 8-Bit-Integer von dem Objekt Perl 6 utf8
zurückgegeben wird, ist entweder bereits genau das, was die Java-Methode erwartet oder ist für Sie automatisch serialisiert.)
Eine weitere erforderliche Änderung ist, dass die from<java>
Bedürfnisse sei from<Java>
per Kommentar unten - danke.
Erwartung Alarm
Ab Januar 2015:
Lediglich die JVM Backend für Rakudo/NQP (dh auf einer JVM reinen P6 Code ausgeführt wird) noch mehr Härten muss, bevor es offiziell sein kann für den Produktionseinsatz bereit erklärt. (Dies ist zusätzlich zu der Allround-Verhärtung, die das gesamte P6-Ökosystem in diesem Jahr erfahren wird.) Das JVM-Backend wird hoffentlich im Jahr 2015 ankommen - es wird hoffentlich Teil der ersten offiziellen Einführung von Perl 6 sein, die bereit ist Produktionsnutzung in diesem Jahr - aber das wird weitgehend von der Nachfrage abhängen und davon, dass mehr Entwickler es verwenden und Patches beisteuern.
P6-Code aufrufen Java-Code ist ein zusätzliche Projekt. Pepe Schwarz hat in den letzten paar Monaten große Fortschritte gemacht, um auf dem neuesten Stand zu sein. Er lernte die Codebasis und landing commits. Er hat bereits den offensichtlich netteren Kurznamenaufruf implementiert, der zu Beginn dieser Antwort gezeigt wurde, und viel mehr von der Marshalling-Logik zum Umwandeln zwischen P6- und Java-Typen ausgeführt und bittet aktiv um Feedback und Anfragen für spezifische Verbesserungen.
FWIW, [aktuelle Diskussion java Interop auf dem Freenode-IRC-Kanal # perl6] (http://irclog.perlgeek.de/perl6/2014-11-28#i_9733083). – raiph
Fwiw, im diesjährigen Adventskalender gibt es [Towards cleaner JVM interop] (http://perl6advent.wordpress.com/2014/12/12/day-12-towards-cleaner-jvm-interoperability/). – raiph