문제
Cl'er가 Clos에서 '슬롯'을 설명해 주시겠습니까? 슬롯 이름 뒤에 부분을 이해하기가 어렵다는 것을 알게되었습니다. 그게 :
(defclass foo () (data1 : initarg foo)))
'initarg'와 다른 비슷한 것들은 무엇을 의미합니까? 나는 매뉴얼을 다시 읽고있다. 그래서, 여기 당신이 나와 같은 평신도에게 설명 할 수 있다면 정말 감사하겠습니다.
감사!
해결책
당신의 예는 약간 잘못되었습니다. 그건 그래야만 해:
(defclass foo ()
((data1 :initarg foo)))
슬롯 설명 목록을 표시하기 위해 추가 괄호 안에 주목하십시오.
Defclass는 슬롯 목록을 가져옵니다. 그래서 우리는 두 개의 슬롯으로 다음과 같습니다.
(defclass foo ()
((data1 :initarg :data1arg
:initform (random 1.0)
:type number
:documentation "doc here"
:accessor foo-data1-acc)
(data2 :initarg :data2arg)))
Data1은 슬롯의 이름입니다. 그 뒤에는 키워드 값의 쌍을 찾습니다.
: Initarg는 Make-Instance의 매개 변수가 무엇인지 알려줍니다. (make-instance 'foo : data1arg 10); 객체를 생성하고 슬롯 데이터 1을 10으로 설정합니다. 일반적으로 키워드 기호 (예 : Data1arg)를 사용해야합니다.
: initform 객체가 생성 될 때 기본적으로 슬롯을 설정합니다. 처럼 : (Make-Instance 'foo); 객체를 만듭니다. 슬롯은 initform의 값으로 설정됩니다.
: type 슬롯 객체의 유형을 지정합니다.
: 문서는 문서화를위한 문자열 일뿐입니다.
: 액세서는 슬롯을 읽고 쓸 수있는 함수를 지정합니다.
(foo-data1-acc some-foo-object-here) ; read
(setf (foo-data1-acc some-foo-object-here) 7) ; write
어떤 순서로든 쌍을 쓸 수 있으며 여러 액세서 기능을 지정할 수도 있습니다. 독자와 : 작가 기능도 있습니다.
Clos를 사용하면 Defclass 매크로 내의 모든 것을 지정할 수 있습니다. 이러한 것들은 Defstruct에서와 같이 자동으로 생성되지 않으며, 이는 더 짧은 표기법이 있습니다.
다른 팁
슬롯 사양에서 일반 구문은 다음과 같습니다.슬롯-이름 [슬롯 옵션 옵션 값] ...). 본질적으로 인증 된 참조는 다음과 같습니다 Defclass의 Hyperspec 페이지, 간단히 말해서 :
:리더 슬롯 값을 읽는 함수
:작가 슬롯 값을 작성하는 함수
: 액세서 읽기 및 (세트를 통해) 슬롯의 값을 설정하는 함수
: initarg Make-Instance에서 슬롯의 값을 설정하는 기호
더 많은 것이 있지만 그 목록은 내가 주로 사용하는 4 가지입니다 (실제로는 주로 사용합니다 : initarg와 하나의 액세서 또는 독자).