aboutsummaryrefslogtreecommitdiff
path: root/doc/cluser.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/cluser.tex')
-rw-r--r--doc/cluser.tex5354
1 files changed, 5354 insertions, 0 deletions
diff --git a/doc/cluser.tex b/doc/cluser.tex
new file mode 100644
index 00000000..cfb028f8
--- /dev/null
+++ b/doc/cluser.tex
@@ -0,0 +1,5354 @@
+%\pagelayout{normal,twoside}
+%\textheight 8in \textwidth 6in\topmargin 0.0in
+%\documentstyle{article,11pt}
+
+\documentstyle[11pt,twoside]{article}
+
+\setlength{\textheight}{8in}
+\setlength{\textwidth}{6in}
+\setlength{\topmargin}{0in}
+\oddsidemargin 0pt
+\evensidemargin 0pt
+\hyphenation{pre-sents}
+\parskip 4pt
+
+\begin{document}
+
+\font \smcaps=amcsc10
+\font \bldcn=ambc12
+\font \eighttt=amtt8
+
+\newcommand{\filename}[1]{{\tenrm#1}}
+\newcommand{\key}[1]{\fbox{\eighttt#1}}
+\newcommand{\emphasize}[1]{{\sl#1\/}}
+\newcommand{\irafname}[1]{{\bf#1}}
+\newcommand{\taskname}[1]{{\sl#1\/}}
+\newcommand{\reference}[1]{{\it#1\/}}
+\newcommand{\comptype}[1]{{\tt#1}}
+\newcommand{\usertype}[1]{{\bldcn#1}}
+\newcommand{\upa}{{\tt \char94}}
+\newcommand{\lbox}{{\tt \char91}}
+\newcommand{\rbox}{{\tt \char93}}
+\newcommand{\bsl}{{\tt \char92}}
+\newcommand{\pipe}{{\tt |\ }}
+\newcommand{\pluseq}{$+\!=$}
+\newcommand{\minuseq}{$-\!=$}
+\newcommand{\timeseq}{$*\!=$}
+\newcommand{\diveq}{$/\!=$}
+\newcommand{\concateq}{$//\!=$}
+\newcommand{\ppind}{\hspace*{17pt}}
+
+\begin{titlepage} \vspace*{1.0in}
+
+\begin{center} \huge
+DRAFT\\ \vspace*{0.5in} \large \bf
+
+A User's Introduction to the IRAF Command Language \\ \medskip
+Version 2.3 \\
+
+\bigskip
+
+\smcaps Peter MB Shames\\
+\tenrm Space Telescope Science Institute\\
+\medskip
+\smcaps Doug Tody\\
+\tenrm National Optical Astronomy Observatories\\
+\vskip 1cm
+
+Revised -- \today\\ \vskip 1cm
+
+\bldcn ABSTRACT\\ \medskip
+\end{center} \large
+
+\begin{quotation} \noindent
+This tutorial introduction to the IRAF Command Language
+presents an overview of the use and features of the language.
+The discussion is aimed toward the first-time
+user and describes the execution of tasks from the Command
+Language. The focus is the Command Language itself;
+the many packages and tasks that compose the IRAF system and the
+SDAS packages from STScI are described elsewhere. The emphasis is
+on using the Command Language to run existing programs, although
+sections are included that describe the addition of new tasks
+of one's own making. A quick guide to language features and facilities
+and to the suite of reduction and analysis packages currently available
+is provided in the Appendices.
+\end{quotation}
+\end{titlepage}
+
+\pagestyle{empty}
+\newpage
+\thispagestyle{empty}
+
+\begin{center} \vspace*{1in}
+\large About the Authors
+\end{center}
+\vskip 1cm
+\rm
+
+\noindent
+Peter Shames is Chief of the Systems Branch at STScI, and along with Jim Rose
+and Ethan Schreier, was one of the key persons responsible for the selection
+of IRAF as the command language and operating environment for the STScI
+Science Data Analysis System (SDAS) in December of 1983. Since that time,
+Peter has supervised the VMS/IRAF development effort at STScI, overseeing the
+implementation of the VMS/IRAF kernel, the initial port of IRAF to VMS,
+and the development of version 2.0 of the IRAF command language.
+Peter wrote the original CL User's Guide (version 2.0).
+
+\vskip 0.5cm
+\noindent
+Doug Tody is the originator and designer of the IRAF system (including the CL)
+and has been Chief Programmer of the IRAF project since the inception of the
+project at KPNO (now NOAO) in the fall of 1981. As Chief Programmer, Doug has
+written virtually all of the IRAF system software with the exception of the
+VMS/IRAF kernel and the original CL 1.0 (which was written by Elwood Downey).
+Since 1983 Doug has been head of the IRAF group at NOAO, overseeing the
+development of the NOAO science applications software while continuing work
+on the IRAF systems software, and coordinating the effort with STScI.
+
+\newpage
+\thispagestyle{empty}
+
+\begin{center} \vspace*{1in}
+\large Acknowledgements
+\end{center}
+\vskip 1cm
+\rm
+
+\noindent
+The authors wish to acknowledge the efforts of the many people who have
+contributed so much time, energy, thought and support to the development
+of the IRAF system. Foremost among these are the members of the IRAF
+development group at NOAO (Lindsey Davis, Suzanne Hammond, George Jacoby,
+Dyer Lytle, Steve Rooke, Frank Valdes, and Elwood Downey, with help from
+Ed Anderson, Jeannette Barnes, and Richard Wolff) and members of the VMS/IRAF
+group at STScI (Tom McGlynn, Jim Rose, Fred Romelfanger, Cliff Stoll,
+and Jay Travisano). The sharp editorial eye and sharper pencil of
+Chris Biemesderfer have made major contributions to the clarity and style
+of this document.
+
+\vskip 0.3cm
+\noindent
+The continuing patience and understanding of members of the scientific
+staff at both institutions has been essential to the progress that has
+so far been achieved. A major software project such as IRAF cannot
+be attempted without the cooperation of many individuals, since the
+resources required must inevitably place a drain on other activities.
+In particular, the support and encouragement of Harvey Butcher,
+Garth Illingworth, Buddy Powell, Steve Ridgway and Ethan Schreier has
+been invaluable. Mention should also be made of Don Wells, who started
+in motion in the latter part of the last decade the process which eventually
+led to the creation of the IRAF system.
+
+\begin{flushright}
+Peter Shames \\
+Doug Tody
+\end{flushright}
+
+\clearpage
+\pagestyle{myheadings}
+\markboth{CL User's Guide (DRAFT)\hspace*{2.1in}}
+ {\hspace*{2.1in}CL User's Guide (DRAFT)}
+\pagenumbering{roman}
+
+\tableofcontents
+
+\thispagestyle{empty}
+\newpage
+
+\pagestyle{myheadings}
+\markboth{CL User's Guide (DRAFT)\hspace*{2.1in}}
+ {\hspace*{2.1in}CL User's Guide (DRAFT)}
+\pagenumbering{arabic}
+
+\begin{center} \vspace*{0.5in} \large \bf
+
+A User's Introduction to the IRAF Command Language \\ \medskip
+Version 2.3 \\
+
+\bigskip
+
+\smcaps Peter MB Shames\\
+\tenrm Space Telescope Science Institute\\
+\medskip
+\smcaps Douglas Tody\\
+\tenrm National Optical Astronomy Observatories\\
+\vskip 1cm
+
+\end{center} \rm
+
+\section*{How to use this book}
+
+\ppind
+This document is an introduction to the IRAF
+Command Language (CL), and is designed to be a tutorial
+for the first-time user. The examples presented in the text can
+(and should) be tried at a terminal. Although this text is
+large enough to be a bit daunting at first, it can be tackled
+in easy stages, and need not all be read before trying the system.
+A basic knowledge of computer systems is assumed.
+
+The first three chapters form an introductory section
+which covers the most basic elements of IRAF. Reading through these,
+preferably while seated near a terminal where the examples may be tried
+out, is the recommended entry into the IRAF world. The fourth and fifth
+chapters deal with the interface between IRAF and the host system,
+and with some of the more advanced uses of IRAF for normal data
+analysis activities. These chapters will be of use once you are familiar
+with the basic environment and the examples here are also designed
+to be tried out on a live system. The rest of this document is for the
+more adventurous user, who is not happy until he can say \usertype{doit}
+and get \irafname{it} done to a turn. Try some of these last examples
+when you are ready to customize IRAF for your own particular uses.
+
+In spite of its size, this document
+is not intended to be a complete guide to using and programming
+the IRAF system, but is an introduction to many of the functions
+of the CL and a quick guide to other sources of more detailed information.
+The CL is described as the user's interactive interface to the system,
+and simple commands that use the terminal for starting and controlling tasks
+and for customizing the environment are presented.
+Development of simple functions in the CL are covered briefly here, but
+coverage of all the details of programming in the CL or in the
+IRAF environment is beyond the scope of this document.
+A reasonable amount of documentation is accessible at the terminal via
+the online help facilities, which are described here as well.
+
+More extensive details of the CL may be found in the manual pages for the
+\taskname{language} package, in the \reference{CL Programmer's Manual} and
+in \reference{The IRAF User's Guide}.
+Details of programming in the IRAF system itself are described
+in the \reference{Programmer's Crib Sheet for the IRAF Program Interface},
+in the \reference{Reference Manual for the IRAF Subset Preprocessor Language}
+and in other documents referred to in the last section of this text,
+however, these documents are somewhat dated and most of the documentation
+planned for the IRAF programming environment remains to be written.
+Documentation in the form of manual pages for the suites of applications
+packages being developed at both NOAO and STScI are available both online
+and in printed form.
+
+\section{Introduction}
+
+\subsection{An Overview of IRAF}
+
+\ppind
+The Image Reduction and Analysis Facility (IRAF) has been designed to
+provide a convenient, efficient and yet portable system
+for the analysis of images and other classes of data. While the
+system has been designed for image data, and for astronomical image data
+in particular, it has general facilities that can be applied to many
+other classes of data. Some of the functions that are
+provided are quite specialized, dealing as they do with the
+characteristics of specific instruments, but others are generalized
+functions for plotting data, computing statistics, processing lists, and
+performing other functions that are common to
+data processing tasks in many other fields.
+
+The runtime IRAF system consists of four basic pieces:
+
+\begin{itemize}
+\item Command Language - which provides the user interface to the system.
+
+\item Applications Packages - that are the real data analysis algorithms.
+
+\item Virtual Operating System (VOS) - which is the heart of the portable
+system and provides the foundation for all the higher level functions.
+
+\item Host System Interface (HSI) - the interface between the portable IRAF
+system and a particular host system. At the heart of the HSI is the IRAF
+\irafname{kernel}, a library of host dependent primitive subroutines that
+connects the system independent VOS routines to the host operating system.
+Each host system requires a different kernel, hence we speak of the UNIX/IRAF
+kernel, VMS/IRAF kernel, and so on.
+\end{itemize}
+
+\noindent
+All of these interconnected, yet separable, subsystems
+act together to form the IRAF data analysis environment. In
+most cases the user need not be further concerned with this structure,
+except to understand that the specific part of this structure that
+this tutorial addresses is the Command Language or CL.
+
+IRAF is designed as an open system that can be extended to add
+new analysis capabilities, and that can support user customization
+of the existing facilities. There are several levels of customization
+available, that range from tailoring task parameters to special needs;
+through "re-packaging" existing functions into application specific tasks;
+and extending to installation of new compiled code tasks in the
+environment. There are a variety of facilities provided in IRAF
+to assist the user in the creation and installation of such new tasks.
+It is not \emphasize{essential}
+that all of these functions be performed in the IRAF way, but full
+integration of a user task within the IRAF environment can best be
+accomplished by using the facilities that are provided. However,
+even without the use of the IRAF interfaces, other tasks may be
+incorporated into the user's operating environment and
+used as if they were part of the distributed system.
+
+The applications packages and the VOS routines are designed to be
+rather stable, and have been coded in the IRAF SPP language for
+portability. The kernel layer supports portability across
+operating system architectures, and its interface is stable, but
+the inner details change as a function of the requirements and
+capabilities of the host operating system. The CL is also
+rather stable, since it forms the user's interface to the system,
+but it is also an area where change is anticipated, as the system evolves
+to meet the needs of the users. Because the CL is itself a program
+that is supported by the VOS and isolated from the rest of the system
+by the VOS, it can be evolved as required without perturbing the other
+parts of the system.
+
+\subsection{Function of the Command Language}
+
+\ppind
+The basic function of the Command Language is to
+provide a clean, consistent interface between the user and the various
+packages of functions that complete the IRAF environment.
+The CL provides an interface between the user and all applications
+programs, giving the user complete control over the parameters, data, and
+system resources (graphics devices, etc.) used by IRAF programs.
+Many features have been incorporated into the CL to provide
+on-line support for users, whether they are old hands or new to the system.
+
+The packages of programs that are provided offer
+many of the standard functions for data analysis, and they can
+be invoked interactively, one at a time, to perform many common
+operations. The execution of these functions is controlled
+by various parameters, and users may define their
+own values for the parameters as required. IRAF preserves the
+last value used, and presents it as the default value upon next
+use. Furthermore, there are facilities at several levels to allow
+users to assemble existing functions into new tasks that perform
+the specific operations on their data sets. This
+customization can involve new assemblages of existing functions
+or the inclusion of new functions written in the interactive CL
+language or in compiled languages.
+
+The CL will primarily be used as a \emphasize{command} language,
+but it is also an interpreted \emphasize{programming} language.
+To be a good \emphasize{command} language, the CL must make
+it as easy as possible to enter commands that perform common functions.
+To this end the CL provides command menus, minimum-match name abbreviations,
+parameter prompting and parameter defaults, tutoring on command parameters
+and options, and a concise syntax for simple commands.
+There is also a history mechanism that supports recall of previous commands
+and easy error correction within them.
+
+A good interactive \emphasize{programming} language must
+be reasonably efficient, be able to evaluate complicated expressions,
+to compile and run general procedures, and to offer the user an interpreted
+environment for investigating his data and exploring the applicable
+range of analysis techniques. This version of the CL (Version 2.3) includes
+all of the command language features of the earlier versions and makes
+major strides in the direction of becoming a powerful interactive
+programming language as well, although much remains to be done before the
+CL provides a reasonably complete and efficient interpreted programming
+environment.
+
+This may sound complicated at this point, but examples
+presented throughout the body of the text will help
+clarify the use of the various features. We suggest a first reading of
+this introductory section and the next chapter, and then a session at
+the terminal, trying out the examples as presented.
+
+\subsection{Capabilities of the CL}
+
+\ppind
+Besides fulfilling the basic functions of a command language,
+the CL is capable of performing as a programmable desk
+calculator, evaluating expressions, executing CL script tasks
+or external programs, and doing some rather sophisticated
+programming functions. These features provide
+a means of connecting tasks to build new high level operators.
+The user's interaction with newly created tasks appears the same as
+interactions with the standard tasks and utility packages,
+as will become apparent in the discussions on usage and script tasks.
+
+The CL has many features familiar to UNIX users in that
+I/O redirection, pipes and filters are provided.
+The output of any task may be routed to a file (redirection)
+or to another task (pipes), and many functions are provided to
+perform standard transformations on a variety of data types (filters).
+Be aware, however, that there are many differences between the CL
+and the UNIX command interpreters.
+The CL and the IRAF system present the user with a
+complete data analysis environment which is independent of the underlying
+operating system. Users running IRAF under UNIX, VMS, AOS, or some
+other operating system have the same analysis environment available
+to them and can type exactly the same commands while in the CL.
+
+The CL supports an open environment in which packages of application
+specific tasks may be created and run. Some of these packages
+have been prepared by the developers to provide a variety of utility
+services, others that deal with specific instruments and analytic
+techniques are being made available,
+and still others can be created by you, to support your
+own view of the data analysis process. Beyond this, mechanisms exist
+that allow compiled external programs to be inserted in the system in
+such a way that they appear (and act) as an intrinsic part of IRAF.
+It is this open-ended nature that makes IRAF so powerful in its
+support of a variety of analysis activities.
+
+\newpage
+\section{Getting Started}
+\subsection{Setting up the IRAF environment}
+
+\ppind
+A visitor wishing to use IRAF does not need to take any special
+action to do so.
+Computer support personnel will provide an account on one of the analysis
+computers and configure the environment as necessary to run IRAF.
+Staff members and long term visitors will already have established
+themselves with an account and will only need to perform a few simple
+operations before the CL and IRAF can be used. \footnote{ {\bf VMS :} The
+command {\eighttt IRAF} must be entered to define system symbolic names.
+This command can be entered at the terminal or stored in your VMS LOGIN.COM
+file; it must be present in the LOGIN.COM file for queued IRAF background
+jobs to startup correctly.}
+After this has been done, all of the other
+commands referenced within this document will be available.
+
+An interactive IRAF session begins with entry of the command
+\usertype{cl} to run the CL.
+When the CL starts up, it looks for a file called \filename{LOGIN.CL} in the
+user's current directory. If this directory does not contain a
+\filename{LOGIN.CL} file, the CL will function for simple things
+such as the evaluation of numerical expressions, but will not work
+properly for all functions. Therefore, you should always run the CL
+from a properly configured IRAF login directory.
+This directory needs to be initialized for IRAF before the
+CL is invoked; you can use the \usertype{mkiraf} command to setup the
+IRAF environment. The login directory, once set up, can be used for any number
+of sessions, and if you wish, you can set up several independent login
+directories and data directories for working with different types of data.
+
+\noindent
+Summarizing the steps required to set up the IRAF environment:
+
+\begin{enumerate}
+\item Decide on a login directory.
+\item Go there.
+\item Type \usertype{mkiraf}.
+\end{enumerate}
+
+\noindent
+That is all that is required. The \usertype{mkiraf} command performs
+several actions, the most important of which are making a
+\filename{LOGIN.CL} file which you may wish to edit to change defaults,
+and the creation of a \filename{UPARM} subdirectory, which is used
+by IRAF to store your customized parameter sets.
+The default login file consists mostly of environment declarations
+(\usertype{set} statements) that define directories, devices, and so on.
+The function of the environment and the significance of the
+standard \irafname{environment variables} are discussed in \S 4.2.
+
+The \usertype{mkiraf} command can be entered at any time to reinitialize
+the environment, i.e., create a new \filename{LOGIN.CL} from the system
+default and clear the \filename{UPARM} directory. This is recommended
+periodically to pick up any recent changes in the system, and may be
+required when a major new release of the system is installed.
+
+\subsection{Starting the CL}
+
+\ppind
+After configuring your IRAF directory, type the command \usertype{cl}
+to start the command language. After a bit the welcome message
+will appear on your terminal, and the first or root ``menu'' of IRAF will
+be displayed. This menu gives the names of the packages available through
+the CL. The \comptype{cl>} prompt will be issued indicating that the
+CL is ready to accept commands.
+
+\begin{quotation}
+\begin{center}
+\comptype{Welcome to the IRAF.}\\
+\smallskip
+\end{center}
+\begin{verbatim}
+ dataio images lists noao sdas system
+ dbms language local plot softools utilities
+\end{verbatim}
+\comptype{cl>}
+\end{quotation}
+
+Everything shown in the root menu of IRAF is a \irafname{package} name.
+A package is a set of \irafname{tasks} that are logically connected.
+For example, the \taskname{plot} package contains an assortment of
+general plotting tasks. You must \emphasize{load} a package before any of the
+tasks therein can be run; you can load any package by simply typing its name.
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{plot}
+\end{quotation}
+
+\noindent
+would load the plot package and make the tasks in the package known to the CL.
+To unload the current package type \taskname{bye}; this frees any system
+resources used by the loaded package and restores the CL to state it was in
+before the package was loaded.
+Note that the system comes up with the \taskname{clpackage, system, language}
+and the default \taskname{user} packages already loaded (the \taskname{user}
+package allows the user to personalize the system, and is discussed in \S 5.6).
+
+A comment should be made at this point about case sensitivity in IRAF.
+The CL accepts input in both upper
+and lower case, and distinguishes between them, i.e. a \usertype{'Y'} is
+different from a \usertype{'y'}. All command names are purposely
+specified in lower case, which is the default, and all user responses
+are expected to be in lower case as well. Upper case or mixed case
+names and commands are possible, but should be used with care.
+
+Once the \comptype{cl>} prompt appears, many tasks will be available and
+ready for execution. A list of all loaded packages and the tasks in each
+package may be obtained by typing two question marks (\usertype{??}).
+This will list the tasks organized by package, starting with the current
+package. The packages are listed in the
+order in which they are searched when you type a command. Type one question
+mark (\usertype{?}) to list only the task names in the current package,
+or \usertype{?{\it packagename}} to list the tasks in
+package ``packagename''.
+
+\subsection{Executing commands from the CL}
+
+\ppind
+At this point you may want to try executing a few simple commands.
+First try the \usertype{help} command. This will give additional
+information about the tasks in the current package.
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{help}
+\end{quotation}
+
+For detailed information about a particular package or task, type
+\usertype{help} followed by the name of the package or task for which help
+documentation is desired. For example,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{help system}
+\end{quotation}
+
+\noindent
+will print detailed information about the \taskname{system} package, and
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{help page}
+\end{quotation}
+
+\noindent
+will print detailed information about the \taskname{page} task which is
+in the \taskname{system} package (after each page of text, the \taskname{help}
+program will prompt with a list of keystrokes and pause until you type one
+of them).
+
+Now let's try running some tasks from the \taskname{system} package, which
+is already loaded. To display the file \filename{LOGIN.CL} on the terminal,
+enter the following command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{page login.cl}
+\end{quotation}
+
+The \taskname{page} routine, like \taskname{help}, will pause at the end of
+each page of text, waiting for you to type a command keystroke, e.g.,
+to display the next page of text, quit, return to the start of the file,
+go on to the next file if paging a set of files, and so on (typing \key{?}
+in response to the \taskname{page} prompt will cause a summary of the
+acceptable keystrokes to be printed). To get a directory listing of the
+files in the current directory, type:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{dir}
+\end{quotation}
+
+\noindent
+Observe that all package, task, and parameter names may be abbreviated
+while working interactively. Any abbreviation may be given which contains
+sufficient characters to identify the name unambiguously; if the
+abbreviation is not unique, an error message is displayed. In general
+the first two or three characters are enough to identify most commands,
+but changes to the operating environment, i.e. loading additional packages,
+may require entering more characters or specifying the
+\emphasize{packagename}
+as a prefix to unambiguously identify the required command.
+
+To list all your files with the \filename{.CL} extension, you can type:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{dir $*$.cl}
+\end{quotation}
+
+As you gain familiarity with the CL you may find that you
+cannot remember the IRAF command to do something, but do know the
+correct command to use in the native operating system. There is an
+\emphasize{escape} mechanism built into IRAF, in that any operating system
+specific command may be used by prefixing it with a~\usertype{`!'}.
+There are some cautions to be observed that are described in detail
+(\S 4.1), but this knowledge may remove one possible source of frustration.
+Of course, the CL commands \usertype{`?'} or \usertype{`??'} may also be used
+to produce a display of the available package names and functions.
+
+Packages are loaded the same way tasks are run, viz. merely by typing the name
+of the package as a command (a package is in fact a special kind of task).
+If the desired package is a subpackage of a package, the main package must
+be loaded first. For example, suppose we want to run the \taskname{precess}
+task. To find out what package \taskname{precess} is in we run \taskname{help}
+on the task \taskname{precess} and observe that the package path (printed at
+the top of the help screen) is "noao.astutil". This means that the
+\taskname{precess} task is in the \taskname{astutil} package which is in the
+\taskname{noao} package, which we recognize as a root level package.
+
+We load first the \taskname{noao} package and then the \taskname{astutil}
+package by typing:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{noao} \\
+\comptype{no>} \usertype{astutil} \\
+\comptype{as>}
+\end{quotation}
+
+\noindent
+The set of new tasknames now available to you will be displayed automatically.
+Note that the prompt will change from \comptype{cl>} to \comptype{no>}
+to \comptype{as>} to let you know you have entered another package.
+
+One of the astronomical utility programs available is the \taskname{precess}
+program, which is used to precess lists of astronomical coordinates.
+The simplest way to run \taskname{precess} is to type only its name:
+
+\begin{quotation}\noindent
+\comptype{as>} \usertype{precess}
+\end{quotation}
+
+\noindent
+The CL will then prompt you for the parameters it requires to run the program;
+in this case, the CL needs the name of an input file containing a list
+of coordinates to be precessed and the years over which the
+precession is to be computed. If you do not have the coordinates in a
+file, give the filename as \filename{STDIN} (it must be upper case), and
+you can then enter the coordinates interactively from the terminal.
+Any number of coordinates (input lines from the special file \filename{STDIN})
+may be entered; signal the ``end of file'' for \filename{STDIN} by typing
+the EOF key, e.g., \key{CTRL/Z}.
+\footnote {\key{CTRL/Z} is the standard EOF (end of file)
+sequence on VMS and most UNIX systems. Similarly, \key{CTRL/C} is the
+standard interrupt key on these systems. For simplicity we use the explicit
+control codes to refer to these functions in most of the IRAF documentation,
+but the reader should be aware that different control sequences may be used
+on the local system and be prepared to make the translations. For example,
+the key \key{CTRL/D} is often used to signal EOF instead of \key{CTRL/Z}.}
+Coordinates are entered in pairs (RA and DEC, delimited by spaces) in either
+decimal or sexagesimal notation (e.g., 12.5 or 12:30:04.2). If you have any
+problems type \usertype{help precess} for additional information, including
+examples.
+
+If you have a long list of coordinates to precess, try entering
+them into a file. The command:
+
+\begin{quotation}\noindent
+\comptype{as>} \usertype{edit coord1950.txt}
+\end{quotation}
+
+\noindent
+will call up the default editor (Vi on UNIX systems; EDT or EMACS on VMS
+systems) to edit the file \filename{COORD1950.TXT}.
+After creating your coordinate file and exiting the editor in the usual
+fashion, you will be back in the CL. Now try executing the \taskname{precess}
+program, using the file \filename{COORD1950.TXT} as input:
+
+\begin{quotation}\noindent
+\comptype{as>} \usertype{precess coord1950.txt}
+\end{quotation}
+
+\noindent
+Of course, the output will still appear on the terminal, and
+you may wish to \irafname{redirect} the output into a file as well:
+
+\begin{quotation}\noindent
+\comptype{as>} \usertype{precess coord1950.txt $>$ coord1984.txt}
+\end{quotation}
+
+If the coordinate list is \emphasize{very} long, you may wish to process
+the list as a background job. To avoid interruptions from parameter
+prompts by the background task (it will inquire at the terminal), be sure to
+enter all the necessary parameters on the command line.
+To execute the task \taskname{precess} in the background, type:
+
+\begin{quotation}\noindent
+\comptype{as>} \usertype{precess coord1950.txt 1950 1984 $>$ coord1984.txt \& }
+\end{quotation}
+
+\noindent
+The final `\usertype{\&}' tells the CL to run the task in the background.
+The two parameters 1950 and 1984 will be passed to the task; you will
+not be prompted for them.
+Once the background task is started, the CL will be available for
+further interactive use and you will be
+informed when the background job is complete. The use of background
+tasks for batch processing is treated in more detail in \S 5.4.
+
+\subsection{A Comment on Input and Output}
+
+\ppind
+The notion of output \irafname{redirection} has already been introduced, and the
+topics of input redirection (accepting input from a file rather than
+the terminal) and \irafname{pipes} (connecting the output from one task to the
+input of the next) will be dealt with in \S 3.3. The point to be
+made at this time is that \emphasize{all} tasks can be thought of as having
+three main I/O paths associated with them:
+
+\begin{quotation}\noindent
+\begin{tabular}{l l}
+\filename{STDIN} & the input path \\
+\filename{STDOUT} & the output path \\
+\filename{STDERR} & where error messages appear
+\end{tabular}
+\end{quotation}
+
+%\begin{quotation}\noindent
+%\begin{description}
+%\item[\filename{STDIN}] the input path
+%\item[\filename{STDOUT}] the output path
+%\item[\filename{STDERR}] where error messages appear
+%\end{description}
+%\end{quotation}
+
+\noindent
+By default, all of these I/O paths are connected to your terminal
+(referred to as \filename{TTY}) and you may redirect any one or all
+of them using simple command line requests. The output
+\emphasize{redirection} introduced in the previous example of
+\taskname{precess} is an example of just such an action. Other
+examples in \S 3.3 will cover this topic in more detail.
+
+There are other standard output streams as well that depend on the
+specifics of the task. Not surprisingly, graphics tasks
+want to talk to a graphics terminal or other suitable device
+(\filename{STDGRAPH}) and image tasks need access to an image display
+(\filename{STDIMAGE}). There is a stream for the graphics plotter device as well
+(\filename{STDPLOT}). Each of these \emphasize{logical} devices is assigned
+to a physical device, either by commands in your \filename{LOGIN.CL} file
+or by explicit parameters in the function calls.
+
+\subsection{The Graceful Exit}
+
+\ppind
+Now that you are a couple of layers deep into the CL, you may wonder
+how to get back out again. If you type \usertype{bye}, you will exit the current
+package and return one level of loaded packages. You cannot, however, type
+\usertype{bye} at the root CL level (\comptype{cl>} prompt).
+The command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{logout}
+\end{quotation}
+
+\noindent
+may be used to exit directly from the CL at any level.
+The \usertype{bye} command or the \key{CTRL/Z} sequence that signals
+EOF will exit from any task except the CL itself. This is to
+prevent an unintended \emphasize{logout} from occuring if a series
+of EOF's are entered from the terminal.
+
+For a less gentle departure from function execution, the interrupt
+sequence \key{CTRL/C} may be used at any level.
+This will usually terminate any task that appears to
+be hung or is operating in error, but will normally put you
+back in the CL in interactive mode.
+
+\newpage
+\section{Basic Usage}
+
+\ppind
+The CL can be used as both a command language and a programming language,
+but most first-time users (and many experienced ones) will mostly
+use the command features of the language. Commands to the CL may be
+entered at the terminal, one at a time, or they may be read in from
+a script file; in either case the syntax is the same and abbreviation
+of command names and variable names is supported. When the CL is
+being used for programming the rules are more restrictive, and
+full name specification is required, as is a more formal specification
+of task parameters. During the early sections of this document
+only the command forms will be used for simplicity.
+Parameters to a task may be specified on the command line for brevity,
+and prompting is automatically enabled for any required parameters that
+are not specified or that are given values that are out of range.
+
+\subsection{Command Syntax}
+
+\ppind
+The form of a command that calls an IRAF task is the
+\emphasize{task name}, optionally followed by an
+\emphasize{argument list}. The argument
+list consists of a list of \emphasize{expressions} delimited by spaces.
+Simple filenames or string arguments that appear in the unparenthesized
+argument list need not be quoted, but any string that contains an
+embedded blank or other special characters should be quoted.
+\emphasize{Positional} arguments (typically the first few
+arguments \emphasize{required} for a function must be given first and
+in order.
+All of these may be followed by \emphasize{param = value} keyword assignments,
+\emphasize{param$\pm$} switches, and \emphasize{file} I/O redirection
+assignments. These last three types of arguments may appear in any order.
+In general, the form is as follows :
+
+\begin{quotation}\noindent
+\begin{tabular}{lll}
+\comptype{cl>} {\it taskname} [{\it expression} $\ldots$ ] &
+ [{\it param=value}] & [$<${\it filename}] \\
+ & [{\it param}$\pm$] & [$>${\it filename}] \\
+ & & [$>>${\it filename}] \\
+ & & [$>\&${\it filename}]
+\end{tabular}
+\end{quotation}
+
+\noindent
+Any or all of these types of parameters may be present
+and defaults are provided for most parameters.
+In particular, the only parameters that
+\emphasize{must} be set are the \irafname{required parameters}
+and if these are not specified on the command line, the CL will prompt
+for them. Other parameters and switch values are defaulted, but may be
+overridden if desired.
+The I/O streams typically default to the login terminal, but the
+redirection operators may be used to request: input from a file
+(\usertype{$<$}); output to a file(\usertype{$>$}); appending to
+a file (\usertype{$>>$}); or redirecting the standard output and the
+standard error stream to a file (\usertype{$>$\&}).
+
+The form of a command line need not be limited to a solitary call to a task.
+Several tasks may be called in sequence on a single command
+line, using the semicolon character `;' to delimit each call:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{clear; dir}
+\end{quotation}
+
+\newpage
+\noindent
+If the command sequence is too long to fit on a single line, it can be
+enclosed in braces:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{\{ } \\
+\comptype{>>>} \usertype{clear} \\
+\comptype{>>>} \usertype{directory} \\
+\comptype{>>>} \usertype{beep} \\
+\comptype{>>>} \usertype{\} }
+\end{quotation}
+
+\noindent
+Note that the prompt changes to \comptype{>>>} after the first
+line to signal that the CL requires more input before it will execute the
+task. (In this particular example, the CL is waiting for a `\}'.)
+
+Such a construct is called a \irafname{compound statement} and may be
+used to aggregate several simple commands into a single new command.
+Compound statements may be used directly from the terminal (or within
+scripts as we shall see later) and will be treated as a single
+entity by the display and editing commands.
+An arbitrary number of commands may be entered in a compound statement
+and then executed as a single unit.
+
+Commands may be strung together in another way too, by use of the
+pipe notation, which requests that the output of one command
+be used as the input to the next. Creation of the temporary files that
+support this, and connection of the task logical I/O paths to these
+files is handled automatically by IRAF.
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{type coord1950.txt \pipe precess 1950 1984}
+\end{quotation}
+
+\noindent
+The pipe symbol `{\tt |}' directs the CL to feed the output of
+one task (\usertype{type}) to the input of the next (\usertype{precess}).
+
+\noindent
+If an argument list is too long to fit on one line,
+continuation is understood if the last item on a line is a backslash
+`$\backslash$', the pipe symbol, or an operator (e.g., `$+$' or `{\tt //}').
+
+\begin{quotation}\noindent
+\comptype{pl>} \usertype{graph "pix[*,5],pix[*,10],pix[*,15]" po$+$
+ marker=circle \bsl } \\
+\comptype{>>>} \usertype{xlabel=column ylabel=intensity \bsl } \\
+\comptype{>>>} \usertype{title = "lines 5, 10, and 15"}
+\end{quotation}
+
+Quotes \emphasize{may} be used around
+any string of characters, but are generally not required on commands
+entered at the terminal. In the previous example quotes are used
+around the string value of the \usertype{title} parameter because the
+string contains embedded spaces.
+
+To make precise the rules for quoted strings:
+a string need not be
+quoted provided [1] it appears as an identifier (a name) in an argument
+list \emphasize{not} enclosed in parentheses, AND [2] the string does not
+contain any blanks or other characters which are special to the CL,
+e.g., the i/o redirection symbols, the pipe symbol, semicolon, the begin
+comment character (\usertype{\#}) or curly braces.
+If the string contains any special characters it must be quoted.
+
+Comments may be freely embedded in a command sequence.
+Everything following the comment character on a line is ignored by the parser,
+so entire comment lines may be entered by starting the line with a comment:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{\# This is a full line comment} \\
+\comptype{cl>} \usertype{type login.cl \hfill \#~Display~the~login~file }
+\end{quotation}
+
+\noindent
+or by appending a comment to the end of a line as in the last example.
+
+\subsection{Task Parameters}
+
+\ppind
+Nearly all tasks have a formally defined set of parameters associated
+with them. The parameters for a task may be listed with the command
+\usertype{lparam }{\it taskname}. For example, to list the parameters for
+the task \taskname{delete}, type:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{lparam delete}
+\end{quotation}
+
+\noindent
+The \usertype{lparam} command produces a display of the parameters of the
+named task in the order in
+which they must be given on the command line; it shows the current values
+of the parameters and the prompt strings as well.
+
+After one types \usertype{lparam delete}, the following list will appear,
+giving the parameter name, its
+current value, and the prompt string associated with it:
+
+\begin{verbatim}
+ files = list of files to be deleted
+ go_ahead = yes delete or not ?
+ (verify = no) verify operation before deleting each file ?
+ (default_action = yes) default delete action for verify query
+ (allversions = yes) delete all versions of a file ?
+ (subfiles = yes) delete any subfiles of a file ?
+ (mode = ql)
+\end{verbatim}
+
+Notice that there are two types of parameters, those with
+parentheses around the \emphasize{param = value} fields and those without.
+The parameters not enclosed in parentheses are called
+\irafname{positional parameters}; they are required parameters
+and will be queried for if not given on the command line. Positional
+\emphasize{arguments} are the first arguments on the command line (following
+the command itself), and they are associated with parameters by their position
+on the command line. The first positional parameter will be set by the first
+positional argument on the command line, the second positional parameter by
+the second positional argument, and so on.
+
+The parameters enclosed in
+parentheses are called \irafname{hidden parameters}, and are the topic of
+the next section. Either type of parameter may be referred to by a
+\usertype{param = value} clause, although these parameter references
+must \emphasize{follow} the positional arguments. Such name references
+\emphasize{must} be used for the hidden parameters, but may be used for all.
+
+Some of the parameter handling actions in the CL are rather elaborate
+and require discussion. As was just noted, the CL will automatically
+prompt for any required parameters that have not been provided in some
+way by the user. Beyond this, the normal action of the CL is to
+remember the parameters that you last used, and when that parameter
+name is next encountered, to offer the last value used as the new
+default value. This \irafname{learning} of parameters is intended
+to reduce user effort and is a means of customizing use of the system.
+The learned parameters are saved for you in the \filename{UPARM}
+subdirectory, and will be preserved across uses of the system.
+
+\subsubsection{Hidden Parameters}
+
+\ppind
+The parameters of the \usertype{delete} task that appeared in
+parentheses are \taskname{hidden parameters} for the task.
+The CL does not query for hidden parameters, but automatically
+uses the default values. However, a query will be generated for
+even a hidden parameter if there is no
+default value or if the default value is illegal for some reason.
+Hidden parameters may be set on the command line, but unlike positional
+parameters, the value from the command line will not be learned, i.e., it will
+not become the new default value. The default value of a hidden parameter may
+be changed only by an explicit assignment, or by use of the \taskname{eparam}
+task (\S 3.2.3), and you should exercise caution in doing this,
+because it is easy to forget that hidden parameters have been changed.
+
+Hidden parameters are often used to change the behavior of a task,
+achieving considerable flexibility without requiring many arguments on the
+command line, and without annoying queries for parameters. Hidden parameters
+make it possible to support functions like \taskname{graph} that
+support different display options, since users can modify
+the default behavior of the task to make it behave in the manner they want.
+Hidden parameters can also be dangerous if they are used improperly
+(e.g., for data dependent parameters in scientific programs).
+
+The \taskname{delete} task is a good example of a task that is useful to
+personalize. The default behavior of \taskname{delete} is simply to delete
+the named file or files (provided they are not protected in some way).
+File deletion can be hazardous, of course, particularly since a pattern
+matching template may be used to delete many files. As many of us are unhappily
+aware, inadvertently typing
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete $*$}
+\end{quotation}
+
+\noindent
+will bring about the swift deletion of \emphasize{all} of the (unprotected)
+files in the current default directory.
+As IRAF recognizes a number of special pattern matching metacharacters in
+addition to `$*$', one could easily free up a lot of disk space if one were
+not familiar with the use of pattern matching templates.
+
+To reduce the possibility of such devastating side-effects, you might wish to
+change the default behavior of \taskname{delete} to verify each file deletion.
+This is done by changing the value of the hidden parameter \taskname{verify},
+which defaults to \emphasize{no}. Hidden parameters that are boolean flags
+(yes/no) may be overridden temporarily on the command line as follows:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete $*$.dat verify=yes}
+\end{quotation}
+
+\noindent
+or, equivalently,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete $*$.dat verify$+$}
+\end{quotation}
+
+\noindent
+Either of these commands would cause a prompt to be issued naming
+each file matching the template and asking if you want to delete
+it (this would happen even if the task were running in batch mode).
+
+If you set a hidden parameter on the command line, you override the value
+of that parameter only for that command; the default value is not changed.
+As indicated before, to change the default value of a hidden parameter,
+an explicit assignment is required:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete.verify = yes}
+\end{quotation}
+
+\noindent
+which will cause all subsequent file deletions to be verified, unless the
+\usertype{delete} command is issued with the argument \usertype{verify=no}
+or \usertype{verify$-$} on the command line. The change may be undone by
+another assignment, or by \emphasize{unlearning} the task parameters.
+
+\subsubsection{Learning and Unlearning parameters}
+
+\ppind
+The CL facility called \irafname{learn mode} is designed
+to simplify the use of the system.
+By default, the CL automatically ``learns'' the value of all task
+\irafname{parameters} that are prompted for or explicitly set. In practice,
+this means that once a required parameter (such as the precession epoch in
+the \taskname{precess} example)
+has been set, it need not be respecified. The CL will still prompt for
+required parameters, but the default value displayed will be the
+last value you entered. Simply hitting \key{RETURN} will cause the CL
+to reuse the old value; but a new value may be entered and it will
+be preserved as the new default. If the required parameters are
+specified on the command line, you will not be prompted for them, and the
+value you specify will still be learned.
+
+The parameter-learning mechanism has other ramifications as well.
+The most recently used parameter values are automatically preserved
+by the CL in \filename{.PAR} files stored in your \filename{UPARM} directory.
+These saved parameter
+sets are reloaded when you next start the CL, thus providing a
+\emphasize{memory} of the options that you used in a previous session.
+Any command line arguments
+that you specify will override these \emphasize{learned} defaults, but they
+will be available if you wish to use them.
+
+An explicit command may be used to
+\emphasize{reset} the values of parameters,
+i.e., to restore the defaults. The \usertype{unlearn} command restores the
+system default values of all of the parameters for a single task or for an
+entire package.
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{unlearn delete}
+\end{quotation}
+
+\noindent
+will restore the parameters of the task \taskname{delete} to their default
+values, and
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{unlearn system}
+\end{quotation}
+
+\noindent
+will restore the defaults for \emphasize{all} of the tasks in the system
+package. If you want to restore the defaults for all the parameters in your
+IRAF environment, delete the \filename{.PAR} files from the logical directory
+\filename{UPARM} :
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete uparm\$$*$.par}
+\end{quotation}
+
+\subsubsection{Specifying Parameters to a Task}
+
+\ppind
+The simplest and fastest way to invoke a task is to simply type in the name
+of the task followed by the necessary arguments on the command line, as we
+have been doing in most of the examples thus far.
+In many cases, the arguments for a task will be obvious, either from the context
+and the prompts issued by the task, or from the \usertype{lparam} display.
+If you are unsure about how to proceed,
+you can simply type the task name, and answer the questions.
+Each prompt may include minimum and maximum acceptable values,
+if such apply, and the current value of the parameter if such exists.
+For parameters that have only a fixed set of allowable values the list of
+valid options will be enumerated.
+
+Alternatively, the \usertype{eparam} command may be used to invoke the
+parameter \emphasize{editor}. The \taskname{eparam} task presents the
+parameters of a task in a tabular display on the screen and supports the
+use of the cursor keys to navigate the options. It also has commands for
+changing entries, or for recalling previous entries for further editing.
+The command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{eparam precess}
+\end{quotation}
+
+\noindent
+will display the parameters for \taskname{precess} (the \taskname{noao} and
+\taskname{astutil} packages must first be loaded). The \key{RETURN}
+key will move you down the list or the cursor keys
+may be used to move among the parameters, and any entries that you
+type will replace the displayed values. You may exit from
+\taskname{eparam} at any time with a \key{CTRL/Z} and the parameters
+for the task will be updated with your newly edited values.
+If you wish to exit the editor \emphasize{without} updating the
+parameters, use the interrupt request \key{CTRL/C} instead.
+Specifying parameters via \usertype{eparam} has the same effect as
+does entering them on the command line, they will be remembered by IRAF
+and not prompted for when the function is next invoked.
+
+\usertype{Eparam} and the history editor \usertype{ehistory} both
+use the same simple set of editor commands, and they can mimic several
+editors that are common on the currently supported systems. For any
+of these editors the default style supports use of the cursor (arrow keys)
+on the terminal and the use of the \key{DELETE} key. The sections on
+editors (\S 5.2-3) describe this in more detail.
+
+If you find that you must invariably run \taskname{eparam} before running
+a particular task, e.g., because the task has too many parameters to be
+specified on the command line, it is possible to get the CL to run
+\taskname{eparam} for you automatically whenever the task is run interactively.
+This is called \usertype{menu mode}. To set menu mode for a task we
+set the string value of the \taskname{mode} parameter of the task; all
+tasks have such a parameter. For example,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{precess.mode = ``ml''}
+\end{quotation}
+
+\noindent
+will set both menu and learn mode for the task \taskname{precess}.
+The default mode for most tasks is \usertype{ql}, i.e., query (the task
+will query for all parameters not set on the command line) plus learn
+(old parameter values are learned).
+
+Once you are familiar with the operation of a task, you can
+enter the parameter values on the command line in the
+order in which they appear in the \usertype{lparam} listing.
+Parameters may also be set using the \usertype{param = value} clause on the
+command line, but remember that any positional arguments must be given first.
+Note that a command line argument may be any general expression, much like
+the arguments to a Fortran subroutine.
+
+\begin{quotation} \noindent
+\comptype{cl>} \usertype{precess stdepoch= (1984$+$i$*$4)}
+\end{quotation}
+
+\noindent
+Here an expression is used to compute the value of the
+hidden parameter \taskname{stdepoch}. Note that the expression must
+be enclosed in parentheses in order to cause it to evaluated, since it
+will otherwise be treated like a string and just passed into the task
+for it to handle. The variable \usertype{i} must previously have
+been set to some legal value; otherwise the CL will prompt for it.
+
+\subsection{Pipes and I/O Redirection}
+
+\ppind
+We have already seen how tasks can take their input from either the
+terminal or from a file, and send the output to either the terminal
+or a file. By default, both the standard input and standard output for a
+task are written to the user terminal; the capability to change them
+on the command line is called \emphasize{I/O redirection}. The Appendix of
+IRAF commands at the end of this document was created with the
+following simple command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{help {\it pkg} $>$ {\it pkg.txt} }
+\end{quotation}
+
+\noindent
+where the name of each package was substituted for {\it pkg}.
+
+The pipe syntax is a powerful kind of I/O redirection. A pipe is formed by
+connecting the output of one task to the input of another task; an arbitrary
+number of tasks may be connected together in this way to form a single command.
+UNIX users will already be familiar with the concept and uses of pipes,
+but be aware that CL pipes differ from UNIX pipes in that the CL tasks
+execute \emphasize{serially} rather than concurrently (i.e., nothing comes out
+of the end of the pipe until \emphasize{all} the input has been processed).
+Another difference between IRAF and the usual UNIX implementation
+is that IRAF pipes are implemented with temporary files which are
+managed by the system.
+Note also that queries for parameters are not affected by the use of
+I/O redirection or pipes, i.e., required parameters will still be
+prompted for when requested by a task.
+
+A simple example of the use of a pipe is redirecting the output of a command
+to the line printer. This can be done with I/O redirection as follows:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{help plot $>$ temp} \\
+\comptype{cl>} \usertype{lprint temp} \\
+\comptype{cl>} \usertype{delete temp}
+\end{quotation}
+
+\noindent
+The pipe notation accomplishes the same thing and is more concise:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{help plot \pipe lprint}
+\end{quotation}
+
+\noindent
+For a more sophisticated example of the use of pipes, load the
+\usertype{lists} package and try out the following command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{?? \pipe words \pipe match : stop$+$ \pipe
+ sort \pipe table}
+\end{quotation}
+
+\noindent
+This sequence of commands takes the list of menus produced by \usertype{??},
+breaks it into a list of words, filters out the lines that contain the colon
+character (the package names), sorts the list, and prints a menu listing the
+tasks in all loaded packages.
+
+The following example shows the use of a pipe-filter to sort the output
+of a long form directory listing of the system library directory \filename{LIB},
+sorting the list in reverse numeric order by the size of the file, so that
+the largest files come out at the top of the list:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{dir lib l$+$ \pipe sort num$+$ rev$+$ col$=$3}
+\end{quotation}
+
+\noindent
+We can go a bit further and extend the pipe to print only the ten largest
+files and page the output:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{dir lib l$+$ \pipe sort num$+$ rev$+$ col$=$3 \pipe
+ head nlines$=$10 \pipe page}
+\end{quotation}
+
+Any or all of the input, output or error logical I/O streams may be
+redirected with simple command line requests. The next example shows
+the use of redirected input and output streams:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype {
+ match \upa\usertype{set} $<$ home\$login.cl $>$ names.env }
+\end{quotation}
+
+\noindent
+This command reads from your \filename{LOGIN.CL} file, created by the
+initial \usertype{mkiraf} command, matches all the lines that contain
+\usertype{set} environment statements (the metacharacter \upa (up-arrow)
+causes \usertype{set} to be matched only at the beginning of a line),
+and writes these out into the file \filename{NAMES.ENV}.
+
+The \usertype{$>$} redirection operators will create a new output file.
+To append to an existing file we use the \usertype{$>>$} operator instead:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{set \pipe match tty $>>$ names.env}
+\end{quotation}
+
+\noindent
+which will scan for all the environment variables having something to do with
+the terminal and append them to the file \filename{NAMES.ENV}.
+
+The operators \usertype{$>$} and \usertype{$>>$} will redirect only the
+standard output stream \filename{STDOUT}; error messages will still come
+out on the terminal. To redirect both \filename{STDOUT} and \filename{STDERR}
+the operators \usertype{$>$\&} and \usertype{$>>$\&} should be used instead.
+
+The graphics output streams may be redirected (but not piped) much as is
+done for the ordinary textual output streams.\footnote{This holds only for
+standard IRAF tasks, i.e., tasks which use the IRAF graphics subsystem.
+This feature is not currently available for the STScI SDAS tasks since they
+do not use the IRAF graphics facilities.} For example, to redirect the
+standard graphics output of the \taskname{surface} task (in the \taskname{plot}
+package) to produce a graphics metacode file \filename{SURF.MC}:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{ surface dev\$pix $>$G surf.mc}
+\end{quotation}
+
+To redirect the \filename{STDIMAGE} stream, substitute the operator
+\usertype{$>$I}, and to redirect the \filename{STDPLOT} stream, use the
+operator \usertype{$>$P}. The characters \usertype{GIP} must be uppercase.
+The \usertype{$>$} may be doubled to append to an existing file, as for
+the standard text streams. As a special case, a graphics stream (or indeed
+any stream) may be redirected to the so-called \emphasize{null} file
+\filename{DEV\$NULL} to discard the output. For example,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype {prow dev\$pix 100 $>$G dev\$null}
+\end{quotation}
+
+\noindent
+will plot row 100 of image \filename{DEV\$PIX}, redirecting the graphics output
+into the null file. The null file can be used anywhere a normal file can be
+used.
+
+\newpage
+\section{Operating System Interface}
+
+\ppind
+Although IRAF provides a quite complete environment for data analysis
+activities, it must be hosted in some particular operating system whenever
+it is being used. The isolation from the peculiarities of any
+specific operating system command syntax is rather complete, but there
+are instances where the syntax of the underlying system must be
+used (host filenames) or where the user may desire to use familiar
+commands from the host system. IRAF does allow commands to be passed
+through to the host operating system, but because IRAF maintains all of
+its own environment descriptors, directory structures, and task and
+program information, the operating system commands should only be used
+to bring information into the IRAF environment, but not to modify it.
+In order to change any of the status or control information that
+affect IRAF execution, the commands provided by IRAF must be used.
+
+\subsection{Sending Commands to the Host Operating System}
+
+\ppind
+IRAF allows access to the underlying operating system, and hence to
+other programs that operate within the native operating system
+environment. There are limitations on some of the system facilities that
+can be used without regard to side-effects, but, in general, almost any
+program can be called from within IRAF.
+External programs can be accessed from within the user's environment and will
+operate with a standard interface that is compatible with the
+rest of the processing functions that are available.
+
+Any command may be sent to the host operating system by prefixing
+the command with the escape character `\usertype{!}'. The rest of the
+command line will be passed on unmodified. For example, to read your mail
+on a UNIX or VMS system:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{!mail}
+\end{quotation}
+
+\noindent
+Upon exiting the mail routine, you will be back in the CL. Almost any
+task that is executable in the normal host environment can be invoked
+from within IRAF by means of this escape mechanism. The OS escape
+is used to implement some of the standard IRAF commands that request
+operating system information, such as \usertype{spy}.
+The \usertype{edit} command also uses the escape mechanism, so that
+the host supported editors can be used, rather than require that a
+completely new editor be learned in order to use IRAF.
+
+Occasional conflicts will arise if these external tasks re-assign
+their terminal input and output streams or perform other unnatural acts.
+If strange things happen when trying to use such tasks from within
+the CL, consult your \irafname{IRAF Guru}. The other major source of problems
+with host system tasks is that they may depend upon system specific
+data that have been defined for the OS but are unknown to IRAF. This
+is a particular problem under VMS, which does not pass system environment
+parameters to sub-tasks, as does UNIX. Variables that affect the
+execution of tasks within the environment are controlled by IRAF and
+are passed between the executing tasks, as in described next.
+
+\subsection{Environment Variables}
+
+\ppind
+The CL maintains a table of environment variables which
+affect the operation of \emphasize{all} IRAF programs.
+The environment variables are used to define logical names for directories,
+to associate logical device names with a specific physical device,
+and to provide control over the low level functioning of the
+IRAF file I/O system.
+The default environment is created by IRAF at login time, i.e., when the
+CL is first run. Part of this initialization uses a standard system-wide,
+site dependent file named \filename{HLIB\$ZZSETENV.DEF}. Additional
+initialization of personal environment variables, or redefinition
+of standard environment variables, may be done with commands
+in your \filename{LOGIN.CL} file.
+
+One may add new environment variables, or redefine old ones, at any time during
+a session with the \usertype{set} command. \usertype{Set} declarations made
+during CL execution, however, may be lost upon exit from a package. To secure
+environment declarations for a full session, make them \emphasize{immediately}
+after logging in. To make environment declarations permanent, place the
+relevant \usertype{set} commands in your \filename{LOGIN.CL} file.
+
+The \usertype{set} command is usually used to change the \emphasize{session}
+defaults for output devices and such, but all IRAF programs which write to the
+line printer or to a graphics device also permit the device to be selected on
+the command line. For example,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{set terminal = vt100}
+\end{quotation}
+
+\noindent
+informs IRAF that the user is using a VT100-type terminal for this session.
+When typed without any arguments, e.g.:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{set \pipe page}
+\end{quotation}
+
+\noindent
+\taskname{set} displays a list of the current values of all of the environment
+variables. Note that abbreviations are \emphasize{not} supported for
+environment variable names, they must be spelled out in full.
+If a shorter name is used the CL will silently create a new environment
+variable for you, which may not be what you desired at all.
+
+Identifying the kind of terminal you are using, the size of the display
+window to be used, and setting other terminal options may most conveniently
+be done with the \usertype{stty} command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{stty tek4014 baud$=$1200}
+\end{quotation}
+
+\noindent
+This command should be used early in the session (if not already present in
+the \filename{LOGIN.CL} file) to identify the kind of terminal that you are
+using, since the operation of the various editors and of other functions will
+be affected by these values. It is only necessary to set baud rate as in
+the example if you are working remotely via modem. As was the case with
+the \usertype{set} command, typing \usertype{stty} with no arguments will
+display the current terminal type and settings.
+
+The current value of \emphasize{individual} environment variables may be
+displayed with the \usertype{show} command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{show printer}
+\end{quotation}
+
+\noindent
+A selection of the more important environment variables is shown in the
+following table.
+
+\begin{center}
+\begin{tabular}{|l|l|l|}
+\hline
+\multicolumn{3}{|c|}{\bf Selected Environment Variables}\\
+\hline
+{\it variable}& {\it sample value}& {\it usage}\\
+\hline
+terminal& ``vt100''& default terminal device\\
+printer& ``printronix''& default line printer device\\
+stdgraph& ``vt640''& name of graphics terminal device\\
+stdplot& ``versatec''& batch plotter device\\
+stdvdm& ``uparm\$vdm''& name of graphics metacode file\\
+stdimage& ``iism75''& image display device\\
+clobber& no& clobber (overwrite) output files\\
+filewait& yes& wait for busy files to become available\\
+\hline
+\end{tabular}
+\end{center}
+\medskip
+
+\noindent
+Clearly, the permissible names of devices are site dependent; for a list of
+the devices available at a particular site the user should consult their
+\irafname{IRAF Guru} (or look in the \filename{TERMCAP} and \filename{GRAPHCAP}
+files in the IRAF logical directory \filename{DEV}).
+
+Among the set of environment variables that control the operation of
+the CL is a subset of variables that define the user environment. These
+variables describe the user's home and scratch directories, terminal
+type, and editor preference. Because these values describe a user's-eye
+view of IRAF, they can be thought of as \emphasize{customization} variables
+and can be \usertype{set} in the \filename{LOGIN.CL} file to your
+preferred values.
+
+\begin{center}
+\begin{tabular}{|l|l|l|}
+\hline
+\multicolumn{3}{|c|}{\bf User Environment Variables}\\
+\hline
+{\it variable}& {\it sample value}& {\it usage}\\
+\hline
+editor& ``vi'' & default editor mode\\
+home& ``/{\it user}/iraf/'' \footnotemark & user home directory\\
+uparm& ``home\$uparm/''& user scratch directory\\
+imdir& \emphasize{system-dependent}&directory where bulk data is stored\\
+imtype& ``imh'' & default image type (header file extension)\\
+userid& {\it user}& user identification name (for output)\\
+\hline
+\end{tabular}
+\end{center}
+
+\footnotetext{ {\bf VMS :} an equivalent VMS example might be
+``DISK\bsl\$1:[USER.IRAF]''. Note that any dollar sign characters appearing
+in host filenames must be escaped in IRAF since the dollar sign is a reserved
+character in IRAF filenames.}
+
+\noindent
+The \filename{HOME} directory specification, and possibly an
+\filename{IMDIR} declaration should be the \emphasize{only} places in
+your \filename{LOGIN.CL} file where any system specific names appear
+at all. All of the IRAF name references (except a single root reference)
+are processed by the virtual name mapping algorithms. If this same
+mechanism is used for all user files as well, then only IRAF
+virtual filenames need to be referenced once the root directory
+has been properly specified.
+
+The default \emphasize{uparm} declaration
+assumes that a \filename{UPARM}
+subdirectory has been set up in your login directory; the \usertype{mkiraf}
+command described earlier (\S 2.1) sets this up for you. If a \filename{UPARM}
+subdirectory does \emphasize{not} exist, the CL will refuse to update
+user parameters and will issue a warning message.
+
+\subsection{File and Directory Names}
+
+\ppind
+The IRAF system employs \irafname{virtual file} names so that all file
+references will look the same on any computer, and IRAF primitives convert
+virtual filenames into their host operating system equivalents. In general,
+either the IRAF virtual filename or the operating-system-dependent filename
+may be used in a command entered by the user, but users should avoid
+the use of OS-specific names wherever possible. Internally IRAF itself
+uses only virtual filenames for reasons of transportability.
+
+Note that filename mapping does not operate automatically for virtual file
+names that are passed as parameters to foreign (host system) tasks, but a CL
+intrinsic function \taskname{osfn} will perform the mapping if called
+explicitly on the command line. The host task must be declared as an IRAF
+\taskname{foreign task} (\S 5.6) for this to work. There is no provision
+for filename mapping when the regular OS escape mechanism (\S 4.1) is used.
+
+The environment variables described in the preceding section play a fundamental
+role in the mapping of virtual filenames. Environment variables define
+the logical directories that are used to create host operating system
+specific names from logical names. An example of a virtual filename
+is the default logfile, \filename{HOME\$LOGFILE.CL}.
+The \filename{HOME} field, delimited by the `\$' character, is the logical
+directory; the file name within that directory is \filename{LOGFILE.CL}.
+Successive translations of `\$'-delimited logical names are performed until the
+operating system dependent name has been generated. Names such as
+\filename{HOME\$UPARM/} are \emphasize{directory} references; the trailing `/'
+indicates that a filename or sub-directory name may be appended to produce
+a legal file or directory pathname.
+
+\subsubsection{File Name Templates and Metacharacters}
+
+\ppind
+Although filenames cannot be abbreviated the way commands can,
+pattern matching templates can be constructed that
+refer to many files. You need only type a
+short string (the pattern) that serves as a \emphasize{template}, and all
+files whose names match the template are selected. All of the IRAF
+functions that process filenames (and this is most of them) use the
+same function to expand filename templates into a list of files.
+The pattern matching \irafname{metacharacters} are a super-set of those
+used in the UNIX and VMS operating systems. To print all files having
+the extension \filename{.CL}, type:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{lprint $*$.cl}
+\end{quotation}
+
+\noindent
+To page through all files in the logical directory \filename{FIO}
+with the \filename{.X} extension, type:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{page fio\$$*$.x}
+\end{quotation}
+
+\noindent
+The filenames matched by the file template are passed to the \usertype{page}
+task which pages through the set of files. As each file is accessed, the VOS
+filename translation facilities are used internally to generate the host
+system filename, which is passed to the kernel to physically open the file.
+
+\begin{center}
+\begin{tabular}{|l|l|l|}
+\hline
+\multicolumn{3}{|c|}{\bf Pattern Matching Metacharacters} \\
+\hline
+{\it Meta-char}& {\it Meaning}& {\it Example}\\
+\hline
+$*$ & Match zero or more characters & $*$.cl \\
+\lbox...\rbox & Any character in class & \lbox a-z\rbox \\
+\lbox \upa...\rbox & Any character not in class & \lbox \upa A-Z\rbox \\
+? & Match any single character & a?c \\
+\{...\} & Ignore case for the enclosed string & \{Lroff\} \\
+@{\it file} & Read filenames from a list file& @listfile \\
+\hline
+\end{tabular}
+\end{center}
+
+\noindent
+To delete a named list of files, type:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete file1,file2,file3}
+\end{quotation}
+
+\noindent
+Note that the list of filenames is separated by commas \usertype{','}
+\emphasize{with no intervening blanks}.
+This causes the individual filenames to be treated as one list-form
+parameter rather than to be processed as three separate parameters.
+A blank is treated as a delimiter by the parser, and thus may not appear
+in a list-form parameter unless the list is enclosed in quotes.
+
+The following is equivalent to the previous example, except that no warning
+will be issued if any of the three files does not exist, since we are asking
+the system to find all files that match the template, rather than naming the
+files explicitly:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete file\lbox123\rbox}
+\end{quotation}
+
+\noindent
+Consider the following simple command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete filex}
+\end{quotation}
+
+\noindent
+The name ``filex'' given here is actually ambiguous; it could be either the
+name of a file (a string constant) or the name of a string parameter
+set to the name of the file to delete. In this simple and common case,
+the CL will quietly assume that ``filex'' is the \emphasize{name} of the
+file. If the identifier \usertype{filex} is really the \emphasize{name}
+of a variable, it will have to be parenthesized to force it to be evaluated.
+Either of the following forms are equivalent to this command and both are
+unambiguous requests to delete the file named \filename{FILEX}:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete 'filex'}\\
+\medskip
+\comptype{cl>} \usertype{delete ('filex')}
+\end{quotation}
+
+\noindent
+Note that within parentheses the \emphasize{string} \usertype{'filex'}
+must be typed as shown, with quotes, or the CL will attempt to process
+it as a variable name, causing a runtime error if there is no such variable
+currently defined within the scope of the \taskname{delete} task.
+
+The following command is also unambiguous, and it specifies that the CL
+is to take the name of the file from the \emphasize{parameter} ``filename'':
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete (filename)}
+\end{quotation}
+
+Note that in many of these examples, a \emphasize{single} string
+type argument, viz. the file matching template with metacharacters,
+is used to refer to a list of files.
+This convention is employed by all IRAF tasks which
+operate on lists of files. Be careful not to confuse a file list template
+with the argument list itself. Thus:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete file,file2,prog.$*$}
+\end{quotation}
+
+\noindent
+is perfectly acceptable, and does what the next example does:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete 'file1, file2, prog.$*$'}
+\end{quotation}
+
+\noindent
+as long as there are no blanks between elements of the first name list.
+If blanks were inadvertently included in the unquoted template string the
+CL would interpret the template as several string arguments, probably causing
+an error something like ``\comptype{too many positional arguments}''.
+
+The list file approach is useful when it is difficult to specify a template
+for the desired set of files, when the same set of files will be operated
+upon several times, when a very large number of files are to be operated
+upon, or when a list is already available. The file list may be generated
+by the editor, or by a task such as \taskname{files}, e.g.:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{files *.im,run[1-4].* $>$ listfile}
+\end{quotation}
+
+\noindent
+The textfile \filename{LISTFILE} may then be referenced in a filename template
+as \usertype{@listfile} to operate upon the listed files. A variation on
+the listfile approach is \usertype{@STDIN} (must be upper case), which
+allows the filenames to be typed in when the task begins running.
+
+Some tasks use the filename template mechanism to generate the names of a
+\emphasize{new} set of \emphasize{output} files. The filename template
+expansion code provides two operators for generating new filenames from
+old ones. The file template \emphasize{operators}, which are used to
+construct new filenames, should not be confused with the pattern matching
+\emphasize{metacharacters}, which are used to match a subset of an existing
+set of files.
+
+The first and simplest operator is the string concatenation operator
+\comptype{//}. This may be used to concatenate a string suffix to the
+\emphasize{root} field of a filename, to concatenate a filename to a string
+prefix, to concatenate two filenames, or some combination of the above.
+For example,
+
+\begin{quotation}\noindent
+\comptype{cl>} \comptype{files lib\$*.com$//$\_o}
+\end{quotation}
+
+\noindent
+will produce a new list of files by appending the string \comptype{"\_o"} to
+the root of each filename matched by the template at the left.
+
+The second and last operator is the string substitution operator
+\comptype{\%}. If a sequence of the form \comptype{\%a\%b\%} is inserted
+somewhere in a file template, the string \usertype{a} will participate in
+the pattern matching operation, but will be replaced by \usertype{b} in the
+generated filename. Either \usertype{a} or \usertype{b} may be omitted to
+insert or delete fields from a filename. For example,
+
+\begin{quotation}\noindent
+\comptype{cl>} \comptype{files lib\$*\%\%\_o\%.com}
+\end{quotation}
+
+\noindent
+is equivalent to the concatenation operation illustrated in the preceding
+example. The command
+
+\begin{quotation}\noindent
+\comptype{cl>} \comptype{files lib\$*.\%com\%dat\%}
+\end{quotation}
+
+\noindent
+would find all the \filename{.COM} files in the logical directory
+\filename{LIB}, generating a new list of files with the extension
+\filename{.DAT} substituted for \filename{.COM}.
+
+All IRAF tasks that use pattern matching or template expansion use the same
+syntax and metacharacters as in the examples given here for filename templates.
+This includes, for example, the use of templates in the \taskname{help} task
+to locate manual pages, and the use of pattern matching in the \taskname{match}
+task to search text files for lines that match a pattern.
+
+\subsubsection{Directories and Path Names}
+
+\ppind
+It is often useful to employ several different directories as an aid to
+organizing your data. For instance, you may have one directory for M87 data,
+and one for M8 data, or, as was set up for you by the \usertype{mkiraf} command,
+a login directory \filename{HOME} and a scratch directory \filename{UPARM}.
+New directories may be created with \usertype{mkdir}; use \usertype{chdir}
+or \usertype{cd} to change the default directory, and \usertype{back} to
+return to the most recent default directory.
+
+For example, to display the pathway through the system to your current
+default directory, type:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{path}
+\end{quotation}
+
+\noindent
+To change to a new default directory, type:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{chdir }{\it newdir}
+\end{quotation}
+
+\noindent
+where {\it newdir} may be an IRAF logical directory name defined
+with a \usertype{set} command, an IRAF pathname to the directory,
+or a host system directory name (provided any dollar sign characters
+therein are escaped).
+
+The \usertype{mkdir} command can be used to create a new sub-directory
+of the current directory:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{mkdir m87}
+\end{quotation}
+
+\noindent
+To define a logical directory name (``m87'') for this subdirectory
+of your home directory, use the following set command (note the trailing '/'):
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{set m87 = 'home\$m87/' }\footnotemark
+\end{quotation}
+
+\footnotetext{ {\bf VMS :} IRAF supports logical names for
+files and directories that may contain mixed cases and special
+characters. However, to avoid unpleasant surprises,
+we recommend that for root directories you use only names valid
+for the underlying operating system.}
+
+\noindent
+Once this logical name mapping has been established, you may type either
+of the following commands to change the default
+directory to the ``m87'' directory (note \usertype{chdir} may be
+abbreviated \usertype{cd}):
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{chdir m87} \\
+\medskip
+\comptype{cl>} \usertype{cd home\$m87}\footnotemark
+\end{quotation}
+
+\footnotetext{ {\bf VMS :} The characters \comptype{\$} and \comptype{[},
+commonly used in VMS device and directory names, will cause a conflict
+if VMS file or device names using them are passed to IRAF tasks since these
+characters have a special meaning in IRAF filenames and filename templates.
+If either of these characters is used in a VMS filename passed to an IRAF
+program, the character must be escaped to avoid interpretation as a VOS
+metacharacter, e.g., \comptype{page usr\bsl\$0:\bsl[iraf.local]login.cl}.}
+
+\noindent
+If you type \usertype{chdir} or \usertype{cd} without any arguments, the
+default directory will be set to your ``home'' directory.
+
+Once a logical directory has been defined, the IRAF pathname notation may
+be used to reference any file or directory in the vicinity of the new logical
+directory. For example, the following command would page the file CURSOR.KEY
+in the subdirectory SCR of the subdirectory LIB of the IRAF root directory
+IRAF, a predefined logical directory:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{page iraf\$lib/scr/cursor.key}
+\end{quotation}
+
+The current directory and the directory one level up from the current
+directory may be referenced in pathnames via the synonyms ``\usertype{.}''
+and ``\usertype{..}''. For example, if the current default directory is PKG,
+a subdirectory of LIB like SCR in the preceding example, the path to the
+CURSOR.KEY file could be entered as follows:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{page ../scr/cursor.key}
+\end{quotation}
+
+It is not necessary to change the default directory to reference
+files located in another directory. Your login directory, for example, has
+the logical name \filename{HOME\$} assigned to it.
+The following command would page through the \filename{LOGIN.CL}
+file in your home directory, regardless of the current default directory:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{page home\$login.cl}
+\end{quotation}
+
+\noindent
+The logical directory names (\filename{UPARM} and \filename{IMDIR} are examples
+of directories that are normally appended to the \filename{HOME}
+directory, and you may set up other logical directories as required.
+The names of all of the standard IRAF system directories are defined
+automatically when the CL starts up, and may be listed with the
+\taskname{set} command.
+
+\subsubsection{Virtual Filename Processing}
+
+\ppind
+Virtual filenames are used throughout IRAF and the CL in preference
+to operating system specific names. The obvious reason for this is
+to isolate OS specific interfaces to a small set of locations, as
+a way of ensuring commonality across operating systems and as an
+aid to portability. There is an obvious benefit to the user as well,
+in that filename references will look the same within IRAF regardless
+of the host environment. Operating system specific names must
+eventually be generated, but the details of these operations are
+best buried in dedicated interface routines.
+
+The only place where OS specific names need appear at the user level is
+in file system directory names and in references to system physical devices.
+Even here, the use of OS specific names should be isolated to only
+one or two root directory names.
+The other place where OS names must appear is calls to operating
+system routines or to external programs that are accessed from within
+IRAF via the OS escape mechanism (\S 4.1). The \taskname{pathnames} task
+and the \taskname{osfn} intrinsic function are used to translate IRAF virtual
+filenames into host system filenames.
+
+Either of the following commands will print the fully qualified OS name
+for the file \filename{HOME\$LOGIN.CL}.
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{path home\$login.cl}\\
+\medskip
+\comptype{cl>} \usertype{= osfn ('home\$login.cl')}\\
+\end{quotation}
+
+\noindent
+The \taskname{pathnames} task writes the translated filename on its standard
+output, while \taskname{osfn} returns the translated filename as the function
+value. The \usertype{pathnames} task will also expand filename templates,
+and thus can be used to generate the OS names for a list of files:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{path home\$ss433.*\ $>$ ss433files.list}
+\end{quotation}
+
+\noindent
+will generate a list of all of the files in directory \filename{HOME}
+that match the template, and will write the fully qualified OS names
+of these files into \filename{SS433FILES.LIST}. This ASCII file can
+be edited as necessary, and used as list-structured input to other
+IRAF functions (\S 2.3, \S 6.9, \S 7.3).
+
+The most common use of the \taskname{pathnames} task is probably to print
+the current default directory, which is its function when called with no
+arguments on the command line.
+
+\subsection{Image Data}
+
+\ppind
+An IRAF \emphasize{image} is an N-dimensional data array with an associated
+\emphasize{image header} describing the physical and derived attributes of
+the image. The content of the header tends to be very data or application
+specific. The datatype selected to store the \emphasize{pixels} (data values)
+is also application dependent, and a variety of choices are provided.
+Images of up to seven dimensions are currently supported, although
+in practice most images are either one or two dimensional, and most programs
+are written to operate upon one or two dimensional images. Any IRAF program
+can be used to operate upon a \emphasize{section} of lesser dimension
+(or extent) than the full image, using the \emphasize{image section} notation
+discussed in \S 4.4.3, hence the dimensionality of the algorithm implemented
+by a program need not prevent use of the program on images of higher dimension.
+
+\subsubsection{Image Names and Storage Formats}
+
+\ppind
+The notation used to refer to images is similar to that used to refer to
+files, except that images are more complex objects than files and hence a
+somewhat more complex notation is required. Most of the file, directory,
+and pathname notation discussed in \S4.3 carries over to images.
+Sets of images are referred to by an \emphasize{image template} notation
+which is an extension of the file template notation discussed in \S4.3.1.
+
+In most, but not all, cases, an IRAF image is stored on disk in two separate
+files, one containing the image header and the other containing the pixels.
+The basic image name is the filename of the header file. The filename of an
+image header file always has an extension specifying the format in which the
+image is physically stored on disk. \footnote{In versions of IRAF prior to
+V2.3, only one physical image storage format was supported, hence image header
+files did not have extensions.} Two storage formats are currently supported,
+the old iraf format (OIF) and the SDAS group data format (STF). The old IRAF
+format images have the extension \filename{IMH}. The STF images may have any
+three character extension ending in \filename{H}, e.g., \filename{HHH}
+(the extension \filename{IMH} is reserved for OIF images, of course).
+Both types of images may be accessed at any time, with the extension being
+used to identify the physical storage format to the IRAF software.
+
+For example, the IRAF system is distributed with a standard OIF format test
+image \filename{PIX} stored in the system directory \filename{DEV}. The full
+filename of the header file is \filename{DEV\$PIX.IMH}. To make a copy of
+this image in the current directory we could load the \taskname{images}
+package and enter the following command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{imcopy dev\$pix pix}
+\end{quotation}
+
+\noindent
+or since we don't want to change the image name,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{imcopy dev\$pix .}
+\end{quotation}
+
+\noindent
+Note that we did not have to specify the image type extension in the copy
+operation. The extension is optional whenever a single image is referenced;
+in image templates, the template must match the full filename of each image
+as it appears in a directory listing, hence the extension is required in
+image templates.
+
+Sometimes it is necessary to specify the image type extension to force an
+image of a certain type to be created. For example,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{imcopy dev\$pix pix.bah}
+\end{quotation}
+
+\noindent
+would create an STF format copy of the standard test image in the current
+directory.
+
+When making a copy of an existing image, the new image will have the same
+format as the old image unless an extension is specified in the output image
+name. When creating a new image from scratch, e.g., when reading a data
+tape to disk, the default image type is determined by the value of the CL
+environment variable \filename{IMTYPE}, the value of which is the three
+character default image type extension. If \filename{IMTYPE} is not defined,
+the default value is \usertype{imh}, i.e., an OIF format image will be
+created. To change the default to be to create an STF format image, add
+a command such as
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{set imtype $=$ hhh}
+\end{quotation}
+
+\noindent
+to your \filename{LOGIN.CL} file.
+
+\subsubsection{Image Templates}
+
+\ppind
+Image templates are equivalent to filename templates except that the character
+\comptype{`['}, a pattern matching character in filename templates, has a
+different meaning in image templates, as we shall see in the next section.
+\footnote {If you really want to perform file template style character class
+expansion in an image template, use the operator \comptype{![} instead
+of \comptype{[}. The conventional escape mechanism, i.e., \comptype{\bsl[},
+is used to include the \comptype{[} in the \emphasize{filename}, as in a
+filename template.}
+
+\noindent
+For example, given a directory containing the files
+
+\begin{verbatim}
+ irs.log irs.0030.imh irs.0031.imh irs.0032.imh
+\end{verbatim}
+
+\noindent
+the template \usertype {irs.$*$.imh} would match the three image files,
+whereas \usertype{irs.$*$} would match the \filename{LOG} file as well,
+causing \taskname{imheader} to complain about an illegal format image in
+its input list.
+
+\subsubsection{Image Sections}
+
+\ppind
+All IRAF programs which operate upon images may be used to operate on
+the entire image (the default) or any section of the image.
+A special notation is used to specify \irafname{image sections}. The section
+notation is appended to the name of the image, much like an
+array subscript is appended to an array name in a conventional programming
+language. Note that array or image section \emphasize{index references}
+are integer only in pixel coordinates, but that the data may be of any valid
+type.
+
+\begin{quote}
+\begin{tabular}{ll}
+{\it section}& {\it refers to}\\
+\\
+pix& whole image\\
+pix[]& whole image\\
+pix[i,j]& the pixel value (scalar) at [i,j]\\
+pix[$*$,$*$]& whole image, two dimensions\\
+pix[$*$,-$*$]& flip y-axis\\
+pix[$*$,$*$,b]& band B of three dimensional image\\
+pix[$*$,$*$:s]& subsample in y by S\\
+pix[$*$,l]& line L of image\\
+pix[c,$*$]& column C of image\\
+pix[i1:i2,j1:j2]& subraster of image\\
+pix[i1:i2:sx,j1:j2:sy]& subraster with subsampling
+\end{tabular}
+\end{quote}
+
+\noindent
+A limited set of coordinate transformations may be specified using image
+sections, but please observe that transpose is \emphasize{not} one of them.
+The ``match all'' (asterisk), flip, subsample, index, and range notations
+shown in the table may be combined in just about any way that makes sense.
+As a simple example:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{graph pix[$*$,10]}
+\end{quotation}
+
+\noindent
+will graph line 10 of the image \filename{PIX}.
+To generate a contour plot of an 800-pixel square image
+subsampled by a factor of 16 in both dimensions:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{contour pix[$*$:16,$*$:16]}
+\end{quotation}
+
+\noindent
+To display the fifth $x-z$ plane of a three dimensional image named
+\usertype{cube} on frame 1 of the image display device:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{display cube[$*$,5,$*$] 1}
+\end{quotation}
+
+\noindent
+The image section string is part of the image name and is processed by
+the IRAF system software (rather than by each applications program),
+hence image sections can be used with all IRAF programs. A section can
+be used to write into a portion of an existing output image, as well as to
+read from an input image.
+
+\subsubsection{The OIF Image Format}
+
+\ppind
+The old IRAF image format (OIF) is the original IRAF image format,
+unchanged since it was first used in the beginning of the project.
+It is called the ``old'' format in anticipation of its eventual replacement
+by a new format to be layered upon the planned IRAF database facilities.
+The OIF format is the current standard IRAF image format and is the format
+used to test the IRAF image processing software at NOAO.
+
+In the OIF format, each image is stored in a distinct pair of files, the
+header file (extension \filename{IMH}) and the pixel file (same root name as
+the header file, extension \filename{PIX}). The pixel file need not reside in
+the same directory as the header file; by default all pixel files are
+created in a user directory on a scratch disk device to permit a different
+file quota, file expiration, and backup policy to be employed than is used
+for the smaller, more permanent ordinary user files.
+
+The CL environment variable \filename{IMDIR} determines where OIF pixel files
+will be created. \filename{IMDIR} is a required parameter and is normally
+defined in the user's \filename{LOGIN.CL} file. The value of \filename{IMDIR}
+is only used when the pixel file is created; if the value of \filename{IMDIR}
+is later changed, new pixel files will be created in a different directory,
+but the system will still be able to find the pixel files of the older images.
+
+By default, the \taskname{mkiraf} script will create an image storage
+directory for the user on a public scratch device and place the host pathname
+of the new directory in the user's \filename{LOGIN.CL} file. For example,
+on a UNIX system, a typical set environment statement might be:
+
+\begin{quotation}\noindent
+\usertype{set imdir $=$ $/$tmp2$/$iraf$/$user$/$}
+\end{quotation}
+
+\noindent
+which will cause the pixel files to be created in the named host directory,
+regardless of the directory in which the image header file resides.
+As an option, we can request that the pixel file be placed in the
+\emphasize{same} directory as the header file:
+
+\begin{quotation}\noindent
+\usertype{set imdir $=$ HDR\$}
+\end{quotation}
+
+\noindent
+or in a subdirectory of the header file directory, e.g., subdirectory
+\filename{PIXELS}:
+
+\begin{quotation}\noindent
+\usertype{set imdir $=$ HDR\$pixels$/$}
+\end{quotation}
+
+\noindent
+Note that the reserved logical directory name \filename{HDR} must be upper
+case, and that a trailing slash is required if the subdirectory option is used.
+The subdirectory will be created automatically by the system when the first
+pixel file is created, if the directory does not already exist.
+The \filename{HDR} option should \emphasize{only} be used if the header file
+itself is created in a directory on a scratch device; it should always be used
+if the image is created on a remote node in the local network.
+
+\subsubsection{The STF Image Format}
+
+\ppind
+The STF image format is the format used by STScI to store Space Telescope
+image data. IRAF provides a dedicated image kernel to read and write this
+format so that sites reducing binary ST data do not have to carry out expensive
+format conversions to be able to access the data from within IRAF. SDAS
+users should note that the SDAS software can \emphasize{only} access STF
+format images, hence the STF format must be used if you plan to make extensive
+use of SDAS. Reductions involving only IRAF programs should not use the STF
+format, since the OIF format is simpler and more efficient, and is the format
+used to test the IRAF software.
+
+In the STF format, an image or a \emphasize{group} of similar images may be
+stored in a pair of files, the image header file (extension \usertype{??H}),
+and the associated pixel storage file (extension \usertype{??D}). If multiple
+images are stored in a group format image, all member images share the same
+group header. The group header file is a special VMS format text file which
+can be examined by \taskname{page} and \taskname{type}, as well as with
+\taskname{imheader}. Each member image in a group format image also has its
+own private binary format header, called the group parameter block. The STF
+image format supports only single precision real pixels, since that is what
+SDAS programs require.
+
+IRAF programs consider images to be independent entities, with any associations
+between images being left up to the user. When a member image of an STF
+group format image is accessed from an IRAF program, IRAF constructs the image
+header of the member image by concatenating the group header to the group
+parameter block for the member image; no distinction is made between the two
+classes of header parameters once the image has been opened.
+
+To refer to a specific member image of a group format image, the group
+subscript must be specified in the image name. If there is an image section
+as well, it comes after the group subscript. For example, if \filename{WFPC}
+is an STF group format image,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{implot wfpc[3]}
+\end{quotation}
+
+\noindent
+would call up the interactive image plotting task \taskname{implot} on group
+3 of the group format image. If no subscript is specified, the default is
+group 1. To plot the same image with the lines flipped end for end, we add
+an image section:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{implot wfpc[3][$-*,*$]}
+\end{quotation}
+
+\noindent
+To create a new group format image, we must preallocate space for all the
+member images, all of which must be the same dimensionality, size, and
+datatype. For example,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{imcopy wfpc wfpc2[1$/$10]}
+\end{quotation}
+
+\noindent
+would create a new group format image \filename{WFPC2} with the same
+dimensionality, size, and group parameter block as the existing STF image
+\filename{WFPC}, then copy the pixels from \filename{WFPC} to
+\filename{WFPC2[1]}. The new image would inherit the header of the old
+image as well. Once a new group format image has been created, the remaining
+member images may be written into by specifying the group subscript in the
+output image name passed to an IRAF program. The group count
+(\usertype{$/$10}) should be omitted, else IRAF will try to create a new
+group format image, rather than write into one of the member images of
+an existing group. Note that member images cannot be added or deleted
+once a group format image has been created.
+
+\newpage
+\section{Advanced Topics in the CL}
+
+\ppind
+In addition to the basic facilities already described,
+the CL permits user control over many aspects of the environment.
+This includes direct control over the CL itself, control over user tasks
+and background processes, the job logfile and the command history mechanism.
+These features and others will be of use to the more advanced user
+and enable user customization of interactions with the system.
+
+\subsection{CL Control Parameters}
+
+\ppind
+The CL is itself a task which has a set of parameters that
+are used to direct its execution. For example, if you wish to keep
+a permanent record of all the commands you enter, the CL will do this
+if you set its boolean parameter \taskname{keeplog} to yes. (Boolean
+parameters can assume only the values \emphasize{yes} or \emphasize{no}.)
+Simply type:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{keeplog = yes}
+\end{quotation}
+
+\noindent
+and all subsequent commands will be written to the log file.
+The name of this file is defined by the
+string parameter \taskname{logfile} which defaults to the filename
+\filename{HOME\$LOGFILE.CL}. The name of the logfile may be changed
+by assigning a new value to the parameter, e.g.:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{logfile = "commands.log"}
+\end{quotation}
+
+The important CL parameters which you may wish to alter or otherwise
+access are described in the table below.
+
+\begin{center}
+\begin{tabular}{|l|l|l|}
+\hline
+\multicolumn{3}{|c|}{\bf CL Parameters}\\
+\hline
+{\it parameter} & {\it typical value} & {\it function}\\
+\hline
+echo & no & echo CL command input on stderr? \\
+ehinit & (see manpage) & ehistory options string \\
+epinit & (see manpage) & eparam options string \\
+keeplog & no & record all interactive commands in logfile? \\
+logfile & ``home\$logfile.cl'' & name of the logfile \\
+logmode & (see manpage) & logging control \\
+menus & yes & display menu when changing packages? \\
+mode & "ql" & default mode for servicing parameter queries \\
+notify & yes & send done message when bkgrnd task finishes? \\
+szprcache & 3$-$4 & size of the process cache \\
+\hline
+\end{tabular}
+\end{center}
+\medskip
+
+\noindent
+A full list of CL parameters can be obtained with the \emphasize{lparam}
+command, or by typing the command \usertype{help language.cl}. The latter
+provides a brief description of each CL control parameter including references
+to \taskname{language} package manual pages containing more detailed
+information.
+
+Changes that you make to any of the CL task parameters by assignment during
+a session will be lost when you log out of the CL.
+This is in contrast to the parameters of a normal task, which are learned
+by the CL. If you want the CL to ``remember'' values of CL parameters,
+you should initialize them to your personal default values in your
+\filename{LOGIN.CL} file and they will be reestablished for you each time
+you log in.
+
+\subsection{Setting the Editor Language and Options}
+
+\ppind
+The parameter editor (\usertype{eparam}) command and the history
+editor (\usertype{ehistory}) both use the same simple set of edit commands
+and a choice of editor languages is available. The command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{set editor = emacs}
+\end{quotation}
+
+\noindent
+will set the edit mode for both editors to use the Emacs set of keystrokes.
+This also changes the editor that is invoked when
+you issue the \usertype{edit} command, so that all of the editor interfaces
+that are available will appear to operate in the same way.
+
+Editor choices, with their associated key bindings, are:
+
+\begin{itemize}
+\item EDT (the default for VMS devotees)
+\item Vi (ditto for their UNIX counterparts)
+\item Emacs (which runs on either system)
+\end{itemize}
+
+For convenience, all of these editor choices support
+use of the cursor keypad keys and the \key{DELETE} key; the
+ambitious user may define his own personal set of command key bindings.
+The bindings that are available by default in IRAF are shown in an
+Appendix (\S A.4). The default editor language that IRAF will start
+with is as shown above, chosen for compatibility with the host operating
+system. You may, of course, include a \usertype{set} command in
+your \filename{LOGIN.CL} file to establish your own preferred editor.
+
+The edit facilities provided within IRAF are limited in scope, since
+they are only intended to facilitate manipulation of user accessible
+internal structures, task parameter blocks and history file. IRAF
+has not implemented a full scale text editor, so the \usertype{edit}
+command invokes the standard system editor which you choose by setting
+the \usertype{editor} parameter.
+A host system editor must be used for all major text manipulations,
+but since it is invoked from within the IRAF environment the continuity
+of your session is not lost.
+
+In addition to selecting the editor language to be used, there are a few user
+settable options available to control the operation of the \taskname{eparam}
+and \taskname{ehistory} tasks. These options are set by setting the string
+values of the CL parameters \taskname{epinit} and \taskname{ehinit}.
+For example, setting the \taskname{verify} option for \taskname{ehinit}
+will cause the history mechanism to pause waiting for a command to be
+edited or inspected, before executing the command.
+Read the manual pages for the \taskname{eparam} and \taskname{ehistory} tasks
+for a full description of these control options.
+
+\subsection{The History Mechanism}
+
+\ppind
+The CL history mechanism keeps a record of the commands you enter and
+provides a way of reusing commands to invoke new operations with a minimum of
+typing. The history mechanism should not be confused with the logfile;
+the history mechanism does not make a permanent record of commands,
+and the logfile cannot be used to save typing
+(except by using the editor on it after the end of the session).
+With the history editor, previous commands can easily
+be edited to correct errors, without the need to retype the entire command.
+
+The \usertype{history} command is used to \emphasize{display} command lines.
+By default, the last 15 commands entered are printed, each preceded by
+the command number. To show the last \emphasize{n} commands,
+add the argument \usertype{n} to the \usertype{history} command line:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{history 3} \\
+\comptype{101 urand 200 2 \pipe graph po+ marker=circle szmarker=.03} \\
+\comptype{102 help graph \pipe lprint} \\
+\comptype{103 history} \\
+\comptype{cl>}
+\end{quotation}
+
+\noindent
+and note that this number (\emphasize{n}) will become the new default.
+If you ask for a negative number of commands (\emphasize{-n}),
+the default will not change.
+
+The \usertype{history} command allows previous command sequences to be
+displayed, but a related mechanism must be used to re-execute, or to
+edit and execute, commands. You can use the history file \emphasize{editor}
+by issuing the command \usertype{ehistory}. Once you are in the history editor,
+the cursor (arrow) keys can be used to move about in the history file. You
+may select any command and edit it using the simple edit commands described
+previously (\S 3.2.3) for the \taskname{eparam} task. Such functions as
+deletions and insertions of words or characters, delete to end of line, and
+a simple string search and replace capabilities are provided.
+The Appendix lists the full range of commands that are supported.
+The edited command is executed by hitting
+\key{RETURN}. Note that it is a \emphasize{new} command and, as such, it is
+appended to the history file. The current contents of the history file
+are not changed.
+
+It is possible to recall \emphasize{individual} commands and edit them;
+the special character `\upa' or the \usertype{ehistory} command may be
+used for this. Given the history record sequence shown above,
+any of the following commands could be used to fetch command 101:
+
+\begin{quotation}\noindent
+\begin{tabbing}
+\comptype{cl>} \usertype{\upa 101} \hspace{2cm} \= \#~fetch~command~101 \\
+\medskip
+\comptype{cl>} \usertype{ehist -3} \> \#~fetch~third~command~previous \\
+\medskip
+\comptype{cl>} \usertype{\upa ur} \> \#~fetch~command~starting~with~``ur'' \\
+\medskip
+\comptype{cl>} \usertype{ehist ?mark?} \> \#~fetch~command~containing~``mark''
+\end{tabbing}
+\end{quotation}
+
+The history command \usertype{\upa ur} finds the last command
+\emphasize{beginning} with the string ``ur'', while the command
+\usertype{ehist ?mark?} finds the last command \emphasize{containing} the
+string ``mark'' (the trailing `\usertype{?}' is optional if it is the
+last character on the line). A single `\upa' fetches the last command
+entered. Successive `\upa' commands
+will fetch the next preceding command lines from the history file.
+
+The selected command is echoed on the screen, with the cursor pointing at it.
+At that point, the command can be executed just by typing \key{RETURN},
+or it may be edited. The standard set of editor operations also apply
+when you edit a command in single line mode. Note that compound statements
+(those enclosed in pairs of braces~``\{~$\ldots$~\}'') are treated as a
+\emphasize{single} statement by the editor. Only one command line (which may
+be a compound statement) can be edited at a time with the history editor.
+
+Sometimes you will want to reuse the \emphasize{arguments} of a previous
+command. The notation `\upa\upa' refers to the \emphasize{first} argument
+of the last command entered, `\upa\$' refers to the \emphasize{last} argument
+of the command, `\upa$*$' refers to the whole argument list, `\upa0' refers
+to the taskname of the last command, and `\upa$N$' refers to argument
+\emphasize{N} of the last command entered. Thus,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{dir lib\$$*$.h,home\$login.cl} \\
+\comptype{cl>} \usertype{lprint \upa\upa}
+\end{quotation}
+
+\noindent
+displays a table of the files specified by the template, and then prints
+the same files on the line printer.
+
+One of the most useful features of the history mechanism is the ability to
+repeat a command with additional arguments appended. Any recalled command
+may be followed by some extra parameters, which are appended to the command.
+For example:
+
+\begin{quotation}\noindent
+\comptype{ut>} \usertype{urand 200 2 \pipe graph po$+$} \\
+\comptype{ut>} \usertype{\upa\upa title = '200 random numbers'} \\
+\comptype{urand 200 2 \pipe graph po$+$ title = '200 random numbers'}
+\end{quotation}
+
+\noindent
+in this case, the notation `\upa\upa' refers to the last
+\emphasize{command} entered.
+The notation is unambiguous because the `\upa\upa' appears at the start of
+the command line. Do not confuse it with the use of `\upa\upa' to reference
+the first argument.
+
+\subsection{Foreign Tasks}
+
+\ppind
+The foreign task mechanism provides an alternative to the OS escape mechanism
+for sending commands to the host operating system. The advantage of the
+foreign task mechanism is that it allows foreign commands to be made available
+within the IRAF environment just as if they were normal IRAF tasks.
+Such commands may be abbreviated, their output may be redirected or piped,
+the commands may be run in batch mode, and the argument list is parsed and
+evaluated by the CL, hence may contain any valid CL expression. Users should
+beware, however, that IRAF virtual filenames appearing in the argument list
+of a foreign task are not normally translated to their host equivalents, since
+IRAF knows nothing about the argument list of a foreign task
+(the \taskname{osfn} intrinsic function may be referenced in the argument
+list to explicitly perform the translation, if desired).
+
+To declare several foreign tasks with the same names in IRAF as in the host
+environment, use the following form of the \taskname{task} statement:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{task \$mail \$grep $=$ \$foreign}
+\end{quotation}
+
+\noindent
+This declares the new tasks \taskname{mail} and \taskname{grep} in the current
+package, whatever that may be. If the current package is subsequently exited,
+the task declarations will be discarded.
+
+To declare a foreign task with a more complex calling sequence, use the
+following form of the foreign task declaration:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{task \$who $=$ "\$show users"}
+\end{quotation}
+
+\noindent
+This example would be used on a VMS host to map the IRAF foreign task
+\taskname{who} to the VMS command \usertype{show users}. If there are
+any arguments on the command line when the task is called, they will be
+converted to strings and appended to the command prefix given.
+
+The \filename{LOGIN.CL} file contains a default \filename{USER} package
+containing examples of several foreign task statements which may prove
+useful on the local host. Users should feel free to modify or extend
+the \filename{USER} package, since it is provided with that in mind and
+provides a convenient structure for personalizing the CL environment.
+
+\subsection{Cursor Mode}
+
+\ppind
+Whenever an IRAF program reads the graphics or image display cursor,
+the cursor lights up or starts blinking, indicating that the user should
+position the cursor and type a key on the terminal to return the cursor
+position, keystroke typed, and possibly a character string entered by
+the user, to the calling program. The user may also read the cursor
+directly, just as a program would. For example, the command
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{$=$gcur}\\
+\smallskip
+\comptype{345.21 883.13 1 r}
+\end{quotation}
+
+\noindent
+would read the graphics cursor, printing a cursor value string such as that
+shown noting the world coordinates of the cursor, the world coordinate system
+(WCS) of reference, the keystroke typed to terminate the cursor read, and
+the string entered by the user if the key typed was \usertype{:} (colon).
+
+The CL is said to be in \emphasize{cursor mode} whenever the CL is waiting
+for the user to type a key to read a cursor. Cursor mode reserves the upper
+case keystrokes for itself, providing all sorts of useful functions to the
+user via the reserved keystrokes. For example, the graphics display can be
+zoomed or panned, a hardcopy of the current screen can be made on a hardcopy
+device, or the screen can be saved in or restored from a graphics metafile.
+For more information on cursor mode, type \usertype{help cursors} while in
+the CL.
+
+\subsection{Background Jobs}
+
+\ppind
+The CL provides facilities for manipulating and displaying data and
+allows interactive development and use of data analysis functions. However,
+many fully developed image analysis scenarios are very time consuming
+and need not be run interactively. IRAF allows such functions to
+be developed interactively and then processed in a batch mode as
+a background task, thus freeing the terminal for other interactions
+once the background tasks have been started. Several
+background tasks can be running at once, and these may be identical
+tasks that are just operating on different data sets.
+
+Any command, including compound commands that may involve calls to several
+tasks, may be executed in the background by appending the ampersand character
+`\&' to the end of the command block. The CL will create a new control
+process for the background job, start it, display the job number of the
+background job, and return control to the terminal.
+Background job numbers are always small integers in the range 1 to n,
+where n is the maximum permissible number of background jobs (typically 3-6).
+
+\begin{quotation}\noindent
+\comptype{pl>} \usertype{contour m92 dev=stdplot \&} \\
+\comptype{[1]} \\
+\comptype{pl>}
+\end{quotation}
+
+\noindent
+If a task runs to completion, and if the CL \irafname{notify} parameter
+is enabled (the default), the message
+``\comptype{[n] done}'' will be printed on your
+terminal when the task completes.
+
+Jobs running in the background may use all of the commands and
+perform any of the operations that interactive tasks can, but
+extensive user interaction with background jobs is necessarily
+somewhat limited (and not too appropriate).
+Another difference is that background jobs \emphasize{do not} update
+parameter \filename{.PAR} files. This is done to minimize the
+confusion that could occur if a background job asynchronously
+updated the parameter set for a task that was running interactively,
+or vice versa. The implication of this is that parameter values that
+are to be output by a task running in the background must be explicitly
+written into a file if they are to be available outside that job.
+Parameters passed between tasks in the same job are still processed
+correctly.
+
+If the background job writes to the standard
+output, and the standard output has not been redirected, the output of
+the background job will come out on your terminal mixed in with the output
+from whatever else you are doing. Since this is generally not desirable, the
+\filename{STDOUT} (and \filename{STDERR})
+for the background job should probably be redirected to a
+file and perused at a later time. The following example computes image
+statistics and directs these, and any error messages, to the file
+\filename{STATS.TXT}:
+
+\begin{quotation}\noindent
+\comptype{im>} \usertype{imstatistics m87 $>$\& stats.txt \&} \\
+\comptype{[2]} \\
+\comptype{im>}
+\end{quotation}
+
+If during the processing of a background job, the job finds it necessary to
+query for a parameter, the message
+
+\begin{quotation}\noindent
+\comptype{[1] stopped waiting for parameter input }
+\end{quotation}
+
+\noindent
+will appear on your terminal. It is not necessary to respond to such a
+request immediately; when a convenient point is reached, respond with:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{service 1}
+\end{quotation}
+
+\noindent
+The prompt string from the background job will be printed, just as if
+you were running the job interactively. Respond to the query and the
+background job will continue executing. If you do not respond to the request
+for service from a background job, it will eventually time out and abort.
+
+More control over the disposition of a batch job is possible by appending
+optional arguments to the \usertype{\&} at the end of the command line,
+when the job is submitted. The default action if no arguments are appended
+is to run the job as a subprocess of the CL, at a priority level one less
+than the CL, with output coming to the terminal unless redirected.
+To run the job as a subprocess at a specific priority, a numeric string
+specifying the \emphasize{host dependent} priority level may be added after
+the \usertype{\&}. For example,
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{bigjob \&4}
+\end{quotation}
+
+\noindent
+will submit the job at host priority level 4. The priority level may also
+be specified relative to the CL priority in a machine independent way,
+e.g., \usertype{\&-1} will submit the job at a priority level one notch
+down from the current CL priority (this is the default).
+
+On systems which support batch queues (e.g., VMS) jobs may also be submitted
+to a batch queue. To submit a job to a batch queue, simply add the name of
+the queue after the \usertype{\&}, e.g.:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{bigjob \&fast}
+\end{quotation}
+
+\noindent
+will submit the job to the "fast" queue. IRAF supports three logical batch
+queues, the \usertype{fast} queue, for short jobs to be run at a high priority,
+the \usertype{batch} queue, for medium size jobs, and the \usertype{slow}
+queue, for big jobs that may run a long time. The host system name of the
+desired queue may also be given. If a big job is submitted to a high priority
+queue it will be killed by the system when it exceeds the maximum quota
+permitted for that queue; see your system manager for more information on
+the batch queues supported by your system.
+
+Sometimes it is desirable to wait for a background job to complete before
+resuming interactive work. For example, you might reach a point where
+you cannot proceed until the background job has finished writing a file.
+The \usertype{wait} command is used to wait for currently running
+background tasks to complete.
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{wait 1; beep}
+\end{quotation}
+
+\noindent
+will halt the interactive session until background job 1 completes. Issuing
+a \usertype{wait} command without a job number will cause the interactive
+session to wait for \emphasize{all} background jobs to complete.
+
+In order to discover the status of all background jobs that you
+have running, the command:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{jobs}
+\end{quotation}
+
+\noindent
+may be used. The job number will be displayed along with information
+about the command that was used to start the job.
+The command \usertype{spy v} may also be used. It will request the host
+operating system to display the processor status (in an OS-dependent form),
+including information on the status of all processes running on the system.
+
+There are important differences in the behavior of background jobs on different
+IRAF host systems. Under UNIX, the background tasks are independent of
+activities that may (or may \emphasize{not}) be going on interactively.
+UNIX users may terminate their IRAF session and even logoff the UNIX system
+altogether, and the background jobs will continue merrily along.
+In the VMS implementation of IRAF, background jobs may run either as
+sub-processes or as regular VMS batch jobs in one of the system wide batch
+queues. The default is to run background jobs as sub-processes, in which
+case the jobs will be killed if you log out of VMS (even if you have DETACH
+priviledge). Under \emphasize{both} systems, once the interactive CL session
+is terminated, communication with still-running background jobs
+\emphasize{cannot} be re-established, even by re-entering the CL.
+
+\subsection{Aborting Tasks}
+
+\ppind
+Any interactive task may be aborted by typing the interrupt sequence
+\key{CTRL/C}.
+Control will return to the point at which the last interactive command was
+entered. When an IRAF program run from the CL is interrupted, it will
+usually perform some cleanup functions, deleting partially written files and
+so on. If an error (or another interrupt) should occur during error recovery,
+IRAF will issue the following message:
+
+\begin{quotation}\noindent
+\comptype{PANIC: Error recursion during error recovery}
+\end{quotation}
+
+\noindent
+A panic abort is usually harmless, but may result in some half-written
+dregs of files being left behind. A more serious problem occurs when
+a subprocess becomes hung (uninterruptable). Repeatedly interrupting the
+CL when this occurs will eventually cause the CL to give up and shut down,
+necessitating a restart. A quicker solution might be to use the host system
+facilities to forcibly kill the subprocess.
+
+The \usertype{kill} command may be used to abort a background job. The
+argument is the logical job number printed by the CL when the background
+job was spawned. (It may also be a list of jobs to be killed.)
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{kill 1} \\
+\medskip
+\comptype{cl>} \usertype{kill 1 3}
+\end{quotation}
+
+In systems that support batch queues as well as sub-processes,
+the \usertype{kill} command may be used to control these as well.
+
+%#########################
+\newpage
+\thispagestyle{empty}
+
+\begin{center} \vspace*{1in}
+\large NOTE
+\end{center}
+\vskip 1cm
+\rm
+
+The remainder of this document is from the original draft and has not yet
+been brought up to date and may contain minor inaccuracies or omissions.
+
+\newpage
+\section{The CL as a Programming Language}
+
+All of the examples that have been presented thus far treat the use
+of the CL as a \emphasize{command language} for running existing tasks.
+The CL can also be used as a high-powered desk calculator, one that
+can operate on and display arrays of data as well as scalars;
+and that can be fully programmed.
+The following sections introduce the programming oriented functions
+that are provided in the CL as background for understanding
+the creation of new user tasks.
+
+Extensive use of the CL as a programming language has not been heavily
+emphasized, because there are substantial performance penalties
+associated with the use of interpreted languages, especially when
+dealing with large amounts of data. At the same time, the availability
+of an interactive environment that allows easy exploration of
+alternative analysis scenarios is very attractive, since it largely
+does away with the typical development cycles of edit; compile; link;
+test; edit; compile; $\ldots~$. Interactive development provides
+immediate, possibly visual, feedback about the effect of the various
+analytical tools upon your data.
+
+Before delving into the details of the language however, a comment is in
+order regarding the distinction made in the CL between
+\irafname{command mode} and \irafname{program mode}.
+\emphasize{Modes} in user interfaces are not in vogue
+because of the potential source of confusion, the "How does that command
+work now?" problem. IRAF is a little schizoid in this regard because of the
+desire for convenient user commands on the one hand: (to minimize
+the need for specific command parameter delimiters,
+quotes around character strings and special handling of
+file names and meta-characters); and the desire for
+a familiar language syntax for programming type activities on the other.
+
+To resolve this dilemma, the CL has two modes: \irafname{command mode} -
+which is the default and is used for most terminal interactions; and
+\irafname{program mode} - which is:
+
+\begin{itemize}
+\item Entered within the body of a procedure.
+\item Entered within parenthesized expressions.
+\item Entered on the right-hand side of an equal sign ('=').
+\end{itemize}
+
+\noindent
+The syntax of the CL2 programming language was chosen to be as
+compatible as possible with SPP, the portable language in which
+most of IRAF is written.
+
+Aspects of the command/program dichotomy have
+already crept into the discussions of identifiers, which are treated
+as character strings in command mode (\S 4.3.1), but which will be
+evaluated as a parameter name if thay are enclosed in parentheses.
+In the same vein, when inserted in a parenthesized expression,
+an identifier that is handled as a character string
+in command mode will be treated as a variable name unless it is quoted.
+
+In program mode there is a simple disambiguating rule that can be safely
+used: always quote character strings and always parenthesize expressions.
+While this resolves the ambiguity it is not likely to be too popular
+with most users, who typically choose a minimum entropy approach.
+In the following sections, where programming issues come under
+discussion, programming mode will be assumed as the default.
+
+\subsection{Expressions in the CL}
+
+The CL has a conventional modern expression syntax (borrowed heavily
+from C and Ratfor) which should feel familiar to most
+users. The following operators are provided, presented in order of
+precedence:
+
+\begin{tabular}{ll}
+{\it Operator} & {\it Action} \\
+
+$**$ & exponentiation \\
+$*, /$ & the usual arithmetic operators \\
+$+, -$ & and the rest of them in precedence order \\
+$//$ & string concatenation \\\
+\&, {\tt ||} & and, or \\
+! & not \\
+$<$, $<=$ & less than, less than or equals \\
+$>$, $>=$ & greater than, greater than or equals \\
+$!=$, $ ==$ & not equal, equal (2 equal signs)
+
+\end{tabular}
+
+\noindent
+Parentheses may be used to alter the default order of evaluation of an
+expression. Quotes are not optional in expressions or anywhere inside
+parentheses; identifiers are assumed to be the names of parameters and
+strings \emphasize{must} expressly be quoted using either single
+or double quotes.
+
+The data types supported by the CL
+are \emphasize{boolean, integer, real, char}, and several exotic types
+(\emphasize{imcur, gcur,} and \emphasize{file}) that are touched upon
+later in this section. Observe that although the CL has \emphasize{no}
+complex datatype, operations on complex data is supported in the rest
+of the IRAF system, including the \irafname{SPP} language and
+interface libraries.
+Arrays of the regular data types of up to seven dimensions are supported.
+Explicit type conversion is implemented with the intrinsic functions
+\emphasize{int, real}, and \emphasize{str},
+the last converting an argument of any data type into a string.
+Mixed-mode expressions involving integers and reals are permitted,
+the data type of the result is promoted to the type of the target
+of the assignment operator.
+
+The CL provides a special statement, called the \emphasize{immediate}
+statement, for evaluating expressions
+and printing the value at the terminal. The form of the statement
+is an expression preceded by an equals sign:
+
+\begin{quotation}\noindent
+= {\it expression}
+\end{quotation}
+
+\noindent
+or, if you prefer, the more conventional and more general \usertype{print}
+command can be used with the same results:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{print (}{\it expression} [, {\it expression},
+ $\ldots$ ] \usertype{)}
+\end{quotation}
+
+\subsection{CL Statements and Simple Scripts}
+
+This is not a language reference manual; nonetheless,
+you will find it helpful to understand a few of the more useful
+types of statements provided in the CL.
+We will not attempt to present a
+complete definition of the syntax of the command language,
+a compendium of basic statement types is listed in the Appendix.
+The preceding section introduced two statements,
+the \emphasize{immediate} statement and the \emphasize{print} statement.
+The \emphasize{assignment} statement should also be familiar from
+previous examples.
+
+Often we do not want simply to assign a value to a parameter,
+but rather we want to increment, decrement, or scale one.
+These operations can all be performed with assignment statements
+in the CL, using the assignment operators \pluseq, \minuseq, \timeseq,
+\diveq, and \concateq. For example, to increment the
+value of a parameter, we could use the \pluseq~ assignment statement:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{y \pluseq {} (x $**$ 2)}
+\end{quotation}
+
+This statement increments the CL parameter \usertype{y}
+by the value of the expression \usertype{(x$**$2)}. The same
+operation could also be done with the next statement, but with some
+small increase in typing effort.
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{y = y $+$ (x $**$ 2)}
+\end{quotation}
+
+\noindent
+The advantage of having a shorthand notation becomes obvious
+when you contemplate doing arithmetic on a fully specified
+parameter name as in the next examples.
+
+\subsubsection{Assigning Values to Task Parameters}
+
+The assignment statement may be used to set the value of a parameter
+or a variable.
+Most parameters are local to some task, and a ``dot'' notation may
+be used to unambiguously name both the task and the parameter.
+Thus, the statement:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{delete.verify = yes}
+\end{quotation}
+
+\noindent
+may be used to set the value of the \taskname{verify} parameter
+belonging to the task \taskname{delete}. Since verify is a hidden
+parameter, direct assignment is the only way to permanently change
+this option setting.
+
+The task \taskname{delete} belongs to the \taskname{system} package.
+Since IRAF permits several packages to be loaded at the same time,
+if there happened to be another task named \taskname{delete} in the
+search-path, we would have to specify the package name as well to make
+the assignment unambiguous:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{system.delete.verify = yes}
+\end{quotation}
+
+\noindent
+In the unfortunate situation of two tasks with the same name in different
+packages, we would also have to specify the package name explicitly
+just to be able to \emphasize{run} the task:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{system.delete {\it files}}
+\end{quotation}
+
+\noindent
+In most cases such name collisions will not occur.
+
+The ability to have
+the same task names in more than one package has some very positive
+benefits however, in that a new package of tasks that has the
+same calling conventions as a standard one may be readily inserted
+in the search path. This allows new algorithms to be tested without
+impacting the standard system, and also provides the hooks whereby
+alternate implementations of existing functions (using an array processor
+for instance) can be dynamically linked into the system.
+
+\subsubsection{Control Statements in a Script Task}
+
+The CL provides \emphasize{if, if else, while, for, next}, and
+\emphasize{break} statements for controlling the flow
+of execution in a command sequence. These statements
+are quite useful for writing control loops at the command
+level. Other control statements (\emphasize{case, switch,} and
+\emphasize{default}), which may be familiar from C or RATFOR,
+are also provided to ease the programming effort.
+By way of example, to print the values of the first ten powers
+of two the following statements can be used:
+
+\begin{quotation}\noindent\comptype{
+cl> i=1; j=2\\
+cl> while (i $<=$ 10) \{\\
+>>> print (j)\\
+>>> j \timeseq {} 2\\
+>>> i \pluseq {} 1\\
+>>> \}}
+\end{quotation}
+
+\noindent
+The second of these two statements is a compound statement;
+note that the prompt has changed to \comptype{>>>} to indicate this.
+
+Consider the parenthesized argument list in the \usertype{print}
+command in the above loop.
+If the parameter (\usertype{j} in this example) were not enclosed in
+parentheses, the CL would interpret it as a string rather than a parameter,
+and would erroneously print ``\comptype{j}'' each time through the loop.
+Remember that the CL will interpret identifiers as a string if found
+outside parentheses, but as the name of a valid parameter or variable
+inside parentheses. If the CL cannot find the identifier in its
+dictionary an error message will be issued.
+To avoid nasty surprises like this, one should \emphasize{always}
+parenthesize argument lists in loops and within script tasks, and
+make a habit of explicitly quoting items that are to be treated as
+strings.
+
+The example uses the built-in CL variables \usertype{i}
+and \usertype{j}. A number of variables are provided in the CL for
+interactive use; the integer variables provided with the CL
+are \usertype{i,j,k}; the real variables are \usertype{x,y,z};
+the string variables are \usertype{s1,s2,s3}; the booleans are
+\usertype{b1,b2,b3}; and a list-structure pointer called
+\usertype{list} is also provided.
+The CL also has the ability to define new variables interactively;
+which is discussed in section \S 6.4.
+
+\subsection{Intrinsic and Builtin Functions}
+
+The usual Fortran intrinsic functions
+(with the exception of the hyperbolic and complex functions)
+are provided in the CL, along with some others specific to IRAF.
+The other intrinsic and builtin functions are those like
+\usertype{set}, \usertype{if}, \usertype{while}, \usertype{case};
+the data declaration and initialization statements; and the
+task and I/O control statements that are described throughout
+the body of this document, and are listed in Appendix A. The intrinsic
+functions \emphasize{must} be used in a statement where the returned
+value is explicitly assigned or output in some way.
+To compute (and display) the value of \usertype{sin(x)}:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{= sin(x)}
+\end{quotation}
+
+\noindent
+must be entered, just typing \usertype{sin(x)} by itself is an error.
+The names of intrinsic functions may be used in other contexts, e.g. as
+parameter names, but care is needed to avoid confusion.
+
+\begin{tabular}{lll}
+{\it Function} & {\it Action} & {\it Example} \\
+ abs & absolute value & z = abs(x) \\
+ atan2 & arctangent & r = atan2(y, x) \\
+ cos & cosine & x = cos(r**2) \\
+ exp & exponentiation & z = exp(3) \\
+ frac & fractional part of a number & i = frac(y) \\
+ int & convert input to integer & j = int(z*3) \\
+ log & natural logarithm of a number & x = log(z) \\
+ log10 & base 10 logarithm of a number & y = log10(x) \\
+ max & maximum value from input & x = min(1,17.4,43) \\
+ min & minimum value from input & y = max(47,11,92.3) \\
+ mod & modulus & z = mod(x, {\it base}) \\
+ radix & radix to any base & y = radix(x, {\it base}) \\
+ real & convert input to real & x = real(i) \\
+ sin & sine & y = sin(3*r) \\
+ sqrt & square root & z = sqrt(x**2 + y**2) \\
+ str & convert input to a string & s1 = str(num) \\
+ stridx & index of character in string & i = stridx(s1, 'abc') \\
+ substr & select substring from string & s1 = substr(s2, 3, 7) \\
+ tan & tangent & x = tan(2*theta)
+\end{tabular}
+
+As examples of the use of these functions, try entering the following
+expressions and see if you can predict the results
+(the next sections have the clues):
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{= (sin(.5)$**$2 + cos(.5)$**$2)} \\
+\smallskip
+\comptype{cl>} \usertype{= 2 / 3.} \\
+\smallskip
+\comptype{cl>} \usertype{= (mod (int(4.9), 2) $==$ 0)} \\
+\smallskip
+\comptype{cl>} \usertype{= 'map' // radix (512, 8)} \\
+\smallskip
+\comptype{cl>} \usertype{= delete.verify}
+\end{quotation}
+
+\noindent
+You may have been surprised that the result of the last example was
+\comptype{no}. This is because \usertype{verify} is a boolean
+parameter which can only take on the values \emphasize{yes} and
+\emphasize{no}.
+
+\irafname{CL++} \\
+All of the intrinsic functions in IRAF return a value, the builtin
+tasks currently do not. With the completion of changes to the CL
+that are now in progress, intrinsics and builtin tasks, and any user defined
+functions or tasks may return an optional value. Tasks can thus be
+called either in the FORTRAN 'subroutine' style or in the 'function'
+style, where a value is expected. If a task returns a value that is
+not assigned to a variable it will be silently ignored.
+
+\subsection{Defining New Variables and Parameters}
+
+The CL provides a default set of variables that can be used for scratch
+computations, and you may declare other variables as needed.
+Each task that is invoked, whether it is a CL script task
+or an external executable task, may have input or output parameters
+associated with it, and these may be defined within the package for the
+task or as part of the task itself. Data declarations
+for variables contain the item name and type information,
+and may also contain an optional initialization clause. Declarations
+for function parameters are identical to those for variables, but they
+may contain optional fields to specify prompt strings, to define a valid
+data range, or to enumerate a list of valid values.
+
+The simplest data declarations define local or global variables.
+The statement:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{int int\_var}
+\end{quotation}
+
+\noindent
+defines a simple integer variable. If this command is entered at the root
+(\comptype{cl>} prompt) level, it will define a variable that is globally
+accessible to any other task that is executed. When the same statement
+is incorporated into the body of a script task (after the \usertype{begin}
+statement), it will define a local variable visible only to that script task or
+to any other task that is called by that script task. Variables declared within
+the body of a package definition are globally available to all tasks
+within that package, but will be removed from the set of
+addressable variables when that package is unloaded.
+
+User-defined variables may be used just like any standard IRAF
+variables: in expressions, passed as parameters to
+other tasks, or displayed in a variety of ways. In addition,
+these variables may be initialized when they are declared:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{real e = 2.71828183 }
+\end{quotation}
+
+\noindent
+establishes a real variable and assigns it an initial value.
+This variable may be treated like a constant (as in this case)
+or may be re-assigned another value during the course of computations.
+
+The formal \taskname{parameters} for a task must be defined if the CL
+is to provide any of the range checking or input prompting activities.
+In the absence of a declaration, or if one is provided that
+does not define these optional fields, only the name of the parameter
+will be used for prompting and no range checking can be performed.
+The simplest case of a \emphasize{parameter} declaration looks just like the
+simple variable declaration shown above; but it must
+occur within a task body \emphasize{before} the \usertype{begin} statement,
+or define a parameter that is named in the calling list for a task.
+
+The syntax of a data declaration statement is:
+
+\begin{quotation}\noindent
+\begin{tabular}{lll}
+\comptype{cl>} {\it type} & [{\it = initializer} [,{\it initializer}] $\ldots$ ] \\
+ & \{ \\
+ & [{\it initializer} [,{\it initializer}] $\ldots$ ] \\
+ & [{\it opt\_field=value} [,{\it opt\_field=value}] $\ldots$ ] \\
+ & & \}
+\end{tabular}
+\end{quotation}
+
+\noindent
+where the valid data types for these declaration statements are shown in
+the following table:
+
+\begin{tabular}{ll}
+{\it Data Type} & {\it Explanation} \\
+int & integer (scalar and array) \\
+real & double precision floating point (scalar and array) \\
+char & character strings (scalar and array) \\
+bool & boolean, yes/no (scalar and array) \\
+file & file name \\
+struct & special form of mutli-token string \\
+gcur & graphics cursor struct \\
+imcur & image cursor struct
+\end{tabular}
+
+Most of these data types should be familiar to you, but the IRAF
+\irafname{struct} is a special class of data element that is used to
+hold multi-token strings, mostly for input. It will be referred to again
+in the section on I/O facilities in the CL (\S 6.8). \irafname{Gcur}
+and \irafname{imcur} are both structs that return a multi-token result,
+namely a string with RA, DEC and a data value. List structured parameters,
+which are described in section \S 6.9 are typically declared as
+structs.
+
+The optional fields in a data declaration are used to define the data
+ranges for checking, prompt strings, special file type information,
+or a list of enumerated items.
+Syntactically, the specification of these optional fields is treated
+like a special form of initialization; the valid field names are
+described in the following table.
+
+\begin{tabular}{ll}
+{\it Field Name} & {\it Explanation} \\
+mode & auto, query, hidden processing modes \\
+min & minimum value for range checking \\
+max & maximum value for range checking \\
+enum & enumerated list of valid responses (mutex with min/max) \\
+prompt & prompt string for undefined values \\
+filetype & r, rw, w, x file type specification
+\end{tabular}
+
+\noindent
+All of these fields are optional, the \irafname{mode} defaults to
+\irafname{auto}; \irafname{min/max} range checking defaults to NULL;
+and \irafname{filetype}, which is valid only for files, defaults to
+read only (\irafname{'r'}). The enumerated type (\irafname{enum}),
+which names the specific responses that are acceptable, is
+mutually exclusive with range checking, which defines a continuum
+of values that will be accepted.
+
+To declare an integer parameter, enable range checking for positive
+values and provide a prompt string, use:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{int new\_parm \{ min=0, prompt='Positive integer' \} }
+\end{quotation}
+
+\noindent
+and as an example of an
+enumerated list of valid input values, consider:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{char color \{enum = 'red \pipe green \pipe blue'\} }
+\end{quotation}
+
+\noindent
+which defines a default length character string that is initially undefined
+and that has an enumerated list of three valid input values.
+If you attempt to use the variable \usertype{color} before a value has
+been assigned to it, you will be prompted for a value.
+If you try to assign it a value other than one of those that
+are enumerated, an error is reported.
+
+\subsection{Declaring Array and Image Data}
+
+Variables and task parameters may be defined as arrays of any of the
+data types: int, real, char or bool. Arrays may have up to seven dimensions.
+Array and image data will be referenced identically in the future,
+but for now there
+are some differences that are worth noting. Images are treated
+as large arrays of data that are stored on disk,
+and it is the amount of data to be
+processed that determines the choice of storage mechanism. Images
+will typically be quite bulky; it is not unusual for a single image
+scene to involve five to ten megabytes of data. For this reason, image data
+are most efficiently stored in disk files, and operations upon the
+data are performed by buffering it into memory as needed. The
+\emphasize{main difference} between an array of data and an image is that
+the image will be buffered on disk.
+
+IRAF provides a default \filename{IMDIR} directory that may be used for
+bulk image file storage by all users, but it also has facilities that
+manage the storing, copying, and accessing of such data sets for users who
+wish to store this sort of data in their own directories.
+The logical directory \filename{IMDIR} is where the IRAF system will store
+your image data \emphasize{by default}. IRAF images will appear to be created
+in your local user directory, but in fact it is only the \irafname{image
+header file} which goes there. The bulk pixel data are
+put in a second file that is part of a temporary files
+system, configured and managed with large datasets in mind. Such
+\irafname{pixel storage files} are transparent to the user, but if you have a
+great deal of data, you may find it more efficient to set up your own directory
+on a temporary files system, and to redefine \filename{IMDIR} accordingly.
+If one has a personal \filename{IMDIR}, it is also convenient to save data on
+tape and later restore it to disk; the header files are usually small
+enough so that they need not be archived if the data is going to be restored
+within a week or two.
+
+To declare an integer array of length 100, type:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{int iarray[100] = 100(0)}
+\end{quotation}
+
+\noindent
+which also initializes the array \usertype{iarray} to zero. A two dimensional
+array with data range checking can be specified by:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{real rarray[50, 50] \{ min=0, max=100 \} }
+\end{quotation}
+
+\noindent
+This array could be defined as an image by using the following declaration
+to indicate the different \emphasize{storage class} of the data:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{real image rarray[50, 50] \{ min=0, max=100 \} }
+\end{quotation}
+
+\noindent
+where the data in this example would be stored on disk.
+
+The choice of whether data is to be stored
+in an array which is stored entirely in memory,
+or as an image on disk is up to the user.
+The choice should be predicated upon the
+amount of data that is to be manipulated, since speed and efficiency
+of operation will be better using the image mode for data arrays
+much larger than a few hundred items. At present, the
+statements that manipulate these two data forms are somewhat different,
+as is explained in the following section.
+
+During the development of IRAF, the handling of images has
+been a prime concern, representing as it does the major computational
+and I/O load that must be accomodated. Image files currently
+may be created on disk, and there are image processing functions that
+know how to process this class of data. The IRAF packages
+\taskname{images, imred}, and \taskname{plot} currently
+handle image data.
+The specification of this processing is similar, but
+not identical to, the operations performed on array data.
+The next section discusses use of image data and arrays within the CL.
+
+\irafname{CL++} \\
+At the present time the \irafname{IMIO and DBIO} subroutine libraries
+are still undergoing design and enhancement. As a result of this effort,
+the processing of image type data is not yet in final form. Existing IRAF
+packages do support image processing and display
+functions and these will appear to be functionally the same after the
+development has been completed. The SDAS packages also support image
+processing and display functions, but at this point in time the disk
+format of these two types of data is vastly different,
+and on this interim system, data from these two packages
+cannot easily be mixed. This incompatibility is to be rectified when
+the completed \irafname{IMIO and DBIO} libraries are available.
+
+\subsection{Processing of Image Sections}
+
+All IRAF programs which operate upon images may be used to operate on
+the entire image (the default) or any section of the image.
+A special notation is used to specify \irafname{image sections}. The section
+notation is appended to the name of the image, much like an
+array subscript is appended to an array name in a conventional programming
+language. Note that array or image section \emphasize{index references}
+are integer only, but that the data may be of any valid type.
+
+\begin{quote}
+\begin{tabular}{ll}
+{\it section}& {\it refers to}\\
+\\
+pix& whole image\\
+pix[]& whole image\\
+pix[i,j]& the pixel value (scalar) at [i,j]\\
+pix[$*$,$*$]& whole image, two dimensions\\
+pix[$*$,-$*$]& flip y-axis\\
+pix[$*$,$*$,b]& band B of three dimensional image\\
+pix[$*$,$*$:s]& subsample in y by S\\
+pix[$*$,l]& line L of image\\
+pix[c,$*$]& column C of image\\
+pix[i1:i2,j1:j2]& subraster of image\\
+pix[i1:i2:sx,j1:j2:sy]& subraster with subsampling
+\end{tabular}
+\end{quote}
+
+\noindent
+In the following examples, please note that the references to image
+sections are all enclosed in quotes. These are \emphasize{required}
+by the present language syntax. As the note at the end of this
+section indicates, this rule is to be relaxed in future.
+
+A limited set of coordinate transformations may be specified using image
+sections, but please observe that transpose is \emphasize{not} one of them.
+The ``match all'' (asterisk), flip, subsample, index, and range notations
+shown in the table may be combined in just about any way that makes sense.
+As a simple example:
+
+\begin{quotation}\noindent
+\comptype{pl>} \usertype{graph 'pix[$*$,10]'}
+\end{quotation}
+
+\noindent
+will graph line 10 of the image \usertype{pix}.
+To generate a contour plot of an 800-pixel square image
+subsampled by a factor of 16 in both dimensions:
+
+\begin{quotation}\noindent
+\comptype{pl>} \usertype{contour 'pix[$*$:16,$*$:16]'}
+\end{quotation}
+
+\noindent
+To display the fifth $x-z$ plane of a three dimensional image named
+\usertype{cube}:
+
+\begin{quotation}\noindent
+\comptype{im>} \usertype{display 'cube[$*$,5,$*$]', 1}
+\end{quotation}
+
+\noindent
+on frame 1 of the image display device.
+
+\irafname{CL++} \\
+The image processing sections of IRAF are undergoing further development,
+as was noted in the previous section. Currently only image data
+can be processed as shown in the previous examples. Future developments
+will remove the need for quoting the section specifications that identify
+the image portion to be operated upon. The functional specifications
+will not change substantially, nor will the syntax itself be changed
+in any important way, but the need to remember to quote image section
+references will be removed. Image data will continue to be
+stored on disk and passed among tasks by passing the \emphasize{name}
+of the file rather than passing the data itself, as a matter of efficiency.
+
+\subsection{Array Processing in the CL}
+
+The processing of \emphasize{array} data is handled directly in the CL,
+and data arrays may also be passed to script tasks and external tasks. The
+entire array will be passed, since the CL cannot yet handle passing of
+sub-arrays to other tasks. The operations on arrays are handled via
+implicit looping over the array expressions, and only some of the
+operations described in the previous section on image data are valid
+for array data. References to array data sections need not be quoted
+however, and the syntax is otherwise identical to that supported for
+images.
+
+Given the declaration:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{real a[10], b[20], c[10,20], d[10,20,30], e[10,10]
+}
+\end{quotation}
+
+\noindent
+the following expressions are legal:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{c = 10} \hfill \#~sets~all~elements~of~c~to~10 \\
+\comptype{cl>} \usertype{a = c[*,1]} \hfill \#~copies~row~1~of~c~into~a \\
+\comptype{cl>} \usertype{= b} \hfill \#~prints~all~values~of~b \\
+\comptype{cl>} \usertype{a = b[1:10] } \hfill \#~copies~subrange~of~b~into~a \\
+\comptype{cl>} \usertype{c = d[*,*,1] }
+\end{quotation}
+
+\noindent
+and the following expressions are illegal:
+
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{a = c} \hfill \#~different~dimensionalities \\
+\comptype{cl>} \usertype{a = c[1,*]} \hfill \#~different~limits~on~assign \\
+\comptype{cl>} \usertype{a = b[11:20]} \hfill \#~different~limits
+\end{quotation}
+
+In general, for an expression to be a legal array expression in the
+CL, all array references must either be completely specified
+(i.e. \usertype{d[1,2,3]}), or they must loop over the same set of indices
+(i.e. \usertype{a = b[1:10]}). Indices may be
+specified as just the identifier (\usertype{a} or with an
+asterisk as the index (\usertype{b[*]}), indicating the entire array;
+or as a subrange specified by \emphasize{integer constants} separated
+by a colon (\usertype{c[3:5]}).
+
+\irafname{CL++} \\
+Future developments in the CL will eliminate most of the restrictions
+on array operation in the CL and will bring the syntax for operations
+on images and arrays into complete alignment.
+
+\subsection{Input and Output within the CL}
+
+The CL provides I/O processing for parameters, cursor input and graphics
+output, and controls communications to external tasks. The communications
+that appear at the terminal in the form of prompts for parameters,
+error messages, data range checking queries, and much of the other I/O
+is performed in ASCII for portability considerations. The data items that
+a user can input in response to a prompt may be:
+integer values; floating point numbers, with or without exponent;
+yes/no responses for boolean data; or character strings as appropriate.
+
+Image data and other bulk data forms that are processed by the various
+functions are typically \emphasize{not} passed through
+the CL itself, instead the names of the files are passed about, and
+temporary files are dynamically created as needed to hold intermediate
+results of computations. Cursor input from graphics and image devices
+are passed directly through the CL however, in order that they may be
+re-directed to a file like any other I/O stream. The \irafname{imcur} and
+\irafname{gcur} structs are used to handle this type of data.
+
+As was mentioned in \S 2.4 and in the section on I/O and pipes (\S 3.3)
+the CL communicates via its standard input and output,
+which are ASCII streams normally connected to the terminal. The
+CL functions that manipulate these streams can also be used on
+data in a file, just as the CL itself can be driven with commands
+from a file. The control files are all ASCII
+data streams, with no implied structure, and thus are easy to construct
+and to edit, should that be necessary.
+
+The \irafname{scan} and \irafname{fscan} functions are provided
+in the CL to process ASCII input streams;
+the only distinction between them is that \usertype{scan} operates
+on the terminal input stream (or its re-directed source) and
+\usertype{fscan} specifically operates on an file. \usertype{Scan} reads
+from the terminal (there is no prompt) and returns the first token it
+finds in its input stream; where a token is understood to be any string
+of alphanumeric characters delimited by a blank. Quotes are ignored
+and no other punctuation has any special meaning. If a \key{CTRL/Z}
+is entered EOF is signalled and the following
+print statement will not be executed.
+
+\begin{verbatim}
+cl> if (scan (s1) != EOF)
+>>> print (s1)
+>>> else
+>>> return
+\end{verbatim}
+
+The \usertype{print} command takes whatever is passed it as a parameter
+and displays it on the terminal, so the previous example does a simple
+one-line \emphasize{echo} function of input to output. The argument to
+\usertype{scan} in this example is the character variable \usertype{s1},
+but it could as easily be an integer:
+
+\begin{verbatim}
+cl> while (scan (i) != EOF)
+>>> print ("Input was a ", i)
+\end{verbatim}
+
+\noindent
+This in-line script will continue looping, reading from the input and
+echoing to the output, until EOF is signalled. All valid numeric inputs
+will be accepted; real input values will be truncated to integers;
+character constants (single characters) will be processed as though
+\usertype{int} had been called; and any invalid input values will
+be silently ignored. \usertype{Print} shows another of its features,
+that string constants may be directly inserted into the output stream
+and that \emphasize{no format} specifications need be made.
+
+The I/O functions can be used to process more than one data element
+at a time, with no need for explicit formatting. If more data is
+presented than there are identifiers in the list, the extra data
+is silently ignored; and if there are more data elements in the
+parameter list than there is data,
+the remaining data elements retain their old values.
+
+The output or input for these functions can be explicitly redirected,
+via the usual mechanisms, or the \irafname{fscan} and \irafname{fprint}
+functions can be used instead. The commands:
+
+\begin{verbatim}
+cl> list = 'infile'
+cl> while (fscan (list, s1) != EOF)
+>>> fprint ('junque', 'The next input line = ', s1)
+\end{verbatim}
+
+\noindent
+perform exactly the same function as:
+
+\begin{verbatim}
+cl> list = 'infile'
+cl> while (scan (s1, $<$list) != EOF)
+>>> print ('The next input line = ', s1, $>>$ 'junque')
+\end{verbatim}
+
+\noindent
+where the list structured variable \usertype{list} has been set to the
+name of the file to be used for input (\filename{INFILE}) and the
+output is being directed to file \filename{JUNQUE}.
+These examples are hardly exhaustive, but
+will serve as background information for the discussion of list
+structured parameters that follows.
+
+\subsection{List Structured Parameters}
+
+For certain data analysis tasks, the ability to define a \emphasize{list}
+of data files for batch processing can be especially useful. IRAF
+supports \irafname{list structured parameters} for specifying a list
+of items to be input to a function. Many, but not all, functions
+will accept this form of input. List structured parameters are
+associated with a file and have their own peculiar, but useful,
+semantics.
+
+Suppose we want to make a series of contour plots on the standard plotter
+device of a set of data files. This can be done interactively by
+entering a command to produce each plot, but this is tedious. A better
+approach would be to prepare a list of image sections (see \S 6.6) to
+be plotted, naming one section per line in a text file (which we choose
+to call \filename{SECTIONS}). The following command could then be used
+to generate the plots in the background:
+
+\begin{verbatim}
+pl> list = 'sections'
+pl> while (fscan (list, s1) != EOF)
+>>> contour (s1, device = 'stdplot') \&
+\end{verbatim}
+
+In this example, the assignment of \usertype{'sections'} to the
+parameter \usertype{list}
+has two actions, it associates the name of the file \filename{SECTIONS}
+with the list structured parameter, and it causes a \emphasize{logical}
+open of the file. The actual file open takes place the
+first time that \usertype{fscan} is called. Successive calls to
+\usertype{fscan} return successive lines from the file into the
+string \usertype{s1}. When the end of file (EOF) is encountered
+the \usertype{while} loop terminates. If additional calls are made to
+\usertype{fscan} EOF will continue to be returned. A logical
+reset to the top of the file can be performed by reassignment
+of the same file name
+to the parameter \usertype{list}, or another file name can be
+associated with this parameter.
+
+A user can declare other list structured data elements besides the
+ones that are provided. The statement:
+
+\begin{verbatim}
+cl> struct *input = uparm\$inlist
+\end{verbatim}
+
+\noindent
+declares a list structured variable named input that is bound
+to the list named \filename{UPARM\$INLIST}. This file may
+contain several records that define image section specifications
+or the names of other files to be processed. Once the declaration is
+made, lines may be scanned from the file, as in previous examples,
+or the records may be fetched by use of a simple assignment operator:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{= input} \hfill \# displays the next record from
+ file \\
+\comptype{cl>} \usertype{s1 = input} \hfill \# sets s1 to the next record
+\end{quotation}
+
+\noindent
+Successive references to the identifier \usertype{input} will result
+in successive records being read from the file it is bound to. If
+an EOF is detected it is silently ignored, and the last value
+read will continue to be returned. List-structured identifiers may be
+integer, real, or character as well as struct type data.
+The binding to a filename is the same regardless of type,
+and the only difference is that data conversion is
+performed on the input record to match the type of the identifier.
+
+If you expect to write commands much more complicated than these
+examples, it is time to learn about \irafname{script tasks}. This topic
+is covered in \S 7 of this document and more detailed information
+is given in the \reference{CL Programmer's Guide}.
+
+\newpage
+\section{Rolling Your Own}
+
+The true power of the CL and the whole IRAF analysis
+environment lies in its ability to tailor analysis functions to the
+users' data. This power comes from the ability to define new
+functions in the CL, and from the capability to extend the
+basic IRAF system by the addition of new analysis packages.
+These new routines can be developed incrementally, a line at a time,
+and then defined as a new task once the function operates as desired.
+User defined functions and analysis packages look just like any of the standard
+functions that are provided with the system, and are called in the same way.
+All of the same parameter passing, range checking, and prompting operations
+of IRAF are available for user defined functions.
+
+Beyond the ability of the CL to \emphasize{learn} the value of parameters
+that you have entered, or the creation of "one-liners",
+little user customization has been presented so far.
+However, all of the programming and extensibility features of the CL
+that have been used in the creation of the standard packages are also
+available to the intrepid user, enabling the creation of a personalized
+data analysis environment, one's own set of \taskname{doit} functions.
+This section introduces the creation of new user script tasks,
+user executable tasks, and packages of such tasks.
+
+Examination of one of the \filename{.CL} script tasks that
+defines a standard package will reveal that it
+contains several \usertype{set} commands to establish
+logical directory names; and then defines the set of
+tasks that compose the package. Examine the script task
+for the \irafname{system} package of functions:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{page system\$system.cl}
+\end{quotation}
+
+\noindent
+to reveal the mysteries of these basic functions.
+The task names that appear
+in this package description contain a \irafname{logical directory}
+portion (as in \usertype{system\$}) and a filename portion
+(\usertype{system.cl}). The logical directory name is separated from
+the rest of the file name by a dollar sign \usertype{'\$'},
+as was discussed in
+the section on virtual file names (\S 4.3). Use of a logical directory
+specification in public packages, and even in those for your own private
+use, is highly recommended, since it provides an unambiguous
+specification of where to find the package and tasks.
+
+Note that tasks need not be defined as part of a package; individual tasks
+can be created and defined at any time, but a package is a convenient
+way of grouping related tasks together. Many package have already been
+provided in IRAF, and should be browsed by anyone who is searching
+for clues about how the CL language can be used for programming.
+
+\subsection{Creating Script Tasks}
+
+All of the IRAF commands can be used within a
+script task and will operate the same way in that environment as they
+do when entered interactively. A script task need be nothing more than
+a text file that contains normal CL statements or commands.
+Commands may be entered in a script just as they would from a terminal
+in \irafname{command mode}, or \irafname{program mode}
+may be used, in which case slightly different rules apply (c.f. \S 6.0).
+For simple process control scripts command mode is likely
+to be satisfactory, but program mode is the obvious choice if more
+complicated tasks are undertaken. The main distinction
+is that task names must be entered in full and
+the standard rules should be followed for variable names and character
+string references. Program mode will be used in the following
+examples, since it is most likely to be used in any complicated
+script tasks that you might wish to develop.
+
+In order to create a script task one has merely to invoke the editor
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{edit {\it taskname}.cl}
+\end{quotation}
+
+\noindent
+and enter the CL statements that describe the actions you wish to
+have performed. When you have created the new script task
+(or modified an existing one), exit the editor in the normal way,
+so that the file is written in your current directory.
+
+A script task for demo purposes might look like:
+
+\begin{quotation}\noindent
+\usertype{ \{ } \\
+\usertype{ print(' Hello, world !! ') } \\
+\usertype{ \} }
+\end{quotation}
+
+\noindent
+In order to make this new task available to the CL, you will have to identify
+it and indicate where the script task is to be found:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{task \$my\_new\_task = {\it taskname}.cl}
+\end{quotation}
+
+\noindent
+Note that the name by which you refer to the new task
+need not be the same as the name of the file, although the use of the same
+name is conventional.
+The `\usertype{\$}' in the \usertype{task} statement is optional and
+tells IRAF not to search for a parameter (\filename{.PAR}) file for the task.
+
+Once the task has been created and declared it may be directly invoked:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{my\_new\_task}
+\end{quotation}
+
+\noindent
+will cause the script task file to be parsed and executed by the CL.
+You may change the body of a script task
+without redefining it with another \usertype{task} statement.
+
+While tesing new script tasks, such
+as this one, you may find it useful to turn on echoing:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{echo = yes}
+\end{quotation}
+
+\noindent
+which will cause the CL to echo the commands on the terminal
+as they are read from the script.
+
+Since all of the commands that you have entered at the terminal are
+logged a the history file, it is possible to edit all or part
+of this command log to create a new script task. You will first have
+to output part of the history log to a file and then edit it:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{history 30, $>$ temp } \\
+\comptype{cl>} \usertype{edit temp }
+\end{quotation}
+
+\noindent
+which lets you change history (not a bad trick). Once you have edited
+the file, the commands needed to turn it into
+a CL script task are the same as those described above.
+
+\subsection{Passing Parameters to Script Tasks}
+
+Parameters are used to control the operation of tasks by defining input
+and output files, indicating execution options, etc. Script tasks that a user
+defines may have parameters that operate in exactly the same fashion
+as standard tasks.
+In fact, the same prompting, learning, and limit checking mechanisms
+that operate for standard tasks are available by default for user script tasks,
+as well as for external user tasks (about which more in \S 7.5).
+
+CL parameters and other variables that are defined external to a new
+script task may be referenced from within the task with no special action
+being taken on your part. Global variables and variables passed
+from higher level tasks
+are also accessible to a task. However, named parameters for the task,
+or variables that are local to the task (and thus protected from
+external actions), must be declared within the script task itself.
+Parameters are identified by being defined
+in the formal parameter list of the procedure or before the \usertype{begin}
+statement, while local variables are declared only \emphasize{after}
+the \usertype{begin} statement. N.B. the \usertype{begin} and
+\usertype{end} statements must appear all by themselves on the line,
+and anything that appears \emphasize{after} the \usertype{end} will
+be ignored.
+
+The following simple script task description will serve to illustrate
+many of the salient points:
+
+\begin{verbatim}
+
+procedure doit (inparm, groups, region, outparm)
+
+file inparm {prompt = 'Input file name:'}
+int groups {prompt = 'Groups to process (0 for all):'}
+int region[] {0, mode=hidden}
+file outparm {prompt = 'Output file name:'}
+
+begin
+ file cal_file = 'calib$wfpc' # Wide Field Camera
+ int n_group, ngp
+
+ n_group = groups # get the users group request
+ if (n_group == 0)
+ n_group = 9999
+
+ for (ngp=1; ngp <= n_groups; ngp=ngp+1) {
+ calib (inparm, ngp, cal_file) | # note use of pipe
+ clean() |
+ clip (region= region, >> outparm)
+ }
+end
+\end{verbatim}
+
+\noindent
+The identifiers {\tt inparm, group, region,} and {\tt outparm} are
+parameters of the function and are used to pass data
+into and out of the procedure proper.
+There is one \emphasize{required} parameter, {\tt inparm}, which is the input
+file name that contains the name of
+the file to be operated upon. The other parameters are {\tt groups}
+the number of data groups to be processed;
+a \emphasize{hidden} parameter, {\tt region}, which will not be
+prompted for; and the parameter, {\tt outparm}, which is
+the name of the file that is to be written by the function. The variable
+{\tt cal\_file} is local to the procedure and is only
+available within the procedure body (or to any lower level routines to which
+variables may be passed as parameters).
+
+There are some subtleties here that bear mentioning. Hidden parameters,
+such as {\tt region}, may be defined for script tasks and must appear
+\emphasize{before} the \usertype{begin} statement, but need \emphasize{not}
+appear in the formal parameter list. The {\tt groups} parameter will
+be prompted for if not specified on the command line,
+but is then assigned to a local variable {\tt n\_group}.
+This is not required, but is desirable because of a side-effect of the
+automatic prompting built into IRAF. Any query mode parameter will be
+prompted for automatically, \emphasize{each time it is referenced}.
+This can be very useful in a script where a new value is to be input
+on each execution of a loop, but can be surprising if one only intends
+to enter the value once. The obvious fix is to assign the value to
+a local variable (at which time the prompt will occur) and then
+operate only on the local variable.
+
+As with the simple task described before, this procedure must be declared
+with a \usertype{task} statement in order that the CL be able to locate it.
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{task doit = home\$doit.cl}
+\end{quotation}
+
+\noindent
+Remember to specify the logical
+directory in the declaration so that the task can unambiguously
+be located no matter which directory you use it from.
+When you run this new task, you will be expected to enter a value for
+the input parameters (and you will be prompted if you don't).
+
+ Remember that once you
+have used the \usertype{task} statement to inform the CL how to find your
+new function, you need not do so again during that session, since the original
+declaration of the task will allow it to be located even if you edit the body
+of the task to change its internal operation.
+If you need to change the number or type of parameters to a task,
+or to change the name of a task, move it to another directory,
+or if you wish to redefine the meaning of one of the standard tasks
+in the system, you will have to use the \usertype{redefine} command.
+
+The following commands:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{rename home\$doit.cl funcs\$doit.cl} \\
+\comptype{cl>} \usertype{redef doit=funcs\$doit.cl}
+\end{quotation}
+
+\noindent
+rename the file \filename{HOME\$DOIT.CL} to \filename{FUNCS\$DOIT.CL}
+and then redefines the \taskname{doit} task to point to the script.
+This redefinition causes the CL to reprocess the script task
+in order to re-establish pointers to the file and to
+redefine the data declarations.
+
+Once you have tested your new task and have it
+debugged, you may wish to enter a \usertype{task} definition for
+it into your \filename{LOGIN.CL} file, or to install it in your own
+package of private functions.
+
+\subsection{Using List Structured Parameters in a Script Task}
+
+It is possible to define a CL script task such that a sequence of files
+whose names are defined in an input list
+may be processed in one call to the task. This is convenient
+when a number of files need to be processed in an identical way. The
+following example shows how the task \usertype{doit\_toit} has been
+setup to accept a list structured input parameter, and then
+to call another task, passing the files from the list one at a time
+to the other task. The obvious advantage is that the development
+of the task that really does the work, viz. \usertype{doit}, can be done in
+isolation from the mechanics of batch processing the list of data files.
+
+The \usertype{doit\_toit} function is set up for production use and,
+as such, it logs all activity in the standard logfile.
+It may be run as a background task, like any other IRAF function.
+
+\begin{verbatim}
+# DOIT_TOIT -- A driver task for batch operation of DOIT.
+
+procedure doit_toit (images, section)
+
+file *images { prompt = 'List of images to be changed' }
+char section { prompt = 'Section of input images to be output' }
+
+begin
+ struct imgs # working storage for image file name
+ bool klog # default size is 32 chars
+ file logf
+
+ klog = keeplog # get global keeplog flag
+ logf = logfile # ditto the log file name
+
+ while (fscan (images, imgs) != EOF) {
+ if (klog) {
+ # Output a startup message if keeplog is true.
+ print (' DOIT_TOIT: Process images ', >>logf)
+ time (>> logfile)
+ print (' Images : ', imgs, >>logf)
+ print (' Section : ', section, >>logf)
+ }
+
+ # Do the actual task by calling the DOIT function, passing
+ # in the file name with the section concatenated.
+
+ doit (imgs // section, imgs)
+
+ if (klog) { # output the trailing message
+ time (>>logf)
+ print (' DOIT_TOIT: Completed. ', >>logf)
+ }
+ }
+end
+\end{verbatim}
+
+\noindent
+The declaration for the variable \usertype{images} needs
+some explanation. The asterisk \usertype{'*'} indicates that
+\usertype{images} is a \irafname{list structured parameter}, i.e. that
+it is to be processed as a pointer to a parameter list, rather than
+as the parameter itself. In this instance it will contain the name
+of a file that itself contains a list of the names of files to be
+processed.
+
+As with the other script tasks that have been described, this one must
+be declared to the CL via a \usertype{task} statement before it can
+be executed. Once this has been done the task can be called as follows:
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{task doit\_toit = home\$doit\_toit.cl} \\
+\comptype{cl>} \usertype{doit\_toit ( 'images.txt', '[]' )}
+ \hfill \#~no~sub-sections \\
+\comptype{cl>} \usertype{tail logfile} \hfill \#~check~the~logfile~messages
+\end{quotation}
+
+\noindent
+The name of the file containing the list of images \filename{``IMAGES.TXT''}
+is passed directly into the task as a quoted string.
+
+\subsection{Establishing Your Own Function Package}
+
+Once you have defined several functions that do a useful set of operations,
+you may wish to set them up so that they are always available to you.
+This can be done by defining them as a package, which is the mechanism
+that IRAF uses to organize the other groups of tasks that are made
+available as part of the system proper. (Or, more easily, by putting
+the \usertype{task} declarations into your \filename{LOGIN.CL} file.)
+
+\newpage
+\begin{verbatim}
+
+package my_package
+
+set funcs = "home$func/" # define the logical directory
+
+task fib = funcs$fibonacci.cl
+ glib = funcs$wordy.cl
+ doit = funcs$doit.cl
+
+clbye() # invoke the cl again for interactive use
+
+\end{verbatim}
+
+\noindent
+If you now place the declaration for this package task in your
+\filename{LOGIN.CL} file, these tasks will be available to you whenever
+you login to IRAF. It is a good practice to always use logical directory
+names in task declarations and in other file names, since changing the
+search path with a \usertype{chdir} may otherwise render tasks not
+locatable.
+
+Packages may, of course, be more complex than the above, since they can
+refer to several logical tasks that may be CL script tasks or executable
+tasks. User packages may also reference logical tasks that are in other
+packages directly, if only one or two such tasks from another package are
+needed. Additionally, a package task may declare variables
+that are to be treated as global to all of the tasks \emphasize{within}
+the package, but are to remain local to the package itself. Other IRAF
+commands can be included in a package task as well, such as a load request
+for a package of utility routines. As you will recall, the
+load operation for a package is implicitly executed whenever a package
+is named; thus, a utility package such as \taskname{plot} or \taskname{imred}
+can be loaded and made available just by naming it in the package description.
+
+\subsection{Creating Fortran, SPP and other External Tasks}
+
+While the IRAF and SDAS applications packages, along with the CL
+language, offer substantial facilities for interaction with and
+analysis of data, it would not be unusual for users to wish to
+make their existing algorithms available
+for use in IRAF. Neither the IRAF packages nor the SDAS packages
+can provide all of the functions that everyone might desire. IRAF has been
+developed as an \emphasize{open system}, and is therefore extendible by the
+user so that externally compiled programs are accessible with the CL.
+These programs may be coded in any language that
+conforms to the standard calling conventions, but Fortran, C, and the
+Subset PreProcessor (SPP, the IRAF portable language) have predefined sets of
+interface routines that establish access to the IRAF \irafname{kernel}
+functions.
+
+It is suggested that the Fortran programmer use the SDAS/ST
+interface routines to access the IRAF environment. These routines
+provide access to parameters, perform I/O on image files as well as other data
+file formats, provide facilities for header data manipulation, etc.
+The routines are described in the \reference{SDAS Applications Programmer's
+Guide} (the \reference{Green Book}) and in the \reference{Software
+Interface Definition, ST-ECF O-11}, which describes the set of
+interfaces that have been agreed upon between the STScI and the
+European Coordinating Facility (ECF).
+
+The SDAS interface routines (and the ST-ECF interfaces) are all
+built upon the existing IRAF kernel interfaces as described in the
+\reference{IRAF Programmer's Crib Sheet}. These interfaces are rather
+more complete than the SDAS/ST ones, providing full access to the facilities
+of the IRAF virtual operating system. These routines can be called directly
+from SPP, but typically \emphasize{cannot} be called directly from
+Fortran programs.
+
+A selection of software development tools are available to the user who wishes
+to integrate personal programs into the IRAF environment. These utilities
+are provided as parts of the \taskname{softools} package, and include such
+functions as IRAF-specialized compilation and linkage, help file creation, etc.
+
+A simple SPP language routine is included here as an example that
+can be tried from the terminal. It is not a particularly useful
+function (it just feeps the terminal bell), but does show the
+ease with which an external task can be linked into the environment.
+
+\begin{verbatim}
+#------------------------------------------------------------
+# Simple task to show use of SPP external procs
+# Compile and link using SPP command in Softools
+
+task feep = t_feep
+include <chars.h> # include the standard char defs
+
+# FEEP -- Feep the terminal.
+
+procedure t_feep()
+begin
+ call putc (STDOUT, BEL)
+end
+\end{verbatim}
+
+\noindent
+After you have used the editor to create the program source file,
+you should load the \irafname{softools} package that contains
+the \irafname{xc} compile/link tool. This will compile the
+program, link it, and create an executable named \filename{FEEP.E}.
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{softool} \\
+\comptype{so>} \usertype{xc feep.x}
+\end{quotation}
+
+Once the \usertype{feep} task has been compiled and linked
+it may be made available from within the IRAF environment
+in a fashion analogous to that used for CL script tasks.
+A \usertype{task} statement that names the executable file and binds it
+to a task name must be used to declare the task to the CL. Once this
+has been done, the executable task can be invoked just like any other
+task.
+
+\begin{quotation}\noindent
+\comptype{cl>} \usertype{task feep = feep.e } \\
+\comptype{cl>} \usertype{feep} \hfill \#~is~used~to~call~it
+\end{quotation}
+
+\noindent
+N.B. IRAF tasks written in SPP (and other languages)
+may contain more than one logical task, and the CL
+\usertype{task} statement must be used to declare each of them.
+The logical task names used on the CL \usertype{task} statement
+\emphasize{must} correspond with the task names from the {\tt task}
+statement used in the body of the SPP file.
+
+The parameter handling facilities at the user level behave
+identically for executable
+external tasks and for CL script tasks. If the complete facilities
+of parameter range checking, prompt messages, and default values
+are desired, a data declaration statement that defines
+these values will have to be specified. If a declaration statement
+is not provided, the standard prompt processing (naming the
+parameter and soliciting input) will be used when parameters are
+referenced.
+
+The details of parameter and file I/O in SPP, and in the Fortran and
+C interfaces, are sufficiently different from those presented for the
+CL that the entire subject is best deferred to a separate document.
+It is important to note however, that the facilities that are available
+in the CL and in the IRAF kernel routines that support it are
+equally available to all executable modules. The implication of
+this is that any program that has been linked into IRAF will have the
+same apparent interface as all of the existing programs, and thus
+can easily be made to appear as a unified part of the larger system.
+This can, of course, be subverted, and programs may maintain their
+own identities in so far as that is desirable. However, the advantages
+of a unified user interface and of a well defined and completely
+implemented set of flexible interface routines cannot be stressed enough.
+
+\newpage
+\section{Relevant Documentation (the Yellow Pages)}
+
+This document should serve to get the first-time user started (and if it
+doesn't, we would like to know about it), but there are many topics
+that have been covered quickly or not at all. Other documents and
+sources of information about IRAF, SDAS, standard packages, use of
+SPP, IRAF internals, etc. exist and this section will provide pointers
+into that realm for those who would like more information on these topics.
+
+\subsection{IRAF Command Language}
+
+Some of the documents describing the CL are now somewhat out of date
+since there have been at least two revisions to IRAF since they were
+written. However, these documents are readable and are still
+useful, since, by design, most of the changes made to the CL are
+compatible with what had gone before.
+
+\noindent
+\reference{CL Programmer's Guide, in preparation}
+
+This is to be the most complete introduction to programming in the
+CL and to the facilities of the CL. As such, it provides details of language
+use (especially helpful when developing external and/or script tasks in
+Fortran, SPP, and C). Also included are descriptions of the workings of
+the CL, the IRAF kernel and inter-process communications as they affect
+the use of IRAF for program development.
+
+\noindent
+\reference{Detailed Specifications of the IRAF Command Language, rev Jun82}
+
+This paper discusses in technical detail the major functions of the CL
+and some details about how it works. Since this is a specifications
+document, it is not as readable as a user document, but it
+does cover many of the same areas as the \reference{CL Programmer's Guide}
+in somewhat more detail.
+
+\subsection{IRAF Applications Packages}
+
+Much of the richness of the IRAF environment comes from the packages
+of applications programs that are being made available within the
+environment. The IRAF group at NOAO and the SDAS group at STScI have been
+developing analysis programs that are available as packages
+within the IRAF environment, and the end-user-oriented documentation of
+these systems is described below.
+
+\noindent
+\reference{IRAF Applications Packages, Structure and Requirements, Aug83}
+
+This document is an attempt to define fully the decomposition of the IRAF
+system and applications software into packages. The functions performed by
+each package are summarized in the form of requirements.
+
+Descriptions of specific IRAF applications packages developed at Kitt Peak
+are available in a set of user-handbooks :
+
+\begin{itemize}
+\item \reference{APPHOT - Digital Aperture Photometry, Aug83}
+\item \reference{GRAPH - Simple Graphics Routine, Mar84}
+\item \reference{SURFACE - 3-D Surface Display, Mar84}
+\item \reference{CONTOUR - Contour Map Display, Mar84}
+\item \reference{HELP - On-Line HELP for IRAF, Mar84}
+\item \reference{DATAIO - Data Readers and Writers, Mar84}
+\item \reference{LISTS - Basic List Processing Functions (ASCII files), Mar84}
+\item \reference{UTILITIES - Miscellaneous Utility Functions, Mar84}
+\item \reference{SOFTOOLS - Software Utilities, make, yacc, xc, mklib, Mar84}
+\end{itemize}
+
+\noindent
+\reference{Science Data Analysis Software Requirements, Final, Aug82}
+
+These are the contract requirements of the SDAS system.
+
+\noindent
+\reference{SDAS User's Manual, in preparation}
+
+A descriptive guide to the use of SDAS.
+
+\subsection{Standard Program Interfaces}
+
+There are three sets of interface routines available to the programmer:
+those for SPP, those for C, and those for Fortran. The language that
+you use depends on the nature of the project being undertaken, your
+own level of expertise, and on the
+need for creating portable code. SPP is the language of choice for packages
+that are to become part of IRAF or for tasks that require access to the
+entire virtual system interface. Fortran and the SDAS/ST
+interfaces will remain the choice for existing Fortran codes and for many
+small scientific applications programs. Users are encouraged to choose
+the SDAS/ST interface for their Fortran programs. C has been used
+for the innards of the CL itself, and a set of interfaces (the LIBC library)
+is provided that emulates the UNIX standard I/O facilities and
+gives access to the IRAF kernel facilities.
+
+\noindent
+\reference{A Reference Manual for the IRAF System Interface, rev May84}
+
+This document is the most complete (and recent) treatment of the
+linkages between the portable IRAF kernel, the CL, the external procedures
+and the system dependent Z-routine layer. It describes these interfaces
+in detail and has the complete specifications of the
+Z-routine interfaces. It is of particular use to both the individual who is
+trying to port IRAF to another system (it is a \emphasize{must read} for such
+persons) and to the system or applications
+programmer who wants a more detailed understanding of IRAF.
+
+\subsubsection{SPP Interfaces}
+
+\noindent
+\reference{Programmer's Crib Sheet for the IRAF Program Interface, rev Sep83}
+
+This document describes the complete set of interface functions
+for the IRAF virtual
+operating system as it is available to the SPP programmer. Several
+sets of library functions are described for accessing images and various
+kinds of data files, terminal capabilities, graphics and image I/O, etc.
+Programs written using only these interfaces
+will be fully portable, along with the main body of IRAF code.
+
+\noindent
+\reference{Reference Manual for the IRAF SPP, rev Sep83}
+
+This is the definitive document about the IRAF Subset Preprocessor
+language. The language is somewhat like Ratfor (from which
+it derives), but it has extensions for dealing with the memory management
+and referencing issues that arise when operating on large scale image data.
+
+\noindent
+\reference{The Role of the Preprocessor, rev Dec81}
+
+This document is an early discussion of the philosophy behind use of
+the SPP language. As such, it is valuable
+background reading for anyone who wishes to understand fully the
+benefits of using a preprocessed language for
+implementing a large body of portable
+code like IRAF.
+
+\subsubsection{Fortran Interfaces}
+
+\noindent
+\reference{SDAS Applications Programmer's Guide}
+
+This is the complete description of the interface set that is now
+being used to develop the SDAS program suite at STScI. These interfaces
+are expected to be replaced eventually by the set of SDAS/ST
+interfaces mentioned in the following document.
+
+\noindent
+\reference{Software Interface Definition, ST-ECF O-11, rev Aug84}
+
+This describes the set of standard interfaces agreed upon between
+the STScI and the ST-ECF. It incorporates most of the features of the
+SDAS standard interfaces and is to be used for program development
+at STScI and for future MIDAS programs developed at ESO. It is
+a rather complete interface for image data, process parameters,
+and table data structures, but does leave out many of the other
+facilities provided in the complete IRAF SPP interface.
+
+\newpage
+\section{And into the Future}
+
+This version of IRAF and its CL represents the first external release
+of a system that has been under development for more than three years,
+and which will continue to evolve for several
+more. IRAF was born out of the need for a system that
+could survive changes in operating systems and hardware, since such
+changes are a normal part of computer system evolution. To
+accomodate such changes, and to provide a level of stability
+and portability across operating systems,
+IRAF is a \emphasize{layered} system: the CL is the user layer;
+the kernel is the operating system independent layer; and the
+z-routines are the system dependent layer.
+
+Most of the discussion in this document describes the appearance
+and function of the current command language (CL2), the user layer
+of IRAF. As has been noted at various points in the text,
+the CL is still undergoing
+development and is expected to change over time. (The paragraphs
+marked \irafname{CL++} in the text hold the clues.) The intent
+in these changes is two-fold:
+
+\begin{itemize}
+
+\item Provide evolutionary enhancements to the user interface
+to improve utility, functionality, usability and coherence.
+
+\item Bring the programming elements of the CL language
+into line with the SPP language which is used for the bulk of the
+IRAF portable code.
+
+\end{itemize}
+
+\noindent
+These requirements are somewhat at odds, as was noted in \S 6, but
+further attention is being given these issues to try and resolve
+the dilemma. Although not all elements of the CL language can
+be mapped easily into the SPP programming language (consider the I/O
+control commands), the notion that one
+can do development in an interactive environment and then
+realize compiled code speeds for execution is an attractive one.
+The CL2 implementation has
+taken steps in this direction and we expect to see how far this idea
+can be taken over the next few years.
+
+\subsection{Near-Term Software Projects}
+
+While the evolution of the CL is an important part of IRAF, there
+are other elements of the system that are even more important which are
+still under development at this time. The most important single area
+for development is the database and data catalogue.
+Design and prototyping of these important functions, and the
+necessary query language, is in progress
+right now. These functions are doubly important, since they both represent
+a user facility for creating and operating on private catalogues
+of data; and also are at the heart of the effort to merge the
+SDAS functions cleanly into the IRAF control structure. Only after
+the DBIO and IMIO packages have been fully implemented and integrated
+into the rest of the system will functions from these two large
+applications groups be able to share data and file structures.
+A tables system is also envisioned that will offer similar capabilities
+to the MIDAS tables, but will be built upon the DBIO routines.
+
+The areas of graphics and image display will also receive
+attention during the next year. The current GIO package
+supports a fast kernel and both a GKS and an NCAR emulation.
+However, image data are not merged into this structure
+and no common meta-file
+formats exist that allow image, annotation, and overlay graphics
+to be represented in one consistent form. Some efforts have already
+been made toward understanding what needs to be done and how (or if)
+the requirements can be satisfied within existing standards.
+Further efforts will be made, both at NOAO and STScI, and at
+other facilities like RAL who have expertise in this area, to develop
+an approach that satisfies the requirements.
+
+Developments in the area of networks, both LAN and wide-area; workstations;
+and the related topics of access to distributed data bases and archives
+are also receiving attention. We believe that IRAF
+has a sufficiently robust and flexible structure that it can operate
+successfully within a distributed operating environment. Small scale
+efforts are now underway to explore some of the issues related to network
+file systems.
+
+At the same time, a prototype project is underway with a
+single platter laser disk, to evaluate the suitability of this media
+for large scale, long term archival storage of images and other related
+data. As a part of this activity, IRAF is currently
+being ported to a SUN workstation and high resolution image display
+at the STScI. IRAF and its database package will be important
+to this effort, since they will provide some of the basic facilities
+for processing the data and managing the catalogues for this archive.
+
+These are all components of a distributed data system, a long range goal
+for the Space Telescope community, and probably of interest to the entire
+astronomy and astrophysics community. To the extent that IRAF proves
+useful to astronomers, it will play a key role in such a data system.
+
+\subsection{Where Is the Future?}
+
+The usual rapid pace of developments in hardware and software systems
+will also prompt consideration of changes to the external appearance
+and some of the internal implementation details of IRAF.
+Developments in graphics and image displays, and in various data
+input and storage
+devices promise to make revolutionary changes in the way that
+people and computers interact. High resolution graphics, touch screens,
+mice, WYSIWYG (What You See Is What You Get), DWIM (Do What I Mean),
+and the 'cluttered desk' paradigm pioneered by Xerox PARC and emulated
+by everyone else, will all appear in one form or another in a variety
+of different systems in the next few years. These presentation
+techniques and differing interactive views of data,
+when well thought out and integrated into a system,
+can serve to make computers more accessible to people.
+These ideas, however, have been much slower to arrive in the
+large-scale systems that have been used for data analysis than in
+the super-micro and PC class machines.
+
+IRAF, in its current version, incorporates only some of these elements,
+but many others will be experimented with as it is ported to
+different hardware environments.
+Because the CL is a separable piece of the system,
+it can be changed or replaced, without necessarily making major changes
+to the underlying system structure. Efforts now underway to move
+IRAF out of the super-mini systems where it has been developed, and
+into super-micro workstations will afford the opportunity to
+explore some of these user interface issues in a prototyping
+mode. Depending on the results of such experiments,
+other CL interfaces that take advantage of those
+elements that prove successful are likely to evolve.
+
+These statements should not be
+construed to mean that constant change will be the norm. IRAF
+was designed to protect the substantial software investment that any
+large data analysis system represents, and this it will do, both for
+the developers and for the users. The IRAF kernel and the layered
+interfaces for applications programs are quite stable, and are not
+expected to change, except to incorporate additional functionality.
+Furthermore, any changes proposed for
+the user interface will be carefully evaluated in terms of their
+impact on the existing user community. But, just as we expect that
+faster, more efficient FFT or filtering algorithms would receive
+a welcome reception we expect that a stable, but slowly evolving system
+that continues to serve
+users needs will meet with approval. Feedback and commentary from the
+users of the system will be vitally important in this development
+process, and we encourage that dialogue.
+
+\newpage
+\appendix
+\section{Appendices}
+
+\subsection{CL Commands and the System Package}
+
+\subsubsection{CL Intrinsic and Builtin Functions}
+
+\begin{tabular}{rcl}
+
+ access & - & Test to see if a file exists \\
+ bye & - & Exit a task or package \\
+ cache & - & Cache parameter files, OR \\
+ & & Print the current cache list (no arguments)\\
+ cd & - & Change directory \\
+ chdir & - & Change directory \\
+ cl & - & Execute commands from the standard input \\
+ clbye & - & Exit a task or package to save file descriptors \\
+ defpac & - & Test to see if a package is defined \\
+ defpar & - & Test to see if a parameter is defined \\
+ deftask & - & Test to see if a task is defined \\
+ ehistory & - & Edit commands from the history log file \\
+ envget & - & Get the string value of an environment variable \\
+ eparam & - & Edit the parameters for a function \\
+ error & - & Print error code and message and abort \\
+ flprcache & - & Flush the process cache \\
+ fprint & - & Format and print a line into a parameter \\
+ fscan & - & Scan and format an input list \\
+ hidetask & - & Define a new hidden task \\
+ history & - & Print the last few commands entered \\
+ jobs & - & Show status of background jobs \\
+ keep & - & Make recent set, task, etc. declarations permanent \\
+ kill & - & Kill a background job or detached task \\
+ logout & - & Log out of the CL \\
+ lparam & - & List the parameters of a task \\
+ mktemp & - & Make a temporary (unique) file name \\
+ mkdir & - & Make a new file sub-directory \\
+ package & - & Define a new package, OR\\
+ & & Print the current package names (no arguments) \\
+ print & - & Format and print a line on the standard output \\
+ radix & - & Print a number in the given radix \\
+ redefine & - & Redefine a task \\
+ scan & - & Scan and format the standard input \\
+ service & - & Service a query from a background job \\
+ set & - & Set an environment variable, OR \\
+ & & Print environment (no arguments) \\
+ show & - & Show the values of one or more environment variables \\
+ sleep & - & Pause execution for specified period \\
+ substr & - & Extract a substring from a string \\
+ task & - & Define a new task \\
+ unlearn & - & Restore the default parameters for a task or package \\
+ update & - & Update a task's parameters (flush to disk) \\
+ version & - & Print the revision date of the CL \\
+ wait & - & Wait for all background jobs to complete
+\end{tabular}
+
+\subsubsection{System Package Functions}
+
+\begin{tabular}{rcl}
+
+ allocate & - & Allocate a device \\
+ beep & - & Beep the terminal \\
+ clear & - & Clear the terminal screen \\
+ concatenate & - & Concatenate a list of files to the standard output \\
+ copy & - & Copy a file, or copy a list of files to a directory \\
+ count & - & Count the number of lines, words, and characters in a file \\
+ deallocate & - & Deallocate a previously allocated device \\
+ delete & - & Delete a file \\
+ devstatus & - & Print the status of a device \\
+ directory & - & List files in a directory \\
+ diskspace & - & Show how much diskspace is available \\
+ edit & - & Edit a file \\
+ files & - & Expand a file template into a list of files \\
+ gripes & - & Post bug reports, complaints, suggestions \\
+ head & - & Print the first few lines of a file \\
+ help & - & Print online documentation \\
+ lprint & - & Print a file on the line printer device \\
+ match & - & Print all lines in a file that match a pattern \\
+ news & - & Page through the system news file \\
+ page & - & Page through a file \\
+ pathnames & - & Expand a file template into a list of OS pathnames \\
+ protect & - & Protect a file from deletion \\
+ rename & - & Rename a file \\
+ revisions & - & Print/post a revision notice for a package \\
+ rewind & - & Rewind a device \\
+ sort & - & Sort a text file \\
+ spy & - & Show processor status \\
+ stty & - & Show/set terminal characteristics \\
+ tail & - & Print the last few lines of a file \\
+ tee & - & Tee the standard output into a file \\
+ time & - & Print the current time and date \\
+ type & - & Type a file on the standard output \\
+ unprotect & - & Remove delete protection from a file
+\end{tabular}
+\clearpage
+
+\subsection{SDAS Analysis Packages}
+
+\begin{itemize}
+
+\item General Data Analysis \\
+
+\begin{tabular}{rcl}
+ areavolum & - & Integrate to find the area/volume under a curve/surface\\
+ arrayops & - & Perform arithmetic, logical, and matrix operations on\\
+ & & \quad SDAS data arrays\\
+ convert & - & Convert data from one type to another (real, integer,\\
+ & & \quad logical, byte)\\
+ curfit & - & Fit curve to one-dimensional data\\
+ dimage & - & General image display package\\
+ extract & - & Extract a subset of a data array\\
+ fitsrd & - & Read a standard FITS tape and create an SDAS disk data file\\
+ fitswr & - & Write a standard FITS tape from an SDAS disk data file\\
+ four1d & - & Perform one-dimensional Fourier analysis\\
+ four2d & - & Perform two-dimensional Fourier analysis\\
+ hstats & - & Compute standard statistics, including histograms\\
+ locate & - & Locate features in a spectrum, time series, or image\\
+ makemask & - & Make a data mask\\
+ plot1d & - & Plot one-dimensional (equally-spaced) data\\
+ plot2d & - & Plot two-dimensional (equally-spaced) data as contour\\
+ & & \quad map or ruled-surface map\\
+ probdist & - & Compute standard probability distributions\\
+ register & - & Compute registration parameters for two displaced data\\
+ & & \quad arrays (use in conjunction with resample)\\
+ repmod & - & Replace/modify/input data in an existing data array\\
+ resample & - & Resample data from one grid to another (shift, rescale, rotate)\\
+ smooth & - & Smooth data by convolution filtering, median window
+\end{tabular}
+
+\item Spectral Analysis \\
+
+\begin{tabular}{rcl}
+ cntana & - & Continuum analysis (determine reddening, correct for\\
+ & & \quad reddening, fit continuum models)\\
+ ewlnst & - & Measure equivalent width/line strength\\
+ gspect & - & Generate a spectrum for testing\\
+ rvdet & - & Measure radial velocities\\
+ specph & - & Spectrophotometry
+\end{tabular}
+
+\item Image Analysis \\
+
+\begin{tabular}{rcl}
+ gimage & - & Generate an image for testing\\
+\end{tabular}
+
+\clearpage
+\item Time Series Analysis \\
+
+\begin{tabular}{rcl}
+ glcurv & - & Generate a light curve for testing\\
+ hldelc$^*$ & - & Correct HSP times for light delay time\\
+ hspcir$^*$ & - & Correct HSP data for instrumental response\\
+ hspolar$^*$ & - & Polarimetry package for HSP data\\
+ hspphot$^*$ & - & Photometry package for HSP data\\
+ hsubbkg$^*$ & - & Subtract background from HSP data
+\end{tabular}
+
+\item Astrometric Analysis \\
+
+\begin{tabular}{rcl}
+ bdresid$^*$ & - & Make histogram of FGS beam deflector residuals\\
+ centroid$^*$ & - & Centroid raw FGS encoder data\\
+ errsig$^*$ & - & Make histogram of FGS error signals
+\end{tabular}
+
+\end{itemize}
+
+\vskip 2cm \noindent
+$*$ --- these programs may not be available
+\clearpage
+
+\subsection{IRAF Application Packages}
+
+\begin{itemize}
+
+\item CRYOMAP Package \\
+
+\begin{tabular}{rcl}
+
+ extract & - & Extract Cryomap spectra\\
+ findspectra & - & Find Cryomap spectra\\
+ iids & - & Convert integrated spectra extractions to IIDS format\\
+ maplist & - & List information about the multi-aperture plate\\
+ specplot & - & Plot extracted integrated spectra
+
+\end{tabular}
+
+\item DATAIO Package \\
+
+\begin{tabular}{rcl}
+
+ bintxt & - & Convert a binary file to an IRAF text file\\
+ ldumpf & - & List the permanent files on a Cyber DUMPF tape\\
+ mtexamine & - & Examine the structure of a magnetic tape\\
+ rcamera & - & Convert a Forth/Camera image into an IRAF image\\
+ rcardimage & - & Convert a cardimage file into a text file\\
+ rdumpf & - & Convert IPPS rasters from a DUMPF tape to IRAF images\\
+ reblock & - & Copy a binary file, optionally reblocking\\
+ rfits & - & Convert a FITS image into an IRAF image\\
+ ridsfile & - & Convert IDSFILES from a DUMPF tape to IRAF images\\
+ ridsmtn & - & Convert mountain format IDS/IRS data to IRAF images\\
+ ridsout & - & Convert a text file in IDSOUT format to IRAF images\\
+ rpds & - & Convert a PDS image into an IRAF image\\
+ rrcopy & - & Convert IPPS rasters from an RCOPY tape to IRAF images\\
+ txtbin & - & Convert an IRAF text file to a binary file\\
+ wcardimage & - & Convert text files to cardimage files\\
+ wfits & - & Convert an IRAF image into a FITS image\\
+ widsout & - & Convert an IRAF image to IDSOUT text format
+\end{tabular}
+
+\item ECHELLE Package \\
+
+\begin{tabular}{rcl}
+
+ background & - & Subtract a scattered light background\\
+ extract & - & Extract Echelle orders\\
+ findorders & - & Find Echelle orders\\
+ iids & - & Convert integrated spectra extractions to IIDS format\\
+ orderplot & - & Plot extracted integrated spectra
+
+\end{tabular}
+\clearpage
+
+\item GENERIC Package \\
+
+\begin{tabular}{rcl}
+
+ biassub & - & Subtract a bias image\\
+ chimages & - & Change images: trim, flip, transpose, rotate\\
+ colbckgrnd & - & Fit and subtract a column by column background\\
+ colflat & - & Create a flat field by fitting a function \\
+ && to the image columns\\
+ darksub & - & Scale and subtract a dark count image\\
+ dcbias & - & Subtract a constant bias and trim images\\
+ flatten & - & Flatten images using a flat field\\
+ linebckgrnd & - & Fit and subtract a line by line background\\
+ lineflat & - & Create a flat field by fitting a function \\
+ && to the image lines\\
+ normalize & - & Normalize images\\
+ normflat & - & Create a flat field by normalizing and \\
+ && replacing low values
+
+\end{tabular}
+
+\item IMAGES Package \\
+
+\begin{tabular}{rcl}
+
+ imarith & - & Simple image arithmetic\\
+ imaverage & - & Average images together\\
+ imcopy & - & Copy an image\\
+ imdelete & - & Delete an image\\
+ imlinefit & - & Fit a function to each image line\\
+ imheader & - & Print an image header\\
+ imhistogram & - & Compute image histogram\\
+ imstatistics & - & Compute and print image statistics\\
+ imtranspose & - & Transpose a two dimensional image\\
+ listpixels & - & Convert an image section into a list of pixels\\
+ sections & - & Expand an image template on the standard output\\
+ shiftlines & - & Shift image lines\\
+ tv & - & Image display (see TV-IMAGE Package)
+
+\end{tabular}
+
+\item LISTS Package \\
+
+\begin{tabular}{rcl}
+
+ average & - & Compute the mean and standard deviation of a list\\
+ gcursor & - & Read the graphics cursor\\
+ imcursor & - & Read the image display cursor\\
+ table & - & Format a list of words into a table\\
+ tokens & - & Break a file up into a stream of tokens\\
+ unique & - & Delete redundant elements from a list\\
+ words & - & Break a file up into a stream of words
+
+\end{tabular}
+
+\clearpage
+\item LOCAL Package \\
+
+\begin{tabular}{rcl}
+
+ binpairs & - & Bin pairs of (x,y) points in log separation\\
+ epix & - & Edit pixels in an image\\
+ fields & - & Extract specified fields from a list\\
+ imreplace & - & Replace pixels in a range by a constant\\
+ imscale & - & Scale an image to a specified (windowed) mean\\
+ imstack & - & Stack images into an image of higher dimension\\
+ imsurfit & - & Fit a surface to an image\\
+ imtitle & - & Change the title of an image\\
+ notes & - & Record notes\\
+ polyfit & - & Fit polynomial to lists of X,Y pairs
+
+\end{tabular}
+
+\item MULTISPEC Package \\
+
+\begin{tabular}{rcl}
+
+ findpeaks & - & Find the peaks\\
+ fitfunction & - & Fit a function to the spectra parameter values\\
+ fitgauss5 & - & Fit spectra profiles with five parameter \\
+ && Gaussian model\\
+ modellist & - & List data and model pixel values\\
+ msextract & - & Extract spectra\\
+ mslist & - & List entries in a MULTISPEC database\\
+ msplot & - & Plot a line of image and model data\\
+ msset & - & Set entries in a MULTISPEC database\\
+ newextraction & - & Create a new MULTISPEC extraction database\\
+ newimage & - & Create a new multi-spectra image
+
+\end{tabular}
+
+\item PLOT Package \\
+
+\begin{tabular}{rcl}
+
+ contour & - & Make a contour plot of an image\\
+ graph & - & Graph one or more image sections or lists\\
+ pcol & - & Plot a column of an image\\
+ pcols & - & Plot the average of a range of image columns\\
+ prow & - & Plot a line (row) of an image\\
+ prows & - & Plot the average of a range of image lines\\
+ surface & - & Make a surface plot of an image
+\end{tabular}
+
+\clearpage
+\item SOFTOOLS Package \\
+
+\begin{tabular}{rcl}
+
+ hdbexamine & - & Examine a help database\\
+ lroff & - & Lroff (line-roff) text formatter\\
+ make & - & Table driven utility for maintaining programs\\
+ mkhelpdb & - & Make (compile) a help database\\
+ mklib & - & Make or update an object library\\
+ mkmanpage & - & Make a manual page\\
+ xcompile & - & Compile and/or link an SPP, C or Fortran program\\
+ yacc & - & Build an SPP language parser
+
+\end{tabular}
+
+\item TV-IMAGE Package \\
+
+\begin{tabular}{rcl}
+
+ blink & - & Blink the TV display\\
+ display & - & Manipulate the TV display\\
+ erase & - & Erase the TV display\\
+ frame & - & Define the frames to be manipulated\\
+ lumatch & - & Match color look up tables\\
+ monochrome& - & Set display into monochrome mode\\
+ pseudocolor& - & Set pseudocolor mode on display\\
+ rgb & - & Set true RGB mode on display\\
+ window & - & Define a display window area\\
+ zoom & - & Zoom the display
+
+\end{tabular}
+
+\item UTILITIES Package \\
+
+\begin{tabular}{rcl}
+
+ airmass & - & Compute the airmass at a given elevation \\
+ && above the horizon\\
+ ccdtime & - & Compute time required to a observe star \\
+ && of given magnitude\\
+ detab & - & Replace tabs with tabs and blanks\\
+ entab & - & Replace blanks with tabs and blanks\\
+ lcase & - & Convert a file to lower case\\
+ precess & - & Precess a list of astronomical coordinates\\
+ translit & - & Replace or delete specified characters in a file\\
+ ucase & - & Convert a file to upper case\\
+ urand & - & Uniform random number generator
+\end{tabular}
+
+\end{itemize}
+\clearpage
+
+\subsection{IRAF Editor Functions}
+
+\begin{tabular}{llll}
+
+Command & Emacs & EDT$^{\dag}$ & Vi$^{\ddag}$ \\
+\\
+move-up & \key{$\uparrow$} or \key{CTRL/P} & \key{$\uparrow$}
+ & \key{j} or \key{CTRL/P} \\
+move-down & \key{$\downarrow$} or \key{CTRL/N} & \key{$\downarrow$}
+ & \key{k} or \key{CTRL/N} \\
+move-right & \key{$\rightarrow$} or \key{CTRL/F} & \key{$\rightarrow$}
+ & \key{l} or \key{$\rightarrow$} \\
+move-left & \key{$\leftarrow$} or \key{CTRL/B} & \key{$\leftarrow$}
+ & \key{h} or \key{$\leftarrow$} \\
+\\
+ins-chr/word & {\it text} & {\it text} & i/a-{\it text}\ \key{ESC} \\
+del-left & \key{CTRL/H} or \key{DEL} \hspace{1cm} & \key{DEL} & \key{DEL} \\
+del-char & \key{CTRL/D} & \key{,} & \key{x} \\
+del-word & \key{ESC}\ \key{d} & \key{-} & \key{d}\ \key{w} \\
+del-line & \key{CTRL/K} & \key{PF4} & \key{d} \key{d} \\
+undel-char & \key{ESC}\ \key{CTRL/D} & \key{GOLD}\ \key{,} & \key{u} \\
+undel-word & \key{ESC}\ \key{CTRL/W} & \key{GOLD}\ \key{-} & \key{u} \\
+undel-line & \key{ESC}\ \key{CTRL/K} & \key{GOLD}\ \key{PF4} & \key{u} \\
+\\
+set-fwd & & \key{4} & \\
+set-rev & & \key{5} & \\
+next-word & \key{ESC}\ \key{f} & \key{1} & \key{w} \\
+prev-word & \key{ESC}\ \key{b} & \key{5}\ \key{1} & \key{b} \\
+move-eol & \key{CTRL/E} & \key{2} & \key{\$} \\
+move-bol & \key{CTRL/A} & \key{BS} or \key{CTRL/H} \hspace{1cm}
+ & \key{.} \\
+next-page & \key{CTRL/V} & \key{7} & \key{CTRL/D} or \key{CTRL/F} \\
+prev-page & \key{ESC}\ \key{V} & \key{5}\ \key{7}
+ & \key{CTRL/U} or \key{CTRL/B} \\
+move-start & \key{ESC}\ \key{$<$} & \key{GOLD}\ \key{5} & \key{1}\ \key{G} \\
+move-end & \key{ESC}\ \key{$>$} & \key{GOLD}\ \key{4} & \key{G} \\
+\\
+get-help & \key{ESC}\ \key{?} & \key{PF2} & \key{PF2} or \key{ESC}\ \key{?} \\
+repaint & \key{CTRL/L} & \key{CTRL/R} & \key{CTRL/L}\\
+exit-update & \key{CTRL/Z} & \key{CTRL/Z}
+ & \key{:}\ \key{w}\ \key{q} \\
+exit-no update \hspace{1cm} & \key{CTRL/C} & \key{CTRL/C}
+ & \key{:}\ \key{q}\ \key{!} \\
+
+\end{tabular}
+
+\hrule width5cm \vskip .15cm \noindent
+\dag{} --- EDT employs the notion of ``direction'' (forward and backward
+cursor motion). Several command sequences are preceded by \key{5} to indicate
+explicitly that they only function after setting ``backward'' mode. All EDT
+keystrokes, with the exception of \key{CTRL} keys, use the keypad.
+
+\medskip \noindent
+\ddag{} --- Vi has \emphasize{insert/replace/change modes},
+which are entered by command and terminated by the \key{ESC} key.
+Vi-type keystrokes for \usertype{eparam} and \usertype{ehist} are not
+yet implemented.
+
+\twocolumn \columnsep 1cm
+\section{Glossary}
+
+\medskip \noindent \irafname{AAS} --- American Astronomical Society.
+
+\medskip \noindent \irafname{band} --- A two dimensional array. The Nth band
+of a three dimensional array or \irafname{image} is denoted by the subscript
+[$*$,$*$,N], where $*$ refers to all the pixels in that dimension.
+
+\medskip \noindent \irafname{binary file} --- An array or sequence of
+data words. Data is transferred between a binary file and a buffer in the
+calling program by a simple copy operation, without any form of conversion.
+
+\medskip \noindent \irafname{binary operator} --- An operator which combines
+two operands to produce a single result
+(e.g., the addition operator in $x + y$).
+
+\medskip \noindent \irafname{brace} --- The left and right braces are
+the characters `\{' and `\}'. Braces are used in the CL and in the
+SPP language to group statements to form a compound statement.
+
+\medskip \noindent \irafname{bracket} --- The left and right brackets
+are the characters `[' and `]'. Brackets are used in the CL and in the
+SPP language to delimit array subscripts.
+
+\medskip \noindent \irafname{byte} --- The smallest unit of storage on
+the host machine. The IRAF system assumes that there are an integral
+number of bytes in a \irafname{char} and in an address increment
+(and therefore that the byte is not larger than either).
+On most modern computers, a byte is 8 bits, and a \irafname{char} is 16 bits
+(I$*$2). If the address increment is one byte, the machine
+is said to be \emphasize{byte addressable}. Other machines are \emphasize{word
+addressable}, where one word of memory contains two or more bytes.
+In the SPP language, SZB$_{CHAR}$ gives the number of bytes per char,
+and SZB$_{ADDR}$ gives the number of bytes per address increment.
+
+\medskip \noindent \irafname {C} --- A powerful modern language for
+both systems and general programming.
+C provides data structuring, recursion, automatic storage, a fairly
+standard set of control constructs, a rich set of operators,
+and considerable conciseness of expression.
+
+\medskip \noindent \irafname{char} --- The smallest signed integer that can be
+directly addressed by programs written in the SPP language. The char
+is also the unit of storage in IRAF programs; the sizes of objects are
+given in units of chars, and binary files and memory are addressed in
+units of chars. Since the SPP language interfaces to the machine via the
+local Fortran compiler, the Fortran compiler determines the size of a char.
+On most systems, the IRAF data type \emphasize{char} is equivalent to the
+(nonstandard) Fortran datatype I$*$2.
+
+\medskip \noindent \irafname{CL} --- The IRAF Command Language. The CL is an
+interpreted language designed to execute external \irafname{tasks}, and
+to manage their \irafname{parameters}.
+The CL organizes tasks into a hierarchical structure of independent
+\irafname{packages}. Tasks may be either \irafname{script tasks}, written in
+the CL, or compiled \irafname{programs}, written in the SPP language, and
+linked together to form \irafname{processes}. A single process may contain
+an arbitrary number of tasks.
+
+The CL provides \irafname{redirection} of all I/O streams, including graphics
+output, and cursor readback. Other facilities include command logging, an
+on-line help facility, a ``programmable desk
+calculator'' capability, and a \irafname{learn mode}.
+New packages and tasks are easily added by the user,
+and the CL environment is maintained in the user's own directories,
+providing continuity from session to session.
+
+\medskip \noindent \irafname{column} --- a one-dimensional array. The Nth
+column vector of a two dimensional array or image is denoted
+by the subscript [N,$*$],
+where $*$ refers to all the pixels in that dimension.
+The Nth column of the Mth band of a three dimensional array or image
+is denoted by [N,$*$,M].
+
+\medskip \noindent \irafname{coupling} --- A measure of the strength of
+interdependence among modules.
+The independence of modules is maximized when coupling is minimized.
+
+\medskip \noindent \irafname{CTIO} --- Cerro Tollolo Image Observatory,
+one of the NOAO facilities located in Chile.
+
+\medskip \noindent \irafname{data structure} --- An aggregate of two or more
+data elements, where the elements are not necessarily of the same type.
+Examples include arrays, files, rec\-ords, linked lists,
+trees, graphs, and so on.
+
+\medskip \noindent \irafname{data file} --- a data storage file. Data
+files are used to store program generated \irafname{records} or descriptors,
+that contain the results
+of the analysis performed by a program. Datafile records may be the
+final output of a program, or may be used as input to a program. Data
+file may contain ASCII or binary data, and may have implicit or explicit
+data structures.
+
+\medskip \noindent \irafname{environment variables} --- Parameters that
+affect the operation of \emphasize{all} IRAF programs.
+Environment variables define logical names for directories, associate
+physical devices with logical device names, and provide control
+over the low level functioning of the IRAF file I/O system.
+
+\medskip \noindent \irafname{ECF} --- European Coordination Facility. The
+center that is to coordinate use of Space Telescope data and programs for
+the European scientific community.
+
+\medskip \noindent \irafname{ESO} --- European Southern Observatory,
+headquartered at Garching, FDR.
+
+\medskip \noindent \irafname{field} --- An element of a \irafname{data
+structure} or \irafname{record}. Each field has
+a name, a datatype, and a value.
+
+\medskip \noindent \irafname{FITS} --- Flexible Image Transport System. FITS is
+a standard tape format used to transport images (pictures) between computers
+and institutions. Developed in the late 1970s by Donald Wells (KPNO),
+Eric Greisen (NRAO), and Ron Harten (Westerbork),
+the FITS standard is now widely used for the
+interchange of image data between astronomical centers, and is officially
+sanctioned by both the AAS and the IAU.
+
+\medskip \noindent \irafname{Fortran} --- As the most widely used language
+for scientific computing for the past
+twenty years, Fortran needs little introduction. Fortran is used in the
+IRAF system as a sort of ``super assembler'' language. Programs and procedures
+written in the IRAF \irafname{SPP} language are mechanically translated
+into a highly
+portable subset of Fortran, and the Fortran modules are in turn translated
+into object modules by the host Fortran compiler. Existing numerical
+and other modules, already coded in the Fortran language, are easily linked
+with modules written in the SPP language to produce executable programs.
+The IRAF system and applications software does not use any Fortran I/O;
+all I/O facilities are provided by the IRAF \irafname{program interface} and
+\irafname{virtual operating system}.
+
+\medskip \noindent \irafname{function} --- A procedure which returns a value.
+Functions must be declared before they can be used, and functions must only be
+used in expressions. It is illegal to \emphasize{call} a function.
+
+\medskip \noindent \irafname{HSI} --- The IRAF Host System Interface,
+i.e., the interface between the portable IRAF software and the host system.
+The HSI include the \irafname{kernel}, the \irafname{bootstrap utilities},
+and any host dependent graphics device interfaces.
+
+\medskip \noindent \irafname{hidden parameters} --- Parameters that
+are not displayed by the CL.
+The CL does not query for hidden parameters, but automatically
+uses the default values. Hidden parameters may be set on the command line,
+but the value from the command line will not be \irafname{learned}.
+
+\medskip \noindent \irafname{IAU} --- The International Astronomical Union.
+
+\medskip \noindent \irafname{IKI} --- The Image Kernel Interface. The IKI
+gives IRAF the capability of dealing with multiple physical image storage
+formats. The high level image i/o software calls the IKI, which in turn
+calls one of the format specific image kernels, e.g., the OIF kernel or
+the STF kernel.
+
+\medskip \noindent \irafname{identifier} --- A sequence of characters used to
+name a procedure, variable, etc. in a compiled language. In the CL and
+SPP languages, an identifier is an upper or lower case letter, followed
+by any number of upper or lower case letters, digits, or underscore characters.
+
+\medskip \noindent \irafname{image} --- An array of arbitrary dimension
+and datatype, used for bulk data storage.
+An image is an array of \irafname{pixels}.
+
+\medskip \noindent \irafname{imagefile} --- The form in which images are
+stored in the IRAF system. IRAF currently supports images of up to seven
+dimensions, in any of eight different data types.
+Only \emphasize{line storage} mode is currently available, but support for
+VMS mapped image sections is planned.
+The imagefile structure is actually implemen\-ted as two separate files,
+an \irafname{image head\-er file} and a \irafname{pixel storage file}.
+
+\medskip \noindent \irafname{image header file} --- a file describing the
+contents of an image. It is a small file that is normally placed in the
+user's own directory system.
+
+\medskip \noindent \irafname{interface} --- The visible portion of a
+system, program or collection of programs. The only portion of such a
+entity that other entities need to have knowledge of or access to.
+The connection between hardware or software entities.
+
+\medskip \noindent \irafname{IRAF} --- The Image Reduction and Analysis
+Facility.
+IRAF comprises a \irafname{virtual operating system}, a command language
+(CL), a general purpose programming language (SPP, which
+was developed along with IRAF), a large I/O library, and numerous support
+utilities and scientific applications programs. The system is designed to be
+transportable to any modern superminicomputer. The
+system provides extensive facilities for general image processing,
+astronomical data reduction and analysis, scientific programming,
+and general software development.
+
+\medskip \noindent \irafname{IRAF Guru} --- Any individual whose knowledge
+of IRAF is greater than yours. Gurus' wisdom embraces all of the essential
+mysteries of IRAF, and usually includes the locations of good Chinese
+restaurants.
+
+\medskip \noindent \irafname{kernel} --- A host dependent library of SPP
+(or Fortran) callable subroutines implementing the primitive system services
+required by the portable IRAF virtual operating system (VOS). Most of the
+machine dependence of IRAF is concentrated into the kernel.
+
+\medskip \noindent \irafname{learn mode} --- A facility designed
+to simplify the use of the CL. By default, the CL ``learns'' the value of all
+function \irafname{parameters} that are prompted for or explicitly set.
+
+\medskip \noindent \irafname{line} --- A one-dimensional array. The Nth line
+of a two dimensional array or image is denoted
+by the subscript [$*$,N],
+where $*$ refers to all the pixels in that dimension.
+The Nth line of the Mth band of a three dimensional array or image
+is denoted by [$*$,N,M].
+
+\medskip \noindent \irafname{list structured parameter} --- A text file, each
+line of which is a record that contains one or more fields, separated
+by blanks or commas, that can be interpre\-ted by the CL.
+Not all fields need be present, omitted fields are indicated by insertion
+of an extra comma (fields can only be omitted
+from right to left).
+
+\medskip \noindent \irafname{Lroff} --- The text formatter that is part of
+the portable IRAF system and used to process \irafname{help} file text.
+Lroff is patterned after the UNIX \irafname{Troff} text formatter.
+
+\medskip \noindent \irafname{macro} --- (1) A \irafname{script task}.
+(2) An inline function with zero or more arguments that is
+expanded by text substitution during the preprocessing phase
+of compilation.
+
+\medskip \noindent \irafname{metacharacter} --- Characters that have special
+meaning to the CL. For example, the asterisk `$*$' is used as a ``wild card''
+place-holder; any alphanumeric character is considered a match.
+
+\medskip \noindent \irafname{MIDAS} --- Munich Image Data Analysis System.
+An analysis package under development by the ESO.
+
+\medskip \noindent \irafname{NOAO} --- National Optical Astronomy
+Observatories.
+
+\medskip \noindent \irafname{NRAO} --- National Radio Astronomy Observatory.
+
+\medskip \noindent \irafname{operand} --- A data object that is
+operated upon by an operator, \irafname{procedure}, or \irafname{task}.
+Operands may be used for either input or output, or both.
+
+\medskip \noindent \irafname{OIF} --- The old IRAF image format. Refers to the
+physical format in which images are stored on disk, as well as to the
+\irafname{IKI} kernel used to access images stored externally in the OIF format.
+
+\medskip \noindent \irafname{OS} --- Operating System.
+
+\medskip \noindent \irafname{package} --- (1) A collection of modules that
+are logically related (e.g., the set of \irafname{system} utilities).
+(2) A set of modules that operates on
+a specific \emphasize{abstract datatype}. The modules in a package may be
+either \irafname{procedures} or \irafname{tasks}.
+Examples of abstract datatypes include the CL, the file,
+the \irafname{imagefile}, and so on.
+
+\medskip \noindent \irafname{parameter} --- An externally supplied
+argument to a module which directly controls the functioning of the module.
+
+\medskip \noindent \irafname{pathname} --- An absolute OS-dependent filename
+specification.
+
+\medskip \noindent \irafname{pipe} --- An abstraction that connects the output
+of one \irafname{task} to the input of another. The implementation of pipes
+is OS-dependent.
+
+\medskip \noindent \irafname{pixel} --- Picture element. The fundamental unit
+of storage in an \irafname{image}.
+
+\medskip \noindent \irafname{pixel storage file} --- a file that contains image
+pixel data. Typically, it is a bulky file and for this reason it is usually
+placed in a file system designated for such files.
+
+\medskip \noindent \irafname{portable} --- A program is said to be portable
+from computer A to computer B if it can be moved from A to B without change
+to the source code.
+A program is said to be \emphasize{transportable} from computer A to computer B
+if the effort required to move the program from A to B is much less than the
+effort required to write an equivalent program on machine B from scratch.
+
+\medskip \noindent \irafname{positional parameters} --- Parameters
+that are required for the execution of a given \irafname{function},
+and will be queried for by the CL if not given on the command line. Positional
+\emphasize{arguments} are the first arguments on the command line (following
+the command), and they are associated with parameters by their position
+on the command line. The first positional parameter will be set by the first
+positional argument on the command line, the second positional parameter by
+the second positional argument, and so on.
+
+\medskip \noindent \irafname{preprocessor} --- A program which transforms the
+text of a source file prior to compilation. A preprocessor, unlike a compiler,
+does not fully define a language. A preprocessor transforms only those
+constructs which it understands; all other text is passed on to the compiler
+without change. The SPP language is implemented as a pre-processor.
+
+\medskip \noindent \irafname{procedure} --- A separately compiled program unit.
+The procedure is the primary construct provided by programming languages for
+the \emphasize{abstraction of function}.
+The external characteristics of a procedure are its name, argument list,
+and optional return value.
+
+\medskip \noindent \irafname{process} --- An executable partition of
+memory in the host computer.
+The host OS initiates a process by copying or mapping an executable file
+into main memory. In a multitasking and multiuser system, a number of processes
+will generally be resident simultaneously in main memory,
+and the processor will execute each in turn.
+
+\medskip \noindent \irafname{program} --- A compiled procedure called by the
+CL. The procedure must be referenced in a \irafname{task} statement before it
+can be accessed by the CL. An arbitrary number of programs may be
+linked to form a single \irafname{process}.
+
+\medskip \noindent \irafname{program interface} --- The interface between an
+applications program and everything else. In IRAF, the program interface
+defines access to all I/O devices, system services, files, and several
+other non-computational facilities that pro\-grams require.
+
+\medskip \noindent \irafname{record} --- A \irafname{data structure} consisting
+of an arbitrary set of fields, used to pass information between program modules
+or to permanently record the results of an analysis program in a
+\irafname{data file}.
+
+\medskip \noindent \irafname{redirection} --- The allocation of an input or
+output stream to something other than the standard device. For example,
+\irafname{tasks} can be made to write output to files instead of terminals
+and the output of one task may be redirected to the input of another.
+
+\medskip \noindent \irafname{script task} --- An interpreted program written
+in the CL. A script task, like a compiled program, may have formal parameters
+and local variables. A script task may call another task, including another
+script task, but may not call itself.
+To the caller, script tasks and compiled programs are equivalent.
+
+\medskip \noindent \irafname{SDAS} --- Science Data Analysis System. A set
+of applications routines that are under development at STScI.
+
+\medskip \noindent \irafname{SPP} --- The IRAF Subset Preprocessor Language.
+A general purpose language patterned after Ratfor and C, the SPP provides
+advanced capabilities, modern control constructs, enhanced portability,
+and support for the IRAF runtime library (CL interface, etc.).
+
+\medskip \noindent \irafname{STF} --- The STScI SDAS group data image format.
+Refers to the physical format in which images are stored on disk, as well as
+to the \irafname{IKI} kernel used to access images stored externally in the
+STF format.
+
+\medskip \noindent \irafname{STScI} --- Space Telescope Science Institute.
+
+\medskip \noindent \irafname{system interface} --- The interface between
+the portable IRAF software and the host operating
+system. The system interface is a \irafname{virtual operating system}.
+The system interface routines, described in \reference{A Reference Manual
+for the IRAF System Interface}
+are in principle the only parts of a system that need to be changed
+when porting the system to a new computer.
+
+\medskip \noindent \irafname{task} --- A CL callable program unit.
+CL tasks may be script tasks, external programs,
+or compiled procedures which are built in to the CL.
+
+\medskip \noindent \irafname{task statement} --- (1) The CL statement that
+enters the name of a task in the IRAF task dictionary,
+defines the type of task, and in the case of a compiled task, the name of
+the process in which it resides.
+(2) The statement in the SPP language that defines a list of programs
+to be linked together to form a single process.
+
+\medskip \noindent \irafname{template} --- A string consisting of one or more
+names, which may or may not contain patterns
+(with \irafname{metacharacters}).
+
+\medskip \noindent \irafname{text file} --- A file which contains only
+text (ASCII character data), and which is maintained
+in the form expected by the text processing tools of the host OS.
+
+\medskip \noindent \irafname{Troff} --- The UNIX text formatter.
+
+\medskip \noindent \irafname{unary operator} --- An operator which operates on
+a single operand, e.g., the minus sign in the expression ``$-x$''.
+
+\medskip \noindent \irafname{UNIX} --- An operating system developed at Bell
+Labs in the early 1970s by Ken Thompson and Dennis Ritchie. Originally
+developed for the PDP11, UNIX is now available on a wide range of machines,
+ranging from micros to superminis, mainframes, and supercomputers.\\
+UNIX is the software development system for the IRAF project at NOAO.
+
+\medskip \noindent \irafname{virtual file} --- A file that uses a machine
+independent filename within IRAF. The virtual filename is mapped to its
+host OS counterpart by the CL.
+
+\medskip \noindent \irafname{virtual memory} --- A form of addressing that
+enables a process to address locations that are not in physical memory.
+The amount of physical memory available to a process is known as the
+\emphasize{working set} of a process; the virtual address space is organized
+into a series of fixed size \emphasize{pages}. Pages which are not
+\emphasize{memory resident}, i.e., not in the working set, reside on some form
+of backing store, usually a disk file. When a page is referenced which is not
+in the working set, a \emphasize{page fault} occurs, causing the page to be
+read into the working set.
+
+\medskip \noindent \irafname{virtual operating system} --- A set of system
+calls that define primitive functions comparable
+to those provided by an actual operating system.
+IRAF provides routines (the so-called
+\irafname{program interface}) for file access, process initiation and control,
+exception handling, logical names, etc.
+
+\medskip \noindent \irafname{VMS} --- The native operating system for the
+Digital VAX series of supermini computers.
+
+\medskip \noindent \irafname{VOS} --- The IRAF Virtual Operating System.
+The VOS implements all of the basic functionality provided by IRAF, and defines
+the environment in which applications programs are written. For example,
+the VOS provides facilities for file access, image access, access to graphics
+and image display devices, access to the command language to fetch parameters
+etc., process control and exception handling facilities, and so on. The VOS
+is written in portable SPP using the facilities provided by the IRAF
+\irafname{kernel}.
+
+\medskip \noindent \irafname{Z-routines} --- Machine dependent routines used
+to interface to the host operating system. The IRAF Z-routines are maintained
+in the package \taskname{OS}.
+
+\onecolumn
+
+\end{document}