使用模块加载一组相关函数

2023-11-23

我想使用 Raku Modules 来对我经常使用的一些功能进行分组。因为这些函数都是松散耦合的,所以我不喜欢将它们添加到一个类中。

我喜欢这个主意use,您可以在其中选择应导入哪些函数,但我不喜欢导入的函数然后存储在全局命名空间中。

例如,如果我有一个文件my_util.pm6:

#content of my_util.pm6
unit module my_util;
our sub greet($who) is export(:greet) {
    say $who;
}
sub greet2($who) is export(:greet2) {
    say $who;
}
sub greet3($who) is export(:greet3) {
    say $who;
}

和一个文件test.p6:

#!/usr/bin/perl6
#content of test.p6
use v6.c;
use lib '.';
use my_util :greet2;

greet("Bob");    #should not work (because no namespace given) and also doesn't work
greet2("Bob");   #should not work (because no namespace given) but actually works
greet3("Bob");   #should not work (because no namespace given) and also doesn't work
my_util::greet("Alice");     #works, but should not work (because it is not imported)
my_util::greet2("Alice");    #should work, but doesn't work
my_util::greet3("Alice");    #should not work (because it is not imported) and also doesn't work

我想通过调用所有函数my_util::greet()而不是通过greet() only.

功能greet()定义于my_util.pm6非常接近我的要求,但因为它被定义为我们的,所以它总是被导入。我喜欢的是选择应该导入哪些函数的可能性,并且应该可以将其保留在模块定义的命名空间中(即它不会污染全局命名空间)

有谁知道,我怎样才能实现这一目标?


为了消除一些潜在的混乱......

词法范围和包符号表是不同的东西。

  1. my添加一个符号到当前词汇范围.

  2. our添加一个符号到当前词汇范围, and to the 公共符号表当前包的。

  3. use将请求的符号复制到当前词汇范围.
    这就是所谓的“导入”。

  4. The ::分隔符进行包查找 - 即foo::greet查找符号greet in the 公共符号表包装数量foo.
    这不涉及任何“导入”。

至于你想达到什么目的...

无论从何处引用,包的公共符号表都是相同的...没有机制可以使包中的各个符号在不同范围内可见。

You could使冒号成为子例程实际名称的一部分......

sub foo::greet($who) is export(:greet) { say "Hello, $who!" }
# This subroutine is now literally called "foo::greet".

...但是你不能再以正常的方式调用它(因为解析器会将其解释为上面的规则 4),所以你必须使用笨重的“间接词法查找”语法,这显然不是你想要的想:

foo::greet "Sam";          # Could not find symbol '&greet'
::<&foo::greet>( "Sam" );  # Hello, Sam!

所以,你最好的选择是……

  • 声明子例程our,并接受这样的事实:all其中可以从所有范围访问use该模块。
    Or:
  • 将公共前缀直接添加到子例程名称中,但使用无问题的分隔符(例如破折号),然后正常导入它们:
unit module foo;
sub foo-greet($who)  is export(:greet)  { ... }
sub foo-greet2($who) is export(:greet2) { ... }
sub foo-greet3($who) is export(:greet3) { ... }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用模块加载一组相关函数 的相关文章

  • 我了解 Perl 5。学习 Perl 6 比转向 Python 有什么优势? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Perl 6 如何评估真实性?

    在阅读有关 Perl 6 的内容时 我看到一个被大肆宣传的功能 您不再需要这样做 return 0 but true 但可以这样做 return 0 but True 如果是这样的话 Perl 6 中的 Truth 是如何工作的呢 在 Pe
  • 如何定义“AT-POS”方法?

    我定义了AT POS类的方法并导出 操作员 当我使用 然而 在该类的实例上 编译器忽略了我定义的运算符 这是代码 unit module somelib class SomeClass is export method AT POS ind
  • Perl6:使用俚语添加印记

    我正在尝试添加 作为 标量的别名 我认为使用俚语来实现这一点是可行的 但 perl6 doc 根本没有提到俚语 我已阅读以下内容 https perlgeek de en article mutable grammar for perl 6
  • Perl 6 的多重调度如何决定使用哪个例程?

    考虑这个程序 我在参数列表中构造了一个数组 尽管有一个接受数组的签名 但这调用了接受列表的签名 foo 1 2 3 multi foo Array array put Called Array version multi foo Array
  • Perl 6 分别捕获重复匹配组?

    我相信 Perl 6 提供了单独捕获重复组的能力 而不是早期的风格 您只能捕获最后一个组或整个匹配的组字符串 有人可以举一个很好的例子来说明如何使用 Perl 6 的这个很棒的功能吗 例如 我需要捕获此正则表达式的所有匹配组 and say
  • 如何在 Windows 上编译共享库,以便可以与 raku 中的 NativeCall 一起使用?

    我正在尝试在 Windows 上编译一个 DLL 库 可以与本地调用 https docs raku org language nativecall在乐 这是一个最小的 C 代码 my c dll c include
  • 检查列表是否为空(Raku)

    常见问题解答 在 Raku 中如何检查列表是否为空 还有比以下更惯用的方法吗 my l say l elems 0 say l say l Bool The 名单上的文档 https docs perl6 org type List推荐智能
  • Raku 中的 (Any) 是什么意思 - 特别是 ()?

    这是 Raku 的一个实验 gt my x Any gt my y 1 1 gt my a 1 2 1 2 gt my h a gt b a gt b gt say nil unless x nil 我理解了 表示数组文字 哈希文字 我也可
  • Perl 6 中有快速并行“for”循环吗?

    给定一些对 1 到 500000 之间的每个数字进行一些数学 转换的代码 我们有选择 简单的for循环 for 500000 gt i my result i 2 Str 在我的不科学基准测试中 这需要 2 8 秒 最规范的并行版本在一个P
  • 将嵌入的 Pod 打印为带 termcap 转义的格式化文本

    我正在尝试将嵌入式 Pod 作为 ANSI 文本输出到终端 在 Perl 5 中我可以使用Pod Text Termcap https metacpan org pod Pod Text Termcap use strict use war
  • 从 Native 指针中获取数据

    将数据放入 Perl 6 Native 指针中没什么大不了的 sub memcpy Pointer void source Pointer void destination int32 size is native my Blob blob
  • CommaIde 上未声明子例程“say”

    我用 CommaIde 打开了这个简单的脚本 usr bin env perl6 my str foobar say str IDE 突出显示单词 say 并显示错误 子程序说未定义 但是 如果我执行该脚本 它运行正常 其他核心方法 如 p
  • 当我尝试使用 Rakudo 运行脚本时,为什么会出现“被零除”错误?

    我刚刚构建了 Rakudo 和 Parrot 这样我就可以使用它并开始学习 Perl 6 我下载了 Perl 6 书 并愉快地输入了第一个演示程序 网球锦标赛示例 当我尝试运行该程序时 出现错误 Divide by zero current
  • 带替换的 Blob.decode 似乎不起作用

    这段代码 my or blob Blob new or ords or blob decode ascii replacement 0 strict False say 失败 Will not decode invalid ASCII co
  • 如何在Perl6中加载Perl5的Data::Printer?

    我一直在尝试加载 Perl5 模块Data Printer进入 Perl6 但我遇到了困难 我之前问过这个问题 无法使用 Inline Perl5 将 Perl5 模块导入 Perl6 https stackoverflow com que
  • 在 Ubuntu 15.10 上安装 Perl6 和 Panda。 bootstrap.pl 的问题

    我正在尝试在 Ubuntu 15 10 上安装 Panda 首先我尝试过 git clone recursive git github com tadzik panda git cd panda perl6 bootstrap pl 最后一
  • Perl 6 可以根据排序规则进行排序或比较吗?

    The cmp操作员 https docs perl6 org language operators infix cmp适用于代码编号 或者至少我认为它是这样做的 因为文档对此没有明确说明 并且没有提及任何本地化内容 我可以按照其他排序规则
  • 使用特征应用代理

    我想为一个属性编写一个特征 为它提供一个代理 这样我就可以操纵 sees 背后的值 甚至可以为 direct access在一个班级内 这就是我现在所拥有的 但正如您所看到的 实际的 get set 或 store fetch 方法从未被调
  • 使用十进制数有理数是否会影响 Perl 6 的性能

    据我了解 Perl 6 尽可能将小数实现为有理数 以避免大多数其他语言中存在的浮点问题 有人做过基准测试或了解这样做的性能损失吗 使用十进制数有理数是否会影响 Perl 6 的性能 我认为最有用的总体答案是 不 不是真的 但让我详细说明一下

随机推荐