\documentclass{article} \usepackage{axiom} \begin{document} \title{\$SPAD/src/algebra symbol.spad} \author{Stephen M. Watt} \maketitle \begin{abstract} \end{abstract} \eject \tableofcontents \eject \section{domain SYMBOL Symbol} <>= )abbrev domain SYMBOL Symbol ++ Author: Stephen Watt ++ Date Created: 1986 ++ Date Last Updated: 7 Mar 1991, 29 Apr. 1994 (FDLL) ++ Description: ++ Basic and scripted symbols. ++ Keywords: symbol. Symbol(): Exports == Implementation where L ==> List OutputForm Scripts ==> Record(sub:L,sup:L,presup:L,presub:L,args:L) Exports ==> Join(OrderedSet, ConvertibleTo InputForm, OpenMath, ConvertibleTo Symbol, ConvertibleTo Pattern Integer, ConvertibleTo Pattern Float, PatternMatchable Integer, PatternMatchable Float) with new: () -> % ++ new() returns a new symbol whose name starts with %. new: % -> % ++ new(s) returns a new symbol whose name starts with %s. resetNew: () -> Void ++ resetNew() resets the internals counters that new() and ++ new(s) use to return distinct symbols every time. coerce: String -> % ++ coerce(s) converts the string s to a symbol. name: % -> % ++ name(s) returns s without its scripts. scripted?: % -> Boolean ++ scripted?(s) is true if s has been given any scripts. scripts: % -> Scripts ++ scripts(s) returns all the scripts of s. script: (%, List L) -> % ++ script(s, [a,b,c,d,e]) returns s with subscripts a, ++ superscripts b, pre-superscripts c, pre-subscripts d, ++ and argument-scripts e. Omitted components are taken to be empty. ++ For example, \spad{script(s, [a,b,c])} is equivalent to ++ \spad{script(s,[a,b,c,[],[]])}. script: (%, Scripts) -> % ++ script(s, [a,b,c,d,e]) returns s with subscripts a, ++ superscripts b, pre-superscripts c, pre-subscripts d, ++ and argument-scripts e. subscript: (%, L) -> % ++ subscript(s, [a1,...,an]) returns s ++ subscripted by \spad{[a1,...,an]}. superscript: (%, L) -> % ++ superscript(s, [a1,...,an]) returns s ++ superscripted by \spad{[a1,...,an]}. argscript: (%, L) -> % ++ argscript(s, [a1,...,an]) returns s ++ arg-scripted by \spad{[a1,...,an]}. elt: (%, L) -> % ++ elt(s,[a1,...,an]) or s([a1,...,an]) returns s subscripted by \spad{[a1,...,an]}. string: % -> String ++ string(s) converts the symbol s to a string. ++ Error: if the symbol is subscripted. list: % -> List % ++ list(sy) takes a scripted symbol and produces a list ++ of the name followed by the scripts. sample: constant -> % ++ sample() returns a sample of % Implementation ==> add count: Reference(Integer) := ref 0 xcount: AssociationList(%, Integer) := empty() istrings:PrimitiveArray(String) := construct ["0","1","2","3","4","5","6","7","8","9"] -- the following 3 strings shall be of empty intersection nums:String:="0123456789" ALPHAS:String:="ABCDEFGHIJKLMNOPQRSTUVWXYZ" alphas:String:="abcdefghijklmnopqrstuvwxyz" writeOMSym(dev: OpenMathDevice, x: %): Void == scripted? x => error "Cannot convert a scripted symbol to OpenMath" OMputVariable(dev, x pretend Symbol) OMwrite(x: %): String == s: String := "" sp := OM_-STRINGTOSTRINGPTR(s)$Lisp dev: OpenMathDevice := OMopenString(sp pretend String, OMencodingXML) OMputObject(dev) writeOMSym(dev, x) OMputEndObject(dev) OMclose(dev) s := OM_-STRINGPTRTOSTRING(sp)$Lisp pretend String s OMwrite(x: %, wholeObj: Boolean): String == s: String := "" sp := OM_-STRINGTOSTRINGPTR(s)$Lisp dev: OpenMathDevice := OMopenString(sp pretend String, OMencodingXML) if wholeObj then OMputObject(dev) writeOMSym(dev, x) if wholeObj then OMputEndObject(dev) OMclose(dev) s := OM_-STRINGPTRTOSTRING(sp)$Lisp pretend String s OMwrite(dev: OpenMathDevice, x: %): Void == OMputObject(dev) writeOMSym(dev, x) OMputEndObject(dev) OMwrite(dev: OpenMathDevice, x: %, wholeObj: Boolean): Void == if wholeObj then OMputObject(dev) writeOMSym(dev, x) if wholeObj then OMputEndObject(dev) hd:String := "*" lhd := #hd ord0 := ord char("0")$Character istring : Integer -> String syprefix : Scripts -> String syscripts: Scripts -> L convert(s:%):InputForm == convert(s pretend Symbol)$InputForm convert(s:%):Symbol == s pretend Symbol coerce(s:String):% == VALUES(INTERN(s)$Lisp)$Lisp x = y == EQUAL(x,y)$Lisp x < y == GGREATERP(y, x)$Lisp coerce(x:%):OutputForm == outputForm(x pretend Symbol) subscript(sy, lx) == script(sy, [lx, nil, nil(), nil(), nil()]) elt(sy,lx) == subscript(sy,lx) superscript(sy, lx) == script(sy,[nil(),lx, nil(), nil(), nil()]) argscript(sy, lx) == script(sy,[nil(),nil(), nil(), nil(), lx]) patternMatch(x:%,p:Pattern Integer,l:PatternMatchResult(Integer,%))== (patternMatch(x pretend Symbol, p, l pretend PatternMatchResult(Integer, Symbol))$PatternMatchSymbol(Integer)) pretend PatternMatchResult(Integer, %) patternMatch(x:%, p:Pattern Float, l:PatternMatchResult(Float, %)) == (patternMatch(x pretend Symbol, p, l pretend PatternMatchResult(Float, Symbol))$PatternMatchSymbol(Float)) pretend PatternMatchResult(Float, %) convert(x:%):Pattern(Float) == coerce(x pretend Symbol)$Pattern(Float) convert(x:%):Pattern(Integer) == coerce(x pretend Symbol)$Pattern(Integer) syprefix sc == ns: List Integer := [#sc.presub, #sc.presup, #sc.sup, #sc.sub] while #ns >= 2 and zero? first ns repeat ns := rest ns concat concat(concat(hd, istring(#sc.args)), [istring n for n in reverse_! ns]) syscripts sc == all := sc.presub all := concat(sc.presup, all) all := concat(sc.sup, all) all := concat(sc.sub, all) concat(all, sc.args) script(sy: %, ls: List L) == sc: Scripts := [nil(), nil(), nil(), nil(), nil()] if not null ls then (sc.sub := first ls; ls := rest ls) if not null ls then (sc.sup := first ls; ls := rest ls) if not null ls then (sc.presup := first ls; ls := rest ls) if not null ls then (sc.presub := first ls; ls := rest ls) if not null ls then (sc.args := first ls; ls := rest ls) script(sy, sc) script(sy: %, sc: Scripts) == scripted? sy => error "Cannot add scripts to a scripted symbol" (concat(concat(syprefix sc, string name sy)::%::OutputForm, syscripts sc)) pretend % string e == not scripted? e => PNAME(e)$Lisp error "Cannot form string from non-atomic symbols." -- Scripts ==> Record(sub:L,sup:L,presup:L,presub:L,args:L) latex e == s : String := (PNAME(name e)$Lisp) pretend String if #s > 1 and s.1 ~= char "\" then s := concat("\mbox{\it ", concat(s, "}")$String)$String not scripted? e => s ss : Scripts := scripts e lo : List OutputForm := ss.sub sc : String if not empty? lo then sc := "__{" while not empty? lo repeat sc := concat(sc, latex first lo)$String lo := rest lo if not empty? lo then sc := concat(sc, ", ")$String sc := concat(sc, "}")$String s := concat(s, sc)$String lo := ss.sup if not empty? lo then sc := "^{" while not empty? lo repeat sc := concat(sc, latex first lo)$String lo := rest lo if not empty? lo then sc := concat(sc, ", ")$String sc := concat(sc, "}")$String s := concat(s, sc)$String lo := ss.presup if not empty? lo then sc := "{}^{" while not empty? lo repeat sc := concat(sc, latex first lo)$String lo := rest lo if not empty? lo then sc := concat(sc, ", ")$String sc := concat(sc, "}")$String s := concat(sc, s)$String lo := ss.presub if not empty? lo then sc := "{}__{" while not empty? lo repeat sc := concat(sc, latex first lo)$String lo := rest lo if not empty? lo then sc := concat(sc, ", ")$String sc := concat(sc, "}")$String s := concat(sc, s)$String lo := ss.args if not empty? lo then sc := "\left( {" while not empty? lo repeat sc := concat(sc, latex first lo)$String lo := rest lo if not empty? lo then sc := concat(sc, ", ")$String sc := concat(sc, "} \right)")$String s := concat(s, sc)$String s anyRadix(n:Integer,s:String):String == ns:String:="" repeat qr := divide(n,#s) n := qr.quotient ns := concat(s.(qr.remainder+minIndex s),ns) if zero?(n) then return ns new() == sym := anyRadix(count()::Integer,ALPHAS) count() := count() + 1 concat("%",sym)::% new x == n:Integer := (u := search(x, xcount)) case "failed" => 0 inc(u::Integer) xcount(x) := n xx := not scripted? x => string x string name x xx := concat("%",xx) xx := (position(xx.maxIndex(xx),nums)>=minIndex(nums)) => concat(xx, anyRadix(n,alphas)) concat(xx, anyRadix(n,nums)) not scripted? x => xx::% script(xx::%,scripts x) resetNew() == count() := 0 for k in keys xcount repeat remove_!(k, xcount) void scripted? sy == not ATOM(sy)$Lisp name sy == not scripted? sy => sy str := string first list sy for i in lhd+1..#str repeat not digit?(str.i) => return((str.(i..#str))::%) error "Improper scripted symbol" scripts sy == not scripted? sy => [nil(), nil(), nil(), nil(), nil()] nscripts: List NonNegativeInteger := [0, 0, 0, 0, 0] lscripts: List L := [nil(), nil(), nil(), nil(), nil()] str := string first list sy nstr := #str m := minIndex nscripts for i in m.. for j in lhd+1..nstr while digit?(str.j) repeat nscripts.i := (ord(str.j) - ord0)::NonNegativeInteger -- Put the number of function scripts at the end. nscripts := concat(rest nscripts, first nscripts) allscripts := rest list sy m := minIndex lscripts for i in m.. for n in nscripts repeat #allscripts < n => error "Improper script count in symbol" lscripts.i := [a::OutputForm for a in first(allscripts, n)] allscripts := rest(allscripts, n) [lscripts.m, lscripts.(m+1), lscripts.(m+2), lscripts.(m+3), lscripts.(m+4)] istring n == n > 9 => error "Can have at most 9 scripts of each kind" istrings.(n + minIndex istrings) list sy == not scripted? sy => error "Cannot convert a symbol to a list if it is not subscripted" sy pretend List(%) sample() == "aSymbol"::% @ \section{SYMBOL.lsp BOOTSTRAP} {\bf SYMBOL} depends on a chain of files. We need to break this cycle to build the algebra. So we keep a cached copy of the translated {\bf SYMBOL} category which we can write into the {\bf MID} directory. We compile the lisp code and copy the {\bf SYMBOL.o} file to the {\bf OUT} directory. This is eventually forcibly replaced by a recompiled version. Note that this code is not included in the generated catdef.spad file. <>= (/VERSIONCHECK 2) (DEFUN |SYMBOL;writeOMSym| (|dev| |x| $) (COND ((SPADCALL |x| (QREFELT $ 21)) (|error| "Cannot convert a scripted symbol to OpenMath")) ('T (SPADCALL |dev| |x| (QREFELT $ 25))))) (DEFUN |SYMBOL;OMwrite;$S;2| (|x| $) (PROG (|sp| |dev| |s|) (RETURN (SEQ (LETT |s| "" |SYMBOL;OMwrite;$S;2|) (LETT |sp| (OM-STRINGTOSTRINGPTR |s|) |SYMBOL;OMwrite;$S;2|) (LETT |dev| (SPADCALL |sp| (SPADCALL (QREFELT $ 27)) (QREFELT $ 29)) |SYMBOL;OMwrite;$S;2|) (SPADCALL |dev| (QREFELT $ 30)) (|SYMBOL;writeOMSym| |dev| |x| $) (SPADCALL |dev| (QREFELT $ 31)) (SPADCALL |dev| (QREFELT $ 32)) (LETT |s| (OM-STRINGPTRTOSTRING |sp|) |SYMBOL;OMwrite;$S;2|) (EXIT |s|))))) (DEFUN |SYMBOL;OMwrite;$BS;3| (|x| |wholeObj| $) (PROG (|sp| |dev| |s|) (RETURN (SEQ (LETT |s| "" |SYMBOL;OMwrite;$BS;3|) (LETT |sp| (OM-STRINGTOSTRINGPTR |s|) |SYMBOL;OMwrite;$BS;3|) (LETT |dev| (SPADCALL |sp| (SPADCALL (QREFELT $ 27)) (QREFELT $ 29)) |SYMBOL;OMwrite;$BS;3|) (COND (|wholeObj| (SPADCALL |dev| (QREFELT $ 30)))) (|SYMBOL;writeOMSym| |dev| |x| $) (COND (|wholeObj| (SPADCALL |dev| (QREFELT $ 31)))) (SPADCALL |dev| (QREFELT $ 32)) (LETT |s| (OM-STRINGPTRTOSTRING |sp|) |SYMBOL;OMwrite;$BS;3|) (EXIT |s|))))) (DEFUN |SYMBOL;OMwrite;Omd$V;4| (|dev| |x| $) (SEQ (SPADCALL |dev| (QREFELT $ 30)) (|SYMBOL;writeOMSym| |dev| |x| $) (EXIT (SPADCALL |dev| (QREFELT $ 31))))) (DEFUN |SYMBOL;OMwrite;Omd$BV;5| (|dev| |x| |wholeObj| $) (SEQ (COND (|wholeObj| (SPADCALL |dev| (QREFELT $ 30)))) (|SYMBOL;writeOMSym| |dev| |x| $) (EXIT (COND (|wholeObj| (SPADCALL |dev| (QREFELT $ 31))))))) (DEFUN |SYMBOL;convert;$If;6| (|s| $) (SPADCALL |s| (QREFELT $ 45))) (PUT '|SYMBOL;convert;$S;7| '|SPADreplace| '(XLAM (|s|) |s|)) (DEFUN |SYMBOL;convert;$S;7| (|s| $) |s|) (DEFUN |SYMBOL;coerce;S$;8| (|s| $) (VALUES (INTERN |s|))) (PUT '|SYMBOL;=;2$B;9| '|SPADreplace| 'EQUAL) (DEFUN |SYMBOL;=;2$B;9| (|x| |y| $) (EQUAL |x| |y|)) (PUT '|SYMBOL;<;2$B;10| '|SPADreplace| '(XLAM (|x| |y|) (GGREATERP |y| |x|))) (DEFUN |SYMBOL;<;2$B;10| (|x| |y| $) (GGREATERP |y| |x|)) (DEFUN |SYMBOL;coerce;$Of;11| (|x| $) (SPADCALL |x| (QREFELT $ 52))) (DEFUN |SYMBOL;subscript;$L$;12| (|sy| |lx| $) (SPADCALL |sy| (LIST |lx| NIL NIL NIL NIL) (QREFELT $ 55))) (DEFUN |SYMBOL;elt;$L$;13| (|sy| |lx| $) (SPADCALL |sy| |lx| (QREFELT $ 57))) (DEFUN |SYMBOL;superscript;$L$;14| (|sy| |lx| $) (SPADCALL |sy| (LIST NIL |lx| NIL NIL NIL) (QREFELT $ 55))) (DEFUN |SYMBOL;argscript;$L$;15| (|sy| |lx| $) (SPADCALL |sy| (LIST NIL NIL NIL NIL |lx|) (QREFELT $ 55))) (DEFUN |SYMBOL;patternMatch;$P2Pmr;16| (|x| |p| |l| $) (SPADCALL |x| |p| |l| (QREFELT $ 64))) (DEFUN |SYMBOL;patternMatch;$P2Pmr;17| (|x| |p| |l| $) (SPADCALL |x| |p| |l| (QREFELT $ 70))) (DEFUN |SYMBOL;convert;$P;18| (|x| $) (SPADCALL |x| (QREFELT $ 73))) (DEFUN |SYMBOL;convert;$P;19| (|x| $) (SPADCALL |x| (QREFELT $ 75))) (DEFUN |SYMBOL;syprefix| (|sc| $) (PROG (|ns| #0=#:G3018 |n| #1=#:G3019) (RETURN (SEQ (LETT |ns| (LIST (LENGTH (QVELT |sc| 3)) (LENGTH (QVELT |sc| 2)) (LENGTH (QVELT |sc| 1)) (LENGTH (QVELT |sc| 0))) |SYMBOL;syprefix|) (SEQ G190 (COND ((NULL (COND ((< (LENGTH |ns|) 2) 'NIL) ('T (ZEROP (|SPADfirst| |ns|))))) (GO G191))) (SEQ (EXIT (LETT |ns| (CDR |ns|) |SYMBOL;syprefix|))) NIL (GO G190) G191 (EXIT NIL)) (EXIT (SPADCALL (CONS (STRCONC (QREFELT $ 37) (|SYMBOL;istring| (LENGTH (QVELT |sc| 4)) $)) (PROGN (LETT #0# NIL |SYMBOL;syprefix|) (SEQ (LETT |n| NIL |SYMBOL;syprefix|) (LETT #1# (NREVERSE |ns|) |SYMBOL;syprefix|) G190 (COND ((OR (ATOM #1#) (PROGN (LETT |n| (CAR #1#) |SYMBOL;syprefix|) NIL)) (GO G191))) (SEQ (EXIT (LETT #0# (CONS (|SYMBOL;istring| |n| $) #0#) |SYMBOL;syprefix|))) (LETT #1# (CDR #1#) |SYMBOL;syprefix|) (GO G190) G191 (EXIT (NREVERSE0 #0#))))) (QREFELT $ 78))))))) (DEFUN |SYMBOL;syscripts| (|sc| $) (PROG (|all|) (RETURN (SEQ (LETT |all| (QVELT |sc| 3) |SYMBOL;syscripts|) (LETT |all| (SPADCALL (QVELT |sc| 2) |all| (QREFELT $ 79)) |SYMBOL;syscripts|) (LETT |all| (SPADCALL (QVELT |sc| 1) |all| (QREFELT $ 79)) |SYMBOL;syscripts|) (LETT |all| (SPADCALL (QVELT |sc| 0) |all| (QREFELT $ 79)) |SYMBOL;syscripts|) (EXIT (SPADCALL |all| (QVELT |sc| 4) (QREFELT $ 79))))))) (DEFUN |SYMBOL;script;$L$;22| (|sy| |ls| $) (PROG (|sc|) (RETURN (SEQ (LETT |sc| (VECTOR NIL NIL NIL NIL NIL) |SYMBOL;script;$L$;22|) (COND ((NULL (NULL |ls|)) (SEQ (QSETVELT |sc| 0 (|SPADfirst| |ls|)) (EXIT (LETT |ls| (CDR |ls|) |SYMBOL;script;$L$;22|))))) (COND ((NULL (NULL |ls|)) (SEQ (QSETVELT |sc| 1 (|SPADfirst| |ls|)) (EXIT (LETT |ls| (CDR |ls|) |SYMBOL;script;$L$;22|))))) (COND ((NULL (NULL |ls|)) (SEQ (QSETVELT |sc| 2 (|SPADfirst| |ls|)) (EXIT (LETT |ls| (CDR |ls|) |SYMBOL;script;$L$;22|))))) (COND ((NULL (NULL |ls|)) (SEQ (QSETVELT |sc| 3 (|SPADfirst| |ls|)) (EXIT (LETT |ls| (CDR |ls|) |SYMBOL;script;$L$;22|))))) (COND ((NULL (NULL |ls|)) (SEQ (QSETVELT |sc| 4 (|SPADfirst| |ls|)) (EXIT (LETT |ls| (CDR |ls|) |SYMBOL;script;$L$;22|))))) (EXIT (SPADCALL |sy| |sc| (QREFELT $ 81))))))) (DEFUN |SYMBOL;script;$R$;23| (|sy| |sc| $) (COND ((SPADCALL |sy| (QREFELT $ 21)) (|error| "Cannot add scripts to a scripted symbol")) ('T (CONS (SPADCALL (SPADCALL (STRCONC (|SYMBOL;syprefix| |sc| $) (SPADCALL (SPADCALL |sy| (QREFELT $ 82)) (QREFELT $ 83))) (QREFELT $ 48)) (QREFELT $ 53)) (|SYMBOL;syscripts| |sc| $))))) (DEFUN |SYMBOL;string;$S;24| (|e| $) (COND ((NULL (SPADCALL |e| (QREFELT $ 21))) (PNAME |e|)) ('T (|error| "Cannot form string from non-atomic symbols.")))) (DEFUN |SYMBOL;latex;$S;25| (|e| $) (PROG (|ss| |lo| |sc| |s|) (RETURN (SEQ (LETT |s| (PNAME (SPADCALL |e| (QREFELT $ 82))) |SYMBOL;latex;$S;25|) (COND ((< 1 (QCSIZE |s|)) (COND ((NULL (SPADCALL (SPADCALL |s| 1 (QREFELT $ 84)) (SPADCALL "\\" (QREFELT $ 40)) (QREFELT $ 85))) (LETT |s| (STRCONC "\\mbox{\\it " (STRCONC |s| "}")) |SYMBOL;latex;$S;25|))))) (COND ((NULL (SPADCALL |e| (QREFELT $ 21))) (EXIT |s|))) (LETT |ss| (SPADCALL |e| (QREFELT $ 86)) |SYMBOL;latex;$S;25|) (LETT |lo| (QVELT |ss| 0) |SYMBOL;latex;$S;25|) (COND ((NULL (NULL |lo|)) (SEQ (LETT |sc| "_{" |SYMBOL;latex;$S;25|) (SEQ G190 (COND ((NULL (SPADCALL (NULL |lo|) (QREFELT $ 87))) (GO G191))) (SEQ (LETT |sc| (STRCONC |sc| (SPADCALL (|SPADfirst| |lo|) (QREFELT $ 88))) |SYMBOL;latex;$S;25|) (LETT |lo| (CDR |lo|) |SYMBOL;latex;$S;25|) (EXIT (COND ((NULL (NULL |lo|)) (LETT |sc| (STRCONC |sc| ", ") |SYMBOL;latex;$S;25|))))) NIL (GO G190) G191 (EXIT NIL)) (LETT |sc| (STRCONC |sc| "}") |SYMBOL;latex;$S;25|) (EXIT (LETT |s| (STRCONC |s| |sc|) |SYMBOL;latex;$S;25|))))) (LETT |lo| (QVELT |ss| 1) |SYMBOL;latex;$S;25|) (COND ((NULL (NULL |lo|)) (SEQ (LETT |sc| "^{" |SYMBOL;latex;$S;25|) (SEQ G190 (COND ((NULL (SPADCALL (NULL |lo|) (QREFELT $ 87))) (GO G191))) (SEQ (LETT |sc| (STRCONC |sc| (SPADCALL (|SPADfirst| |lo|) (QREFELT $ 88))) |SYMBOL;latex;$S;25|) (LETT |lo| (CDR |lo|) |SYMBOL;latex;$S;25|) (EXIT (COND ((NULL (NULL |lo|)) (LETT |sc| (STRCONC |sc| ", ") |SYMBOL;latex;$S;25|))))) NIL (GO G190) G191 (EXIT NIL)) (LETT |sc| (STRCONC |sc| "}") |SYMBOL;latex;$S;25|) (EXIT (LETT |s| (STRCONC |s| |sc|) |SYMBOL;latex;$S;25|))))) (LETT |lo| (QVELT |ss| 2) |SYMBOL;latex;$S;25|) (COND ((NULL (NULL |lo|)) (SEQ (LETT |sc| "{}^{" |SYMBOL;latex;$S;25|) (SEQ G190 (COND ((NULL (SPADCALL (NULL |lo|) (QREFELT $ 87))) (GO G191))) (SEQ (LETT |sc| (STRCONC |sc| (SPADCALL (|SPADfirst| |lo|) (QREFELT $ 88))) |SYMBOL;latex;$S;25|) (LETT |lo| (CDR |lo|) |SYMBOL;latex;$S;25|) (EXIT (COND ((NULL (NULL |lo|)) (LETT |sc| (STRCONC |sc| ", ") |SYMBOL;latex;$S;25|))))) NIL (GO G190) G191 (EXIT NIL)) (LETT |sc| (STRCONC |sc| "}") |SYMBOL;latex;$S;25|) (EXIT (LETT |s| (STRCONC |sc| |s|) |SYMBOL;latex;$S;25|))))) (LETT |lo| (QVELT |ss| 3) |SYMBOL;latex;$S;25|) (COND ((NULL (NULL |lo|)) (SEQ (LETT |sc| "{}_{" |SYMBOL;latex;$S;25|) (SEQ G190 (COND ((NULL (SPADCALL (NULL |lo|) (QREFELT $ 87))) (GO G191))) (SEQ (LETT |sc| (STRCONC |sc| (SPADCALL (|SPADfirst| |lo|) (QREFELT $ 88))) |SYMBOL;latex;$S;25|) (LETT |lo| (CDR |lo|) |SYMBOL;latex;$S;25|) (EXIT (COND ((NULL (NULL |lo|)) (LETT |sc| (STRCONC |sc| ", ") |SYMBOL;latex;$S;25|))))) NIL (GO G190) G191 (EXIT NIL)) (LETT |sc| (STRCONC |sc| "}") |SYMBOL;latex;$S;25|) (EXIT (LETT |s| (STRCONC |sc| |s|) |SYMBOL;latex;$S;25|))))) (LETT |lo| (QVELT |ss| 4) |SYMBOL;latex;$S;25|) (COND ((NULL (NULL |lo|)) (SEQ (LETT |sc| "\\left( {" |SYMBOL;latex;$S;25|) (SEQ G190 (COND ((NULL (SPADCALL (NULL |lo|) (QREFELT $ 87))) (GO G191))) (SEQ (LETT |sc| (STRCONC |sc| (SPADCALL (|SPADfirst| |lo|) (QREFELT $ 88))) |SYMBOL;latex;$S;25|) (LETT |lo| (CDR |lo|) |SYMBOL;latex;$S;25|) (EXIT (COND ((NULL (NULL |lo|)) (LETT |sc| (STRCONC |sc| ", ") |SYMBOL;latex;$S;25|))))) NIL (GO G190) G191 (EXIT NIL)) (LETT |sc| (STRCONC |sc| "} \\right)") |SYMBOL;latex;$S;25|) (EXIT (LETT |s| (STRCONC |s| |sc|) |SYMBOL;latex;$S;25|))))) (EXIT |s|))))) (DEFUN |SYMBOL;anyRadix| (|n| |s| $) (PROG (|qr| |ns| #0=#:G3069) (RETURN (SEQ (EXIT (SEQ (LETT |ns| "" |SYMBOL;anyRadix|) (EXIT (SEQ G190 NIL (SEQ (LETT |qr| (DIVIDE2 |n| (QCSIZE |s|)) |SYMBOL;anyRadix|) (LETT |n| (QCAR |qr|) |SYMBOL;anyRadix|) (LETT |ns| (SPADCALL (SPADCALL |s| (+ (QCDR |qr|) (SPADCALL |s| (QREFELT $ 90))) (QREFELT $ 84)) |ns| (QREFELT $ 91)) |SYMBOL;anyRadix|) (EXIT (COND ((ZEROP |n|) (PROGN (LETT #0# |ns| |SYMBOL;anyRadix|) (GO #0#)))))) NIL (GO G190) G191 (EXIT NIL))))) #0# (EXIT #0#))))) (DEFUN |SYMBOL;new;$;27| ($) (PROG (|sym|) (RETURN (SEQ (LETT |sym| (|SYMBOL;anyRadix| (SPADCALL (QREFELT $ 9) (QREFELT $ 92)) (QREFELT $ 18) $) |SYMBOL;new;$;27|) (SPADCALL (QREFELT $ 9) (+ (SPADCALL (QREFELT $ 9) (QREFELT $ 92)) 1) (QREFELT $ 93)) (EXIT (SPADCALL (STRCONC "%" |sym|) (QREFELT $ 48))))))) (DEFUN |SYMBOL;new;2$;28| (|x| $) (PROG (|u| |n| |xx|) (RETURN (SEQ (LETT |n| (SEQ (LETT |u| (SPADCALL |x| (QREFELT $ 12) (QREFELT $ 96)) |SYMBOL;new;2$;28|) (EXIT (COND ((QEQCAR |u| 1) 0) ('T (+ (QCDR |u|) 1))))) |SYMBOL;new;2$;28|) (SPADCALL (QREFELT $ 12) |x| |n| (QREFELT $ 97)) (LETT |xx| (COND ((NULL (SPADCALL |x| (QREFELT $ 21))) (SPADCALL |x| (QREFELT $ 83))) ('T (SPADCALL (SPADCALL |x| (QREFELT $ 82)) (QREFELT $ 83)))) |SYMBOL;new;2$;28|) (LETT |xx| (STRCONC "%" |xx|) |SYMBOL;new;2$;28|) (LETT |xx| (COND ((NULL (< (SPADCALL (SPADCALL |xx| (SPADCALL |xx| (QREFELT $ 98)) (QREFELT $ 84)) (QREFELT $ 17) (QREFELT $ 99)) (SPADCALL (QREFELT $ 17) (QREFELT $ 90)))) (STRCONC |xx| (|SYMBOL;anyRadix| |n| (QREFELT $ 19) $))) ('T (STRCONC |xx| (|SYMBOL;anyRadix| |n| (QREFELT $ 17) $)))) |SYMBOL;new;2$;28|) (COND ((NULL (SPADCALL |x| (QREFELT $ 21))) (EXIT (SPADCALL |xx| (QREFELT $ 48))))) (EXIT (SPADCALL (SPADCALL |xx| (QREFELT $ 48)) (SPADCALL |x| (QREFELT $ 86)) (QREFELT $ 81))))))) (DEFUN |SYMBOL;resetNew;V;29| ($) (PROG (|k| #0=#:G3092) (RETURN (SEQ (SPADCALL (QREFELT $ 9) 0 (QREFELT $ 93)) (SEQ (LETT |k| NIL |SYMBOL;resetNew;V;29|) (LETT #0# (SPADCALL (QREFELT $ 12) (QREFELT $ 102)) |SYMBOL;resetNew;V;29|) G190 (COND ((OR (ATOM #0#) (PROGN (LETT |k| (CAR #0#) |SYMBOL;resetNew;V;29|) NIL)) (GO G191))) (SEQ (EXIT (SPADCALL |k| (QREFELT $ 12) (QREFELT $ 103)))) (LETT #0# (CDR #0#) |SYMBOL;resetNew;V;29|) (GO G190) G191 (EXIT NIL)) (EXIT (SPADCALL (QREFELT $ 104))))))) (DEFUN |SYMBOL;scripted?;$B;30| (|sy| $) (SPADCALL (ATOM |sy|) (QREFELT $ 87))) (DEFUN |SYMBOL;name;2$;31| (|sy| $) (PROG (|str| |i| #0=#:G3099 #1=#:G3098 #2=#:G3096) (RETURN (SEQ (EXIT (COND ((NULL (SPADCALL |sy| (QREFELT $ 21))) |sy|) ('T (SEQ (LETT |str| (SPADCALL (SPADCALL (SPADCALL |sy| (QREFELT $ 106)) (QREFELT $ 107)) (QREFELT $ 83)) |SYMBOL;name;2$;31|) (SEQ (EXIT (SEQ (LETT |i| (+ (QREFELT $ 38) 1) |SYMBOL;name;2$;31|) (LETT #0# (QCSIZE |str|) |SYMBOL;name;2$;31|) G190 (COND ((> |i| #0#) (GO G191))) (SEQ (EXIT (COND ((NULL (SPADCALL (SPADCALL |str| |i| (QREFELT $ 84)) (QREFELT $ 108))) (PROGN (LETT #2# (PROGN (LETT #1# (SPADCALL (SPADCALL |str| (SPADCALL |i| (QCSIZE |str|) (QREFELT $ 110)) (QREFELT $ 111)) (QREFELT $ 48)) |SYMBOL;name;2$;31|) (GO #1#)) |SYMBOL;name;2$;31|) (GO #2#)))))) (LETT |i| (+ |i| 1) |SYMBOL;name;2$;31|) (GO G190) G191 (EXIT NIL))) #2# (EXIT #2#)) (EXIT (|error| "Improper scripted symbol")))))) #1# (EXIT #1#))))) (DEFUN |SYMBOL;scripts;$R;32| (|sy| $) (PROG (|lscripts| |str| |nstr| |j| #0=#:G3102 |nscripts| |m| |n| #1=#:G3111 |i| #2=#:G3112 |a| #3=#:G3113 |allscripts|) (RETURN (SEQ (COND ((NULL (SPADCALL |sy| (QREFELT $ 21))) (VECTOR NIL NIL NIL NIL NIL)) ('T (SEQ (LETT |nscripts| (LIST 0 0 0 0 0) |SYMBOL;scripts;$R;32|) (LETT |lscripts| (LIST NIL NIL NIL NIL NIL) |SYMBOL;scripts;$R;32|) (LETT |str| (SPADCALL (SPADCALL (SPADCALL |sy| (QREFELT $ 106)) (QREFELT $ 107)) (QREFELT $ 83)) |SYMBOL;scripts;$R;32|) (LETT |nstr| (QCSIZE |str|) |SYMBOL;scripts;$R;32|) (LETT |m| (SPADCALL |nscripts| (QREFELT $ 113)) |SYMBOL;scripts;$R;32|) (SEQ (LETT |j| (+ (QREFELT $ 38) 1) |SYMBOL;scripts;$R;32|) (LETT |i| |m| |SYMBOL;scripts;$R;32|) G190 (COND ((OR (> |j| |nstr|) (NULL (SPADCALL (SPADCALL |str| |j| (QREFELT $ 84)) (QREFELT $ 108)))) (GO G191))) (SEQ (EXIT (SPADCALL |nscripts| |i| (PROG1 (LETT #0# (- (SPADCALL (SPADCALL |str| |j| (QREFELT $ 84)) (QREFELT $ 42)) (QREFELT $ 43)) |SYMBOL;scripts;$R;32|) (|check-subtype| (>= #0# 0) '(|NonNegativeInteger|) #0#)) (QREFELT $ 114)))) (LETT |i| (PROG1 (+ |i| 1) (LETT |j| (+ |j| 1) |SYMBOL;scripts;$R;32|)) |SYMBOL;scripts;$R;32|) (GO G190) G191 (EXIT NIL)) (LETT |nscripts| (SPADCALL (CDR |nscripts|) (|SPADfirst| |nscripts|) (QREFELT $ 115)) |SYMBOL;scripts;$R;32|) (LETT |allscripts| (SPADCALL (SPADCALL |sy| (QREFELT $ 106)) (QREFELT $ 116)) |SYMBOL;scripts;$R;32|) (LETT |m| (SPADCALL |lscripts| (QREFELT $ 117)) |SYMBOL;scripts;$R;32|) (SEQ (LETT |n| NIL |SYMBOL;scripts;$R;32|) (LETT #1# |nscripts| |SYMBOL;scripts;$R;32|) (LETT |i| |m| |SYMBOL;scripts;$R;32|) G190 (COND ((OR (ATOM #1#) (PROGN (LETT |n| (CAR #1#) |SYMBOL;scripts;$R;32|) NIL)) (GO G191))) (SEQ (EXIT (COND ((< (SPADCALL |allscripts| (QREFELT $ 118)) |n|) (|error| "Improper script count in symbol")) ('T (SEQ (SPADCALL |lscripts| |i| (PROGN (LETT #2# NIL |SYMBOL;scripts;$R;32|) (SEQ (LETT |a| NIL |SYMBOL;scripts;$R;32|) (LETT #3# (SPADCALL |allscripts| |n| (QREFELT $ 119)) |SYMBOL;scripts;$R;32|) G190 (COND ((OR (ATOM #3#) (PROGN (LETT |a| (CAR #3#) |SYMBOL;scripts;$R;32|) NIL)) (GO G191))) (SEQ (EXIT (LETT #2# (CONS (SPADCALL |a| (QREFELT $ 53)) #2#) |SYMBOL;scripts;$R;32|))) (LETT #3# (CDR #3#) |SYMBOL;scripts;$R;32|) (GO G190) G191 (EXIT (NREVERSE0 #2#)))) (QREFELT $ 120)) (EXIT (LETT |allscripts| (SPADCALL |allscripts| |n| (QREFELT $ 121)) |SYMBOL;scripts;$R;32|))))))) (LETT |i| (PROG1 (+ |i| 1) (LETT #1# (CDR #1#) |SYMBOL;scripts;$R;32|)) |SYMBOL;scripts;$R;32|) (GO G190) G191 (EXIT NIL)) (EXIT (VECTOR (SPADCALL |lscripts| |m| (QREFELT $ 122)) (SPADCALL |lscripts| (+ |m| 1) (QREFELT $ 122)) (SPADCALL |lscripts| (+ |m| 2) (QREFELT $ 122)) (SPADCALL |lscripts| (+ |m| 3) (QREFELT $ 122)) (SPADCALL |lscripts| (+ |m| 4) (QREFELT $ 122))))))))))) (DEFUN |SYMBOL;istring| (|n| $) (COND ((< 9 |n|) (|error| "Can have at most 9 scripts of each kind")) ('T (ELT (QREFELT $ 16) (+ |n| 0))))) (DEFUN |SYMBOL;list;$L;34| (|sy| $) (COND ((NULL (SPADCALL |sy| (QREFELT $ 21))) (|error| "Cannot convert a symbol to a list if it is not subscripted")) ('T |sy|))) (DEFUN |SYMBOL;sample;$;35| ($) (SPADCALL "aSymbol" (QREFELT $ 48))) (DEFUN |Symbol| () (PROG () (RETURN (PROG (#0=#:G3120) (RETURN (COND ((LETT #0# (HGET |$ConstructorCache| '|Symbol|) |Symbol|) (|CDRwithIncrement| (CDAR #0#))) ('T (UNWIND-PROTECT (PROG1 (CDDAR (HPUT |$ConstructorCache| '|Symbol| (LIST (CONS NIL (CONS 1 (|Symbol;|)))))) (LETT #0# T |Symbol|)) (COND ((NOT #0#) (HREM |$ConstructorCache| '|Symbol|))))))))))) (DEFUN |Symbol;| () (PROG (|dv$| $ |pv$|) (RETURN (PROGN (LETT |dv$| '(|Symbol|) . #0=(|Symbol|)) (LETT $ (|newShell| 125) . #0#) (QSETREFV $ 0 |dv$|) (QSETREFV $ 3 (LETT |pv$| (|buildPredVector| 0 0 NIL) . #0#)) (|haddProp| |$ConstructorCache| '|Symbol| NIL (CONS 1 $)) (|stuffDomainSlots| $) (QSETREFV $ 9 (SPADCALL 0 (QREFELT $ 8))) (QSETREFV $ 12 (SPADCALL (QREFELT $ 11))) (QSETREFV $ 16 (SPADCALL (LIST "0" "1" "2" "3" "4" "5" "6" "7" "8" "9") (QREFELT $ 15))) (QSETREFV $ 17 "0123456789") (QSETREFV $ 18 "ABCDEFGHIJKLMNOPQRSTUVWXYZ") (QSETREFV $ 19 "abcdefghijklmnopqrstuvwxyz") (QSETREFV $ 37 "*") (QSETREFV $ 38 (QCSIZE (QREFELT $ 37))) (QSETREFV $ 43 (SPADCALL (SPADCALL "0" (QREFELT $ 40)) (QREFELT $ 42))) $)))) (MAKEPROP '|Symbol| '|infovec| (LIST '#(NIL NIL NIL NIL NIL NIL (|Integer|) (|Reference| 6) (0 . |ref|) '|count| (|AssociationList| $$ 6) (5 . |empty|) '|xcount| (|List| 28) (|PrimitiveArray| 28) (9 . |construct|) '|istrings| '|nums| 'ALPHAS '|alphas| (|Boolean|) |SYMBOL;scripted?;$B;30| (|Void|) (|Symbol|) (|OpenMathDevice|) (14 . |OMputVariable|) (|OpenMathEncoding|) (20 . |OMencodingXML|) (|String|) (24 . |OMopenString|) (30 . |OMputObject|) (35 . |OMputEndObject|) (40 . |OMclose|) |SYMBOL;OMwrite;$S;2| |SYMBOL;OMwrite;$BS;3| |SYMBOL;OMwrite;Omd$V;4| |SYMBOL;OMwrite;Omd$BV;5| '|hd| '|lhd| (|Character|) (45 . |char|) (|NonNegativeInteger|) (50 . |ord|) '|ord0| (|InputForm|) (55 . |convert|) |SYMBOL;convert;$If;6| |SYMBOL;convert;$S;7| |SYMBOL;coerce;S$;8| |SYMBOL;=;2$B;9| |SYMBOL;<;2$B;10| (|OutputForm|) (60 . |outputForm|) |SYMBOL;coerce;$Of;11| (|List| 56) |SYMBOL;script;$L$;22| (|List| 51) |SYMBOL;subscript;$L$;12| |SYMBOL;elt;$L$;13| |SYMBOL;superscript;$L$;14| |SYMBOL;argscript;$L$;15| (|PatternMatchResult| 6 23) (|Pattern| 6) (|PatternMatchSymbol| 6) (65 . |patternMatch|) (|PatternMatchResult| 6 $) |SYMBOL;patternMatch;$P2Pmr;16| (|PatternMatchResult| (|Float|) 23) (|Pattern| (|Float|)) (|PatternMatchSymbol| (|Float|)) (72 . |patternMatch|) (|PatternMatchResult| (|Float|) $) |SYMBOL;patternMatch;$P2Pmr;17| (79 . |coerce|) |SYMBOL;convert;$P;18| (84 . |coerce|) |SYMBOL;convert;$P;19| (|List| $) (89 . |concat|) (94 . |concat|) (|Record| (|:| |sub| 56) (|:| |sup| 56) (|:| |presup| 56) (|:| |presub| 56) (|:| |args| 56)) |SYMBOL;script;$R$;23| |SYMBOL;name;2$;31| |SYMBOL;string;$S;24| (100 . |elt|) (106 . =) |SYMBOL;scripts;$R;32| (112 . |not|) (117 . |latex|) |SYMBOL;latex;$S;25| (122 . |minIndex|) (127 . |concat|) (133 . |elt|) (138 . |setelt|) |SYMBOL;new;$;27| (|Union| 6 '"failed") (144 . |search|) (150 . |setelt|) (157 . |maxIndex|) (162 . |position|) |SYMBOL;new;2$;28| (|List| $$) (168 . |keys|) (173 . |remove!|) (179 . |void|) |SYMBOL;resetNew;V;29| |SYMBOL;list;$L;34| (183 . |first|) (188 . |digit?|) (|UniversalSegment| 6) (193 . SEGMENT) (199 . |elt|) (|List| 41) (205 . |minIndex|) (210 . |setelt|) (217 . |concat|) (223 . |rest|) (228 . |minIndex|) (233 . |#|) (238 . |first|) (244 . |setelt|) (251 . |rest|) (257 . |elt|) (CONS IDENTITY (FUNCALL (|dispatchFunction| |SYMBOL;sample;$;35|) $)) (|SingleInteger|)) '#(~= 263 |superscript| 269 |subscript| 275 |string| 281 |scripts| 286 |scripted?| 291 |script| 296 |sample| 308 |resetNew| 312 |patternMatch| 316 |new| 330 |name| 339 |min| 344 |max| 350 |list| 356 |latex| 361 |hash| 366 |elt| 371 |convert| 377 |coerce| 397 |argscript| 407 |OMwrite| 413 >= 437 > 443 = 449 <= 455 < 461) 'NIL (CONS (|makeByteWordVec2| 1 '(0 0 0 0 0 0 0 0 0 0 0)) (CONS '#(|OrderedSet&| NIL NIL |SetCategory&| |BasicType&| NIL NIL NIL NIL NIL NIL) (CONS '#((|OrderedSet|) (|PatternMatchable| (|Float|)) (|PatternMatchable| 6) (|SetCategory|) (|BasicType|) (|ConvertibleTo| 68) (|ConvertibleTo| 62) (|ConvertibleTo| 23) (|OpenMath|) (|ConvertibleTo| 44) (|CoercibleTo| 51)) (|makeByteWordVec2| 124 '(1 7 0 6 8 0 10 0 11 1 14 0 13 15 2 24 22 0 23 25 0 26 0 27 2 24 0 28 26 29 1 24 22 0 30 1 24 22 0 31 1 24 22 0 32 1 39 0 28 40 1 39 41 0 42 1 44 0 23 45 1 51 0 23 52 3 63 61 23 62 61 64 3 69 67 23 68 67 70 1 68 0 23 73 1 62 0 23 75 1 28 0 77 78 2 56 0 0 0 79 2 28 39 0 6 84 2 39 20 0 0 85 1 20 0 0 87 1 51 28 0 88 1 28 6 0 90 2 28 0 39 0 91 1 7 6 0 92 2 7 6 0 6 93 2 10 95 2 0 96 3 10 6 0 2 6 97 1 28 6 0 98 2 28 6 39 0 99 1 10 101 0 102 2 10 95 2 0 103 0 22 0 104 1 101 2 0 107 1 39 20 0 108 2 109 0 6 6 110 2 28 0 0 109 111 1 112 6 0 113 3 112 41 0 6 41 114 2 112 0 0 41 115 1 101 0 0 116 1 54 6 0 117 1 101 41 0 118 2 101 0 0 41 119 3 54 56 0 6 56 120 2 101 0 0 41 121 2 54 56 0 6 122 2 0 20 0 0 1 2 0 0 0 56 59 2 0 0 0 56 57 1 0 28 0 83 1 0 80 0 86 1 0 20 0 21 2 0 0 0 54 55 2 0 0 0 80 81 0 0 0 123 0 0 22 105 3 0 65 0 62 65 66 3 0 71 0 68 71 72 1 0 0 0 100 0 0 0 94 1 0 0 0 82 2 0 0 0 0 1 2 0 0 0 0 1 1 0 77 0 106 1 0 28 0 89 1 0 124 0 1 2 0 0 0 56 58 1 0 62 0 76 1 0 68 0 74 1 0 23 0 47 1 0 44 0 46 1 0 0 28 48 1 0 51 0 53 2 0 0 0 56 60 3 0 22 24 0 20 36 2 0 28 0 20 34 2 0 22 24 0 35 1 0 28 0 33 2 0 20 0 0 1 2 0 20 0 0 1 2 0 20 0 0 49 2 0 20 0 0 1 2 0 20 0 0 50))))) '|lookupComplete|)) (MAKEPROP '|Symbol| 'NILADIC T) @ \section{License} <>= --Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. --All rights reserved. -- --Redistribution and use in source and binary forms, with or without --modification, are permitted provided that the following conditions are --met: -- -- - Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- -- - Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in -- the documentation and/or other materials provided with the -- distribution. -- -- - Neither the name of The Numerical ALgorithms Group Ltd. nor the -- names of its contributors may be used to endorse or promote products -- derived from this software without specific prior written permission. -- --THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS --IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED --TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A --PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER --OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, --EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, --PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR --PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF --LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING --NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS --SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @ <<*>>= <> <> @ \eject \begin{thebibliography}{99} \bibitem{1} nothing \end{thebibliography} \end{document}