Wolfram mathematica 在函数体中直接替换参数,如符号><;,!===

Wolfram mathematica 在函数体中直接替换参数,如符号><;,!===,wolfram-mathematica,Wolfram Mathematica,让我们假设我调用一个带有更大符号“>”的函数作为参数: findb[x^2 - 10, ">", 0] 我不想在函数体中测试第二个参数是什么(通常的设计),而是希望它直接替换出现的每个表达式: findb[exp_Plus, ptest_String, value_?NumberQ] := Module[{}, x /. Flatten[{FindInstance[(exp ToExpression[ptest] value) && x != 0 , x

让我们假设我调用一个带有更大符号“>”的函数作为参数:

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 , ... ]
开关[ptest,
“>”,exp>值,

“使用
ToString
将整个表达式构造为一个字符串,并将其输入到
ToExpression
。建议您将此类问题提交给mathematica.stackexchange.comminor improvent:
ToString
可以应用于字符串,因此您可以将其编写得更简洁,如
ToExpression@StringJoin[ToString/@{exp,ptest,value}]