Plaster
New
List
Login
common-lisp
default
anonymous
2022.10.01 11:51:44
(defvar */-handlers* (make-hash-table)) (defun read-/ (stream char n) (declare (ignore char n)) (let* ((name (read stream t nil t)) (handler (or (gethash name */-handlers*) (error "No /-handler for ~S." name)))) (peek-char t stream nil t) ;; skip space (funcall handler stream))) (set-dispatch-macro-character #\# #\/ 'read-/) (defmacro define-/-handler (name (stream) &body body) `(progn (setf (gethash ',name */-handlers*) (lambda (,stream) ,@body)) ',name)) (define-/-handler read-as-string (stream) (let* ((string-stream (make-string-output-stream)) (echo-stream (make-echo-stream stream string-stream))) (read echo-stream t nil t) (get-output-stream-string string-stream))) ;; CL-USER> (format t "(eval (read-from-string ~S)) ==> ~S" #/read-as-string (+ 1 00) (+ 1 00)) ;; (eval (read-from-string "(+ 1 00)")) ==> 1 ;; NIL ;; CL-USER> (list #/read-as-string bloop) ;; ("bloop)") ;; CL-USER> (with-input-from-string (in "hello!") ;; (with-output-to-string (out) ;; (let ((echo (make-echo-stream in out))) ;; (loop repeat 5 do (read-char echo)) ;; (unread-char (read-char echo) echo)))) ;; "hello!"
Raw
Annotate
Repaste
Edit