Stefan,
Thanks, I'll try to wrap my head around that :-)

On Friday, April 17, 2015 at 11:48:11 PM UTC+5:30, Stefan Karpinski wrote:
>
> In pseudocode, the meaning of a method definition `f(a,b) = a + 2b` is 
> something like this:
>
> isdefined(:f) || const f = make_generic()
> add_method!(f, (a,b) -> a + 2b)
>
>
>
> On Fri, Apr 17, 2015 at 2:08 PM, Stefan Karpinski <[email protected] 
> <javascript:>> wrote:
>
>> 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] 
>> <javascript:>> 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
>>>
>>
>>
>

Reply via email to