aboutsummaryrefslogtreecommitdiff
path: root/src/algebra
diff options
context:
space:
mode:
Diffstat (limited to 'src/algebra')
-rw-r--r--src/algebra/ChangeLog7
-rw-r--r--src/algebra/Makefile.in6
-rw-r--r--src/algebra/Makefile.pamphlet6
-rw-r--r--src/algebra/domain.spad13
-rw-r--r--src/algebra/syntax.spad121
5 files changed, 147 insertions, 6 deletions
diff --git a/src/algebra/ChangeLog b/src/algebra/ChangeLog
index e0ed5d53..84881e17 100644
--- a/src/algebra/ChangeLog
+++ b/src/algebra/ChangeLog
@@ -1,3 +1,10 @@
+2007-11-13 Gabriel Dos Reis <gdr@cs.tamu.edu>
+
+ * Makefile.pamphlet (SYNTAX.NRLIB/code.$(FASLEXT)): New rule.
+ (axiom_algebra_layer_14): Include SYNTAX.o.
+ * syntax.spad: New algebra file.
+ * domain.spad (Domain$reify): New.
+
2007-11-12 Gabriel Dos Reis <gdr@cs.tamu.edu>
* mappkg.spad.pamphlet: Through use "import" for importing packages.
diff --git a/src/algebra/Makefile.in b/src/algebra/Makefile.in
index f3bf33bc..5f81b593 100644
--- a/src/algebra/Makefile.in
+++ b/src/algebra/Makefile.in
@@ -648,7 +648,7 @@ axiom_algebra_layer_14 = \
TWOFACT.o UNIFACT.o UP.o UPCDEN.o \
UPDECOMP.o UPDIVP.o UPMP.o UPOLYC2.o \
UPXSCAT.o UPSQFREE.o VIEWDEF.o VIEW2D.o \
- VOID.o WEIER.o WP.o
+ VOID.o WEIER.o WP.o SYNTAX.o
axiom_algebra_layer_14_nrlibs = \
$(axiom_algebra_layer_14:.$(OBJEXT)=.NRLIB/code.$(OBJEXT))
@@ -900,6 +900,10 @@ $(builddir)/%.tex: $(srcdir)/%.pamphlet
$(axiom_build_texdir)/diagrams.tex: $(axiom_src_docdir)/diagrams.tex
$(INSTALL_DATA) $< $@
+SYNTAX.NRLIB/code.$(FASLEXT): syntax.spad
+ @ rm -rf $*.NRLIB
+ echo ")co $(srcdir)/syntax.spad" | ${INTERPSYS}
+
DOMAIN.NRLIB/code.$(FASLEXT): domain.spad
@ rm -rf $*.NRLIB
echo ")co $(srcdir)/domain.spad" | ${INTERPSYS}
diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet
index 45e3ed77..0dfaba40 100644
--- a/src/algebra/Makefile.pamphlet
+++ b/src/algebra/Makefile.pamphlet
@@ -776,7 +776,7 @@ axiom_algebra_layer_14 = \
TWOFACT.o UNIFACT.o UP.o UPCDEN.o \
UPDECOMP.o UPDIVP.o UPMP.o UPOLYC2.o \
UPXSCAT.o UPSQFREE.o VIEWDEF.o VIEW2D.o \
- VOID.o WEIER.o WP.o
+ VOID.o WEIER.o WP.o SYNTAX.o
axiom_algebra_layer_14_nrlibs = \
$(axiom_algebra_layer_14:.$(OBJEXT)=.NRLIB/code.$(OBJEXT))
@@ -1853,6 +1853,10 @@ $(axiom_build_texdir)/diagrams.tex: $(axiom_src_docdir)/diagrams.tex
<<genericSPADfiles>>
<<genericDOCfiles>>
+SYNTAX.NRLIB/code.$(FASLEXT): syntax.spad
+ @ rm -rf $*.NRLIB
+ echo ")co $(srcdir)/syntax.spad" | ${INTERPSYS}
+
DOMAIN.NRLIB/code.$(FASLEXT): domain.spad
@ rm -rf $*.NRLIB
echo ")co $(srcdir)/domain.spad" | ${INTERPSYS}
diff --git a/src/algebra/domain.spad b/src/algebra/domain.spad
index dec41cc2..1739efdc 100644
--- a/src/algebra/domain.spad
+++ b/src/algebra/domain.spad
@@ -33,13 +33,18 @@
)abbrev domain DOMAIN Domain
++ Author: Gabriel Dos Reis
++ Date Create: October 18, 2007.
-++ Date Last Updated: October 18, 2007.
-++ Basic Operations:
-++ Related Constructors: Type, OutputForm
+++ Date Last Updated: November 13, 2007.
+++ Basic Operations: coerce, reify
+++ Related Constructors: Type, Syntax, OutputForm
++ Also See: Type
Domain(): Public == Private where
- Public ==> CoercibleTo(OutputForm)
+ Public ==> CoercibleTo(OutputForm) with
+ reify: % -> Syntax
+ ++ reify(d) returns the abstract syntax for the domain `x'.
Private ==> add
coerce x ==
outputDomainConstructor(x)$Lisp
+ reify x ==
+ convert(devaluate(x)$Lisp)$Syntax
+
diff --git a/src/algebra/syntax.spad b/src/algebra/syntax.spad
new file mode 100644
index 00000000..383e1b59
--- /dev/null
+++ b/src/algebra/syntax.spad
@@ -0,0 +1,121 @@
+--Copyright (C) 2007, 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.
+
+
+)abbrev domain SYNTAX Syntax
+++ Author: Gabriel Dos Reis
+++ Date Created: November 10, 2007
+++ Date Last Updated: November 12, 2007
+++ Description: This domain provides a simple, general, and arguably
+++ complete representation of Spad programs as objects of a term algebra
+++ built from ground terms of type boolean, integers, foats, symbols,
+++ and strings. This domain differs from InputForm in that it represents
+++ any entity from a Spad program, not just expressions.
+++ Related Constructors: Boolean, Integer, Float, symbol, String, SExpression.
+++ See Also: SExpression.
+++ Fixme: Provide direct support for boolean values, arbritrary
+++ precision float point values.
+Syntax(): Public == Private where
+ Public ==> CoercibleTo(OutputForm) with
+ convert: % -> SExpression
+ ++ convert(s) returns the s-expression representation of a syntax.
+
+ convert: SExpression -> %
+ ++ convert(s) converts an s-expression to syntax.
+
+ convert: Integer -> %
+ ++ convert(i) injects the integer value `i' into the syntax domain
+
+ convert: DoubleFloat -> %
+ ++ convert(f) injects the float value `f' into the syntax domain
+
+ convert: Symbol -> %
+ ++ convert(s) injects the symbol `s' into the syntax domain.
+
+ convert: String -> %
+ ++ convert(s) injects the string value `s' into the syntax domain
+
+ buildSyntax: (Symbol, List %) -> %
+ ++ buildSyntax(op, [a1, ..., an]) builds a syntax object for op(a1,...,an).
+
+ getOperator: % -> Union(Integer, DoubleFloat, Symbol, String, %)
+ ++ getOperator(x) returns the operator, or tag, of the syntax `x'.
+ ++ The return value is itself a syntax if `x' really is an
+ ++ application of a function symbol as opposed to being an
+ ++ atomic ground term.
+
+
+ getOperands: % -> List %
+ ++ getOperands(x) returns the list of operands to the operator in `x'.
+
+ Private ==> SExpression add
+ rep(x: %): SExpression ==
+ x pretend SExpression
+
+ per(x: SExpression): % ==
+ x pretend %
+
+ convert(x: %): SExpression ==
+ rep x
+
+ convert(x: SExpression): % ==
+ per x
+
+ convert(i: Integer): % ==
+ per convert(i)$SExpression
+
+ convert(f: DoubleFloat): % ==
+ per convert(f)$SExpression
+
+ convert(s: Symbol): % ==
+ per convert(s)$SExpression
+
+ convert(s: String): % ==
+ per convert(s)$SExpression
+
+ buildSyntax(s: Symbol, l: List %): % ==
+ -- ??? ideally we should have overloaded operator `per' that convert
+ -- from list of syntax to syntax. But the compiler is at the
+ -- moment defective for non-exported operations.
+ cons(convert(s)$%, l) pretend %
+
+ getOperator x ==
+ s := rep x
+ symbol? s => symbol s
+ integer? s => integer s
+ float? s => float s
+ string? s => string s
+ convert(car s)
+
+ getOperands x ==
+ s := rep x
+ atom? s => []
+ [per t for t in destruct cdr s]