Julia splat操作员解包

Julia splat操作员解包,julia,iterable-unpacking,Julia,Iterable Unpacking,在Python中,可以在iterable的解包中使用*操作符 In [1]: head, *tail = [1, 2, 3, 4, 5] In [2]: head Out[2]: 1 In [3]: tail Out[3]: [2, 3, 4, 5] 我想在朱莉娅身上表现出同样的行为。我认为等效的…操作符可以工作,但在这种情况下,它似乎只是产生了一个错误 julia> head, tail... = [1, 2, 3, 4, 5] ERROR: syntax: invalid ass

在Python中,可以在iterable的解包中使用
*
操作符

In [1]: head, *tail = [1, 2, 3, 4, 5]

In [2]: head
Out[2]: 1

In [3]: tail
Out[3]: [2, 3, 4, 5]
我想在朱莉娅身上表现出同样的行为。我认为等效的
操作符可以工作,但在这种情况下,它似乎只是产生了一个错误

julia> head, tail... = [1, 2, 3, 4, 5]
ERROR: syntax: invalid assignment location "tail..."
我可以使用下面的方法得到我想要的结果,但这是一个丑陋的解决方案

julia> head, tail = A[1], A[2:end]
(1,[2,3,4,5])
我是否可以使用splat(
)操作符解压数组,使
尾部
包含
头部
之后的其余项目?如果没有,最干净的替代方案是什么



编辑:此功能已在中提出。看起来它将成为1.0版本的一部分。

这听起来确实像是宏的工作:

功能解包(左、右)
len=长度(lhs.args)
如果len==1
#只需去除飞溅物
l、 is\u splat=remove\u splat(lhs.args[1])
返回:($l=$(esc(rhs)))
其他的
new_lhs=:()
new_rhs=quote
tmp=$(esc(rhs))
$(表达式(:元组))
结束
飞溅=错误
对于枚举中的(i,e)(lhs.args)
l、 is_splat=移除_splat(e)
如果是我的话
飞溅&错误(“lhs上只允许一次飞溅操作”)
飞溅=真
r=:(tmp[$i:end-$(len-i)])
埃尔塞夫飞溅
r=:(tmp[end-$(len-i)])
其他的
r=:(tmp[$i])
结束
推(新左S.args,l)
推(新的_rhs.args[4].args,r)
结束
返回:($new\u lhs=$new\u rhs)
结束
结束
移除(e::Symbol)=esc(e),false
函数remove\u splat(e::Expr)
如果e.head==:(…)
返回esc(e.args[1]),true
其他的
返回esc(e),错误
结束
结束
宏解包(expr)
如果Meta.isexpr(expr,:(=)
if Meta.isexpr(expr.args[1],:tuple)
返回解包(表达式参数[1],表达式参数[2])
其他的
返回解包(:($(expr.args[1])),expr.args[2])
结束
其他的
错误(“无法分析表达式”)
结束
结束
它没有经过很好的测试,但基本的东西是有效的:

julia>@unpack head,tail…=[1,2,3,4]
(1,[2,3,4])
朱莉娅>@unpack head,middle…,tail=[1,2,3,4,5]
(1,[2,3,4],5)
朱莉娅·戈查斯:

x,y=[1,2,3]#=>x=1,y=2
a=兰特(3)
a[1:3],y=[1,2,3]#=>a=[1.0,1.0,1.0],y=2
宏遵循此行为

@unpack a[1:3],y.=[1,2,3]
#=>a=[1.0,1.0,1.0],y=[2,3]

我不认为头,尾=A[1],A[2:end]是丑陋的,它明确地告诉我们头和尾是什么。如果
A
没有潜在用途,使用
head,tail=shift!(A) ,A
的效率要高一点。@gnimu它变得越来越难看,因为需要拆包的物品越来越多
a,b,c,*d=[1,2,3,4,5]
比使用大量索引或
shift更干净ing,IMHO.:)这听起来像是宏的工作。是的,事实上,在这种情况下,你可以使用
(a,b,c),d=splice!(A,1:3),A
作为一种解决方法。该功能不一定会出现在1.0中–里程碑标签意味着将考虑将其包含在内。正如这个问题所表明的,仍然有一些设计考虑因素需要解决,当然,需要有人实际实现它。