Unfortunately, the rule is simple: "dispatch never looks at keyword arguments."

 -- John

On Aug 21, 2014, at 8:59 AM, Spencer Lyon <[email protected]> wrote:

> Consider the following code:
> 
> function periodogram(x::Array)
>     n = length(x)
>     I_w = abs(fft(x)).^2 ./ n
>     w = 2pi * [0:n-1] ./ n  # Fourier frequencies
> 
>     # int rounds to nearest integer. We want to round up or take 1/2 + 1 to
>     # make sure we get the whole interval from [0, pi]
>     ind = iseven(n) ? int(n / 2  + 1) : int(n / 2)
>     w, I_w = w[1:ind], I_w[1:ind]
>     return w, I_w
> end
> 
> function periodogram(x::Array; window::String="hanning", window_len::Int=7)
>     w, I_w = periodogram(x)
>     I_w = smooth(I_w, window_len=window_len, window=window)
>     return w, I_w
> end
> I would like the interface to work as follows:
> 
> If I have an array x (say x = rand(40)) and I call periodogram(x) I would 
> like just the first function to run
> If I pass either the window or window_len keyword arguments I would like to 
> second function to run.
> The problem is that keyword arguments are treated differently and when I call 
> periodogram(x) it jumps immediately into the second function and gets stuck 
> in an infinite recursion on the first line of that function and results in a 
> stack overflow.
> 
> I can think of a few ways around this problem, but I wanted to ask the group 
> if anyone has a good way to resolve this problem.
> 
> Also, if anyone can explain how keyward arguments are handled when it comes 
> to method dispatch that would be great.
> 
> Thanks.
> 
> ​

Reply via email to