更新CompUnit :: PrecompilationStore中的程序?

时间:2018-12-12 04:34:36

标签: perl6

我正在使用Rakudo Perl编译的文档,并且可以更新这些文档。
我将文档存储在CompUnit :: PrecompilationStore :: File

如何将较旧的版本更改为较新的版本?

以下程序产生相同的输出,就像较新版本未存储在CompUnit中一样。我在做什么错了?

use v6.c;
use nqp;
'cache'.IO.unlink if 'cache'.IO ~~ e;
my $precomp-store = CompUnit::PrecompilationStore::File.new(prefix=>'cache'.IO);
my $precomp = CompUnit::PrecompilationRepository::Default.new(store=> $precomp-store );
my $key = nqp::sha1('test.pod6');

'test.pod6'.IO.spurt(q:to/--END--/);
    =begin pod
    =TITLE More and more

    Some text

    =end pod
    --END--
$precomp.precompile('test.pod6'.IO, $key, :force);
my $handle = $precomp.load( $key )[0];
my $resurrected = nqp::atkey($handle.unit,'$=pod')[0];
say $resurrected.contents[1].contents[0];


'test.pod6'.IO.spurt(q:to/--END--/);
    =begin pod
    =TITLE More and more

    Some more text added

    =end pod
    --END--
# $precomp-store.unlock;
# fails with:
# Attempt to unlock mutex by thread not holding it
#  in block <unit> at comp-test.p6 line 30

$precomp.precompile('test.pod6'.IO, $key, :force);
my $new-handle = $precomp.load($key)[0];
my $new-resurrected = nqp::atkey($new-handle.unit,'$=pod')[0];
say $new-resurrected.contents[1].contents[0];

输出始终为:

Some text
Some text

更新:我最初的问题是在定义“ $ new-resurrected”的情况下使用“ $ handle”而不是“ $ new-handle”。输出没有变化。

2 个答案:

答案 0 :(得分:4)

我认为答案可能是in the answer to other, similar question of yours here,通常来说,CompUnits是不可变的。如果对象更改,则目标也需要更改。正如@ugexe在那说的那样,

  

$key旨在表示一个不变的名称,以便它始终指向相同的内容。

因此,您实际上可能正在寻找类似precomp的行为,但是您可能不想使用实际的CompUnits来做到这一点。

答案 1 :(得分:2)

如前所述,previously load方法会缓存,而不是对precomp的方法调用。您期望方法:force的参数precompile影响以后对方法load的调用-这是不正确的。通过跳过对:force的第一个调用,并查看对load的最终调用是否显示更新的结果,可以轻松证明load可以按 precompiling 的预期工作:

use v6.c;
use nqp;
'cache'.IO.unlink if 'cache'.IO ~~ e;
my $precomp-store = CompUnit::PrecompilationStore::File.new(prefix=>'cache'.IO);
my $precomp = CompUnit::PrecompilationRepository::Default.new(store=> $precomp-store );
my $key = nqp::sha1('test.pod6');

'test.pod6'.IO.spurt(q:to/--END--/);
    =begin pod
    =TITLE More and more

    Some text

    =end pod
    --END--
$precomp.precompile('test.pod6'.IO, $key, :force);


'test.pod6'.IO.spurt(q:to/--END--/);
    =begin pod
    =TITLE More and more

    Some more text added

    =end pod
    --END--
# $precomp-store.unlock;
# fails with:
# Attempt to unlock mutex by thread not holding it
#  in block <unit> at comp-test.p6 line 30

$precomp.precompile('test.pod6'.IO, $key, :force);
my $new-handle = $precomp.load($key)[0];
my $new-resurrected = nqp::atkey($new-handle.unit,'$=pod')[0];
say $new-resurrected.contents[1].contents[0];

给出:Some more text added