Any chance 'where' clauses are in the pipeline? It would pretty much just
be syntactic sugar, where the code preceding where would be the same as the
last line of a 'begin ... end' block. It would obviously be welcome for
people coming from languages like Haskell, and is arguably prettier.
Examples:
sorter(x::Array) = begin
if isempty(x)
return x
else
pivot = x[1]
smaller = filter(i-> i < pivot, x[2:end])
larger = filter(i-> i >= pivot, x[2:end])
end
[sorter(smaller), pivot, sorter(larger)]
end
Would become
sorter(x::Array) = [sorter(smaller), pivot, sorter(larger)] where
if isempty(x)
return x
else
pivot = x[1]
smaller = filter(i-> i < pivot, x[2:end])
larger = filter(i-> i >= pivot, x[2:end])
end
end
Which makes the first line express the core functionality, and the code in
the 'where' block details of that functionality.
More interestingly
function derivative(f)
return function(x)
h = x == 0 ? sqrt(eps(Float64)) : sqrt(eps(Float64)) * x
xph = x + h
dx = xph - x
f1 = f(xph)
f0 = f(x)
return (f1 - f0) / dx
end
end
could be written as
derivative(f) = derived where
derived(x) = (f1 - f0) / dx where
h = x == 0 ? sqrt(eps(Float64)) : sqrt(eps(Float64)) * x
xph = x + h
dx = xph - x
f1 = f(xph)
f0 = f(x)
end
end
Which seems like a more natural way to higher-order function when using the
'f(x)=' idiom.
Finally, mixed with a magical future with pattern matching (dispatch on
scalars) we could have code like this:
sorter([]) = []
sorter(x::Array) = [sorter(smaller), pivot, sorter(larger)] where
pivot = x[1]
smaller = filter(i-> i < pivot, x[2:end])
larger = filter(i-> i >= pivot, x[2:end])
end