3
$\begingroup$

I have a list of functional rules of the type F[x_]:=y;cond[x] with always the same condition. The list is long and rule 1 of programming says: "Do not copy!" I surely can somehow "extract" my condition?!

fromherecondmusthold statement
F[x_]:=y; (*if cond[x]*)
G[x_]:=z; (*if cond[x]*)
fromherecondmustnolongerhold statement

As you see, a slight snag would be that F[u_]:=v would not match the pattern, although an underscored variable is a bound one that could have any other name.

$\endgroup$

1 Answer 1

4
$\begingroup$

As an example we choose a condition x>0:

ClearAll[f1, f2];
With[{y = x_ /; x > 0},
 f1[y] = x;
 f2[y] = 2 x;
 ]

Now to test:

f1[-1]
(*f1[-1]*)
f1[1]
(*1*)
f2[-1]
(*f2[-1]*)
f2[1]
(*2*)
$\endgroup$
4
  • $\begingroup$ I desperately tried to include 2 variables. Say, f computes y-x but only if y>x. I tried out about any syntax...except the correct :-/ Can you help again? $\endgroup$ Commented Nov 2, 2021 at 10:45
  • $\begingroup$ Try: Clear[f1, cond]; cond[x_, y_] := (x > y); f1[x_, y_] := x + y /; cond[x, y]; $\endgroup$ Commented Nov 2, 2021 at 11:24
  • $\begingroup$ That works for one function, but not for many. I tried the following: With[{assigns}/;cond,f1=...;f2=...;] is wrong syntax, With wants a list. Even a nested With doesn't scope where it should: With[{v = b_}, With[{u = a_ /; u > v}, g[u, v] := a/b]];. It also doesn't matter if u>v is a>b or any mix - the outer assign doesn't make it into the inner bracket. $\endgroup$ Commented Nov 3, 2021 at 9:35
  • $\begingroup$ No, the idea was: Clear[f1, cond]; cond[x_, y_] := (x > y); f1[x_, y_] := x + y /; cond[x, y];f2[x_, y_] := x +2 y /; cond[x, y];... repeating cond[...] $\endgroup$ Commented Nov 3, 2021 at 9:55

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.