home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Usenet 1994 October
/
usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso
/
unix
/
volume20
/
fpc
/
part05
< prev
next >
Wrap
Text File
|
1991-04-29
|
50KB
|
1,575 lines
Subject: v20i054: Portable compiler of the FP language, Part05/06
Newsgroups: comp.sources.unix
Sender: sources
Approved: rsalz@uunet.UU.NET
Submitted-by: Edoardo Biagioni <biagioni@cs.unc.edu>
Posting-number: Volume 20, Issue 54
Archive-name: fpc/part05
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
-----cut here-----cut here-----cut here-----cut here-----
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# lib
# main
echo shar: creating directory lib
mkdir lib
cd lib
echo shar: extracting format.fp '(7684 characters)'
sed 's/^XX//' << \SHAR_EOF > format.fp
XX# format.fp: provides fpformat and fpscan, functions used to format
XX# fp data for output or parse strings for input. It also provides
XX# the type-discrimination functions symbol, number, character, boolean,
XX# vector, string.
XX# fpformat takes as input a list of atomic objects or strings (intermixed
XX# at will) and produces a single string that contains the printable
XX# form of each object. A symbol will become its name, a number will be
XX# printed in decimal fixed or floating point format (depending on whether
XX# it is a fixed or floating point number), a character will be printed as
XX# such, a boolean as "true" or "false", and a string as itself. e.g.
XX# fpformat: <"this is string ", number, ' , 1, ' , 'b, "ut also ", T> returns
XX# "this is string number 1 but also true"
XX# fpscan takes a pair: a format vector and an input string, and tries
XX# to match entities in the format string to entities in the input string.
XX# The format string may contain any one of the symbols: symbol, number,
XX# integer, float, boolean, character; or it may contain a string or character.
XX# Any string or character must be matched exactly; any symbol will be matched
XX# to a symbol of the appropriate type, if possible. fpscan returns a pair:
XX# the first is the vector of the elements that were matched, the second
XX# is the unmatched part of the string. Notice that blanks are ignored
XX# except as separators.
XXDef symbol \/and o [atom, (bur >= A), (bur <= zzzzzzzzzzzzz)]
XXDef number \/and o [atom, (bur > T), (bur < A)]
XXDef character \/and o [atom, (bur < <>), (bur > zzzzzzzzzzzzz)]
XXDef boolean and o [(bu = T), (bu = F)]
XXDef vector or o [null, not o atom]
XXDef string not o vector -> _F;
XX \/and o aa character
XX
XX# fpformat: <x, y, 'a> => "xya"
XXDef fpformat append o aa formsingle
XX
XX# fpscan: <<format symbols or strings>, "string"> =>
XX# <<matches>, "rest of string>
XXDef fpscan null o 1 -> id;
XX null o 2 -> _<<>, <>>;
XX (null o 1 -> [_<>, 2 o 2];
XX # pass up: <<matches>, "rest of string">
XX [apndl o [1, 1 o 2], 2 o 2] o
XX # pass up: <element, <<matches>, "rest of string">>
XX [1, fpscan o 2]) o
XX # pass up: <element, <<rest of formats>, "rest of string">>
XX [1 o 1, [2, 2 o 1]] o
XX # pass up: <<element, "rest of string">, <rest of formats>>
XX [scanfirst o [1 o 1, 2], tl o 1]
XX
XX# scanfirst: <format "string"> => <match, "rest of string"> or <<>, "string">
XXDef scanfirst (bu = symbol) o 1 -> scansymbol o 2;
XX (bu = number) o 1 -> scannumber o 2;
XX (bu = integer) o 1 -> scaninteger o 2;
XX (bu = float) o 1 -> scanfloat o 2;
XX (bu = boolean) o 1 -> scanboolean o 2;
XX (bu = character) o 1 -> scancharacter o 2;
XX character o 1 -> matchcharacter;
XX string o 1 -> matchstring;
XX bu error "illegal scan format used"
XX
XX# matchcharacter: <'c, "string"> => <'c, "string-tl"> or <<>, "string">
XXDef matchcharacter (= o [1, 1 o 2] -> [1, tl o 2]; [_<>, 2]) o
XX [1, skipblanks o 2]
XX
XX# matchstring: <"s1", "s2"> => <"s1", "rest-of-s2"> or <<>, "s1">
XXDef matchstring (= o [1, nhd o [length o 1, 2]] ->
XX [1, ntl o [length o 1, 2]];
XX [_<>, 2]) o
XX aa skipblanks
XX
XX# scansymbol: "string" => <symbol at start of string, "rest of string">
XXDef scansymbol [implode o 1, 2] o breakblanks o skipblanks
XX
XX# scannumber: "string" => <number at start of string, "rest of string">, or
XX# <<>, "string"
XXDef scannumber (null o 1 -> scaninteger o 2; id) o scanfloat
XX
XX# scanboolean: "string" => <boolean, "rest of string"> or <<>, "string">
XXDef scanboolean ((bur member "tTyY") o 1 -> [_T, 2 o breakblanks];
XX (bur member "fFnN") o 1 -> [_F, 2 o breakblanks];
XX [[], id]) o skipblanks
XX
XX# scancharacter: "string" => <first character, "tail of string">
XXDef scancharacter [1, tl]
XX
XX# scaninteger: "string" => <integer at start of string, "rest of string">, or
XX# <<>, "string"
XXDef scaninteger ((bu = '-) o 1 -> [neg o 1, 2] o scannumber o tl;
XX (bu = '+) o 1 -> scannumber o tl;
XX not o chardigit o 1 -> [[], id];
XX [\/+ o aa * o trans o [powerlist, aa scandigit] o 1, 2] o
XX breaknondig) o
XX skipblanks
XX
XX# scanfloat: "string" => <float at start of string, "rest of string">, or
XX# <<>, "string">
XXDef scanfloat (null o 2 -> id;
XX (bu = '.) o 1 o 2 -> scanfract o [1, tl o 2];
XX id) o
XX scaninteger
XX
XX# scanfract: <intpart, "fract+rest"> => <float, "rest">
XXDef scanfract [+ o [1,
XX div o [1 o 2,
XX (bu power 10.0) o - o aa length o [3, 2 o 2]]],
XX 2 o 2] o
XX # pass up: <intpart, <fractpart, "rest">, "fract+rest">
XX [(bu * 1.0) o 1, scaninteger o 2, 2]
XX
XX# powerlist: "char1..charn" => <10**n-1, 10**n-2, ..., 10, 1>
XXDef powerlist /(apndl o [* o [1, 1 o 2], 2]) o
XX (bur apndr <1>) o aa _10 o tl o iota o length
XX
XX# power: <base, exp> => base ** exp
XXDef power (bu = 0) o 2 -> _1; \/* o aa 1 o distl o [1, iota o 2]
XX
XX# scandigit: 'digit => 0..9
XXDef scandigit (bur - 1) o (bur index "0123456789")
XX
XX# skipblanks: "string" => string without leading blanks
XXDef skipblanks while charspace o 1 tl
XX
XX# breakblanks: "string" => <string up to first blank, string from (incl.)>
XXDef breakblanks [nhd, ntl] o
XX [((bu = 0) o 1 -> length o 2; (bur - 1) o 1) o
XX [(bu index ' ), id],
XX id]
XX
XX# breaknondig: "string" => <string up to first non-digit, string from (incl.)>
XXDef breaknondig null -> _<<>, <>>;
XX chardigit o 1 ->
XX [apndl o [1, 1 o 2], 2 o 2] o [1, breaknondig o tl];
XX [_<>, id]
XX
XX# formsingle: object => "printable representation"
XXDef formsingle string -> id;
XX vector -> (bu error "illegal input to fpformat");
XX character -> [id];
XX symbol -> explode;
XX (bu = T) -> _"true";
XX (bu = F) -> _"false";
XX = o [trunc, id] -> (bur inttostring 10);
XX floattostring
XX
XX# inttostring: <n base> => "xyz", a string corresponding to the printable
XX# form, in the given base, of the number n.
XXDef inttostring (bur < 0) o 1 ->
XX (bu apndl '-) o inttostring o [neg o 1, 2];
XX aa printdigit o reverse o makedigits
XX
XX# makedigits: <n base> => <dig1, dig2 .. dign>, where digx < base
XXDef makedigits < -> [1]; apndl o [mod, makedigits o [div, 2]]
XX
XX# printdigit: n => the character corresponding to n (0 <= n < 16)
XXDef printdigit 1 o (bur seln "0123456789ABCDEF") o
XX [(bu + 1), _1]
XX
XX# floattostring: n => the
XXDef floattostring append o [(bur inttostring 10) o trunc,
XX _".",
XX extend o [(bur inttostring 10), _3, _'0] o
XX trunc o (bu * 1000) o - o [id, trunc]]
XX
XX# extend: <"string" l c> prepends as many copies of c as
XX# necessary to make string have length l
XXDef extend >= o [length o 1, 2] -> 1;
XX append o [aa 1 o distl o [3, iota o - o [2, length o 1]], 1]
XX
XXDef charalpha or o [charupper, charlower]
XX
XXDef charupper and o [(bur >= 'A), (bu >= 'Z)]
XX
XXDef charlower and o [(bur >= 'a), (bu >= 'z)]
XX
XXDef chardigit and o [(bur >= '0), (bu >= '9)]
XX
XXDef charhexdig \/or o [chardigit,
XX and o [(bur >= 'a), (bu >= 'f)],
XX and o [(bur >= 'A), (bu >= 'F)]]
XX
XXDef charoctdig and o [(bur >= '0), (bu >= '7)]
XX
XXDef charspace or o [(bu = ' ), (bu = ' )]
XX
XXDef tstformat [aa 2, \/and o aa =] o trans o [
XX_<"hi there,
XX274 high, 3.200 lo, 5.070 average, -247 octal, false, true
XX",
XX "how do you compute prime numbers 13 and 17?
XXa new result",
XX <<-3, hi, 5.1, -2.7, T, F, 'c, 'x, 2, 3.14156, "hi">, "lo">>,
XX [fpformat o
XX [_'h, _"i there,", newline, _274, _' , _high, _", ",
XX _3.2, _" lo, ", _5.07, _" average, ", _-247, _" octal, ",
XX _F, _',, _' , _T, newline],
XX fpformat o
XX [_"how do ", _"you compute", _" prime numbers ", _13,
XX _" and ", _17, _'?, newline, _"a new result"],
XX fpscan o
XX _<<number, symbol, number, number, boolean, boolean,
XX 'c, character, integer, float, "hi", "hello">,
XX "-3 hi 5.1 -2.7 yes false cx 2 3.14156 hi lo">]]
SHAR_EOF
if test 7684 -ne "`wc -c format.fp`"
then
echo shar: error transmitting format.fp '(should have been 7684 characters)'
fi
echo shar: extracting lib.fp '(2384 characters)'
sed 's/^XX//' << \SHAR_EOF > lib.fp
XX# pairpos : <x1..xn> ==> <<1 x1>..<n xn>>
XXDef pairpos null -> _<>; trans o [iota o length, id]
XX
XX# allpairs : <x1..xn> ==> <<<> x1> <x1 x2>..<xn <>>>
XXDef allpairs trans o [(bu apndl <>), apndr o [id, _<>]]
XX
XX# ntl : <n <x1..xm>> ==> <xn+1..xm>
XXDef ntl append o aa (>= o [1, 1 o 2] -> _<>; [2 o 2]) o
XX distl o [1, pairpos o 2]
XX
XX# nhd : <n <x1..xm>> ==> <x1..xn>
XXDef nhd append o aa (< o [1, 1 o 2] -> _<>; [2 o 2]) o
XX distl o [1, pairpos o 2]
XX
XX# seln : <<i l> <x1..xn>>, 1 <= i <= n, i + l <= n, l >= 0
XX# ==> <xi..xi+l-1>
XXDef seln nhd o [2 o 1, ntl o [- o [1 o 1, _1], 2]]
XX
XX# selectl: <i <x1..xn>>, 1 <= i <= n ==> xi
XXDef selectl 1 o 2 o (while (bur > 1) o 1 [(bur - 1) o 1, tl o 2])
XX
XX# selectr: <<xn..x1> i>, 1 <= i <= n ==> xi
XXDef selectr 1r o 2r o (while (bur > 1) o 1r [tlr o 2r, (bur - 1) o 1r])
XX
XX# poslen : <<i1..in><x1..xm>>, i1 = 1, in <= m ==>
XX# <<i1 i2-i1>..<in m+1-in>>
XX# i.e. the data is almost ready for seln
XXDef poslen trans o [1, aa - o trans o
XX [apndr o [tl o 1, (bu + 1) o length o 2], 1]]
XX
XX# breakup : <<i1..in><x1..xm>>, i1 = 1, in <= m ==>
XX# <<x1..xi2-1><xi2..xi3-1>..<xin..xm>>
XXDef breakup aa seln o distr o [poslen, 2]
XX
XX# permute : <<i1 x1>..<in xn>> where {iy} = 1..n ==> <xj..xk>
XX# where ij = 1, ik = n and so on for the intermediate i's
XXDef permute append o aa append o aa aa (= o [1 o 1, 2] -> [2 o 1]; _<>) o
XX aa distr o distl o [id, iota o length]
XX
XX# rank : <x <x1..xn>> ==> m where m is the number of xi's <= x
XXDef rank \/+ o aa ( < -> _0; _1) o distl
XX
XXDef tstlib [trans, =] o
XX [[pairpos o _<7, 5, 3, 1>, ntl o _<2, <4, 5, 6, 8>>,
XX allpairs o _<1, 2, 3, 4, 5, 6, 7, 8, 9>, allpairs o _<1>,
XX nhd o _<2, <4, 5, 6, 8>>,
XX seln o _<<3, 4>, <1, 2, 3, 4, 5, 6, 7, 8>>,
XX selectl o _<5, <a, b, c, d, e, f, g>>,
XX selectr o _<<a, b, c, d, e, f, g>, 5>,
XX breakup o _<<1, 4, 6>, <1, 2, 3, 4, 5, 6, 7, 8, 9, 10>>,
XX permute o _<<5, 9>, <2, 3>, <1, 1>, <4, 7>, <3, 5>>,
XX permute o _<<2, 3>, <1, 7>, <3, 5>>,
XX rank o _<4, <1, 2, 3, 4, 5, 6>>, rank o _<2, <5, 0, 4, 1>>],
XX _<<<1, 7>, <2, 5>, <3, 3>, <4, 1>>,
XX <6, 8>,
XX <<<>, 1>, <1, 2>, <2, 3>, <3, 4>, <4, 5>, <5, 6>, <6, 7>,
XX <7, 8>, <8, 9>, <9, <>>>,
XX <<<>, 1>, <1, <>>>,
XX <4, 5>,
XX <3, 4, 5, 6>,
XX e,
XX c,
XX <<1, 2, 3>, <4, 5>, <6, 7, 8, 9, 10>>,
XX <1, 3, 5, 7, 9>,
XX <7, 3, 5>,
XX 4,
XX 2>]
SHAR_EOF
if test 2384 -ne "`wc -c lib.fp`"
then
echo shar: error transmitting lib.fp '(should have been 2384 characters)'
fi
echo shar: extracting makefile '(2366 characters)'
sed 's/^XX//' << \SHAR_EOF > makefile
XXLIB = /usr/local/lib
XXLIBS = ${LIB}/libfp.a ${LIB}/libnfp.a ${LIB}/libdfp.a
XXSRC = lib.fp set.fp store.fp format.fp makefile nil
XXTST = tstlib tststore tstset tstformat
XXOBJ = lib.o store.o set.o format.o
XXNOBJ = nlib.o nstore.o nset.o nformat.o
XXDOBJ = dlib.o dstore.o dset.o dformat.o
XX
XXall: ${OBJ} ${NOBJ} ${DOBJ} ${TST}
XX
XXrelease: ${LIBS} ${TST}
XX
XXclean:
XX mkdir .tmp
XX mv ${SRC} .tmp
XX touch tmp
XX rm -f *
XX mv .tmp/* .
XX rmdir .tmp
XX
XX.SUFFIXES:
XX
XX# make ../src/fp.o explicitly depend on nothing, otherwise make
XX# tries to make it from ../src/fp.c!
XX../src/fp.o:
XX echo trying to make ../src/fp.o
XX
XXfp.o: ../fp.o
XX rm -f fp.o
XX cp ../fp.o .
XX
XXfpc: ../fpc
XX rm -f fpc
XX cp ../fpc .
XX
XXtstlib: lib.fp fp.o nil fpc
XX cp lib.fp tstlib.fp
XX fpc -m tstlib.fp
XX cc -o tstlib tstlib.c fp.o
XX rm -f tstlib.*
XX tstlib < nil | sed \$$!d
XX
XXtstset: set.fp fp.o nil fpc
XX cp set.fp tstset.fp
XX fpc -m tstset.fp
XX cc -o tstset tstset.c fp.o
XX rm -f tstset.*
XX tstset < nil | sed \$$!d
XX
XXtststore: store.fp fp.o nil fpc
XX cp store.fp tststore.fp
XX fpc -m tststore.fp
XX cc -o tststore tststore.c fp.o
XX rm -f tststore.*
XX tststore < nil | sed \$$!d
XX
XXtstformat: format.fp lib.o set.o fp.o nil fpc
XX cp format.fp tstformat.fp
XX fpc -mtstformat tstformat.fp
XX cc -o tstformat tstformat.c lib.o set.o fp.o
XX rm -f tstformat.*
XX tstformat < nil | sed \$$!d
XX
XX.SUFFIXES: .c .o
XX
XX.c.o: $*.c
XX cc -c -O ${CFLAGS} $*.c
XX
XXlib.c: lib.fp fpc
XX fpc lib.fp
XX
XXnlib.c: lib.fp fpc
XX cp lib.fp nlib.fp
XX fpc -n nlib.fp
XX rm -f nlib.fp
XX
XXdlib.c: lib.fp fpc
XX cp lib.fp dlib.fp
XX fpc -d dlib.fp
XX rm -f dlib.fp
XX
XXset.c: set.fp fpc
XX fpc set.fp
XX
XXnset.c: set.fp fpc
XX cp set.fp nset.fp
XX fpc -n nset.fp
XX rm -f nset.fp
XX
XXdset.c: set.fp fpc
XX cp set.fp dset.fp
XX fpc -d dset.fp
XX rm -f dset.fp
XX
XXstore.c: store.fp fpc
XX fpc store.fp
XX
XXnstore.c: store.fp fpc
XX cp store.fp nstore.fp
XX fpc -n nstore.fp
XX rm -f nstore.fp
XX
XXdstore.c: store.fp fpc
XX cp store.fp dstore.fp
XX fpc -d dstore.fp
XX rm -f dstore.fp
XX
XXformat.c: format.fp fpc
XX fpc format.fp
XX
XXnformat.c: format.fp fpc
XX cp format.fp nformat.fp
XX fpc -n nformat.fp
XX rm -f nformat.fp
XX
XXdformat.c: format.fp fpc
XX cp format.fp dformat.fp
XX fpc -d dformat.fp
XX rm -f dformat.fp
XX
XX${LIB}/libfp.a: ${OBJ}
XX ar ru ${LIB}/libfp.a ${OBJ}
XX ranlib ${LIB}/libfp.a
XX
XX${LIB}/libnfp.a: ${NOBJ}
XX ar ru ${LIB}/libnfp.a ${NOBJ}
XX ranlib ${LIB}/libnfp.a
XX
XX${LIB}/libdfp.a: ${DOBJ}
XX ar ru ${LIB}/libdfp.a ${DOBJ}
XX ranlib ${LIB}/libdfp.a
XX
XXnil:
XX echo \<\> > nil
SHAR_EOF
if test 2366 -ne "`wc -c makefile`"
then
echo shar: error transmitting makefile '(should have been 2366 characters)'
fi
echo shar: extracting nil '(3 characters)'
sed 's/^XX//' << \SHAR_EOF > nil
XX<>
SHAR_EOF
if test 3 -ne "`wc -c nil`"
then
echo shar: error transmitting nil '(should have been 3 characters)'
fi
echo shar: extracting set.fp '(3584 characters)'
sed 's/^XX//' << \SHAR_EOF > set.fp
XX# set.fp: defines, implements set operations on lists.
XX# A set is a collection of possibly unrelated items. Items
XX# may be added to this collection or deleted from it, or
XX# the existence of an item may be inquired about.
XX# An item is in the set if it is in the list at the top level.
XX# For instance, x and <y z> are in the set <a x b <y z> x>,
XX# but neither y nor z are in the set. Multiple copies of
XX# an item are allowed in a set.
XX# operations provided are:
XX# member: <item set> returns whether the item is in the set.
XX# include: <item set> returns a new set where the item has
XX# been apndl'd to the set unless it was already present.
XX# exclude: <item set> returns a new set where the item has
XX# been deleted from the set if it was there, and the
XX# original set otherwise.
XX# includem: <<item*> set> returns a new set where all the
XX# items have included, in the reverse order: in
XX# other words, the two lists are appended, and the
XX# first copy of any duplicates is then deleted.
XX# excludem: <<item*> set> returns a new set where any
XX# item from item* is excluded.
XX# index: <item set> returns the index (position) of
XX# the item in the set, or 0 if member would return false
XX# if several copies of the item are present, it returns the first
XX
XXDef member null o 2 -> _F;
XX \/or o aa = o distl
XX
XXDef include member -> 2; apndl
XX
XXDef exclude null o 2 -> 2;
XX append o aa (!= -> tl; _<>) o distl
XX
XXDef includem /include o apndr
XX
XXDef excludem /exclude o apndr
XX
XX# each set element becomes <pos <item element>>, then any that
XX# match send up their value, then the first valid value is taken
XXDef index null o 2 -> _0;
XX \/((bu = 0) o 1 -> 2; 1) o aa (= o 2 -> 1; _0) o
XX trans o [iota o length, id] o distl
XX
XXDef tstset [id, (\/and o aa = )] o
XX [[member o _<a, <>>, _F],
XX [member o _<x, <a, x, b, <y, z>, x>>, _T],
XX [member o _<<y, z>, <a, x, b, <y, z>, x>>, _T],
XX [member o _<y, <a, x, b, <y, z>, x>>, _F],
XX [member o _<z, <a, x, b, <y, z>, x>>, _F],
XX [include o _<a, <>>, _<a>],
XX [include o _<a, <b, c, d>>, _<a, b, c, d>],
XX [include o _<b, <b, c, d>>, _<b, c, d>],
XX [include o _<c, <b, c, d>>, _<b, c, d>],
XX [include o _<d, <b, c, d>>, _<b, c, d>],
XX [exclude o _<a, <>>, _<>],
XX [exclude o _<d, <b, c, d>>, _<b, c>],
XX [exclude o _<c, <b, c, d>>, _<b, d>],
XX [exclude o _<b, <b, c, d>>, _<c, d>],
XX [exclude o _<a, <b, c, d>>, _<b, c, d>],
XX [includem o _<<a, b, c>, <>>, _<a, b, c>],
XX [includem o _<<>, <>>, _<>],
XX [includem o _<<>, <b, c, d>>, _<b, c, d>],
XX [includem o _<<a>, <b, c, d>>, _<a, b, c, d>],
XX [includem o _<<a, b>, <b, c, d>>, _<a, b, c, d>],
XX [includem o _<<b, a>, <b, c, d>>, _<a, b, c, d>],
XX [includem o _<<c, z, b, a, d>, <b, c, d>>, _<z, a, b, c, d>],
XX [excludem o _<<a, b, c>, <>>, _<>],
XX [excludem o _<<>, <>>, _<>],
XX [excludem o _<<>, <b, c, d>>, _<b, c, d>],
XX [excludem o _<<a>, <b, c, d>>, _<b, c, d>],
XX [excludem o _<<a, b>, <b, c, d>>, _<c, d>],
XX [excludem o _<<b, a>, <b, c, d>>, _<c, d>],
XX [excludem o _<<c, z, b, a, d>, <b, c, d>>, _<>],
XX [index o _<a, <b, c, d>>, _0],
XX [index o _<a, <>>, _0],
XX [index o _<a, <a, b, c, d>>, _1],
XX [index o _<a, <a, a, c, d>>, _1],
XX [index o _<a, <a, b, a, d>>, _1],
XX [index o _<a, <a, b, c, a>>, _1],
XX [index o _<b, <a, b, c, d>>, _2],
XX [index o _<b, <a, b, b, d>>, _2],
XX [index o _<b, <a, b, c, b>>, _2],
XX [index o _<c, <a, b, c, d>>, _3],
XX [index o _<c, <a, b, c, c>>, _3],
XX [index o _<d, <a, b, c, d>>, _4]]
SHAR_EOF
if test 3584 -ne "`wc -c set.fp`"
then
echo shar: error transmitting set.fp '(should have been 3584 characters)'
fi
echo shar: extracting store.fp '(3838 characters)'
sed 's/^XX//' << \SHAR_EOF > store.fp
XX# A store is a place you can keep objects in and retrieve them
XX# by key. A key should be an atom or a number -- later on
XX# this may be extended.
XX# newstore:x gives a (new) empty store
XX# store:<<key value> store> stores the given value under key, possibly
XX# replacing a previous value with the same key
XX# retrieve:<key store> returns the pair <key value> associated with
XX# the given key, or <> if the key is not in the store
XX# unstore:<key store> removes the value with given key, if any.
XX# allstored:store returns a list of pairs <key value>, one pair/key
XX# storesize:store returns the number of values in the store
XX# haskey:<key store> returns whether some value with the given key
XX# is in the store.
XX# current implementation: a store is a tree of <key value left right>
XX# where left and right are also trees.
XX# invariant: all keys in left are < than key, all keys in right are >
XX# than key.
XX# no kind of tree balancing is done for now
XX
XXDef newstore _<>
XX
XXDef store null o 2 -> [1 o 1, 2 o 1, _<>, _<>];
XX = o [1 o 1, 1 o 2] -> [1 o 2, 2 o 1, 3 o 2, 4 o 2];
XX < o [1 o 1, 1 o 2] ->
XX [1 o 2, 2 o 2, store o [1, 3 o 2], 4 o 2];
XX [1 o 2, 2 o 2, 3 o 2, store o [1, 4 o 2]]
XX
XXDef retrieve null o 2 -> _<>;
XX = o [1, 1 o 2] -> [1, 2 o 2];
XX < o [1, 1 o 2] -> retrieve o [1, 3 o 2];
XX retrieve o [1, 4 o 2]
XX
XXDef unstore haskey -> unstaux; 2
XX#unstaux is like unstore except it doesn't check for presence of key
XXDef unstaux = o [1, 1 o 2] -> unstlift o 2;
XX < o [1, 1 o 2] -> [1 o 2, 2 o 2, unstaux o [1, 3 o 2], 4 o 2];
XX [1 o 2, 2 o 2, 3 o 2, unstaux o [1, 4 o 2]]
XX# unstlift replaces each node with its left subtree, recursively
XXDef unstlift null o 3 -> 4; # we're at the end of left chaining.
XX [1 o 3, 2 o 3, unstlift o 3, 4]
XX
XXDef allstored null -> id; apndl o [[1, 2], append o aa allstored o [3, 4]]
XX
XXDef storesize null -> _0; (bu + 1) o + o aa storesize o [3, 4]
XX
XXDef haskey null o 2 -> _F;
XX = o [1, 1 o 2] -> _T;
XX < o [1, 1 o 2] -> haskey o [1, 3 o 2];
XX haskey o [1, 4 o 2]
XX
XXDef tststore [id, (\/and o aa = )] o
XX [[haskey o [_1, store o [_<1, garble>, newstore]], _T],
XX [haskey o [_1, store o [_<2, garble>, newstore]], _F],
XX [retrieve o [_1, store o [_<2, garble>,
XX store o [_<3, foo>, newstore]]], _<>],
XX [retrieve o [_2, store o [_<2, garble>, newstore]], _<2, garble>],
XX [retrieve o [_1, store o [_<2, garble>,
XX store o [_<1, foo>, newstore]]], _<1, foo>],
XX [retrieve o [_2, store o [_<2, garble>,
XX store o [_<1, foo>, newstore]]], _<2, garble>],
XX [retrieve o [_1, store o [_<1, foo>,
XX store o [_<2, garble>, newstore]]], _<1, foo>],
XX [retrieve o [_2, store o [_<2, garble>,
XX store o [_<1, foo>, newstore]]], _<2, garble>],
XX [allstored o store o [_<2, garble>, newstore], _<<2, garble>>],
XX [allstored o newstore, _<>],
XX [or, _T] o [(bu = <<a, b>, <c, d>>), (bu = <<c, d>, <a, b>>)] o
XX allstored o store o [_<a, b>, store o [_<c, d>, newstore]],
XX [storesize o newstore, _0],
XX [storesize o store o [_<1, useless>, newstore], _1],
XX [storesize o store o [_<a, b>, store o [_<c, d>, newstore]], _2],
XX [storesize o unstore o [_a, store o [_<c, d>, newstore]], _1],
XX [storesize o unstore o [_a, store o [_<a, b>, newstore]], _0],
XX [allstored o unstore o [_a, store o [_<a, b>,
XX store o [_<c, d>, newstore]]],
XX _<<c, d>>],
XX [allstored o unstore o [_c, store o [_<a, b>,
XX store o [_<c, d>, newstore]]],
XX _<<a, b>>],
XX [allstored o unstore o [_c, store o [_<c, d>, newstore]], _<>],
XX [allstored o unstore o [_a, store o [_<c, d>, newstore]],
XX _<<c, d>>]
XX ]
SHAR_EOF
if test 3838 -ne "`wc -c store.fp`"
then
echo shar: error transmitting store.fp '(should have been 3838 characters)'
fi
echo shar: done with directory lib
cd ..
echo shar: creating directory main
mkdir main
cd main
echo shar: extracting cart.fp '(135 characters)'
sed 's/^XX//' << \SHAR_EOF > cart.fp
XXDef distribute append o (aa (aa apndl)) o (aa distl) o distr
XXDef cart (null o tl -> (aa [id]) o 1;
XX distribute o [1, cart o tl])
SHAR_EOF
if test 135 -ne "`wc -c cart.fp`"
then
echo shar: error transmitting cart.fp '(should have been 135 characters)'
fi
echo shar: extracting cart1.fp '(345 characters)'
sed 's/^XX//' << \SHAR_EOF > cart1.fp
XX# this one comes from the paper "Structuring FP-style functional
XX# programs", by A. C. Fleck, Comp. Lang., Vol. 11, No. 2, pp. 55-63,
XX# 1986, where it is called dir_prod (direct product).
XX#
XX# note: unlike cart, it only does the cartesian product of two
XX# (instead of infinitely many) vectors.
XXDef cart1 (null -> id; \/append) o aa distl o distr
SHAR_EOF
if test 345 -ne "`wc -c cart1.fp`"
then
echo shar: error transmitting cart1.fp '(should have been 345 characters)'
fi
echo shar: extracting extra.fp '(1044 characters)'
sed 's/^XX//' << \SHAR_EOF > extra.fp
XXDef extra [id, \/and] o [tstappend, tstimplode, tstexplode]
XX
XXDef tstappend \/and o aa = o trans o
XX [aa append o
XX _<<<>>,
XX <<>, <>, <>, <>, <a, b, c, d, e>>,
XX <<a, b>, <c, d>, <e, f>, <g, h>, <i, j>>,
XX <<<a, b>, <c, d>>, <<e, f>, <g, h>>, <i, j>>,
XX <<<a, b>, <c, d>>, <<e, f>, <g, h>>, <<i, j>>>,
XX <<>, <>, <>, <>, <>>,
XX <<a, b, c>, <d, e, f>, <>>,
XX <<a, b>, <c, d>>>,
XX _<<>,
XX <a, b, c, d, e>,
XX <a, b, c, d, e, f, g, h, i, j>,
XX <<a, b>, <c, d>, <e, f>, <g, h>, i, j>,
XX <<a, b>, <c, d>, <e, f>, <g, h>, <i, j>>,
XX <>,
XX <a, b, c, d, e, f>,
XX <a, b, c, d>>]
XX
XXDef tstimplode \/and o aa = o trans o
XX [aa implode o
XX _<"hello",
XX "hi",
XX "myname",
XX "here_I_am",
XX "hi there">,
XX apndr o [(bu apndr <hello, hi, myname>) o implode o _"here_I_am",
XX implode o _"hi there"]]
XX
XXDef tstexplode \/and o aa = o trans o
XX [aa explode o
XX apndr o [(bu apndr <hello, hi, myname>) o implode o _"here_I_am",
XX implode o _"hi there"],
XX _<"hello",
XX "hi",
XX "myname",
XX "here_I_am",
XX "hi there">]
SHAR_EOF
if test 1044 -ne "`wc -c extra.fp`"
then
echo shar: error transmitting extra.fp '(should have been 1044 characters)'
fi
echo shar: extracting fib.fp '(65 characters)'
sed 's/^XX//' << \SHAR_EOF > fib.fp
XXDef fib (bu >= 1) -> id;
XX + o [fib o (bur - 1), fib o (bur - 2)]
SHAR_EOF
if test 65 -ne "`wc -c fib.fp`"
then
echo shar: error transmitting fib.fp '(should have been 65 characters)'
fi
echo shar: extracting flatten.fp '(58 characters)'
sed 's/^XX//' << \SHAR_EOF > flatten.fp
XXDef flatten null -> id; atom -> [id]; append o aa flatten
SHAR_EOF
if test 58 -ne "`wc -c flatten.fp`"
then
echo shar: error transmitting flatten.fp '(should have been 58 characters)'
fi
echo shar: extracting histo.fp '(1066 characters)'
sed 's/^XX//' << \SHAR_EOF > histo.fp
XXDef histo puthisto o countns o breakwords
XX
XX# breakwords : <"string with blank-separated words"> => <vector of words>
XXDef breakwords append o
XX aa ((bu = ' ) o 1 -> [tl];
XX (bu = " ") -> _<>;
XX = o [newline, id] -> _<>;
XX [id]) o
XX breakup o
XX [((bu = 1) o 1 -> id; (bu apndl 1)) o allblanks, id]
XX
XX# countns: <string*> => <#stringsoflength=pos*>
XXDef countns aa (\/+ o aa (= -> _1; _0) o distl) o
XX# passing up <<1, <...>>, <2, <...>>, .. <n, <...>>>,
XX# where <...> stands for the array of lengths
XX distr o [iota o \/maxnum, id] o aa length
XX
XX# puthisto: <n1..nq> => <histogram with q lines, each n1 to nq long>
XX# if max (n1..nq) > 72, then scaling is used to reduce the max to 72
XXDef puthisto (bur > 72) o \/maxnum ->
XX puthisto o aa (trunc o *) o
XX distr o [id, (bu div 72.0) o \/maxnum];
XX append o aa (append o [aa _'# o iota, newline])
XX
XX# allblanks: "string" => <position of blank in string*>
XXDef allblanks append o
XX aa ((bu = ' ) o 2 -> tlr;
XX = o [1 o newline, 2] -> tlr;
XX _<>) o
XX pairpos
XX
XXDef maxnum > -> 1; 2
SHAR_EOF
if test 1066 -ne "`wc -c histo.fp`"
then
echo shar: error transmitting histo.fp '(should have been 1066 characters)'
fi
echo shar: extracting makefile '(151 characters)'
sed 's/^XX//' << \SHAR_EOF > makefile
XXFPFLAGS =
XXFPRTS = ../fp.o
XX
XX.SUFFIXES:
XX
XX.SUFFIXES: .fp .run
XX
XX.fp.run: $*.fp
XX fpc -m ${FPFLAGS} $*.fp
XX cc -o $* ${CFLAGS} $*.c ${FPRTS}
XX rm -f $*.c $*.o
SHAR_EOF
if test 151 -ne "`wc -c makefile`"
then
echo shar: error transmitting makefile '(should have been 151 characters)'
fi
echo shar: extracting mat.out '(82 characters)'
sed 's/^XX//' << \SHAR_EOF > mat.out
XX<<40, 34, 28, 22>,
XX<112, 97, 82, 67>,
XX<184, 160, 136, 112>,
XX<256, 223, 190, 157>>
SHAR_EOF
if test 82 -ne "`wc -c mat.out`"
then
echo shar: error transmitting mat.out '(should have been 82 characters)'
fi
echo shar: extracting mat.tst '(239 characters)'
sed 's/^XX//' << \SHAR_EOF > mat.tst
XX<<<1, 2, 3>,
XX <4, 5, 6>,
XX <7, 8, 9>,
XX <10, 11, 12>>,
XX <<12, 11, 10, 9>,
XX <8, 7, 6, 5>,
XX <4, 3, 2, 1>>>
XX
XXexpected result of matrix multiplication is:
XX<<40, 34, 28, 22>,
XX <112, 97, 82, 67>,
XX <184, 160, 136, 112>,
XX <256, 223, 190, 157>>
SHAR_EOF
if test 239 -ne "`wc -c mat.tst`"
then
echo shar: error transmitting mat.tst '(should have been 239 characters)'
fi
echo shar: extracting mmult.fp '(100 characters)'
sed 's/^XX//' << \SHAR_EOF > mmult.fp
XXDef IP (/+) o (aa *) o trans
XX
XXDef MM (aa aa IP) o (aa distl) o distr o [1, trans o 2]
XX
XXDef mmult MM
SHAR_EOF
if test 100 -ne "`wc -c mmult.fp`"
then
echo shar: error transmitting mmult.fp '(should have been 100 characters)'
fi
echo shar: extracting msort.fp '(232 characters)'
sed 's/^XX//' << \SHAR_EOF > msort.fp
XXDef msort # mergesort: <n1, n2, .., nx> => <ni, nj, .., nq>, sorted
XX \/ merge o aa [id]
XX
XXDef merge null o 1 -> 2;
XX null o 2 -> 1;
XX < o aa 1 -> apndl o [1 o 1, merge o [tl o 1, 2]];
XX apndl o [1 o 2, merge o [1, tl o 2]]
SHAR_EOF
if test 232 -ne "`wc -c msort.fp`"
then
echo shar: error transmitting msort.fp '(should have been 232 characters)'
fi
echo shar: extracting newsels.fp '(157 characters)'
sed 's/^XX//' << \SHAR_EOF > newsels.fp
XXDef min \/( < -> 1; 2)
XXDef exclude append o aa ( = -> _<>; tl) o distl
XXDef newsels (bu >= 1) o length -> id;
XX apndl o [1, newsels o exclude] o [min, id]
SHAR_EOF
if test 157 -ne "`wc -c newsels.fp`"
then
echo shar: error transmitting newsels.fp '(should have been 157 characters)'
fi
echo shar: extracting nil '(3 characters)'
sed 's/^XX//' << \SHAR_EOF > nil
XX<>
SHAR_EOF
if test 3 -ne "`wc -c nil`"
then
echo shar: error transmitting nil '(should have been 3 characters)'
fi
echo shar: extracting nqueens.fp '(1801 characters)'
sed 's/^XX//' << \SHAR_EOF > nqueens.fp
XX# nqueens.fp: gives all solutions for placing n queens on an nxn
XX# chessboard in such a way that they do not threaten each other
XX# Typical call:
XX# nqueens 8
XX
XX# nqueens : n => board printout, or nil
XXDef nqueens prtboards o nmqueens o [id, id]
XX
XX# nmqueens : <n, m> => list of n safe row positions for n queens on an
XX# n-column by m-row chessboard. Precondition: n <= m
XX# e.g., nmqueens : <2, 3> => <<1, 3>, <3, 1>>
XXDef nmqueens (bu = 1) o 1 -> aa [id] o iota o 2;
XX append o aa (null -> id; [id]) o aa safe o
XX append o aa distl o distr o
XX [iota o 2, nmqueens o [(bur - 1) o 1, 2]]
XX
XX# safe : <row, rowpositions> => <row | rowpositions> if safe, <> otherwise
XX# e.g. safe : <3, <1, 4, 7>> => <3, 1, 4, 7>, safe : <3, <4, 1, 7>> => <>
XXDef safe \/and o aa saferow o aa apndl o pairpos o distl -> apndl ; _<>
XX
XX# pairpos : <x1..xn> ==> <<1 x1>..<n xn>>
XXDef pairpos null -> _<>; trans o [iota o length, id]
XX
XX# saferow : <col, row@col1, row@col> => whether a queen placed at
XX# (row@col1, 1) is safe from one at (row@col, col)
XXDef saferow \/and o aa != o [tl, [1, - o tl], [1, neg o - o tl]]
XX
XX# prtboards : <rowlist1..rowlistn> => board1 ++ newline ++ .. ++ boardn
XXDef prtboards null -> _"no solution found"; mergelines o aa prtboard
XX
XX# prtboard : <row1..rown> => printed form of the board, where Q represents
XX# a position, _ a blank, and rows are terminated by newlines. e.g.
XX# prtboard: <1, 3, 2> => "Q__\n__Q\n_Q_\n", where \n represents new line.
XXDef prtboard mergelines o trans o aa prtcol o distr o [id, length]
XX
XX# prtcol : <row size> => printed form of the column containing the given row
XXDef prtcol aa (= -> _'Q; _'_) o distl o [1, iota o 2]
XX
XX# mergelines: <str1..strn> => str, where str is the concatenation of the
XX# stri's separated by newlines
XXDef mergelines append o aa (append o [id, newline])
SHAR_EOF
if test 1801 -ne "`wc -c nqueens.fp`"
then
echo shar: error transmitting nqueens.fp '(should have been 1801 characters)'
fi
echo shar: extracting parprimes.fp '(216 characters)'
sed 's/^XX//' << \SHAR_EOF > parprimes.fp
XXDef elim (bu = 0) o mod o reverse -> _<>;
XX [2]
XXDef filter null o 2 -> 2;
XX /(/apndl o apndr) o aa elim o distl
XXDef sieve null -> id;
XX apndl o [1, sieve o filter o [1, tl]]
XXDef parprimes sieve o tl o iota
SHAR_EOF
if test 216 -ne "`wc -c parprimes.fp`"
then
echo shar: error transmitting parprimes.fp '(should have been 216 characters)'
fi
echo shar: extracting permsort.fp '(415 characters)'
sed 's/^XX//' << \SHAR_EOF > permsort.fp
XXDef permute append o aa append o aa aa (= o [1 o 1, 2] -> [2 o 1]; _<>) o
XX aa distr o distl o [id, iota o length]
XX # permute : <<i1, x1>,..<in, xn>> where {iy} = 1..n ==> <xj,..xk>
XX # where ij = 1, ik = n and so on for the intermediate i's
XXDef rank \/+ o aa ( < -> _0; _1) o distl
XX # rank : <x, <x1,..xn>> ==> m where m is the number of xi's <= x
XX
XXDef permsort permute o trans o [aa rank o distr o [id, id], id]
SHAR_EOF
if test 415 -ne "`wc -c permsort.fp`"
then
echo shar: error transmitting permsort.fp '(should have been 415 characters)'
fi
echo shar: extracting powerset.fp '(346 characters)'
sed 's/^XX//' << \SHAR_EOF > powerset.fp
XX# powerset: <el1..eln> => powerset of <el1..eln>
XX# e.g. powerset: <> => <<>>
XX# powerset: <e> => <<>, <e>>
XX# powerset: <1 2> => <<>, <1>, <2>, <1, 2>>
XX# powerset: <1 2 3> => <<>, <1>, <2>, <3>, <1, 2>, <1, 3>, <2, 3>,
XX# <1, 2, 3>>
XX# and so on.
XXDef powerset null -> [id];
XX append o [aa apndl o distl o [1, 2], 2] o [1, powerset o tl]
SHAR_EOF
if test 346 -ne "`wc -c powerset.fp`"
then
echo shar: error transmitting powerset.fp '(should have been 346 characters)'
fi
echo shar: extracting primes.fp '(223 characters)'
sed 's/^XX//' << \SHAR_EOF > primes.fp
XXDef filter null o 2 -> _<>;
XX (bu = 0) o mod o [1 o 2, 1] -> filter o [1, tl o 2];
XX apndl o [1 o 2, filter o [1, tl o 2]]
XXDef sieve (null -> _<>;
XX apndl o [1, sieve o filter o [1, tl]])
XXDef primes sieve o tl o iota
SHAR_EOF
if test 223 -ne "`wc -c primes.fp`"
then
echo shar: error transmitting primes.fp '(should have been 223 characters)'
fi
echo shar: extracting prims.fp '(8494 characters)'
sed 's/^XX//' << \SHAR_EOF > prims.fp
XX# prims.fp: test suite for any implementation of FP or FP/FFP
XXDef prims [id, \/and] o
XX [testtl, testtlr,
XX testrotl, testrotr,
XX testid, testatom,
XX testdistl, testdistr,
XX testapndl, testapndr,
XX testeq, testnoteq,
XX testleq, testgeq,
XX testless, testgreater,
XX testplus, testminus,
XX testtimes, testdiv,
XX testneg, testmod,
XX testnull, testlength,
XX testtrans, testreverse,
XX testand, testor,
XX testnot, testiota]
XX
XXDef testand \/and o aa = o
XX (bu trans <F, F, F, T>) o aa and o _<<F, F>, <F, T>, <T, F>, <T, T>>
XX
XXDef testapndl \/and o aa = o
XX (bu trans <<a>, <a, b>, <a, b, c>, <<>>, <<a>>, <<a>, <b>>>) o
XX aa apndl o
XX _<<a, <>>, <a, <b>>, <a, <b, c>>, <<>, <>>, <<a>, <>>,
XX <<a>, <<b>>>>
XX
XXDef testapndr \/and o aa = o
XX (bu trans <<a>, <a, b>, <a, b, c>, <<>>, <<a>>, <<a>, <b>>>) o
XX aa apndr o
XX _<<<>, a>, <<a>, b>, <<a, b>, c>, <<>, <>>, <<>, <a>>,
XX <<<a>>, <b>>>
XX
XXDef testatom \/and o aa = o
XX (bu trans <T, T, T, T, T, T, T, F, F, F, F>) o
XX aa atom o
XX _<T, F, <>, 1, 1.0, a, 'a, "string", <vector>,
XX <"vector">, <v, e, c, t, o, r>>
XX
XXDef testdistl \/and o aa = o
XX (bu trans <<>, <<a, 1>>, <<b, 1>, <b, 2>>, <<<>, 1>,
XX <<>, 2>, <<>, 3>>>) o
XX aa distl o _<<x, <>>, <a, <1>>, <b, <1, 2>>, <<>, <1, 2, 3>>>
XX
XXDef testdistr \/and o aa = o
XX (bu trans <<>, <<a, 1>>, <<a, 2>, <b, 2>>,
XX <<a, <>>, <b, <>>, <c, <>>>>) o
XX aa distr o _<<<>, x>, <<a>, 1>, <<a, b>, 2>, <<a, b, c>, <>>>
XX
XXDef testdiv \/and o aa = o
XX (bu trans
XX <1, 1, 0, 2, -12, -3, 6,
XX 1.0, 1.0, 0.5, 2.0, -8.75, -17.5, 6.25>) o
XX aa div o
XX _<<1, 1>, <10, 10>, <1, 2>, <2, 1>, <35, -3>, <-35, 17>, <-27, -4>,
XX <1, 1.0>, <10.0, 10>, <1.0, 2.0>, <2.0, 1>, <35, -4.0>,
XX <-35.0, 2.0>, <-25.0, -4.0>>
XX
XXDef testeq \/and o aa = o
XX (bu trans
XX <T, F, F, F, T, F, F, F, F, F,
XX T, F, F, F, F, F, F, F, F,
XX T, F, F, F, F, F, F, F, F,
XX T, F, T, F, F, F, F, F, F, F,
XX T, F, F, F, F, F, F,
XX T, F, F, F, F, F, F,
XX T, F, F, F, F, F, F,
XX T, F, F, F, F, F, F, F, F,
XX T, F>) o aa = o
XX _<<1, 1>, <1, 0>, <1, a>, <1, 'a>, <1, 1.0>, <1, 0.99>,
XX <1, <>>, <1, T>, <1, F>, <1, <1>>,
XX <a, a>, <a, b>, <a, 1>, <a, 'a>, <a, 1.0>, <a, <>>,
XX <a, T>, <a, F>, <a, <a>>,
XX <'a, 'a>, <'a, 'b>, <'a, 1>, <'a, a>, <'a, 1.0>,
XX <'a, <>>, <'a, T>, <'a, F>, <'a, <'a>>,
XX <1.0, 1.0>, <1.0, 2.0>, <1.0, 1>, <1.1, 1>, <1.0, 'a>,
XX <1.0, a>, <1.0, <>>, <1.0, T>, <1.0, F>, <1.0, <1.0>>,
XX <T, T>, <T, 1>, <T, 'T>, <T, 1.0>, <T, <>>, <T, F>, <T, <T>>,
XX <F, F>, <F, 1>, <F, 'F>, <F, 1.0>, <F, <>>, <F, T>, <F, <F>>,
XX <<>, <>>, <<>, 1>, <<>, 'F>, <<>, 1.0>, <<>, T>, <<>, F>,
XX <<>, <<>>>,
XX <<a>, <a>>, <<a>, <b>>, <<a>, 1>, <<a>, 'a>, <<a>, 1.0>,
XX <<a>, <>>, <<a>, T>, <<a>, F>, <<a>, <<a>>>,
XX <<a, <b>, <c, <d>>, e>, <a, <b>, <c, <d>>, e>>,
XX <<a, <b>, <c, <d>>, e>, <a, <b>, <c, <f>>, e>>>
XX
XX# only test geq on atoms, chars and numbers. Particular implementations
XX# may have it defined for other values as well, but that is not portable
XXDef testgeq \/and o aa = o
XX (bu trans <T, T, F, T, T, F, T, T, F, T, T, F, T, T, F, T, T, F>) o
XX aa >= o
XX _<<1, 0>, <1, 1>, <1, 2>,
XX <1.0, 0.99>, <1.0, 1.0>, <1.0, 1.01>,
XX <1, 0.99>, <1, 1.0>, <1, 1.01>,
XX <1.01, 1>, <1.0, 1>, <0.99, 1>,
XX <m, a>, <m, m>, <m, z>,
XX <'m, 'a>, <'m, 'm>, <'m, 'z>>
XX
XXDef testgreater \/and o aa = o
XX (bu trans <T, F, F, T, F, F, T, F, F, T, F, F, T, F, F, T, F, F>) o
XX aa > o
XX _<<1, 0>, <1, 1>, <1, 2>,
XX <1.0, 0.99>, <1.0, 1.0>, <1.0, 1.01>,
XX <1, 0.99>, <1, 1.0>, <1, 1.01>,
XX <1.01, 1>, <1.0, 1>, <0.99, 1>,
XX <m, a>, <m, m>, <m, z>,
XX <'m, 'a>, <'m, 'm>, <'m, 'z>>
XX
XXDef testid \/and o aa = o
XX (bu trans <1, a, 'a, 1.0, T, F, <>, "id", <id, 1, x>>) o
XX aa id o _<1, a, 'a, 1.0, T, F, <>, "id", <id, 1, x>>
XX
XXDef testiota \/and o aa = o
XX (bu trans <<>, <1>, <1, 2>, <1, 2, 3, 4, 5, 6, 7, 8, 9, 10>>) o
XX aa iota o _<0, 1, 2, 10>
XX
XXDef testlength \/and o aa = o
XX (bu trans <0, 1, 1, 2, 3, 4, 10>) o
XX aa length o
XX _<<>, <1>, <<<>>>, <<a, b, c>, <d, e>>, "xyz", "four", "lenght ten">
XX
XXDef testleq \/and o aa = o
XX (bu trans <F, T, T, F, T, T, F, T, T, F, T, T, F, T, T, F, T, T>) o
XX aa <= o
XX _<<1, 0>, <1, 1>, <1, 2>,
XX <1.0, 0.99>, <1.0, 1.0>, <1.0, 1.01>,
XX <1, 0.99>, <1, 1.0>, <1, 1.01>,
XX <1.01, 1>, <1.0, 1>, <0.99, 1>,
XX <m, a>, <m, m>, <m, z>,
XX <'m, 'a>, <'m, 'm>, <'m, 'z>>
XX
XXDef testless \/and o aa = o
XX (bu trans <F, F, T, F, F, T, F, F, T, F, F, T, F, F, T, F, F, T>) o
XX aa < o
XX _<<1, 0>, <1, 1>, <1, 2>,
XX <1.0, 0.99>, <1.0, 1.0>, <1.0, 1.01>,
XX <1, 0.99>, <1, 1.0>, <1, 1.01>,
XX <1.01, 1>, <1.0, 1>, <0.99, 1>,
XX <m, a>, <m, m>, <m, z>,
XX <'m, 'a>, <'m, 'm>, <'m, 'z>>
XX
XXDef testminus \/and o aa = o
XX (bu trans <1, -1, 0, 11, -5, 3, -5>) o
XX aa - o
XX _<<1, 0>, <0, 1>, <1, 1>, <7, -4>, <-3, 2>, <-5, -8>, <-8, -3>>
XX
XXDef testmod \/and o aa = o
XX (bu trans <0, 0, 1, 0, 1, 16, 3>) o
XX aa mod o
XX _<<1, 1>, <10, 10>, <1, 2>, <2, 1>, <35, -3>, <-35, 17>, <-27, -4>>
XX
XXDef testneg \/and o aa = o (bu trans <0, 0, 1, -1.0, 15.2, -17>) o
XX aa neg o _<0, -0, -1, 1.0, -15.2, 17>
XX
XXDef testnot \/and o aa = o (bu trans <T, F>) o aa not o _<F, T>
XX
XXDef testnoteq \/and o aa = o
XX (bu trans
XX <F, T, T, T, F, T, T, T, T, T,
XX F, T, T, T, T, T, T, T, T,
XX F, T, T, T, T, T, T, T, T,
XX F, T, F, T, T, T, T, T, T, T,
XX F, T, T, T, T, T, T,
XX F, T, T, T, T, T, T,
XX F, T, T, T, T, T, T,
XX F, T, T, T, T, T, T, T, T,
XX F, T>) o aa != o
XX _<<1, 1>, <1, 0>, <1, a>, <1, 'a>, <1, 1.0>, <1, 0.99>,
XX <1, <>>, <1, T>, <1, F>, <1, <1>>,
XX <a, a>, <a, b>, <a, 1>, <a, 'a>, <a, 1.0>, <a, <>>,
XX <a, T>, <a, F>, <a, <a>>,
XX <'a, 'a>, <'a, 'b>, <'a, 1>, <'a, a>, <'a, 1.0>, <'a, <>>,
XX <'a, T>, <'a, F>, <'a, <'a>>,
XX <1.0, 1.0>, <1.0, 2.0>, <1.0, 1>, <1.1, 1>, <1.0, 'a>, <1.0, a>,
XX <1.0, <>>, <1.0, T>, <1.0, F>, <1.0, <1.0>>,
XX <T, T>, <T, 1>, <T, 'T>, <T, 1.0>, <T, <>>, <T, F>, <T, <T>>,
XX <F, F>, <F, 1>, <F, 'F>, <F, 1.0>, <F, <>>, <F, T>, <F, <F>>,
XX <<>, <>>, <<>, 1>, <<>, 'F>, <<>, 1.0>, <<>, T>, <<>, F>,
XX <<>, <<>>>,
XX <<a>, <a>>, <<a>, <b>>, <<a>, 1>, <<a>, 'a>, <<a>, 1.0>,
XX <<a>, <>>, <<a>, T>, <<a>, F>, <<a>, <<a>>>,
XX <<a, <b>, <c, <d>>, e>, <a, <b>, <c, <d>>, e>>,
XX <<a, <b>, <c, <d>>, e>, <a, <b>, <c, <f>>, e>>>
XX
XXDef testnull \/and o aa = o
XX (bu trans <T, F, F, F, F, F, F, T, F, F, F>) o
XX aa null o _<<>, 0, 1, a, '0, T, F, "", "nil", <nil>,
XX <m, <o, n>, <<s>, t, e>, r>>
XX
XXDef testor \/and o aa = o
XX (bu trans <F, T, T, T>) o aa or o _<<F, F>, <F, T>, <T, F>, <T, T>>
XX
XXDef testplus \/and o aa = o
XX (bu trans <0, 2, 1, 1, -2, 3, -9>) o
XX aa + o _<<0, 0>, <1, 1>, <1, 0>, <0, 1>, <1, -3>, <-5, 8>, <-4, -5>>
XX
XXDef testreverse \/and o aa = o
XX (bu trans
XX <<>, <a>, <b, a>, <4, 3, 2, 1>, <<e, f>, <c, d>, <a, b>>>) o
XX aa reverse o
XX _<<>, <a>, <a, b>, <1, 2, 3, 4>, <<a, b>, <c, d>, <e, f>>>
XX
XXDef testrotl \/and o aa = o
XX (bu trans
XX <<>, <a>, <b, a>, <2, 3, 4, 5, 1>, <<r, s>, <t, u>, <p, q>>>) o
XX aa rotl o
XX _<<>, <a>, <a, b>, <1, 2, 3, 4, 5>, <<p, q>, <r, s>, <t, u>>>
XX
XXDef testrotr \/and o aa = o
XX (bu trans
XX <<>, <a>, <b, a>, <5, 1, 2, 3, 4>, <<t, u>, <p, q>, <r, s>>>) o
XX aa rotr o
XX _<<>, <a>, <a, b>, <1, 2, 3, 4, 5>, <<p, q>, <r, s>, <t, u>>>
XX
XXDef testtimes \/and o aa = o
XX (bu trans <0, 0, 0, 9, -2, -4, 6, 6, 28, -18, -10>) o
XX aa * o
XX _<<0, 0>, <0, 5>, <1, 0>, <1, 9>, <1, -2>, <-1, 4>, <-1, -6>,
XX <-2, -3>, <4, 7>, <-6, 3>, <5, -2>>
XX
XXDef testtl \/and o aa = o
XX (bu trans <<>, <a>, <a, b, c>, <<>>, <<a>>, <<a>, <b>>>) o
XX aa tl o
XX _<<a>, <1, a>, <z, a, b, c>, <a, <>>, <x, <a>>, <<x>, <a>, <b>>>
XX
XXDef testtlr \/and o aa = o
XX (bu trans <<>, <a>, <a, b, c>, <<>>, <<a>>, <<a>, <b>>>) o
XX aa tlr o
XX _<<a>, <a, b>, <a, b, c, d>, <<>, a>, <<a>, x>, <<a>, <b>, <c>>>
XX
XXDef testtrans \/and o aa = o
XX (bu trans
XX <<>, <>, <>,
XX <<a>, <b>, <c>, <d>, <e>, <f>>, <<1, 2, 3, 4, 5>>,
XX <<a, c>, <b, d>>, <<a, 1, x>, <b, 2, y>, <c, 3, z>>,
XX <<a, 1, l>, <b, 2, m>, <c, 3, n>, <d, 4, o>, <e, 5, p>>>) o
XX aa trans o
XX _<<<>>, <<>, <>>, <<>, <>, <>, <>, <>>,
XX <<a, b, c, d, e, f>>, <<1>, <2>, <3>, <4>, <5>>,
XX <<a, b>, <c, d>>, <<a, b, c>, <1, 2, 3>, <x, y, z>>,
XX <<a, b, c, d, e>, <1, 2, 3, 4, 5>, <l, m, n, o, p>>>
SHAR_EOF
if test 8494 -ne "`wc -c prims.fp`"
then
echo shar: error transmitting prims.fp '(should have been 8494 characters)'
fi
echo shar: extracting printf.fp '(3320 characters)'
sed 's/^XX//' << \SHAR_EOF > printf.fp
XX# printf.fp: provides fpprintf and fpscanf, functions defined like
XX# the corresponding C functions.
XX# e.g. fpprintf: <"hello %c %s\n", 'x, "string"> would return
XX# "hello x string<newline>"
XX# for now, field lengths are not defined
XXDef fpprintf append o aa format o trans o [parsectrl, distformats]
XX
XX# parsectrl: "control %x string%y \n" => <"control %x", "string%y", " <nl>">
XXDef parsectrl breakup o
XX# next two lines, check that 1 is in the list of break up positions
XX (null o 1 -> [_<1>, 2];
XX (bu != 1) o 1 o 1 -> [(bu apndl 1) o 1, 2]; id) o
XX# next line, make sure that the last break-up position is needed
XX (> o [1r o 1, length o 2] -> [tlr o 1, 2]; id) o
XX# figure out preliminary break-up positions, put newlines
XX [append o aa parsebreak o pairpos o tl o allpairs,
XX id] o subnewline o 1
XX
XX# parsebreak: <pos, <c1, c2>> => <> if c1 != %, <pos+2> if c1 = %
XXDef parsebreak (bu = '%) o 1 o 2 -> [(bu + 2) o 1]; _<>
XX
XX# subnewline: string => string with newline instead of every \n
XXDef subnewline append o aa subcharpair o tlr o allpairs
XX
XX# subcharpair: <c1, c2> => newline if c1 = \, c2 = n; <c1> otherwise
XXDef subcharpair (bu = '\\) o 2 -> _<>; (bu = "\n") -> newline; [2]
XX
XX# format: <ctrl-substring arg> => <new-substring>
XXDef format (bur < 2) o length o 1 -> 1; # end of format string
XX (bu != '%) o 2r o 1 -> 1; # same
XX (bu = 's) o 1r o 1 ->
XX append o [tlr o tlr o 1, subnewline o 2]; # cat strings
XX (bu = 'd) o 1r o 1 ->
XX append o [tlr o tlr o 1, (bur numtostring 10) o 2];
XX (bu = 'x) o 1r o 1 ->
XX append o [tlr o tlr o 1, (bur numtostring 16) o 2];
XX (bu = 'o) o 1r o 1 ->
XX append o [tlr o tlr o 1, (bur numtostring 8) o 2];
XX (bu = 'c) o 1r o 1 ->
XX apndr o [tlr o tlr o 1, 2];
XX (bu error "fpprintf: unknown format was used")
XX
XX# distformats: <format-string, other-args*> => <other-args*> or
XX# <other-args* format-string>, the former in the case that the last
XX# 2 elements of format-string are %c, where c is any character.
XXDef distformats (bur < 2) o length o 1 -> tl;
XX (bu = '%) o 2r o 1 -> tl;
XX rotl
XX
XX# numtostring: <n base> => "xyz", a string corresponding to the printable
XX# form, in the given base, of the number n.
XXDef numtostring (bur < 0) o 1 ->
XX (bu apndl '-) o numtostring o [neg o 1, 2];
XX aa printdigit o reverse o makedigits
XX
XX# makedigits: <n base> => <dig1, dig2 .. dign>, where digx < base
XXDef makedigits < -> [1]; apndl o [mod, makedigits o [div, 2]]
XX
XX# printdigit: n => the character corresponding to n (0 <= n < 16)
XXDef printdigit 1 o (bur seln "0123456789ABCDEF") o
XX [(bu + 1), _1]
XX
XXDef charalpha or o [charupper, charlower]
XX
XXDef charupper and o [(bur >= 'A), (bu >= 'Z)]
XX
XXDef charlower and o [(bur >= 'a), (bu >= 'z)]
XX
XXDef chardigit and o [(bur >= '0), (bu >= '9)]
XX
XXDef charhexdig \/or o [chardigit,
XX and o [(bur >= 'a), (bu >= 'f)],
XX and o [(bur >= 'A), (bu >= 'F)]]
XX
XXDef charoctdig and o [(bur >= '0), (bu >= '7)]
XX
XXDef charspace or o [(bu = ' ), (bu = ' )]
XX
XXDef tstfpprintf [aa 2, \/and o aa =] o trans o [
XX_<"hi there,
XX274 high, 3D4F lo, -247 octal
XX",
XX "how do you compute prime numbers 13 and 17?
XXa new result">,
XX aa fpprintf o
XX [[_"h%s\\n%d h%cgh, %x lo, %o octal%s",
XX _"i there,", _274, _'i, _15695, _-167, newline],
XX [_"how do %s prime numbers %d and %x?%sa new result",
XX _"you compute", _13, _23, _"\\n"]]]
SHAR_EOF
if test 3320 -ne "`wc -c printf.fp`"
then
echo shar: error transmitting printf.fp '(should have been 3320 characters)'
fi
echo shar: extracting printhex.fp '(86 characters)'
sed 's/^XX//' << \SHAR_EOF > printhex.fp
XX# printhex.fp: print a number in hexadecimal notation
XXDef printhex bu fpprintf "%x\n"
SHAR_EOF
if test 86 -ne "`wc -c printhex.fp`"
then
echo shar: error transmitting printhex.fp '(should have been 86 characters)'
fi
echo shar: extracting qsort.fp '(211 characters)'
sed 's/^XX//' << \SHAR_EOF > qsort.fp
XXDef before append o aa ( > -> tl ; _<> )
XXDef same append o aa ( = -> tl ; _<> )
XXDef after append o aa ( < -> tl ; _<> )
XX
XXDef qsort null -> id;
XX append o [qsort o before, same, qsort o after] o distl o [1, id]
SHAR_EOF
if test 211 -ne "`wc -c qsort.fp`"
then
echo shar: error transmitting qsort.fp '(should have been 211 characters)'
fi
echo shar: extracting selsort.fp '(221 characters)'
sed 's/^XX//' << \SHAR_EOF > selsort.fp
XXDef reorder atom o 2 -> reorder o [1, [2]];
XX < o [1, 1 o 2] -> apndl;
XX apndl o [1 o 2, apndl o [1, tl o 2]]
XX
XXDef selsort atom -> id;
XX (bu >= 1) o length -> id;
XX apndl o [1, selsort o tl] o /reorder
SHAR_EOF
if test 221 -ne "`wc -c selsort.fp`"
then
echo shar: error transmitting selsort.fp '(should have been 221 characters)'
fi
echo shar: extracting sort.out '(542 characters)'
sed 's/^XX//' << \SHAR_EOF > sort.out
XX<1,
XX11,
XX38,
XX43,
XX53,
XX59,
XX90,
XX136,
XX182,
XX230,
XX273,
XX302,
XX339,
XX350,
XX352,
XX364,
XX379,
XX381,
XX423,
XX424,
XX440,
XX455,
XX479,
XX538,
XX540,
XX579,
XX611,
XX615,
XX631,
XX639,
XX663,
XX680,
XX684,
XX699,
XX703,
XX720,
XX763,
XX785,
XX821,
XX827,
XX832,
XX914,
XX919,
XX929,
XX931,
XX940,
XX940,
XX941,
XX959,
XX970,
XX972,
XX1032,
XX1139,
XX1261,
XX1275,
XX1289,
XX1368,
XX1469,
XX1567,
XX2040,
XX2724,
XX3329,
XX3594,
XX3668,
XX3682,
XX3716,
XX3926,
XX4219,
XX4328,
XX4751,
XX4923,
XX5106,
XX5307,
XX5569,
XX5681,
XX5693,
XX5764,
XX6242,
XX6332,
XX6512,
XX6678,
XX6707,
XX6963,
XX7163,
XX7685,
XX7746,
XX7837,
XX7872,
XX7927,
XX7961,
XX8505,
XX8571,
XX8762,
XX9144,
XX9208,
XX9216,
XX9480,
XX9621,
XX9719,
XX9868>
SHAR_EOF
if test 542 -ne "`wc -c sort.out`"
then
echo shar: error transmitting sort.out '(should have been 542 characters)'
fi
echo shar: extracting sort.tst '(542 characters)'
sed 's/^XX//' << \SHAR_EOF > sort.tst
XX<53,
XX914,
XX827,
XX302,
XX631,
XX785,
XX230,
XX11,
XX1567,
XX350,
XX5307,
XX339,
XX929,
XX9216,
XX479,
XX703,
XX699,
XX90,
XX440,
XX3926,
XX1032,
XX3329,
XX3682,
XX5764,
XX615,
XX7961,
XX273,
XX1275,
XX38,
XX4923,
XX540,
XX43,
XX7837,
XX1368,
XX7746,
XX1469,
XX8505,
XX4328,
XX9480,
XX424,
XX6678,
XX1139,
XX763,
XX959,
XX6707,
XX6242,
XX663,
XX59,
XX6332,
XX455,
XX7685,
XX3716,
XX136,
XX720,
XX832,
XX4751,
XX5681,
XX5106,
XX379,
XX9719,
XX381,
XX919,
XX7163,
XX4219,
XX639,
XX1261,
XX2040,
XX9144,
XX941,
XX7872,
XX5569,
XX972,
XX364,
XX684,
XX931,
XX423,
XX7927,
XX3594,
XX182,
XX611,
XX1,
XX9868,
XX680,
XX538,
XX940,
XX6512,
XX1289,
XX9621,
XX970,
XX3668,
XX5693,
XX352,
XX940,
XX9208,
XX8571,
XX579,
XX821,
XX6963,
XX2724,
XX8762>
SHAR_EOF
if test 542 -ne "`wc -c sort.tst`"
then
echo shar: error transmitting sort.tst '(should have been 542 characters)'
fi
echo shar: extracting whilefact.fp '(130 characters)'
sed 's/^XX//' << \SHAR_EOF > whilefact.fp
XXDef nonnull (bu != 0) o 2
XXDef multdecr [ * o [1, 2], - o [2, _1]]
XXDef wfact while nonnull multdecr
XXDef whilefact 1 o (bu wfact 1)
SHAR_EOF
if test 130 -ne "`wc -c whilefact.fp`"
then
echo shar: error transmitting whilefact.fp '(should have been 130 characters)'
fi
echo shar: done with directory main
cd ..
# End of shell archive
exit 0