【发布时间】:2011-01-28 04:34:02
【问题描述】:
我的笔记本中有类似以下内容。
test1[g_] := (g == 5);
test2[g_] := (g == 6);
tests={"test1", "test2"}
ToExpression[#][5] & /@ tests
当我将此代码放入包中时,它不起作用,因为 test1 现在称为 MyPackage'Private'test1。如何修改最后一行以使此代码在包内和笔记本内运行?
更新 这就是为什么我使用 ToExpression 而不是使用 Symbols 的原因。回想起来,也许改用符号更容易
我有一个函数,我称之为 getGraphs["LeafFree","Planar",!"Tree",...] 来获取所有无叶、平面而不是树的图形。其中一些字符串是GraphData 中的类,而另一些是我自己的类。对于我自己的每个类,我都有一个名称相同的函数,例如测试属性的LeafFree。在 notebook 中,使用上述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"} -
我认为
ToExpression是不好的风格鸭子。有没有理由使用字符串而不是符号?我会考虑testsAsSymbols = {test1, test2}和Through[testsAsSymbols[5]]更好 - 它在这两种情况下都可以工作? -
@Janus:你应该这样回答......
-
哈!今天每个人都很害羞:)
-
belisarius:是的,不起作用,请参阅下面的我的 cmets。 Janus:我使用 ToExpression 是因为我正在做类似
MyPackage'doChecks[{"test1","test2"}]之类的事情,其中test1是在函数doChecks中定义的函数名称