Dynamic scoping (was: Proposal: Squeak-E = Squeak x Kernel-E)

David Simmons david.simmons at smallscript.com
Tue Jan 28 00:01:13 UTC 2003


Oops, my bad. I forgot to add the "tls" (thread-local-storage) qualifier to
the <X> shared-field declaration.

Class name: MyContextCollection
    shared-fields: tls X; "obviously choosing a better name here"

> {
>     Method [
>     withContextDo: valuable
> 	  X := {self, X}.
>         "optionally, various exception guards could go here
>          to handle resolution via exceptions, etc"
>        ^valuable finally: [X := X[2]].
>     ]
>     Method [
>     resolve: expr
>         |tuple| := X.
>         [tuple] whileNotNil: [
>             tuple[1].internalQuery(expr) !? [:r| ^r].
>             tuple := tuple[2].
>         ].
> 	 ^nil. "indicate failure"
>     ]
> }

-- Dave S. [SmallScript Corp]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SmallScript for the AOS & .NET Platforms
David.Simmons at SmallScript.com
http://www.smallscript.org


> -----Original Message-----
> From: David Simmons [mailto:david.simmons at smallscript.com]
> Sent: Monday, January 27, 2003 3:57 PM
> To: 'The general-purpose Squeak developers list'
> Subject: RE: Dynamic scoping (was: Proposal: Squeak-E = Squeak x Kernel-E)
> 
> Have you considered something like:
> 
> a) thread (st-process) local pool (shared) variable
> 
> 	X
> 
> b) MyContextCollection
>    withContextDo: valuable
> 	  X := Array with: self with: X.
>        ^valuable ensure: "finally:" [
> 		X := X at: 2.
>         ].
> 
> This assumes a mechanism for supporting per/process (thread-local) shared
> variables.
> 
> In SmallScript this could be written as:
> 
> Class name: MyContextCollection
>     shared-fields: X "obviously choosing a better name here"
> {
>     Method [
>     withContextDo: valuable
> 	  X := {self, X}.
>         "optionally, various exception guards could go here
>          to handle resolution via exceptions, etc"
>        ^valuable finally: [X := X[2]].
>     ]
>     Method [
>     resolve: expr
>         |tuple| := X.
>         [tuple] whileNotNil: [
>             tuple[1].internalQuery(expr) !? [:r| ^r].
>             tuple := tuple[2].
>         ].
> 	 ^nil. "indicate failure"
>     ]
> }
> 
> -- Dave S.
> 
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> SmallScript for the AOS & .NET Platforms
> David.Simmons at SmallScript.com
> http://www.smallscript.org
> 
> > -----Original Message-----
> > From: squeak-dev-bounces at lists.squeakfoundation.org [mailto:squeak-dev-
> > bounces at lists.squeakfoundation.org] On Behalf Of Stephen Pair
> > Sent: Monday, January 27, 2003 1:03 PM
> > To: 'The general-purpose Squeak developers list'
> > Subject: RE: Dynamic scoping (was: Proposal: Squeak-E = Squeak x Kernel-
> E)
> >
> > What is not clear about those semantics?  Since the transcript output
> > occurs before setting the value, the correct output is:
> >
> > 0
> > 0
> >
> > Originally, I wanted the ability set a value for all subsequent
> > operations that occur in a process...however, to accomplish that *and*
> > use the stack for maintaining scope enclosures would be quite convoluted
> > (if at all possible).  And, it's also not clear to me at this point
> > whether or not I really need that ability.
> >
> > - Stephen
> >
> > > -----Original Message-----
> > > From: squeak-dev-bounces at lists.squeakfoundation.org
> > > [mailto:squeak-dev-bounces at lists.squeakfoundation.org] On
> > > Behalf Of Avi Bryant
> > > Sent: Monday, January 27, 2003 3:29 PM
> > > To: The general-purpose Squeak developers list
> > > Subject: RE: Dynamic scoping (was: Proposal: Squeak-E =
> > > Squeak x Kernel-E)
> > >
> > >
> > >
> > > On Mon, 27 Jan 2003, Stephen Pair wrote:
> > >
> > > > Actually, I rather like the #dynamicValue pattern.  Why not
> > > this then:
> > > >
> > > > ----
> > > > DynamicContext clamp: [
> > > > 	#foo dynamicValue: 42.
> > > > 	self assert: #foo dynamicValue = 42
> > > > ].
> > > >
> > > > self assert: #foo dynamicValue isNil
> > > > ----
> > > >
> > > > With the above, if you need to set several values, you
> > > don't need to
> > > > enclose your code in several blocks.
> > >
> > > True, but I find the semantics less clear. Say I capture a
> > > continuation just before the call to #dynamicValue:, and then
> > > come back to it:
> > >
> > > |k|
> > >
> > > #foo dynamicValue: 0.
> > > DynamicContext clamp: [
> > >   k := Continuation current.
> > >   Transcript cr; show: #foo dynamicValue.
> > >   #foo dynamicValue: 42.
> > > ]
> > >
> > > k ifNotNil: [k value].
> > >
> > > Does this show
> > >
> > > 0
> > > 0
> > >
> > > or
> > >
> > > 0
> > > 42
> > >
> > > on the Transcript?
> > >
> > > If you want to be able to set multiple bindings at once, I
> > > would suggest
> > >
> > > DynamicContext bindAll: {#foo -> 42} during: [...]
> > >
> > >
> > >
> > >
> > >
> >
> 




More information about the Squeak-dev mailing list