函数在笔记本中工作,但不作为包的一部分 - 关于函数参数的消息是受保护的

时间:2012-01-13 17:32:50

标签: wolfram-mathematica

以下代码在笔记本中进行评估时有效:

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 个答案:

答案 0 :(得分:4)

因为当您定义函数Person时,当前上下文为Person`所有新标识符都在那里创建,甚至标识符name和{{ 1}}(之前没有创建它们,因此它们是在那时创建的)。之后,您将保护上下文age中的所有内容,包括这两个符号。当您尝试分配给他们时,Mathematica正确地抱怨他们受到保护。