I'm a bit unclear on what the idea behind fexpr is. Maybe it's too early in the morning, but "evaluate a single expression or an array of two or more expressions by using just one function" isn't getting through my head. In any case, any runtime use of eval is almost certainly not a good idea. Higher order functions or macros seem much more likely to be appropriate here. Or, as John said, multiple dispatch may be good.
On Wed, Dec 18, 2013 at 8:16 AM, John Myles White <[email protected]>wrote: > I think you would be better off using multiple dispatch to split your > function by type. > > -- John > > On Dec 18, 2013, at 5:11 AM, Dominik Holenstein <[email protected]> > wrote: > > I am new to Julia programming and not an expert. > > While working on a project which involves the translation of Matlab code > to Julia I had the idea to write a feval(f, x1=NaN) function in Julia to > evaluate a single expression or an array of two or more expressions by > using just one function. > > This is the code of the feval(f, x1=NaN) function: > function feval(f,x1 = NaN) > if isnan(x1) == false > global x = x1 > > end > > if typeof(f) == Array{Expr,1} > > n = size(f,1) > > F = zeros(n,1) > > for i=1:n > > F[i] = eval(f[i]) > > end > > elseif typeof(f) == Expr > > F = 0 > > F = eval(f) > > else > > println("f is a ", typeof(f)) > > error("f is nor an expression nor a single array of expressions.") > > end > > return F > > end > > > > > You can use this function with a single expression or with an array of > expressions, x = 3.5 : > > > > julia> f1 = :(3*x - 2*x + 5) > > :(+(-(*(3,x),*(2,x)),5)) > > > julia> f2 = :(4*x - 3*x/2) > > :(-(*(4,x),/(*(3,x),2))) > > > julia> f = [f1;f2] > > 2-element Array{Expr,1}: > > :(+(-(*(3,x),*(2,x)),5)) > > :(-(*(4,x),/(*(3,x),2))) > > > > > > julia> x = 3.5 > > 3.5 > > > > > > Results: > > julia> res_f1 = feval(f1) > > 8.5 > > > julia> res_f2 = feval(f2) > > 8.75 > > > julia> res_f = feval(f) > > 2x1 Array{Float64,2}: > > 8.5 > > 8.75 > > > > > > Further, you can deliver the optional input value for x with the function > call: > > > > julia> res_f1 = feval(f1, 5.25) > > 10.25 > > > > Note that this changes the global variable x: > > julia> x > > 5.25 > > > > > > In general: Is my appraoch a good or bad idea? Or are there better options > to consider (types, macros etc.)? > > > > Many thanks for your support. > > > > Regards, > > Dominik > >
