diff --git a/changelog b/changelog index 50f94e0..94eac53 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,7 @@ +20080215 tpd src/interp/format.boot add )d op documentation +20080215 tpd src/algebra/plot add comment documentation +20080210 tpd src/algebra/Makefile add plot help and input files for plot +20080210 tpd src/algebra/plot add help and input files 20080210 tpd zips/gcl-2.6.8pre.h.powerpc-macosx.defs.patch added 20080209 tpd src/doc/book add Ei,En,Ei1,Ei2,Ei3,Ei4,Ei5,Ei6 20080207 tpd Makefile fix GCLOPTS-CUSTRELOC for macosxppc diff --git a/src/algebra/Makefile.pamphlet b/src/algebra/Makefile.pamphlet index b11ba9c..d140609 100644 --- a/src/algebra/Makefile.pamphlet +++ b/src/algebra/Makefile.pamphlet @@ -2118,7 +2118,7 @@ SPADHELP=\ ${HELP}/Octonion.help ${HELP}/OneDimensionalArray.help \ ${HELP}/Operator.help ${HELP}/OrderedVariableList.help \ ${HELP}/OrderlyDifferentialPolynomial.help \ - ${HELP}/PlaneAlgebraicCurvePlot.help \ + ${HELP}/PlaneAlgebraicCurvePlot.help ${HELP}/Plot.help \ ${HELP}/PartialFraction.help \ ${HELP}/Permanent.help ${HELP}/Permutation.help \ ${HELP}/Polynomial.help ${HELP}/Quaternion.help \ @@ -2183,7 +2183,7 @@ REGRESS=\ OrderlyDifferentialPolynomial.regress \ PartialFraction.regress \ Permanent.regress Permutation.regress \ - PlaneAlgebraicCurvePlot.regress \ + PlaneAlgebraicCurvePlot.regress Plot.regress \ Polynomial.regress Quaternion.regress \ RadixExpansion.regress RealClosure.regress \ RealSolvePackage.regress RegularTriangularSet.regress \ @@ -2795,6 +2795,12 @@ ${HELP}/PlaneAlgebraicCurvePlot.help: ${IN}/acplot.spad.pamphlet ${IN}/acplot.spad.pamphlet \ >${INPUT}/PlaneAlgebraicCurvePlot.input +${HELP}/Plot.help: ${IN}/plot.spad.pamphlet + @echo 7064 create Plot.help from ${IN}/plot.spad.pamphlet + @${TANGLE} -R"Plot.help" ${IN}/plot.spad.pamphlet >${HELP}/Plot.help + @-cp ${HELP}/Plot.help ${HELP}/PLOT.help + @${TANGLE} -R"Plot.input" ${IN}/plot.spad.pamphlet >${INPUT}/Plot.input + ${HELP}/Polynomial.help: ${IN}/multpoly.spad.pamphlet @echo 7065 create Polynomial.help from ${IN}/multpoly.spad.pamphlet @${TANGLE} -R"Polynomial.help" ${IN}/multpoly.spad.pamphlet \ diff --git a/src/algebra/plot.spad.pamphlet b/src/algebra/plot.spad.pamphlet index ea92ae6..81c4846 100644 --- a/src/algebra/plot.spad.pamphlet +++ b/src/algebra/plot.spad.pamphlet @@ -10,6 +10,101 @@ \tableofcontents \eject \section{domain PLOT Plot} +<>= +-- plot.spad.pamphlet Plot.input +)spool Plot.output +)set message test on +)set message auto off +)clear all +--S 1 of 2 +fp:=(t:DFLOAT):DFLOAT +-> sin(t) +--R +--R (1) theMap(Closure) +--R Type: (DoubleFloat -> DoubleFloat) +--E 1 + +--S 2 of 2 +plot(fp,-1.0..1.0)$PLOT +--R +--R +--R (2) PLOT(x = (- 1.)..1. y = (- 0.8414709848078965)..0.8414709848078965) +--R [- 1.,- 0.8414709848078965] +--R [- 0.95833333333333337,- 0.81823456433427133] +--R [- 0.91666666666666674,- 0.79357780324894212] +--R [- 0.87500000000000011,- 0.76754350223602708] +--R [- 0.83333333333333348,- 0.74017685319603721] +--R [- 0.79166666666666685,- 0.7115253607990657] +--R [- 0.75000000000000022,- 0.68163876002333434] +--R [- 0.70833333333333359,- 0.65056892982223602] +--R [- 0.66666666666666696,- 0.61836980306973721] +--R [- 0.62500000000000033,- 0.58509727294046243] +--R [- 0.5833333333333337,- 0.55080909588697013] +--R [- 0.54166666666666707,- 0.51556479138264011] +--R [- 0.50000000000000044,- 0.47942553860420339] +--R [- 0.45833333333333376,- 0.44245407023325911] +--R [- 0.41666666666666707,- 0.40471456356112506] +--R [- 0.37500000000000039,- 0.3662725290860479] +--R [- 0.3333333333333337,- 0.3271946967961526] +--R [- 0.29166666666666702,- 0.28754890033552849] +--R [- 0.25000000000000033,- 0.24740395925452324] +--R [- 0.20833333333333368,- 0.20682955954864138] +--R [- 0.16666666666666702,- 0.16589613269341538] +--R [- 0.12500000000000036,- 0.12467473338522805] +--R [- 8.3333333333333703E-2,- 8.3236916200310623E-2] +--R [- 4.1666666666667039E-2,- 4.1654611386019461E-2] +--R [- 3.7470027081099033E-16,- 3.7470027081099033E-16] +--R [4.166666666666629E-2,4.1654611386018711E-2] +--R [8.3333333333332954E-2,8.3236916200309874E-2] +--R [0.12499999999999961,0.1246747333852273] +--R [0.16666666666666627,0.16589613269341463] +--R [0.20833333333333293,0.20682955954864066] +--R [0.24999999999999958,0.24740395925452252] +--R [0.29166666666666624,0.28754890033552777] +--R [0.33333333333333293,0.32719469679615187] +--R [0.37499999999999961,0.36627252908604718] +--R [0.4166666666666663,0.4047145635611244] +--R [0.45833333333333298,0.44245407023325839] +--R [0.49999999999999967,0.47942553860420273] +--R [0.5416666666666663,0.51556479138263944] +--R [0.58333333333333293,0.55080909588696947] +--R [0.62499999999999956,0.58509727294046177] +--R [0.66666666666666619,0.61836980306973666] +--R [0.70833333333333282,0.65056892982223535] +--R [0.74999999999999944,0.68163876002333379] +--R [0.79166666666666607,0.71152536079906514] +--R [0.8333333333333327,0.74017685319603665] +--R [0.87499999999999933,0.76754350223602663] +--R [0.91666666666666596,0.79357780324894167] +--R [0.95833333333333259,0.81823456433427078] +--R [1.,0.8414709848078965] +--R Type: Plot +--E 2 +)spool +)lisp (bye) +@ +<>= +========================================================================= +Plot examples +========================================================================= + +The Plot (PLOT) domain supports plotting of functions defined over a +real number system. Plot is limited to 2 dimensional plots. + +The function plot: (F -> F,R) -> % plots the function f(x) on the +interval a..b. So we need to define a function that maps from +DoubleFloat to DoubleFloat: + + fp:=(t:DFLOAT):DFLOAT +-> sin(t) + +and then feed it to the plot function with a Segment DoubleFloat + + plot(fp,-1.0..1.0)$PLOT + +See Also: +o )show Plot +o $AXIOM/doc/src/algebra/plot.spad.dvi + +@ <>= )abbrev domain PLOT Plot ++ Author: Michael Monagan (revised by Clifton J. Williamson) @@ -48,7 +143,12 @@ Plot(): Exports == Implementation where --% function plots plot: (F -> F,R) -> % - ++ plot(f,a..b) plots the function \spad{f(x)} on the interval \spad{[a,b]}. + ++ plot(f,a..b) plots the function \spad{f(x)} + ++ on the interval \spad{[a,b]}. + ++ + ++E fp:=(t:DFLOAT):DFLOAT +-> sin(t) + ++E plot(fp,-1.0..1.0)$PLOT + plot: (F -> F,R,R) -> % ++ plot(f,a..b,c..d) plots the function \spad{f(x)} on the interval ++ \spad{[a,b]}; y-range of \spad{[c,d]} is noted in Plot object. diff --git a/src/interp/format.boot.pamphlet b/src/interp/format.boot.pamphlet index 10b1be7..7dca247 100644 --- a/src/interp/format.boot.pamphlet +++ b/src/interp/format.boot.pamphlet @@ -177,6 +177,31 @@ substInOrder(alist,x) == alist is [[a,:b],:y] => substInOrder(y,SUBST(b,a,x)) x +@ +\subsection{reportOpSymbol} +This function prints the modemaps for operations as a result of the +user command for some operation foo: +\begin{verbatim} + )d op foo +\end{verbatim} + +We have enhanced this function to search the documentation for each +domain and print any examples it finds by calling the sayExample +function. Because of the way the databases are currently organized +the documentation is under each domain and is kept separate from +the modemaps. Ideally we'd output the example immediately after +the related modemap but I have yet to figure out how to do that. + +We need to know the name of the function (which the user supplied) +and we need to know a list of all of the domains containing that +function. This is collected using PUSHNEW into the domain list. + +Once we've processed all of the modemaps we have a set of the +domain names. We walk across that set requesting the documentation +strings for that domain. There are a list of documentation strings, +one for each exported function. We call sayExample on each element +of the list. If sayExample finds an example it prints it. +<<*>>= reportOpSymbol op1 == op := (STRINGP op1 => INTERN op1; op1) modemaps := getAllModemapsFromDatabase(op,nil) @@ -192,8 +217,12 @@ reportOpSymbol op1 == sayNewLine() -- filter modemaps on whether they are exposed mmsE := mmsU := NIL + domlist := NIL for mm in modemaps repeat - isFreeFunctionFromMm(mm) or isExposedConstructor getDomainFromMm(mm) => mmsE := [mm,:mmsE] + dom := getDomainFromMm(mm) + PUSHNEW(dom,domlist) + isFreeFunctionFromMm(mm) or isExposedConstructor dom => + mmsE := [mm,:mmsE] mmsU := [mm,:mmsU] if mmsE then sayMms(op,mmsE,'"exposed") where @@ -210,8 +239,105 @@ reportOpSymbol op1 == if mmsU then if mmsE then sayNewLine() sayMms(op,mmsU,'"unexposed") + for adom in domlist repeat + doc := GETDATABASE(adom,'DOCUMENTATION) + docs := CDR(ASSOC(op,doc)) + sayNewLine() + sayBrightly ['"Examples of ",op," from ",adom] + sayNewLine() + for export in docs repeat + sayExample(CADR(export),op) nil +@ +\subsection{sayExample} +This function expects 2 arguments, the documentation string and +the name of the operation. It searches the documentation string for +\verb|++E| lines. These lines are examples lines for functions. +They look like ordinary \verb|++| comments and fit into the ordinary +comment blocks. So, for example, in the plot.spad.pamphlet file we +find the following function signature: +\begin{verbatim} + plot: (F -> F,R) -> % + ++ plot(f,a..b) plots the function \spad{f(x)} + ++ on the interval \spad{[a,b]}. + ++ + ++E fp:=(t:DFLOAT):DFLOAT +-> sin(t) + ++E plot(fp,-1.0..1.0)$PLOT +\end{verbatim} +This function splits out and prints the lines that begin with \verb|++E|. + +A minor complication of printing the examples is that the lines have +been processed into internal compiler format. Thus the lines that read: +\begin{verbatim} + ++E fp:=(t:DFLOAT):DFLOAT +-> sin(t) + ++E plot(fp,-1.0..1.0)$PLOT +\end{verbatim} +are actually stored as one long line containing the example lines +\begin{verbatim} +"\\indented{1}{plot(\\spad{f},{}a..\\spad{b}) plots the function + \\spad{f(x)}} \\indented{1}{on the interval \\spad{[a,{}b]}.} + \\blankline + \\spad{E} fp:=(t:DFLOAT):DFLOAT +-> sin(\\spad{t}) + \\spad{E} plot(\\spad{fp},{}\\spad{-1}.0..1.0)\\$PLOT" +\end{verbatim} + +This function finds examples and strips off the prefix \verb|\\spad{E}| +from the stored form and calls cleanupLine to get rid of the other noise. +<<*>>= +sayExample(docstring,op) == + point := SEARCH('"{E}",docstring) + point => + line := SUBSEQ(docstring,point+3) + while (mark:=SEARCH('"{E}",line)) repeat + mark > 0 => + PRINC cleanupLine (SUBSEQ(line,0,mark-6)) + sayNewLine() + line := SUBSEQ(line,mark+3) + PRINC cleanupLine(line) + sayNewLine() + sayNewLine() + +@ +\subsection{cleanupLine} +This function expects example lines in internal format that has been +partially processed to remove the prefix. Thus we get lines that look +like: +\begin{verbatim} + fp:=(t:DFLOAT):DFLOAT +-> sin(\\spad{t}) + plot(\\spad{fp},{}\\spad{-1}.0..1.0)\\$PLOT +\end{verbatim} + +It removes all instances of \verb|{}|, and \verb|\|, and unwraps the +\verb|spad{}| call, leaving only the argument. + +We return lines that look like: +\begin{verbatim} + fp:=(t:DFLOAT):DFLOAT +-> sin(t) + plot(fp,-1.0..1.0)$PLOT +\end{verbatim} +which is hopefully exactly what the user wrote. + +<<*>>= +cleanupLine(line) == + while (point := SEARCH('"{}",line)) repeat + point => + left := SUBSEQ(line,0,point) + right := SUBSEQ(line,point+2) + line := CONCATENATE('STRING,left,right) + while (point := SEARCH('"\",line)) repeat + point => + left := SUBSEQ(line,0,point) + right := SUBSEQ(line,point+1) + line := CONCATENATE('STRING,left,right) + while (point := SEARCH('"spad{",line)) repeat + left := SUBSEQ(line,0,point) + mark := SEARCH('"}",line) + mid := SUBSEQ(line,point+5,mark) + right := SUBSEQ(line,mark+1) + line := CONCATENATE('STRING,left,mid,right) + line + formatOpType (form:=[op,:argl]) == null argl => unabbrev op form2String [unabbrev op, :argl]