\documentclass{article}
\usepackage{open-axiom}
\begin{document}
\title{\$SPAD/src/algebra variable.spad}
\author{The Axiom Team}
\maketitle
\begin{abstract}
\end{abstract}
\eject
\tableofcontents
\eject
\section{domain OVAR OrderedVariableList}
<<domain OVAR OrderedVariableList>>=
)abbrev domain OVAR OrderedVariableList
++ Description:
++ This domain implements ordered variables
OrderedVariableList(VariableList:List Symbol):
  Join(OrderedFinite, ConvertibleTo Symbol, ConvertibleTo InputForm,
       ConvertibleTo Pattern Float, ConvertibleTo Pattern Integer) with
         variable: Symbol -> Union(%,"failed")
		++ variable(s) returns a member of the variable set or failed
    == add
       VariableList := removeDuplicates VariableList
       Rep := PositiveInteger
       s1,s2:%
       convert(s1):Symbol == VariableList.((s1::Rep)::PositiveInteger)
       coerce(s1):OutputForm == (convert(s1)@Symbol)::OutputForm
       convert(s1):InputForm == convert(convert(s1)@Symbol)
       convert(s1):Pattern(Integer) == convert(convert(s1)@Symbol)
       convert(s1):Pattern(Float) == convert(convert(s1)@Symbol)
       index i   == i::%
       lookup j  == j :: Rep
       size ()   == #VariableList
       variable(exp:Symbol) ==
            for i in 1.. for exp2 in VariableList repeat
                if exp=exp2 then return i::PositiveInteger::%
            "failed"
       s1 < s2 == s2 <$Rep s1
       s1 = s2 == s1 =$Rep s2
       latex(x:%):String      == latex(convert(x)@Symbol)

@
\section{domain VARIABLE Variable}
<<domain VARIABLE Variable>>=
)abbrev domain VARIABLE Variable
++ Description:
++ This domain implements variables
Variable(sym:Symbol): Join(SetCategory, CoercibleTo Symbol) with
        coerce  : % -> Symbol
		++ coerce(x) returns the symbol
        variable: () -> Symbol
		++ variable() returns the symbol
    == add
        coerce(x:%):Symbol     == sym
        coerce(x:%):OutputForm == sym::OutputForm
        variable()             == sym
        x = y                  == true
        latex(x:%):String      == latex sym

@
\section{domain RULECOLD RuleCalled}
<<domain RULECOLD RuleCalled>>=
)abbrev domain RULECOLD RuleCalled
++ Description:
++ This domain implements named rules 
RuleCalled(f:Symbol): SetCategory with 
	name: % -> Symbol 
		++ name(x) returns the symbol
 == add
  name r                 == f
  coerce(r:%):OutputForm == f::OutputForm
  x = y                  == true
  latex(x:%):String      == latex f

@
\section{domain FUNCTION FunctionCalled}
<<domain FUNCTION FunctionCalled>>=
)abbrev domain FUNCTION FunctionCalled
++ Description:
++ This domain implements named functions
FunctionCalled(f:Symbol): SetCategory with 
	name: % -> Symbol 
		++ name(x) returns the symbol
  == add
   name r                 == f
   coerce(r:%):OutputForm == f::OutputForm
   x = y                  == true
   latex(x:%):String      == latex f

@
\section{domain ANON AnonymousFunction}
<<domain ANON AnonymousFunction>>=
)abbrev domain ANON AnonymousFunction
++ Date Last Modified: April 20, 2009
++ Description:
++   This domain implements anonymous functions
AnonymousFunction():SetCategory with
    parameters: % -> List Identifier
      ++ parameters(f) returns the list of parameters bound by `f'.
    body: % -> Syntax
      ++ body(f) returns the body of the unnamed function `f'.
  == add
    import Syntax
    import %lsecond: % -> Syntax from Foreign Builtin
    import %lthird: % -> Syntax  from Foreign Builtin
    coerce(x:%):OutputForm == 
      x pretend OutputForm

    parameters f ==
      ps := %lsecond f
      ps case Identifier => [ps]$List(Identifier)
      getOperands(ps) pretend List(Identifier)

    body f ==
      %lthird f

@

\section{The ModePatternVariable}
<<domain MODEPVAR ModePatternVariable>>=
)abbrev domain MODEPVAR ModePatternVariable
++ Author: Gabriel Dos Reis
++ Date Create: June 10, 2008
++ Description:  This is the datatype for pattern variables in library
++   modemap description.
ModePatternVariable(): Public == Private where
  Public == SetCategory
  Private == add
    Rep == Symbol
    x = y ==
      rep x = rep y
    coerce(x: %): OutputForm ==
      outputForm rep x
@


\section{License}
<<license>>=
--Copyright (C) 1991-2002, The Numerical Algorithms Group Ltd.
--All rights reserved.
--Copyright (C) 2007-2008, Gabriel Dos Reis.
--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.
@
<<*>>=
<<license>>

<<domain VARIABLE Variable>>
<<domain RULECOLD RuleCalled>>
<<domain FUNCTION FunctionCalled>>
<<domain OVAR OrderedVariableList>>
<<domain ANON AnonymousFunction>>
@
\eject
\begin{thebibliography}{99}
\bibitem{1} nothing
\end{thebibliography}
\end{document}