home *** CD-ROM | disk | FTP | other *** search
- 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
-
-