nuals: Support for Highly Interactive, Graphical [Steele 90] Guy. L. Steele Jr., : the Language, User Interfaces in Lisp, Technical Report, CMU- 2nd Edition, Digital Press (Bedford, MA), 1990. CS-89-196, Pittsburg, PA, 1989.

[Ousterout 90] John K. Ousterhout, Tcl: an embeddable com- mand language, USENIX Winter Conference, Ja- nuary 1990, pages 183-192.

[Ousterout 94] John K. Ousterhout, Tcl and the Tk toolkit, Addison-Wesley, 1994, ISBN: 0-201-63337-X. Annex

Complete code of the class.

;;;; Define class ""

(define-class ( ) ((entry :accessor entry-of) (label :accessor label-of) ;; Special slot (text :accessor text :init-keyword :text :allocation :special :propagate (label)) (value :accessor value :init-keyword :value :allocation :special :propagate (entry)) (background :accessor background :init-keyword :background :allocation :special :propagate (frame entry label))) :metaclass )

;;;; Define method "initialize-composite-widget". This method will be called when ;;;; a new labeled entry will be created.

(define-method initialize-composite-widget ((self ) initargs frame)

(let* ((e (make :parent frame :relief "ridge")) (l (make

;; pack sub widgets (pack l :side "left" :padx 5 :pady 5) (pack e :side "right" :padx 5 :pady 5 :expand # :fill "x")

;; Set proper slots (slot-set! self 'Id (Id e)) (slot-set! self 'entry e) (slot-set! self 'label l)))

;;;; To create the labeled entry of Figure 2: (define le (make :text "Enter a value" :value 100))

;;;; To map it on the screen: (pack le)

- 9 - This call will activate the setter function of the results already obtained are promising. In particu- background slot. This setter function will do the lar, the original mechanism of composition shown three slot assignments needed to change totally the in this paper is a good illustration of adapting a background. Note that this setter function is created meta protocol to a particular need. It permits to only once in the program (i.e. at the creation time). Consequently, the only compile the toolkit. Furthermore, daily experience overhead we have to access such a special slot (vs. a of STk and STklos show that an applicative object true-widget pseudo slot) is the call to the initial oriented languages can be comparable, in terms of slot-value. performances, to a more classical language.

In the object oriented programming spirit, our com- Availability position mechanism must be applicable more than once. It means that we must be able to build new STk and its object system STklos are distributed free composite widgets which are built upon previously of charge by anonymous ftp at kaolin.unice.fr. created composite widgets. Consider for instance a Current version runs on choice box widget. This new kind of widget could be implemented with a labeled entry, as the one we •Sun Solaris (1 & 2), have used until now, to which is associated a menu button giving a list of possible choices (see •Ultrix (4.2), Figure 3). Here, the inherits of the previous class and a possible •Dec OSF1, definition for this class could be:

(define-class •SGI (Irix4.05 & 5.1.1) () ((frame :accessor frame-of) •Linux(0.99). (lab-entry :accessor lentry-of) (menu :accessor menu-of) (menubutton :accessor menubutton-of) References (value :accessor value :init-keyword :value :allocation :special [Apple 92] Apple, Dylan: an object oriented dynamic langua- :propagate (lentry)) ge, Apple Computer, 1992.

:metaclass ) [Calder 87] Mark A. Linton, Paul R. Calder and John Vlis- sides, The Design and Implementation of Inter- This simple class definition and its associated ini- Views, Proceedings of the USENIX C++ tialize method suffice to define a choice box. We Workshop, Santa Fe, New Mexico,november can see that access to the value special slot will still 1987. give a correct value. For instance, getting this slot [Clinger 91] W. Clinger and J. Rees (editors), Revised4 Re- will redirect the reading to the lab-entry slot port on the Algorithmic Language Scheme, ACM which in turn will redirect it to the reading of the Lisp Pointers, 4 (3), 1991. slot value of the entry, as seen before. [Kickzales 91] Gregor Kickzales, Jim de Rivières, Daniel G. Bobrow, The Art of Meta Object Protocol, MIT 5 Conclusion Press, 1991. [Lieberman 86] Henry Lieberman, Delegation and Inheri- In this paper we have presented the STk interpreter tance: Two Mechanisms for Sharing Knowledge in and its object oriented extension. Both packages are Object Oriented Systems, Actes des 3e JLOO, Bi- well integrated with the Tk graphical toolkit. Even gre+Globule, 48, pages 79-89, Paris, 1986. if using an applicative or object oriented language for GUI programming is not a new idea [Meyer 89] Bertrand Meyer, Object Oriented Cons- ([Calder 87], or [Garnet] for instance), rare are those truction, Prentice Hall International (UK), Ltd., which use extensively a meta object protocol. Inves- Hemel Hemstead, 1989. tigating in this direction seems interesting and the [Myers 89] Brad Myers, The Garnet Toolkit Reference Ma-

- 8 - As we can see, a label entry inherits from the class. This class defines all the slots (i.e. Tk options) available for an entry. It is important to note here that even if the slots for such a class are numerous, only three of them are effectively allocat- ed in a standard Tk widget (namely parent, Id and Eid). All the other slots are pseudo-slots which 6 Figure 3: A Choice Box are allocated elsewhere . frame’s Id which embodies the components of a Previous class definition augments the composite widget. class with three new slots called frame, entry and label. These slots will contain the sub-widgets This implementation of the labeled entry is not yet composing the labeled entry. Next, two slots are de- completely satisfactory. With the previous inherit- clared with a special allocation protocol (signaled ance scheme, the entry sub-widget plays a major with the :special keyword). Special slots are slots role in the labeled entry. In some occasions, howev- for which reading and writing are redirected to oth- er, we could want that the accesses to a particular er sub-widgets. Here again, such slots are not di- slot will be “redirected” to another sub-widget. For rectly implemented in an instance; they don’t make instance, we could want that readings and writings the instance size growing. The background slot of to the slot relief of a labeled entry access in fact to this class definition, for instance, states that setting the relief of the frame rather than the entry relief. its value must be propagated to the entry, label and Eventually, we could also want that a slot modifica- frame slots (reading of this slot will find its value in tion will be propagated to several sub-widgets of the first element of the :propagate list: frame). the labeled entry. For instance, it would be suitable Note that background is already present in the to propagate the modification of the background as a pseudo-slot; current definition will slot of a labeled entry not only to the entry but also overload the inherited one. Concerning the value to the label and the frame. What is wanted here is slot, it is said that it is redirected only to the slot close to the delegation mechanism[Libermann 86]. value of the entry component. As we will see, the solution provided in STklos will permit to choose to which sub-widget(s) a slot ac- We can now define the initialize-compos- cess must be redirected. ite-widget method which will be called by the system just after a composite widget allocation 4.3 The class (complete code is given in annex). The only thing we have to do in this method consists to initialize the two true slots defined directly in the class (entry and label). composite> for handling the creation of compos- ites widgets. The main job of this meta-class consists Previous definitions permits to hide to the user the to manage a special kind of slots whose access can fact that a labeled entry is a composite widget by of- be redirected to slots of other objects. Using this fering the same kind of access. For example, sup- meta-class, a simple implementation of the labeled pose now that le denotes an instance of the class entry discussed before could be written as: ; setting all its components to (define-class ¨grey¨ can be simply done by ( ((entry :accessor entry-of) (set! (slot-value le ‘background) (label :accessor label-of) ¨grey¨) (background :accessor background :init-keyword :background or :allocation :special :propagate (frame entry (set! (background le) ¨grey¨) label)) (value :accessor value-of :init-keyword :value 6. defines also :allocation :special :propagate (entry))) a slot named frame which contains the exter- :metaclass ) nal frame of the composite widget.

- 7 - new class. In this case, we can inherit from the pre- defined classes ,

- 6 - Scheme space). Saying that the meta-class of the permits to display a message each time the mouse