Plaster
New
List
Login
common-lisp
default
phoe
2022.02.03 14:21:40
;; System FOO (defvar *object-types* (make-hash-table)) (defun stream-object-type (stream) (let ((tag (peek-char nil stream))) (multiple-value-bind (keyword foundp) (gethash tag *object-types*) (if foundp keyword (error "Tag ~S not found." tag))))) (defgeneric deserialize-object (object-type stream)) (defun deserialize (stream) (let ((object-type (stream-object-type stream))) (deserialize-object object-type stream))) ;;; System FOO+BAR (setf (gethash #\B *object-types*) :bar) (defmethod deserialize-object ((object (eql :bar)) stream) (let ((string (make-string 4))) (read-sequence string stream) (list :bar string))) ;;; Test CL-USER> (with-input-from-string (stream "B123") (deserialize stream)) (:BAR "B123")
Raw
Annotate
Repaste