【发布时间】:2010-11-01 22:39:27
【问题描述】:
一般来说,我需要的是类型转换指令,以便能够例如在 true 上相乘,例如 5 * true 和 get5,比如 x * false 并得到 0。
这样的事情怎么办?
【问题讨论】:
标签: boolean type-conversion maple
一般来说,我需要的是类型转换指令,以便能够例如在 true 上相乘,例如 5 * true 和 get5,比如 x * false 并得到 0。
这样的事情怎么办?
【问题讨论】:
标签: boolean type-conversion maple
你可以这样做:
subs([false=0, true=1], expr);
【讨论】:
有几种方法可以获得这种效果,您选择哪种方法可能取决于您打算如何使用它的更多细节。
最简单的方法是使用 2 参数 eval(或 subs,因为由于涉及精确 1 或 0 的产品的自动简化,应该进行评估)。
> eval( 5*true, [true=1,false=0]);
5
> eval( x*false, [true=1,false=0]);
0
当然,您可以创建一个过程来处理该评估,
> T := expr -> eval(expr,[true=1,false=0]):
> T( 5*true );
5
> T( x*false );
0
您也可以尝试使用模块来导出(从而在交互使用的“顶层”重新定义)增强的*。
注意。下面这个导出过程* 的一个更仔细的版本只会在作为整个被乘数出现时替换“真”和“假”,而不是在整个表达式中进行替换。 (标量表达式可以包含未计算的函数调用,例如,可选参数中出现“真”和“假”。理想情况下,这些应该不理会。)
> M:=module() option package; export `*`;
> `*`:=proc(ee::seq(anything))
> :-`*`(op(eval([ee],[true=1,false=0])));
> end proc;
> end module:
> with(M):
> 5*true;
5
> x*false;
0
> a*b*c;
a b c
> eval( %, b=false ); # this doesn't play along
a false c
请注意,在最后一个结果中,“false”的替换不会产生 0。这是因为 a*b*c(对于未知的 a、b 和 c)的结果是全局的:- * 而不是新的*。因此,当 b=false 被替换时,不会调用新的 *。也有可能解决这个问题,尽管结果显示不是那么好(并且解决方法可能会“破坏”你可能想要的其他东西),
> M:=module() option package; export `*`;
> `*`:=proc(ee::seq(anything))
> local res;
> res:=:-`*`(op(eval([ee],[true=1,false=0])));
> if type(res,:-`*`) then
> 'procname'(op(res));
> else
> res;
> end if;
> end proc;
> end module:
> with(M):
> 5*true;
5
> x*false;
0
> a*b*c;
`*`(`*`(a, b), c)
> eval( %, b=false );
0
在上面的最后一个示例中,看起来像 *(*(a, b), c) 的对象实际上是对新 * 的未计算函数调用。因此,当 b=false 被替换时,会调用新的 * 并且可以获得所需的结果。 (希望在我忽略的情况下这不会导致无限递归。)
【讨论】: