Maple中has([_passed],'op1')处理布尔可选参数异常问题咨询
布尔类型可选参数的传入检测异常问题解析
在Maple中尝试通过has([_passed], 'op1')判断可选参数是否被实际传入时,发现当参数为布尔类型时表现异常:函数f(含整数型可选参数)能正常工作,但函数g(含布尔型可选参数)在调用g(x,op2=true)时,错误地检测到op1被传入。相关代码与输出如下:
f:=proc(x,{op1::integer:=1,op2::boolean:=false}); print(has([_passed],'op1'),has([_passed],'op2')); end proc: g:=proc(x,{op1::boolean:=true,op2::boolean:=false}); print(has([_passed],'op1'),has([_passed],'op2')); end proc: "Correct:"; f(x); f(x,op1=1); f(x,op2=true); f(x,op1=1,op2=true); "Incorrect:"; g(x); g(x,op1=true); g(x,op2=true); #this case gives incorrect result g(x,op1=true,op2=true);
输出结果:
"Correct:" false, false true, false false, true true, true "Incorrect:" false, false true, false true, true true, true
问题原因解析
问题根源在于Maple中has函数的行为特性:has(expr, sym)用于检测符号sym是否作为子表达式存在于expr中,但当sym对应的可选参数是布尔类型且默认值为true时,has会误将表达式中的true常量与符号sym关联。
在函数g中,op1的默认值为true,当调用g(x,op2=true)时,[_passed]列表包含x和op2=true。此时has([_passed], 'op1')会递归检查列表中的所有子表达式,发现op2=true中的true与op1的默认值相同,错误地返回true,导致误判op1被传入。
而函数f中op1是整数类型,默认值1不会与其他参数的值(如true)产生混淆,因此has能正常工作。
正确的检测方式
应直接检查_passed中是否包含以目标参数为左值的方程,比如使用member(op1=anything, [_passed])替代has([_passed], 'op1'),这样可以精准判断参数是否被显式传入。
内容的提问来源于stack exchange,提问作者Robertas Vilkas
相关产品推荐
相关产品推荐

