1 ;;; Setting up the reader macro. 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|)))