win*_*old 7 perl chart-director raku
我正在 Raku 中重写一些 perl/图表软件,但通过 Inline::Perl5 使用 ChartDirector perl5 模块(下面的链接)遇到了问题。该模块基本上是 DLL 的 Perl 接口;通过 Inline::Perl5 使用模块似乎适用于代码中显式包含的方法调用 - 但大多数方法调用是通过 perl5 中的自动加载“捕获所有”机制执行的。这些在我的 raku 代码中不起作用。
我的问题是我可以期望这种应用程序使用 Inline::Perl5 工作吗?(也许没有办法“捕获”这些自动加载的方法调用),如果是这样,如何做到这一点。
感谢您的任何指点、建议。
工作组
ChartDirector 软件(优秀的图形/图表软件 - 已经使用 Perl 近 20 年了): https: //www.advsofteng.com/index.html
引用有关此内容的 Chartdir 论坛线程开头的措辞(简化的)、版本信息和代码:
我正在使用
Inline::Perl5它,它可以与我尝试过的所有其他模块一起使用。我在复制Chartdir 站点上的“第一个项目”示例时遇到问题。
使用chartdir 6、freebsd 12.2(intel平台)、raku 2022.04、perl 5.32.1。
#!/usr/bin/env raku
use lib:from<Perl5> '/usr/local/lib/perl5/site_perl';
use Inline::Perl5;
my $p5 = Inline::Perl5.new;
$p5.use('perlchartdir') ;
my $data = [85, 156, 179.5, 211, 123];
my $labels = ["Mon", "Tue", "Wed", "Thu", "Fri"];
my $c = $p5.invoke( 'XYChart', 'new', 250, 250);
$c.setPlotArea(30, 20, 200, 200);
$c.addBarLayer($data);
$c.xAxis().setLabels($labels);
$c.xAxis().setLabels($labels);
$c.makeChart("simplebar.png");
Run Code Online (Sandbox Code Playgroud)
$c一切看起来都很好(即,第 8 行之后的数据转储显示了一个大/合理的外观结构),直到第 9 行,我收到“没有这样的setPlotArea类型调用者的方法XYChart”。第 10 行似乎确实有效(没有抱怨) - 其余 3 行不起作用(与第 8 行的错误类型相同)。
并引用 Chartdir 的主要开发人员 Peter Kwan 提供的一些反馈:
我以前从未使用过 Raku。对于您的情况,失败的方法似乎是 AUTOLOAD 方法。...我怀疑可能是 Raku 不支持 Perl AUTOLOAD,因此它会将未定义的方法报告为未找到,而不是将其转发到“catch all”方法。或者可能需要导入一些额外的东西才能使用自动加载。
正如这个 SO 问题下面的评论中的 dwarring 所指出的那样,Inline::Perl5 确实支持自动加载(并且已经支持了 7 年),所以也许这个方面是一个红鲱鱼?
非常感谢 p6steve 的回复,我提供了一些额外的信息..
$c(XYChart 对象)的各种表示形式的完整输出包含在此处: https: //pastebin.com/gY2ibDaM (希望可以使用pastebin来实现此目的(仍在通过stackoverflow找到我的方法)) - 输出为600 + 行很长,不确定我可以有效地编辑什么)。
总结一下..
dd $c 返回 nil (尽管将 $c.perl (如下)的等价物打印到标准输出(不知道为什么))
说 $c.perl 返回:
XYChart.new(inline-perl5 => Inline::Perl5.new(thread-id => 1),wrapped-perl5-object => NativeCall::Types::Pointer.new(34651088744))
说 $c.^methods 返回:
(其中 addHLOCLayer 接受为什么可以新 isa rakuseen 定义 getYCoor addHLOCLayer3 raku yZoneColor Numeric addLineLayer addAreaLayer DESTROY BUILDALL gist perl WHICH sink bless getYValue Str addBarLayer new_shadow_of_p5_object AT-KEY)
最后,假设 Dump $c (使用 Data::Dump 模块)会产生大约 600 行输出(包含在 Pastebin 输出中)。
嗨 wingfold,欢迎来到 raku SO 标签!
dd $c;我想知道您在该行之前得到了什么$c.setPlotArea(30, 20, 200, 200);- 例如 $c 真的是 XYChart 对象吗?
如果是这样,那么是什么$c.^methods(“^”表示元方法......在这种情况下,您应该获得可用方法的列表)。
请在此发布结果,希望这将有助于诊断......
谢谢(你的)信息!
看到 $c.^methods 调用的输出后,很明显 $c 没有方法$c.setPlotArea(阅读错误消息也是如此 - 也许我应该给予应有的重视!)
我不太了解 Inline::Perl5 模块,但我在 Inline::Python 中看到过类似的问题。
我在 Python 方面的经验是,目标语言对象仅公开它们的“直接”方法,并且不会自动提取它们可以执行的所有组合方法。
我的解决方法是采用“eval”风格的方法,例如:
$p5.run( qq[$c.setPlotArea(30, 20, 200, 200);] );
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!