【发布时间】:2018-09-13 08:13:29
【问题描述】:
Perl 6 正则表达式/语法比 Perl 5 或相关的 Perl 兼容正则表达式(包括 Java 中的正则表达式)的结构更好、更强大且更易读。我正在寻找一种使用 Java 中的正则表达式/语法代码执行 Perl 6 代码的方法。
这是我想做的类似的常见示例:
grammar Calculator {
token TOP { [ <add> | <sub> ] }
rule add { <num> '+' <num> }
rule sub { <num> '-' <num> }
token num { \d+ }
}
class Calculations {
method TOP ($/) { make $<add> ?? $<add>.made !! $<sub>.made; }
method add ($/) { make [+] $<num>; }
method sub ($/) { make [-] $<num>; }
}
say Calculator.parse('2 + 3', actions => Calculations).made;
# OUTPUT: «5»
也许我必须在 Perl 6 中编写一个Class 并且必须为 JVM 字节码编译它,然后我才能调用它。这是一个解决方案吗?还是不可能?
也许从 Java 调用 Perl 6 太难了。还有另一个方向。在 Perl 6 中有很多内联模块,如 Inline::Python、Inline::Perl5 等等。还有一种方法可以在 Perl 6 中运行 java 代码。这是我找到的一个示例:
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();
这是从 Perl 6 开始并将大量 Java 代码绑定到一个项目的可行方法吗?但是如何从 Java 回到我的 Perl 6 代码呢?对于 Perl 5,我可以找到模块 Inline::Java::Callback 但不适用于 Perl 6。
我应该如何以专业的方式做到这一点?
【问题讨论】:
-
你真的想避免这种情况。为什么你认为你不能用 java 编写 perl 代码?
-
“更好”是什么意思?如果要运行 Java 代码,为什么不使用 Java 的现有功能?
-
回答上述所有三个 cmets。 Java 正则表达式基于 Perl 正则表达式(过去 20 年来几乎所有语言都是如此)。 Perl6 对正则表达式进行了重大改写,使其更易于阅读且功能更强大。
-
@NicoHaase 解释如何通过 P6 功能获得哪些功能,这些功能看起来像“正则表达式”(但更易于读写和任意扩展)和 可以参考 因为“正则表达式”(但在技术上属于"unrestricted grammar" 类,而不是"regular expression" 类)比正则表达式更好,ANTLR、Canopy 和堂兄弟组合起来会比a book 更多。可以说,并非所有工具都是可替代的。
-
嗨史蒂芬。我代表那些试图保持对新来者如此欢迎的人,向他们道歉。从我的角度来看,您的标题很明确,您的身体详细说明了您想要什么以及您遇到的问题。我投票决定重新开放。标签吸引标签观察者。
perl6的观察者往往比较耐心,而像java这样的高流量标签的观察者往往会草率下结论并且相对不友好。 Imo TungstenX 的 JNI 中断是唯一有用的信息。 P6 可能真的需要一个基于 JNI 的适配器。同时,timotimo 的答案及其解决方案有望满足您的迫切需求。