3

有人可以就如何开始使用mathematica 包提供一些建议吗?

我可以将以下内容保存在名为“Foo.m”的文件中。当我在该文件中运行输入单元格时,我可以看到 $ContextPath 变量中反映的效果。

BeginPackage["Foo`"]

bar::usage = "barfunction";

Begin["`private`"]
bar[w_] := w;
End[];

EndPackage[];

但是,在我的笔记本中,我有以下内容:

#include<foo>
SetDirectory[ToFileName[{$HomeDirectory, "My Documents", "mathematica"}]];
Needs["Foo`"]
$ContextPath

但是需求调用由于某种原因失败了,并且 $ContextPath 保持不变。

编辑

我相信我现在有一个部分解决方案可以工作,我文件中的单元格没有被标记为初始化单元格 - 虽然我现在可以<<Foo',但Needs["Foo“]`仍然无法正常工作。

4

2 回答 2

2

检查以确保保存的文件“Foo.m”在您的$Path.,它告诉 Mathematica 在尝试加载包时要查看哪些目录,很像PATHUnix 或 Windows 中的环境变量。

编辑: 除非有实际语句(或者您直接使用or或其他东西操作它)$ContextPath,否则不会更改。BeginPackageSetBlock

编辑第二个:要检查的一件事是什么

FileNames["Foo.m", $Path]

返回。不过,你所描述的确实有点奇怪。

于 2009-11-13T01:15:22.517 回答
1

任何一种形式都应该有效。当使用Get(或<<) 或加载文件时Needs,首先搜索顶部的目录DirectoryStack[],然后$Path搜索 。(SetDirectory不会改变$Path,所以FileNames["Foo.m", $Path]不会找到Foo.m。)但是,FindFile默认情况下搜索Directory[]$Path. 您可以通过执行以下操作对其进行测试:

FindFile["Foo`"]
SetDirectory[<Foo dir>]
FindFile["Foo`"]

它应该返回

$Failed
<Foo dir>
<Foo dir>/foo.m

如果FindFile能找到Foo.m那么Needs应该能找到它。一般来说,我把我的包裹放进去$UserBaseDirectory/Applications,然后Needs把它们捡起来就好了。

于 2009-11-13T04:34:41.310 回答