Следующий код работает при оценке в блокноте:
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[]