是否有可能让(Rakudo)Perl6在放入REPL之前执行一些代码?就像python一样用" python -i"。
例如,我想加载一些模块,并且可能会读取一个辅助文件,并在放入REPL之前从该端文件构建一些数据结构,并让用户在数据结构上执行他们需要做的事情, REPL作为用户界面。
这与Start REPL with definitions loaded from file类似但不同,尽管这个问题的答案可能会满足那个问题。基本情况是,在执行任何程序结束时,解释器不会退出,而是将用户留在REPL。除了为交互式程序提供漂亮的,内置的,基于Perl6的用户界面外,它还提供了一个很好的工具,可以从中调试以错误退出的代码。
编辑:
选择Zoffix的解决方案作为正确(迄今为止)的解决方案,因为它是唯一满足所述要求的所有要求的解决方案。希望此功能能够添加到编译器或语言规范中。
答案 0 :(得分:10)
您可以使用-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
>
答案 1 :(得分:0)
我想提供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;
}