2010-04-30 79 views
8

我想現在要解決的Mathematica 7.0以下實現的問題了一些日子,我不明白到底發生了什麼,所以我希望有人可以給我一些提示「Private`」內容。 我有3個函數,我在Mathematica中使用擴展名爲* .nb的源文件實現。 他們對所有例子都很好。現在我想把這些函數分成3個不同的包。所以我創建了三個不同的包,擴展名爲* m,其中我放置了所有期望的Mathematica函數。 在「stereographic.m」包,其中包含的代碼的一個例子:輸出與數學套餐

BeginPackage["stereographic`"] 

stereographic::usage="The package stereographic...." 
formEqs::usage="The function formEqs[complexBivPolyEqn..." 
makePoly::usage="The function makePoly[algebraicEqn] ..." 
getFixPolys::usage="The function..." 
milnorFibration::usage="The function..." 

Begin["Private`"] 
Share[]; 

formEqs[complex_,{m_,n_}]:=Block[{complexnew,complexnew1, realeq, imageq, expreal, 
expimag, polyrealF, polyimagF,s,t,u,v,a,b,c,epsilon,x,y,z}, 
complexnew:=complex/.{m->s+I*t,n->u+I*v}; 
complexnew1:=complexnew/.{s->(2 a epsilon)/(1+a^2+b^2+c^2),t->(2 b 
epsilon)/(1+a^2+b^2+c^2),u->(2 c epsilon)/(1+a^2+b^2+c^2),v->(- 
epsilon+a^2 epsilon+b^2 epsilon+c^2 
epsilon)/(1+a^2+b^2+c^2)}; 
realeq:=ComplexExpand[Re[complexnew1]]; 
imageq:=ComplexExpand[Im[complexnew1]]; 
expreal:=makePoly[realeq]; 
expimag:=makePoly[imageq]; 
polyrealF:=expreal/.{a->x,b->y,c->z}; 
polyimagF:=expimag/.{a->x,b->y,c->z}; 

{polyrealF,polyimagF} 
] 

End[] 
EndPackage[] 

我們測試該函數I加載包

Needs["stereographic`"] 

一切正常。但是,當我測試比如函數與

formEqs[x^2-y^2,{x,y}] 

我碰到下面的輸出中:

{Private`epsilon^2 + 2 Private`x^2 Private`epsilon^2 + 
Private`x^4 Private`epsilon^2 - 
6 Private`y^2 Private`epsilon^2 + 
2 Private`x^2 Private`y^2 Private`epsilon^2 + 
Private`y^4 Private`epsilon^2 - 
6 Private`z^2 Private`epsilon^2 + 
2 Private`x^2 Private`z^2 Private`epsilon^2 + 
2 Private`y^2 Private`z^2 Private`epsilon^2 + 
Private`z^4 Private`epsilon^2, 
8 Private`x Private`y Private`epsilon^2 + 
4 Private`z Private`epsilon^2 - 
4 Private`x^2 Private`z Private`epsilon^2 - 
4 Private`y^2 Private`z Private`epsilon^2 - 
4 Private`z^3 Private`epsilon^2} 

當然,我不明白爲什麼Private`出現在我在返回的任何局部變量的前面最後結果。我希望在計算輸出中不要有這個Private。 任何想法或更好的解釋可能表明我爲什麼會發生這種情況?

非常感謝您的幫助。

最良好的祝願, madalina

+0

嘗試在comp.soft-sys.mathematica上發帖,我認爲那裏的Mathematica用戶社區比這裏的社區更大,更有知識。 – 2010-04-30 13:16:17

+0

到目前爲止,您已經提出了23個問題,但尚未接受任何答案。沒有任何答案符合你的標準嗎? – rcollyer 2010-05-03 19:21:03

回答

2

discussion here,它看起來像分配包裝內的符號來全球範圍內會讓他們是沒有私有上下文前綴輸出。

也就是說,有可能形成輸出的一部分的任何符號可以用Global`前綴聲明,如下例所示:

BeginPackage["PackageContext`"]; 
Rule1::usage = "Rule1 is a test exported rule."; 
Begin["`Private`"]; 
Rule1 = Cos[Global`x_]^2 + Sin[Global`x_]^2 :> Global`x; 
End[]; 
EndPackage[]; 

在你的包,它可能是這個樣子:

formEqs[complex_,{m_,n_}]:=Block[{complexnew,complexnew1, realeq, imageq, 
    expreal,expimag, polyrealF, polyimagF,s,t,u,v,a,b,c, 
    Global`epsilon,Global`x,Global`y,Global`z}, 
complexnew:=complex/.{m->s+I*t,n->u+I*v}; 
complexnew1:=complexnew/.{s->(2 a Global`epsilon)/(1+a^2+b^2+c^2),t->(2 b 
    Global`epsilon)/(1+a^2+b^2+c^2),u->(2 c Global`epsilon)/(1+a^2+b^2+c^2),v->(- 
    Global`epsilon+a^2 Global`epsilon+b^2 Global`epsilon+c^2 
    Global`epsilon)/(1+a^2+b^2+c^2)}; 
realeq:=ComplexExpand[Re[complexnew1]]; 
imageq:=ComplexExpand[Im[complexnew1]]; 
expreal:=makePoly[realeq]; 
expimag:=makePoly[imageq]; 
polyrealF:=expreal/.{a->Global`x,b->Global`y,c->Global`z}; 
polyimagF:=expimag/.{a->Global`x,b->Global`y,c->Global`z}; 

編輯:全局變量需要在任何地方發生,以給予Global`前綴,如上面

+0

我在變量x,y,z,結果中返回的變量x中的代碼中嘗試了Global',但結果中仍然出現Private'。 如果我刪除Begin [「Private'」],那麼輸出看起來不錯,但x,y,z,epsilon的警告消息出現: x :: shdw:「符號x出現在多個上下文中 」stereographic'「 「全球」;「上下文中的定義 」stereographic「」可能會被其他 定義遮蔽或遮蔽。「 如果我添加刪除[x,y,z,epsilon],那麼警告消息會消失但是刪除會出現在輸出中。 – madalina 2010-04-30 14:20:33

+0

如果可能,請在每次測試之間重新啓動內核。這樣你就不必擔心以前的評估會產生干擾,它會比Remove更好地工作。我認爲codeulike有正確的答案。此外,在Block的第一個參數和第二個參數中,您都不能使用Global'x替換所有的x,y,z,epsilon。我剛剛在重新啓動後在Mathematica 7.0.1上進行了測試,它對我很有幫助。 – Davorak 2010-04-30 14:47:31

+0

感謝那個達沃拉克,我沒有Mathematica方便。假設這些變量在封裝中被提及時必須以Global作爲前綴? – codeulike 2010-04-30 14:58:28

7

你的問題是,當您返回象徵性的FUNC常見的一種從一個軟件包開始,當這發生在我身上時,我認爲它好像我在編寫軟件包時做了一些錯誤。儘管在Global前加上所有這些符號將會「修復」這個問題,但它會破壞包的一些目的:實現隱藏。另外,由於它會使用符號污染全局名稱空間,因此您必須小心運行代碼,這進一步破壞了程序包的用途。你的軟件包不應該關心全球環境是什麼樣子。如果需要任何東西,它可以在包的私有部分內自行加載它,或者在BeginPackage或使用Needs

相反,你可以做什麼功能,如Plot做,接受Symbol參數,如下所示:

(*Note: if z is not a symbol this won't work, i.e. if it is Set to some value.*) 
In[1] := f[x_Symbol] := x^2 
In[2] := f[z] 
Out[2] := z^2 

內部,象徵性的變量,像正常的引用,但您的功能現在將使用返回一個象徵性的表達什麼您選擇使用的全局符號。這也可以將你對變量名稱的選擇與你函數的實現細節分開。

1

嘗試更改Begin["Private`"]Begin["`Private`"]

+0

沒有注意到這個錯誤。接得好。由於編輯正在對代碼進行肆意破壞,因此應在「Private」之前加上一個嚴重標記。這樣,'Private'將成爲封裝上下文的子上下文。不幸的是,這並不能解決從包的私有部分返回符號的問題。 – rcollyer 2010-04-30 16:17:07

1

您可以使用formal symbols而不是普通符號來避免您的問題。

同時,使用形式符號更方便輸出涉及形式參數的一般表達式。他們沒有任何價值,因爲他們是Protected,他們不能無意中設置。

您可以使用「特殊字符」調色板在正式符號間插入。