1 / 32

CLOS

CLOS. CSC 358/458 6.5.2006. Outline. CLOS Basic features OO programming Examples. CLOS. Common Lisp Object System Adds object-oriented programming to Lisp OOP is a choice like C++. CLOS features. Built-in classes integrated with type system

Download Presentation

CLOS

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CLOS CSC 358/458 6.5.2006

  2. Outline • CLOS • Basic features • OO programming • Examples

  3. CLOS • Common Lisp Object System • Adds object-oriented programming to Lisp • OOP is a choice • like C++

  4. CLOS features • Built-in classes integrated with type system • User-defined classed also part of type system • Multiple inheritance • Class variables (static) and instance variables • Programmer-selected method combination • Multiple dispatch

  5. defclass • creates a new class • supply • name • superclasses • slot specifiers • class options

  6. Example (defclass boat () (capacity)) (defclass submarine (boat) (speed depth))

  7. make-instance • Creates an instance of a class • Example • (make-instance 'submarine)

  8. slot-value • Allows access to defined slot • instance variables • Example • (setf s1 (make-instance 'submarine)) • (setf (slot-value s1 'speed) 100)

  9. defmethod • Methods are defined separately from classes • Methods are specialized by the class they operate on

  10. Example (defmethod dive ((sub submarine) new-depth) (setf (slot-value sub 'depth) new-depth))

  11. Messaging Model of OOP • Most OO languages assume a message passing model • The method signature = message • Object with the method = recipient of message • But what about double-dispatch • transfer (account1, account2) • or even • equals (obj1, obj2) • We are forced to pick one object • implement method there

  12. Dispatch Model of OOP • Methods independent of objects • Methods specialized for objects • but can be specialized for multiple objects

  13. Example • For numeric types, add can be multiply defined • add (integer integer) • add (integer float) • add (float float) • add (float double) • ... etc. • In Java or C++, • a single (base) class must be privileged

  14. Multiple inheritance • Multiple inheritance is handled by listing the superclasses (defclass tarot-card (playing-card fortune-card) ...) • Standard problem • how to inherit methods • especially if the superclasses share an ancestor • Lisp • finds all applicable methods • sorts in precedence order • specific to general • left to right • (although the programmer can control this, too!) • applies as many as necessary • Standard multiple inheritance problem doesn't appear • because there can be only one method with a given dispatch signature

  15. Slot specification • slot-value is awkward • can't be compiled • defclass has slot specifications • :accessor • :reader • :writer • :initform • :initarg • :allocation • :type

  16. initform • Default initial value • Can be overridden by arguments to make-instance • Evaluated each time make-instance is called

  17. initarg • A keyword that can be passed to make-instance • Gives slot its initial value • Overrides initform

  18. Example (defclass Submarine () ((Depth :initarg :depth :initform 100) (Speed :reader Speed :initform 5))) (setq Sub-1 (make-instance 'Submarine :depth 200))

  19. Accessors • reader • Name of a function that will read the slot • writer • Name of a function that will set the slot's value • accessor • Name of a function to read and (with setf) write the slot's value

  20. Example 1 (defclass Submarine () ((Depth :reader Depth :writer Set-Depth :initform 100) (Speed :reader Speed :writer Set-Speed :initform 5))) (setq Sub-1 (make-instance 'Submarine)) (Depth Sub-1) ==> 100 (Speed Sub-1) ==> 5 (Set-Depth 200 Sub-1) (Set-Speed 4 Sub-1) (Depth Sub-1) ==> 200 (Speed Sub-1) ==> 4

  21. Example 2 (defclass Submarine () ((Depth :accessor Depth :initform 100) (Speed :accessor Speed :initform 5))) (setq Sub-1 (make-instance 'Submarine)) (Depth Sub-1) ==> 100 (Speed Sub-1) ==> 5 (setf (Depth Sub-1) 200) (setf (Speed Sub-1) 4) (Depth Sub-1) ==> 200 (Speed Sub-1) ==> 4

  22. type • Specifies the type of the argument • Can be used for optimization

  23. allocation • Specifies instance or class allocation • Instance allocation means new copy of slot for each instance • instance variable in Java • Class allocation means one copy of instance for all instances • class variable in Java • declared with "static" (yuk!)

  24. Other Class Options • documentation • doc string associated with class • default-initargs • useful for overriding initforms from superclass

  25. Example • A class for cards • A subclass for tarot cards

  26. defgeneric • Sort of like interface definition • Specify method name and argument list • Also • method-combination • argument-precedence-order

  27. Method combination • How to inherit methods? • normally evaluate most-specific method • polymorphism! • But there are other possibilities • Discounts • Supplier discount = 10% • Preferred supplier discount = an additional 2% • We might want to specify that discounts are combined rather than overridden • in Java, must call super.method directly

  28. In CLOS (defgeneric get-discount (firm) (:method-combination +)) (defclass supplier () ((discount :initform 10))) (defmethod get-discount + ((firm supplier)) (slot-value firm 'discount)) (defclass preferred-supplier (supplier) ()) (defmethod get-discount + ((firm preferred-supplier)) 2)

  29. Method Combination • Specify type of method combination in generic function • Each method is marked with its combination method • Methods are called from least to most-specific • Combination methods • progn, +, list, and, or, max, min, append and nconc

  30. Example • Building a deck • standard-deck • tarot-deck has a deck built the same way • plus additional ones • Combine methods with append

  31. Example • Alternative • :around method • call-next-method

  32. Example • Implementing gin with objects

More Related