Here's a simplified version of what I'm trying to do:
SetAttributes[def, HoldFirst]
def[s_Symbol, v_] := (s[x_] := v)
def[f, x^2]
f[3] (* Expected result: 9 *)
(*
x^2
*)
?f (* Expected result: f[x_] := x^2 *)
(*
Global`f
f[x$_] := x^2
*)
Obviously the x
in the x_
pattern gets replaced by x$
. Is there a way I can prevent that? That is, from calling def[f,x^2]
I want to result the definition f[x_] := x^2
. I don't of course care about the name of the variable, so if the resulting function definition reads f[x$_] := x$^2
I'm fine with that, too.
I tried
def[s_Symbol, v_] := With[{x$ = x}, s[x_] := v]
def[s_Symbol, v_] := With[{x = x$}, s[x_] := v]
def[s_Symbol, v_] := (s[x_] := v) /. x :> x$
and
def[s_Symbol, v_] := (s[x_] := v) /. x$ :> x
but none worked.
SetAttributes[def, HoldFirst]; def[s_Symbol, v_] := With[{temp = v}, s = Function @@ {x, temp}]
? $\endgroup$