Как перезагрузить модули, используемые в REPL? - PullRequest
0 голосов
/ 28 сентября 2018

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

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете использовать EVALFILE
(с некоторыми оговорками)

lib / example.pm6

say (^256).pick.fmt('%02X')

REPL

> EVALFILE('lib/example.pm6'); # rather than `use lib 'lib'; use example;`
DE
> EVALFILE('lib/example.pm6');
6F

Проблема возникает при попытке использовать пространство имен.

lib / example.pm6

class Foo {
  say (^256).pick.fmt('%02X')
}

REPL

> EVALFILE('lib/example.pm6')
C0
> EVALFILE('lib/example.pm6')
===SORRY!=== Error while compiling /home/brad/EVAL_2
Redeclaration of symbol 'Foo'
at /home/brad/EVAL_2:1
------> class Foo⏏ {
    expecting any of:
        generic role

Это по-прежнему не работает, если вы изменяете часть имени :ver между каждой загрузкой.

lib /example.pm6

class Foo:ver(0.001) {
  say (^256).pick.fmt('%02X')
}

Один из способов обойти это, если вы только экспериментируете, - сделать их лексическими, а не глобальными.

lib / example.pm6

my class Foo {  # default is `our`
  say (^256).pick.fmt('%02X')
}

REPL

> EVALFILE('lib/test.pm6')
DD
> EVALFILE('lib/test.pm6')
88
> EVALFILE('lib/test.pm6')
6E

Он имеет отдельную лексическую область видимости:

> Foo
===SORRY!=== Error while compiling:
Undeclared name:
    Foo used at line 1

Так что вы будетехочу присвоить ему псевдоним:

> my \Foo = EVALFILE('lib/test.pm6'); # store a ref to it in THIS lexical scope
0C
> Foo
(Foo)

> my \Foo = EVALFILE('lib/test.pm6'); # still works the second time
F7

Это, конечно, работает только потому, что определение класса является последним утверждением в этой области.


Может быть способ вызвать перезагрузку, аналогичнуюна то, как вы можете в Perl 5, если вы копаете в структуре Rakudo, но насколькоs Я знаю, что это не доступно как часть языка.

0 голосов
/ 29 сентября 2018

Как и при импорте в Python, вы можете использовать ключевое слово use:

> perl6
To exit type 'exit' or '^D'
> use Cro::HTTP::Client
Nil
> my $resp = await Cro::HTTP::Client.get('https://www.perl6.org/');
Cro::HTTP::Response.new(request => Cro::HTTP::Request, status => 200, body-parser-selector => Cro::HTTP::BodyParserSelector::ResponseDefault, body-serializer-selector => Cro::HTTP::BodySerializerSelector::ResponseDefault, http-version => "1.1", http2-stream-id => Int)
> say await $resp.body

Для получения дополнительной информации, https://docs.perl6.org/language/modules#Exporting_and_selective_importing может помочь.

...