Common Lisp Object System
# Common Lisp Object System

O Common Lisp Object System (CLOS) é uma funcionalidade de programação orientada a objeto que faz parte do ANSI Common Lisp, e consiste de um sistema de objetos dinâmicos que difere radicalmente das funcionalidades encontradas em linguagens mais estáticas como C++ or Java. O CLOS foi inspirado em sistemas de objetos Lisp mais antigos como o MIT Flavors e o CommonLOOPS, ainda que seja mais genérico. Originalmente proposto como uma funcionalidade adicional, acabou sendo adotado pela norma ANSI do Common Lisp e tem sido adaptado em outros dialetos da linguagem como EuLisp e Emacs Lisp.

## Funcionalidades

CLOS é um sistema de multimétodo, o que significa que os métodos podem ser especializados a partir dos tipos de seus argumentos. A maioria das linguagens orientadas a objeto são monométodo, o que significa que os métodos são especializados somente a partir do primeiro argumento. Métodos em CLOS são agrupados em funções genéricas; uma função genérica é uma coleção de métodos com o mesmo nome e estrutura de argumentos, diferindo somente nos tipos dos argumentos.
Assim como sistema orientados a objeto na maioria das linguagens dinâmicas, (como Python), o CLOS não impõe encapsulamento; qualquer membro pode ser acessado utilizando-se a função de acesso.
Além dos métodos normais, existem também os métodos :before, :after e :around. Eles modificam a ordem em que os métodos são executados na classe derivada. Um método :around pode especificar se um método pode ser executado.
O CLOS permite herança múltipla. Quando a ordem padrão em que os métodos são executados na herança múltipla não está correta, o programaador pode resolver o problema especificando a ordem manualmente.