如何在 REPL 中获得 "help" 功能

How to get a "help" functionality in REPL

当我使用 REPL 时,有时我需要查看函数的运行方式,例如splice。我通常去文档网站。但我并不总是有互联网,如果我可以直接在 REPL 中写 help("splice") 或其他东西(例如 splice?)并查看结果,那就太好了。

然后我认为Rakudo Star附带的p6doc可以使用,因为命令行上的p6doc Array.splice提供了文档。然后我在 REPL 中这样做:

> run <p6doc Array.splice>

Proc.new(in => IO::Pipe, out => IO::Pipe, err => IO::Pipe, exitcode => 1,
         signal => 0, pid => Nil, command => ("p6doc", "Array.splice"))

但它有退出代码 1。当我使用 :out:err 捕获输出时,它们都是空字符串,但我不知道为什么。

有没有办法让 REPL 中的这种帮助功能与“运行 p6doc”或其他东西一起工作?

我用Windows10和

Welcome to ™ v2021.07.
Implementing the ™ programming language v6.d.
Built on MoarVM version 2021.07.

您的具体问题

当您在 REPL 中输入 run <p6doc Array.splice> 时出现的错误看起来像您因找不到命令而出现的错误。您可以通过输入 qx <p6doc Array.splice> 来确认 – 我怀疑您会收到一个错误,该错误更清楚地表明找不到 p6doc 命令。

假设这是问题所在,这听起来像是 $PATH 环境变量没有在您的 REPL 中正确设置。我不确定为什么会这样,而且我没有方便测试的 Windows 框。但是,无论如何,您应该能够通过指定 p6doc 可执行文件的绝对路径来解决这个问题。 (对我来说,这类似于 qx </home/dsock/.raku/bin/p6doc Array.splice>,但显然你会有不同的路径)。

(哦,你 可能 更好地使用 qxshell 而不是 run,尽管两者应该可以。请参阅 shell quoting 文档。)

更广泛的问题——CLI 文档生态系统的状态

正如 JJ 在评论中提到的那样,Raku 生态系统正处于从 p6doc 迁移到 rakudoc source 的过程中,而且也不是 100% 应该提供的很棒的 CLI/REPL 文档。这绝对是一项正在进行的工作,也是我们需要改进的领域。安装 rakudoc(使用 zef install 'rakudoc:auth<github:Raku>')可能会提供更好的体验,但正如我所说,这是社区仍在努力的事情。欢迎 PR!

与此同时,离线访问文档的另一种选择是在本地构建文档(raku/doc README 中的说明)和 运行 本地服务器。这需要 docker 或 perl、graphviz 和 nodejs(我们正在 努力降低这些要求)。那样的话,虽然您仍然需要切换到浏览器来查看文档,但至少 slow/no 互联网访问不会成为问题。

REPL 中信息的其他选项

您按照 help('splice') 的思路提到了函数的想法。目前不存在完全相同的东西——尽管这对于模块来说是个好主意。但是 Raku 确实提供了丰富的内省工具,它们可以提供很多相同的功能。

例如,如果您想检查提供参数的顺序,您可以列出 Array.splice 的所有 30 (!) 个签名:

for Array.^lookup('splice').candidates».signature { .say }
# if "splice" weren't a multi method, you don't need `.candidates»`

其他一些好的内省方法要知道:

  • &say.candidates».signtaure # same as above, but for independent sub/multi
  • Array.^methods».name
  • $x.VAR.WHAT # returns «(标量)» 如果 $x 被分配而不是绑定
  • Rat.^attributes».name # 所有属性(public 和私有)
  • Rat.^attributes.grep({Rat.^has_public_attribute(.name)})».name
  • Array.^mro # All classes Array inherits from
  • Array.^roles
  • Foo.WHY # returns any declarator block for the type/method/sub/attribute

最后一个值得详细说明:.WHY 打印任何 declarator pod blocks for the item – that is, any comments in the source code that were made with #| or #= (for the preceding item). It's good practice to include these doc comments in the public items that your module exports, and many modules in the Raku ecosystem do. For a variety of reasons,Rakudo 源代码不包含 #| 注释,因此 .WHY 没有用对于内置类型。

(在我的梦想世界中,我们会看到一个 REPL 命令,例如您建议的 help 将来自 rakudocs 的输出的一些过滤版本与 .WHY 自定义类型的输出,但我们还没有类似的东西。)

虽然当前内置的 REPL 没有帮助功能,但 Comma IDE 确实包含它自己的 Raku REPL(在“工具”菜单中找到,并包含在免费版本中)。站在例程名称或类型名称上时按 Ctrl+Q 将尝试为其解析文档。这包括内置函数:

还有添加了 Pod 声明器文档的模块:

虽然安装整个 IDE 只是为了在帮助下获得 REPL 可能有点过分,但我认为值得一提 - 特别是因为我遇到过使用 Comma 的人,但不没意识到它也包含 REPL!