У меня было что-то вроде следующего в моей записной книжке.
test1[g_] := (g == 5);
test2[g_] := (g == 6);
tests={"test1", "test2"}
ToExpression[#][5] & /@ tests
Когда я помещаю этот код в пакет, он не работает, потому что test1
теперь называется MyPackage'Private'test1
. Как я могу изменить последнюю строку, чтобы этот код запускался как внутри пакета, так и внутри ноутбука?
Обновление Вот почему я использовал ToExpression, а не символы. Оглядываясь назад, может быть, вместо этого проще использовать символы.
У меня была функция, которую я вызываю как getGraphs["LeafFree","Planar",!"Tree",...]
, чтобы получить все графы без листьев, планарные, а не деревья. Некоторые из этих строк являются классами в GraphData
, а другие — моими собственными классами. Для каждого из моих собственных классов у меня была функция с одинаковым именем, например LeafFree
, которая проверяла свойство. В записной книжке использование кода ToExpression
, как показано выше, было самым быстрым способом реализовать это.
getGraphs[n_Integer, cl__] := getGraphs[{n, n}, cl];
getGraphs[{nmin_Integer, nmax_Integer}, cl__] :=
Module[{maxgraphnum = 100},
customClasses = {"isLeafFree", ! "isLeafFree"};
classes = {cl}\[Backslash]customClasses;
builtinClasses =
GraphData["Classes"] \[Tilde] (Not /@ GraphData["Classes"]);
Assert[classes \[Subset] builtinClasses];
isLeafFree[gname_] :=
FreeQ[GraphData[gname, "DegreeSequence"], 0 | 1];
posClasses = Cases[classes\[Backslash]customClasses, _String];
posGroup =
If[posClasses == {}, GraphData[nmin ;; nmax],
GraphData[posClasses, nmin ;; nmax]];
negClasses = classes\[Backslash]posClasses;
negGroups = GraphData[#[[1]], nmin ;; nmax] & /@ negClasses;
result = Complement[posGroup, Sequence @@ negGroups];
customTest[g_] :=
And @@ (ToExpression[#][g] & /@ ({cl} \[Intersection]
customClasses));
(*result=Take[result,Min[Length[result],100]];*)
result = Select[result, customTest]
]
StringJoin[Context[], #] & /@ {"test1", "test2"}
- person Dr. belisarius   schedule 28.01.2011ToExpression
утками плохого стиля. Есть ли причина использовать строку вместо символов?? Я бы посчитал, чтоtestsAsSymbols = {test1, test2}
иThrough[testsAsSymbols[5]]
намного лучше -- и будет ли это работать в обоих случаях? - person Janus   schedule 28.01.2011MyPackage'doChecks[{"test1","test2"}]
, гдеtest1
— это имя функции, определенной внутри функцииdoChecks
. - person Yaroslav Bulatov   schedule 29.01.2011