最終的な答え
以下の「Your answer cleanup up 」セクションで説明されているコードのクリーンアップと、以下の「 Expectation alert」セクションで言及されている Pepe Schwarz の改善を組み合わせると、次のようになります。
use java::util::zip::CRC32:from<Java>;
my $crc = CRC32.new();
for 'Hello, Java'.encode('utf-8').list {
$crc.update($_);
}
say $crc.getValue();
あなたの答えはきれいになりました
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();
重要な変更点の 1 つは、追加され.list
た .
そのため、 は1 回だけ反復し、その行を含むコード ブロックにオブジェクトを渡します。'Hello, Java'.encode('utf-8')
utf8
for
for
update
However, that would require some support Perl 6 code (presumably in the core compiler) to marshal (automagically convert) the Perl 6 into a Java and if that code ever existed/worked it sure isn't working when I test with the latest Rakudo .update
.'method/update/([B)V'
utf8
utf8
buf[]
しかし、上に示したように賢明なものを追加し、それ.list
に合わせてコード ブロックを変更すると、うまくいきます。
まず、一連の整数を反復処理するステートメントになります.list
。for
次に、あなたと同じように、元のバッファ引数バージョンの代わりに Java メソッドの整数引数バージョン ( .'method/update/(I)V'
) を呼び出したところ、コードは正しく機能しました。(これは、Perl 6 オブジェクトから返された符号なし 8 ビット整数のバイナリ表現がutf8
、Java メソッドが期待するものとまったく同じであるか、自動的にマーシャリングされることを意味します。)
Another required change is that the from<java>
needs to be from<Java>
per your comment below -- thanks.
期待アラート
2015 年 1 月現在:
Rakudo/NQP に JVM バックエンドを使用する (つまり、JVM で純粋な P6 コードを実行する) だけでは、正式に本番環境で使用できると宣言する前に、さらに強化する必要があります。(これは、P6 エコシステム全体が今年受けることが予想される全面的な強化に加えてのことです。) JVM バックエンドは 2015 年に実現することが期待されます。今年は本番環境での使用が必要ですが、それは需要と、それを使用してパッチを提供する開発者が増えることに大きく依存します.
Java コードを呼び出す P6 コードは、追加のプロジェクトです。Pepe Schwarz は、この 2 か月間で速度を上げ、コードベースを学習し、コミットを開始することで大きな進歩を遂げました。彼は、この回答の冒頭に示されている明らかに優れた短縮名の呼び出しを既に実装しており、P6 と Java の型を変換するためのマーシャリング ロジックをさらに多く完成させており、フィードバックや特定の改善の要求を積極的に求めています。