Hi,

Ok, great. I will play with this.

Cheers,
Doru


> On Jul 7, 2016, at 11:19 PM, Eliot Miranda <eliot.mira...@gmail.com> wrote:
> 
> Hi Doru,
> 
>> On Jun 30, 2016, at 1:08 PM, Tudor Girba <tu...@tudorgirba.com> wrote:
>> 
>> Hi,
>> 
>>> On Jun 27, 2016, at 7:55 PM, Eliot Miranda <eliot.mira...@gmail.com> wrote:
>>> 
>>> Hi Doru,
>>> 
>>> On Mon, Jun 27, 2016 at 6:36 AM, Tudor Girba <tu...@tudorgirba.com> wrote:
>>> Hi Eliot,
>>> 
>>> I agree with most things you say (except the conclusion :)), and I think 
>>> that we are talking about complementary issues.
>>> 
>>> As I mentioned before, there already is a need to distinguish between a 
>>> plain selector and one that is associated with pragmas. This is what you 
>>> find in PragmaType in Spotter and Inspector. This is a kind of meta-object 
>>> and having it adds value. I can search for pragmas “type” (we can also call 
>>> it a PragmaSelector), and I can distinguish between all occurrences of a 
>>> pragma “type” and its utilization in computation. But, the current 
>>> implementation of PragmaType is a mere pseudo-meta-object, given that it 
>>> has no casual connection to the runtime.
>>> 
>>> What we know from Smalltalk is that the analysis model does not have to 
>>> differ from the runtime one. The consequence is that every time we do see a 
>>> difference, we should investigate because we might uncover a hidden need 
>>> opportunity.
>>> 
>>> I know the VW model, and indeed, we could have something like:
>>> 
>>> MyConcept class>>myPragmaDefinition
>>>       “a comment about the pragma"
>>>       <pragma: #selector>
>>> 
>>> However, this only deals with the definition of the pragma type not with 
>>> the internal representation. There could still well be an object that 
>>> encapsulates both the selector and the comment. And that object would also 
>>> allow us to build tools around it. We could call it a PragmaType, 
>>> PragmaDefinition, or even PragmaSelector. And we could get the Pragma to 
>>> point to this type either through an inst var or through a query (I would 
>>> probably prefer an instvar).
>>> 
>>> Well, there already /is/ a meta-object called Pragma, and it gets 
>>> instantiated when one accesses the compiled method via pragmas:
>>> 
>>> (CompiledMethod allInstances detect: [:m| m pragmas size > 1]) pragmas 
>>> collect: [:ea| {ea. ea class}] {{<export: true> . Pragma} . {<var: 
>>> #tablePtr type: 'int *'> . Pragma}}
>> 
>> Yes I know :). An instance of Pragma denotes an concrete annotation of a 
>> method. I now would like a meta-object that describes all Pragma instances 
>> having the same selector. For example, the protocol on the class side of the 
>> Pragma class is actually a query protocol that is better suited for the 
>> instance side of a PragmaDescription meta-object. For example:
>> 
>>   Pragma class>>allNamed: aSymbol in: aClass
>> 
>> would become
>> 
>>   PragmaDescription>>pragmasIn: aClass
>> 
>> and you would use it like:
>> 
>>   (PragmaDescription named: aSymbol) pragmasIn: aClass
>> 
>> Creating an instance of PragmaDescription would imply searching the image 
>> for the <pragma:> definition.
> 
> I like this.
> 
>> I would also like to have a Flyweight pool per environment such that we 
>> always get only one instance of a PragmaDefinition per selector (like it 
>> happens with Symbols).
> 
> Yes, good refinement.
> 
>>> So we could add the information you want to Pragma, and have it be lazy.
>> 
>> It does not quite belong to the Pragma. A comment is common to all Pragma 
>> instances, and having it duplicated at the instance level is less elegant.
>> 
>> But, looking for the users (all senders of the pragma selector - the methods 
>> that use the annotation) of a Pragma would be even less inconvenient to have 
>> on the instance side of Pragma.
>> 
>> 
>>> The Pragma could go search for the defining class-side pragma methods and 
>>> use the parser to extract the comment(s) when asked.  Hence simple access 
>>> to pragmas, interested only in the selectors for applying, wouldn't have 
>>> their performance be impacted.
>> 
>> The design sketched above would require no runtime penalty for a Pragma 
>> instance. All code that works now would work identically afterwards. We 
>> would only have one selector in Pragma to get the corresponding description:
>> 
>> Pragma>>description
>>   ^ PragmaDescription named: self selector
>> 
>> Alternatively, we could modify the compilation to associate the 
>> PragmaDescription in an inst var of a Pragma instance. So, 
>> CompiledMethod>>pragmas would always return instances of Pragmas with a 
>> PragmaDefinition inst var.
>> 
>> I think I would start with the lazy lookup first, and this would disturb 
>> nothing from the current behavior.
> 
> Sounds like a reasonable plan.  
> 
>> 
>> 
>>> I think that this proposition does not remove from the simplicity of the 
>>> implementation at all, but allows the new needs to be accommodated nicely. 
>>> The alternative is to not do anything, in which case we will continue to 
>>> have an analysis-only-pseudo-meta-object which is not nice at all. I do not 
>>> think we should jump on this lightly, but I do think we should have a 
>>> critical look and evaluate the options.
>>> 
>>> This pseudo-meta-object (Pragma) can sty ill be causally connected, in the 
>>> same way that a MethodReference can be causally connected.  The causation 
>>> is things like "remove", "recompile", but that's dubious.  It's essentially 
>>> a read-only relationship; one wants to be able to locate the method from 
>>> the pragma, but changing the method from the pragma isn't necessarily a 
>>> good idea.  Would you agree that convenience methods like "remove" on 
>>> MethodReference are a bad idea and one should stick to the removeSelector: 
>>> protocol on Behavior and ClassDescription?
>>> 
>>> 
>>> What do you think?
>>> 
>>> Have I and enough coffee to scramble my thoughts might be a more pertinent 
>>> question ;-)
>> 
>> :)
>> 
>> Cheers,
>> Doru
>> 
>> 
>>> 
>>> Cheers,
>>> Doru
>>> 
>>> 
>>>> On Jun 27, 2016, at 2:39 PM, Eliot Miranda <eliot.mira...@gmail.com> wrote:
>>>> 
>>>> Hi Doru,
>>>> 
>>>>> On Jun 27, 2016, at 3:52 AM, Tudor Girba <tu...@tudorgirba.com> wrote:
>>>>> 
>>>>> Hi,
>>>>> 
>>>>> The CompiledMethod already has a way to retrieve Pragma instances:
>>>>> 
>>>>> CompiledMethod>>pragmas.
>>>>> 
>>>>> However, the Pragma instance does not have a meta-object associated with 
>>>>> it. So, I would first start from adding that one and linking such a 
>>>>> PragmaType to its instances. The important thing here would be that all 
>>>>> Pragma instances with a certain selector should reference the same 
>>>>> PragmaType.
>>>> 
>>>> Let me express a dissenting opinion.  Our pragma system is minimal yet 
>>>> powerful. By using Message instances (with literal arguments) to represent 
>>>> pragmas we get
>>>> - executable pragmas that can be applied using perform: or wrappers such 
>>>> as sentTo:
>>>> - we can use conventional browsing queries (implementors and senders) to 
>>>> discover which methods are marked by a specific pragma and what 
>>>> pragma-processing tools implement a specific pragma.
>>>> - a rich pragma language that can have many, named parameters
>>>> - a system which doesn't need its own language, but reuses the existing 
>>>> Smalltalk parsing facilities, and so is easier to learn and to implement
>>>> 
>>>> So its parsimony is an important part of its virtues.  It is minimal.
>>>> 
>>>> One thing missing from the Squeak/Pharo implementation is the set of legal 
>>>> pragmas a class accepts.  In VisualWorks a class implements the <pragma: 
>>>> #pragma:selector:> (it might be <pragmas: #(pragma:selector:one: 
>>>> pragma:selector:two:)>) to define the legal set of pragmas.  
>>>> [Implementation note, these are /not/ searched for ahead of compilation; 
>>>> instead, the parser delays searching for class-side methods containing 
>>>> pragma: pragmas until it encounters a pragma, and it searches for all 
>>>> class side methods, including in superclasses).
>>>> 
>>>> This scheme allows pragmas to be checked; only pragmas in the set of 
>>>> allowed pragmas are accepted, and it allows collision-free extensibility; 
>>>> any package can add a set of legal pragmas to a class merely by choosing a 
>>>> method selector that won't collide with any other containing pragma: 
>>>> pragmas, eg
>>>> kernelPragmas
>>>>  <pragma: #primitive:>
>>>>  <pragma: #primitive:error:>
>>>>  <pragma: #primitive:module:>
>>>>  <pragma: #primitive:module:error:>
>>>> 
>>>> We're missing this, which means our compilers don't safely check for valid 
>>>> pragmas and can't reject invalid or unrecognized ones, which is error 
>>>> prone.
>>>> 
>>>> If we implemented this then we would have a natural place to comment 
>>>> pragmas in the method that defines a particular pragma, one that would be 
>>>> found using senders.
>>>> 
>>>> None of this requires a meta object.  It is perfectly recursive; using 
>>>> itself to implement itself.  I find this very elegant (I didn't invent 
>>>> pragma: pragmas; Steve Dahl did, and it's a cool idea).
>>>> 
>>>> So as an inventor of pragmas I'd like to ask for the minimal 
>>>> implementation outlined above.  I'd like that we didn't j tricycle a 
>>>> specific meta object, with all the additional tools that implies, and 
>>>> instead stick to the minimalist and parsimony of the original design and 
>>>> use pragmas to comment pragmas.
>>>> 
>>>>> Cheers,
>>>>> Doru
>>>> 
>>>> Thanks for reading.
>>>> Cheers, Eliot
>>>> 
>>>>>> On Jun 27, 2016, at 12:34 PM, Denis Kudriashov <dionisi...@gmail.com> 
>>>>>> wrote:
>>>>>> 
>>>>>> 
>>>>>> 2016-06-27 12:12 GMT+02:00 Tudor Girba <tu...@tudorgirba.com>:
>>>>>> Hi,
>>>>>> 
>>>>>> That is my proposal as well: introduce a first class entity that 
>>>>>> describes a Pragma instance. Who would be interested to play with this?
>>>>>> 
>>>>>> How it could be done?
>>>>>> Probably compiler could search preferred Pragma class for given 
>>>>>> selector. And then we will have collection of real pragma instances 
>>>>>> inside CompiledMethod. What do you think?
>>>>> 
>>>>> --
>>>>> www.tudorgirba.com
>>>>> www.feenk.com
>>>>> 
>>>>> "Be rather willing to give than demanding to get."
>>> 
>>> --
>>> www.tudorgirba.com
>>> www.feenk.com
>>> 
>>> "When people care, great things can happen."
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> -- 
>>> _,,,^..^,,,_
>>> best, Eliot
>> 
>> --
>> www.tudorgirba.com
>> www.feenk.com
>> 
>> "Not knowing how to do something is not an argument for how it cannot be 
>> done."

--
www.tudorgirba.com
www.feenk.com

"To lead is not to demand things, it is to make them happen."





Reply via email to