如何重新加载REPL中使用的模块?

mat*_*ull 6 perl6

这个问题非常自我解释.如果我在开发期间在REPL中加载模块,我想在不必exit先进行更改的情况下进行更改.

Bra*_*ert 6

您可以使用EVALFILE
(有一些警告)

库/example.pm6

say (^256).pick.fmt('%02X')
Run Code Online (Sandbox Code Playgroud)

复制代码

> EVALFILE('lib/example.pm6'); # rather than `use lib 'lib'; use example;`
DE
> EVALFILE('lib/example.pm6');
6F
Run Code Online (Sandbox Code Playgroud)

当您尝试使用命名空间时就会出现问题。

库/example.pm6

class Foo {
  say (^256).pick.fmt('%02X')
}
Run Code Online (Sandbox Code Playgroud)

复制代码

> 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
Run Code Online (Sandbox Code Playgroud)

如果您:ver在每次加载之间更改名称的一部分,这仍然不起作用。

库/example.pm6

class Foo:ver(0.001) {
  say (^256).pick.fmt('%02X')
}
Run Code Online (Sandbox Code Playgroud)

如果您只是在尝试,解决此问题的一种方法是使它们具有词汇性而不是全局性。

库/example.pm6

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

复制代码

> EVALFILE('lib/test.pm6')
DD
> EVALFILE('lib/test.pm6')
88
> EVALFILE('lib/test.pm6')
6E
Run Code Online (Sandbox Code Playgroud)

它有一个单独的词法范围:

> Foo
===SORRY!=== Error while compiling:
Undeclared name:
    Foo used at line 1
Run Code Online (Sandbox Code Playgroud)

所以你会想要别名它:

> 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
Run Code Online (Sandbox Code Playgroud)

这当然有效,因为类定义是该范围内的最后一条语句。


如果您深入研究 Rakudo 的结构,可能有一种方法可以导致类似于 Perl 5 中的重新加载,但据我所知,这不是语言的一部分。


che*_*nyf -2

与 Python 的 import 一样,您可以使用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
Run Code Online (Sandbox Code Playgroud)

有关更多信息,https://docs.perl6.org/language/modules#Exporting_and_selective_importing可能会有所帮助。