@@ -363,37 +363,47 @@ function replace_broadcast(fn::Symbol)
363
363
end
364
364
365
365
function _par (ex:: Expr ; lazy= true , recur= true , opts= ())
366
- if ex. head == :call && recur
367
- f = replace_broadcast (ex. args[1 ])
368
- if length (ex. args) >= 2 && Meta. isexpr (ex. args[2 ], :parameters )
369
- args = ex. args[3 : end ]
370
- kwargs = ex. args[2 ]
371
- else
372
- args = ex. args[2 : end ]
373
- kwargs = Expr (:parameters )
366
+ body = nothing
367
+ if recur && @capture (ex, f_ (allargs__)) || @capture (ex, f_ (allargs__) do cargs_ body_ end )
368
+ f = replace_broadcast (f)
369
+ args = filter (arg-> ! Meta. isexpr (arg, :parameters ), allargs)
370
+ kwargs = filter (arg-> Meta. isexpr (arg, :parameters ), allargs)
371
+ if ! isempty (kwargs)
372
+ kwargs = only (kwargs). args
373
+ end
374
+ if body != = nothing
375
+ f = quote
376
+ ($ (args... ); $ (kwargs... ))-> $ f ($ (args... ); $ (kwargs... )) do $ cargs
377
+ $ body
378
+ end
379
+ end
374
380
end
375
- args_ex = _par .(args; lazy= lazy, recur= false )
376
- kwargs_ex = _par .(kwargs. args; lazy= lazy, recur= false )
377
381
if lazy
378
- return :(Dagger. delayed ($ f, $ Options (;$ (opts... )))($ (args_ex ... ); $ (kwargs_ex ... )))
382
+ return :(Dagger. delayed ($ f, $ Options (;$ (opts... )))($ (args ... ); $ (kwargs ... )))
379
383
else
380
384
sync_var = Base. sync_varname
381
385
@gensym result
382
386
return quote
383
- let args = ( $ (args_ex ... ),)
384
- $ result = $ spawn ($ f, $ Options (;$ (opts... )), args... ; $ (kwargs_ex ... ))
387
+ let
388
+ $ result = $ spawn ($ f, $ Options (;$ (opts... )), $ ( args... ) ; $ (kwargs ... ))
385
389
if $ (Expr (:islocal , sync_var))
386
390
put! ($ sync_var, schedule (Task (()-> wait ($ result))))
387
391
end
388
392
$ result
389
393
end
390
394
end
391
395
end
396
+ elseif lazy
397
+ # Recurse into the expression
398
+ return Expr (ex. head, _par_inner .(ex. args, lazy= lazy, recur= recur, opts= opts)... )
392
399
else
393
- return Expr (ex . head, _par .(ex . args, lazy = lazy, recur = recur, opts = opts) ... )
400
+ throw ( ArgumentError ( " Invalid Dagger task expression: $ex " ) )
394
401
end
395
402
end
396
- _par (ex; kwargs... ) = ex
403
+ _par (ex; kwargs... ) = throw (ArgumentError (" Invalid Dagger task expression: $ex " ))
404
+
405
+ _par_inner (ex; kwargs... ) = ex
406
+ _par_inner (ex:: Expr ; kwargs... ) = _par (ex; kwargs... )
397
407
398
408
"""
399
409
Dagger.spawn(f, args...; kwargs...) -> DTask
0 commit comments