(defpackage #:custom-string-reader (:use #:common-lisp) (:local-nicknames (#:nr #:named-readtables)) (:export #:custom-string-reader)) (in-package #:custom-string-reader) (defun custom-string-reader (stream char) (declare (ignore char)) (loop with result = (make-array 0 :element-type 'character :fill-pointer 0 :adjustable t) for char = (read-char stream t nil t) do (case char ((#\|) (vector-push-extend (read-char stream t nil t) result)) ((#\") (return result)) (t (vector-push-extend char result))))) (nr:defreadtable custom-string-reader (:merge :standard) (:macro-char #\" #'custom-string-reader t)) CL-USER> (named-readtables:in-readtable custom-string-reader:custom-string-reader) # CL-USER> "foo|\bar" "foo\\bar"