Skip to content

Instantly share code, notes, and snippets.

@macdavid313
Last active March 26, 2024 23:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save macdavid313/551f85f134aab6a4abfc6f7bad90bd77 to your computer and use it in GitHub Desktop.
Save macdavid313/551f85f134aab6a4abfc6f7bad90bd77 to your computer and use it in GitHub Desktop.
Reading multiple lines of string in Common Lisp
(in-package #:cl-user)
(defun sharp-exclamation-mark (stream _c _arg)
(declare (ignore _c _arg))
(with-output-to-string (s)
(do ((level 1)
(prev (read-char stream) char)
(char (read-char stream)
(read-char stream)))
(())
(cond ((and (char= prev #\!) (char= char #\#))
(setq level (1- level))
(when (zerop level) (return (values)))
(setq char (read-char stream)))
((and (char= prev #\#) (char= char #\!))
(setq char (read-char stream))
(setq level (1+ level)))
(t (write-char prev s))))))
(defun enable-sharp-!-reader (&optional (rt *readtable*))
(set-dispatch-macro-character #\# #\! #'sharp-exclamation-mark rt))
(defun disable-sharp-!-reader (&optional (rt *readtable*))
(set-dispatch-macro-character #\# #\! nil rt))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment