On Wed, Jan 27, 2016 at 9:47 PM, Fady Shoukry <[email protected]> wrote:
>
>>
>> Depending on what API JuMP provide and what API you want to provide, I
>> think you should either keep the dict (if JuMP can handle it) or use
>> meta programing to construct an AST/function based on the user input
>> and evaluate that.
>
>
> Thanks for the quick reply. Could you elaborate on that last part regarding
> constructing an AST/function (with an example if possible)?
>
A simple example that hopefully shows what I meant,
```
julia> vars = [:a, :b]
2-element Array{Symbol,1}:
:a
:b
julia> expr = :(a + b)
:(a + b)
julia> function make_function(name, vars, expr)
:(function $name()
$([:($v = 1) for v in vars]...)
$expr
end)
end
make_function (generic function with 1 method)
julia> func_ast = make_function(:new_function, vars, expr)
:(function new_function() # none, line 3:
a = 1
b = 1 # none, line 4:
a + b
end)
julia> eval(func_ast)
new_function (generic function with 1 method)
julia> new_function()
2
julia> @code_warntype new_function()
Variables:
a::Int64
b::Int64
Body:
begin # none, line 3:
a = 1
b = 1 # none, line 4:
return (Base.box)(Int64,(Base.add_int)(a::Int64,b::Int64))
end::Int64
```