As Yichao is hinting, you may find a macro to be a cleaner way of making
your functions instead of constructing and parsing a string.
macro return_fcn(N)
xexprs = Expr[:($(symbol(:x,i)) = X[$i]) for i=1:N]
return esc(:(
function $(symbol(:f,N))(X::Vector)
$(xexprs...)
mu = X[$(N+1)]
end
))
end
julia> macroexpand(:(@return_fcn(2)))
:(function f2(X::Vector)
x1 = X[1]
x2 = X[2]
mu = X[3]
end)
julia> macroexpand(:(@return_fcn(4)))
:(function f4(X::Vector)
x1 = X[1]
x2 = X[2]
x3 = X[3]
x4 = X[4]
mu = X[5]
end)
On Saturday, December 26, 2015 at 2:03:56 PM UTC-5, Stuart Brorson wrote:
>
> Julia users,
>
> I'm fiddling around with Julia's strings & metaprogramming. I am
> constructing a function by concatenating a bunch of strings together
> to create my function, like this:
>
> function return_fcn(N)
> P = string("function f$N(X::Vector)\n")
> for i in 1:N
> P = string(P, "x$i = X[$i];\n");
> end
> P = string(P, "mu = X[$(N+1)];\n")
> etc....
>
> When I execute this code, I get:
>
> julia> y = return_fcn(2)
> "function f2(X::Vector)\nx1 = X[1];\nx2 = X[2];\nmu = X[3];\n"
>
> However, what I really want to see is
>
> function f2(X::Vector)
> x1 = X[1];
> x2 = X[2];
> mu = X[3];
>
> "show(y)" doesn't seem to do what I want. Later, when I do
>
> eval(parse(y))
>
> then I get a function which executes correctly. My problem is simply
> that I can't get Julia to give me a string I can read easily. This
> will be a very big issue for me when N -> 1024, 2048, etc....
>
> Questions:
>
> 1. How can I escape the \n to get a real <CR><LF> in my displayed
> string?
>
> 2. Is this the optimal way to construct a program for later execution
> (i.e. metaprogramming)?
>
> Thanks for all wisdom you have to offer.
>
> Stuart
>