Pergunta
Poderia qualquer CL'er explique 'fendas' em CLOS? Eu estou encontrando dificuldades para entender a parte após o nome do slot. Isso está em:
(DEFCLASS foo () (Data1: INITARG foo))
O que o 'INITARG' e outras coisas semelhantes significa? Estou manuais de releitura. Então, eu realmente aprecio se algum de vocês aqui poderia explicar isso para um leigo como eu.
Obrigado!
Solução
O seu exemplo é um pouco errado. Tem que ser:
(defclass foo ()
((data1 :initarg foo)))
Observe o parênteses adicionado para indicar uma lista de descrições de caça-níqueis.
DEFCLASS recebe uma lista de slots. Assim, com dois slots temos:
(defclass foo ()
((data1 :initarg :data1arg
:initform (random 1.0)
:type number
:documentation "doc here"
:accessor foo-data1-acc)
(data2 :initarg :data2arg)))
DATA1 é o nome do slot. Atrás que você encontrar pares de:. Valor palavra-chave
: INITARG diz-lhe que o parâmetro para MAKE-INSTÂNCIA é. (Make-instância 'foo: data1arg 10); cria o objeto e define o data1 ranhura a 10. Normalmente, você deve usar um símbolo de palavras-chave (como: data1arg aqui).
: initForm define a ranhura por padrão, quando o objeto é criado. Como em: (Make-instância 'foo); cria o objeto. O slot está definido para o valor do initForm.
:. TYPE especifica o tipo de objeto do slot
:. A documentação é apenas uma seqüência para, bem, documentação
:. ACCESSOR especifica uma função a ler e escrever o slot
(foo-data1-acc some-foo-object-here) ; read
(setf (foo-data1-acc some-foo-object-here) 7) ; write
Note que você pode escrever os pares em qualquer ordem e que você também pode especificar várias funções de acesso. Há também: funções ESCRITOR
: leitor e.Com CLOS você pode especificar tudo o que dentro do macro DEFCLASS. Essas coisas não são gerados automaticamente como em defstruct, que tem uma notação mais curta.
A descrição do DEFCLASS está aqui: DEFCLASS . Curto CLOS Intro .
Outras dicas
Em uma especificação de caça-níqueis, a sintaxe geral é ( slot-name [ slot-opção opção de valor ] ...). A referência essencialmente-authoritatiev é a página HyperSpec em DEFCLASS , mas em suma:
: Leitor Uma função para ler o valor do slot
: escritor Uma função para escrever o valor do slot
: acessor Uma função para ambos leitura e (via SETF) definir o valor do slot
: INITARG Um símbolo para definir o valor da ranhura de MAKE-INSTÂNCIA
Há mais, mas essa lista é o de quatro Eu use (na verdade, eu principalmente usar: INITARG e um de: assessor ou: leitor).