[Cuis-dev] [RFC] Namespaces, changes to SystemDictionary, Object and a dictionary class for tracking environment implementations
Gerald Klix
cuis.01 at klix.ch
Thu Oct 29 00:27:56 PDT 2020
On 2020-10-28 22:12, Graham Kelly via Cuis-dev wrote:
>
> On 10/24/20 9:22 AM, Gerald Klix via Cuis-dev wrote:
>> On 2020-10-23 17:35, Juan Vuletich via Cuis-dev wrote:
>>> On 10/21/2020 1:08 PM, Gerald Klix via Cuis-dev wrote:
>>>> On 2020-10-07 17:44, Gerald Klix via Cuis-dev wrote:
>>>>> On 2020-10-07 16:07, Juan Vuletich via Cuis-dev wrote:
>>>>>> On 10/7/2020 3:19 AM, Gerald Klix via Cuis-dev wrote:
>>>>>>> On 2020-10-06 21:29, ken.dickey at whidbey.com wrote:
>>>>>>>> On 2020-10-06 08:52, Gerald Klix wrote:
>>>>>>>>
>>>>>>>>> Please bear with me until I can provide a simple example
>>>>>>>>> implementation that handles environments.
>>>>>>>>
>>>>>>>> Gerald,
>>>>>>>>
>>>>>>>> Thanks much for this quick response.
>>>>>>>>
>>>>>>>> I am not the world's brightest light, so sometimes it takes me a
>>>>>>>> while to get things.
>>>>>>>>
>>>>>>>> Also, apologies for not yet completing my PackageEnvironments
>>>>>>>> proposal. You are motivating me to get back to it.
>>>>>>>>
>>>>>>>> With so many ways to implement Namespaces/Environments, it is
>>>>>>>> good to have a number of concrete implementations to explore to
>>>>>>>> find/get the best outcomes.
>>>>>>>>
>>>>>>>> I am very much looking forward to the fruits of your efforts!
>>>>>>>>
>>>>>>>> Good on ya,
>>>>>>>> -KenD
>>>>>>>>
>>>>>>>
>>>>>>> Good Morning Ken,
>>>>>>>
>>>>>>> Mentioning your PackageEnvironments approach motivates me to try
>>>>>>> again explaining ths
>>>>>>> EnvironmentImplementationsDictionary thing:
>>>>>>>
>>>>>>> Suppose we have two packages (or set of packages) that implement
>>>>>>> environments.
>>>>>>> One is your "package environments (PS) implementation", the other
>>>>>>> one a simple environment implementation (SE).
>>>>>>> Both implementations should provide
>>>>>>> a so called environment manager singleton,
>>>>>>> that manages their implementation's environments. These managers
>>>>>>> should be registered with the
>>>>>>> EnvironmentImplementationsDictionary singleton.
>>>>>>> Of course both must implement the protocol
>>>>>>> demanded by this class.
>>>>>>> This way two our more environment implementations can coexist in
>>>>>>> one Cuis image.
>>>>>>>
>>>>>>> I tried to implement Juan's (soft) requirement:
>>>>>>> "
>>>>>>> Yes. I want Cuis to be a good place for doing any kinds of
>>>>>>> experiments. Adding hooks for optional pluggable behavior is a
>>>>>>> big part of that."
> But Cuis should be small...
>>>>>>>
>>>>>>> You can look at
>>>>>>> https://gitlab.com/klgcuisstuff/environments/-/blob/master/EnvironmentsBase.pck.st
>>>>>>>
>>>>>>>
>>>>>>> and
>>>>>>>
>>>>>>> https://gitlab.com/klgcuisstuff/environments/-/blob/master/SimpleEnvironments.pck.st
>>>>>>>
>>>>>>>
>>>>>>> to get the details.
>>>>>>> Please don't file these packages in, they are
>>>>>>> currently broken.
>>>>>>>
>>>>>>>
>>>>>>> HTH and Best Regards,
>>>>>>>
>>>>>>> Gerald
>>>>>>
>>>>>> If this implies the base image (and people using it) to be aware
>>>>>> of many possible implementations of environments, and include the
>>>>>> complexity required to make them work smoothly together, then this
>>>>>> sounds like too much to me.
>>>>>>
>>>>>> If this is really required, maybe it should go into a
>>>>>> MultiEnvironmentsImplementationsSupport.pck.st, or such. Maybe
>>>>>> people working on varios implementations of Environments could get
>>>>>> together to work on this package. And please, make it require as
>>>>>> little as possible from the base image. A few methods delegating
>>>>>> to (most likely absent) optional service is ok. Knowledge of all
>>>>>> the complexity of MultiEnvironmentsImplementationsSupport.pck.st
>>>>>> in the base image, is not.
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>> Juan,
>>>>>
>>>>> If all works according to my nefarious schemes,
>>>>> the environment implementations should know about Cuis' interfaces
>>>>> and not the other way around.
>>>>> I started an EnvironmentsBase.pck.st, with the intention to move
>>>>> everything, which is not strictly required in the base image into it;
>>>>> especially this (in)famous EnvironmentImplementationsDictionary.
>>>>> It contains an abstract super class
>>>>> for an environment manager documenting Cuis' interface to it.
>>>>>
>>>>> In a nutshell: I had the same idea.
>>>>>
>>>>> However some additional changes in
>>>>> ClassDescription>>definition will
>>>>> be necessary (obviously).
>>>>>
>>>>>
>>>>> HTH and Best Regards,
>>>>>
>>>>> Gerald
>>>>
>>>> Good Evening Everyone,
>>>>
>>>> I now have beta of the environment stuff ready.
>>>> Documentation is currently missing (Use the Source, Luke). I will
>>>> start writing some tomorrow.
>>>>
>>>> The whole thing can be found at:
>>>> https://gitlab.com/klgcuisstuff/environments
>>>>
>>>> If you want to test it just clone this repo.
>>>> File in
>>>> coreChanges/4393-CuisCore-GeraldKlix-2020Oct07-15h40m-KLG.cs.st
>>>> first. Then file in the SimpleEnvironments package. This package
>>>> contains a very simple
>>>> environment implementation, that is neither aware of package or
>>>> categories, meaning
>>>> categories and environments are orthogonal
>>>> wrt. simple environments.
>>>> Of course the environment
>>>> framework permits other implementations.
>>>>
>>>>
>>>> Have Fun and Best Regards,
>>>>
>>>> Gerald
>>>
>>> coreChanges/4393-CuisCore-GeraldKlix-2020Oct07-15h40m-KLG.cs.st
>>>
> ...and this is:
>>> Over 60kb of code, 76 methods. 1100 lines of code. I'm sorry, but if
>>> this is the level of impact on the base system that is needed to
>>> support Environments, another approach is needed. Before resorting to
>>> the extreme option of forking Cuis, we might think of some kind of
>>> alert system to warn you if any of the overriden methods gets
>>> modifiend in the base Cuis image. This could also be useful for other
>>> packages that need patching existing methods.
>>>
> Even my fork of Cuis (with environments) is smaller.
>>> Thanks,
>>>
>> Thanks Juan, for looking at it.
>>
>> Well, I know. I wrote above:
>> "If all works according to my nefarious schemes,
>> the environment implementations should know about Cuis' interfaces
>> and not the other way around"
>> Alas it did not work out, I had to add
>> environment aware symbols, so that SystemDictionary can deffer dealing
>> with symbols
>> bound to an environments directly to the binding
>> environment.
>>
>> This triggered the next big bunch of changes, to the Browser hierarchy.
>> All the browser models that display a class hierarchy do so by
>> creating the list of indented
>> class names in the model. IMHO this is not the right thing to do. The
>> model should hold
>> a properly sorted list of class name symbols.
>> (This change I implemented, I had to).
>> The indentation stuff should be done in a specialized list morph. With
>> this refactoring,
>> 20 methods (changed and new ones) would be
>> unnecessary. That's around 30%.
>>
>> The remaining stuff falls roughly into three categories:
>>
>> 1st) Making the compiler ware of the symbols bound in an environment.
>> these are all "bindingOf"-methods in the ClassDescription hierarchy.
>> 2nd) All the changes to generate proper definition code for the class
>> and proper
>> expression to refer to environment local
>> classes.
>> 3rd) Make ChangeList, CodeFile and the other classes aware of the
>> extended file in format.
>>
>> BTW: Some refactorings to CodeFile will be worthwhile. There is a line in
>> #classDefinition:with:
>> that reads:
>> `tokens size = 11 ifFalse:[^doIts add: chgRec].`
>> I changed it to:
>> `tokens second == #subclass: ifFalse:[ ^ doIts add: chgRec ].`
>> Which isn't much better and worse I have no idea
>> on how to solve this in a better way.
>>
>> About our concerns with the size of the change set, I would have
>> reacted in the way. Especially
>> there are two additional issues:
>> - There are quite a few message sends in the base image, that have no
>> implementation.
>> They are all encapsulated in sends to
>> #environmentImplementationsIfPresentDo:
>> but they will stick out like a Christmas Tree
>> on a sunny beach.
>> - It changes the fileout/filein machinery.
>>
>>
>> I have some ideas that should make it possible
>> to develop major changes to Cuis' core in packages:
> However, I did make this:
>>
>> - We could make a base line of an image,
>> by (virtualy) storing all the class definitions
>> and method time-stamps in a base line file.
> But not all of these:
>> - We can implement sort of an ExtensionPackage that contains the base
>> line "entries" of all
>> modified classes and methods and bail out
>> if one does not match the version in the image
>> we file the changes into.
>> - We can avoid can replace extension method categories
>> ("*PackageName") with ordinary
>> method categories by storing the in a pragma
>> and recategorize them after file in. As an added
>> bonus we can store the source package of such a method in a method
>> property.
>>
> Why don't you distribute updates as packages that update the system and
> delete them when done?
>> This should make developing core extensions
>> in a package safe and should result in a usefully categorized methods.
>>
>>
>> Best Regards,
>>
>> Gerald
>>
>>
>>
> My $0.03,
>
>
> Graham
>
Dear Graham,
Do you mind to show us your fork of Cuis?
Best Regards,
Gerald
More information about the Cuis-dev
mailing list