Функция работает в блокноте, но не как часть пакета. Сообщение об аргументе функции защищено. - PullRequest
4 голосов
/ 13 января 2012

Следующий код работает при оценке в блокноте:

Person[name_String, age_Integer] := {name, age};
Person["Jane", 30]
name = "Dick";
age = 28;
Person[name, age]

выход

{"Jane", 30}
{"Dick", 28}

Поэтому я положил его в следующий пакет:

Person.m

BeginPackage["Person`"]

Unprotect @@ Names["Person`*"];
ClearAll @@ Names["Person`*"];

Person[name_String, age_Integer] := {name, age};

Protect @@ Names["Person`*"];

EndPackage[]

Person.nb

Needs["Person`"];

Person["Jane", 30]

name = "Dick";
age = 28;
Person[name, age]

name1 = "Bill";
age1 = 40;
Person[name1, age1]

выход

{"Jane", 30}
Set::wrsym: Symbol name is Protected. >>
Set::wrsym: Symbol age is Protected. >>
Person[name, age]
{"Bill", 40}

Я не понимаю, почему существует проблема защиты с использованием символов имени и возраста. Защищаются ли аргументы Личности "имя" и "возраст" тоже?


ответ celtschk позволил мне увидеть свет. Следующее не раскрывает имя и возраст:

BeginPackage["Person`"]

Unprotect @@ Names["Person`*"];
ClearAll @@ Names["Person`*"];

Person::usage = "Person";    

Begin["`Private`"]
Person[name_String, age_Integer] := {name, age};
End[]

Protect @@ Names["Person`*"];

EndPackage[]

1 Ответ

4 голосов
/ 13 января 2012

Поскольку при определении вашей функции Person текущий контекст равен Person`, все создаются новые идентификаторы, даже идентификаторы name и age (вы не создавалиих раньше, поэтому они создаются в этой точке).После этого вы защищаете все в контексте Person`, включая эти два символа.Когда вы затем пытаетесь назначить их, Mathematica правильно жалуется, что они защищены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...