[squeak-dev] How to create a 'Hello world' example for environments

Kjell Godo squeaklist at gmail.com
Sat Oct 1 14:22:30 UTC 2016


+1

On Saturday, October 1, 2016, H. Hirzel <hannes.hirzel at gmail.com> wrote:

> Good, so let's wait until next week....
>
> --Hannes
>
>
> P.S. Another thing is that  we need glossary entries on the swiki for
> - delimited dynamic variables
> - delimited continuations
>
> On 10/1/16, Frank Shearar <frank.shearar at gmail.com <javascript:;>> wrote:
> > On Sep 30, 2016 09:50, "Nicolas Cellier"
> > <nicolas.cellier.aka.nice at gmail.com <javascript:;>>
> > wrote:
> >>
> >>
> >>
> >> 2016-09-30 14:57 GMT+02:00 Jakob Reschke <jakob.reschke at student.hpi.de
> <javascript:;>>:
> >>>
> >>> Hello,
> >>>
> >>> Looks good to me as an outline. I have the following comments,
> >>> questions or doubts:
> >>>
> >>> 1. Currently, for me it does not feel like "entering" or "leaving" an
> >>> Environment, as that works with dynamic scoping in a block. So step 8
> >>> could turn out to be void.
> >>>
> >>> 2. Since all of this should go into a workspace, not into the browser,
> >>> what is the shortest applicable snippet of code that, given a source
> >>> code string and a class, creates a new method in that class?
> >>>
> >>> 3. I am not sure what will happen if you attempt to create a subclass
> >>> that has the same name as another imported class. Generally,
> >>> evaluating Superclass subclass: #Subclass ... a second time will
> >>> replace the former Subclass by the new Subclass. 'myEnvironment' would
> >>> have imported Hello from Smalltalk globals, so an "old" Hello is
> >>> already visible. We have to check that evaluating the subclass
> >>> expression will not try to update that existing Hello class, but
> >>> create a new one instead. Here, the "shallow" lookup mechanism would
> >>> be needed.
> >>>
> >> Don't import: Smalltalk globals entirely, just from: Smalltalk globals
> > import: #Transcript.
> >> and #Object too, depending in which environment you'll evaluate the
> > message for creating the class...
> >>
> >>>
> >>> Once I have figured out 2. I will try out and check 3. ;-)
> >>>
> >>> Kind regards,
> >>> Jakob
> >>>
> >>
> >> Here is a snippet that works, but is not especially short.
> >>
> >> | createHelloClass createHelloMethod english spanish |
> >>
> >> "Straight but verbose code to create a Hello class and compile a say
> > method.
> >>  There's one trick: Environment current, otherwise Compiler would
> > evaluate in nil class environment, not good"
> >> createHelloClass := [Object subclass: #Hello
> >>             instanceVariableNames: ''
> >>             classVariableNames: ''
> >>             poolDictionaries: ''
> >>             category: 'Test'].
> >> createHelloMethod := [:greeting |
> >>     | methodSource sourceCode |
> >>     methodSource := 'say Transcript cr; show: ' , greeting printString.
> >>     sourceCode := 'Hello class compile: ' , methodSource printString , '
> > classified: ' , 'test' printString.
> >>     Compiler evaluate: sourceCode environment: Environment current].
> >>
> >> "Create the english and spanish environments"
> >> english := Smalltalk globals.
> >> spanish := Environment withName: 'Spanish'.
> >> spanish importSelf.
> >> spanish from: english import: #Transcript.
> >>
> >> "Create the class and compile the method in each environment:"
> >>
> >> [createHelloClass value.
> >> createHelloMethod value: 'Hello world'] on: CurrentEnvironment do: [:exc
> > | exc resume: english].
> >>
> >> [createHelloClass value.
> >> createHelloMethod value: 'Buenos dias'] on: CurrentEnvironment do: [:exc
> > | exc resume: spanish].
> >>
> >> "Greet"
> >> Compiler evaluate: 'Hello say' environment: english.
> >> Compiler evaluate: 'Hello say' environment: spanish.
> >> Compiler evaluate: 'Hello say' environment: english.
> >>
> >> "Cleanup"
> >> [Compiler evaluate: 'Hello removeFromSystem' environment: Environment
> > current] on: CurrentEnvironment do: [:exc | exc resume: english].
> >> [Compiler evaluate: 'Hello removeFromSystem' environment: Environment
> > current] on: CurrentEnvironment do: [:exc | exc resume: spanish].
> >>
> >> Yes, a DynamicVariable:
> >>    CurrentEnvironment value: english during: ["load something"].
> >> would be nicer than:
> >>     ["load something"] on: CurrentEnvironment do: [:exc | exc resume:
> > english].
> >> Otherwise we coulf fileIn some chunk format stream thru en
> > EnvironmentLoader for: english...
> >
> > I wrote Control to do pretty much that: give a nice interface through
> which
> > to create and change delimited dynamic variables (and delimited
> > continuations). I would link to it (it's on SS3) but my phone is a bit
> > limited...
> >
> > frank
> >
> >>> 2016-09-30 13:29 GMT+02:00 H. Hirzel <hannes.hirzel at gmail.com
> <javascript:;>>:
> >>> > Starting a new thread, culled from the thread 'What are environments
> > for'.
> >>> >
> >>> > There are many more good questions and thoughts in the  thread 'What
> >>> > are environments for' but this thread is just about what the subject
> >>> > says:
> >>> >
> >>> > How to create a 'Hello world' example for environments
> >>> >
> >>> > --Hannes
> >>> >
> >>> > On 9/29/16, David T. Lewis <lewis at mail.msen.com <javascript:;>>
> wrote:
> >>> >> On Thu, Sep 29, 2016 at 07:51:23AM +0200, H. Hirzel wrote:
> >>> >>> On 9/29/16, Jakob Reschke <jakob.reschke at student.hpi.de
> <javascript:;>> wrote:
> >>> >>> > Hi Nicolas,
> >>> >>> >
> >>> >>> > First, thank you for answering me in the other thread.
> >>> >>> >
> >>> >>> > 2016-09-28 23:02 GMT+02:00 Nicolas Cellier
> >>> >>> > <nicolas.cellier.aka.nice at gmail.com <javascript:;>>:
> >>> >>> >> Without clear goals or vision, fixing could essentially mean
> "let
> >>> >>> >> Environment be transparent", that is let it remain a promise, a
> >>> >>> >> potential,
> >>> >>> >> whithout too many side effects... Not exactly YAGNI, just a bit
> >>> >>> >> of
> >>> >>> >> over-engineered nice piece of code that might serve later. OK
> >>> >>> >> this
> >>> >>> >> sounds
> >>> >>> >> like a mandatory first step.
> >>> >
> >>> >
> >>> >>> > I don't quite get what you mean by transparent, other than fixing
> > it
> >>> >>> > and enhancing the documentation to shed some light on what it is,
> > why
> >>> >>> > it is there and how to use it.
> >>> > ..
> >>> > ...
> >>> >
> >>> >>> Another maybe simple use case could be to have a project specific
> >>> >>> environment set up when you enter a project
> >>> >>> (http://wiki.squeak.org/squeak/1020).
> >>> >>>
> >>> >>> We now have very nicely cleaned up Project code in Squeak 5.1
> >>> >>>
> >>> >>> 1) Subclass MorphicProject --- MyMorphicProject
> >>> >>> 2) Subclass PasteUpMorph  --- MyPasteUpMorph
> >>> >>> 3) Override #initialize in MyMorphicProject and use MyPasteUpMorph
> >>> >>> 4) ... some more adaptations ..... to enter a new Environment --
> >>> >>> how?
> >>> >>>
> >>> >>
> >>> >> I like this idea a lot.
> >>> >>
> >>> >> I would love to see a simple "hello world!" level example of
> > Environments.
> >>> >> If someone could make an EnvironmentsDemoProject that opens a new
> > project
> >>> >> with
> >>> >> something that changes Duck>>speak ==> 'quack' to Duck>>speak ==>
> > 'moo',
> >>> >> I think it might really help me to understand how to use
> >>> >> Environments.
> >>> >>
> >>> >> Dave
> >>> >
> >>> > So let's focus on a 'hello world' example for environments and do it
> >>> > _slowly_ step by step so that people can catch up with the issues.
> >>> >
> >>> >
> >>> >
> >>> > Outline of steps of a 'Hello world' environments example
> >>> > =============================================
> >>> >
> >>> > Steps
> >>> >
> >>> >
> >>> > 1. subclass Object with a #Hello class.
> >>> >
> >>> > 2. compile a class method #say the method should write 'Hello' to the
> > Transcript
> >>> >
> >>> > 3. run
> >>> >     Hello say
> >>> >
> >>> >     The result should be 'Hello' on the Transcript
> >>> >
> >>> >
> >>> > 4. create a new Environment called "myEnvironment".
> >>> >
> >>> > 5. import the Smalltalk environmnet into myEnvironment
> >>> >
> >>> > 6. subclass Object with a #Hello class in myEnvironment
> >>> >
> >>> > 7. compile a method #say the method should write 'Buenas dias' to the
> > Transcript
> >>> >
> >>> >    run
> >>> >         Hello say
> >>> >
> >>> >    Result should be
> >>> >
> >>> >         30-Sept-2016
> >>> >
> >>> > Starting a new thread, culled from the thread 'What are environments
> > for'.
> >>> >
> >>> > There are many more good questions and thoughts in the  thread 'What
> >>> > are environments for' but this thread is just about what the subject
> >>> > says:
> >>> >
> >>> > How to create a 'Hello world' example for environments
> >>> >
> >>> > --Hannes
> >>> >
> >>> > On 9/29/16, David T. Lewis <lewis at mail.msen.com <javascript:;>>
> wrote:
> >>> >> On Thu, Sep 29, 2016 at 07:51:23AM +0200, H. Hirzel wrote:
> >>> >>> On 9/29/16, Jakob Reschke <jakob.reschke at student.hpi.de
> <javascript:;>> wrote:
> >>> >>> > Hi Nicolas,
> >>> >>> >
> >>> >>> > First, thank you for answering me in the other thread.
> >>> >>> >
> >>> >>> > 2016-09-28 23:02 GMT+02:00 Nicolas Cellier
> >>> >>> > <nicolas.cellier.aka.nice at gmail.com <javascript:;>>:
> >>> >>> >> Without clear goals or vision, fixing could essentially mean
> "let
> >>> >>> >> Environment be transparent", that is let it remain a promise, a
> >>> >>> >> potential,
> >>> >>> >> whithout too many side effects... Not exactly YAGNI, just a bit
> >>> >>> >> of
> >>> >>> >> over-engineered nice piece of code that might serve later. OK
> >>> >>> >> this
> >>> >>> >> sounds
> >>> >>> >> like a mandatory first step.
> >>> >
> >>> >
> >>> >>> > I don't quite get what you mean by transparent, other than fixing
> > it
> >>> >>> > and enhancing the documentation to shed some light on what it is,
> > why
> >>> >>> > it is there and how to use it.
> >>> > ..
> >>> > ...
> >>> >
> >>> >>> Another maybe simple use case could be to have a project specific
> >>> >>> environment set up when you enter a project
> >>> >>> (http://wiki.squeak.org/squeak/1020).
> >>> >>>
> >>> >>> We now have very nicely cleaned up Project code in Squeak 5.1
> >>> >>>
> >>> >>> 1) Subclass MorphicProject --- MyMorphicProject
> >>> >>> 2) Subclass PasteUpMorph  --- MyPasteUpMorph
> >>> >>> 3) Override #initialize in MyMorphicProject and use MyPasteUpMorph
> >>> >>> 4) ... some more adaptations ..... to enter a new Environment --
> >>> >>> how?
> >>> >>>
> >>> >>
> >>> >> I like this idea a lot.
> >>> >>
> >>> >> I would love to see a simple "hello world!" level example of
> > Environments.
> >>> >> If someone could make an EnvironmentsDemoProject that opens a new
> > project
> >>> >> with
> >>> >> something that changes Duck>>speak ==> 'quack' to Duck>>speak ==>
> > 'moo',
> >>> >> I think it might really help me to understand how to use
> >>> >> Environments.
> >>> >>
> >>> >> Dave
> >>> >
> >>> > So let's focus on a 'hello world' example for environments and do it
> >>> > _slowly_ step by step so that people can catch up with the issues.
> >>> >
> >>> >
> >>> >
> >>> > Outline of steps of a 'Hello world' environments example
> >>> > =============================================
> >>> >
> >>> > Steps
> >>> >
> >>> >
> >>> > 1. subclass Object with a #Hello class.
> >>> >
> >>> > 2. compile a class method #say the method should write 'Hello' to the
> > Transcript
> >>> >
> >>> > 3. run
> >>> >     Hello say
> >>> >
> >>> >     The result should be 'Hello' on the Transcript
> >>> >
> >>> >
> >>> > 4. create a new Environment called "myEnvironment".
> >>> >
> >>> > 5. import the Smalltalk environmnet into myEnvironment
> >>> >
> >>> > 6. subclass Object with a #Hello class in myEnvironment
> >>> >
> >>> > 7. compile a method #say the method should write 'Buenas dias' to the
> > Transcript
> >>> >
> >>> >    run
> >>> >         Hello say
> >>> >
> >>> >     The result should be 'Buenas dias' on the Transcript
> >>> >
> >>> >
> >>> > 8. Leave environment called 'myEnvironment'
> >>> >
> >>> >
> >>> > 9. run
> >>> >     Hello say
> >>> >
> >>> >     The result should be this time 'Hello' on the Transcript
> >>> >
> >>> >
> >>> >
> >>> > Any comments on these steps?
> >>> >
> >>>
> >>
> >>
> >>
> >>
> >
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20161001/bae151e0/attachment.htm


More information about the Squeak-dev mailing list