在函数体中直接替换参数,例如符号 >、<、!=、==
Direct replacement within a function body of arguments such as the symbols >, <, !=, ==
假设我调用一个带有更大符号“>”的函数作为参数:
findb[x^2 - 10, ">", 0]
我不想在函数体内测试第二个参数是什么(通常的设计),而是希望它直接替换它出现的每个表达式:
findb[exp_Plus, ptest_String, value_?NumberQ] :=
Module[{},
x /. Flatten[{FindInstance[(exp ToExpression[ptest] value) &&
x != 0 , x, Reals]}]]
因为这不能与内置的 ToExpression
一起使用,如何实现这个结果?
正如@agentp 所暗示的,这里的答案是可以的:
findb[exp_Plus, ptest_String, value_?NumberQ] := Module[{},
x /.Flatten[{FindInstance[(ToExpression[
StringJoin[ToString[exp, InputForm], ptest,
ToString[value]]]) && x != 0 , x, Reals]}]]
但是我觉得这很冗长。可以改进吗?
替代方法,假设您支持离散的允许运算符列表:
Switch[ ptest ,
">" , exp > value ,
"<" , exp < value , ... ]
不优雅,但它可能是最安全最可靠的方法。
假设我调用一个带有更大符号“>”的函数作为参数:
findb[x^2 - 10, ">", 0]
我不想在函数体内测试第二个参数是什么(通常的设计),而是希望它直接替换它出现的每个表达式:
findb[exp_Plus, ptest_String, value_?NumberQ] :=
Module[{},
x /. Flatten[{FindInstance[(exp ToExpression[ptest] value) &&
x != 0 , x, Reals]}]]
因为这不能与内置的 ToExpression
一起使用,如何实现这个结果?
正如@agentp 所暗示的,这里的答案是可以的:
findb[exp_Plus, ptest_String, value_?NumberQ] := Module[{},
x /.Flatten[{FindInstance[(ToExpression[
StringJoin[ToString[exp, InputForm], ptest,
ToString[value]]]) && x != 0 , x, Reals]}]]
但是我觉得这很冗长。可以改进吗?
替代方法,假设您支持离散的允许运算符列表:
Switch[ ptest ,
">" , exp > value ,
"<" , exp < value , ... ]
不优雅,但它可能是最安全最可靠的方法。