macro down(fdef)
  gendtask(expand(macroexpand(fdef)))
end

function gendtask(func::Expr)
Helper.replace(func) do expr
if isa(expr,Expr) && expr.head == :call
#
func = expr.args[1]
#
if isa(func,Expr) && func.head == :call && length(func.args) == 3 && 
func.args[3] == :(:download)
#
dtask_id, code, opt = expr.args[2:end]

ast = Base.uncompressed_ast(code)
args = ast.args[1]
capt = ast.args[2][2]

#which args are modified?
modified = []
dargs = Any[args...]

for (name,typ,flags) in capt
push!(dargs,name)
if (flags & 0x4) != 0
push!(modified,name)
end
end
id = dtask_id.parameters[1]
dt = DownloadTask(code,opt)
dtask_info[id] =  dt

#generate the call!
download_call = 
expand(:(Transmission.Download.download_task($dtask_id,$((dargs...,)))))

if isempty(modified)
return download_call
else
return :(($(modified...)) = ($(download_call)))
end
end
end
nothing
end
end
end



On Thursday, March 10, 2016 at 3:48:49 PM UTC-8, Yichao Yu wrote:
>
> On Thu, Mar 10, 2016 at 6:04 PM, Julia Tylors <julia...@gmail.com 
> <javascript:>> wrote: 
> > 
> > 
> > Hi fellows, I have a problem which i can't solve. 
> > 
> > I have a function test(x,y) which has the ast as follows: 
> > (test.env.defs.func.code) 
> > 
> > 
> > :($(Expr(:method, :test, 
> > :((top(svec))((top(apply_type))(Tuple,Any,Any),(top(svec))())), 
> > AST(:($(Expr(:lambda, Any[:x,:y], 
> > 
> Any[Any[Any[:x,:Any,1],Any[:y,:Any,1],Any[:v1,:Any,7],Any[:v2,:Any,7]],Any[],0,Any[]],
>  
>
> > :(begin  # none, line 2: 
> >         NewvarNode(:v1) 
> >         NewvarNode(:v2) 
> >         v1 = 2.1 
> >         v2 = 2.2 
> >         $(Expr(:(=), :v1, :v2, 
> > 
> :(((top(getfield))((top(getfield))(Transmission,:Download),:download_task))(Val{symbol("##7775")},x,y,v1,v2))))
>  
>
> >         return v1 + v2 
> >     end))))), false))) 
> > 
> > 
>
> Can you show how you generated `test`? 
>
> > 
> > when i call test(1.1,2.2), it returns 4.4 but it should have returned 
> > v1 = 1.1*2.2 = 2.42 
> > v2 = 2.2*2.1 = 4.62 
> > 
> > so the result should be v1+v2 , 7.04 
> > 
> > Here is the download_task function. 
> > @generated function download_task{id}(::Type{Val{id}}, args...) 
> > println("Download Task $id for argument types $args") 
> > :((args[1] * args[2]), (args[2] * args[3])) 
> > end 
> > 
> > I am suspicious about the part in bold 
> > 
> > $(Expr(:(=), :v1, :v2, 
> > 
> :(((top(getfield))((top(getfield))(Transmission,:Download),:download_task))(Val{symbol("##7775")},x,y,v1,v2))))
>  
>
> > 
> > this part doesn't get executed! Or somewhat expanded wrong. I am not 
> totally 
> > sure. 
> > Anyone with a better understanding , please help me out.! 
> > 
> > Thanks 
>

Reply via email to