【问题标题】:Update (reload) mathematica package after changes更改后更新(重新加载)mathematica 包
【发布时间】:2011-12-09 09:25:40
【问题描述】:

我正在尝试找到以下循环的快捷方式。在开发mathematica 的包时,需要对.m 文件的代码进行更改,然后想在另一个笔记本中测试这些更改。这是一个无限循环...

所以,我们有一个包package.m 和一个笔记本test_package.nb 来完成测试。目前,当我更改 .m 文件中的某些内容时,我必须:

Quit[]
Needs["package`"]

在笔记本中以使更改可用,因此我可以对其进行测试。好像没有Quit[] 是行不通的。

有没有更短的方法来迭代这个开发循环?尤其避免戒烟?

后果

如果可以的话,我会接受 ruebenko 和 Leonid 的回答,因为两者都有帮助并解决了我的问题。但是,由于只能选择一个答案,因此我选择了 ruebenko 的答案,因为它简单易用 - 只需将 Needs 更改为 Get,我就克服了我的问题。尽管如此,Leonid 的包肯定更复杂,可能最终会产生更好的结果,但它必须安装、加载等。

【问题讨论】:

    标签: wolfram-mathematica


    【解决方案1】:

    使用获取;如果根本没有加载,则只需要加载包。有时您需要小心并在包中的变量上使用 ClearAll。

    【讨论】:

    • @ruebenjo:您能详细说明ClearAll 的问题吗?它应该在笔记本中还是在.m 文件中?
    • 在 .m 文件中。假设您编辑了一个更改其签名的函数,如果获取文件旧定义仍在内核中。为避免这种情况,请使用 ClearAll[myFunction];myFunction[blab_,blah_,blah_]:=...
    【解决方案2】:

    作为@ruebenko 建议的使用简单Get 的替代方法(这是一个很好的建议),您可以尝试使用我编写的名为PackageManipulations` 的包,它可以满足您的需求。它是可用的here。有一个带有示例的笔记本,说明了它是如何工作的,也可以在我链接的页面上找到。包可以重新加载、清除或删除给定的包(上下文)。函数PackageReload 具体会做你想做的事。

    它确实在后台使用了GetNeeds,但此外它还会跟踪所谓的“转义符号”(公开导出但没有使用消息的符号,并且可能会“泄露”实现细节),并且可以选择解决阴影问题,有利于重新加载包。请注意,PackageReload 将自动调用包符号上的UnprotectClearAll,从而解决@ruebenko 提到的问题。您可以在包装随附的示例笔记本中找到更多详细信息。

    请注意,虽然我自己多次使用它,但我并不声称它没有错误 :)

    【讨论】:

    • 是时候仔细看看你的“其他资源”了;-)
    • @nilo de roock 不幸的是,该部分已经有大约 3 年了(这真的很可悲)。我还有很多想要添加的内容,但到目前为止还没有足够的时间来正确打包、润色和测试。希望我能尽快更新这些内容。
    • @LeonidShifrin:感谢您的加入。我尝试将它添加到我的包的开头(在Unprotect@@Names["curveAnalysis*"]; ClearAll@@Names["curveAnalysis*"]; 和第一个usage 之前)。在测试笔记本中,我恢复为Needs。然后我尝试在更改包后重新加载包(不使用Quit[]),但更改不适用。我不得不使用Quit[] 或重复使用Get 替代方案。
    • @Dror 我发布的代码应该可以工作 - 我专门添加了上面的测试代码并自己进行了测试。我没有提到它,因为我认为从上下文中可以清楚地看到这一点,但是在任何情况下,您都必须使用GetNeeds 在加载包后不会重新加载它。事实上,正如我已经提到的,我的PackageManipulations` 中的函数PackageReload 会自动为您完成所有这些工作,包括选择调用哪一个(NeedsGet),调用Unprotect 和@987654344 @ 所有包名称(包括子上下文)和其他一些东西。
    • @LeonidShifrin:恐怕我还不是很清楚。任何方式它现在工作。有关详细信息,请参阅我对问题的补充。
    【解决方案3】:

    最简单的方法是使用Clear 或者更好的是ClearAll 在你的包的最开始处暴露在你的包中的符号上,如下

    BeginPackage["SomePackage`"];
    ClearAll[ ASymbol, AnotherSymbol, ...];
    

    这可确保您在加载时有一个干净的状态。一旦包更稳定,这会更容易,但我发现如果我在最初开发包时不这样做,它就不会完成。

    【讨论】:

    • 我在包的开头添加了(正如我在某些示例中看到的那样)Unprotect@@Names["package*"]; ClearAll@@Names["package*"];。这是否等效并解决了相同的问题?
    • @rcollyer 如果包不会进化或者包编写者会非常自律(我不是),这将是一个完美的解决方案。我也这样做了一段时间,但几乎每次我都添加了一些新功能而忘记将它们添加到ClearAll。当我厌倦了旧定义与这些功能的新定义导致的讨厌的错误时,我编写了我在回答中提到的包。从那以后我一直很高兴(关于这个问题):)
    • @LeonidShifrin,我确实说过它是最容易实现的,我并没有说它是一个强大的解决方案。但是,Dror 的变种呢?那不行吗?
    • @rcollyer 这不是故事的全部,因为它只会清除主要上下文中的符号。还需要在所有子上下文中调用ClearAll(通常,这只是Private` )。有了这个更正,它可能会起作用。这几乎就是我的包所做的,但它会自动完成所有这些,并具有一些额外的功能。
    • @LeonidShifrin:你能写出你认为我应该添加的显式代码,以便让我的方法更健壮吗?谢谢。
    猜你喜欢
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多