aboutsummaryrefslogtreecommitdiff
path: root/src/algebra/fortran.spad.pamphlet
diff options
context:
space:
mode:
Diffstat (limited to 'src/algebra/fortran.spad.pamphlet')
-rw-r--r--src/algebra/fortran.spad.pamphlet1784
1 files changed, 0 insertions, 1784 deletions
diff --git a/src/algebra/fortran.spad.pamphlet b/src/algebra/fortran.spad.pamphlet
deleted file mode 100644
index 050960e0..00000000
--- a/src/algebra/fortran.spad.pamphlet
+++ /dev/null
@@ -1,1784 +0,0 @@
-\documentclass{article}
-\usepackage{open-axiom}
-\begin{document}
-\title{src/algebra fortran.spad}
-\author{Didier Pinchon, Mike Dewar, William Naylor}
-\maketitle
-
-\begin{abstract}
-\end{abstract}
-\tableofcontents
-\eject
-
-\section{domain RESULT Result}
-
-<<domain RESULT Result>>=
-import Boolean
-import Symbol
-import OutputForm
-import Any
-import TableAggregate
-)abbrev domain RESULT Result
-++ Author: Didier Pinchon and Mike Dewar
-++ Date Created: 8 April 1994
-++ Date Last Updated: 28 June 1994
-++ Basic Operations:
-++ Related Domains:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ Examples:
-++ References:
-++ Description: A domain used to return the results from a call to the NAG
-++ Library. It prints as a list of names and types, though the user may
-++ choose to display values automatically if he or she wishes.
-Result():Exports==Implementation where
-
- O ==> OutputForm
-
- Exports ==> TableAggregate(Symbol,Any) with
- showScalarValues : Boolean -> Boolean
- ++ showScalarValues(true) forces the values of scalar components to be
- ++ displayed rather than just their types.
- showArrayValues : Boolean -> Boolean
- ++ showArrayValues(true) forces the values of array components to be
- ++ displayed rather than just their types.
- finiteAggregate
-
- Implementation ==> Table(Symbol,Any) add
- import SExpression
-
- -- Constant
- colon := ": "::Symbol::O
- elide := "..."::Symbol::O
-
- -- Flags
- showScalarValuesFlag : Boolean := false
- showArrayValuesFlag : Boolean := false
-
- cleanUpDomainForm(d:SExpression):O ==
- not list? d => d::O
- #d=1 => (car d)::O
- -- If the car is an atom then we have a domain constructor, if not
- -- then we have some kind of value. Since we often can't print these
- -- ****ers we just elide them.
- not atom? car d => elide
- prefix((car d)::O,[cleanUpDomainForm(u) for u in destruct cdr(d)]$List(O))
-
- display(v:Any,d:SExpression):O ==
- not list? d => error "Domain form is non-list"
- #d=1 =>
- showScalarValuesFlag => v::OutputForm
- cleanUpDomainForm d
- car(d) = convert("Complex"::Symbol)@SExpression =>
- showScalarValuesFlag => v::OutputForm
- cleanUpDomainForm d
- showArrayValuesFlag => v::OutputForm
- cleanUpDomainForm d
-
- makeEntry(k:Symbol,v:Any):O ==
- hconcat [k::O,colon,display(v,dom v)]
-
- coerce(r:%):O ==
- bracket [makeEntry(key,r.key) for key in reverse! keys(r)]
-
- showArrayValues(b:Boolean):Boolean == showArrayValuesFlag := b
- showScalarValues(b:Boolean):Boolean == showScalarValuesFlag := b
-
-@
-
-\section{domain FC FortranCode}
-
-<<domain FC FortranCode>>=
-import Void
-import List
-import Fraction
-)abbrev domain FC FortranCode
--- The FortranCode domain is used to represent operations which are to be
--- translated into FORTRAN.
-++ Author: Mike Dewar
-++ Date Created: April 1991
-++ Date Last Updated: 22 March 1994
-++ 26 May 1994 Added common, MCD
-++ 21 June 1994 Changed print to printStatement, MCD
-++ 30 June 1994 Added stop, MCD
-++ 12 July 1994 Added assign for String, MCD
-++ 9 January 1995 Added fortran2Lines to getCall, MCD
-++ Basic Operations:
-++ Related Constructors: FortranProgram, Switch, FortranType
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ This domain builds representations of program code segments for use with
-++ the FortranProgram domain.
-FortranCode(): public == private where
- L ==> List
- PI ==> PositiveInteger
- PIN ==> Polynomial Integer
- SEX ==> SExpression
- O ==> OutputForm
- OP ==> Union(Null:"null",
- Assignment:"assignment",
- Conditional:"conditional",
- Return:"return",
- Block:"block",
- Comment:"comment",
- Call:"call",
- For:"for",
- While:"while",
- Repeat:"repeat",
- Goto:"goto",
- Continue:"continue",
- ArrayAssignment:"arrayAssignment",
- Save:"save",
- Stop:"stop",
- Common:"common",
- Print:"print")
- ARRAYASS ==> Record(var:Symbol, rand:O, ints2Floats?:Boolean)
- EXPRESSION ==> Record(ints2Floats?:Boolean,expr:O)
- ASS ==> Record(var:Symbol,
- arrayIndex:L PIN,
- rand:EXPRESSION
- )
- COND ==> Record(switch: Switch(),
- thenClause: $,
- elseClause: $
- )
- RETURN ==> Record(empty?:Boolean,value:EXPRESSION)
- BLOCK ==> List $
- COMMENT ==> List String
- COMMON ==> Record(name:Symbol,contents:List Symbol)
- CALL ==> String
- FOR ==> Record(range:SegmentBinding PIN, span:PIN, body:$)
- LABEL ==> SingleInteger
- LOOP ==> Record(switch:Switch(),body:$)
- PRINTLIST ==> List O
- OPREC ==> Union(nullBranch:"null", assignmentBranch:ASS,
- arrayAssignmentBranch:ARRAYASS,
- conditionalBranch:COND, returnBranch:RETURN,
- blockBranch:BLOCK, commentBranch:COMMENT, callBranch:CALL,
- forBranch:FOR, labelBranch:LABEL, loopBranch:LOOP,
- commonBranch:COMMON, printBranch:PRINTLIST)
-
- public == SetCategory with
- forLoop: (SegmentBinding PIN,$) -> $
- ++ forLoop(i=1..10,c) creates a representation of a FORTRAN DO loop with
- ++ \spad{i} ranging over the values 1 to 10.
- forLoop: (SegmentBinding PIN,PIN,$) -> $
- ++ forLoop(i=1..10,n,c) creates a representation of a FORTRAN DO loop with
- ++ \spad{i} ranging over the values 1 to 10 by n.
- whileLoop: (Switch,$) -> $
- ++ whileLoop(s,c) creates a while loop in FORTRAN.
- repeatUntilLoop: (Switch,$) -> $
- ++ repeatUntilLoop(s,c) creates a repeat ... until loop in FORTRAN.
- goto: SingleInteger -> $
- ++ goto(l) creates a representation of a FORTRAN GOTO statement
- continue: SingleInteger -> $
- ++ continue(l) creates a representation of a FORTRAN CONTINUE labelled
- ++ with l
- comment: String -> $
- ++ comment(s) creates a representation of the String s as a single FORTRAN
- ++ comment.
- comment: List String -> $
- ++ comment(s) creates a representation of the Strings s as a multi-line
- ++ FORTRAN comment.
- call: String -> $
- ++ call(s) creates a representation of a FORTRAN CALL statement
- returns: () -> $
- ++ returns() creates a representation of a FORTRAN RETURN statement.
- returns: Expression MachineFloat -> $
- ++ returns(e) creates a representation of a FORTRAN RETURN statement
- ++ with a returned value.
- returns: Expression MachineInteger -> $
- ++ returns(e) creates a representation of a FORTRAN RETURN statement
- ++ with a returned value.
- returns: Expression MachineComplex -> $
- ++ returns(e) creates a representation of a FORTRAN RETURN statement
- ++ with a returned value.
- returns: Expression Float -> $
- ++ returns(e) creates a representation of a FORTRAN RETURN statement
- ++ with a returned value.
- returns: Expression Integer -> $
- ++ returns(e) creates a representation of a FORTRAN RETURN statement
- ++ with a returned value.
- returns: Expression Complex Float -> $
- ++ returns(e) creates a representation of a FORTRAN RETURN statement
- ++ with a returned value.
- cond: (Switch,$) -> $
- ++ cond(s,e) creates a representation of the FORTRAN expression
- ++ IF (s) THEN e.
- cond: (Switch,$,$) -> $
- ++ cond(s,e,f) creates a representation of the FORTRAN expression
- ++ IF (s) THEN e ELSE f.
- assign: (Symbol,String) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Expression MachineInteger) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Expression MachineFloat) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Expression MachineComplex) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Matrix MachineInteger) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Matrix MachineFloat) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Matrix MachineComplex) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Vector MachineInteger) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Vector MachineFloat) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Vector MachineComplex) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Matrix Expression MachineInteger) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Matrix Expression MachineFloat) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Matrix Expression MachineComplex) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Vector Expression MachineInteger) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Vector Expression MachineFloat) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Vector Expression MachineComplex) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,L PIN,Expression MachineInteger) -> $
- ++ assign(x,l,y) creates a representation of the assignment of \spad{y}
- ++ to the \spad{l}'th element of array \spad{x} (\spad{l} is a list of
- ++ indices).
- assign: (Symbol,L PIN,Expression MachineFloat) -> $
- ++ assign(x,l,y) creates a representation of the assignment of \spad{y}
- ++ to the \spad{l}'th element of array \spad{x} (\spad{l} is a list of
- ++ indices).
- assign: (Symbol,L PIN,Expression MachineComplex) -> $
- ++ assign(x,l,y) creates a representation of the assignment of \spad{y}
- ++ to the \spad{l}'th element of array \spad{x} (\spad{l} is a list of
- ++ indices).
- assign: (Symbol,Expression Integer) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Expression Float) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Expression Complex Float) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Matrix Expression Integer) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Matrix Expression Float) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Matrix Expression Complex Float) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Vector Expression Integer) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Vector Expression Float) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,Vector Expression Complex Float) -> $
- ++ assign(x,y) creates a representation of the FORTRAN expression
- ++ x=y.
- assign: (Symbol,L PIN,Expression Integer) -> $
- ++ assign(x,l,y) creates a representation of the assignment of \spad{y}
- ++ to the \spad{l}'th element of array \spad{x} (\spad{l} is a list of
- ++ indices).
- assign: (Symbol,L PIN,Expression Float) -> $
- ++ assign(x,l,y) creates a representation of the assignment of \spad{y}
- ++ to the \spad{l}'th element of array \spad{x} (\spad{l} is a list of
- ++ indices).
- assign: (Symbol,L PIN,Expression Complex Float) -> $
- ++ assign(x,l,y) creates a representation of the assignment of \spad{y}
- ++ to the \spad{l}'th element of array \spad{x} (\spad{l} is a list of
- ++ indices).
- block: List($) -> $
- ++ block(l) creates a representation of the statements in l as a block.
- stop: () -> $
- ++ stop() creates a representation of a STOP statement.
- save: () -> $
- ++ save() creates a representation of a SAVE statement.
- printStatement: List O -> $
- ++ printStatement(l) creates a representation of a PRINT statement.
- common: (Symbol,List Symbol) -> $
- ++ common(name,contents) creates a representation a named common block.
- operation: $ -> OP
- ++ operation(f) returns the name of the operation represented by \spad{f}.
- code: $ -> OPREC
- ++ code(f) returns the internal representation of the object represented
- ++ by \spad{f}.
- printCode: $ -> Void
- ++ printCode(f) prints out \spad{f} in FORTRAN notation.
- getCode: $ -> SEX
- ++ getCode(f) returns a Lisp list of strings representing \spad{f}
- ++ in Fortran notation. This is used by the FortranProgram domain.
- setLabelValue:SingleInteger -> SingleInteger
- ++ setLabelValue(i) resets the counter which produces labels to i
-
- private == add
- import Void
- import ASS
- import COND
- import RETURN
- import L PIN
- import O
- import SEX
- import FortranType
- import TheSymbolTable
-
- Rep := Record(op: OP, data: OPREC)
-
- -- We need to be able to generate unique labels
- labelValue:SingleInteger := 25000::SingleInteger
- setLabelValue(u:SingleInteger):SingleInteger == labelValue := u
- newLabel():SingleInteger ==
- labelValue := labelValue + 1$SingleInteger
- labelValue
-
- commaSep(l:List String):List(String) ==
- [(l.1),:[:[",",u] for u in rest(l)]]
-
- getReturn(rec:RETURN):SEX ==
- returnToken : SEX := convert("RETURN"::Symbol::O)$SEX
- elt(rec,empty?)$RETURN =>
- getStatement(returnToken,NIL$Lisp)$Lisp
- rt : EXPRESSION := elt(rec,value)$RETURN
- rv : O := elt(rt,expr)$EXPRESSION
- getStatement([returnToken,convert(rv)$SEX]$Lisp,
- elt(rt,ints2Floats?)$EXPRESSION )$Lisp
-
- getStop():SEX ==
- fortran2Lines(LIST("STOP")$Lisp)$Lisp
-
- getSave():SEX ==
- fortran2Lines(LIST("SAVE")$Lisp)$Lisp
-
- getCommon(u:COMMON):SEX ==
- fortran2Lines(APPEND(LIST("COMMON"," /",string (u.name),"/ ")$Lisp,_
- addCommas(u.contents)$Lisp)$Lisp)$Lisp
-
- getPrint(l:PRINTLIST):SEX ==
- ll : SEX := LIST("PRINT*")$Lisp
- for i in l repeat
- ll := APPEND(ll,CONS(",",expression2Fortran(i)$Lisp)$Lisp)$Lisp
- fortran2Lines(ll)$Lisp
-
- getBlock(rec:BLOCK):SEX ==
- indentFortLevel(convert(1@Integer)$SEX)$Lisp
- expr : SEX := LIST()$Lisp
- for u in rec repeat
- expr := APPEND(expr,getCode(u))$Lisp
- indentFortLevel(convert(-1@Integer)$SEX)$Lisp
- expr
-
- getBody(f:$):SEX ==
- operation(f) case Block => getCode f
- indentFortLevel(convert(1@Integer)$SEX)$Lisp
- expr := getCode f
- indentFortLevel(convert(-1@Integer)$SEX)$Lisp
- expr
-
- getElseIf(f:$):SEX ==
- rec := code f
- expr :=
- fortFormatElseIf(elt(rec.conditionalBranch,switch)$COND::O)$Lisp
- expr :=
- APPEND(expr,getBody elt(rec.conditionalBranch,thenClause)$COND)$Lisp
- elseBranch := elt(rec.conditionalBranch,elseClause)$COND
- not(operation(elseBranch) case Null) =>
- operation(elseBranch) case Conditional =>
- APPEND(expr,getElseIf elseBranch)$Lisp
- expr := APPEND(expr, getStatement(ELSE::O,NIL$Lisp)$Lisp)$Lisp
- expr := APPEND(expr, getBody elseBranch)$Lisp
- expr
-
- getContinue(label:SingleInteger):SEX ==
- lab : O := label::O
- if (width(lab) > 6) then error "Label too big"
- cnt : O := "CONTINUE"::O
- --sp : O := hspace(6-width lab)
- sp : O := hspace(_$fortIndent$Lisp -width lab)
- LIST(STRCONC(string(label)$String,sp,cnt)$Lisp)$Lisp
-
- getGoto(label:SingleInteger):SEX ==
- fortran2Lines(
- LIST(STRCONC("GOTO ",string(label)$String)$Lisp)$Lisp)$Lisp
-
- getRepeat(repRec:LOOP):SEX ==
- sw : Switch := NOT elt(repRec,switch)$LOOP
- lab := newLabel()
- bod := elt(repRec,body)$LOOP
- APPEND(getContinue lab,getBody bod,
- fortFormatIfGoto(sw::O,lab)$Lisp)$Lisp
-
- getWhile(whileRec:LOOP):SEX ==
- sw := NOT elt(whileRec,switch)$LOOP
- lab1 := newLabel()
- lab2 := newLabel()
- bod := elt(whileRec,body)$LOOP
- APPEND(fortFormatLabelledIfGoto(sw::O,lab1,lab2)$Lisp,
- getBody bod, getBody goto(lab1), getContinue lab2)$Lisp
-
- getArrayAssign(rec:ARRAYASS):SEX ==
- getfortarrayexp((rec.var)::O,rec.rand,rec.ints2Floats?)$Lisp
-
- getAssign(rec:ASS):SEX ==
- indices : L PIN := elt(rec,arrayIndex)$ASS
- if indices = []::(L PIN) then
- lhs := elt(rec,var)$ASS::O
- else
- lhs := cons(elt(rec,var)$ASS::PIN,indices)::O
- -- Must get the index brackets correct:
- lhs := (cdr car cdr convert(lhs)$SEX::SEX)::O -- Yuck!
- elt(elt(rec,rand)$ASS,ints2Floats?)$EXPRESSION =>
- assignment2Fortran1(lhs,elt(elt(rec,rand)$ASS,expr)$EXPRESSION)$Lisp
- integerAssignment2Fortran1(lhs,elt(elt(rec,rand)$ASS,expr)$EXPRESSION)$Lisp
-
- getCond(rec:COND):SEX ==
- expr := APPEND(fortFormatIf(elt(rec,switch)$COND::O)$Lisp,
- getBody elt(rec,thenClause)$COND)$Lisp
- elseBranch := elt(rec,elseClause)$COND
- if not(operation(elseBranch) case Null) then
- operation(elseBranch) case Conditional =>
- expr := APPEND(expr,getElseIf elseBranch)$Lisp
- expr := APPEND(expr,getStatement(ELSE::O,NIL$Lisp)$Lisp,
- getBody elseBranch)$Lisp
- APPEND(expr,getStatement(ENDIF::O,NIL$Lisp)$Lisp)$Lisp
-
- getComment(rec:COMMENT):SEX ==
- convert([convert(concat("C ",c)$String)@SEX for c in rec])@SEX
-
- getCall(rec:CALL):SEX ==
- expr := concat("CALL ",rec)$String
- #expr > 1320 => error "Fortran CALL too large"
- fortran2Lines(convert([convert(expr)@SEX ])@SEX)$Lisp
-
- getFor(rec:FOR):SEX ==
- rnge : SegmentBinding PIN := elt(rec,range)$FOR
- increment : PIN := elt(rec,span)$FOR
- lab : SingleInteger := newLabel()
- declare!(variable rnge,fortranInteger())
- expr := fortFormatDo(variable rnge, (lo segment rnge)::O,_
- (hi segment rnge)::O,increment::O,lab)$Lisp
- APPEND(expr, getBody elt(rec,body)$FOR, getContinue(lab))$Lisp
-
- getCode(f:$):SEX ==
- opp:OP := operation f
- rec:OPREC:= code f
- opp case Assignment => getAssign(rec.assignmentBranch)
- opp case ArrayAssignment => getArrayAssign(rec.arrayAssignmentBranch)
- opp case Conditional => getCond(rec.conditionalBranch)
- opp case Return => getReturn(rec.returnBranch)
- opp case Block => getBlock(rec.blockBranch)
- opp case Comment => getComment(rec.commentBranch)
- opp case Call => getCall(rec.callBranch)
- opp case For => getFor(rec.forBranch)
- opp case Continue => getContinue(rec.labelBranch)
- opp case Goto => getGoto(rec.labelBranch)
- opp case Repeat => getRepeat(rec.loopBranch)
- opp case While => getWhile(rec.loopBranch)
- opp case Save => getSave()
- opp case Stop => getStop()
- opp case Print => getPrint(rec.printBranch)
- opp case Common => getCommon(rec.commonBranch)
- error "Unsupported program construct."
- convert(0)@SEX
-
- printCode(f:$):Void ==
- displayLines1$Lisp getCode f
-
- code (f:$):OPREC ==
- elt(f,data)$Rep
-
- operation (f:$):OP ==
- elt(f,op)$Rep
-
- common(name':Symbol,contents':List Symbol):$ ==
- [["common"]$OP,[[name',contents']$COMMON]$OPREC]$Rep
-
- stop():$ ==
- [["stop"]$OP,["null"]$OPREC]$Rep
-
- save():$ ==
- [["save"]$OP,["null"]$OPREC]$Rep
-
- printStatement(l:List O):$ ==
- [["print"]$OP,[l]$OPREC]$Rep
-
- comment(s:List String):$ ==
- [["comment"]$OP,[s]$OPREC]$Rep
-
- comment(s:String):$ ==
- [["comment"]$OP,[list s]$OPREC]$Rep
-
- forLoop(r:SegmentBinding PIN,body':$):$ ==
- [["for"]$OP,[[r,(incr segment r)::PIN,body']$FOR]$OPREC]$Rep
-
- forLoop(r:SegmentBinding PIN,increment:PIN,body':$):$ ==
- [["for"]$OP,[[r,increment,body']$FOR]$OPREC]$Rep
-
- goto(l:SingleInteger):$ ==
- [["goto"]$OP,[l]$OPREC]$Rep
-
- continue(l:SingleInteger):$ ==
- [["continue"]$OP,[l]$OPREC]$Rep
-
- whileLoop(sw:Switch,b:$):$ ==
- [["while"]$OP,[[sw,b]$LOOP]$OPREC]$Rep
-
- repeatUntilLoop(sw:Switch,b:$):$ ==
- [["repeat"]$OP,[[sw,b]$LOOP]$OPREC]$Rep
-
- returns():$ ==
- v := [false,0::O]$EXPRESSION
- [["return"]$OP,[[true,v]$RETURN]$OPREC]$Rep
-
- returns(v:Expression MachineInteger):$ ==
- [["return"]$OP,[[false,[false,v::O]$EXPRESSION]$RETURN]$OPREC]$Rep
-
- returns(v:Expression MachineFloat):$ ==
- [["return"]$OP,[[false,[false,v::O]$EXPRESSION]$RETURN]$OPREC]$Rep
-
- returns(v:Expression MachineComplex):$ ==
- [["return"]$OP,[[false,[false,v::O]$EXPRESSION]$RETURN]$OPREC]$Rep
-
- returns(v:Expression Integer):$ ==
- [["return"]$OP,[[false,[false,v::O]$EXPRESSION]$RETURN]$OPREC]$Rep
-
- returns(v:Expression Float):$ ==
- [["return"]$OP,[[false,[false,v::O]$EXPRESSION]$RETURN]$OPREC]$Rep
-
- returns(v:Expression Complex Float):$ ==
- [["return"]$OP,[[false,[false,v::O]$EXPRESSION]$RETURN]$OPREC]$Rep
-
- block(l:List $):$ ==
- [["block"]$OP,[l]$OPREC]$Rep
-
- cond(sw:Switch,thenC:$):$ ==
- [["conditional"]$OP,
- [[sw,thenC,[["null"]$OP,["null"]$OPREC]$Rep]$COND]$OPREC]$Rep
-
- cond(sw:Switch,thenC:$,elseC:$):$ ==
- [["conditional"]$OP,[[sw,thenC,elseC]$COND]$OPREC]$Rep
-
- coerce(f : $):O ==
- (f.op)::O
-
- assign(v:Symbol,rhs:String):$ ==
- [["assignment"]$OP,[[v,nil()::L PIN,[false,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Matrix MachineInteger):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,false]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Matrix MachineFloat):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Matrix MachineComplex):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Vector MachineInteger):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,false]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Vector MachineFloat):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Vector MachineComplex):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Matrix Expression MachineInteger):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,false]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Matrix Expression MachineFloat):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Matrix Expression MachineComplex):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Vector Expression MachineInteger):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,false]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Vector Expression MachineFloat):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Vector Expression MachineComplex):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,index:L PIN,rhs:Expression MachineInteger):$ ==
- [["assignment"]$OP,[[v,index,[false,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,index:L PIN,rhs:Expression MachineFloat):$ ==
- [["assignment"]$OP,[[v,index,[true,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,index:L PIN,rhs:Expression MachineComplex):$ ==
- [["assignment"]$OP,[[v,index,[true,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Expression MachineInteger):$ ==
- [["assignment"]$OP,[[v,nil()::L PIN,[false,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Expression MachineFloat):$ ==
- [["assignment"]$OP,[[v,nil()::L PIN,[true,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Expression MachineComplex):$ ==
- [["assignment"]$OP,[[v,nil()::L PIN,[true,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Matrix Expression Integer):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,false]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Matrix Expression Float):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Matrix Expression Complex Float):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Vector Expression Integer):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,false]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Vector Expression Float):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Vector Expression Complex Float):$ ==
- [["arrayAssignment"]$OP,[[v,rhs::O,true]$ARRAYASS]$OPREC]$Rep
-
- assign(v:Symbol,index:L PIN,rhs:Expression Integer):$ ==
- [["assignment"]$OP,[[v,index,[false,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,index:L PIN,rhs:Expression Float):$ ==
- [["assignment"]$OP,[[v,index,[true,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,index:L PIN,rhs:Expression Complex Float):$ ==
- [["assignment"]$OP,[[v,index,[true,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Expression Integer):$ ==
- [["assignment"]$OP,[[v,nil()::L PIN,[false,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Expression Float):$ ==
- [["assignment"]$OP,[[v,nil()::L PIN,[true,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- assign(v:Symbol,rhs:Expression Complex Float):$ ==
- [["assignment"]$OP,[[v,nil()::L PIN,[true,rhs::O]$EXPRESSION]$ASS]$OPREC]$Rep
-
- call(s:String):$ ==
- [["call"]$OP,[s]$OPREC]$Rep
-
-@
-\section{domain FORTRAN FortranProgram}
-<<domain FORTRAN FortranProgram>>=
-)abbrev domain FORTRAN FortranProgram
-++ Author: Mike Dewar
-++ Date Created: October 1992
-++ Date Last Updated: 13 January 1994
-++ 23 January 1995 Added support for intrinsic functions
-++ Basic Operations:
-++ Related Constructors: FortranType, FortranCode, Switch
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description: \axiomType{FortranProgram} allows the user to build and manipulate simple
-++ models of FORTRAN subprograms. These can then be transformed into actual FORTRAN
-++ notation.
-FortranProgram(name,returnType,arguments,symbols): Exports == Implement where
- name : Symbol
- returnType : Union(fst:FortranScalarType,void:"void")
- arguments : List Symbol
- symbols : SymbolTable
-
- FC ==> FortranCode
- EXPR ==> Expression
- INT ==> Integer
- CMPX ==> Complex
- MINT ==> MachineInteger
- MFLOAT ==> MachineFloat
- MCMPLX ==> MachineComplex
- REP ==> Record(localSymbols : SymbolTable, code : List FortranCode)
-
- Exports ==> FortranProgramCategory with
- coerce : FortranCode -> $
- ++ coerce(fc) \undocumented{}
- coerce : List FortranCode -> $
- ++ coerce(lfc) \undocumented{}
- coerce : REP -> $
- ++ coerce(r) \undocumented{}
- coerce : EXPR MINT -> $
- ++ coerce(e) \undocumented{}
- coerce : EXPR MFLOAT -> $
- ++ coerce(e) \undocumented{}
- coerce : EXPR MCMPLX -> $
- ++ coerce(e) \undocumented{}
- coerce : Equation EXPR MINT -> $
- ++ coerce(eq) \undocumented{}
- coerce : Equation EXPR MFLOAT -> $
- ++ coerce(eq) \undocumented{}
- coerce : Equation EXPR MCMPLX -> $
- ++ coerce(eq) \undocumented{}
- coerce : EXPR INT -> $
- ++ coerce(e) \undocumented{}
- coerce : EXPR Float -> $
- ++ coerce(e) \undocumented{}
- coerce : EXPR CMPX Float -> $
- ++ coerce(e) \undocumented{}
- coerce : Equation EXPR INT -> $
- ++ coerce(eq) \undocumented{}
- coerce : Equation EXPR Float -> $
- ++ coerce(eq) \undocumented{}
- coerce : Equation EXPR CMPX Float -> $
- ++ coerce(eq) \undocumented{}
-
- Implement ==> add
-
- Rep := REP
-
- import SExpression
- import TheSymbolTable
- import FortranCode
-
- makeRep(b:List FortranCode):$ ==
- construct(empty()$SymbolTable,b)$REP
-
- codeFrom(u:$):List FortranCode ==
- elt(u::Rep,code)$REP
-
- outputAsFortran(p:$):Void ==
- setLabelValue(25000::SingleInteger)$FC
- -- Do this first to catch any extra type declarations:
- tempName := "FPTEMP"::Symbol
- newSubProgram(tempName)
- initialiseIntrinsicList()$Lisp
- body : List SExpression := [getCode(l)$FortranCode for l in codeFrom(p)]
- intrinsics : SExpression := getIntrinsicList()$Lisp
- endSubProgram()
- fortFormatHead(returnType::OutputForm, name::OutputForm, _
- arguments::OutputForm)$Lisp
- printTypes(symbols)$SymbolTable
- printTypes((p::Rep).localSymbols)$SymbolTable
- printTypes(tempName)$TheSymbolTable
- fortFormatIntrinsics(intrinsics)$Lisp
- clearTheSymbolTable(tempName)
- for expr in body repeat displayLines1(expr)$Lisp
- dispStatement(END::OutputForm)$Lisp
-
- mkString(l:List Symbol):String ==
- unparse(convert(l::OutputForm)@InputForm)$InputForm
-
- checkVariables(user:List Symbol,target:List Symbol):Void ==
- -- We don't worry about whether the user has subscripted the
- -- variables or not.
- setDifference(map(name$Symbol,user),target) ~= empty()$List(Symbol) =>
- s1 : String := mkString(user)
- s2 : String := mkString(target)
- error ["Incompatible variable lists:", s1, s2]
-
- coerce(u:EXPR MINT) : $ ==
- checkVariables(variables(u)$EXPR(MINT),arguments)
- l : List(FC) := [assign(name,u)$FC,returns()$FC]
- makeRep l
-
- coerce(u:Equation EXPR MINT) : $ ==
- retractIfCan(lhs u)@Union(Kernel(EXPR MINT),"failed") case "failed" =>
- error "left hand side is not a kernel"
- vList : List Symbol := variables lhs u
- #vList ~= #arguments =>
- error "Incorrect number of arguments"
- veList : List EXPR MINT := [w::EXPR(MINT) for w in vList]
- aeList : List EXPR MINT := [w::EXPR(MINT) for w in arguments]
- eList : List Equation EXPR MINT :=
- [equation(w,v) for w in veList for v in aeList]
- (subst(rhs u,eList))::$
-
- coerce(u:EXPR MFLOAT) : $ ==
- checkVariables(variables(u)$EXPR(MFLOAT),arguments)
- l : List(FC) := [assign(name,u)$FC,returns()$FC]
- makeRep l
-
- coerce(u:Equation EXPR MFLOAT) : $ ==
- retractIfCan(lhs u)@Union(Kernel(EXPR MFLOAT),"failed") case "failed" =>
- error "left hand side is not a kernel"
- vList : List Symbol := variables lhs u
- #vList ~= #arguments =>
- error "Incorrect number of arguments"
- veList : List EXPR MFLOAT := [w::EXPR(MFLOAT) for w in vList]
- aeList : List EXPR MFLOAT := [w::EXPR(MFLOAT) for w in arguments]
- eList : List Equation EXPR MFLOAT :=
- [equation(w,v) for w in veList for v in aeList]
- (subst(rhs u,eList))::$
-
- coerce(u:EXPR MCMPLX) : $ ==
- checkVariables(variables(u)$EXPR(MCMPLX),arguments)
- l : List(FC) := [assign(name,u)$FC,returns()$FC]
- makeRep l
-
- coerce(u:Equation EXPR MCMPLX) : $ ==
- retractIfCan(lhs u)@Union(Kernel EXPR MCMPLX,"failed") case "failed"=>
- error "left hand side is not a kernel"
- vList : List Symbol := variables lhs u
- #vList ~= #arguments =>
- error "Incorrect number of arguments"
- veList : List EXPR MCMPLX := [w::EXPR(MCMPLX) for w in vList]
- aeList : List EXPR MCMPLX := [w::EXPR(MCMPLX) for w in arguments]
- eList : List Equation EXPR MCMPLX :=
- [equation(w,v) for w in veList for v in aeList]
- (subst(rhs u,eList))::$
-
-
- coerce(u:REP):$ ==
- u@Rep
-
- coerce(u:$):OutputForm ==
- coerce(name)$Symbol
-
- coerce(c:List FortranCode):$ ==
- makeRep c
-
- coerce(c:FortranCode):$ ==
- makeRep [c]
-
- coerce(u:EXPR INT) : $ ==
- checkVariables(variables(u)$EXPR(INT),arguments)
- l : List(FC) := [assign(name,u)$FC,returns()$FC]
- makeRep l
-
- coerce(u:Equation EXPR INT) : $ ==
- retractIfCan(lhs u)@Union(Kernel(EXPR INT),"failed") case "failed" =>
- error "left hand side is not a kernel"
- vList : List Symbol := variables lhs u
- #vList ~= #arguments =>
- error "Incorrect number of arguments"
- veList : List EXPR INT := [w::EXPR(INT) for w in vList]
- aeList : List EXPR INT := [w::EXPR(INT) for w in arguments]
- eList : List Equation EXPR INT :=
- [equation(w,v) for w in veList for v in aeList]
- (subst(rhs u,eList))::$
-
- coerce(u:EXPR Float) : $ ==
- checkVariables(variables(u)$EXPR(Float),arguments)
- l : List(FC) := [assign(name,u)$FC,returns()$FC]
- makeRep l
-
- coerce(u:Equation EXPR Float) : $ ==
- retractIfCan(lhs u)@Union(Kernel(EXPR Float),"failed") case "failed" =>
- error "left hand side is not a kernel"
- vList : List Symbol := variables lhs u
- #vList ~= #arguments =>
- error "Incorrect number of arguments"
- veList : List EXPR Float := [w::EXPR(Float) for w in vList]
- aeList : List EXPR Float := [w::EXPR(Float) for w in arguments]
- eList : List Equation EXPR Float :=
- [equation(w,v) for w in veList for v in aeList]
- (subst(rhs u,eList))::$
-
- coerce(u:EXPR Complex Float) : $ ==
- checkVariables(variables(u)$EXPR(Complex Float),arguments)
- l : List(FC) := [assign(name,u)$FC,returns()$FC]
- makeRep l
-
- coerce(u:Equation EXPR CMPX Float) : $ ==
- retractIfCan(lhs u)@Union(Kernel EXPR CMPX Float,"failed") case "failed"=>
- error "left hand side is not a kernel"
- vList : List Symbol := variables lhs u
- #vList ~= #arguments =>
- error "Incorrect number of arguments"
- veList : List EXPR CMPX Float := [w::EXPR(CMPX Float) for w in vList]
- aeList : List EXPR CMPX Float := [w::EXPR(CMPX Float) for w in arguments]
- eList : List Equation EXPR CMPX Float :=
- [equation(w,v) for w in veList for v in aeList]
- (subst(rhs u,eList))::$
-
-@
-\section{domain M3D ThreeDimensionalMatrix}
-<<domain M3D ThreeDimensionalMatrix>>=
-)abbrev domain M3D ThreeDimensionalMatrix
-++ Author: William Naylor
-++ Date Created: 20 October 1993
-++ Date Last Updated: 20 May 1994
-++ BasicFunctions:
-++ Related Constructors: Matrix
-++ Also See: PrimitiveArray
-++ AMS Classification:
-++ Keywords:
-++ References:
-++ Description:
-++ This domain represents three dimensional matrices over a general object type
-ThreeDimensionalMatrix(R) : Exports == Implementation where
-
- R : SetCategory
- L ==> List
- NNI ==> NonNegativeInteger
- A1AGG ==> OneDimensionalArrayAggregate
- ARRAY1 ==> OneDimensionalArray
- PA ==> PrimitiveArray
- INT ==> Integer
- PI ==> PositiveInteger
-
- Exports ==> HomogeneousAggregate(R) with
-
- if R has Ring then
- zeroMatrix : (NNI,NNI,NNI) -> $
- ++ zeroMatrix(i,j,k) create a matrix with all zero terms
- identityMatrix : (NNI) -> $
- ++ identityMatrix(n) create an identity matrix
- ++ we note that this must be square
- plus : ($,$) -> $
- ++ plus(x,y) adds two matrices, term by term
- ++ we note that they must be the same size
- construct : (L L L R) -> $
- ++ construct(lll) creates a 3-D matrix from a List List List R lll
- elt : ($,NNI,NNI,NNI) -> R
- ++ elt(x,i,j,k) extract an element from the matrix x
- setelt! :($,NNI,NNI,NNI,R) -> R
- ++ setelt!(x,i,j,k,s) (or x.i.j.k:=s) sets a specific element of the array to some value of type R
- coerce : (PA PA PA R) -> $
- ++ coerce(p) moves from the representation type
- ++ (PrimitiveArray PrimitiveArray PrimitiveArray R)
- ++ to the domain
- coerce : $ -> (PA PA PA R)
- ++ coerce(x) moves from the domain to the representation type
- matrixConcat3D : (Symbol,$,$) -> $
- ++ matrixConcat3D(s,x,y) concatenates two 3-D matrices along a specified axis
- matrixDimensions : $ -> Vector NNI
- ++ matrixDimensions(x) returns the dimensions of a matrix
-
- Implementation ==> (PA PA PA R) add
-
- import (PA PA PA R)
- import (PA PA R)
- import (PA R)
- import R
-
- matrix1,matrix2,resultMatrix : $
-
- -- function to concatenate two matrices
- -- the first argument must be a symbol, which is either i,j or k
- -- to specify the direction in which the concatenation is to take place
- matrixConcat3D(dir : Symbol,mat1 : $,mat2 : $) : $ ==
- not ((dir = (i::Symbol)) or (dir = (j::Symbol)) or (dir = (k::Symbol)))_
- => error "the axis of concatenation must be i,j or k"
- mat1Dim := matrixDimensions(mat1)
- mat2Dim := matrixDimensions(mat2)
- iDim1 := mat1Dim.1
- jDim1 := mat1Dim.2
- kDim1 := mat1Dim.3
- iDim2 := mat2Dim.1
- jDim2 := mat2Dim.2
- kDim2 := mat2Dim.3
- matRep1 : (PA PA PA R) := copy(mat1 :: (PA PA PA R))$(PA PA PA R)
- matRep2 : (PA PA PA R) := copy(mat2 :: (PA PA PA R))$(PA PA PA R)
- retVal : $
-
- if (dir = (i::Symbol)) then
- -- j,k dimensions must agree
- if (not ((jDim1 = jDim2) and (kDim1=kDim2)))
- then
- error "jxk do not agree"
- else
- retVal := (coerce(concat(matRep1,matRep2)$(PA PA PA R))$$)@$
-
- if (dir = (j::Symbol)) then
- -- i,k dimensions must agree
- if (not ((iDim1 = iDim2) and (kDim1=kDim2)))
- then
- error "ixk do not agree"
- else
- for i in 0..(iDim1-1) repeat
- setelt(matRep1,i,(concat(elt(matRep1,i)$(PA PA PA R)_
- ,elt(matRep2,i)$(PA PA PA R))$(PA PA R))@(PA PA R))$(PA PA PA R)
- retVal := (coerce(matRep1)$$)@$
-
- if (dir = (k::Symbol)) then
- temp : (PA PA R)
- -- i,j dimensions must agree
- if (not ((iDim1 = iDim2) and (jDim1=jDim2)))
- then
- error "ixj do not agree"
- else
- for i in 0..(iDim1-1) repeat
- temp := copy(elt(matRep1,i)$(PA PA PA R))$(PA PA R)
- for j in 0..(jDim1-1) repeat
- setelt(temp,j,concat(elt(elt(matRep1,i)$(PA PA PA R)_
- ,j)$(PA PA R),elt(elt(matRep2,i)$(PA PA PA R),j)$(PA PA R)_
- )$(PA R))$(PA PA R)
- setelt(matRep1,i,temp)$(PA PA PA R)
- retVal := (coerce(matRep1)$$)@$
-
- retVal
-
- matrixDimensions(mat : $) : Vector NNI ==
- matRep : (PA PA PA R) := mat :: (PA PA PA R)
- iDim : NNI := (#matRep)$(PA PA PA R)
- matRep2 : PA PA R := elt(matRep,0)$(PA PA PA R)
- jDim : NNI := (#matRep2)$(PA PA R)
- matRep3 : (PA R) := elt(matRep2,0)$(PA PA R)
- kDim : NNI := (#matRep3)$(PA R)
- retVal : Vector NNI := new(3,0)$(Vector NNI)
- retVal.1 := iDim
- retVal.2 := jDim
- retVal.3 := kDim
- retVal
-
- coerce(matrixRep : (PA PA PA R)) : $ == matrixRep pretend $
-
- coerce(mat : $) : (PA PA PA R) == mat pretend (PA PA PA R)
-
- -- i,j,k must be with in the bounds of the matrix
- elt(mat : $,i : NNI,j : NNI,k : NNI) : R ==
- matDims := matrixDimensions(mat)
- iLength := matDims.1
- jLength := matDims.2
- kLength := matDims.3
- ((i > iLength) or (j > jLength) or (k > kLength) or (i=0) or (j=0) or_
-(k=0)) => error "coordinates must be within the bounds of the matrix"
- matrixRep : PA PA PA R := mat :: (PA PA PA R)
- elt(elt(elt(matrixRep,i-1)$(PA PA PA R),j-1)$(PA PA R),k-1)$(PA R)
-
- setelt!(mat : $,i : NNI,j : NNI,k : NNI,val : R)_
- : R ==
- matDims := matrixDimensions(mat)
- iLength := matDims.1
- jLength := matDims.2
- kLength := matDims.3
- ((i > iLength) or (j > jLength) or (k > kLength) or (i=0) or (j=0) or_
-(k=0)) => error "coordinates must be within the bounds of the matrix"
- matrixRep : PA PA PA R := mat :: (PA PA PA R)
- row2 : PA PA R := copy(elt(matrixRep,i-1)$(PA PA PA R))$(PA PA R)
- row1 : PA R := copy(elt(row2,j-1)$(PA PA R))$(PA R)
- setelt(row1,k-1,val)$(PA R)
- setelt(row2,j-1,row1)$(PA PA R)
- setelt(matrixRep,i-1,row2)$(PA PA PA R)
- val
-
- if R has Ring then
- zeroMatrix(iLength:NNI,jLength:NNI,kLength:NNI) : $ ==
- (new(iLength,new(jLength,new(kLength,(0$R))$(PA R))$(PA PA R))$(PA PA PA R)) :: $
-
- identityMatrix(iLength:NNI) : $ ==
- retValueRep : PA PA PA R := zeroMatrix(iLength,iLength,iLength)$$ :: (PA PA PA R)
- row1 : PA R
- row2 : PA PA R
- row1empty : PA R := new(iLength,0$R)$(PA R)
- row2empty : PA PA R := new(iLength,copy(row1empty)$(PA R))$(PA PA R)
- for count in 0..(iLength-1) repeat
- row1 := copy(row1empty)$(PA R)
- setelt(row1,count,1$R)$(PA R)
- row2 := copy(row2empty)$(PA PA R)
- setelt(row2,count,copy(row1)$(PA R))$(PA PA R)
- setelt(retValueRep,count,copy(row2)$(PA PA R))$(PA PA PA R)
- retValueRep :: $
-
-
- plus(mat1 : $,mat2 :$) : $ ==
-
- mat1Dims := matrixDimensions(mat1)
- iLength1 := mat1Dims.1
- jLength1 := mat1Dims.2
- kLength1 := mat1Dims.3
-
- mat2Dims := matrixDimensions(mat2)
- iLength2 := mat2Dims.1
- jLength2 := mat2Dims.2
- kLength2 := mat2Dims.3
-
- -- check that the dimensions are the same
- (not (iLength1 = iLength2) or not (jLength1 = jLength2) or not(kLength1 = kLength2))_
- => error "error the matrices are different sizes"
-
- sum : R
- row1 : (PA R) := new(kLength1,0$R)$(PA R)
- row2 : (PA PA R) := new(jLength1,copy(row1)$(PA R))$(PA PA R)
- row3 : (PA PA PA R) := new(iLength1,copy(row2)$(PA PA R))$(PA PA PA R)
-
- for i in 1..iLength1 repeat
- for j in 1..jLength1 repeat
- for k in 1..kLength1 repeat
- sum := (elt(mat1,i,j,k)::R +$R_
- elt(mat2,i,j,k)::R)
- setelt(row1,k-1,sum)$(PA R)
- setelt(row2,j-1,copy(row1)$(PA R))$(PA PA R)
- setelt(row3,i-1,copy(row2)$(PA PA R))$(PA PA PA R)
-
- resultMatrix := (row3 pretend $)
-
- resultMatrix
-
- construct(listRep : L L L R) : $ ==
-
- (#listRep)$(L L L R) = 0 => error "empty list"
- (#(listRep.1))$(L L R) = 0 => error "empty list"
- (#((listRep.1).1))$(L R) = 0 => error "empty list"
- iLength := (#listRep)$(L L L R)
- jLength := (#(listRep.1))$(L L R)
- kLength := (#((listRep.1).1))$(L R)
-
- --first check that the matrix is in the correct form
- for subList in listRep repeat
- not((#subList)$(L L R) = jLength) => error_
- "can not have an irregular shaped matrix"
- for subSubList in subList repeat
- not((#(subSubList))$(L R) = kLength) => error_
- "can not have an irregular shaped matrix"
-
- row1 : (PA R) := new(kLength,((listRep.1).1).1)$(PA R)
- row2 : (PA PA R) := new(jLength,copy(row1)$(PA R))$(PA PA R)
- row3 : (PA PA PA R) := new(iLength,copy(row2)$(PA PA R))$(PA PA PA R)
-
- for i in 1..iLength repeat
- for j in 1..jLength repeat
- for k in 1..kLength repeat
-
- element := elt(elt(elt(listRep,i)$(L L L R),j)$(L L R),k)$(L R)
- setelt(row1,k-1,element)$(PA R)
- setelt(row2,j-1,copy(row1)$(PA R))$(PA PA R)
- setelt(row3,i-1,copy(row2)$(PA PA R))$(PA PA PA R)
-
- resultMatrix := (row3 pretend $)
-
- resultMatrix
-
-@
-\section{domain SFORT SimpleFortranProgram}
-<<domain SFORT SimpleFortranProgram>>=
-)abbrev domain SFORT SimpleFortranProgram
-
-++ Author: Mike Dewar
-++ Date Created: November 1992
-++ Date Last Updated:
-++ Basic Operations:
-++ Related Constructors: FortranType, FortranCode, Switch
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ \axiomType{SimpleFortranProgram(f,type)} provides a simple model of some
-++ FORTRAN subprograms, making it possible to coerce objects of various
-++ domains into a FORTRAN subprogram called \axiom{f}.
-++ These can then be translated into legal FORTRAN code.
-SimpleFortranProgram(R,FS): Exports == Implementation where
- R : SetCategory
- FS : FunctionSpace(R)
-
- FST ==> FortranScalarType
-
- Exports ==> FortranProgramCategory with
- fortran : (Symbol,FST,FS) -> $
- ++fortran(fname,ftype,body) builds an object of type
- ++\axiomType{FortranProgramCategory}. The three arguments specify
- ++the name, the type and the body of the program.
-
- Implementation ==> add
-
- Rep := Record(name : Symbol, type : FST, body : FS )
-
- fortran(fname, ftype, res) ==
- construct(fname,ftype,res)$Rep
-
- nameOf(u:$):Symbol == u . name
-
- typeOf(u:$):Union(FST,"void") == u . type
-
- bodyOf(u:$):FS == u . body
-
- argumentsOf(u:$):List Symbol == variables(bodyOf u)$FS
-
- coerce(u:$):OutputForm ==
- coerce(nameOf u)$Symbol
-
- outputAsFortran(u:$):Void ==
- ftype := (checkType(typeOf(u)::OutputForm)$Lisp)::OutputForm
- fname := nameOf(u)::OutputForm
- args := argumentsOf(u)
- nargs:=args::OutputForm
- val := bodyOf(u)::OutputForm
- fortFormatHead(ftype,fname,nargs)$Lisp
- fortFormatTypes(ftype,args)$Lisp
- dispfortexp1$Lisp ["="::OutputForm, fname, val]@List(OutputForm)
- dispfortexp1$Lisp "RETURN"::OutputForm
- dispfortexp1$Lisp "END"::OutputForm
-
-@
-\section{domain SWITCH Switch}
-<<domain SWITCH Switch>>=
-)abbrev domain SWITCH Switch
-
-++ Author: Mike Dewar
-++ Date Created: April 1991
-++ Date Last Updated: March 1994
-++ 30.6.94 Added coercion from Symbol MCD
-++ Basic Operations:
-++ Related Constructors: FortranProgram, FortranCode, FortranTypes
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ References:
-++ Description:
-++ This domain builds representations of boolean expressions for use with
-++ the \axiomType{FortranCode} domain.
-Switch():public == private where
- EXPR ==> Union(I:Expression Integer,F:Expression Float,
- CF:Expression Complex Float,switch:%)
-
- public == CoercibleTo OutputForm with
- coerce : Symbol -> $
- ++ coerce(s) \undocumented{}
- LT : (EXPR,EXPR) -> $
- ++ LT(x,y) returns the \axiomType{Switch} expression representing \spad{x<y}.
- GT : (EXPR,EXPR) -> $
- ++ GT(x,y) returns the \axiomType{Switch} expression representing \spad{x>y}.
- LE : (EXPR,EXPR) -> $
- ++ LE(x,y) returns the \axiomType{Switch} expression representing \spad{x<=y}.
- GE : (EXPR,EXPR) -> $
- ++ GE(x,y) returns the \axiomType{Switch} expression representing \spad{x>=y}.
- OR : (EXPR,EXPR) -> $
- ++ OR(x,y) returns the \axiomType{Switch} expression representing \spad{x or y}.
- EQ : (EXPR,EXPR) -> $
- ++ EQ(x,y) returns the \axiomType{Switch} expression representing \spad{x = y}.
- AND : (EXPR,EXPR) -> $
- ++ AND(x,y) returns the \axiomType{Switch} expression representing \spad{x and y}.
- NOT : EXPR -> $
- ++ NOT(x) returns the \axiomType{Switch} expression representing \spad{\~~x}.
- NOT : $ -> $
- ++ NOT(x) returns the \axiomType{Switch} expression representing \spad{\~~x}.
-
- private == add
- Rep := Record(op:BasicOperator,rands:List EXPR)
-
- -- Public function definitions
-
- nullOp : BasicOperator := operator NULL
-
- coerce(s:%):OutputForm ==
- rat := (s . op)::OutputForm
- ran := [u::OutputForm for u in s.rands]
- (s . op) = nullOp => first ran
- #ran = 1 =>
- prefix(rat,ran)
- infix(rat,ran)
-
- coerce(s:Symbol):$ == [nullOp,[[s::Expression(Integer)]$EXPR]$List(EXPR)]$Rep
-
- NOT(r:EXPR):% ==
- [operator("~"::Symbol),[r]$List(EXPR)]$Rep
-
- NOT(r:%):% ==
- [operator("~"::Symbol),[[r]$EXPR]$List(EXPR)]$Rep
-
- LT(r1:EXPR,r2:EXPR):% ==
- [operator("<"::Symbol),[r1,r2]$List(EXPR)]$Rep
-
- GT(r1:EXPR,r2:EXPR):% ==
- [operator(">"::Symbol),[r1,r2]$List(EXPR)]$Rep
-
- LE(r1:EXPR,r2:EXPR):% ==
- [operator("<="::Symbol),[r1,r2]$List(EXPR)]$Rep
-
- GE(r1:EXPR,r2:EXPR):% ==
- [operator(">="::Symbol),[r1,r2]$List(EXPR)]$Rep
-
- AND(r1:EXPR,r2:EXPR):% ==
- [operator("and"::Symbol),[r1,r2]$List(EXPR)]$Rep
-
- OR(r1:EXPR,r2:EXPR):% ==
- [operator("or"::Symbol),[r1,r2]$List(EXPR)]$Rep
-
- EQ(r1:EXPR,r2:EXPR):% ==
- [operator("EQ"::Symbol),[r1,r2]$List(EXPR)]$Rep
-
-@
-\section{domain FTEM FortranTemplate}
-<<domain FTEM FortranTemplate>>=
-)abbrev domain FTEM FortranTemplate
-++ Author: Mike Dewar
-++ Date Created: October 1992
-++ Date Last Updated:
-++ Basic Operations:
-++ Related Domains:
-++ Also See:
-++ AMS Classifications:
-++ Keywords:
-++ Examples:
-++ References:
-++ Description: Code to manipulate Fortran templates
-FortranTemplate() : specification == implementation where
-
- specification == FileCategory(FileName, String) with
-
- processTemplate : (FileName, FileName) -> FileName
- ++ processTemplate(tp,fn) processes the template tp, writing the
- ++ result out to fn.
- processTemplate : (FileName) -> FileName
- ++ processTemplate(tp) processes the template tp, writing the
- ++ result to the current FORTRAN output stream.
- fortranLiteralLine : String -> Void
- ++ fortranLiteralLine(s) writes s to the current Fortran output stream,
- ++ followed by a carriage return
- fortranLiteral : String -> Void
- ++ fortranLiteral(s) writes s to the current Fortran output stream
- fortranCarriageReturn : () -> Void
- ++ fortranCarriageReturn() produces a carriage return on the current
- ++ Fortran output stream
-
- implementation == TextFile add
-
- import TemplateUtilities
- import FortranOutputStackPackage
-
- Rep := TextFile
-
- fortranLiteralLine(s:String):Void ==
- %writeLine(s,_$fortranOutputStream$Lisp)$Foreign(Builtin)
-
- fortranLiteral(s:String):Void ==
- %writeString(s,_$fortranOutputStream$Lisp)$Foreign(Builtin)
-
- fortranCarriageReturn():Void ==
- %writeNewline(_$fortranOutputStream$Lisp)$Foreign(Builtin)
-
- writePassiveLine!(line:String):Void ==
- -- We might want to be a bit clever here and look for new SubPrograms etc.
- fortranLiteralLine line
-
- processTemplate(tp:FileName, fn:FileName):FileName ==
- pushFortranOutputStack(fn)
- processTemplate(tp)
- popFortranOutputStack()
- fn
-
- getLine(fp:TextFile):String ==
- line : String := stripCommentsAndBlanks readLine!(fp)
- while not empty?(line) and elt(line,maxIndex line) = char "__" repeat
- setelt(line,maxIndex line,char " ")
- line := concat(line, stripCommentsAndBlanks readLine!(fp))$String
- line
-
- processTemplate(tp:FileName):FileName ==
- fp : TextFile := open(tp,"input")
- active : Boolean := true
- line : String
- endInput : Boolean := false
- while not (endInput or endOfFile? fp) repeat
- if active then
- line := getLine fp
- line = "endInput" => endInput := true
- if line = "beginVerbatim" then
- active := false
- else
- not empty? line => interpretString line
- else
- line := readLine!(fp)
- if line = "endVerbatim" then
- active := true
- else
- writePassiveLine! line
- close!(fp)
- if not active then
- error concat(["Missing `endVerbatim' line in ",tp::String])$String
- string(_$fortranOutputFile$Lisp)::FileName
-
-@
-\section{domain FEXPR FortranExpression}
-<<domain FEXPR FortranExpression>>=
-)abbrev domain FEXPR FortranExpression
-++ Author: Mike Dewar
-++ Date Created: December 1993
-++ Date Last Updated: 19 May 1994
-++ 7 July 1994 added %power to f77Functions
-++ 12 July 1994 added RetractableTo(R)
-++ Basic Operations:
-++ Related Domains:
-++ Also See: FortranMachineTypeCategory, MachineInteger, MachineFloat,
-++ MachineComplex
-++ AMS Classifications:
-++ Keywords:
-++ Examples:
-++ References:
-++ Description: A domain of expressions involving functions which can be
-++ translated into standard Fortran-77, with some extra extensions from
-++ the NAG Fortran Library.
-FortranExpression(basicSymbols,subscriptedSymbols,R):
- Exports==Implementation where
- basicSymbols : List Symbol
- subscriptedSymbols : List Symbol
- R : FortranMachineTypeCategory
-
- EXPR ==> Expression
- EXF2 ==> ExpressionFunctions2
- S ==> Symbol
- L ==> List
- BO ==> BasicOperator
- FRAC ==> Fraction
- POLY ==> Polynomial
-
- Exports ==> Join(ExpressionSpace,Algebra(R),RetractableTo(R),
- PartialDifferentialRing(Symbol)) with
- retract : EXPR R -> $
- ++ retract(e) takes e and transforms it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retractIfCan : EXPR R -> Union($,"failed")
- ++ retractIfCan(e) takes e and tries to transform it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retract : S -> $
- ++ retract(e) takes e and transforms it into a FortranExpression
- ++ checking that it is one of the given basic symbols
- ++ or subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retractIfCan : S -> Union($,"failed")
- ++ retractIfCan(e) takes e and tries to transform it into a FortranExpression
- ++ checking that it is one of the given basic symbols
- ++ or subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- coerce : $ -> EXPR R
- ++ coerce(x) \undocumented{}
- if (R has RetractableTo(Integer)) then
- retract : EXPR Integer -> $
- ++ retract(e) takes e and transforms it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retractIfCan : EXPR Integer -> Union($,"failed")
- ++ retractIfCan(e) takes e and tries to transform it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retract : FRAC POLY Integer -> $
- ++ retract(e) takes e and transforms it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retractIfCan : FRAC POLY Integer -> Union($,"failed")
- ++ retractIfCan(e) takes e and tries to transform it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retract : POLY Integer -> $
- ++ retract(e) takes e and transforms it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retractIfCan : POLY Integer -> Union($,"failed")
- ++ retractIfCan(e) takes e and tries to transform it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- if (R has RetractableTo(Float)) then
- retract : EXPR Float -> $
- ++ retract(e) takes e and transforms it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retractIfCan : EXPR Float -> Union($,"failed")
- ++ retractIfCan(e) takes e and tries to transform it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retract : FRAC POLY Float -> $
- ++ retract(e) takes e and transforms it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retractIfCan : FRAC POLY Float -> Union($,"failed")
- ++ retractIfCan(e) takes e and tries to transform it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retract : POLY Float -> $
- ++ retract(e) takes e and transforms it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- retractIfCan : POLY Float -> Union($,"failed")
- ++ retractIfCan(e) takes e and tries to transform it into a
- ++ FortranExpression checking that it contains no non-Fortran
- ++ functions, and that it only contains the given basic symbols
- ++ and subscripted symbols which correspond to scalar and array
- ++ parameters respectively.
- abs : $ -> $
- ++ abs(x) represents the Fortran intrinsic function ABS
- sqrt : $ -> $
- ++ sqrt(x) represents the Fortran intrinsic function SQRT
- exp : $ -> $
- ++ exp(x) represents the Fortran intrinsic function EXP
- log : $ -> $
- ++ log(x) represents the Fortran intrinsic function LOG
- log10 : $ -> $
- ++ log10(x) represents the Fortran intrinsic function LOG10
- sin : $ -> $
- ++ sin(x) represents the Fortran intrinsic function SIN
- cos : $ -> $
- ++ cos(x) represents the Fortran intrinsic function COS
- tan : $ -> $
- ++ tan(x) represents the Fortran intrinsic function TAN
- asin : $ -> $
- ++ asin(x) represents the Fortran intrinsic function ASIN
- acos : $ -> $
- ++ acos(x) represents the Fortran intrinsic function ACOS
- atan : $ -> $
- ++ atan(x) represents the Fortran intrinsic function ATAN
- sinh : $ -> $
- ++ sinh(x) represents the Fortran intrinsic function SINH
- cosh : $ -> $
- ++ cosh(x) represents the Fortran intrinsic function COSH
- tanh : $ -> $
- ++ tanh(x) represents the Fortran intrinsic function TANH
- pi : () -> $
- ++ pi(x) represents the NAG Library function X01AAF which returns
- ++ an approximation to the value of pi
- variables : $ -> L S
- ++ variables(e) return a list of all the variables in \spad{e}.
- useNagFunctions : () -> Boolean
- ++ useNagFunctions() indicates whether NAG functions are being used
- ++ for mathematical and machine constants.
- useNagFunctions : Boolean -> Boolean
- ++ useNagFunctions(v) sets the flag which controls whether NAG functions
- ++ are being used for mathematical and machine constants. The previous
- ++ value is returned.
-
- Implementation ==> EXPR R add
-
- -- The standard FORTRAN-77 intrinsic functions, plus nthRoot which
- -- can be translated into an arithmetic expression:
- f77Functions : L S := [abs,sqrt,exp,log,log10,sin,cos,tan,asin,acos,
- atan,sinh,cosh,tanh,nthRoot,%power]
- nagFunctions : L S := [pi, X01AAF]
- useNagFunctionsFlag : Boolean := true
-
- -- Local functions to check for "unassigned" symbols etc.
-
- mkEqn(s1:Symbol,s2:Symbol):Equation EXPR(R) ==
- equation(s2::EXPR(R),script(s1,scripts(s2))::EXPR(R))
-
- fixUpSymbols(u:EXPR R):Union(EXPR R,"failed") ==
- -- If its a univariate expression then just fix it up:
- syms : L S := variables(u)
- one?(#basicSymbols) and zero?(#subscriptedSymbols) =>
- not one?(#syms) => "failed"
- subst(u,equation(first(syms)::EXPR(R),first(basicSymbols)::EXPR(R)))
- -- We have one variable but it is subscripted:
- zero?(#basicSymbols) and one?(#subscriptedSymbols) =>
- -- Make sure we don't have both X and X_i
- for s in syms repeat
- not scripted?(s) => return "failed"
- not one?(#(syms:=removeDuplicates! [name(s) for s in syms]))=> "failed"
- sym : Symbol := first subscriptedSymbols
- subst(u,[mkEqn(sym,i) for i in variables(u)])
- "failed"
-
- extraSymbols?(u:EXPR R):Boolean ==
- syms : L S := [name(v) for v in variables(u)]
- extras : L S := setDifference(syms,
- setUnion(basicSymbols,subscriptedSymbols))
- not empty? extras
-
- checkSymbols(u:EXPR R):EXPR(R) ==
- syms : L S := [name(v) for v in variables(u)]
- extras : L S := setDifference(syms,
- setUnion(basicSymbols,subscriptedSymbols))
- not empty? extras =>
- m := fixUpSymbols(u)
- m case EXPR(R) => m::EXPR(R)
- error ["Extra symbols detected:",[string(v) for v in extras]$L(String)]
- u
-
- notSymbol?(v:BO):Boolean ==
- s : S := name v
- member?(s,basicSymbols) or
- scripted?(s) and member?(name s,subscriptedSymbols) => false
- true
-
- extraOperators?(u:EXPR R):Boolean ==
- ops : L S := [name v for v in operators(u) | notSymbol?(v)]
- if useNagFunctionsFlag then
- fortranFunctions : L S := append(f77Functions,nagFunctions)
- else
- fortranFunctions : L S := f77Functions
- extras : L S := setDifference(ops,fortranFunctions)
- not empty? extras
-
- checkOperators(u:EXPR R):Void ==
- ops : L S := [name v for v in operators(u) | notSymbol?(v)]
- if useNagFunctionsFlag then
- fortranFunctions : L S := append(f77Functions,nagFunctions)
- else
- fortranFunctions : L S := f77Functions
- extras : L S := setDifference(ops,fortranFunctions)
- not empty? extras =>
- error ["Non FORTRAN-77 functions detected:",[string(v) for v in extras]]
-
- checkForNagOperators(u:EXPR R):$ ==
- useNagFunctionsFlag =>
- import Pi
- import PiCoercions(R)
- piOp : BasicOperator := operator X01AAF
- piSub : Equation EXPR R :=
- equation(pi()$Pi::EXPR(R),kernel(piOp,0::EXPR(R))$EXPR(R))
- per subst(u,piSub)
- per u
-
- -- Conditional retractions:
-
- if R has RetractableTo(Integer) then
-
- retractIfCan(u:POLY Integer):Union($,"failed") ==
- retractIfCan((u::EXPR Integer)$EXPR(Integer))@Union($,"failed")
-
- retract(u:POLY Integer):$ ==
- retract((u::EXPR Integer)$EXPR(Integer))@$
-
- retractIfCan(u:FRAC POLY Integer):Union($,"failed") ==
- retractIfCan((u::EXPR Integer)$EXPR(Integer))@Union($,"failed")
-
- retract(u:FRAC POLY Integer):$ ==
- retract((u::EXPR Integer)$EXPR(Integer))@$
-
- int2R(u:Integer):R == u::R
-
- retractIfCan(u:EXPR Integer):Union($,"failed") ==
- retractIfCan(map(int2R,u)$EXF2(Integer,R))@Union($,"failed")
-
- retract(u:EXPR Integer):$ ==
- retract(map(int2R,u)$EXF2(Integer,R))@$
-
- if R has RetractableTo(Float) then
-
- retractIfCan(u:POLY Float):Union($,"failed") ==
- retractIfCan((u::EXPR Float)$EXPR(Float))@Union($,"failed")
-
- retract(u:POLY Float):$ ==
- retract((u::EXPR Float)$EXPR(Float))@$
-
- retractIfCan(u:FRAC POLY Float):Union($,"failed") ==
- retractIfCan((u::EXPR Float)$EXPR(Float))@Union($,"failed")
-
- retract(u:FRAC POLY Float):$ ==
- retract((u::EXPR Float)$EXPR(Float))@$
-
- float2R(u:Float):R == (u::R)
-
- retractIfCan(u:EXPR Float):Union($,"failed") ==
- retractIfCan(map(float2R,u)$EXF2(Float,R))@Union($,"failed")
-
- retract(u:EXPR Float):$ ==
- retract(map(float2R,u)$EXF2(Float,R))@$
-
- -- Exported Functions
-
- useNagFunctions():Boolean == useNagFunctionsFlag
- useNagFunctions(v:Boolean):Boolean ==
- old := useNagFunctionsFlag
- useNagFunctionsFlag := v
- old
-
- log10(x:$):$ ==
- kernel(operator log10,x)
-
- pi():$ == kernel(operator X01AAF,0)
-
- coerce(u:$):EXPR R == rep u
-
- retractIfCan(u:EXPR R):Union($,"failed") ==
- if (extraSymbols? u) then
- m := fixUpSymbols(u)
- m case "failed" => return "failed"
- u := m::EXPR(R)
- extraOperators? u => "failed"
- checkForNagOperators(u)
-
- retract(u:EXPR R):$ ==
- u:=checkSymbols(u)
- checkOperators(u)
- checkForNagOperators(u)
-
- retractIfCan(u:Symbol):Union($,"failed") ==
- not (member?(u,basicSymbols) or
- scripted?(u) and member?(name u,subscriptedSymbols)) => "failed"
- per (u::EXPR(R))
-
- retract(u:Symbol):$ ==
- res : Union($,"failed") := retractIfCan(u)
- res case "failed" => error ["Illegal Symbol Detected:",u::String]
- res
-
-@
-\section{License}
-<<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.
-@
-<<*>>=
-<<license>>
-
-<<domain RESULT Result>>
-<<domain FC FortranCode>>
-<<domain FORTRAN FortranProgram>>
-<<domain M3D ThreeDimensionalMatrix>>
-<<domain SFORT SimpleFortranProgram>>
-<<domain SWITCH Switch>>
-<<domain FTEM FortranTemplate>>
-<<domain FEXPR FortranExpression>>
-@
-\eject
-\begin{thebibliography}{99}
-\bibitem{1} nothing
-\end{thebibliography}
-\end{document}