(eval-when (:compile-toplevel :load-toplevel :execute)
(defparameter *saved-readtable* (copy-readtable))
-(defparameter *meta-readtable* (copy-readtable))
-
-(defun meta-reader (s c) (make-meta :char c :form (read s)))
+(defparameter *meta-readtable* (copy-readtable)))
+(defun meta-reader (s c)
+ (make-meta :char c :form (read s)))
+(defun meta-curly-bracket (s c)
+ (make-meta :char c :form (read-delimited-list #\} s t)))
+(defun meta-square-bracket (s c)
+ (make-meta :char c :form (read-delimited-list #\] s t)))
(mapc #'(lambda (c) (set-macro-character c #'meta-reader nil *meta-readtable*)) '(#\@ #\$ #\!))
-(set-macro-character #\{
- #'(lambda (s c) (make-meta :char c :form (read-delimited-list #\} s t))) nil *meta-readtable*)
+(set-macro-character #\{ #'meta-curly-bracket nil *meta-readtable*)
+(set-macro-character #\[ #'meta-square-bracket nil *meta-readtable*)
+(mapc #'(lambda (c) (set-macro-character c (get-macro-character #\)) nil *meta-readtable*))
+ '(#\] #\}))
-(set-macro-character #\[
- #'(lambda (s c) (make-meta :char c :form (read-delimited-list #\] s t))) nil *meta-readtable*)
+(defreadtable :meta-mixin
+ (:macro-char #\[ #'meta-square-bracket)
+ (:syntax-from :standard #\) #\])
+ (:macro-char #\[ #'meta-curly-bracket)
+ (:syntax-from :standard #\) #\})
+ (:macro-char #\@ #'meta-reader)
+ (:macro-char #\$ #'meta-reader)
+ (:macro-char #\! #'meta-reader))
-(mapc #'(lambda (c) (set-macro-character c (get-macro-character #\)) nil *meta-readtable*))
- '(#\] #\})))
+(defreadtable :meta
+ (:fuze :standard :meta))
(defmacro with-stream-meta ((source-symbol stream) &body body)
`(let ((,source-symbol ,stream))
,@body)))
(defun enable-meta-syntax ()
- (copy-readtable *meta-readtable* *readtable*))
+ (setf *readtable* *meta-readtable*))
(defun disable-meta-syntax()
- (copy-readtable *saved-readtable* *readtable*))
+ (setf *readtable* *saved-readtable*))
(provide 'meta)