[vwnc] RBrowserHistory and RBTabbedToolsets

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

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Eliot Miranda-2


On Fri, Jul 18, 2008 at 7:00 PM, Antony Blakey <[hidden email]> wrote:

On 19/07/2008, at 9:29 AM, Terry Raymond wrote:

> If I understand your comment, I find many of the pragmas
> I am looking for by picking one of the symbols in the pragma
> and do a 'senders' for that symbol. For example, in the
> VisualLauncher if you do a senders of #probes you will find
> all the menu command on the probes menu.

In your example, I would search for 'submenu:...' which spotlight
finds for me, including implementors which tells me where the pragma
is used. And I can find the declaration by searching for senders, and
then look for pragma declaration methods - which is fine if the method
that declares the pragma is called 'pragma' or something obvious, but
given that pragma declaring methods can themselves be identified using
pragmas ... and strangely I had to search for a literal 'pragmas'
rather than a send of 'pragmas:' to find the pragma-tagged pragma
declaring method.

?? You just look for senders of pragmas: and you find all the methods containing a pragmas: pragma.  The method can be called whatever you like (which is the point).  It just has to live on the class side.  The argument to pragmas: tells you which side the pragma applies to, #instance or #class.  Go on, go to the Launcher's Senders and type in pragmas:.  You find them all immediately.
 
I think there's a need for a pragma browser. Maybe a UI to browse all
the pragmas declared in a class, and the implementors of those pragmas.

 So write one.  All the facilities are there, except (looking at vw7.5) Pragma class>>allNamed:, which would take 2 minutes to write.  Trawling through all pragmas: methods gives you all pragmas supported in the system at this instant.  Collecting senders of each of these (a straight-forward use of fold: and MethodCollector), or allSelect: methods that have pragmas gives you all references to the pragmas.  (And yes, it is arguably a flaw that a method defining a pragma can be deleted without impacting the uses of the pragma until they're recompiled, but its arguably a flaw that one can delete a method while it still has senders, and people have accepted that without question up till now).

Browsing senders is more of a problem because pragmas are accessed
programatically. Maybe a pragma is needed to mark methods that
'search' for pragma-annotated methods so that you can do the full
senders/implementors exploration as it relates pragmas. But I hesitate
to even suggest that hack on a hack.

It would be better if the Parser asked the class Pragma to find the legal pragmas.  As of 7.5 t uses special code (Class/Metaclass>>recognizedMethodPragmas).  But that's history.

Pragmas can't be properly refactored because of the lack of senders
information, for the same reason sends using #perform: on constructed
symbols can't be.

Can you explain this?  There is no reason pragmas can;t be refactored.  They're all there. But John Brant (defensibly) took the position that the RB's refectoring facilities were going to ignore pragmas because they were VisualWorks only.  ut since they're only message sends they're easy to refactor.  But I think I'm missing your point.
 
Unlike #perform: however, there is no 'syntactic'
way of indicating pragma access, so using pragmas is like using
smalltalk where all sends must use #perform: (ignoring the bootstrap
issue).

I don;t understand.  pragmas are metadata.  There are facilities for searching for that metadata, extracting it and using it.  Because the metadata is message instances this is easy.  What if they were uncompiled strings?

IMO pragmas don't (yet) fit properly into the semantics of Smalltalk,
and if they are going to be promoted, then some more thought should be
given to the way they are modeled and accessed, and what tool support
is needed.

Since you're so fired up, why not have a go at defining some tools?  Its easy to criticise.  But its often easier to build something and show someone.


Antony Blakey
-------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787

There are two ways of constructing a software design: One way is to
make it so simple that there are obviously no deficiencies, and the
other way is to make it so complicated that there are no obvious
deficiencies.
  -- C. A. R. Hoare


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Travis Griggs-3
In reply to this post by Randy Coulman
On Jul 18, 2008, at 9:13 PM, Randy Coulman wrote:

> On Fri, Jul 18, 2008 at 8:56 PM, Eliot Miranda <[hidden email]
> > wrote:
> and Steve Dahl and Vassili Bykov deserve a lot of the credit.  Steve  
> cleaned up my initial implementation, did the menu builder and  
> invented class-side pragmas declaring which pragmas were legal (and  
> I think checking for legal pragmas in the first place).  Vassili did  
> all the pragma enumeration facilities.
>
> This actually brings up an interesting question.  At the risk of  
> igniting a flame war as I'm about to leave for vacation...
>
> Why should we have to declare which pragmas are legal?  Those  
> declarations have a very similar feel to type declarations in a  
> statically-typed language or having to define and then implement an  
> interface.  This is Smalltalk, after all.  Why can't I just add a  
> pragma to a method and be done with it?  Why should I have to go  
> somewhere else to specify that it is legal for me to have put that  
> pragma in my method?

You don't HAVE to declare them. They're just warnings. The value  
derived from "informing" you that there is not a registered tag, is  
about the same as informing you that initalize is not an understood  
selector (look closely at the spelling).

If they *were* required up front, parcel/store loading would have to  
be more intelligent about how it loads stuff. You can tag your methods  
to your hearts content with non registered tags. You just got annoying  
warnings when you do it interactively. Perhaps we should tweak it so  
that it behaves similarily to how the unimplemented selector performs  
(i.e. once you've told it you know, it doesn't pester you any more).

You can see the side effects of this actually when you load something  
like Cairo. It uses an <original: > tag to track the orginal C  
definition, so that I can back link the names when/if necessary. When  
it's loading, you'll see a bunch of warnings go by in the transcript  
as these methods come in before the class side <pragmas: class> happens.

There, hopefully I've put enough sweet manure all over the subject to  
douse any afeared flames.

--
Travis Griggs
Objologist
My Other Machine runs OSX. But then... so does this one.


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Antony Blakey-2
In reply to this post by Eliot Miranda-2

On 19/07/2008, at 1:48 PM, Eliot Miranda wrote:

> ?? You just look for senders of pragmas: and you find all the  
> methods containing a pragmas: pragma.  The method can be called  
> whatever you like (which is the point).  It just has to live on the  
> class side.  The argument to pragmas: tells you which side the  
> pragma applies to, #instance or #class.  Go on, go to the Launcher's  
> Senders and type in pragmas:.  You find them all immediately.

OK, I don't know what I was doing that stopped that working :(

> Can you explain this?  There is no reason pragmas can;t be  
> refactored.  They're all there. But John Brant (defensibly) took the  
> position that the RB's refectoring facilities were going to ignore  
> pragmas because they were VisualWorks only.  ut since they're only  
> message sends they're easy to refactor.  But I think I'm missing  
> your point.


If I want to rename a pragma, code that enumerates pragmas won't be  
updated. They aren't accessed from the 'sender' side using message  
sends e.g. Pragma class>>allNamed: aSymbol from: subClass to:  
superClass is one way to enumerate them, but my code
won't be updated during refactoring. This is the same problem as using  
#perform: in the face of refactoring.

> Since you're so fired up, why not have a go at defining some tools?

Because I'm a paying customer, and I hope that Cincom won't ignore  
*everything* I say :) I fix a lot of stuff off my own bat - see e.g.  
ASBAqua, ASBLook, ASBRB. Is that going to be the response to every  
complaint/criticism? Do it you effing self?

Antony Blakey
--------------------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787

Lack of will power has caused more failure than lack of intelligence  
or ability.
  -- Flower A. Newhouse

_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Antony Blakey-2

On 19/07/2008, at 2:20 PM, Eliot Miranda wrote:

> This is a limitation of the RB's refactoring engine's implementation  
> which comes from a (defensible) desire not to support a non-standard  
> facility.  If the VW engineering team had the resource I'm surer  
> they'd fix this.  It is not a fundamental limitation.  I think I;ve  
> explained tat pragmas are conceptually easy to refactor because  
> they're messages.

Surely that's the halting problem? How would the system rename all  
uses of 'myPragma:' given this:

   p := OrderedCollection new.
   self computePragmas do: [ :x | p addAll: (Pragma allNamed: x from:  
MyClass to Object) ].

IMO a refactoring engine that works only on narrowly defined code  
templates isn't really reliable enough. Because pragmas MUST be  
accessed in my code using reflection, the refactoring engine is SOL.

Antony Blakey
-------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787

A reasonable man adapts himself to suit his environment. An  
unreasonable man persists in attempting to adapt his environment to  
suit himself. Therefore, all progress depends on the unreasonable man.
   -- George Bernard Shaw


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

[vwnc] VisualWorks Pragmas (was: RBrowserHistory and RBTabbedToolsets)

Travis Griggs-3
In reply to this post by Eliot Miranda-2
On Jul 18, 2008, at 8:56 PM, Eliot Miranda wrote:

> and Steve Dahl and Vassili Bykov deserve a lot of the credit.  Steve  
> cleaned up my initial implementation, did the menu builder and  
> invented class-side pragmas declaring which pragmas were legal (and  
> I think checking for legal pragmas in the first place).  Vassili did  
> all the pragma enumeration facilities.

I'd like to state my gratitude to you and Steve and Vassili for indeed  
doing such a nice job. I'm a big fan of these things. They make  
writing pluggable interfaces much easier. We use them in the browser.  
In the inspector now. The guys at Key use them to make APIs that can  
be plugged in. I've used them in SUnitToo(ls) to allow different rules  
for associating test code with it's "unit" to be more pluggable. I  
used them in SUnitToo as a way to tag test methods (rather than having  
to use testBlah, as an aside, this seemed corny at first, and I've  
come 180 on it, because I find a can write a selector that is more  
descriptive of the test, not being influenced by preambling it with  
the 'test' verb). They've been used to make UI composition more  
pluggable. 7.6 integrated the External-Interface-Pragmas add on, which  
uses them to make which libraries an ExternalInterface uses pluggable.  
I laugh at myself, because I frowned out these once upon a time, and  
was a while coming 'round to liking them. See, even an opinionated  
windbag has some hope of getting a clue.

Couple random thoughts in response to the thread, intermingled with  
some random trivia:

1) I like the minimalism involved in using an already established  
pattern. It allows a poor mans version of tools support to exist right  
out of the bag. It makes writing parsers nice, because you can reuse  
code. It looks similar to the other keyword patterns, so as a human  
reader of code, there's less patterns to interpret. It resonates with  
my "Less is More" passion.

2) The RBParser got proper <method tag> parsing abilities in 7.6 Which  
means that they're modeled as part of the RBParseNode tree. Which  
means they can be formatted properly, and are included in rewrite  
rules as well. And searching, etc. I think I saw hints that some of  
the posters wer under the misconception that this was not so.  
Inspection of the Release Notes and/or some simple tests could have  
revealed this to the misinformed. :)

3) Some know... I don't like the name Pragmas. Partly because of an  
odd irony with them. Pragma's traditional, and very computer-geek-
esque, interpretation is as compiler directives (see the wikipedia  
disambiguation page). The original method pragmas were indeed pragmas.  
Things like <unwind> and <primitive: 395>. Special bytecodes and  
method types were generated by the compiler as a result of these  
directives. But the wonderful generalization that was done, was done  
so that they could be used to express simple method annotations, which  
could be used by services other than the compiler. At this point, they  
just become method annotations, a way of "tagging" information on to  
methods, the same way you might hang tags on real world objects to  
help categorize them and attach simple information to them. So just  
about any of the new uses of them, are not as pragmas (compiler  
directives).  Because all o the uses I mentioned above, are not  
"pragmas". They're about tagging methods. So I usually use the term  
"method tags". I don't expect/need others to do the same.

4) One of the unfortunate ironies about the use of the <keyword:  
something> pattern, is that the all-to-common DLLCC method uses  
something that at first blush look like that to the parser, but indeed  
is not. So this has to be special cased. Oh well. (e.g. <C: > is NOT a  
method tag).

5) While I think you get a lot of mileage out of the "poor mans tools"  
that is there, I really would like to do something more.  It involves  
something inspired along the lines of Damien Cassou's  
RBDynamicProtocols (see previous posts about wishing I had time to  
work on the top half of the browser). Such work is a desire to  
generalize the way we categorize/search methods on a variety of  
attributes, amongst them, tags. I do not want to add yet another batch  
of menu options.

6) The one area that I think our current implementation is still a  
little weak, is the extensibility of what the defining class does as  
these methods come and go. Currently you can use a <pragmas: > tag to  
indicate what other tags you'll be adding to either the instance or  
class behavior. But to respond to the changes, you implement an  
instanceMethodsChanged/classMethodsChanged which gets sent any time  
they're changed. You don't know whether you've got additions, or  
removals. Even more problematic, is that we've lost the "conflict free  
extensibility" (great phrase Eliot) of what to do in response. For  
example, many ApplicationModel subclasses implement the  
instanceMethodsChanged in such a way that they flush any menus and  
rebuild them, anticipating that I've added or removed methods with  
<menu:...> annotations. But what if I want to extend an existing app  
with a new type of service? What if, for example, I want to extend the  
FileBrowser so it can register new file type tools, based on file  
kind. I've got to override that instanceMethodsChanged method. And if  
someone wants to add their own services, we'll have override conflicts.

I don't know to what extent it should be made more pluggable. It might  
be enough to simply use a unary tag to tag methods that should fire  
when the annotated methods have changed:

myResponseToChanges
        <taggedMethodsChanged>
        ^so doMyThang

One could go farther and parameterize that with the tags it's  
interested in responding to:

updateTestCaches
        <taggedMethodsChanged: #(#test)>
        self flushTestResults

One could make it really rich, differentiating between add and remove.  
Or really go nuts and add points for aboutToRemove/removed/aboutToAdd/
added. One could pass the methods added/removed. I've not personally  
thought it all out enough to have strong opinions on how much to  
provide, I do find the Behavior>>instanceMethodsChanged method comment  
good advice on the subject.

7) If you want to hurt your brain, figure out where you put the  
<pragmas: > on ClassDescription (class or instance? and there, or in a  
Class or Metaclass) and where you put the instanceMethodsChange/
classMethodsChanged so that you can use method tags to add/remove  
instance variables as described here (http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&printTitle=Managing_Instance_Variables_Methodically&entry=3376826809 
). No, I'm not bragging that I did. I just threw darts until it worked.

8) My experience has led me to not go too nuts with these. Though I've  
employed them lots. Don't try to put too much info in the method tags  
themselves. You're not inventing a DSL inside the tags. You've still  
got your method to do the real work. (http://www.cincomsmalltalk.com/userblogs/travis/blogView?showComments=true&printTitle=Menu_Items_Are_Objects_Too&entry=3354355944 
) was such an experience, for me.

--
Travis Griggs
Objologist
"Every institution finally perishes by an excess of its own first  
principle." - Lord Acton



_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Antony Blakey-2
In reply to this post by Eliot Miranda-2

On 19/07/2008, at 1:48 PM, Eliot Miranda wrote:

> Can you explain this?  There is no reason pragmas can;t be  
> refactored.  They're all there. But John Brant (defensibly) took the  
> position that the RB's refectoring facilities were going to ignore  
> pragmas because they were VisualWorks only.  ut since they're only  
> message sends they're easy to refactor.  But I think I'm missing  
> your point.

I might be out to lunch on this.

I must admit that I didn't realize that literals would be renamed  
(doh!), although the testing that demonstrated this has uncovered a  
problem. Sorry for my time-wasting discussion on this point  :(

Regardless, I think it's important that pragmas are renamed by the RB.  
Consider this method that encapsulates both the 'sender' and  
'implementor' ends of a pragma, plus the possibility that a pragma  
matches an existing selector.

   somePragma: anArg
     <somePragma: #aaa>
     ^Pragma allNamed: #somePragma: in: self class

If you do a rename refactoring, you get this:

   someRenamedPragma: anArg
     <somePragma: #aaa>
     ^Pragma allNamed: #someRenamedPragma: in: self class

which is obviously broken. More use of pragmas, hence more chance of  
collision with 'real' method selectors, means this should be fixed for  
any refactoring that modifies any symbol literal. If the pragma was  
renamed, then my concerns about refactoring are largely moot. There is  
still an issue that a facility accessed purely through reflection is  
more likely to result in constructed symbols e.g.

   pragmaName := 'somePragma:'. "Imagine some reason for starting with  
a string".
   Pragma allNamed: pragmaName asSymbol in: self class

which isn't refactorable in the general case. Of course, this is a  
problem with refactoring with many reflective scenarios. One  
contribution to easing this could be

   String>>asPragmaSelector
     ^self asSymbol

resulting in

   sel := 'somePragma:' asPragmaSelector.

which at least is a way of revealing intention which could be  
leveraged by tools to find places that pragma selectors are  
constructed as opposed to being a literal. Somewhat more specific than  
#asSymbol. Maybe an #asSelector parallel would be useful in the same  
manner.

I still think better tools are needed - specifically, browser  
facilities that are designed for pragma use-cases. Sure, you can work  
it out using existing tools, but it's not obvious to a non-expert  
user, which I must admit automatically counts as 'failure' in my mind.

Antony Blakey
--------------------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787

The truth does not change according to our ability to stomach it.
   -- Flannery O'Connor


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Andre Schnoor
In reply to this post by Eliot Miranda-2

Am 19.07.2008 um 05:49 schrieb Eliot Miranda:

> This conflict-free extensibility is what I invented pragmas for.

I don't mean to be offensive and still think they're quite  
interesting, but I wish they weren't there. IMO pragmas are a step  
towards making Smalltalk more complicated.

Conflict-free extensibility should be the responsibilty of some higher-
level tool framework rather than a matter of language extensions. A  
package could contact the responsible instance at post-load time and  
have it add the menus and items where it deems appropriate. Something  
like

        ToolsManager augmentInterfaceFor: self interfaceExtensions

The manager could even decide to move all or some of the extensions  
elsewhere, if that is more appropriate in certain situations (e.g. for  
an updated version).

Just recently I needed to do an overhaul of a large application where  
a dozen or so tools needed to "add themselves" to a unified global  
menu structure (as required for the Mac menubar) in order to avoid a  
situation where one would need to maintain those "superset menus"  
manually. The only solution that seemed working to me was to have a  
global instance collect the desired items from all of the tools and  
assemble them in a controlled and well-informed fashion.

Just my 2 ct

Andre


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

John Brant-2
Andre Schnoor wrote:

> Am 19.07.2008 um 05:49 schrieb Eliot Miranda:
>
>> This conflict-free extensibility is what I invented pragmas for.
>
> I don't mean to be offensive and still think they're quite  
> interesting, but I wish they weren't there. IMO pragmas are a step  
> towards making Smalltalk more complicated.
>
> Conflict-free extensibility should be the responsibilty of some higher-
> level tool framework rather than a matter of language extensions. A  
> package could contact the responsible instance at post-load time and  
> have it add the menus and items where it deems appropriate. ...

I'd like to second this (except for the pragmas being interesting and
the not wanting to be offensive parts :)). Why is it that many
Smalltalkers like to make fun of languages like C# that add new features
by adding new syntax; however, when Smalltalk adds syntax (pragmas),
they think it is great?

If we needed to extend the browser's menus (circa 1995), we could have
directly modified the menus that were stored in the class variables of
the browsers. When a package was loaded or unloaded, we could have added
or removed our menu items directly from the cached menus.

Alternatively, if we wanted something like pragmas, but without new
syntax, we could have extended the browsers to add annotation objects to
methods. The ANSI standard defines that we can add annotations to
methods, but they are external to the method's source. The browser
already supports one such annotation (the method's category). Why
couldn't other annotations be added?

Hey Travis: you need to stop drinking the Kool-Aid, and Eliot: I still
can't add an imaginary number menu item :)...


John Brant
_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Travis Griggs-3
On Jul 19, 2008, at 8:31 AM, John Brant wrote:

> Andre Schnoor wrote:
>> Am 19.07.2008 um 05:49 schrieb Eliot Miranda:
>>
>>> This conflict-free extensibility is what I invented pragmas for.
>>
>> I don't mean to be offensive and still think they're quite
>> interesting, but I wish they weren't there. IMO pragmas are a step
>> towards making Smalltalk more complicated.
>>
>> Conflict-free extensibility should be the responsibilty of some  
>> higher-
>> level tool framework rather than a matter of language extensions. A
>> package could contact the responsible instance at post-load time and
>> have it add the menus and items where it deems appropriate. ...
>
> I'd like to second this (except for the pragmas being interesting and
> the not wanting to be offensive parts :)). Why is it that many
> Smalltalkers like to make fun of languages like C# that add new  
> features
> by adding new syntax; however, when Smalltalk adds syntax (pragmas),
> they think it is great?

I think that's not entirely fair. Because no new syntax was added.  
Rather, a special case syntax, that had been around for a long time,  
was generalized. Reduction to a more general form is IMO a good thing.

As for the "high level tool", I've seen it done that way. I don't want  
to go back there. When I switched over the RB's management of toolsets  
in the bottom half, life just got easier. It was all to easy to screw  
up the collection before hand. And it took more code. Same thing with  
the ExternalInterface stuff. I guess, I've tasted the water with and  
without the koolaid, and the water without it doesn't taste good. :)

> If we needed to extend the browser's menus (circa 1995), we could have
> directly modified the menus that were stored in the class variables of
> the browsers. When a package was loaded or unloaded, we could have  
> added
> or removed our menu items directly from the cached menus.

But this is not a high level tool. This is a high level data (read,  
"global") with the responsibility to muck with it spread over clients.  
Using meta data on the methods, means that the behavior of what to do  
with it is encapsulated to the tool.

> Alternatively, if we wanted something like pragmas, but without new
> syntax, we could have extended the browsers to add annotation  
> objects to
> methods. The ANSI standard defines that we can add annotations to
> methods, but they are external to the method's source. The browser
> already supports one such annotation (the method's category). Why
> couldn't other annotations be added?

OK, this is the part I semi agree with. Or at least semi-ambivalent  
about. We've had this discussion before, and I was going to put it in  
the 8 point rambling, but betwixt the other points, it got forgotten.  
There are two separable discussions here. One is whether you should  
annotate methods or not and what to do with the annotation. The other  
is *how* the annotations get on the methods. When you say "the  
method's source", I guess I would clarify it as the method body's  
source. Method source is already two pieces of source slapped  
together. It is it's body, the same type of stuff you might put in a  
workspace, and then there's a separable piece of source for the method  
signature. Each parser already has two sets of entry points because  
you've got to tell it whether you're just parsing a body, or a body  
with a method signature header. Putting the <tags> in there means we  
have to now slap three sequential pieces of source together. From an  
ideological pov, this bothers me a little. While everone wants to put  
multiple methods in one text pane, and figure out what additional  
syntax you add to put the boundaries around the methods, my back  
burner dream project, is to go the other way, and actually use  
multiple text editing widgets to edit one method. One for the method  
signature, one for the body, and some kind of widgetry to manage tags.  
That's from an ideological pov. From a pragmatic pov, I guess I've  
just lived with the generalized form, and not found the time to get  
that excited about it.

Maybe I recognize with a sullied sense "yes we evolved the syntax",  
but there are a number of other things that were changed in the last  
10 years that annoy me far more than this ever did, and I've been able  
to put it to good use. It's made my life easier, not harder. That  
cannot be said for some of the other changes that were made.

I also note that Squeak has tagged method support now as well.

--
Travis Griggs
Objologist
"HTTP. It's like a bike pretending to be a bus, a bulldozer, and a cup  
of coffee at the same time." - Martin Kobetic


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Terry Raymond
In reply to this post by Antony Blakey-2
While pragmas are implemented using messages, I view them
as method properties and as such, how they are used, and
ultimately how they can be explored, depends on the code
system using them. Many of the menu pragmas use symbols,
such as a method selector for enablement, but they could
have just a well used a string that compiles to a block.
So, I would have to say that it is up to the individual
that defines the pragmas as to how easy it is to use
senders/implementors to analyze the code. Additionally,
I don't see how a generalized tool can be created to
analyze all the possible flavors pragmas can take on.

I think part of your dilema is that when the system or an
application uses reflection to determine its configuration
it becomes difficult to analyze.

Terry
 
===========================================================
Terry Raymond
Crafted Smalltalk
80 Lazywood Ln.
Tiverton, RI  02878
(401) 624-4517      [hidden email]
<http://www.craftedsmalltalk.com>
===========================================================

> -----Original Message-----
> From: Antony Blakey [mailto:[hidden email]]
> Sent: Friday, July 18, 2008 10:00 PM
> To: Terry Raymond; VWNC List
> Subject: Re: [vwnc] RBrowserHistory and RBTabbedToolsets
>
>
> On 19/07/2008, at 9:29 AM, Terry Raymond wrote:
>
> > If I understand your comment, I find many of the pragmas
> > I am looking for by picking one of the symbols in the pragma
> > and do a 'senders' for that symbol. For example, in the
> > VisualLauncher if you do a senders of #probes you will find
> > all the menu command on the probes menu.
>
> In your example, I would search for 'submenu:...' which spotlight
> finds for me, including implementors which tells me where the pragma
> is used. And I can find the declaration by searching for senders, and
> then look for pragma declaration methods - which is fine if the method
> that declares the pragma is called 'pragma' or something obvious, but
> given that pragma declaring methods can themselves be identified using
> pragmas ... and strangely I had to search for a literal 'pragmas'
> rather than a send of 'pragmas:' to find the pragma-tagged pragma
> declaring method.
>
> I think there's a need for a pragma browser. Maybe a UI to browse all
> the pragmas declared in a class, and the implementors of those pragmas.
>
> Browsing senders is more of a problem because pragmas are accessed
> programatically. Maybe a pragma is needed to mark methods that
> 'search' for pragma-annotated methods so that you can do the full
> senders/implementors exploration as it relates pragmas. But I hesitate
> to even suggest that hack on a hack.
>
> Pragmas can't be properly refactored because of the lack of senders
> information, for the same reason sends using #perform: on constructed
> symbols can't be. Unlike #perform: however, there is no 'syntactic'
> way of indicating pragma access, so using pragmas is like using
> smalltalk where all sends must use #perform: (ignoring the bootstrap
> issue).
>
> IMO pragmas don't (yet) fit properly into the semantics of Smalltalk,
> and if they are going to be promoted, then some more thought should be
> given to the way they are modeled and accessed, and what tool support
> is needed.
>
> Antony Blakey
> -------------
> CTO, Linkuistics Pty Ltd
> Ph: 0438 840 787
>
> There are two ways of constructing a software design: One way is to
> make it so simple that there are obviously no deficiencies, and the
> other way is to make it so complicated that there are no obvious
> deficiencies.
>    -- C. A. R. Hoare


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Antony Blakey-2

On 21/07/2008, at 3:35 AM, Terry Raymond wrote:

> =I think part of your dilema is that when the system or an
> application uses reflection to determine its configuration
> it becomes difficult to analyze.

Yes, hence my repeated comments about the 'sender' side of pragmas not  
being reified into the language syntax, unlike the implementers side.

And pragmas ARE part of the language not least because the implementor  
side of the pragma is syntax.

Antony Blakey
--------------------------
CTO, Linkuistics Pty Ltd
Ph: 0438 840 787

You can't just ask customers what they want and then try to give that  
to them. By the time you get it built, they'll want something new.
   -- Steve Jobs



_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] VisualWorks Pragmas (was: RBrowserHistory and RBTabbedToolsets)

Eliot Miranda-2
In reply to this post by Travis Griggs-3


On Sat, Jul 19, 2008 at 12:34 AM, Travis Griggs <[hidden email]> wrote:
good stuff deleted (although I prefer method metadata to method tags, even if it is more verbose.
 
6) The one area that I think our current implementation is still a
little weak, is the extensibility of what the defining class does as
these methods come and go. Currently you can use a <pragmas: > tag to
indicate what other tags you'll be adding to either the instance or
class behavior. But to respond to the changes, you implement an
instanceMethodsChanged/classMethodsChanged which gets sent any time
they're changed. You don't know whether you've got additions, or
removals. Even more problematic, is that we've lost the "conflict free
extensibility" (great phrase Eliot) of what to do in response. For
example, many ApplicationModel subclasses implement the
instanceMethodsChanged in such a way that they flush any menus and
rebuild them, anticipating that I've added or removed methods with
<menu:...> annotations. But what if I want to extend an existing app
with a new type of service? What if, for example, I want to extend the
FileBrowser so it can register new file type tools, based on file
kind. I've got to override that instanceMethodsChanged method. And if
someone wants to add their own services, we'll have override conflicts.

Bingo.  That *is* the egregious hack in methid pragmas^H^H^H^H^H^H^Hmetadata and its all mine.  instanceMethodsChanged/classMethodsChanged was a desperate attempt to get menu pragmas (as they were called) working quickly, and it soon acquired more hacks above when parcel loading/unloading could change more than one method.

Basically program change needs to be better formalised.  There was an attempt to generalise the ChangeSet notification framework, but that isn't adequate.  People need to [put their heads together, collect some use cases and design something, eradicating the existing hacked mess.  But its effectively a rewrite of the compilatin and class building kernel.  It is no small job and (at least when I was there) there was no support for the work from product management.



I don't know to what extent it should be made more pluggable. It might
be enough to simply use a unary tag to tag methods that should fire
when the annotated methods have changed:

myResponseToChanges
       <taggedMethodsChanged>
       ^so doMyThang

One could go farther and parameterize that with the tags it's
interested in responding to:

updateTestCaches
       <taggedMethodsChanged: #(#test)>
       self flushTestResults

One could make it really rich, differentiating between add and remove.
Or really go nuts and add points for aboutToRemove/removed/aboutToAdd/
added. One could pass the methods added/removed. I've not personally
thought it all out enough to have strong opinions on how much to
provide, I do find the Behavior>>instanceMethodsChanged method comment
good advice on the subject.

Start by doing a thorough analysis of all the use cases
- change set maintenance
- Store change set maintennance
- change logging (on the changes file)
- response to adding/removing methods with metadata
- maintaining overrides
- updating other browsers displaying methods that get modified
- being able to bulk these operations for atomic loading (parcels and store)
- DLLCC graph rewriting when type definitions change (ok, scrap this and reimplement in terms of shared pools, but you get the idea...)
etc, etc

Don't dream up mechanism until you have an exhaustive set of the current uses and have speculated about other potential uses (e.g. a full distributed programming environment built with Opentalk, dynamic reconfiguration of an OLE server).  Then let the design flow form the requirements

[more good stuff snipped]

_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Eliot Miranda-2
In reply to this post by Antony Blakey-2


On Fri, Jul 18, 2008 at 9:58 PM, Antony Blakey <[hidden email]> wrote:

On 19/07/2008, at 2:05 PM, Eliot Miranda wrote:

So eventually you don't want to write Smalltalk or understand its metamodel at all.  You just want to use a GUI?

An invalid dichotomy as a rhetorical device.

A selective response that avoids having to respond to the substantive part of my post.

This is no longer a productive discussion Anthony.

_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] RBrowserHistory and RBTabbedToolsets

Eliot Miranda-2
I want to apologise publicly to Anthony for my response.  I had not noticed that his was a private message and assumed it was to the list.  Anthony, I beg your forgiveness.


On Sun, Jul 20, 2008 at 11:01 PM, Eliot Miranda <[hidden email]> wrote:


On Fri, Jul 18, 2008 at 9:58 PM, Antony Blakey <[hidden email]> wrote:

On 19/07/2008, at 2:05 PM, Eliot Miranda wrote:

So eventually you don't want to write Smalltalk or understand its metamodel at all.  You just want to use a GUI?

An invalid dichotomy as a rhetorical device.

A selective response that avoids having to respond to the substantive part of my post.

This is no longer a productive discussion Anthony.


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] VisualWorks Pragmas (was: RBrowserHistory and RBTabbedToolsets)

Colin Putney
In reply to this post by Eliot Miranda-2

On 20-Jul-08, at 10:59 PM, Eliot Miranda wrote:

> Basically program change needs to be better formalised.  There was  
> an attempt to generalise the ChangeSet notification framework, but  
> that isn't adequate.  People need to [put their heads together,  
> collect some use cases and design something, eradicating the  
> existing hacked mess.  But its effectively a rewrite of the  
> compilatin and class building kernel.

Squeak has something called the SystemChangeNotifier. It works  
remarkably like Announcements, though unfortunately it was written a  
little bit too early to benefit from Vassili's insight there. One can  
subscribe to change notifications at various granularities and receive  
objects describing the changes in detail. It's used for things like  
writing to the changes file, updating the current change set, updating  
browsers, etc. Now that Squeak has pragmas as well, it's good  
mechanism for monitoring metadata changes, although the *use* of  
pragmas isn't yet widespread in Squeak.

This solves the problem that Travis mentioned - lack of conflict-free  
extensibility in reacting to metadata changes. But it is also  
generalization of ChangeSet notification, so you clearly have some  
something more in mind... would you care to elaborate?

Colin


_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
Reply | Threaded
Open this post in threaded view
|

Re: [vwnc] VisualWorks Pragmas (was: RBrowserHistory and RBTabbedToolsets)

Eliot Miranda-2


On Mon, Jul 21, 2008 at 8:15 AM, Colin Putney <[hidden email]> wrote:

On 20-Jul-08, at 10:59 PM, Eliot Miranda wrote:

> Basically program change needs to be better formalised.  There was
> an attempt to generalise the ChangeSet notification framework, but
> that isn't adequate.  People need to [put their heads together,
> collect some use cases and design something, eradicating the
> existing hacked mess.  But its effectively a rewrite of the
> compilatin and class building kernel.

Squeak has something called the SystemChangeNotifier. It works
remarkably like Announcements, though unfortunately it was written a
little bit too early to benefit from Vassili's insight there. One can
subscribe to change notifications at various granularities and receive
objects describing the changes in detail. It's used for things like
writing to the changes file, updating the current change set, updating
browsers, etc. Now that Squeak has pragmas as well, it's good
mechanism for monitoring metadata changes, although the *use* of
pragmas isn't yet widespread in Squeak.

This solves the problem that Travis mentioned - lack of conflict-free
extensibility in reacting to metadata changes. But it is also
generalization of ChangeSet notification, so you clearly have some
something more in mind... would you care to elaborate?

I think SystemChangeNotifier is a pretty good start.  IIRC, it doesn't handle the code change transaction, before, during and after, (its notifications are delivered after the fact) and it doesn't batch.  With e.g. menu metadata the client class needs to know for a set of method changes whether any menu pragmas were removed (needs to know the state of the set before removal) as well as if any were added (needs to know the state after).  The client class is better served by being able to batch an entire set of changes because for example a menu pragma method may be dependent on a resource defining method (that e.g. defines an icon for the menu) and so the class shouldn't try and process the pragma methods until after all code in the parcel/package has been loaded/unloaded.

So the notification API needs to be based on notifying a set of updates (which in the programming-in-the-browser context are singleton sets (or binary with old version & new version of a method/class), and the class compilation side provided with a way of deferring and collecting update notifications until after some compound event is complete (adding an entire package/ unloading an entire package).  IMO, this has to be part and parcel of atomic loading.

Anyone, have I missed things?  (I probably have; this is what comes off the top of my head right now)



_______________________________________________
vwnc mailing list
[hidden email]
http://lists.cs.uiuc.edu/mailman/listinfo/vwnc
12