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

Wolfram mathematica 函数在笔记本中工作,但不作为包的一部分-有关函数参数的消息受到保护,wolfram-mathematica,Wolfram Mathematica,在笔记本中计算时,以下代码有效: Person[name_String, age_Integer] := {name, age}; Person["Jane", 30] name = "Dick"; age = 28; Person[name, age] 输出 {"Jane", 30} {"Dick", 28} 所以我把它放在下面的包中: 人 Person.nb 输出 我不明白为什么会有一个使用名称和年龄符号的保护问题。这个人的论点“姓名”和“年龄”也受到保护吗 celtschk的回答让我

在笔记本中计算时,以下代码有效:

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

{"Jane", 30}
{"Dick", 28}
所以我把它放在下面的包中:

人 Person.nb 输出 我不明白为什么会有一个使用名称和年龄符号的保护问题。这个人的论点“姓名”和“年龄”也受到保护吗


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[]

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

有人知道如何在内联引用的材料中包含反勾号吗?(上下文名称)谢谢您的解释。我知道如何解决这一问题Person[name\u String,age\u Integer]:={name,age};'在“开始[”
Private
“]”和“结束[]”之间,通过“::用法”将其公开,然后不公开“名称”和“年龄”。@celtschk请参阅我的编辑,了解如何输入上下文以显示记号。
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}
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[]