garym@cognos.UUCP (Gary Murphy) (02/27/90)
Posting-number: Volume 10, Issue 88 Submitted-by: garym@cognos.UUCP (Gary Murphy) Archive-name: xlisp21/part01 Another attempt to get these sources to you: my first batch ran into 100k message limits, which means the message counts on any files you've received so far are not quite correct. The whole kit should consist of 1a 1b 1c 2 3a 3b 4a 4b and 5 - I promise I'll be better at this next time :-) [Ugh. ++bsa] I have included the sources as I downloaded them from MIPS BBS, with the collected bug-fixes/extensions &c appended as a collection of news articles. This also includes the WINTERP and XLISP examples and tutorials recendly posted to comp.lang.lisp.x ------------------------------------------------------------------------ #!/bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #!/bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # betz # readme.1st # readme.src # winterp.doc # xlisp.eg # xlisp.ref # xlisp.txt # This archive created: Sun Feb 18 23:27:40 1990 # By: Gary Murphy () export PATH; PATH=/bin:$PATH echo shar: extracting "'betz'" '(1164 characters)' if test -f 'betz' then echo shar: over-writing existing file "'betz'" fi sed 's/^X//' << \SHAR_EOF > 'betz' XFrom sce!mitel!uunet!samsung!brutus.cs.uiuc.edu!psuvax1!rutgers!cmcl2!dasys1!intern Fri Nov 24 09:01:48 EST 1989 XArticle: 33 of comp.lang.lisp.x XPath: cognos!sce!mitel!uunet!samsung!brutus.cs.uiuc.edu!psuvax1!rutgers!cmcl2!dasys1!intern XFrom: intern@dasys1.UUCP (Steve Faiwiszewski) XNewsgroups: comp.lang.lisp.x XSubject: Re: Author! Author! XMessage-ID: <11273@dasys1.UUCP> XDate: 22 Nov 89 02:55:16 GMT XReferences: <1989Nov9.180124.24190@rpi.edu> XReply-To: intern@dasys1.UUCP (Steve Faiwiszewski) XOrganization: The Big Electric Cat XLines: 15 X XIn article <1989Nov9.180124.24190@rpi.edu> jefu@pawl.rpi.edu (Jeffrey Putnam) writes: X>Does anyone have any suggestions for an email path to David Betz? X>(I know this has been asked before, but news has this habit of expiring X>things...) X> X XDavid Betz' CompuServe id is 76704,47. Last time I corresponded with him Xon CIS was about 6 months ago. You can mail to him from the net by sending Xto 76704.47@compuserve.com X X - Steve - X-- X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ XSteve Faiwiszewski bang : {sun!hoptoad , cmcl2!hombre} !dasys1!intern X domain : intern@dasys1.UUCP X X SHAR_EOF if test 1164 -ne "`wc -c 'betz'`" then echo shar: error transmitting "'betz'" '(should have been 1164 characters)' fi echo shar: extracting "'readme.1st'" '(6702 characters)' if test -f 'readme.1st' then echo shar: over-writing existing file "'readme.1st'" fi sed 's/^X//' << \SHAR_EOF > 'readme.1st' XThis is a list of new features in XLISP version 2.0 as of 15Nov87: X XSymbols have two value cells, one for normal values and one for Xfunction values. SETQ sets the normal value, DEFUN sets the Xfunctional value. X XThe most important change from version 1.7 to 2.0 of XLISP is that Xit is now possible to save XLISP's workspace between sessions. This Xfeature isn't necessarily part of every implementation of XLISP 2.0 Xsince it is controlled by a compile-time conditional. Check the file X'xlisp.h' to see if the symbol SAVERESTORE is defined for your machine Xbefore you try to use these functions. X XThe &key lambda list keyword is now supported as are initialization forms Xfor &optional, &key and &aux parameters. The supplied-p variables are Xalso supported for &optional and &key parameters. X XNew functions and special forms: X X(save filename) ; *** NOT IN ALL 2.0 IMPLEMENTATIONS *** X(restore filename) ; *** NOT IN ALL 2.0 IMPLEMENTATIONS *** X(subseq string start [end]) X(open name &key :direction) X(vector [expr]...) X(block name [expr]...) X(return-from name [value]) X(tagbody [tag|expr]...) X(psetq [sym value]...) X(flet ([sym lambda-list [body]...]...) [expr]...) X(labels ([sym lambda-list [body]...]...) [expr]...) X(macrolet ([sym lambda-list [body]...]...) [expr]...) X(unwind-protect expr [expr]...) X(when test [expr]...) X(unless test [expr]...) X(loop [expr]...) X(progv symbols values [expr]...) X(pprint expr [stream]) X(string< str1 str2 &key :start1 :end1 :start2 :end2) X(string= str1 str2 &key :start1 :end1 :start2 :end2) X(string> str1 str2 &key :start1 :end1 :start2 :end2) X(string<= str1 str2 &key :start1 :end1 :start2 :end2) X(string/= str1 str2 &key :start1 :end1 :start2 :end2) X(string>= str1 str2 &key :start1 :end1 :start2 :end2) X(string-lessp str1 str2 &key :start1 :end1 :start2 :end2) X(string-equal str1 str2 &key :start1 :end1 :start2 :end2) X(string-greaterp str1 str2 &key :start1 :end1 :start2 :end2) X(string-not-greaterp str1 str2 &key :start1 :end1 :start2 :end2) X(string-not-equal str1 str2 &key :start1 :end1 :start2 :end2) X(string-not-lessp str1 str2 &key :start1 :end1 :start2 :end2) X(string-trim bag string) X(string-left-trim bag string) X(string-right-trim bag string) X(string-upcase string &key :start :end) X(string-downcase string &key :start :end) X(nstring-upcase string &key :start :end) X(nstring-downcase string &key :start :end) X(symbol-function sym) X(send obj msg [expr]...) X(send-super msg [expr]...) X(integerp expr) X(floatp expr) X(stringp expr) X(arrayp expr) X(streamp expr) X(objectp expr) X(fboundp expr) X(characterp expr) X(int-char expr) X(char-int expr) X(read-byte [stream]) X(write-byte expr [stream]) X(make-string-input-stream string [start [end]]) X(make-string-output-stream) X(get-output-stream-string stream) X(get-output-stream-list stream) X(get-lambda-expression closure) X(gcd expr1 expr2) X(macroexpand form) X(macroexpand-1 form) X XThere is now a real character data type. All functions that are Xsupposed to return characters (like READ-CHAR) now do. X XThe reader is now capable of handling both single and multiple escapes. XThis means that it is possible to read the symbol |aBc| and get a symbol Xwith the print name "aBc". The backslash can also be used as a single Xescape. The same symbol could have been written \aB\c. X XThe read table now supports the character types :SESCAPE for single Xescape and :MESCAPE for multiple escapes. X XThe reader also supports the reader macros: X X #:symbol an uninterned symbol X #| ... |# a comment X #Onumber an octal number X #Bnumber a binary number X XThe following symbols preserve a history of values used by the Xread-eval-print loop: X X - the current input expression X + the last expression read X ++ the previous value of + X +++ the previous value of ++ X * the result of the last evaluation X ** the previous value of * X *** the previous value of ** X XThe global symbol *PRINT-CASE* was added to control the output case of Xsymbols. Its default value is :UPCASE which will cause symbols to Xbe printed in uppercase. You can change it to :DOWNCASE to get symbols Xto print in lowercase. X XI have added the functions FIRST, SECOND, THIRD, FOURTH and REST as Xsynonyms for CAR, CADR, CADDR, CADDDR and CDR. X XChanged the default value of *print-case* to :upcase. X XAdded macros to init.lsp for: X X (defvar sym &optional val) X (defparameter sym val) X (defconstant sym val) X XThese symbols control the format in which numbers are printed. They Xshould be set to printf format strings. X X *integer-format* (default is "%d" or "%ld") X *float-format* (default is "%g") X X(substr string start [length]) is replaced by: X (subseq string start [end]) X X(openi name) is replaced by: (open name :direction :input) X(openo name) is replaced by: (open name :direction :output) X XOPEN, LOAD, SAVE and RESTORE take strings or symbols as file names. XIf a symbol is given, the print name of the symbol is used as the base Xfilename and the default extension (if any) is appended. X XRenamed MEM to ROOM and TRANSCRIPT to DRIBBLE. X XAdded a trace facility. The evaluator will now print trace Xinformation for function and macro calls. The names of the Xfunctions and macros to trace should be in a list that is stored Xas the value of *TRACELIST*. X XAdded macro definitions for TRACE and UNTRACE to "init.lsp". XTrace output goes to the stream that is the value of *TRACE-OUTPUT*. X XRemoved the hard wired prompting from READ. There is no longer Xan unmatched left paren counter, but the debug level prompt remains. X XThe symbols *ERROR-OUTPUT* and *DEBUG-IO* have been added and Xare bound to streams that are used for error output and debug Xi/o respectively. X XThe symbol *GC-HOOK* has been added. If it is bound to a function Xof two arguments, that function will be called after the garbage Xcollector runs. The two parameters are the total number of nodes Xand the number free after the garbage collection. X XAdded the function (COMMAND-POINT-SIZE <n>) to the Macintosh version Xto set the point size for the text in the command window. The default Xpoint size is 9. X XThe SEND-SUPER function replaces the :SENDSUPER message to objects. XAll messages must be sent using either the SEND function or the XSEND-SUPER function. In other words, the syntax: X X (Class :new '(a b c)) X Xmust now be written as: X X (send Class :new '(a b c)) X Xand X X (self :sendsuper :msg 1 2 3) X Xmust now be written as: X X (send-super :msg 1 2 3) X XThis is because the CAR of a form is no longer evaluated. To get the Xeffect of having the function position evaluated, use the FUNCALL form. X XThe syntax of LOAD has changed from: X X (load name [verbose-flag [print-flag]]) X Xto: X X (load name &key :verbose :print) X X X SHAR_EOF if test 6702 -ne "`wc -c 'readme.1st'`" then echo shar: error transmitting "'readme.1st'" '(should have been 6702 characters)' fi echo shar: extracting "'readme.src'" '(466 characters)' if test -f 'readme.src' then echo shar: over-writing existing file "'readme.src'" fi sed 's/^X//' << \SHAR_EOF > 'readme.src' XThis archive contains the IBM-PC specific source code for XLISP Xversion 2.1. In order to recompile XLISP, you'll also need the Xgeneric code archive. These files were designed to be used with XTurbo C v2.0 and will probably need to be changed to use any other Xcompiler. Before attempting to recompile any of the modules, make Xsure that the symbol _TURBOC_ is defined at the top of 'xlisp.h' Xwhere the machine type is specified (right under the copyright Xnotice). X X SHAR_EOF if test 466 -ne "`wc -c 'readme.src'`" then echo shar: error transmitting "'readme.src'" '(should have been 466 characters)' fi echo shar: extracting "'winterp.doc'" '(14611 characters)' if test -f 'winterp.doc' then echo shar: over-writing existing file "'winterp.doc'" fi sed 's/^X//' << \SHAR_EOF > 'winterp.doc' XFrom sce!mitel!uunet!tut.cis.ohio-state.edu!ucbvax!hplabs!hplabsz!mayer Thu Jan 11 12:51:21 EST 1990 XArticle: 2234 of comp.lang.lisp XPath: cognos!sce!mitel!uunet!tut.cis.ohio-state.edu!ucbvax!hplabs!hplabsz!mayer XFrom: mayer@hplabsz.HPL.HP.COM (Niels Mayer) XNewsgroups: comp.lang.lisp XSubject: Re: XLISP Object Method Selectors :new and :isnew. XMessage-ID: <4613@hplabsz.HPL.HP.COM> XDate: 10 Jan 90 07:26:26 GMT XReferences: <1511@dinl.mmc.UUCP> XReply-To: mayer@hplabs.hp.com (Niels Mayer) XOrganization: Hewlett-Packard Labs, Software Technology Lab, Palo Alto, CA. XLines: 308 XSummary: XExpires: XSender: XFollowup-To: X XIn article <1511@dinl.mmc.UUCP> noren@dinl.UUCP (Charles Noren) writes: X>It's been a while since I've been on the net. I can no longer X>access comp.lang.lisp.x from our site, I suppose it went away? X Xit's still there... X X>I've just starting playing with XLISP v2.0, particularly the X>object-oriented features of it. I've created new classes with X>instance and class variables, and I've used the :new selector X>to do so and it works just fine. However, I see the :isnew X>selector in the documentation and I was wondering how that works X>compared to :new. X XWhen I first looked at XLISP, I too found the documentation on the Xobject system to be a little terse. Everything becomes much clearer Xonce you see some examples. X XI recently wrote up some documentation on XLISP's object system for Xuse with WINTERP (an XLISP-based rapid prototyping environment for Xapplications based on the OSF Motif widgets). The following excerpt Xfrom winterp/doc/winterp.doc may help (get winterp via anonymous ftp Xfrom expo.lcs.mit.edu:oldcontrib/winterp.tar.Z). In particular, your Xquestion about :ISNEW is answered in the "object initialization" Xsection. X X -------------------- X X* Introduction to XLISP objects and Widgets. X XWINTERP uses XLISP's object system as its interface to the class hierarchy Xof widgets provided by Motif. Specifically, each Motif widget class is Xrepresented by one or more object classes in WINTERP. In order to best Xunderstand the capabilities of WINTERP's Motif interface, a brief review of Xthe XLISP object system is in order. You may also want to consult the XLISP Xdocumentation ./winterp/doc/xLisp.doc for a more precise definition of the Xobject system. X XXLISP Classes describe the type of a particular object by declaring a set Xof variables held in each object. These "instance variables" may only be Xaccessed by "methods" that respond to "messages" sent to the object. XMethods are defined for particular classes, and functionality of other Xclasses may be incorporated into new classes via "inheritance". From XXLISP, Motif widget classes look just like normal XLISP objects -- that Xmeans that you can easily extend the functionality of Motif widgets by Xadding your own methods to a particular widget class. You may also use Xinheritance to attach your own data structures to widgets. The result is Xthat WINTERP provides a very clean way to interactively rapid-prototype an Xapplication, while also providing mechanisms for code structuring and reuse. XThe latter is necessary in evolving from prototype to a structured, Xmaintainable, and customizable deliverable. X X X** Creating new objects. X XCreate a new instance of a class by sending the message :NEW to X<a_class_instance>: X X (SEND <a_class_instance> :NEW <parameters>) X X<a_class_instance> is in fact an instance of class CLASS. Class CLASS allows Xyou to define new class instances by specifying the instance variables and Xparent class of a particular class. X X X** Declaring a class. X XTo declare a "base class" object, that is, an object with no parent object, Xjust send message :NEW to the object <CLASS> X X (SEND CLASS :NEW '(<ivar0> ... <ivarN>) X ['(<cvar0> ... <cvarM>)]) X X'(<ivar0> ... (ivarN>) are a list of symbols. Each <ivar-i> names an Xinstance variable of the class. '(<cvar0> ... <cvarM>)]) are an optional Xlist of variables that are shared among all instances of that particular Xclass. X X X** Defining methods. X XWhen a "message" is sent to an object, XLISP searches for a "method" to Xanswer the message. A method is a piece of Lisp code that is executed when Xa particular message is sent to an object. Within the code of a method, all Xobject instance and class variables are accessible. Furthermore, the symbol X'self' is bound to the object the message was sent to. X XMethods are defined by sending the message :ANSWER to <a_class_instance>: X X (SEND a_class_instance :ANSWER <:msg> <parameters> <code>) X Xwhere <:msg> is a keyword symbol (a symbol with a ':' prefix) representing Xthe message; <parameters> are the arguments given along with the message. XSee the documentation on "lambda lists" in /winterp/doc/xLisp.doc p.12 for Xdetails. <code> is a list of s-expressions which get evaluated in response Xto a message. The lexical environment that existed for the call to :ANSWER Xwill be used for value and functional bindings during method evaluation. X XIf you need to remember what the syntax is, consider the memory-helper X "this class :ANSWERs to :MESSAGE..." == (send <cls> :ANSWER :MESSAGE ...) X X X** Inheritance X XSo far, the object system we just described supports *encapsulation*. XEncapsulation is good programming practice because it helps localize and Xdetangle complexity. Unfortunately, encapsulation runs counter to Xflexibility because making flexible use of an object may require that Xcertain groups of instance variables be accessed by different layers of new Xfunctionality. Most often, one wants to *reuse* aspects of a particular Xclass in creating code that specializes and alters the functionality of Xthat class. A compromise between encapsulation and flexibility is found by Xusing *inheritance* in an object system. Inheritance is used to allow a X *subclass* to specialize the functionality of it's *parent class* (aka, Xthe *superclass*): X X (send Class :NEW '(<ivar0> ... <ivarN>) X '(<cvar0> ... <cvarM>) X <superclass>) X X(<ivar0> ... <ivarN>) is a list of new instance variables in the subclass; X(<cvar0> ... <cvarN>) is a list of new class variables in the subclass; X<superclass> is a class instance representing the parent from which Xthe new subclass inherits variables and methods. X X"Inheritance" is occurring because all the instance variables of all the Xparent classes of the new subclass become the variables of each subclass Xinstance. Furthermore, all methods defined on a parent class may also be Xused on a subclass instance. Note that while a subclass' methods can access Xthe variables defined on the parent classes, the reverse isn't true. X X X** Object initialization. X XAs mentioned earlier, new object instances are created by sending the Xmessage :NEW to a class object. Sending the message :NEW to a class Xautomatically sends message :ISNEW to the newly created instance. By Xdefault :ISNEW on an instance is a no-op method defined on class 'Object', Xwhich is the implicit [(grand)*]parent of all instances. If you want to Xinitialize the instance/class variables of a particular class, you must Xdefine an :ISNEW method on the class. Any parameters originally sent to Xthe :NEW method will be passed on to the :ISNEW method and may be used to Xinitialize an object to outside-world parameters. X X X** Example of using OOP features of XLISP with Motif widgets: X XAs currently implemented, the Motif class xmListWidgetClass makes it a bit Xbaroque to create browsers (hopefully this will change in Motif 1.1). The Xproblem is that a "browser" is a kind of application that lends itself to Xobject oriented techniques that are not always straightforward to support Xin C. One often has a collection of 'things' that one wants to display in a X'list' and perform actions on the 'thing' corresponding to the visual Xselection of an element in the displayed list. xmListWidgetClass will Xdisplay an arrray of XmStrings in a list. When one or more elements in the Xlist are selected, XmStrings corresponding to the selected elements are Xreturned. Since the XmStrings you put into the list widget are not the XXmStrings you get out, you must call XmStringCompare on each element of the Xcollection of 'things' to find out which ones are selected. Presumably, Xyou'll want to do more than just get back an XmString... normally one will Xwant to access data structures associated with the XmString so as to perform Xan action dependent on those structures. This could be done with a lookup Xtable, but there's also a better way... X XWINTERP allows us to subclass the Motif list widget so as to make it have Xthe kind of functionality we want. This subclass will contain an additional Xinstance variable 'items' which is an array of arbitrary XLISP objects to Xbe displayed in a textual browser made from the list widget. These objects Xcan have completely different internal representations -- the only Xrequirement is that they follow the protocol of being able to respond to Xthe messages :DISPLAY_STRING and :DEFAULT_ACTION. :DISPLAY_STRING returns a Xstring representation of the object to be displayed in the browser. X:DEFAULT_ACTION is the action to be performed when a list item is browsed X(by double clicking on the item). X XThe following creates the subclass <List_Browser> from superclass X<XM_LIST_WIDGET_CLASS>: X X (setq List_Browser X (send Class :NEW ;create a class inst X '(items) ;new instance vars X '() ;no class vars X XM_LIST_WIDGET_CLASS)) ;superclass X XSo now all instances of <List_Browser> will contain an instance variable X<items> and will respond to all the messages understood by the XXM_LIST_WIDGET_CLASS. We want our list browser to behave as described Xabove, so we define an :ISNEW method to initialize instance variable X<items> to the list of arbitrary objects to be displayed. <items> gets Xinitialized to an array of objects, the list widget is created, and a XXmNdefaultActionCallback is setup so that a double click will send the Xmessage :DEFAULT_ACTION to the browsed item: X X ;; (send List_Browser :new <items_list> <args-for-the-list-widget>) X ;; <items_list> is a list of BROWSER_OBJECTs as described above. X ;; <args-for-the-list-widget> -- these are the arguments that X ;; will be passed on to the list widget X ;; X (send List_Browser :answer :isnew '(items_list &rest args) X '( X (let* ( X (items_end_idx (length items_list)) X (display_items (make-array items_end_idx))) X X ;; initialize the 'items' instance variable so that it X ;; holds all the BROWSER_OBJECTs passed in <items_list> X (setq items (make-array items_end_idx)) ;create the array X (do ( ;copy elts from list to array X (i 0 (1+ i)) X (elts items_list (cdr elts))) X ;; loop till no more elts X ((null elts)) X ;; loop body X (setf (aref items i) (car elts)) X (setf (aref display_items i) X (send (car elts) :display_string)) X ) X X ;; initialize the widget, passing in the browser items. X (apply 'send-super `(:isnew X ,@args X :xmn_selection_policy :browse_select X :xmn_items ,display_items X :xmn_item_count ,items_end_idx X )) X ) X X ;; set up a callback on the list widget initialized above such X ;; that a double click on the browser-item will send the X ;; message :default_action to the BROWSER_OBJECT. X (send-super :add_callback :xmn_default_action_callback X '(callback_item_position) X '((send (aref items (1- callback_item_position)) X :default_action)) X ) X ) X ) X X XIn the above code, SEND-SUPER works just like send, except that it doesn't Xrequire you to give it the object to send the message to. Instead, it Ximplicitly assumes that it will be called from within a method, and will Xautomatically send the message to a superclass of the object's class. The X(apply 'send-super ...) form is actually calling the :ISNEW (instance Xinitializer) method on XM_LIST_WIDGET_CLASS, which actually creates the Xwidget via XmCreateList() or XmCreateScrolledList(). The APPLY '`' X(BACKQUOTE) and '&rest args' (LAMBDA LIST) features of Lisp allow us to Xsplice in the argument list passed to the instance of List_Browser into the Xfunction that actually creates the widget. Finally, method :add_callback is Xthe WINTERP equivalent of XtAddCallback(). See the documentation on methods Xon WIDGET_CLASS for more details. X XThe Motif List widget also defines a number of "methods" implemented as C Xroutines such as XmListAddItem(), XmListAddItemUnselected(), XXmListDeleteItem(), and XmListDeletePos(). In WINTERP, we define these as Xmethods :ADD_ITEM, :ADD_ITEM_UNSELECTED, :DELETE_ITEM, and :DELETE_POS Xrespectively. Since these methods modify the collection of objects Xrepresented by the list widget, we must update the internal array of Xobjects <items> to correspond with the items displayed. We do this by Xintercepting those messages to the superclass of class <List_Browser> and Xhandle them in <List_Browser> so as to update the appropriate data: X X (send List_Browser :answer :ADD_ITEM '(item position) X '( X (setq items (array-insert-pos items (1- position) item)) X (send-super :add_item X (send item :display_string) X position) X ) X ) X X (send List_Browser :answer :ADD_ITEM_UNSELECTED '(item position) X '( X (setq items (array-insert-pos items (1- position) item)) X (send-super :add_item_unselected X (send item :display_string) X position) X ) X ) X X (send List_Browser :answer :DELETE_ITEM '(item) X '( X ;; this is too lame to implement... requires that we compare X ;; item with the result of :display_string done on every elt X ;; of ivar 'items' X (error "Message :DELETE_ITEM not supported in List_Browser") X ) X ) X X (send List_Browser :answer :DELETE_POS '(position) X '( X (setq items (array-delete-pos items (1- position))) X (send-super :delete_pos position) X ) X ) X XTo see how this subclassed list browser is used, and also to see how one Xmight write a sample application in WINTERP using the object oriented Xfeatures of XLISP, see ./winterp/examples/grep-br.lsp. That file Ximplements a simple search browser based on the UN*X command 'grep'. See Xalso ./winterp/examples/mail-br.lsp to see how you can build a simple Xmh-based mail browser. Finally, as another example of subclassing Motif Xwidgets, see ./winterp/examples/radiobox2.lsp. X------------------------------------------------------------------------------- X Niels Mayer -- hplabs!mayer -- mayer@hplabs.hp.com X Human-Computer Interaction Department X Hewlett-Packard Laboratories X Palo Alto, CA. X * X X SHAR_EOF if test 14611 -ne "`wc -c 'winterp.doc'`" then echo shar: error transmitting "'winterp.doc'" '(should have been 14611 characters)' fi echo shar: extracting "'xlisp.eg'" '(7724 characters)' if test -f 'xlisp.eg' then echo shar: over-writing existing file "'xlisp.eg'" fi sed 's/^X//' << \SHAR_EOF > 'xlisp.eg' XFrom sce!mitel!uunet!mailrus!cs.utexas.edu!tut.cis.ohio-state.edu!ucbvax!hplabs!hpfcso!hpfcbig!tim Fri Feb 16 07:17:21 EST 1990 XArticle: 73 of comp.lang.lisp.x XPath: cognos!sce!mitel!uunet!mailrus!cs.utexas.edu!tut.cis.ohio-state.edu!ucbvax!hplabs!hpfcso!hpfcbig!tim XFrom: tim@hpfcbig.SDE.HP.COM (Tim Mikkelsen) XNewsgroups: comp.lang.lisp.x XSubject: Re: intro to XLISP objects XMessage-ID: <1170006@hpfcbig.SDE.HP.COM> XDate: 12 Feb 90 16:24:20 GMT XReferences: <1170004@hpfcbig.SDE.HP.COM> XOrganization: HP SESD, Fort Collins, CO XLines: 228 X X XA MORE REALISTIC EXAMPLE X______________________________________________________________________________ X X XThe following is an example, using the idea of tools again. It contains Xa hierarchy of tool classes. The top of the class hierarchy is TOOLS. XHAND-TOOLS and SHOP-TOOLS are sub-classes of TOOLS. The example creates Xinstances of these sub-classes. It is possible to extend this example Xin various ways. One obvious extension would be to create a third tier Xof classes under HAND-TOOLS that could contain classes like drills, Xscrewdrivers, pliers and so on. X X X X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X; X; File name: tools.lsp X; Author: Tim Mikkelsen X; Description: Object-oriented example program X; Language: XLISP 2.0 X; X; Date Created: 10-Jan-1988 X; Date Updated: 2-Apr-1989 X; X; (c) Copyright 1988, by Tim Mikkelsen, all rights reserved. X; Permission is granted for unrestricted non-commercial use. X; X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X; X; Define the superclasses and classes X; X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X; X; make TOOLS superclass X; with a different :ISNEW method X; added methods are :BORROW and :RETURN X; class variables are NUMBER contains # of tool instances X; ACTIVE-LIST contains list of current objects X; instance variables are POWER list - (AC BATTERY HAND) X; MOVEABLE CAN-CARRY or CAN-ROLL or FIXED X; OPERATIONS list X; MATERIAL list - (WOOD METAL PLASTIC ...) X; PIECES list X; LOCATION HOME or person's name X; X X(setq tools (send class :new '(power X moveable X operations X material X pieces X location) X '(number active-list))) X(send tools :answer :isnew '() X '((if (null number) (setq number 1) X (setq number (1+ number))) X (setq active-list (cons self active-list)) X (setq location 'home))) X(send tools :answer :borrow '(by-who) X '((if (eq location 'home) (setq location by-who) X (print "you can't")))) X(send tools :answer :return '() X '((if (eq location 'home) (print "got it already") X (setq location 'home)))) X X; X; make HAND-TOOLS class X; with a different :ISNEW method X; new instance variable WEIGHT <number> of pounds X; the rest is inherited from TOOLS X; X X(setq hand-tools (send class :new '(weight) '() tools)) X(send hand-tools :answer :isnew '(pow op mat parts w-in) X '((setq power pow) X (setq moveable 'can-carry) X (setq operations op) X (setq material mat) X (setq pieces parts) X (setq weight w-in) X (send-super :isnew))) X X; X; make SHOP-TOOLS class X; with a different :ISNEW method X; no new instance variables X; the rest is inherited from TOOLS X; X X(setq shop-tools (send class :new '() '() tools)) X(send shop-tools :answer :isnew '(pow mov op mat parts) X '((setq power pow) X (setq moveable mov) X (setq operations op) X (setq material mat) X (setq pieces parts) X (send-super :isnew))) X X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X; X; Create instances of various tool classes X; X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X X(setq hand-drill (send hand-tools :new ; make an instance - HAND-DRILL X '(ac) X '(drill polish grind screw) X '(wood metal plastic) X '(drill drill-bits screw-bits buffer) X '2.5)) X X(setq table-saw (send shop-tools :new ; make an instance - TABLE-SAW X '(ac) X 'fixed X '(rip cross-cut) X '(wood plastic) X '(saw blades fence))) X X X(setq radial-arm (send shop-tools :new ; make an instance = RADIAL-ARM X '(ac) X 'can-roll X '(rip cross-cut) X '(wood plastic) X '(saw blades dust-bag))) X X XThe following session shows how to use the tool definitions from this Xbetter example. The example starts at the OS shell and brings up xlisp Xrunning the file 'tools.lsp'. X X ________________________________________________________________ X | X | cmd? xlisp tools X | ; loading "init.lsp" X | ; loading "tools.lsp" X | > (send hand-drill :borrow 'fred) X | FRED X | X | > (send table-saw :return) X | "got it already" X | "got it already" X | X | > (send hand-drill :borrow 'joe) X | "you can't" X | "you can't" X | X | > (send hand-drill :return) X | HOME X |________________________________________________________________ X X XSo, Fred was able to borrow the HAND-DRILL. When an attempt was made to Xreturn the TABLE-SAW, it was already at home. A second attempt to Xborrow the HAND-DRILL indicated that "you can't" because it was already Xlent out. Lastly, the HAND-DRILL was returned successfully. (Note that Xthe "got it already" and "you can't" strings show up twice in the Xdisplay because the methods both print and return the string.) X XThe following session shows the structure of the TOOLS object: X X ________________________________________________________________ X | X | > (send tools :show) X | Object is #<Object: #276fc>, Class is #<Object: #23fe2> X | MESSAGES = ((:RETURN . #<Closure-:RETURN: #2dbd0>) X | (:BORROW . #<Closure-:BORROW: #2ddba>) X | (:ISNEW . #<Closure-:ISNEW: #274a4>)) X | IVARS = (POWER MOVEABLE OPERATIONS MATERIAL PIECES LOCATION) X | CVARS = (NUMBER ACTIVE-LIST) X | CVALS = #(3 (#<Object: #2cadc> X | #<Object: #2cda2> X | #<Object: #2d0e0>)) X | SUPERCLASS = #<Object: #23fd8> X | IVARCNT = 6 X | IVARTOTAL = 6 X | #<Object: #276fc> X |________________________________________________________________ X X XThe two TOOLS sub-classes HAND-TOOLS and SHOP-TOOLS structure looks like: X X ________________________________________________________________ X | X | > (send hand-tools :show) X | Object is #<Object: #2dab8>, Class is #<Object: #23fe2> X | MESSAGES = ((:ISNEW . #<Closure-:ISNEW: #2d7a2>)) X | IVARS = (WEIGHT) X | CVARS = NIL X | CVALS = NIL X | SUPERCLASS = #<Object: #276fc> X | IVARCNT = 1 X | IVARTOTAL = 7 X | #<Object: #2dab8> X | X | > (send shop-tools :show) X | Object is #<Object: #2d680>, Class is #<Object: #23fe2> X | MESSAGES = ((:ISNEW . #<Closure-:ISNEW: #2d450>)) X | IVARS = NIL X | CVARS = NIL X | CVALS = NIL X | SUPERCLASS = #<Object: #276fc> X | IVARCNT = 0 X | IVARTOTAL = 6 X | #<Object: #2d680> X |________________________________________________________________ X X XThe class HAND-TOOLS has an instance HAND-DRILL which looks like: X X ________________________________________________________________ X | X | > (send hand-drill :show) X | Object is #<Object: #2d0e0>, Class is #<Object: #2dab8> X | WEIGHT = 2.5 X | POWER = (AC) X | MOVEABLE = CAN-CARRY X | OPERATIONS = (DRILL POLISH GRIND SCREW) X | MATERIAL = (WOOD METAL PLASTIC) X | PIECES = (DRILL DRILL-BITS SCREW-BITS BUFFER) X | LOCATION = HOME X | #<Object: #2d0e0> X |________________________________________________________________ X X SHAR_EOF if test 7724 -ne "`wc -c 'xlisp.eg'`" then echo shar: error transmitting "'xlisp.eg'" '(should have been 7724 characters)' fi echo shar: extracting "'xlisp.ref'" '(3263 characters)' if test -f 'xlisp.ref' then echo shar: over-writing existing file "'xlisp.ref'" fi sed 's/^X//' << \SHAR_EOF > 'xlisp.ref' XFrom sce!mitel!uunet!tut.cis.ohio-state.edu!ucbvax!hplabs!hpfcso!hpfcbig!tim Mon Jan 8 09:06:27 EST 1990 XArticle: 2222 of comp.lang.lisp XPath: cognos!sce!mitel!uunet!tut.cis.ohio-state.edu!ucbvax!hplabs!hpfcso!hpfcbig!tim XFrom: tim@hpfcbig.SDE.HP.COM (Tim Mikkelsen) XNewsgroups: comp.lang.lisp XSubject: Re: XLISP 2.0 reference available XMessage-ID: <6950018@hpfcbig.SDE.HP.COM> XDate: 6 Jan 90 04:33:30 GMT XReferences: <6950014@hpfcbig.SDE.HP.COM> XOrganization: HP SESD, Fort Collins, CO XLines: 19 X XAn accessable ftp machine! X XThe XLISP 2.0 reference has been made available for anonymous FTP on Xhost cs.orst.edu, in the pub/xlisp directory, file xlispref.txt (a plain XASCII text file, roughly 412k in size). It is requested that you Xretrieve this file ONLY during non-working hours (say 7pm to 7am, XPacific Time). X XI've tested access to this machine and the file and I was able to get at Xit. As mentioned the file is large, so it took about 9 minutes to get Xthe entire file at 8 PM. X X XThanks to Marion Hakanson (hakanson@cse.ogi.edu) for getting this put on Xcs.orst.edu. There will be a few other machines that the reference will Xbe ftp'able from (including simtel20). I'll post these new machines on Xcomp.lang.lisp.x (which is probably where this note should have gone). X XTim Mikkelsen X X XFrom sce!mitel!uunet!visdc!jiii Mon Jan 8 09:06:33 EST 1990 XArticle: 2223 of comp.lang.lisp XPath: cognos!sce!mitel!uunet!visdc!jiii XFrom: jiii@visdc.UUCP (John E Van Deusen III) XNewsgroups: comp.lang.lisp XSubject: Re: XLISP 2.0 reference available XSummary: sed script for reformatting XMessage-ID: <726@visdc.UUCP> XDate: 6 Jan 90 19:58:28 GMT XReferences: <6950014@hpfcbig.SDE.HP.COM> <6950017@hpfcbig.SDE.HP.COM> XReply-To: jiii@visdc.UUCP (John E Van Deusen III) XOrganization: VI Software Development, Boise, Idaho XLines: 70 X XTo everyone who has obtained Tim Mikkelsen's excellent and very Xuseful XLISP Reference in ASCII format, the following sed script Xmight be of interest to you. It slightly reformats the document Xso that when piped through pr(1), there are no empty pages. It Xalso keeps the text within reasonable margins for printing on X8.5x11" paper, and provides some additional consistency in tabbing Xand line spacing. X XAssuming that you have the files ref1.Z, ref2.Z, ref3.Z, ref4.Z, Xand ref5.Z as provided by Tim Mikkelsen, and the sed script Xcontained here has been saved as sedf; the following command, or a Xvariation, will produce the reformatted document in the file prt: X X$ zcat ref[1-5].Z | sed -f sedf | pr -h "XLISP Reference" > prt X X-- XJohn E Van Deusen III, PO Box 9283, Boise, ID 83707, (208) 343-1865 X Xuunet!visdc!jiii X X===cut here=== X/^[]$/,${ X s/^[ ] / / X s/^ / / X s/^ [ ]/ / X /^ /s/^ */ / X /^[ ][ ]* [ ][ ]*/s/ // X /^EXAMPLES$/,/^[^ ]/{ X /^[ ]*$/d X /^ /!{ X /^EXAMPLES$/a\ X X /^EXAMPLES$/!{ X /^[]/!i\ X X } X X } X s/^ // X } X /^SYNTAX$/,/^DESCRIPTION$/{ X /^[ ][ ]*<.*>.*-/,/^$/{ X s/- *[ ]/- / X />.*- /!{ X /^[ ][ ]* /!{ X s/^[ ][ ]*/& / X } X s/^ // X } X } X } X /^DESCRIPTION$/,/^EXAMPLES$/{ X s/ */ /g X s/\. /\. /g X } X /^[A-Z][A-Z ]*:/,/^$/{ X s/ */ /g X s/\. /\. /g X } X /^$/,/^..*/{ X /^$/d X /^[]$/!i\ X X } X /^[]$/,/^.*/{ X /^[]$/d X /^$/d X /^.*$/s/^.*$/&/ X } X} X X SHAR_EOF if test 3263 -ne "`wc -c 'xlisp.ref'`" then echo shar: error transmitting "'xlisp.ref'" '(should have been 3263 characters)' fi echo shar: extracting "'xlisp.txt'" '(15230 characters)' if test -f 'xlisp.txt' then echo shar: over-writing existing file "'xlisp.txt'" fi sed 's/^X//' << \SHAR_EOF > 'xlisp.txt' XFrom sce!mitel!uunet!snorkelwacker!tut.cis.ohio-state.edu!ucbvax!hplabs!hpfcso!hpfcbig!tim Fri Feb 16 07:18:45 EST 1990 XArticle: 74 of comp.lang.lisp.x XPath: cognos!sce!mitel!uunet!snorkelwacker!tut.cis.ohio-state.edu!ucbvax!hplabs!hpfcso!hpfcbig!tim XFrom: tim@hpfcbig.SDE.HP.COM (Tim Mikkelsen) XNewsgroups: comp.lang.lisp.x XSubject: Re: intro to XLISP objects XMessage-ID: <1170005@hpfcbig.SDE.HP.COM> XDate: 12 Feb 90 16:23:48 GMT XReferences: <1170004@hpfcbig.SDE.HP.COM> XOrganization: HP SESD, Fort Collins, CO XLines: 434 X X X X X X X X X X X X X XLISP 2.0 OBJECTS PRIMER X X X by X X Tim I Mikkelsen X X X February 3, 1990 X X X X X X X X X Copyright (c) 1990 by Tim I. Mikkelsen. All Rights Reserved. X No part of this document may be copied, reproduced or translated X for commercial use without prior written consent of the author. X Permission is granted for non-commercial use as long as this X notice is left intact. X X X ________________________________________________________________ X X X One of the features in the design of XLISP is object-oriented X programming. This primer is intended to serve as a very brief X introduction to the object facilities of the XLISP 2.0 dialect X of LISP. Note that the object features of XLISP are not based X on other existing object definitions in other LISP dialects. If X you find problems in the primer, I'd appreciate hearing. X X X Tim Mikkelsen X 4316 Picadilly Drive X Fort Collins, Colorado 80526 X X X XPROGRAMMING STYLES X______________________________________________________________________________ X X XThere are many programming paradigms (models). Some of the paradigms Xare procedural, functional, rule-based, declarative and object-oriented. XA language can have aspects of one or many of these programming models. X X XProcedure-Oriented X XThe programming paradigm most people are familiar with is the procedural Xstyle. The primitives in procedural programming are: subroutines and Xdata structures. Through these primitives, programmers have some Xlimited abilities to share programs and program fragments. C and Pascal Xare examples of procedural languages. Some procedural languages (such Xas Modula and ADA) have extensions that provide for better sharing of Xcode. X X XObject-Oriented Programming X XObject-oriented programming is based on the primitives of objects, Xclasses and messages. Objects are defined in terms of classes. Actions Xoccur by sending a message to an object. An object's definition can be Xinherited from more general classes. Objective-C and C++ both are Xobject-oriented dialects of the C language. Many dialects of LISP have Xsome object oriented extension (Flavors, Common LOOPS, CLOS and others). XThere currently is standards work proceeding to add object-oriented Xprogramming to Common LISP. X X XObject Oriented Programming X XSo, the object-oriented programming model is based around the concepts Xof objects, classes and messages. An object is essentially a black box Xthat contains internal state information. You send an object a message Xwhich causes the object to perform some operation. Objects are defined Xand described through classes. X XOne aspect of an object is that you do not have to know what is inside - Xor how it works - to be able to use it. From a programming point of Xview, this is very handy. You can develop a series of objects for Xsomeone to use. If you need to change what goes on inside, the users of Xthe objects should be unaware. X XAnother aspect of objects is that of inheritance. You can build up new Xclasses from existing classes by inheriting the existing class's Xfunctionality and then extending the new definition. For example, you Xcan define a tool class (with various attributes) and then go about Xcreating object instances tool-1, tool-2, and so on. You can also Xcreate new sub-classes of the tool class like power-tool. This is also Xvery handy because you don't have to re-implement something if you can Xbuild it up from existing code. X X X X XXLISP OBJECT-ORIENTED PROGRAMMING X______________________________________________________________________________ X X X XXLISP OBJECT TERMINOLOGY X XThere are, as previously mentioned, many different languages with Xobject-oriented extensions and facilities. The terminology, operations Xand styles of these are very different. Some of the main definitions Xfor XLISP's object-oriented extensions are: X X Object data type The OBJECT DATA TYPE is a built-in data X type of XLISP. Members of the object X data type are object instances and X classes. X X Object instances An OBJECT INSTANCE is a composite X structure that contains internal state X information, methods (the code which X respond to messages), a pointer to the X object instance's defining class and a X pointer to the object's super-class. X XLISP contains no built-in object X instances. X X Class objects A CLASS OBJECT is, essentially, the X template for defining the derived object X instances. A class object, although X used differently from a simple object X instance, is structurally a member of X the object data type. It is also X contains the linking mechanism that X allows you to build class hierarchies X (sub-classes and super-classes). XLISP X contains two built-in class objects: X OBJECT and CLASS. X X Message selector The MESSAGE SELECTOR is the symbol that X is used to select a particular action X (Method) from the object. X X Message The MESSAGE is the combination of the X message selector and the data (if any) X to be sent to the object. X X Method The METHOD is the actual code that gets X executed when the object receives the X Message. X X X XSENDING MESSAGES X XThe mechanism for sending messages to XLISP objects is via the SEND Xfunction. It takes an object, a message selector and various optional Xarguments (depending on the message selector). X XThe way that a user creates a new object is to send a :NEW message to a Xpreviously defined class. The result of this SEND will return an Xobject, so this is normally preceded by a SETQ. The values shown in the Xexamples that follow may not match what you see if you try this on your Xversion of XLISP - this is not an error. The screens that are used in Xthe various examples are similar to what you should see on your computer Xscreen. The ">" is the normal XLISP prompt (the characters that follow Xthe prompt is what you should type in to try these examples). X X X ________________________________________________________________ X | X | > (setq my-object (send object :new)) X | #<Object: #2e100> X |________________________________________________________________ X X XThe object created here is of limited value. Most often, you create a Xclass object and then you create instances of that class. So in the Xfollowing example, a class called MY-CLASS is created that inherits its Xdefinition from the a built-in CLASS definition. Then two instances are Xcreated of the new class. X X ________________________________________________________________ X | X | > (setq my-class (send class :new '())) X | #<Object: #27756> X | X | > (setq my-instance (send my-class :new)) X | #<Object: #27652> X | X | > (setq another-instance (send my-class :new)) X |#<Object: #275da> X |________________________________________________________________ X X X XCLASSES X XPreviously, a :NEW message was used to create an object. The message Xused to see what is in an object is the :SHOW message. X X ________________________________________________________________ X | X | > (send my-class :show) X | Object is #<Object: #27756>, Class is #<Object: #23fe2> X | MESSAGES = NIL X | IVARS = NIL X | CVARS = NIL X | CVALS = NIL X | SUPERCLASS = #<Object: #23fd8> X | IVARCNT = 0 X | IVARTOTAL = 0 X | #<Object: #27756> X |________________________________________________________________ X X XFrom the display of the MY-CLASS object you can see there are a variety Xof components. The components of a class are: X X Class Pointer This pointer shows to what class the X object (instance or class) belongs. For X a class, this always points to the X built-in object CLASS. This is also X true of the CLASS object, its class X pointer points to itself. X X Superclass Pointer This pointer shows what the next class X up the class hierarchy is. If the user X does not specify what class is the X superclass, it will point to the X built-in class OBJECT. X X Messages This component shows what messages are X allowed for the class, and the X description of the method that will be X used. If the method is system-defined, X it will show up in the form of '#<Subr-: X #18b98>'. Remember that the class X hierarchy (through the Superclass X Pointer) is searched if the requested X message is not found in the class. X X Instance Variables This component lists what instance X variables will be created when an object X instance is created. If no instances of X the class exist, there are no Instance X Variables. If there are 5 instances of X a class, there are 5 complete and X different groups of the Instance X Variables. X X Class Variables The CLASS VARIABLES (CVAR) component X and Values lists what class variables exist within X the class. The Class Values (CVAL) X component shows what the current values X of the variables are. Class Variables X are used to hold state information about X a class. There will be |Bone of each|A X of the Class Variables, independent of X the number of instances of the class X created. X XA BETTER EXAMPLE X XThe example previously shown does work, but the class and instances Xcreated don't really do anything of interest. The following example Xsets up a tool class and creates some tool instances. X X ________________________________________________________________ X | X | > (setq my-tools (send class :new '(power moveable operation))) X | #<Object: #277a6> X | X | > (send my-tools :answer :isnew '(pow mov op) X | '((setq power pow) X | (setq moveable mov) X | (setq operation op))) X | #<Object: #277a6> X | X | > (setq drill (send my-tools :new 'AC t 'holes)) X | #<Object: #2ddbc> X | X | > (setq hand-saw (send my-tools :new 'none t 'cuts)) X | #<Object: #2dc40> X | X | > (setq table-saw (send my-tools :new 'AC nil 'cuts)) X | #<Object: #2db00> X |________________________________________________________________ X X XSo, a class of objects called MY-TOOLS was created. Note that the class Xobject MY-TOOLS was created by sending the :NEW message to the built-in XCLASS object. Within the MY-TOOL class, there are three instances Xcalled DRILL, HAND-SAW and TABLE-SAW. These were created by sending the X:NEW message to the MY-TOOLS class object. Notice that the parameters Xfollowed the message selector. X X XINSTANCES X XThe following is a display of the contents of some of the previously Xcreated instances: X X ________________________________________________________________ X | X | > (send drill :show) X | Object is #<Object: #2ddbc>, Class is #<Object: #277a6> X | POWER = AC X | MOVEABLE = T X | OPERATION = HOLES X | #<Object: #2ddbc> X | X | > (send hand-saw :show) X | Object is #<Object: #2dc40>, Class is #<Object: #277a6> X | POWER = NONE X | MOVEABLE = T X | OPERATION = CUTS X | #<Object: #2dc40> X |________________________________________________________________ X X XFrom the display of these instances you can see there are some Xcomponents and values. The components of an instance are: X X Class Pointer This pointer shows to which class the X current object instance belongs. It is X through this link that the system finds X the methods to execute for the received X messages. X X Instance Variables The Instance Variables (IVAR) component X and Values lists what variables exist within the X instance. The Instance Values component X holds what the current values of the X variables are. Instance Variables are X used to hold state information for each X instance. There will be a group of X Instance Variables for each instance. X X X X XMETHODS X XThere have been a few of the messages and methods in XLISP shown to this Xpoint (:NEW and :SHOW). The following are the methods built into XLISP: X X :ANSWER The :ANSWER method allows you to define or X change methods within a class. X X :CLASS The :CLASS method returns the class of an object. X X :ISNEW The :ISNEW method causes an instance to run its X initialization code. When the :ISNEW method is X run on a class, it resets the class state. This X allows you to re-define instance variables, X class variables, etc. X X :NEW The :NEW method allows you to create an instance X when the :NEW message is sent to a user-defined X class. The :NEW method allows you to create a X new class (when the :NEW message is sent to the X built-in CLASS). X X :SHOW The :SHOW method displays the instance or class. X X X XSENDING MESSAGES TO A SUPERCLASS X XIn addition to the SEND function, there is another function called XSEND-SUPER. The SEND-SUPER function causes the specified message to be Xperformed by the superclass method. This is a mechanism to allow Xchaining of methods in a class hierarchy. This chaining behavior can be Xachieved by creating a method for a class with the :ANSWER message. XWithin the body of the method, you include a SEND-SUPER form. This Xfunction is allowed only inside the execution of a method of an object. X X XOBJECT AND CLASS X XThe definition of the built-in class OBJECT is: X X ________________________________________________________________ X | X | > (send object :show) X | Object is #<Object: #23fd8>, Class is #<Object: #23fe2> X | MESSAGES = ((:SHOW . #<Subr-: #23db2>) X | (:CLASS . #<Subr-: #23dee>) X | (:ISNEW . #<Subr-: #23e2a>)) X | IVARS = NIL X | CVARS = NIL X | CVALS = NIL X | SUPERCLASS = NIL X | IVARCNT = 0 X | IVARTOTAL = 0 X | #<Object: #23fd8> X |________________________________________________________________ X X XNote that OBJECT is a class - as opposed to an "instance-style" object. XOBJECT has no superclass, it is the top or root of the class hierarchy. XOBJECT's class is CLASS. X X ________________________________________________________________ X | X | > (send class :show) X | Object is #<Object: #23fe2>, Class is #<Object: #23fe2> X | MESSAGES = ((:ANSWER . #<Subr-: #23e48>) X | (:ISNEW . #<Subr-: #23e84>) X | (:NEW . #<Subr-: #23ea2>)) X | IVARS = (MESSAGES IVARS CVARS CVALS SUPERCLASS X | IVARCNT IVARTOTAL) X | CVARS = NIL X | CVALS = NIL X | SUPERCLASS = #<Object: #23fd8> X | IVARCNT = 7 X | IVARTOTAL = 7 X | #<Object: #23fe2> X |________________________________________________________________ X X XCLASS has a superclass of OBJECT. It's class is itself - CLASS. X X X X SHAR_EOF if test 15230 -ne "`wc -c 'xlisp.txt'`" then echo shar: error transmitting "'xlisp.txt'" '(should have been 15230 characters)' fi # End of shell archive exit 0 -- Gary Murphy uunet!mitel!sce!cognos!garym (garym%cognos.uucp@uunet.uu.net) (613) 738-1338 x5537 Cognos Inc. P.O. Box 9707 Ottawa K1G 3N3 "There are many things which do not concern the process" - Joan of Arc