Plaster

common-lisp
(defstruct unknown-symbol package name colons) (defmethod print-object ((object unknown-symbol) stream) (print-unreadable-object (object stream :type t) (princ (unknown-symbol-package object) stream) (dotimes (i (unknown-symbol-colons object)) (write-char #\: stream)) (princ (unknown-symbol-name object) stream))) (defclass my-client () ()) (defmethod eclector.reader:interpret-symbol ((client my-client) input-stream package-indicator symbol-name internp) (restart-case (call-next-method) (eclector.reader:recover () :report "Return an unknown symbol structure." (make-unknown-symbol :package (string package-indicator) :name symbol-name :colons (if internp 2 1))))) (defun test (string) (let ((eclector.reader:*client* (make-instance 'my-client))) (handler-bind ((eclector.reader:package-does-not-exist #'eclector.reader:recover)) (eclector.reader:read-from-string string)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CL-USER> (test "(foo:bar)") (#<UNKNOWN-SYMBOL FOO:BAR>) 9 CL-USER> (test "(foo::bar)") (#<UNKNOWN-SYMBOL FOO::BAR>) 10