@@ -962,6 +962,39 @@ function _named_idxs(name::Symbol, idxs, call)
962
962
:($ name = $ map ($ sym -> $ ex, $ idxs))
963
963
end
964
964
965
+ function single_named_expr (expr)
966
+ name, call = split_assign (expr)
967
+ if Meta. isexpr (name, :ref )
968
+ name, idxs = name. args
969
+ check_name (name)
970
+ var = gensym (name)
971
+ ex = quote
972
+ $ var = $ (_named (name, call))
973
+ $ name = map (i -> $ rename ($ var, Symbol ($ (Meta. quot (name)), :_ , i)), $ idxs)
974
+ end
975
+ ex
976
+ else
977
+ check_name (name)
978
+ :($ name = $ (_named (name, call)))
979
+ end
980
+ end
981
+
982
+ function named_expr (expr)
983
+ if Meta. isexpr (expr, :block )
984
+ newexpr = Expr (:block )
985
+ names = Expr (:vcat )
986
+ for ex in expr. args
987
+ ex isa LineNumberNode && continue
988
+ push! (newexpr. args, single_named_expr (ex))
989
+ push! (names. args, ex. args[1 ])
990
+ end
991
+ push! (newexpr. args, names)
992
+ newexpr
993
+ else
994
+ single_named_expr (expr)
995
+ end
996
+ end
997
+
965
998
function check_name (name)
966
999
name isa Symbol ||
967
1000
throw (Meta. ParseError (" The lhs must be a symbol (a) or a ref (a[1:10]). Got $name ." ))
@@ -970,6 +1003,10 @@ end
970
1003
"""
971
1004
@named y = foo(x)
972
1005
@named y[1:10] = foo(x)
1006
+ @named begin
1007
+ y[1:10] = foo(x)
1008
+ z = foo(x)
1009
+ end # returns `[y; z]`
973
1010
@named y 1:10 i -> foo(x*i) # This is not recommended
974
1011
975
1012
Pass the LHS name to the model. When it's calling anything that's not an
@@ -998,20 +1035,7 @@ julia> @named y[1:3] = foo(x)
998
1035
```
999
1036
"""
1000
1037
macro named (expr)
1001
- name, call = split_assign (expr)
1002
- if Meta. isexpr (name, :ref )
1003
- name, idxs = name. args
1004
- check_name (name)
1005
- var = gensym (name)
1006
- ex = quote
1007
- $ var = $ (_named (name, call))
1008
- $ name = map (i -> $ rename ($ var, Symbol ($ (Meta. quot (name)), :_ , i)), $ idxs)
1009
- end
1010
- esc (ex)
1011
- else
1012
- check_name (name)
1013
- esc (:($ name = $ (_named (name, call))))
1014
- end
1038
+ esc (named_expr (expr))
1015
1039
end
1016
1040
1017
1041
macro named (name:: Symbol , idxs, call)
0 commit comments