# Compiling function with predefined expression

I'm using the Compile function in Mathematica to compute say the following :

f=Compile[{x,_Real},Cos[x]]


Then I can compute f[x] for x taking any real value. Ok, let's say now that I have an expression like tmp=Cos[x].

My question is the following: Is there a way that I can compile the expression assigned to tmp without explicitly typing "Cos[x]" in the Compile function ? I.e. I want to do something like :

f=Compile[{x,_Real},tmp]


But that won't work it seems. In principle I'd like the value assigned to tmp to be a somewhat huge and complicated symbolic function of x that I would like to compile for numerical efficiency.

-
f = With[{tmp = Cos[x]}, Compile[{{x, _Real}}, tmp]] –  rasher Jun 22 at 21:46
Great. I'll take that as an accepted answer If you post it as an answer. –  VanillaSpinIce Jun 22 at 21:50

compiler[fun_] := Compile[{{x, _Real}}, fun]

compiler[Sin[x] + x^2 - 1/(1 + x)]


cf = compiler[Cos[x]];

cf /@ Range[-3., 3., 6/12.]

-

I think the only problem is the fact the the dummy variable x doesn't appear explicitly in tmp before it tmp is evaluated. To fix this, you could define tmp as a function instead. So, I think defining your function as follows should work:

tmp[x_] = Cos[x];
f = Compile[ {x_Real} , tmp[x] ];


Moreover, I don't think the definition of the tmp function has to be a delayed expression.

-
Kris, your reasoning is flawed. Please see CompilePrint[f] (after loading the package <<CompiledFunctionTools ) to understand that your approach doesn't work. The reason is the HoldAll attribute of Compile`. –  halirutan Jun 22 at 22:27