Daniel Turizo
Daniel Turizo

Reputation: 181

Replicating a Julia example

I am trying to learn Julia and I read this article about the quick success of Julia. In the last page of the article the author works a small example showing the benefits of multiple dispatch. They define a custom class Spect and define a plot() function for it. Then for an object sqw of type Spect they can call plot(sqw) without having to edit the original plot function. Moreover, this definition also affects similar plotting functions so that you can also call scatter(sqw) without problems. My issue is that author does not show the code, so I do not understand how can you achieve this. I am specially interested in the fact that just defining plot() for this new class is enough to also call other functions like scatter() without defining them for the new class.

Can someone write a small example of this like that of the article so that I can understand how all of this is achieved? Thank you in advance.

Upvotes: 0

Views: 100

Answers (1)

Oscar Smith
Oscar Smith

Reputation: 6398

Cross posting my answer from Discourse: It’s a shame the article doesn’t link to the code. Here’s my rough reproduction attempt. My version uses the dct and idct so I’m not getting the nice harmonics, but I think it shows the ideas pretty well.

using RecipesBase, FFTW
struct Spect
    points :: AbstractRange
    weights :: Vector{Float64}
end
function Spect(f::Function, min, max, n)
    points = range(min, max, n)
    Spect(points, dct(f.(points)))
end

@recipe function f(S::Spect)
    S.points, idct(S.weights)
end

These definitions are enough for

using Plots
squarewave(x) = iseven(floor(x)) ? 1.0 : 0.0
sqw = Spect(squarewave, 0, 5, 20);

plot(sqw)
scatter(sqw)

plot

and

scatter

Upvotes: 1

Related Questions