diff --git a/meta-src.lisp b/meta-src.lisp index db5d73fde02dc790ac71c10559f888f6fa4f1a3e..ae14415e70474a3ebb2c4355cb982796d17e98e7 100644 --- a/meta-src.lisp +++ b/meta-src.lisp @@ -147,21 +147,33 @@ (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)) @@ -193,10 +205,10 @@ ,@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) diff --git a/meta.asd b/meta.asd index fa0066e4771c785e30c7abd96ccb38aaa1bd28ec..749a1a06948f5ca2798bcdcfa7f4eb7741ac671c 100644 --- a/meta.asd +++ b/meta.asd @@ -3,5 +3,6 @@ (defsystem :meta :description "META syntax to easily write parsers" :long-description "META syntax to easily write parsers, as per Henry G. Baker's Prag-Parse article" + :depends-on (:named-readtables) :components ((:file "package") (:file "meta-src" :depends-on ("package")))) diff --git a/package.lisp b/package.lisp index f7350856f0cea3768cc3e1c90b5b0143ddbfa692..6c26009d7bc3e6f3507c21723d00fc614006a28b 100644 --- a/package.lisp +++ b/package.lisp @@ -5,7 +5,7 @@ (in-package :cl-user) (defpackage :meta - (:use #:common-lisp) + (:use #:common-lisp #:named-readtables) (:export #:with-string-meta #:with-list-meta #:with-stream-meta