【发布时间】:2011-07-15 11:09:40
【问题描述】:
示例和背景(注意Hold、ReleaseHold的用法):
以下代码表示创建场景图形对象(从 XML 文件)的静态工厂方法。 (输出)字段是 CScenegraph 的一个实例(一个 OO-System 类)。
new[imp_]:= Module[{
ret,
type = "TG",
record ={{0,0,0},"Root TG"}
},
ret = MathNew[
"CScenegraph",
2,
MathNew["CTransformationgroup",1,{type,record},0,0,0,0,Null]];
ret@setTree[ret];
ret@getRoot[]@setColref[ret];
csp = loadClass["CSphere"];
spheres = Cases[imp, XMLElement["sphere", _, __], Infinity];
codesp = Cases[spheres, XMLElement["sphere",
{"point" -> point_, "radius" -> rad_, "hue" -> hue_}, {}] -> Hold[csp@new[ToExpression[point], ToExpression[rad], ToExpression[hue]]]];
ret@addAschild[ret@getRoot[],ReleaseHold[codesp]];
ret
];
我的问题是:
spheres = Cases[imp, XMLElement[\sphere\, _, __], Infinity];
codesp = Cases[spheres, XMLElement[\sphere\,
{\point\ -> point_, \radius\ -> rad_, \"hue\" -> hue_}, {}] -> Hold[csp@new[ToExpression[point], ToExpression[rad], ToExpression[hue]]]];
ret@addAschild[ret@getRoot[],ReleaseHold[codesp]];
在哪里
addAschild
将(一个列表)几何添加到(根)转换组并具有签名
addAsChild[parent MathObject, child MathObject], or
addAsChild[parent MathObject, Children List{MathObject, ...}]
表示一个球体的 XML 元素如下所示:
<sphere point='{0., 1., 3.}'
radius='1'
hue='0.55' />
如果我不使用 Hold[] , ReleaseHold[] 我最终会得到类似的 objectdata
{"GE", {"SP", {CScenegraph`point, CScenegraph`rad}}, {CScenegraph`hue}}
虽然我已经预料到了
{"GE", {"SP", {{4., 3., -4.}, 3.}}, {0.45}}
(上面带有 Hold[]、ReleaseHold[] 的代码产生了正确的数据。)
问题
1。为什么在这种情况下需要保持? (事实上,是吗?有没有办法在没有 Hold[]、ReleaseHold[] 的情况下进行编码?)(我通过反复试验得到了正确的答案!不太明白为什么。)
2。作为学习点:Hold/ReleaseHold 使用的原型示例/案例是什么?
编辑:
列昂尼德的回答总结。更改此代码
codesp = Cases[spheres, XMLElement["sphere",
{"point" -> point_, "radius" -> rad_, "hue" -> hue_}, {}] -> Hold[csp@new[ToExpression[point], ToExpression[rad], ToExpression[hue]]]];
ret@addAschild[ret@getRoot[],ReleaseHold[codesp]];
到:
codesp = Cases[spheres, XMLElement["sphere",
{"point" -> point_, "radius" -> rad_, "hue" -> hue_}, {}] :> csp@new[ToExpression[point], ToExpression[rad], ToExpression[hue]]];
ret@addAschild[ret@getRoot[],codesp];
【问题讨论】: