Cool.  Thanks for the code example.  I will play with it to see what I
can do with it.

Thanks,

Stuart


On Sat, 26 Dec 2015, Josh Langsfeld wrote:

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


Reply via email to