考慮到我的previous question關於在大型Mathematica項目中切換數值和分析「模式」的解決方案,我想到了使用Context
作爲範圍構造的想法。在Mathematica中使用上下文作爲範圍構造
其基本思想是在他們自己的上下文中進行所有數值賦值,例如,
Begin["Global`Numerical`"]
par1 = 1;
par2 = 2;
...
End[]
並且在全局上下文中具有所有複雜的分析函數,矩陣等。
理想情況下,我將能夠在全局環境中工作,並切換到一切數字與一個簡單的Begin[Global'Numeric']
和切換回End[]
。
不幸的是,這不起作用,因爲例如,在全局上下文中定義的f[par1_,par2_,...] := foo
不會使用已在Global的子上下文中定義的par1
,par2
等。
有沒有辦法讓子上下文從父上下文繼承定義?有沒有其他的方式來使用上下文創建一個簡單的可切換範圍?
您可以隨時通過手動調整'$ ContextPath'控制範圍內,但它是一個脆弱的黑客。就我個人而言,我還沒有想出一個使用上下文進行範圍界定的好方法,但我很想看看其他人是否可以提出想法。 – 2011-04-14 19:56:00
手動編輯'$ ContextPath'不一定脆弱,但你必須謹慎行事。一個好的做法是在修改它之前記住它是什麼,然後在離開「範圍」時將其設置回記憶的值。您必須小心管理「中止」和其他評估中斷。 @Leo,你應該先提出答案,因爲你先提出答案。 =) – 2011-04-14 20:09:23
使用'Block'作爲'Block [{$ ContextPath = newValue},你的代碼]'會自動處理@Michael提到的許多危險(不需要明確記住舊值,不需要擔心異常和中止-S)。 – 2011-04-14 21:26:11