[squeak-dev] The Trunk: Environments-dtl.72.mcz

Eliot Miranda eliot.miranda at gmail.com
Tue Mar 20 21:49:10 UTC 2018


Hi Levente,

On Tue, Mar 20, 2018 at 2:38 PM, Levente Uzonyi <leves at caesar.elte.hu>
wrote:

> On Tue, 20 Mar 2018, Eliot Miranda wrote:
>
> Hi Jacob,
>> On Tue, Mar 20, 2018 at 9:06 AM, Jakob Reschke <forums.jakob at resfarm.de>
>> wrote:
>>       Hi Eliot,
>>
>>       ok, from your answers, it should access the declarations, not the
>>       bindings of an environment.
>>
>>       With your requirement, that could be:
>>          (self select: [:each | each isBehavior and: [each superclass
>> isNil
>>       and: [each environment == self "not misplaced via at:put:"]]]) asSet
>>       asArray
>>
>>
>> I don't understand "each environment == self".  A comment as to how this
>> works would be good.  Further, is it not possible to declare a variable
>> whose value is a root class?
>>
>
> With Environments came a new class hierarchy to replace Associations
> holding bindings: Binding and its subclasses: Alias, ClassBinding and
> Global.
>

Thanks.  Now I get it.


>
> A class's binding is always a ClassBinding, a global variable's binding is
> always a Global, even if it points to a class. Alias wraps another binding
> and gives it a different name.
> So, it is fairly easy to detect if a binding is a class, a variable or a
> "renamed" class or variable.
> This also means that having an Association in an environment is a bug: an
> Association is not a Binding.
> So, the following should only ever return classes declared in the
> environment:
>
>         | roots |
>         roots := IdentitySet new.
>         declarations associationsDo: [ :binding |
>                 binding class == ClassBinding ifTrue: [
>                         | class |
>                         (class := binding value) superclass ifNil: [
>                                 roots add: class ] ] ].
>         ^roots asArray
>

OK, but a bit hacky.  As you point out below...


>
> Another way to write it (though it uses a less up-to-date mechanism) if
> you're only interested in Classes (and not other kinds of Behavior):
>
>         | roots |
>         roots := IdentitySet new.
>         self allClassesDo: [ :class |
>                 class superclass ifNil: [ roots add: class ] ].
>         ^roots asArray


Ah, lovely.  This is the right way to write it.

      I removed the #value sends because select: only iterates over the
>>       values of a dictionary(-like object).
>>
>>
>> Good point.
>>
>>       I do not like the dependency on
>>       the names of things, but that could also be an overreaction as the
>>       result of my endeavor to make the tools work across environments.
>> ;-)
>>
>>
>> However it works the issue is avoiding duplicates caused by defining
>> variables whose values are classes.  I used #name as that's the hammer I
>> know.  I hope there's a better way :-)  Further, I hope you'll
>> find it :-)
>>
>
> See above.
>
> Levente
>
>
>
>>
>>       Kind regards,
>>       Jakob
>>
>>
>>       2018-03-18 17:02 GMT+01:00 Eliot Miranda <eliot.miranda at gmail.com>:
>>       > Hi Jacob,
>>       >
>>       >> On Mar 18, 2018, at 3:40 AM, Jakob Reschke <
>> forums.jakob at resfarm.de> wrote:
>>       >>
>>       >> Hi Eliot,
>>       >>
>>       >> Note that self bindings select: is not the same as self select:
>> for an
>>       >> Environment, as the latter only enumerates the declarations (its
>> "own"
>>       >> bindings).
>>       >>
>>       >> Seems like the only sender is Class rootsOfTheWorld, which
>> itself is
>>       >> unsent. In that case, the Smalltalk "root" environment is
>> hard-coded
>>       >> and the specifics of bindings vs. declarations do not really
>> matter.
>>       >> But what should #rootClasses answer for other, possibly isolated
>>       >> environments? What does the sender want to know?
>>       >> - For an empty environment (no classes contained), should it
>> answer an
>>       >> empty collection?
>>       >
>>       > Yes
>>       >
>>       >> - Should the answer change if the "root" environment is imported?
>>       >
>>       > No
>>       >
>>       >> - For an environment that a) does not contain ProtoObject or
>> Object,
>>       >> but other classes deriving from them, and b) does not import the
>>       >> "root" environment, should it answer an empty collection,
>>       >> {ProtoObject} (although it is not imported) via superclass
>> relations,
>>       >> or something else?
>>       >
>>       > Empty
>>       >
>>       >> - Should the answer change if the "root" environment is imported?
>>       >>
>>       >> By the way, would it work to have a second (different)
>> ProtoObject
>>       >> class in the image (in a different environment or under a
>> different
>>       >> name)?
>>       >
>>       > It should, right?
>>       >
>>       > the rootsOfTheWorld are easy to understand and hence to extend to
>> environments.  Pre environments theRootsOfTheWorld are the classes that
>> have no superclass (have nil as their superclass).
>>       theRootsOfTheWorld is a set (has no duplicates) but can be a
>> sequence.  Hence, given that Smalltalk can contain user defined variables,
>> and the values of these variables can be anything, including
>>       classes, the computation of theRootsOfTheWorld should filter out
>> variables that just happen to refer to root classes to ensure that a set is
>> answered.
>>       >
>>       > Extending this to environments then is straight forward.
>> theRootsOfTheWorld in an environment is a set of the classes defined in
>> that environment that have no superclass. The computation should
>>       not be confusable by variables whose values just happen to be toot
>> classes.
>>       >
>>       > Now, given that theRootsOfTheWorld are used as the roots of code
>> search (allImplementosOf: et al) the notion of a pet-environment
>> theRootsOfTheWorld is suspect, given that code search should be
>>       able to search all code.  But let's at least get the
>> per-environment definition correct before we try and define a system-wide
>> one.
>>       >
>>       >>
>>       >> Best regards,
>>       >> Jakob
>>       >>
>>       >> 2018-03-18 9:18 GMT+01:00 Eliot Miranda <eliot.miranda at gmail.com
>> >:
>>       >>> Hi David,
>>       >>>
>>       >>>>> On Mar 17, 2018, at 8:19 PM, David T. Lewis <
>> lewis at mail.msen.com> wrote:
>>       >>>>>
>>       >>>>> On Sat, Mar 17, 2018 at 04:54:36PM -0700, Eliot Miranda wrote:
>>       >>>>> Hi David,
>>       >>>>>
>>       >>>>>> On Sat, Mar 17, 2018 at 12:10 PM, <commits at source.squeak.org>
>> wrote:
>>       >>>>>>
>>       >>>>>> David T. Lewis uploaded a new version of Environments to
>> project The Trunk:
>>       >>>>>> http://source.squeak.org/trunk/Environments-dtl.72.mcz
>>       >>>>>>
>>       >>>>>> ==================== Summary ====================
>>       >>>>>>
>>       >>>>>> Name: Environments-dtl.72
>>       >>>>>> Author: dtl
>>       >>>>>> Time: 17 March 2018, 3:09:49.564301 pm
>>       >>>>>> UUID: e9aed004-8798-41c0-83f9-a04f5963dd55
>>       >>>>>> Ancestors: Environments-jr.71, Environments-fbs.27
>>       >>>>>>
>>       >>>>>> Merge Environments-fbs.27
>>       >>>>>>
>>       >>>>>> =============== Diff against Environments-jr.71
>> ===============
>>       >>>>>>
>>       >>>>>> Item was added:
>>       >>>>>> + ----- Method: Environment>>rootClasses (in category
>> 'accessing') -----
>>       >>>>>> + rootClasses
>>       >>>>>> +       "return a collection of classes which have a nil
>> superclass"
>>       >>>>>> +       ^ (self select: [:each | each isBehavior and: [each
>> superclass
>>       >>>>>> isNil]]) asOrderedCollection.!
>>       >>>>>>
>>       >>>>>
>>       >>>>> At least for me this isn't quite good enough.  There's a
>> possibility that
>>       >>>>> someone could establish a variable whose value is a root,
>> e.g. by
>>       >>>>>
>>       >>>>> Smalltalk at: #MyRootClass put: ProtoObject
>>       >>>>>
>>       >>>>> and that would cause rootClasses to answer a duplicate.  So
>> IMO it needs to
>>       >>>>> do one of
>>       >>>>> - convert to a set and then back to a collection
>>       >>>>> - answer a set
>>       >>>>> - enumerate over associations, selecting those classes whose
>> key is the
>>       >>>>> same as their name
>>       >>>>>
>>       >>>>> _,,,^..^,,,_
>>       >>>>> best, Eliot
>>       >>>>
>>       >>>> Hi Eliot,
>>       >>>>
>>       >>>> Do you mean this?
>>       >>>>
>>       >>>> Environment>>rootClasses
>>       >>>>   "return a collection of classes which have a nil superclass"
>>       >>>>   ^ (self select: [:each | each isBehavior and: [each
>> superclass isNil]]) asSet asOrderedCollection.
>>       >>>
>>       >>> That'll do but perhaps better is
>>       >>>
>>       >>>          self bindings select: [:each | each value isBehavior
>> and: [each value superclass isNil and: [each value name == each key]]])
>> collect:  [:each | each value]
>>       >>>
>>       >>>>
>>       >>>>
>>       >>>> Note, I am not the author here, just tending to the inbox :-)
>>       >>>>
>>       >>>> Thanks,
>>       >>>> Dave
>>       >>>>
>>       >>>>
>>       >>>
>>       >>
>>       >
>>
>>
>>
>>
>> --
>> _,,,^..^,,,_
>> best, Eliot
>>
>>
>
>
>


-- 
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20180320/bb7971a6/attachment-0001.html>


More information about the Squeak-dev mailing list