gpt4 book ai didi

module - 查找本地编译的 Raku 模块

转载 作者:行者123 更新时间:2023-12-03 17:17:47 24 4
gpt4 key购买 nike

如何找到已经安装在本地的模块,我可以use在 Raku 程序中?
假设我们有三个分布: parent 、兄弟、姐妹。家长“提供”Top.rakumod , 而 Brother 和 Sister 分别提供 'Top::Son.rakumod' 和 'Top::Daughter.rakumod'。 sibling 在他们的 META6.json 中有一个 'depends': 'Top'。
每个发行版都在自己的 git repo 中。并且每个都是由zef安装的。
假设 Top 设置为具有接口(interface)方法的类,可能类似于:multi method on-starting { ... } ,每个子类都必须实现,并且在运行时为调用者​​提供有关子类的信息。所以Top::BrotherTop::Daughter实现on-starting .也可能有分布Top::Aunt等等,这些不是本地安装的。我们需要找到安装了哪些。
所以,现在我们运行一个 Top 实例(在 Parent 中定义)。它需要寻找与 Top::* 匹配的已安装模块.开始的地方(我认为)是$*REPO ,它是包含已安装模块的存储库的链接列表。 $*REPO 还具有 CompUnit::Repository 角色,而后者又具有“需要”方法。
我不明白的是如何操作 $*REPO 来获取所有匹配 Top::* 的候选模块的列表,沿着整个链表。
获得候选人名单后,我可以使用 ^can检查它有一个on-starting方法,然后调用该方法。
如果这不是获得 Top 发现本地安装的模块的结果的方法,我会很感激我刚刚提出的方案的一些替代方案。

最佳答案

CompUnit::Repository (CUR) 有一个 candidates搜索分布的方法,但它不允许按名称前缀进行搜索(因为它还进行快速查找,需要全名来获取其 sha1 目录/查找)。对于 CompUnit::Repository::FileSystem (CURFS) 您可以调用.distribution得到分布是提供的,对于CompUnit::Repository::Installation (CURI) 您可以调用.installed获得它提供的所有发行版:

raku -e '                                                                                        \
say $*REPO.repo-chain \
.grep(CompUnit::Repository::FileSystem | CompUnit::Repository::Installation) \
.map({ $_ ~~ CompUnit::Repository::FileSystem ?? $_.distribution !! $_.installed.Slip }) \
.grep(*.defined) \
;'
如果要匹配命名空间,则需要对发行版名称或其模块的名称进行 grep:
my @matches = @distributions.grep({ $_.meta<provides>.keys.first({.starts-with("Top::")}) });
这种处理方式可以看 Pluggable模块(如果您还想加载此类代码,我建议使用它)
当然,您明确要求只安装模块,但忽略 CURFS 没有任何意义——作为应用程序开发人员,它不应该关心模块的加载位置或方式。如果有人想使用 -I ./foo而不是安装它,没有充分的理由忽略它。如果您仍然坚持这样做,那么如何更改上面的示例以适应这一点应该很明显。

Once I have the list of candidates, I can use ^can to check it has a on-starting method, and then call that method.


除了检查元文件或啜饮各种文件的源代码之外,拥有候选人名单不会让您做任何事情。至少你会加载你想调用的任何模块,例如 .^can首先,这将涉及一些步骤,分发对象不能直接用于加载(您从中提取全名并使用它来加载它) - 所以我再次建议使用 Pluggable

关于module - 查找本地编译的 Raku 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66615906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com