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 >