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 neither worked.
SetAttributes[def, HoldFirst]; def[s_Symbol, v_] := With[{temp = v}, s = Function @@ {x, temp}]? – J. M.♦ Aug 31 '12 at 9:28