要求代码审查和改进建议是:关于使函数可列出的问题

问题描述

| 根据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
。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...