Начало работы с пакетами 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', _4 _ "]` все еще работает неправильно.


person Andrew Walker    schedule 13.11.2009    source источник


Ответы (2)


Убедитесь, что сохраненный файл «Foo.m» находится на вашем $Path, который сообщает Mathematica, в какие каталоги следует искать при попытке загрузить пакеты, подобно переменной среды PATH в Unix или Windows.

РЕДАКТИРОВАТЬ: $ContextPath не будет изменен, если не будет действующего оператора BeginPackage (или если вы управляете им напрямую с помощью Set, Block или чего-то еще).

ИЗМЕНИТЬ второе: нужно проверить, что

FileNames["Foo.m", $Path]

возвращается. Однако то, что вы описываете, звучит немного странно.

person Pillsy    schedule 13.11.2009
comment
Pilly, достаточно ли просто предположить, что если файл находится в текущем рабочем каталоге (который, как мне кажется, установлен SetDirectory), и. находится в $ Path, что файл должен быть найден? - person Andrew Walker; 13.11.2009

Любая форма должна работать. Когда файл загружается с использованием 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 отлично их забирает.

person rcollyer    schedule 13.11.2009