Использование Perl6 REPL - PullRequest
0 голосов
/ 01 мая 2018

Возможно ли, чтобы (Rakudo) Perl6 выполнил некоторый код перед тем, как отправить вас в REPL? Как Python делает с "Python -i".

Например, я хочу загрузить некоторые модули и, возможно, прочитать побочный файл и построить некоторые структуры данных из этого побочного файла перед тем, как перейти в REPL и позволить пользователю делать то, что ему нужно, для структуры данных, используя REPL как пользовательский интерфейс.

Это похоже, но отличается от Запустите REPL с определениями, загруженными из файла , хотя ответы на этот вопрос могут его удовлетворить. Основной случай состоит в том, что в конце выполнения любой программы вместо выхода интерпретатор оставляет пользователя в REPL. Помимо предоставления изящного встроенного пользовательского интерфейса на основе Perl6 для интерактивных программ, он также предоставляет хороший инструмент для отладки кода, который в противном случае завершается с ошибкой.

редактирование:

Выбор решения Zoffix в качестве правильного (пока) решения, поскольку оно единственное, которое удовлетворяет всем указанным требованиям. Мы надеемся, что эта возможность будет добавлена ​​в спецификацию компилятора или языка.

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Я хотел бы дать ответ, который Zoffix дал на IRC. Он удовлетворяет базовому требованию, но далеко не хорош и использует NQP, для которого нет поддержки пользователей, и не гарантируется API NQP (вызовы "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;
}
0 голосов
/ 02 мая 2018

Вы можете загружать модули с помощью переключателя -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
> 
...