一般的に私が必要としているのは、たとえば、true likeを乗算し 、sayとgetを5 * true
取得できるようにするための型変換命令です。5
x * false
0
そのようなことをどのように行うのですか?
一般的に私が必要としているのは、たとえば、true likeを乗算し 、sayとgetを5 * true
取得できるようにするための型変換命令です。5
x * false
0
そのようなことをどのように行うのですか?
あなたはそれを行うことができます:
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
モジュールを使用して、拡張されたをエクスポートする(したがって、インタラクティブな使用の「トップレベル」で再定義する)こともできます*
。
nb。以下のこのエクスポートされたプロシージャのより注意深いバージョンは*
、被乗数全体として発生する場合にのみ「true」と「false」を置き換え、式全体で置き換えを行うわけではありません。(スカラー式には、評価されていない関数呼び出しを含めることができます。たとえば、オプションの引数に「true」と「false」が表示されます。理想的には、これらはそのままにしておく必要があります。)
> 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に置き換えられた場合、newへの呼び出しはありません*
。結果の表示はそれほど良くありませんが、それを回避することも可能かもしれません(そして、回避策は、あなたがこれすべてのために意図しているかもしれない何かを「壊す」可能性があります)、
> 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)のように見えるオブジェクト*
は、実際には、newへの未評価の関数呼び出しに関するもの*
です。したがって、b = falseを代入すると、newが呼び出され*
、目的の結果を得ることができます。(うまくいけば、これは私が見落とした場合に無限の再帰につながることはありません。)