我正在编写一个包含某些部分的绘图包,并且我的运算符和数据类型分散在整个过程中。但是我不希望用户每次都添加相应的模块,因为它会非常混乱,例如我在不同的路径中有一个Point类,一个Monoid角色和一个Style类
unit module Package::Data::Monoid;
# $?FILE = lib/Package/Data/Monoid.pm6
role Monoid {...}
Run Code Online (Sandbox Code Playgroud)
unit module Package::Data::Point;
# $?FILE = lib/Package/Data/Point.pm6
class Point {...}
Run Code Online (Sandbox Code Playgroud)
unit module Package::Data::Style;
# $?FILE = lib/Package/Data/Style.pm6
class Style {...}
Run Code Online (Sandbox Code Playgroud)
我想有一个haskell类似的前奏,lib/Package/Prelude.pm6
效果是我可以写出这样的脚本
use Package::Prelude;
# I can use Point right away, Style etc...
Run Code Online (Sandbox Code Playgroud)
而不是做
use Package::Data::Style;
use Package::Data::Point;
use Package::Data::Monoid;
# I can too use point right away, but for users not knowing the
# inner workings it's too overwhelming …Run Code Online (Sandbox Code Playgroud) 我有4个文件都在同一个目录下:main.rakumod,infix_ops.rakumod,prefix_ops.rakumod和script.raku:
main模块有一个类定义 ( class A)*_ops模块有一些运算符例程定义要编写,例如,$a1 + $a2以重载的方式。script.raku尝试A实例化对象并使用那些用户定义的运算符。为什么是 3 个文件而不是 1 个?由于类定义可能很长,并且在文件中分离重载的运算符定义似乎是编写更整洁代码(更易于管理)的好主意。
例如,
# main.rakumod
class A {
has $.x is rw;
}
Run Code Online (Sandbox Code Playgroud)
# prefix_ops.rakumod
use lib ".";
use main;
multi prefix:<++>(A:D $obj) {
++$obj.x;
$obj;
}
Run Code Online (Sandbox Code Playgroud)
和类似的例程infix_ops.rakumod。现在,在 中script.raku,我的目标是仅导入主模块并查看也可用的重载运算符:
# script.raku
use lib ".";
use main;
my $a = A.new(x => -1);
++$a;
Run Code Online (Sandbox Code Playgroud)
但它自然不会看到++多个A对象,因为 …