Add (enable-template-reader), so it is easy to turn on the template reader
Annotate for file template-reader.lisp
2010-02-05 pix 1 ;;; Setting up the reader macro.
09:02:42 ' 2 (in-package "CL.EXT.DACF.UNIFICATION")
' 3
' 4 ;;; 20080711 MA:
' 5 ;;; Reverted to the old version with MAKE-LOAD-FORM added. Template
' 6 ;;; objects are created at read-time.
' 7
' 8 (defun |sharp-T-reader| (stream subchar arg)
' 9 (declare (ignore subchar arg))
' 10 (let ((spec (read stream t nil t)))
' 11 (typecase spec
' 12 (null (make-template nil spec))
' 13 (cons (make-template (first spec) spec))
' 14 (t (make-template spec spec)))))
' 15
' 16 (defmethod make-load-form ((x template) &optional env)
' 17 (make-load-form-saving-slots x :environment env))
' 18
' 19
' 20 #||
' 21 ;;; Version with more 'macro-like' behavior. The previous version
' 22 ;;; created an object at read-time, which may cause problems with
' 23 ;;; MAKE-LOAD-FORMs, constant-ness etc etc.
' 24 ;;;
' 25 ;;; 20080713 MA
' 26 ;;; Removed because it was not working well with nested templates.
' 27 ;;; Reverted to the original one plus MAKE-LOAD-FORM.
' 28
' 29 (defun |sharp-T-reader| (stream subchar arg)
' 30 (declare (ignore subchar arg))
' 31 (let ((spec (read stream t nil t)))
' 32 (typecase spec
' 33 (null `(make-template nil ',spec))
' 34 (cons `(make-template ',(first spec) ',spec))
' 35 (t `(make-template ',spec ',spec)))
' 36 ))
' 37 ||#
' 38
' 39 (eval-when (:load-toplevel :execute)
' 40 (set-dispatch-macro-character #\# #\T '|sharp-T-reader|))
' 41
' 42
' 43 #|| Useless with the read time templates and MAKE-LOAD-FORM.
' 44
' 45 (defun rewrite-template-spec (spec)
' 46 "Rewrites a template specification.
' 47 The rewriting simply makes sure that sub-templates are created as needed.
' 48 The result is either the SPEC itself or an appropriate call to LIST."
' 49
' 50 (typecase spec
' 51 (atom `',spec)
' 52 (cons (destructuring-bind (head &rest tail)
' 53 spec
' 54 (case head
' 55 (quote spec)
' 56 (make-template `(make-template ,(first tail)
' 57 ,(rewrite-template-spec (second (second tail)))))
' 58 (t `(list ',head ,@(mapcar #'rewrite-template-spec tail)))
' 59 )))
' 60 (t `',spec)))
' 61
' 62 ||#
' 63
' 64 (defmacro enable-template-reader ()
' 65 `(eval-when (:compile-toplevel :load-toplevel :execute)
' 66 (setf *readtable* (copy-readtable *readtable*))
' 67 (set-dispatch-macro-character #\# #\T '|sharp-T-reader|)))