我在Raku重写了一些perl/制图软件,但通过Inline:: perl5使用ChartDirector perl5模块(下面的链接)遇到了一个问题。该模块基本上是一个到DLL的perl接口;通过Inline::Perl5使用模块似乎对代码中显式包含的方法调用有效-但大多数方法调用都是通过Perl5中的自动加载'catch all'机制执行的。这些在我的raku代码中不起作用。
我的问题是我可以期望这种类型的应用程序使用Inline::Perl5工作吗?(也许没有办法'捕捉'这些自动加载的方法调用),如果有,如何做到这一点。
谢谢你的指点和建议。
wf
ChartDirector软件(优秀的图形/图表软件-与perl一起使用了近20年):https://www.advsofteng.com/index.html
引用chartdir论坛帖子开头的措辞(简化)、版本信息和代码:
我正在使用
Inline::Perl5
,它与我尝试过的所有其他模块一起工作。我在复制"第一个项目"时遇到了问题。在chartdir站点的示例。
using chartdir 6, freebsd 12.2 (intel platform), 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");
一切似乎都很好(即,数据转储
$c
在第8行之后显示了一个大的/合理的结构),直到第9行,我收到&;没有这样的方法setPlotArea
为XYChart
类型的invocant &;。第10行似乎可以工作(没有抱怨)-其余3行不行(与第8行相同类型的错误)。
引用了chartdir:
的主要开发者Peter Kwan给出的一些反馈我以前从未使用过Raku。对于您的情况,失败的方法似乎是autolload方法. ...我怀疑可能是Raku不支持Perl AUTOLOAD,所以它报告未找到未定义的方法,而不是将其转发给"catch all";方法。或者可能需要导入一些额外的东西才能使用autolload。
就像小矮子在这个问题下面的评论中指出的那样,Inline::Perl5确实支持自动加载(并且已经支持了7年),所以也许这方面是转移注意力?
感谢回复p6steve的回复,我提供了一些额外的信息…
$c (XYChart对象)的各种表示的完整输出包括在这里:https://pastebin.com/gY2ibDaM(希望可以使用pastebin(仍然通过stackoverflow找到我的方式))-输出有600多行长,不确定我可以有用地编辑掉什么)。
总结一下……
dd $c返回nil(尽管打印出等价的$c)。Perl(下面)到stdout(不知道为什么))
说$ c。perl的回报:
XYChart。新(inline-perl5 =比;内联::Perl5。新(线程id =比;1)、wrapped-perl5-object =>NativeCall::类型::Pointer.new (34651088744)
说$ c。^方法返回:
(WHERE addHLOCLayer接受为什么新的isa rakuseen可以定义getYCoor addHLOCLayer3 raku yZoneColor数字addLineLayer addAreaLayer DESTROY BUILDALL gist perl sink bless getYValue Str addBarLayer new_shadow_of_p5_object AT-KEY)
最后,说Dump $c(使用Data::Dump模块)产生大约600行输出(包括在pastebin输出中)。
欢迎来到raku SO标签!
我想知道你在$c.setPlotArea(30, 20, 200, 200);
行之前得到的dd $c;
-例如,$c真的是XYChart对象吗?
如果是,那么$c.^methods
('^'表示元方法…在这种情况下,您应该得到一个可用方法的列表。
请在这里张贴结果,希望这将有助于诊断…
谢谢你的信息!
看到$c的输出。^方法调用,很明显,$c没有方法$c.setPlotArea
(读错误消息说的是一样的-也许我应该给它应有的权重!)
我不太了解Inline::Perl5模块,但我在Inline::Python中看到过类似的问题。
我在Python中的经验是目标语言对象只公开它们的"直接"方法,并且不会自动拉入它们可以执行的所有组合方法。
我的解决方法是在&;eval&;样式方法,例如:
$p5.run( qq[$c.setPlotArea(30, 20, 200, 200);] );
希望这对你有帮助!