【问题标题】:Perl6 REPL usagePerl6 REPL 用法
【发布时间】:2018-05-01 16:13:31
【问题描述】:

是否可以让 (Rakudo) Perl6 在将您放入 REPL 之前执行一些代码?就像 python 对“python -i”所做的那样。

例如,我想加载一些模块并可能读取一个辅助文件并从​​该辅助文件构建一些数据结构,然后再放入 REPL 并让用户在数据结构上做他们需要做的事情,使用REPL 作为用户界面。

这与Start REPL with definitions loaded from file 相似但不同,尽管这个问题的答案可能会满足那个问题。基本情况是,在任何程序执行结束时,解释器不会退出,而是将用户留在 REPL。除了为交互式程序提供漂亮的、内置的、基于 Perl6 的用户界面外,它还提供了一个很好的工具,可以用来调试否则会因错误而退出的代码。

编辑:

选择 Zoffix 的解决方案作为正确的(到目前为止)解决方案,因为它是唯一满足所述所有要求的解决方案。希望此功能能够添加到编译器或语言规范中。

【问题讨论】:

标签: read-eval-print-loop raku


【解决方案1】:

您可以使用-M 开关加载模块。

$ perl6 -MJSON::Tiny

To exit type 'exit' or '^D'
> to-json Array.new: 1,2,3.Str
[ 1, 2, "3" ]
> 

如果你想运行其他代码,目前你必须先把它放到一个模块中。

$ mkdir lib
$ echo 'our $bar = 42' > lib/foo.pm6
$ perl6 -Ilib -Mfoo

To exit type 'exit' or '^D'
> $bar
42
> 

【讨论】:

  • 我想知道直接调用 REPL 代码会有多困难。这将允许perl6 -e 'init code; repl' 之类的东西,甚至可能是一个命令行参数,表明在退出之前回退到 REPL。
  • 我正在寻找的特定行为是全局命名空间,它具有可供 REPL 用户使用的填充数据结构。这就是引用的 Python 行为“python -i”完成的工作。
  • @JasonDoege 这就是答案的后半部分所显示的。如果有一个参数总是在 REPL 模式下启动它会更好,这样您就可以使用 -e 来设置初始状态,就像之前对此答案的评论所暗示的那样。我明白我写的东西可能不像 Python 那样好用和好用,但它是目前最接近的,不需要做很多工作。
  • 这是否让我传入命令行参数(例如 foo 将读取和解析以构建 REPL 用户将访问的数据结构的文件名以及 foo 将用于调整其行为的标志?)
【解决方案2】:

我想提供一个 Zoffix 在 IRC 上给出的答案。它满足基本要求,但远非漂亮,它使用的 NQP 没有用户支持,也不能保证未来的 NQP API(“nqp::*”调用)并且可以在没有警告的情况下更改。

replify 「
  say 'Hello to your custom REPL! Type `say $a` to print the secret variable';
  my $a = "The value is {rand}";
」;

sub replify (Str:D \pre-code = '') {
    use nqp;
    my %adverbs; # command line args like --MFoo
    my \r := REPL.new: nqp::getcomp('perl6'), %adverbs;
    my \enc := %adverbs<encoding>:v.Str;
    enc && enc ne 'fixed_8' && $*IN.set-encoding: enc;

    my $*CTXSAVE := r;
    my $*MAIN_CTX;
    pre-code and r.repl-eval: pre-code, $, :outer_ctx(nqp::getattr(r, REPL, '$!save_ctx')),
      |%adverbs;
    $*MAIN_CTX and nqp::bindattr(r, REPL, '$!save_ctx', $*MAIN_CTX);

    r.repl-loop: :interactive, |%adverbs;
}

【讨论】:

    猜你喜欢
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多