Since Julia functions are generic by default, adding methods cannot do assignment of a function object to a binding, since otherwise only the last definition given for any function would ever be part of the function. So when you write this, for example:
f(a,b) = a + 2b f(a,b,c) = a + 2b + 3c the meaning of the second line cannot be `f = (a,b,c) -> a + 2b + 3c` since if that were the case, then the method defined by the first line would be blown away. Another difference is that when you define a method of a generic function, the binding to that function is const. You can have other non-const bindings to the function, but the binding that is automatically created is const. This is for performance: if you know what function a name refers to you can do inlining and type inference; if you don't then you can't do either of those things and you're basically screwed performance-wise. On Fri, Apr 17, 2015 at 1:26 PM, Ravi Mohan <[email protected]> wrote: > Hi, > I'm learning Julia by working through the manual and came across something > that tripped me a bit. > I am sure this is just my not understanding things correctly > > ravi@ubuntu:~/projects/learnjulia$ julia -v > julia version 0.3.6 > > > julia> f = (x,y) -> x + y > (anonymous function) > > julia> f(2,3) > 5 > > julia> g = (x,y) -> x - y > (anonymous function) > > julia> g (2,3) > -1 > > julia> f = g > (anonymous function) > > julia> f(2,3) > -1 > > but this doesn't > > julia> function m(x,y) x + y end > m (generic function with 1 method) > > julia> function n(x,y) x - y end > n (generic function with 1 method) > > julia> m(2,3) > 5 > > julia> n(2,3) > -1 > > julia> m = n > ERROR: invalid redefinition of constant m > > My "scripting" languages are Python and Scheme, where this works > Python: > > >>> def f (x,y): > ... return x + y > ... > >>> def g (x,y): > ... return x - y > ... > >>> f(2,3) > 5 > >>> g(2,3) > -1 > >>> f = g > >>> f(2,3) > -1 > > and in Dr. Racket > > > (define (f x y) (+ x y)) > > (f 2 3) > 5 > > (define (g x y) (- x y)) > > (g 2 3 ) > -1 > > (set! f g) > > (f 2 3) > -1 > > So I'm guessing 'simple' and anonymous functions have different semantics > wrt function names. the function m(x,y) ... end form seems to create a > 'generic function' consider the name (here, m) to be a constant . I found > this interesting. Could you help me understand ? As I said, while I am an > experienced developer, I am new to Julia. > (I'm guessing this has something to do with how multimethods work etc, and > while I've read about CLOS etc,I've never used it in anger) > > Thanks in advance >
