[a;b] is a bit regressed now when it comes to type stability, see: 
https://github.com/JuliaLang/julia/issues/13254

On Monday, October 19, 2015 at 4:56:40 PM UTC+2, Josh Langsfeld wrote:
>
> [a; b] / vcat(...) is type stable. It may produce different output 
> depending on the types of a and b but it won't change behavior depending on 
> their values.
>
> On Monday, October 19, 2015 at 10:20:06 AM UTC-4, Andras Niedermayer wrote:
>>
>> In light of the recent discussions (
>> https://groups.google.com/forum/#!topic/julia-users/xJ7GpKAa16E and 
>> https://groups.google.com/forum/#!topic/julia-users/_lIVpV0e_WI) I got 
>> curious, whether there is a non-modifying version of push!, since 
>> push!(copy(a),b) doesn't feel right (I try to avoid modifying functions, 
>> except if I really need performance) and [a; b] is not type stable:
>>
>> f(a) = [a; 3]
>> f2(a) = push!(copy(a),3)
>>
>>
>> julia> Base.return_types(f,(Array{Int64,1},))
>> 1-element Array{Any,1}:
>>  Array{T,N}
>>
>>
>> julia> Base.return_types(f2,(Array{Int64,1},))
>> 1-element Array{Any,1}:
>>  Array{Int64,1}
>>
>>
>> I couldn't find anything in the Julia docs. Of course, I could just 
>> define my own
>>
>> push(a,vars...) = push!(copy(a),vars...)
>>
>>
>> but if there is a standard way to do that, I'd prefer that. Maybe there's 
>> also some clever way to avoid making a copy if `a` is a literal (e.g. 
>> push([1,2])
>> ).
>>
>> The same applies to unshift, etc.
>>
>> (Non-modifying `shift!` and `pop!` already exist with the names `first` 
>> and `last`. I'd find it easier to remember `shift` and `pop` -- it would 
>> also be more similar to `merge` vs `merge!` for dictionaries, but I guess 
>> that's just my taste.)
>>
>

Reply via email to