Skip to content

Commit 2e10393

Browse files
authored
Merge pull request #2045 from SciML/myb/named
Add block `at named`
2 parents 4015a53 + 04477f6 commit 2e10393

File tree

2 files changed

+45
-14
lines changed

2 files changed

+45
-14
lines changed

src/systems/abstractsystem.jl

+38-14
Original file line numberDiff line numberDiff line change
@@ -962,6 +962,39 @@ function _named_idxs(name::Symbol, idxs, call)
962962
:($name = $map($sym -> $ex, $idxs))
963963
end
964964

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+
965998
function check_name(name)
966999
name isa Symbol ||
9671000
throw(Meta.ParseError("The lhs must be a symbol (a) or a ref (a[1:10]). Got $name."))
@@ -970,6 +1003,10 @@ end
9701003
"""
9711004
@named y = foo(x)
9721005
@named y[1:10] = foo(x)
1006+
@named begin
1007+
y[1:10] = foo(x)
1008+
z = foo(x)
1009+
end # returns `[y; z]`
9731010
@named y 1:10 i -> foo(x*i) # This is not recommended
9741011
9751012
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)
9981035
```
9991036
"""
10001037
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))
10151039
end
10161040

10171041
macro named(name::Symbol, idxs, call)

test/direct.jl

+7
Original file line numberDiff line numberDiff line change
@@ -257,3 +257,10 @@ foo(i; name) = (; i, name)
257257
@test isequal(goo, [(i = 10, name = Symbol(:goo_, i)) for i in 1:3])
258258
@named koo 1:3 i->foo(10i)
259259
@test isequal(koo, [(i = 10i, name = Symbol(:koo_, i)) for i in 1:3])
260+
xys = @named begin
261+
x = foo(12)
262+
y[1:3] = foo(13)
263+
end
264+
@test isequal(x, (i = 12, name = :x))
265+
@test isequal(y, [(i = 13, name = Symbol(:y_, i)) for i in 1:3])
266+
@test isequal(xys, [x; y])

0 commit comments

Comments
 (0)