fbpx
Wikipedia

Common Lisp Object System

The Common Lisp Object System (CLOS) is the facility for object-oriented programming in ANSI Common Lisp. CLOS is a powerful dynamic object system which differs radically from the OOP facilities found in more static languages such as C++ or Java. CLOS was inspired by earlier Lisp object systems such as MIT Flavors and CommonLoops, although it is more general than either. Originally proposed as an add-on, CLOS was adopted as part of the ANSI standard for Common Lisp and has been adapted into other Lisp dialects such as EuLisp or Emacs Lisp.[1]

Standard method combination in ANSI common lisp

Features edit

The basic building blocks of CLOS are methods, classes, instances of those classes, and generic functions. CLOS provides macros to define those: defclass, defmethod, and defgeneric. Instances are created with the method make-instance.

Classes can have multiple superclasses, a list of slots (member variables in C++/Java parlance) and a special metaclass. Slots can be allocated by class (all instances of a class share the slot) or by instance. Each slot has a name and the value of a slot can be accessed by that name using the function slot-value. Additionally special generic functions can be defined to write or read values of slots. Each slot in a CLOS class must have a unique name.

CLOS is a multiple dispatch system. This means that methods can be specialized upon any or all of their required arguments. Most OO languages are single-dispatch, meaning that methods are only specialized on the first argument. Another unusual feature is that methods do not "belong" to classes; classes do not provide a namespace for generic functions or methods. Methods are defined separately from classes, and they have no special access (e.g. "this", "self", or "protected") to class slots.

Methods in CLOS are grouped into generic functions. A generic function is an object which is callable like a function and which associates a collection of methods with a shared name and argument structure, each specialized for different arguments. Since Common Lisp provides non-CLOS classes for structures and built-in data types (numbers, strings, characters, symbols, ...), CLOS dispatch works also with these non-CLOS classes. CLOS also supports dispatch over individual objects (eql specializers). CLOS does not by default support dispatch over all Common Lisp data types (for example dispatch does not work for fully specialized array types or for types introduced by deftype). However, most Common Lisp implementations provide a metaobject protocol which allows generic functions to provide application specific specialization and dispatch rules.

Dispatch in CLOS is also different from most OO languages:

  1. Given a list of arguments, a list of applicable methods is determined.
  2. This list is sorted according to the specificity of their parameter specializers.
  3. Selected methods from this list are then combined into an effective method using the method combination used by the generic function.
  4. The effective method is then called with the original arguments.

This dispatch mechanism works at runtime. Adding or removing methods thus may lead to changed effective methods (even when the generic function is called with the same arguments) at runtime. Changing the method combination also may lead to different effective methods.

For example,

; Declare the common argument structure prototype. (defgeneric f (x y)) ; Define an implementation for (f integer y), where y matches all types. (defmethod f ((x integer) y)  1) (f 1 2.0) => 1 ; Define an implementation for (f integer real). (defmethod f ((x integer) (y real))  2) (f 1 2.0) => 2 ;Dispatch changed at runtime. 

Like the OO systems in most dynamic languages, CLOS does not enforce encapsulation. Any slot can be accessed using the slot-value function or via (optionally auto-generated) accessor methods. To access it via slot-value you have to know the name of the slot. CL programmers use the language's package facility to declare which functions or data structures are intended for export.

Apart from normal ("primary") methods, there also are :before, :after, and :around "auxiliary" methods. The former two are invoked prior to, or after the primary method, in a particular order based on the class hierarchy. An :around method can control whether the primary method is executed at all. Additionally, the programmer can specify whether all possible primary methods along the class hierarchy should be called or just the one providing the closest match.

The Standard Method-Combination provides the primary, before, after and around methods explained above. There are other Method-Combinations with other method types. New (both simple and complex) Method-Combinations and method types can be defined.

CLOS allows multiple inheritance. When the default order in which methods are executed in multiple inheritance is not correct, the programmer may resolve the diamond inheritance problems by specifying the order of method combinations.

CLOS is dynamic, meaning that not only the contents, but also the structure of its objects can be modified at runtime. CLOS supports changing class definitions on-the-fly (even when instances of the class in question already exist) as well as changing the class membership of a given instance through the change-class operator. CLOS also allows one to add, redefine and remove methods at runtime. The Circle-Ellipse Problem is readily solved in CLOS, and most OOP design patterns either disappear or are qualitatively simpler.[2]

CLOS is not a prototype language: classes must be defined before objects can be instantiated as members of that class.

Metaobject Protocol edit

Outside of the ANSI Common Lisp standard, there is a widely implemented extension to CLOS called the Metaobject Protocol (MOP). The MOP defines a standard interface to the underpinnings of the CLOS implementation, treating classes, slot-descriptions, generic-functions and methods themselves as instances of metaclasses, and allows the definition of new metaclasses and the modification of all CLOS behavior. The flexibility of the CLOS MOP prefigures aspect-oriented programming, which was later developed by some of the same engineers, such as Gregor Kiczales. The MOP defines the behavior of the whole object system by a set of protocols. These are defined in terms of CLOS. Thus it is possible to create new object-systems by extending or changing the provided CLOS functionality. The book The Art of the Metaobject Protocol describes the use and implementation of the CLOS MOP.

The various Common Lisp implementations have slightly different support for the Meta-Object Protocol. The Closer[3] project aims to provide the missing features.

Influences from older Lisp-based object systems edit

Flavors (and its successor New Flavors) was the object system on the MIT Lisp Machine. Large parts of the Lisp Machine operating systems and many applications for it use Flavors or New Flavors. Flavors introduced multiple inheritance and mixins, among other features. Flavors is mostly obsolete, though implementations for Common Lisp do exist. Flavors was using the message passing paradigm. New Flavors introduced generic functions.

CommonLoops was the successor of LOOPS (from Xerox Interlisp-D). CommonLoops was implemented for Common Lisp. A portable implementation called Portable CommonLoops (PCL) was the first implementation of CLOS. PCL is widely ported and still provides the base for the CLOS implementation of several Common Lisp implementations. PCL is implemented mostly in portable Common Lisp with only a few system dependent parts.

CLOS in other programming languages edit

Because of the power and expressivity of CLOS, as well as the historical availability of Tiny CLOS (a simplified portable CLOS implementation written by Gregor Kiczales for use with Scheme), CLOS-like MOP-based object systems have become the de facto norm in most Lisp dialect implementations, as well as finding their way into some other languages' OOP facilities:

  • COS, the C Object System[4]
  • Dylan
  • Dynace, a (largely) CLOS implementation in C[5]
  • EIEIO for Emacs Lisp
  • Gauche, Scheme with CLOS
  • GOOPS in GNU Guile
  • ILOS in ISLISP
  • Meroon, an Object System in Scheme
  • Sagittarius, a Scheme with CLOS
  • ScmObj, for Scheme
  • SOS for MIT Scheme
  • STklos, a Scheme with CLOS
  • Swindle in Racket
  • COOPS in Chicken Scheme
  • VCLOS for Skill[6]
  • Tiny CLOS[7]
  • S4 classes in S and R programming languages

Further reading edit

  • Bobrow, Daniel G.; Kahn, Kenneth; Kiczales, Gregor; Masinter, Larry; Stefik, Mark; Zdybel, Frank (June 1986). (PDF). Conference proceedings on Object-oriented Programming Systems Languages and Applications. OOPSLA '86. pp. 17–29. doi:10.1145/28697.28700. ISBN 978-0-89791-204-4. S2CID 62631315. Archived from the original (PDF) on 2022-08-17. Retrieved 2022-03-17.
  • Veitch, Jim (1998). "A History and Description of CLOS". In Salus, Peter H. (ed.). Handbook of Programming Languages, Volume IV: Functional and Logic Programming Languages (1st ed.). Macmillan Technical Publishing. pp. 107–158. ISBN 1-57870-011-6.

References edit

  1. ^ "CLOS is a standard. Multiple vendors supply CLOS. CLOS (or parts of it) is being used to add object-orientation to other Lisp dialects such as EuLisp or Emacs Lisp." p. 110 of Veitch 1998
  2. ^ In the Design Patterns in Dynamic Languages slides, Peter Norvig presents his findings that 16 out of 23 design patterns taken from various textbooks are either "invisible or simpler" in Dylan or Common Lisp than in C++.
  3. ^ Closer Project: Closer to MOP
  4. ^ Deniau, Laurent (12 March 2010). The C Object System: Using C as a High-Level Object-Oriented Language (PDF). arXiv:1003.2547. CiteSeerX 10.1.1.763.7946. Retrieved 2022-03-17.
  5. ^ Dynace Object Oriented Extension To C
  6. ^ Newton, Jim; Rhodes, Christophe (28 November 2008). "Custom Specializers in Object-Oriented Lisp". Journal of Universal Computer Science. 14 (20): 3370–3388. CiteSeerX 10.1.1.523.2413. doi:10.3217/jucs-014-20-3370. S2CID 12032836. Retrieved 2022-03-17.
  7. ^ Tiny CLOS, developed by Gregor Kiczales

Literature edit

common, lisp, object, system, other, uses, clos, disambiguation, clos, facility, object, oriented, programming, ansi, common, lisp, clos, powerful, dynamic, object, system, which, differs, radically, from, facilities, found, more, static, languages, such, java. For other uses see Clos disambiguation The Common Lisp Object System CLOS is the facility for object oriented programming in ANSI Common Lisp CLOS is a powerful dynamic object system which differs radically from the OOP facilities found in more static languages such as C or Java CLOS was inspired by earlier Lisp object systems such as MIT Flavors and CommonLoops although it is more general than either Originally proposed as an add on CLOS was adopted as part of the ANSI standard for Common Lisp and has been adapted into other Lisp dialects such as EuLisp or Emacs Lisp 1 Standard method combination in ANSI common lisp Contents 1 Features 2 Metaobject Protocol 3 Influences from older Lisp based object systems 4 CLOS in other programming languages 5 Further reading 6 References 7 LiteratureFeatures editThe basic building blocks of CLOS are methods classes instances of those classes and generic functions CLOS provides macros to define those defclass defmethod and defgeneric Instances are created with the method make instance Classes can have multiple superclasses a list of slots member variables in C Java parlance and a special metaclass Slots can be allocated by class all instances of a class share the slot or by instance Each slot has a name and the value of a slot can be accessed by that name using the function slot value Additionally special generic functions can be defined to write or read values of slots Each slot in a CLOS class must have a unique name CLOS is a multiple dispatch system This means that methods can be specialized upon any or all of their required arguments Most OO languages are single dispatch meaning that methods are only specialized on the first argument Another unusual feature is that methods do not belong to classes classes do not provide a namespace for generic functions or methods Methods are defined separately from classes and they have no special access e g this self or protected to class slots Methods in CLOS are grouped into generic functions A generic function is an object which is callable like a function and which associates a collection of methods with a shared name and argument structure each specialized for different arguments Since Common Lisp provides non CLOS classes for structures and built in data types numbers strings characters symbols CLOS dispatch works also with these non CLOS classes CLOS also supports dispatch over individual objects eql specializers CLOS does not by default support dispatch over all Common Lisp data types for example dispatch does not work for fully specialized array types or for types introduced by deftype However most Common Lisp implementations provide a metaobject protocol which allows generic functions to provide application specific specialization and dispatch rules Dispatch in CLOS is also different from most OO languages Given a list of arguments a list of applicable methods is determined This list is sorted according to the specificity of their parameter specializers Selected methods from this list are then combined into an effective method using the method combination used by the generic function The effective method is then called with the original arguments This dispatch mechanism works at runtime Adding or removing methods thus may lead to changed effective methods even when the generic function is called with the same arguments at runtime Changing the method combination also may lead to different effective methods For example Declare the common argument structure prototype defgeneric f x y Define an implementation for f integer y where y matches all types defmethod f x integer y 1 f 1 2 0 gt 1 Define an implementation for f integer real defmethod f x integer y real 2 f 1 2 0 gt 2 Dispatch changed at runtime Like the OO systems in most dynamic languages CLOS does not enforce encapsulation Any slot can be accessed using the slot value function or via optionally auto generated accessor methods To access it via slot value you have to know the name of the slot CL programmers use the language s package facility to declare which functions or data structures are intended for export Apart from normal primary methods there also are before after and around auxiliary methods The former two are invoked prior to or after the primary method in a particular order based on the class hierarchy An around method can control whether the primary method is executed at all Additionally the programmer can specify whether all possible primary methods along the class hierarchy should be called or just the one providing the closest match The Standard Method Combination provides the primary before after and around methods explained above There are other Method Combinations with other method types New both simple and complex Method Combinations and method types can be defined CLOS allows multiple inheritance When the default order in which methods are executed in multiple inheritance is not correct the programmer may resolve the diamond inheritance problems by specifying the order of method combinations CLOS is dynamic meaning that not only the contents but also the structure of its objects can be modified at runtime CLOS supports changing class definitions on the fly even when instances of the class in question already exist as well as changing the class membership of a given instance through the change class operator CLOS also allows one to add redefine and remove methods at runtime The Circle Ellipse Problem is readily solved in CLOS and most OOP design patterns either disappear or are qualitatively simpler 2 CLOS is not a prototype language classes must be defined before objects can be instantiated as members of that class Metaobject Protocol editOutside of the ANSI Common Lisp standard there is a widely implemented extension to CLOS called the Metaobject Protocol MOP The MOP defines a standard interface to the underpinnings of the CLOS implementation treating classes slot descriptions generic functions and methods themselves as instances of metaclasses and allows the definition of new metaclasses and the modification of all CLOS behavior The flexibility of the CLOS MOP prefigures aspect oriented programming which was later developed by some of the same engineers such as Gregor Kiczales The MOP defines the behavior of the whole object system by a set of protocols These are defined in terms of CLOS Thus it is possible to create new object systems by extending or changing the provided CLOS functionality The book The Art of the Metaobject Protocol describes the use and implementation of the CLOS MOP The various Common Lisp implementations have slightly different support for the Meta Object Protocol The Closer 3 project aims to provide the missing features Influences from older Lisp based object systems editFlavors and its successor New Flavors was the object system on the MIT Lisp Machine Large parts of the Lisp Machine operating systems and many applications for it use Flavors or New Flavors Flavors introduced multiple inheritance and mixins among other features Flavors is mostly obsolete though implementations for Common Lisp do exist Flavors was using the message passing paradigm New Flavors introduced generic functions CommonLoops was the successor of LOOPS from Xerox Interlisp D CommonLoops was implemented for Common Lisp A portable implementation called Portable CommonLoops PCL was the first implementation of CLOS PCL is widely ported and still provides the base for the CLOS implementation of several Common Lisp implementations PCL is implemented mostly in portable Common Lisp with only a few system dependent parts CLOS in other programming languages editBecause of the power and expressivity of CLOS as well as the historical availability of Tiny CLOS a simplified portable CLOS implementation written by Gregor Kiczales for use with Scheme CLOS like MOP based object systems have become the de facto norm in most Lisp dialect implementations as well as finding their way into some other languages OOP facilities COS the C Object System 4 Dylan Dynace a largely CLOS implementation in C 5 EIEIO for Emacs Lisp Gauche Scheme with CLOS GOOPS in GNU Guile ILOS in ISLISP Meroon an Object System in Scheme Sagittarius a Scheme with CLOS ScmObj for Scheme SOS for MIT Scheme STklos a Scheme with CLOS Swindle in Racket COOPS in Chicken Scheme VCLOS for Skill 6 Tiny CLOS 7 S4 classes in S and R programming languagesFurther reading editBobrow Daniel G Kahn Kenneth Kiczales Gregor Masinter Larry Stefik Mark Zdybel Frank June 1986 CommonLoops Merging Lisp and Object Oriented Programming PDF Conference proceedings on Object oriented Programming Systems Languages and Applications OOPSLA 86 pp 17 29 doi 10 1145 28697 28700 ISBN 978 0 89791 204 4 S2CID 62631315 Archived from the original PDF on 2022 08 17 Retrieved 2022 03 17 Veitch Jim 1998 A History and Description of CLOS In Salus Peter H ed Handbook of Programming Languages Volume IV Functional and Logic Programming Languages 1st ed Macmillan Technical Publishing pp 107 158 ISBN 1 57870 011 6 References edit CLOS is a standard Multiple vendors supply CLOS CLOS or parts of it is being used to add object orientation to other Lisp dialects such as EuLisp or Emacs Lisp p 110 of Veitch 1998 In the Design Patterns in Dynamic Languages slides Peter Norvig presents his findings that 16 out of 23 design patterns taken from various textbooks are either invisible or simpler in Dylan or Common Lisp than in C Closer Project Closer to MOP Deniau Laurent 12 March 2010 The C Object System Using C as a High Level Object Oriented Language PDF arXiv 1003 2547 CiteSeerX 10 1 1 763 7946 Retrieved 2022 03 17 Dynace Object Oriented Extension To C Newton Jim Rhodes Christophe 28 November 2008 Custom Specializers in Object Oriented Lisp Journal of Universal Computer Science 14 20 3370 3388 CiteSeerX 10 1 1 523 2413 doi 10 3217 jucs 014 20 3370 S2CID 12032836 Retrieved 2022 03 17 Tiny CLOS developed by Gregor KiczalesLiterature editSonya Keene Object Oriented Programming in Common Lisp A Programmer s Guide to CLOS 1988 Addison Wesley ISBN 0 201 17589 4 Gregor Kiczales Jim des Rivieres and Daniel G Bobrow The Art of the Metaobject Protocol 1991 MIT Press ISBN 0 262 61074 4 Jo A Lawless and Molly M Miller Understanding CLOS the Common Lisp Object System 1991 Digital Press ISBN 1 55558 064 5 Andreas Paepcke Object Oriented Programming the CLOS Perspective 1993 The MIT Press ISBN 0 262 16136 2 The Common Lisp Object System An Overview by Richard P Gabriel and Linda DeMichiel provides a good introduction to the motivation for defining classes by means of generic functions Fundamentals of CLOS by Nick Levine provides a step by step exposure to the implementation of OO concepts in CLOS and how to utilize them It is intended for anybody with a basic knowledge of Lisp or Scheme Common Lisp HyperSpec Chapter 7 Objects Retrieved from https en wikipedia org w index php title Common Lisp Object System amp oldid 1222052832, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.