Я согласен с комментариями выше, что у вас может быть веская причина для этого, но здесь идет.Вот код, который я использую в таких случаях, который позволяет анализировать ваш символ в любом контексте, который вам нравится, во время выполнения:
SetAttributes[ParseTimeNameSpaceWrapper,HoldFirst];
Options[ParseTimeNameSpaceWrapper] = {
LocalizingContext->"MyLocalizingContext`",
DefaultImportedContexts:>{"Imported1`", "Imported2`"},
ExtraImportedContexts:> {}
};
ParseTimeNameSpaceWrapper[code_,opts:OptionsPattern[]]:=
Module[{result,
context = OptionValue[LocalizingContext],
defcontexts = OptionValue[DefaultImportedContexts],
extraContexts = OptionValue[ExtraImportedContexts],
allContexts},
allContexts = {Sequence@@defcontexts,Sequence@@extraContexts};
BeginPackage[context,If[allContexts==={},Sequence@@{},allContexts]];
result = code;
EndPackage[];
result
];
Вы можете использовать опции, чтобы указать некоторые контексты, где существуют эти символы,что вы хотите импортировать на этапе разбора.Вы можете вызвать это из любого пакета или записной книжки, и символ будет проанализирован в соответствии с тем контекстом, который вы укажете.
HTH
Редактировать:
Ответ на комментарий (так какэто сделало вопрос более конкретным): Нет никаких сомнений в том, что во время выполнения Context[]
будет отображать любой текущий контекст, из которого была вызвана функция (в данном случае Global).Я имел в виду кое-что еще: Context
имеет синтаксис Context[symbol]
, чтобы дать контекст любого символа, если он находится на $ContextPath
.Например, Context[getGraphs]
возвращает Bulatov'showGraphs'
.Поэтому, если вам нужно автоматически определить контекст какой-либо экспортируемой функции, вы вызываете Context[function]
.Вы можете использовать это для создания полных имен других (частных) функций этого пакета.Вот автономный пример:
In[1]:=
BeginPackage["MyTest`"];
f[x_, y_, context_: Context[f]] :=
Module[{f1str = "function1", f2str = "function2", f1, f2},
{f1, f2} = ToExpression[context <> "Private`" <> #] & /@ {f1str, f2str};
f1[x, y];
f2[x, y];];
Begin["`Private`"];
function1[x_, y_] := Print["In function1: arguments are ", x, " , ", y];
function2[x_, y_] := Print["In function2: arguments are ", x, " , ", y];
End[]
EndPackage[];
Out[6]= "MyTest`Private`"
In[8]:= f[1, 2]
During evaluation of In[8]:= In function1: arguments are 1 , 2
During evaluation of In[8]:= In function2: arguments are 1 , 2
, где x,y
- только некоторые примеры аргументов.Тогда вы фактически никогда не предоставляете последний аргумент, но вы можете использовать переменную context
внутри своей функции, чтобы создать длинные имена для других ваших функций, как в приведенном выше примере кода.Или вы можете просто использовать Context [f] внутри тела функции и не добавлять к ней никаких аргументов.