@@ -597,13 +597,16 @@ function Base.show(io::IO, ::MIME"text/plain", sys::AbstractSystem)
597
597
return nothing
598
598
end
599
599
600
- function _named (expr)
600
+ function split_assign (expr)
601
601
if ! (expr isa Expr && expr. head === :(= ) && expr. args[2 ]. head === :call )
602
602
throw (ArgumentError (" expression should be of the form `sys = foo(a, b)`" ))
603
603
end
604
604
name, call = expr. args
605
+ end
605
606
607
+ function _named (name, call, runtime= false )
606
608
has_kw = false
609
+ call isa Expr || throw (Meta. ParseError (" The rhs must be an Expr. Got $call ." ))
607
610
if length (call. args) >= 2 && call. args[2 ] isa Expr
608
611
# canonicalize to use `:parameters`
609
612
if call. args[2 ]. head === :kw
@@ -626,18 +629,46 @@ function _named(expr)
626
629
kws = call. args[2 ]. args
627
630
628
631
if ! any (kw-> (kw isa Symbol ? kw : kw. args[1 ]) == :name , kws) # don't overwrite `name` kwarg
629
- pushfirst! (kws, Expr (:kw , :name , Meta. quot (name)))
632
+ pushfirst! (kws, Expr (:kw , :name , runtime ? name : Meta. quot (name)))
633
+ end
634
+ call
635
+ end
636
+
637
+ function _named_idxs (name:: Symbol , idxs, call)
638
+ if call. head != = :->
639
+ throw (ArgumentError (" Not an anonymous function" ))
640
+ end
641
+ if ! isa (call. args[1 ], Symbol)
642
+ throw (ArgumentError (" not a single-argument anonymous function" ))
630
643
end
631
- :($ name = $ call)
644
+ sym, ex = call. args
645
+ ex = Base. Cartesian. poplinenum (ex)
646
+ ex = _named (:(Symbol ($ (Meta. quot (name)), :_ , $ sym)), ex, true )
647
+ ex = Base. Cartesian. poplinenum (ex)
648
+ :($ name = $ map ($ sym-> $ ex, $ idxs))
632
649
end
633
650
651
+ check_name (name) = name isa Symbol || throw (Meta. ParseError (" The lhs must be a symbol (a) or a ref (a[1:10]). Got $name ." ))
652
+
634
653
"""
635
654
$(SIGNATURES)
636
655
637
656
Rewrite `@named y = foo(x)` to `y = foo(x; name=:y)`.
638
657
"""
639
658
macro named (expr)
640
- esc (_named (expr))
659
+ name, call = split_assign (expr)
660
+ if Meta. isexpr (name, :ref )
661
+ name, idxs = name. args
662
+ check_name (name)
663
+ esc (_named_idxs (name, idxs, :($ (gensym ()) -> $ call)))
664
+ else
665
+ check_name (name)
666
+ esc (:($ name = $ (_named (name, call))))
667
+ end
668
+ end
669
+
670
+ macro named (name:: Symbol , idxs, call)
671
+ esc (_named_idxs (name, idxs, call))
641
672
end
642
673
643
674
function _config (expr, namespace)
0 commit comments