diff --git a/changelog b/changelog
index 0a7fe92..dd95712 100644
--- a/changelog
+++ b/changelog
@@ -1,7 +1,9 @@
-20082016 wxh src/interp/i-intern.boot use hashtable to speedup compiles
-20082016 wxh src/interp/g-util.boot use hashtable to speedup compiles
-20082016 wxh src/interp/compiler.boot use hashtable to speedup compiles
-20082016 wxh src/interp/category.boot use hashtable to speedup compiles
+20080217 tpd src/algebra/string.spad add function examples
+20080217 tpd src/algebra/curve.spad add function examples
+20080216 wxh src/interp/i-intern.boot use hashtable to speedup compiles
+20080216 wxh src/interp/g-util.boot use hashtable to speedup compiles
+20080216 wxh src/interp/compiler.boot use hashtable to speedup compiles
+20080216 wxh src/interp/category.boot use hashtable to speedup compiles
 20080215 tpd src/interp/format.boot add )d op documentation
 20080215 tpd src/algebra/plot add comment documentation
 20080210 tpd src/algebra/Makefile add plot help and input files for plot
diff --git a/src/algebra/curve.spad.pamphlet b/src/algebra/curve.spad.pamphlet
index 5ca9495..6128b6b 100644
--- a/src/algebra/curve.spad.pamphlet
+++ b/src/algebra/curve.spad.pamphlet
@@ -36,14 +36,43 @@ FunctionFieldCategory(F, UP, UPUP): Category == Definition where
     numberOfComponents     : () -> NonNegativeInteger
       ++ numberOfComponents() returns the number of absolutely irreducible
       ++ components.
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R := RadicalFunctionField(INT, P0, P1, 1 - x**20, 20)
+      ++E numberOfComponents()$R
     genus                  : () -> NonNegativeInteger
       ++ genus() returns the genus of one absolutely irreducible component
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R := RadicalFunctionField(INT, P0, P1, 1 - x**20, 20)
+      ++E genus()$R
     absolutelyIrreducible? : () -> Boolean
       ++ absolutelyIrreducible?() tests if the curve absolutely irreducible?
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R2 := RadicalFunctionField(INT, P0, P1, 2 * x**2, 4)
+      ++E absolutelyIrreducible?()$R2
     rationalPoint?         : (F, F) -> Boolean
       ++ rationalPoint?(a, b) tests if \spad{(x=a,y=b)} is on the curve.
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R := RadicalFunctionField(INT, P0, P1, 1 - x**20, 20)
+      ++E rationalPoint?(0,0)$R
+      ++E R2 := RadicalFunctionField(INT, P0, P1, 2 * x**2, 4)
+      ++E rationalPoint?(0,0)$R2
     branchPointAtInfinity? : () -> Boolean
       ++ branchPointAtInfinity?() tests if there is a branch point at infinity.
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R := RadicalFunctionField(INT, P0, P1, 1 - x**20, 20)
+      ++E branchPointAtInfinity?()$R
+      ++E R2 := RadicalFunctionField(INT, P0, P1, 2 * x**2, 4)
+      ++E branchPointAtInfinity?()$R
     branchPoint?           : F -> Boolean
       ++ branchPoint?(a) tests whether \spad{x = a} is a branch point.
     branchPoint?           : UP -> Boolean
@@ -62,8 +91,18 @@ FunctionFieldCategory(F, UP, UPUP): Category == Definition where
       ++ ramified?(p) tests whether \spad{p(x) = 0} is ramified.
     integralBasis          : () -> Vector $
       ++ integralBasis() returns the integral basis for the curve.
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R := RadicalFunctionField(INT, P0, P1, 1 - x**20, 20)
+      ++E integralBasis()$R
     integralBasisAtInfinity: () -> Vector $
-      ++ integralBasisAtInfinity() returns the local integral basis at infinity.
+      ++ integralBasisAtInfinity() returns the local integral basis at infinity
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R := RadicalFunctionField(INT, P0, P1, 1 - x**20, 20)
+      ++E integralBasisAtInfinity()$R
     integralAtInfinity?    : $  -> Boolean
       ++ integralAtInfinity?() tests if f is locally integral at infinity.
     integral?              : $  -> Boolean
@@ -81,21 +120,41 @@ FunctionFieldCategory(F, UP, UPUP): Category == Definition where
       ++ \spad{(w1,...,wn) = M (1, y, ..., y**(n-1))},
       ++ where \spad{(w1,...,wn)} is the integral basis of
       ++ \spadfunFrom{integralBasis}{FunctionFieldCategory}.
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R := RadicalFunctionField(INT, P0, P1, 1 - x**20, 20)
+      ++E integralMatrix()$R
     inverseIntegralMatrix  : () -> Matrix RF
       ++ inverseIntegralMatrix() returns M such that
       ++ \spad{M (w1,...,wn) = (1, y, ..., y**(n-1))}
       ++ where \spad{(w1,...,wn)} is the integral basis of
       ++ \spadfunFrom{integralBasis}{FunctionFieldCategory}.
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R := RadicalFunctionField(INT, P0, P1, 1 - x**20, 20)
+      ++E inverseIntegralMatrix()$R
     integralMatrixAtInfinity       : () -> Matrix RF
       ++ integralMatrixAtInfinity() returns M such that
       ++ \spad{(v1,...,vn) = M (1, y, ..., y**(n-1))}
       ++ where \spad{(v1,...,vn)} is the local integral basis at infinity
       ++ returned by \spad{infIntBasis()}.
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R := RadicalFunctionField(INT, P0, P1, 1 - x**20, 20)
+      ++E integralMatrixAtInfinity()$R
     inverseIntegralMatrixAtInfinity: () -> Matrix RF
       ++ inverseIntegralMatrixAtInfinity() returns M such
       ++ that \spad{M (v1,...,vn) = (1, y, ..., y**(n-1))}
       ++ where \spad{(v1,...,vn)} is the local integral basis at infinity
       ++ returned by \spad{infIntBasis()}.
+      ++
+      ++E P0 := UnivariatePolynomial(x, Integer)
+      ++E P1 := UnivariatePolynomial(y, Fraction P0)
+      ++E R := RadicalFunctionField(INT, P0, P1, 1 - x**20, 20)
+      ++E inverseIntegralMatrixAtInfinity()$R
     yCoordinates           : $ -> Record(num:Vector(UP), den:UP)
       ++ yCoordinates(f) returns \spad{[[A1,...,An], D]} such that
       ++ \spad{f = (A1 + A2 y +...+ An y**(n-1)) / D}.
@@ -120,7 +179,7 @@ FunctionFieldCategory(F, UP, UPUP): Category == Definition where
     integral?              : ($,  F) -> Boolean
       ++ integral?(f, a) tests whether f is locally integral at \spad{x = a}.
     integral?              : ($, UP) -> Boolean
-      ++ integral?(f, p) tests whether f is locally integral at \spad{p(x) = 0}.
+      ++ integral?(f, p) tests whether f is locally integral at \spad{p(x) = 0}
     differentiate          : ($, UP -> UP) -> $
       ++ differentiate(x, d) extends the derivation d from UP to $ and
       ++ applies it to x.
@@ -131,7 +190,8 @@ FunctionFieldCategory(F, UP, UPUP): Category == Definition where
       ++ primitivePart(f) removes the content of the denominator and
       ++ the common content of the numerator of f.
     elt                    : ($, F, F) -> F
-      ++ elt(f,a,b) or f(a, b) returns the value of f at the point \spad{(x = a, y = b)}
+      ++ elt(f,a,b) or f(a, b) returns the value of f 
+      ++ at the point \spad{(x = a, y = b)}
       ++ if it is not singular.
     elliptic               : () -> Union(UP, "failed")
       ++ elliptic() returns \spad{p(x)} if the curve is the elliptic
diff --git a/src/algebra/string.spad.pamphlet b/src/algebra/string.spad.pamphlet
index a7af939..9cae78b 100644
--- a/src/algebra/string.spad.pamphlet
+++ b/src/algebra/string.spad.pamphlet
@@ -228,98 +228,130 @@ o $AXIOM/doc/src/algebra/string.spad.dvi
 ++   This domain provides the basic character data type.
 
 Character: OrderedFinite() with
-	ord: % -> Integer
-	    ++ ord(c) provides an integral code corresponding to the
-	    ++ character c.  It is always true that \spad{char ord c = c}.
-	char: Integer  -> %
-	    ++ char(i) provides a character corresponding to the integer
-	    ++ code i.	It is always true that \spad{ord char i = i}.
-	char: String   -> %
-	    ++ char(s) provides a character from a string s of length one.
-	space:	() -> %
-	    ++ space() provides the blank character.
-	quote:	() -> %
-	    ++ quote() provides the string quote character, \spad{"}.
-	escape: () -> %
-	    ++ escape() provides the escape character, \spad{_}, which
-	    ++ is used to allow quotes and other characters {\em within}
-	    ++ strings.
-	upperCase: % -> %
-	    ++ upperCase(c) converts a lower case letter to the corresponding
-	    ++ upper case letter.  If c is not a lower case letter, then
-	    ++ it is returned unchanged.
-	lowerCase: % -> %
-	    ++ lowerCase(c) converts an upper case letter to the corresponding
-	    ++ lower case letter.  If c is not an upper case letter, then
-	    ++ it is returned unchanged.
-	digit?: % -> Boolean
-	    ++ digit?(c) tests if c is a digit character,
-	    ++ i.e. one of 0..9.
-	hexDigit?: % -> Boolean
-	    ++ hexDigit?(c) tests if c is a hexadecimal numeral,
-	    ++ i.e. one of 0..9, a..f or A..F.
-	alphabetic?: % -> Boolean
-	    ++ alphabetic?(c) tests if c is a letter,
-	    ++ i.e. one of a..z or A..Z.
-	upperCase?: % -> Boolean
-	    ++ upperCase?(c) tests if c is an upper case letter,
-	    ++ i.e. one of A..Z.
-	lowerCase?: % -> Boolean
-	    ++ lowerCase?(c) tests if c is an lower case letter,
-	    ++ i.e. one of a..z.
-	alphanumeric?: % -> Boolean
-	    ++ alphanumeric?(c) tests if c is either a letter or number,
-	    ++ i.e. one of 0..9, a..z or A..Z.
-
-    == add
-	Rep := SingleInteger	  -- 0..255
-
-	CC ==> CharacterClass()
-	import CC
-
-	--cl: Record(dig:CC,hex:CC,upp:CC,low:CC,alpha:CC,alnum:CC) :=
-	--    [ digit(), hexDigit(),
-	--	upperCase(), lowerCase(), alphabetic(), alphanumeric() ]
-
-	OutChars:PrimitiveArray(OutputForm) :=
-	   construct [NUM2CHAR(i)$Lisp for i in 0..255]
-
-	minChar := minIndex OutChars
-
-	a = b		       == a =$Rep b
-	a < b		       == a <$Rep b
-	size()		       == 256
-	index n		       == char((n - 1)::Integer)
-	lookup c	       == (1 + ord c)::PositiveInteger
-	char(n:Integer)	       == n::%
-	ord c		       == convert(c)$Rep
-	random()	       == char(random()$Integer rem size())
-	space		       == QENUM("   ", 0$Lisp)$Lisp
-	quote		       == QENUM("_" ", 0$Lisp)$Lisp
-	escape		       == QENUM("__ ", 0$Lisp)$Lisp
-	coerce(c:%):OutputForm == OutChars(minChar + ord c)
-	digit? c	       == member?(c pretend Character, digit())
-	hexDigit? c	       == member?(c pretend Character, hexDigit())
-	upperCase? c	       == member?(c pretend Character, upperCase())
-	lowerCase? c	       == member?(c pretend Character, lowerCase())
-	alphabetic? c	       == member?(c pretend Character, alphabetic())
-	alphanumeric? c	       == member?(c pretend Character, alphanumeric())
-
-	latex c ==
-	    concat("\mbox{`", concat(new(1,c pretend Character)$String, "'}")$String)$String
-
-	char(s:String) ==
---	  one?(#s) => s(minIndex s) pretend %
-	  (#s) = 1 => s(minIndex s) pretend %
-	  error "String is not a single character"
-
-	upperCase c ==
-	  QENUM(PNAME(UPCASE(NUM2CHAR(ord c)$Lisp)$Lisp)$Lisp,
-		0$Lisp)$Lisp
-
-	lowerCase c ==
-	  QENUM(PNAME(DOWNCASE(NUM2CHAR(ord c)$Lisp)$Lisp)$Lisp,
-		0$Lisp)$Lisp
+  ord: % -> Integer
+    ++ ord(c) provides an integral code corresponding to the
+    ++ character c.  It is always true that \spad{char ord c = c}.
+    ++
+    ++E chars := [char "a", char "A", char "X", char "8", char "+"]
+    ++E [ord c for c in chars]
+  char: Integer  -> %
+    ++ char(i) provides a character corresponding to the integer
+    ++ code i. It is always true that \spad{ord char i = i}.
+    ++
+    ++E [char c for c in [97,65,88,56,43]]
+  char: String   -> %
+    ++ char(s) provides a character from a string s of length one.
+    ++
+    ++E [char c for c in ["a","A","X","8","+"]]
+  space: () -> %
+    ++ space() provides the blank character.
+    ++
+    ++E space()
+  quote: () -> %
+    ++ quote() provides the string quote character, \spad{"}.
+    ++
+    ++E quote()
+  escape: () -> %
+    ++ escape() provides the escape character, \spad{_}, which
+    ++ is used to allow quotes and other characters {\em within}
+    ++ strings.
+    ++
+    ++E escape()
+  upperCase: % -> %
+    ++ upperCase(c) converts a lower case letter to the corresponding
+    ++ upper case letter.  If c is not a lower case letter, then
+    ++ it is returned unchanged.
+    ++
+    ++E chars := [char "a", char "A", char "X", char "8", char "+"]
+    ++E [upperCase c for c in chars]
+  lowerCase: % -> %
+    ++ lowerCase(c) converts an upper case letter to the corresponding
+    ++ lower case letter.  If c is not an upper case letter, then
+    ++ it is returned unchanged.
+    ++
+    ++E chars := [char "a", char "A", char "X", char "8", char "+"]
+    ++E [lowerCase c for c in chars]
+  digit?: % -> Boolean
+    ++ digit?(c) tests if c is a digit character,
+    ++ i.e. one of 0..9.
+    ++
+    ++E chars := [char "a", char "A", char "X", char "8", char "+"]
+    ++E [digit? c for c in chars]
+  hexDigit?: % -> Boolean
+    ++ hexDigit?(c) tests if c is a hexadecimal numeral,
+    ++ i.e. one of 0..9, a..f or A..F.
+    ++
+    ++E chars := [char "a", char "A", char "X", char "8", char "+"]
+    ++E [hexDigit? c for c in chars]
+  alphabetic?: % -> Boolean
+    ++ alphabetic?(c) tests if c is a letter,
+    ++ i.e. one of a..z or A..Z.
+    ++
+    ++E chars := [char "a", char "A", char "X", char "8", char "+"]
+    ++E [alphabetic? c for c in chars]
+  upperCase?: % -> Boolean
+    ++ upperCase?(c) tests if c is an upper case letter,
+    ++ i.e. one of A..Z.
+    ++
+    ++E chars := [char "a", char "A", char "X", char "8", char "+"]
+    ++E [upperCase? c for c in chars]
+  lowerCase?: % -> Boolean
+    ++ lowerCase?(c) tests if c is an lower case letter,
+    ++ i.e. one of a..z.
+    ++
+    ++E chars := [char "a", char "A", char "X", char "8", char "+"]
+    ++E [lowerCase? c for c in chars]
+  alphanumeric?: % -> Boolean
+    ++ alphanumeric?(c) tests if c is either a letter or number,
+    ++ i.e. one of 0..9, a..z or A..Z.
+    ++
+    ++E chars := [char "a", char "A", char "X", char "8", char "+"]
+    ++E [alphanumeric? c for c in chars]
+
+ == add
+
+  Rep := SingleInteger  -- 0..255
+
+  CC ==> CharacterClass()
+  import CC
+
+  OutChars:PrimitiveArray(OutputForm) :=
+   construct [NUM2CHAR(i)$Lisp for i in 0..255]
+
+  minChar := minIndex OutChars
+
+  a = b                  == a =$Rep b
+  a < b	                 == a <$Rep b
+  size()                 == 256
+  index n                == char((n - 1)::Integer)
+  lookup c               == (1 + ord c)::PositiveInteger
+  char(n:Integer)        == n::%
+  ord c                  == convert(c)$Rep
+  random()               == char(random()$Integer rem size())
+  space                  == QENUM("   ", 0$Lisp)$Lisp
+  quote                  == QENUM("_" ", 0$Lisp)$Lisp
+  escape                 == QENUM("__ ", 0$Lisp)$Lisp
+  coerce(c:%):OutputForm == OutChars(minChar + ord c)
+  digit? c               == member?(c pretend Character, digit())
+  hexDigit? c            == member?(c pretend Character, hexDigit())
+  upperCase? c           == member?(c pretend Character, upperCase())
+  lowerCase? c           == member?(c pretend Character, lowerCase())
+  alphabetic? c          == member?(c pretend Character, alphabetic())
+  alphanumeric? c        == member?(c pretend Character, alphanumeric())
+
+  latex c ==
+    concat("\mbox{`", concat(new(1,c pretend Character)$String, "'}")_
+       $String)$String
+
+  char(s:String) ==
+   (#s) = 1 => s(minIndex s) pretend %
+   error "String is not a single character"
+
+  upperCase c ==
+    QENUM(PNAME(UPCASE(NUM2CHAR(ord c)$Lisp)$Lisp)$Lisp,0$Lisp)$Lisp
+
+  lowerCase c ==
+    QENUM(PNAME(DOWNCASE(NUM2CHAR(ord c)$Lisp)$Lisp)$Lisp,0$Lisp)$Lisp
 
 @
 \section{CHAR.lsp BOOTSTRAP} 
@@ -351,7 +383,12 @@ Note that this code is not included in the generated catdef.spad file.
 
 (DEFUN |CHAR;index;Pi$;4| (|n| |$|) (SPADCALL (|-| |n| 1) (QREFELT |$| 18))) 
 
-(DEFUN |CHAR;lookup;$Pi;5| (|c| |$|) (PROG (#1=#:G90919) (RETURN (PROG1 (LETT #1# (|+| 1 (SPADCALL |c| (QREFELT |$| 21))) |CHAR;lookup;$Pi;5|) (|check-subtype| (|>| #1# 0) (QUOTE (|PositiveInteger|)) #1#))))) 
+(DEFUN |CHAR;lookup;$Pi;5| (|c| |$|)
+ (PROG (#1=#:G90919)
+  (RETURN
+   (PROG1
+    (LETT #1# (|+| 1 (SPADCALL |c| (QREFELT |$| 21))) |CHAR;lookup;$Pi;5|)
+    (|check-subtype| (|>| #1# 0) (QUOTE (|PositiveInteger|)) #1#))))) 
 
 (DEFUN |CHAR;char;I$;6| (|n| |$|) (SPADCALL |n| (QREFELT |$| 23))) 
 
@@ -359,47 +396,146 @@ Note that this code is not included in the generated catdef.spad file.
 
 (DEFUN |CHAR;ord;$I;7| (|c| |$|) |c|) 
 
-(DEFUN |CHAR;random;$;8| (|$|) (SPADCALL (REMAINDER2 (|random|) (SPADCALL (QREFELT |$| 16))) (QREFELT |$| 18))) 
+(DEFUN |CHAR;random;$;8| (|$|)
+ (SPADCALL (REMAINDER2 (|random|) (SPADCALL (QREFELT |$| 16)))
+           (QREFELT |$| 18))) 
 
-(PUT (QUOTE |CHAR;space;$;9|) (QUOTE |SPADreplace|) (QUOTE (XLAM NIL (QENUM "   " 0)))) 
+(PUT (QUOTE |CHAR;space;$;9|)
+ (QUOTE |SPADreplace|) (QUOTE (XLAM NIL (QENUM "   " 0)))) 
 
 (DEFUN |CHAR;space;$;9| (|$|) (QENUM "   " 0)) 
 
-(PUT (QUOTE |CHAR;quote;$;10|) (QUOTE |SPADreplace|) (QUOTE (XLAM NIL (QENUM "\" " 0)))) 
+(PUT (QUOTE |CHAR;quote;$;10|)
+ (QUOTE |SPADreplace|) (QUOTE (XLAM NIL (QENUM "\" " 0)))) 
 
 (DEFUN |CHAR;quote;$;10| (|$|) (QENUM "\" " 0)) 
 
-(PUT (QUOTE |CHAR;escape;$;11|) (QUOTE |SPADreplace|) (QUOTE (XLAM NIL (QENUM "_ " 0)))) 
+(PUT (QUOTE |CHAR;escape;$;11|)
+ (QUOTE |SPADreplace|) (QUOTE (XLAM NIL (QENUM "_ " 0)))) 
 
 (DEFUN |CHAR;escape;$;11| (|$|) (QENUM "_ " 0)) 
 
-(DEFUN |CHAR;coerce;$Of;12| (|c| |$|) (ELT (QREFELT |$| 10) (|+| (QREFELT |$| 11) (SPADCALL |c| (QREFELT |$| 21))))) 
-
-(DEFUN |CHAR;digit?;$B;13| (|c| |$|) (SPADCALL |c| (|spadConstant| |$| 31) (QREFELT |$| 33))) 
-
-(DEFUN |CHAR;hexDigit?;$B;14| (|c| |$|) (SPADCALL |c| (|spadConstant| |$| 35) (QREFELT |$| 33))) 
-
-(DEFUN |CHAR;upperCase?;$B;15| (|c| |$|) (SPADCALL |c| (|spadConstant| |$| 37) (QREFELT |$| 33))) 
-
-(DEFUN |CHAR;lowerCase?;$B;16| (|c| |$|) (SPADCALL |c| (|spadConstant| |$| 39) (QREFELT |$| 33))) 
-
-(DEFUN |CHAR;alphabetic?;$B;17| (|c| |$|) (SPADCALL |c| (|spadConstant| |$| 41) (QREFELT |$| 33))) 
-
-(DEFUN |CHAR;alphanumeric?;$B;18| (|c| |$|) (SPADCALL |c| (|spadConstant| |$| 43) (QREFELT |$| 33))) 
-
-(DEFUN |CHAR;latex;$S;19| (|c| |$|) (STRCONC "\\mbox{`" (STRCONC (|MAKE-FULL-CVEC| 1 |c|) "'}"))) 
-
-(DEFUN |CHAR;char;S$;20| (|s| |$|) (COND ((EQL (QCSIZE |s|) 1) (SPADCALL |s| (SPADCALL |s| (QREFELT |$| 47)) (QREFELT |$| 48))) ((QUOTE T) (|error| "String is not a single character")))) 
-
-(DEFUN |CHAR;upperCase;2$;21| (|c| |$|) (QENUM (PNAME (UPCASE (NUM2CHAR (SPADCALL |c| (QREFELT |$| 21))))) 0)) 
-
-(DEFUN |CHAR;lowerCase;2$;22| (|c| |$|) (QENUM (PNAME (DOWNCASE (NUM2CHAR (SPADCALL |c| (QREFELT |$| 21))))) 0)) 
-
-(DEFUN |Character| NIL (PROG NIL (RETURN (PROG (#1=#:G90941) (RETURN (COND ((LETT #1# (HGET |$ConstructorCache| (QUOTE |Character|)) |Character|) (|CDRwithIncrement| (CDAR #1#))) ((QUOTE T) (|UNWIND-PROTECT| (PROG1 (CDDAR (HPUT |$ConstructorCache| (QUOTE |Character|) (LIST (CONS NIL (CONS 1 (|Character;|)))))) (LETT #1# T |Character|)) (COND ((NOT #1#) (HREM |$ConstructorCache| (QUOTE |Character|)))))))))))) 
-
-(DEFUN |Character;| NIL (PROG (|dv$| |$| |pv$| #1=#:G90939 |i|) (RETURN (SEQ (PROGN (LETT |dv$| (QUOTE (|Character|)) . #2=(|Character|)) (LETT |$| (GETREFV 53) . #2#) (QSETREFV |$| 0 |dv$|) (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #2#)) (|haddProp| |$ConstructorCache| (QUOTE |Character|) NIL (CONS 1 |$|)) (|stuffDomainSlots| |$|) (QSETREFV |$| 6 (|SingleInteger|)) (QSETREFV |$| 10 (SPADCALL (PROGN (LETT #1# NIL . #2#) (SEQ (LETT |i| 0 . #2#) G190 (COND ((QSGREATERP |i| 255) (GO G191))) (SEQ (EXIT (LETT #1# (CONS (NUM2CHAR |i|) #1#) . #2#))) (LETT |i| (QSADD1 |i|) . #2#) (GO G190) G191 (EXIT (NREVERSE0 #1#)))) (QREFELT |$| 9))) (QSETREFV |$| 11 0) |$|))))) 
-
-(MAKEPROP (QUOTE |Character|) (QUOTE |infovec|) (LIST (QUOTE #(NIL NIL NIL NIL NIL NIL (QUOTE |Rep|) (|List| 28) (|PrimitiveArray| 28) (0 . |construct|) (QUOTE |OutChars|) (QUOTE |minChar|) (|Boolean|) |CHAR;=;2$B;1| |CHAR;<;2$B;2| (|NonNegativeInteger|) |CHAR;size;Nni;3| (|Integer|) |CHAR;char;I$;6| (|PositiveInteger|) |CHAR;index;Pi$;4| |CHAR;ord;$I;7| |CHAR;lookup;$Pi;5| (5 . |coerce|) |CHAR;random;$;8| |CHAR;space;$;9| |CHAR;quote;$;10| |CHAR;escape;$;11| (|OutputForm|) |CHAR;coerce;$Of;12| (|CharacterClass|) (10 . |digit|) (|Character|) (14 . |member?|) |CHAR;digit?;$B;13| (20 . |hexDigit|) |CHAR;hexDigit?;$B;14| (24 . |upperCase|) |CHAR;upperCase?;$B;15| (28 . |lowerCase|) |CHAR;lowerCase?;$B;16| (32 . |alphabetic|) |CHAR;alphabetic?;$B;17| (36 . |alphanumeric|) |CHAR;alphanumeric?;$B;18| (|String|) |CHAR;latex;$S;19| (40 . |minIndex|) (45 . |elt|) |CHAR;char;S$;20| |CHAR;upperCase;2$;21| |CHAR;lowerCase;2$;22| (|SingleInteger|))) (QUOTE #(|~=| 51 |upperCase?| 57 |upperCase| 62 |space| 67 |size| 71 |random| 75 |quote| 79 |ord| 83 |min| 88 |max| 94 |lowerCase?| 100 |lowerCase| 105 |lookup| 110 |latex| 115 |index| 120 |hexDigit?| 125 |hash| 130 |escape| 135 |digit?| 139 |coerce| 144 |char| 149 |alphanumeric?| 159 |alphabetic?| 164 |>=| 169 |>| 175 |=| 181 |<=| 187 |<| 193)) (QUOTE NIL) (CONS (|makeByteWordVec2| 1 (QUOTE (0 0 0 0 0 0))) (CONS (QUOTE #(NIL |OrderedSet&| NIL |SetCategory&| |BasicType&| NIL)) (CONS (QUOTE #((|OrderedFinite|) (|OrderedSet|) (|Finite|) (|SetCategory|) (|BasicType|) (|CoercibleTo| 28))) (|makeByteWordVec2| 52 (QUOTE (1 8 0 7 9 1 6 0 17 23 0 30 0 31 2 30 12 32 0 33 0 30 0 35 0 30 0 37 0 30 0 39 0 30 0 41 0 30 0 43 1 45 17 0 47 2 45 32 0 17 48 2 0 12 0 0 1 1 0 12 0 38 1 0 0 0 50 0 0 0 25 0 0 15 16 0 0 0 24 0 0 0 26 1 0 17 0 21 2 0 0 0 0 1 2 0 0 0 0 1 1 0 12 0 40 1 0 0 0 51 1 0 19 0 22 1 0 45 0 46 1 0 0 19 20 1 0 12 0 36 1 0 52 0 1 0 0 0 27 1 0 12 0 34 1 0 28 0 29 1 0 0 45 49 1 0 0 17 18 1 0 12 0 44 1 0 12 0 42 2 0 12 0 0 1 2 0 12 0 0 1 2 0 12 0 0 13 2 0 12 0 0 1 2 0 12 0 0 14)))))) (QUOTE |lookupComplete|))) 
+(DEFUN |CHAR;coerce;$Of;12| (|c| |$|)
+ (ELT (QREFELT |$| 10)
+      (|+| (QREFELT |$| 11) (SPADCALL |c| (QREFELT |$| 21))))) 
+
+(DEFUN |CHAR;digit?;$B;13| (|c| |$|)
+ (SPADCALL |c| (|spadConstant| |$| 31) (QREFELT |$| 33))) 
+
+(DEFUN |CHAR;hexDigit?;$B;14| (|c| |$|)
+ (SPADCALL |c| (|spadConstant| |$| 35) (QREFELT |$| 33))) 
+
+(DEFUN |CHAR;upperCase?;$B;15| (|c| |$|)
+ (SPADCALL |c| (|spadConstant| |$| 37) (QREFELT |$| 33))) 
+
+(DEFUN |CHAR;lowerCase?;$B;16| (|c| |$|)
+ (SPADCALL |c| (|spadConstant| |$| 39) (QREFELT |$| 33))) 
+
+(DEFUN |CHAR;alphabetic?;$B;17| (|c| |$|)
+ (SPADCALL |c| (|spadConstant| |$| 41) (QREFELT |$| 33))) 
+
+(DEFUN |CHAR;alphanumeric?;$B;18| (|c| |$|)
+ (SPADCALL |c| (|spadConstant| |$| 43) (QREFELT |$| 33))) 
+
+(DEFUN |CHAR;latex;$S;19| (|c| |$|)
+ (STRCONC "\\mbox{`" (STRCONC (|MAKE-FULL-CVEC| 1 |c|) "'}"))) 
+
+(DEFUN |CHAR;char;S$;20| (|s| |$|)
+ (COND
+  ((EQL (QCSIZE |s|) 1)
+    (SPADCALL |s| (SPADCALL |s| (QREFELT |$| 47)) (QREFELT |$| 48)))
+  ((QUOTE T) (|error| "String is not a single character")))) 
+
+(DEFUN |CHAR;upperCase;2$;21| (|c| |$|)
+ (QENUM (PNAME (UPCASE (NUM2CHAR (SPADCALL |c| (QREFELT |$| 21))))) 0)) 
+
+(DEFUN |CHAR;lowerCase;2$;22| (|c| |$|)
+ (QENUM (PNAME (DOWNCASE (NUM2CHAR (SPADCALL |c| (QREFELT |$| 21))))) 0)) 
+
+(DEFUN |Character| NIL
+ (PROG NIL
+  (RETURN
+   (PROG (#1=#:G90941)
+    (RETURN
+     (COND
+      ((LETT #1# (HGET |$ConstructorCache| (QUOTE |Character|)) |Character|)
+        (|CDRwithIncrement| (CDAR #1#)))
+      ((QUOTE T)
+        (|UNWIND-PROTECT|
+         (PROG1
+          (CDDAR 
+           (HPUT |$ConstructorCache| (QUOTE |Character|)
+            (LIST (CONS NIL (CONS 1 (|Character;|))))))
+          (LETT #1# T |Character|))
+         (COND
+          ((NOT #1#) (HREM |$ConstructorCache| (QUOTE |Character|)))))))))))) 
+
+(DEFUN |Character;| NIL
+ (PROG (|dv$| |$| |pv$| #1=#:G90939 |i|)
+  (RETURN
+   (SEQ
+    (PROGN
+     (LETT |dv$| (QUOTE (|Character|)) . #2=(|Character|))
+     (LETT |$| (GETREFV 53) . #2#)
+     (QSETREFV |$| 0 |dv$|)
+     (QSETREFV |$| 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #2#))
+     (|haddProp| |$ConstructorCache| (QUOTE |Character|) NIL (CONS 1 |$|))
+     (|stuffDomainSlots| |$|)
+     (QSETREFV |$| 6 (|SingleInteger|))
+     (QSETREFV |$| 10 
+      (SPADCALL
+       (PROGN
+        (LETT #1# NIL . #2#)
+        (SEQ
+         (LETT |i| 0 . #2#)
+         G190
+         (COND ((QSGREATERP |i| 255) (GO G191)))
+         (SEQ (EXIT (LETT #1# (CONS (NUM2CHAR |i|) #1#) . #2#)))
+         (LETT |i| (QSADD1 |i|) . #2#)
+         (GO G190)
+         G191
+         (EXIT (NREVERSE0 #1#))))
+       (QREFELT |$| 9)))
+     (QSETREFV |$| 11 0) |$|))))) 
+
+(MAKEPROP (QUOTE |Character|) (QUOTE |infovec|)
+ (LIST (QUOTE 
+  #(NIL NIL NIL NIL NIL NIL (QUOTE |Rep|) (|List| 28) (|PrimitiveArray| 28)
+   (0 . |construct|) (QUOTE |OutChars|) (QUOTE |minChar|) (|Boolean|)
+   |CHAR;=;2$B;1| |CHAR;<;2$B;2| (|NonNegativeInteger|) |CHAR;size;Nni;3|
+   (|Integer|) |CHAR;char;I$;6| (|PositiveInteger|) |CHAR;index;Pi$;4|
+   |CHAR;ord;$I;7| |CHAR;lookup;$Pi;5| (5 . |coerce|) |CHAR;random;$;8|
+   |CHAR;space;$;9| |CHAR;quote;$;10| |CHAR;escape;$;11| (|OutputForm|)
+   |CHAR;coerce;$Of;12| (|CharacterClass|) (10 . |digit|) (|Character|)
+   (14 . |member?|) |CHAR;digit?;$B;13| (20 . |hexDigit|)
+   |CHAR;hexDigit?;$B;14| (24 . |upperCase|) |CHAR;upperCase?;$B;15|
+   (28 . |lowerCase|) |CHAR;lowerCase?;$B;16| (32 . |alphabetic|)
+   |CHAR;alphabetic?;$B;17| (36 . |alphanumeric|) |CHAR;alphanumeric?;$B;18|
+   (|String|) |CHAR;latex;$S;19| (40 . |minIndex|) (45 . |elt|)
+   |CHAR;char;S$;20| |CHAR;upperCase;2$;21| |CHAR;lowerCase;2$;22|
+   (|SingleInteger|))) (QUOTE #(|~=| 51 |upperCase?| 57 |upperCase| 62
+   |space| 67 |size| 71 |random| 75 |quote| 79 |ord| 83 |min| 88 |max| 94
+   |lowerCase?| 100 |lowerCase| 105 |lookup| 110 |latex| 115 |index| 120
+   |hexDigit?| 125 |hash| 130 |escape| 135 |digit?| 139 |coerce| 144 |char|
+   149 |alphanumeric?| 159 |alphabetic?| 164 |>=| 169 |>| 175 |=| 181 |<=|
+   187 |<| 193)) (QUOTE NIL) 
+   (CONS
+    (|makeByteWordVec2| 1 (QUOTE (0 0 0 0 0 0)))
+    (CONS 
+     (QUOTE #(NIL |OrderedSet&| NIL |SetCategory&| |BasicType&| NIL))
+     (CONS
+      (QUOTE #((|OrderedFinite|) (|OrderedSet|) (|Finite|) (|SetCategory|)
+               (|BasicType|) (|CoercibleTo| 28)))
+       (|makeByteWordVec2| 52
+        (QUOTE (1 8 0 7 9 1 6 0 17 23 0 30 0 31 2 30 12 32 0 33 0 30 0 35 
+                0 30 0 37 0 30 0 39 0 30 0 41 0 30 0 43 1 45 17 0 47 2 45
+                32 0 17 48 2 0 12 0 0 1 1 0 12 0 38 1 0 0 0 50 0 0 0 25 0
+                0 15 16 0 0 0 24 0 0 0 26 1 0 17 0 21 2 0 0 0 0 1 2 0 0 0
+                0 1 1 0 12 0 40 1 0 0 0 51 1 0 19 0 22 1 0 45 0 46 1 0 0 19
+                20 1 0 12 0 36 1 0 52 0 1 0 0 0 27 1 0 12 0 34 1 0 28 0 29
+                1 0 0 45 49 1 0 0 17 18 1 0 12 0 44 1 0 12 0 42 2 0 12 0 0
+                1 2 0 12 0 0 1 2 0 12 0 0 13 2 0 12 0 0 1 2 0 12 0 0 14))))))
+  (QUOTE |lookupComplete|))) 
 
 (MAKEPROP (QUOTE |Character|) (QUOTE NILADIC) T) 
 @
@@ -1614,7 +1750,8 @@ String(): StringCategory == IndexedString(MINSTRINGINDEX) add
 ++ Description:
 ++ A category for string-like objects
 
-StringCategory():Category == Join(StringAggregate(), SetCategory, OpenMath) with
+StringCategory():Category == _
+     Join(StringAggregate(), SetCategory, OpenMath) with
   string: Integer -> %
     ++ string(i) returns the decimal representation of i in a string
 
