Non-numeric arguments to Compile-d functions

*To*: mathgroup at smc.vnet.net*Subject*: [mg82117] Non-numeric arguments to Compile-d functions*From*: "Andrew Moylan" <andrew.j.moylan at gmail.com>*Date*: Fri, 12 Oct 2007 03:02:15 -0400 (EDT)

Here's a compiled function that does some (made-up) operation on a real-valued function f: Compile[{}, Do[If[f[i] < 0, Return[{i, f[i]}]], {i, 10}], {{f[_], _Real}} ] (It finds the first integer i such that f[i] is negative.) For the usual reasons of modularity, I would like to make compiled functions like this not refer to global variables named f. (We can't put f as one of the elements of the first argument to compile, because those must all be numeric scalars or arrays.) Here's one way to do this: Module[ {f, compiledpart}, compiledpart = Compile[{}, Do[If[f[i] < 0, Return[{i, f[i]}]], {i, 10}], {{f[_], _Real}} ]; findfirstnegative[tempf_] := (compiledpart /. f -> tempf)[] ] I don't really like this solution because we needed to use two names (f and tempf). Using two names per argument could get messy if there are several non-numeric arguments instead of just f. Is this the recommended method for compiling "as much of a function as possible"? Note that the following attempt (which doesn't need a tempf) doesn't work: With[{rhs = compiledpart}, findfirstnegative[f_] := rhs] It fails because Mathematica automatically renames the f in the CompiledFunction in compiledpart to *avoid* the very naming clash I am trying to create. The With statement effectively creates: findfirstnegative[f$_] := CompiledFunction[{}, Do[If[f$851[i]<0, Return[{i,f$851[i]}]], {i,10}], -CompiledCode- ] What's the neatest, "right" way to make compiled functions that take non-numeric arguments?