Writing Binary Objects
Generating code to write out an instance of a binary class will proceed similarly. First you can define a write-value
generic function.
(defgeneric write-value (type stream value &key)
(:documentation "Write a value as the given type to the stream."))
Then you define a helper function that translates a define-binary-class
slot specifier into code that writes out the slot using write-value
. As with the slot->read-value
function, this helper function needs to take the name of the stream variable as an argument.
(defun slot->write-value (spec stream)
(destructuring-bind (name (type &rest args)) (normalize-slot-spec spec)
`(write-value ',type ,stream ,name ,@args)))
Now you can add a write-value
template to the define-binary-class
macro.
(defmacro define-binary-class (name slots)
(with-gensyms (typevar objectvar streamvar)
`(progn
(defclass ,name ()
,(mapcar #'slot->defclass-slot slots))
(defmethod read-value ((,typevar (eql ',name)) ,streamvar &key)
(let ((,objectvar (make-instance ',name)))
(with-slots ,(mapcar #'first slots) ,objectvar
,@(mapcar #'(lambda (x) (slot->read-value x streamvar)) slots))
,objectvar))
(defmethod write-value ((,typevar (eql ',name)) ,streamvar ,objectvar &key)
(with-slots ,(mapcar #'first slots) ,objectvar
,@(mapcar #'(lambda (x) (slot->write-value x streamvar)) slots))))))
当前内容版权归 gigamonkeys 或其关联方所有,如需对内容或内容相关联开源项目进行关注与资助,请访问 gigamonkeys .