7

我正在尝试重构一些代码。我的方法(使用 vi)是将旧库从 /lib 复制到 /lib2。这样我就可以破解大部分内容,但仍然有一个框架可以重构。

所以我继续将 mymain.p6 标头从 更改use lib '../lib';use lib '../lib2';。然后我删除了其中的一大块行../lib2/mylibrary.pm6并确保 :w 正在做我期望的事情。

想象一下我的惊讶,尽管我的程序已被大量删除,但仍然可以完美运行。当我 rm -R /lib 时它甚至可以工作,所以那里没有任何东西持续存在。

我有没有机会对旧的 lib 模块进行预编译?如果是这样,我该如何冲洗它?

这是 Rakudo Star 版本 2019.03.1,基于 MoarVM 版本 2019.03 实现 Perl 6.d。

4

2 回答 2

6

预编译的模块存储在 precomp 目录中。您可以尝试重命名或删除该~/.precomp目录。

另请参阅此处的 SO问题

于 2019-08-12T20:40:49.467 回答
4

更新。好吧,我以为我已经复制了这个场景。它在一小时内可靠地显示了该错误。但现在不是。这很令人不安。调查仍在继续……


我已经复制了@p6steve 的场景,以防有人希望将此报告为错误。目前我和@p6steve(根据下面的评论)在一起,因为我将把它视为一个 DIHWIDT 而不是一个可报告的错误。也就是说,现在我们有了一个高尔夫总结。

原始主程序使用path1后跟它直接使用的模块,然后是使用的模块:

use lib 'path1';
use lib1;
say $lib1::value;

unit module lib1;
use lib2;
our $value = $lib2::value;

unit module lib2;
our $value = 1;

这显示1.

如果将库复制到新目录,包括 .precomp 目录,然后编辑 lib2 但未编辑 lib1,则忽略对 lib2 的更改。

在复制 libs 及其 .precomp 目录然后编辑 libs 之前和之后,它位于 glot.io 上

原始答案

感谢您编辑您的问题。这给了我们更多的继续。:)

我想尝试深入了解它,并希望您也愿意尝试一下。这个(n)答案和下面的评论将记录我们的进步。

根据您对@ValleLukas 回答的评论:

然后我注意到 ../lib2/.precomp 目录 - 所以实现的库预编译存储在库文件夹中。那完成了工作!

这是我对发生的事情的第一个猜测:

您大量复制liblib2. 这复制了 precomp 目录。

您修改了中的use lib ...语句mymain.p6以引用lib2

您的mymain.p6代码包括一个use module-that-directly-or-indirectly-uses-mylibrary.

你修改mylibrary.pm6.

但什么都没有改变!为什么不?

您还没有触及module-that-directly-or-indirectly-uses-mylibrary,因此 Rakudo 使用目录中该模块的预编译版本lib2/.precomp

推测...

也许存在该预编译版本的事实导致预编译逻辑假设如果它还找到了一个已使用的模块的预编译版本,module-that-directly-or-indirectly-uses-mylibrary那么它可以继续使用它,甚至不用检查其时间戳与源版本的比较情况.

这符合您的情况吗?如果不是,它会出错哪些位?

于 2019-08-14T20:55:28.903 回答