From: Matthew Kerwin Date: 2013-04-07T15:16:42+09:00 Subject: Re: Messaging Passing and context --14dae94ed9a3eb749c04d9bf421d Content-Type: text/plain; charset=ISO-8859-1 Wow, phone glitch, sorry. I was _going_ to say: there is a caller. It tells you the entire stack of the current method. In theory it may also be possible to query the ObjectSpace to see what objects hold a reference to your nerd. However there's no ruby-level concept for "only one Place can hold a reference to a Person" so to enforce that rule you'd have to set up either a .location 'property' on person (a ref back to the Place they're in) or an authoritative person:place map, or something like that. But I think that's not what you're asking for. Sent from my phone, so excuse the typos. On Apr 7, 2013 12:48 PM, "Julian Leviston" wrote: > Hi, > > I've often wanted what I'm about to describe. > > Some history about me, so you know this isn't a complete noob question: I > understand separation of concerns and encapsulation quite well (at least, I > think I do). I've been programming in object oriented languages for most of > my life (I'm 37, and I started SmallTalk when I was 17). I've programmed in > most languages: SmallTalk, Java, Ruby, forth, Python, C/C++, BASIC, > VisualBasic, ASM, LISP (common, scheme, racket), JavaScript, Self, bit of > Haskell, Erlang etc., etc. > > Context here is object-oriented message sending: > > class Person > attr_accessor :mood > def say_hi_to(someone) > puts "hiya" > end > end > > class Nerd < Person > # likes inside, dislikes outside > end > > class Jock < Person > # likes outside, dislikes inside > end > > class Socialite < Person > # doesn't care in or outside, but only likes places where people are > interacting socially > end > > class Place > attr_accessor :inside, :social, :bookish > def initialize(&block) > if block > yield > end > end > end > > class Playground < Place > def intiialize(&block) > self.inside = false > self.social = true > self.bookish = false > super(&block) > end > end > > def Library < Place > def initialize(&block) > self.inside = true > self.social = false > self.bookish = true > super(&block) > end > end > > def Field < Place > def initialize(&block) > self.inside = false > self.social = false > self.bookish = false > super(&block) > end > end > > field = Field.new { > julian = Nerd.new > dave = Jock.new > greginsky = Socialite.new > } > > So what I'm interested in, when an object sends a message to another > object, why is there no context-sensitivity? In other words, (all > judgements aside as this is just a trivial example), I'd like the nerd to > be defined as a person who dislikes outside areas, therefore behaves > according to his mood when he's outside perhaps. > > Instantiating a Nerd inside a FIeld... or messaging him with the say_hi > type message should be able to bear some context on what that nerd's reply > is. I'm not stipulating a tight coupling of context to object, I *like* > decoupled contexts, and I like interfaces, but just like the mechanism of > introspection, it'd be useful and nice to be able to garner *some* > information about the calling context, especially if (and this is my real > beef) the calling context WANTS TO GIVE THE INFORMATION. The obvious > solution is simply to change the interface so it contributes a variable > which passes across this information, but versioning interfaces is a > complete pain - I'd like to have a common object (called caller, possibly) > that I could query from within a method without the caller having to pass > through "self" every single time. Thus we could then apply some duck typing > in the callee side and get it to ask some questions of its context before > responding to messages. > > Am I missing some obvious design considerations here? > > I guess I'm talking more about language design than language usage, so > there might be a better place to discuss this. Comments? > > Julian > --14dae94ed9a3eb749c04d9bf421d Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable

Wow, phone glitch, sorry.

I was _going_ to say: there is a caller. It tells you the entire stack o= f the current method.

In theory it may also be possible to query the ObjectSpace to see what o= bjects hold a reference to your nerd. However there's no ruby-level con= cept for "only one Place can hold a reference to a Person" so to = enforce that rule you'd have to set up either a .location 'property= ' on person (a ref back to the Place they're in) or an authoritativ= e person:place map, or something like that.=A0 But I think that's not w= hat you're asking for.

Sent from my phone, so excuse the typos.

On Apr 7, 2013 12:48 PM, "Julian Leviston&q= uot; <julian@coretech.net.au> wrote:
Hi,

I've often wanted what I'm about to describe.

Some history about me, so you know this isn't a complete noob question:= I understand separation of concerns and encapsulation quite well (at least= , I think I do). I've been programming in object oriented languages for= most of my life (I'm 37, and I started SmallTalk when I was 17). I'= ;ve programmed in most languages: SmallTalk, Java, Ruby, forth, Python, C/C= ++, BASIC, VisualBasic, ASM, LISP (common, scheme, racket), JavaScript, Sel= f, bit of Haskell, Erlang etc., etc.

Context here is object-oriented message sending:

class Person
attr_accessor :mood
def say_hi_to(someone)
puts "hiya"
end
end

class Nerd < Person
# likes inside, dislikes outside
end

class Jock < Person
# likes outside, dislikes inside
end

class Socialite < Person
# doesn't care in or outside, but only likes places where people are in= teracting socially
end

class Place
attr_accessor :inside, :social, :bookish
def initialize(&block)
if block
yield
end
end
end

class Playground < Place
def intiialize(&block)
self.inside =3D false
self.social =3D true
self.bookish =3D false
super(&block)
end
end

def Library < Place
def initialize(&block)
self.inside =3D true
self.social =3D false
self.bookish =3D true
super(&block)
end
end

def Field < Place
def initialize(&block)
self.inside =3D false
self.social =3D false
self.bookish =3D false
super(&block)
end
end

field =3D Field.new {
julian =3D Nerd.new
dave =3D Jock.new
greginsky =3D Socialite.new
}

So what I'm interested in, when an object sends a message to another ob= ject, why is there no context-sensitivity? In other words, (all judgements = aside as this is just a trivial example), I'd like the nerd to be defin= ed as a person who dislikes outside areas, therefore behaves according to h= is mood when he's outside perhaps.

Instantiating a Nerd inside a FIeld... or messaging him with the say_hi typ= e message should be able to bear some context on what that nerd's reply= is. I'm not stipulating a tight coupling of context to object, I *like= * decoupled contexts, and I like interfaces, but just like the mechanism of= introspection, it'd be useful and nice to be able to garner *some* inf= ormation about the calling context, especially if (and this is my real beef= ) the calling context WANTS TO GIVE THE INFORMATION. The obvious solution i= s simply to change the interface so it contributes a variable which passes = across this information, but versioning interfaces is a complete pain - I&#= 39;d like to have a common object (called caller, possibly) that I could qu= ery from within a method without the caller having to pass through "se= lf" every single time. Thus we could then apply some duck typing in th= e callee side and get it to ask some questions of its context before respon= ding to messages.

Am I missing some obvious design considerations here?

I guess I'm talking more about language design than language usage, so = there might be a better place to discuss this. Comments?

Julian
--14dae94ed9a3eb749c04d9bf421d--