home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume10 / xlisp21 / part01 / xlisp.eg < prev    next >
Internet Message Format  |  1990-02-26  |  8KB

  1. From 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
  2. Article: 73 of comp.lang.lisp.x
  3. Path: cognos!sce!mitel!uunet!mailrus!cs.utexas.edu!tut.cis.ohio-state.edu!ucbvax!hplabs!hpfcso!hpfcbig!tim
  4. From: tim@hpfcbig.SDE.HP.COM (Tim Mikkelsen)
  5. Newsgroups: comp.lang.lisp.x
  6. Subject: Re: intro to XLISP objects
  7. Message-ID: <1170006@hpfcbig.SDE.HP.COM>
  8. Date: 12 Feb 90 16:24:20 GMT
  9. References: <1170004@hpfcbig.SDE.HP.COM>
  10. Organization: HP SESD, Fort Collins, CO
  11. Lines: 228
  12.  
  13.  
  14. A MORE REALISTIC EXAMPLE 
  15. ______________________________________________________________________________
  16.  
  17.  
  18. The following is an example, using the idea of tools again.  It contains
  19. a hierarchy of tool  classes.  The top of the class  hierarchy is TOOLS.
  20. HAND-TOOLS and SHOP-TOOLS are sub-classes of TOOLS.  The example creates
  21. instances of these  sub-classes.  It is possible to extend this  example
  22. in various ways.  One obvious  extension would be to create a third tier
  23. of classes  under  HAND-TOOLS  that could  contain  classes like drills,
  24. screwdrivers, pliers and so on.
  25.  
  26.  
  27.  
  28.  
  29. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  30. ;
  31. ;    File name:    tools.lsp
  32. ;    Author:        Tim Mikkelsen
  33. ;    Description:    Object-oriented example program
  34. ;    Language:    XLISP 2.0
  35. ;
  36. ;    Date Created:    10-Jan-1988
  37. ;    Date Updated:    2-Apr-1989
  38. ;    
  39. ;    (c) Copyright 1988, by Tim Mikkelsen, all rights reserved.
  40. ;        Permission is granted for unrestricted non-commercial use.
  41. ;
  42. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  43.  
  44. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  45. ;
  46. ;    Define the superclasses and classes
  47. ;
  48. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  49.  
  50. ;
  51. ; make TOOLS superclass
  52. ;    with a different :ISNEW method
  53. ;    added methods are :BORROW and :RETURN
  54. ;    class variables are    NUMBER        contains # of tool instances
  55. ;                ACTIVE-LIST    contains list of current objects
  56. ;    instance variables are     POWER         list - (AC BATTERY HAND)
  57. ;                MOVEABLE     CAN-CARRY or CAN-ROLL or FIXED
  58. ;                OPERATIONS    list
  59. ;                MATERIAL     list - (WOOD METAL PLASTIC ...)
  60. ;                PIECES         list
  61. ;                LOCATION    HOME or person's name
  62. ;
  63.  
  64. (setq tools (send class :new '(power 
  65.                    moveable 
  66.                    operations 
  67.                    material 
  68.                    pieces 
  69.                    location) 
  70.                  '(number active-list)))
  71. (send tools :answer :isnew '() 
  72.                    '((if (null number) (setq number 1)
  73.                                  (setq number (1+ number)))
  74.                  (setq active-list (cons self active-list))
  75.                  (setq location 'home)))
  76. (send tools :answer :borrow '(by-who)
  77.                     '((if (eq location 'home) (setq location by-who)
  78.                                      (print "you can't"))))
  79. (send tools :answer :return '()
  80.                     '((if (eq location 'home) (print "got it already")
  81.                                      (setq location 'home))))
  82.  
  83. ;
  84. ; make HAND-TOOLS class
  85. ;    with a different :ISNEW method
  86. ;    new instance variable    WEIGHT        <number> of pounds
  87. ;    the rest is inherited from TOOLS 
  88.  
  89. (setq hand-tools (send class :new '(weight) '() tools))
  90. (send hand-tools :answer :isnew '(pow op mat parts w-in)
  91.                     '((setq power pow)
  92.                       (setq moveable 'can-carry)
  93.                       (setq operations op)
  94.                       (setq material mat)
  95.                           (setq pieces parts)
  96.                       (setq weight w-in)
  97.                       (send-super :isnew)))
  98.  
  99. ;
  100. ; make SHOP-TOOLS class
  101. ;    with a different :ISNEW method
  102. ;    no new instance variables
  103. ;    the rest is inherited from TOOLS 
  104.  
  105. (setq shop-tools (send class :new '() '() tools))
  106. (send shop-tools :answer :isnew '(pow mov op mat parts)
  107.                     '((setq power pow)
  108.                      (setq moveable mov)
  109.                      (setq operations op)
  110.                      (setq material mat)
  111.                      (setq pieces parts)
  112.                      (send-super :isnew)))
  113.  
  114. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  115. ;
  116. ;    Create instances of various tool classes 
  117. ;
  118. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  119.  
  120. (setq hand-drill (send hand-tools :new         ; make an instance - HAND-DRILL
  121.                  '(ac) 
  122.                  '(drill polish grind screw)
  123.                  '(wood metal plastic)
  124.                  '(drill drill-bits screw-bits buffer)
  125.                  '2.5))
  126.  
  127. (setq table-saw (send shop-tools :new         ; make an instance - TABLE-SAW
  128.                  '(ac)
  129.                  'fixed
  130.                  '(rip cross-cut)
  131.                  '(wood plastic)
  132.                  '(saw blades fence)))
  133.  
  134.  
  135. (setq radial-arm (send shop-tools :new         ; make an instance = RADIAL-ARM
  136.                  '(ac)
  137.                  'can-roll
  138.                  '(rip cross-cut)
  139.                  '(wood plastic)
  140.                  '(saw blades dust-bag)))
  141.  
  142.  
  143. The following  session shows how to use the tool  definitions  from this
  144. better  example.  The example starts at the OS shell and brings up xlisp
  145. running the file 'tools.lsp'.
  146.  
  147.      ________________________________________________________________
  148.     |
  149.     |    cmd? xlisp tools
  150.     |    ; loading "init.lsp"
  151.     |    ; loading "tools.lsp"
  152.     |    > (send hand-drill :borrow 'fred)
  153.     |    FRED
  154.     |
  155.     |    > (send table-saw :return)
  156.     |    "got it already"
  157.     |    "got it already"
  158.     |
  159.     |    > (send hand-drill :borrow 'joe)
  160.     |    "you can't"
  161.     |    "you can't"
  162.     |
  163.     |    > (send hand-drill :return)
  164.     |    HOME
  165.     |________________________________________________________________
  166.  
  167.  
  168. So, Fred was able to borrow the HAND-DRILL.  When an attempt was made to
  169. return the  TABLE-SAW,  it was  already  at home.  A second  attempt  to
  170. borrow the HAND-DRILL  indicated that "you can't" because it was already
  171. lent out.  Lastly, the HAND-DRILL was returned successfully.  (Note that
  172. the "got it  already"  and "you  can't"  strings  show up  twice  in the
  173. display because the methods both print and return the string.)
  174.  
  175. The following session shows the structure of the TOOLS object:
  176.  
  177.      ________________________________________________________________
  178.     |
  179.     |    > (send tools :show)
  180.     |    Object is #<Object: #276fc>, Class is #<Object: #23fe2>
  181.     |      MESSAGES = ((:RETURN . #<Closure-:RETURN: #2dbd0>) 
  182.     |                (:BORROW . #<Closure-:BORROW: #2ddba>) 
  183.     |              (:ISNEW . #<Closure-:ISNEW: #274a4>))
  184.     |      IVARS = (POWER MOVEABLE OPERATIONS MATERIAL PIECES LOCATION)
  185.     |      CVARS = (NUMBER ACTIVE-LIST)
  186.     |      CVALS = #(3 (#<Object: #2cadc> 
  187.     |                 #<Object: #2cda2> 
  188.     |           #<Object: #2d0e0>))
  189.     |      SUPERCLASS = #<Object: #23fd8>
  190.     |      IVARCNT = 6
  191.     |      IVARTOTAL = 6
  192.     |    #<Object: #276fc>
  193.     |________________________________________________________________
  194.  
  195.  
  196. The two TOOLS sub-classes HAND-TOOLS and SHOP-TOOLS structure looks like:
  197.  
  198.      ________________________________________________________________
  199.     |
  200.     |    > (send hand-tools :show)
  201.     |    Object is #<Object: #2dab8>, Class is #<Object: #23fe2>
  202.     |      MESSAGES = ((:ISNEW . #<Closure-:ISNEW: #2d7a2>))
  203.     |      IVARS = (WEIGHT)
  204.     |      CVARS = NIL
  205.     |      CVALS = NIL
  206.     |      SUPERCLASS = #<Object: #276fc>
  207.     |      IVARCNT = 1
  208.     |      IVARTOTAL = 7
  209.     |    #<Object: #2dab8>
  210.     |
  211.     |    > (send shop-tools :show)
  212.     |    Object is #<Object: #2d680>, Class is #<Object: #23fe2>
  213.     |      MESSAGES = ((:ISNEW . #<Closure-:ISNEW: #2d450>))
  214.     |      IVARS = NIL
  215.     |      CVARS = NIL
  216.     |      CVALS = NIL
  217.     |      SUPERCLASS = #<Object: #276fc>
  218.     |      IVARCNT = 0
  219.     |      IVARTOTAL = 6
  220.     |    #<Object: #2d680>
  221.     |________________________________________________________________
  222.  
  223.  
  224. The class HAND-TOOLS has an instance HAND-DRILL which looks like:
  225.  
  226.      ________________________________________________________________
  227.     |
  228.     |    > (send hand-drill :show)
  229.     |    Object is #<Object: #2d0e0>, Class is #<Object: #2dab8>
  230.     |      WEIGHT = 2.5
  231.     |      POWER = (AC)
  232.     |      MOVEABLE = CAN-CARRY
  233.     |      OPERATIONS = (DRILL POLISH GRIND SCREW)
  234.     |      MATERIAL = (WOOD METAL PLASTIC)
  235.     |      PIECES = (DRILL DRILL-BITS SCREW-BITS BUFFER)
  236.     |      LOCATION = HOME
  237.     |    #<Object: #2d0e0>
  238.     |________________________________________________________________
  239.  
  240.  
  241.