问题描述
|
根据acl的请求清理问题:
我有以下代码
AddGeometry[scg_,tfg_,geo_] :=
Module[{
i,georec},If[StringQ[geo[[2,1]]]&&StringMatchQ[geo[[2,1]],\"GE\"],(* DIRTY,BWAH *)
AddAsChild[scg,tfg,geo],(
i=1;
While[i<=Length[geo],georec=geo[[i]];
AddGeometry[scg,georec];
i++
]
)
]
]
SetAttributes[AddGeometry,HoldAll];
geo_看起来像这样:
{
{4,{\"GE\",{\"CU\",{{0,0},4}}},5,2},{7,3,1}}},{12,2}}},}
它包含1、2,...,n个类型的记录
{4,{\“ GE \”,{\“ CU \”,{{0,0,0},4}}},5,2}
调用代码看起来像
c1 = NewCube[]
(c1的取值为{4,{\“ GE \”,{\“ CU \”,{{0,0,0},4}}},5,2}等)。
AddGeometry[scg,c1]
或当需要添加多个几何时:
AddGeometry[scg,{c1,c2,c3}]
上面的代码有效。
题:
有没有更干净的方法(使用多态)来实现这一点?
来自@acl:
AddGeometry[scg_,geo_] :=
Module[{
georec=geo},AddAsChild[scg,georec]
] /; MatchQ[geo,{_,__},__}];
AddGeometry[scg_,geo_] :=
Module[{},Map[AddGeometry[scg,#] &,geo]
]
解决方法
针对更新的问题,
ClearAll[AddGeometry];
SetAttributes[AddGeometry,HoldAll];
AddGeometry[scg_,tfg_,geo_] := Module[{},AddAsChild[scg,tfg,geo]] /; MatchQ[geo,{_,{\"GE\",__},__}];
AddGeometry[scg_,geo_] := (AddGeometry[scg,#] & /@ geo)
我测试过的
c1 = {4,{\"CU\",{{0,0},4}}},5,2};
g = {{4,2},{7,3,1}}},{12,2}}},2}};
AddGeometry[scg,c1]
AddGeometry[scg,g]
这给了
AddAsChild[scg,{4,2}]
和
{AddAsChild[scg,2}],2}]}
同样,如果AddAsChild
纯粹具有副作用,则可以使用Scan
代替Map
,以避免获得返回的Null
s列表(或将第二个定义修改为AddGeometry[scg_,#]; & /@ geo)
)。
, 抱歉,我早些时候发布了一个无用的“解决方案”,却没有考虑。您可以尝试:
ClearAll[AddGeometry]
SetAttributes[AddGeometry,HoldAll];
grpat = {_,__};
AddGeometry[scg_,geo_] /; Head[geo] === List :=
AddAsChild[scg,#] & /@
Quiet[geo /. (x : grpat) | {x : grpat ..} :> {x}]
这使得:
records =
{{4,{3,1,7,1}};
AddGeometry[scg,records]
(* Out =
{AddAsChild[scg,1}]}
*)
如果您不想从AddGeometry
输出,可以使用use12ѭ而不是Map
。