23

12

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.

2How about

`SetAttributes[def, HoldFirst]; def[s_Symbol, v_] := With[{temp = v}, s = Function @@ {x, temp}]`

? – J. M.'s ennui – 2012-08-31T09:28:35.507@J.M.: Thanks, I didn't think of anonymous functions; that's a solution that indeed works for my case. – celtschk – 2012-08-31T09:36:03.643

@J.M.: I have to retract that it works for my problem: I just noticed that anonymous functions don't seem to support optional arguments. – celtschk – 2012-08-31T09:43:46.910