Hello
The recipe: How to list all global variables [1] has the code snippet Smalltalk keys select: [:k | ((Smalltalk at: k) isKindOf: Class) not] thenCollect: [:k | k -> (Smalltalk at: k) class] to give a list of global variables. When executing this code the recommendation is to use Smalltalk globals instead of Smalltalk keys A rewrite because of Environments not having #select:thenCollect: (I do not think that is necessary) then is (Smalltalk globals select: [:k | ((Smalltalk at: k) isKindOf: Class) not]) collect: [:k | k -> (Smalltalk at: k) class] Then I get 'key not found: ExtendedNumberParser'. I wonder what is going on here ... Regards Hannes [1] http://wiki.squeak.org/squeak/1824 |
P.S. A more elegant solution is mentioned at the bottom of page
http://wiki.squeak.org/squeak/1824 Smalltalk globals reject: [:each | each class isMeta] Result attached. For that to work Environment needs the addition of reject: aBlock ^ declarations reject: aBlock in the 'emulating' instance method protocol On 4/3/17, H. Hirzel <[hidden email]> wrote: > Hello > > The recipe: How to list all global variables [1] > > has the code snippet > > > > Smalltalk keys > select: > [:k | ((Smalltalk at: k) isKindOf: Class) not] > thenCollect: > [:k | k -> (Smalltalk at: k) class] > > > to give a list of global variables. > > > When executing this code the recommendation is to use > > Smalltalk globals > > instead of > > Smalltalk keys > > > A rewrite because of Environments not having #select:thenCollect: (I > do not think that is necessary) then is > > (Smalltalk globals select: [:k | ((Smalltalk at: k) isKindOf: Class) > not]) > collect: [:k | k -> (Smalltalk at: k) class] > > Then I get 'key not found: ExtendedNumberParser'. > > I wonder what is going on here ... > > Regards > Hannes > > > [1] http://wiki.squeak.org/squeak/1824 > Global_variables_in_Squeak_Smalltalk_2017-04-03.png (56K) Download Attachment |
In reply to this post by Hannes Hirzel
Am 03.04.2017 19:12 schrieb "H. Hirzel" <[hidden email]>:
Cannot verify this atm but I think k is the class (value), not the symbol (key), and at: wants a key. Like a Dictionary. |
In reply to this post by Hannes Hirzel
Found the solution. It is in the class comment of SystemDictionary
_____ I represent a special dictionary used as global namespace for class names : Smalltalk globals classNames. and for traits too: Smalltalk globals traitNames. and a few other globals: (Smalltalk globals keys reject: [:k | (Smalltalk globals at: k) isBehavior]) collect: [:k | k -> (Smalltalk globals at: k) class]. As the above example let you guess, the global namespace of Smalltalk system is accessed through: Smalltalk globals. ____ I updated http://wiki.squeak.org/squeak/1824 __ However there is a problem with (Smalltalk globals reject: [:each | each class isMeta]) inspect You get the list but if you click on 'self' then you get a different list. (printString issue) On 4/3/17, H. Hirzel <[hidden email]> wrote: > P.S. A more elegant solution is mentioned at the bottom of page > http://wiki.squeak.org/squeak/1824 > > Smalltalk globals reject: [:each | each class isMeta] > > Result attached. > > > > For that to work Environment needs the addition of > > reject: aBlock > ^ declarations reject: aBlock > > in the 'emulating' instance method protocol > > On 4/3/17, H. Hirzel <[hidden email]> wrote: >> Hello >> >> The recipe: How to list all global variables [1] >> >> has the code snippet >> >> >> >> Smalltalk keys >> select: >> [:k | ((Smalltalk at: k) isKindOf: Class) not] >> thenCollect: >> [:k | k -> (Smalltalk at: k) class] >> >> >> to give a list of global variables. >> >> >> When executing this code the recommendation is to use >> >> Smalltalk globals >> >> instead of >> >> Smalltalk keys >> >> >> A rewrite because of Environments not having #select:thenCollect: (I >> do not think that is necessary) then is >> >> (Smalltalk globals select: [:k | ((Smalltalk at: k) isKindOf: Class) >> not]) >> collect: [:k | k -> (Smalltalk at: k) class] >> >> Then I get 'key not found: ExtendedNumberParser'. >> >> I wonder what is going on here ... >> >> Regards >> Hannes >> >> >> [1] http://wiki.squeak.org/squeak/1824 >> > |
In reply to this post by Hannes Hirzel
Both solutions are wrong.
The one you found on the wiki will be fooled by any global pointing to a class. The one you came up with will also lose the bindings themselves. The correct solution is: Array streamContents: [ :stream | Smalltalk globals associationsDo: [ :binding | binding class == Global ifTrue: [ stream nextPut: binding ] ] ]. The role of declarations and bindings is still not clear in Environments, therefore, as I wrote it before, unrelated to tool support, I still consider Environments to be incomplete. Levente On Mon, 3 Apr 2017, H. Hirzel wrote: > P.S. A more elegant solution is mentioned at the bottom of page > http://wiki.squeak.org/squeak/1824 > > Smalltalk globals reject: [:each | each class isMeta] > > Result attached. > > > > For that to work Environment needs the addition of > > reject: aBlock > ^ declarations reject: aBlock > > in the 'emulating' instance method protocol > > On 4/3/17, H. Hirzel <[hidden email]> wrote: >> Hello >> >> The recipe: How to list all global variables [1] >> >> has the code snippet >> >> >> >> Smalltalk keys >> select: >> [:k | ((Smalltalk at: k) isKindOf: Class) not] >> thenCollect: >> [:k | k -> (Smalltalk at: k) class] >> >> >> to give a list of global variables. >> >> >> When executing this code the recommendation is to use >> >> Smalltalk globals >> >> instead of >> >> Smalltalk keys >> >> >> A rewrite because of Environments not having #select:thenCollect: (I >> do not think that is necessary) then is >> >> (Smalltalk globals select: [:k | ((Smalltalk at: k) isKindOf: Class) >> not]) >> collect: [:k | k -> (Smalltalk at: k) class] >> >> Then I get 'key not found: ExtendedNumberParser'. >> >> I wonder what is going on here ... >> >> Regards >> Hannes >> >> >> [1] http://wiki.squeak.org/squeak/1824 >> > |
Hi Levente,
> On Apr 3, 2017, at 11:14 AM, Levente Uzonyi <[hidden email]> wrote: > > Both solutions are wrong. +1 > The one you found on the wiki will be fooled by any global pointing to a class. > The one you came up with will also lose the bindings themselves. > The correct solution is: > > Array streamContents: [ :stream | > Smalltalk globals associationsDo: [ :binding | > binding class == Global ifTrue: [ stream nextPut: binding ] ] ]. Why not Array streamContents: [ :stream | Smalltalk globals associationsDo: [ :binding | (binding class == Global and: [ binding value isBehavior and: [ binding key == binding value name ] ]) ifTrue: [ stream nextPut: binding ] ] ]. or Array streamContents: [ :stream | Smalltalk globals associationsDo: [ :binding | (binding value isBehavior and: [ binding key == binding value name ]) ifTrue: [ stream nextPut: binding ] ] ]. ? > The role of declarations and bindings is still not clear in Environments, therefore, as I wrote it before, unrelated to tool support, I still consider Environments to be incomplete. What is required to resolve this? > > Levente > >> On Mon, 3 Apr 2017, H. Hirzel wrote: >> >> P.S. A more elegant solution is mentioned at the bottom of page >> http://wiki.squeak.org/squeak/1824 >> >> Smalltalk globals reject: [:each | each class isMeta] >> >> Result attached. >> >> >> >> For that to work Environment needs the addition of >> >> reject: aBlock >> ^ declarations reject: aBlock >> >> in the 'emulating' instance method protocol >> >>> On 4/3/17, H. Hirzel <[hidden email]> wrote: >>> Hello >>> >>> The recipe: How to list all global variables [1] >>> >>> has the code snippet >>> >>> >>> >>> Smalltalk keys >>> select: >>> [:k | ((Smalltalk at: k) isKindOf: Class) not] >>> thenCollect: >>> [:k | k -> (Smalltalk at: k) class] >>> >>> >>> to give a list of global variables. >>> >>> >>> When executing this code the recommendation is to use >>> >>> Smalltalk globals >>> >>> instead of >>> >>> Smalltalk keys >>> >>> >>> A rewrite because of Environments not having #select:thenCollect: (I >>> do not think that is necessary) then is >>> >>> (Smalltalk globals select: [:k | ((Smalltalk at: k) isKindOf: Class) >>> not]) >>> collect: [:k | k -> (Smalltalk at: k) class] >>> >>> Then I get 'key not found: ExtendedNumberParser'. >>> >>> I wonder what is going on here ... >>> >>> Regards >>> Hannes >>> >>> >>> [1] http://wiki.squeak.org/squeak/1824 >>> >> > |
On Tue, Apr 4, 2017 at 3:47 PM, Eliot Miranda <[hidden email]> wrote: Hi Levente, Or shorter Smalltalk globals declarations select: #canAssign maybe? Unlike class bindings, global vars are writable. Why not Because we want to know the global *variables*, that is everything *but* the class bindings. So we look for instances of Global, not ClassBinding, no matter the value. > The role of declarations and bindings is still not clear in Environments, therefore, as I wrote it before, unrelated to tool support, I still consider Environments to be incomplete. I thought 'declarations' are the things owned by this environment (excluding imports), whereas 'bindings' are the things visible in this environment (including imports). - Bert - |
Smalltalk globals declarations reject: #isClassBinding with isClassBinding ^value isBehavior and: [key == value name]
|
In reply to this post by Bert Freudenberg
On Tue, 4 Apr 2017, Bert Freudenberg wrote:
> On Tue, Apr 4, 2017 at 3:47 PM, Eliot Miranda <[hidden email]> wrote: > Hi Levente, > > > On Apr 3, 2017, at 11:14 AM, Levente Uzonyi <[hidden email]> wrote: > > > > The correct solution is: > > > > Array streamContents: [ :stream | > > Smalltalk globals associationsDo: [ :binding | > > binding class == Global ifTrue: [ stream nextPut: binding ] ] ]. > > > Or shorter > > Smalltalk globals declarations select: #canAssign > > maybe? Unlike class bindings, global vars are writable. written to and ClassBindings can't, this should not be relied on. > > Why not > > Array streamContents: [ :stream | > Smalltalk globals associationsDo: [ :binding | > (binding class == Global > and: [ binding value isBehavior > and: [ binding key == binding value name ] ]) ifTrue: > [ stream nextPut: binding ] ] ]. > > > Because we want to know the global *variables*, that is everything *but* the class bindings. So we look for instances of Global, not ClassBinding, no matter the value. > > > The role of declarations and bindings is still not clear in Environments, therefore, as I wrote it before, unrelated to tool support, I still consider Environments to be incomplete. > > > I thought 'declarations' are the things owned by this environment (excluding imports), whereas 'bindings' are the things visible in this environment (including imports). Currently it's kind of a mess. For example #associationAt: will return a binding from declarations, while #associationOrUndeclaredAt: will look up stuff in bindings and undeclared. I think the backwards compatible dictionary-like API should only use declarations and undeclared, and should only be used with Smalltalk globals. But the new API is still to be done. Levente > > - Bert - > > > |
In reply to this post by Eliot Miranda-2
On Tue, 4 Apr 2017, Eliot Miranda wrote:
> > > On Apr 4, 2017, at 7:02 AM, Bert Freudenberg <[hidden email]> wrote: > > On Tue, Apr 4, 2017 at 3:47 PM, Eliot Miranda <[hidden email]> wrote: > Hi Levente, > > > On Apr 3, 2017, at 11:14 AM, Levente Uzonyi <[hidden email]> wrote: > > > > The correct solution is: > > > > Array streamContents: [ :stream | > > Smalltalk globals associationsDo: [ :binding | > > binding class == Global ifTrue: [ stream nextPut: binding ] ] ]. > > > Or shorter > > Smalltalk globals declarations select: #canAssign > > maybe? Unlike class bindings, global vars are writable. > > > I don't like this. I see writability as orthogonal. I'm sure there's good uses for read-only globals that are not classes. I like the tenseness though. So > Smalltalk globals declarations reject: #isClassBinding > > with > isClassBinding ^value isBehavior and: [key == value name] It's a ClassBinding even if it's not initialized properly. And that should be the Environment's responibility. > > > Why not > > Array streamContents: [ :stream | > Smalltalk globals associationsDo: [ :binding | > (binding class == Global > and: [ binding value isBehavior > and: [ binding key == binding value name ] ]) ifTrue: > [ stream nextPut: binding ] ] ]. > > > Because we want to know the global *variables*, that is everything *but* the class bindings. So we look for instances of Global, not ClassBinding, no matter the value. > > > Forgive me; I missed a not in there. But my point is that the classes in global are in bindings whose keys are == to their name. Everything else is a global variable. Levente > > > > The role of declarations and bindings is still not clear in Environments, therefore, as I wrote it before, unrelated to tool support, I still consider Environments to be incomplete. > > > I thought 'declarations' are the things owned by this environment (excluding imports), whereas 'bindings' are the things visible in this environment (including imports). > > > Is there a definition in text somewhere? Colin? > > - Bert - > > > |
On Tue 4. Apr 2017 at 19:05, Levente Uzonyi <[hidden email]> wrote: On Tue, 4 Apr 2017, Eliot Miranda wrote: Yep. Besides, with renaming on import the name of the class is not necessarily the same as its binding key. - Bert -
|
An attempt to summarize this thread:
To create a list of globals Levente proposes Array streamContents: [ :stream | Smalltalk globals associationsDo: [ :binding | binding class == Global ifTrue: [ stream nextPut: binding ] ] ]. Wheras Eliot has: Array streamContents: [ :stream | Smalltalk globals associationsDo: [ :binding | (binding class == Global and: [ (binding value isBehavior and: [ binding key == binding value name ] ) not ] ) ifTrue: [ stream nextPut: binding ] ] ]. The question is what should be in the 'List of globals'? a) 'bindings' which are an instance of Global (Levente) b) 'bindings' which are an instance of Global and in addition do not point to a class. (Eliot) --Hannes On 4/5/17, Bert Freudenberg <[hidden email]> wrote: > On Tue 4. Apr 2017 at 19:05, Levente Uzonyi <[hidden email]> wrote: > >> On Tue, 4 Apr 2017, Eliot Miranda wrote: >> >> > >> > >> > On Apr 4, 2017, at 7:02 AM, Bert Freudenberg <[hidden email]> >> wrote: >> > >> > On Tue, Apr 4, 2017 at 3:47 PM, Eliot Miranda < >> [hidden email]> wrote: >> > Hi Levente, >> > >> > > On Apr 3, 2017, at 11:14 AM, Levente Uzonyi < >> [hidden email]> wrote: >> > > >> > > The correct solution is: >> > > >> > > Array streamContents: [ :stream | >> > > Smalltalk globals associationsDo: [ :binding | >> > > binding class == Global ifTrue: [ stream nextPut: >> binding ] ] ]. >> > >> > >> > Or shorter >> > >> > Smalltalk globals declarations select: #canAssign >> > >> > maybe? Unlike class bindings, global vars are writable. >> > >> > >> > I don't like this. I see writability as orthogonal. I'm sure there's >> good uses for read-only globals that are not classes. I like the >> tenseness >> though. So >> > Smalltalk globals declarations reject: #isClassBinding >> > >> > with >> > isClassBinding ^value isBehavior and: [key == value name] >> >> Why not just ^true? >> It's a ClassBinding even if it's not initialized properly. And that >> should >> be the Environment's responibility. >> >> > >> > >> > Why not >> > >> > Array streamContents: [ :stream | >> > Smalltalk globals associationsDo: [ :binding | >> > (binding class == Global >> > and: [ binding value isBehavior >> > and: [ binding key == binding value name ] ]) ifTrue: >> > [ stream nextPut: binding ] ] ]. >> > >> > >> > Because we want to know the global *variables*, that is everything >> > *but* >> the class bindings. So we look for instances of Global, not ClassBinding, >> no matter the value. >> > >> > >> > Forgive me; I missed a not in there. But my point is that the classes >> in global are in bindings whose keys are == to their name. Everything >> else >> is a global variable. >> >> We have separate subclasses: ClassBinding and Global. We should use >> those. >> >> Levente >> > > > Yep. Besides, with renaming on import the name of the class is not > necessarily the same as its binding key. > > - Bert - > > >> > >> > >> > > The role of declarations and bindings is still not clear in >> Environments, therefore, as I wrote it before, unrelated to tool support, >> I >> still consider Environments to be incomplete. >> > >> > >> > I thought 'declarations' are the things owned by this environment >> (excluding imports), whereas 'bindings' are the things visible in this >> environment (including imports). >> > >> > >> > Is there a definition in text somewhere? Colin? >> > >> > - Bert - >> > >> > >> > >> > |
P.S. In a Squeak 6.0a image both expressions give an array with 18
objects of class 'Global' Binding subclass: #Global instanceVariableNames: 'value' classVariableNames: '' poolDictionaries: '' category: 'Environments-Core' On 12/30/17, H. Hirzel <[hidden email]> wrote: > An attempt to summarize this thread: > > > To create a list of globals Levente proposes > > Array streamContents: [ :stream | > Smalltalk globals associationsDo: [ :binding | > binding class == Global ifTrue: [ stream nextPut: binding ] > ] ]. > > > Wheras Eliot has: > > Array streamContents: [ :stream | > Smalltalk globals associationsDo: [ :binding | > (binding class == Global > and: [ (binding value isBehavior > and: [ binding key == binding value name ] > ) not > ] > ) ifTrue: > [ stream nextPut: binding ] ] ]. > > > > The question is what should be in the 'List of globals'? > > a) 'bindings' which are an instance of Global (Levente) > b) 'bindings' which are an instance of Global and in addition do not > point to a class. (Eliot) > > > --Hannes > > On 4/5/17, Bert Freudenberg <[hidden email]> wrote: >> On Tue 4. Apr 2017 at 19:05, Levente Uzonyi <[hidden email]> wrote: >> >>> On Tue, 4 Apr 2017, Eliot Miranda wrote: >>> >>> > >>> > >>> > On Apr 4, 2017, at 7:02 AM, Bert Freudenberg <[hidden email]> >>> wrote: >>> > >>> > On Tue, Apr 4, 2017 at 3:47 PM, Eliot Miranda < >>> [hidden email]> wrote: >>> > Hi Levente, >>> > >>> > > On Apr 3, 2017, at 11:14 AM, Levente Uzonyi < >>> [hidden email]> wrote: >>> > > >>> > > The correct solution is: >>> > > >>> > > Array streamContents: [ :stream | >>> > > Smalltalk globals associationsDo: [ :binding | >>> > > binding class == Global ifTrue: [ stream nextPut: >>> binding ] ] ]. >>> > >>> > >>> > Or shorter >>> > >>> > Smalltalk globals declarations select: #canAssign >>> > >>> > maybe? Unlike class bindings, global vars are writable. >>> > >>> > >>> > I don't like this. I see writability as orthogonal. I'm sure there's >>> good uses for read-only globals that are not classes. I like the >>> tenseness >>> though. So >>> > Smalltalk globals declarations reject: #isClassBinding >>> > >>> > with >>> > isClassBinding ^value isBehavior and: [key == value name] >>> >>> Why not just ^true? >>> It's a ClassBinding even if it's not initialized properly. And that >>> should >>> be the Environment's responibility. >>> >>> > >>> > >>> > Why not >>> > >>> > Array streamContents: [ :stream | >>> > Smalltalk globals associationsDo: [ :binding | >>> > (binding class == Global >>> > and: [ binding value isBehavior >>> > and: [ binding key == binding value name ] ]) ifTrue: >>> > [ stream nextPut: binding ] ] ]. >>> > >>> > >>> > Because we want to know the global *variables*, that is everything >>> > *but* >>> the class bindings. So we look for instances of Global, not >>> ClassBinding, >>> no matter the value. >>> > >>> > >>> > Forgive me; I missed a not in there. But my point is that the classes >>> in global are in bindings whose keys are == to their name. Everything >>> else >>> is a global variable. >>> >>> We have separate subclasses: ClassBinding and Global. We should use >>> those. >>> >>> Levente >>> >> >> >> Yep. Besides, with renaming on import the name of the class is not >> necessarily the same as its binding key. >> >> - Bert - >> >> >>> > >>> > >>> > > The role of declarations and bindings is still not clear in >>> Environments, therefore, as I wrote it before, unrelated to tool >>> support, >>> I >>> still consider Environments to be incomplete. >>> > >>> > >>> > I thought 'declarations' are the things owned by this environment >>> (excluding imports), whereas 'bindings' are the things visible in this >>> environment (including imports). >>> > >>> > >>> > Is there a definition in text somewhere? Colin? >>> > >>> > - Bert - >>> > >>> > >>> > >>> >> > |
Counter question: what do you need that list for, meaning, what do you
intend to do with the items? For mere technical purposes, checking only for Global seems like the "right" way to me since the system takes care to choose the correct binding class (i.e., Global or ClassBinding) automatically. Eliot's variant is more precautious, but it should only catch cases were something went wrong in the first place, if I am not mistaken. For practical purposes, selecting with #isBehavior and/or #canAssign as indicated by Bert might be the better choice. You could even end up doing this: Smalltalk globals associationsDo: [:each | (each value isBehavior not or: [each canAssign]) ifTrue: [...]]. By the way, regarding the automatic choice of the binding class, I just noted this: MyGlobal := Object. "when prompted, choose 'declare global' for the parser" (Smalltalk globals associationAt: #MyGlobal) class ==> Global Smalltalk globals at: #MyGlobal2 put: Object. (Smalltalk globals associationAt: #MyGlobal2) class ==> ClassBinding "this would contradict Eliot's previous assumption: 'But my point is that the classes in global are in bindings whose keys are == to their name. Everything else is a global variable.'" "also note that this is not the same thing as proper aliasing, because Alias/asBinding: is not involved" Smalltalk globals at: #MyGlobal2 put: nil. "equivalent to 'declare global'" MyGlobal2 := Object. "which should mean (Smalltalk globals bindingOf: #MyGlobal2) value: Object." (Smalltalk globals associationAt: #MyGlobal2) class ==> Global So when you want a Global that is referring to a class, you currently must not use Environment>>at:put:/bind:to: right away. Kind regards, Jakob 2017-12-30 15:33 GMT+01:00 H. Hirzel <[hidden email]>: > P.S. In a Squeak 6.0a image both expressions give an array with 18 > objects of class 'Global' > > Binding subclass: #Global > instanceVariableNames: 'value' > classVariableNames: '' > poolDictionaries: '' > category: 'Environments-Core' > > On 12/30/17, H. Hirzel <[hidden email]> wrote: >> An attempt to summarize this thread: >> >> >> To create a list of globals Levente proposes >> >> Array streamContents: [ :stream | >> Smalltalk globals associationsDo: [ :binding | >> binding class == Global ifTrue: [ stream nextPut: binding ] >> ] ]. >> >> >> Wheras Eliot has: >> >> Array streamContents: [ :stream | >> Smalltalk globals associationsDo: [ :binding | >> (binding class == Global >> and: [ (binding value isBehavior >> and: [ binding key == binding value name ] >> ) not >> ] >> ) ifTrue: >> [ stream nextPut: binding ] ] ]. >> >> >> >> The question is what should be in the 'List of globals'? >> >> a) 'bindings' which are an instance of Global (Levente) >> b) 'bindings' which are an instance of Global and in addition do not >> point to a class. (Eliot) >> >> >> --Hannes >> >> On 4/5/17, Bert Freudenberg <[hidden email]> wrote: >>> On Tue 4. Apr 2017 at 19:05, Levente Uzonyi <[hidden email]> wrote: >>> >>>> On Tue, 4 Apr 2017, Eliot Miranda wrote: >>>> >>>> > >>>> > >>>> > On Apr 4, 2017, at 7:02 AM, Bert Freudenberg <[hidden email]> >>>> wrote: >>>> > >>>> > On Tue, Apr 4, 2017 at 3:47 PM, Eliot Miranda < >>>> [hidden email]> wrote: >>>> > Hi Levente, >>>> > >>>> > > On Apr 3, 2017, at 11:14 AM, Levente Uzonyi < >>>> [hidden email]> wrote: >>>> > > >>>> > > The correct solution is: >>>> > > >>>> > > Array streamContents: [ :stream | >>>> > > Smalltalk globals associationsDo: [ :binding | >>>> > > binding class == Global ifTrue: [ stream nextPut: >>>> binding ] ] ]. >>>> > >>>> > >>>> > Or shorter >>>> > >>>> > Smalltalk globals declarations select: #canAssign >>>> > >>>> > maybe? Unlike class bindings, global vars are writable. >>>> > >>>> > >>>> > I don't like this. I see writability as orthogonal. I'm sure there's >>>> good uses for read-only globals that are not classes. I like the >>>> tenseness >>>> though. So >>>> > Smalltalk globals declarations reject: #isClassBinding >>>> > >>>> > with >>>> > isClassBinding ^value isBehavior and: [key == value name] >>>> >>>> Why not just ^true? >>>> It's a ClassBinding even if it's not initialized properly. And that >>>> should >>>> be the Environment's responibility. >>>> >>>> > >>>> > >>>> > Why not >>>> > >>>> > Array streamContents: [ :stream | >>>> > Smalltalk globals associationsDo: [ :binding | >>>> > (binding class == Global >>>> > and: [ binding value isBehavior >>>> > and: [ binding key == binding value name ] ]) ifTrue: >>>> > [ stream nextPut: binding ] ] ]. >>>> > >>>> > >>>> > Because we want to know the global *variables*, that is everything >>>> > *but* >>>> the class bindings. So we look for instances of Global, not >>>> ClassBinding, >>>> no matter the value. >>>> > >>>> > >>>> > Forgive me; I missed a not in there. But my point is that the classes >>>> in global are in bindings whose keys are == to their name. Everything >>>> else >>>> is a global variable. >>>> >>>> We have separate subclasses: ClassBinding and Global. We should use >>>> those. >>>> >>>> Levente >>>> >>> >>> >>> Yep. Besides, with renaming on import the name of the class is not >>> necessarily the same as its binding key. >>> >>> - Bert - >>> >>> >>>> > >>>> > >>>> > > The role of declarations and bindings is still not clear in >>>> Environments, therefore, as I wrote it before, unrelated to tool >>>> support, >>>> I >>>> still consider Environments to be incomplete. >>>> > >>>> > >>>> > I thought 'declarations' are the things owned by this environment >>>> (excluding imports), whereas 'bindings' are the things visible in this >>>> environment (including imports). >>>> > >>>> > >>>> > Is there a definition in text somewhere? Colin? >>>> > >>>> > - Bert - >>>> > >>>> > >>>> > >>>> >>> >> > |
Free forum by Nabble | Edit this page |