@@ -938,6 +938,36 @@ function _named_idxs(name::Symbol, idxs, call)
938938 :($ name = $ map ($ sym -> $ ex, $ idxs))
939939end
940940
941+ function single_named_expr (expr)
942+ name, call = split_assign (expr)
943+ if Meta. isexpr (name, :ref )
944+ name, idxs = name. args
945+ check_name (name)
946+ var = gensym (name)
947+ ex = quote
948+ $ var = $ (_named (name, call))
949+ $ name = map (i -> $ rename ($ var, Symbol ($ (Meta. quot (name)), :_ , i)), $ idxs)
950+ end
951+ ex
952+ else
953+ check_name (name)
954+ :($ name = $ (_named (name, call)))
955+ end
956+ end
957+
958+ function named_expr (expr)
959+ if Meta. isexpr (expr, :block )
960+ newexpr = Expr (:block )
961+ for ex in expr. args
962+ ex isa LineNumberNode && continue
963+ push! (newexpr. args, single_named_expr (ex))
964+ end
965+ newexpr
966+ else
967+ single_named_expr (expr)
968+ end
969+ end
970+
941971function check_name (name)
942972 name isa Symbol ||
943973 throw (Meta. ParseError (" The lhs must be a symbol (a) or a ref (a[1:10]). Got $name ." ))
946976"""
947977 @named y = foo(x)
948978 @named y[1:10] = foo(x)
979+ @named begin
980+ y[1:10] = foo(x)
981+ z = foo(x)
982+ end
949983 @named y 1:10 i -> foo(x*i) # This is not recommended
950984
951985Pass the LHS name to the model. When it's calling anything that's not an
@@ -974,20 +1008,7 @@ julia> @named y[1:3] = foo(x)
9741008```
9751009"""
9761010macro named (expr)
977- name, call = split_assign (expr)
978- if Meta. isexpr (name, :ref )
979- name, idxs = name. args
980- check_name (name)
981- var = gensym (name)
982- ex = quote
983- $ var = $ (_named (name, call))
984- $ name = map (i -> $ rename ($ var, Symbol ($ (Meta. quot (name)), :_ , i)), $ idxs)
985- end
986- esc (ex)
987- else
988- check_name (name)
989- esc (:($ name = $ (_named (name, call))))
990- end
1011+ esc (named_expr (expr))
9911012end
9921013
9931014macro named (name:: Symbol , idxs, call)
0 commit comments