Perl6 REPL用法

Cal*_*ite 7 perl6 read-eval-print-loop raku

是否有可能让(Rakudo)Perl6在放入REPL之前执行一些代码?就像python一样用"python -i".

例如,我想加载一些模块,并且可能会读取一个辅助文件,并在放入REPL之前从该端文件构建一些数据结构,并让用户在数据结构上执行他们需要做的事情,使用REPL作为用户界面.

这与Start REPL类似但不同,其中定义从文件加载,但此问题的答案可能满足该问题.基本情况是,在执行任何程序结束时,解释器不会退出,而是将用户留在REPL.除了为交互式程序提供漂亮的,内置的,基于Perl6的用户界面外,它还提供了一个很好的工具,可以从中调试以错误方式退出的代码.

编辑:

选择Zoffix的解决方案作为正确(迄今为止)的解决方案,因为它是唯一满足所述要求的所有要求的解决方案.这里希望这个功能被添加到编译器或语言规范中.

Bra*_*ert 10

您可以使用-M交换机加载模块.

$ perl6 -MJSON::Tiny

To exit type 'exit' or '^D'
> to-json Array.new: 1,2,3.Str
[ 1, 2, "3" ]
> 
Run Code Online (Sandbox Code Playgroud)

如果要运行其他代码,目前必须先将其放入模块中.

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

To exit type 'exit' or '^D'
> $bar
42
> 
Run Code Online (Sandbox Code Playgroud)

  • 我想知道直接调用REPL代码有多难.这将允许像'perl6 -e'初始化代码; repl'`或者甚至是一个命令行参数,表示在退出之前退回到REPL. (2认同)

Cal*_*ite 0

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

\n\n
replify \xef\xbd\xa2\n  say \'Hello to your custom REPL! Type `say $a` to print the secret variable\';\n  my $a = "The value is {rand}";\n\xef\xbd\xa3;\n\nsub replify (Str:D \\pre-code = \'\') {\n    use nqp;\n    my %adverbs; # command line args like --MFoo\n    my \\r := REPL.new: nqp::getcomp(\'perl6\'), %adverbs;\n    my \\enc := %adverbs<encoding>:v.Str;\n    enc && enc ne \'fixed_8\' && $*IN.set-encoding: enc;\n\n    my $*CTXSAVE := r;\n    my $*MAIN_CTX;\n    pre-code and r.repl-eval: pre-code, $, :outer_ctx(nqp::getattr(r, REPL, \'$!save_ctx\')),\n      |%adverbs;\n    $*MAIN_CTX and nqp::bindattr(r, REPL, \'$!save_ctx\', $*MAIN_CTX);\n\n    r.repl-loop: :interactive, |%adverbs;\n}\n
Run Code Online (Sandbox Code Playgroud)\n