diff --git a/doc/Makefile.am b/doc/Makefile.am new file mode 100644 index 0000000..d4f0f51 --- /dev/null +++ b/doc/Makefile.am @@ -0,0 +1,18 @@ + + +#dist_doc_DATA=doc/ikarus-users-guide.pdf +EXTRA_DIST = ikarus-users-guide.tex ikarus-users-guide.bib ikarus-users-guide.pdf + +TEX=xelatex -output-driver="xdvipdfmx -q -E" + +ikarus-users-guide.pdf: ikarus-users-guide.tex ikarus-users-guide.bib + $(TEX) ikarus-users-guide + makeindex ikarus-users-guide + bibtex ikarus-users-guide + $(TEX) ikarus-users-guide + $(TEX) ikarus-users-guide + +all: ikarus-users-guide.pdf + +clean: + rm -f *.aux *.log *.toc *.out *.idx *.ind *.ilg diff --git a/doc/ikarus-users-guide.bib b/doc/ikarus-users-guide.bib new file mode 100644 index 0000000..638f4dc --- /dev/null +++ b/doc/ikarus-users-guide.bib @@ -0,0 +1,41 @@ + +@article{ r6rs, + author = "Michael Sperber and R. Kent Dybvig and Matthew Flatt + and Anton Van Straaten {(Editors)}", + title = "Revised$^{6}$ Report on the Algorithmic Language {Scheme}", + year = "2007" +} + + +@inproceedings{dybvig93guardians, +author = {R. Kent Dybvig and Carl Bruggeman and David Eby}, +title = {Guardians in a generation-based garbage collector}, +booktitle = "PLDI '93", +pages = "207-216", +month = jun, +year = 1993, +annote = {Introduces guardians and describes the implementation of +guardians and weak pairs in Chez Scheme.} +} + +@techreport{dybvig:sm, +author = {R. Kent Dybvig and David Eby and Carl Bruggeman}, +title = {Don't stop the {BiBOP}: Flexible and efficient storage +management for dynamically-typed languages}, +institution = "Indiana University", +number = 400, +month = "March", +year = 1994, +annote = {Describes Chez Scheme's storage management system.} +} + +@inproceedings{ghuloum07hashtables, +author = {Abdulaziz Ghuloum and R. Kent Dybvig}, +title = {Generation Friendly Eq Hash Tables}, +booktitle = "Workshop on Scheme and Functional Programming", +pages = "207-216", +month = sep, +year = 2007 +} + + diff --git a/doc/ikarus-users-guide.tex b/doc/ikarus-users-guide.tex new file mode 100644 index 0000000..113ec77 --- /dev/null +++ b/doc/ikarus-users-guide.tex @@ -0,0 +1,616 @@ + +\documentclass[onecolumn, 12pt, twoside, openright, dvipdfm]{book} +\usepackage{fontspec} + +\defaultfontfeatures{Scale=MatchLowercase} +\setmainfont[Mapping=tex-text]{Cochin} +%\setmainfont[Mapping=tex-text]{Palatino} +\setsansfont[Mapping=tex-text]{Geneva} +\setmonofont{Monaco} + +\usepackage{fancyhdr} +\usepackage{makeidx} +\makeindex + +\usepackage[dvipdfm,CJKbookmarks,bookmarks=true,bookmarksopen=true]{hyperref} +\hypersetup{ + pdftitle={}, + pdfauthor={Abdulaziz Ghuloum}, + pdfkeywords={}, + bookmarksnumbered=true, + %pagebackref=true, + breaklinks=true, +% pdfview=FitH, % Or try pdfstartview={FitV}, This lead to uncorrect bookmarks + urlcolor=cyan, + colorlinks=true, + citecolor=blue, %citeref's color + linkcolor=blue, +} + +\usepackage{rotating} +\usepackage{multicol,ragged2e} + +%\pagestyle{fancy} + +\renewcommand{\sectionmark}[1]{\markright{\thesection\ #1}} +\fancyhf{} +\fancyhead[LE,RO]{\bfseries\thepage} +\fancyhead[LO]{\bfseries\rightmark} +\fancyhead[RE]{\bfseries\leftmark} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} +\renewcommand{\headheight}{15pt} + +\newcommand{\coderefpage}[1]{figure~\ref{#1}, p.~\pageref{#1}} +\newcommand{\figrefpage}[1]{figure~\ref{#1}, p.~\pageref{#1}} + +\newcommand{\coderef}[1]{figure~\ref{#1}} +\newcommand{\figref}[1]{figure~\ref{#1}} + +\newcommand{\secref}[1]{section~\ref{#1}} +\newcommand{\rnrs}[1]{R$^{\mathrm{#1}}$RS} + +\newcommand{\BoxedText}[2]{ + \vspace{.05in} + \begin{center} + \begin{tabular}{|p{4.6in}|} {\large \emph{#1}} #2 \end{tabular} + \end{center} + \vspace{.05in} +} + +\newcommand{\testfile}[2]{\texttt{tests-{\ref{#1}}-{#2}.ss}} + +\newenvironment{Language} +{ + \begin{center} + \begin{tabular}{|p{4.5in}|} {\large \emph{Input Language:}} + \begin{center} + \begin{tabular}{@{}r@{ }c@{ }l@{}} +}{ + \end{tabular} + \end{center} + \end{tabular} + \end{center} +} + +\begin{document} + + +\frontmatter +\title{Ikarus Scheme User's Guide} + +\author{Abdulaziz Ghuloum} + +\pagestyle{empty} + +\mbox{} +\vspace{3in} + +{ +\fontsize{66}{66} +\fontspec{Hoefler Text Italic} +\begin{center} +Ikarus Scheme User's Guide +\end{center} } +\noindent +\rule{\textwidth}{6pt} +{\fontsize{18}{18} +\fontspec{Hoefler Text Italic} +\hfill{} +Volume 1: Quick Start (Preliminary Document) +} +\vfill +{ +\fontsize{24}{24} +\fontspec{Hoefler Text Italic} +\hfill{} Abdulaziz Ghuloum +} + +{ +\fontsize{18}{18} +\fontspec{Hoefler Text Italic} +\hfill{} \today +} + +\newpage +\mbox{} +\vfill{} +\noindent +Ikarus Scheme User's Guide\\ +Volume 1: Quick Start (Preliminary Document)\\ +Copyright \copyright{} 2007, Abdulaziz Ghuloum\\ + +\noindent +Permission is granted to copy, distribute and/or modify this +document under the terms of the GNU Free Documentation License, +Version 1.2 published by the Free Software +Foundation; with no Invariant Sections, the Front-Cover Texts +being \emph{``Ikarus Scheme User's Guide''}, and +no Back-Cover Texts. A copy of the license is included in the +section entitled ``GNU Free Documentation License''. + +\newpage + +\pagestyle{fancy} +\tableofcontents + +\newpage + +% \chapter{Preface} +% +% Here\index{Preface, Great One} +% +% +% \begin{verbatim} +% (library (foo) +% (export x) +% (import (rnrs)) +% (define y 13) +% (define-syntax x +% (syntax-rules () +% [(_ n) (+ n y)])) +% \end{verbatim} + + + + +\mainmatter +\setlength{\parindent}{0pt} +\setlength{\parskip}{2.0ex plus 0ex minus 0ex} +\chapter{Getting Started} +\section{Introduction} + +Ikarus Scheme is an implementation of the Scheme programming +language\cite{steele:scheme}. The prerelease version of Ikarus +implements the majority of the features found in the current +standard, the Revised$^6$ report on the algorithmic language +Scheme\cite{r6rs}. Subsequent revisions will proceed towards +completing the set of \rnrs{6} features. + +The main purpose behind releasing Ikarus early is to give Scheme +programmers the opportunity to experiment with the various new +features that were newly introduced in \rnrs{6}. The most important +of such features is the ability to structure large programs into +libraries; where each library extends the language through +procedural and syntactic abstractions. Many useful libraries can be +written using the currently supported set of \rnrs{6} features +including text processing tools, symbolic logic systems, +interpreters and compilers, and many mathematical and scientific +packages. It is our hope that this release will encourage the +Scheme community to write and to share their most useful \rnrs{6} +libraries. +\newpage + +\section{Technology Overview} + +Ikarus Scheme provides the programmer with many advantages: + +\textbf{Optimizing code generator:} The compiler's backend employs +state of the art technologies in code generation that produce fast +efficient machine code. When developing computationally intensive +programs, one is not constrained by using a slow interpreter. + +\textbf{Fast incremental compilation:} Every library and script is +quickly compiled to native machine code. When developing large +software, one is not constrained by how slow the batch compiler +runs. + +\textbf{Robust and fine-tuned standard libraries:} The standard +libraries are written such that they perform as much error checking +as required to provide a safe and fast runtime environment. + +\textbf{Multi-generational garbage collector:} The +BiBOP\cite{dybvig:sm} based garbage collector used in Ikarus allows +the runtime system to expand its memory footprint as needed. Up to +four gigabytes of data can be used and unneeded memory is released +back to the operating system. + +\textbf{Supports many operating systems:} Ikarus runs on the most +popular and widely used operating systems for servers and personal +computers. The supported systems include Mac~OS~X, +GNU/Linux, and Microsoft Windows. + + +\section{System Requirements} + +\subsection{Hardware} + +Ikarus Scheme runs on the IA-32 (\emph{x86}) architecture +supporting SSE2 extensions. This includes the Athlon 64, +Sempron 64, and Turion 64 processors from AMD and the Pentium 4, Xeon, +Celeron, Pentium M, Core, and Core2 processors from Intel. The +system does not run on Intel Pentium III or earlier +processors. + +\subsection{Operating Systems} + +Ikarus is tested under the following operating systems: + +\begin{itemize} +\item Mac OS X version 10.4. +\item Linux 2.6.18 (Debian, Fedora, Gentoo, and Ubuntu). +\item Microsoft Windows XP (using Cygwin 1.5.24). +\end{itemize} + +\subsection{Additional Software} + +\begin{itemize} +\item\textbf{GMP:} Ikarus uses the GNU Multiple Precision Arithmetic +Library (GMP) for some bignum arithmetic operations. To build +ikarus from scratch, GMP version 4.2 or better must be installed +along with the required header files. Pre-built GMP packages es are +available for most operating systems. Alternatively, GMP can be +downloaded from \url{http://gmplib.org/}. + +\item\textbf{GCC:} The GNU C Compiler is required to build the ikarus +executable (e.g. the garbage collector, loader, and OS-related +runtime). GCC versions 4.1 and 4.2 were used successfully to build +ikarus. + +\item\textbf{Autoconf and Automake:} The GNU Autoconf (2.59 or better) +and GNU Automakei (1.6.3 or better) tools are required if one +wishes to modify the ikarus source base. They are not +required to build the official release of ikarus. + +\item\textbf{XeLaTeX:} The XeLaTeX typesetting system is required +for building the documentation. XeLaTeX (and XeTeX) is an +implementation of the LaTeX (and TeX) typesetting system. + +\end{itemize} + +\newpage + +\section{Installation} + +If you are familiar with installing Unix software on your system, +then all you need to know is that Ikarus uses the standard +installation method found in most other Unix software. Simply run +the following commands from the shell: +\begin{verbatim} + $ tar -zxf ikarus-pre-0-nnn.tar.gz + $ cd ikarus-pre-0-nnn + $ ./configure [--prefix=path] [CFLAGS=-I/dir] [LDFLAGS=-L/dir] + $ make + $ make install + $ +\end{verbatim} + +The rest of this section describes the build process in more +details. It is targetted to users who are unfamiliar with steps +mentioned above. + +\subsection{Installation Details} + +\begin{enumerate} + +\item Download the Ikarus source distribution. The source is +distributed as a \texttt{gzip}-compressed \texttt{tar} file +(\texttt{ikarus-pre-0-nnn.tar.gz} where \texttt{nnn} is a 3-digit +number indicating the current revision). The latest revision can be +downloaded from the following URL:\\ +\url{http://www.cs.indiana.edu/~aghuloum/ikarus/} + +\item Unpack the source distribution package. From your shell +command, type: +\begin{verbatim} + $ tar -zxf ikarus-pre-0-nnn.tar.gz +\end{verbatim} +This creates the base directory \texttt{ikarus-pre-0-nnn}. + +\item Configure the build system by running the \texttt{configure} +script located in the base directory. To do this, type the +following commands: +\begin{verbatim} + $ cd ikarus-pre-0-nnn + $ ./configure + checking build system type... i386-apple-darwin8.10.1 + checking host system type... i386-apple-darwin8.10.1 + ... + configure: creating ./config.status + config.status: creating Makefile + config.status: creating src/Makefile + config.status: creating scheme/Makefile + config.status: creating doc/Makefile + config.status: executing depfiles commands + $ +\end{verbatim} + +This configures the system to be built then installed in the +system-wide location (binaries are installed in +\texttt{/usr/local/bin}) . If you wish to install it +in another location (e.g. in your home directory), you can supply +a \texttt{--prefix} location to the \texttt{configure} script as +follows: + +\begin{verbatim} + $ ./configure --prefix=/path/to/installation/location +\end{verbatim} + +The \texttt{configure} script will fail if it cannot locate the +location where GMP is installed. If running \texttt{configure} +fails to locate GMP, you should supply the location in which the GMP +header file, \texttt{gmp.h}, and the GMP library file, +\texttt{libgmp.so}, are installed. This is done by supplying the +two paths in the \texttt{CFLAGS} and \texttt{LDFLAGS} arguments: + +\begin{verbatim} + $ ./configure CFLAGS=-I/path/to/include LDFLAGS=-L/path/to/lib +\end{verbatim} + +\item Build the system by running: +\begin{verbatim} + $ make +\end{verbatim} +This performs two +tasks. First, it builds the \texttt{ikarus} executable from the C +files located in the \texttt{src} directory. It then uses the +\texttt{ikarus} executable and the pre-built +\texttt{ikarus.boot.orig} boot file to rebuild the Scheme boot image +file \texttt{ikarus.boot} from the Scheme sources located in the +\texttt{scheme} directory. + +\item Install Ikarus by typing: +\begin{verbatim} + $ make install +\end{verbatim} +If you are installing Ikarus in a system-wide location, you might +need to have administrator privileges (use the \texttt{sudo} or +\texttt{su} commands). + +\item Test that Ikarus runs from the command line. +\begin{verbatim} + $ ikarus + Ikarus Scheme (Build 2007-10-20) + Copyright (c) 2006-2007 Abdulaziz Ghuloum + + > +\end{verbatim} +If you get the prompt, then Ikarus was successfully installed on +your system. You may need to update the \texttt{PATH} variable in +your environment to contain the directory in which the +\texttt{ikarus} executable was installed. + +Do not delete the \texttt{ikarus-pre-0-nnn} directory from which you +configured, built, and installed Ikarus. It will be needed if you +decide at a later time to uninstall Ikarus. + +\end{enumerate} + +\subsection{Uninstalling Ikarus} + +To uninstall Ikarus, use the following steps: + +\begin{verbatim} + $ cd path/to/ikarus-pre-0-nnn + $ make uninstall +\end{verbatim} + +\newpage + +\section{\index{Command-line switches}Command-line Switches} + +The \texttt{ikarus} executable recognizes a few command-line +switches that influence how Ikarus starts. + +\begin{itemize} + +\item \texttt{ikarus -h} + +The presence of the \texttt{-h} flag causes \texttt{ikarus} to +display a help message then exits. The help message summarises the +command-line switches. No further action is performed. + +\item \texttt{ikarus -b path/to/boot/file.boot} + +The \texttt{-b} flag (which requires an extra argument) directs +\texttt{ikarus} to use the specified boot file as the initial system +boot file. \index{Boot files} The boot file is a binary file that +contains all the code and data of the Scheme system. In the absence +of \texttt{-b} flag, the executable attempts to guess the location +of the boot file using the following strategy: +\begin{enumerate} + +\item If \texttt{ikarus} was started by supplying an explicit +location (e.g. \texttt{/usr/local/bin/ikarus} or \texttt{./ikarus}), +then the name of the boot file is the concatenation of a +\texttt{.boot} prefix to the executable file name (e.g. +\texttt{/usr/local/bin/ikarus.boot} or \texttt{./ikarus.boot}). + +\item Otherwise, \texttt{ikarus} assumes that it was started from a +location in the \texttt{PATH} environment variable. In that case, +it searches for the location of \texttt{ikarus} in the +\texttt{PATH}. If \texttt{ikarus} is found in +\texttt{/some/location/ikarus}, then the name of the boot file +becomes \texttt{/some/location/ikarus.boot}. + +\item Failing both guesses, \texttt{ikarus} prints an error message +and exits. + +\end{enumerate} + +The motivation for this strategy was to allow one to (1) rename the +\texttt{ikarus} executable and the corresponding boot file to some +new names (e.g. \texttt{my-ikarus} and \texttt{my-ikarus.boot}) without +conflicting with other installed versions of Ikarus, and (2) +override the location of the boot file for testing and building +purposes (e.g. the installation process using one boot file to build +another). + +The rest of the command-line arguments are recognized by the +standard Scheme run time system. They are processed after the +boot file is loaded. + +\item \texttt{ikarus --r6rs-script script-file-name [arguments ...]} + +\index{\rnrs{6} Script} The \texttt{--r6rs-script} argument +instructs Ikarus that the supplied file is an \rnrs{6} script. See +Section~\ref{sec:scripts} for a short introduction to writing \rnrs{6} +scripts. The script file name and any additional optional +\texttt{arguments} +can be obtained by calling the +\index{\texttt{command-line}}\texttt{command-line} procedure. + +\begin{verbatim} + $ cat test.ss + (import (rnrs)) + (write (command-line)) + (newline) + + $ ikarus --r6rs-script test.ss hi there + ("test.ss" "hi" "there") + $ +\end{verbatim} + +\item \texttt{ikarus files ... [-- arguments ...]} + +The lack of an \texttt{--r6rs-script} argument causes Ikarus to +start in interactive mode. Each of the \texttt{files} is first +loaded, in the interaction environment. The interaction environment +initially containes all the bindings exported from the +\texttt{(ikarus)} library (see Section~\ref{lib:ikarus}). The +optional \texttt{arguments} following the \texttt{--} marker can be obtained +by calling the \texttt{command-line} procedure. + + +\BoxedText{Note:}{The interactive mode is intended for quickly +experimenting with the built-in features. It is intended neither +for developing applications nor for writing any substantial pieces +of code. The main reason for this is that the innteraction between +\rnrs{6} libraries and the interactive environment is not well +understood. We hope to achieve better interaction between the two +subsystems in the future.} + +\end{itemize} + + + +\newpage + + +\chapter{\rnrs{6} Crash Course} + +* Describe major differences between r6 and r5 + +* Explain what a top-level program is + +* Explain what a library is + +* Explain what the standard R6RS libraries are + +\section{\label{sec:scripts}Writing a simple script} + +* Hello World example + +* Definitions (procedures) + +* Simple macros. + +\section{Writing simple libraries} + +\section{\rnrs{6} Standard Libraries} + +\subsection{\texttt{(rnrs (6))}} +a +\subsection{\texttt{(rnrs arithmetic bitwise (6))}} +a +\subsection{\texttt{(rnrs arithmetic fixnums (6))}} +a +\subsection{\texttt{(rnrs arithmetic flonums (6))}} +a +\subsection{\texttt{(rnrs bytevectors (6))}} +a +\subsection{\texttt{(rnrs conditions (6))}} +a +\subsection{\texttt{(rnrs control (6))}} +a +\subsection{\texttt{(rnrs enums (6))}} +a +\subsection{\texttt{(rnrs exceptions (6))}} +a +\subsection{\texttt{(rnrs files (6))}} +a +\subsection{\texttt{(rnrs hashtables (6))}} +\cite{ghuloum07hashtables} + +\subsection{\texttt{(rnrs io ports (6))}} +a +\subsection{\texttt{(rnrs io simple (6))}} +a +\subsection{\texttt{(rnrs lists (6))}} +a +\subsection{\texttt{(rnrs mutable-pairs (6))}} +a +\subsection{\texttt{(rnrs mutable-strings (6))}} +a +\subsection{\texttt{(rnrs programs (6))}} +a +\subsection{\texttt{(rnrs r5rs (6))}} +a +\subsection{\texttt{(rnrs records inspection (6))}} +a +\subsection{\texttt{(rnrs records procedural (6))}} +a +\subsection{\texttt{(rnrs records syntactic (6))}} +a +\subsection{\texttt{(rnrs sorting (6))}} +a +\subsection{\texttt{(rnrs syntax-case (6))}} +a +\subsection{\texttt{(rnrs unicode (6))}} +a + + + + +\chapter{Ikarus's Built-in Libraries} + +* list all ikarus libraries. + +* explain each of the exports. + +\section{\label{lib:ikarus}\texttt{(ikarus)}} +\section{\texttt{(ikarus files)}} +\section{\texttt{(ikarus parameters)}} +\section{\texttt{(ikarus posix)}} +\section{\texttt{(ikarus printing)}} +\section{\texttt{(ikarus symbols)}} +\section{\texttt{(ikarus timers)}} +\section{\texttt{(ikarus tracing)}} +\section{\texttt{(ikarus unicode)}} +\section{\texttt{(ikarus guardians)}} +\cite{dybvig93guardians} +\section{\texttt{(ikarus weak-pairs)}} +\section{\texttt{(ikarus modules)}} +\section{\texttt{(ikarus library-manager)}} + +% \chapter{Additional Libraries} +% +% \section{\texttt{(iu match)}} + + +% \chapter{The Programming Environment} +% +% \section{Working with Unicode} +% +% \section{Working} +% +% \section{Some Section Here} +% +% %\index{cheese!gouda!brie} +% %\index{cheese!gouda!none} +% \section{Additional Stuff} +% \subsection{And some sub stuff} + +\appendix + +\bibliographystyle{plain} +\bibliography{ikarus-users-guide} +\printindex + +\backmatter + + +\end{document} + + +