I’m trying to understand how method definitions work inside functions. (Is this mentioned anywhere in the documentation?) From this post I learned that all method definitions for a given local function
f are combined to an anonymous functions, and each definition is replaced by assigning this anonymous function to
f. It doesn’t matter where the method definitions occur inside the enclosing function. For example, the function
function a() f() = 0 return f f(x) = x end
returns a function with two methods. If there are two methods with the same signature, then the first one is ignored, and the user gets a warning.
However, there are cases where this explanation doesn’t seem to work (with Julia 1.6.1). For instance, I get
function b1() if true f() = 0 else f(x) = x end end b1() # generic function with 2 methods (as expected)
function b2() if false f() = 0 else f(x) = x end end b2() # UndefVarError: f not defined
The picture gets even confusing if one adds empty functions. Here are some examples:
function c1() function f end return f end c1() # generic function with 0 methods (as expected) function c2() function f end return f f() = 0 end c2() # UndefVarError: f not defined function c3() g = function f end return g end c3() # generic function with 0 methods (as expected) function c4() g = function f end return g f() = 0 end c4() # nothing (which is not even a function) function c5() if false f() = 0 else function f end end end c5() # nothing
Is this the intended behavior? If yes, what are the rules behind this?