diff --git a/code/reader.lisp b/code/reader.lisp
index ab620f8621fc9dd51c1315b20ecbff1c19c10a59..d1e0a391cee7937a7b2ea8f6966c2307beb4b961 100644
--- a/code/reader.lisp
+++ b/code/reader.lisp
@@ -5,7 +5,7 @@
 ;;; Carnegie Mellon University, and has been placed in the public domain.
 ;;;
 (ext:file-comment
-  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/reader.lisp,v 1.58 2006/02/17 21:27:06 rtoy Exp $")
+  "$Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/code/reader.lisp,v 1.59 2006/02/18 18:51:52 rtoy Exp $")
 ;;;
 ;;; **********************************************************************
 ;;;
@@ -324,6 +324,7 @@
 			    :test #'char= :key #'car))
 	  (to-dpair (find to-char (dispatch-tables to-readtable)
 			  :test #'char= :key #'car)))
+      #+nil
       (if (constituentp from-char from-readtable)
 	  (setq att (get-secondary-attribute to-char)))
       (set-cat-entry to-char att to-readtable)
@@ -332,6 +333,7 @@
 		     to-readtable)
       ;; Copy the reader macro functions too if from-char is a
       ;; dispatching macro character.
+      ;;(format t "from-dpair = ~A~%" from-dpair)
       (when from-dpair
 	(cond (to-dpair
 	       ;; The to-readtable already has a dispatching table for
@@ -820,10 +822,15 @@
      (declare (fixnum att))
      (cond ((<= att #.terminating-macro)
 	    #.delimiter)
-	   ((= att #.constituent-invalid)
-	    (%reader-error stream "invalid constituent"))
+	   ((or (< att constituent)
+		(= att multiple-escape))
+	    att)
 	   (t
-	    att))))
+	    (setf att (get-secondary-attribute ,char))
+	    (cond ((= att #.constituent-invalid)
+		   (%reader-error stream "invalid constituent"))
+		  (t
+		   att))))))
 
 ;;; return the character class for a char which might be part of a rational
 ;;; number
@@ -833,14 +840,19 @@
      (declare (fixnum att))
      (cond ((<= att #.terminating-macro)
 	    #.delimiter)
-	   ((digit-char-p ,char *read-base*)
-	    constituent-digit)
-	   ((= att constituent-digit)
-	    constituent)
-	   ((= att constituent-invalid)
-	    (%reader-error stream "invalid constituent"))
+	   ((or (< att constituent)
+		(= att multiple-escape))
+	    att)
 	   (t
-	    att))))
+	    (setf att (get-secondary-attribute ,char))
+	    (cond ((digit-char-p ,char *read-base*)
+		   constituent-digit)
+		  ((= att constituent-digit)
+		   constituent)
+		  ((= att constituent-invalid)
+		   (%reader-error stream "invalid constituent"))
+		  (t
+		   att))))))
 
 ;;; return the character class for a char which might be part of a rational or
 ;;; floating number (assume that it is a digit if it could be)
@@ -848,26 +860,31 @@
 (defmacro char-class3 (char attable)
   `(let ((att (aref ,attable (char-code ,char))))
      (declare (fixnum att))
-     (if possibly-rational
-	 (setq possibly-rational
-	       (or (digit-char-p ,char *read-base*)
-		   (= att constituent-slash))))
-     (if possibly-float
-	 (setq possibly-float
-	       (or (digit-char-p ,char 10)
-		   (= att constituent-dot))))
      (cond ((<= att #.terminating-macro)
 	    #.delimiter)
-	   ((digit-char-p ,char (max *read-base* 10))
-	     (if (digit-char-p ,char *read-base*)
-		 (if (= att #.constituent-expt)
-		     constituent-digit-or-expt
-		     constituent-digit)
-		 constituent-decimal-digit))
-	   ((= att constituent-invalid)
-	    (%reader-error stream "invalid constituent"))
+	   ((or (< att constituent)
+		(= att multiple-escape))
+	    att)
 	   (t
-	    att))))
+	    (setf att (get-secondary-attribute ,char))
+	    (when possibly-rational
+	      (setq possibly-rational
+		    (or (digit-char-p ,char *read-base*)
+			(= att constituent-slash))))
+	    (when possibly-float
+	      (setq possibly-float
+		    (or (digit-char-p ,char 10)
+			(= att constituent-dot))))
+	    (cond ((digit-char-p ,char (max *read-base* 10))
+		   (if (digit-char-p ,char *read-base*)
+		       (if (= att #.constituent-expt)
+			   constituent-digit-or-expt
+			   constituent-digit)
+		       constituent-decimal-digit))
+		  ((= att constituent-invalid)
+		   (%reader-error stream "invalid constituent"))
+		  (t
+		   att))))))