Re: [julia-users] Methods inside type definition, use of "self" ?

2016-08-10 Thread Tamas Papp
Broadly yes. In Julia (and Common Lisp, Dylan, etc), methods do not
"belong" to a class intrinsically. If you want to read up about this
paradigm, search for "multiple dispatch" or "multimethods".

On Wed, Aug 10 2016, Willem Hekman wrote:

> Hello all,
>
> I must say that I`m quite new to object oriented programming. 
>
> Do I understand correctly from the manual that in Julia (unlike python) you 
> do not use the keyword "self" and declare methods that apply to a type 
> outside the type definition?
>
> To illustrate, let's say we want to have a type of apple and want to push a 
> flavor to the array of flavors that characterizes an apple:
>
> # define a type: Apple
> type Apple
> brand::ASCIIString
> color::ASCIIString
> flavors::Array{ASCIIString,1}
> 
> 
> end
>
> # a method designed to add flavors to the apple
> function add_flavor(apple::Apple,flavor::ASCIIString)
>
> push!(apple.flavors,flavor)
> end
> # create an instance of an AppleFuji = Apple("Fuji","red",["sweet"])
>
> # add a flavor
> add_flavor(Fuji, "sour")
>
> Is this the way you'd do it in Julia?
>
> In python I got used to putting methods that apply to "Apple" instances 
> inside the type definition where the keyword "self" would be used to add a 
> flavor: push!(self.flavors,flavor)
>
> What would you say?
>
> -Willem



Re: [julia-users] Methods inside type definition, use of "self" ?

2016-08-10 Thread Willem Hekman
Thank you for the quick reply. 

With this example it makes much sense: 

Depending on the language you will have to adopt a different style of 
programming. 

That makes much sense ;-)

On Wednesday, August 10, 2016 at 9:46:26 AM UTC+2, Mauro wrote:
>
> Yes, this is correct.  The difference to classic OO programming 
> languages is that in Julia a method is not "owned" by a type.  Instead 
> it can be owned by several types as dispatch is on all arguments.  In 
> python and other OO dispatch is only on the first (usually implicit) 
> argument.  For your example this does not really matter, but if you have 
> several "equal" types interacting, then it does: 
>
> type Rocket end 
> type Asteroid end 
> type Planet end 
>
> collide(a,b) = collide(b,a) # make it commute 
> collide(::Rocket, ::Union{Asteroid,Planet}) = println("rocket explodes") 
> collide(::Asteroid, ::Planet) = println("dinosaurs die") 
>
> collide(Planet(),Rocket()) # rocket explodes 
> collide(Asteroid(), Planet()) # dinosaurs die 
>
> This would be more awkward to program in python.  I think it's a better 
> mental model to not view Julia as OO. 
>
> On Wed, 2016-08-10 at 09:26, Willem Hekman  > wrote: 
> > Hello all, 
> > 
> > I must say that I`m quite new to object oriented programming. 
> > 
> > Do I understand correctly from the manual that in Julia (unlike python) 
> you 
> > do not use the keyword "self" and declare methods that apply to a type 
> > outside the type definition? 
> > 
> > To illustrate, let's say we want to have a type of apple and want to 
> push a 
> > flavor to the array of flavors that characterizes an apple: 
> > 
> > # define a type: Apple 
> > type Apple 
> > brand::ASCIIString 
> > color::ASCIIString 
> > flavors::Array{ASCIIString,1} 
> > 
> > 
> > end 
> > 
> > # a method designed to add flavors to the apple 
> > function add_flavor(apple::Apple,flavor::ASCIIString) 
> > 
> > push!(apple.flavors,flavor) 
> > end 
> > # create an instance of an AppleFuji = Apple("Fuji","red",["sweet"]) 
> > 
> > # add a flavor 
> > add_flavor(Fuji, "sour") 
> > 
> > Is this the way you'd do it in Julia? 
> > 
> > In python I got used to putting methods that apply to "Apple" instances 
> > inside the type definition where the keyword "self" would be used to add 
> a 
> > flavor: push!(self.flavors,flavor) 
> > 
> > What would you say? 
> > 
> > -Willem 
>


Re: [julia-users] Methods inside type definition, use of "self" ?

2016-08-10 Thread Mauro
Yes, this is correct.  The difference to classic OO programming
languages is that in Julia a method is not "owned" by a type.  Instead
it can be owned by several types as dispatch is on all arguments.  In
python and other OO dispatch is only on the first (usually implicit)
argument.  For your example this does not really matter, but if you have
several "equal" types interacting, then it does:

type Rocket end
type Asteroid end
type Planet end

collide(a,b) = collide(b,a) # make it commute
collide(::Rocket, ::Union{Asteroid,Planet}) = println("rocket explodes")
collide(::Asteroid, ::Planet) = println("dinosaurs die")

collide(Planet(),Rocket()) # rocket explodes
collide(Asteroid(), Planet()) # dinosaurs die

This would be more awkward to program in python.  I think it's a better
mental model to not view Julia as OO.

On Wed, 2016-08-10 at 09:26, Willem Hekman  wrote:
> Hello all,
>
> I must say that I`m quite new to object oriented programming.
>
> Do I understand correctly from the manual that in Julia (unlike python) you
> do not use the keyword "self" and declare methods that apply to a type
> outside the type definition?
>
> To illustrate, let's say we want to have a type of apple and want to push a
> flavor to the array of flavors that characterizes an apple:
>
> # define a type: Apple
> type Apple
> brand::ASCIIString
> color::ASCIIString
> flavors::Array{ASCIIString,1}
>
>
> end
>
> # a method designed to add flavors to the apple
> function add_flavor(apple::Apple,flavor::ASCIIString)
>
> push!(apple.flavors,flavor)
> end
> # create an instance of an AppleFuji = Apple("Fuji","red",["sweet"])
>
> # add a flavor
> add_flavor(Fuji, "sour")
>
> Is this the way you'd do it in Julia?
>
> In python I got used to putting methods that apply to "Apple" instances
> inside the type definition where the keyword "self" would be used to add a
> flavor: push!(self.flavors,flavor)
>
> What would you say?
>
> -Willem


[julia-users] Methods inside type definition, use of "self" ?

2016-08-10 Thread Willem Hekman
Hello all,

I must say that I`m quite new to object oriented programming. 

Do I understand correctly from the manual that in Julia (unlike python) you 
do not use the keyword "self" and declare methods that apply to a type 
outside the type definition?

To illustrate, let's say we want to have a type of apple and want to push a 
flavor to the array of flavors that characterizes an apple:

# define a type: Apple
type Apple
brand::ASCIIString
color::ASCIIString
flavors::Array{ASCIIString,1}


end

# a method designed to add flavors to the apple
function add_flavor(apple::Apple,flavor::ASCIIString)

push!(apple.flavors,flavor)
end
# create an instance of an AppleFuji = Apple("Fuji","red",["sweet"])

# add a flavor
add_flavor(Fuji, "sour")

Is this the way you'd do it in Julia?

In python I got used to putting methods that apply to "Apple" instances 
inside the type definition where the keyword "self" would be used to add a 
flavor: push!(self.flavors,flavor)

What would you say?

-Willem