[Environments] ScriptEncoder>>associationForClass problem // globals

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
9 messages Options
Reply | Threaded
Open this post in threaded view
|

[Environments] ScriptEncoder>>associationForClass problem // globals

Hannes Hirzel
Hello

after loading a Etoys project into a most recent trunk image
incrementing a tile value actually generates an updated script which
is to be compiled.

Recompiling the script causes an error in

        ScriptEncoder>>associationForClass

            | assoc |
            assoc := self environment associationAt: cue getClass name ifAbsent: [nil].
            ^assoc value == cue getClass
                   ifTrue: [assoc]
                   ifFalse: [Association new value: cue getClass]


Replacing

            assoc := self environment associationAt: cue getClass name ifAbsent: [nil].

with

            assoc := self environment globals associationAt: cue getClass
name ifAbsent: [nil].


Made the script to work but errors later on came up at the same place
for other reasons. In particular it was not possible to commit the
changed 'Compiler' package to the inbox.

Do you have any suggestions how to deal with this problem?

Kind regards
Hannes


----------------------------------------------------
The use case in details
----------------------------------------------------

I drop an Etoys project into a fully updated trunk image.


If I click an arrow the following message is sent to aTileMorph

           TileMorph>>arrowAction:

If it is a number a new value is set, for example


          aTileMorph literal: 9


          TileMorph>>literal

is

         TileMorph>>literal: anObject

                literal := anObject.
                self updateLiteralLabel.
                self acceptNewLiteral. "Show that we are out of date,
install is needed"

#acceptNewLiteral looks for the topScript, i.e. the top morph
containing the tiles


then it calls

         topScript installWithNewLiteral


The topScript is a "ScriptEditor for #script1 player: Car"


        ScriptEditorMorph>>installWithNewLiteral

        self removeSpaces.
                scriptName ifNotNil:
                    [playerScripted ifNotNil:
                        [playerScripted acceptScript: self topEditor
for:  scriptName]]


playerScripted is aPlayer (Model subclass: #Player)

In
      playerScripted acceptScript: self topEditor for:  scriptName

the playerScripted gets a node (class MethodNode) from aScriptEditorMorph

The node is told to #generate: the method for aCompiledMethodTrailer
which has the data


'script1
        (self color: (Color r: 0.419 g: 0.581 b: 1) sees: (Color r: 0.936 g:
0.936 b: 0.936))
                ifFalse: [self turn: 160 + 40 random].
        self forward: 9.
        self turn: 1.
        self bounce: ''silence'''

The node in turn asks aScriptEncoder


       generateMethodOfClass: aCompiledMethodClass trailer: trailer
from: methodNode


aScriptEncoder asks

       self allLiterals

and within that


        self associationForClass



        ScriptEncoder>>associationForClass
            | assoc |
            assoc := self environment associationAt: cue getClass name ifAbsent: [nil].
            ^assoc value == cue getClass
                   ifTrue: [assoc]
                   ifFalse: [Association new value: cue getClass]


This is the place where the code breaks

             cue getClass

is
             Player140132117123


             self environment

is
             SmalltalkImage


First a change from


         assoc := self environment associationAt: cue getClass name
ifAbsent: [nil].

to

       assoc := self environment globals associationAt: cue getClass
name ifAbsent: [nil].

worked after adding in addition


I could increment and decrement values in a tile.


However it was not possible to commit the changes to the inbox. An
error message appeared at the same place.

Reply | Threaded
Open this post in threaded view
|

Re: [Environments] ScriptEncoder>>associationForClass problem // globals

Hannes Hirzel
P.S. You can download an example home.pr project from the links given in

http://wiki.squeak.org/squeak/6531

On 10/14/17, H. Hirzel <[hidden email]> wrote:

> Hello
>
> after loading a Etoys project into a most recent trunk image
> incrementing a tile value actually generates an updated script which
> is to be compiled.
>
> Recompiling the script causes an error in
>
>         ScriptEncoder>>associationForClass
>
>    | assoc |
>    assoc := self environment associationAt: cue getClass name ifAbsent:
> [nil].
>    ^assoc value == cue getClass
>   ifTrue: [assoc]
>   ifFalse: [Association new value: cue getClass]
>
>
> Replacing
>
>    assoc := self environment associationAt: cue getClass name ifAbsent:
> [nil].
>
> with
>
>    assoc := self environment globals associationAt: cue getClass
> name ifAbsent: [nil].
>
>
> Made the script to work but errors later on came up at the same place
> for other reasons. In particular it was not possible to commit the
> changed 'Compiler' package to the inbox.
>
> Do you have any suggestions how to deal with this problem?
>
> Kind regards
> Hannes
>
>
> ----------------------------------------------------
> The use case in details
> ----------------------------------------------------
>
> I drop an Etoys project into a fully updated trunk image.
>
>
> If I click an arrow the following message is sent to aTileMorph
>
>            TileMorph>>arrowAction:
>
> If it is a number a new value is set, for example
>
>
>           aTileMorph literal: 9
>
>
>           TileMorph>>literal
>
> is
>
>          TileMorph>>literal: anObject
>
>        literal := anObject.
>        self updateLiteralLabel.
>        self acceptNewLiteral. "Show that we are out of date,
> install is needed"
>
> #acceptNewLiteral looks for the topScript, i.e. the top morph
> containing the tiles
>
>
> then it calls
>
>          topScript installWithNewLiteral
>
>
> The topScript is a "ScriptEditor for #script1 player: Car"
>
>
>         ScriptEditorMorph>>installWithNewLiteral
>
>         self removeSpaces.
>        scriptName ifNotNil:
>    [playerScripted ifNotNil:
>                         [playerScripted acceptScript: self topEditor
> for:  scriptName]]
>
>
> playerScripted is aPlayer (Model subclass: #Player)
>
> In
>       playerScripted acceptScript: self topEditor for:  scriptName
>
> the playerScripted gets a node (class MethodNode) from aScriptEditorMorph
>
> The node is told to #generate: the method for aCompiledMethodTrailer
> which has the data
>
>
> 'script1
> (self color: (Color r: 0.419 g: 0.581 b: 1) sees: (Color r: 0.936 g:
> 0.936 b: 0.936))
> ifFalse: [self turn: 160 + 40 random].
> self forward: 9.
> self turn: 1.
> self bounce: ''silence'''
>
> The node in turn asks aScriptEncoder
>
>
>        generateMethodOfClass: aCompiledMethodClass trailer: trailer
> from: methodNode
>
>
> aScriptEncoder asks
>
>        self allLiterals
>
> and within that
>
>
>         self associationForClass
>
>
>
>         ScriptEncoder>>associationForClass
>    | assoc |
>    assoc := self environment associationAt: cue getClass name ifAbsent:
> [nil].
>    ^assoc value == cue getClass
>   ifTrue: [assoc]
>   ifFalse: [Association new value: cue getClass]
>
>
> This is the place where the code breaks
>
>              cue getClass
>
> is
>              Player140132117123
>
>
>              self environment
>
> is
>              SmalltalkImage
>
>
> First a change from
>
>
>          assoc := self environment associationAt: cue getClass name
> ifAbsent: [nil].
>
> to
>
>        assoc := self environment globals associationAt: cue getClass
> name ifAbsent: [nil].
>
> worked after adding in addition
>
>
> I could increment and decrement values in a tile.
>
>
> However it was not possible to commit the changes to the inbox. An
> error message appeared at the same place.
>

Reply | Threaded
Open this post in threaded view
|

Re: [Environments] ScriptEncoder>>associationForClass problem // globals

Hannes Hirzel
The project just needs to be dropped onto the desktop. Ignore the
additional error message and try incrementing the 'forward' value of
the car.

On 10/14/17, H. Hirzel <[hidden email]> wrote:

> P.S. You can download an example home.pr project from the links given in
>
> http://wiki.squeak.org/squeak/6531
>
> On 10/14/17, H. Hirzel <[hidden email]> wrote:
>> Hello
>>
>> after loading a Etoys project into a most recent trunk image
>> incrementing a tile value actually generates an updated script which
>> is to be compiled.
>>
>> Recompiling the script causes an error in
>>
>>         ScriptEncoder>>associationForClass
>>
>>    | assoc |
>>    assoc := self environment associationAt: cue getClass name ifAbsent:
>> [nil].
>>    ^assoc value == cue getClass
>>   ifTrue: [assoc]
>>   ifFalse: [Association new value: cue getClass]
>>
>>
>> Replacing
>>
>>    assoc := self environment associationAt: cue getClass name ifAbsent:
>> [nil].
>>
>> with
>>
>>    assoc := self environment globals associationAt: cue getClass
>> name ifAbsent: [nil].
>>
>>
>> Made the script to work but errors later on came up at the same place
>> for other reasons. In particular it was not possible to commit the
>> changed 'Compiler' package to the inbox.
>>
>> Do you have any suggestions how to deal with this problem?
>>
>> Kind regards
>> Hannes
>>
>>
>> ----------------------------------------------------
>> The use case in details
>> ----------------------------------------------------
>>
>> I drop an Etoys project into a fully updated trunk image.
>>
>>
>> If I click an arrow the following message is sent to aTileMorph
>>
>>            TileMorph>>arrowAction:
>>
>> If it is a number a new value is set, for example
>>
>>
>>           aTileMorph literal: 9
>>
>>
>>           TileMorph>>literal
>>
>> is
>>
>>          TileMorph>>literal: anObject
>>
>>        literal := anObject.
>>        self updateLiteralLabel.
>>        self acceptNewLiteral. "Show that we are out of date,
>> install is needed"
>>
>> #acceptNewLiteral looks for the topScript, i.e. the top morph
>> containing the tiles
>>
>>
>> then it calls
>>
>>          topScript installWithNewLiteral
>>
>>
>> The topScript is a "ScriptEditor for #script1 player: Car"
>>
>>
>>         ScriptEditorMorph>>installWithNewLiteral
>>
>>         self removeSpaces.
>>        scriptName ifNotNil:
>>    [playerScripted ifNotNil:
>>                         [playerScripted acceptScript: self topEditor
>> for:  scriptName]]
>>
>>
>> playerScripted is aPlayer (Model subclass: #Player)
>>
>> In
>>       playerScripted acceptScript: self topEditor for:  scriptName
>>
>> the playerScripted gets a node (class MethodNode) from aScriptEditorMorph
>>
>> The node is told to #generate: the method for aCompiledMethodTrailer
>> which has the data
>>
>>
>> 'script1
>> (self color: (Color r: 0.419 g: 0.581 b: 1) sees: (Color r: 0.936 g:
>> 0.936 b: 0.936))
>> ifFalse: [self turn: 160 + 40 random].
>> self forward: 9.
>> self turn: 1.
>> self bounce: ''silence'''
>>
>> The node in turn asks aScriptEncoder
>>
>>
>>        generateMethodOfClass: aCompiledMethodClass trailer: trailer
>> from: methodNode
>>
>>
>> aScriptEncoder asks
>>
>>        self allLiterals
>>
>> and within that
>>
>>
>>         self associationForClass
>>
>>
>>
>>         ScriptEncoder>>associationForClass
>>    | assoc |
>>    assoc := self environment associationAt: cue getClass name ifAbsent:
>> [nil].
>>    ^assoc value == cue getClass
>>   ifTrue: [assoc]
>>   ifFalse: [Association new value: cue getClass]
>>
>>
>> This is the place where the code breaks
>>
>>              cue getClass
>>
>> is
>>              Player140132117123
>>
>>
>>              self environment
>>
>> is
>>              SmalltalkImage
>>
>>
>> First a change from
>>
>>
>>          assoc := self environment associationAt: cue getClass name
>> ifAbsent: [nil].
>>
>> to
>>
>>        assoc := self environment globals associationAt: cue getClass
>> name ifAbsent: [nil].
>>
>> worked after adding in addition
>>
>>
>> I could increment and decrement values in a tile.
>>
>>
>> However it was not possible to commit the changes to the inbox. An
>> error message appeared at the same place.
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: [Environments] ScriptEncoder>>associationForClass problem // globals

Hannes Hirzel
Another necessary fix is to add

Preferences class

implicitSelfInTiles
        ^ self
                valueOfFlag: #implicitSelfInTiles
                ifAbsent: [false]


message protocol: 'standard queries'

On 10/14/17, H. Hirzel <[hidden email]> wrote:

> The project just needs to be dropped onto the desktop. Ignore the
> additional error message and try incrementing the 'forward' value of
> the car.
>
> On 10/14/17, H. Hirzel <[hidden email]> wrote:
>> P.S. You can download an example home.pr project from the links given in
>>
>> http://wiki.squeak.org/squeak/6531
>>
>> On 10/14/17, H. Hirzel <[hidden email]> wrote:
>>> Hello
>>>
>>> after loading a Etoys project into a most recent trunk image
>>> incrementing a tile value actually generates an updated script which
>>> is to be compiled.
>>>
>>> Recompiling the script causes an error in
>>>
>>>         ScriptEncoder>>associationForClass
>>>
>>>    | assoc |
>>>    assoc := self environment associationAt: cue getClass name
>>> ifAbsent:
>>> [nil].
>>>    ^assoc value == cue getClass
>>>   ifTrue: [assoc]
>>>   ifFalse: [Association new value: cue getClass]
>>>
>>>
>>> Replacing
>>>
>>>    assoc := self environment associationAt: cue getClass name
>>> ifAbsent:
>>> [nil].
>>>
>>> with
>>>
>>>    assoc := self environment globals associationAt: cue getClass
>>> name ifAbsent: [nil].
>>>
>>>
>>> Made the script to work but errors later on came up at the same place
>>> for other reasons. In particular it was not possible to commit the
>>> changed 'Compiler' package to the inbox.
>>>
>>> Do you have any suggestions how to deal with this problem?
>>>
>>> Kind regards
>>> Hannes
>>>
>>>
>>> ----------------------------------------------------
>>> The use case in details
>>> ----------------------------------------------------
>>>
>>> I drop an Etoys project into a fully updated trunk image.
>>>
>>>
>>> If I click an arrow the following message is sent to aTileMorph
>>>
>>>            TileMorph>>arrowAction:
>>>
>>> If it is a number a new value is set, for example
>>>
>>>
>>>           aTileMorph literal: 9
>>>
>>>
>>>           TileMorph>>literal
>>>
>>> is
>>>
>>>          TileMorph>>literal: anObject
>>>
>>>        literal := anObject.
>>>        self updateLiteralLabel.
>>>        self acceptNewLiteral. "Show that we are out of date,
>>> install is needed"
>>>
>>> #acceptNewLiteral looks for the topScript, i.e. the top morph
>>> containing the tiles
>>>
>>>
>>> then it calls
>>>
>>>          topScript installWithNewLiteral
>>>
>>>
>>> The topScript is a "ScriptEditor for #script1 player: Car"
>>>
>>>
>>>         ScriptEditorMorph>>installWithNewLiteral
>>>
>>>         self removeSpaces.
>>>        scriptName ifNotNil:
>>>    [playerScripted ifNotNil:
>>>                         [playerScripted acceptScript: self topEditor
>>> for:  scriptName]]
>>>
>>>
>>> playerScripted is aPlayer (Model subclass: #Player)
>>>
>>> In
>>>       playerScripted acceptScript: self topEditor for:  scriptName
>>>
>>> the playerScripted gets a node (class MethodNode) from
>>> aScriptEditorMorph
>>>
>>> The node is told to #generate: the method for aCompiledMethodTrailer
>>> which has the data
>>>
>>>
>>> 'script1
>>> (self color: (Color r: 0.419 g: 0.581 b: 1) sees: (Color r: 0.936 g:
>>> 0.936 b: 0.936))
>>> ifFalse: [self turn: 160 + 40 random].
>>> self forward: 9.
>>> self turn: 1.
>>> self bounce: ''silence'''
>>>
>>> The node in turn asks aScriptEncoder
>>>
>>>
>>>        generateMethodOfClass: aCompiledMethodClass trailer: trailer
>>> from: methodNode
>>>
>>>
>>> aScriptEncoder asks
>>>
>>>        self allLiterals
>>>
>>> and within that
>>>
>>>
>>>         self associationForClass
>>>
>>>
>>>
>>>         ScriptEncoder>>associationForClass
>>>    | assoc |
>>>    assoc := self environment associationAt: cue getClass name
>>> ifAbsent:
>>> [nil].
>>>    ^assoc value == cue getClass
>>>   ifTrue: [assoc]
>>>   ifFalse: [Association new value: cue getClass]
>>>
>>>
>>> This is the place where the code breaks
>>>
>>>              cue getClass
>>>
>>> is
>>>              Player140132117123
>>>
>>>
>>>              self environment
>>>
>>> is
>>>              SmalltalkImage
>>>
>>>
>>> First a change from
>>>
>>>
>>>          assoc := self environment associationAt: cue getClass name
>>> ifAbsent: [nil].
>>>
>>> to
>>>
>>>        assoc := self environment globals associationAt: cue getClass
>>> name ifAbsent: [nil].
>>>
>>> worked after adding in addition
>>>
>>>
>>> I could increment and decrement values in a tile.
>>>
>>>
>>> However it was not possible to commit the changes to the inbox. An
>>> error message appeared at the same place.
>>>
>>
>

Reply | Threaded
Open this post in threaded view
|

Re: [Environments] ScriptEncoder>>associationForClass problem // globals

Levente Uzonyi
In reply to this post by Hannes Hirzel
The cause of the issue is ScriptEncoder >> #init:context:notifying:
explicitly setting Smalltalk to be the environment instead of Smalltalk
environment.

Levente

On Sat, 14 Oct 2017, H. Hirzel wrote:

> Hello
>
> after loading a Etoys project into a most recent trunk image
> incrementing a tile value actually generates an updated script which
> is to be compiled.
>
> Recompiling the script causes an error in
>
>        ScriptEncoder>>associationForClass
>
>    | assoc |
>    assoc := self environment associationAt: cue getClass name ifAbsent: [nil].
>    ^assoc value == cue getClass
>   ifTrue: [assoc]
>   ifFalse: [Association new value: cue getClass]
>
>
> Replacing
>
>    assoc := self environment associationAt: cue getClass name ifAbsent: [nil].
>
> with
>
>    assoc := self environment globals associationAt: cue getClass
> name ifAbsent: [nil].
>
>
> Made the script to work but errors later on came up at the same place
> for other reasons. In particular it was not possible to commit the
> changed 'Compiler' package to the inbox.
>
> Do you have any suggestions how to deal with this problem?
>
> Kind regards
> Hannes
>
>
> ----------------------------------------------------
> The use case in details
> ----------------------------------------------------
>
> I drop an Etoys project into a fully updated trunk image.
>
>
> If I click an arrow the following message is sent to aTileMorph
>
>           TileMorph>>arrowAction:
>
> If it is a number a new value is set, for example
>
>
>          aTileMorph literal: 9
>
>
>          TileMorph>>literal
>
> is
>
>         TileMorph>>literal: anObject
>
>        literal := anObject.
>        self updateLiteralLabel.
>        self acceptNewLiteral. "Show that we are out of date,
> install is needed"
>
> #acceptNewLiteral looks for the topScript, i.e. the top morph
> containing the tiles
>
>
> then it calls
>
>         topScript installWithNewLiteral
>
>
> The topScript is a "ScriptEditor for #script1 player: Car"
>
>
>        ScriptEditorMorph>>installWithNewLiteral
>
>         self removeSpaces.
>        scriptName ifNotNil:
>    [playerScripted ifNotNil:
>                        [playerScripted acceptScript: self topEditor
> for:  scriptName]]
>
>
> playerScripted is aPlayer (Model subclass: #Player)
>
> In
>      playerScripted acceptScript: self topEditor for:  scriptName
>
> the playerScripted gets a node (class MethodNode) from aScriptEditorMorph
>
> The node is told to #generate: the method for aCompiledMethodTrailer
> which has the data
>
>
> 'script1
> (self color: (Color r: 0.419 g: 0.581 b: 1) sees: (Color r: 0.936 g:
> 0.936 b: 0.936))
> ifFalse: [self turn: 160 + 40 random].
> self forward: 9.
> self turn: 1.
> self bounce: ''silence'''
>
> The node in turn asks aScriptEncoder
>
>
>       generateMethodOfClass: aCompiledMethodClass trailer: trailer
> from: methodNode
>
>
> aScriptEncoder asks
>
>       self allLiterals
>
> and within that
>
>
>        self associationForClass
>
>
>
>        ScriptEncoder>>associationForClass
>    | assoc |
>    assoc := self environment associationAt: cue getClass name ifAbsent: [nil].
>    ^assoc value == cue getClass
>   ifTrue: [assoc]
>   ifFalse: [Association new value: cue getClass]
>
>
> This is the place where the code breaks
>
>             cue getClass
>
> is
>             Player140132117123
>
>
>             self environment
>
> is
>             SmalltalkImage
>
>
> First a change from
>
>
>          assoc := self environment associationAt: cue getClass name
> ifAbsent: [nil].
>
> to
>
>        assoc := self environment globals associationAt: cue getClass
> name ifAbsent: [nil].
>
> worked after adding in addition
>
>
> I could increment and decrement values in a tile.
>
>
> However it was not possible to commit the changes to the inbox. An
> error message appeared at the same place.

Reply | Threaded
Open this post in threaded view
|

Re: [Environments] ScriptEncoder>>associationForClass problem // globals

David T. Lewis
The current version of ScriptEncoder>>init:context:notifying: (tfel 8/2/2016)
sets the environment to "class environment" but the current version in trunk
(tfel 9/30/2016) sets it to "Smalltalk".

The change was introduced here:

   Name: EToys-tfel.266
   Author: tfel
   Time: 30 September 2016, 11:38:29.998245 am
   UUID: 984ecc63-aae1-7445-b5ae-8b0f1a83be61
   Ancestors: EToys-tfel.265
   
   for now, always compile scripts in the global environment.


Maybe the prior version was better? Or should it have been changed from
"class environment" to "Smalltalk environment" in order to do what was
originally intended in EToys-tfel.266?

Dave


On Sat, Oct 14, 2017 at 11:22:44PM +0200, Levente Uzonyi wrote:

> The cause of the issue is ScriptEncoder >> #init:context:notifying:
> explicitly setting Smalltalk to be the environment instead of Smalltalk
> environment.
>
> Levente
>
> On Sat, 14 Oct 2017, H. Hirzel wrote:
>
> >Hello
> >
> >after loading a Etoys project into a most recent trunk image
> >incrementing a tile value actually generates an updated script which
> >is to be compiled.
> >
> >Recompiling the script causes an error in
> >
> >       ScriptEncoder>>associationForClass
> >
> >    | assoc |
> >    assoc := self environment associationAt: cue getClass name
> >    ifAbsent: [nil].
> >    ^assoc value == cue getClass
> >   ifTrue: [assoc]
> >   ifFalse: [Association new value: cue getClass]
> >
> >
> >Replacing
> >
> >    assoc := self environment associationAt: cue getClass name
> >    ifAbsent: [nil].
> >
> >with
> >
> >    assoc := self environment globals associationAt: cue getClass
> >name ifAbsent: [nil].
> >
> >
> >Made the script to work but errors later on came up at the same place
> >for other reasons. In particular it was not possible to commit the
> >changed 'Compiler' package to the inbox.
> >
> >Do you have any suggestions how to deal with this problem?
> >
> >Kind regards
> >Hannes
> >
> >
> >----------------------------------------------------
> >The use case in details
> >----------------------------------------------------
> >
> >I drop an Etoys project into a fully updated trunk image.
> >
> >
> >If I click an arrow the following message is sent to aTileMorph
> >
> >          TileMorph>>arrowAction:
> >
> >If it is a number a new value is set, for example
> >
> >
> >         aTileMorph literal: 9
> >
> >
> >         TileMorph>>literal
> >
> >is
> >
> >        TileMorph>>literal: anObject
> >
> >        literal := anObject.
> >        self updateLiteralLabel.
> >        self acceptNewLiteral. "Show that we are out of
> >        date,
> >install is needed"
> >
> >#acceptNewLiteral looks for the topScript, i.e. the top morph
> >containing the tiles
> >
> >
> >then it calls
> >
> >        topScript installWithNewLiteral
> >
> >
> >The topScript is a "ScriptEditor for #script1 player: Car"
> >
> >
> >       ScriptEditorMorph>>installWithNewLiteral
> >
> >       self removeSpaces.
> >        scriptName ifNotNil:
> >    [playerScripted ifNotNil:
> >                       [playerScripted acceptScript: self topEditor
> >for:  scriptName]]
> >
> >
> >playerScripted is aPlayer (Model subclass: #Player)
> >
> >In
> >     playerScripted acceptScript: self topEditor for:  scriptName
> >
> >the playerScripted gets a node (class MethodNode) from aScriptEditorMorph
> >
> >The node is told to #generate: the method for aCompiledMethodTrailer
> >which has the data
> >
> >
> >'script1
> > (self color: (Color r: 0.419 g: 0.581 b: 1) sees: (Color r: 0.936 g:
> >0.936 b: 0.936))
> > ifFalse: [self turn: 160 + 40 random].
> > self forward: 9.
> > self turn: 1.
> > self bounce: ''silence'''
> >
> >The node in turn asks aScriptEncoder
> >
> >
> >      generateMethodOfClass: aCompiledMethodClass trailer: trailer
> >from: methodNode
> >
> >
> >aScriptEncoder asks
> >
> >      self allLiterals
> >
> >and within that
> >
> >
> >       self associationForClass
> >
> >
> >
> >       ScriptEncoder>>associationForClass
> >    | assoc |
> >    assoc := self environment associationAt: cue getClass name
> >    ifAbsent: [nil].
> >    ^assoc value == cue getClass
> >   ifTrue: [assoc]
> >   ifFalse: [Association new value: cue getClass]
> >
> >
> >This is the place where the code breaks
> >
> >            cue getClass
> >
> >is
> >            Player140132117123
> >
> >
> >            self environment
> >
> >is
> >            SmalltalkImage
> >
> >
> >First a change from
> >
> >
> >        assoc := self environment associationAt: cue getClass name
> >ifAbsent: [nil].
> >
> >to
> >
> >      assoc := self environment globals associationAt: cue getClass
> >name ifAbsent: [nil].
> >
> >worked after adding in addition
> >
> >
> >I could increment and decrement values in a tile.
> >
> >
> >However it was not possible to commit the changes to the inbox. An
> >error message appeared at the same place.
>

Reply | Threaded
Open this post in threaded view
|

Re: [Environments] ScriptEncoder>>associationForClass problem // globals

Levente Uzonyi
If the intention was to compile it in the global environment, as the
commit message says, then "Smalltalk environment" is the right environment
to use.

Levente

On Sat, 14 Oct 2017, David T. Lewis wrote:

> The current version of ScriptEncoder>>init:context:notifying: (tfel 8/2/2016)
> sets the environment to "class environment" but the current version in trunk
> (tfel 9/30/2016) sets it to "Smalltalk".
>
> The change was introduced here:
>
>   Name: EToys-tfel.266
>   Author: tfel
>   Time: 30 September 2016, 11:38:29.998245 am
>   UUID: 984ecc63-aae1-7445-b5ae-8b0f1a83be61
>   Ancestors: EToys-tfel.265
>
>   for now, always compile scripts in the global environment.
>
>
> Maybe the prior version was better? Or should it have been changed from
> "class environment" to "Smalltalk environment" in order to do what was
> originally intended in EToys-tfel.266?
>
> Dave
>
>
> On Sat, Oct 14, 2017 at 11:22:44PM +0200, Levente Uzonyi wrote:
>> The cause of the issue is ScriptEncoder >> #init:context:notifying:
>> explicitly setting Smalltalk to be the environment instead of Smalltalk
>> environment.
>>
>> Levente
>>
>> On Sat, 14 Oct 2017, H. Hirzel wrote:
>>
>> >Hello
>> >
>> >after loading a Etoys project into a most recent trunk image
>> >incrementing a tile value actually generates an updated script which
>> >is to be compiled.
>> >
>> >Recompiling the script causes an error in
>> >
>> >       ScriptEncoder>>associationForClass
>> >
>> >    | assoc |
>> >    assoc := self environment associationAt: cue getClass name
>> >    ifAbsent: [nil].
>> >    ^assoc value == cue getClass
>> >   ifTrue: [assoc]
>> >   ifFalse: [Association new value: cue getClass]
>> >
>> >
>> >Replacing
>> >
>> >    assoc := self environment associationAt: cue getClass name
>> >    ifAbsent: [nil].
>> >
>> >with
>> >
>> >    assoc := self environment globals associationAt: cue getClass
>> >name ifAbsent: [nil].
>> >
>> >
>> >Made the script to work but errors later on came up at the same place
>> >for other reasons. In particular it was not possible to commit the
>> >changed 'Compiler' package to the inbox.
>> >
>> >Do you have any suggestions how to deal with this problem?
>> >
>> >Kind regards
>> >Hannes
>> >
>> >
>> >----------------------------------------------------
>> >The use case in details
>> >----------------------------------------------------
>> >
>> >I drop an Etoys project into a fully updated trunk image.
>> >
>> >
>> >If I click an arrow the following message is sent to aTileMorph
>> >
>> >          TileMorph>>arrowAction:
>> >
>> >If it is a number a new value is set, for example
>> >
>> >
>> >         aTileMorph literal: 9
>> >
>> >
>> >         TileMorph>>literal
>> >
>> >is
>> >
>> >        TileMorph>>literal: anObject
>> >
>> >        literal := anObject.
>> >        self updateLiteralLabel.
>> >        self acceptNewLiteral. "Show that we are out of
>> >        date,
>> >install is needed"
>> >
>> >#acceptNewLiteral looks for the topScript, i.e. the top morph
>> >containing the tiles
>> >
>> >
>> >then it calls
>> >
>> >        topScript installWithNewLiteral
>> >
>> >
>> >The topScript is a "ScriptEditor for #script1 player: Car"
>> >
>> >
>> >       ScriptEditorMorph>>installWithNewLiteral
>> >
>> >       self removeSpaces.
>> >        scriptName ifNotNil:
>> >    [playerScripted ifNotNil:
>> >                       [playerScripted acceptScript: self topEditor
>> >for:  scriptName]]
>> >
>> >
>> >playerScripted is aPlayer (Model subclass: #Player)
>> >
>> >In
>> >     playerScripted acceptScript: self topEditor for:  scriptName
>> >
>> >the playerScripted gets a node (class MethodNode) from aScriptEditorMorph
>> >
>> >The node is told to #generate: the method for aCompiledMethodTrailer
>> >which has the data
>> >
>> >
>> >'script1
>> > (self color: (Color r: 0.419 g: 0.581 b: 1) sees: (Color r: 0.936 g:
>> >0.936 b: 0.936))
>> > ifFalse: [self turn: 160 + 40 random].
>> > self forward: 9.
>> > self turn: 1.
>> > self bounce: ''silence'''
>> >
>> >The node in turn asks aScriptEncoder
>> >
>> >
>> >      generateMethodOfClass: aCompiledMethodClass trailer: trailer
>> >from: methodNode
>> >
>> >
>> >aScriptEncoder asks
>> >
>> >      self allLiterals
>> >
>> >and within that
>> >
>> >
>> >       self associationForClass
>> >
>> >
>> >
>> >       ScriptEncoder>>associationForClass
>> >    | assoc |
>> >    assoc := self environment associationAt: cue getClass name
>> >    ifAbsent: [nil].
>> >    ^assoc value == cue getClass
>> >   ifTrue: [assoc]
>> >   ifFalse: [Association new value: cue getClass]
>> >
>> >
>> >This is the place where the code breaks
>> >
>> >            cue getClass
>> >
>> >is
>> >            Player140132117123
>> >
>> >
>> >            self environment
>> >
>> >is
>> >            SmalltalkImage
>> >
>> >
>> >First a change from
>> >
>> >
>> >        assoc := self environment associationAt: cue getClass name
>> >ifAbsent: [nil].
>> >
>> >to
>> >
>> >      assoc := self environment globals associationAt: cue getClass
>> >name ifAbsent: [nil].
>> >
>> >worked after adding in addition
>> >
>> >
>> >I could increment and decrement values in a tile.
>> >
>> >
>> >However it was not possible to commit the changes to the inbox. An
>> >error message appeared at the same place.
>>

Reply | Threaded
Open this post in threaded view
|

Re: [Environments] ScriptEncoder>>associationForClass problem // globals

David T. Lewis
In reply to this post by David T. Lewis
Thanks Levente, hopefully fixed in EToys-dtl.310

Dave

On Sat, Oct 14, 2017 at 06:34:23PM -0400, David T. Lewis wrote:

> The current version of ScriptEncoder>>init:context:notifying: (tfel 8/2/2016)
> sets the environment to "class environment" but the current version in trunk
> (tfel 9/30/2016) sets it to "Smalltalk".
>
> The change was introduced here:
>
>    Name: EToys-tfel.266
>    Author: tfel
>    Time: 30 September 2016, 11:38:29.998245 am
>    UUID: 984ecc63-aae1-7445-b5ae-8b0f1a83be61
>    Ancestors: EToys-tfel.265
>    
>    for now, always compile scripts in the global environment.
>
>
> Maybe the prior version was better? Or should it have been changed from
> "class environment" to "Smalltalk environment" in order to do what was
> originally intended in EToys-tfel.266?
>
> Dave
>
>
> On Sat, Oct 14, 2017 at 11:22:44PM +0200, Levente Uzonyi wrote:
> > The cause of the issue is ScriptEncoder >> #init:context:notifying:
> > explicitly setting Smalltalk to be the environment instead of Smalltalk
> > environment.
> >
> > Levente
> >
> > On Sat, 14 Oct 2017, H. Hirzel wrote:
> >
> > >Hello
> > >
> > >after loading a Etoys project into a most recent trunk image
> > >incrementing a tile value actually generates an updated script which
> > >is to be compiled.
> > >
> > >Recompiling the script causes an error in
> > >
> > >       ScriptEncoder>>associationForClass
> > >
> > >    | assoc |
> > >    assoc := self environment associationAt: cue getClass name
> > >    ifAbsent: [nil].
> > >    ^assoc value == cue getClass
> > >   ifTrue: [assoc]
> > >   ifFalse: [Association new value: cue getClass]
> > >
> > >
> > >Replacing
> > >
> > >    assoc := self environment associationAt: cue getClass name
> > >    ifAbsent: [nil].
> > >
> > >with
> > >
> > >    assoc := self environment globals associationAt: cue getClass
> > >name ifAbsent: [nil].
> > >
> > >
> > >Made the script to work but errors later on came up at the same place
> > >for other reasons. In particular it was not possible to commit the
> > >changed 'Compiler' package to the inbox.
> > >
> > >Do you have any suggestions how to deal with this problem?
> > >
> > >Kind regards
> > >Hannes
> > >
> > >
> > >----------------------------------------------------
> > >The use case in details
> > >----------------------------------------------------
> > >
> > >I drop an Etoys project into a fully updated trunk image.
> > >
> > >
> > >If I click an arrow the following message is sent to aTileMorph
> > >
> > >          TileMorph>>arrowAction:
> > >
> > >If it is a number a new value is set, for example
> > >
> > >
> > >         aTileMorph literal: 9
> > >
> > >
> > >         TileMorph>>literal
> > >
> > >is
> > >
> > >        TileMorph>>literal: anObject
> > >
> > >        literal := anObject.
> > >        self updateLiteralLabel.
> > >        self acceptNewLiteral. "Show that we are out of
> > >        date,
> > >install is needed"
> > >
> > >#acceptNewLiteral looks for the topScript, i.e. the top morph
> > >containing the tiles
> > >
> > >
> > >then it calls
> > >
> > >        topScript installWithNewLiteral
> > >
> > >
> > >The topScript is a "ScriptEditor for #script1 player: Car"
> > >
> > >
> > >       ScriptEditorMorph>>installWithNewLiteral
> > >
> > >       self removeSpaces.
> > >        scriptName ifNotNil:
> > >    [playerScripted ifNotNil:
> > >                       [playerScripted acceptScript: self topEditor
> > >for:  scriptName]]
> > >
> > >
> > >playerScripted is aPlayer (Model subclass: #Player)
> > >
> > >In
> > >     playerScripted acceptScript: self topEditor for:  scriptName
> > >
> > >the playerScripted gets a node (class MethodNode) from aScriptEditorMorph
> > >
> > >The node is told to #generate: the method for aCompiledMethodTrailer
> > >which has the data
> > >
> > >
> > >'script1
> > > (self color: (Color r: 0.419 g: 0.581 b: 1) sees: (Color r: 0.936 g:
> > >0.936 b: 0.936))
> > > ifFalse: [self turn: 160 + 40 random].
> > > self forward: 9.
> > > self turn: 1.
> > > self bounce: ''silence'''
> > >
> > >The node in turn asks aScriptEncoder
> > >
> > >
> > >      generateMethodOfClass: aCompiledMethodClass trailer: trailer
> > >from: methodNode
> > >
> > >
> > >aScriptEncoder asks
> > >
> > >      self allLiterals
> > >
> > >and within that
> > >
> > >
> > >       self associationForClass
> > >
> > >
> > >
> > >       ScriptEncoder>>associationForClass
> > >    | assoc |
> > >    assoc := self environment associationAt: cue getClass name
> > >    ifAbsent: [nil].
> > >    ^assoc value == cue getClass
> > >   ifTrue: [assoc]
> > >   ifFalse: [Association new value: cue getClass]
> > >
> > >
> > >This is the place where the code breaks
> > >
> > >            cue getClass
> > >
> > >is
> > >            Player140132117123
> > >
> > >
> > >            self environment
> > >
> > >is
> > >            SmalltalkImage
> > >
> > >
> > >First a change from
> > >
> > >
> > >        assoc := self environment associationAt: cue getClass name
> > >ifAbsent: [nil].
> > >
> > >to
> > >
> > >      assoc := self environment globals associationAt: cue getClass
> > >name ifAbsent: [nil].
> > >
> > >worked after adding in addition
> > >
> > >
> > >I could increment and decrement values in a tile.
> > >
> > >
> > >However it was not possible to commit the changes to the inbox. An
> > >error message appeared at the same place.
> >
>

Reply | Threaded
Open this post in threaded view
|

Re: [Environments] ScriptEncoder>>associationForClass problem // globals

Alan Pinch
In reply to this post by Hannes Hirzel
Where could I find these scripts? I have an idea to build financial
contracts that could be scripted securely, but I need a cross=platform
language. Would these Scripts provide a potential language for this use?


On 10/14/2017 01:44 PM, H. Hirzel wrote:

> Another necessary fix is to add
>
> Preferences class
>
> implicitSelfInTiles
> ^ self
> valueOfFlag: #implicitSelfInTiles
> ifAbsent: [false]
>
>
> message protocol: 'standard queries'
>
> On 10/14/17, H. Hirzel <[hidden email]> wrote:
>> The project just needs to be dropped onto the desktop. Ignore the
>> additional error message and try incrementing the 'forward' value of
>> the car.
>>
>> On 10/14/17, H. Hirzel <[hidden email]> wrote:
>>> P.S. You can download an example home.pr project from the links given in
>>>
>>> http://wiki.squeak.org/squeak/6531
>>>
>>> On 10/14/17, H. Hirzel <[hidden email]> wrote:
>>>> Hello
>>>>
>>>> after loading a Etoys project into a most recent trunk image
>>>> incrementing a tile value actually generates an updated script which
>>>> is to be compiled.
>>>>
>>>> Recompiling the script causes an error in
>>>>
>>>>          ScriptEncoder>>associationForClass
>>>>
>>>>    | assoc |
>>>>    assoc := self environment associationAt: cue getClass name
>>>> ifAbsent:
>>>> [nil].
>>>>    ^assoc value == cue getClass
>>>>   ifTrue: [assoc]
>>>>   ifFalse: [Association new value: cue getClass]
>>>>
>>>>
>>>> Replacing
>>>>
>>>>    assoc := self environment associationAt: cue getClass name
>>>> ifAbsent:
>>>> [nil].
>>>>
>>>> with
>>>>
>>>>    assoc := self environment globals associationAt: cue getClass
>>>> name ifAbsent: [nil].
>>>>
>>>>
>>>> Made the script to work but errors later on came up at the same place
>>>> for other reasons. In particular it was not possible to commit the
>>>> changed 'Compiler' package to the inbox.
>>>>
>>>> Do you have any suggestions how to deal with this problem?
>>>>
>>>> Kind regards
>>>> Hannes
>>>>
>>>>
>>>> ----------------------------------------------------
>>>> The use case in details
>>>> ----------------------------------------------------
>>>>
>>>> I drop an Etoys project into a fully updated trunk image.
>>>>
>>>>
>>>> If I click an arrow the following message is sent to aTileMorph
>>>>
>>>>             TileMorph>>arrowAction:
>>>>
>>>> If it is a number a new value is set, for example
>>>>
>>>>
>>>>            aTileMorph literal: 9
>>>>
>>>>
>>>>            TileMorph>>literal
>>>>
>>>> is
>>>>
>>>>           TileMorph>>literal: anObject
>>>>
>>>>        literal := anObject.
>>>>        self updateLiteralLabel.
>>>>        self acceptNewLiteral. "Show that we are out of date,
>>>> install is needed"
>>>>
>>>> #acceptNewLiteral looks for the topScript, i.e. the top morph
>>>> containing the tiles
>>>>
>>>>
>>>> then it calls
>>>>
>>>>           topScript installWithNewLiteral
>>>>
>>>>
>>>> The topScript is a "ScriptEditor for #script1 player: Car"
>>>>
>>>>
>>>>          ScriptEditorMorph>>installWithNewLiteral
>>>>
>>>>           self removeSpaces.
>>>>        scriptName ifNotNil:
>>>>    [playerScripted ifNotNil:
>>>>                          [playerScripted acceptScript: self topEditor
>>>> for:  scriptName]]
>>>>
>>>>
>>>> playerScripted is aPlayer (Model subclass: #Player)
>>>>
>>>> In
>>>>        playerScripted acceptScript: self topEditor for:  scriptName
>>>>
>>>> the playerScripted gets a node (class MethodNode) from
>>>> aScriptEditorMorph
>>>>
>>>> The node is told to #generate: the method for aCompiledMethodTrailer
>>>> which has the data
>>>>
>>>>
>>>> 'script1
>>>> (self color: (Color r: 0.419 g: 0.581 b: 1) sees: (Color r: 0.936 g:
>>>> 0.936 b: 0.936))
>>>> ifFalse: [self turn: 160 + 40 random].
>>>> self forward: 9.
>>>> self turn: 1.
>>>> self bounce: ''silence'''
>>>>
>>>> The node in turn asks aScriptEncoder
>>>>
>>>>
>>>>         generateMethodOfClass: aCompiledMethodClass trailer: trailer
>>>> from: methodNode
>>>>
>>>>
>>>> aScriptEncoder asks
>>>>
>>>>         self allLiterals
>>>>
>>>> and within that
>>>>
>>>>
>>>>          self associationForClass
>>>>
>>>>
>>>>
>>>>          ScriptEncoder>>associationForClass
>>>>    | assoc |
>>>>    assoc := self environment associationAt: cue getClass name
>>>> ifAbsent:
>>>> [nil].
>>>>    ^assoc value == cue getClass
>>>>   ifTrue: [assoc]
>>>>   ifFalse: [Association new value: cue getClass]
>>>>
>>>>
>>>> This is the place where the code breaks
>>>>
>>>>               cue getClass
>>>>
>>>> is
>>>>               Player140132117123
>>>>
>>>>
>>>>               self environment
>>>>
>>>> is
>>>>               SmalltalkImage
>>>>
>>>>
>>>> First a change from
>>>>
>>>>
>>>>            assoc := self environment associationAt: cue getClass name
>>>> ifAbsent: [nil].
>>>>
>>>> to
>>>>
>>>>          assoc := self environment globals associationAt: cue getClass
>>>> name ifAbsent: [nil].
>>>>
>>>> worked after adding in addition
>>>>
>>>>
>>>> I could increment and decrement values in a tile.
>>>>
>>>>
>>>> However it was not possible to commit the changes to the inbox. An
>>>> error message appeared at the same place.
>>>>

--
Thank you for your consideration,
Alan