jvm - 如何从 perl6 调用 Java 方法

标签 jvm raku rakudo java-interop

use java::util::zip::CRC32:from<java>;

my $crc = CRC32.new();
for 'Hello, Java'.encode('utf-8') {
    $crc.'method/update/(B)V'($_);
}
say $crc.getValue();

可悲的是,这不起作用
Method 'method/update/(B)V' not found for invocant of class 'java.util.zip.CRC32'

此代码可在以下链接中找到。这是我能找到的唯一例子
  • Rakudo Perl 6 on the JVM (slides)
  • Perl 6 Advent Calendar: Day 03 – Rakudo Perl 6 on the JVM
  • 最佳答案

    最终答案

    将下面您的答案清理部分中解释的代码清理与下面的期望警报部分中提到的 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();
    

    一个重要的更改位是附加的 .list .
    'Hello, Java'.encode('utf-8')片段返回一个对象,一个 utf8 .该对象只返回一个值(本身)给for。陈述。所以for只迭代一次,将对象传递给带有 update 的代码块行在里面。

    如果 update 只迭代一次可能是有意义的。行是 .'method/update/([B)V' ,它映射到需要 8 位整数缓冲区的 Java 方法,这本质上是 Perl 6 utf8是。但是,这需要一些支持 Perl 6 的代码(可能在核心编译器中)来编码(自动转换)Perl 6 utf8转换成 Java buf[]如果该代码曾经存在/工作过,那么当我使用最新的 Rakudo 进行测试时,它肯定不会工作。

    但是,如果一个人附加一个明智的 .list如上所示并更改代码块以匹配,事情就解决了。

    一、.list结果 for迭代一系列整数的语句。

    其次,像您一样,我调用了 Java 方法的整数 arg 版本( .'method/update/(I)V' )而不是原始缓冲区 arg 版本,然后代码可以正常工作。 (这意味着从 Perl 6 utf8 对象返回的无符号 8 位整数的二进制表示要么已经完全符合 Java 方法的预期,要么自动为您编码。)

    另一个需要的更改是 from<java>需要from<Java>根据您在下面的评论 - 谢谢。

    预期警报

    截至 2015 年 1 月:
  • 仅仅将 JVM 后端用于 Rakudo/NQP(即在 JVM 上运行纯 P6 代码)仍然需要更多的强化才能正式宣布准备好用于生产使用。 (这是对整个 P6 生态系统今年预计将经历的全面强化的补充。)JVM 后端有望在 2015 年实现——它有望成为 Perl 6 的初始正式发布的一部分,准备就绪今年的生产使用——但这在很大程度上取决于需求以及有更多开发人员使用它并提供补丁。
  • P6 代码调用 Java 代码是一个额外的项目。 Pepe Schwarz 在过去几个月里在加快速度、学习代码库和 landing commits 方面取得了很大进步。 .他已经实现了这个答案开头显示的明显更好的短名称调用,并完成了更多用于在 P6 和 Java 类型之间转换的编码逻辑,并且正在积极征求反馈和具体改进的请求。
  • 关于jvm - 如何从 perl6 调用 Java 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27156329/

    相关文章:

    list - 如何在Raku中无限期地和懒惰地循环浏览列表?

    java - 在手机的 JME 应用程序中使用 -Xmx 和 -Xms

    java - JVM 实现的语言(如 Jython)是在底层使用 Java 还是使用 JVM native ?

    java - 不同物理机上 2 个 JVM 之间的 RMI

    mixins - for什么时候调用迭代器方法?

    gzip - Perl6 : large gzipped files read line by line

    lazy-evaluation - 是否可以使用带有惰性列表的提要?

    perl - 如何使用 Perl 6 中的 Perl 5 模块?

    raku - 在 raku 中取消绑定(bind)或取消定义变量

    java - 在 JVM 上启用逃逸分析的经验