# Julia 1.0 released

**URL:** <https://discourse.julialang.org/t/julia-1-0-released/13208>\
**Category:** Announcements\
**Created:** [August 11, 2018, 12:10am UTC](https://discourse.julialang.org/t/julia-1-0-released/13208 "2018-08-11T00:10:38Z")\
**Posts on this page:** 20\
**Page:** 4

<div class="post-metadata">

**Author:** ![tshort](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tshort/32/43_2.png) [@tshort](https://discourse.julialang.org/u/tshort)\
**Post date:** [August 27, 2018, 11:20am UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/62 "2018-08-27T11:20:08Z")

</div>

I’ve generally had good luck searching with a term like “fft jl”. The “jl” is more specific than “julia”. It’s good for finding related packages.

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [August 27, 2018, 2:41pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/63 "2018-08-27T14:41:40Z")

</div>

Something like [https://pkg.julialang.org/](https://pkg.julialang.org/)? It does not appear to be maintained amymore, but, provided packages came with a reasonable description, it was searchable.

---

<div class="post-metadata">

**Author:** ![tk3369](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tk3369/32/2824_2.png) [@tk3369](https://discourse.julialang.org/u/tk3369)\
**Post date:** [August 27, 2018, 3:24pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/64 "2018-08-27T15:24:21Z")

</div>

It might be nice to automatically insert a hyperlink that searches for “Julia fft” (or whatever function not found)? If anyone likes that idea then we can even have a couple of links going to discourse, stackoverflow, and more generally google.

---

<div class="post-metadata">

**Author:** ![John\_Gibson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/john_gibson/32/5321_2.png) [@John\_Gibson](https://discourse.julialang.org/u/John_Gibson)\
**Post date:** [August 27, 2018, 3:33pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/65 "2018-08-27T15:33:34Z")

</div>

openSUSE has a “cnf” (command not found) utility that suggests a source and installation method when a known Unix command-line utility is not found in the PATH. E.g.

```julia
gibson@parmenides$ inkscape
If 'inkscape' is not a typo you can use command-not-found to lookup the package that contains it, like this:
    cnf inkscape
gibson@parmenides$ cnf inkscape
                        
The program 'inkscape' can be found in following packages:
  * inkscape [path: /usr/bin/inkscape, repository: zypp (openSUSE-Leap-15.0-1)]
  * inkscape [path: /usr/bin/inkscape, repository: zypp (repo-oss)]

Try installing with:
    sudo zypper install inkscape

```

Something like that for the Julia REPL help mode that searches standard libs would be very helpful.

---

<div class="post-metadata">

**Author:** ![Seif\_Shebl](https://avatars.discourse-cdn.com/v4/letter/s/eada6e/32.png) [@Seif\_Shebl](https://discourse.julialang.org/u/Seif_Shebl)\
**Post date:** [August 27, 2018, 5:48pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/66 "2018-08-27T17:48:39Z")

</div>

> [@DNF](#):
>
> It should be broader than “What happened to the FFT?

Now we’re Googling for fft, while I remember the following top 5 were once Julia’s core-core-core:

[![Julia](https://global.discourse-cdn.com/julialang/original/3X/0/e/0e02004af6a5f4a38d0c17906e0f60689b2378be.png)](http://www_old.julialang.org/)

SepcialFunctions were not so special, SparseArrays were as important as Julia, there was no `using LinearAlgebra`, no `using Random`, let alone the, ughhh, `Random.Seed!()`, etc. These were all available out-of-the box.

Most of the confusion that happened to many people after the release of Julia 1.0, was to a large part due to missing functionality that one day was the default. MATLAB is 13GB, and Julia is 50MB, what would happen if these top 5 were shipped inside a `stdlib` along with the core language? And no user is forced to load a package they don’t use in their project.

---

<div class="post-metadata">

**Author:** ![mattcbro](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mattcbro/32/24487_2.png) [@mattcbro](https://discourse.julialang.org/u/mattcbro)\
**Post date:** [August 27, 2018, 7:15pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/67 "2018-08-27T19:15:51Z")

</div>

Maybe I was a little cranky at how long it took to upgrade my code, nevertheless if it was documented, it was not easy to find. Case in point for the Linear Algebra page which you linked to, note that the library name itself is has to be inferred from entries such as LinearAlgebra.cholesky further down the page, and the examples do not show a using or import statement with the actual library name.

The page name Linear Algebra is not the library name inasmuch as it has a space between Linear and Algebra. The fft library was also just a pure guess for me that it might be FFTW. I’m still not sure if that is the official library name or another external library. FFT does not produce useful search results from the v1.0 manual as far as I could tell.

---

<div class="post-metadata">

**Author:** ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)\
**Post date:** [August 27, 2018, 7:22pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/68 "2018-08-27T19:22:40Z")

</div>

Please help us make this better! Pull requests to improve documentation are greatly appreciated and often best-written by folks who just fell through the gaps in our existing docs. You can edit it directly on GitHub:

> <https://github.com/JuliaLang/julia/blob/master/stdlib/LinearAlgebra/docs/src/index.md>

---

<div class="post-metadata">

**Author:** ![mattcbro](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mattcbro/32/24487_2.png) [@mattcbro](https://discourse.julialang.org/u/mattcbro)\
**Post date:** [August 27, 2018, 7:39pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/69 "2018-08-27T19:39:00Z")

</div>

I will usually have quite a few transpose operations throughout the code, when using complex matrices. In many cases it’s to set up a judicious use of the matrix multiply operator, so that the inner dimensions line up or so that the answer is of the right dimension. In other cases it’s due to interfacing code from developers who are using rows where you would use columns etc. etc. I’m guessing that folks who don’t regularly use complex arrays might not appreciate all the use cases for non-conjugating transpose. One still wants a concise operator for it, rather than the cumbersome permutedims, for the same reason why you want to retain the ’ postfix operator.

I would recommend a change to the form Matrix.H and Matrix.T if the parsing semantics are weird or inconsistent, but we still want concise operators for these operations. (This is used in numpy for the Matrix class I believe)

As for hiding bugs with the broadcasting semantics, it’s happened to me and can be difficult to find in some cases. One simple situation occurs with a construct like this:  
A = B .+ C  
where C is perhaps the transpose of what you thought it was. So maybe B is N x N and C is supposed to be a 1 x N row vector but now its an N x 1 column vector. There will be no error due to size mismatches, but your result will be wrong.

Again I’m not really complaining about this, the new broadcasting rules are helpful, but one does have to be careful.

---

<div class="post-metadata">

**Author:** ![mbauman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mbauman/32/31082_2.png) [@mbauman](https://discourse.julialang.org/u/mbauman)\
**Post date:** [August 27, 2018, 7:48pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/70 "2018-08-27T19:48:11Z")

</div>

With regards to broadcasting, our rules are not new. In fact, they match Numpy’s rules (which predates Julia).

Given that Julia cares _so much more_ about types and dimensionality than Numpy, I’ve also thought about restricting broadcast’s behavior by dimensionality… but you run into trouble very quickly since we don’t have a way to push an array into a higher dimension without adding leading singleton dimensions. The new `Adjoint` and `Transpose` infrastructure actually gives us the ability to push vectors into 2-dimensions without that leading singleton dimension, but in general this requires a whole new vocabulary of co-arrays to perform anything but the most trivial of broadcast operations.

---

<div class="post-metadata">

**Author:** ![mattcbro](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mattcbro/32/24487_2.png) [@mattcbro](https://discourse.julialang.org/u/mattcbro)\
**Post date:** [August 27, 2018, 7:52pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/71 "2018-08-27T19:52:25Z")

</div>

Please don’t take anything I say personally. I do not have a dim view of your decision making process at all. Overall I’m very happy about Julia and it is the tool that we have always wanted for scientific computing.

I’m just pointing out a few things that raised my blood pressure during the conversion process, and certainly I do not intend my “constructive” criticism to bring about any hard feelings.

Now isn’t (A+1)+B = A+(1+B) still true if B is either a matching sized array or itself an elemental value or 1x1 array? I am referring to specifically the special broadcasting case of +(Array{T},{T}). It’s still commutative too.

So it can’t be that. The reason must have something to do with broadcasting semantics. I do not know how that’s implemented, but if there are code transformations that eventually turn the code into the + operator iterated over the array indices, then maybe there are use cases where it breaks broadcasting.

However I actually don’t think so. The reason I don’t think this is the case is that any such transformations would have to adhere to the stricter use of +, and thus the broader use of + that retains elemental broadcasting would still work.

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [August 27, 2018, 7:53pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/72 "2018-08-27T19:53:05Z")

</div>

> [@mattcbro](#):
>
> I would recommend a change to the form Matrix.H and Matrix.T if the parsing semantics are weird or inconsistent, but we still want concise operators for these operations. (This is used in numpy for the Matrix class I believe)

I think this is actually possible to with the new `getproperty` functionality, but it would be quite un-idiomatic. Dot-access is not used the same way in Julia as in Python, which follows standard OO-patterns. So, while possible, I think this would really stick out as a sore thumb.

---

<div class="post-metadata">

**Author:** ![mattcbro](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mattcbro/32/24487_2.png) [@mattcbro](https://discourse.julialang.org/u/mattcbro)\
**Post date:** [August 27, 2018, 7:56pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/73 "2018-08-27T19:56:41Z")

</div>

Well you might be right, if you think of .H and .T as methods acting on an array object. That’s not Julia at all.

However if you think of them as broadcasted operators, it makes sense in a weird way. The operators are recursive after all, applying to each element in the array if necessary.

---

<div class="post-metadata">

**Author:** ![pfitzseb](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pfitzseb/32/45566_2.png) [@pfitzseb](https://discourse.julialang.org/u/pfitzseb)\
**Post date:** [August 27, 2018, 7:59pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/74 "2018-08-27T19:59:56Z")

</div>

I’ll just leave this here:

```julia
julia> Base.getproperty(x::Array, name::Symbol) = name == :ᵀ ? transpose(x) : getfield(x, name)

julia> x = rand(3,3)
3×3 Array{Float64,2}:
 0.509624 0.867343 0.0286342
 0.275996 0.225391 0.486106
 0.314572 0.189146 0.108956

julia> x.ᵀ
3×3 LinearAlgebra.Transpose{Float64,Array{Float64,2}}:
 0.509624 0.275996 0.314572
 0.867343 0.225391 0.189146
 0.0286342 0.486106 0.108956

```

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [August 27, 2018, 7:59pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/75 "2018-08-27T19:59:57Z")

</div>

```julia
function Base.getproperty(A::Matrix{Complex{T}}, d::Symbol) where {T}
    if d == :T
        return transpose(A)
    elseif d == :H
       return A'
    else
       error('Blah')
    end
end

julia> a = rand(ComplexF64, 3, 3)
3×3 Array{Complex{Float64},2}:
 0.292567+0.841058im 0.51117+0.214808im 0.233489+0.979637im
  0.11209+0.128048im 0.240232+0.522118im 0.939373+0.398387im
 0.475112+0.495519im 0.781652+0.457975im 0.449527+0.316821im

julia> a.H
3×3 LinearAlgebra.Adjoint{Complex{Float64},Array{Complex{Float64},2}}:
 0.292567-0.841058im 0.11209-0.128048im 0.475112-0.495519im
  0.51117-0.214808im 0.240232-0.522118im 0.781652-0.457975im
 0.233489-0.979637im 0.939373-0.398387im 0.449527-0.316821im

julia> a.T
3×3 LinearAlgebra.Transpose{Complex{Float64},Array{Complex{Float64},2}}:
 0.292567+0.841058im 0.11209+0.128048im 0.475112+0.495519im
  0.51117+0.214808im 0.240232+0.522118im 0.781652+0.457975im
 0.233489+0.979637im 0.939373+0.398387im 0.449527+0.316821im

julia> a.T == transpose(a)
true

julia> a.H == a'
true

```

Not recommending this, though!!

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [August 27, 2018, 8:00pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/76 "2018-08-27T20:00:30Z")

</div>

That was close…

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [August 27, 2018, 8:02pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/77 "2018-08-27T20:02:12Z")

</div>

My implementation sucks, though, since it will now throw an error for all other field access 😃 !!!

---

<div class="post-metadata">

**Author:** ![mattcbro](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mattcbro/32/24487_2.png) [@mattcbro](https://discourse.julialang.org/u/mattcbro)\
**Post date:** [August 27, 2018, 8:05pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/78 "2018-08-27T20:05:35Z")

</div>

Nevertheless can I use this idiom in my code? I don’t know anything about the getproperty semantics. It might make my code a bit cleaner. In fact the atom editor annoyingly adds a matching ’ whenever you type a single quote.

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [August 27, 2018, 8:07pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/79 "2018-08-27T20:07:08Z")

</div>

I think this is type piracy… But you _can_ do it. It’s even performant.

---

<div class="post-metadata">

**Author:** ![DNF](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dnf/32/10191_2.png) [@DNF](https://discourse.julialang.org/u/DNF)\
**Post date:** [August 27, 2018, 8:09pm UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/80 "2018-08-27T20:09:47Z")

</div>

> [@mattcbro](#):
>
> In fact the atom editor annoyingly adds a matching ’ whenever you type a single quote.

I think it’s OhMyREPL.jl doing that. There’s an issue: [Don't add closing quotation symbol after parens · Issue #124 · KristofferC/OhMyREPL.jl · GitHub](https://github.com/KristofferC/OhMyREPL.jl/issues/124)

Edit: Wait, actually the quote should not normally be closed directly after an identifier.

---

<div class="post-metadata">

**Author:** ![carstenbauer](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/carstenbauer/32/4981_2.png) [@carstenbauer](https://discourse.julialang.org/u/carstenbauer)\
**Post date:** [August 28, 2018, 7:50am UTC](https://discourse.julialang.org/t/julia-1-0-released/13208/81 "2018-08-28T07:50:18Z")

</div>

I just realized that finding FFT documentation is even harder than just finding `fft` in FFTW.jl. It’s actually located in [AbstractFFTs.jl](https://juliamath.github.io/AbstractFFTs.jl/stable/api.html#Public-Interface-1)…

I think this is just horrible from a users perspective. I’m not just confused where `fft` is (I can’t find it in the Julia docs) and even if I find it (in FFTW.jl) I have to go to AbstractFFTs.jl to find documentation.

[Previous page](https://discourse.julialang.org/t/julia-1-0-released/13208.md?page=3)

[Next page](https://discourse.julialang.org/t/julia-1-0-released/13208.md?page=5)
