オブジェクトのデータ構造はクラスによって定義され、そして、それらの動作は クラス内のメソッドに定義されている。 EusLispにおいて、数ダースのクラスが図に書かれているように 木構造化された継承のなかにすでに定義されている。 class-hierarchy関数を用いれば、実際の継承構造を見ることができる。 左端のクラスobjectは、EusLisp内の全てのクラスの根幹となるスーパークラスである。 ユーザーが定義したクラスは、これらの内部クラスのどれでも継承することができる。
クラスは、defclassマクロかdefstructマクロで定義される。
(defclass class-name &key :super class
:slots ()
:metaclass metaclass
:element-type t
:size -1
)
(defstruct struct-name slots...)
(defstruct (struct-name [struct-options ...])
(slot-name1 [slot-option...])
(slot-name2 [slot-option...])
...)
メソッドは、defmethodにより定義される。 defmethodは、特定のクラスについて何度でも存在することができる。
(defmethod class-name
(:method-name1 (parameter...) . body1)
(:method-name2 (parameter...) . body2)
...)
内部クラスにおけるfield定義は、大部分が *eusdir*/c/eus.hのヘッダーファイルの中にある。
クラスは、(describe)関数によりクラス内の全てのスロット、 名前、スーパークラス、スロット名、スロット型、メソッドリスト、 などを表示することができる。 内部クラスの定義は次の通りである。 クラスobjectはスーパークラスを持たないため、このスーパークラスはNILである。
(defclass object :super NIL :slots ())
(defclass cons :super object :slots (car cdr))
(defclass propertied-object :super object
:slots (plist)) ;property list
(defclass symbol :super propertied-object
:slots (value ;specially bound value
vtype ;const(0),var(1),special(2)
function ;global func def
pname ;print name string
homepkg)) ;home package
(defclass foreign-pod :super symbol
:slots (podcode ;entry code
paramtypes ;type of arguments
resulttype))
(defclass package :super propertied-object
:slots (names ;list of package name and nicknames
uses ;spread use-package list
symvector ;hashed obvector
symcount ;number of interned symbols
intsymvector ;hashed obvector of internal symbols
intsymcount ;number of interned internal symbols
shadows ;shadowed symbols
used-by)) ;packages using this package
(defclass stream :super propertied-object
:slots (direction ;:input or :output, nil if closed
buffer ;buffer string
count ;current character index
tail)) ;last character index
(defclass file-stream :super stream
:slots (fd ;file descriptor (integer)
fname)) ;file name str; qid for msgq
(defclass broadcast-stream :super stream
:slots (destinations)) ;streams to which output is elivered
(defclass io-stream :super propertied-object
:slots (instream outstream))
(defclass socket-stream :super io-stream
:slots (address)) ; socket address
(defclass read-table :super propertied-object
:slots (syntax ; byte vector representing character types
; 0:illegal, 1:white, 2:comment, 3:macro
; 4:constituent, 5:single_escape
; 6:multi_escape, 7:term_macro, 8:nonterm_macro
macro ;character macro expansion function
dispatch-macro))
(defclass array :super propertied-object
:slots (entity ;simple vector storing array entity
rank ;number of dimensions: 0-7
fillpointer ;pointer to push next element
offset ;offset for displaced array
dim0,dim1,dim2,dim3,dim4,dim5,dim6)) ;dimensions
(defclass metaclass :super propertied-object
:slots (name ;class name symbol
super ;super class
cix ;class id
vars ;var name vector including inherited vars
types ;type vector of object variables
forwards ;components to which messages are forwarded
methods)) ;method list
(defclass vectorclass :super metaclass
:slots (element-type ;vector element type 0-7
size)) ;vector size; 0 if unspecified
(defclass cstructclass :super vectorclass
:slots (slotlist)) ;cstruct slot descriptors
(defclass vector :super object :slots (size))
(defclass float-vector :super vector :element-type :float)
(defclass string :super vector :element-type :char)
(defclass hash-table :super propertied-object
:slots (lisp::key ;hashed key vector
value ; value vector
size ; the size of the hash table
count ; number of elements entered in the table
lisp::hash-function
lisp::test-function
lisp::rehash-size
lisp::empty lisp::deleted ))
(defclass pathname :super propertied-object
:slots (lisp::host device ; not used
directory ; list of directories
name ; file name before the last "."
type ; type field after the last "."
lisp::version)) ; not used
(defclass label-reference ;for reading #n=, #n# objects
:super object
:slots (label value unsolved next))
(defclass compiled-code :super object
:slots (codevector
quotevector
type ;0=func, 1=macro, 2=special
entry)) ;entry offset
(defclass closure :super compiled-code
:slots (env1 env2));environment
(defclass foreign-code :super compiled-code
:slots (paramtypes ;list of parameter types
resulttype)) ;function result type
(defclass load-module :super compiled-code
:slots (symbol-table ;hashtable of symbols defined
object-file ;name of the object file loaded, needed for unloadin
handle)) ;file handle returned by ''dlopen''
2016-04-05