aboutsummaryrefslogtreecommitdiff
path: root/src/hyper/pages/MAPPKG1.ht
diff options
context:
space:
mode:
Diffstat (limited to 'src/hyper/pages/MAPPKG1.ht')
-rw-r--r--src/hyper/pages/MAPPKG1.ht174
1 files changed, 174 insertions, 0 deletions
diff --git a/src/hyper/pages/MAPPKG1.ht b/src/hyper/pages/MAPPKG1.ht
new file mode 100644
index 00000000..33553bc3
--- /dev/null
+++ b/src/hyper/pages/MAPPKG1.ht
@@ -0,0 +1,174 @@
+% Copyright The Numerical Algorithms Group Limited 1992-94. All rights reserved.
+% !! DO NOT MODIFY THIS FILE BY HAND !! Created by ht.awk.
+\newcommand{\MappingPackageOneXmpTitle}{MappingPackage1}
+\newcommand{\MappingPackageOneXmpNumber}{9.51}
+%
+% =====================================================================
+\begin{page}{MappingPackageOneXmpPage}{9.51 MappingPackage1}
+% =====================================================================
+\beginscroll
+
+Function are objects of type \pspadtype{Mapping}.
+In this section we demonstrate some library operations from the
+packages \spadtype{MappingPackage1}, \spadtype{MappingPackage2}, and
+\spadtype{MappingPackage3} that manipulate and create functions.
+Some terminology: a {\it nullary} function takes no arguments,
+%-% \HDindex{function!nullary}{MappingPackageOneXmpPage}{9.51}{MappingPackage1}
+a {\it unary} function takes one argument, and
+%-% \HDindex{function!unary}{MappingPackageOneXmpPage}{9.51}{MappingPackage1}
+a {\it binary} function takes two arguments.
+%-% \HDindex{function!binary}{MappingPackageOneXmpPage}{9.51}{MappingPackage1}
+
+\xtc{
+We begin by creating an example function that raises a
+rational number to an integer exponent.
+}{
+\spadpaste{power(q: FRAC INT, n: INT): FRAC INT == q**n \bound{power}}
+}
+\xtc{
+}{
+\spadpaste{power(2,3) \free{power}}
+}
+\xtc{
+The \spadfunFrom{twist}{MappingPackage3} operation
+transposes the arguments of a binary function.
+Here \spad{rewop(a, b)} is \spad{power(b, a)}.
+}{
+\spadpaste{rewop := twist power \free{power}\bound{rewop}}
+}
+\xtc{
+This is \texht{$2^3.$}{\spad{2**3.}}
+}{
+\spadpaste{rewop(3, 2) \free{rewop}}
+}
+\xtc{
+Now we define \userfun{square} in terms of \userfun{power}.
+}{
+\spadpaste{square: FRAC INT -> FRAC INT \bound{squaredec}}
+}
+\xtc{
+The \spadfunFrom{curryRight}{MappingPackage3} operation creates a unary
+function from a binary one by providing a constant
+argument on the right.
+}{
+\spadpaste{square:= curryRight(power, 2) \free{squaredec poswer}\bound{square}}
+}
+\xtc{
+Likewise, the
+\spadfunFrom{curryLeft}{MappingPackage3} operation provides a constant
+argument on the left.
+}{
+\spadpaste{square 4 \free{square}}
+}
+\xtc{
+The \spadfunFrom{constantRight}{MappingPackage3} operation creates
+(in a trivial way) a binary function from a unary one:
+\spad{constantRight(f)} is the function \spad{g} such that
+\spad{g(a,b)= f(a).}
+}{
+\spadpaste{squirrel:= constantRight(square)\$MAPPKG3(FRAC INT,FRAC INT,FRAC INT) \free{square}\bound{squirrel}}
+}
+\xtc{
+Likewise,
+\spad{constantLeft(f)} is the function \spad{g} such that \spad{g(a,b)= f(b).}
+}{
+\spadpaste{squirrel(1/2, 1/3) \free{squirrel}}
+}
+\xtc{
+The \spadfunFrom{curry}{MappingPackage2} operation makes a unary function nullary.
+}{
+\spadpaste{sixteen := curry(square, 4/1) \free{square}\bound{sixteen}}
+}
+\xtc{
+}{
+\spadpaste{sixteen() \free{sixteen}}
+}
+\xtc{
+The \spadopFrom{*}{MappingPackage3} operation
+constructs composed functions.
+}{
+\spadpaste{square2:=square*square \free{square}\bound{square2}}
+}
+\xtc{
+}{
+\spadpaste{square2 3 \free{square2}}
+}
+\xtc{
+Use the \spadopFrom{**}{MappingPackage1} operation to create
+functions that are \spad{n}-fold iterations of other functions.
+}{
+\spadpaste{sc(x: FRAC INT): FRAC INT == x + 1 \bound{sc}}
+}
+\xtc{
+This is a list of \pspadtype{Mapping} objects.
+}{
+\spadpaste{incfns := [sc**i for i in 0..10] \free{sc}\bound{incfns}}
+}
+\xtc{
+This is a list of applications of those functions.
+}{
+\spadpaste{[f 4 for f in incfns] \free{incfns}}
+}
+\xtc{
+Use the \spadfunFrom{recur}{MappingPackage1}
+operation for recursion:
+\spad{g := recur f} means \spad{g(n,x) == f(n,f(n-1,...f(1,x))).}
+}{
+\spadpaste{times(n:NNI, i:INT):INT == n*i \bound{rdec}}
+}
+\xtc{
+}{
+\spadpaste{r := recur(times) \free{rdec}\bound{r}}
+}
+\xtc{
+This is a factorial function.
+%-% \HDindex{factorial}{MappingPackageOneXmpPage}{9.51}{MappingPackage1}
+}{
+\spadpaste{fact := curryRight(r, 1) \free{r}\bound{fact}}
+}
+\xtc{
+}{
+\spadpaste{fact 4 \free{fact}}
+}
+\xtc{
+Constructed functions can be used within other functions.
+}{
+\begin{spadsrc}[\free{square}\bound{mto2ton}]
+mto2ton(m, n) ==
+ raiser := square**n
+ raiser m
+\end{spadsrc}
+}
+\xtc{
+This is \texht{$3^{2^3}.$}{\spad{3**(2**3).}}
+}{
+\spadpaste{mto2ton(3, 3) \free{mto2ton}}
+}
+\xtc{
+Here \userfun{shiftfib} is a unary function that modifies its argument.
+}{
+\begin{spadsrc}[\bound{shiftfib}]
+shiftfib(r: List INT) : INT ==
+ t := r.1
+ r.1 := r.2
+ r.2 := r.2 + t
+ t
+\end{spadsrc}
+}
+\xtc{
+By currying over the argument we get a function with private state.
+}{
+\spadpaste{fibinit: List INT := [0, 1] \bound{fibinitdec}}
+}
+\xtc{
+}{
+\spadpaste{fibs := curry(shiftfib, fibinit) \free{shiftfib fibinit}\bound{fibs}}
+}
+\xtc{
+}{
+\spadpaste{[fibs() for i in 0..30] \free{fibs}}
+}
+\endscroll
+\autobuttons
+\end{page}
+%