diff options
Diffstat (limited to 'src/algebra')
-rw-r--r-- | src/algebra/ChangeLog | 7 | ||||
-rw-r--r-- | src/algebra/Makefile.in | 6 | ||||
-rw-r--r-- | src/algebra/Makefile.pamphlet | 6 | ||||
-rw-r--r-- | src/algebra/domain.spad | 13 | ||||
-rw-r--r-- | src/algebra/syntax.spad | 121 |
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] |