-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathreader-macros.lisp
More file actions
36 lines (25 loc) · 960 Bytes
/
Copy pathreader-macros.lisp
File metadata and controls
36 lines (25 loc) · 960 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
;;;; reader-macros
(in-package :persistent-vector)
;; constants
(defconstant +left-bracket+ #\[)
(defconstant +right-bracket+ #\])
;; vars
(defvar *previous-readtables* nil)
;; vector-reader
(defun vector-reader (stream char)
(declare (ignore char))
(let ((lst (read-delimited-list +right-bracket+ stream nil)))
`(persistent-vector::create-persistent-vector ,@lst)))
(defun no-matching-bracket (stream char)
(declare (ignore stream char))
(error "No matching [ for ]"))
;; enable/disable
(defmacro enable-reader-macros ()
`(eval-when (:compile-toplevel :load-toplevel :execute)
(push *readtable* *previous-readtables*)
(setf *readtable* (copy-readtable))
(set-macro-character +left-bracket+ 'vector-reader)
(set-macro-character +right-bracket+ 'no-matching-bracket)))
(defmacro disable-reader-macros ()
`(eval-when (:compile-toplevel :load-toplevel :execute)
(setf *readtable* (pop *previous-readtables*))))