summaryrefslogtreecommitdiff
path: root/docsrc
diff options
context:
space:
mode:
Diffstat (limited to 'docsrc')
-rw-r--r--docsrc/bib/music.bib3465
-rw-r--r--docsrc/convert/convert.lsp171
-rw-r--r--docsrc/convert/convert2.lsp381
-rw-r--r--docsrc/convert/init.lsp9
-rw-r--r--docsrc/nyquist/adagio-nyquist.mss825
-rw-r--r--docsrc/nyquist/adagio.mss840
-rw-r--r--docsrc/nyquist/arcsine-fig.ps64
-rw-r--r--docsrc/nyquist/bernoulli-fig.ps1149
-rw-r--r--docsrc/nyquist/beta-fig.ps64
-rw-r--r--docsrc/nyquist/bilateral-fig.ps65
-rw-r--r--docsrc/nyquist/binomial-fig.ps1197
-rw-r--r--docsrc/nyquist/cauchy-fig.ps68
-rw-r--r--docsrc/nyquist/envfig.ps198
-rw-r--r--docsrc/nyquist/exponential-fig.ps60
-rw-r--r--docsrc/nyquist/gamma-fig.ps71
-rw-r--r--docsrc/nyquist/gaussian-fig.ps69
-rw-r--r--docsrc/nyquist/geometric-fig.ps1173
-rw-r--r--docsrc/nyquist/hyperbolic-fig.ps70
-rw-r--r--docsrc/nyquist/linear-fig.ps63
-rw-r--r--docsrc/nyquist/linear-fig.ps.ORIGINAL62
-rw-r--r--docsrc/nyquist/logistic-fig.ps69
-rw-r--r--docsrc/nyquist/moog-fig.ps2808
-rw-r--r--docsrc/nyquist/nymanimpl.mss467
-rw-r--r--docsrc/nyquist/nyquistman-sal-only.mss8113
-rw-r--r--docsrc/nyquist/nyquistman.mss8763
-rw-r--r--docsrc/nyquist/poisson-fig.ps1236
-rw-r--r--docsrc/nyquist/rampfig.ps694
-rw-r--r--docsrc/nyquist/shifttimefig.ps643
-rw-r--r--docsrc/nyquist/test.ps1020
-rw-r--r--docsrc/nyquist/warpfig.ps650
-rw-r--r--docsrc/nyquist/warpnotesfig.ps851
-rw-r--r--docsrc/nyquist/warponsetfig.ps864
-rw-r--r--docsrc/s2h/citations.lsp21
-rw-r--r--docsrc/s2h/do-nyquist-manual.lsp6
-rw-r--r--docsrc/s2h/s2h.lsp1642
-rw-r--r--docsrc/scribe.htm1523
-rwxr-xr-xdocsrc/sdl/part1.tex606
-rwxr-xr-xdocsrc/sdl/pjmcfg.sty127
-rwxr-xr-xdocsrc/sdl/sdl-man.tex87
-rw-r--r--docsrc/template/filcap.mss5
-rw-r--r--docsrc/toafs.bat5
-rw-r--r--docsrc/toafs.sh5
-rw-r--r--docsrc/xlisp/intgen.mss241
-rw-r--r--docsrc/xlisp/xlisp-doc/README11
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/apropos.htm268
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/arrays.htm430
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/binary.htm160
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/circular-lists.htm133
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp.htm161
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/ceiling.htm137
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/debug-mv.htm110
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/equalp.htm162
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/exp.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/expt.htm105
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/floor.htm150
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/global-multiple-values.htm142
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/log.htm95
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/mod.htm97
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-bind.htm193
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-call.htm119
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-list.htm112
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-prog1.htm106
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-setq.htm239
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-values.htm181
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/numbers.htm104
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/rem.htm93
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/remainder-and-modulus.htm93
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/round.htm141
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/rounding-and-truncation.htm179
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/sqrt.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/truncate.htm135
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/values-list.htm113
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/common-lisp/values.htm160
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/environment.htm1001
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/evaluation.htm131
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/examples.htm211
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/files.htm459
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/hash-tables.htm496
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/hexadecimal.htm151
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/lists.htm580
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/macros.htm302
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/math.htm824
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/octal.htm148
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/posix-chars.htm459
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/predicates.htm526
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/reader.htm311
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/sequences.htm563
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/strings.htm802
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/xlisp/ash.htm130
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/xlisp/bsh.htm127
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/xlisp/ceiling.htm103
-rw-r--r--docsrc/xlisp/xlisp-doc/examples/xlisp/floor.htm103
-rw-r--r--docsrc/xlisp/xlisp-doc/internals/c-printf.htm518
-rw-r--r--docsrc/xlisp/xlisp-doc/internals/xlisp-internals.html1206
-rw-r--r--docsrc/xlisp/xlisp-doc/manual/contents.htm858
-rw-r--r--docsrc/xlisp/xlisp-doc/manual/links.htm3
-rw-r--r--docsrc/xlisp/xlisp-doc/manual/manual.css34
-rw-r--r--docsrc/xlisp/xlisp-doc/manual/objects.htm358
-rwxr-xr-xdocsrc/xlisp/xlisp-doc/manual/part15.html2131
-rw-r--r--docsrc/xlisp/xlisp-doc/manual/sal.htm160
-rw-r--r--docsrc/xlisp/xlisp-doc/manual/xlisp-man-033.htm356
-rw-r--r--docsrc/xlisp/xlisp-doc/manual/xlisp.htm1256
-rw-r--r--docsrc/xlisp/xlisp-doc/misc/ascii-table.htm1403
-rw-r--r--docsrc/xlisp/xlisp-doc/misc/c-printf.htm560
-rw-r--r--docsrc/xlisp/xlisp-doc/misc/links.htm115
-rw-r--r--docsrc/xlisp/xlisp-doc/misc/preface.htm116
-rw-r--r--docsrc/xlisp/xlisp-doc/objects/advanced-objects.htm590
-rw-r--r--docsrc/xlisp/xlisp-doc/objects/smalltalk.htm441
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/abs.htm78
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/acos.htm93
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/addition.htm87
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/address-of.htm99
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/alloc.htm98
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/alphanumericp.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/and.htm118
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/append.htm90
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/apply.htm89
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/aref.htm105
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/arrayp.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/asin.htm93
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/assoc.htm121
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/atan.htm77
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/atom.htm90
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/backquote.htm170
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/baktrace.htm117
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/bigendianp.htm69
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/block.htm94
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/both-case-p.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/boundp.htm104
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/break.htm107
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/caaaar.htm134
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/caaar.htm106
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/caar.htm101
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/car.htm85
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/case.htm171
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/catch.htm197
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/cddddr.htm135
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/cdddr.htm104
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/cddr.htm101
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/cdr.htm85
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/cerror.htm23
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-code.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-downcase.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-equal-i.htm89
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-equal-s.htm91
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-greaterp-i.htm91
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-greaterp-s.htm91
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-int.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-lessp-i.htm91
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-lessp-s.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-not-equal-i.htm90
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-not-equal-s.htm98
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-not-greaterp-i.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-not-greaterp-s.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-not-lessp-i.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-not-lessp-s.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char-upcase.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/char.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/characterp.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/class.htm113
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/clean-up.htm90
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/close.htm85
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/code-char.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/cond.htm95
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/cons.htm74
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/consp.htm95
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/continue.htm90
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/cos.htm71
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/decf.htm88
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/decrement.htm75
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/defmacro.htm142
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/defun.htm134
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/delete-if-not.htm107
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/delete-if.htm110
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/delete.htm99
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/digit-char-p.htm87
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/digit-char.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/division.htm101
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/do-star.htm144
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/do.htm133
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/dolist.htm111
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/dotimes.htm101
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/dribble.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/echoenabled.htm68
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/endp.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/eq.htm93
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/eql.htm99
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/equal.htm111
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/error.htm161
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/errset.htm117
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/eval.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/evalhook.htm142
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/evenp.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/exit.htm69
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/exp.htm76
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/expand.htm91
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/expt.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/fboundp.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/filep.htm75
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/find-in-xlisp-path.htm66
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/first.htm74
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/flatc.htm74
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/flatsize.htm74
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/flet.htm87
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/float.htm71
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/floatp.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/format.htm161
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/fourth.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/funcall.htm102
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/function.htm87
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/gc.htm74
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/gcd.htm75
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/gensym.htm89
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/get-env.htm64
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/get-key.htm66
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/get-lambda-expression.htm78
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/get-output-stream-list.htm75
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/get-output-stream-string.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/get-temp-path.htm68
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/get-user.htm67
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/get.htm97
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-applyhook.htm78
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-breakenable.htm106
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-debug-io.htm72
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-error-output.htm71
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-evalhook.htm123
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-file-separator.htm68
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-float-format.htm179
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-gc-flag.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-gc-hook.htm125
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-integer-format.htm129
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-obarray.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-print-case.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-readtable.htm166
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-rslt.htm83
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-standard-input.htm73
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-standard-output.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-trace-output.htm71
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-tracelimit.htm103
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-tracelist.htm74
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-tracenable.htm105
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/global-unbound.htm70
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/go.htm106
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/hash.htm90
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/if.htm83
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/incf.htm88
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/increment.htm75
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/info.htm63
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/int-char.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/integerp.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/intern.htm117
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/interpolate.htm76
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/intersection.htm76
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-answer.htm107
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-class.htm83
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-constituent.htm95
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-isa.htm83
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-isnew.htm96
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-mescape.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-new.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-nmacro.htm103
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-sescape.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-show.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-tmacro.htm107
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keyword-white-space.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/keywordp.htm78
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/labels.htm101
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/lambda-keyword-aux.htm116
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/lambda-keyword-key.htm132
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/lambda-keyword-optional.htm98
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/lambda-keyword-rest.htm104
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/lambda.htm109
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/last.htm75
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/length.htm74
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/let-star.htm106
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/let.htm94
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/list.htm74
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/listdir.htm67
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/listp.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/load.htm162
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/log.htm67
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/logand.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/logior.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/lognot.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/logxor.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/loop.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/lower-case-p.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/macroexpand-1.htm85
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/macroexpand.htm83
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/macrolet.htm146
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/make-array.htm95
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/make-string-input-stream.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/make-string-output-stream.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/make-symbol.htm93
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/mapc.htm87
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/mapcar.htm151
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/mapl.htm89
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/maplist.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/max.htm73
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/member.htm93
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/min.htm73
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/minusp.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/multiplication.htm87
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/nconc.htm89
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/nil.htm70
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/not.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/nstring-downcase.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/nstring-upcase.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/nth.htm74
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/nthcdr.htm75
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/null.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/number-equal.htm87
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/number-greaterp.htm90
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/number-lessp.htm90
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/number-not-equal.htm101
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/number-not-greaterp.htm91
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/number-not-lessp.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/numberp.htm78
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/object.htm120
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/objectp.htm72
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/oddp.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/open-binary.htm103
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/open.htm117
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/or.htm87
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/peek-char.htm105
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/peek.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/pi.htm66
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/plus.htm75
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/poke.htm88
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/pop.htm85
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/power.htm77
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/pprint.htm94
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/prin1.htm94
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/princ.htm94
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/print.htm95
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/profile.htm85
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/prog-star.htm101
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/prog.htm96
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/prog1.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/prog2.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/progn.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/progv.htm133
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/psetq.htm78
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/push.htm83
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/putprop.htm108
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/quit.htm69
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/quote.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/random.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/read-byte.htm100
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/read-char.htm100
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/read-float.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/read-int.htm78
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/read-line.htm97
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/read.htm125
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/real-random.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/reference-copyright.htm50
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/reference-format.htm83
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/reference-index.htm2468
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/reference.css34
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/rem.htm88
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/remove-if-not.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/remove-if.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/remove.htm100
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/remprop.htm94
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/rest.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/restore.htm112
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/return-from.htm89
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/return.htm93
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/reverse.htm73
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/room.htm90
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/round.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/rplaca.htm99
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/rplacd.htm89
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/rrandom.htm66
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/save.htm124
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/second.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/self.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/send-super.htm87
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/send.htm96
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/set-difference.htm75
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/set.htm83
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/setdir.htm65
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/setf.htm273
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/setq.htm70
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/setup-console.htm72
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/sin.htm76
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/sort.htm104
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/soundp.htm70
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/sqrt.htm76
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/strcat.htm72
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/streamp.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-downcase.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-equal-i.htm111
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-equal-s.htm96
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-greaterp-i.htm98
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-greaterp-s.htm99
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-left-trim.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-lessp-i.htm98
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-lessp-s.htm98
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-not-equal-i.htm112
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-not-equal-s.htm104
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-not-greaterp-i.htm99
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-not-greaterp-s.htm99
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-not-lessp-i.htm98
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-not-lessp-s.htm99
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-right-trim.htm85
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-search.htm68
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-trim.htm84
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string-upcase.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/string.htm88
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/stringp.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/sublis.htm129
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/subseq.htm83
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/subsetp.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/subst.htm96
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/subtraction.htm88
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/symbol-function.htm67
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/symbol-name.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/symbol-plist.htm85
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/symbol-value.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/symbolp.htm85
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/system.htm73
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/t.htm71
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/tagbody.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/tan.htm76
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/terpri.htm90
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/third.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/throw.htm23
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/top-level.htm91
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/trace.htm93
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/truncate.htm74
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/type-of.htm103
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/union.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/unless.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/untrace.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/unwind-protect.htm137
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/upper-case-p.htm76
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/vector.htm73
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/when.htm82
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/while.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/write-byte.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/write-char.htm92
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/write-float.htm80
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/write-int.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/reference/zerop.htm81
-rw-r--r--docsrc/xlisp/xlisp-doc/start.htm86
-rw-r--r--docsrc/xlisp/xlisp-doc/tutorials/binary-io.htm79
-rw-r--r--docsrc/xlisp/xlisp-doc/tutorials/environment.htm530
-rw-r--r--docsrc/xlisp/xlisp-doc/tutorials/file-io.htm349
-rw-r--r--docsrc/xlisp/xlisp-doc/tutorials/lisp-faq.htm199
-rw-r--r--docsrc/xlisp/xlisp-doc/tutorials/lisp-hints.htm2055
-rw-r--r--docsrc/xlisp/xlisp-doc/tutorials/nyquist.htm383
-rw-r--r--docsrc/xlisp/xlisp-doc/tutorials/shell-utilities.htm539
-rw-r--r--docsrc/xlisp/xlisp-doc/tutorials/tutorials.htm28
-rw-r--r--docsrc/xlisp/xlisp-doc/tutorials/xlisp-objects.htm839
-rw-r--r--docsrc/xlisp/xlisp-doc/tutorials/xobj-1.pngbin0 -> 1551 bytes
-rw-r--r--docsrc/xlisp/xlisp-no-sal.mss3339
-rw-r--r--docsrc/xlisp/xlisp.mss4016
458 files changed, 107976 insertions, 0 deletions
diff --git a/docsrc/bib/music.bib b/docsrc/bib/music.bib
new file mode 100644
index 0000000..13b1d7b
--- /dev/null
+++ b/docsrc/bib/music.bib
@@ -0,0 +1,3465 @@
+@article(4CED
+ ,key "Abbot"
+ ,author "Abbot, Curtis"
+ ,title "The 4CED Program"
+ ,journal "Computer Music Journal"
+ ,Volume 5
+ ,Number 1
+ ,Month "Spring"
+ ,Year 1981
+ ,Pages "13-33"
+ )
+
+@book(surveys
+ ,key "Abbot"
+ ,editor "Abbot. C."
+ ,publisher "ACM"
+ ,title "Computing Surveys"
+ ,year 1985
+ ,volume 17
+ ,note "No. 2 (June)"
+ )
+
+@book(abelson
+ ,key "Abelson"
+ ,author "Abelson, H. and G. J. Sussman, with J. Sussman"
+ ,title "Structure and Interpretation of Computer Programs"
+ ,publisher "MIT Press"
+ ,year 1985
+ )
+
+@inproceedings(Mach
+ ,author "Accetta, M., R. Baron, W. Bolosky, D. Golub, R. Rashid, A. Tevanian, M. Young"
+ ,title "Mach: A New Kernel Foundation for UNIX Development"
+ ,organization "Usenix"
+ ,booktitle "Proc. of Summer Usenix"
+ ,year 1986
+ ,month July
+ )
+
+@article(ashton
+ ,key "Ames"
+ ,author "Ames, C."
+ ,title "The ASHTON Score-Transcription Utility"
+ ,journal "Interface"
+ ,volume 14
+ ,pages "165-173"
+ ,year 1985
+ )
+
+@book(hypertext89
+ ,author "ACM"
+ ,key "ACM"
+ ,organization "ACM"
+ ,title "Hypertext '89 Proceedings"
+ ,publisher "ACM"
+ ,year 1989
+ )
+
+@inproceedings(rodet85
+ ,key "Adrien"
+ ,author "Adrien, J-M, and X. Rodet"
+ ,title "Physical Models of Instruments: A Modular Approach, Application to Strings"
+ ,organization "Computer Music Association"
+ ,booktitle "Proceedings of the 1985 International Computer Music Conference"
+ ,year 1985
+ ,pages "85-96"
+ )
+
+@book(aho
+ ,author="Aho, Hopcroft, and Ullman"
+ ,title="The Design and Analysis of Computer Algorithms"
+ ,publisher="Addison Wesley"
+ ,key="Aho"
+ ,year=1974
+ )
+
+@inproceedings(Allen90
+ ,key "Allen"
+ ,author "Allen, P. E. and R. B. Dannenberg"
+ ,title "Tracking Musical Beats in Real Time"
+ ,organization "International Computer Music Association"
+ ,booktitle "ICMC Glasgow 1990 Proceedings"
+ ,editor "S. Arnold and G. Hair"
+ ,year 1990
+ ,pages "140-143"
+ )
+
+@unpublished(Anderson85b
+ ,key "Anderson"
+ ,author "Anderson, D. P. and R. Kuivila"
+ ,title "Continuous Abstractions for Discrete Event Languages"
+ ,year "1985"
+ )
+
+@article(Formula-TOCS
+ ,key "Anderson"
+ ,author "Anderson, D. P. and R. Kuivila"
+ ,title "A System for Computer Music Performance"
+ ,journal "ACM Transactions on Computer Systems"
+ ,volume 8
+ ,number 1
+ ,pages 56-82
+ ,month February
+ ,year 1990
+)
+
+@article(Formula
+ ,key "Anderson"
+ ,author "Anderson, D. P. and R. Kuivila"
+ ,title "Accurately Timed Generation of Discrete Musical Events"
+ ,journal "Computer Music Journal"
+ ,volume 10
+ ,number 3
+ ,month "Fall"
+ ,year 1986
+ ,pages "48-56"
+ )
+
+@techreport(acme
+ ,key "Anderson"
+ ,title "Abstractions for Continuous Media in a Network Window System"
+ ,author "Anderson, D. P., R. Govindan, G. Homsy"
+ ,institution "Computer Science Division (EECS), U.C. at Berkeley"
+ ,number "UCB/CSD 90/596"
+ ,year 1990
+)
+
+@article(acmecomputer
+ ,key "Anderson"
+ ,title "A Continuous Media I/O Server and Its Synchronization Mechanism"
+ ,author "Anderson, D. P. and G. Homsy"
+ ,journal "Computer"
+ ,month "October"
+ ,pages "51-57"
+ ,year 1991
+)
+
+
+@article(andrews
+ ,key Andrews
+ ,author "Andrews, G. R."
+ ,title "Concepts and Notations for Concurrent Programming"
+ ,journal "ACM Computing Surveys"
+ ,volume 15
+ ,number 1
+ ,month "March"
+ ,year 1983
+ ,pages "3-43"
+ )
+
+
+@article(lisp-tutor
+ ,key = Anderson
+ ,author "Anderson, J. R., F. G. Conrad, and A. T. Corbett"
+ ,title "Skill acquisition and the LISP TUTOR"
+ ,journal "Cognitive Science"
+ ,volume 13
+ ,number 4
+ ,month "Oct-Dec"
+ ,year 1989
+ ,pages "467-505"
+)
+
+@misc(smdl
+ ,key="ANSI"
+ ,author="ANSI"
+ ,title="X3V1.8M/SD-7 Journal of Development, Standard Music Description Language, Part 2: Technical Description and Formal Definition"
+ ,howpublished="International Computer Music Association, San Francisco"
+ )
+
+
+@article(Lucid
+ ,key "Ashcroft"
+ ,author "Ashcroft, E. A. and W. W. Wadge"
+ ,title "Lucid, a Nonprocedural Language with Iteration"
+ ,journal "Communications of the ACM"
+ ,volume "20"
+ ,number "7"
+ ,month "July"
+ ,year "1977"
+ ,pages "519-526"
+ )
+
+@inproceedings(Assayag
+ ,key "Assayag"
+ ,author "Assayag, G., and D. Timis"
+ ,title "A ToolBox for Music Notation"
+ ,pages "173-178"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1986"
+ ,editor "P. Berg"
+ ,year = "1986"
+ ,organization = "International Computer Music Association"
+ )
+
+@article(Backus
+ ,key "Backus"
+ ,author "Backus, John"
+ ,title "Can Programming Be Liberated from the von Neumann Style?"
+ ,journal "Communications of the ACM"
+ ,Volume 21
+ ,Number 8
+ ,Month "August"
+ ,Year 1978
+ ,Pages "613-641"
+ )
+
+@article(Baird93
+ ,key "Baird"
+ ,author "Baird, B., D. Blevins, N. Zahler"
+ ,title "Artificial Intelligence and Music: Implementing an Interactive Computer Performer"
+ ,journal "Computer Music Journal"
+ ,volume 17
+ ,number 2
+ ,month "Summer"
+ ,year 1993
+ ,pages "73-79"
+ )
+
+@techreport(balaban
+ ,key "Balaban"
+ ,title "Music Structures: A Temporal-Hierarchical Representation
+ For Music"
+ ,author "Balaban, Mira"
+ ,institution "Ben Gurion University Department of Mathematics and
+ Computer Science"
+ ,number "FC-TR-021 MCS-313"
+ ,year 1989
+ )
+
+@article(Balzano80
+ ,key="Balzano"
+ ,author="Balzano, G. J."
+ ,title="The Group-theoretic Description of 12-Fold and Microtonal
+Pitch Systems"
+ ,journal="Computer Music Journal"
+ ,number="4"
+ ,year="1980"
+ ,volume="4"
+ ,pages="66-84"
+ )
+
+@book(FMA
+ ,key="Benade"
+ ,author="Benade, A. H."
+ ,title="Fundamentals of Musical Acoustics"
+ ,publisher="Oxford University Press"
+ ,year="1976"
+ )
+
+@inproceedings(berger
+ ,key "Berger"
+ ,author "Berger, Jonathan"
+ ,title "Theory and Practice: Chicken and Egg"
+ ,booktitle "The Arts and Technology II: A Symposium"
+ ,pages "24-30"
+ ,year 1989
+ ,organization "Connecticut College"
+ )
+
+@article(bentley, key="Bentley"
+ ,author="Bentley, Jon"
+ ,title="Programming Pearls"
+ ,journal="Communications of the ACM"
+ ,volume="28", number="3"
+ ,pages="245-250"
+ ,year=1985
+ )
+
+@unpublished(Betz
+ ,key "Betz"
+ ,author "Betz, David"
+ ,title "XLISP: An Experimental Object-oriented Language, Version 1.7"
+ ,date "June 2"
+ ,year 1986
+ ,note "(program documentation)"
+ )
+
+@Misc(Blackwood80
+ ,key="Blackwood"
+ ,author="Blackwood, E."
+ ,title="Twelve Microtonal Etudes for Electronic Music Media"
+ ,howpublished="Stereo LP Recording available from Easley Blackwood,
+5300 S. Shore Drive, Chicago, IL 60615"
+ ,note="score published by G. Schirmer"
+ )
+
+@book(knowledgerep
+ ,key "Brachman"
+ ,author "Brachman, R. J., and H. J. Levesque, eds."
+ ,title "Readings in Knowledge Representation"
+ ,publisher "M. Kaufmann"
+ ,year 1985
+ ,address "Los Altos, Calif."
+ )
+
+@book(MultimediaInterfaceDesign
+ ,key "Blattner"
+ ,editors "Blattner, M. M. and R. B. Dannenberg"
+ ,title "Multimedia Interface Design"
+ ,publisher "ACM Press"
+ ,year 1992
+)
+
+@inproceedings(bilmes92
+ ,key "Bilmes"
+ ,author "Bilmes, J."
+ ,title "A Model for Musical Rhythm"
+ ,organization "Computer Music Association"
+ ,booktitle = "ICMC Proceedings"
+ ,year = "1992"
+ ,pages "207-210"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ )
+
+@article(Blesser
+ ,key "Blesser"
+ ,author "Blesser, B. A."
+ ,title "Digitization of Audio: A Comprehensive Examination of Theory,
+Implementation, and Current Practice"
+ ,journal "Journal of the Audio Engineering Society"
+ ,volume 26
+ ,number 10
+ ,pages "739-771"
+ ,year 1978
+ ,month "October"
+ )
+
+@inproceedings(Bloch
+ ,key "Bloch"
+ ,author "Bloch, J. J. and R. B. Dannenberg"
+ ,title "Real-Time Computer Accompaniment of Keyboard Performances"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the International Computer Music Conference 1985"
+ ,editor "B. Truax"
+ ,year 1985
+ ,pages "279-290"
+ )
+
+@inproceedings(bloom,
+ key = "Bloom",
+ Author = "Bloom, P. J.",
+ Publisher = "IEEE",
+ year = "1984",
+ title = "Use of Dynamic Programming for Automatic Synchronization of
+ Two Similar Speech Signals",
+ booktitle = "Proceedings of IEEE International
+ Conference on Acoustics, Speech, and Signal Processing",
+ Pages = "2.6.1-2.6.4")
+
+@inproceedings(BockerStructure
+ ,key = "Bocker"
+ ,Author = "Bocker, H.-D. and A. Mahling"
+ ,title = "What's in a Note?"
+ ,pages= "166-174"
+ ,booktitle = "Proceedings of the 14th International Computer Music Conference"
+ ,editor "C. Lischka and J. Fritsch"
+ ,year = "1988"
+ ,organization = "International Computer Music Association"
+ )
+
+@article(Constraints
+ ,key = "Borning"
+ ,Author = "Borning, A."
+ ,Title = "The Programming Language Aspects of Thinglab: A Constraint-Oriented Simulation Laboratory"
+ ,Journal = "ACM Transactions on Programming Languages and Systems"
+ ,Volume 3
+ ,Number 4
+ ,month October
+ ,year 1981
+ ,pages "353-387"
+ )
+
+@inproceedings(midilisp,
+ key = "Boynton"
+ ,Author = "Boynton, L., P. Lavoie, Y. Orlarey, C. Rueda and David Wessel"
+ ,title = "MIDI-LISP: A Lisp Based Music Programming Environment for
+the Macintosh"
+ ,pages= "183-186"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1986"
+ ,editor "P. Berg"
+ ,year = "1986"
+ ,organization = "International Computer Music Association"
+ )
+
+
+@inproceedings(preformes,
+ key = "Boynton"
+ ,Author = "L. Boynton, J. Duthen, Y. Potard, and X. Rodet"
+ ,title = "Adding a Graphical Interface to FORMES."
+ ,pages= "105-108"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1986"
+ ,editor "P. Berg"
+ ,year = "1986"
+ ,organization = "International Computer Music Association"
+ )
+
+@inproceedings(brinkmanstructure
+ ,key = "Brinkman"
+ ,author = "Brinkman, A."
+ ,title = "A Data Structure for Computer Analysis of Musical Scores"
+ ,organization "Computer Music Association"
+ ,booktitle "Proceedings of the 1984 International Computer Music Conference"
+ ,year 1985
+ ,pages "233-242"
+ )
+
+
+@inproceedings(brinkmanGraphs
+ ,key = "Brinkman"
+ ,author = "Brinkman, A."
+ ,title = "Computer-Graphic Tools for Music Analysis"
+ ,organization "Computer Music Association"
+ ,booktitle = "ICMC Montreal 1991 Proceedings"
+ ,year = "1991"
+ ,pages "53-56"
+ ,editor "B. Alphonse and B. Pennycook"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ )
+
+
+@article(Buxton,
+ key = "Buxton",
+ Author = "Buxton, W., Reeves, W., Fedorkow, G.,
+ Smith, K. C., and Baecker, R.",
+ Journal = "Computer Music Journal",
+ Title = "A Microcomputer-based Conducting System",
+ Year = "1980",
+ Month = "Spring",
+ Number = "4",
+ Pages = "8-21",
+ Volume = "4")
+
+@inbook(BuxtonViews
+ ,key = "Buxton",
+ ,Author = "Buxton, W., R. Sniderman, W. Reeves, R. Patel, and R. Baecker"
+ ,Title = "The Evolution of the SSSP Score-Editing Tools"
+ ,Year = "1985"
+ ,Booktitle "Foundations of Computer Music"
+ ,Pages = "376-402"
+ ,editor "C. Roads and J. Strawn"
+ ,publisher "MIT Press"
+ )
+
+
+
+@inbook(BuxtonStructures
+ ,key = "Buxton",
+ ,Author = "Buxton, W., W. Reeves, R. Baecker, and L. Mezei"
+ ,Title = "The Use of Hierarchy and Instance in a Data Structure
+for Computer Music"
+ ,Year = "1985"
+ ,Booktitle "Foundations of Computer Music"
+ ,Pages = "443-466"
+ ,editor "C. Roads and J. Strawn"
+ ,publisher "MIT Press"
+ )
+
+@article(buxton-modeless
+ ,key "Buxton"
+ ,author "Buxton, William"
+ ,title "Lexical and pragmatic considerations of input structures"
+ ,journal "Computer Graphics"
+ ,volume 17
+ ,number 1
+ ,pages "31-36"
+ ,year 1983
+ )
+
+@inproceedings(buxton85
+ ,key "Buxton"
+ ,author "Kitamura, J., W. Buxton, M. Snelgrove and K. C. Smith"
+ ,title "Music Synthesis by Simulation using a General-Purpose Signal Processing System"
+ ,organization "Computer Music Association"
+ ,booktitle "Proceedings of the 1985 International Computer Music Conference"
+ ,year 1985
+ ,pages "155-158"
+ )
+
+@inproceedings(accompchi
+ ,key "Buxton"
+ ,author "Buxton, W., Dannenberg, Roger B., Vercoe, Barry"
+ ,title "The Computer as Accompanist"
+ ,organization "ACM"
+ ,address "New York"
+ ,booktitle "Proceedings of the CHI'86 Human Factors in Computing Systems"
+ ,editor "M. Mantei and P. Orbeton"
+ ,year 1986
+ ,pages "41-43"
+ )
+
+@inproceedings(mabel
+ ,key = "Bartlett"
+ ,author = "Bartlett, M."
+ ,title="The Development of a Practical Live-Performance Music Language"
+ ,pages= "297-302"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1985"
+ ,editor "B. Truax"
+ ,year = "1985"
+ ,organization = "International Computer Music Association"
+ )
+
+
+
+@phdthesis(Byrd,
+ ,key = "Byrd"
+ ,author = "Byrd, Donald"
+ ,Title = "Music Notation by Computer"
+ ,school = "Computer Science Department, Indiana University"
+ ,year = 1984
+ ,note = "Ann Arbor: University Microfilms (order no. DA8506091)"
+ )
+
+@book(cage
+ ,key "Cage"
+ ,author "Cage, John"
+ ,title "Silence"
+ ,publisher "MIT Press"
+ ,address "Cambridge, MA"
+ ,year "1969"
+ )
+
+@article(L0
+ ,key "Cameron"
+ ,author "Cameron, E. J., D. M. Cohen, B. Gopinath, W. M. Keese II,
+ L. Ness, P. Uppaluru, and J. R. Vollaro"
+ ,title "The IC* Model of Parallel Computation and Programming Environment"
+ ,journal "IEEE Transactions on Software Engineering"
+ ,month "March"
+ ,year 1988
+ ,pages "317-326"
+ )
+
+@book(campbell
+ ,key "Campbell"
+ ,author "Campbell, R. H. and Habermann, A. N."
+ ,title "The Specification of Process Synchronization by Path Expressions"
+ ,series "Lecture Notes in Computer Science"
+ ,volume 16
+ ,publisher "Springer Verlag"
+ ,address "New York"
+ ,year "1974"
+ )
+
+@article(ptcurriculum
+ ,key "Capell"
+ ,author "Capell, P. and R. B. Dannenberg"
+ ,title "Instructional Design and Intelligent Tutoring: Theory and the Precision of Design"
+ ,journal "Journal of Artificial Intelligence in Education"
+ ,year "1993"
+ ,pages "95-121"
+ ,volume 4
+ ,number 1
+ )
+
+@inproceedings(jdb
+ ,key = "Chabot"
+ ,author = "Chabot, Xavier, Roger Dannenberg, and Georges Bloch"
+ ,title="A Workstation in Live Performance: Composed Improvisation"
+ ,pages= "57-59"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1986"
+ ,editor "P. Berg"
+ ,year = "1986"
+ ,organization = "International Computer Music Association"
+ )
+
+@article(chadabe, key "Chadabe"
+ ,title "Interactive Composing: An Overview"
+ ,journal "Computer Music Journal"
+ ,author "Chadabe, Joel"
+ ,year "1984"
+ ,volume 8, number 1
+ ,pages "22-27"
+ )
+
+@article(play
+ , key "Chadabe"
+ ,title "An Introduction to the Play Program"
+ ,author "Chadabe, J., and R. Meyers"
+ ,journal "Computer Music Journal"
+ ,year "1978"
+ ,volume 2, number 1
+ ,pages "12-18"
+ )
+
+@article(Chafe,
+ key = "Chafe",
+ Author = "Chafe, Chris, Bernard Mont-Reynaud, and Loren Rush",
+ Journal = "Computer Music Journal",
+ Title = "Toward an Intelligent Editor of Digital Audio: Recognition
+ of Musical Constructs",
+ Year = "1982",
+ Month = "Spring",
+ Number = "1",
+ Pages = "30-41",
+ Volume = "6")
+
+@InProceedings(poly,
+ key = "Chafe"
+ ,Author = "Chafe, Chris, David Jaffe, Kyle Kashima,
+ Bernard Mont-Reynaud, and Julius Smith"
+ ,Organization = "International Computer Music Association",
+ ,year = "1985"
+ ,booktitle = "1985 Proceedings of the International Computer Music Conference",
+ ,title = "Techniques for Note Identification in Polyphonic Music"
+ ,pages "399-405"
+ )
+
+@article(chowning
+ ,key "Chowning"
+ ,author "Chowning, J. M."
+ ,title "The Synthesis of Complex Audio Spectra by Means of Frequency
+Modulation"
+ ,journal "Journal of the Audio Engineering Society"
+ ,Volume 21
+ ,Number 7
+ ,Month "September"
+ ,Year 1973
+)
+
+@inbook(clark
+ ,key "Clark"
+ ,author "Clark, E. F."
+ ,title "Expression and communication in musical performance"
+ ,booktitle "Music, Language, Speech and Brain"
+ ,series "Wenner-Gren International Symposium Series, Vol. 59"
+ ,year 1991
+ ,editor "J. Sundberg, L. Nord, and R. Carlson"
+ ,pages "184-193"
+ ,publisher "Macmillan"
+ ,address "London"
+ )
+
+@InProceedings(Clendinning,
+ key = "Clendinning",
+ Author = "Clendinning, J. and Dworak, P. E.",
+ Organization = "International Computer Music Association",
+ year = "1983",
+ booktitle = "1983 International Computer Music Conference Proceedings",
+ title = "Computer Pitch Recognition: A New Approach")
+
+@inbook(clynes
+ ,key = "Clynes"
+ ,author "Clynes, M."
+ ,booktitle "Action and Perception in Rhythm and Music"
+ ,title "What Can a Musician Learn About Music Performance From
+ Newly Discovered Microstructure Principles (PM and PAS)?"
+ ,publisher "Royal Swedish Academy of Music No. 55"
+ ,year 1987
+ ,pages "201-233"
+ )
+
+@inproceedings(FPFormes
+ ,key "Cointe"
+ ,author "Cointe, P. and X. Rodet"
+ ,title "Formes: an Object & Time Oriented System for Music Composition and Synthesis"
+ ,organization "ACM"
+ ,booktitle "1984 ACM Symposium on LISP and Functional Programming"
+ ,address "New York"
+ ,year 1984
+ ,pages "85-95"
+ )
+
+@inproceedings(Moxie
+ ,key = "Collinge"
+ ,author = "Collinge, D. J."
+ ,title = "MOXIE: A Language for Computer Music Performance"
+ ,pages = "217-220"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1984"
+ ,editor = "W. Buxton"
+ ,year = "1985"
+ ,organization = "International Computer Music Association"
+ )
+
+@inproceedings(Moxie88collinge
+ ,key = "Collinge"
+ ,author = "Collinge, D. J. and Scheidt, D. J."
+ ,title = "MOXIE for the Atari ST"
+ ,pages = "231-238"
+ ,booktitle = "Proceedings of the 14th International Computer Music Conference"
+ ,editor "C. Lischka and J. Fritsch"
+ ,year = "1988"
+ ,organization = "International Computer Music Association"
+ )
+
+@inproceedings(Moxc88pennycook
+ ,key = Pennycook
+ ,author = "Pennycook, Bruce W."
+ ,title = "PRAESCIO-II: AMNESIA Toward Dynamic Tapeless Performance"
+ ,pages = "383-391"
+ ,booktitle = "Proceedings of the 14th International Computer Music Conference"
+ ,editor "C. Lischka and J. Fritsch"
+ ,year = "1988"
+ ,organization = "International Computer Music Association"
+ )
+
+@article(Bradford
+ ,key = "Comerford"
+ ,author = "Comerford, P. J."
+ ,title = "Bradford musical instrument simulator"
+ ,pages = "364-372"
+ ,journal = "IEE Proc."
+ ,volume = "128, Pt. A"
+ ,number = 5
+ ,month = "July"
+ ,year = 1981
+ )
+
+@book(ObjectiveC
+ ,key "Cox"
+ ,author "Cox, B. J."
+ ,title "Object-Oriented Programming: an evolutionary approach"
+ ,publisher "Addison-Wesley"
+ ,year 1987
+ ,address "Reading, Mass."
+ )
+
+@phdthesis(Dannenberg82
+ ,key "Dannenberg"
+ ,author "Dannnenberg, Roger B."
+ ,title "Resource Sharing in a Network of Personal Computers"
+ ,school "Carnegie Mellon University"
+ ,year 1982
+ ,note "School of Computer Science Report CMU-CS-82-152"
+ )
+
+@inproceedings(teaching
+ ,key = "Dannenberg"
+ ,author = "Dannenberg, F. K., R. B. Dannenberg,
+ and P. Miller"
+ ,title = "Teaching Programming to Musicians"
+ ,pages = "114-122"
+ ,booktitle = "Proceedings Fourth Symposium on Small Computers in the Arts"
+ ,year = 1984
+ ,editor = "D. Mansfield"
+ ,address = "Washington, D.C."
+ ,month = "October"
+ ,organization = "IEEE Computer Society"
+ )
+
+@inproceedings(ArcticLisp
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Arctic: A Functional Language for Real-Time Control"
+ ,organization "ACM"
+ ,booktitle "1984 ACM Symposium on LISP and Functional Programming"
+ ,address "New York"
+ ,year 1984
+ ,month "August"
+ ,pages "96-103"
+ )
+
+@inproceedings(Dannenberg
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "An On-Line Algorithm for Real-Time Accompaniment"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the International Computer Music Conference 1984"
+ ,editor = "W. Buxton"
+ ,pages "193-198"
+ ,year 1984
+ )
+
+@InProceedings(Studio84
+ ,author = "Dannenberg, Roger B., Paul McAvinney, and Marilyn T. Thomas"
+ ,key = "Dannenberg"
+ ,title = "Carnegie-Mellon University Studio Report"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1984"
+ ,editor = "W. Buxton"
+ ,year = "1984"
+ ,organization = "International Computer Music Association"
+ ,pages = "281-286"
+)
+
+@InProceedings(ArcticICMC
+ ,author = "Dannenberg, R. B. and P. McAvinney"
+ ,key = "Dannenberg"
+ ,title = "A Functional Approach to Real-Time Control"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1984"
+ ,editor = "W. Buxton"
+ ,year = "1984"
+ ,organization = "International Computer Music Association"
+ ,pages = "5-15"
+ )
+
+@inproceedings(Arctic86
+ ,key "Dannenberg"
+ ,author "Dannenberg, Roger B."
+ ,title "Arctic: Functional Programming for Real-Time Systems"
+ ,organization "U. Hawaii/Western Periodicals"
+ ,editor "B. Shriver"
+ ,booktitle "Proceedings of the Nineteenth Hawaii International
+Conference on System Sciences"
+ ,year 1986
+ ,pages "216-226"
+ )
+
+@article(ArcticIEEE
+ ,key "Dannenberg"
+ ,author "Dannenberg, Roger B."
+ ,title "Arctic: A Functional Language for Real-Time Control"
+ ,journal "IEEE Software"
+ ,month January
+ ,volume 3
+ ,number 1
+ ,year 1986
+ ,pages "70-71"
+ )
+
+@inproceedings(aep86
+ ,key = "Dannenberg"
+ ,author = "Dannenberg, Roger B."
+ ,title = "Workstations for Computer Music at Carnegie Mellon"
+ ,pages = "109 - 117"
+ ,volume = "II"
+ ,booktitle = "1986 University AEP Conference"
+ ,editor = "F. Dwyer"
+ ,year = "1986"
+ ,organization = "IBM Academic Information Systems"
+ ,address = "472 Wheelers Farms Road, Milford, Connecticut 06460"
+ )
+
+@inproceedings(cmt
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "The CMU MIDI Toolkit"
+ ,booktitle = "Proceedings of the 1986
+ International Computer Music Conference"
+ ,year = "1986"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ ,pages "53-56"
+ )
+
+@inproceedings(musicrep
+ ,key = "Dannenberg"
+ ,author = "Dannenberg, R. B."
+ ,title = "A Structure for Representing, Displaying and Editing Music"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1986"
+ ,editor "P. Berg"
+ ,year = "1986"
+ ,organization = "International Computer Music Association"
+ ,pages = "153-160"
+)
+
+@manual(old-cmt-manual
+ ,key = "Dannenberg"
+ ,author "Dannenberg, R. B"
+ ,title "The CMU MIDI Toolkit"
+ ,year "1986"
+ ,publisher "Studio for Creative Inquiry, Carnegie Mellon University"
+ )
+
+@manual(cmt-manual
+ ,key = "Dannenberg"
+ ,author "Dannenberg, R. B"
+ ,title "The CMU MIDI Toolkit"
+ ,year "1993"
+ ,publisher "School of Computer Science, Carnegie Mellon University"
+ )
+
+@article(ArcticCMJ
+ ,key = "Dannenberg"
+ ,author = "Dannenberg, R. B., P. McAvinney, and D. Rubine"
+ ,title = "Arctic: A Functional Language for Real-Time Systems"
+ ,journal = "Computer Music Journal"
+ ,volume = "10"
+ ,number = "4"
+ ,month = "Winter"
+ ,year = "1986"
+ ,pages = "67-78"
+ )
+
+@inproceedings(Dannenberg87
+ ,key "Dannenberg"
+ ,title "Following an Improvisation in Real Time"
+ ,author "Dannenberg, R. B. and B. Mont-Reynaud"
+ ,booktitle "Proceedings of the 1987 International Computer Music
+ Conference"
+ ,editor "J. Beauchamp"
+ ,pages 241-248
+ ,year 1987
+ ,organization "International Computer Music Association"
+ ,address "San Francisco"
+ )
+
+@inproceedings(ircamWorkbench
+ ,key "Dannenberg"
+ ,author "Dannenberg, Roger B."
+ ,title "Systemes pour Informatique Musicale a l'universite de
+ Carnegie Mellon"
+ ,editor "J.-B. Barriere, F. Armand, and C. Marquet"
+ ,booktitle "Actes du Symposium
+ Systemes Personnels et Informatique Musicale"
+ ,year 1987
+ ,organization "IRCAM, Paris, France"
+ )
+
+@article(JASA87
+ ,key Dannenberg
+ ,author "Dannenberg, Roger B., Serra, Marie-Helen, Rubine, Dean"
+ ,title "Comprehensive study of analysis and synthesis of tones
+ by spectral interpolation"
+ ,journal "Journal of the Acoustical Society of America"
+ ,volume "Supplement 1, Vol 82"
+ ,month Fall
+ ,year 1987
+ ,pages S69
+ )
+
+@inbook(workbench
+ ,key "Dannenberg"
+ ,author "Dannenberg, Roger B."
+ ,title "A Project in Computer Music: The Musician's Workbench"
+ ,address "Oxford, England"
+ ,pages "354-388"
+ ,booktitle "From Information to Knowledge"
+ ,publisher "Intellect Books, Publications from the Society of Conceptual and Content Analysis by Computer (SCCAC)"
+ ,year 1994.
+ ,editor "Ephraim Nissan and Klaus M. Schmidt"
+ )
+
+
+@inproceedings(Dannenberg88a
+ ,key "Dannenberg"
+ ,title "New Techniques for Enhanced Quality of Computer Accompaniment"
+ ,author "Dannenberg, R. B. and H. Mukaino"
+ ,booktitle = "Proceedings of the 14th International Computer Music Conference"
+ ,editor "C. Lischka and J. Fritsch"
+ ,year = "1988"
+ ,pages "243-249"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+)
+
+@inproceedings(animation89
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Real Time Control For Interactive Computer Music and
+ Animation"
+ ,booktitle "The Arts and Technology II: A Symposium"
+ ,editor "N. Zahler"
+ ,address "New London, Conn."
+ ,organization "Connecticut College"
+ ,pages "85-94"
+ ,year 1989
+ )
+
+@inproceedings(realtime91
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Software Support for Interactive Multimedia Performance"
+ ,booktitle "Proceedings of The Arts and Technology 3"
+ ,editor "D. Smalley, N. Zahler, and C. Luce"
+ ,organization "Connecticut College"
+ ,address "New London, Conn."
+ ,pages "85-94"
+ ,year 1991
+ )
+
+@article(animationInterface
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Software Support for Interactive Multimedia Performance"
+ ,journal "Interface Journal of New Music Research"
+ ,pages "213-228"
+ ,month August
+ ,Volume 22
+ ,Number 3
+ ,year 1993
+ )
+
+
+@inbook(klangart
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Computerbegleitung und Musikverstehen"
+ ,booktitle "Neue Musiktechnologie"
+ ,editor "B. Enders"
+ ,pages "241-252"
+ ,publisher "Schott"
+ ,year "1993"
+ ,address "Mainz"
+ )
+
+@inbook(dannenberg91
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Recent work in real-time music understanding by computer"
+ ,booktitle "Music, Language, Speech and Brain"
+ ,series "Wenner-Gren International Symposium Series, Vol. 59"
+ ,year 1991
+ ,editor "J. Sundberg, L. Nord, and R. Carlson"
+ ,pages "194-202"
+ ,publisher "Macmillan"
+ ,address "London"
+ )
+
+@inproceedings(cmt-technique
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Software Techniques for Interactive Performance Systems"
+ ,booktitle "International Workshop on Man-Machine Interaction in
+Live Performance"
+ ,editor "L. Tarabella"
+ ,address "Pisa"
+ ,organization "Scuola di Stude Superiori Universitari e di
+Perfezionamento"
+ ,year "to appear")
+
+
+@inproceedings(conducting
+ ,key "Dannenberg"
+ ,title "Practical Aspects of a MIDI Conducting Program"
+ ,author "Dannenberg, R. B. and K. Bookstein"
+ ,booktitle = "ICMC Montreal 1991 Proceedings"
+ ,year = "1991"
+ ,pages "537-540"
+ ,editor "B. Alphonse and B. Pennycook"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ )
+
+@inproceedings(resource-instance
+ ,key "Dannenberg"
+ ,title "The Resource-Instance Model of Music Representation"
+ ,author "Dannenberg, R. B., D. Rubine, T. Neuendorffer"
+ ,booktitle = "ICMC Montreal 1991 Proceedings"
+ ,year = "1991"
+ ,pages "428-432"
+ ,editor "B. Alphonse and B. Pennycook"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+)
+
+
+@article(CanonCMJ
+ ,key = "Dannenberg"
+ ,author = "Dannenberg, R. B."
+ ,title = "The Canon Score Language"
+ ,journal = "Computer Music Journal"
+ ,volume = "13"
+ ,number = "1"
+ ,month = "Spring"
+ ,year = "1989"
+ ,pages = "47-56"
+ )
+
+@inbook(schedulers
+ ,key "Dannenberg"
+ ,title "Real-Time Scheduling and Computer Accompaniment"
+ ,author "Dannenberg, Roger B."
+ ,booktitle "Current Directions in Computer Music Research"
+ ,pages "225-262"
+ ,series "System Development Foundation Benchmark Series"
+ ,editor "Mathews, M. V. and J. R. Pierce"
+ ,year 1989
+ ,publisher "MIT Press"
+ )
+
+@inbook(jdbC
+ ,key "Dannenberg"
+ ,title "@i(Jimmy Durante Boulevard)"
+ ,author "Dannenberg, Roger B."
+ ,booktitle "@r(Compact Disc accompanying) Current Directions in Computer Music Research"
+ ,series "System Development Foundation Benchmark Series"
+ ,editor "Mathews, M. V. and J. R. Pierce"
+ ,year 1989
+ ,publisher "MIT Press"
+ )
+
+@inproceedings(ICMCFugue
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B. and C. L. Fraley"
+ ,title "Fugue: Composition and Sound Synthesis With Lazy Evaluation
+ and Behavioral Abstraction"
+ ,booktitle = "Proceedings of the 1989
+ International Computer Music Conference"
+ ,editor "T. Wells and D. Butler"
+ ,year = "1989"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ ,pages "76-79"
+ )
+
+@inproceedings(musrepissues
+ ,key "Dannenberg"
+ ,author "Dannenberg, Roger B."
+ ,title "Music Representation Issues: A Position Paper"
+ ,booktitle = "Proceedings of the 1989
+ International Computer Music Conference"
+ ,year = "1989"
+ ,editor "T. Wells and D. Butler"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ ,pages "73-75"
+ )
+
+@inbook(musun89
+ ,key Dannenberg
+ ,author "Dannenberg, Roger B."
+ ,title "Music Understanding"
+ ,booktitle "Computer Science Research Review 1987/1988"
+ ,publisher "Carnegie Mellon School of Computer Science"
+ ,editor "C. Copetas"
+ ,address "Pittsburgh, PA 15213, USA"
+ ,year 1989
+ ,pages 19-28
+ )
+
+
+@inproceedings(uist89
+ ,key "Dannenberg"
+ ,author "Dannenberg, Roger B. and D. Amon"
+ ,title "A Gesture Based User Interface Prototyping System"
+ ,booktitle "Proceedings of the ACM SIGGRAPH Symposium on User Interface Software and
+ Technology"
+ ,year 1989
+ ,address "New York"
+ ,pages "127-132"
+ ,organization "ACM"
+ )
+
+@inproceedings(icmcmusrep
+ ,key "Dannenberg"
+ ,author "Dannenberg, R."
+ ,title "A Structure for Representing, Displaying, and Editing Music"
+ ,pages "153-160"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1986"
+ ,editor "P. Berg"
+ ,year = "1986"
+ ,organization = "International Computer Music Association"
+ )
+
+@article(spemusrep
+ ,key "Dannenberg"
+ ,author "Dannenberg, Roger B."
+ ,title "A Structure for Efficient Update, Incremental Redisplay and
+ Undo in Display-Oriented Editors"
+ ,journal "Software: Practice and Experience"
+ ,year 1990
+ ,volume 20
+ ,number 2
+ ,month February
+ ,pages "109-132"
+ )
+
+@article(tpl
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Extending Music Notation Through Programming"
+ ,journal "Contemporary Music Review"
+ ,year "to appear"
+ )
+
+@article(ptinterface
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B., M. Sanchez, A. Joseph, P. Capell, R. Joseph, and R. Saul"
+ ,title "A Computer-Based Multi-Media Tutor for Beginning Piano
+ Students"
+ ,journal "Interface"
+ ,volume 19
+ ,number "2-3"
+ ,pages "155-73"
+ ,year 1990
+ )
+
+@inproceedings(icmcptutor
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "An Expert System for Teaching Piano to Novices"
+ ,booktitle = "ICMC Glasgow 1990 Proceedings"
+ ,year = "1990"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ ,pages "20-23"
+ ,editor "S. Arnold and G. Hair"
+ )
+
+@inbook(accompvideo
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Computer Accompaniment and Following an Improvisation"
+ ,booktitle "The ICMA Video Review"
+ ,year "1991"
+ ,publisher "International Computer Music Association"
+ ,address "San Francisco"
+ ,volume 1
+ ,note "(Video)"
+ )
+
+@incollection(bash
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Expressing Temporal Behavior Declaratively"
+ ,booktitle "CMU Computer Science: a 25th Anniversary Commemorative",
+ ,year 1991
+ ,publisher "Addison Wesley"
+ ,pages "47-68"
+ )
+
+@inproceedings(nyquist
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "Real-Time Software Synthesis on Superscalar Architectures"
+ ,booktitle = "Proceedings of the 1992 ICMC"
+ ,year = "1992"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ ,pages "174-177"
+ )
+
+@article(IEEEFugue
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B., C. L. Fraley, and P. Velikonja"
+ ,title "Fugue: A Functional Language for Sound Synthesis"
+ ,journal "Computer"
+ ,month "July"
+ ,year "1991"
+ ,volume 24
+ ,number 7
+ ,pages "36-42"
+ )
+
+@inbook(fuguechap
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B., C. L. Fraley, and P. Velikonja"
+ ,title "A Functional Language for Sound Synthesis with Behavioral Abstraction and Lazy Evaluation"
+ ,editors "Denis Baggi"
+ ,booktitle "Readings in Computer-Generated Music"
+ ,publisher "IEEE Computer Society Press"
+ ,address "Los Alamitos, CA"
+ ,year 1992
+ )
+
+@inbook(ptdialog
+ ,title "Human-Computer Interaction in the Piano Tutor"
+ ,author "Dannenberg, R. B. and R. L. Joseph"
+ ,pages "65-78"
+ ,key "Dannenberg"
+ ,editors "Blattner, M. M. and R. B. Dannenberg"
+ ,booktitle "Multimedia Interface Design"
+ ,publisher "ACM Press"
+ ,year 1992
+)
+
+@inproceedings(PianoTutor93
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B., M. Sanchez, A. Joseph, R. Joseph, R. Saul, and P. Capell"
+ ,title "Results from the Piano Tutor Project"
+ ,booktitle "The Fourth Biennial Arts and Technology Symposium"
+ ,editor "D. Smalley, N. Zahler, and P. Galvani"
+ ,organization "Connecticut College"
+ ,address "New London, Conn."
+ ,pages "143-150"
+ ,year 1993
+ )
+
+@inproceedings(nyquist93
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B."
+ ,title "The Implementation of Nyquist, A Sound Synthesis Language"
+ ,booktitle = "Proceedings of the 1993 ICMC"
+ ,year = "1993"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ ,pages "168-171"
+ )
+
+@inproceedings(realtimemusic
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B., and D. Jameson"
+ ,title "Real-Time Issues in Computer Music"
+ ,booktitle = "Proceedings of the Real-Time Systems Symposium"
+ ,year = "1993"
+ ,organization = "IEEE Computer Society"
+ ,pages "258-261"
+ )
+
+
+@inbook(CMUResearch
+ ,key "Dannenberg"
+ ,author "Dannenberg, R."
+ ,title "Computer Music at Carnegie Mellon University"
+ ,year 1993
+ ,booktitle "Music Processing"
+ ,pages "303-333"
+ ,publisher "AR Editions"
+ ,address "Madison"
+ )
+
+@techreport(machmediatr
+ ,key "Dannenberg"
+ ,author "Roger B. Dannenberg, David B. Anderson, Tom Neuendorffer, Dean Rubine, Jim Zelenka"
+ ,Title " Performance Measurements of the Multimedia Testbed on Mach 3.0: Experience Writing Real-Time Device Drivers, Servers, and Applications"
+ ,Number "CMU-CS-93-205"
+ ,Date "July 1993"
+ ,Institution "School of Computer Science, Carnegie Mellon University"
+ )
+
+
+@book(date
+ ,key "Date"
+ ,author "Date, C. J."
+ ,title "An Introduction to Database Systems"
+ ,publisher "Addison-Wesley"
+ ,address "Reading, Mass."
+ ,edition "5th ed."
+ ,year 1991
+ )
+
+@inproceedings(Decker
+ ,key "Decker"
+ ,author "Decker, S. and G. Kendall"
+ ,Organization = "International Computer Music Association"
+ ,year = "1984"
+ ,title = "A Modular Approach to Sound Synthesis Software"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1984"
+ ,editor = "W. Buxton"
+ ,pages "243-250"
+ )
+
+
+@article(Dennis80
+ ,key "Dennis"
+ ,author "Dennis, Jack B."
+ ,title "Data flow supercomputers"
+ ,journal "Computer"
+ ,volume 13
+ ,number 11
+ ,month "November"
+ ,year "1980"
+ ,pages "48-56"
+ )
+
+@inproceedings(streams
+ ,key "Dennis"
+ ,author "Dennis, Jack B. and Weng, Ken K.-S."
+ ,title "An Abstract Implementation For Concurrent Computation With Streams"
+ ,organization "IEEE Computer Society"
+ ,year "1979"
+ ,booktitle "Proceedings of the 1979 International Conference on Parallel Processing"
+ )
+
+
+@book(depoli
+ ,key "DePoli"
+ ,title "Representations of Musical Signals"
+ ,editor "G. De Poli, A. Piccialli, and C. Roads"
+ ,publisher "MIT Press"
+ ,address "Cambridge, Mass."
+ ,year 1991
+ )
+
+@inproceedings(DesainGraphics
+ ,key "Desain"
+ ,author "Desain, P."
+ ,title "Graphical Programming in Computer Music, a Proposal"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1986"
+ ,editor "P. Berg"
+ ,year = "1986"
+ ,organization = "International Computer Music Association"
+ ,pages = "161-166"
+ )
+
+@article(desain89
+ ,key "Desain"
+ ,author "Desain, Peter and Henkjan Honing"
+ ,title "Quantization of Musical Time: a connectionist approach"
+ ,journal "Computer Music Journal"
+ ,year 1989
+ ,pages="56-66"
+ ,volume=13
+ ,number=3
+ )
+
+@inproceedings(DesainTempo
+ ,key "Desain"
+ ,author "Desain, P. and H. Honing"
+ ,title "Tempo Curves Considered Harmful"
+ ,booktitle = "ICMC Montreal 1991 Proceedings"
+ ,year = "1991"
+ ,pages "143-149"
+ ,editor "B. Alphonce and B. Pennycook"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ )
+
+@inbook(DesainTempoChapter
+ ,key "Desain"
+ ,author "Desain, P. and H. Honing"
+ ,title "Tempo Curves Considered Harmful"
+ ,year 1992
+ ,booktitle "Music, Mind, and Machine: Studies in Computer Music, Music Cognition, and Artificial Intelligence"
+ ,pages 25-40
+ ,publisher "Thesis Publishers"
+ ,address "Amsterdam"
+ )
+
+@techreport(DesainStructure
+ ,key "Desain"
+ ,author "Desain, P. and H. Honing"
+ ,title "Towards a calculus for expressive timing in music"
+ ,year = "1991"
+ ,institution = "Center for Knowledge Technology"
+ ,address = "Utrecht"
+ )
+
+@article(timefunctions
+ ,key "Desain"
+ ,author "Desain, P. and H. Honing"
+ ,title "Time Functions Function Best as Functions of Multiple Times"
+ ,Journal = "Computer Music Journal"
+ ,Year = "1992"
+ ,Month = "Summer"
+ ,Number = "2"
+ ,Pages = "17-34"
+ ,Volume = "16")
+
+
+@book(ada
+ ,key "DOD"
+ ,title "The Programming Language Ada Reference Manual"
+ ,author "American National Standards Institute, Inc."
+ ,publisher "Springer-Verlag"
+ ,volume 155
+ ,series "Lecture Notes in Computer Science"
+ ,year 1983)
+
+@inproceedings(Donner
+ ,key "Donner"
+ ,author "Donner, Marc"
+ ,title "The Design of OWL - A Language for Walking"
+ ,organization "Sigplan"
+ ,booktitle "Sigplan Symposium on Prog. Lang. Issues In Software Systems"
+ ,year 1983
+ )
+
+@inproceedings(gist
+ ,key "Eckel"
+ ,author "Eckel, G., M. R. Iturbide"
+ ,title "The Development of GiST, a Granular Synthesis Toolkit Based on an Extension of the FOF Generator"
+ ,booktitle "Proceedings of the 1995 International Computer Music Conference"
+ ,publisher "International Computer Music Association"
+ ,year 1995
+ ,pages "296-302"
+ )
+
+
+@manual(BarsAndPipes
+ ,key "Fey"
+ ,author "Fey, T. and M. J. Grey"
+ ,title "Using Bars and Pipes"
+ ,publisher "Blue Ribbon Bakery"
+ ,address "Decatur, Georgia"
+ ,year 1989
+ )
+
+@book(Field,
+ key = Field
+ ,Author = "Field, A. J., and P. G. Harrison"
+ ,Title = "Functional Programming"
+ ,publisher = "Addison-Wesley"
+ ,year 1988
+ )
+
+@book(Foerster
+ ,title = "Music By Computers"
+ ,year = "1969"
+ ,key = "Foerster"
+ ,editors = "Foerster, H. V., and J. W. Beauchamp"
+ ,publisher "John Wiley & Sons, Inc."
+ )
+
+@article(Foster,
+ key = "Foster",
+ ,Author = "Foster, Scott, Schloss, W. Andrew, and Rockmore, A. Joseph"
+ ,Journal = "Computer Music Journal"
+ ,Title = "Toward an Intelligent Editor of Digital Audio: Signal
+ Processing Methods"
+ ,Year = "1982"
+ ,Month = "Spring"
+ ,Number = "1"
+ ,Pages = "42-51"
+ ,Volume = "6")
+
+@inproceedings(htm
+ ,key = "Freed"
+ ,author = "Freed, A."
+ ,title = "Codevelopment of User Interface, Control, and Digital Signal Processing with the HTM Environment"
+ ,booktitle = "Proceedings of the International Conference on Signal Processing Applications and Technology"
+ ,year 1994
+ )
+
+@inproceedings(Gibbs
+ ,key "Gibbs"
+ ,author "Gibbs, S."
+ ,title "Composite Multimedia and Active Objects"
+ ,organization "ACM/SIGPLAN"
+ ,booktitle "OOPSLA '91 Conference Proceedings"
+ ,pages "97-112"
+ ,year 1991
+ ,publisher "ACM Press"
+ ,address "New York"
+ ,editor "A. Paepcke"
+)
+
+@article(Glass
+ ,key "Glass"
+ ,author "Glass, Robert L."
+ ,title "Real-Time: The ``Lost World'' Of Software Debugging and Testing"
+ ,journal "Communications of the ACM"
+ ,volume 23
+ ,number 5
+ ,month "May"
+ ,year 1980
+ ,pages "264-271"
+ )
+
+@book(Smalltalk
+ ,key "Goldberg"
+ ,author "Goldberg, A. and D. Robson"
+ ,title "Smalltalk-80: the language and its implementation."
+ ,publisher "Addison-Wesley"
+ ,year 1983
+ )
+
+@inproceedings(Greenberg
+ ,key "Greenberg"
+ ,author "Greenberg, Gary"
+ ,title "Procedural Composition"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the 1987 International Computer Music Conference"
+ ,editor "J. Beauchamp"
+ ,year 1987
+ ,pages "25-32"
+ )
+
+@inproceedings(Greenberg88
+ ,key "Greenberg"
+ ,author "Greenberg, Gary"
+ ,title "Composing With Performer Objects"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the 14th International Computer Music Conference"
+ ,editor "C. Lischka and J. Fritsch"
+ ,year 1988
+ ,pages "142-149"
+ )
+
+@phdthesis(Greytimbre
+ ,key "Grey"
+ ,author "Grey, J. M."
+ ,year 1975
+ ,title "An Exploration of Musical Timbre"
+ ,school "Department of Psychology, Stanford University"
+ ,note "Department of Music Report STAN-M-2"
+ )
+
+@inproceedings(Gross
+ ,key "Gross"
+ ,author "Gross, Dorothy"
+ ,Organization = "International Computer Music Association"
+ ,year = "1984"
+ ,title = "An Intelligent Ear-Training Lesson"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1984"
+ ,editor = "W. Buxton"
+ ,pages "179-183"
+ )
+
+@InProceedings(sonar,
+ key = "Haflich",
+ Author = "Haflich, Steven M. and Burns, Mark A.",
+ Organization = "International Computer Music Association",
+ year = "1983",
+ title = "Following a Conductor: The Engineering of an Input Device",
+ booktitle = "1983 International Computer Music Conference Proceedings")
+
+@article(Hagerman80
+ ,key="Hagerman"
+ ,author="Hagerman, B. and Sundberg, J."
+ ,title="Fundamental Frequency Adjustment in Barbershop Singing"
+ ,journal="Speech Transmission Laboratory Quarterly Progress and Status Report"
+ ,year="1980"
+ ,month="April"
+ ,number="STL-QPSR 1/1980"
+ )
+
+@manual(hamel
+ ,key Hamel
+ ,author "Hamel, K."
+ ,title "MusScribe Reference Manual"
+ ,year 1988
+ ,organization "SoftCore Music Systems"
+ ,address "Richmond, BC, Canada"
+ )
+
+@inproceedings(PATCHMIX
+ ,key = "Helmuth"
+ ,author = "Helmuth, M."
+ ,title = "PATCHMIX: A C++ X Graphical Interface to Cmix"
+ ,booktitle = "Proceedings of the 1990 International Computer Music Conference"
+ ,pages = "273-275"
+ ,publisher = "Computer Music Association"
+ ,year 1990
+ )
+
+
+@inproceedings (HILD92,
+ key = "Hild",
+ author = "Hild, Hermann and Feulner, Johannes and Menzel, Wolfgang",
+ title = "HARMONET: A Neural Net for Harmonizing Chorales in the Style of J.S.Bach",
+ booktitle = "Advances in Neural Network Information Processing Systems (NIPS-4-)",
+ year = "1992",
+ editor = "Moody, J.E. and Hanson, S.J. and Lippmann,R.P.",
+ publisher = "Morgan Kaufmann"
+)
+
+@book(Hiller59
+ ,key "Hiller"
+ ,author "Hiller, L. and Isaacson, L."
+ ,title "Experimental Music: Composition with an Electronic
+ Computer"
+ ,publisher "McGraw Hill"
+ ,year 1959
+ ,address "New York, N. Y."
+ )
+
+@article(Hiller58
+ ,key "Hiller"
+ ,author "Hiller, L. and Isaacson, L."
+ ,title "Musical composition with a high-speed digital computer"
+ ,journal "Journal of the Audio Engineering Society"
+ ,volume 6
+ ,number 3
+ ,month July
+ ,year 1958
+ ,pages 154-160
+ )
+
+@book(Hindemith42
+ ,key="Hindemith"
+ ,author="Hindemith, P."
+ ,title="Craft of Musical Composition, Book 1, Theoretical Part"
+ ,publisher="Schott"
+ ,year="1942"
+ )
+
+@article(monitor
+ ,key "Hoare"
+ ,author "Hoare, C. A. R."
+ ,title "Monitors: An Operating System Structuring Concept"
+ ,journal "Communications of the ACM"
+ ,volume 17
+ ,number 10
+ ,pages "549-557"
+ ,month "October"
+ ,year "1974"
+ ,note "Erratum in @i(Communications of the ACM), 18(2) (Feb. 1975), p95"
+ )
+
+@article(csp
+ ,key "Hoare"
+ ,author "Hoare, C. A. R."
+ ,title "Communicating Sequential Processes"
+ ,journal "Communications of the ACM"
+ ,volume 21
+ ,number 8
+ ,pages "666-677"
+ ,month "August"
+ ,year "1978"
+ )
+
+@book(hofstetter
+ ,key "Hofstetter"
+ ,author "Hofstetter, F. T."
+ ,title "Computer Literacy for Musicians"
+ ,publisher "Prentice Hall"
+ ,address "Englewood Cliffs, NJ"
+ ,year 1988
+)
+
+@article(CPR
+ ,key "Hon"
+ ,author "Hon, D."
+ ,journal "Byte Magazine"
+ ,volume 7
+ ,number 6
+ ,title "Interactive Training in Cardiopulmonary Resuscitation"
+ ,month June
+ ,year 1982
+ )
+
+@inbook(honing90
+ ,key "Honing"
+ ,author "Honing, H."
+ ,title "Issues in the Representation of Time and Structure in Music"
+ ,year 1992
+ ,booktitle "Music, Mind, and Machine: Studies in Computer Music, Music Cognition, and Artificial Intelligence"
+ ,pages 25-40
+ ,publisher "Thesis Publishers"
+ ,address "Amsterdam"
+ ,note "Also in Proceedings of the 1990 Music and the Cognitive Sciences Conference, Harwood Academic Publishers GmbH, 1992"
+ )
+
+@book(horowitz
+ ,key "Horowitz"
+ ,author "Horowitz, E. and S. Sahni"
+ ,title "Fundamentals of Data Structures in Pascal"
+ ,publisher "Computer Science Press"
+ ,year 1976
+)
+
+@book(MIDISPEC
+ ,key = IMA
+ ,author "IMA"
+ ,title = "MIDI 1.0 Detailed Specification"
+ ,publisher "International MIDI Association"
+ ,address "Los Angeles, CA"
+ ,year 1989
+ )
+
+@book(APL
+ ,key "Ivers"
+ ,author "Iverson, K."
+ ,title "A Programming Language"
+ ,year 1962
+ ,address "New York"
+ ,publisher "Wiley"
+ )
+
+@article(Jaffe
+ , key "Jaffe"
+ ,author "Jaffe, David"
+ ,title "Ensemble Timing in Computer Music"
+ ,journal "Computer Music Journal"
+ ,pages "38-48"
+ ,volume 9, number 4
+ ,year 1985
+ )
+
+@article(SoundKit, key "Jaffe"
+ ,author "Jaffe, D., and L. Boynton"
+ ,title "An Overview of the Sound and Music Kit for the NeXT Computer"
+ ,journal "Computer Music Journal"
+ ,pages "48-55"
+ ,volume 13, number 2
+ ,year 1989
+ )
+
+@techreport(seqnet
+ ,key "Jordan"
+ ,author "Jordan, M. I."
+ ,title "Serial Order: A Parallel Distributed Processing Approach"
+ ,institution "Institute for Cognitive Science, UCSD"
+ ,year 1986
+ ,number "8604"
+ )
+
+@techreport(Actors
+ ,key "Kahn"
+ ,author "Kahn, K."
+ ,title "DIRECTOR Guide"
+ ,institution "MIT"
+ ,year 1979
+ ,month "December"
+ ,number "MIT AI Laboratory Memo 482B"
+ )
+
+@inproceedings(Katayose89
+ ,key "Katayose"
+ ,author "Katayose, H., H. Kato, M. Imai, and S. Inokuchi"
+ ,title "An Approach to an Artificial Music Expert"
+ ,booktitle = "Proceedings of the 1989
+ International Computer Music Conference"
+ ,editor "T. Wells and D. Butler"
+ ,year = "1989"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ ,pages "139-146"
+ )
+
+@book(knuth
+ ,key "Knuth"
+ ,author "Knuth, D."
+ ,title "The Art of Computer Programming"
+ ,volume 1
+ ,publisher "Addison Wesley"
+ ,year 1975
+ )
+
+@article(ntp
+ ,key "Kolstad"
+ ,author "Kolstad, R."
+ ,title "The Network Time Protocol"
+ ,journal "UNIX Review"
+ ,volume 8
+ ,pages "58-61"
+ ,month "December"
+ ,year 1990
+ )
+
+@article(cmjlisp
+ ,key "Kornfeld"
+ ,author "Kornfeld, W."
+ ,title "Machine Tongues VII: LISP"
+ ,journal "Computer Music Journal"
+ ,pages "6-12"
+ ,volume 4
+ ,number 2
+ ,year 1980
+ ,month "Summer"
+ )
+
+@book(Kernighan
+ ,key = "Kernighan"
+ ,author = "Kernighan, Brian M. and Richie, Dennis M."
+ ,title = "The C Programming Language"
+ ,publisher "Prentice-Hall"
+ ,address "Englewood Cliffs"
+ ,year = 1978
+ )
+
+@manual(krakowsky86
+ ,key "krakowsky"
+ ,author "Krakowsky, Philippe, ed."
+ ,title "Object LOGO Reference Manual"
+ ,address "Cambridge Massachusetts"
+ ,year 1986
+ ,organization "Coral Software"
+ )
+
+@article(krumhanslReview
+ ,key "Krumhansl"
+ ,author "Krumhansl, C. L."
+ ,title "Music Psychology: Tonal Structures in Perception and Memory"
+ ,journal "Annual Review of Psychology"
+ ,year 1991
+ ,publisher "Annual Reviews Inc."
+ ,pages "277-303"
+ )
+
+@book(Cmix
+ ,key "Lansky"
+ ,author "Lansky, P."
+ ,title "CMIX"
+ ,year 1987
+ ,publisher "Princeton Univ."
+ )
+
+@article(lansky
+ ,key "Lansky"
+ ,author "Lansky, P. and K. Steiglitz"
+ ,title "The synthesis of timbral families by warped linear prediction"
+ ,journal "Computer Music Journal"
+ ,volume 5
+ ,number 3
+ ,pages "45-49"
+ ,month "Fall"
+ ,year 1981
+ )
+
+@article(Levitt84
+ ,key "Levitt"
+ ,author "Levitt, D."
+ ,title "Machine Tongues X: Constraint Languages"
+ ,journal "Computer Music Journal"
+ ,pages "9-21"
+ ,month Spring
+ ,year 1984
+ ,volume 8
+ ,number 1
+ )
+
+@article(little
+ ,key "Little"
+ ,author "Little, T. D. C. and A. Ghafoor"
+ ,title "Spatio-Temporal Composition of Distributed Multimedia Objects for Value-Added Networks"
+ ,journal "Computer"
+ ,pages "42-50"
+ ,month "October"
+ ,year 1991
+ )
+
+@article(dvi
+ ,key "Ripley"
+ ,author "Ripley, G. D."
+ ,title "DVI - A Digital Multimedia Technology"
+ ,journal "CACM"
+ ,number 7
+ ,volume 32
+ ,month "July"
+ ,year "1989"
+ ,pages "811-822"
+ )
+
+@inbook(LewisInterview
+ ,key "Roads"
+ ,author "Roads, Curtis"
+ ,title "Improvisation With George Lewis"
+ ,booktitle "Composers and the Computer"
+ ,editor "Roads, Curtis"
+ ,publisher "William Kaufmann"
+ ,address "Los Altos, CA"
+ ,chapter "5"
+ ,year 1985
+ ,pages "74-87"
+ ,series "The Computer Music and Digital Audio Series"
+ )
+
+@inproceedings(Lifton85
+ ,key "Lifton"
+ ,author "Lifton, J."
+ ,title "Some Technical and Aesthetic Considerations in Software for
+ Live Interactive Performance"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the International Computer Music Conference 1985"
+ ,editor "B. Truax"
+ ,year 1985
+ ,pages "303-306"
+ )
+
+
+@inproceedings(Lischka
+ ,key "Lischka"
+ ,author "Lischka, C."
+ ,title "Connectionist Models of Musical Thinking"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the 1987 International Computer Music Conference"
+ ,editor "J. Beauchamp"
+ ,year 1987
+ ,pages "190-196"
+ )
+
+@book(lincoln
+ ,title = "The Computer and Music"
+ ,year = "1970"
+ ,editor = "Lincoln, H. B."
+ ,key = "Lincoln"
+ ,publisher = "Cornell University Press"
+ ,address = "Ithaca, N.Y."
+ )
+
+@article(IMWArchitecture
+ ,key "Lindemann"
+ ,author "Lindemann, E., F. Dechelle, B. Smith, and M. Starkier"
+ ,title "The Architecture of the IRCAM Musical Workstation"
+ ,journal "Computer Music Journal"
+ ,volume "15"
+ ,number "3"
+ ,month "Fall"
+ ,year "1991"
+ ,pages "41-49"
+ )
+
+@inproceedings(logemann89
+ ,key "Logemann"
+ ,year 1989
+ ,title "Experiments With a Gestural Controller"
+ ,author "G. Logemann"
+ ,booktitle "Proceedings of the 1989 International Computer Music
+ Conference"
+ ,editor "T. Wells and D. Butler"
+ ,pages "184-185"
+ ,year 1989
+ ,organization "International Computer Music Association"
+ )
+
+
+@article(longuet
+ ,key "Longuet-Higgins"
+ ,year 1982
+ ,title "The Perception of Musical Rhythms"
+ ,author "Longuet-Higgins, H. C. and C. S. Lee"
+ ,journal "Perception"
+ ,volume 11
+ ,pages "115-128"
+ )
+
+@article(LH76,
+ author"Longuet-Higgins, H. C.",
+ title="Perception of Melodies",
+ journal="Nature",
+ pages="646-653",
+ volume=263,
+ year=1976)
+
+@article(LH78,
+ author="Longuet-Higgins, H. C.",
+ title="The Perception of Music",
+ journal="Interdisciplinary Science Reviews",
+ pages="148-156",
+ volume=3,
+ number=2,
+ year=1978
+)
+
+
+@article(MIDI
+ ,key = "Loy"
+ ,author = "Loy, G."
+ ,title = "Musicians Make a Standard: The MIDI Phenomenon"
+ ,journal = "Computer Music Journal"
+ ,volume = "9"
+ ,number = "4"
+ ,month = "Winter"
+ ,year = "1985"
+ ,pages = "8-26"
+ )
+
+@inproceedings(hyperinstruments
+ ,key "Machover"
+ ,author "Machover, T. and Chung, J."
+ ,title "Hyperinstruments: Musically Intelligent and Interactive
+Performance and Creativity Systems"
+ ,booktitle "Proceedings of the 1989 International Computer Music
+ Conference"
+ ,editor "T. Wells and D. Butler"
+ ,pages "186-190"
+ ,year 1989
+ ,organization "International Computer Music Association"
+ )
+
+@inproceedings(martens
+ ,key "Martens"
+ ,author "Martens, W. L."
+ ,title "PALETTE: An Environment for developing an individualized set of psychophysically scaled timbres"
+ ,booktitle "Proceedings of the 1985 International Computer Music
+ Conference"
+ ,editor "B. Truax"
+ ,pages "355-365"
+ ,year 1985
+ ,organization "International Computer Music Association"
+ )
+
+
+@inproceedings(sampling
+ ,key "Massie"
+ ,author "Massie, D. C."
+ ,title "The Emulator II Computer Music Environment"
+ ,booktitle "Proceedings of the 1985 International Computer Music
+ Conference"
+ ,editor "B. Truax"
+ ,pages "111-118"
+ ,year 1985
+ ,organization "International Computer Music Association"
+ )
+
+@Article(Mathews63
+ ,key = "Mathews"
+ ,author = "Mathews, M. V."
+ ,title = "The Digital Computer as a Musical Instrument"
+ ,journal = "Science"
+ ,volume = "142"
+ ,pages = "553-557"
+ ,year = "1963"
+ )
+
+@book(Music5
+ ,key "Mathews"
+ ,author "Mathews, M. V."
+ ,title "The Technology of Computer Music"
+ ,publisher "MIT Press"
+ ,year 1969
+ ,address "Boston"
+ )
+
+@article(groove
+ ,key "Mathews"
+ ,author "Mathews, M. V. and F. Richard Moore"
+ ,title "A Program to Compose, Store, and Edit Functions of Time"
+ ,journal "Communications of the ACM"
+ ,year 1970
+ ,month December
+ ,volume 13
+ ,number 12
+ ,pages "715-721"
+ )
+
+@article(seqdrum,
+ key = "Mathews",
+ Author = "Mathews, M. V. and C. Abbot",
+ Journal = "Computer Music Journal",
+ Title = "The Sequential Drum",
+ Year = "1980",
+ Month = "Winter",
+ Number = "4",
+ Pages = "45-59",
+ Volume = "4")
+
+@book(MP
+ ,key "Mathews"
+ ,title "Current Directions in Computer Music Research"
+ ,series "System Development Foundation Benchmark Series"
+ ,editor "Mathews, M. V. and Pierce, J. R."
+ ,year 1989
+ ,publisher "MIT Press"
+ )
+
+@article(mockingbird
+ ,key "Maxwell"
+ ,author "Maxwell, J. T., and S. M. Ornstein"
+ ,title "Mockingbird: A Composer's Amanuensis"
+ ,journal "Byte"
+ ,volume 9
+ ,number 1
+ ,year 1984
+ ,pages "384-401"
+ )
+
+
+@article(OCCAM
+ ,key "May"
+ ,author "May, David"
+ ,title "OCCAM"
+ ,journal "Sigplan Notices"
+ ,volume 18
+ ,number 4
+ ,month "April"
+ ,year 1983
+ ,pages "69-79"
+ )
+
+@manual(MidiManager
+ ,key "Apple"
+ ,author "Apple Computer, Inc."
+ ,title "MIDI Management Tools, Version 2.0"
+ ,organization "Apple Programmers and Developers Association"
+ ,year 1990
+ )
+
+@book(McCarthy
+ ,key "McCarthy"
+ ,author "McCarthy, J."
+ ,title "LISP 1.5 Programmer's Manual"
+ ,publisher "M.I.T. Press"
+ ,address "Cambridge, Mass"
+ ,year "1965"
+ )
+
+@mastersthesis(Mecca
+ ,key "Mecca"
+ ,author "Michael T. Mecca"
+ ,title "Tempo Following Behavior in Musical Accompaniment"
+ ,School "Department of Logic and Philosophy, Carnegie Mellon University"
+ ,Year 1993
+ ,address "Pittsburgh"
+)
+
+@book(moorebook
+ ,key = "Moore"
+ ,author = "Moore, F. R."
+ ,title = "Elements of Computer Music"
+ ,year = "1990"
+ ,publisher = "Prentice Hall"
+ ,address = "New Jersey"
+ )
+
+@article(moorer
+ ,key "Moorer"
+ ,author "Moorer, J. A."
+ ,title "Signal Processing Aspects of Computer Music - A Survey"
+ ,journal "Proceedings of the IEEE"
+ ,volume 65
+ ,number 8
+ ,pages "1108-1137"
+ ,year 1977
+ ,month "July"
+ ,note "A revised and updated version is included in @i(Digital Audio Signal Processing: An Anthology), ed. by John Strawn, William
+Kaufmann, Inc., 1985."
+ )
+
+@article(Val
+ ,key "McGraw"
+ ,author "McGraw, James R."
+ ,title "The VAL Language: Description and Analysis"
+ ,journal "ACM Transactions on Programming Languages and Systems"
+ ,volume 4
+ ,number 1
+ ,month "January"
+ ,year 1982
+ ,pages "44-82"
+ )
+
+@article(Cmusic,
+ key = "Moore",
+ Author = "Moore, F. R.",
+ Journal = "Computer Music Journal",
+ Title = "The Computer Audio Research Laboratory at UCSD",
+ Year = "1982",
+ Number = "6",
+ Pages = "18-29",
+ Volume = "1")
+
+
+@book(Cmusic90,
+ key = "Moore",
+ Author = "Moore, F. R.",
+ Title = "Elements of Computer Music",
+ Publisher = "Prentice-Hall",
+ Year = "1990")
+
+
+@PhDThesis(Moorer75
+ ,key = "Moorer"
+ ,Author = "Moorer, J. A."
+ ,Year = 1975
+ ,School = "Stanford University Department of Computer Science"
+ ,Title = "On the Segmentation and Analysis of Continuous Musical Sounds
+ by Digital Computer"
+ )
+
+@article(Andrew
+ ,key = "Morris"
+ ,author = "Morris, James H., et. al."
+ ,title = "Andrew: A Distributed Personal Computing Environment"
+ ,journal = "Communications of the ACM"
+ ,volume = "29"
+ ,number = "3"
+ ,month = "March"
+ ,year = "1986"
+ ,pages = "184-201"
+ )
+
+@Article(GarnetComputer
+ Key="Myers",
+ Author="Brad A. Myers, et al.",
+ Title="Garnet: Comprehensive Support for Graphical, Highly Interactive User Interfaces",
+ Journal="IEEE Computer",
+ Volume=23,
+ number=11,
+ Month=Nov,
+ year=1990,
+ pages="71-85")
+
+@article(NelsonMPL
+ ,key Nelson
+ ,author "Nelson, G."
+ ,title "MPL: A Program Library for Musical Data Processing"
+ ,journal "Creative Computing"
+ ,pages "76-81"
+ ,year "1977"
+ ,month "Mar.-Apr."
+ )
+
+@article(Hytime
+ ,key "Newcomb"
+ ,author "Newcomb, S. R., N. A. Kipp, and V. T. Newcomb"
+ ,title "The HYTIME Multimedia/time-based document structuring language"
+ ,journal "Communications of the ACM"
+ ,volume 34
+ ,month "November"
+ ,year 1991
+ ,pages "67-83"
+ )
+
+@article(SMDL-Computer
+ ,key "Newcomb"
+ ,author "Newcomb, S. R."
+ ,title "Standard Music Description Language Complies With Hypermedia Standard"
+ ,journal "Computer"
+ ,volume 24
+ ,number 7
+ ,month "July"
+ ,year 1991
+ ,pages "76-80"
+ )
+
+@manual(framekit
+ ,key = "Nyberg"
+ ,author = "Nyberg, Eric H."
+ ,title = "The FRAMEKIT User's Guide Version 2.0"
+ ,organization = "Computer Science Department, Carnegie Mellon University"
+ ,year = 1988)
+
+
+@inproceedings(oppenheimNotation
+ ,key "Oppenheim"
+ ,title "The P-G-G Environment For Music Composition: A Proposal"
+ ,author "Oppenheim, D. V."
+ ,booktitle "Proceedings of the 1987 International Computer Music
+ Conference"
+ ,editor "J. Beauchamp"
+ ,pages 40-48
+ ,year 1987
+ ,organization "International Computer Music Association"
+ ,address "San Francisco"
+ )
+
+@inproceedings(MLOGO
+ ,key "Orlarey"
+ ,author "Orlarey, Y."
+ ,title "MLOGO: A MIDI Composing Environment"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1986"
+ ,editor "P. Berg"
+ ,year = "1986"
+ ,organization = "International Computer Music Association"
+ ,pages = "211-213"
+ )
+
+@inproceedings(midishare
+ ,key "Orlarey"
+ ,author "Orlarey, Y., H. Lequay"
+ ,title "MidiShare, A Real Time Multi-tasks Software Module for Midi Applications"
+ ,booktitle "Proceedings of the 1989 International Computer Music
+ Conference"
+ ,editor "T. Wells and D. Butler"
+ ,pages "234-237"
+ ,year 1989
+ ,organization "International Computer Music Association"
+ )
+
+
+@inproceedings(ATK
+ ,key "Palay"
+ ,author "Palay, A. J., F. Hansen, M. Kazar, M. Sherman, M. Wadlow, T.
+Neuendorffer, Z. Stern, M. Bader, T. Peters"
+ ,title "The Andrew Toolkit - An Overview"
+ ,booktitle "Proceedings USENIX Technical Conference"
+ ,month "Winter"
+ ,year 1988
+ ,pages "9-21"
+ ,organization "USENIX"
+)
+
+
+
+@article(palmer
+ ,key "Palmer"
+ ,author "Palmer, C."
+ ,title "Mapping Musical Thought to Musical Performance"
+ ,journal "Journal of Experimental Psychology"
+ ,volume 15
+ ,number 12
+ ,month "Dec"
+ ,year 1989
+ )
+
+
+@inproceedings(fminverse
+ ,key "Payne"
+ ,author "Payne, R. G."
+ ,title "A Microcomputer Based Analysis/Resynthesis Scheme
+for Processing Sampled Sounds Using FM"
+ ,organization "Computer Music Association"
+ ,booktitle "Proceedings of the 1987 International Computer Music Conference"
+ ,year 1987
+ ,pages "282-289"
+ )
+
+
+@book(Papoulis
+ ,key "Papoulis"
+ ,author "Papoulis, Athanasios"
+ ,title "The Fourier Integral And Its Applications"
+ ,year 1962
+ ,publisher "McGraw-Hill"
+ ,address "New York"
+ )
+
+
+@article(HMSL
+ ,key "Polansky"
+ ,author "Polansky, L., P. Burk, and D. Rosenboom"
+ ,title "HMSL (Hierarchical Music Specification Language): A Theoretical Overview"
+ ,journal "Perspectives of New Music"
+ ,year 1990
+ ,volume 28
+ ,number 2
+ ,month summer
+ ,pages "136-179"
+ )
+
+@book(OOPBook
+ ,key "Pope"
+ ,author "Pope, S. T., editor"
+ ,title "The Well-Tempered Object: Musical Applications of Object-Oriented Software Technology"
+ ,address "Boston"
+ ,publisher "MIT Press"
+ ,year "1991"
+)
+
+@inbook(Mode
+ ,author "Pope, S. T."
+ ,key "Pope"
+ ,title "Introduction to MODE: The Musical Object Development Environment"
+ ,booktitle "The Well-Tempered Object: Musical Applications of Object-Oriented Software Technology"
+ ,editor "S. T. Pope"
+ ,address "Boston"
+ ,publisher "MIT Press"
+ ,pages "83-106"
+ ,year "1991"
+)
+
+@article(cmj-software-synthesis
+ ,author "Pope, S. T."
+ ,key "Pope"
+ ,title "Machine Tongues XV: Three Packages for Software Sound Synthesis"
+ ,journal "Computer Music Journal"
+ ,Volume 17
+ ,Number 2
+ ,Month "Summer"
+ ,Year "1993"
+ ,Pages "23-54"
+ )
+
+@book(Pratt
+ ,author "Pratt, Terrence W."
+ ,key "Pratt"
+ ,title "Programming Languages: Design and Implementation"
+ ,year 1975
+ ,publisher "Prentice-Hall"
+ ,address "Englewood Cliffs, N. J."
+ )
+
+@inproceedings(MAXandX
+ ,key "Puckette"
+ ,author "Puckette, M."
+ ,title "Interprocess Communication and Timing in Real-time Computer Music Performance"
+ ,pages "43-46"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1986"
+ ,editor "P. Berg"
+ ,year = "1986"
+ ,organization = "International Computer Music Association"
+ )
+
+
+
+@inproceedings(Patcher
+ ,key "Puckette"
+ ,author "Puckette, M."
+ ,title "The Patcher"
+ ,booktitle "Proceedings of the 14th International Computer Music Conference"
+ ,editor "C. Lischka and J. Fritsch"
+ ,year 1988
+ ,pages "420-429"
+ ,organization "International Computer Music Association"
+ )
+
+@inproceedings(Explode
+ ,key "Puckette"
+ ,author "Puckette, M."
+ ,title "EXPLODE: a user interface for sequencing and score following"
+ ,booktitle "ICMC Glasgow 1990 Proceedings"
+ ,year = "1990"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ ,pages "259-261"
+ ,editor "S. Arnold and G. Hair"
+ )
+
+@manual(MaxManual
+ ,key = "Puckette"
+ ,author = "Puckette, M. and D. Zicarelli"
+ ,title = "MAX Development Package"
+ ,organization = "Opcode Systems, Inc."
+ ,year = 1991)
+
+@article(maxcmj
+ ,key "Puckette"
+ ,author "Puckette, M."
+ ,title "Combining Event and Signal Processing in the MAX
+Graphical Programming Environment" ,
+ ,journal "Computer Music Journal"
+ ,year 1991
+ ,pages="68-77"
+ ,volume=15
+ ,number=3
+ ,month "Fall"
+ )
+
+
+@book(polson
+ ,key "Pohlmann"
+ ,author "Pohlmann, K. C."
+ ,title "The Compact Disc: a handbook of theory and use"
+ ,publisher "A-R Editions"
+ ,address "Madison, WI"
+ ,year 1992
+)
+
+@article(fts-cmj
+ ,key "Puckette"
+ ,author "M. Puckette"
+ ,title "FTS: A Real-Time Monitor for Multiprocessor Music Synthesis"
+ ,journal "Computer Music Journal"
+ ,year 1991
+ ,volume 15
+ ,number 3
+ ,month "Fall"
+ ,pages "58-67"
+)
+
+
+@inproceedings(fts
+ ,key "Viara"
+ ,author "Viara, E., and M. Puckette"
+ ,title "A Real-Time Operating System for Computer Music"
+ ,year 1990
+ ,booktitle "Proceedings of the 1990
+International Computer Music Conference"
+ ,pages "270-272"
+ ,organization "International Computer Music Association"
+ )
+
+@inproceedings(reynaud85a
+ ,key "Reynaud"
+ ,title "Problem-solving Strategies in a Music Transcription System"
+ ,author "Mont-Reynaud, Bernard"
+ ,year 1985
+ ,booktitle "IJCAI Proceedings"
+)
+
+@inproceedings(reynaud85b,
+ ,key "Reynaud"
+ ,title "On Finding Rhythmic Patterns in Musical Lines"
+ ,author "Mont-Reynaud, Bernard and Mark Goldstein"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the International Computer Music Conference 1985"
+ ,editor "B. Truax"
+ ,year 1985
+ ,pages "391-397"
+ )
+
+@techreport(reynaud84
+ ,key "Chowning"
+ ,author "Chowning, J., B. Mont-Reynaud, et. al."
+ ,title "An Intelligent System for the Analysis of Digitized Acoustic Signals"
+ ,institution "Stanford University"
+ ,year 1984
+ ,number "STAN-M-15"
+ )
+
+@inproceedings(Rogers
+ ,key "Rogers"
+ ,author "Rogers, J., J. Rockstroh, and P. Batstone"
+ ,title "Music-Time and Clock-Time Similarities Under Tempo Changes"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the 1980 International Computer Music Conference"
+ ,year 1980
+ ,pages "404-442"
+ )
+
+@book(MIDIbook
+ ,key "Rothstein"
+ ,author "Rothstein, J."
+ ,title "MIDI: A Comprehensive Introduction"
+ ,publisher "A-R Editions"
+ ,address "Madison, WI"
+ ,year 1992
+ )
+
+@book(Rowe
+ ,key "Rowe"
+ ,author "Rowe, R."
+ ,title "Interactive Music Systems"
+ ,publisher "MIT Press"
+ ,year 1993
+ )
+
+
+@inbook(ptvideo
+ ,key "Sanchez"
+ ,author "Sanchez, M., A. Joseph, R. B. Dannenberg, P. Capell, R. Saul, and R. Joseph"
+ ,title "The Piano Tutor"
+ ,series "ACM Siggraph Video Review"
+ ,year "1990"
+ ,publisher "ACM Siggraph"
+ ,address "c/o 1st Priority, Box 576, Itasca, IL 60143-0576"
+ ,booktitle " CHI '90 Technical Video Program - New Techniques"
+ ,volume "55"
+ ,note "(Video)"
+ )
+
+@book(sankoff
+ ,key "Sankoff"
+ ,author "Sankoff, David and Joseph B. Kruskal, editors"
+ ,title "Time Warps, String Edits, and Macromolecules:
+ The Theory and Practice of Sequence Comparison."
+ ,publisher "Addison-Wesley"
+ ,address "Reading, Mass."
+ ,year 1983
+ )
+
+@article(KymaCMJ
+ ,key "Scaletti"
+ ,title "The Kyma/Platypus Computer Music Workstation"
+ ,author "Scaletti, C."
+ ,journal "Computer Music Journal"
+ ,volume 13
+ ,number 2
+ ,month "Summer"
+ ,year 1989
+ ,pages "23-38"
+ )
+
+@inproceedings(KymaOOPSLA
+ ,key "Scaletti"
+ ,title "An Interactive Graphic Environment for Object-Oriented
+Music Composition and Sound Synthesis"
+ ,author "Scaletti, C., and E. Johnson"
+ ,booktitle "Proceedings of the 1988 Conference on Object-Oriented
+Languages and Systems"
+ ,year 1988
+ ,pages "18-26"
+ ,organization "ACM"
+ )
+
+@inbook(Kyma
+ ,key "Scaletti"
+ ,author "Scaletti, C., and K. Hebel"
+ ,title "An Object-based Representation for Digital Audio Signals"
+ ,booktitle "Representations of Musical Signals"
+ ,editor "G. De Poli, A. Piccialli, and C. Roads"
+ ,publisher "MIT Press"
+ ,address "Cambridge, Mass."
+ ,year 1991
+ ,pages "371-389"
+ ,chapter 11
+ )
+
+@inproceedings(scaletti92
+ ,key "Scaletti"
+ ,author "Scaletti, C."
+ ,title "Polymorphic transformations in Kyma"
+ ,booktitle = "Proceedings of the 1992 ICMC"
+ ,year = "1992"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ ,pages "249-252"
+ )
+
+@phdthesis(Schloss
+ ,key "Schloss"
+ ,author "Schloss, A."
+ ,title "On the Automatic Transcription of Percussive Music"
+ ,school "Department of Speech and Hearing, Stanford University"
+ ,year 1985
+ ,note "Department of Music Technical Report STAN-M-27"
+ ,month June
+ )
+
+@techreport(sisTR
+ ,key "Serra"
+ ,author "Serra, M., D. Rubine, R. B. Dannenberg"
+ ,title "A Comprehensive Study of the Analysis and Synthesis of
+ Tones by Spectral Interpolation"
+ ,institution "Carnegie Mellon"
+ ,number "CMU-CS-88-146"
+ ,year 1988
+ ,month June
+ )
+
+@inproceedings(sisicmc
+ ,key "Serra"
+ ,author "Serra, M., D. Rubine, R. B. Dannenberg"
+ ,title "The Analysis and Resynthesis of Tones via Spectral
+ Interpolation"
+ ,booktitle "Proceedings of the 14th International Computer Music
+ Conference"
+ ,editor "C. Lischka and J. Fritsch"
+ ,organization "International Computer Music Association"
+ ,year 1988
+ ,pages "322-332"
+ )
+
+@article(sisJAES
+ ,key Serra
+ ,author "Serra, M., D. Rubine, R. B. Dannenberg"
+ ,title "Analysis and Synthesis of Tones by Spectral Interpolation"
+ ,journal "Journal of the Audio Engineering Society"
+ ,year 1990
+ ,volume 38
+ ,number 3
+ ,month March
+ ,year 1990
+ ,pages 111-128
+ )
+
+@article(shepardspiral
+ ,key "Shepard"
+ ,author "Shepard, R. N."
+ ,title "Geometrical approximations to the structure of musical pitch"
+ ,journal "Psychological Review"
+ ,volume 89
+ ,number 4
+ ,year 1982
+ ,pages "305-333"
+ )
+
+@inbook(simon
+ ,key "Simon"
+ ,author "Simon, H. A. and Sumner, R. K."
+ ,title "Pattern in Music"
+ ,booktitle "Formal Representation of Human Judgment"
+ ,editor "B. Kleinmuntz"
+ ,address "New York"
+ ,publisher "Wiley"
+ ,year 1968
+ )
+
+@article(Auditeur
+ ,key "Simon"
+ ,author "Simon, H. A."
+ ,title "Perception du Pattern Musical par AUDITEUR"
+ ,Journal "Sciences de l'Art"
+ ,volume 2
+ ,pages "28-34"
+ ,year 1968
+ )
+
+@book(slawson
+ ,key "Slawson"
+ ,author "Slawson, A. W."
+ ,title "Sound Color"
+ ,publisher "University of California Press"
+ ,address "Berkeley"
+ ,year 1985
+ )
+
+@book(Sleeman-brown
+ ,key = "Sleeman"
+ ,author = "Sleeman, D. and J. S. Brown (eds.)"
+ ,title = "Intelligent Tutoring Systems"
+ ,address = "New York"
+ ,publisher = "Academic Press"
+ ,year = 1982
+ )
+
+@inproceedings(smdl
+ ,key "Sloan"
+ ,author "D. Sloan"
+ ,title "Precis of the Standard Music Description Language"
+ ,organization "Computer Music Association"
+ ,booktitle "Proceedings of the 1989 International Computer Music Conference"
+ ,year 1989
+ ,pages "296-302"
+ )
+
+@inproceedings(arctic-runtime
+ ,key Dannenberg
+ ,author "Dannenberg, R. B."
+ ,title "A Run-time System for Arctic"
+ ,booktitle "ICMC Glasgow 1990 Proceedings"
+ ,organization "International Computer Music Association"
+ ,year 1990
+ ,pages "185-187"
+ )
+
+
+@inproceedings(cmt-mexico
+ ,key Dannenberg
+ ,author "Dannenberg, R. B."
+ ,title "Recent Developments in the CMU MIDI Toolkit"
+ ,booktitle "Proceedings of the International Seminar
+ Ano 2000: Theoretical, Technological and Compositional
+ Alternatives"
+ ,organization "Universidad Nacional Autonoma de Mexico"
+ ,address "Mexico City"
+ ,editor "C. Sandoval"
+ ,year 1990
+ ,pages "52-62"
+ )
+
+@inproceedings(optimizingdsp
+ ,key "Thompson"
+ ,author "Thompson, N. and R. B. Dannenberg"
+ ,title "Optimizing Software Synthesis Performance"
+ ,booktitle "Proceedings of the 1995 International Computer Music Conference"
+ ,publisher "International Computer Music Association"
+ ,year 1995
+ ,pages "235-6"
+ )
+
+@inproceedings(W
+ ,key Dannenberg
+ ,author "Dannenberg, R. B. and D. Rubine"
+ ,title = "Toward Modular, Portable, Real-Time Software"
+ ,booktitle = "Proceedings of the 1995 International Computer Music Conference"
+ ,publisher "International Computer Music Association"
+ ,year 1995
+ ,pages "65-72"
+ )
+
+
+@inproceedings(SampleRate
+ ,key Smith
+ ,author "Smith, Julius O. and Phil Gossett"
+ ,title "A Flexible Sampling-Rate Conversion Method"
+ ,booktitle "Proceedings of ICASSP, Vol. 2"
+ ,pages "19.4.1-19.4.4"
+ ,year 1984
+ )
+
+@inproceedings(Parshl
+ ,key "Smith"
+ ,author "Smith, Julius O. and Xavier Serra"
+ ,title "PARSHL: An Analysis/Synthesis Program for Non-Harmonic Sounds
+ Based on a Sinusoidal Representation"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the 1987 International Computer Music
+ Conference"
+ ,editor "J. Beauchamp"
+ ,year 1987
+ ,pages "290-297"
+ )
+
+@inproceedings(Spiegel
+ ,key "Spiegel"
+ ,author "Spiegel, L."
+ ,title "Manipulations of Musical Patterns"
+ ,organization "IEEE Computer Society"
+ ,booktitle "Proceedings of the Symposium on Small Computers in the Arts"
+ ,year "1981"
+ ,pages "19-22"
+ )
+
+@inproceedings(Taube
+ ,key "Taube"
+ ,author "Taube, H."
+ ,title "Common Music: A Compositional Language in Common Lisp and CLOS"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the 1989 International Computer Music Conference"
+ ,editor "T. Wells and D. Butler"
+ ,year 1989
+ ,pages "316-319"
+ )
+
+@inproceedings(Vivace
+ ,key "Thomas"
+ ,author "Thomas, M. T."
+ ,title "Vivace: a rule based AI system for composition"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the International Computer Music Conference 1985"
+ ,editor "B. Truax"
+ ,year 1985
+ ,pages "267-274"
+ )
+
+@misc(Voice,
+ ,author "Thomas, Marilyn T. and Peter Monta"
+ ,key "Thomas"
+ ,title "MacVoice 1.0 User's Manual"
+ ,year "1986"
+ ,publisher "Kinko's Academic Courseware Exchange"
+ ,address "4141 State Street, Santa Barbara, CA 93110, (800) 235-6919"
+ ,note "published by Kinko's Academic Courseware Exchange"
+ )
+
+@inproceedings(cantabile
+ ,key "Thomas"
+ ,author "Thomas, M. T., S. Chatterjee, Mark W. M."
+ ,title "Cantabile: A Rule-Based System For Composing Melody"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the 1989 International Computer Music Conference"
+ ,editor "T. Wells and D. Butler"
+ ,year 1989
+ ,pages "320-323"
+ )
+
+@inproceedings(Animation
+ ,key "Reynolds"
+ ,author "Reynolds, C. U."
+ ,title "Computer Animation with Scripts and Actors"
+ ,organization "ACM"
+ ,booktitle "Proceedings of ACM SIGGRAPH Conference"
+ ,year 1982
+ ,month "July"
+ )
+
+@article(CMJAda
+ ,key "Roads"
+ ,author "Roads, C."
+ ,title "Machine Tongues VI: Ada"
+ ,journal "Compter Music Journal"
+ ,volume 3
+ ,number 4
+ ,month "Winter"
+ ,year 1980
+ ,pages "6-8"
+ )
+
+@inproceedings(Formes83
+ ,key "Rodet"
+ ,author "Rodet, Xavier, Pierre Cointe, Jean-Baptiste Barriere, Yves Potard, B. Serpette, and J. J. Briot"
+ ,title "Applications and Developments of the FORMES programming environment"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the 1983 International Computer Music Conference"
+ ,year 1983
+ )
+
+@article(Chant
+ ,key "Rodet"
+ ,author "Rodet, X., Y. Potard and Jean-Baptist Barriere"
+ ,journal "Computer Music Journal"
+ ,title "The CHANT Project: From Synthesis of the Singing Voice
+ to Synthesis in General"
+ ,year 1984
+ ,volume 8
+ ,number 3
+ ,month "Fall"
+ ,pages "15-31"
+ )
+
+@article(Formes84
+ ,key "Rodet"
+ ,author "Rodet, X. and P. Cointe"
+ ,journal "Computer Music Journal"
+ ,title "FORMES: Composition and Scheduling of Processes"
+ ,year 1984
+ ,volume 8
+ ,number 3
+ ,month "Fall"
+ ,pages "32-50"
+ )
+
+@inproceedings(mercury
+ ,key "Rodet"
+ ,author "Rodet, Xavier and Gerhard Eckel"
+ ,year 1988
+ ,title "Dynamic Patches: Implementation and Control in the
+ Sun-Mercury Workstation"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the 14th International Computer Music
+ Conference"
+ ,editor "C. Lischka and J. Fritsch"
+ ,pages "82-89"
+ )
+
+@phdthesis(rubenstein
+ ,key "Rubenstein"
+ ,author "Rubenstein, W. B."
+ ,year 1987
+ ,Title "Data Management of Musical Information"
+ ,school "U. C. Berkeley"
+ ,note "Memorandom No. UCB/ERL M87/69"
+ ,month June
+ )
+
+@techreport(arcticref
+ ,key "Rubine"
+ ,title "Arctic Programmer's Manual and Tutorial"
+ ,author "Rubine, D. and R. B. Dannenberg"
+ ,institution "Carnegie Mellon"
+ ,number "CMU-CS-87-110"
+ ,year 1987
+ )
+
+@inproceedings(videoharp
+ ,key "Rubine"
+ ,title "The VideoHarp"
+ ,author "Rubine, D. and P. McAvinney"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the 14th International Computer Music Conference"
+ ,year 1988
+ ,pages "49-55"
+ )
+
+@article(videoharpcmj
+ ,key "Rubine"
+ ,title "Programmable Finger-tracking Instrument Controllers"
+ ,author "Rubine, Dean and Paul McAvinney"
+ ,journal "Computer Music Journal"
+ ,year 1990
+ ,month Spring
+ ,number 1
+ ,volume 14
+ ,pages "26-41"
+ )
+
+
+@phdthesis(rubinethesis
+ ,key "Rubine"
+ ,author "Rubine, D."
+ ,title "The Automatic Recognition of Gestures"
+ ,school "Carnegie Mellon University"
+ ,year 1991
+ )
+
+@incollection(rubine91c
+ ,key "Rubine"
+ ,author "Rubine, D."
+ ,title "Criteria for Gesture Recognition Technologies"
+ ,booktitle "Neural Networks and Pattern Recognition in Human
+Computer Interaction"
+ ,publisher "Ellis Horwood"
+ ,address "Chichester, UK"
+ ,year "(to appear)"
+ ,editor "R. Beale and J. Finlay"
+ )
+
+@inproceedings(rubine91b
+ ,key "Rubine"
+ ,author "Rubine, D."
+ ,title "Integrating Gesture Recognition and Direct Manipulation"
+ ,booktitle "Proceedings of the Summer 1991 Usenix Conference"
+ ,editor "C. Carr"
+ ,address "Berkeley, CA"
+ ,organization "USENIX Association"
+ ,year 1991
+ )
+
+@article(rubine91a
+ ,key "Rubine"
+ ,author "Rubine, D."
+ ,title "Specifying Gestures by Example"
+ ,journal "Computer Graphics"
+ ,volume 25
+ ,number 4
+ ,month July
+ ,year 1991
+ ,note "(Proceedings of SIGGRAPH '91)"
+ ,organization "ACM SIGGRAPH"
+ ,address "New York"
+ ,pages "329-37"
+ )
+
+@inCollection(Salamon
+ ,key "Salamon"
+ ,author "Salamon, F. P., Jr."
+ ,title "Real-Time Electronic Engine Control (EEC) Microprocessor Software Productivity"
+ ,booktitle "New Developments in Electronic Engine Management"
+ ,publisher "Society of Automotive Engineers"
+ ,address "400 Commonwealth Drive, Warrendale, PA 15096"
+ ,year 1984
+ ,volume "SP-572"
+ ,pages "45-55"
+ )
+
+@article(PianoTutor
+ ,author "Sanchez, Marta and Annabelle Joseph"
+ ,key "Sanchez"
+ ,journal "Accent on Research"
+ ,title "Piano Tutor"
+ ,year 1986
+ ,month "Fall"
+ ,pages "7"
+ ,note "published by Carnegie Mellon University"
+ )
+
+@article(scarborough89
+ ,key "Scarborough"
+ ,author "Scarborough, D., B. O. Miller, and J. A. Jones"
+ ,title "Connectionist Models for Tonal Analysis"
+ ,journal "Computer Music Journal"
+ ,volume 13
+ ,number 3
+ ,month "Fall"
+ ,year 1989
+ ,pages "49-55"
+ )
+
+@article(marksweep
+ ,key "Schorr"
+ ,author "Schorr, H. and W. Waite"
+ ,year 1967
+ ,title "An Efficient and Machine Independent Procedure for Garbage Collection in Various List Structures"
+ ,journal "Communications of the ACM"
+ ,volume 10
+ ,number 8
+ ,pages 501-506
+ )
+
+@article(PLA
+ ,key "Schottstaedt"
+ ,author "Schottstaedt, Bill"
+ ,title "Pla: A Composer's Idea of a Language"
+ ,journal "Computer Music Journal"
+ ,volume 7
+ ,number 1
+ ,month "Spring"
+ ,year 1983
+ ,pages "11-20"
+ )
+
+@article(Roads
+ ,key "Roads"
+ ,author "Roads, C."
+ ,title "Artificial Intelligence and Music"
+ ,journal "Computer Music Journal"
+ ,volume 4
+ ,number 2
+ ,year 1980
+ ,month "Summer"
+ ,pages "13-25"
+ )
+
+@techreport(nettalk
+ ,key = "Sejnowski"
+ ,Author = "Sejnowski, T. J. and C. R. Rosenberg"
+ ,Journal = "Complex Systems"
+ ,Title = "NETtalk: AParallel Network that Learns to Read Aloud"
+ ,Institution "Johns Hopkins University"
+ ,number "JHU/EECS-86/01"
+ ,Year = "1986"
+ )
+
+@Article(snell,
+ key = "Snell",
+ Author = "Snell, John",
+ Journal = "Computer Music Journal",
+ Title = "The Lucasfilm Real-Time Console for Recording Studios and
+ Performance of Computer Music",
+ Year = "1982",
+ Month = "Fall",
+ Number = "3",
+ Pages = "33-45",
+ Volume = "6")
+
+@book(steele
+ ,key "Steele"
+ ,author "Steele, Guy L., Jr."
+ ,title "Common Lisp"
+ ,publisher "Digital Press"
+ ,year "1984")
+
+@article(stevens
+ ,key "Stevens"
+ ,author "Stevens, S. M."
+ ,title "Intelligent Interactive Video Simulation of a Code Inspection"
+ ,journal "Communications of the ACM"
+ ,volume 32
+ ,number 7
+ ,year 1989
+ ,month "July"
+ ,pages "832-43"
+)
+
+@misc(stone,
+ key = "Stone",
+ Title = "diffreg.c",
+ HowPublished = "Source code for the 4.1BSD Berkeley Unix@+(TM)
+ @i(diff) program.")
+
+@book(schrader
+ ,key = "Schrader"
+ ,author = "Schrader, B."
+ ,title = "Introduction to Electro-Acoustic Music"
+ ,year = "1982"
+ ,publisher = "Prentice Hall"
+ ,address = "New Jersey"
+ )
+
+@article(Sundberg82
+ ,key="Sundberg"
+ ,author="Sundberg, J."
+ ,title="In tune or not? A study of fundamental frequency in music practise"
+ ,journal="Speech Transmission Laboratory Quarterly Progress and Status Report"
+ ,year="1982"
+ ,month="April"
+ ,number="STL-QPSR 1/1982"
+ )
+
+@article(Sundberg83
+ ,key "Sundberg"
+ ,author "Sundberg, J., A. Askenfelt, L. Fryden"
+ ,title "Musical Performance: A Synthesis-by-Rule Approach"
+ ,journal "Computer Music Journal"
+ ,pages "37-43"
+ ,year 1983
+ ,month "Spring"
+ ,volume 7
+ ,number 1
+ )
+
+@inproceedings(Teitelbaum
+ ,key = "Teitelbaum"
+ ,author = "Teitelbaum, R."
+ ,title = "The Digital Piano and the Patch Control Language System"
+ ,pages = "213-216"
+ ,booktitle = "Proceedings of the International Computer Music Conference 1984"
+ ,editor = "W. Buxton"
+ ,year = "1985"
+ ,organization = "International Computer Music Association"
+ )
+
+@article(Terhardt
+ ,key="Terhardt"
+ ,author="Terhardt, E."
+ ,title="Pitch, consonance, and harmony"
+ ,journal="Journal of the Acoustical Society of America"
+ ,year="1974"
+ ,number="55"
+ ,page="1061-69"
+ )
+
+@article(Toddcmj
+ ,key "Todd"
+ ,author "Todd, P. M."
+ ,title "A Connectionist Approach to Algorithmic Composition"
+ ,journal "Computer Music Journal"
+ ,volume 13
+ ,number 4
+ ,month "Winter"
+ ,year 1989
+ ,pages "27-43"
+ )
+
+@InCollection(Koenig
+ ,key "Koenig"
+ ,author "Koenig, G. M."
+ ,title "Project 1"
+ ,BookTitle "Electronic Music Reports"
+ ,publisher "Institute of Sonology, Utrecht University"
+ ,month "July"
+ ,year "1970"
+ ,pages "32-44"
+ )
+
+@article(ISP
+ ,key "Kopec"
+ ,author "Kopec, Gary E."
+ ,title "The Integrated Signal Processing System ISP"
+ ,journal "IEEE Transactions on Acoustics, Speech and Signal Processing"
+ ,month "August"
+ ,volume "ASSP-32"
+ ,number 4
+ ,year 1984
+ ,month "August"
+ ,pages "842-850"
+ )
+
+@article(SRL,
+ ,key "Kopec"
+ ,author "Kopec, Gary E."
+ ,title "The Signal Representation Language SRL"
+ ,journal "IEEE Transactions on Acoustics, Speech and Signal Processing"
+ ,volume "ASSP-33"
+ ,number 4
+ ,month "August"
+ ,year "1985"
+ ,pages "921-932"
+ )
+
+
+@article(Ternstrom82
+ ,key="Ternstrom"
+ ,author="Ternstrom, S. and J. Sundberg"
+ ,title="Acoustical factors related to pitch precision in choir singing"
+ ,journal="Speech Transmission Laboratory Quarterly Progress and Status Report"
+ ,year="1982"
+ ,month="October"
+ ,number="STL-QPSR 2-3/1982"
+ )
+
+@book(Todd
+ ,key "Todd"
+ ,author "Todd, P. M. and D. G. Loy"
+ ,title "Music and Connectionism"
+ ,publisher "MIT Press"
+ ,address "Boston"
+ ,year 1991
+ )
+
+@book(Touretzky
+ ,key "Touretzky"
+ ,author "Touretzky, David S."
+ ,title "LISP: a gentle introduction to symbolic computation"
+ ,address "New York"
+ ,publisher "Harper & Row"
+ ,year 1984
+ )
+
+@article(vanska
+ ,author "Vanska, L., R. J. Rosenberg and V. Pitkanen"
+ ,key "Vanska"
+ ,journal "Nuclear Instruments and Methods"
+ ,title "An Automatic Gamma Spectrometer For Activation Analysis"
+ ,year 1983
+ ,volume 213
+ ,pages "343-347"
+ )
+
+@unpublished(spomin
+ ,author "Velikonja, P."
+ ,title "Spomin"
+ ,note "unpublished score."
+ ,year 1990
+ )
+
+@manual(Music11
+ ,key "vercoe"
+ ,author "Vercoe, Barry"
+ ,title "Reference Manual for the MUSIC 11 Sound Synthesis Language"
+ ,year 1981
+ ,organization "MIT Experimental Music Studio"
+ )
+
+@inproceedings(Vercoe84
+ ,key "Vercoe"
+ ,author "Vercoe, B."
+ ,fullauthor "Barry Vercoe"
+ ,title "The Synthetic Performer in the Context of Live Performance"
+ ,organization "Computer Music Association"
+ ,booktitle "Proceedings of the 1984 International Computer Music Conference"
+ ,pages "199-200"
+ ,year 1984
+ )
+
+
+@inproceedings(Vercoe85
+ ,key "Vercoe"
+ ,author "Vercoe, B. and M. Puckette"
+ ,title "Synthetic Rehearsal: Training the Synthetic Performer"
+ ,organization "International Computer Music Association"
+ ,booktitle "Proceedings of the International Computer Music Conference 1985"
+ ,editor "B. Truax"
+ ,year 1985
+ ,pages "275-278"
+ )
+
+@manual(Csound
+ ,key "vercoe"
+ ,author "Vercoe, B."
+ ,title "Csound: A Manual for the Audio Processing System and
+Supporting Programs"
+ ,year 1986
+ ,organization "MIT Media Lab"
+ )
+
+@inproceedings(RTCsound
+ ,key "Vercoe"
+ ,author "Vercoe, B. and D. Ellis"
+ ,title "Real-Time CSOUND: Software Synthesis with Sensing and Control"
+ ,organization "International Computer Music Association"
+ ,booktitle "ICMC Glasgow 1990 Proceedings"
+ ,editor "S. Arnold and G. Hair"
+ ,year 1990
+ ,pages "209-211"
+ )
+
+@TechReport(Waibel81a,
+ key = "Waibel",
+ Author = "Waibel, A., N. Krishnan, R. Reddy",
+ Title = "Minimizing Computational Cost for
+ Dynamic Programming Algorithms",
+ Institution = "Carnegie-Mellon University
+ Department of Computer Science",
+ year = "1981",
+ Month = "June",
+ Number = "CMU-CS-81-124")
+
+
+@TechReport(Waibel81b,
+ key = "Waibel",
+ Author = "Waibel, A. and B. Yegnanarayana",
+ Title = "Comparative Study of Nonlinear Time Warping Techniques
+ in Isolated Word Speech Recognition Systems",
+ Institution = "Carnegie-Mellon University
+ Department of Computer Science",
+ year = "1981",
+ Month = "June",
+ Number = "CMU-CS-81-125")
+
+
+@techreport(ward
+ ,author = "Ward, Stephen A."
+ ,institution = "MIT"
+ ,key = "ward"
+ ,title = "An Approach to Real Time Computation"
+ ,year = "1978"
+ )
+
+@inproceedings(waters
+ ,key "Waters"
+ ,author "Waters, S. and T. Ungvary"
+ ,title "The Sonogram: A Tool for Visual Documentation of Musical Structure"
+ ,organization "International Computer Music Association"
+ ,booktitle "ICMC Glasgow 1990 Proceedings"
+ ,editor "S. Arnold and G. Hair"
+ ,year 1990
+ ,pages "159-162"
+ )
+
+@techreport(Wawrzynek
+ ,key = "Wawrzynek"
+ ,author = "Wawrzynek, John and Tzu-Mu Lin"
+ ,institution = "California Institute of Technology"
+ ,title = "A Bit Serial Architecture for Multiplication and Interpolation"
+ ,year = "1983"
+ ,month = "January"
+ ,number = "5067:DF:83"
+ )
+
+@article(Quicktime
+ ,key "Wayner"
+ ,author "Wayner, P."
+ ,title "Inside QUICKTIME"
+ ,journal "Byte"
+ ,volume 16
+ ,year 1991
+ ,month December
+ ,pages 189
+)
+
+@book(wenger
+ ,Key = "Wenger"
+ ,Author = "Wenger, E."
+ ,Title = "Artificial Intelligence and Tutoring Systems"
+ ,Publisher = "Morgan Kaufmann Publishers, Inc."
+ ,Year = 1987
+ )
+
+@inbook(wesseltimbre
+ ,key "Wessel"
+ ,author "Wessel, D. L."
+ ,title "Timbre Space as a Musical Control Structure"
+ ,booktitle "Foundations of Computer Music"
+ ,editor "C. Roads and J. Strawn"
+ ,pages "640-657"
+ ,year 1985
+ ,publisher "MIT Press"
+ ,address "Cambridge, MA"
+ ,note "Originally published in @i(Computer Music Journal) 3(2):45-52, 1979"
+ )
+
+@article(ModulaDesign
+ ,key "Wirth"
+ ,author "Wirth, N."
+ ,title "Design and implementation of Modula"
+ ,journal "Software, Practice and Experience"
+ ,volume 7
+ ,number 1
+ ,year 1977
+ ,pages "67-84"
+ )
+
+@article(MPC
+ ,key "Yager"
+ ,author "Yager, T."
+ ,title "The Multimedia PC: High-powered Sight and Sound on Your Desk"
+ ,journal "Byte"
+ ,volume 17
+ ,year 1992
+ ,month Feb
+ ,pages 217
+)
+
+@book(Xenakis
+ ,key "Xenakis"
+ ,author "Xenakis, I."
+ ,title "Formalized Music"
+ ,publisher "Indiana University Press"
+ ,address "Bloomington"
+ ,year 1971
+ )
+
+@misc(Xmedia
+ ,key = "DEC"
+ ,Title = "XMedia Tools, Version 1.1A"
+ ,Author = "Digital Equipment Corporation"
+ ,HowPublished = "Software Product Description SPD 36.55.02"
+ ,year 1992
+ )
+
+@inproceedings(CEDS
+ ,key "Zahler"
+ ,author "Zahler, N."
+ ,title "CEDS TO GROW A CAT: A Progress/Studio Report"
+ ,organization "International Computer Music Association"
+ ,booktitle "ICMC Montreal 1991 Proceedings"
+ ,editor "B. Alphonce and B. Pennycook"
+ ,year 1991
+ ,pages "455-458"
+ )
diff --git a/docsrc/convert/convert.lsp b/docsrc/convert/convert.lsp
new file mode 100644
index 0000000..a57ec82
--- /dev/null
+++ b/docsrc/convert/convert.lsp
@@ -0,0 +1,171 @@
+;; convert.lsp -- insert XLISP syntax definitions
+
+(defun alpha-char-p (c)
+ (let ((cc (char-code c)))
+ (or (and (>= cc (char-code #\a))
+ (<= cc (char-code #\z)))
+ (and (>= cc (char-code #\A))
+ (<= cc (char-code #\Z))))))
+
+(defun get-token ()
+ (prog ((token (read-char *inf*))
+ (next-char (peek-char nil *inf*)))
+ (if (not token) (return token))
+ (if (and token (not (alpha-char-p token)) (not (eql token #\@)))
+ (return (string token)))
+ (setf token (string token))
+ (while (and next-char (alpha-char-p next-char))
+ (setf token (strcat token (string (read-char *inf*))))
+ (setf next-char (peek-char nil *inf*)))
+ (return token)))
+
+
+(defun convert (infile outfile)
+ (setf *next-tokens* nil)
+ (setf paren-stack nil)
+ (let ((inf (open infile))
+ (outf (open outfile :direction :output)))
+ (process inf outf)
+ (close inf)
+ (close outf)))
+
+(defun is-open-paren (tok)
+ (member tok '("(" "{" "[" "<") :test 'equal))
+
+(defun open-paren ()
+ (let ((tok (get-token)))
+ (cond ((is-open-paren tok)
+ (push tok paren-stack))
+ (t
+ (display "open-paren got a surprise" tok)))))
+; (push tok *next-tokens*)
+; ;; if no open paren, then fake open and close
+; (push #\( paren-stack)
+; (push #\) *next-tokens*)))))
+
+(defun close-paren-p (tok)
+ (paren-match tok))
+
+
+(defun paren-match (p2)
+ (let ((p1 (car paren-stack)))
+ (or (and (equal p2 ")")
+ (equal p1 "("))
+ (and (equal p2 "]")
+ (equal p1 "["))
+ (and (equal p2 "}")
+ (equal p1 "{"))
+ (and (equal p2 ">")
+ (equal p1 "<")))))
+
+
+(defun starts-with-symbol-char (tok)
+ (let ((c (char tok 0)))
+ (or (alpha-char-p c)
+ (digit-char-p c)
+ (eql c #\-)
+ (eql c #\*))))
+
+(defun get-fn-name (token-list)
+ (setf token-list (cdr token-list))
+ (let ((fn-name ""))
+ (while (and token-list (starts-with-symbol-char (car token-list)))
+ (setf fn-name (strcat fn-name (car token-list)))
+ (setf token-list (cdr token-list)))
+ fn-name))
+
+(defun get-args (token-list)
+ (prog (arg args)
+loop
+ (setf token-list (cdr token-list))
+ (cond ((and token-list (cdr token-list) (cddr token-list)
+ (equal (car token-list) "@i"))
+ (push (cadr token-list) paren-stack)
+ (setf token-list (cddr token-list)) ;; go to parameter name
+ (while paren-stack
+ (if (close-paren-p (car token-list)) (pop paren-stack)
+ (push (car token-list) arg))
+ (setf token-list (cdr token-list)))
+ (push (reverse arg) args)
+ (setf arg nil))
+ ((null token-list)
+ (return (reverse args))))
+ (go loop)))
+
+(defun write-list-of-args (args)
+ (dolist (arg args)
+ (format *outf* " @i(")
+ (write-list-of-tokens arg)
+ (format *outf* ")")))
+
+(defun write-list-of-tokens (toks)
+ (dolist (tok toks)
+ (format *outf* "~A" tok)))
+
+
+;; this is a variable if there are no args and if there is no
+;; back-to-back open/close paren pair as in foo().
+(defun is-variable-check (tokens)
+ (prog ()
+loop
+ (cond ((null (cdr tokens))
+ (return t))
+ ((and (equal (car tokens) "(")
+ (equal (cadr tokens) ")"))
+ (return nil)))
+ (setf tokens (cdr tokens))
+ (go loop)))
+
+
+(defun process-codef ()
+ (let ((tok (get-token))
+ token-list fn-name args)
+ (push tok paren-stack)
+ (push tok token-list)
+ (while (and tok paren-stack)
+ (setf tok (get-token))
+ (if (is-open-paren tok) (push tok paren-stack)
+ (if (close-paren-p tok) (pop paren-stack)))
+ (push tok token-list))
+ (setf token-list (reverse token-list))
+ ;; now we have a list of tokens including brackets
+ (display "process-codef" token-list)
+ (setf fn-name (get-fn-name token-list))
+ (setf args (get-args token-list))
+ (setf is-var (and (null args)
+ (is-variable-check token-list)))
+ (display "parse" fn-name args)
+ (cond (is-var
+ (format *outf* "@codef")
+ (write-list-of-tokens token-list))
+ (t
+ (format *outf* "@codef")
+ (write-list-of-tokens token-list)
+ (format *outf* " @c{[sal]}@*\n@altdef{@code[~A~A"
+ (if is-var "" "(") fn-name)
+ (write-list-of-args args)
+ (format *outf* "~A] @c{[lisp]}}"
+ (if is-var "" ")"))))))
+
+
+
+(defun process (inf outf)
+ (setf *inf* inf)
+ (setf *outf* outf)
+ (prog (tok)
+loop
+ (setf tok (get-token))
+ (cond ((null tok)
+ (return 'done))
+ ((string= tok "@codef")
+ (process-codef))
+ (t
+ (format *outf* "~A" tok)))
+ (go loop)))
+
+(defun l () (load "convert.lsp"))
+(convert "nyquistman.mss" "nyquistman-out.mss")
+;(convert "short.txt" "short-out.txt")
+
+
+
diff --git a/docsrc/convert/convert2.lsp b/docsrc/convert/convert2.lsp
new file mode 100644
index 0000000..2ef9309
--- /dev/null
+++ b/docsrc/convert/convert2.lsp
@@ -0,0 +1,381 @@
+;; convert2.lsp -- insert XLISP syntax definitions to Nyquist manual AND SAL syntax
+;; definitions into xlisp.mss
+
+(defun assert (co) (if co t (error "assertion error")))
+
+(defun alpha-char-p (c)
+ (let ((cc (char-code c)))
+ (or (and (>= cc (char-code #\a))
+ (<= cc (char-code #\z)))
+ (and (>= cc (char-code #\A))
+ (<= cc (char-code #\Z))))))
+
+(defun get-begin-end-token (begin-end)
+ (open-paren)
+ (let ((env-name (get-token))
+ (close-tok (get-token)))
+ (cond ((paren-match close-tok)
+ (pop paren-stack)
+ (return (strcat begin-end "(" env-name ")")))
+ (t
+ (display "get-begin-end-token failed" begin-end env-name close-tok)))))
+
+(defun get-token ()
+ (prog ((token (read-char *inf*))
+ (next-char (peek-char nil *inf*)))
+ (if (not token) (return token))
+ (if (and token (not (alpha-char-p token)) (not (eql token #\@)))
+ (return (string token)))
+ (setf token (string token))
+ (while (and next-char (alpha-char-p next-char))
+ (setf token (strcat token (string (read-char *inf*))))
+ (setf next-char (peek-char nil *inf*)))
+ (if (or (string= token "@begin") (string= token "@end"))
+ (return (get-begin-end-token token))
+ (return token))))
+
+
+(defun convert (infile outfile)
+ (setf *next-tokens* nil)
+ (setf paren-stack nil)
+ (let ((inf (open infile))
+ (outf (open outfile :direction :output)))
+ (process inf outf)
+ (close inf)
+ (close outf)))
+
+;; note: "<" has been omitted here to allow parsing of "<" as an operator
+;; in XLISP documentation. "<" is not commonly used as scribe bracket, but
+;; that could cause problems in some cases because this is not a full
+;; scribe parser.
+(defun is-open-paren (tok)
+ (member tok '("(" "{" "[") :test 'equal))
+
+(defun open-paren ()
+ (let ((tok (get-token)))
+ (cond ((is-open-paren tok)
+ (push tok paren-stack))
+ (t
+ (display "open-paren got a surprise" tok)))))
+; (push tok *next-tokens*)
+; ;; if no open paren, then fake open and close
+; (push #\( paren-stack)
+; (push #\) *next-tokens*)))))
+
+(defun close-paren-p (tok)
+ (paren-match tok))
+
+
+(defun paren-match (p2)
+ (let ((p1 (car paren-stack)))
+ (or (and (equal p2 ")")
+ (equal p1 "("))
+ (and (equal p2 "]")
+ (equal p1 "["))
+ (and (equal p2 "}")
+ (equal p1 "{"))
+ (and (equal p2 ">")
+ (equal p1 "<")))))
+
+
+(defun starts-with-symbol-char (tok)
+ (let ((c (char tok 0)))
+ (or (alpha-char-p c)
+ (digit-char-p c)
+ (eql c #\-)
+ (eql c #\+)
+ (eql c #\*)
+ (eql c #\=)
+ (eql c #\/)
+ (eql c #\>)
+ (eql c #\<))))
+
+(defun get-fn-name ()
+ (setf *token-list* (cdr *token-list*))
+ (let ((fn-name ""))
+ (while (and *token-list*
+ (or (starts-with-symbol-char (car *token-list*))
+ (equal (car *token-list*) "@i") ; allow c@i(xx)r
+ (equal (car *token-list*) "(")
+ (equal (car *token-list*) ")")))
+ (setf fn-name (strcat fn-name (car *token-list*)))
+ (setf *token-list* (cdr *token-list*)))
+ fn-name))
+
+(defun get-symbol()
+ (let ((s ""))
+ (while (and *token-list*
+ (starts-with-symbol-char (car *token-list*)))
+ (setf s (strcat s (car *token-list*)))
+ (setf *token-list* (cdr *token-list*)))
+ s))
+
+;; GET-ARG - *token-list* starts with open bracket (after @i). Get the
+;; tokens between this and the close bracket.
+(defun get-arg ()
+ (let (arg)
+ (push (car *token-list*) paren-stack)
+ (setf *token-list* (cdr *token-list*)) ;; go to parameter name
+ (while paren-stack
+ (if (close-paren-p (car *token-list*)) (pop paren-stack))
+ (push (car *token-list*) arg)
+ (setf *token-list* (cdr *token-list*)))
+ ;; take cdr to drop the close bracket
+ (reverse (cdr arg))))
+
+(defun get-args ()
+ (prog (args arg)
+loop
+ (cond ((and *token-list* (cdr *token-list*) (cddr *token-list*)
+ (equal (car *token-list*) "@i"))
+ (setf *token-list* (cdr *token-list*))
+ (push (get-arg) args))
+ ((and (equal (car *token-list*) ".")
+ (equal (cadr *token-list*) ".")
+ (equal (caddr *token-list*) "."))
+ (setf *token-list* (cdddr *token-list*))
+ (push '("...") args))
+ ((and *token-list* (cddr *token-list*)
+ (equal (car *token-list*) "&")
+ (equal (cadr *token-list*) "key")
+ (equal (caddr *token-list*) " "))
+ (push '("&key ") args)
+ (setf *token-list* (cdddr *token-list*)))
+ ((and *token-list* (cdr *token-list*)
+ (equal (car *token-list*) ":"))
+ (setf arg '(":"))
+ (setf *token-list* (cdr *token-list*)) ; skip ":"
+ (push (get-symbol) arg) ;; keyword
+ (setf arg (reverse arg))
+ (push arg args))
+ (*token-list*
+ (push (list :meta (car *token-list*)) args)
+ (setf *token-list* (cdr *token-list*)))
+ ((null *token-list*)
+ (return (reverse args))))
+ (go loop)))
+
+(defun write-list-of-args (args)
+ (let (need-space)
+ (dolist (arg args)
+ (cond ((equal arg '("..."))
+ (setf need-space t)
+ (format *outf* "@r(...)"))
+ ((and (consp arg) (equal (car arg) :meta))
+ (setf need-space nil)
+ (format *outf* (cadr arg)))
+ ((and (consp arg) (or (equal (car arg) ":")
+ (equal (car arg) "&key ")))
+ (setf need-space nil)
+ (format *outf* "@t(")
+ (write-list-of-tokens arg)
+ (format *outf* ")"))
+ (t
+ ;; insert space between consecutive args
+ (if need-space (format *outf* "@t( )"))
+ (setf need-space t)
+ (format *outf* "@t(@i(")
+ (write-list-of-tokens arg)
+ (format *outf* "))"))))))
+
+(defun write-sal-args (args)
+ (let (need-comma)
+ (dolist (arg args)
+ (cond ((equal arg '("..."))
+ (format *outf* "@r(...)"))
+ ((and (consp arg) (equal (car arg) :meta)
+ (or (equal (cadr arg) "[")
+ (equal (cadr arg) "]")))
+ (format *outf* (cadr arg)))
+ ((and (consp arg) (equal (car arg) :meta)) nil) ;; o.w. ignore meta
+ ((and (consp arg) (equal (car arg) "&key ")))
+ ((and (consp arg) (equal (car arg) ":")) ;; must be a keyword parm
+ ;; assumes this is not the first parameter
+ (format *outf* ", ~A: @i(~A)"
+ (cadr arg) (cadr arg)))
+ (t
+ (format *outf* "~A@i(" (if need-comma ", " ""))
+ (setf need-comma t)
+ (write-list-of-tokens arg)
+ (format *outf* ")"))))))
+
+
+(defun write-list-of-tokens (toks)
+ (dolist (tok toks)
+ (format *outf* "~A" tok)))
+
+
+;; this is a variable if there are no args and if there is no
+;; back-to-back open/close paren pair as in foo().
+(defun is-variable-check (args)
+ (prog ()
+loop
+ (cond ((null (cdr args))
+ (return t))
+ ((and (equal (car args) '(:meta "("))
+ (equal (cadr args) '(:meta ")")))
+ (return nil))
+ ((= (length (car args)) 1)
+ (return nil)))
+ (setf args (cdr args))
+ (go loop)))
+
+
+(defun get-balanced-token-list (tok)
+ (let (token-list)
+ (push tok paren-stack)
+ (push tok token-list)
+ (while (and tok paren-stack)
+ (setf tok (get-token))
+ (if (is-open-paren tok) (push tok paren-stack)
+ (if (close-paren-p tok) (pop paren-stack)))
+ (push tok token-list))
+ (setf token-list (reverse token-list))))
+
+
+(defun process-codef ()
+ (let (fn-name args save-tokens)
+ (setf *token-list* (get-balanced-token-list (get-token)))
+ ;; now we have a list of tokens including brackets
+ (display "process-codef" *token-list*)
+ (setf save-tokens *token-list*)
+ (setf fn-name (get-fn-name))
+ (setf args (get-args))
+ (setf is-var (is-variable-check args))
+ (display "parse" fn-name args is-var)
+ (cond (is-var
+ (format *outf* "@codef")
+ (write-list-of-tokens save-tokens))
+ (t
+ (format *outf* "@codef")
+ (write-list-of-tokens *token-list*)
+ (format *outf* " @c{[sal]}@*\n@altdef{@code[(~A" fn-name)
+ (write-list-of-args args)
+ (format *outf* "] @c{[lisp]}}")))))
+
+
+(defun exclude-from-sal (name)
+ (or (equal name "*")
+ (equal name "/")
+ (equal name "+")
+ (equal name "-")
+ (equal name "cond")
+ (equal name "case")
+ (equal name "let")
+ (equal name "let*")
+ (equal name "prog")
+ (equal name "prog*")
+ (equal name "flet")
+ (equal name "labels")
+ (equal name "macrolet")
+ (equal name "defun")
+ (equal name "defmacro")
+ (equal name "do")
+ (equal name "do*")
+ (equal name "dolist")
+ (equal name "dotimes")
+ (equal name "return")
+ (equal name "loop")
+ (equal name "progv")
+ (equal name "clean-up")
+ (equal name "top-level")
+ (equal name "continue")
+ (equal name "errset")
+ (equal name "baktrace")
+ (equal name "evalhook")
+ (equal name "1+")
+ (equal name "1-")
+ (equal name "<")
+ (equal name "<=")
+ (equal name ">")
+ (equal name ">=")
+ (equal name "=")
+ (equal name "/=")
+ (equal name "print")
+ (equal name "load")))
+
+
+(defun process-fdescription ()
+ (let (function-name args save-tokens (tok (get-token)) has-sal)
+ (format *outf* "@begin(fdescription)")
+ (while (and tok (not (equal tok "@end(fdescription)")))
+ (cond ((equal tok "(")
+ (setf *token-list* (get-balanced-token-list tok))
+ (assert (equal (first *token-list*) "("))
+ (setf function-name (get-fn-name))
+ (setf save-tokens *token-list*)
+ (setf args (get-args))
+ (display "process-fdescription" save-tokens args)
+ (setf has-sal (not (exclude-from-sal function-name)))
+ (cond (has-sal
+ (format *outf* "@begin(fgroup)@xlcode{~A(" function-name)
+ (write-sal-args args)
+ (format *outf* ")} @c{[sal]}\n\n ")))
+ (format *outf* "@xlcode{(~A" function-name)
+ ;(setf save-tokens (reverse save-tokens))
+ ;(cond ((equal (car save-tokens) ")")
+ ; (setf save-tokens (cons "@xlcode{)}" (cdr save-tokens))))
+ ; (t
+ ; (display "MISSING CLOSE PAREN" save-tokens)))
+ ;(setf save-tokens (reverse save-tokens))
+ ;(write-list-of-tokens save-tokens)
+ (write-list-of-args args)
+ (format *outf* "} @c{[lisp]}")
+ (setf tok (get-token))
+ (format *outf* tok)
+ (display "process-fdescription" function-name args)
+ (while (not (equal tok "\n"))
+ (setf tok (get-token))
+ (format *outf* tok))
+ (cond (has-sal
+ (format *outf* "@end(fgroup)\n")
+ (setf has-sal nil)))
+ (setf tok (get-token)))
+ ((equal tok "@begin(pdescription)")
+ (format *outf* tok)
+ (scan-to "@end(pdescription)")
+ (setf tok (get-token)))
+ ((equal (char tok 0) #\@)
+ (format *outf* tok)
+ (cond ((equal (setf tok (get-token)) "(")
+ (write-list-of-tokens (get-balanced-token-list tok))
+ (setf tok (get-token)))))
+ (t
+ (format *outf* tok)
+ (setf tok (get-token)))))
+ (if tok (format *outf* tok))))
+
+
+(defun scan-to (stop-tok)
+ (prog (tok)
+ loop
+ (setf tok (get-token))
+ (format *outf* "~A" tok)
+ ;; handle nested pdescriptions
+ (if (equal tok "@begin(pdescription)")
+ (scan-to "@end(pdescription)"))
+ (if (equal tok stop-tok) (return))
+ (go loop)))
+
+(defun process (inf outf)
+ (setf *inf* inf)
+ (setf *outf* outf)
+ (prog (tok)
+loop
+ (setf tok (get-token))
+ (cond ((null tok)
+ (return 'done))
+ ((string= tok "@codef")
+ (process-codef))
+ ((string= tok "@begin(fdescription)")
+ (process-fdescription))
+ (t
+ (format *outf* "~A" tok)))
+ (go loop)))
+
+(defun l () (load "convert2.lsp"))
+;(convert "xltest.mss" "xltest.out.mss")
+(convert "../../xlisp/xlisp-no-sal.mss" "xlisp-out.mss")
+
+
+
diff --git a/docsrc/convert/init.lsp b/docsrc/convert/init.lsp
new file mode 100644
index 0000000..be2ab47
--- /dev/null
+++ b/docsrc/convert/init.lsp
@@ -0,0 +1,9 @@
+; init.lsp -- default Nyquist startup file
+(load "nyinit.lsp" :verbose nil)
+
+; add your customizations here:
+; e.g. (setf *default-sf-dir* "...")
+
+;(load "convert.lsp")
+(load "convert2.lsp")
+
diff --git a/docsrc/nyquist/adagio-nyquist.mss b/docsrc/nyquist/adagio-nyquist.mss
new file mode 100644
index 0000000..91bf812
--- /dev/null
+++ b/docsrc/nyquist/adagio-nyquist.mss
@@ -0,0 +1,825 @@
+Adagio @Index(Adagio) is an easy-to-use, non-procedural notation
+for scores. In Adagio, text commands are used to specify each
+note. If you are new to Adagio, you may want to glance at the
+examples in Section @ref(adag-examples-sec) starting on page
+@pageref(adag-examples-sec) before reading any further.
+
+A note is described in Adagio by a set of attributes@Index(attributes), and
+any attribute not specified is ``inherited'' from the previous line.
+Attributes may appear in any order and must be separated by one or more
+blanks. An attribute may not contain any blanks. The attributes are:
+time@Index(time), pitch@Index(pitch), loudness@Index(loudness),
+voice@Index(voice) number, duration@Index(duration), and articulation@Index(articulation).
+
+Adagio has been used to program a variety of hardware and software
+synthesizers, and the Adagio compiler can be easily adapted to new
+environments. Although not originally intended for MIDI, Adagio works quite
+well as a representation for MIDI scores. Adagio has been extended to allow MIDI controller
+data such as modulation wheels, pitch bend, and volume, MIDI program commands to change timbre, and System Exclusive messages.
+
+A note command in Adagio must be separated from other notes. Usually,
+notes are distinguished by writing each one on a separate line.
+Notes can also be separated by using a comma or semicolon as will
+be described below.
+
+Besides notes, there are several other types of commands:
+@begin(enumerate)
+An asterisk@Index(asterisk) (@code(*)) in column one (or immediately after a comma,
+semicolon, or space) indicates that the rest of the line is a
+comment@Index(comment). The line is ignored by Adagio, and is therefore a
+good way to insert text to be read by people. Here are some examples:
+@begin(programexample)
+* This is a comment.
+T150 G4 * This is a comment too!
+T150 G4 ;* So is this.
+@end(programexample)
+
+An empty command (a blank@Index(blank) line, for example) is ignored as if it
+were a comment@Index(comment)@foot(To be consistent, a blank line ought to specify zero attributes and
+generate a note that inherits all of its attributes from the previous one.
+Adagio is intentionally inconsistent in this respect.).
+
+An exclamation point@Index(exclamation point)@index(!) (!) in column one (or
+immediately after a comma or semicolon) indicates a special
+command@Index(special command). A special command does not generate a note.
+Special commands follow the ``!'' with no intervening spaces and extend to the end of the line, for example:
+@begin(programexample)
+!TEMPO 100
+@end(programexample)
+
+Control change commands are used to control parameters like
+pitch bend, modulation, and program (timbre). Control
+change commands can be specified along with notes or by
+themselves.
+A command that specifies control changes without specifying
+a pitch will not produce a note.
+@end(enumerate)
+
+Adagio is insensitive to case@Index(case),
+thus ``A'' is equivalent to ``a'', and you
+can mix upper and lower case letters freely.
+
+@section[Specifying Attributes]
+A note is indicated by a set of attributes. Attributes are indicated by a string of characters with no intervening spaces because spaces separate attributes. The attributes are described below.
+
+The default unit of time is a centisecond
+(100@+[th]'s), but this can be changed to a millisecond (1000@+[th]'s) using the @code(!MSEC) command and reset to centiseconds with @code(!CSEC) (see Section @ref(millisec-sec)). In the descriptions below, the term ``time unit'' will be used to mean whichever convention is currently in effect.
+
+@subsection[Time]
+
+The time@Index(time) attribute specifies when to start the note. A time is
+specified by a ``T@Index(T)'' followed by a number representing time units
+ or by a duration (durations are described below). Examples:
+@begin(programexample)
+T150 ** 1.5 sec (or .15 sec)
+TQ3 ** 3 quarter note's duration
+@end(programexample)
+If no time is specified, the default time@Index(default time) is the sum of
+the time and duration attributes of the previous note. (But see Section
+@ref(next-time-sec).) Time is measured relative to the time of the
+most recent Tempo@Index(Tempo) or Rate@Index(Rate) command. (See the
+examples in Section
+@ref(adag-examples-sec) for some clarification of this point.)
+
+@subsection[Pitch]
+
+The pitch@Index(pitch) attribute specifies what frequency to produce.
+Standard scale pitches are named by name, using @code(S) for sharp@Index(sharp),
+ @code(F) for flat@Index(flat),
+and (optionally) @code(N) for natural@Index(natural).
+For example, @code(C) and @code(CN) represent the same pitch, as do @code(FS) and @code(GF) (F sharp and G flat). Note that there are no bar lines, and accidentals to not carry forward to any other notes as in common practice notation.
+
+Octaves@Index(octave specification) are specified by
+number. @code(C4) is middle C, and @code(B3) is a half step lower. @code(F5) is the top line of
+the treble clef, etc. (Adagio octave numbering follows the ISO standard, but note that this is not universal. In particular, Yamaha refers to middle C as C3.) Accidentals@Index(accidentals)@index[S (Adagio Sharp)]@index[F (Adagio Flat)] can go before or after
+the octave number, so @code(FS3) and @code(F3S) have the same meaning.
+
+An alternate
+notation for pitch is @code(P)@i(n), where @i(n) is an integer representing the pitch.@index[P (Adagio Pitch)]
+Middle C@index(Middle C) (C4) is equivalent to @code(P60), @code(CS4) is @code(P61), etc.
+
+If you do not specify an octave@Index(octave specification),
+Adagio will choose one for you. This
+is done by picking the octave that will make the current pitch as close
+to the previous pitch as possible. In the case of augmented fourths
+ or diminished fifths, there are two equally good choices. Adagio
+chooses the lower octave.
+
+@subsection[Duration]
+
+Duration@Index(duration) is specified by a letter indicating a number of
+beats, followed by one or several modifiers. The basic duration codes are:
+@begin(display)
+@code(W)@Index[W (Adagio Whole note)] (whole@index(whole note), 4 beats),
+@code(H)@Index[H (Adagio Half note)] (half@index(half note), 2 beats),
+@code(Q)@Index[Q (Adagio Quarter note)] (quarter@index(quarter note), 1 beat),
+@code(I)@Index[I (Adagio eIght note)] (eighth@Index(eighth note), 1/2 beat),
+@code(S)@Index[S (Adagio Sixteenth note)] (sixteenth@Index(sixteenth note), 1/4 beat),
+@code(%)@Index[% (Adagio thirtysecond note)] (thirtysecond@index(thirtysecond note), 1/8 beat), and
+@code(^)@index[^ (Adagio sixtyfourth note)] (sixtyfourth@index(sixtyfourth note), 1/16 beat).
+@end(display)
+Note that @code(E) is a pitch, so eighth-notes use the duration code @code(I).
+The default tempo is 100 beats per
+minute (see Section @ref(tempo-sec)). These codes may be followed by a @code(T)
+(triplet@Index(triplet)@index[T (Adagio Triplet)]), indicating a duration of 2/3 the normal. A dot@Index(dot)@index[. (Adagio)] (@code(.)) after a
+duration code extends it by half to 3/2 the normal. An integer
+after a note multiplies its duration by the indicated value (the result is
+still just one note). Finally, a slash followed by an integer divides
+the duration by the integer. Like all attributes, duration attributes may not have embedded spaces. Examples:
+@begin(display)
+@tabclear
+@tabset(.5 inches)
+@code(Q)@\1 beat (quarter note)
+@code(QT)@\2/3 beat (quarter triplet)
+@code(W.)@\6 beats(dotted whole note)
+@code(ST6)@\1 beat (6 sixteenth triplets)
+@code(H5)@\10 beats(5 half notes)
+@code(Q3/7)@\3/7 beats
+@end(display)
+A duration may be noted by @code(U)@i(n)@Index(U), where @i(n) is an integer
+indicating 100@+[th]'s of a second
+(or 1000@+[th]'s), see Section @ref(millisec-sec).
+For example, @code(U25) is twenty-five time units.
+
+Durations may be combined using a plus sign:
+@begin(programexample)
+Q+IT ** a quarter tied to an eighth triplet
+Q/7+W+Q2/7 ** a 7th beat tied to a whole tied to 2/7th beat
+Q+U10 ** a quarter plus 10 time units
+@end(programexample)
+
+@subsection(Next Time)
+@label(next-time-sec)
+The time of the next@Index(next Adagio command)@index[N (Adagio Next)] command (the next command in the Adagio
+program text) is
+normally the time of the current note command
+plus the duration of the current note.
+This can be overridden by a field consisting of the letter @code(N)
+followed by a number indicating time units, or followed by a
+duration as described above. The next note will then start at the time of
+the current note plus the duration specified after @code(N). If the next note
+has an explicit time attribute (@code(T)), then the specified time will override
+the one based on the previous note. Examples:
+@begin(programexample)
+N0 ** start the next note at the same time as this one
+N50 ** start the next note 0.5 seconds after this one
+NQT ** start the next note 2/3 beat after the current one
+NU10+Q ** start after 0.1 seconds plus a quarter
+@end(programexample)
+A comma has an effect similar to @code(N0) and is explained in Section @ref(comma-sec). Articulation effects such as @i(staccato) can be produced using @code(N), but it is more convenient to use the articulation attribute described in Section @ref(articulation-sec).
+
+@subsection(Rest)
+Rests@Index(rests)@index[R (Adagio Rest)] are obtained by including the field @code(R) in a
+note command. The effect of an @code(R) field is to omit the note that would
+otherwise occur as the result of the current note command. In all other
+respects, the command is processed just like any other line. This means that
+attributes such as duration, loudness, and pitch can be specified, and
+anything specified will be inherited by the note in the next command.
+Normally, a rest will include just @code(R) and a duration. The fact that a
+note command specifies a rest is not inherited. For example:
+@begin(programexample)
+R H ** a half (two beat) rest
+RH ** illegal, R must be separated from H by space(s)
+@end(programexample)
+Because some synthesizers (e.g. a DX7@Index(DX7)) cannot change programs
+@Index(program change)
+(presets) rapidly, it may be desirable to change programs in
+a rest so that the synthesizer will be ready to play by
+the end of the rest. See Section @ref(adag-timbre-sec) for an example.
+
+@subsection[Articulation]
+@label(articulation-sec)
+Articulation@Index(articulation)@index(staccato)@index(legato) in Adagio refers to the
+percentage of time a note is on relative to the indicated duration. For
+example, to play a note @i(staccato), you would normally play the note about
+half of its indicated duration. In Adagio, articulation is indicated by
+@code(#)@index[# (Adagio articulation)] followed by an integer number indicating a percentage. The
+articulation attribute does not affect the time of the next command. This
+example plays two @i(staccato) quarter notes:
+@begin(programexample)
+C Q #50
+D
+@end(programexample)
+To produce overlapping notes, the articulation may be greater than 100.
+
+@begin(detail)
+Be aware that overlapping notes on the same pitch can be a problem for some synthesizers. The following example illustrates this potential problem:
+@begin(programexample)
+!TEMPO 60
+C Q #160 * starts at time 0, ends at 1.6 sec
+D I * starts at time 1, ends at 1.8 sec
+C Q * starts at time 1.5, ends at 3.1 sec?
+@end(programexample)
+At one beat per second (tempo 60), these three notes will start at times 0, 1, and 1.5 seconds, respectively. Since these notes have an articulation of 160, each will be on 160% of its nominal duration, so the first note (C) will remain on until 1.6 seconds. But the third note (another C) will start at time 1.5 seconds. Thus, the second C will be started before the first one ends. Depending on the synthesizer, this may cancel the first C or play a second C in unison. In either case, a note-off message will be sent at time 1.6 seconds. If this cancels the second C, its actual duration will be 0.1 rather than 1.6 seconds as intended. A final note-off will be sent at time 3.1 seconds.
+@end(detail)
+
+@subsection[Loudness]
+
+Loudness@Index(loudness)@index(velocity) is indicated by an @code(L)
+followed by a dynamic marking from the following: @code(PPP)@Index[PPP (Adagio dynamic)]@Index[LPPP (Adagio dynamic)],
+@code(PP)@Index[PP (Adagio dynamic)]@Index[LPP (Adagio dynamic)], @code(P)@Index[P (Adagio dynamic)]@Index[LP (Adagio dynamic)], @code(MP)@Index[MP (Adagio dynamic)]@Index[LMP (Adagio dynamic)], @code(MF)@Index[MF (Adagio dynamic)]@Index[LMF (Adagio dynamic)], @code(F)@Index[F (Adagio dynamic)]@Index[LF (Adagio dynamic)],
+@code(FF)@Index[FF (Adagio dynamic)]@Index[LFF (Adagio dynamic)], @code(FFF)@Index[FFF (Adagio dynamic)]@Index[LFFF (Adagio dynamic)]. Alternatively, a number from 1 to 127 may be
+used. The loudness attribute is the MIDI note velocity. (Note that a MIDI velocity of 0 means ``note-off,'' so the minimum loudness is 1.) The
+dynamic@Index(dynamic markings)
+markings are translated into numbers as follows:
+@begin(display)
+@tabclear
+@tabset(0.8 in, 3 in, 3.8 in)
+@code(Lppp)@\20@\@code(Lmf)@\58
+@code(Lpp)@\26@\@code(Lf)@\75
+@code(Lp)@\34@\@code(Lff)@\98
+@code(Lmp)@\44@\@code(Lfff)@\127
+@end(display)
+
+@subsection[Voice]
+
+The voice@Index(voice)@index[V (Adagio Voice)] attribute tells which of the 16 MIDI channels to use
+for the note. The voice attribute consists of a @code(V) followed by
+an integer from 1 (the default) to 16.
+@begin(detail)
+There is a limit to how many notes
+can be played at the same time on a given voice (MIDI channel). Since the
+limit depends upon the synthesizer, Adagio cannot tell you when you exceed
+the limit. Similarly, Adagio cannot tell whether your synthesizer is set up
+to respond to a given channel, so there is no guarantee that what you write
+will actually be heard.
+@end(detail)
+
+@subsection[Timbre (MIDI Program)]
+@label(adag-timbre-sec)
+A MIDI program@Index(MIDI program)@index[Z (Adagio program)] (synthesizer preset@Index(preset)) can be
+selected using the attribute @code(Z)@i(n), where @i(n)
+is the program number (from 1 to 128).
+Notice that in MIDI, changing the program on a given channel will affect
+@i(all) notes on that channel and possibly others. Adagio treats MIDI program changes as a form of control change.
+@begin(detail)
+For many synthesizers, you will not be
+able to change programs at the start of a note or during a note. Change the
+program during a rest instead. For example:
+@begin(programexample)
+R I Z23 V4 ** change MIDI channel 4 to program 23 during rest
+A4 ** play a note on channel 4
+@end(programexample)
+Check how your synthesizer interprets program numbers. For example,
+the cartridge programs on a DX7 can be accessed by adding 32 to the
+cartridge program number. Cartridge program number 10
+is specified by @code(Z42).
+@end(detail)
+
+As in MIDI, the Adagio timbre is a property of the voice (MIDI channel), so
+the timbre will not be inherited by notes on a different channel;
+to change the timbre on multiple voices (channels), you must explicitly
+notate each change.
+
+@subsection[Tempo]
+@label(tempo-sec)
+The length of a beat may be changed using a Tempo@Index(Tempo) command@index(!Tempo):
+@begin(programexample)
+!TEMPO @i(n)
+@end(programexample)
+where @i(n) indicates beats per minute. The exclamation mark tells Adagio that
+this is a special command line rather than a note definition. A special
+command takes the place of a note specification.
+No other attributes should be written on a line with a special command.
+The @code(!TEMPO) command is associated with a time, computed as if the @code(!TEMPO) command were a note. The time@Index(time) attribute (@code(T)) of all
+succeeding notes is now measured relative to the time of the @code(!TEMPO) command. The new tempo starts at the @code(!TEMPO) command time and
+affects all succeeding notes.
+Durations specified in time units (for example @code(U58), @code(N15)) are not affected by the @code(!TEMPO) command, and numerical times (for example @code(T851)) are computed relative to the time of the last @code(!TEMPO) command.
+
+The @code(!TEMPO) command is fairly clever about default durations@Index(default
+durations). If the last duration specified before the @code(!TEMPO) command is
+symbolic (using one of @code(^),@code(%), @code(S), @code(I), @code(Q), @code(H), or @code(W) ), then the default duration for the
+node after the @code(!TEMPO) command will be modified according to the tempo change.
+Consider the following tempo change:
+@begin(programexample)
+!TEMPO 60
+A4 H
+!TEMPO 120
+G
+@end(programexample)
+In this example, the first note will last 2 seconds (2 beats at 60
+beats per minute). The second note inherits the duration (H) from
+the first note, but at 120 beats per minute, the second note will last
+only 1 second. If the duration had been specified @code(U200) (also a
+duration of 2 seconds), the second note would also last 2 seconds because the @code(!TEMPO) command does not affect times or durations specified numerically in time units. If the duration is the sum of a symbolic and a numeric specification, the inherited duration after a @code(!TEMPO) command is undefined.
+
+@subsection(Rate)
+The @code(!RATE)@Index(rate)@index(!Rate) command scales all times including those specified in
+hundredths of seconds. A rate of 100 means no change, 200 means twice as
+fast, and 50 means half as fast. For example, to make a piece play 10%
+faster, you can add the following command at the beginning of the score:
+@begin(programexample)
+!RATE 110
+@end(programexample)
+@code(!RATE) and @code(!TEMPO) commands combine, so
+@begin(programexample)
+!RATE 200
+!TEMPO 70
+@end(programexample)
+will play 70 beats per minute at double the normal speed, or 140 beats
+per minute. Like @code(!TEMPO), the time of the @code(!RATE) command is added to the
+time attribute of all following notes up to the next @code(!TEMPO) or @code(!RATE)
+command.
+
+Two @code(!RATE) commands do not combine, so a @code(!RATE) command only affects the rate until the next @code(!RATE) command.
+
+Although @code(!TEMPO) and @code(!RATE) can occur in the middle of a note (using @code(N), @code(T), etc.) they do not affect a note already specified. This property allows multiple tempi to exist simultaneously (see Section @ref(multipletempi-sec)).
+
+@section[Default Attributes]
+@label(default-sec)
+If an attribute is omitted, the previous one is used by
+default@Index(default) (with the exception of the time attribute). The
+default values for the first note, which are inherited by succeeding notes
+until something else is specified, are given below in Adagio notation:
+@begin(display)
+@tabclear
+@tabset(1.5 inch)
+Time @\@code(T0)
+Pitch @\@code(C4)
+Duration @\@code(Q)
+Articulation @\@code(#100)
+Loudness @\@code(LFFF)
+Voice @\@code(V1)
+Tempo @\@code(!TEMPO 100)
+Rate @\@code(!RATE 100)
+@end(display)
+Control changes (including timbre or MIDI program, specified by @code(Z)) have no default value and are only sent as specified in the score.
+
+@p(Important:) the rules for determining when a command will play a note are as follows (and this has changed slightly from previous versions):
+@begin(enumerate)
+If a special (@code(!)) command or nothing is specified, e.g. a blank line, do @i(not) play a note.
+
+If @code(R) (for ``rest'') is specified, do @i(not) play a note.
+
+Otherwise, if a pitch is specified, @i(do) play a note.
+
+Otherwise, if no control changes (or program changes) are specified (so this is a command with non-pitch attributes and no control changes), @i(do) play a note.
+@end(enumerate)
+Another way to say this is ``Special commands and commands with rests (@code(R)) do not play notes. Otherwise, play a note if a pitch is specified or if no control is specified.''
+
+
+@section[Examples]
+@label(adag-examples-sec)
+The following plays the first two bars of ``Happy Birthday''. Note that
+Adagio knows nothing of bar lines, so the fact that the first note occurs
+on beat 3 or that the meter is three-four is of no consequence:
+@begin(programexample)
+*Example 1 ** Happy Birthday tune (C major)
+!TEMPO 120
+G4 I. LF
+G4 S
+A4 Q
+G4
+C5
+B4 H
+@end(programexample)
+The time attribute for the first note is zero (@code(0)). The second note
+will occur a dotted eighth later, etc.
+Notice that no timbre or rate was specified.
+Adagio will provide reasonable default
+values of 1 and 100, respectively.
+
+The following example plays the first four bars of an exercise from
+Bartok@Index(Bartok)'s Mikrokosmos@Index(Mikrokosmos) (Vol. 1, No. 12).
+An extra quarter note is inserted at the beginning of each voice in order to
+allow time to change MIDI programs. The right hand part is played on voice
+(MIDI channel) 1 and the left hand part on voice 2. Notice the
+specification of the time attribute to indicate that voice 2 starts at time
+0. Also, default octaves are used to reduce typing.
+@begin(programexample)
+*Example 2 ** Bartok
+*voice 1, right hand
+R Q Z10 V1 ** extra rest for program change
+A4 H
+B Q
+C
+D H
+C
+D Q
+C
+B
+A
+B
+C
+D
+R
+
+*voice 2, left hand
+T0 R Q Z15 V2 ** extra rest for program change
+G3 H
+F Q
+E
+D H
+E
+D Q
+E
+F
+G
+F
+E
+D
+R
+@end(programexample)
+
+The next example is the same piece expressed in a different manner,
+illustrating the interaction
+between the @code(!TEMPO) command and the time attribute. Recall that the
+time attribute is measured relative to the time of the last @code(!TEMPO) command:
+@begin(programexample)
+*Example 3 ** 4 measures in 2 sections
+!Tempo 100
+*Voice 1, Measures 1 & 2
+R Q Z10 V1
+A4 H
+B Q
+C
+D H
+C
+
+*Voice 2, Measures 1 & 2
+T0 R Q Z15 V2
+G3 H
+F Q
+E
+D H
+E H
+
+!TEMPO 100
+*Voice 1, Measures 3 & 4
+* note that Z10 is still in effect for V1
+V1 D4 Q
+C
+B
+A
+B
+C
+D
+R
+
+*Voice 2, Measures 3 & 4
+T0 V2 D3 Q
+E
+F
+G
+F
+E
+D
+R
+@end(programexample)
+
+The piece is written in 4 sections. The first
+plays a rest followed by two measures, starting
+at time 0. The next section changes the time back to
+zero and plays two measures of the left hand part (voice 2).
+The next
+command (!TEMPO 100) sets the tempo to 100 (it already is)
+@i(and) sets the reference time to
+be two measures into the piece. Therefore, the next note
+@code((D4)) will begin measure 3. The @code(D3) that begins the last
+group of notes has a @code(T0) attribute, so it will also start at measure
+3. Notice how the @code(!TEMPO) command can serve to divide a piece into
+sections@Index(sections, Adagio).
+
+
+The last example will show yet another way to express the same piece of
+music using the ``Next'' attribute. Only the first bar of music is
+given.
+@begin(programexample)
+*Example 4 ** use of the Next attribute
+!Tempo 100
+R Q Z10 V1 N0
+R Q Z15 V2
+
+A4 H V1 N0
+G3 V2
+
+B4 Q V1 N0
+F3 V2
+
+C4 Q V1 N0
+E3 V2
+@end(programexample)
+Here, each pair of
+lines represents two simultaneous notes. The @code(N0) attribute
+forces the second line to start at the same time as the first line of each
+pair. Because of the large intervals, octave numbers (3 and 4) are
+necessary to override the default octave for these pitches.
+
+@section(Advanced Features)
+Beyond the simple notation described above, Adagio supports a number of
+features. (See also the next chapter.)
+
+@subsection(Time Units and Resolution)
+@label(millisec-sec)@index(time units)@index(resolution)
+The default time unit is 10ms (ten milliseconds or one centisecond or
+100@+(th) of a second), but it is
+possible to change the basic unit to 1ms, or 1000@+(th) of a second.
+The time unit can be specified by:
+@begin(display)
+@tabclear
+@tabset(0.8 inches)
+@t(!CSEC)@index(!csec)@\centisecond time units = 100@+(th)
+@t(!MSEC)@index(!msec)@\millisecond time units = 1000@+(th)
+@end(display)
+The time unit remains in effect until the next @code(!CSEC) or @code(!MSEC) command.
+
+@subsection(Multiple Notes Per Line)
+@label(comma-sec)
+@index(multiple commands)
+Notes can be separated by commas@Index(commas)@index[, (Adagio)] or
+semicolons@Index(semicolon, Adagio)@index[; (Adagio)] as well as by starting a new line. A comma is
+equivalent to typing @code(N0) and starting a new line. In other words, the next note after a comma will start at the same time as the note before the comma. In general, @i(use commas to separate the notes of a chord.)
+
+A semicolon is equivalent to starting a new line. In general, @i(use semicolons to group notes in a melody). Here is yet another rendition of the Bartok:
+@begin(programexample)
+*Example 5 ** use of semicolons
+!Tempo 100
+R Q Z10 V1
+A4 H; B Q; C; D H; C; D Q; C; B; A; B; C; D; R
+
+T0 R Q Z15 V2
+G3 H; F Q; E; D H; E; D Q; E; F; G; F; E; D; R
+@end(programexample)
+This example is similar to Example 2, except semicolons are used. Note how semicolons make the two lines of music stand out.
+The next example is similar to Example 4, except commas are used
+and four bars are notated. The music below is treated as a sequence of 2-note chords, with each chord on a separate line:
+@begin(programexample)
+*Example 6 ** use of commas
+!Tempo 100
+R Q Z10 V1, R Q Z15 V2
+A4 H V1, G3 V2
+B4 Q V1, F3 V2
+C4 V1, E3 V2
+D4 H V1, D3 V2
+C4 V1, E3 V2
+D4 Q V1, D3 V2
+C4 V1, E3 V2
+B4 V1, F3 V2
+A4 V1, G3 V2
+B4 V1, F3 V2
+C4 V1, E3 V2
+D4 V1, D3 V2
+R
+@end(programexample)
+
+@subsection(Control Change Commands)
+@index(Control change)@index[~ (Adagio)]
+Any control change can be specified using
+the syntax ``@t[~@i(n)(@i(v))]'', where @i(n) is the controller number (0 - 127), and
+@i(v) is the value. In addition, Adagio has some special syntax for
+some of the commonly used control changes (note that Pitch bend, Aftertouch, and MIDI Program Change are technically not MIDI control changes but have their own
+special message format and status bytes):
+@begin(display)
+@tabclear
+@tabset(0.5 inch)
+K@\Portamento switch@Index(Portamento switch)@Index[K (Adagio control)]@*
+M@\Modulation wheel@Index(Modulation wheel)@Index[M (Adagio control)]@*
+O@\Aftertouch@Index(Aftertouch)@Index[O (Adagio control)]@*
+X@\Volume@Index(Volume)@Index[X (Adagio control)]@*
+Y@\Pitch bend@Index(Pitch bend)@Index[Y (Adagio control)]@*
+Z@\Program Change@Index(Program)@Index[Z (Adagio program)]@*
+@end(display)
+The letter listed beside each control function is the Adagio command
+letter. For example, @code(M23) is the command for setting the modulation
+wheel to 23. Except for pitch bend, the portamento switch, and MIDI Program Change, all
+values range from 0 to 127. Pitch bend is ``off'' or centered at
+128, and has a range from 0 to 255 (MIDI allows for more precision, but
+Adagio does not). Turn on portamento with @code(K127) and off with @code(K0). Programs are numbered 1 to 128 to correspond to synthesizer displays.
+
+@p(About volume:) Midi volume is just a control, and the Midi standard does not say what it means. Typically it does what the volume pedal does; that is, it scales the amplitude in a continuously changeable fashion. In contrast, Midi velocity, which is controlled by the @code(L) (loudness) attribute, is part of a Midi note-on command and is fixed for the duration of the note. Typically, these two ways of controlling loudness and amplitude operate independently. In some low-cost synthesizers the numbers seem to be added together internally and volume changes are ignored after the note starts.
+
+@p(About pitch bend:) Midi pitch bend is a number from 0 to 16383, where 8192 is the center position. To convert to Midi, Adagio simply multiplies your number by 64, giving values from 0 to 16320. Note that @code(Y128) translates exactly to 8192. The @i(meaning) of pitch bend depends upon your synthesizer and its setting. Most synthesizers let you specify a ``pitch bend range.'' A range of one semitone means that @code(Y255) will produce a bend of approximately one semitone up, and @code(Y0) will bend one semitone down. If the range is 12 semitones, then the same @code(Y255) will bend an octave. Typically, pitch bend is exponential, so each increment in the pitch bend value will bend an equal number of cents in pitch.
+
+Control changes can be part of a note specification or independent.
+In the following example, a middle C is played with a modulation
+wheel setting of 50 and a pitch bend of 120. Then, at 10 unit
+intervals, the pitch bend is decreased by 10. The last line sets the
+portamento time (controller 5) to 80:
+@begin(programexample)
+*Example 7
+C4 LMF M50 Y120 U100 N10
+Y110 N10; Y100 N10; Y90 N10; Y80 N10
+Y70 N10; Y60 N10; Y50 N10
+~5(80)
+@end(programexample)
+
+See Section @ref(default-sec) on page @pageref(default-sec) for rules on whether or not a command will play a note.
+
+@subsection(Multiple Tempi)@Index(multiple tempi)
+@label(multipletempi-sec)
+@Index(polyrhythm)
+Writing a piece with multiple tempi requires no new commands; you
+just have to be clever in the use of Tempo and Time. The following
+plays a 7 note diatonic scale on voice 1, and a 12 note chromatic
+scale on voice 2:
+@begin(programexample)
+*Example 8 ** multiple tempi
+!TEMPO 70
+V1 C4; D; E; F; G; A; B
+T0 R N0
+
+!TEMPO 120
+V2 C4; CS; D; DS; E; F; FS; G; GS; A; AS; B
+
+!TEMPO 100
+V1 C5, V2 C5
+@end(programexample)
+The third line plays the 7-note diatonic scale on voice 1. The
+next line contains the tricky part: notice that the time is
+set back to zero, there is a rest, and a next (@code(N)) attribute is used
+to specify that the next default time will be at the same time as
+the current one. This is tricky because a @code(!TEMPO) command cannot have a time (@code(T0)) attribute, and a @code(T0) by itself would create a note with a duration. @code(T0 R N0) says: ``go to time 0, do not play a note, and do not advance the time before the next command''.
+Thus, the time of the @code(!TEMPO 120) command is zero.
+After the 12 note scale, the tempo is changed to 100 and a final note
+is played on each voice. A little arithmetic will show that 7 notes
+at tempo 70 and 12 notes at tempo 120 each take 6 seconds, so the
+final notes (@code(C5)) of each scale will happen at the same time.
+
+@subsection(MIDI Synchronization)
+@index(synchronization)@index(clock)@index(MIDI Clock)@index(clock command)
+
+The Adagio program (but not Nyquist) can synchronize with external devices using MIDI real time messages. Thus, Adagio has a @code(!CLOCK) command. This command is currently of no use to Nyquist users but is documented here for completeness (it's part of the language syntax even if it does not do anything).
+
+Since Adagio supports multiple tempi, and Midi clock is
+based on beats, it is necessary to be explicit in the score about where the
+clock should start and what is the duration of a quarter note. The
+@code(!CLOCK) command@index(!Clock) in Adagio turns on a 24 pulse-per-quarter (PPQ) clock at
+the current tempo and time:
+@begin(programExample)
+!TEMPO 100
+!CLOCK
+@end(programexample)
+A @code(!CLOCK) command must also be inserted for each tempo change that is to be
+reflected in the Midi clock. Typically, each !TEMPO command will be followed by a !CLOCK command.
+@begin(detail)
+Clock commands and thus tempo
+changes can take place at arbitrary times. It is assumed that tempo changes
+on an exact 24@+(th) of a beat subdivision (for example, exactly on a
+beat). If not, the tempo change will take place on the nearest exact
+24@+(th) of a beat subdivision. This may be earlier or later than the
+requested time.
+@end(detail)
+
+@subsection[System Exclusive Messages]
+@label(macro-sec)
+Adagio has a definition facility that makes it possible to send system
+exclusive parameters. Often, there are parameters on Midi
+synthesizers that can only be controlled by system exclusive messages.
+Examples include the FM ratio and LFO rate on a DX7 synthesizer. The
+following example defines a macro for the DX7 LFO rate and then shows how
+the macro is used to set the LFO rate for a B-flat whole note in the score.
+The macro definition is given in hexadecimal, except @t(v) is replaced by
+the channel (voice) and @t(%1) is replaced by the first parameter.
+A macro is invoked by writing ``~'' followed by the macro name and a
+list of parameters@index(!Def):
+@begin(programexample)
+!DEF LFO F0 43 0v 01 09 %1 F7
+Bf5 W ~LFO(25)
+@end(programexample)
+
+In general, the @t(!DEF) command can define any single MIDI message including
+a system exclusive
+message. The message must be complete (including the status byte), and each @t(!DEF) must correspond to just one message.
+The symbol following @t(!DEF) can be any name consisting of
+alphanumeric characters. Following the name is a hexadecimal string
+(with optional spaces), all on one line. Embedded in the string may
+be the following special characters:
+@begin(description)
+@t(v)@\Insert the 4-bit voice (MIDI channel) number. If @t(v) occurs in the
+place of a high-order hexadecimal digit, replace @t(v) with @t(0v) so that
+the channel number is always placed in the low-order 4 bits of a data byte. In other words, @t(v) is padded if necessary to fall into the low-order bits.
+
+@t(%)@i(n)@\Insert a data byte with the low-order 7 bits of
+parameter number @i(n). Parameters are numbered 1 through 9.
+If the
+parameter value is greater than 127, the high-order bits are discarded.
+
+@t(^)@i(n)@\Insert a data byte with bits 7 through 13 of parameter number
+@i(n). In other words, shift the value right 7 places then clear all
+but the first 7 bits. Note that 14-bit numbers can be encoded by
+referencing the same parameter twice; for example, @t(%4^4) will
+insert the low-order followed by the high-order parts of parameter 4
+into two successive data bytes.
+@end(description)
+
+Parameters are separated by commas, but there may be no spaces. The
+maximum number of parameters allowed is 9. Here
+is an example of definitions to send a full-resolution pitch
+bend command and to send a system exclusive command to change a DX7
+parameter@foot[My TX816 Owner's Manual gives an incorrect format for the
+change parameter sysex command (according to the manual, there is no data
+in the message!) I am assuming that the data should be the last byte before
+the EOX and that there is no byte count. If you are reading this, assume
+that I have not tested this guess, nor have I tested this example.].
+
+@begin(programexample)
+* Define macro for pitch bend commands:
+!DEF bend Ev %1 ^1
+
+A ~bend(8192) ** 8192 is "pitch bend off"
+
+* Change the LFO SPEED:
+* SYSEX = F0, Yamaha = 43, Substatus/Channel = 1v,
+* Group# = 01, Parameter# = 9, Data = 0-99, EOX = F7
+!DEF lfospeed F0 43 1v 01 09 %1 F7
+
+* now use the definitions:
+G4 ~bend(7567) N40
+~lfospeed(30) N35
+
+@end(programexample)
+
+
+@subsection(Control Ramps)
+@label(macroramp-sec)
+The @t(!RAMP) command@index(!Ramp) can specify a smooth control change from one
+value to another. It consists of a specification of the starting and
+ending values of some control change, a duration specifying how often
+to send a new value, and a duration specifying the total length of the ramp.
+@begin(programexample)
+!RAMP X10 X100 Q W2
+!RAMP ~23(10) ~23(50) U20 W
+!RAMP ~lfo(15) ~lfo(35) U10
+@end(programexample)
+The first line says to ramp the volume control (controller number 7)
+from 10 to 100, changing at each quarter note for the duration of two
+whole notes.
+The second line says to ramp controller number 23 from value 10 to value 50,
+sending a new control change message every 20 time units. The overall
+duration of the ramp should be equivalent to a whole note (@t(W)).
+As shown in the third line, even system exclusive messages controlled by
+parameters can be specified. If the system exclusive message has more
+than one parameter, only one parameter may be ``ramped''; the others must
+remain the same. For example, the following would ramp the second parameter:
+@begin(programexample)
+!RAMP ~mysysex(4,23,75) ~mysysex(4,100,75) U10 W
+@end(programexample)
+
+@begin(detail)
+A rather curious and extreme use of macros and ramps is illustrated in the
+following example. The @t(noteon) macro starts a note, and @t(noteoff) ends it. Ramps can now be used to emit a series of notes with changing pitches or velocities. Since Adagio has no idea that these macros are turning on notes, it is up to the programmer to turn them off!
+@begin(programexample)
+!DEF noteon 9v %1 %2
+!DEF noteoff 8v %1 %2
+~noteon(48,125)
+~noteoff(48,126)
+* turn on some notes
+!RAMP ~noteon(36,125) ~noteon(60,125) Q W NW
+* turn them off
+!RAMP ~noteoff(60,50) ~noteoff(36,50) Q W NW
+@end(programexample)
+@end(detail)
+
+@subsection(The !End Command)
+@label(end-sec)@index(!End)@index(end command)
+The special command @code(!END) marks the end of a score. Everything beyond that
+is ignored, for example:
+@begin(programexample)
+* this is a score
+C; D; E; F; G W
+!END
+since the score has ended, this text will be ignored
+@end(programexample)
+
+@subsection(Calling C Routines)
+@label(call-sec)
+It is possible to call C routines from within Adagio scores when using
+specially linked versions, but this feature is disabled in Nyquist. The
+syntax is described here for completeness.
+
+The @code(!CALL) command@index(!Call)@index(Call command) calls a C routine that can in turn invoke a
+complex sequence of operations. Below is a call to a trill@index(trill) routine,
+which is a standard routine in Adagio. The parameters are the base
+pitch of the trill, the total duration of the trill, the interval in semitones, the
+duration of each note of the trill, and the loudness. Notice
+that both numbers and Adagio notation can be used as parameters:
+@begin(programexample)
+!CALL trill(A5,W,2,S,Lmf) T278 V1
+@end(programexample)
+@i(The parameter list should have no spaces), and parameters are separated
+by commas. Following the close parenthesis, you may specify other
+attributes such as the starting time and voice as shown in the example above.
+
+A parameter may be an Adagio pitch specification, an Adagio duration,
+an Adagio loudness, a number, or an ASCII character within single
+quotes, e.g. @t('a') is equivalent to @t(97) because 97 is the decimal
+encoding of ``a'' in ASCII.
+
+The @code(!CALL) may be followed by a limited set of attributes. These are time (@t(T)), voice (@t(V)), and next time (@t(N)). The @code(!CALL) is made at the current time if no time is specified, and the time of the next adagio command is the time of the @code(!CALL) unless a next time is specified. In other words, the default is @t(N0).
+
+@subsection(Setting C Variables)
+In addition to calling C routines, there is another way in which scores
+can communicate with C. As with @code(!CALL), specific C code must be linked before these commands can be used, and this is not supported in Nyquist.
+The @code(!SETI) command@index(!Seti)@index(seti commnad) sets an integer variable
+to a value, and the @code(!SETV) command@index(!Setv)@index(setv command) sets an element of an integer array.
+For example, the next line sets the variable @t(delay) to 200 and sets
+@t(transposition[5]) to -4 at time 200:
+@begin(programexample)
+!SETI delay 200
+!SETV transposition 5 -4 T200
+@end(programexample)
+As with the @code(!CALL) command, these commands perform their operations at
+particular times according to their place in the Adagio score. This makes
+it very easy to implement time-varying parameters that control various
+aspects of an interactive music system.
+
diff --git a/docsrc/nyquist/adagio.mss b/docsrc/nyquist/adagio.mss
new file mode 100644
index 0000000..b26e028
--- /dev/null
+++ b/docsrc/nyquist/adagio.mss
@@ -0,0 +1,840 @@
+Adagio @Index(Adagio) is an easy-to-use, non-procedural notation
+for scores. In Adagio, text commands are used to specify each
+note. If you are new to Adagio, you may want to glance at the
+examples in Section @ref(adag-examples-sec) starting on page
+@pageref(adag-examples-sec) before reading any further.
+
+A note is described in Adagio by a set of attributes@Index(attributes), and
+any attribute not specified is ``inherited'' from the previous line.
+Attributes may appear in any order and must be separated by one or more
+blanks. An attribute may not contain any blanks. The attributes are:
+time@Index(time), pitch@Index(pitch), loudness@Index(loudness),
+voice@Index(voice) number, duration@Index(duration), and articulation@Index(articulation).
+
+Adagio has been used to program a variety of hardware and software
+synthesizers, and the Adagio compiler can be easily adapted to new
+environments. Although not originally intended for MIDI, Adagio works quite
+well as a representation for MIDI scores. Adagio has been extended to allow MIDI controller
+data such as modulation wheels, pitch bend, and volume, MIDI program commands to change timbre, and System Exclusive messages.
+
+A note command in Adagio must be separated from other notes. Usually,
+notes are distinguished by writing each one on a separate line.
+Notes can also be separated by using a comma or semicolon as will
+be described below.
+
+Besides notes, there are several other types of commands:
+@begin(enumerate)
+An asterisk@Index(asterisk) (@code(*)) in column one (or immediately after a comma,
+semicolon, or space) indicates that the rest of the line is a
+comment@Index(comment). The line is ignored by Adagio, and is therefore a
+good way to insert text to be read by people. Here are some examples:
+@begin(programexample)
+* This is a comment.
+T150 G4 * This is a comment too!
+T150 G4 ;* So is this.
+@end(programexample)
+
+An empty command (a blank@Index(blank) line, for example) is ignored as if it
+were a comment@Index(comment)@foot(To be consistent, a blank line ought to specify zero attributes and
+generate a note that inherits all of its attributes from the previous one.
+Adagio is intentionally inconsistent in this respect.).
+
+An exclamation point@Index(exclamation point)@index(!) (!) in column one (or
+immediately after a comma or semicolon) indicates a special
+command@Index(special command). A special command does not generate a note.
+Special commands follow the ``!'' with no intervening spaces and extend to the end of the line, for example:
+@begin(programexample)
+!TEMPO 100
+@end(programexample)
+
+Control change commands are used to control parameters like
+pitch bend, modulation, and program (timbre). Control
+change commands can be specified along with notes or by
+themselves.
+A command that specifies control changes without specifying
+a pitch will not produce a note.
+@end(enumerate)
+
+Adagio is insensitive to case@Index(case),
+thus ``A'' is equivalent to ``a'', and you
+can mix upper and lower case letters freely.
+
+@section[Specifying Attributes]
+A note is indicated by a set of attributes. Attributes are indicated by a string of characters with no intervening spaces because spaces separate attributes. The attributes are described below.
+
+The default unit of time is a centisecond
+(100@+[th]'s), but this can be changed to a millisecond (1000@+[th]'s) using the @code(!MSEC) command and reset to centiseconds with @code(!CSEC) (see Section @ref(millisec-sec)). In the descriptions below, the term ``time unit'' will be used to mean whichever convention is currently in effect.
+
+@subsection[Time]
+
+The time@Index(time) attribute specifies when to start the note. A time is
+specified by a ``T@Index(T)'' followed by a number representing time units
+ or by a duration (durations are described below). Examples:
+@begin(programexample)
+T150 ** 1.5 sec (or .15 sec)
+TQ3 ** 3 quarter note's duration
+@end(programexample)
+If no time is specified, the default time@Index(default time) is the sum of
+the time and duration attributes of the previous note. (But see Section
+@ref(next-time-sec).) Time is measured relative to the time of the
+most recent Tempo@Index(Tempo) or Rate@Index(Rate) command. (See the
+examples in Section
+@ref(adag-examples-sec) for some clarification of this point.)
+
+@subsection[Pitch]
+
+The pitch@Index(pitch) attribute specifies what frequency to produce.
+Standard scale pitches are named by name, using @code(S) for sharp@Index(sharp),
+ @code(F) for flat@Index(flat),
+and (optionally) @code(N) for natural@Index(natural).
+For example, @code(C) and @code(CN) represent the same pitch, as do @code(FS) and @code(GF) (F sharp and G flat). Note that there are no bar lines, and accidentals to not carry forward to any other notes as in common practice notation.
+
+Octaves@Index(octave specification) are specified by
+number. @code(C4) is middle C, and @code(B3) is a half step lower. @code(F5) is the top line of
+the treble clef, etc. (Adagio octave numbering follows the ISO standard, but note that this is not universal. In particular, Yamaha refers to middle C as C3.) Accidentals@Index(accidentals)@index[S (Adagio Sharp)]@index[F (Adagio Flat)] can go before or after
+the octave number, so @code(FS3) and @code(F3S) have the same meaning.
+
+An alternate
+notation for pitch is @code(P)@i(n), where @i(n) is an integer representing the pitch.@index[P (Adagio Pitch)]
+Middle C@index(Middle C) (C4) is equivalent to @code(P60), @code(CS4) is @code(P61), etc.
+
+If you do not specify an octave@Index(octave specification),
+Adagio will choose one for you. This
+is done by picking the octave that will make the current pitch as close
+to the previous pitch as possible. In the case of augmented fourths
+ or diminished fifths, there are two equally good choices. Adagio
+chooses the lower octave.
+
+@subsection[Duration]
+
+Duration@Index(duration) is specified by a letter indicating a number of
+beats, followed by one or several modifiers. The basic duration codes are:
+@begin(display)
+@code(W)@Index[W (Adagio Whole note)] (whole@index(whole note), 4 beats),
+@code(H)@Index[H (Adagio Half note)] (half@index(half note), 2 beats),
+@code(Q)@Index[Q (Adagio Quarter note)] (quarter@index(quarter note), 1 beat),
+@code(I)@Index[I (Adagio eIght note)] (eighth@Index(eighth note), 1/2 beat),
+@code(S)@Index[S (Adagio Sixteenth note)] (sixteenth@Index(sixteenth note), 1/4 beat),
+@code(%)@Index[% (Adagio thirtysecond note)] (thirtysecond@index(thirtysecond note), 1/8 beat), and
+@code(^)@index[^ (Adagio sixtyfourth note)] (sixtyfourth@index(sixtyfourth note), 1/16 beat).
+@end(display)
+Note that @code(E) is a pitch, so eighth-notes use the duration code @code(I).
+The default tempo is 100 beats per
+minute (see Section @ref(tempo-sec)). These codes may be followed by a @code(T)
+(triplet@Index(triplet)@index[T (Adagio Triplet)]), indicating a duration of 2/3 the normal. A dot@Index(dot)@index[. (Adagio)] (@code(.)) after a
+duration code extends it by half to 3/2 the normal. An integer
+after a note multiplies its duration by the indicated value (the result is
+still just one note). Finally, a slash followed by an integer divides
+the duration by the integer. Like all attributes, duration attributes may not have embedded spaces. Examples:
+@begin(display)
+@tabclear
+@tabset(.5 inches)
+@code(Q)@\1 beat (quarter note)
+@code(QT)@\2/3 beat (quarter triplet)
+@code(W.)@\6 beats(dotted whole note)
+@code(ST6)@\1 beat (6 sixteenth triplets)
+@code(H5)@\10 beats(5 half notes)
+@code(Q3/7)@\3/7 beats
+@end(display)
+A duration may be noted by @code(U)@i(n)@Index(U), where @i(n) is an integer
+indicating 100@+[th]'s of a second
+(or 1000@+[th]'s), see Section @ref(millisec-sec).
+For example, @code(U25) is twenty-five time units.
+
+Durations may be combined using a plus sign:
+@begin(programexample)
+Q+IT ** a quarter tied to an eighth triplet
+Q/7+W+Q2/7 ** a 7th beat tied to a whole tied to 2/7th beat
+Q+U10 ** a quarter plus 10 time units
+@end(programexample)
+
+@subsection(Next Time)
+@label(next-time-sec)
+The time of the next@Index(next)@index[N (Adagio Next)] command (the next command in the Adagio
+program text) is
+normally the time of the current note command
+plus the duration of the current note.
+This can be overridden by a field consisting of the letter @code(N)
+followed by a number indicating time units, or followed by a
+duration as described above. The next note will then start at the time of
+the current note plus the duration specified after @code(N). If the next note
+has an explicit time attribute (@code(T)), then the specified time will override
+the one based on the previous note. Examples:
+@begin(programexample)
+N0 ** start the next note at the same time as this one
+N50 ** start the next note 0.5 seconds after this one
+NQT ** start the next note 2/3 beat after the current one
+NU10+Q ** start after 0.1 seconds plus a quarter
+@end(programexample)
+A comma has an effect similar to @code(N0) and is explained in Section @ref(comma-sec). Articulation effects such as @i(staccato) can be produced using @code(N), but it is more convenient to use the articulation attribute described in Section @ref(articulation-sec).
+
+@subsection(Rest)
+Rests@Index(rests)@index[R (Adagio Rest)] are obtained by including the field @code(R) in a
+note command. The effect of an @code(R) field is to omit the note that would
+otherwise occur as the result of the current note command. In all other
+respects, the command is processed just like any other line. This means that
+attributes such as duration, loudness, and pitch can be specified, and
+anything specified will be inherited by the note in the next command.
+Normally, a rest will include just @code(R) and a duration. The fact that a
+note command specifies a rest is not inherited. For example:
+@begin(programexample)
+R H ** a half (two beat) rest
+RH ** illegal, R must be separated from H by space(s)
+@end(programexample)
+Because some synthesizers (e.g. a DX7@Index(DX7)) cannot change programs
+@Index(program change)
+(presets) rapidly, it may be desirable to change programs in
+a rest so that the synthesizer will be ready to play by
+the end of the rest. See Section @ref(adag-timbre-sec) for an example.
+
+@subsection[Articulation]
+@label(articulation-sec)
+Articulation@Index(articulation)@index(staccato)@index(legato) in Adagio refers to the
+percentage of time a note is on relative to the indicated duration. For
+example, to play a note @i(staccato), you would normally play the note about
+half of its indicated duration. In Adagio, articulation is indicated by
+@code(#)@index[# (Adagio articulation)] followed by an integer number indicating a percentage. The
+articulation attribute does not affect the time of the next command. This
+example plays two @i(staccato) quarter notes:
+@begin(programexample)
+C Q #50
+D
+@end(programexample)
+To produce overlapping notes, the articulation may be greater than 100.
+@begin(detail)
+Be aware that overlapping notes on the same pitch can be a problem for some synthesizers. The following example illustrates this potential problem:
+@begin(programexample)
+!TEMPO 60
+C Q #160 * starts at time 0, ends at 1.6 sec
+D I * starts at time 1, ends at 1.8 sec
+C Q * starts at time 1.5, ends at 3.1 sec?
+@end(programexample)
+At one beat per second (tempo 60), these three notes will start at times 0, 1, and 1.5 seconds, respectively. Since these notes have an articulation of 160, each will be on 160% of its nominal duration, so the first note (C) will remain on until 1.6 seconds. But the third note (another C) will start at time 1.5 seconds. Thus, the second C will be started before the first one ends. Depending on the synthesizer, this may cancel the first C or play a second C in unison. In either case, a note-off message will be sent at time 1.6 seconds. If this cancels the second C, its actual duration will be 0.1 rather than 1.6 seconds as intended. A final note-off will be sent at time 3.1 seconds.
+@end(detail)
+
+@subsection[Loudness]
+
+Loudness@Index(loudness)@index(velocity) is indicated by an @code(L)
+followed by a dynamic marking from the following: @code(PPP)@Index[PPP (Adagio dynamic)]@Index[LPPP (Adagio dynamic)],
+@code(PP)@Index[PP (Adagio dynamic)]@Index[LPP (Adagio dynamic)], @code(P)@Index[P (Adagio dynamic)]@Index[LP (Adagio dynamic)], @code(MP)@Index[MP (Adagio dynamic)]@Index[LMP (Adagio dynamic)], @code(MF)@Index[MF (Adagio dynamic)]@Index[LMF (Adagio dynamic)], @code(F)@Index[F (Adagio dynamic)]@Index[LF (Adagio dynamic)],
+@code(FF)@Index[FF (Adagio dynamic)]@Index[LFF (Adagio dynamic)], @code(FFF)@Index[FFF (Adagio dynamic)]@Index[LFFF (Adagio dynamic)]. Alternatively, a number from 1 to 127 may be
+used. The loudness attribute is the MIDI note velocity. (Note that a MIDI velocity of 0 means ``note-off,'' so the minimum loudness is 1.) The
+dynamic@Index(dynamic markings)
+markings are translated into numbers as follows:
+@begin(display)
+@tabclear
+@tabset(0.8 in, 3 in, 3.8 in)
+@code(Lppp)@\20@\@code(Lmf)@\58
+@code(Lpp)@\26@\@code(Lf)@\75
+@code(Lp)@\34@\@code(Lff)@\98
+@code(Lmp)@\44@\@code(Lfff)@\127
+@end(display)
+
+@subsection[Voice]
+
+The voice@Index(voice)@index[V (Adagio Voice)] attribute tells which of the 16 MIDI channels to use
+for the note. The voice attribute consists of a @code(V) followed by
+an integer from 1 (the default) to 16.
+@begin(detail)
+There is a limit to how many notes
+can be played at the same time on a given voice (MIDI channel). Since the
+limit depends upon the synthesizer, Adagio cannot tell you when you exceed
+the limit. Similarly, Adagio cannot tell whether your synthesizer is set up
+to respond to a given channel, so there is no guarantee that what you write
+will actually be heard.
+@end(detail)
+
+@subsection[Timbre (MIDI Program)]
+@label(adag-timbre-sec)
+A MIDI program@Index(MIDI program)@index[Z (Adagio program)] (synthesizer preset@Index(preset)) can be
+selected using the attribute @code(Z)@i(n), where @i(n)
+is the program number (from 1 to 128).
+Notice that in MIDI, changing the program on a given channel will affect
+@i(all) notes on that channel and possibly others. Adagio treats MIDI program changes as a form of control change.
+@begin(detail)
+For many synthesizers, you will not be
+able to change programs at the start of a note or during a note. Change the
+program during a rest instead. For example:
+@begin(programexample)
+R I Z23 V4 ** change MIDI channel 4 to program 23 during rest
+A4 ** play a note on channel 4
+@end(programexample)
+Check how your synthesizer interprets program numbers. For example,
+the cartridge programs on a DX7 can be accessed by adding 32 to the
+cartridge program number. Cartridge program number 10
+is specified by @code(Z42).
+@end(detail)
+
+As in MIDI, the Adagio timbre is a property of the voice (MIDI channel), so
+the timbre will not be inherited by notes on a different channel;
+to change the timbre on multiple voices (channels), you must explicitly
+notate each change.
+
+@subsection[Tempo]
+@label(tempo-sec)
+The length of a beat may be changed using a Tempo@Index(Tempo) command@index(!Tempo):
+@begin(programexample)
+!TEMPO @i(n)
+@end(programexample)
+where @i(n) indicates beats per minute. The exclamation mark tells Adagio that
+this is a special command line rather than a note definition. A special
+command takes the place of a note specification.
+No other attributes should be written on a line with a special command.
+The @code(!TEMPO) command is associated with a time, computed as if the @code(!TEMPO) command were a note. The time@Index(time) attribute (@code(T)) of all
+succeeding notes is now measured relative to the time of the @code(!TEMPO) command. The new tempo starts at the @code(!TEMPO) command time and
+affects all succeeding notes.
+Durations specified in time units (for example @code(U58), @code(N15)) are not affected by the @code(!TEMPO) command, and numerical times (for example @code(T851)) are computed relative to the time of the last @code(!TEMPO) command.
+
+The @code(!TEMPO) command is fairly clever about default durations@Index(default
+durations). If the last duration specified before the @code(!TEMPO) command is
+symbolic (using one of @code(^),@code(%), @code(S), @code(I), @code(Q), @code(H), or @code(W) ), then the default duration for the
+node after the @code(!TEMPO) command will be modified according to the tempo change.
+Consider the following tempo change:
+@begin(programexample)
+!TEMPO 60
+A4 H
+!TEMPO 120
+G
+@end(programexample)
+In this example, the first note will last 2 seconds (2 beats at 60
+beats per minute). The second note inherits the duration (H) from
+the first note, but at 120 beats per minute, the second note will last
+only 1 second. If the duration had been specified @code(U200) (also a
+duration of 2 seconds), the second note would also last 2 seconds because the @code(!TEMPO) command does not affect times or durations specified numerically in time units. If the duration is the sum of a symbolic and a numeric specification, the inherited duration after a @code(!TEMPO) command is undefined.
+
+@subsection(Rate)
+The @code(!RATE)@Index(rate)@index(!Rate) command scales all times including those specified in
+hundredths of seconds. A rate of 100 means no change, 200 means twice as
+fast, and 50 means half as fast. For example, to make a piece play 10%
+faster, you can add the following command at the beginning of the score:
+@begin(programexample)
+!RATE 110
+@end(programexample)
+@code(!RATE) and @code(!TEMPO) commands combine, so
+@begin(programexample)
+!RATE 200
+!TEMPO 70
+@end(programexample)
+will play 70 beats per minute at double the normal speed, or 140 beats
+per minute. Like @code(!TEMPO), the time of the @code(!RATE) command is added to the
+time attribute of all following notes up to the next @code(!TEMPO) or @code(!RATE)
+command.
+
+Two @code(!RATE) commands do not combine, so a @code(!RATE) command only affects the rate until the next @code(!RATE) command.
+
+Although @code(!TEMPO) and @code(!RATE) can occur in the middle of a note (using @code(N), @code(T), etc.) they do not affect a note already specified. This property allows multiple tempi to exist simultaneously (see Section @ref(multipletempi-sec)).
+
+@section[Default Attributes]
+@label(default-sec)
+If an attribute is omitted, the previous one is used by
+default@Index(default) (with the exception of the time attribute). The
+default values for the first note, which are inherited by succeeding notes
+until something else is specified, are given below in Adagio notation:
+@begin(display)
+@tabclear
+@tabset(1.5 inch)
+Time@\@code(T0)
+Pitch@\@code(C4)
+Duration@\@code(Q)
+Articulation@\@code(#100)
+Loudness@\@code(LFFF)
+Voice@\@code(V1)
+Tempo@\@code(!TEMPO 100)
+Rate@\@code(!RATE 100)
+@end(display)
+Control changes (including timbre or MIDI program, specified by @code(Z)) have no default value and are only sent as specified in the score.
+
+@p(Important:) the rules for determining when a command will play a note are as follows (and this has changed slightly from previous versions):
+@begin(enumerate)
+If a special (@code(!)) command or nothing is specified, e.g. a blank line, do @i(not) play a note.
+
+If @code(R) (for ``rest'') is specified, do @i(not) play a note.
+
+Otherwise, if a pitch is specified, @i(do) play a note.
+
+Otherwise, if no control changes (or program changes) are specified (so this is a command with non-pitch attributes and no control changes), @i(do) play a note.
+@end(enumerate)
+Another way to say this is ``Special commands and commands with rests (@code(R)) do not play notes. Otherwise, play a note if a pitch is specified or if no control is specified.''
+
+
+@section[Examples]
+@label(adag-examples-sec)
+The following plays the first two bars of ``Happy Birthday''. Note that
+Adagio knows nothing of bar lines, so the fact that the first note occurs
+on beat 3 or that the meter is three-four is of no consequence:
+@begin(programexample)
+*Example 1 ** Happy Birthday tune (C major)
+!TEMPO 120
+G4 I. LF
+G4 S
+A4 Q
+G4
+C5
+B4 H
+@end(programexample)
+The time attribute for the first note is zero (@code(0)). The second note
+will occur a dotted eighth later, etc.
+Notice that no timbre or rate was specified.
+Adagio will provide reasonable default
+values of 1 and 100, respectively.
+
+The following example plays the first four bars of an exercise from
+Bartok@Index(Bartok)'s Mikrokosmos@Index(Mikrokosmos) (Vol. 1, No. 12).
+An extra quarter note is inserted at the beginning of each voice in order to
+allow time to change MIDI programs. The right hand part is played on voice
+(MIDI channel) 1 and the left hand part on voice 2. Notice the
+specification of the time attribute to indicate that voice 2 starts at time
+0. Also, default octaves are used to reduce typing.
+@begin(programexample)
+*Example 2 ** Bartok
+*voice 1, right hand
+R Q Z10 V1 ** extra rest for program change
+A4 H
+B Q
+C
+D H
+C
+D Q
+C
+B
+A
+B
+C
+D
+R
+
+*voice 2, left hand
+T0 R Q Z15 V2 ** extra rest for program change
+G3 H
+F Q
+E
+D H
+E
+D Q
+E
+F
+G
+F
+E
+D
+R
+@end(programexample)
+
+The next example is the same piece expressed in a different manner,
+illustrating the interaction
+between the @code(!TEMPO) command and the time attribute. Recall that the
+time attribute is measured relative to the time of the last @code(!TEMPO) command:
+@begin(programexample)
+*Example 3 ** 4 measures in 2 sections
+!Tempo 100
+*Voice 1, Measures 1 & 2
+R Q Z10 V1
+A4 H
+B Q
+C
+D H
+C
+
+*Voice 2, Measures 1 & 2
+T0 R Q Z15 V2
+G3 H
+F Q
+E
+D H
+E H
+
+!TEMPO 100
+*Voice 1, Measures 3 & 4
+* note that Z10 is still in effect for V1
+V1 D4 Q
+C
+B
+A
+B
+C
+D
+R
+
+*Voice 2, Measures 3 & 4
+T0 V2 D3 Q
+E
+F
+G
+F
+E
+D
+R
+@end(programexample)
+
+The piece is written in 4 sections. The first
+plays a rest followed by two measures, starting
+at time 0. The next section changes the time back to
+zero and plays two measures of the left hand part (voice 2).
+The next
+command (!TEMPO 100) sets the tempo to 100 (it already is)
+@i(and) sets the reference time to
+be two measures into the piece. Therefore, the next note
+@code((D4)) will begin measure 3. The @code(D3) that begins the last
+group of notes has a @code(T0) attribute, so it will also start at measure
+3. Notice how the @code(!TEMPO) command can serve to divide a piece into
+sections@Index(sections, Adagio).
+
+
+The last example will show yet another way to express the same piece of
+music using the ``Next'' attribute. Only the first bar of music is
+given.
+@begin(programexample)
+*Example 4 ** use of the Next attribute
+!Tempo 100
+R Q Z10 V1 N0
+R Q Z15 V2
+
+A4 H V1 N0
+G3 V2
+
+B4 Q V1 N0
+F3 V2
+
+C4 Q V1 N0
+E3 V2
+@end(programexample)
+Here, each pair of
+lines represents two simultaneous notes. The @code(N0) attribute
+forces the second line to start at the same time as the first line of each
+pair. Because of the large intervals, octave numbers (3 and 4) are
+necessary to override the default octave for these pitches.
+
+@section(Advanced Features)
+Beyond the simple notation described above, Adagio supports a number of
+features. (See also the next chapter.)
+
+@subsection(Time Units and Resolution)
+@label(millisec-sec)@index(time units)@index(resolution)
+The default time unit is 10ms (ten milliseconds or one centisecond or
+100@+(th) of a second), but it is
+possible to change the basic unit to 1ms, or 1000@+(th) of a second.
+The time unit can be specified by:
+@begin(display)
+@tabclear
+@tabset(0.8 inches)
+@t(!CSEC)@index(!csec)@\centisecond time units = 100@+(th)
+@t(!MSEC)@index(!msec)@\millisecond time units = 1000@+(th)
+@end(display)
+The time unit remains in effect until the next @code(!CSEC) or @code(!MSEC) command.
+
+@subsection(Multiple Notes Per Line)
+@label(comma-sec)
+@index(multiple commands)
+Notes can be separated by commas@Index(commas)@index[, (Adagio)] or
+semicolons@Index(semicolon, Adagio)@index[; (Adagio)] as well as by starting a new line. A comma is
+equivalent to typing @code(N0) and starting a new line. In other words, the next note after a comma will start at the same time as the note before the comma. In general, @i(use commas to separate the notes of a chord.)
+
+A semicolon is equivalent to starting a new line. In general, @i(use semicolons to group notes in a melody). Here is yet another rendition of the Bartok:
+@begin(programexample)
+*Example 5 ** use of semicolons
+!Tempo 100
+R Q Z10 V1
+A4 H; B Q; C; D H; C; D Q; C; B; A; B; C; D; R
+
+T0 R Q Z15 V2
+G3 H; F Q; E; D H; E; D Q; E; F; G; F; E; D; R
+@end(programexample)
+This example is similar to Example 2, except semicolons are used. Note how semicolons make the two lines of music stand out.
+The next example is similar to Example 4, except commas are used
+and four bars are notated. The music below is treated as a sequence of 2-note chords, with each chord on a separate line:
+@begin(programexample)
+*Example 6 ** use of commas
+!Tempo 100
+R Q Z10 V1, R Q Z15 V2
+A4 H V1, G3 V2
+B4 Q V1, F3 V2
+C4 V1, E3 V2
+D4 H V1, D3 V2
+C4 V1, E3 V2
+D4 Q V1, D3 V2
+C4 V1, E3 V2
+B4 V1, F3 V2
+A4 V1, G3 V2
+B4 V1, F3 V2
+C4 V1, E3 V2
+D4 V1, D3 V2
+R
+@end(programexample)
+
+@subsection(Control Change Commands)
+@index(Control change)@index[~ (Adagio)]
+Any control change can be specified using
+the syntax ``@t[~@i(n)(@i(v))]'', where @i(n) is the controller number (0 - 127), and
+@i(v) is the value. In addition, Adagio has some special syntax for
+some of the commonly used control changes (note that Pitch bend, Aftertouch, and MIDI Program Change are technically not MIDI control changes but have their own
+special message format and status bytes):
+@begin(display)
+@tabclear
+@tabset(0.5 inch)
+K@\Portamento switch@Index(Portamento switch)@Index[K (Adagio control)]
+M@\Modulation wheel@Index(Modulation wheel)@Index[M (Adagio control)]
+O@\Aftertouch@Index(Aftertouch)@Index[O (Adagio control)]
+X@\Volume@Index(Volume)@Index[X (Adagio control)]
+Y@\Pitch bend@Index(Pitch bend)@Index[Y (Adagio control)]
+Z@\Program Change@Index(Program)@Index[Z (Adagio program)]
+@end(display)
+The letter listed beside each control function is the Adagio command
+letter. For example, @code(M23) is the command for setting the modulation
+wheel to 23. Except for pitch bend, the portamento switch, and MIDI Program Change, all
+values range from 0 to 127. Pitch bend is ``off'' or centered at
+128, and has a range from 0 to 255 (MIDI allows for more precision, but
+Adagio does not). Turn on portamento with @code(K127) and off with @code(K0). Programs are numbered 1 to 128 to correspond to synthesizer displays.
+
+@p(About volume:) Midi volume is just a control, and the Midi standard does not say what it means. Typically it does what the volume pedal does; that is, it scales the amplitude in a continuously changeable fashion. In contrast, Midi velocity, which is controlled by the @code(L) (loudness) attribute, is part of a Midi note-on command and is fixed for the duration of the note. Typically, these two ways of controlling loudness and amplitude operate independently. In some low-cost synthesizers the numbers seem to be added together internally and volume changes are ignored after the note starts.
+
+@p(About pitch bend:) Midi pitch bend is a number from 0 to 16383, where 8192 is the center position. To convert to Midi, Adagio simply multiplies your number by 64, giving values from 0 to 16320. Note that @code(Y128) translates exactly to 8192. The @i(meaning) of pitch bend depends upon your synthesizer and its setting. Most synthesizers let you specify a ``pitch bend range.'' A range of one semitone means that @code(Y255) will produce a bend of approximately one semitone up, and @code(Y0) will bend one semitone down. If the range is 12 semitones, then the same @code(Y255) will bend an octave. Typically, pitch bend is exponential, so each increment in the pitch bend value will bend an equal number of cents in pitch.
+
+Control changes can be part of a note specification or independent.
+In the following example, a middle C is played with a modulation
+wheel setting of 50 and a pitch bend of 120. Then, at 10 unit
+intervals, the pitch bend is decreased by 10. The last line sets the
+portamento time (controller 5) to 80:
+@begin(programexample)
+*Example 7
+C4 LMF M50 Y120 U100 N10
+Y110 N10; Y100 N10; Y90 N10; Y80 N10; Y70 N10; Y60 N10; Y50 N10
+~5(80)
+@end(programexample)
+
+See Section @ref(default-sec) on page @pageref(default-sec) for rules on whether or not a command will play a note.
+
+@subsection(Multiple Tempi)@Index(multiple tempi)
+@label(multipletempi-sec)
+@Index(polyrhythm)
+Writing a piece with multiple tempi requires no new commands; you
+just have to be clever in the use of Tempo and Time. The following
+plays a 7 note diatonic scale on voice 1, and a 12 note chromatic
+scale on voice 2:
+@begin(programexample)
+*Example 8 ** multiple tempi
+!TEMPO 70
+V1 C4; D; E; F; G; A; B
+T0 R N0
+
+!TEMPO 120
+V2 C4; CS; D; DS; E; F; FS; G; GS; A; AS; B
+
+!TEMPO 100
+V1 C5, V2 C5
+@end(programexample)
+The third line plays the 7-note diatonic scale on voice 1. The
+next line contains the tricky part: notice that the time is
+set back to zero, there is a rest, and a next (@code(N)) attribute is used
+to specify that the next default time will be at the same time as
+the current one. This is tricky because a @code(!TEMPO) command cannot have a time (@code(T0)) attribute, and a @code(T0) by itself would create a note with a duration. @code(T0 R N0) says: ``go to time 0, do not play a note, and do not advance the time before the next command''.
+Thus, the time of the @code(!TEMPO 120) command is zero.
+After the 12 note scale, the tempo is changed to 100 and a final note
+is played on each voice. A little arithmetic will show that 7 notes
+at tempo 70 and 12 notes at tempo 120 each take 6 seconds, so the
+final notes (@code(C5)) of each scale will happen at the same time.
+
+@subsection(MIDI Synchronization)
+@index(synchronization)@index(clock)@index(MIDI Clock)@index(clock command)
+
+The Adagio program can synchronize with external devices using MIDI real time messages. Adagio can act as either a master or slave. As a master, Midi
+real time messages
+are generated according to the score. As a slave, the program uses
+incoming Midi messages to control the timebase against which notes and other
+events are scheduled. In this way, an external device such as a drum
+machine or other sequencer can start, stop, and control the tempo of Adagio
+scores. @p(Note:) the current implementation of synchronization to an
+external source is very simplistic; it effectively quantizes the score to
+units of 1/24 of a beat.
+
+Since Adagio supports multiple tempi, and Midi clock is
+based on beats, it is necessary to be explicit in the score about where the
+clock should start and what is the duration of a quarter note. The
+@code(!CLOCK) command@index(!Clock) in Adagio turns on a 24 pulse-per-quarter (PPQ) clock at
+the current tempo and time:
+@begin(programExample)
+!TEMPO 100
+!CLOCK
+@end(programexample)
+A @code(!CLOCK) command must also be inserted for each tempo change that is to be
+reflected in the Midi clock. Typically, each !TEMPO command will be followed by a !CLOCK command.
+@begin(detail)
+Clock commands and thus tempo
+changes can take place at arbitrary times. It is assumed that tempo changes
+on an exact 24@+(th) of a beat subdivision (for example, exactly on a
+beat). If not, the tempo change will take place on the nearest exact
+24@+(th) of a beat subdivision. This may be earlier or later than the
+requested time.
+@end(detail)
+
+To synchronize other systems, e.g. a drum machine, to Adagio, you should make the device a
+``slave'' and start Adagio. Adagio will sent a MIDI Start message and 24 Timing Clock messages per quarter note. When you stop Adagio by typing either the space bar or by reaching the end of the score, Adagio will send a MIDI Stop message, which should stop the slave device.
+
+To synchronize Adagio to another system, type @code(c) to enable external clock synchronization (see Section @ref(adag-resp-sec)), and type
+@c(RETURN) as if to start the Adagio score. Adagio will wait for a MIDI Start message and will then synchronize to MIDI Clock messages. A MIDI Stop message will stop the playback as if the space bar were typed. To synchronize one Adagio to another, be sure the ``slave'' is ready and waiting before starting the ``master''.
+
+@subsection[System Exclusive Messages]
+@label(macro-sec)
+Adagio has a definition facility that makes it possible to send system
+exclusive parameters. Often, there are parameters on Midi
+synthesizers that can only be controlled by system exclusive messages.
+Examples include the FM ratio and LFO rate on a DX7 synthesizer. The
+following example defines a macro for the DX7 LFO rate and then shows how
+the macro is used to set the LFO rate for a B-flat whole note in the score.
+The macro definition is given in hexadecimal, except @t(v) is replaced by
+the channel (voice) and @t(%1) is replaced by the first parameter.
+A macro is invoked by writing ``~'' followed by the macro name and a
+list of parameters@index(!Def):
+@begin(programexample)
+!DEF LFO F0 43 0v 01 09 %1 F7
+Bf5 W ~LFO(25)
+@end(programexample)
+
+In general, the @t(!DEF) command can define any single MIDI message including
+a system exclusive
+message. The message must be complete (including the status byte), and each @t(!DEF) must correspond to just one message.
+The symbol following @t(!DEF) can be any name consisting of
+alphanumeric characters. Following the name is a hexadecimal string
+(with optional spaces), all on one line. Embedded in the string may
+be the following special characters:
+@begin(description)
+@t(v)@\Insert the 4-bit voice (MIDI channel) number. If @t(v) occurs in the
+place of a high-order hexadecimal digit, replace @t(v) with @t(0v) so that
+the channel number is always placed in the low-order 4 bits of a data byte. In other words, @t(v) is padded if necessary to fall into the low-order bits.
+
+@t(%)@i(n)@\Insert a data byte with the low-order 7 bits of
+parameter number @i(n). Parameters are numbered 1 through 9.
+If the
+parameter value is greater than 127, the high-order bits are discarded.
+
+@t(^)@i(n)@\Insert a data byte with bits 7 through 13 of parameter number
+@i(n). In other words, shift the value right 7 places then clear all
+but the first 7 bits. Note that 14-bit numbers can be encoded by
+referencing the same parameter twice; for example, @t(%4^4) will
+insert the low-order followed by the high-order parts of parameter 4
+into two successive data bytes.
+@end(description)
+
+Parameters are separated by commas, but there may be no spaces. The
+maximum number of parameters allowed is 9. Here
+is an example of definitions to send a full-resolution pitch
+bend command and to send a system exclusive command to change a DX7
+parameter@foot[My TX816 Owner's Manual gives an incorrect format for the
+change parameter sysex command (according to the manual, there is no data
+in the message!) I am assuming that the data should be the last byte before
+the EOX and that there is no byte count. If you are reading this, assume
+that I have not tested this guess, nor have I tested this example.].
+
+@begin(programexample)
+* Define macro for pitch bend commands:
+!DEF bend Ev %1 ^1
+
+A ~bend(8192) ** 8192 is "pitch bend off"
+
+* Change the LFO SPEED:
+* SYSEX = F0, Yamaha = 43, Substatus/Channel = 1v,
+* Group# = 01, Parameter# = 9, Data = 0-99, EOX = F7
+!DEF lfospeed F0 43 1v 01 09 %1 F7
+
+* now use the definitions:
+G4 ~bend(7567) N40
+~lfospeed(30) N35
+
+@end(programexample)
+
+
+@subsection(Control Ramps)
+@label(macroramp-sec)
+The @t(!RAMP) command@index(!Ramp) can specify a smooth control change from one
+value to another. It consists of a specification of the starting and
+ending values of some control change, a duration specifying how often
+to send a new value, and a duration specifying the total length of the ramp.
+@begin(programexample)
+!RAMP X10 X100 Q W2
+!RAMP ~23(10) ~23(50) U20 W
+!RAMP ~lfo(15) ~lfo(35) U10
+@end(programexample)
+The first line says to ramp the volume control (controller number 7)
+from 10 to 100, changing at each quarter note for the duration of two
+whole notes.
+The second line says to ramp controller number 23 from value 10 to value 50,
+sending a new control change message every 20 time units. The overall
+duration of the ramp should be equivalent to a whole note (@t(W)).
+As shown in the third line, even system exclusive messages controlled by
+parameters can be specified. If the system exclusive message has more
+than one parameter, only one parameter may be ``ramped''; the others must
+remain the same. For example, the following would ramp the second parameter:
+@begin(programexample)
+!RAMP ~mysysex(4,23,75) ~mysysex(4,100,75) U10 W
+@end(programexample)
+
+@begin(detail)
+A rather curious and extreme use of macros and ramps is illustrated in the
+following example. The @t(noteon) macro starts a note, and @t(noteoff) ends it. Ramps can now be used to emit a series of notes with changing pitches or velocities. Since Adagio has no idea that these macros are turning on notes, it is up to the programmer to turn them off!
+@begin(programexample)
+!DEF noteon 9v %1 %2
+!DEF noteoff 8v %1 %2
+~noteon(48,125)
+~noteoff(48,126)
+* turn on some notes
+!RAMP ~noteon(36,125) ~noteon(60,125) Q W NW
+* turn them off
+!RAMP ~noteoff(60,50) ~noteoff(36,50) Q W NW
+@end(programexample)
+@end(detail)
+
+@subsection(The !End Command)
+@label(end-sec)@index(!End)@index(end command)
+The special command @code(!END) marks the end of a score. Everything beyond that
+is ignored, for example:
+@begin(programexample)
+* this is a score
+C; D; E; F; G W
+!END
+since the score has ended, this text will be ignored
+@end(programexample)
+See Section @ref(seqread-sec) for a further discussion.
+
+@subsection(Calling C Routines)
+@label(call-sec)
+It is possible to call C routines from within Adagio scores.
+The routine must be written in C, the name must be entered into a special
+table, and the compiled routine must be linked into Adagio or some
+application that uses Adagio sequences. Only the command syntax will be
+described here. (See Section @ref(call-impl-sec)
+for more information.)
+
+The @code(!CALL) command@index(!Call)@index(Call command) calls a C routine that can in turn invoke a
+complex sequence of operations. Below is a call to a trill@index(trill) routine,
+which is a standard routine in Adagio. The parameters are the base
+pitch of the trill, the total duration of the trill, the interval in semitones, the
+duration of each note of the trill, and the loudness. Notice
+that both numbers and Adagio notation can be used as parameters:
+@begin(programexample)
+!CALL trill(A5,W,2,S,Lmf) T278 V1
+@end(programexample)
+@i(The parameter list should have no spaces), and parameters are separated
+by commas. Following the close parenthesis, you may specify other
+attributes such as the starting time and voice as shown in the example above.
+
+A parameter may be an Adagio pitch specification, an Adagio duration,
+an Adagio loudness, a number, or an ASCII character within single
+quotes, e.g. @t('a') is equivalent to @t(97) because 97 is the decimal
+encoding of ``a'' in ASCII.
+
+The @code(!CALL) may be followed by a limited set of attributes. These are time (@t(T)), voice (@t(V)), and next time (@t(N)). The @code(!CALL) is made at the current time if no time is specified, and the time of the next adagio command is the time of the @code(!CALL) unless a next time is specified. In other words, the default is @t(N0).
+
+@subsection(Setting C Variables)
+In addition to calling C routines, there is another way in which scores
+can communicate with C. As with @code(!CALL), specific C code must be linked before these commands can be used. (See Section @ref(set-sec) for details.) The @code(!SETI) command@index(!Seti)@index(seti commnad) sets an integer variable
+to a value, and the @code(!SETV) command@index(!Setv)@index(setv command) sets an element of an integer array.
+For example, the next line sets the variable @t(delay) to 200 and sets
+@t(transposition[5]) to -4 at time 200:
+@begin(programexample)
+!SETI delay 200
+!SETV transposition 5 -4 T200
+@end(programexample)
+As with the @code(!CALL) command, these commands perform their operations at
+particular times according to their place in the Adagio score. This makes
+it very easy to implement time-varying parameters that control various
+aspects of an interactive music system.
+
diff --git a/docsrc/nyquist/arcsine-fig.ps b/docsrc/nyquist/arcsine-fig.ps
new file mode 100644
index 0000000..b15c551
--- /dev/null
+++ b/docsrc/nyquist/arcsine-fig.ps
@@ -0,0 +1,64 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: arcsine-fig.ps
+%%CreationDate: Wed Jul 13 12:12:47 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 176 translate
+-40 760 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2413 ASCII Bytes
+image
+h>[NUO5Ks<s0(>[!rq_]j8T2[s8N0#hiHgt!ri6"!rq/Mj8T2[s8N0#hk/s/!ri6"s8N(kj8T2[
+s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[
+s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[
+s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[s8N0#c_'7t!ri6"!rp$-j8T2[
+s8N0#T:b0D!ri6"!roHbj8T2[s8N0#YFjkT!ri6"!rnmbj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[
+s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[
+s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[
+s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"!rn=Rj8T2[s8N0#^RsQd!ri6"!rnmbj8T2[
+s8N0#muQN/!ri6"!roHrj8T2[s8N0#hk/s/!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[
+s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[
+s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!2&<O!ri6"s8N(kj8T2[s8W-!!3bG_!ri6"s8N)&j8T2[
+s8W-!!0?1?!ri6"s8N)&j8T2[s8N0#n#tdO!ri6"!rpTMj8T2[s8N0#YHR!d!r`0!!rn%:j8T2Z
+s8N0#n#tdO!r`0!!rp<Ej8T2Zs8W-!!3bG_!r`0!s8N([j8T2Zs8W-!!3bG_!r`0!s8N)&j8T2Z
+s8W-!!3bG_!r`0!s8N)&j8T2Zs8W-!!0?1?!r`0!s8N)&j8T2Zs8W-!!3bG_!r`0!s8N([j8T2Z
+s8W-!!3bG_!r`0!s8N)&j8T2Zs8W-!!3bG_!r`0!s8N)&j8T2Xs8W-!!0?1?!rN#t!rq/ej8T2X
+s8N0#YIEQl!rN#t!rq_uj8T2Xs8N0#hhU7l!rN#t!rq_uj8T2Xs8N0#T=<k\!rN#ts8N).j8T2X
+s8W-!!4V"g!rN#ts8N(cj8T2Ts8W-!!5%:k!r)`ps8N)2j8T2Ts8W-!!5%:k!r)`ps8N)2j8T2T
+s8W-!!1W$K!r)`ps8N)2j8T2Ts8W-!!5%:k!r)`ps8N)2j8T2Ts8W-!!1W$K!q60hs8N)2j8T2L
+s8W-!!57Fm!q60hs8N)4j8T2Ls8W-!!57Fm!q60hs8N(ij8T2Ls8N0#hnA(M!q60h!roI<j8T2<
+s8N0#hnJ.N!oO%X!rq/<j8T2<s8N0#^V8b.!l+d8"94FsJ)pV2^]4?6rrKlajSo:rs8W-!s1dXp
+!e:7Ms8N+l^Z>CrJ,fQKrrKmljo5>[rr<#u!PdORrrE#ss8W*"^Ye/Q!<)oss8N,7n)aQLrVlis
+rrJbdjo5>Xrr<#u!PeBjrrDrqs8W*"^\d-m!;HKms8N,7rT4%Zn,E@errJbkjo5><rr<#u!l+bb
+k5PFrrr<#u!l+cMk5PF2rr<#u!l+c]kPkP]rVuot!l+d0kPkP\rVuot!h]MgkPkPRrVm'$T>1F*
+J*?n4ci*kIs51Tks.AQU!WG=^rrrG[^]4>ol2LbZr;Qs#hiIg;r9=4]a8Gr=s51Tjrr=/,rrN$^
+r;Qiu#J^9<!9<DF!/(1Ks8N)6rr3#s5OJIOn:1?8s8N)6rVlo65O\UQrX\l*s8N(kr;Qf55Oe[Q
+_>4-2rrBh2rrKn9oD\m]!'g;Zs8N)6qYpWr!'g2W!It^Ts8W*!^\Ig/_#495s82isJ+ipBrrA\_
+s8N)gs8W*!^Yo.lrrBgls8W*!^Yo.lrrBgls8W*!TA]bLrrBgls8W*!^Yo.lrrBgls8W*!^Yo.l
+rrA\Ls8W*!^Yo.lrrBh3rrDfkrrE&qrrCsSrrDrnrrIWLs8O7WrVtdSs7cQ.qu>RQs7cPCqu>RQ
+s6ou;qu>RPs6ou;rrN/Xi;`lZs8W*!^Yo.lrrBgls8W*!^Yo.lrrBgls5!_OrrN#rr;QeIn,<7e
+n+lq^!r`.KrVlrss8Vrq!qlMArr3'!^X)lY!S@)ErrW&r^]"06rr<#prrMflrVlru^T[V9!S?rA
+rrW&sJ,TBKrr<#prrMflrVlru^PDdf!S@#CrrW&r^]"06rr<#prrMfkrVlru^[M.$!S@#CrrW&r
+^]"06rr<#prrW)QJ,TBJHcQ*b!Uk+.rrW/fJ,TBKpcnf7s*t~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/bernoulli-fig.ps b/docsrc/nyquist/bernoulli-fig.ps
new file mode 100644
index 0000000..6a7cf3d
--- /dev/null
+++ b/docsrc/nyquist/bernoulli-fig.ps
@@ -0,0 +1,1149 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: bernoulli-fig.ps
+%%CreationDate: Wed Jul 13 12:13:35 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 312 364
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 348.98334526366023 translate
+-20 775 translate
+296.98582677165354 -348.98334526366023 scale
+% Image geometry
+297 349 8
+% Transformation matrix
+[ 297 0 0 349 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 297 string def
+/gstr 297 string def
+/bstr 297 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData: 45884 ASCII Bytes
+colorimage
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+r;V<JJH4^1qu;0~>
+r;V<JJH4^1qu;0~>
+r;V<JJH4^1qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`s_uKW7!IX.hs8N'&rr<'!!!)utr;["7d/X+G!;ZWqiJdX5rr<-#!!)`m"lYF?rr<&Ls8)cs
+s7#pd_Z'T9qu;0~>
+r;Q`s_uKW7!IX.hs8N'&rr<'!!!)utr;["7d/X+G!;ZWqiJdX5rr<-#!!)`m"lYF?rr<&Ls8)cs
+s7#pd_Z'T9qu;0~>
+r;Q`s_uKW7!IX.hs8N'&rr<'!!!)utr;["7d/X+G!;ZWqiJdX5rr<-#!!)`m"lYF?rr<&Ls8)cs
+s7#pd_Z'T9qu;0~>
+r;Q`s_uK`:s8N/Z!,19irr<-#!!)lqrrE*!!h',JpAb-mp](6npAb-mcMn+%!0$s2!1L\&!!)or
+J,~>
+r;Q`s_uK`:s8N/Z!,19irr<-#!!)lqrrE*!!h',JpAb-mp](6npAb-mcMn+%!0$s2!1L\&!!)or
+J,~>
+r;Q`s_uK`:s8N/Z!,19irr<-#!!)lqrrE*!!h',JpAb-mp](6npAb-mcMn+%!0$s2!1L\&!!)or
+J,~>
+r;Q`s_uK`:rr;uus8OIP!!'>)rr<%XI/a0Hd!SR7s8TB!!4)Y)!!*'!!!*$!!<3$!rr<&ts8N*!
+rs\,lRf<?fs64n2!0$1@!##;3!/u=*!!*$!!52*crr<'!s8)d-rr<'!s0>?!ZN'q)!76*fd/*eB
+!!:MAI-gk;BE7;s]`?*frr<&rs*t~>
+r;Q`s_uK`:rr;uus8OIP!!'>)rr<%XI/a0Hd!SR7s8TB!!4)Y)!!*'!!!*$!!<3$!rr<&ts8N*!
+rs\,lRf<?fs64n2!0$1@!##;3!/u=*!!*$!!52*crr<'!s8)d-rr<'!s0>?!ZN'q)!76*fd/*eB
+!!:MAI-gk;BE7;s]`?*frr<&rs*t~>
+r;Q`s_uK`:rr;uus8OIP!!'>)rr<%XI/a0Hd!SR7s8TB!!4)Y)!!*'!!!*$!!<3$!rr<&ts8N*!
+rs\,lRf<?fs64n2!0$1@!##;3!/u=*!!*$!!52*crr<'!s8)d-rr<'!s0>?!ZN'q)!76*fd/*eB
+!!:MAI-gk;BE7;s]`?*frr<&rs*t~>
+r;Q`s_uK`:s8OY/!4)X<!6<Fd^&J'4g&M'P!57Us:&hm,a2\1nrr<'!rr<'!!!*$!!<3$!rVult
+rr;uu2u`jXs(DE4kl?,2!!*'!!!(^Prr<'!!!&q;!2fess8N'!rr<'!rr<'!]`?*n!58C4!57Us
+:&=ni!!B.>!2oeqqZ-Ek$,$>Ps8S#X9`U-grr<&rs*t~>
+r;Q`s_uK`:s8OY/!4)X<!6<Fd^&J'4g&M'P!57Us:&hm,a2\1nrr<'!rr<'!!!*$!!<3$!rVult
+rr;uu2u`jXs(DE4kl?,2!!*'!!!(^Prr<'!!!&q;!2fess8N'!rr<'!rr<'!]`?*n!58C4!57Us
+:&=ni!!B.>!2oeqqZ-Ek$,$>Ps8S#X9`U-grr<&rs*t~>
+r;Q`s_uK`:s8OY/!4)X<!6<Fd^&J'4g&M'P!57Us:&hm,a2\1nrr<'!rr<'!!!*$!!<3$!rVult
+rr;uu2u`jXs(DE4kl?,2!!*'!!!(^Prr<'!!!&q;!2fess8N'!rr<'!rr<'!]`?*n!58C4!57Us
+:&=ni!!B.>!2oeqqZ-Ek$,$>Ps8S#X9`U-grr<&rs*t~>
+r;Q`s_uKW7$[hID9`Y4n!,2B4!<3#u!<<*!!#GTJ!<<'!B`A&4s8N'!rr<'!!!*$!!<)rt!<3#u
+!!iN(!<5anI*hlmrrE*!rrE&urr=5B!!*'!!)3Fns8N'!rr<'!rr<'!BE8)4!,2B4!<<'!!;c`q
+!<<'"!);n]s%WLm"cQ1?`rMRFrr<&rs*t~>
+r;Q`s_uKW7$[hID9`Y4n!,2B4!<3#u!<<*!!#GTJ!<<'!B`A&4s8N'!rr<'!!!*$!!<)rt!<3#u
+!!iN(!<5anI*hlmrrE*!rrE&urr=5B!!*'!!)3Fns8N'!rr<'!rr<'!BE8)4!,2B4!<<'!!;c`q
+!<<'"!);n]s%WLm"cQ1?`rMRFrr<&rs*t~>
+r;Q`s_uKW7$[hID9`Y4n!,2B4!<3#u!<<*!!#GTJ!<<'!B`A&4s8N'!rr<'!!!*$!!<)rt!<3#u
+!!iN(!<5anI*hlmrrE*!rrE&urr=5B!!*'!!)3Fns8N'!rr<'!rr<'!BE8)4!,2B4!<<'!!;c`q
+!<<'"!);n]s%WLm"cQ1?`rMRFrr<&rs*t~>
+r;Q`s_uK`:s8N2S!,2E0!!<0#!<3#u!<<*!!#GS7!<<'!!<3$!s8N'!rr<'!!!*$!!<)rt!<3#u
+!"f/1!<:D?!!#a?rr<'!rr<&us8N'%rr<'!s8;rts8N'5rr<'!rr<'!!!*'!!!*$!!<<'!!;c`q
+!<<*!!<)rp!;ZWrf`8>Ss8N)9rr<&rs*t~>
+r;Q`s_uK`:s8N2S!,2E0!!<0#!<3#u!<<*!!#GS7!<<'!!<3$!s8N'!rr<'!!!*$!!<)rt!<3#u
+!"f/1!<:D?!!#a?rr<'!rr<&us8N'%rr<'!s8;rts8N'5rr<'!rr<'!!!*'!!!*$!!<<'!!;c`q
+!<<*!!<)rp!;ZWrf`8>Ss8N)9rr<&rs*t~>
+r;Q`s_uK`:s8N2S!,2E0!!<0#!<3#u!<<*!!#GS7!<<'!!<3$!s8N'!rr<'!!!*$!!<)rt!<3#u
+!"f/1!<:D?!!#a?rr<'!rr<&us8N'%rr<'!s8;rts8N'5rr<'!rr<'!!!*'!!!*$!!<<'!!;c`q
+!<<*!!<)rp!;ZWrf`8>Ss8N)9rr<&rs*t~>
+r;Q`s_uK`:rr;uu!rkspr;Zcsrr;uus8W*!(B8%Js8N(4rr<'!rr<'!!!*$!!<3$!rVults8N8e
+!1Nof!<3!*fr"gErr<'!rr<&us8N'Brr<'!rr>an!<<'!!<3$!s8N'!s(DE4rr?a4!!*'!!!)lq
+rrE*!!<>j_rrT(ug%t^L!):?1!!)orJ,~>
+r;Q`s_uK`:rr;uu!rkspr;Zcsrr;uus8W*!(B8%Js8N(4rr<'!rr<'!!!*$!!<3$!rVults8N8e
+!1Nof!<3!*fr"gErr<'!rr<&us8N'Brr<'!rr>an!<<'!!<3$!s8N'!s(DE4rr?a4!!*'!!!)lq
+rrE*!!<>j_rrT(ug%t^L!):?1!!)orJ,~>
+r;Q`s_uK`:rr;uu!rkspr;Zcsrr;uus8W*!(B8%Js8N(4rr<'!rr<'!!!*$!!<3$!rVults8N8e
+!1Nof!<3!*fr"gErr<'!rr<&us8N'Brr<'!rr>an!<<'!!<3$!s8N'!s(DE4rr?a4!!*'!!!)lq
+rrE*!!<>j_rrT(ug%t^L!):?1!!)orJ,~>
+r;Q`s_uK`:s8NMd!0$r`!6==(N;ikXrr;uus8W*!(B;&Ja2\1ns(DDs]`8'4!!*$!!<3$!rVult
+s8Nb$!87AP!<7EHl0n[drr<'!rr<&us8N'Err<%sciBtW!9q/s!<3$!s8N'!s1JEQ`rNgQ!!*'!
+!!*$!!<)rt!!B.G!2oGgrrE*!!b_T'rr3.L!9qi1ZGQVA!;leH~>
+r;Q`s_uK`:s8NMd!0$r`!6==(N;ikXrr;uus8W*!(B;&Ja2\1ns(DDs]`8'4!!*$!!<3$!rVult
+s8Nb$!87AP!<7EHl0n[drr<'!rr<&us8N'Err<%sciBtW!9q/s!<3$!s8N'!s1JEQ`rNgQ!!*'!
+!!*$!!<)rt!!B.G!2oGgrrE*!!b_T'rr3.L!9qi1ZGQVA!;leH~>
+r;Q`s_uK`:s8NMd!0$r`!6==(N;ikXrr;uus8W*!(B;&Ja2\1ns(DDs]`8'4!!*$!!<3$!rVult
+s8Nb$!87AP!<7EHl0n[drr<'!rr<&us8N'Err<%sciBtW!9q/s!<3$!s8N'!s1JEQ`rNgQ!!*'!
+!!*$!!<)rt!!B.G!2oGgrrE*!!b_T'rr3.L!9qi1ZGQVA!;leH~>
+r;Q`s_uKW7$]O?Ms0>?!N;rnX!<3#u!<<*!!<<'5Z;"'!s8UG?B^#Ksrr<'!!!*$!!<)rr!#'&!
+s8N'!s6uHW!.=&2ciAIn!!*#urr=>E!!(A?I/hPfB^#Kss3Lanrr<'!s0>?nZN'q)!<<'!!<3$!
+rVult!lk;"o)J^is8W*!rVm#bMuWj`_>aK8qu;0~>
+r;Q`s_uKW7$]O?Ms0>?!N;rnX!<3#u!<<*!!<<'5Z;"'!s8UG?B^#Ksrr<'!!!*$!!<)rr!#'&!
+s8N'!s6uHW!.=&2ciAIn!!*#urr=>E!!(A?I/hPfB^#Kss3Lanrr<'!s0>?nZN'q)!<<'!!<3$!
+rVult!lk;"o)J^is8W*!rVm#bMuWj`_>aK8qu;0~>
+r;Q`s_uKW7$]O?Ms0>?!N;rnX!<3#u!<<*!!<<'5Z;"'!s8UG?B^#Ksrr<'!!!*$!!<)rr!#'&!
+s8N'!s6uHW!.=&2ciAIn!!*#urr=>E!!(A?I/hPfB^#Kss3Lanrr<'!s0>?nZN'q)!<<'!!<3$!
+rVult!lk;"o)J^is8W*!rVm#bMuWj`_>aK8qu;0~>
+r;Q`sJcF$q!U4:rs8N(lrr<&rs*t~>
+r;Q`sJcF$q!U4:rs8N(lrr<&rs*t~>
+r;Q`sJcF$q!U4:rs8N(lrr<&rs*t~>
+r;Q`sJcF$q!K?"9s8N(lrr<&rs*t~>
+r;Q`sJcF$q!K?"9s8N(lrr<&rs*t~>
+r;Q`sJcF$q!K?"9s8N(lrr<&rs*t~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sp&G!krr;rtJcC<$qYpNqqu;0~>
+r;Q`sp&G!krr;rtJcC<$qYpNqqu;0~>
+r;Q`sp&G!krr;rtJcC<$qYpNqqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGWI!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGWI!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGWI!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGWI!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGWI!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGWI!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGWI!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGWI!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGWI!!)orJ,~>
+r;Q`sp&Fsj!WN0!rr<&rs8)eIJ<,6Vrr<&rs*t~>
+r;Q`sp&Fsj!WN0!rr<&rs8)eIJ<,6Vrr<&rs*t~>
+r;Q`sp&Fsj!WN0!rr<&rs8)eIJ<,6Vrr<&rs*t~>
+r;Q`so)AakrrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`sp&G!ks8N'!rr2ruq#:<oJ\[;]!.anF!!)orJ,~>
+r;Q`sp&G!ks8N'!rr2ruq#:<oJ\[;]!.anF!!)orJ,~>
+r;Q`sp&G!ks8N'!rr2ruq#:<oJ\[;]!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)orqZ)2_OMCjHq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)orqZ)2_OMCjHq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)orqZ)2_OMCjHq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNkbXFq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+pAjEm!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+pAjEm!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+pAjEm!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`soD\mms8N)urr<&orr<%M^p1ZT!;W#_!9h2uJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^p1ZT!;W#_!9h2uJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^p1ZT!;ZWp!9h2uJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^p1ZT!;W#_!9h2uJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^p1ZT!;W#_!9h2uJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^p1ZT!;ZWp!9h2uJGK3F!;leH~>
+r;Q`so`"mkrr2rurr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruqu?NnJ\\V-!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruqu?NnJ\\V-!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruqu?NnJ\\V-!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lr;Z`rp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lr;Z`rp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lr;Z`rp\t3nJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q>UEpkeI1Kq>UEpqu;0~>
+r;Q`spAY*mr;Q`srr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAY*mr;Q`srr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAY*mr;Q`srr2ruq#:<oJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`spAb'ks8N'!rr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAb'ks8N'!rr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAb'ks8N'!rr2ruq#:<oJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)orqZ)2_ZbQP@q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)orqZ)2_ZbQP@q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)orqZ)2_ZbQP@q>UEpkeI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q>UEpkeI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q>UEpkeI1Kq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&Fsjs8W&up\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&Fsjs8W&up\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&Fsjs8W&up\t3nJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`spAY*mr;Q`srr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAY*mr;Q`srr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAY*mr;Q`srr2ruq#:<oJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`spAb'ks8N'!rr2ruqu?NnJ\\V-!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAb'ks8N'!rr2ruqu?NnJ\\V-!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAb'ks8N'!rr2ruqu?NnJ\\V-!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q>UEpkeI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q>UEpkeI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q>UEpkeI1Kq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<oJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!.hqj^]4B1R/d6N^]8o\rr<&rs*t~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!.hqj^]4B1R/d6N^]8o\rr<&rs*t~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!.hqj^]4B1rr<&_^]8o\rr<&rs*t~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!.hqj^]4B1R/d6N^]8o\rr<&rs*t~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!.hqj^]4B1R/d6N^]8o\rr<&rs*t~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!.hqj^]4B1rr<&_^]8o\rr<&rs*t~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ)2_ZbQP@q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ)2_ZbQP@q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ)2_ZbQP@q>UEpkeI1Kq>UEpqu;0~>
+r;Q`spAb$j!WN0!rr<&orr<%M^p1ZT!;W#_!9h2uJGK3F!;leH~>
+r;Q`spAb$j!WN0!rr<&orr<%M^p1ZT!;W#_!9h2uJGK3F!;leH~>
+r;Q`spAb$j!WN0!rr<&orr<%M^p1ZT!;ZWp!9h2uJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^p1ZT!;W#_!9h2uJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^p1ZT!;W#_!9h2uJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^p1ZT!;ZWp!9h2uJGK3F!;leH~>
+r;Q`soD\djrr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q>UEpkeI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q>UEpkeI1Kq>UEpqu;0~>
+r;Q`so`+pks8N'!rr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<oJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<oJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`so)AakrrE&u!!)orqZ)2_ZbQP@q3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ)2_ZbQP@q3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ)2_ZbQP@q>UEpkeI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScZ+p>>q>UEpkeI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScZ+p>>q>UEpkeI1Kq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYJ\\P+!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4r+.J\]"8!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4r+.J\]"8!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4r+.J\]"8!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)r4!!)k`!!%Sc^VBgLq3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)r4!!)k`!!%Sc^VBgLq3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)r4!!)lq!!%Sc^VBgLq>UEpkeI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)r4!!)k`!!%Sc^VBgLq3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)r4!!)k`!!%Sc^VBgLq3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)r4!!)lq!!%Sc^VBgLq>UEpkeI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)r4!!)k`!!%Sc^VBgLq3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)r4!!)k`!!%Sc^VBgLq3_3_keI1Kq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)r4!!)lq!!%Sc^VBgLq>UEpkeI1Kq>UEpqu;0~>
+r;Q`soD\mms8N)urr<&rs8)fq^]4B2R/d5<^q[Yb!;W#_!9h2uJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&rs8)fq^]4B2R/d5<^q[Yb!;W#_!9h2uJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&rs8)fq^]4B2rr<%M^q[Yb!;ZWp!9h2uJGK3F!;leH~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<or4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sp&G$lrr2rurr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G$lrr2rurr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sp&G$lrr2rurr2ruq#:<or4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!)r4!!)k`!!%Sc^VBgLq3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!)r4!!)k`!!%Sc^VBgLq3_3_keI1Kq>UEpqu;0~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!)r4!!)lq!!%Sc^VBgLq>UEpkeI1Kq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruqu?NnrkJL6qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruqu?NnrkJL6qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruqu?NnrkJL6qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<or4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sir8uYr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`sn,N@ep\t3nr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sn,N@ep\t3nr4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`sn,N@ep\t3nr4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`snG`Igrr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`snG`Igrr2ruq#:<or4i:4qO%<`J\]%9!!)h_!!)5u!.anF!!)orJ,~>
+r;Q`snG`Igrr2ruq#:<or4i:4qYpNqJ\]%9!!)ip!!)5u!.anF!!)orJ,~>
+r;Q`snG`Igrr2ruq#:<or4i:4qO%<`r4i:4mD&]%m_Af&mD&]%m_Af&m_Af&m_Af&m_Af&mD&]%
+m_Af&r4i:4q3_3_r4i:4m_Af&q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<or4i:4qO%<`r4i:4mD&]%m_Af&mD&]%m_Af&m_Af&m_Af&m_Af&mD&]%
+m_Af&r4i:4q3_3_r4i:4m_Af&q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<or4i:4qYpNqr4i:4mD&]%m_Af&mD&]%m_Af&m_Af&m_Af&m_Af&mD&]%
+m_Af&r4i:4q>UEpr4i:4m_Af&q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<or4i:4qO%<`r4i:4mD&]%m_Af&mD&]%m_Af&m_Af&m_Af&m_Af&mD&]%
+m_Af&r4i:4q3_3_r4i:4m_Af&q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<or4i:4qO%<`r4i:4mD&]%m_Af&mD&]%m_Af&m_Af&m_Af&m_Af&mD&]%
+m_Af&r4i:4q3_3_r4i:4m_Af&q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<or4i:4qYpNqr4i:4mD&]%m_Af&mD&]%m_Af&m_Af&m_Af&m_Af&mD&]%
+m_Af&r4i:4q>UEpr4i:4m_Af&q>UEpqu;0~>
+r;Q`snG`Igrr2ruqu;3IM#dAO!!)orJ,~>
+r;Q`snG`Igrr2ruqu;3IM#dAO!!)orJ,~>
+r;Q`snG`Igrr2ruqu;3IM#dAO!!)orJ,~>
+r;Q`snG`Igrr2ruq#:<omf*7emJd.dmf*7emJd.dmf*7emf*7emf*7emf*7emJd.dmf*7emJd.d
+mf*7eq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<omf*7emJd.dmf*7emJd.dmf*7emf*7emf*7emf*7emJd.dmf*7emJd.d
+mf*7eq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<omf*7emJd.dmf*7emJd.dmf*7emf*7emf*7emf*7emJd.dmf*7emJd.d
+mf*7eq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<omf*7emJd.dmf*7emJd.dmf*7emf*7emf*7emf*7emJd.dmf*7emJd.d
+mf*7eq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<omf*7emJd.dmf*7emJd.dmf*7emf*7emf*7emf*7emJd.dmf*7emJd.d
+mf*7eq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<omf*7emJd.dmf*7emJd.dmf*7emf*7emf*7emf*7emJd.dmf*7emJd.d
+mf*7eq>UEpqu;0~>
+r;Q`sn,N@ep\t3nmf*7emJd.dmf*7emJd.dmf*7emf*7emf*7emf*7emJd.dmf*7emJd.dmf*7e
+q>UEpqu;0~>
+r;Q`sn,N@ep\t3nmf*7emJd.dmf*7emJd.dmf*7emf*7emf*7emf*7emJd.dmf*7emJd.dmf*7e
+q>UEpqu;0~>
+r;Q`sn,N@ep\t3nmf*7emJd.dmf*7emJd.dmf*7emf*7emf*7emf*7emJd.dmf*7emJd.dmf*7e
+q>UEpqu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`s])Vd1gA_-QgAh0QgAh0QW;chtqu;0~>
+r;Q`s])Vd1gA_-QgAh0QgAh0QW;chtqu;0~>
+r;Q`s])Vd1gA_-QgAh0QgAh0QW;chtqu;0~>
+r;Q`sjT#5[gA_6Ts8N)Rs8N)SrrW9$rrCjS!s&B$!8RSS!71ZF!;leH~>
+r;Q`sjT#5[gA_6Ts8N)Rs8N)SrrW9$rrCjS!s&B$!8RSS!71ZF!;leH~>
+r;Q`sjT#5[gA_6Ts8N)Rs8N)SrrW9$rrCjS!s&B$!8RSS!71ZF!;leH~>
+r;Q`sjo5G`s8N'!h#@?Srr2ruh#@EUrrCmT"9AK%!!(jT!s&B$!8RSS!71ZF!;leH~>
+r;Q`sjo5G`s8N'!h#@?Srr2ruh#@EUrrCmT"9AK%!!(jT!s&B$!8RSS!71ZF!;leH~>
+r;Q`sjo5G`s8N'!h#@?Srr2ruh#@EUrrCmT"9AK%!!(jT!s&B$!8RSS!71ZF!;leH~>
+r;Q`sjo5;\rr;uuh>[HTrr2ruh#@EUs8W&ui;Wu]rrE*!!!(pV!W`9#r;baTrrCFG!!)orJ,~>
+r;Q`sjo5;\rr;uuh>[HTrr2ruh#@EUs8W&ui;Wu]rrE*!!!(pV!W`9#r;baTrrCFG!!)orJ,~>
+r;Q`sjo5;\rr;uuh>[HTrr2ruh#@EUs8W&ui;Wu]rrE*!!!(pV!W`9#r;baTrrCFG!!)orJ,~>
+r;Q`sjo5;\rVlith>[HTrr3'#s8N)Vrr`?%rr<&Vs8E#trr<&Us8N)urr<&VrrN3#!7CfH!;leH~>
+r;Q`sjo5;\rVlith>[HTrr3'#s8N)Vrr`?%rr<&Vs8E#trr<&Us8N)urr<&VrrN3#!7CfH!;leH~>
+r;Q`sjo5;\rVlith>[HTrr3'#s8N)Vrr`?%rr<&Vs8E#trr<&Us8N)urr<&VrrN3#!7CfH!;leH~>
+r;Q`sjo>>\rVlitgA_6Trr<&Us8E!!rrCsVrrE&u!!(jT!!*#u!!(gS!!(II!!)orJ,~>
+r;Q`sjo>>\rVlitgA_6Trr<&Us8E!!rrCsVrrE&u!!(jT!!*#u!!(gS!!(II!!)orJ,~>
+r;Q`sjo>>\rVlitgA_6Trr<&Us8E!!rrCsVrrE&u!!(jT!!*#u!!(gS!!(II!!)orJ,~>
+r;Q`sjT#5[rr2rug]%?Urr<&Ts8N)Rs8N'#rr<&Ts8N*!rr<&Rrr<&Jrr<&rs*t~>
+r;Q`sjT#5[rr2rug]%?Urr<&Ts8N)Rs8N'#rr<&Ts8N*!rr<&Rrr<&Jrr<&rs*t~>
+r;Q`sjT#5[rr2rug]%?Urr<&Ts8N)Rs8N'#rr<&Ts8N*!rr<&Rrr<&Jrr<&rs*t~>
+r;Q`sj8],Z!ri6#jT#5[q>^HpjT#5[qu6WriW&oXqYpNqirB#Yqu?Wqg&D$PeGfLKqu;0~>
+r;Q`sj8],Z!ri6#jT#5[q>^HpjT#5[qu6WriW&oXqYpNqirB#Yqu?Wqg&D$PeGfLKqu;0~>
+r;Q`sj8],Z!ri6#jT#5[q>^HpjT#5[qu6WriW&oXqYpNqirB#Yqu?Wqg&D$PeGfLKqu;0~>
+r;Q`siVrlXj8T5^s8N'!qu6WrjSo>_s8N'!h>[TXs8N'!h>[TXs8N'!V#LDpqu;0~>
+r;Q`siVrlXj8T5^s8N'!qu6WrjSo>_s8N'!h>[TXs8N'!h>[TXs8N'!V#LDpqu;0~>
+r;Q`siVrlXj8T5^s8N'!qu6WrjSo>_s8N'!h>[TXs8N'!h>[TXs8N'!V#LDpqu;0~>
+r;Q`s_Z'T9rr;uurr;uuj8T)Zrr;uus8W*!ir8uYrr;uus8W*!ir8uYrr;uus8W*!WW)ququ;0~>
+r;Q`s_Z'T9rr;uurr;uuj8T)Zrr;uus8W*!ir8uYrr;uus8W*!ir8uYrr;uus8W*!WW)ququ;0~>
+r;Q`s_Z'T9rr;uurr;uuj8T)Zrr;uus8W*!ir8uYrr;uus8W*!ir8uYrr;uus8W*!WW)ququ;0~>
+r;Q`s_Z'T9rVlithZ!QUrVlithZ!QUrVlithZ!QUrVlitV>gMqqu;0~>
+r;Q`s_Z'T9rVlithZ!QUrVlithZ!QUrVlithZ!QUrVlitV>gMqqu;0~>
+r;Q`s_Z'T9rVlithZ!QUrVlithZ!QUrVlithZ!QUrVlitV>gMqqu;0~>
+r;Q`s_Z0W9rVlithuE]VrVlithuE]VrVlithuE]VrVlitVZ-Vrqu;0~>
+r;Q`s_Z0W9rVlithuE]VrVlithuE]VrVlithuE]VrVlitVZ-Vrqu;0~>
+r;Q`s_Z0W9rVlithuE]VrVlithuE]VrVlithuE]VrVlitVZ-Vrqu;0~>
+r;Q`s_>jN8rr2ruhZ*TUrr2ruhZ*TUrr2ruhZ*TUrr2ruVZ-Vrqu;0~>
+r;Q`s_>jN8rr2ruhZ*TUrr2ruhZ*TUrr2ruhZ*TUrr2ruVZ-Vrqu;0~>
+r;Q`s_>jN8rr2ruhZ*TUrr2ruhZ*TUrr2ruhZ*TUrr2ruVZ-Vrqu;0~>
+r;Q`s_#OE7!ri6#h>dKT!ri6#h>dKT!ri6#h>dKT!ri6#VZ-Vrqu;0~>
+r;Q`s_#OE7!ri6#h>dKT!ri6#h>dKT!ri6#h>dKT!ri6#VZ-Vrqu;0~>
+r;Q`s_#OE7!ri6#h>dKT!ri6#h>dKT!ri6#h>dKT!ri6#VZ-Vrqu;0~>
+r;Q`s^Ae05g&D$Pg&D$Pg&D$PV#LDpqu;0~>
+r;Q`s^Ae05g&D$Pg&D$Pg&D$PV#LDpqu;0~>
+r;Q`s^Ae05g&D$Pg&D$Pg&D$PV#LDpqu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;V<JJH4^1qu;0~>
+r;V<JJH4^1qu;0~>
+r;V<JJH4^1qu;0~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/beta-fig.ps b/docsrc/nyquist/beta-fig.ps
new file mode 100644
index 0000000..eb9cda6
--- /dev/null
+++ b/docsrc/nyquist/beta-fig.ps
@@ -0,0 +1,64 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: beta-fig.ps
+%%CreationDate: Wed Jul 13 12:13:53 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+-40 760 translate
+%0 176 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2392 ASCII Bytes
+image
+h>[QVIt-MY!ri6"!rfraj8T2[s8N0#It-MY!ri6"!rfqVj8T2[s8N0"^OP;D!ri6"!rmb"j8T2[
+s8W-!!.X&/!ri6"s8N(Kj8T2[s8W-!!.X&/!ri6"s8N(Kj8T2[s8W-!!.X&/!ri6"s8N(Kj8T2[
+s8W-!!.X&/!ri6"s8N'`j8T2[s8W-!!.X&/!ri6"s8N(Kj8T2[s8W-!!.X&/!ri6"s8N(Kj8T2[
+s8W-!!.X&/!ri6"s8N(Kj8T2[s8W-!!.X&/!ri6"s8N(Kj8T2[s8W-!!.X&/!ri6"s8N'`j8T2[
+s8W-!!.X&/!ri6"s8N(Kj8T2[s8W-!!.X&/!ri6"s8N(Kj8T2[s8W-!!.X&/!ri6"s8N(Kj8T2[
+s8W-!!.X&/!ri6"s8N(Kj8T2[s8W-!!.X&/!ri6"s8N'`j8T2[s8W-!!.X&/!ri6"s8N(Kj8T2[
+s8W-!!.X&/!ri6"s8N(Kj8T2[s8W-!!.X&/!ri6"s8N(Kj8T2[s8N0#5C__n!ri6"!ri4Lj8T2[
+s8N0"It-MY!ri6"!rfqVj8T2[s8N0"^OP;D!r`0!!rd\!j8T2Zs8W-!!.X&/!r`0!s8N(Kj8T2Z
+s8W-!!.X&/!r`0!s8N(Kj8T2Zs8W-!!.X&/!r`0!s8N(Kj8T2Zs8W-!!.X&/!r`0!s8N'`j8T2Z
+s8W-!!.X&/!r`0!s8N(Kj8T2Zs8W-!!.X&/!r`0!s8N(Kj8T2Zs8W-!!.X&/!r`0!s8N(Kj8T2Z
+s8W-!!.X&/!r`0!s8N(Kj8T2Zs8W-!!.X&/!r`0!s8N'`j8T2Zs8W-!!.X&/!r`0!s8N(Kj8T2Z
+s8W-!!.X&/!r`0!s8N(Kj8T2Zs8W-!!.X&/!r`0!s8N(Kj8T2Xs8W-!!.X&/!rN#ts8N(Kj8T2X
+s8W-!!.X&/!rN#ts8N'`j8T2Xs8W-!!.X&/!rN#ts8N(Kj8T2Xs8W-!!.X&/!rN#ts8N(Kj8T2X
+s8W-!!.X&/!rN#ts8N(Kj8T2Xs8N0#^OP;D!rN#t!rkK7j8T2Xs8N0"^OP;D!rN#t!ra8`j8T2X
+s8N0#^OP;D!rN#t!rj?lj8T2Xs8W-!!.X&/!rN#ts8N(Kj8T2Xs8W-!!.X&/!r)`ps8N(Kj8T2T
+s8W-!!.X&/!r)`ps8N(Kj8T2Ts8W-!!'fND!r)`ps8N'`j8T2Ts8W-!!'fND!r)`ps8N'`j8T2T
+s8W-!!'fND!r)`ps8N'`j8T2Ls8W-!!'fND!q60hs8N'`j8T2Ls8W-!!'fND!q60hs8N'`j8T2L
+s8W-!!'fND!q60hs8N'`j8T2Ls8W-!!'fND!oO%Xs8N'`j8T2<s8W-!!'fND!oO%Xs8N'`j8T2<
+s8W-!!'fND!oO%Xs8N'`j8T2<s8W-!!'fND!l+d8s8N'`j8T1qs8W-!!'fND!l+d8s8N'`j8T1q
+s8W-!!'fND!e:7Ms8N(+j8T11s8W-!!+4dd!e:7Ms8N(+jSo5Zrr<#u!+4ge!<2ut!rmaWjSo5Z
+rr3'!^L-(%!<)os!rmaWjSo5Yrr3'"IimbO!<)os!ri4,jSo5Wrr3'!5B#W_!;lcqs8N(;jSo5S
+rr<#u!,pru!;HKms8N(;jSo5Krr<#u!,pru!:Tpes8N(CjSo5;rr<#u!-dN(!5JO5s8N(CjSo4p
+rr<#u!&s!=!.Y"Js8N(Cjo5>[rVuot!.3i-!<)lrs8N(Gjo5>XrVuot!.3i-!;HHls8N(Ijo5>L
+rVuot!.Eu/!2'5is8N(Jjo5=1rVuots*s53!;ucps8N+L^ZYUsoDJXgrrG@!kPkOCr;Zfs!Is"j
+rrN+Kr;Zfs!Is:rrrDTds8W*"J,/=.!0@$Ws8N.Mr]f]J!Vh0As8W*#J,dRSrr<<#s8W*$J,f:n
+m/I($q>^Kp"+U@NKC/[>n3?aKs8N4Os8W!-n,EFX&,?2)rr@QJrrVZi5P4sXrVup/p](9n!'gD]
+!Pea1rrTt9!VHElrr@QGrrE&m!!#7Ss8W*!J)LA,rr@Q,s8W*!J)LA,rr@Q,s8W*!J)LA,rr@Q,
+s8W*!J,K<Hn,31crql]qhu*KSrVQTq^]4?6+b0Chhu3TDs*sqGhu<ZMs*sqGhu<ZMs1eO4n,E@]
+s1eR7s+'#-!.Y%K!.Wr,s8N(Ki;`iW!.Wr,s8N(Ki;_X5qYpTjrVZZrJ+*@9!Uoj_rrW3"^]"06
+rdXtErrMH^rVlru^X)lY!S@)ErrW.K?i9p)J,fBF!UK^_rrW27YPnJ%fCSt@!r[V`r;QeIs8)`r
+li$e^!rfrirVloMp&4mlrI82PrrIWLqYpT^qu-NrrkIq#rrLaErVlrtIp`-R!It.GrrMl(r;QeE
+a8Q#=mrSI-!rhr/rVlrs+910sJ,~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/bilateral-fig.ps b/docsrc/nyquist/bilateral-fig.ps
new file mode 100644
index 0000000..c85e0c9
--- /dev/null
+++ b/docsrc/nyquist/bilateral-fig.ps
@@ -0,0 +1,65 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: bilateral-fig.ps
+%%CreationDate: Wed Jul 13 12:14:08 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 176 translate
+-40 760 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2463 ASCII Bytes
+image
+nG`Lfn,MtY!r)Khn,MtY!pfa_n,MtY!pf[]n,MtY"7,sc5Oe^DrrVN_rpTmXrrVr.rpTmVrrDuc
+s7$$hr."59nG`OeJ+3L-rrN%InGi"X!W7H:s7$$hr."59nG`Oc^[V9mrrMu2nGi"X!W'S#s7$$h
+qS2P"nG`Oc5Oe^BrrMu2nGi"X!VYF?s7$$hp>>B>nG`O_hsg[8rrMiNnGi"X!VTmis7$$hp@%MN
+nG`O_n*pAHrrMQVnGi"X!UfFGs7$$hme?5NnG`OWp[J4PrrLu#nGi"X!T*S?s7$$hhY6O>o)Agd
+rndPAs760llhnKonGi(Z"7,ftqsaXVrr_T^5!/96o)AgXrkA:!s760lpUi]enGi"X!Ik":s7$$h
+If8d9nG`N<rUBjVrrIRsnGi"X!Ik":s7--grp]sXs8N#es7--grp]sXs8N#es7-*jrVlfcs7-*k
+rVh:rnc/.Z"9&6!J+<R/rr`6!s*sS=nc&^irr7K<s7-*kqu6VFnc/.Z"8i)tJ+<R/rr`/tJ%tOR
+nc&^grr9b's7-*kqu6W1nc/.Z"8Dfp^[_?orr`#ps53AHnc&^crr:mGs7-*kp\t3Mnc/.Z"7Q5=
+hspa:rr_`hs6oLXnc&^[rr;HWs760mp[.t[n+$GKrrhZArr;`_s760mle_X@p[S:SrrhZDr]g/I
+s760mle_X@qsj^Wrri),rr;lcs7-*k^]+91nc/.Z"2Fj8qsj^Vrr^%8s8DKfnc&]@rdXn:s7-*k
+J,]KHnc/.Z"+U=Mrpg$Yrr[cMs8MQgo)Ajls8N&tnc/1["oeQ$s8RT>s760nrr;uts*sV>o)Aml
+s8INJJ+EX1rrrB$rr<#5o)J:\"oJ?!s8Tk)s760nqu?Zqs1e.)o)Amjs8N&uht$g<rrr/srdXt*
+o)J:\"o&&rs8V!Is760np](6ms6oOYo)Am^s8N&un+-MLrrqlkrr<#eo)J:\"lK@Zs8Vias760n
+huE]Us7c*ao)AmNs8INJp[\@Trrp1;rr<#qo)J:\"i(*:s8Vues760n\,H=+s8DNgo)Al/qYpNp
+rUU!Zrrm3:rr<#to)J=]#6*rer]gG^o)J=]#6*rcrr<#to)J=]"9%u(rr2otJ+N^3rr`6"s8N#t
+!.XV?oD\pks8W)trrBh*s7?6mqu?]qrr2u5oDeF^#Q+Q$rdXtJht-m>rr`#qs8N#t!8mDJoD\pe
+s8W)trrDNZs7?6mn,NFerr2ueoDeF^"7Q9irr2otn+6SNrr_0Ys8N#t!;H*boD\pMs8W)trrDfb
+s7?6q^]4?5J,fQGoDeF^"2Fm9rr2otqt'jZrr[cNs8N#t!<)NhoD\oBs8W)trrE#hs7H<krr2ot
+rr2otrq$0^rrE&trrE&trrE&is7H<krVlftrdXqI!.XY@o`"pgrr2utrVll4o`+R`!;lcq!<2rs
+!5J1+o`"pcrr2utrVllTo`+R`!:Tpe!<2rs!:TR[o`"pKrr2utrVlldo`+R`!8meU!<2rs!;H-c
+o`"p+rr3#uJ,]HJqt0p\rr@QJrrE&srrDrgs7QBlrr)isrr)isrUg-_rrrE%s7c?grVllso`+Ua
+"o\K$li$h\rr@QAs7QBqqu?]^rVl`p!.X\Ap&>6js8VE`r]gA]!5J4,p&>3is8VE`rqucrht@$B
+rrqlks7`aHr;Qccp&F^b!8mbT!<2or!:TU\p&>$,rVllsr;Qckp&F^b!.XtI!<2or!;lHhp&>#A
+rVlotJ,TBIrUp3arrE&rrrE&rrrE&ks7ZHmrVZZqrql]qJ+ip9rrDrorrE&qrrBh-s7ZHmp\b$k
+rql]qhtI*DrrDNcrrE&qrrDN]s7ZHmhu*KSrql]qoCi4Xrr>:]rrN+Kr;QcqpAame!;u`o!<2lq
+!WITCs7cNnoDAOfrqcWpTD/B[rrDNbrrE&prrDN^s7cNnTDSWgrqcWpoCr:[rrN+Kqu6ZqqYpQo
+p]($g!;ZKk!WITGrrN+Kq#C-h!6=s9!<2fo!2'&dq#:=YqYpQpq>UHXq#C0i!;QBi!<2fo!;ZEi
+q>UH8q>UHoq>UKp5Pb?Trr>:ZrrE&nrrC+8s8)`qnG*"`rqQKopj`/?qu6]r&,?/*rdX_C!/(.J
+qu6YIp\t6mp\t9l&,ZD)rrMV=p\t6mpAY0_J,K?FrrN*0pAY-lp&>&C&,lP.rr`0!!It%I!:Tjc
+!<2lq!:Tjc"o[ojJ,fNns82ufs*sqG^]"3$s*sqGhu<ZMs1eO4n,In7s1eO4msoof!<1jU!<;Qg
+!<2HenG`Lfn,MnW!<2HenG`Lfn,M5Dr;QcSr;Qckp&>$Lr;Qcqr;Z]p!2'2h!:0=X!3c>#!;ZQm
+r;Qb(r;Qckp&>$Lr;Qcir;Z`q!TO^hrrN%Ap&>$Lr;Qcdr;Z]p!8m_S!:TU\!5JI3!<)iqr;QbX
+r;QcWp&>#Qr;Qclr;YUQJ,~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/binomial-fig.ps b/docsrc/nyquist/binomial-fig.ps
new file mode 100644
index 0000000..9aa5eed
--- /dev/null
+++ b/docsrc/nyquist/binomial-fig.ps
@@ -0,0 +1,1197 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: binomial-fig.ps
+%%CreationDate: Wed Jul 13 12:14:23 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 312 364
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 348.98334526366023 translate
+-20 775 translate
+296.98582677165354 -348.98334526366023 scale
+% Image geometry
+297 349 8
+% Transformation matrix
+[ 297 0 0 349 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 297 string def
+/gstr 297 string def
+/bstr 297 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData: 54218 ASCII Bytes
+colorimage
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+r;V<JJH4^1qu;0~>
+r;V<JJH4^1qu;0~>
+r;V<JJH4^1qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sc2[\A"FTJ6!!)3^rrDlprrE#tr;["7d/X+G!;ZX#iJdg:!!*$!!;6?qiJdg:!!(^P!:]md
+j8T,KquFt@!!)orJ,~>
+r;Q`sc2[\A"FTJ6!!)3^rrDlprrE#tr;["7d/X+G!;ZX#iJdg:!!*$!!;6?qiJdg:!!(^P!:]md
+j8T,KquFt@!!)orJ,~>
+r;Q`sc2[\A"FTJ6!!)3^rrDlprrE#tr;["7d/X+G!;ZX#iJdg:!!*$!!;6?qiJdg:!!(^P!:]md
+j8T,KquFt@!!)orJ,~>
+r;Q`sc2[eDs8N/Z!,1*drrE#trrE*!!h',JpAb-mr;Zcsp&G$lec,^(!1MjG!ndRBao;>@qu;0~>
+r;Q`sc2[eDs8N/Z!,1*drrE#trrE*!!h',JpAb-mr;Zcsp&G$lec,^(!1MjG!ndRBao;>@qu;0~>
+r;Q`sc2[eDs8N/Z!,1*drrE#trrE*!!h',JpAb-mr;Zcsp&G$lec,^(!1MjG!ndRBao;>@qu;0~>
+r;Q`sc2[eDrr;uu./s8Irr<&GHqhufs0>?!ZN'q)!76*f]uNiAd/O(Gs65IB!,1'c!!)utrrE*!%
+-[b\rr<'!l$NI2N9U9@%fZM/rr<&49oT,P!!*'!qZ%0,!!*'!Z:t>)rr<&GHqhuas8N'$d!SR7o
+D\m*!6=j6rr<,I9mlF0!keTSao;>@qu;0~>
+r;Q`sc2[eDrr;uu./s8Irr<&GHqhufs0>?!ZN'q)!76*f]uNiAd/O(Gs65IB!,1'c!!)utrrE*!%
+-[b\rr<'!l$NI2N9U9@%fZM/rr<&49oT,P!!*'!qZ%0,!!*'!Z:t>)rr<&GHqhuas8N'$d!SR7o
+D\m*!6=j6rr<,I9mlF0!keTSao;>@qu;0~>
+r;Q`sc2[eDrr;uu./s8Irr<&GHqhufs0>?!ZN'q)!76*f]uNiAd/O(Gs65IB!,1'c!!)utrrE*!%
+-[b\rr<'!l$NI2N9U9@%fZM/rr<&49oT,P!!*'!qZ%0,!!*'!Z:t>)rr<&GHqhuas8N'$d!SR7o
+D\m*!6=j6rr<,I9mlF0!keTSao;>@qu;0~>
+r;Q`sc2[eDs8OV.!4)V)!<3$!^$,Mks1JEQ`rNgQ!!'_%!!'=h!,2B4!<7H"s60MXrr<&ts8N)u
+s8N'Srr<'!BE8(s!.=eH!<<'!!<3$!VoJe8rr<'!rr<'!!!*'!!!*&4!6<+[]`8&Gkl=HSs8N'$
+^$,MkrVu`prVm"Z!)3HPq>^Hp"/j0>Vu?Ym!;c]uMuZQPN6D5$!;leH~>
+r;Q`sc2[eDs8OV.!4)V)!<3$!^$,Mks1JEQ`rNgQ!!'_%!!'=h!,2B4!<7H"s60MXrr<&ts8N)u
+s8N'Srr<'!BE8(s!.=eH!<<'!!<3$!VoJe8rr<'!rr<'!!!*'!!!*&4!6<+[]`8&Gkl=HSs8N'$
+^$,MkrVu`prVm"Z!)3HPq>^Hp"/j0>Vu?Ym!;c]uMuZQPN6D5$!;leH~>
+r;Q`sc2[eDs8OV.!4)V)!<3$!^$,Mks1JEQ`rNgQ!!'_%!!'=h!,2B4!<7H"s60MXrr<&ts8N)u
+s8N'Srr<'!BE8(s!.=eH!<<'!!<3$!VoJe8rr<'!rr<'!!!*'!!!*&4!6<+[]`8&Gkl=HSs8N'$
+^$,MkrVu`prVm"Z!)3HPq>^Hp"/j0>Vu?Ym!;c]uMuZQPN6D5$!;leH~>
+r;Q`sc2[\A.X^ac!!*$!!<<'!!<6^4s8N(4rr<'!rr<'!rr<'!!!*'!iNdh2!<3$!rVultrr;uu
+#QFc(s%NK@d/O(F!<<*!!$V@B!<<'!:&b1ns8N'!rr<'!rr<'!BE8)4!,)?4s8N'!qZ$Qqs8W*!
+oD\uQ:$K[uRem'a!<<'"!);t_"cQ1?`rMRPrr<&rs*t~>
+r;Q`sc2[\A.X^ac!!*$!!<<'!!<6^4s8N(4rr<'!rr<'!rr<'!!!*'!iNdh2!<3$!rVultrr;uu
+#QFc(s%NK@d/O(F!<<*!!$V@B!<<'!:&b1ns8N'!rr<'!rr<'!BE8)4!,)?4s8N'!qZ$Qqs8W*!
+oD\uQ:$K[uRem'a!<<'"!);t_"cQ1?`rMRPrr<&rs*t~>
+r;Q`sc2[\A.X^ac!!*$!!<<'!!<6^4s8N(4rr<'!rr<'!rr<'!!!*'!iNdh2!<3$!rVultrr;uu
+#QFc(s%NK@d/O(F!<<*!!$V@B!<<'!:&b1ns8N'!rr<'!rr<'!BE8)4!,)?4s8N'!qZ$Qqs8W*!
+oD\uQ:$K[uRem'a!<<'"!);t_"cQ1?`rMRPrr<&rs*t~>
+r;Q`sc2[eDs8OV&!,2B4!<3$!s8N'!rr<'!rr<'!!!*'!!!*'!!!*$!!<:CGRcsePrr<&ts8N)u
+s8N'Krr<'!cqOK?:!in?!<<'!!<3$!s8N'!rr<'!rr<'!!!*'!!!*$!!<<)t!<<*!!;c`q!<<*!
+!<)rp!;ZZp!;c`q!<<*!!<)rp!;?Hm!6kHC!;leH~>
+r;Q`sc2[eDs8OV&!,2B4!<3$!s8N'!rr<'!rr<'!!!*'!!!*'!!!*$!!<:CGRcsePrr<&ts8N)u
+s8N'Krr<'!cqOK?:!in?!<<'!!<3$!s8N'!rr<'!rr<'!!!*'!!!*$!!<<)t!<<*!!;c`q!<<*!
+!<)rp!;ZZp!;c`q!<<*!!<)rp!;?Hm!6kHC!;leH~>
+r;Q`sc2[eDs8OV&!,2B4!<3$!s8N'!rr<'!rr<'!!!*'!!!*'!!!*$!!<:CGRcsePrr<&ts8N)u
+s8N'Krr<'!cqOK?:!in?!<<'!!<3$!s8N'!rr<'!rr<'!!!*'!!!*$!!<<)t!<<*!!;c`q!<<*!
+!<)rp!;ZZp!;c`q!<<*!!<)rp!;?Hm!6kHC!;leH~>
+r;Q`sc2[eDrr;uu./s8Irr<'!rr<'!BE8)4!,2B4!<<'!!<<'!!<3$!rr<'!rr<'!!!)utrrE*!
+"mH#Urr<&us")j$!)<In!<<'!!<3$!s8N'nrr<'!rr<'!!!*'!!!*%4!<<'!BE/&4rr<&qs8N*!
+s8N)frrE*oqZ$Qqs8N*":$hl\!):];!!)orJ,~>
+r;Q`sc2[eDrr;uu./s8Irr<'!rr<'!BE8)4!,2B4!<<'!!<<'!!<3$!rr<'!rr<'!!!)utrrE*!
+"mH#Urr<&us")j$!)<In!<<'!!<3$!s8N'nrr<'!rr<'!!!*'!!!*%4!<<'!BE/&4rr<&qs8N*!
+s8N)frrE*oqZ$Qqs8N*":$hl\!):];!!)orJ,~>
+r;Q`sc2[eDrr;uu./s8Irr<'!rr<'!BE8)4!,2B4!<<'!!<<'!!<3$!rr<'!rr<'!!!)utrrE*!
+"mH#Urr<&us")j$!)<In!<<'!!<3$!s8N'nrr<'!rr<'!!!*'!!!*%4!<<'!BE/&4rr<&qs8N*!
+s8N)frrE*oqZ$Qqs8N*":$hl\!):];!!)orJ,~>
+r;Q`sc2[eDs8OV.!0$pX!<3$!s8N'!s1JEQ`rNgQ!!*'!!!*'!!!*$!!<5anl,Nc(rr<&ts8N*!
+s#?GIg&D$Ps*Oh2n,R/%!!*'!!!*$!!2n0DVuLE1l+I&srr<'!rr<'!]`?*n!5/@4s8N'!rr<&t
+s8N*!s8N)jrs3uPl-KF9rr<&ts8N'$VpGFAoDegj#60&Nl-KF9bl7YCqu;0~>
+r;Q`sc2[eDs8OV.!0$pX!<3$!s8N'!s1JEQ`rNgQ!!*'!!!*'!!!*$!!<5anl,Nc(rr<&ts8N*!
+s#?GIg&D$Ps*Oh2n,R/%!!*'!!!*$!!2n0DVuLE1l+I&srr<'!rr<'!]`?*n!5/@4s8N'!rr<&t
+s8N*!s8N)jrs3uPl-KF9rr<&ts8N'$VpGFAoDegj#60&Nl-KF9bl7YCqu;0~>
+r;Q`sc2[eDs8OV.!0$pX!<3$!s8N'!s1JEQ`rNgQ!!*'!!!*'!!!*$!!<5anl,Nc(rr<&ts8N*!
+s#?GIg&D$Ps*Oh2n,R/%!!*'!!!*$!!2n0DVuLE1l+I&srr<'!rr<'!]`?*n!5/@4s8N'!rr<&t
+s8N*!s8N)jrs3uPl-KF9rr<&ts8N'$VpGFAoDegj#60&Nl-KF9bl7YCqu;0~>
+r;Q`sc2[\A.ZEWl!!*$!!<<'!!<<))9hhqnrr<'!rr<'!rr<'!!!*&G9hhnn!<3$!rVufr3,%"F
+rr<'!n<s=WI-L[X!.=eH!<3$!cqSofs3OJRkl:_`ciAIn!!*'!Z;"'!rr<'!rr<'!!!)utrrE*!
+rrDZj#jI9J!4)Y)!!)utrr<,@!0$LKrr<6&l&5TBZHN7J!;leH~>
+r;Q`sc2[\A.ZEWl!!*$!!<<'!!<<))9hhqnrr<'!rr<'!rr<'!!!*&G9hhnn!<3$!rVufr3,%"F
+rr<'!n<s=WI-L[X!.=eH!<3$!cqSofs3OJRkl:_`ciAIn!!*'!Z;"'!rr<'!rr<'!!!)utrrE*!
+rrDZj#jI9J!4)Y)!!)utrr<,@!0$LKrr<6&l&5TBZHN7J!;leH~>
+r;Q`sc2[\A.ZEWl!!*$!!<<'!!<<))9hhqnrr<'!rr<'!rr<'!!!*&G9hhnn!<3$!rVufr3,%"F
+rr<'!n<s=WI-L[X!.=eH!<3$!cqSofs3OJRkl:_`ciAIn!!*'!Z;"'!rr<'!rr<'!!!)utrrE*!
+rrDZj#jI9J!4)Y)!!)utrr<,@!0$LKrr<6&l&5TBZHN7J!;leH~>
+r;Q`sJcFU,!U4:WrrM@trVultZ2Xe(qu;0~>
+r;Q`sJcFU,!U4:WrrM@trVultZ2Xe(qu;0~>
+r;Q`sJcFU,!U4:WrrM@trVultZ2Xe(qu;0~>
+r;Q`sJcFU,!K?!srrJ);rVultZ2Xe(qu;0~>
+r;Q`sJcFU,!K?!srrJ);rVultZ2Xe(qu;0~>
+r;Q`sJcFU,!K?!srrJ);rVultZ2Xe(qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`soD\djrr;rtJcC<$qYpNqqu;0~>
+r;Q`soD\djrr;rtJcC<$qYpNqqu;0~>
+r;Q`soD\djrr;rtJcC<$qYpNqqu;0~>
+r;Q`so`+pks8N'!rr2ruJcC<$qu6Wrqu;0~>
+r;Q`so`+pks8N'!rr2ruJcC<$qu6Wrqu;0~>
+r;Q`so`+pks8N'!rr2ruJcC<$qu6Wrqu;0~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s82fr!;leH~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s82fr!;leH~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s82fr!;leH~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s82fr!;leH~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s82fr!;leH~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s82fr!;leH~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ)1tO+@'+!!)orJ,~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ)1tO+@'+!!)orJ,~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ)1tO+@'+!!)orJ,~>
+r;Q`spAb$j!WN0!rr<&orr<%M^lH21JGK3F!;leH~>
+r;Q`spAb$j!WN0!rr<&orr<%M^lH21JGK3F!;leH~>
+r;Q`spAb$j!WN0!rr<&orr<%M^lH21JGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^lH21JGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^lH21JGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^lH21JGK3F!;leH~>
+r;Q`soD\djrr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYJ\[;]!.anF!!)orJ,~>
+r;Q`sir8uYS\XjtJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\XjtJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\XjtJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<oS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`spAY*mrr3'#s8N)lrr<%i^]4B.R/d5<_#M1MJGK3F!;leH~>
+r;Q`spAY*mrr3'#s8N)lrr<%i^]4B.R/d5<_#M1MJGK3F!;leH~>
+r;Q`spAY*mrr3'#s8N)lrr<%i^]4B.rr<%M_#M1MJGK3F!;leH~>
+r;Q`so)AakrrD]k!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrD]k!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrD]k!!&S*!!)`m!!%Scs1eVbq>UEpqu;0~>
+r;Q`so`+pks8W#tp\t3nS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`so`+pks8W#tp\t3nS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`so`+pks8W#tp\t3nS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`squ?NnT>1F,p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`squ?NnT>1F,p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`squ?NnT>1F,pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`sq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`sq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`sq#:<oS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!&S*!!)`m!!%Scs1eVbq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!&S*!!)`m!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!&S*!!)`m!!%Scs1eVbq>UEpqu;0~>
+r;Q`so`+pks8N'!rr2ruq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<oS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`so)AakrrE&u!!)orqZ*8(!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ*8(!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ*8(!!)`m!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!&S*!!)`m!!%Scs1eVbq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!&S*!!)`m!!%Scs1eVbq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<oS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`spAY*mrr3'#s8N)lrr<%i^]4B.R/d5<_#M1MJGK3F!;leH~>
+r;Q`spAY*mrr3'#s8N)lrr<%i^]4B.R/d5<_#M1MJGK3F!;leH~>
+r;Q`spAY*mrr3'#s8N)lrr<%i^]4B.rr<%M_#M1MJGK3F!;leH~>
+r;Q`so)AakrrD]k!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrD]k!!&S*!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrD]k!!&S*!!)`m!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)A^js8;rlrr<%i^]4B.R/d5<_#M1MJGK3F!;leH~>
+r;Q`so)A^js8;rlrr<%i^]4B.R/d5<_#M1MJGK3F!;leH~>
+r;Q`so)A^js8;rlrr<%i^]4B.rr<%M_#M1MJGK3F!;leH~>
+r;Q`soD\djqu6Wrqu?NnT>1F,p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`soD\djqu6Wrqu?NnT>1F,p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`soD\djqu6Wrqu?NnT>1F,pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`so`"mkqYpNqq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`so`"mkqYpNqq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`so`"mkqYpNqq#:<oS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uYS\P4*pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YO.>n%\o'p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YO.>n%\o'p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YO.>n%\o'pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]YFLIopGd[nA##(p6bm\J\_<$!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]YFLIp&>!lnA##(pAY*mJ\_<$!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'[I!!)\[!!)N(!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'[I!!)\[!!)N(!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'[I!!)]l!!)N(!!)`m!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'[I!!)\[!!)N(!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'[I!!)\[!!)N(!!)_\!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'[I!!)]l!!)N(!!)`m!!%Scs1eVbq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ+@G!!)\[!!)N(!!)_\!!)K'o`1Pu!.anF!!)orJ,~>
+r;Q`so)AakrrE&u!!)orqZ+@G!!)\[!!)N(!!)_\!!)K'o`1Pu!.anF!!)orJ,~>
+r;Q`so)AakrrE&u!!)orqZ+@G!!)]l!!)N(!!)`m!!)K'o`1Pu!.anF!!)orJ,~>
+r;Q`soD\mms8N)urr<&orr<&3^]4B-R/d6V^]4B.R/d6V^]4B.R/d5X^]8o\rr<&rs*t~>
+r;Q`soD\mms8N)urr<&orr<&3^]4B-R/d6V^]4B.R/d6V^]4B.R/d5X^]8o\rr<&rs*t~>
+r;Q`soD\mms8N)urr<&orr<&3^]4B-rr<&g^]4B.rr<&g^]4B.rr<%i^]8o\rr<&rs*t~>
+r;Q`so`"mkrr2rurr2ruq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<o]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sp&>!lrVlitrr2ruq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sp&>!lrVlitrr2ruq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sp&>!lrVlitrr2ruq#:<o]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`spAb$js8W&up\t3n]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`spAb$js8W&up\t3n]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`spAb$js8W&up\t3n]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVufrq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVufrq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVufrq#:<o]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sp&G$lrVlitp&>!l]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sp&G$lrVlitp&>!l]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sp&G$lrVlitp&>!l]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`spAY0orrE&u!!)Zk!!'[I!!)\[!!)N(!!)_\!!)N(!!)_\!!&S*!.anF!!)orJ,~>
+r;Q`spAY0orrE&u!!)Zk!!'[I!!)\[!!)N(!!)_\!!)N(!!)_\!!&S*!.anF!!)orJ,~>
+r;Q`spAY0orrE&u!!)Zk!!'[I!!)]l!!)N(!!)`m!!)N(!!)`m!!&S*!.anF!!)orJ,~>
+r;Q`so`"mkrr;osp\t3n]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr;osp\t3n]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr;osp\t3n]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqqu?Nn^;'^KopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqqu?Nn^;'^KopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqqu?Nn^;'^Kp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqq#:<o]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<o]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3n]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3n]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3n]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uY]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3n]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3n]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3n]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sp&G$lrr2rurr2ruq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sp&G$lrr2rurr2ruq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sp&G$lrr2rurr2ruq#:<o]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!'[I!!)\[!!)N(!!)_\!!)N(!!)_\!!&S*!.anF!!)orJ,~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!'[I!!)\[!!)N(!!)_\!!)N(!!)_\!!&S*!.anF!!)orJ,~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!'[I!!)]l!!)N(!!)`m!!)N(!!)`m!!&S*!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<o]YFLIopGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<o]YFLIp&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruqu?Nngq`R_n%\o'opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruqu?Nngq`R_n%\o'opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruqu?Nngq`R_n%\o'p&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\n%ePq]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\n%ePq]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mn%ePq]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sn,N=dq#:<og;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,N=dq#:<og;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,N=dq#:<og;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`sn,E@fp&>!lg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,E@fp&>!lg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,E@fp&>!lg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`snG`Igo`"mkg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`snG`Igo`"mkg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`snG`Igo`"mkg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`snGiFep\t3ng;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`snGiFep\t3ng;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`snGiFep\t3ng;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cqu?NngqWmip6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cqu?NngqWmip6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cqu?NngqWmipAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cq#:<og;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cq#:<og;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cq#:<og;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`snG`Igrr2ruq#:<og;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<og;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<og;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMt
+q>UEpqu;0~>
+r;Q`sn,N@ep\t3ng;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,N@ep\t3ng;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,N@ep\t3ng;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gpAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYq7uS%nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sir8uYq7uS%nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sir8uYq7uS%nA##(pAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(pAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(pAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(pAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(pAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(pAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(pAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(pAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l]YFMt
+q>UEpqu;0~>
+r;Q`sn,N@ep\t3nq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[
+]YFMtq>UEpqu;0~>
+r;Q`sn,N@ep\t3nq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[
+]YFMtq>UEpqu;0~>
+r;Q`sn,N@ep\t3nq7lt1p&>!lnA##(pAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!l
+]YFMtq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(
+opGd[]YFMtq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[nA##(p6bm\nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(
+opGd[]YFMtq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1p&>!lnA##(pAY*mnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(
+p&>!l]YFMtq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q7lt1p6bm\
+q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1jM1`qj1kWpq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q7lt1p6bm\
+q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1jM1`qj1kWpq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1p&>!lq7lt1q7lt1pAY*mq7lt1q7lt1p&>!lq7lt1q7lt1pAY*m
+q7lt1q7lt1pAY*mq7lt1q7lt1p&>!lq7lt1jM1`qj1kWpq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q7lt1p6bm\
+q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1jM1`qj1kWpq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q7lt1p6bm\
+q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1jM1`qj1kWpq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1p&>!lq7lt1q7lt1pAY*mq7lt1q7lt1p&>!lq7lt1q7lt1pAY*m
+q7lt1q7lt1pAY*mq7lt1q7lt1p&>!lq7lt1jM1`qj1kWpq>UEpqu;0~>
+r;Q`snG`Igrr2ruqu;3IM#dAO!!)orJ,~>
+r;Q`snG`Igrr2ruqu;3IM#dAO!!)orJ,~>
+r;Q`snG`Igrr2ruqu;3IM#dAO!!)orJ,~>
+r;Q`snG`Igrr2ruq#:<oj8T)ZjSo2[j8T)ZjSo2[jSo2[j8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)ZjSo2[j8T)ZjSo2[jSo2[j8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)ZjSo2[j8T)ZjSo2[jSo2[j8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)ZjSo2[j8T)ZjSo2[jSo2[j8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)ZjSo2[j8T)ZjSo2[jSo2[j8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)ZjSo2[j8T)ZjSo2[jSo2[j8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sn,N@ep\t3nj8T)ZjSo2[j8T)ZjSo2[jSo2[j8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sn,N@ep\t3nj8T)ZjSo2[j8T)ZjSo2[jSo2[j8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sn,N@ep\t3nj8T)ZjSo2[j8T)ZjSo2[jSo2[j8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sec5UKjSo2[jT#2Zk5YD\jSo2[k5YA[k5YD\bPqPBqu;0~>
+r;Q`sec5UKjSo2[jT#2Zk5YD\jSo2[k5YA[k5YD\bPqPBqu;0~>
+r;Q`sec5UKjSo2[jT#2Zk5YD\jSo2[k5YA[k5YD\bPqPBqu;0~>
+r;Q`sf)G^Mrr2ruk5YG]jo5;\rr2rukl1V_rr2ruk5YG]k5PD]jSo2[rr2rubl7YCqu;0~>
+r;Q`sf)G^Mrr2ruk5YG]jo5;\rr2rukl1V_rr2ruk5YG]k5PD]jSo2[rr2rubl7YCqu;0~>
+r;Q`sf)G^Mrr2ruk5YG]jo5;\rr2rukl1V_rr2ruk5YG]k5PD]jSo2[rr2rubl7YCqu;0~>
+r;Q`sf)G^Mrr2rukPkS`rrD$X!!)*[!!)3^!W`6#kPkM^j8T)ZaSu5?qu;0~>
+r;Q`sf)G^Mrr2rukPkS`rrD$X!!)*[!!)3^!W`6#kPkM^j8T)ZaSu5?qu;0~>
+r;Q`sf)G^Mrr2rukPkS`rrD$X!!)*[!!)3^!W`6#kPkM^j8T)ZaSu5?qu;0~>
+r;Q`sf)G^Mrr2rujo5;\iVrlXk5YG]k5PJ_rrD6^r;c![r;b%@!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\iVrlXk5YG]k5PJ_rrD6^r;c![r;b%@!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\iVrlXk5YG]k5PJ_rrD6^r;c![r;b%@!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\ir8uYj8T)Zkl1_bs8N)Zrr<&^rr<&urr<&Crr<&rs*t~>
+r;Q`sf)G^Mrr2rujo5;\ir8uYj8T)Zkl1_bs8N)Zrr<&^rr<&urr<&Crr<&rs*t~>
+r;Q`sf)G^Mrr2rujo5;\ir8uYj8T)Zkl1_bs8N)Zrr<&^rr<&urr<&Crr<&rs*t~>
+r;Q`sf)G^Mrr2rujo5;\j8T)Zir8uYkl:P\jSo2[kPkM^rr2rubl7YCqu;0~>
+r;Q`sf)G^Mrr2rujo5;\j8T)Zir8uYkl:P\jSo2[kPkM^rr2rubl7YCqu;0~>
+r;Q`sf)G^Mrr2rujo5;\j8T)Zir8uYkl:P\jSo2[kPkM^rr2rubl7YCqu;0~>
+r;Q`sf)G^Mrr2rujo5;\jSo2[jo5;\rr2rujo5;\kPkM^rr2rukPkM^rr2rubl7YCqu;0~>
+r;Q`sf)G^Mrr2rujo5;\jSo2[jo5;\rr2rujo5;\kPkM^rr2rukPkM^rr2rubl7YCqu;0~>
+r;Q`sf)G^Mrr2rujo5;\jSo2[jo5;\rr2rujo5;\kPkM^rr2rukPkM^rr2rubl7YCqu;0~>
+r;Q`sec5UKjSo2[jo>5YkPtM]jSo2[k5YD\jo>;[bPqPBqu;0~>
+r;Q`sec5UKjSo2[jo>5YkPtM]jSo2[k5YD\jo>;[bPqPBqu;0~>
+r;Q`sec5UKjSo2[jo>5YkPtM]jSo2[k5YD\jo>;[bPqPBqu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;Q`sJcC<$jo5;\qu;0~>
+r;V<JJH4^1qu;0~>
+r;V<JJH4^1qu;0~>
+r;V<JJH4^1qu;0~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+JcC<$f`-I~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/cauchy-fig.ps b/docsrc/nyquist/cauchy-fig.ps
new file mode 100644
index 0000000..3540ca6
--- /dev/null
+++ b/docsrc/nyquist/cauchy-fig.ps
@@ -0,0 +1,68 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: cauchy-fig.ps
+%%CreationDate: Wed Jul 13 12:15:04 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 176 translate
+-40 760 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2672 ASCII Bytes
+image
+nG`Lfn,MnW!<2HenG`Lfn,MnW!WIT<s7$$hpcn9JnG`Ochsg[8rrMiNnGi"X!UfFGs7$$hmVhUp
+nG`OGp[J4Rrr`#nhY6O>o)AgXqnDgos760llhS9lnGi(Z"7,f447N:@rr_T`If&X7o)Agd\UOMH
+s7--hrW)ods7--grp]sXs8W&uIdmC-s8N#es7-*jrVlfcs7-*krVlhHnc/.Z"9&6!J+<R/rr`/t
+It."gnc&^grr7K<s7-*kqu6W1nc/.Z"8Dfp^[_?orr`#ps1e+(nc&^crdWhqs7-*kn,E@Enc/.Z
+"7Q6hhspa:rr_`hs53AHnc&^[rr;HWs7-*khu8,onc/.Z"5j+Xn+$GKrri)Krr;HWs760mleDF=
+p[S:SrrhYurr;`_s760mlb<?_p[S:SrrhZ!rr;`_s760mpV$S+qsj^Vrr[cMs82?dnc&]@rr;lc
+s7-*kJ,Xrpnc/.Z"+U=MrUKpYrri?$rr;res760mrr;utrUKpYrri?$rr;res760mrr;tIrpg$Z
+rri<#rr;ufs760mrVulsrpg$ZrrrB$rr<"Jo)J:\"o\K#s8RT>s760nqu?YFs*sV>o)Amjs8N&u
+J+EX1rrr<"rr<#5o)J:\"oJ?!s8Tk)s760np](6ms1e.)o)Amfs8INJ^[hEqrrr/srr<#Uo)J:\
+"o&#qs8V!Is760nlhpb^s53DIo)AmZqYpNpht$g<rrq``IR!l$o)J:\"mc0es8VQYs760nf=ZS4
+s6oOYo)AmNs8N&un+-MLrrq<[rr<#mo)J:\"lK@ZJ,f96s760n^]4<5s7c*ao)Am.s8N&uqssdX
+rrp1;rr<#qo)J:\"i(*:s8Vues760nJ,fLts8DNgo)AlCs8N&urUU!ZrrmoPrr<#so)J=]#6+Z&
+rr<#to)J=]#6+Z&rr<#to)J=]#Q=]&rdXtJJ+N^3rr`6"s8N#t!.XV?oD\pks8W)trr@Q?s7?6m
+qu?]qrr2u5oDeF^"8i,urr2ot^[qKsrs/H$s8INJs1e1*oDejb!WE#srrCsJs7?6mpZq\Trr2uU
+oDeF^"7PRTrr2otht-m>rs/#YrVf%]s6oRZoD\p]li-n_rrDNZs7?6mhtO\\rr2ueoDeF^"5j.Y
+rr2otp[eFVrr_0Ys8N#t!;H*boD]'1s8W(Js8Vufs7?6m^]4?5rr2uqoDeF^"2Fm9rr2otqt'jZ
+rr[cNs8N#t!<)NhoD\oBs8W)trrE#hs7H<krr2p#rdXtJrU^']rrE&trrE&trrE&is7H<krr2ot
+rr2otrq$0^rrE#srrE&trrE&is7H<krVlfsrr)isJ+Wd5rrDrqrrE&srr@Q@s7H<kqu6TrrdXqI
+!5J1+o`"pcrr2utrVll4o`+R`!;HKm!<2rs!5J1+o`"p[rr2utrVllTo`+R`!:Tpe!<2rs!8mGK
+o`"pKrr3#uJ,]HJn+?YPrrCsUrrE&srrDN[s7H<o^]4',rr)isp[nLXrrg+:lh^VZrrDfcs7H<o
+J,ej5rr)isqt0p\rrmoPli$fIrr2uqo`+Ua"oeQ%lhg\[rrE#is7QBqrr<#m\GlI,!<2Wjp&>$j
+rVllsrVllso`+Ua!<)lr!<2or!.X\Ap&>$hrVlotJ,TBI^\.X"rrDrprrE&rrrBh,s7QBlp\k*l
+rqucrht@$BrrDNdrrE&rrrDN\s7QBlhu3QTrqucrn+H_RrrBh4rrN+KrVlllp&F^b!5JL4!<2or
+!;lHhp&>#ArVllsr;Qcqp&Fac!<2or!<2or!<)TjpAY-kr;Qcrr;Qcrp&Fac!;l]o!WITHrr@QB
+s7ZHmp\b$krql]q^\7^$rrDNcrrE&qrrCsMs7ZHmn,31crql]qn+QeTrrCsSrrE&qrrDfes7ZHm
+^\n*4rdXkG!;Z?gpAY,Br;Qcrqu6ZqpAame!;ufq!r)NiqYpPFp](!f!;l`p!pfgaqYpPfp](!f
+!;HHl!pfgaqYpQap](!f!:Tmd"7,pb5PtH\p\4^^rrA\irrVNbrqcWpq=jparrN+KrVlrnY^ZHK
+!WITDs7lToq>1*krqZQoTD8H]rrD6YrrE&orrD6Ws7lToTDJQgrdXeE!;lQkq>UKpJ,90FrqZQo
+r:p<frrDljrrE&nrr>:Zs7uZpa8,`8rqQKnch[V:rr>:ZrrE&nrrDTbs8)`qq"XjirdXbD!WITF
+s8)`qa8#Z7rqHEmO8AnRrrN$^q#:?np\t6_qZ$Hm!/(%G!<2]l!!E,ur;QfeJ+rsCrq??mr#bk:
+rVlor&,-#(rdXYA!9!eTrVlkMp&>$ko`"mnrVuls!T8J#rrE&jrrN$.rr<#u!T5'lrrE&irr_a$
+s8N0#p`K,-!<2Qh!q8GSnG`OgJ+3L-rrE&es7$$grpTmcrrE&qrrDNcrrE&qrrDNcrrE&rs!.R@
+s53hUp]&#,s6ou;qu>RQs7cQ.rVu?dJ,B9'rr;`m^]+<5hZ*ZVnG`Lfn,MnW!<2HenG`Lfn,MnW
+!<2Heh>dEQ!5JI3!;H0d!8m_S!<2orr;Qa]r;Qc_p&>#qr;Qcpr;Z`q!WKk3rrDfdrrCsSrrDon
+s8Dru`ZP0Z!W707rrCsSrrMnErVufq!5JI3!:TU\!5JI3!<2orr;Qa=r;QcWp&>#Qr;QfqJ,TE'
+s*t~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/envfig.ps b/docsrc/nyquist/envfig.ps
new file mode 100644
index 0000000..842ce33
--- /dev/null
+++ b/docsrc/nyquist/envfig.ps
@@ -0,0 +1,198 @@
+%!PS-Adobe-2.0
+%%Title: env-Layer#1
+%%Creator: MacDraw II 1.1v2
+%%CreationDate: Friday, July 19, 1991
+%%Pages: (atend)
+%%BoundingBox: ? ? ? ?
+%%PageBoundingBox: 125 130 2425 3170
+%%For: '
+%%IncludeProcSet: "(AppleDict md)" 68 0
+%%EndComments
+%%EndProlog
+%%BeginDocumentSetup
+md begin
+
+T T -130 -125 3170 2425 100 300 300 1 F F F F T T T psu
+(' ; document: env-Layer#1)jn
+0 mf
+od
+%%EndDocumentSetup
+%%Page: ? 1
+op
+0 0 xl
+1 1 pen
+0 0 gm
+(nc 0 0 3040 2300 6 rc)kp
+0 setlinecap
+currentscreen
+3 1 roll pop pop 60 45 3 -1 roll setscreen
+4 4 pen
+73 36 gm
+411 36 lin
+411 1161 lin
+2 setlinecap
+0 0 pen
+113 225 gm
+113 225 lin
+nc ct 39 0 put
+8 8 pen
+413 38 gm
+bp
+113 225 F qi
+113 225 qc
+263 338 qc
+263 338 qc
+300 975 qc
+300 975 qc
+413 1125 qc
+413 1125 F qq
+ef
+9 ec
+(nc 0 0 3040 2300 6 rc)kp
+0 setlinecap
+523 114 gm
+1 setTxMode
+0 fs
+bu fc
+{}mark T /Times-Roman /|______Times-Roman 0 rf
+bn
+42 fz
+bu fc
+2 F /|______Times-Roman fnt
+bn
+(t1)show
+523 264 gm
+(t2)show
+523 1051 gm
+(t4)show
+4 4 pen
+411 223 gm
+0 gr
+486 223 lin
+411 36 gm
+598 36 lin
+411 336 gm
+486 336 lin
+411 973 gm
+486 973 lin
+411 1123 gm
+598 1123 lin
+111 186 gm
+111 223 lin
+111 114 gm
+1 setTxMode
+(L1)show
+261 336 gm
+0 gr
+261 298 lin
+261 226 gm
+1 setTxMode
+(L2)show
+298 973 gm
+0 gr
+298 1011 lin
+298 1051 gm
+1 setTxMode
+(L3)show
+450 38 gm
+0 gr
+pr
+450 38 pl
+433 79 pl
+450 79 pl
+467 79 pl
+450 38 pl
+1 ep
+450 225 gm
+pr
+450 225 pl
+467 183 pl
+450 183 pl
+433 183 pl
+450 225 pl
+1 ep
+448 77 gm
+448 181 lin
+450 225 gm
+pr
+450 225 pl
+433 267 pl
+450 267 pl
+467 267 pl
+450 225 pl
+1 ep
+450 338 gm
+pr
+450 338 pl
+467 296 pl
+450 296 pl
+433 296 pl
+450 338 pl
+1 ep
+448 265 gm
+448 294 lin
+450 975 gm
+pr
+450 975 pl
+433 1017 pl
+450 1017 pl
+467 1017 pl
+450 975 pl
+1 ep
+450 1125 gm
+pr
+450 1125 pl
+467 1083 pl
+450 1083 pl
+433 1083 pl
+450 1125 pl
+1 ep
+448 1015 gm
+448 1081 lin
+563 38 gm
+pr
+563 38 pl
+545 79 pl
+563 79 pl
+580 79 pl
+563 38 pl
+1 ep
+563 1125 gm
+pr
+563 1125 pl
+580 1083 pl
+563 1083 pl
+545 1083 pl
+563 1125 pl
+1 ep
+561 77 gm
+561 1081 lin
+601 526 gm
+1 setTxMode
+(dur)show
+44 114 gm
+1 fs
+bu fc
+{}mark T /Courier-Bold /|______Courier-Bold 0 rf
+bn
+50 fz
+bu fc
+2 F /|______Courier-Bold fnt
+bn
+(\(env )show
+0 fs
+bu fc
+2 F /|______Times-Roman fnt
+bn
+(t1 t2 t4 l1 l2 l3 dur)show
+1 fs
+bu fc
+2 F /|______Courier-Bold fnt
+bn
+(\))show
+F T cp
+%%Trailer
+cd
+end
+%%Pages: 1 0
+%%EOF
diff --git a/docsrc/nyquist/exponential-fig.ps b/docsrc/nyquist/exponential-fig.ps
new file mode 100644
index 0000000..241da50
--- /dev/null
+++ b/docsrc/nyquist/exponential-fig.ps
@@ -0,0 +1,60 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: exponential-fig.ps
+%%CreationDate: Wed Jul 13 12:15:23 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 176 translate
+-40 760 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2136 ASCII Bytes
+image
+s8N)ri;WlYq>9+M!rr5ri;WlYrVPOQ!rr5oi;WlYrVPOQ!rqb8i;`iW!;YRQs8N)pi;`iW!;bXR
+s8N)qi;`iW!;bXRs8N,qJ)UG-rrN"HiW&rX!W.B*s8W*"qnM+is8N,s^Z#4mrrN#3iW&rX!W1d5
+s8W*"qqpB4s8N,qn)=<HrrN#ciW&rX!W2?Es8W*"qtK(Ls8N,spYl/PrrN#kiW&rXs81dTs8W,r
+iW&rX!VuWOs8W*"qu,LRs8N,srSdeVrrN#qiW&rX!W2lTrr_0Qqu5RS"0_%fro*k[YP7qoJ)^J2
+YNtu`J)^J2YNu)c^Z,7rhY6pI^Z,:nrrW)thr=\9rrW)thr=\9rrW)tn)FBIrrW)tn)FBIrrW)t
+pYu5QrrW#rpYu5QrrW)tqr7YUrrW)tqr7YUrrW)tqr7YUrrW)trSmkWrrW)trSmkWrrW)tro3tX
+rrW)tro3tXrr`)ss*s)/s8N2us8RT/s8W*$qu?]2j8]/Z"8i,u^Z5@orr`/us52l:s8N2us8V!:
+s8W*$qu?]bj8]/Z"8i,un)OHJrr`)ss7bRRs8N2us8ViRs8W*$qu?]nj8]/Z"8i,uqr@_Vrr`/u
+s8D!X"lJqKs8W&XrroUpqu?]qj8T:dkPP;Zro="[YNtu_rr@Q0rrTCiqu6TqJ)pV2hWOe8rrBgp
+s8W*!qu6TqhrOh;rrDrqrrCs;s8W*!qu6Tqn)XNKrrDrqrrDNKs8W*!qu6TqpZ2ASrrDlorrDfS
+s8W*!qu6TqqrIeWrrDrqrrDrWs8W*!qu6TqrT+"YrrDrqrrE&Zs8W*!qu6TqroF+ZrrDrprr@Q1
+s8W*!qu-Np^ZGLqrrDlnrrCs<s8W*!qu-NphrXn<rrDrprrDNLs8W*!qu-NppZ;GTrrDrprrDfT
+s8W*!qu-NpqrRkXrrDrprrE#Zs8W*!q>L<nroO1[rrDrprrE&[s8W*!qu$HoJ*-e2rrDrorrBgr
+s8W*!qu$Hohraq?hu!<KrrCs=rrTCqqu$Hon)jWOYNu)`rrDfUrrTC_q#(-lqr[n[YP\4prrDrY
+rrV'Iqu$HorT=.[rrDrorrE&\s8W*!qtpBnJ*6k3rrDrnrrBgss8W*!qtpBn^ZYXsrrDrnrrCs>
+s8W*!q>:0ln)s`NrrDrnrrDfVs8W*!qtpBnqre"ZrrDrnrrE#\s8W*!qtpBnroa=]rrDrmrr>:I
+s8W*!qtg<mhrt+?rrDrmrrDNOs8W*!q>1*kpZVYWrrDrmrrDr[s8W*!qtg<mrTO:]rrDrmrrE&^
+s8W*!qt^6l5O&4JrrDrlrrCs@s8W*!qt^6ln*0lPrrDrlrrDfXs8W*!q>($jqs".\rrDrlrrDu]
+s8W*!qtU0kJ*R(6rrDrkrrBh!s8W*!qtU0kcg(N3htR$CrrDfYrrTCiqtU0kq<It]YP7qhrrN+K
+li.$ip\=L_!5Ik"!jD(ip\t6>li.%Cj88TN!;GgZs8N)rp\t6hli7"b!;lNj!WIT8s8W*!qtC$i
+^[2"#rrDrirrCC3s8W*!qtC$ioBcMWrrDlgrrDu`s8W*!qt9sh+79+.rrDrhrrD6Ls8W*!qt9sh
+q!J+]rrDrgrr=//s8W*!qt0mgj6lsIrrDrgrrDubs8W*!qt'gf+7K70rrDldrrD*Js8W*!qt'gg
+r'0]Ns8N)ro)A^1nGiOg!;l?e!Vh07s8W*!qsj[dJard?rrDrdrrN*0o)Jai!;l9c!Ur>Fs8W*!
+qsXOb_=R^,rrDl`rrN*(o`+sk!;l3a!Vcoms8W*!qsFCap]1$fs8N)rli-tc5PY9YrrDr]rrKn?
+q>^Kp!;l$\!VcZks8W*!qtpBn^\n*3qtpBnJ,K<Hp\b'nJ,b#uruq:=s53SLs1e%"s*rr'rr9b-
+rVqB9qu6WQp\t3-mskCf!WW/W!!!'"rrDrSs8W*!qr%MSrrDrSs8W*!qr%M1s7uZqrdXkG!;HEk
+!<2lq!;HEk!W7HBrr@QHrrDB_rrN(Jr;Qc[r;Qfrs7lToJ,K<Hp\XsjJ,K<HfDPXLr;ZQl!.XqH
+!;HEk!<2lq!5n^6!.XeD!.XqH!:Tgb!.XqH!;HEk!W@NDrrN$>r;QcWr;Qcpqu6ZVr;Qfss5!^*~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/gamma-fig.ps b/docsrc/nyquist/gamma-fig.ps
new file mode 100644
index 0000000..d4fed9d
--- /dev/null
+++ b/docsrc/nyquist/gamma-fig.ps
@@ -0,0 +1,71 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: gamma-fig.ps
+%%CreationDate: Wed Jul 13 12:15:43 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 176 translate
+-40 760 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2956 ASCII Bytes
+image
+h>c=2rr2ueiW&oW!:SnHrr2ueiW&oW!:Ta`!;u-^rr2ueq>UK3#ODEhrrDN`rrKn1li6ta!9a4Y
+"9*fLJ*d47rrDNarr`6"s1dq#rr2ueqYpZps8V!Cs8N#un,!%dp](9^m/R(b!:Tda"7Q9ip[%qZ
+rrDNarr_0Ys820_rr2ueqYpZ4s8W&as8N#ukPG2\^]4?5m/R(b!:Tda!.Y"J!.XD9rr2uequ6Zq
+rVll4mJm1c!:Tgb!<)lr!8m2D"93l.n,*+brVc`rn*U,WrkGZ*qu6ZnrVlllmJd:f^YeMWrrDfl
+rrDr`rr`88hrjn:!;HHl!;l0`"9-'Mn,*+bn,<7drU'Ues*Kgqqu6ZbrVllsmJm1c!:Tgb!8m_S
+!.XG:rr2uequ6ZRr;QbHmf3:d!:Tgb!5JI3!5It%rr2uequ6Z2r;QcSmf3:d!9a7Z!.XqH!:T@U
+rr2uequ6YGr;Qckmf3:d!:Tgb!.XqH!;Gp]rr2uer;Qcrqu6Znmf3:d!:Tjc!<2lq!<)?crr2ue
+r;Qcqqu6Zqmf3:d!:Tjc!<)fp!<2Edrr2u]r;QcqqYpPFn,NCe!:Tjc!;lWm!.XJ;rr2uer;Qco
+qYpQ1n,NCe!:Tjc!;lWm!8m8Frr2uer;QckqYpQQn,NCe!:Tjc!;H?i!:TCVrr2uer;QccqYpQi
+n,NCe!9a:[!:Tda!;Gs^rr2uer;QccqYpQmn,NCe!:Tjc!8mYQ!;l6brr2uer;QcSqYpQon,NCe
+!:Tjc!5JC1!<2Herr2uer;Qc3qYpQpn,NCe!:Tjc!5J@0!.XM<rr2u]r;QbHq>UH0nGiLf!:Tjc
+!.XhE!5J%'rr2uer;QbHq>UHPnGiLf!:Tmd!<2cn!8m;G"5i8`n,<7drqQKnn*p>ZYP3P8rVllr
+q#:?gnG`TopHS-FrrE#mrrDf_rr]J!hrjt<!<)]m!;l9c"0_H+n,<7dqtU0krUBghhSHtqrVllp
+q#:?mnGiLf!:Tmd!;lQk!<2Kfrr2uerVlllq#:?nnGiLf!:Tmd!;H6f!.XP=rr2uerVlllp\t6.
+nc/Ug!9a=\!;H6f!5J((rr2uerVlldp\t6Nnc/Ug!:Tmd!:T[^!:TIXrr2uerVlldp\t6^nc/Ug
+!:Tmd!:T[^!;H$`rr2uerVllTp\t6jnc/Ug!:Tmd!8mPN!;l<drr2u]rVllTp\t6lnc/Ug!:Tmd
+!5J:.!<2Ngrr2uerVll4p\t6mnc/Ug!:Tmd!5J7-!.XS>rr2uerVll4pAY--o)J^h!:Tmd!.X_B
+!8mAIrr2uerVlkIpAY-Mo)J^h!9a=\!.X_B!:TLYrr2uerVlkIpAY-eo)J^h!:Tpe!<2Zk!;H'a
+rr2uerr2utp&>$ho)J^h!:Tpe!<2Zk!<)Kgrr2uerr2utp&>$ko)J^h!9a@]!<)Tj!<2Qhrr2ue
+rr2uso`"o@oDegi!:Tpe!<)Qi!5J.*rr2uerr2uqo`"pKoD\pmJ"Q3/rrDrgrrCsJrr`88hs^RE
+!;lEg!:TOZ"9-'mn,E=eqt0mgp[eCerkI@Rrr2umo`"pgoD\pl^YeMZrrDfcrrDrfrr`:J#OhZl
+!;H-c!<)Nhrr2uerr2umo`"pjoDegi!:Tpe!:TOZ!.XY@rr2uerr2ueoD\g*o`+pj!:Tpe!:TOZ
+!5J1+rr2u]rr2uUoD\gJo`+pj!:Tpe!8mDJ!:TR[rr2uerr2uUoD\gbo`+pj!:Tpe!5J.*!;H-c
+rr2uerr2u5oD\gfo`+pj!:Tpe!5J.*!<)Qirr2uerr2tJoD\gio`+pj!9a@]!.XS>!.X\Arr2ue
+rr2tJo)A]>p&G$k!:Tpe!.XS>!5J4,rr3)hs8W)grrCsLs8N$#n,NFenc&UXp&G$k"7Q9irpg!g
+p\"Rcrr_`is8DKf!;lHhrr3)`s8W&frrE#js8N$#n,NFdnc&XhJ+ipArr_`is82<c!5J7-rr3)h
+s8VucrrCsMs8N$#n,NFbnG`LWpAb-l"7Q9ip[J1_p\+Xdrr_`is7c$_!;lKirr3)`s8Vi_rrE#k
+s8N$#n,NFVnG`LfpAb-l"7Q9in*g8VJ+s!Brr_`is6oFV!2'#c#2f.sn,NFVn,ECVp\tH$l[SC'
+s53;F!;H6f#-[>Wn,NFFn,ECbp\tH$legn*s53;F!<)Zl#-[?"n,NF&n,ECep\tHSpV61ss1e"%
+!'g8Yrr3)hs8Tk%rrCsOs8N$#n,NE;mf*:Uq#C?n"7Q9iJ+!=:oD&@brr_`is*sJ:!<)]mrr3&_
+s8MEc!<2cnrr3&gs8MBb!'g;Zrr3&gs8MBb!8mVPrr3&gs8D<a!9a1Xrr3&gs8D<a!;ZHjrr3&g
+s8D<a!WITFs8N$"n,N:NrrA\fs8N$"kPtGFrrD6Ys8N$"n,N:NrrDlks8N$"n,N.JrrN+Kqu?Zq
+!q60`lMgjFqu?Zq!q60`lMgkUqu?Zq!q60XlMgn_J,K?GrrVZhn*0iPTD\`grrVB`hs(.@j8ArV
+rrVZhhs(.@r;?TorrVZh^Zb[t+8u6=rrVZh^Zb[tiVifUrrVZhJ*?n5rZD.>rr3&gs*s53!9*qW
+rr3#froX4_rWiK'rr3#^roO.]pcnfXrrMTejSo7us8N$!n,)2G!W7HHrrMT_irB#X!UodBs8N$!
+n'Ct4!;lZn!.XqH!:Tjc!;lZn!.Y"J+R_Mop]&#*s53hUn,In7s1eO4n,E@]s1eI2hu<ZEs*t(K
+!:\nHrr2ueiW&oW!:SnHrr2ueiW&oW!:SnHh>d9M!;HBj!.XqH!71TC!;HEk!U%5mrrDB_rrN+K
+r;Qc3r;Qc_r;Qfl?hjX$p\b$lrI=bF!2'2h!;HEk!V]srrrDfkrrN$^r;Qc#r;Qc_r;Qfl?hjX$
+n,*+bJ,K<HYPeD#lhpb`pL!^q!9="W!WG=]rrA\hrrDfkrrKsNh>c=2h>`!~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/gaussian-fig.ps b/docsrc/nyquist/gaussian-fig.ps
new file mode 100644
index 0000000..d7285c2
--- /dev/null
+++ b/docsrc/nyquist/gaussian-fig.ps
@@ -0,0 +1,69 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: gaussian-fig.ps
+%%CreationDate: Wed Jul 13 12:15:59 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 176 translate
+-40 760 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2773 ASCII Bytes
+image
+nG`Lfn,MtY!r)]nn,MtY!pfd`n,MtY!pf^^n,MtY"7,`05Oe^Drr_Tdn3?FBo)Agd]PcWrs7$$h
+cKF]snG`O'qsaXTrrKk2nGi"X!Ik":s7--hrW)ods7--hrW%E:s7-*jrVlfcs7-*krVlhHnc/.Z
+"8i)tJ+<R/rr`/ts1e+(nc&^crr9b's7-*kp\t3Mnc/.Z"8Dfphspa:rr_`hJ+)q-nc&^[rr;HW
+s7-*kn,E@Unc/.Z"5j+Xp[S:Rrr_0Xs7c'`nc&^Krr;`_s7-*k^]+91nc/.Z"2Fj8qsj^Vrr^%8
+J,Ad9nc&]@rr;res7-*kJ,]KHnc/.Z"+U=MrUKpYrri?$rr;ufs760mrr;utrpg$Zrri?$rr;uf
+s760nrVulss*sV>o)Amls8INJJ+EX1rrrB$rr<"Jo)J:\"o\K#s8RT>s760nqu?Zqs1e.)o)Amj
+s8N&u^[hEqrrr#mrr<#5o)J:\"loIYs8V!Is760nj8T&Xs53DIo)AmRrVf%]ht$g<rrqH^rr<#e
+o)J:\"m<Gqs8VQYs760nn,NCes6oOYo)Am^s8N&un+-MLrrqlkrr<#mo)J:\"lK@Zs8Vias760n
+huE]Us7c*ao)AmNs8INJqssdXrrp1;rr<#qo)J:\"i(*:s8Vues760n^]4<5s82Beo)Am.s8N&u
+rUU!ZrrmoPrr<#so)J:\"b6ROs8W&gs760nJ,fNJs8MThoD]$os8W(Js8MThoD]$os8W)us8MTh
+oD]$os8W)us8MThoD\pls8W)trr@Q?s7?6mrVuosrr2tJoDeF^"9&9"rr2otJ+N^3rr`6"s8N#t
+!5J.*oD\pis8W)trrBh*s7?6qqu?]qJ,fP`oDeF^"8i,urr2ot^[qKsrr`/us8N#t!8mDJoD\pe
+s8W)trrCsJs7?6mp](9mrr2uUoDeF^"8Diqrr2otht-m>rr`#qs8N#t!:TOZoD\p]s8W)trrDNZ
+s7?6qn,NFeJ,fQ;oDeF^"7Q9irr2otp[eFVrr_0Ys8N#t!;H*boD\pMs8W)trrDfbs7?6mhuE`U
+rr2umoDeF^"5ikOrr2otqt'jZrr^%%qYpKo!;lBfoD\p-li$h^rrDrfs7?6q^[(jt5QCc^oDeF^
+"+TY6rr2otrU^'\rr[cF\GlL-!<)NhoD\oBs8W)trrE#hs7?6mJ,fQJrr2utoDeI_!<2ut!<2ut
+!<2Tio`"pjrr2utrr2utoDeI_!<2ut!WITJrr@Q@s7H<krVlfsrr)isJ+Wd5rrE#srrE&srr@Q@
+s7H<krVlfsrr)is^\%QurrDrqrrE&srrBh+s7H<kqu6Tqrr)is^\%QurrDrqrrE&srrBh+s7H<k
+p\t0mrr)isht6s@rrDfmrrN+Krr2uUo`+R`!;HKm!<2rs!8mGKo`"p[rr2utrVlldo`+R`!:Tpe
+!<2rs!:TR[o`"p[rr2utrVlldo`+R`!8meU!<2rs!;H-co`"pKrr2utrVlllo`+R`!5JO5!<2rs
+!;H-co`"p+rr3#uJ,]HJp[nLXrrBh5rrE&srrDrgs7H<kJ,]HJrr)isqt0p\rr@QJrrE&srrDrg
+s7H<kJ,]HJrr)isrUg-_rrE&srrE&srrE#is7QBlrr)isrr)isrUg-_rrE&srrE&srrE&js7QBl
+rVc`srdXqI!<2Wjp&>$jrVllsrVllso`+Ua!<)lr!<2rs!<2Wjp&>$hrVllsr;QbHp&F^b!;l`p
+!<2or!.X\Ap&>3ms8VihrqucrJ+`j7rrr/ss6KX_r;Qc3p&F^b"o&&sli$h\rrBh,s7QBrp](9Z
+rVf%[rrBh,s7QBqn,NFRrVl`p!8mJLp&>3as8VhtIf03Ght@$BrrCsTrrE&rrrDN\s7QBlhu3QT
+rqucrn+H_RrrCsTrrE&rrrDfds7QBl^]"04rqucrp\"RZrrBh4rrE&rrrDrhs7QBl^]"05rdXnH
+!;lHhp&>#ArVllsr;Qcqp&F^b!.XtI!<2or!<)TjpAY-lr;Qcrr;Qcrp&Fac!<2or!<2or!<2Zk
+pAY-kr;Qcrqu6YGpAajd!<)iq!<2lq!.X_BpAY-ir;Qcrqu6Z2pAajd!;l]o!WITHrrBh-s7ZHm
+p\b$krql]qhtI*DrrDNcrrE&qrrCsMs7ZHmn,31crql]qn+QeTrrCsSrrE&qrrDN]s7ZHmhu*KS
+rql]qp\+X\rrBh3rrE&qrrDris7ZHmJ,K<Hrql]qqtC'arrE&qrrN+Kr;QcqpAame!<)fp!<2lq
+!<2]lp\t6lqu6ZqqYpPFp](!f!;lZn!<2ip!.XbCp\t6fqu6ZqqYpQ1p](!f!:Tgb!<2ip!8mPN
+p\t6Nqu6ZqqYpQYp](!f!5JF2!<2ip!;lNjp\t5Cqu6]rJ,B6Gr:g6drrE&prrE&orr@QDs7lTo
+q>1*krqZQo^\Ij(rrD6YrrE&orrCC?s7lTo+8Z!;rqZQonbE.[rrDumrrE&orrN*`q>^Bm#(Q[Q
+KE(u?r;Qcrqu6lhs8Tn7s8Dlq,QI`Bn,In7J7&9Tn,In7s53hUp]&#,s6ou;pBSJ3s6ou;rrE&U
+!!*&grrE&es7$$grpTmVrrE&es7$$grpTmCs8;lshu*KSp\"Odhu*KSrVZ]nrrA\hrrDBXrrB8#
+rrDlms8;ls?i9p(p\"Odhu*KSp&+jgrrM-jrVlorGP1t9hu*KSnGN=arrCsSrrDN\rrBh3rrE#q
+s8;lsO8T"Xj7WEPO8T"Xq#(0Js*t~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/geometric-fig.ps b/docsrc/nyquist/geometric-fig.ps
new file mode 100644
index 0000000..484d708
--- /dev/null
+++ b/docsrc/nyquist/geometric-fig.ps
@@ -0,0 +1,1173 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: geometric-fig.ps
+%%CreationDate: Wed Jul 13 12:16:14 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 313 363
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 348 translate
+-20 775 translate
+297.99999999999994 -348 scale
+% Image geometry
+298 348 8
+% Transformation matrix
+[ 298 0 0 348 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 298 string def
+/gstr 298 string def
+/bstr 298 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData: 48827 ASCII Bytes
+colorimage
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+r;V<JJH4[0qu;0~>
+r;V<JJH4[0qu;0~>
+r;V<JJH4[0qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`s^]+JrHiO/8nDO<IiJdX5rrDcmr;["7d/X+G!;ZWqiJd[6rr<-#!!)]l"lYF?rr<&OrrGgo
+^]+96qu;0~>
+r;Q`s^]+JrHiO/8nDO<IiJdX5rrDcmr;["7d/X+G!;ZWqiJd[6rr<-#!!)]l"lYF?rr<&OrrGgo
+^]+96qu;0~>
+r;Q`s^]+JrHiO/8nDO<IiJdX5rrDcmr;["7d/X+G!;ZWqiJd[6rr<-#!!)]l"lYF?rr<&OrrGgo
+^]+96qu;0~>
+r;Q`s_#FW'!1Nr@!.<`)rrDHdrrE*!!h',JpAb-mq#C?op&G$lec,]a!!'e6!!)orJ,~>
+r;Q`s_#FW'!1Nr@!.<`)rrDHdrrE*!!h',JpAb-mq#C?op&G$lec,]a!!'e6!!)orJ,~>
+r;Q`s_#FW'!1Nr@!.<`)rrDHdrrE*!!h',JpAb-mq#C?op&G$lec,]a!!'e6!!)orJ,~>
+r;Q`s_#FJ)!9sC\"0qn,ZMsk>Z:t>)s8N'!d!SR$a%]:Ts8TA)!4)Y'!"T#/!/u=*!!*'!Z:t=X
+l2CY^!<<'-kl@1P!!*&`HiO/*l2(GlN-tX*!<3$!]hOIcrr<'!s8)d-rr<'!s0>?!ZN'q)!76*f
+d/*eB!!:MAI.[F@n7Ve%^]+96qu;0~>
+r;Q`s_#FJ)!9sC\"0qn,ZMsk>Z:t>)s8N'!d!SR$a%]:Ts8TA)!4)Y'!"T#/!/u=*!!*'!Z:t=X
+l2CY^!<<'-kl@1P!!*&`HiO/*l2(GlN-tX*!<3$!]hOIcrr<'!s8)d-rr<'!s0>?!ZN'q)!76*f
+d/*eB!!:MAI.[F@n7Ve%^]+96qu;0~>
+r;Q`s_#FJ)!9sC\"0qn,ZMsk>Z:t>)s8N'!d!SR$a%]:Ts8TA)!4)Y'!"T#/!/u=*!!*'!Z:t=X
+l2CY^!<<'-kl@1P!!*&`HiO/*l2(GlN-tX*!<3$!]hOIcrr<'!s8)d-rr<'!s0>?!ZN'q)!76*f
+d/*eB!!:MAI.[F@n7Ve%^]+96qu;0~>
+r;Q`s_#FF0!;ldN]`?+"!58EG!6<+[^&J'4^$l"%ZKV@&s1JEQciCcZ!!*'!!!(^Prr<'!Z2hr0
+!0$mVrrE&urr>"X!!*%4!<;9`I/a0Hrr<&Ps8N'!rr<%s`rN%;!!*'!!!*$!!<<'!!<9_4a2\1n
+rr<&4kl=HSs8N'%VoJe8s8)forr]1G!!'e6!!)orJ,~>
+r;Q`s_#FF0!;ldN]`?+"!58EG!6<+[^&J'4^$l"%ZKV@&s1JEQciCcZ!!*'!!!(^Prr<'!Z2hr0
+!0$mVrrE&urr>"X!!*%4!<;9`I/a0Hrr<&Ps8N'!rr<%s`rN%;!!*'!!!*$!!<<'!!<9_4a2\1n
+rr<&4kl=HSs8N'%VoJe8s8)forr]1G!!'e6!!)orJ,~>
+r;Q`s_#FF0!;ldN]`?+"!58EG!6<+[^&J'4^$l"%ZKV@&s1JEQciCcZ!!*'!!!(^Prr<'!Z2hr0
+!0$mVrrE&urr>"X!!*%4!<;9`I/a0Hrr<&Ps8N'!rr<%s`rN%;!!*'!!!*$!!<<'!!<9_4a2\1n
+rr<&4kl=HSs8N'%VoJe8s8)forr]1G!!'e6!!)orJ,~>
+r;Q`s_#OE7s8W&u-N?d?s8N(4s(DE4rr?a4!!*'!!!*'!!!*$n!<<'!B`A&4s8N'!rr;uu!rksp
+q>^Hprr;uu#QFc(s%NK@d/O(F!!<0#!<3#u!$_FC!<<'!:&b1ns8N'!rr<'!rr<'!BE8)4!,2B4
+!<<'!!;c`q!<<'"!)<1e"R1=6!!'e6!!)orJ,~>
+r;Q`s_#OE7s8W&u-N?d?s8N(4s(DE4rr?a4!!*'!!!*'!!!*$n!<<'!B`A&4s8N'!rr;uu!rksp
+q>^Hprr;uu#QFc(s%NK@d/O(F!!<0#!<3#u!$_FC!<<'!:&b1ns8N'!rr<'!rr<'!BE8)4!,2B4
+!<<'!!;c`q!<<'"!)<1e"R1=6!!'e6!!)orJ,~>
+r;Q`s_#OE7s8W&u-N?d?s8N(4s(DE4rr?a4!!*'!!!*'!!!*$n!<<'!B`A&4s8N'!rr;uu!rksp
+q>^Hprr;uu#QFc(s%NK@d/O(F!!<0#!<3#u!$_FC!<<'!:&b1ns8N'!rr<'!rr<'!BE8)4!,2B4
+!<<'!!;c`q!<<'"!)<1e"R1=6!!'e6!!)orJ,~>
+r;Q`s_#FF0!<3#u!!*&r!##;3!<<'!!<3$!s8N'!s8N'!s8)d#rr<'!rr<&us8N'#rr<&ps8N)u
+s8N'0rr<'!cqOK?:!in?!<3$!rr;uu,6%WCs8N'!rr<'!rr<'!!!*'!!!*$!!<<'!!<3$!s8N'!
+qZ$Qqs8W*!!<;orrVm"ZiVrlX^]+96qu;0~>
+r;Q`s_#FF0!<3#u!!*&r!##;3!<<'!!<3$!s8N'!s8N'!s8)d#rr<'!rr<&us8N'#rr<&ps8N)u
+s8N'0rr<'!cqOK?:!in?!<3$!rr;uu,6%WCs8N'!rr<'!rr<'!!!*'!!!*$!!<<'!!<3$!s8N'!
+qZ$Qqs8W*!!<;orrVm"ZiVrlX^]+96qu;0~>
+r;Q`s_#FF0!<3#u!!*&r!##;3!<<'!!<3$!s8N'!s8N'!s8)d#rr<'!rr<&us8N'#rr<&ps8N)u
+s8N'0rr<'!cqOK?:!in?!<3$!rr;uu,6%WCs8N'!rr<'!rr<'!!!*'!!!*$!!<<'!!<3$!s8N'!
+qZ$Qqs8W*!!<;orrVm"ZiVrlX^]+96qu;0~>
+r;Q`s_#F_0!9*tX!!*$n!;uj1BE8)4!,2B4!<<'!!<<'!!<5anr;Zcss8W*!rr;uu!rkspq>^Hp
+s8N8e!1Nof!<3!)fr"gErr<'!!!*#urr=8C!!*'!!)<In!<<'!!<3$!s8N'!s(DE4rr?a4!!*'!
+!!)lqrrE*!!<>jfs8)f3rr<&rs*t~>
+r;Q`s_#F_0!9*tX!!*$n!;uj1BE8)4!,2B4!<<'!!<<'!!<5anr;Zcss8W*!rr;uu!rkspq>^Hp
+s8N8e!1Nof!<3!)fr"gErr<'!!!*#urr=8C!!*'!!)<In!<<'!!<3$!s8N'!s(DE4rr?a4!!*'!
+!!)lqrrE*!!<>jfs8)f3rr<&rs*t~>
+r;Q`s_#F_0!9*tX!!*$n!;uj1BE8)4!,2B4!<<'!!<<'!!<5anr;Zcss8W*!rr;uu!rkspq>^Hp
+s8N8e!1Nof!<3!)fr"gErr<'!!!*#urr=8C!!*'!!)<In!<<'!!<3$!s8N'!s(DE4rr?a4!!*'!
+!!)lqrrE*!!<>jfs8)f3rr<&rs*t~>
+r;Q`s_#H"N!1Nr$!!*&)!6==(N;pQka2\1nrr<'!rr<'!rr<'!Z2hr0!0$pX!<<'!!<3#u!!`J/
+!6==(I/X*F!<<'3RK2%@!!*%H!9rtQB`A&4rr<&us8N'Frr<%sciC!DBE7;1!!*$!!<<'!!<9_4
+a2\1nrr<'!rr<'!!!)utrr</!ciC!>s8N)ts8N)6rr<&rs*t~>
+r;Q`s_#H"N!1Nr$!!*&)!6==(N;pQka2\1nrr<'!rr<'!rr<'!Z2hr0!0$pX!<<'!!<3#u!!`J/
+!6==(I/X*F!<<'3RK2%@!!*%H!9rtQB`A&4rr<&us8N'Frr<%sciC!DBE7;1!!*$!!<<'!!<9_4
+a2\1nrr<'!rr<'!!!)utrr</!ciC!>s8N)ts8N)6rr<&rs*t~>
+r;Q`s_#H"N!1Nr$!!*&)!6==(N;pQka2\1nrr<'!rr<'!rr<'!Z2hr0!0$pX!<<'!!<3#u!!`J/
+!6==(I/X*F!<<'3RK2%@!!*%H!9rtQB`A&4rr<&us8N'Frr<%sciC!DBE7;1!!*$!!<<'!!<9_4
+a2\1nrr<'!rr<'!!!)utrr</!ciC!>s8N)ts8N)6rr<&rs*t~>
+r;Q`s^]+]#HiO/*d/X-O9`U.OruJC>9sXg!!!*'!!!*'!!!*'!Z:t=Xs8UFGI/a0Hrr;uus8N5-
+!!%uBrVufr&noturr<'!n<s=WI-L[X!.4bHrr;uu-3!rFcqSofs3OJRkl:_`ciAIn!!*'!Z;"'!
+s8N'!s8N'!rr<&ts8N'#`rM(ns8N)ts8N)6rr<&rs*t~>
+r;Q`s^]+]#HiO/*d/X-O9`U.OruJC>9sXg!!!*'!!!*'!!!*'!Z:t=Xs8UFGI/a0Hrr;uus8N5-
+!!%uBrVufr&noturr<'!n<s=WI-L[X!.4bHrr;uu-3!rFcqSofs3OJRkl:_`ciAIn!!*'!Z;"'!
+s8N'!s8N'!rr<&ts8N'#`rM(ns8N)ts8N)6rr<&rs*t~>
+r;Q`s^]+]#HiO/*d/X-O9`U.OruJC>9sXg!!!*'!!!*'!!!*'!Z:t=Xs8UFGI/a0Hrr;uus8N5-
+!!%uBrVufr&noturr<'!n<s=WI-L[X!.4bHrr;uu-3!rFcqSofs3OJRkl:_`ciAIn!!*'!Z;"'!
+s8N'!s8N'!rr<&ts8N'#`rM(ns8N)ts8N)6rr<&rs*t~>
+r;Q`sJcEUe!U4:rs8N)"rr<&rs*t~>
+r;Q`sJcEUe!U4:rs8N)"rr<&rs*t~>
+r;Q`sJcEUe!U4:rs8N)"rr<&rs*t~>
+r;Q`sJcEUe!K?"9s8N)"rr<&rs*t~>
+r;Q`sJcEUe!K?"9s8N)"rr<&rs*t~>
+r;Q`sJcEUe!K?"9s8N)"rr<&rs*t~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sp&G!krr;rtJcC<$q>UEpqu;0~>
+r;Q`sp&G!krr;rtJcC<$q>UEpqu;0~>
+r;Q`sp&G!krr;rtJcC<$q>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGTH!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGTH!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!%TMJcGTH!!)orJ,~>
+r;Q`spAY*mr;Q`srr2ruJcC<$qYpNqqu;0~>
+r;Q`spAY*mr;Q`srr2ruJcC<$qYpNqqu;0~>
+r;Q`spAY*mr;Q`srr2ruJcC<$qYpNqqu;0~>
+r;Q`spAb'ks8N'!rr2ruJcC<$qYpNqqu;0~>
+r;Q`spAb'ks8N'!rr2ruJcC<$qYpNqqu;0~>
+r;Q`spAb'ks8N'!rr2ruJcC<$qYpNqqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)orqZ)1tNe$s*!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)orqZ)1tNe$s*!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)orqZ)1tNe$s*!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sp&Fsjs8W&up\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sp&Fsjs8W&up\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sp&Fsjs8W&up\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`spAY*mr;Q`srr2ruq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`spAY*mr;Q`srr2ruq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`spAY*mr;Q`srr2ruq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`spAb'ks8N'!rr2ruq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`spAb'ks8N'!rr2ruq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`spAb'ks8N'!rr2ruq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`so)AakrrE&u!!)orqZ)2_O2(aGq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ)2_O2(aGq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ)2_O2(aGq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYq7uS%J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7uS%J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7uS%J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<oq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<oq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<oq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!;XD1!;2`[!.hq\^]8o\rr<&rs*t~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!;XD1!;2`[!.hq\^]8o\rr<&rs*t~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!;XD1!;6?l!.hq\^]8o\rr<&rs*t~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!;XD1!;2`[!.hq\^]8o\rr<&rs*t~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!;XD1!;2`[!.hq\^]8o\rr<&rs*t~>
+r;Q`sp&>0qrrE*!!<2uu!;QQo!;XD1!;6?l!.hq\^]8o\rr<&rs*t~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ-N/!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ-N/!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ-N/!!)]l!!%ScUVHk[q>UEpqu;0~>
+r;Q`spAb$j!WN0!rr<&orr<&p^]4B-R/d5<^n\[FJGK3F!;leH~>
+r;Q`spAb$j!WN0!rr<&orr<&p^]4B-R/d5<^n\[FJGK3F!;leH~>
+r;Q`spAb$j!WN0!rr<&orr<&p^]4B-rr<%M^n\[FJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<&p^]4B-R/d5<^n\[FJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<&p^]4B-R/d5<^n\[FJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<&p^]4B-rr<%M^n\[FJGK3F!;leH~>
+r;Q`soD\djrr;rtp\t3nq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nq7lt1opGd[J\\%r!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nq7lt1p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)i1!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)i1!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)i1!!)]l!!%ScUVHk[q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)]l!!%ScUVHk[q>UEpqu;0~>
+r;Q`so`+pks8N'!rr2ruqu?NnqnN13opGd[J\\%r!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruqu?NnqnN13opGd[J\\%r!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruqu?NnqnN13p&>!lJ\\%r!.anF!!)orJ,~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)]l!!%ScUVHk[q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)]l!!%ScUVHk[q>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)i1!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)i1!!)\[!!%ScUVHk[q>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)i1!!)]l!!%ScUVHk[q>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nq7lt1opGd[nA+YrJ\]+;!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nq7lt1opGd[nA+YrJ\]+;!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nq7lt1p&>!lnA+YrJ\]+;!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)i1!!)\[!!)N(!!)\[!!%Sc_S?/%q>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)i1!!)\[!!)N(!!)\[!!%Sc_S?/%q>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!)i1!!)]l!!)N(!!)]l!!%Sc_S?/%q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)\[!!)N(!!)\[!!%Sc_S?/%q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)\[!!)N(!!)\[!!%Sc_S?/%q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)]l!!)N(!!)]l!!%Sc_S?/%q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)\[!!)N(!!)\[!!%Sc_S?/%q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)\[!!)N(!!)\[!!%Sc_S?/%q>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!)i1!!)]l!!)N(!!)]l!!%Sc_S?/%q>UEpqu;0~>
+r;Q`soD\mms8N)urr<&rs8)fn^]4B-R/d6V^]4B-R/d5<^r!keJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&rs8)fn^]4B-R/d6V^]4B-R/d5<^r!keJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&rs8)fn^]4B-rr<&g^]4B-rr<%M^r!keJGK3F!;leH~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<oq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3nq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sp&G$lrr2rurr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sp&G$lrr2rurr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`sp&G$lrr2rurr2ruq#:<oq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!)i1!!)\[!!)N(!!)\[!!%Sc_S?/%q>UEpqu;0~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!)i1!!)\[!!)N(!!)\[!!%Sc_S?/%q>UEpqu;0~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!)i1!!)]l!!)N(!!)]l!!%Sc_S?/%q>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruqu?NnqnN13opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruqu?NnqnN13opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruqu?NnqnN13p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<oq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nq7lt1opGd[nA##(opGd[J\].<!.anF!!)orJ,~>
+r;Q`so`"mkrVuisp\t3nq7lt1p&>!lnA##(p&>!lJ\].<!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA+\sJ\^0Y!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA+\sJ\^0Y!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA+\sJ\^0Y!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA+Yrn%ePqS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA+Yrn%ePqS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA+Yrn%ePqS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA+VqnA+Yrg;!]=
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA+VqnA+Yrg;!]=
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA+VqnA+Yrg;!]=
+q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\g;!]=q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\g;!]=q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA##(
+pAY*mg;!]=q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\g;!]=q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\g;!]=q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA##(
+pAY*mg;!]=q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\g;!]=q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\g;!]=q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA##(
+pAY*mg;!]=q>UEpqu;0~>
+r;Q`sn,N@ep\t3nq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[
+nA##(p6bm\nA+Vqq7lu\q>UEpqu;0~>
+r;Q`sn,N@ep\t3nq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[
+nA##(p6bm\nA+Vqq7lu\q>UEpqu;0~>
+r;Q`sn,N@ep\t3nq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l
+nA##(pAY*mnA+Vqq7lu\q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(
+opGd[nA##(p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(
+opGd[nA##(p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(
+p&>!lnA##(pAY*mnA##(p&>!lq7lu\q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1p6bm\
+q7lt1q7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1p6bm\
+q7lt1q7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1p&>!lq7lt1q7lt1p&>!lq7lt1q7lt1pAY*mq7lt1q7lt1pAY*m
+q7lt1q7lt1p&>!lq7lt1q7lt1p&>!lq7lt1q7lt1pAY*mq7lt1q7lt1p&>!lq7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1p6bm\
+q7lt1q7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1p6bm\
+q7lt1q7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1p&>!lq7lt1q7lt1p&>!lq7lt1q7lt1pAY*mq7lt1q7lt1pAY*m
+q7lt1q7lt1p&>!lq7lt1q7lt1p&>!lq7lt1q7lt1pAY*mq7lt1q7lt1p&>!lq7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruqu;3IL]I8N!!)orJ,~>
+r;Q`snG`Igrr2ruqu;3IL]I8N!!)orJ,~>
+r;Q`snG`Igrr2ruqu;3IL]I8N!!)orJ,~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sn,N@ep\t3nj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sn,N@ep\t3nj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sn,N@ep\t3nj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sec5UKjSo2[jT#2Zjo>;[jo5;\jo>8Zk5YD\n,E@fr;Q`sjSo2[qu;0~>
+r;Q`sec5UKjSo2[jT#2Zjo>;[jo5;\jo>8Zk5YD\n,E@fr;Q`sjSo2[qu;0~>
+r;Q`sec5UKjSo2[jT#2Zjo>;[jo5;\jo>8Zk5YD\n,E@fr;Q`sjSo2[qu;0~>
+r;Q`sf)G^Mrr2ruk5YG]jo5;\rr2rukPkM^rr2rukPtP^jo5;\jSo2[rr2runGiLgrr;uujSo2[
+qu;0~>
+r;Q`sf)G^Mrr2ruk5YG]jo5;\rr2rukPkM^rr2rukPtP^jo5;\jSo2[rr2runGiLgrr;uujSo2[
+qu;0~>
+r;Q`sf)G^Mrr2ruk5YG]jo5;\rr2rukPkM^rr2rukPtP^jo5;\jSo2[rr2runGiLgrr;uujSo2[
+qu;0~>
+r;Q`sf)G^Mrr2rukPkS`rrD$X!!)'Z!!)6_!W`6#k5PD]j8T)Zm/R(crr;uus8W&us8N3%rrE*!
+rW)Qi!!)orJ,~>
+r;Q`sf)G^Mrr2rukPkS`rrD$X!!)'Z!!)6_!W`6#k5PD]j8T)Zm/R(crr;uus8W&us8N3%rrE*!
+rW)Qi!!)orJ,~>
+r;Q`sf)G^Mrr2rukPkS`rrD$X!!)'Z!!)6_!W`6#k5PD]j8T)Zm/R(crr;uus8W&us8N3%rrE*!
+rW)Qi!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\iVrlXjo>>\kPkS`rrD3]r;c![r;c<d#QXl)rrE'!rrE&u"p"Z'!<<'!
+rr2ruo`"mkqu;0~>
+r;Q`sf)G^Mrr2rujo5;\iVrlXjo>>\kPkS`rrD3]r;c![r;c<d#QXl)rrE'!rrE&u"p"Z'!<<'!
+rr2ruo`"mkqu;0~>
+r;Q`sf)G^Mrr2rujo5;\iVrlXjo>>\kPkS`rrD3]r;c![r;c<d#QXl)rrE'!rrE&u"p"Z'!<<'!
+rr2ruo`"mkqu;0~>
+r;Q`sf)G^Mrr2rujo5;\ir8uYir8uYl2Lhcs8N)Yrr<&^rr<&urr<&grs/W)!<3'!!<3&urrN3#
+!<3#r!;-9k!;leH~>
+r;Q`sf)G^Mrr2rujo5;\ir8uYir8uYl2Lhcs8N)Yrr<&^rr<&urr<&grs/W)!<3'!!<3&urrN3#
+!<3#r!;-9k!;leH~>
+r;Q`sf)G^Mrr2rujo5;\ir8uYir8uYl2Lhcs8N)Yrr<&^rr<&urr<&grs/W)!<3'!!<3&urrN3#
+!<3#r!;-9k!;leH~>
+r;Q`sf)G^Mrr2rujo5;\j8T)ZiVrlXl2UY]j8T)ZkPkM^rr2runG`aorrE'!rrE'!rr3$"rrE&u
+!!)Ng!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\j8T)ZiVrlXl2UY]j8T)ZkPkM^rr2runG`aorrE'!rrE'!rr3$"rrE&u
+!!)Ng!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\j8T)ZiVrlXl2UY]j8T)ZkPkM^rr2runG`aorrE'!rrE'!rr3$"rrE&u
+!!)Ng!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\jSo2[jSo2[rr2ruk5PD]k5PD]rr2rukPkM^rr2runG`aos8N*!rrE'!
+rr3$"rrE&u!!*#u!!)Zk!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\jSo2[jSo2[rr2ruk5PD]k5PD]rr2rukPkM^rr2runG`aos8N*!rrE'!
+rr3$"rrE&u!!*#u!!)Zk!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\jSo2[jSo2[rr2ruk5PD]k5PD]rr2rukPkM^rr2runG`aos8N*!rrE'!
+rr3$"rrE&u!!*#u!!)Zk!!)orJ,~>
+r;Q`sec5UKjSo2[jo>5Yk5YD\jo5;\jo>;[jo>;[n,EXns8N*!rrE*!rW)uu!!)utrW)Qi!!)or
+J,~>
+r;Q`sec5UKjSo2[jo>5Yk5YD\jo5;\jo>;[jo>;[n,EXns8N*!rrE*!rW)uu!!)utrW)Qi!!)or
+J,~>
+r;Q`sec5UKjSo2[jo>5Yk5YD\jo5;\jo>;[jo>;[n,EXns8N*!rrE*!rW)uu!!)utrW)Qi!!)or
+J,~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;V<JJH4[0qu;0~>
+r;V<JJH4[0qu;0~>
+r;V<JJH4[0qu;0~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/hyperbolic-fig.ps b/docsrc/nyquist/hyperbolic-fig.ps
new file mode 100644
index 0000000..0037d50
--- /dev/null
+++ b/docsrc/nyquist/hyperbolic-fig.ps
@@ -0,0 +1,70 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: hyperbolic-fig.ps
+%%CreationDate: Wed Jul 13 12:16:30 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 176 translate
+-40 760 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2868 ASCII Bytes
+image
+nG`Lfn,MnW!<2HenG`Lfn,MnW!WIT<s7$$hn/q0"nG`OOcg^u(rrM!NnGi"X!P\<ts7$$h^3fAL
+nG`N<qsaXVrr`#oIf8d9o)AgXqYpK`s760ili-nQs760mli$fIJ+<R0rrhZcrr7K<s760mpUU;'
+^[_?orr`/ts1e+(nc&^crr:mGs7-*kp\o["nc/.Z"7Q6hn+$GJrr_`hs6oLXnc&^[rr;`_s7-*k
+hu<ZMnc/.Z"5j*-p[S:Rrr^%8s82?dnc&^+rr;lcs7-*k^]+93nc/.Z"+U=MrUKpXrr[cMJ,]!<
+nc&]@rr;ufs760mrr;utrpg$ZrrrE%rr<"Jo)J:\"oeQ$s8RT>s760nrVukHs*sV>o)Amls8N&u
+^[hErs8W$#EW6"<^[hErs8Vou\,QF-^[hErrs&>sF8l4>ht$g=rs&>sIJuJ2ht$g=rs&>np&>!k
+ht$g=rs&Ga49#9[n+-MLrrqlkrr<#eo)J:\"n2Kjs8VQYs760nn,NB:s7c*ao)AmNs8N&up[\@T
+rrq<[rr<#mo)J:\"lK@Zs8Vues760n^]4<5s82Beo)Am.s8INJqssdXrrp1;rr<#so)J:\"b6RO
+s8W&gs760nJ,fNJs8DNgo)AlCs8N&urUU![rs&K&s8INJrpp*\rs&K&s8N&urpp*\rs&K&s8N&u
+rpp*\rr`6"s8N#t!.XV?oD\pks8W)trr@Q?s7?6qrVuosJ,fOuoDeF^"8i,urr2ot^[qKsrr`/m
+rVlfr!5J.*oD\pilh^V[rrBh*s7?6mpZqeWrr2uUoDeF^#P[Q_r]gG_ht-m>rr`#]qu6Tp!8mDJ
+oD\p]pUL5%rrDNZs7?6mn,NFerr2ueoDeF^"7Q9irr2otn+6SNrs.H]s8INJs6oRZoD\pMs8W)t
+rrDfbs7?6mhuE`Urr2umoDeF^"2Fm9rr2otp[eFVrr^%9s8N#t!;lBfoD]'1s8W(Js8Vufs7?6m
+J,fQJrr2uqoDeF^"+U@Nrr2otrU^'\rr[cNs8N#t!<)Nho`"pjrr2utrr2usoDeI_!<2ut"TEoN
+s8MWio`"pjrr2utrr2utoDeI_!<)os!<2rs!.XY@o`"pirr2utrVlkIo`+R`!<)os!<2rs!5J1+
+o`"pgrr3#uJ,]HJ^\%Qurri5trc.r9rrCsKs7H<op\Oo6rr)isht6s@rri)ms)\2<rrCsKs7H<p
+n,!'4r]gD^!:TR[o`#'_qYt^;rVlldo`+R`"Q01E)ufg9!;H-co`"pKrr2utrVlllo`+R`!5JO5
+!<2rs!;lEgo`"p+rr3#uJ,]HJqt0p\rr@QJrrE&srrDrgs7H<kJ,]HJrr)isrUg-^rr@QJrrE&s
+rrE#is7QBlrr)isrr)isrq-6`rrE&srrN+Krr2uto`+Ua!<)lr!<2or!.X\Ap&>$jrVllsr;QbH
+p&F^b!;l`p!<2or!5J4,p&>$hrVllsr;Qc3p&F^b!;HHl!<2or!5J4,p&>$drVlotJ,TBIht@$B
+rrDNdrrE&rrrCsLs7QBln,<7drqucrn+H_RrrCsTrrE&rrrDN\s7QBlhu3QTrqucrp\"RZrrBh4
+rrN+KrVlllp&F^b!5JL4!<2or!;lHhp&>2Fs8Vihrqucrqt:!^rrmoPs6KX_r;Qcqp&Fac!<2ut
+!pfgar;Qcqp&Fac!<2ut"7,pb5Q1T^rq6<brrE#srrVNbrql]qJ+ip9rrDrqrrVr!If'-FJ+ip9
+rrDrorrE&qrrBh-s7ZHmp\b$krql]q^\7^$rrDfkrrN+Kr;QcSpAajd!:Tjc!<2lq!8mMMpAY-]
+r;Qcrqu6ZbpAajd!8m_S!<2lq!:TX]pAY-Mr;Qcrqu6ZjpAajd!5JI3!WITHrrDris7ZHm^\n*3
+rql]qrV$9brr@QHrrE&qrrE#ks7cNnrql]qrql]qrq?BdrrE&qrrE&prr@QCs7cNnrVQTqrdXhF
+!5J:.p\t6jqu6ZqqYpQ1p](!f!;HBj!<2ip!8mPNp\t6fqu6ZqqYpQap](!f!:Tgb!<2ip!;H6f
+p\t6Nqu6]rJ,B6Gp\4^^rrBh2rrE&prrDrjs7cNnJ,]HMrVpm:qYpQop]($g!<2rs"8`#+rqcWp
+rqHHfrrE#rrr`,sZi9e#!'g8Yq#:?krVm#srk8:qqYpQQq#C-h!9a=\"8`#)rqZQon+cqXrrCsT
+rr`5gHiEj@!;H9gq#:?/qYpQpq>UHlq#C-h!.XkF!<2fo!<)]mq>UHoq>UKpJ,90FrqQNhrrDlj
+rrE&nrr@QEs7uZpp\FghrqQKnTDAN_rrDN`rrE&nrrD6Xs7uZpTDAKerqQKnq>('errN+Kq>UKp
+J,0*ErqZTjrrDlirrE&mrr>:[s8)`qkP5&WrqHEmchd\<rrA\drrE&mrrDZes82fsrdX_C!<2`m
+!W7HEs82frq=jmirdX\B!2'/gqu6Z:p\t6mpAY-Qqu?Qn!'g5X!<2]l!W7HFs8;lsnFlk^rq69k
+TD\`frrN$.pAY-lp&>$Mr;Z`q!/'tE!WITArr<<&s8N$!i.(G"!<2Wj!Vdc9s8W*"!$Ck5!<2Ti
+"5k:$rriAss8W)qrrDNcrrE&qrrDNcrrrE%s56-A,QIZ@hu<ZMs1eO4n,In7s53hUp]&#,s6ou;
+qu>RQs7cQ.rrE&U!!*&grrE&es7$$grpTmVrrE&es7$$grpTmCs8;ls^\n*3p\"Odhu*KSrqufo
+rr>:]rrDBXrrB8#rrDups8DrurkJC2!;H0d!8m_S!;cWnrVlo<+8u3?r-.i6!8m_S!Vh0Cs8;ls
+^\n*3n+H\\^\n*3rquforr=/=rrD*PrrA,XrrN%IrVt^RJ,~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/linear-fig.ps b/docsrc/nyquist/linear-fig.ps
new file mode 100644
index 0000000..6b17165
--- /dev/null
+++ b/docsrc/nyquist/linear-fig.ps
@@ -0,0 +1,63 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: linear-fig.ps
+%%CreationDate: Wed Jul 13 12:16:49 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 176 translate
+-40 760 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2321 ASCII Bytes
+image
+s8N)ri;WlYrVPOQ!rr,oi;WlYrVPOQ!rr5oi;WlYqtT+L"98/n5N2YBrrN#SiW&rX!W2'=s8W*"
+qt]4Ns8N,sro*nWrrW)t5N;_CrrW#rhr=\9rrW)tkMlOArrW)tqr7YUrrW)tr8RbVrr`/us*s)/
+s8N2us8S_Os8W*$qu?]bj8]/Z"8i,uoAflNrr`)ss8:pWs8N)rrr2s_jT#8[!;lcq!70a+s8N)r
+rr2uijT#8[!;lcq!<)!Ys8N)rrr3#uJ*$_1rrDrprrBgqs8W*!qu-NpcfP3,rrDlnrrDfTs8W*!
+qu-NpqrRkXrrDrprrDuYs8W*!qu$HoJ*-e2rrDrorrA\Rs8W*!qu$HokN;gErrDrorrDlWs8W*!
+qu$HprdX,2s8N)pqu6YgkPtS^!;lZn!:T+Ns8N)rqu6ZfkPtS^!;lZn!<)*\s8N)rqu6]rJ*?n6
+TB#hFrrA\TrrV*Hqtg<mn*'cQhrjn5rrDZSrrV*Tq"k!jrTO7_hs:19rrN+Kl2Lehp\Xdd!5Idu
+s8N)rq>UH@l2Ue`!;lTl!;#ITs8N)rq>UHnl2Ue`!;lTl!WIT6s8W*!qtU0k^Ztk!rrDlirrCC1
+s8W*!qtU0kpZheYrrDrkrrDl[s8W*!qtU0lrdX86s8N)rp\t6.li7"b!;lNj!71!2s8N)rp\t6f
+li7"b!;lNj!;Ys\s8N)pp\t9nJ*d48rrDrirrBh#s8W*!qtC$icg:]3rrDrirrDZWs8W*!qtC$i
+rTsRarrDrirrN+KmJm4d!;lHh!5Iq$s8N)rp&>$<mJm4d!;Z<f!;#UXs8N)rp&>$jmJm4d!;lHh
+!WIT:s8W*!qt0mg^[D.%rrDrgrrCC5s8W*!qt0mgp[8(]rrDrgrrDl_s8W*!qt0mhrdXD:s8N)p
+oD\g*n,NFf!;lBf!71-6s8N)roD\gbn,NFf!;lBf!;Z*`s8N)roD\jjJ+3I>s7uQ_rrBh'rrW6!
+qssaecg^r9s8DicrrDZ[rrW6!q""FbrUBggs8DicrrN+Knc&[jn9a^*!2&f]s8N)rnc&UPnc/Xh
+!;l<d!;Z0bs8N)rnc&XhJ+EX>rrDrcrrBh)s8W*!q=+Cacgq,9rrDrcrrDZ]s8W*!qsaUcr:9mf
+rrDrbrr>:Ts8W*!qsXObch%2:rrDrbrrDfbs8W*!qsXObq=FXdrrDrbrrE&is8W*!q<n7_5P5!U
+rrDrarrCC;s8W*!qsOIap[nLcrrDrarrDles8W*!qsOIarq-6jrrDr`rr>:Vs8W*!qsFC`ht@$L
+rrDr`rrD6Ts8W*!q<e1^q=XdfrrDr`rrE&ks8W*!qs==_5PG-WrrDr_rrCsMs8W*!qs==_kP"rU
+rrDr_rrDlgs8W*!qs==_rq?BlrrDr^rr>:Xs8W*!q<S%\chIJ>rrDr^rrDffs8W*!qs47^q=jph
+rrDr^rrE&ms8W*!qs+1]5PY6[hrFV!rrCC?rrTCmqs+1]p\=aiYNPfJrrDlirrTD$q!.kZrqQKp
+YNu)Mrr>:ZrrV'Oqs"+\htd<PrrDr\rrD6Xs8W*!qs"+\q>('jrrDr\rrE&os8W*!qrn%[5PkE[
+rrDr[rrCsQs8W*!q<7hYkPG5YrrDr[rrDrms8W*!qrn%[r;-HnrrDrZrr>:\s8W*!qrdtZhu!HR
+rrDrZrrD6Zs8W*!qrdtZqtpEnrrDrZrrDuos8W*!q<%\W5Q(Q]rrDrYrrCCCs8W*!qr[nYoDJXg
+rrDrYrrDups8W*!qrRhXJ,TEIrrDrXrrA\is8W*!qrRhXn,<:drrDrXrrDZhs8W*!q;qVVr;HZq
+rrDrWrr@QJs8W*!qrIbWTDnljrrDrWrrDNes8W*!qrIbWoD\dirrDrWrrE#ss8W*!qrIbZrdXtJ
+s8N)rj8T1Qs8W-!!;Y[T!q60hs8N)rj8T2Ps8W-!!;kgV!r`0!s8N)rj8T2[J,fQK!;kdU!MBDl
+rrDrUrrMTgs8N)rqu6Z2r;Qcoqu6YGr;Qckr;QfhJ,fNlqu>RQs7cQ.rVu?dJ,B9'rVu?dJ,B9'
+rr;`m^]"3$r-nbIrnmbV!WW0"qr%MSrrDrSs8W*!qr%MSrrDrSs5!_NrrM$OrVlrts1eO4!Pdgr
+rrN#rr;Qfqs7uZqYNu/e!rDp]rVln*hu3QVp&0C=rrN-!q>UK!p\k*nqYn8.rrHKQrVlokrqucs
+rr;fo!O)7rrrW&r+8u3??e>8V!qlMArVlots7uZqYODGi!rDr3rVln*fDY^Np&0C=rrN-!q>UKP
+j8JuZrU1j,rrKgZrVloqhYdBSpcmU7J,~>
+%%EndData
+%showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/linear-fig.ps.ORIGINAL b/docsrc/nyquist/linear-fig.ps.ORIGINAL
new file mode 100644
index 0000000..5008114
--- /dev/null
+++ b/docsrc/nyquist/linear-fig.ps.ORIGINAL
@@ -0,0 +1,62 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: linear-fig.ps
+%%CreationDate: Wed Jul 13 12:16:49 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+0 176 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2321 ASCII Bytes
+image
+s8N)ri;WlYrVPOQ!rr,oi;WlYrVPOQ!rr5oi;WlYqtT+L"98/n5N2YBrrN#SiW&rX!W2'=s8W*"
+qt]4Ns8N,sro*nWrrW)t5N;_CrrW#rhr=\9rrW)tkMlOArrW)tqr7YUrrW)tr8RbVrr`/us*s)/
+s8N2us8S_Os8W*$qu?]bj8]/Z"8i,uoAflNrr`)ss8:pWs8N)rrr2s_jT#8[!;lcq!70a+s8N)r
+rr2uijT#8[!;lcq!<)!Ys8N)rrr3#uJ*$_1rrDrprrBgqs8W*!qu-NpcfP3,rrDlnrrDfTs8W*!
+qu-NpqrRkXrrDrprrDuYs8W*!qu$HoJ*-e2rrDrorrA\Rs8W*!qu$HokN;gErrDrorrDlWs8W*!
+qu$HprdX,2s8N)pqu6YgkPtS^!;lZn!:T+Ns8N)rqu6ZfkPtS^!;lZn!<)*\s8N)rqu6]rJ*?n6
+TB#hFrrA\TrrV*Hqtg<mn*'cQhrjn5rrDZSrrV*Tq"k!jrTO7_hs:19rrN+Kl2Lehp\Xdd!5Idu
+s8N)rq>UH@l2Ue`!;lTl!;#ITs8N)rq>UHnl2Ue`!;lTl!WIT6s8W*!qtU0k^Ztk!rrDlirrCC1
+s8W*!qtU0kpZheYrrDrkrrDl[s8W*!qtU0lrdX86s8N)rp\t6.li7"b!;lNj!71!2s8N)rp\t6f
+li7"b!;lNj!;Ys\s8N)pp\t9nJ*d48rrDrirrBh#s8W*!qtC$icg:]3rrDrirrDZWs8W*!qtC$i
+rTsRarrDrirrN+KmJm4d!;lHh!5Iq$s8N)rp&>$<mJm4d!;Z<f!;#UXs8N)rp&>$jmJm4d!;lHh
+!WIT:s8W*!qt0mg^[D.%rrDrgrrCC5s8W*!qt0mgp[8(]rrDrgrrDl_s8W*!qt0mhrdXD:s8N)p
+oD\g*n,NFf!;lBf!71-6s8N)roD\gbn,NFf!;lBf!;Z*`s8N)roD\jjJ+3I>s7uQ_rrBh'rrW6!
+qssaecg^r9s8DicrrDZ[rrW6!q""FbrUBggs8DicrrN+Knc&[jn9a^*!2&f]s8N)rnc&UPnc/Xh
+!;l<d!;Z0bs8N)rnc&XhJ+EX>rrDrcrrBh)s8W*!q=+Cacgq,9rrDrcrrDZ]s8W*!qsaUcr:9mf
+rrDrbrr>:Ts8W*!qsXObch%2:rrDrbrrDfbs8W*!qsXObq=FXdrrDrbrrE&is8W*!q<n7_5P5!U
+rrDrarrCC;s8W*!qsOIap[nLcrrDrarrDles8W*!qsOIarq-6jrrDr`rr>:Vs8W*!qsFC`ht@$L
+rrDr`rrD6Ts8W*!q<e1^q=XdfrrDr`rrE&ks8W*!qs==_5PG-WrrDr_rrCsMs8W*!qs==_kP"rU
+rrDr_rrDlgs8W*!qs==_rq?BlrrDr^rr>:Xs8W*!q<S%\chIJ>rrDr^rrDffs8W*!qs47^q=jph
+rrDr^rrE&ms8W*!qs+1]5PY6[hrFV!rrCC?rrTCmqs+1]p\=aiYNPfJrrDlirrTD$q!.kZrqQKp
+YNu)Mrr>:ZrrV'Oqs"+\htd<PrrDr\rrD6Xs8W*!qs"+\q>('jrrDr\rrE&os8W*!qrn%[5PkE[
+rrDr[rrCsQs8W*!q<7hYkPG5YrrDr[rrDrms8W*!qrn%[r;-HnrrDrZrr>:\s8W*!qrdtZhu!HR
+rrDrZrrD6Zs8W*!qrdtZqtpEnrrDrZrrDuos8W*!q<%\W5Q(Q]rrDrYrrCCCs8W*!qr[nYoDJXg
+rrDrYrrDups8W*!qrRhXJ,TEIrrDrXrrA\is8W*!qrRhXn,<:drrDrXrrDZhs8W*!q;qVVr;HZq
+rrDrWrr@QJs8W*!qrIbWTDnljrrDrWrrDNes8W*!qrIbWoD\dirrDrWrrE#ss8W*!qrIbZrdXtJ
+s8N)rj8T1Qs8W-!!;Y[T!q60hs8N)rj8T2Ps8W-!!;kgV!r`0!s8N)rj8T2[J,fQK!;kdU!MBDl
+rrDrUrrMTgs8N)rqu6Z2r;Qcoqu6YGr;Qckr;QfhJ,fNlqu>RQs7cQ.rVu?dJ,B9'rVu?dJ,B9'
+rr;`m^]"3$r-nbIrnmbV!WW0"qr%MSrrDrSs8W*!qr%MSrrDrSs5!_NrrM$OrVlrts1eO4!Pdgr
+rrN#rr;Qfqs7uZqYNu/e!rDp]rVln*hu3QVp&0C=rrN-!q>UK!p\k*nqYn8.rrHKQrVlokrqucs
+rr;fo!O)7rrrW&r+8u3??e>8V!qlMArVlots7uZqYODGi!rDr3rVln*fDY^Np&0C=rrN-!q>UKP
+j8JuZrU1j,rrKgZrVloqhYdBSpcmU7J,~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/logistic-fig.ps b/docsrc/nyquist/logistic-fig.ps
new file mode 100644
index 0000000..bba10a3
--- /dev/null
+++ b/docsrc/nyquist/logistic-fig.ps
@@ -0,0 +1,69 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: logistic-fig.ps
+%%CreationDate: Wed Jul 13 12:17:06 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 303 191
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 176 translate
+-40 760 translate
+288 -176 scale
+% Image geometry
+288 176 1
+% Transformation matrix
+[ 288 0 0 176 0 0 ]
+currentfile /ASCII85Decode filter /RunLengthDecode filter
+%%BeginData: 2767 ASCII Bytes
+image
+li-tZo`+@Z"7Q,Jp[nLRrr^mG^\@C#mf*C@qk*WTs7$$lpcmC-n+$&MnG`[`T@`h@p[nLTs8MHg
+ESpN_s7$$hhtR-M!;H-cnG`O(p\t0mp[nLTrrIWHrr2umo`+F\!It(IrrDZ_s7-*jrr;rrrrDfc
+s7-*jrr;usrrDfcs7-*nrVunIs8Vics7-*nrVunIs8Vics7-*nqu?]2s8Vics7-*nqu?]2s8Vic
+s7-*np](9Ns8V]_s7-*np](9Ns8Vics7-*nn,NFFs8Vics7-*nn,NFVs8Vics7-*nn,NFVs8Vic
+s7-*nhuE`Fs8Vics7-*nhuE`Ns8V]_s7-*nhuE`Ns8Vics7-*n^]4?2s8Vics7-*n^]4?2s8Vic
+s7-*nJ,fQGs8Vics7-*nJ,fQIs8Vics7-*nJ,fQIs8Vics760irr2p"rVuoho`+L^!<2ut"9/?#
+p[nLVrrE&trr`9#s7c0co)A^grr3*"^[Lphs760irVc`t?e>&Es760irVc`t?gma]s760iqu-Nr
++7Jals760iqu-Nr+5chbs760ip\k*n]uTm>s760ip\k*nhuEHCs760ip\k*nhuEHCs760in,<7f
+huEHCs760in,<7fn,N"Os760in,<7fn,N.Ss760ihu3QVn,N.Ss760ihu3QVp](![s760ihu3QV
+p](![s760i^]"06qu?E_s760i^]"06qu?E_s760i^]"06qu?9[s760i^]"06rVuWas760iJ,TBK
+rVuWas760iJ,TBKrVuWas760iJ,TBKrr;`bs7?6jrquctrr;`bs7?6jrquctrr;T^s7?6jrquct
+rr;`bs7?6jrVQTqJ+rU8oD\ghqu6\Hp[nLWrrE#prrIWDo`+O_!<)fp!PeC$s7?6jqtpBo^\@C#
+oD\gfqu6]3oCW(SrrDrnrrM$Oo`+O_!;HBj!T3YDs7?6jp\k*on+2V7o`+O_!;HHl"5!FBp[nLW
+rrDflrr^mMO8&;HoD\gZrVluOqsX(Is7?6jn,<7gfDDcGo`+O_!:Tmd"7KXLp[nLWrrCsRs8Vic
+s7?6jhu!HRp[nLWrrCsRs8Vics7?6j^\e$3qt'I[oD\g*qu6]op[nLWrrBh2rrN#ko`+O_!5JF2
+!WDcbs7?6jJ,B6HrV,saoD\f?qu6]qp[nLWrr@QGrrN,no`+R`!<2ip!WM]_s7H<krqcWqrqH'b
+o`"pjqYpTqp[nLXrrE#nrr@98s7H<krV?HnGP(q-rrDrlrr@-4s7H<kqt^6l\+K^mrrDrlrrBP#
+s7H<kp\FghfC]+8rrDfhrrC[Cs7H<kp\FghfC]+8rrDN`rrD6Ss7H<kn+lt`j7NBDrrCsPrrDfc
+s7H<khtd9Pp[nLXrrCsRrrTs]p[nLXrrBh2rrQQroCW(TrrBh2rrQQroCW(TrrBh2rrQQrnaukR
+rr@QGrrQQrp%8:Vrr@QGrrTldp@SCWrr@QErrDcbs7QBlrqQKnp@SCXrrE&nrrMkDp&F^b!<)]m
+!V:g6s7QBlrV6BnpV6D$p&>$jq#:Bh^\.X"rrDrkrrMl/p&F^b!;lQk!VbLEs7QBlp\=ahpYYZD
+p&>$dq#:Bhn+H_RrrDN_rrM`[p&F^b!:T^_!Vc'Us7QBlht[6Op\"RZrrCsOs8Vids7QBl^\Ig0
+p\XX`p&>$,q#:Bhqt:!^rr@QDrrM`ip&F^b!.XeD!VcQcs7ZHmrqHEnp\sjcpAY-lp\t9grq6<b
+rrE#lrrVrpJ+ip9rrE#lrrVrpJ+ip9rrDrjrrVrp^\7^$rrDrjrrVfl^\7^$rrDffrrVrphtI*D
+rrDffrrVrphtI*DrrDNarrqlgO8&\CpAajd!:Tda"kWF^p](!]s7ZHmhtm?VfCbd1s7c6epAY-M
+qYp`Np$_GNqtC'`rrBh1rrq$IYP8(opAajd!.XkF"n-fqp](3cs7cNnrq??np](6ds7cNnrq??n
+p](6ds7cNnrV$6np](8Cp](!f!;lKi"7uQm^\@d&rrDferr`#qs53SNp\t6^pAY6hs8V!Ns7cNn
+htI'Pp](9^p](!f!5J7-"8Diqp\4^^rrBh-rr`#qs82Qjp\t5CpAY6hs8W&ls7lTorq69noDeji
+p]($g!<)Tj!;HKm!.XeDq#:?cp&>$drr2u5q#C-h!:TU\!;HKm!8mSOq#:?Op&>$drr2u]q#C-h
+!5J4,!;HKm!;lQkq>UKpJ+`gAoD\airV6EgrrDlerrDfmrrN+Kq>^9j!;H-c!;HHl!2')eq>UH@
+o`"pcrVll\q>^9j!'g,U!;HHl!;ZHjqYpQnoD\gbrVlotJ,93ArrDZ^rrDfkrrA,Vs82fsrX\W#
+!;$-g!:]jbqu6ZTo)A^aqu6X\qu?Qn!2&i^!;HBj!5\R4r;QfeJ+EU>p\XskrX\r,rVm!#&-)\,
+rVllTrr2utrVlllrVm#8s8VQhrVn,Bqu?_H^[LporVqA^hs^I@rr7J_n+Z_Xs*qf@n,*"_!.Y"K
+rnd\Us6K[bp[nLOrrDfcs6K[bp[nLOrrDfcs5!_RrrBh5rrDuqrrDflrr@QErr@QJrrE#rs8Drt
+?iL'*qu-NpkPkJ^rkJ=0!WKk5rrDlns8Drt^]+65q>L<nfDY^LJ,0*EJ,]HJp&4pirrM.err2s:
+rr3#o_uBZ:a+*pb!.Y"J!:]serVlk)rr2uprVlllrr2utq>UHorVllrrVuir!5JO5!;ZTn!9=(Y
+!WG=[rrN*`rr2unrVt^RJ,~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/moog-fig.ps b/docsrc/nyquist/moog-fig.ps
new file mode 100644
index 0000000..ba08a06
--- /dev/null
+++ b/docsrc/nyquist/moog-fig.ps
@@ -0,0 +1,2808 @@
+%!PS-Adobe-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: moog.ps
+%%CreationDate: Tue Oct 11 08:13:23 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 1131 618
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456693 14.173228346456693 translate
+% Translate to begin of first scanline
+%0 603 translate
+0 725 translate
+1116 -603 scale
+% Image geometry
+1116 603 8
+% Transformation matrix
+[ 1116 0 0 603 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 1116 string def
+/gstr 1116 string def
+/bstr 1116 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData: 149912 ASCII Bytes
+colorimage
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$VuHb#JUbC`_uG5~>
+JcC<$JcC<$JcC<$VuHb#JUbC`_uG5~>
+JcC<$JcC<$JcC<$VuHb#JUbC`_uG5~>
+JcC<$JcC<$JcC<$VuHa(JH3Ca_uG5~>
+JcC<$JcC<$JcC<$VuHa(JH3Ca_uG5~>
+JcC<$JcC<$JcC<$VuHa(JH3Ca_uG5~>
+JcC<$JcC<$JcC<$VuHg*!)S5r_LMRc_uG5~>
+JcC<$JcC<$JcC<$VuHg*!)S5r_LMRc_uG5~>
+JcC<$JcC<$JcC<$VuHg*!)S5r_LMRc_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+qZ$?kJcC<$JcC<$JcC<$[f6D9!2+oC_Z0W9_uG5~>
+qZ$?kJcC<$JcC<$JcC<$[f6D9!2+oC_Z0W9_uG5~>
+qZ$?kJcC<$JcC<$JcC<$[f6D9!2+oC_Z0W9_uG5~>
+q>UHJr;ZiNcMmllJcC<$JcC<$JcC<$l2Lfl!2+oC_Z0W9_uG5~>
+q>UHJr;ZiNcMmllJcC<$JcC<$JcC<$l2Lfl!2+oC_Z0W9_uG5~>
+q>UHJr;ZiNcMmllJcC<$JcC<$JcC<$l2Lfl!2+oC_Z0W9_uG5~>
+q#C9mcMmp(!.k0$s+13$s+13$s69Ob?N?aMs2+g9!5nhe~>
+q#C9mcMmp(!.k0$s+13$s+13$s69Ob?N?aMs2+g9!5nhe~>
+q#C9mcMmp(!.k0$s+13$s+13$s69Ob?N?aMs2+g9!5nhe~>
+q#C9mci4&o!!%TMJcC<$JcC<$JcG!7!abr#JcEUerrBt:J,~>
+q#C9mci4&o!!%TMJcC<$JcC<$JcG!7!abr#JcEUerrBt:J,~>
+q#C9mci4&o!!%TMJcC<$JcC<$JcG!7!abr#JcEUerrBt:J,~>
+q#C9mdJj7+BDqm^s+13$s+13$s+147rrQO-TRm-[s8N):s*t~>
+q#C9mdJj7+BDqm^s+13$s+13$s+147rrQO-TRm-[s8N):s*t~>
+q#C9mdJj7+BDqm^s+13$s+13$s+147rrQO-TRm-[s8N):s*t~>
+q#C9mrVucq"om8'!)1*)s82j"l"9uiZMjh$!<<)s!<<'!ReZr7s+13$s+13$s+14:rrQO-TRm-[
+s8N):s*t~>
+q#C9mrVucq"om8'!)1*)s82j"l"9uiZMjh$!<<)s!<<'!ReZr7s+13$s+13$s+14:rrQO-TRm-[
+s8N):s*t~>
+q#C9mrVucq"om8'!)1*)s82j"l"9uiZMjh$!<<)s!<<'!ReZr7s+13$s+13$s+14:rrQO-TRm-[
+s8N):s*t~>
+q#C9mrVll^r;Zi'qu?`1rr2u_r;[#!s-`ofN;ihWl2:V^rrD<^!<)rr!.k0$s+13$s+13$s69Ob
+?N?aMs2+g9!5nhe~>
+q#C9mrVll^r;Zi'qu?`1rr2u_r;[#!s-`ofN;ihWl2:V^rrD<^!<)rr!.k0$s+13$s+13$s69Ob
+?N?aMs2+g9!5nhe~>
+q#C9mrVll^r;Zi'qu?`1rr2u_r;[#!s-`ofN;ihWl2:V^rrD<^!<)rr!.k0$s+13$s+13$s69Ob
+?N?aMs2+g9!5nhe~>
+q#C9mr;Z]q!b_#]rVuq2rVufr!q?6CrVurOrr;osrr;osrVufrJcC<$JcC<$JcC<$l2Lfl!2+oC
+_Z0W9_uG5~>
+q#C9mr;Z]q!b_#]rVuq2rVufr!q?6CrVurOrr;osrr;osrVufrJcC<$JcC<$JcC<$l2Lfl!2+oC
+_Z0W9_uG5~>
+q#C9mr;Z]q!b_#]rVuq2rVufr!q?6CrVurOrr;osrr;osrVufrJcC<$JcC<$JcC<$l2Lfl!2+oC
+_Z0W9_uG5~>
+q#C9mr;Z]q!oa1Zr;cfrr;clt!:]sf!1Noer;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUe
+rrBt:J,~>
+q#C9mr;Z]q!oa1Zr;cfrr;clt!:]sf!1Noer;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUe
+rrBt:J,~>
+q#C9mr;Z]q!oa1Zr;cfrr;clt!:]sf!1Noer;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUe
+rrBt:J,~>
+q#C9mr;Z]qrr;osrVufrrr;rt!,)<2r;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUerrBt:
+J,~>
+q#C9mr;Z]qrr;osrVufrrr;rt!,)<2r;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUerrBt:
+J,~>
+q#C9mr;Z]qrr;osrVufrrr;rt!,)<2r;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUerrBt:
+J,~>
+q#C9mr;Z]qrr;osrVufrrr;osrr;osrr;osrVufrJcC<$JcC<$JcC<$l2Lfl!2+oC_Z0W9_uG5~>
+q#C9mr;Z]qrr;osrVufrrr;osrr;osrr;osrVufrJcC<$JcC<$JcC<$l2Lfl!2+oC_Z0W9_uG5~>
+q#C9mr;Z]qrr;osrVufrrr;osrr;osrr;osrVufrJcC<$JcC<$JcC<$l2Lfl!2+oC_Z0W9_uG5~>
+q#C9mr;Z]qrr;osrVufrrr;osrr;osrr;osrVufrJcC<$JcC<$JcC<$l2Lfl!2+oC_Z0W9_uG5~>
+q#C9mr;Z]qrr;osrVufrrr;osrr;osrr;osrVufrJcC<$JcC<$JcC<$l2Lfl!2+oC_Z0W9_uG5~>
+q#C9mr;Z]qrr;osrVufrrr;osrr;osrr;osrVufrJcC<$JcC<$JcC<$l2Lfl!2+oC_Z0W9_uG5~>
+q#C9mr;Z]qrr;osrVufrrr;rt!,)<2r;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUerrBt:
+J,~>
+q#C9mr;Z]qrr;osrVufrrr;rt!,)<2r;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUerrBt:
+J,~>
+q#C9mr;Z]qrr;osrVufrrr;rt!,)<2r;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUerrBt:
+J,~>
+q#C9mr;Z]qrr;osrVufrrr;rt!1Noer;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUerrBt:
+J,~>
+q#C9mr;Z]qrr;osrVufrrr;rt!1Noer;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUerrBt:
+J,~>
+q#C9mr;Z]qrr;osrVufrrr;rt!1Noer;cisr;cfrr;_EKJcC<$JcC<$JcG!7!abr#JcEUerrBt:
+J,~>
+q#C9mr;Z]qrr;osrVufrs8N)XrVurFrr2t2rW!#Ys*XbFrVljkrW!#ad#<PUJcC<$JcC<$JcG*:
+!abr#JcEUerrBt:J,~>
+q#C9mr;Z]qrr;osrVufrs8N)XrVurFrr2t2rW!#Ys*XbFrVljkrW!#ad#<PUJcC<$JcC<$JcG*:
+!abr#JcEUerrBt:J,~>
+q#C9mr;Z]qrr;osrVufrs8N)XrVurFrr2t2rW!#Ys*XbFrVljkrW!#ad#<PUJcC<$JcC<$JcG*:
+!abr#JcEUerrBt:J,~>
+q>UHJr;ZiNrr2u_r;Zo`s8W#t!9sL_r;[#,s-`ofN;`bV^&.j1I/O$Fl2L\_ZMX\&fn'0Ss+13$
+s+13$s6Tae?N?aMs2+g9!5nhe~>
+q>UHJr;ZiNrr2u_r;Zo`s8W#t!9sL_r;[#,s-`ofN;`bV^&.j1I/O$Fl2L\_ZMX\&fn'0Ss+13$
+s+13$s6Tae?N?aMs2+g9!5nhe~>
+q>UHJr;ZiNrr2u_r;Zo`s8W#t!9sL_r;[#,s-`ofN;`bV^&.j1I/O$Fl2L\_ZMX\&fn'0Ss+13$
+s+13$s6Tae?N?aMs2+g9!5nhe~>
+qZ$?ks8Vrrs8Vusrr;os"Rqi[9X=Qq"hdS0B;be-!<)p#]hAERfn'0Ss+13$s+13$s6K[d?N?aM
+s2+g9!5nhe~>
+qZ$?ks8Vrrs8Vusrr;os"Rqi[9X=Qq"hdS0B;be-!<)p#]hAERfn'0Ss+13$s+13$s6K[d?N?aM
+s2+g9!5nhe~>
+qZ$?ks8Vrrs8Vusrr;os"Rqi[9X=Qq"hdS0B;be-!<)p#]hAERfn'0Ss+13$s+13$s6K[d?N?aM
+s2+g9!5nhe~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+i;``UJcC<$JcC<$JcC<$bl7`O!2+oC_Z0W9_uG5~>
+iVroBr;Zi^JcC<$JcC<$JcC<$c2RiP!2+oC_Z0W9_uG5~>
+iVroBr;Zi^JcC<$JcC<$JcC<$c2RiP!2+oC_Z0W9_uG5~>
+iVroBr;Zi^JcC<$JcC<$JcC<$c2RiP!2+oC_Z0W9_uG5~>
+iW&cTJcC<$JcC<$JcC<$c2RiP!2+oC_Z0W9_uG5~>
+iW&cTJcC<$JcC<$JcC<$c2RiP!2+oC_Z0W9_uG5~>
+iW&cTJcC<$JcC<$JcC<$c2RiP!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcC<$VuHg*!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcFp5s*TCt_uBdF!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcFp5s*TCt_uBdF!2+oC_Z0W9_uG5~>
+JcC<$JcC<$JcFp5s*TCt_uBdF!2+oC_Z0W9_uG5~>
+JcC<$JcC<$MuNdjrVusml1tAW!:^$gI"D=8rrQO-TRm-[s8N):s*t~>
+JcC<$JcC<$MuNdjrVusml1tAW!:^$gI"D=8rrQO-TRm-[s8N):s*t~>
+JcC<$JcC<$MuNdjrVusml1tAW!:^$gI"D=8rrQO-TRm-[s8N):s*t~>
+JcC<$JcC<$M>m\:RK.a1rrUjRfn'1,rrQO-TRm-[s8N):s*t~>
+JcC<$JcC<$M>m\:RK.a1rrUjRfn'1,rrQO-TRm-[s8N):s*t~>
+JcC<$JcC<$M>m\:RK.a1rrUjRfn'1,rrQO-TRm-[s8N):s*t~>
+g]%9:JcC<$JcC<$Y5eM%!1N]_!!%TM^&J/[B>=->!abr#JcEUerrBt:J,~>
+g]%9:JcC<$JcC<$Y5eM%!1N]_!!%TM^&J/[B>=->!abr#JcEUerrBt:J,~>
+g]%9:JcC<$JcC<$Y5eM%!1N]_!!%TM^&J/[B>=->!abr#JcEUerrBt:J,~>
+h#@H=!*OmQJcC<$JcDqR!s"8[^%q[.!.k0`rrp.;!#9.]q#:D&!2+oC_Z0W9_uG5~>
+h#@H=!*OmQJcC<$JcDqR!s"8[^%q[.!.k0`rrp.;!#9.]q#:D&!2+oC_Z0W9_uG5~>
+h#@H=!*OmQJcC<$JcDqR!s"8[^%q[.!.k0`rrp.;!#9.]q#:D&!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR"9AIL!875K!!%TM^&J)Iqu?d5B>=?D!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcDqR"9AIL!875K!!%TM^&J)Iqu?d5B>=?D!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcDqR"9AIL!875K!!%TM^&J)Iqu?d5B>=?D!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcDqR"T\Se9MF^Jrr<&rrs%tj9E7banGW@hnAgstrVm&,9ME.a!;uj#l).2T
+B>&lrkPkOsq#CI2B>=HG!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcDqR"T\Se9MF^Jrr<&rrs%tj9E7banGW@hnAgstrVm&,9ME.a!;uj#l).2T
+B>&lrkPkOsq#CI2B>=HG!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcDqR"T\Se9MF^Jrr<&rrs%tj9E7banGW@hnAgstrVm&,9ME.a!;uj#l).2T
+B>&lrkPkOsq#CI2B>=HG!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcDqR"T\T&f`6Esrr<&srs7j_^&S,c9MF.=rr[X]!!*#u#-trBs2P*>rVm,L
+9[NguHiSQ]rrMSDJUdZK!+5F""Vk[b?N?aMs2+g9!5nhe~>
+h#@Gj!'l,8JcC<$JcDqR"T\T&f`6Esrr<&srs7j_^&S,c9MF.=rr[X]!!*#u#-trBs2P*>rVm,L
+9[NguHiSQ]rrMSDJUdZK!+5F""Vk[b?N?aMs2+g9!5nhe~>
+h#@Gj!'l,8JcC<$JcDqR"T\T&f`6Esrr<&srs7j_^&S,c9MF.=rr[X]!!*#u#-trBs2P*>rVm,L
+9[NguHiSQ]rrMSDJUdZK!+5F""Vk[b?N?aMs2+g9!5nhe~>
+h#@Gj!'l,8JcC<$JcDqR!!*#u!lk;0r;Q`sr;Qe1^&@s5kl=EHrVultrr2slrVlo(!<3!"n4^n%
+rr^pS!57h#!0;[2mJm;'!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!*#u!lk;0r;Q`sr;Qe1^&@s5kl=EHrVultrr2slrVlo(!<3!"n4^n%
+rr^pS!57h#!0;[2mJm;'!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!*#u!lk;0r;Q`sr;Qe1^&@s5kl=EHrVultrr2slrVlo(!<3!"n4^n%
+rr^pS!57h#!0;[2mJm;'!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!)ut!iH%3rVlitrVlr>!9sF]!iH%(rVultrr3!!VuH\sn,WIf!N,qq
+s8N'!I.%"8muN$LrdOoTp&G7DJ(J$-TRm-[s8N):s*t~>
+h#@Gj!'l,8JcC<$JcDqR!!)ut!iH%3rVlitrVlr>!9sF]!iH%(rVultrr3!!VuH\sn,WIf!N,qq
+s8N'!I.%"8muN$LrdOoTp&G7DJ(J$-TRm-[s8N):s*t~>
+h#@Gj!'l,8JcC<$JcDqR!!)ut!iH%3rVlitrVlr>!9sF]!iH%(rVultrr3!!VuH\sn,WIf!N,qq
+s8N'!I.%"8muN$LrdOoTp&G7DJ(J$-TRm-[s8N):s*t~>
+h#@Gj!'l,8JcC<$JcDqR!!)rs!dk"$rr2rurVlnG!;lcti;dNhs8N)urr\\i9YL?'!,)',JcG!7
+!5J=0![iKLrr3%,!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!)rs!dk"$rr2rurVlnG!;lcti;dNhs8N)urr\\i9YL?'!,)',JcG!7
+!5J=0![iKLrr3%,!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!)rs!dk"$rr2rurVlnG!;lcti;dNhs8N)urr\\i9YL?'!,)',JcG!7
+!5J=0![iKLrr3%,!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!)ors%EOZs8N)ts8N)qs8N)ts8N)trrebj!)0<hs8N(Ms5EtX^\e'5
+-\'bFrrQO-TRm-[s8N):s*t~>
+h#@Gj!'l,8JcC<$JcDqR!!)ors%EOZs8N)ts8N)qs8N)ts8N)trrebj!)0<hs8N(Ms5EtX^\e'5
+-\'bFrrQO-TRm-[s8N):s*t~>
+h#@Gj!'l,8JcC<$JcDqR!!)ors%EOZs8N)ts8N)qs8N)ts8N)trrebj!)0<hs8N(Ms5EtX^\e'5
+-\'bFrrQO-TRm-[s8N):s*t~>
+h#@Gj!'l,8JcC<$JcDqR!!)or"mJ^.s8N)ts8N)qs8N)ts8N)srsI__!!#^Ws8N'!n:CW!rrp.;
+!%39Jq#:D&!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!)or"mJ^.s8N)ts8N)qs8N)ts8N)srsI__!!#^Ws8N'!n:CW!rrp.;
+!%39Jq#:D&!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!)or"mJ^.s8N)ts8N)qs8N)ts8N)srsI__!!#^Ws8N'!n:CW!rrp.;
+!%39Jq#:D&!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!)lq"OI.;rrE#t!bVMdqu6ZsN;`eV!;c^$l$NJis8Q^3a8Gr<n7R=P
+l2Lh2J(OAn!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcDqR!!)lq"OI.;rrE#t!bVMdqu6ZsN;`eV!;c^$l$NJis8Q^3a8Gr<n7R=P
+l2Lh2J(OAn!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcDqR!!)lq"OI.;rrE#t!bVMdqu6ZsN;`eV!;c^$l$NJis8Q^3a8Gr<n7R=P
+l2Lh2J(OAn!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcDqR!!)ip"2+]J!<)p!Z2gg#rrVEbd/F"E!<3!!!:^!f#Oh]ns8Sts9`4nk
+]o7OBgA_4]!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!)ip"2+]J!<)p!Z2gg#rrVEbd/F"E!<3!!!:^!f#Oh]ns8Sts9`4nk
+]o7OBgA_4]!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!)ip"2+]J!<)p!Z2gg#rrVEbd/F"E!<3!!!:^!f#Oh]ns8Sts9`4nk
+]o7OBgA_4]!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDqR!!)fo!h')hr;Qgl!9*nV!PN.Ds8N)urrE,*rVm<,BE/"r!!$Zbs8UG>
+d"25NrrQO-TRm-[s8N):s*t~>
+h#@Gj!'l,8JcC<$JcDqR!!)fo!h')hr;Qgl!9*nV!PN.Ds8N)urrE,*rVm<,BE/"r!!$Zbs8UG>
+d"25NrrQO-TRm-[s8N):s*t~>
+h#@Gj!'l,8JcC<$JcDqR!!)fo!h')hr;Qgl!9*nV!PN.Ds8N)urrE,*rVm<,BE/"r!!$Zbs8UG>
+d"25NrrQO-TRm-[s8N):s*t~>
+h#@Gj!'l,8JcC<$JcDtS!ndS,q#:AB!;uj&fh>)ds8U,5l2CVkci='ms8N'!ZN's&!7:`F!7:TC
+!2kDJg&D+\!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDtS!ndS,q#:AB!;uj&fh>)ds8U,5l2CVkci='ms8N'!ZN's&!7:`F!7:TC
+!2kDJg&D+\!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDtS!ndS,q#:AB!;uj&fh>)ds8U,5l2CVkci='ms8N'!ZN's&!7:`F!7:TC
+!2kDJg&D+\!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcE"TquHQm!Ure[rs%_V9E8_'nGWCa!!iN(l+L^0I+eGt"lYmM!.;J2s4I>Q
+?N?aMs2+g9!5nhe~>
+h#@Gj!'l,8JcC<$JcE"TquHQm!Ure[rs%_V9E8_'nGWCa!!iN(l+L^0I+eGt"lYmM!.;J2s4I>Q
+?N?aMs2+g9!5nhe~>
+h#@Gj!'l,8JcC<$JcE"TquHQm!Ure[rs%_V9E8_'nGWCa!!iN(l+L^0I+eGt"lYmM!.;J2s4I>Q
+?N?aMs2+g9!5nhe~>
+h#@Gj!'l,8JcC<$JcDMF!:YR>Y5\Q1!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDMF!:YR>Y5\Q1!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcDMF!:YR>Y5\Q1!2+oC_Z0W9_uG5~>
+h#@Gj!'l,8JcC<$JcC<$JcF'r!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcC<$JcF'r!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcC<$JcF'r!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcC<$JcF'r!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcC<$JcF'r!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcC<$JcF'r!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcC<$JcF'r!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcC<$JcF'r!abr#JcEUerrBt:J,~>
+h#@Gj!'l,8JcC<$JcC<$JcF'r!abr#JcEUerrBt:J,~>
+h#@Gj!'mpkJO&`j!4ROZJcC<$JcDkP!abr#JcEUerrBt:J,~>
+h#@Gj!'mpkJO&`j!4ROZJcC<$JcDkP!abr#JcEUerrBt:J,~>
+h#@Gj!'mpkJO&`j!4ROZJcC<$JcDkP!abr#JcEUerrBt:J,~>
+h#@Gj!'mpkJH53?!2+oCJcC<$JcDkP!abr#JcEUerrBt:J,~>
+h#@Gj!'mpkJH53?!2+oCJcC<$JcDkP!abr#JcEUerrBt:J,~>
+h#@Gj!'mpkJH53?!2+oCJcC<$JcDkP!abr#JcEUerrBt:J,~>
+h#@Gj!'mpk!<<jc^\,>C?N?aMs+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<<jc^\,>C?N?aMs+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<<jc^\,>C?N?aMs+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+.r#^AuT2s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+.r#^AuT2s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+.r#^AuT2s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+(0c!!#98s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+(0c!!#98s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+(0c!!#98s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(M5f>nh/c\.fs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(M5f>nh/c\.fs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(M5f>nh/c\.fs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N),s8RKGrr_c2RK3?e"7X@"!20>n^ApNMs+13DrrQO-TRm-[
+s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N),s8RKGrr_c2RK3?e"7X@"!20>n^ApNMs+13DrrQO-TRm-[
+s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N),s8RKGrr_c2RK3?e"7X@"!20>n^ApNMs+13DrrQO-TRm-[
+s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)QrrL0!rW!"IZLHrTs*XhG",pjm!<3!#N+W+jbPq_7fs6P:
+g]%>i!'l,8JcDGD!abr#JcEUerrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)QrrL0!rW!"IZLHrTs*XhG",pjm!<3!#N+W+jbPq_7fs6P:
+g]%>i!'l,8JcDGD!abr#JcEUerrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)QrrL0!rW!"IZLHrTs*XhG",pjm!<3!#N+W+jbPq_7fs6P:
+g]%>i!'l,8JcDGD!abr#JcEUerrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)Srr^;8Vr@XT"6$.Oa56jr!;uls!:^!hn,V>F"H96k!!(dR
+!l"_#JcC<$U&P1$!2+oC_Z0W9_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)Srr^;8Vr@XT"6$.Oa56jr!;uls!:^!hn,V>F"H96k!!(dR
+!l"_#JcC<$U&P1$!2+oC_Z0W9_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)Srr^;8Vr@XT"6$.Oa56jr!;uls!:^!hn,V>F"H96k!!(dR
+!l"_#JcC<$U&P1$!2+oC_Z0W9_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)TrrT)ll2(D]ktJ#4s8N)ss8N)grrLIHg].9Rg]%>i!'l,8
+JcDGD!abr#JcEUerrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)TrrT)ll2(D]ktJ#4s8N)ss8N)grrLIHg].9Rg]%>i!'l,8
+JcDGD!abr#JcEUerrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)TrrT)ll2(D]ktJ#4s8N)ss8N)grrLIHg].9Rg]%>i!'l,8
+JcDGD!abr#JcEUerrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)UrrU4@iV<ESf`8_Ds8N)ss8N)grrJPgg].9Rg]%>i!'l,8
+JcDGD!abr#JcEUerrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)UrrU4@iV<ESf`8_Ds8N)ss8N)grrJPgg].9Rg]%>i!'l,8
+JcDGD!abr#JcEUerrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)UrrU4@iV<ESf`8_Ds8N)ss8N)grrJPgg].9Rg]%>i!'l,8
+JcDGD!abr#JcEUerrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)VrrVZiN;!8QMu`A+s8N)ss8N)hrrUOI!8IPR!8IMT^ApNM
+s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)VrrVZiN;!8QMu`A+s8N)ss8N)hrrUOI!8IPR!8IMT^ApNM
+s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)VrrVZiN;!8QMu`A+s8N)ss8N)hrrUOI!8IPR!8IMT^ApNM
+s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)VrrTJ+d.[J@ciCBNrro]%9YKZjqu7&;B)hpjg&M*Aa-m#+
+s8N)ss8N)srs%GN9E5'?^&J$3N;NYUN;ih]n>Aq[9W.CZrs8,7RK3B.B)o70s8N)RrrTq85_8rd
+s.TGo?N?aMs2+g9!5nhe~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)VrrTJ+d.[J@ciCBNrro]%9YKZjqu7&;B)hpjg&M*Aa-m#+
+s8N)ss8N)srs%GN9E5'?^&J$3N;NYUN;ih]n>Aq[9W.CZrs8,7RK3B.B)o70s8N)RrrTq85_8rd
+s.TGo?N?aMs2+g9!5nhe~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N)VrrTJ+d.[J@ciCBNrro]%9YKZjqu7&;B)hpjg&M*Aa-m#+
+s8N)ss8N)srs%GN9E5'?^&J$3N;NYUN;ih]n>Aq[9W.CZrs8,7RK3B.B)o70s8N)RrrTq85_8rd
+s.TGo?N?aMs2+g9!5nhe~>
+h#@Gj!'mpk!<=<ps7QBnIfQ/"rrZUnQfn#@rrCsV!dk";pAYNb!.=hHZG$;<`rH,<rse3dZN's`
+!!(CGHtNEZr;Zcsr;ZcsrVm/M!6>->l$NK:rVultr;RGp9YLK+fh>)ms8Q_E!!'=hiFdQ1s8N)R
+rrTq85_8rds02M*TMV<MpAY2$!2+oC_Z0W9_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ/"rrZUnQfn#@rrCsV!dk";pAYNb!.=hHZG$;<`rH,<rse3dZN's`
+!!(CGHtNEZr;Zcsr;ZcsrVm/M!6>->l$NK:rVultr;RGp9YLK+fh>)ms8Q_E!!'=hiFdQ1s8N)R
+rrTq85_8rds02M*TMV<MpAY2$!2+oC_Z0W9_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ/"rrZUnQfn#@rrCsV!dk";pAYNb!.=hHZG$;<`rH,<rse3dZN's`
+!!(CGHtNEZr;Zcsr;ZcsrVm/M!6>->l$NK:rVultr;RGp9YLK+fh>)ms8Q_E!!'=hiFdQ1s8N)R
+rrTq85_8rds02M*TMV<MpAY2$!2+oC_Z0W9_uG5~>
+h#@Gj!'nF$!9!ML!<=<ps7QBnIfQ/"rr?F*!!5EPkP,#V!8mhV!;-<k!<<'!9`=tlZ2jk'!DJs\
+rrS,Z9`G(l!;uls!;uls!<)ou9E>%k!q61`rVultr;Qe1^&@s5kl=EHrr;uu!7:68rrCgR!l"_#
+JcC<$Yl=]rrW!!rT^V^V!abr#JcEUerrBt:J,~>
+h#@Gj!'nF$!9!ML!<=<ps7QBnIfQ/"rr?F*!!5EPkP,#V!8mhV!;-<k!<<'!9`=tlZ2jk'!DJs\
+rrS,Z9`G(l!;uls!;uls!<)ou9E>%k!q61`rVultr;Qe1^&@s5kl=EHrr;uu!7:68rrCgR!l"_#
+JcC<$Yl=]rrW!!rT^V^V!abr#JcEUerrBt:J,~>
+h#@Gj!'nF$!9!ML!<=<ps7QBnIfQ/"rr?F*!!5EPkP,#V!8mhV!;-<k!<<'!9`=tlZ2jk'!DJs\
+rrS,Z9`G(l!;uls!;uls!<)ou9E>%k!q61`rVultr;Qe1^&@s5kl=EHrr;uu!7:68rrCgR!l"_#
+JcC<$Yl=]rrW!!rT^V^V!abr#JcEUerrBt:J,~>
+h#@Gj!'nF$"$e&LchIG?!$[!op&>)C!2/9M!+5U'!^N+8qZ$QqhuE]Vo`+pks8N*"VuH\sn,WIf
+!keTurVlr`9RQj>rrDusrrDusrrE#ts*XbErrE#trrE#t!lk<*r;Qhr!4)V(rrDNfrrCgR!l"_#
+JcC<$Yl=]rqZ$[oT^VgY!abr#JcEUerrBt:J,~>
+h#@Gj!'nF$"$e&LchIG?!$[!op&>)C!2/9M!+5U'!^N+8qZ$QqhuE]Vo`+pks8N*"VuH\sn,WIf
+!keTurVlr`9RQj>rrDusrrDusrrE#ts*XbErrE#trrE#t!lk<*r;Qhr!4)V(rrDNfrrCgR!l"_#
+JcC<$Yl=]rqZ$[oT^VgY!abr#JcEUerrBt:J,~>
+h#@Gj!'nF$"$e&LchIG?!$[!op&>)C!2/9M!+5U'!^N+8qZ$QqhuE]Vo`+pks8N*"VuH\sn,WIf
+!keTurVlr`9RQj>rrDusrrDusrrE#ts*XbErrE#trrE#t!lk<*r;Qhr!4)V(rrDNfrrCgR!l"_#
+JcC<$Yl=]rqZ$[oT^VgY!abr#JcEUerrBt:J,~>
+h#@Gj!'nF$!'pM`![;U0qYpQr,(]derrRZMT]#hM?haU&5aU[4s8N)Vs8N)ks8N*!rr\\i9YL?'
+!IOn@s8N)ss8N)ss8N)prrhi3HiO0Fs8N)trrIKIqu6`V!,)<2rrDNfrrCgR!l"_#JcC<$Yl=]r
+p](OqT^Vp\?N?aMs2+g9!5nhe~>
+h#@Gj!'nF$!'pM`![;U0qYpQr,(]derrRZMT]#hM?haU&5aU[4s8N)Vs8N)ks8N*!rr\\i9YL?'
+!IOn@s8N)ss8N)ss8N)prrhi3HiO0Fs8N)trrIKIqu6`V!,)<2rrDNfrrCgR!l"_#JcC<$Yl=]r
+p](OqT^Vp\?N?aMs2+g9!5nhe~>
+h#@Gj!'nF$!'pM`![;U0qYpQr,(]derrRZMT]#hM?haU&5aU[4s8N)Vs8N)ks8N*!rr\\i9YL?'
+!IOn@s8N)ss8N)ss8N)prrhi3HiO0Fs8N)trrIKIqu6`V!,)<2rrDNfrrCgR!l"_#JcC<$Yl=]r
+p](OqT^Vp\?N?aMs2+g9!5nhe~>
+h#@Gj!'nF$!'pD]![;U0rVllu,(]derrRZM9&Mr7(%hP15aU[6!!(pV!fR-DpAY3`!0$pW"I];j
+9W.jhrrDcmrrDusrrDusrrDrr#2u"EZKV>hrVultrVultqZ$Qqrr;uun,NCfg]%Aj!'kLS5_22*
+5QE2)!!H,k=ob4Hs2+g9!5nhe~>
+h#@Gj!'nF$!'pD]![;U0rVllu,(]derrRZM9&Mr7(%hP15aU[6!!(pV!fR-DpAY3`!0$pW"I];j
+9W.jhrrDcmrrDusrrDusrrDrr#2u"EZKV>hrVultrVultqZ$Qqrr;uun,NCfg]%Aj!'kLS5_22*
+5QE2)!!H,k=ob4Hs2+g9!5nhe~>
+h#@Gj!'nF$!'pD]![;U0rVllu,(]derrRZM9&Mr7(%hP15aU[6!!(pV!fR-DpAY3`!0$pW"I];j
+9W.jhrrDcmrrDusrrDusrrDrr#2u"EZKV>hrVultrVultqZ$Qqrr;uun,NCfg]%Aj!'kLS5_22*
+5QE2)!!H,k=ob4Hs2+g9!5nhe~>
+h#@Gj!'nF$!'p;Z"X7p3rr=6os7QBnIfL53!!GQRpAb3NrrTJ+a7fN7f`9(krsI__!!#^Ws8N'!
+l1b5X!;uls!;uls!;uiuZ2hT;s8N)ts8N)ts8N)qs8N)us8N)fs8N)RrrTq84b3Ta!29Gq'd<XN
+W;lmFScA]i_uG5~>
+h#@Gj!'nF$!'p;Z"X7p3rr=6os7QBnIfL53!!GQRpAb3NrrTJ+a7fN7f`9(krsI__!!#^Ws8N'!
+l1b5X!;uls!;uls!;uiuZ2hT;s8N)ts8N)ts8N)qs8N)us8N)fs8N)RrrTq84b3Ta!29Gq'd<XN
+W;lmFScA]i_uG5~>
+h#@Gj!'nF$!'p;Z"X7p3rr=6os7QBnIfL53!!GQRpAb3NrrTJ+a7fN7f`9(krsI__!!#^Ws8N'!
+l1b5X!;uls!;uls!;uiuZ2hT;s8N)ts8N)ts8N)qs8N)us8N)fs8N)RrrTq84b3Ta!29Gq'd<XN
+W;lmFScA]i_uG5~>
+h#@Jk!%o"p!!4>E,(]derrRZMQ/KCW8G<)c5aU[5s8N)VrrVZiI.mR@VbHse#jH^:N;roj!6>$;
+!Usb$s8N)ss8N)ss8N)trrTJ+a8Q&<!<)rt!<)p!B)pW^rrE+Yrr;uun,NCfg]%Aj!'o.e^Oa/)
+^ArNQ!!X0FYQ%r0TY^[-!!#^bs8;rrs8RJ;s8N):s*t~>
+h#@Jk!%o"p!!4>E,(]derrRZMQ/KCW8G<)c5aU[5s8N)VrrVZiI.mR@VbHse#jH^:N;roj!6>$;
+!Usb$s8N)ss8N)ss8N)trrTJ+a8Q&<!<)rt!<)p!B)pW^rrE+Yrr;uun,NCfg]%Aj!'o.e^Oa/)
+^ArNQ!!X0FYQ%r0TY^[-!!#^bs8;rrs8RJ;s8N):s*t~>
+h#@Jk!%o"p!!4>E,(]derrRZMQ/KCW8G<)c5aU[5s8N)VrrVZiI.mR@VbHse#jH^:N;roj!6>$;
+!Usb$s8N)ss8N)ss8N)trrTJ+a8Q&<!<)rt!<)p!B)pW^rrE+Yrr;uun,NCfg]%Aj!'o.e^Oa/)
+^ArNQ!!X0FYQ%r0TY^[-!!#^bs8;rrs8RJ;s8N):s*t~>
+h#@Jk!%o"p!!4>E,(]derrRZMT]#hM?hsa(5aU[2s8N)UrrTk6a8#Z9i;gptrrE,hrr35m!!*'!
+VZ9EgrrKEorr;uur;Zcsr;ZcsrVultr;ZcsrVultrVlr)!2obp!pK^3rr;uun,NCfg]%>i!'l,8
+JcDtS!20/g!Yo(GrVlq+!2..-"2+[7^%VI.]`8&cQN-sb_uG5~>
+h#@Jk!%o"p!!4>E,(]derrRZMT]#hM?hsa(5aU[2s8N)UrrTk6a8#Z9i;gptrrE,hrr35m!!*'!
+VZ9EgrrKEorr;uur;Zcsr;ZcsrVultr;ZcsrVultrVlr)!2obp!pK^3rr;uun,NCfg]%>i!'l,8
+JcDtS!20/g!Yo(GrVlq+!2..-"2+[7^%VI.]`8&cQN-sb_uG5~>
+h#@Jk!%o"p!!4>E,(]derrRZMT]#hM?hsa(5aU[2s8N)UrrTk6a8#Z9i;gptrrE,hrr35m!!*'!
+VZ9EgrrKEorr;uur;Zcsr;ZcsrVultr;ZcsrVultrVlr)!2obp!pK^3rr;uun,NCfg]%>i!'l,8
+JcDtS!20/g!Yo(GrVlq+!2..-"2+[7^%VI.]`8&cQN-sb_uG5~>
+h#@Gj!'nF$!'p;Z"X7p3rr=6os7QBnIfQ/"rr?F)!!5EPkP5)W!8[YVVbH(GrrV.QVu?Vr!4)S'%
+01&@s6p!gI-L\2f`:"1s8N)ss8N)ss8N)ts8N'!nGWCe!<)rt!;uiu9E=&MrrKfGrVultn,NCfg
+]%>i!'l,8JcDtS!208j!Yo(GqYpV(!2.+,rr<$mpAY2,!!&;arrBt:J,~>
+h#@Gj!'nF$!'p;Z"X7p3rr=6os7QBnIfQ/"rr?F)!!5EPkP5)W!8[YVVbH(GrrV.QVu?Vr!4)S'%
+01&@s6p!gI-L\2f`:"1s8N)ss8N)ss8N)ts8N'!nGWCe!<)rt!;uiu9E=&MrrKfGrVultn,NCfg
+]%>i!'l,8JcDtS!208j!Yo(GqYpV(!2.+,rr<$mpAY2,!!&;arrBt:J,~>
+h#@Gj!'nF$!'p;Z"X7p3rr=6os7QBnIfQ/"rr?F)!!5EPkP5)W!8[YVVbH(GrrV.QVu?Vr!4)S'%
+01&@s6p!gI-L\2f`:"1s8N)ss8N)ss8N)ts8N'!nGWCe!<)rt!;uiu9E=&MrrKfGrVultn,NCfg
+]%>i!'l,8JcDtS!208j!Yo(GqYpV(!2.+,rr<$mpAY2,!!&;arrBt:J,~>
+h#@Gj!'nF$!'pD]!Yo\#rVllu,(]derrRZMT]#hQ?N<?XkOnlT!8RSV]`=thrr3)RVbGJ8s8N'&
+ZN's&!7:`F!7:TC!2ohr"4.#Jd/O%Ici='mrr3)I!!(CFru@p:I.70_RK*?WZN'rP!9)Uis8UbG
+9[Nh>a%Yasrr^:A!9*JJ"5s4[iS=G7^ApNMs+13Srretp'jn0=rrQO-TYLL/!2fh1q#:HCVZ6^^
+s8N):s*t~>
+h#@Gj!'nF$!'pD]!Yo\#rVllu,(]derrRZMT]#hQ?N<?XkOnlT!8RSV]`=thrr3)RVbGJ8s8N'&
+ZN's&!7:`F!7:TC!2ohr"4.#Jd/O%Ici='mrr3)I!!(CFru@p:I.70_RK*?WZN'rP!9)Uis8UbG
+9[Nh>a%Yasrr^:A!9*JJ"5s4[iS=G7^ApNMs+13Srretp'jn0=rrQO-TYLL/!2fh1q#:HCVZ6^^
+s8N):s*t~>
+h#@Gj!'nF$!'pD]!Yo\#rVllu,(]derrRZMT]#hQ?N<?XkOnlT!8RSV]`=thrr3)RVbGJ8s8N'&
+ZN's&!7:`F!7:TC!2ohr"4.#Jd/O%Ici='mrr3)I!!(CFru@p:I.70_RK*?WZN'rP!9)Uis8UbG
+9[Nh>a%Yasrr^:A!9*JJ"5s4[iS=G7^ApNMs+13Srretp'jn0=rrQO-TYLL/!2fh1q#:HCVZ6^^
+s8N):s*t~>
+h#@Gj!'nF$!'pM`!Yo@_qYpQr,(]derrRZMT]#hNa63$nrrCgR!q<LSrVutXa85f?!9q10!.<Jt
+rrqAM!!%Dnrr;iq!<;or!<;orrr3M,!!%Dns-`qHl2UeJB)nk.rs%_V9E8_'nG`Ib!;$6f!8[YV
+^ApNMs+13SrrLHLo`"u"!2.+,!s%fj9_eViN8Xa:Q2gja_uG5~>
+h#@Gj!'nF$!'pM`!Yo@_qYpQr,(]derrRZMT]#hNa63$nrrCgR!q<LSrVutXa85f?!9q10!.<Jt
+rrqAM!!%Dnrr;iq!<;or!<;orrr3M,!!%Dns-`qHl2UeJB)nk.rs%_V9E8_'nG`Ib!;$6f!8[YV
+^ApNMs+13SrrLHLo`"u"!2.+,!s%fj9_eViN8Xa:Q2gja_uG5~>
+h#@Gj!'nF$!'pM`!Yo@_qYpQr,(]derrRZMT]#hNa63$nrrCgR!q<LSrVutXa85f?!9q10!.<Jt
+rrqAM!!%Dnrr;iq!<;or!<;orrr3M,!!%Dns-`qHl2UeJB)nk.rs%_V9E8_'nG`Ib!;$6f!8[YV
+^ApNMs+13SrrLHLo`"u"!2.+,!s%fj9_eViN8Xa:Q2gja_uG5~>
+h#@Gj!'nF$"$dT6^\@a/!$[!op&>)C!2.[<rr@WM`;]nR!'l,8JcDGD!abr#^]+E:s/,k1qYp]f
+N;ikXrVm&ja-m#.s82lsrrD$V!<)p$l).2TB>+<E#k5m'!<:)P!4'H@rrBt:J,~>
+h#@Gj!'nF$"$dT6^\@a/!$[!op&>)C!2.[<rr@WM`;]nR!'l,8JcDGD!abr#^]+E:s/,k1qYp]f
+N;ikXrVm&ja-m#.s82lsrrD$V!<)p$l).2TB>+<E#k5m'!<:)P!4'H@rrBt:J,~>
+h#@Gj!'nF$"$dT6^\@a/!$[!op&>)C!2.[<rr@WM`;]nR!'l,8JcDGD!abr#^]+E:s/,k1qYp]f
+N;ikXrVm&ja-m#.s82lsrrD$V!<)p$l).2TB>+<E#k5m'!<:)P!4'H@rrBt:J,~>
+h#@Gj!'nF$!8$lC!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL0!<;Ng9`"blVpPGD
+!<)p"HtNEZrr3)@!!)NfrrVZi^&@sDcqMgdiHtWQs8Q_E!!'=hiFdPSs8N):s*t~>
+h#@Gj!'nF$!8$lC!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL0!<;Ng9`"blVpPGD
+!<)p"HtNEZrr3)@!!)NfrrVZi^&@sDcqMgdiHtWQs8Q_E!!'=hiFdPSs8N):s*t~>
+h#@Gj!'nF$!8$lC!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL0!<;Ng9`"blVpPGD
+!<)p"HtNEZrr3)@!!)NfrrVZi^&@sDcqMgdiHtWQs8Q_E!!'=hiFdPSs8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL1!<<(s!7:WC"FU7L!!)or
+rrE#t!mgpprr3"fd/EtGn4^n%rr^pS!58C3rr<&G^&S*4_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL1!<<(s!7:WC"FU7L!!)or
+rrE#t!mgpprr3"fd/EtGn4^n%rr^pS!58C3rr<&G^&S*4_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL1!<<(s!7:WC"FU7L!!)or
+rrE#t!mgpprr3"fd/EtGn4^n%rr^pS!58C3rr<&G^&S*4_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL1!<<)g!,)60"jjs_rr<&r
+s8N)srro\.N;p3(r;Qeq!;uls!!%EGs8N)3s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL1!<<)g!,)60"jjs_rr<&r
+s8N)srro\.N;p3(r;Qeq!;uls!!%EGs8N)3s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL1!<<)g!,)60"jjs_rr<&r
+s8N)srro\.N;p3(r;Qeq!;uls!!%EGs8N)3s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<3!"VZ>*Brr@HGs8N)r
+s8N)rrr[WKN2QRQ!,)',rr;uu]`8!3_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<3!"VZ>*Brr@HGs8N)r
+s8N)rrr[WKN2QRQ!,)',rr;uu]`8!3_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<3!"VZ>*Brr@HGs8N)r
+s8N)rrr[WKN2QRQ!,)',rr;uu]`8!3_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<3!"n,R,#rrM)Vrr;uu
+qu?ZrqYpUj!878LrrDcmrrB_3rrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<3!"n,R,#rrM)Vrr;uu
+qu?ZrqYpUj!878LrrDcmrrB_3rrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<3!"n,R,#rrM)Vrr;uu
+qu?ZrqYpUj!878LrrDcmrrB_3rrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<)p%Mu_6)s-iHVs8N)r
+s8N)qrrZm69^2KTrr<&gp](6n]`8!3_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<)p%Mu_6)s-iHVs8N)r
+s8N)qrrZm69^2KTrr<&gp](6n]`8!3_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<)p%Mu_6)s-iHVs8N)r
+s8N)qrrZm69^2KTrr<&gp](6n]`8!3_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<)p$i;dNjn;R>GrrDrr
+rrDrr"H;Tc!.=_E!bVMRr;QfeBE%r2!5/@3!5nhe~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<)p$i;dNjn;R>GrrDrr
+rrDrr"H;Tc!.=_E!bVMRr;QfeBE%r2!5/@3!5nhe~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!<)p$i;dNjn;R>GrrDrr
+rrDrr"H;Tc!.=_E!bVMRr;QfeBE%r2!5/@3!5nhe~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!;uj"Mu_5<iVifV!;lfr
+!;uj$VpPJDRK08arrT(u9`4nk]o;sjrrB_3rrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!;uj"Mu_5<iVifV!;lfr
+!;uj$VpPJDRK08arrT(u9`4nk]o;sjrrB_3rrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!;uj"Mu_5<iVifV!;lfr
+!;uj$VpPJDRK08arrT(u9`4nk]o;sjrrB_3rrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!;uj!i;dM<r;Zcsqu?Zr
+rVlnr^&@s4RK1D-rs@oi!,(!bs3OHdrr;uu]`8!3_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!;uj!i;dM<r;Zcsqu?Zr
+rVlnr^&@s4RK1D-rs@oi!,(!bs3OHdrr;uu]`8!3_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYLL,!;uj!i;dM<r;Zcsqu?Zr
+rVlnr^&@s4RK1D-rs@oi!,(!bs3OHdrr;uu]`8!3_uG5~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYUR/f`9_'rrS,Zd/EtHf`2$*
+rVm/M!!(CGn<s@ArVlua!!((=rrCFC!!&qrrr^:A!9(WkrrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYUR/f`9_'rrS,Zd/EtHf`2$*
+rVm/M!!(CGn<s@ArVlua!!((=rrCFC!!&qrrr^:A!9(WkrrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TYUR/f`9_'rrS,Zd/EtHf`2$*
+rVm/M!!(CGn<s@ArVlua!!((=rrCFC!!&qrrr^:A!9(WkrrBt:J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TY^[+!<)ouiCs4MqZ-ZrpAk3m
+!9*hUrr3/\RK*>8^&J'/!5AL5!5nhe~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TY^[+!<)ouiCs4MqZ-ZrpAk3m
+!9*hUrr3/\RK*>8^&J'/!5AL5!5nhe~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TY^[+!<)ouiCs4MqZ-ZrpAk3m
+!9*hUrr3/\RK*>8^&J'/!5AL5!5nhe~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(Ms2=p=^ApNMs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(M5f>nh/c\.fs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(M5f>nh/c\.fs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs8N(M5f>nh/c\.fs+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+(0c!!#98s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+(0c!!#98s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+(0c!!#98s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+.r#^AuT2s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+.r#^AuT2s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.fs+.r#^AuT2s+13DrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=>1s8)fDs7lWrI&GrHrrRZMTRm,os+13$s/l;&?N?aMs2+g9!5nhe~>
+h#@Gj!'mpk!<=>1s8)fDs7lWrI&GrHrrRZMTRm,os+13$s/l;&?N?aMs2+g9!5nhe~>
+h#@Gj!'mpk!<=>1s8)fDs7lWrI&GrHrrRZMTRm,os+13$s/l;&?N?aMs2+g9!5nhe~>
+h#@Gj!'mpk!<=>0rr^pS!85]u$J>CZl2UeQcqFGdbl7`o!2+oCJcC<$JcDkP!abr#JcEUerrBt:
+J,~>
+h#@Gj!'mpk!<=>0rr^pS!85]u$J>CZl2UeQcqFGdbl7`o!2+oCJcC<$JcDkP!abr#JcEUerrBt:
+J,~>
+h#@Gj!'mpk!<=>0rr^pS!85]u$J>CZl2UeQcqFGdbl7`o!2+oCJcC<$JcDkP!abr#JcEUerrBt:
+J,~>
+h#@Gj!'mpk!<=>/s8N)Ds8N)rrrQg5g!0NuIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=>/s8N)Ds8N)rrrQg5g!0NuIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=>/s8N)Ds8N)rrrQg5g!0NuIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=>/s8N)Ds8N)rrrUOII*MZmIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=>/s8N)Ds8N)rrrUOII*MZmIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=>/s8N)Ds8N)rrrUOII*MZmIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=>/s8N)Ds8N)qs8N)DrrRZMTRm,os+13$s/l;&?N?aMs2+g9!5nhe~>
+h#@Gj!'mpk!<=>/s8N)Ds8N)qs8N)DrrRZMTRm,os+13$s/l;&?N?aMs2+g9!5nhe~>
+h#@Gj!'mpk!<=>/s8N)Ds8N)qs8N)DrrRZMTRm,os+13$s/l;&?N?aMs2+g9!5nhe~>
+h#@Gj!'mpk!<=>/s8N)krs%tj9E7banG`FfN;WbVrrA#V!!;-Zs8DuuN;*AP!;c`q!<3!&iL3F?
+!.;KXrro]%9YKZjrVm&,9ME.a!:9^eIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=>/s8N)krs%tj9E7banG`FfN;WbVrrA#V!!;-Zs8DuuN;*AP!;c`q!<3!&iL3F?
+!.;KXrro]%9YKZjrVm&,9ME.a!:9^eIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=>/s8N)krs%tj9E7banG`FfN;WbVrrA#V!!;-Zs8DuuN;*AP!;c`q!<3!&iL3F?
+!.;KXrro]%9YKZjrVm&,9ME.a!:9^eIfQ-ms+13$s+13PrrQO-TRm-[s8N):s*t~>
+h#@Gj!'mpk!<=>/s8N)lrs7j_^&S,c9MF.=rrT(u!<)p"i;`l:rVlluZM+=u!;ld*i;e9*s3Lbd
+s8V>2!4)V(#-trBs2P*>rr32.^&S,Q!!)Bc!e13CJcC<$JcC<$XoAH0!2+oC_Z.^X!>X#Zs*t~>
+h#@Gj!'mpk!<=>/s8N)lrs7j_^&S,c9MF.=rrT(u!<)p"i;`l:rVlluZM+=u!;ld*i;e9*s3Lbd
+s8V>2!4)V(#-trBs2P*>rr32.^&S,Q!!)Bc!e13CJcC<$JcC<$XoAH0!2+oC_Z.^X!>X#Zs*t~>
+h#@Gj!'mpk!<=>/s8N)lrs7j_^&S,c9MF.=rrT(u!<)p"i;`l:rVlluZM+=u!;ld*i;e9*s3Lbd
+s8V>2!4)V(#-trBs2P*>rr32.^&S,Q!!)Bc!e13CJcC<$JcC<$XoAH0!2+oC_Z.^X!>X#Zs*t~>
+h#@Gj!'mpk!<=>/s8N)lrrHcGrVlua!)2n]rrQg5l2CV`Mu_6(rrMV%p&G$lqu6kJ!87DP9E>%k
+!q61`rr2slrVlo(!<2uu9`=tlZ2j7k!e13CJcC<$JcC<$XoAH0!2+oC_Z.[W!3Q.uJ,~>
+h#@Gj!'mpk!<=>/s8N)lrrHcGrVlua!)2n]rrQg5l2CV`Mu_6(rrMV%p&G$lqu6kJ!87DP9E>%k
+!q61`rr2slrVlo(!<2uu9`=tlZ2j7k!e13CJcC<$JcC<$XoAH0!2+oC_Z.[W!3Q.uJ,~>
+h#@Gj!'mpk!<=>/s8N)lrrHcGrVlua!)2n]rrQg5l2CV`Mu_6(rrMV%p&G$lqu6kJ!87DP9E>%k
+!q61`rr2slrVlo(!<2uu9`=tlZ2j7k!e13CJcC<$JcC<$XoAH0!2+oC_Z.[W!3Q.uJ,~>
+h#@Gj!'mpk!<=>/s8N)mrrU4@l2:P_VZ=%%rrTJ+ZMje)9E:O\rrL0Gp&G$l!7:`F"5.<\d/O(F
+I/O$E!<3!!!2ohr!Up*grrE+trr3#g!:9^eIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)mrrU4@l2:P_VZ=%%rrTJ+ZMje)9E:O\rrL0Gp&G$l!7:`F"5.<\d/O(F
+I/O$E!<3!!!2ohr!Up*grrE+trr3#g!:9^eIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)mrrU4@l2:P_VZ=%%rrTJ+ZMje)9E:O\rrL0Gp&G$l!7:`F"5.<\d/O(F
+I/O$E!<3!!!2ohr!Up*grrE+trr3#g!:9^eIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)mrrIKIqu6`V!,)<2!pK\Yrr3)IZ2an(rrIN3p&Fmh!K>(orrhi3HiO0G
+rr\\i9YL?'".B3`^$5OuIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)mrrIKIqu6`V!,)<2!pK\Yrr3)IZ2an(rrIN3p&Fmh!K>(orrhi3HiO0G
+rr\\i9YL?'".B3`^$5OuIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)mrrIKIqu6`V!,)<2!pK\Yrr3)IZ2an(rrIN3p&Fmh!K>(orrhi3HiO0G
+rr\\i9YL?'".B3`^$5OuIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)ms8N)qs8N)trsX8Tg&M)"n<s@(s6s[ns8N)krs%GN9X<m_!<)p#RK*=]
+Vu6PtRK*=]VsF?aIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)ms8N)qs8N)trsX8Tg&M)"n<s@(s6s[ns8N)krs%GN9X<m_!<)p#RK*=]
+Vu6PtRK*=]VsF?aIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)ms8N)qs8N)trsX8Tg&M)"n<s@(s6s[ns8N)krs%GN9X<m_!<)p#RK*=]
+Vu6PtRK*=]VsF?aIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)ms8N)qs8N)trsZpJVuQ"Ms4IC@s2VG;s8N)lrrTJ+^&J'3!;uj#iMQYU
+9^2NU"lZ?Z!)2YErrRZMTRm,os+13$s/l;&?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=>/s8N)ms8N)qs8N)trsZpJVuQ"Ms4IC@s2VG;s8N)lrrTJ+^&J'3!;uj#iMQYU
+9^2NU"lZ?Z!)2YErrRZMTRm,os+13$s/l;&?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=>/s8N)ms8N)qs8N)trsZpJVuQ"Ms4IC@s2VG;s8N)lrrTJ+^&J'3!;uj#iMQYU
+9^2NU"lZ?Z!)2YErrRZMTRm,os+13$s/l;&?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=>/s8N)qrs%sds8Q^3g&(dM!0$mV%.F6js/4QMs%EF^I-L;'rrDcm!jVgHrVult
+qYpZ^HiT-&rr_M5!0$=F!e13CJcC<$JcC<$XoAH0!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=>/s8N)qrs%sds8Q^3g&(dM!0$mV%.F6js/4QMs%EF^I-L;'rrDcm!jVgHrVult
+qYpZ^HiT-&rr_M5!0$=F!e13CJcC<$JcC<$XoAH0!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=>/s8N)qrs%sds8Q^3g&(dM!0$mV%.F6js/4QMs%EF^I-L;'rrDcm!jVgHrVult
+qYpZ^HiT-&rr_M5!0$=F!e13CJcC<$JcC<$XoAH0!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=>/s8N)qrs#cfs8TA)Vu6PrklB*.rr\\id!Yim"/c.)I.RC<!;?Hm!;uls!<3!!
+!:^!f#4MTms8N)grr3&h!!)Ed!e13CJcC<$JcC<$XoAH0!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=>/s8N)qrs#cfs8TA)Vu6PrklB*.rr\\id!Yim"/c.)I.RC<!;?Hm!;uls!<3!!
+!:^!f#4MTms8N)grr3&h!!)Ed!e13CJcC<$JcC<$XoAH0!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=>/s8N)qrs#cfs8TA)Vu6PrklB*.rr\\id!Yim"/c.)I.RC<!;?Hm!;uls!<3!!
+!:^!f#4MTms8N)grr3&h!!)Ed!e13CJcC<$JcC<$XoAH0!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=>/s8N)rrrV[`^&J$59E=&MrrKfGqu6cF!)1**rr^pS!6=^2rrDcmrr<&grVult
+rr3!!ZMje,!,)?3!4)S'!<?d"rrRZMTRm,os4.,Lf7C]P^B!_mrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)rrrV[`^&J$59E=&MrrKfGqu6cF!)1**rr^pS!6=^2rrDcmrr<&grVult
+rr3!!ZMje,!,)?3!4)S'!<?d"rrRZMTRm,os4.,Lf7C]P^B!_mrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>/s8N)rrrV[`^&J$59E=&MrrKfGqu6cF!)1**rr^pS!6=^2rrDcmrr<&grVult
+rr3!!ZMje,!,)?3!4)S'!<?d"rrRZMTRm,os4.,Lf7C]P^B!_mrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=>0rr^pS!9*nV"5/&%g&D!Wfh>)ds8U,5l2(D]9E=S\rrPjonFZ__f`2$*p\u83
+!.=;9d$aq7n?W&o!4)Y)VZ>*Drr<&)s8Stsd-^i7IfQ-ms+14#rr?DW!5JR7^RY<*?N?aMs2+g9
+!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=>0rr^pS!9*nV"5/&%g&D!Wfh>)ds8U,5l2(D]9E=S\rrPjonFZ__f`2$*p\u83
+!.=;9d$aq7n?W&o!4)Y)VZ>*Drr<&)s8Stsd-^i7IfQ-ms+14#rr?DW!5JR7^RY<*?N?aMs2+g9
+!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=>0rr^pS!9*nV"5/&%g&D!Wfh>)ds8U,5l2(D]9E=S\rrPjonFZ__f`2$*p\u83
+!.=;9d$aq7n?W&o!4)Y)VZ>*Drr<&)s8Stsd-^i7IfQ-ms+14#rr?DW!5JR7^RY<*?N?aMs2+g9
+!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=>1s7H?lnGW@kl'b9GB;b7prrK$Vr;Qf'I.[I9!;HL*VZ6^Ed/TO7N9U?Bl+L^0
+I+eN!"p!o$B)m>4m/I-:!2.[<!*Ok<_*A!'ao;EL!%3=_`'=A=!5G'(!abr#JcEUerrC:C!abrB
+qu;0~>
+h#@Gj!'mpk!<=>1s7H?lnGW@kl'b9GB;b7prrK$Vr;Qf'I.[I9!;HL*VZ6^Ed/TO7N9U?Bl+L^0
+I+eN!"p!o$B)m>4m/I-:!2.[<!*Ok<_*A!'ao;EL!%3=_`'=A=!5G'(!abr#JcEUerrC:C!abrB
+qu;0~>
+h#@Gj!'mpk!<=>1s7H?lnGW@kl'b9GB;b7prrK$Vr;Qf'I.[I9!;HL*VZ6^Ed/TO7N9U?Bl+L^0
+I+eN!"p!o$B)m>4m/I-:!2.[<!*Ok<_*A!'ao;EL!%3=_`'=A=!5G'(!abr#JcEUerrC:C!abrB
+qu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,0Bid?N?aMs2=p=5QJQhrrQO-TRm-[s8N)CrrQO-
+^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,0Bid?N?aMs2=p=5QJQhrrQO-TRm-[s8N)CrrQO-
+^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,0Bid?N?aMs2=p=5QJQhrrQO-TRm-[s8N)CrrQO-
+^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEVh)V$^B"<Yao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEVh)V$^B"<Yao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEVh)V$^B"<Yao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2,JSs*V9T!^Hb#SGrXt!2+oC_Z0W9
+bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2,JSs*V9T!^Hb#SGrXt!2+oC_Z0W9
+bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2,JSs*V9T!^Hb#SGrXt!2+oC_Z0W9
+bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2.g@p](D/N4nK"s8RJTrrPFc^RY<*
+?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2.g@p](D/N4nK"s8RJTrrPFc^RY<*
+?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2.g@p](D/N4nK"s8RJTrrPFc^RY<*
+?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi3r[cI/a-JnAgstrr3)ia-m"#rrE*Dao;EL!2.d?"5*YS
+iVicZfr"fMRd^7Wn,S^Q!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi3r[cI/a-JnAgstrr3)ia-m"#rrE*Dao;EL!2.d?"5*YS
+iVicZfr"fMRd^7Wn,S^Q!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi3r[cI/a-JnAgstrr3)ia-m"#rrE*Dao;EL!2.d?"5*YS
+iVicZfr"fMRd^7Wn,S^Q!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi7n84a,Kut!dq<CjT#7-rr3(ZB)hr2rr\3m!!(4B"ke8'
+!.;K7rrE*Dao;EL!2.a>rrDoq"7U[<I.7.:ciB=1!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi7n84a,Kut!dq<CjT#7-rr3(ZB)hr2rr\3m!!(4B"ke8'
+!.;K7rrE*Dao;EL!2.a>rrDoq"7U[<I.7.:ciB=1!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi7n84a,Kut!dq<CjT#7-rr3(ZB)hr2rr\3m!!(4B"ke8'
+!.;K7rrE*Dao;EL!2.a>rrDoq"7U[<I.7.:ciB=1!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8+D8a%WDirr3)ZVbG.fs8N)ss8N)grrMThhu<\^qZ$VD
+h#@BT,0Bid?N?bHs8N)orrS,ZVt'cfRK/TP!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8+D8a%WDirr3)ZVbG.fs8N)ss8N)grrMThhu<\^qZ$VD
+h#@BT,0Bid?N?bHs8N)orrS,ZVt'cfRK/TP!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8+D8a%WDirr3)ZVbG.fs8N)ss8N)grrMThhu<\^qZ$VD
+h#@BT,0Bid?N?bHs8N)orrS,ZVt'cfRK/TP!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi84J8VbH@OrrVFYVr.OS!;uls!:^!hciE#($/kltnGi!`
+!!&qQrrE*Dao;EL!2.a>rrDfn!_`UYoD\m=!!&8`!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi84J8VbH@OrrVFYVr.OS!;uls!:^!hciE#($/kltnGi!`
+!!&qQrrE*Dao;EL!2.a>rrDfn!_`UYoD\m=!!&8`!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi84J8VbH@OrrVFYVr.OS!;uls!:^!hciE#($/kltnGi!`
+!!&qQrrE*Dao;EL!2.a>rrDfn!_`UYoD\m=!!&8`!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8=P9`rP)nrrUjR^#8qj!;uls!:^!hRK2:G!N4WKrrTk6
+9\o^L!$]Pb!abr#dJs4Hp\t<#!4)S'"mMpY!,'"ErrA#U!!%uV!<3#s!<<'*nAgsts5BCH!4)S'
+&+IW.!<<)ga-m#.iL0`HZMOS)Ve6!'Vsr%4!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8=P9`rP)nrrUjR^#8qj!;uls!:^!hRK2:G!N4WKrrTk6
+9\o^L!$]Pb!abr#dJs4Hp\t<#!4)S'"mMpY!,'"ErrA#U!!%uV!<3#s!<<'*nAgsts5BCH!4)S'
+&+IW.!<<)ga-m#.iL0`HZMOS)Ve6!'Vsr%4!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8=P9`rP)nrrUjR^#8qj!;uls!:^!hRK2:G!N4WKrrTk6
+9\o^L!$]Pb!abr#dJs4Hp\t<#!4)S'"mMpY!,'"ErrA#U!!%uV!<3#s!<<'*nAgsts5BCH!4)S'
+&+IW.!<<)ga-m#.iL0`HZMOS)Ve6!'Vsr%4!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:n,SF@rrS,ZnDXEI!;uls!:g'jci=((rrAtns8N)T
+rrE*Dao;EL!2.a>rrDfn!oX-,rr35M9[NguHiSQms8N)trrVEb!<)p.i;`lXs*SGZ!56)Gs/,k1
+rr3OWB)hr3s*SGZ!56)Gs/,k1rVm)k9RQ@0iCs1Mdf0A6!5G'(!abr#JcEUerrC:C!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:n,SF@rrS,ZnDXEI!;uls!:g'jci=((rrAtns8N)T
+rrE*Dao;EL!2.a>rrDfn!oX-,rr35M9[NguHiSQms8N)trrVEb!<)p.i;`lXs*SGZ!56)Gs/,k1
+rr3OWB)hr3s*SGZ!56)Gs/,k1rVm)k9RQ@0iCs1Mdf0A6!5G'(!abr#JcEUerrC:C!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:n,SF@rrS,ZnDXEI!;uls!:g'jci=((rrAtns8N)T
+rrE*Dao;EL!2.a>rrDfn!oX-,rr35M9[NguHiSQms8N)trrVEb!<)p.i;`lXs*SGZ!56)Gs/,k1
+rr3OWB)hr3s*SGZ!56)Gs/,k1rVm)k9RQ@0iCs1Mdf0A6!5G'(!abr#JcEUerrC:C!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:Z2i8FrrUOIZMsk-Z:ms*klCV\$b^0Q!0#V2s7"'t
+!;uls!;uls!;uj$iL3F?!.;KZrrA#U!!%uWrs%tj9E7banG`FnnAgsts2SaPZLRqq!.<W&!<==c
+rrQO-T[Ef>!;?Hm!<<'#n4^n%rr^pS!58C3rrDusrrDusrrE#trr<&`rr3&h!,)60rrE#trr<&`
+rr3&h!,)91!h',Yrr3&H!2n3D!^Hb#XoAEpi:?mL?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:Z2i8FrrUOIZMsk-Z:ms*klCV\$b^0Q!0#V2s7"'t
+!;uls!;uls!;uj$iL3F?!.;KZrrA#U!!%uWrs%tj9E7banG`FnnAgsts2SaPZLRqq!.<W&!<==c
+rrQO-T[Ef>!;?Hm!<<'#n4^n%rr^pS!58C3rrDusrrDusrrE#trr<&`rr3&h!,)60rrE#trr<&`
+rr3&h!,)91!h',Yrr3&H!2n3D!^Hb#XoAEpi:?mL?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:Z2i8FrrUOIZMsk-Z:ms*klCV\$b^0Q!0#V2s7"'t
+!;uls!;uls!;uj$iL3F?!.;KZrrA#U!!%uWrs%tj9E7banG`FnnAgsts2SaPZLRqq!.<W&!<==c
+rrQO-T[Ef>!;?Hm!<<'#n4^n%rr^pS!58C3rrDusrrDusrrE#trr<&`rr3&h!,)60rrE#trr<&`
+rr3&h!,)91!h',Yrr3&H!2n3D!^Hb#XoAEpi:?mL?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:HiW[0rsS&kI/j5P^&S,Q!!)ut%I$Qls8V$X!7:an
+B)hr0s8N)ss8N)trs6sOa8c2(HiUJNs8N)srtFWj^&S,c9MF.>s(>sE!4(kJB70:M!pK^3h>[KU
+,1cbr?VmEaq#:D&!2.a>rrDcmrrE*!!N,qqs8N'!I/a0G!;uls!;uls!<)rt!;uls!;uls!<)rt
+!;uls!<)rt!;uit!)1c>!^Hb#XoAMJ!%s>jp&>)#!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:HiW[0rsS&kI/j5P^&S,Q!!)ut%I$Qls8V$X!7:an
+B)hr0s8N)ss8N)trs6sOa8c2(HiUJNs8N)srtFWj^&S,c9MF.>s(>sE!4(kJB70:M!pK^3h>[KU
+,1cbr?VmEaq#:D&!2.a>rrDcmrrE*!!N,qqs8N'!I/a0G!;uls!;uls!<)rt!;uls!;uls!<)rt
+!;uls!<)rt!;uit!)1c>!^Hb#XoAMJ!%s>jp&>)#!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:HiW[0rsS&kI/j5P^&S,Q!!)ut%I$Qls8V$X!7:an
+B)hr0s8N)ss8N)trs6sOa8c2(HiUJNs8N)srtFWj^&S,c9MF.>s(>sE!4(kJB70:M!pK^3h>[KU
+,1cbr?VmEaq#:D&!2.a>rrDcmrrE*!!N,qqs8N'!I/a0G!;uls!;uls!<)rt!;uls!;uls!<)rt
+!;uls!<)rt!;uit!)1c>!^Hb#XoAMJ!%s>jp&>)#!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FY8!;-<k!<<'!9`=tlZ2jk'!DJs\rrS,Z9`G(l!;uls
+!;uls!<)ou9E>%k!q61`rVultr;Qe1^&@s5kl=EHrr;uu!7:06!PN.$rrE*Df)G_WrW!!rT^VdX
+!abr#dJs4HpAb-ms8N(3p]1<nrrDusrrDusrrE#trrDusrrDusrrE#trrDusrrE#trrDusrrCFG
+!^Hb#XoAAFr;ZmOO5Tg5!abr#JcEUerrC:C!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FY8!;-<k!<<'!9`=tlZ2jk'!DJs\rrS,Z9`G(l!;uls
+!;uls!<)ou9E>%k!q61`rVultr;Qe1^&@s5kl=EHrr;uu!7:06!PN.$rrE*Df)G_WrW!!rT^VdX
+!abr#dJs4HpAb-ms8N(3p]1<nrrDusrrDusrrE#trrDusrrDusrrE#trrDusrrE#trrDusrrCFG
+!^Hb#XoAAFr;ZmOO5Tg5!abr#JcEUerrC:C!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FY8!;-<k!<<'!9`=tlZ2jk'!DJs\rrS,Z9`G(l!;uls
+!;uls!<)ou9E>%k!q61`rVultr;Qe1^&@s5kl=EHrr;uu!7:06!PN.$rrE*Df)G_WrW!!rT^VdX
+!abr#dJs4HpAb-ms8N(3p]1<nrrDusrrDusrrE#trrDusrrDusrrE#trrDusrrE#trrDusrrCFG
+!^Hb#XoAAFr;ZmOO5Tg5!abr#JcEUerrC:C!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FY8!;-<k!<<'"!2ohr!Up*grrTk6l2CV`ktHL(s8N)s
+s8N)ss8N)ts8RKEs8N)ts8N)trrU4@l2:P_VZ=%%s8N)drrGgXh#@BT,1cbo?i'g):oF'errQO-
+T[Ef>!;HKti;ei:rr<&ms8N)ss8N)ss8N)ts8N)ss8N)ss8N)ts8N)ss8N)trrT(ud/O%Hn,SEo
+rrPFc^TIM9,5M9@/s"rfrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FY8!;-<k!<<'"!2ohr!Up*grrTk6l2CV`ktHL(s8N)s
+s8N)ss8N)ts8RKEs8N)ts8N)trrU4@l2:P_VZ=%%s8N)drrGgXh#@BT,1cbo?i'g):oF'errQO-
+T[Ef>!;HKti;ei:rr<&ms8N)ss8N)ss8N)ts8N)ss8N)ss8N)ts8N)ss8N)trrT(ud/O%Hn,SEo
+rrPFc^TIM9,5M9@/s"rfrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FY8!;-<k!<<'"!2ohr!Up*grrTk6l2CV`ktHL(s8N)s
+s8N)ss8N)ts8RKEs8N)ts8N)trrU4@l2:P_VZ=%%s8N)drrGgXh#@BT,1cbo?i'g):oF'errQO-
+T[Ef>!;HKti;ei:rr<&ms8N)ss8N)ss8N)ts8N)ss8N)ss8N)ts8N)ss8N)trrT(ud/O%Hn,SEo
+rrPFc^TIM9,5M9@/s"rfrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FY8!;-<k!<<'$RK-$pqu6\E!;?Hm!;uls!;uls!;ZWt
+nAfnV!<)rt!<)ouHiX'D!oX,lrr;uumf*<na4pUp!$^"o!+5L$"^.bt?N?bHs8N)nrs,h0ZN'q)
+!:]a_rrDusrrDusrrE#trrDusrrDusrrE#trrDusrrDus#CK5(s6tD0l-TG32#r]>^Ao#C!!4d6
+i;W`X?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FY8!;-<k!<<'$RK-$pqu6\E!;?Hm!;uls!;uls!;ZWt
+nAfnV!<)rt!<)ouHiX'D!oX,lrr;uumf*<na4pUp!$^"o!+5L$"^.bt?N?bHs8N)nrs,h0ZN'q)
+!:]a_rrDusrrDusrrE#trrDusrrDusrrE#trrDusrrDus#CK5(s6tD0l-TG32#r]>^Ao#C!!4d6
+i;W`X?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FY8!;-<k!<<'$RK-$pqu6\E!;?Hm!;uls!;uls!;ZWt
+nAfnV!<)rt!<)ouHiX'D!oX,lrr;uumf*<na4pUp!$^"o!+5L$"^.bt?N?bHs8N)nrs,h0ZN'q)
+!:]a_rrDusrrDusrrE#trrDusrrDusrrE#trrDusrrDus#CK5(s6tD0l-TG32#r]>^Ao#C!!4d6
+i;W`X?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:Mu`,9rrVZiN;ih[RK*=]Vu?Yq!;?Hm!;uls!;uls
+!;ld#iL3HGkl:_^s8N)ts8N)qs8N)us8N)frrM)VgAh0Qej'3Mo`,%;!1M=8rrDfn#>>-es8Q^3
+a8Gr<n7Vb#rrDusrrDusrrE#trrDusrrDusrrE#trrDusrrDus#3fc5!)0<Td/O*\S,`^FYQ%r0
+TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:Mu`,9rrVZiN;ih[RK*=]Vu?Yq!;?Hm!;uls!;uls
+!;ld#iL3HGkl:_^s8N)ts8N)qs8N)us8N)frrM)VgAh0Qej'3Mo`,%;!1M=8rrDfn#>>-es8Q^3
+a8Gr<n7Vb#rrDusrrDusrrE#trrDusrrDusrrE#trrDusrrDus#3fc5!)0<Td/O*\S,`^FYQ%r0
+TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8FV:Mu`,9rrVZiN;ih[RK*=]Vu?Yq!;?Hm!;uls!;uls
+!;ld#iL3HGkl:_^s8N)ts8N)qs8N)us8N)frrM)VgAh0Qej'3Mo`,%;!1M=8rrDfn#>>-es8Q^3
+a8Gr<n7Vb#rrDusrrDusrrE#trrDusrrDusrrE#trrDusrrDus#3fc5!)0<Td/O*\S,`^FYQ%r0
+TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!O(GSrrE*DJcGEC!e13Ci;WhN^[hC++opQZrrTJ+a7fN7f`9(krsI__!!#^Ws8N'!
+l1b5X!;uls!;uls!;uiuZ2hT;s8N)ts8N)ts8N)qs8N)us8N)grrMAig&K"k!*%AGrrDio!dk!]
+rr3%t!)3=j!POHks8N)ss8N)ss8N)ts8N)ss8N)ss8N)ts8N)ss8N)trrVFYiQM6'mhGgTX[)OZ
+#9n-5s8QF+TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!O(GSrrE*DJcGEC!e13Ci;WhN^[hC++opQZrrTJ+a7fN7f`9(krsI__!!#^Ws8N'!
+l1b5X!;uls!;uls!;uiuZ2hT;s8N)ts8N)ts8N)qs8N)us8N)grrMAig&K"k!*%AGrrDio!dk!]
+rr3%t!)3=j!POHks8N)ss8N)ss8N)ts8N)ss8N)ss8N)ts8N)ss8N)trrVFYiQM6'mhGgTX[)OZ
+#9n-5s8QF+TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!O(GSrrE*DJcGEC!e13Ci;WhN^[hC++opQZrrTJ+a7fN7f`9(krsI__!!#^Ws8N'!
+l1b5X!;uls!;uls!;uiuZ2hT;s8N)ts8N)ts8N)qs8N)us8N)grrMAig&K"k!*%AGrrDio!dk!]
+rr3%t!)3=j!POHks8N)ss8N)ss8N)ts8N)ss8N)ss8N)ts8N)ss8N)trrVFYiQM6'mhGgTX[)OZ
+#9n-5s8QF+TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$"@)r>O5Tg5!<=<ps7QBnIfQ/"rrbRe'kb;SrrOAEi8FV:n,Rk0rrK#kqYpicHiT-*
+s(;>Pr;QfeBE%r2!;uls!;uls!<)p!Z2hrDs8N)ts8N)trrQg5g&(dM!0$pWrrDQg!6<al!<<kc
+^Aph!!!F[!:]R09s8N)qrr_b<!2oeq$0_EiBA*=bcqMgcs8N)srrRQJnG`Fhi;`lVs8N)ss8N)s
+s8N)ts8N)ss8N)trrS,Zl,s#-5QJR$rr=8=!!4?`ci!eE?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'nF$"@)r>O5Tg5!<=<ps7QBnIfQ/"rrbRe'kb;SrrOAEi8FV:n,Rk0rrK#kqYpicHiT-*
+s(;>Pr;QfeBE%r2!;uls!;uls!<)p!Z2hrDs8N)ts8N)trrQg5g&(dM!0$pWrrDQg!6<al!<<kc
+^Aph!!!F[!:]R09s8N)qrr_b<!2oeq$0_EiBA*=bcqMgcs8N)srrRQJnG`Fhi;`lVs8N)ss8N)s
+s8N)ts8N)ss8N)trrS,Zl,s#-5QJR$rr=8=!!4?`ci!eE?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'nF$"@)r>O5Tg5!<=<ps7QBnIfQ/"rrbRe'kb;SrrOAEi8FV:n,Rk0rrK#kqYpicHiT-*
+s(;>Pr;QfeBE%r2!;uls!;uls!<)p!Z2hrDs8N)ts8N)trrQg5g&(dM!0$pWrrDQg!6<al!<<kc
+^Aph!!!F[!:]R09s8N)qrr_b<!2oeq$0_EiBA*=bcqMgcs8N)srrRQJnG`Fhi;`lVs8N)ss8N)s
+s8N)ts8N)ss8N)trrS,Zl,s#-5QJR$rr=8=!!4?`ci!eE?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'nF$!'pJ_!\TPlqu6Zs,(]derrRZMT]#hM5lCZa'kb;VrrOAEi8=P9]`?+JrrV-Za8Z)>
+!:^!f#Oh]ns8Sts9`4nkZC:dmrrDusrrDusrrE#trrDusrrE#trrE#t!jVg(r;Qi_!7:`FrrDTh
+!6>!:!577h!<==prr?F&!!am$fDkkX!2.d?"PEbTiUHjH"PK[Q9YL?'!7:TC!2oeq(46,@fo5t2
+]`=u1s1QGQ!,$]Zci=(!rr3)i!!(CFrs@$P!7:cGci=(!rr3)i!!(CFrr>ag!!&qErrPFc^TIM9
+,5_EB,&km(rrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!'pJ_!\TPlqu6Zs,(]derrRZMT]#hM5lCZa'kb;VrrOAEi8=P9]`?+JrrV-Za8Z)>
+!:^!f#Oh]ns8Sts9`4nkZC:dmrrDusrrDusrrE#trrDusrrE#trrE#t!jVg(r;Qi_!7:`FrrDTh
+!6>!:!577h!<==prr?F&!!am$fDkkX!2.d?"PEbTiUHjH"PK[Q9YL?'!7:TC!2oeq(46,@fo5t2
+]`=u1s1QGQ!,$]Zci=(!rr3)i!!(CFrs@$P!7:cGci=(!rr3)i!!(CFrr>ag!!&qErrPFc^TIM9
+,5_EB,&km(rrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!'pJ_!\TPlqu6Zs,(]derrRZMT]#hM5lCZa'kb;VrrOAEi8=P9]`?+JrrV-Za8Z)>
+!:^!f#Oh]ns8Sts9`4nkZC:dmrrDusrrDusrrE#trrDusrrE#trrE#t!jVg(r;Qi_!7:`FrrDTh
+!6>!:!577h!<==prr?F&!!am$fDkkX!2.d?"PEbTiUHjH"PK[Q9YL?'!7:TC!2oeq(46,@fo5t2
+]`=u1s1QGQ!,$]Zci=(!rr3)i!!(CFrs@$P!7:cGci=(!rr3)i!!(CFrr>ag!!&qErrPFc^TIM9
+,5_EB,&km(rrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!'pA\!\TPlrr3!!,(]derrRZMT]#hM5l(H^'kb;YrrOAEi84J8VbH(GrrV.QVu?Vr
+!4)S'%01&@s6p!gI-L\2f`:"1s8N)ss8N)ss8N)ts8N'!nGWCe!<)rt!;uiu9E=&MrrKfGrVult
+o)A^1r;QifR[W+5!<==prr?F)!!4NtfDPXM?N?bJs7cQqB8jn+rrqAM!!%D[r;Ql`B)nk.rs>u)
+!1N0P!1LstqZ-Zrqu?`so`5$lquHcs!ROO9!!&qFrrPFc^TIM>+ohTeE6n7X!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'nF$!'pA\!\TPlrr3!!,(]derrRZMT]#hM5l(H^'kb;YrrOAEi84J8VbH(GrrV.QVu?Vr
+!4)S'%01&@s6p!gI-L\2f`:"1s8N)ss8N)ss8N)ts8N'!nGWCe!<)rt!;uiu9E=&MrrKfGrVult
+o)A^1r;QifR[W+5!<==prr?F)!!4NtfDPXM?N?bJs7cQqB8jn+rrqAM!!%D[r;Ql`B)nk.rs>u)
+!1N0P!1LstqZ-Zrqu?`so`5$lquHcs!ROO9!!&qFrrPFc^TIM>+ohTeE6n7X!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'nF$!'pA\!\TPlrr3!!,(]derrRZMT]#hM5l(H^'kb;YrrOAEi84J8VbH(GrrV.QVu?Vr
+!4)S'%01&@s6p!gI-L\2f`:"1s8N)ss8N)ss8N)ts8N'!nGWCe!<)rt!;uiu9E=&MrrKfGrVult
+o)A^1r;QifR[W+5!<==prr?F)!!4NtfDPXM?N?bJs7cQqB8jn+rrqAM!!%D[r;Ql`B)nk.rs>u)
+!1N0P!1LstqZ-Zrqu?`so`5$lquHcs!ROO9!!&qFrrPFc^TIM>+ohTeE6n7X!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Jk!'nlJ^Aon\!!Fp8huFsPs7QBnIfO]NIfL\e!!3mJ^]+67+opQWrr]q7Vr@XT"50SGd/<qD
+!!T\.s/,kDrr2uFqZ$Vorr3)I!!(CFrr^UJ!7:`F"4.#Jd/O%bVZ;,6s3R27!:[;os*Oh*fo5t2
+fh>)ds8U,5l2L\b`rH+uo`"o=q#CEAhZ!TV,1cbs?N;I'fD5FJ?N?aMs8N$!fr+`I!pQT_df0A6
+!5GZ9!^L_NoD\l!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Jk!'nlJ^Aon\!!Fp8huFsPs7QBnIfO]NIfL\e!!3mJ^]+67+opQWrr]q7Vr@XT"50SGd/<qD
+!!T\.s/,kDrr2uFqZ$Vorr3)I!!(CFrr^UJ!7:`F"4.#Jd/O%bVZ;,6s3R27!:[;os*Oh*fo5t2
+fh>)ds8U,5l2L\b`rH+uo`"o=q#CEAhZ!TV,1cbs?N;I'fD5FJ?N?aMs8N$!fr+`I!pQT_df0A6
+!5GZ9!^L_NoD\l!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Jk!'nlJ^Aon\!!Fp8huFsPs7QBnIfO]NIfL\e!!3mJ^]+67+opQWrr]q7Vr@XT"50SGd/<qD
+!!T\.s/,kDrr2uFqZ$Vorr3)I!!(CFrr^UJ!7:`F"4.#Jd/O%bVZ;,6s3R27!:[;os*Oh*fo5t2
+fh>)ds8U,5l2L\b`rH+uo`"o=q#CEAhZ!TV,1cbs?N;I'fD5FJ?N?aMs8N$!fr+`I!pQT_df0A6
+!5GZ9!^L_NoD\l!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!%5)Q!$[!op&>#Aci=4aO7sgui8">6n?S#P!!/&!qYpa"l+L^0I+eGt"lYmM!.</ms8)cr
+s8)crs8)fqrsu"-!.</nRK/<2s8V=r!2oeq#3hRM!,&5!rr;iqpAY,?q#CCgh>[KU,1cbp\(C?R
+!abr#JcGcM!q8nJq>UEpdf0A6!5G'(!abr#JcEUerrC:C!abrBqu;0~>
+h#@Gj!%5)Q!$[!op&>#Aci=4aO7sgui8">6n?S#P!!/&!qYpa"l+L^0I+eGt"lYmM!.</ms8)cr
+s8)crs8)fqrsu"-!.</nRK/<2s8V=r!2oeq#3hRM!,&5!rr;iqpAY,?q#CCgh>[KU,1cbp\(C?R
+!abr#JcGcM!q8nJq>UEpdf0A6!5G'(!abr#JcEUerrC:C!abrBqu;0~>
+h#@Gj!%5)Q!$[!op&>#Aci=4aO7sgui8">6n?S#P!!/&!qYpa"l+L^0I+eGt"lYmM!.</ms8)cr
+s8)crs8)fqrsu"-!.</nRK/<2s8V=r!2oeq#3hRM!,&5!rr;iqpAY,?q#CCgh>[KU,1cbp\(C?R
+!abr#JcGcM!q8nJq>UEpdf0A6!5G'(!abr#JcEUerrC:C!abrBqu;0~>
+h#@Jk!&[Tj5QDPm!!<sC!$[!op&>)C!*S60!$_+:#:G#Qs8O8Ci.:pHrrE*Dao;EL!2+oCs8N+Y
+!;ZWqn>F_7!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Jk!&[Tj5QDPm!!<sC!$[!op&>)C!*S60!$_+:#:G#Qs8O8Ci.:pHrrE*Dao;EL!2+oCs8N+Y
+!;ZWqn>F_7!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Jk!&[Tj5QDPm!!<sC!$[!op&>)C!*S60!$_+:#:G#Qs8O8Ci.:pHrrE*Dao;EL!2+oCs8N+Y
+!;ZWqn>F_7!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'nF$!'p>["r1LKs8N'CJcGEC!e13Ci;WdBq#CIDJ(OVu![7X&JcE[g!<==crrQO-TRm.C
+s8N'!iVNQSVpYMG5QJQhrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!'p>["r1LKs8N'CJcGEC!e13Ci;WdBq#CIDJ(OVu![7X&JcE[g!<==crrQO-TRm.C
+s8N'!iVNQSVpYMG5QJQhrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!'p>["r1LKs8N'CJcGEC!e13Ci;WdBq#CIDJ(OVu![7X&JcE[g!<==crrQO-TRm.C
+s8N'!iVNQSVpYMG5QJQhrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!'pD]!ElW(rrE*DJcGEC!e13Ci;WdBqu?dBE7apc![7X&JcE[g!<==crrQO-TRm.C
+rrg[K!4(kgrrUlZl-]M45QJQhrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!'pD]!ElW(rrE*DJcGEC!e13Ci;WdBqu?dBE7apc![7X&JcE[g!<==crrQO-TRm.C
+rrg[K!4(kgrrUlZl-]M45QJQhrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!'pD]!ElW(rrE*DJcGEC!e13Ci;WdBqu?dBE7apc![7X&JcE[g!<==crrQO-TRm.C
+rrg[K!4(kgrrUlZl-]M45QJQhrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$!'pM`!a2GqqYpQr,(]derrRZMT]#hR5QCd.E6n7X![7X&JcE[g!<==crrQO-TRm.B
+rs/&!HiO.?RaBC\!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'nF$!'pM`!a2GqqYpQr,(]derrRZMT]#hR5QCd.E6n7X![7X&JcE[g!<==crrQO-TRm.B
+rs/&!HiO.?RaBC\!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'nF$!'pM`!a2GqqYpQr,(]derrRZMT]#hR5QCd.E6n7X![7X&JcE[g!<==crrQO-TRm.B
+rs/&!HiO.?RaBC\!^Hb#SGrXt!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'nF$"%ZRmp\4[g!$[!op&>)C!2/9M!afomoD\k9!8rG.`;]i<,0Bid?N?aMs2=p=5QJQh
+rrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$"%ZRmp\4[g!$[!op&>)C!2/9M!afomoD\k9!8rG.`;]i<,0Bid?N?aMs2=p=5QJQh
+rrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nF$"%ZRmp\4[g!$[!op&>)C!2/9M!afomoD\k9!8rG.`;]i<,0Bid?N?aMs2=p=5QJQh
+rrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!2+oC`;]m(!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!%3=_`'=A=!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!%3=_`'=A=!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;EL!%3=_`'=A=!5G'(!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;?JJH3Ic!5G'(!abr#JcEUerrC:C!abrB
+qu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;?JJH3Ic!5G'(!abr#JcEUerrC:C!abrB
+qu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Dao;?JJH3Ic!5G'(!abr#JcEUerrC:C!abrB
+qu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,0Bibf7C]P^B!_mrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,0Bibf7C]P^B!_mrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,0Bibf7C]P^B!_mrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,(]cFs.TGo?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,(]cFs.TGo?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,(]cFs.TGo?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ-ms+13$s+13PrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,00]`5_/pN!!(rKrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,00]`5_/pN!!(rKrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,00]`5_/pN!!(rKrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,00]`5_/pN!!(rKrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,00]`5_/pN!!(rKrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frr=6o!5SX8,00]`5_/pN!!(rKrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi.:pHrrE*Da8Z3+!5F*b`;]l_!8sIK!abr#JcEUerrC:C
+!abrBqu;0~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi3r[cI/a-JnAgstrr3)ia-m"#rrE*Da8Z3+!5FZrs*V9T
+![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi3r[cI/a-JnAgstrr3)ia-m"#rrE*Da8Z3+!5FZrs*V9T
+![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi3r[cI/a-JnAgstrr3)ia-m"#rrE*Da8Z3+!5FZrs*V9T
+![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi7n84a,Kut!dq<CjT#7-rr3(ZB)hr2rr\3m!!(4B"ke8'
+!1Mm$rrE*Da8Z3+!5I"_p](D/N4nK"s8RJTrrOAEi1BrM?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi7n84a,Kut!dq<CjT#7-rr3(ZB)hr2rr\3m!!(4B"ke8'
+!1Mm$rrE*Da8Z3+!5I"_p](D/N4nK"s8RJTrrOAEi1BrM?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi7n84a,Kut!dq<CjT#7-rr3(ZB)hr2rr\3m!!(4B"ke8'
+!1Mm$rrE*Da8Z3+!5I"_p](D/N4nK"s8RJTrrOAEi1BrM?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8+D8a%WDirr3)ZVbG.fs8N)ss8N)grrMThhu<\^qZ$WL
+h#@BT,00]b5QJRIrr^pS!9*nV"PK[Q!1NBV!Up)RrrOAEi1BrM?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8+D8a%WDirr3)ZVbG.fs8N)ss8N)grrMThhu<\^qZ$WL
+h#@BT,00]b5QJRIrr^pS!9*nV"PK[Q!1NBV!Up)RrrOAEi1BrM?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8+D8a%WDirr3)ZVbG.fs8N)ss8N)grrMThhu<\^qZ$WL
+h#@BT,00]b5QJRIrr^pS!9*nV"PK[Q!1NBV!Up)RrrOAEi1BrM?N?aMs2+g9!6kHE?N@k<s*t~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi84J8VbH@OrrVFYVr.OS!;uls!:^!hciE#(#iTFLs8UbG
+!,(*e!<==arrPFc^X<)]!;c]tn9b4`nG`O9!0mKb+opPmrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi84J8VbH@OrrVFYVr.OS!;uls!:^!hciE#(#iTFLs8UbG
+!,(*e!<==arrPFc^X<)]!;c]tn9b4`nG`O9!0mKb+opPmrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi84J8VbH@OrrVFYVr.OS!;uls!:^!hciE#(#iTFLs8UbG
+!,(*e!<==arrPFc^X<)]!;c]tn9b4`nG`O9!0mKb+opPmrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8=P9`rP)nrrUjR^#8qj!;uls!:^!hRK2:G!2obp!oX+Z
+h#@BT,00]b5QJRHs8N)orrS,ZVt'cfRK/TP![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8=P9`rP)nrrUjR^#8qj!;uls!:^!hRK2:G!2obp!oX+Z
+h#@BT,00]b5QJRHs8N)orrS,ZVt'cfRK/TP![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'mpk!<=<ps7QBnIfQ.frrOAEi8=P9`rP)nrrUjR^#8qj!;uls!:^!hRK2:G!2obp!oX+Z
+h#@BT,00]b5QJRHs8N)orrS,ZVt'cfRK/TP![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'nI%"2@*fkP"oV!$[!op&>)C!2/<N"2@*fkO\]T+opQZrrVZiN;!8QMu`A+s8N)ss8N)h
+rrUOI!87AQ!.<T%!<==arrPFc^X<)]!;HKp9E=>KrrUOI!0mKb+opPmrrQO-TRm-[s8N)CrrQO-
+^\e%]~>
+h#@Gj!'nI%"2@*fkP"oV!$[!op&>)C!2/<N"2@*fkO\]T+opQZrrVZiN;!8QMu`A+s8N)ss8N)h
+rrUOI!87AQ!.<T%!<==arrPFc^X<)]!;HKp9E=>KrrUOI!0mKb+opPmrrQO-TRm-[s8N)CrrQO-
+^\e%]~>
+h#@Gj!'nI%"2@*fkP"oV!$[!op&>)C!2/<N"2@*fkO\]T+opQZrrVZiN;!8QMu`A+s8N)ss8N)h
+rrUOI!87AQ!.<T%!<==arrPFc^X<)]!;HKp9E=>KrrUOI!0mKb+opPmrrQO-TRm-[s8N)CrrQO-
+^\e%]~>
+h#@Gj!'nI%!5JL5!^N+8q>UHq,(]derrRZMT],nN^]"375aU[-rrOAEi8FV:Z2i8FrrUOIZMsk-
+Z:ms*klCV\$b^0Q!0#V2s7"'t!;uls!;uls!;uj$iL3F?!.;KZrrA#U!!%uWrs%tj9E7banG`Fn
+nAgsts2SaPZLe(tn,VG&rrE*Df)Gg7?a'/&!^Hb#dJs4Hp\t<#!4)S'"mMpY!,'"ErrA#U!!%uV
+!<3#s!<<'*nAgsts5BCH!4)S'&+IW.!<<)ga-m#.iL0`HZMOS)Ve6!'Vsr%4![7X&T)Sk!!2+oC
+_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'nI%!5JL5!^N+8q>UHq,(]derrRZMT],nN^]"375aU[-rrOAEi8FV:Z2i8FrrUOIZMsk-
+Z:ms*klCV\$b^0Q!0#V2s7"'t!;uls!;uls!;uj$iL3F?!.;KZrrA#U!!%uWrs%tj9E7banG`Fn
+nAgsts2SaPZLe(tn,VG&rrE*Df)Gg7?a'/&!^Hb#dJs4Hp\t<#!4)S'"mMpY!,'"ErrA#U!!%uV
+!<3#s!<<'*nAgsts5BCH!4)S'&+IW.!<<)ga-m#.iL0`HZMOS)Ve6!'Vsr%4![7X&T)Sk!!2+oC
+_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'nI%!5JL5!^N+8q>UHq,(]derrRZMT],nN^]"375aU[-rrOAEi8FV:Z2i8FrrUOIZMsk-
+Z:ms*klCV\$b^0Q!0#V2s7"'t!;uls!;uls!;uj$iL3F?!.;KZrrA#U!!%uWrs%tj9E7banG`Fn
+nAgsts2SaPZLe(tn,VG&rrE*Df)Gg7?a'/&!^Hb#dJs4Hp\t<#!4)S'"mMpY!,'"ErrA#U!!%uV
+!<3#s!<<'*nAgsts5BCH!4)S'&+IW.!<<)ga-m#.iL0`HZMOS)Ve6!'Vsr%4![7X&T)Sk!!2+oC
+_Z0W9bl7`O!5JF2J,~>
+h#@Gj!'nI%!5JC2!^N+8r;Qct,(]derrRZMT],nN^\\!45aU[0rrOAEi8FV:HiW[0rsS&kI/j5P
+^&S,Q!!)ut%I$Qls8V$X!7:anB)hr0s8N)ss8N)trs6sOa8c2(HiUJNs8N)srtFWj^&S,c9MF.>
+s(>sE!4(kJB70=N!K=_HrrE*Df)Gp3!!!a@YPA,!5QJRHs8N)nrrV-ZI/a-NcqMgdiHtWQrVult
+rVlr`!!)ut&)dKgs8RIZ!!'^Gs8Sts^&J$CHtNEZs8RIZ!!'^Gs8Sts^&@s8n4\6!s5?ZM!7LlK
++opPmrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nI%!5JC2!^N+8r;Qct,(]derrRZMT],nN^\\!45aU[0rrOAEi8FV:HiW[0rsS&kI/j5P
+^&S,Q!!)ut%I$Qls8V$X!7:anB)hr0s8N)ss8N)trs6sOa8c2(HiUJNs8N)srtFWj^&S,c9MF.>
+s(>sE!4(kJB70=N!K=_HrrE*Df)Gp3!!!a@YPA,!5QJRHs8N)nrrV-ZI/a-NcqMgdiHtWQrVult
+rVlr`!!)ut&)dKgs8RIZ!!'^Gs8Sts^&J$CHtNEZs8RIZ!!'^Gs8Sts^&@s8n4\6!s5?ZM!7LlK
++opPmrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nI%!5JC2!^N+8r;Qct,(]derrRZMT],nN^\\!45aU[0rrOAEi8FV:HiW[0rsS&kI/j5P
+^&S,Q!!)ut%I$Qls8V$X!7:anB)hr0s8N)ss8N)trs6sOa8c2(HiUJNs8N)srtFWj^&S,c9MF.>
+s(>sE!4(kJB70=N!K=_HrrE*Df)Gp3!!!a@YPA,!5QJRHs8N)nrrV-ZI/a-NcqMgdiHtWQrVult
+rVlr`!!)ut&)dKgs8RIZ!!'^Gs8Sts^&J$CHtNEZs8RIZ!!'^Gs8Sts^&@s8n4\6!s5?ZM!7LlK
++opPmrrQO-TRm-[s8N)CrrQO-^\e%]~>
+h#@Gj!'nI%!5J:/#!eO<s8N'CJcGEC!e13CiVrnmp](@\Qfn;H![7X&i;`fWo`+pks8N'mrVlo(
+!<)ou9Ubq[!fR+Qrr;uur;Zcsr;ZcsrVlml!<)p!n,Q/\s8N)srrHcGrVlua!)2n]s8N'!d..,=
+ct<?;l.l:>!$^"o!9!bT!Yo(Gqu6^_!5Hq]rrDcmrrE*!!q8n(rr3)R!!'_3s8N)ss8N)ss8N)t
+s8N'!l2L\an,R,!s8N)ts8N'!l2L\an,R,"rrSVhnG`FhciBujrrOAEi1BrM?N?aMs2+g9!6kHE
+?N@k<s*t~>
+h#@Gj!'nI%!5J:/#!eO<s8N'CJcGEC!e13CiVrnmp](@\Qfn;H![7X&i;`fWo`+pks8N'mrVlo(
+!<)ou9Ubq[!fR+Qrr;uur;Zcsr;ZcsrVlml!<)p!n,Q/\s8N)srrHcGrVlua!)2n]s8N'!d..,=
+ct<?;l.l:>!$^"o!9!bT!Yo(Gqu6^_!5Hq]rrDcmrrE*!!q8n(rr3)R!!'_3s8N)ss8N)ss8N)t
+s8N'!l2L\an,R,!s8N)ts8N'!l2L\an,R,"rrSVhnG`FhciBujrrOAEi1BrM?N?aMs2+g9!6kHE
+?N@k<s*t~>
+h#@Gj!'nI%!5J:/#!eO<s8N'CJcGEC!e13CiVrnmp](@\Qfn;H![7X&i;`fWo`+pks8N'mrVlo(
+!<)ou9Ubq[!fR+Qrr;uur;Zcsr;ZcsrVlml!<)p!n,Q/\s8N)srrHcGrVlua!)2n]s8N'!d..,=
+ct<?;l.l:>!$^"o!9!bT!Yo(Gqu6^_!5Hq]rrDcmrrE*!!q8n(rr3)R!!'_3s8N)ss8N)ss8N)t
+s8N'!l2L\an,R,!s8N)ts8N'!l2L\an,R,"rrSVhnG`FhciBujrrOAEi1BrM?N?aMs2+g9!6kHE
+?N@k<s*t~>
+h#@Gj!%5ZL!&!pE"$i1Q,(]derrRZM0&]%q0(f2L5aU[6ruqI$i;`fWo`+pks8N*"VuH\sn,WIf
+!keTurVlr`9RQj>rrDusrrDusrrE#ts*XbErrE#trrE#t!lk<*r;Qhr!4)V(rrDThqu?aknD4*F
+!$^"o!9!YQ!Yo(Grr3$b!5Hq]rrDcmrrE*!!N,qqs8N'!I/a0G!;uls!;uls!<)rt!;uls!;uls
+!<)rt!;uls!<)rt!;uit!)1c>![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!%5ZL!&!pE"$i1Q,(]derrRZM0&]%q0(f2L5aU[6ruqI$i;`fWo`+pks8N*"VuH\sn,WIf
+!keTurVlr`9RQj>rrDusrrDusrrE#ts*XbErrE#trrE#t!lk<*r;Qhr!4)V(rrDThqu?aknD4*F
+!$^"o!9!YQ!Yo(Grr3$b!5Hq]rrDcmrrE*!!N,qqs8N'!I/a0G!;uls!;uls!<)rt!;uls!;uls
+!<)rt!;uls!<)rt!;uit!)1c>![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@Gj!%5ZL!&!pE"$i1Q,(]derrRZM0&]%q0(f2L5aU[6ruqI$i;`fWo`+pks8N*"VuH\sn,WIf
+!keTurVlr`9RQj>rrDusrrDusrrE#ts*XbErrE#trrE#t!lk<*r;Qhr!4)V(rrDThqu?aknD4*F
+!$^"o!9!YQ!Yo(Grr3$b!5Hq]rrDcmrrE*!!N,qqs8N'!I/a0G!;uls!;uls!<)rt!;uls!;uls
+!<)rt!;uls!<)rt!;uit!)1c>![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2J,~>
+h#@ApYlFbJJcGEC!.W>q"^0d`+opQZs8N)ks8N*!rr\\i9YL?'!IOn@s8N)ss8N)ss8N)prrhi3
+HiO0Fs8N)trrIKIqu6`V!,)<2rrDQg"n9QF!!&qQrrE*7epd[=p&G72?`u]p^X<)]!;?Hm!<<'!
+BD;K+s8N)ss8N)ss8N)ts8N)ss8N)ss8N)ts8N)ss8N)ts8N)ss8N)GrrOAEi2lq[/mkgUrrQO-
+TRm-[s8N)CrrQO-^\e%]~>
+h#@ApYlFbJJcGEC!.W>q"^0d`+opQZs8N)ks8N*!rr\\i9YL?'!IOn@s8N)ss8N)ss8N)prrhi3
+HiO0Fs8N)trrIKIqu6`V!,)<2rrDQg"n9QF!!&qQrrE*7epd[=p&G72?`u]p^X<)]!;?Hm!<<'!
+BD;K+s8N)ss8N)ss8N)ts8N)ss8N)ss8N)ts8N)ss8N)ts8N)ss8N)GrrOAEi2lq[/mkgUrrQO-
+TRm-[s8N)CrrQO-^\e%]~>
+h#@ApYlFbJJcGEC!.W>q"^0d`+opQZs8N)ks8N*!rr\\i9YL?'!IOn@s8N)ss8N)ss8N)prrhi3
+HiO0Fs8N)trrIKIqu6`V!,)<2rrDQg"n9QF!!&qQrrE*7epd[=p&G72?`u]p^X<)]!;?Hm!<<'!
+BD;K+s8N)ss8N)ss8N)ts8N)ss8N)ss8N)ts8N)ss8N)ts8N)ss8N)GrrOAEi2lq[/mkgUrrQO-
+TRm-[s8N)CrrQO-^\e%]~>
+g]%:]Qc$Q<O7iPV=f:uo,(]derrRZMGN$::O7iPT=f;#nrrOAEi8FV:Mu`,9rrVZiN;ih[RK*=]
+Vu?Yq!;?Hm!;uls!;uls!;ld#iL3HGkl:_^s8N)ts8N)qs8N)us8N)drrRQJ9\o`d!!'d]s8N)n
+rs%E^N;rnX!;?Hm!;uls!;uls!<)rt!;uls!;uls!<)rt!;uls!<)p!VZ>*CrrVZiN6qS++opQ&
+rrjSH!#8kEq>UM'!2+oC_Z0W9bl7`O!5JF2J,~>
+g]%:]Qc$Q<O7iPV=f:uo,(]derrRZMGN$::O7iPT=f;#nrrOAEi8FV:Mu`,9rrVZiN;ih[RK*=]
+Vu?Yq!;?Hm!;uls!;uls!;ld#iL3HGkl:_^s8N)ts8N)qs8N)us8N)drrRQJ9\o`d!!'d]s8N)n
+rs%E^N;rnX!;?Hm!;uls!;uls!<)rt!;uls!;uls!<)rt!;uls!<)p!VZ>*CrrVZiN6qS++opQ&
+rrjSH!#8kEq>UM'!2+oC_Z0W9bl7`O!5JF2J,~>
+g]%:]Qc$Q<O7iPV=f:uo,(]derrRZMGN$::O7iPT=f;#nrrOAEi8FV:Mu`,9rrVZiN;ih[RK*=]
+Vu?Yq!;?Hm!;uls!;uls!;ld#iL3HGkl:_^s8N)ts8N)qs8N)us8N)drrRQJ9\o`d!!'d]s8N)n
+rs%E^N;rnX!;?Hm!;uls!;uls!<)rt!;uls!;uls!<)rt!;uls!<)p!VZ>*CrrVZiN6qS++opQ&
+rrjSH!#8kEq>UM'!2+oC_Z0W9bl7`O!5JF2J,~>
+S,WK'q#CJ!Vt^2j!<=<ps7QBnIfQ/#rrBh0!!6<$p\Xsl+opQZrrTJ+a7fN7f`9(krsI__!!#^W
+s8N'!l1b5X!;uls!;uls!;uiuZ2hT;s8N)ts8N)ts8N)qs8N)us8N)drrUjR!8[YU!#=(7!-%W3
+"Vk[b5QJRHs8N)nrs,h0ZN'q)!:]a_rrDusrrDusrrE#trrDusrrDusrrE#trrDusrrDus#CK5(
+s6tD0l-TG3+opQ&rr=8@!!3mBYPeD%?N?aMs2+g9!6kHE?N@k<s*t~>
+S,WK'q#CJ!Vt^2j!<=<ps7QBnIfQ/#rrBh0!!6<$p\Xsl+opQZrrTJ+a7fN7f`9(krsI__!!#^W
+s8N'!l1b5X!;uls!;uls!;uiuZ2hT;s8N)ts8N)ts8N)qs8N)us8N)drrUjR!8[YU!#=(7!-%W3
+"Vk[b5QJRHs8N)nrs,h0ZN'q)!:]a_rrDusrrDusrrE#trrDusrrDusrrE#trrDusrrDus#CK5(
+s6tD0l-TG3+opQ&rr=8@!!3mBYPeD%?N?aMs2+g9!6kHE?N@k<s*t~>
+S,WK'q#CJ!Vt^2j!<=<ps7QBnIfQ/#rrBh0!!6<$p\Xsl+opQZrrTJ+a7fN7f`9(krsI__!!#^W
+s8N'!l1b5X!;uls!;uls!;uiuZ2hT;s8N)ts8N)ts8N)qs8N)us8N)drrUjR!8[YU!#=(7!-%W3
+"Vk[b5QJRHs8N)nrs,h0ZN'q)!:]a_rrDusrrDusrrE#trrDusrrDusrrE#trrDusrrDus#CK5(
+s6tD0l-TG3+opQ&rr=8@!!3mBYPeD%?N?aMs2+g9!6kHE?N@k<s*t~>
+S,WK'qu?e$Vt^)g!<=<ps7QBnIfQ/#rrBh3!!6<$p\=ai+opQZrrVZiI.mR@VbHse#jH^:N;roj
+!6>$;!Usb$s8N)ss8N)ss8N)trrTJ+a8Q&<!<)rt!<)p!B)pW^rrE+Yrr;uum/I(dBANRg!$^"o
+!9!YQ!Yo@_rr3$b!5Hq]rrDfn#>>-es8Q^3a8Gr<n7Vb#rrDusrrDusrrE#trrDusrrDusrrE#t
+rrDusrrDus#3fc5!)0<Tci4%j!8ssY!$_4=#8LULs8QF+TRm-[s8N)CrrQO-^\e%]~>
+S,WK'qu?e$Vt^)g!<=<ps7QBnIfQ/#rrBh3!!6<$p\=ai+opQZrrVZiI.mR@VbHse#jH^:N;roj
+!6>$;!Usb$s8N)ss8N)ss8N)trrTJ+a8Q&<!<)rt!<)p!B)pW^rrE+Yrr;uum/I(dBANRg!$^"o
+!9!YQ!Yo@_rr3$b!5Hq]rrDfn#>>-es8Q^3a8Gr<n7Vb#rrDusrrDusrrE#trrDusrrDusrrE#t
+rrDusrrDus#3fc5!)0<Tci4%j!8ssY!$_4=#8LULs8QF+TRm-[s8N)CrrQO-^\e%]~>
+S,WK'qu?e$Vt^)g!<=<ps7QBnIfQ/#rrBh3!!6<$p\=ai+opQZrrVZiI.mR@VbHse#jH^:N;roj
+!6>$;!Usb$s8N)ss8N)ss8N)trrTJ+a8Q&<!<)rt!<)p!B)pW^rrE+Yrr;uum/I(dBANRg!$^"o
+!9!YQ!Yo@_rr3$b!5Hq]rrDfn#>>-es8Q^3a8Gr<n7Vb#rrDusrrDusrrE#trrDusrrDusrrE#t
+rrDusrrDus#3fc5!)0<Tci4%j!8ssY!$_4=#8LULs8QF+TRm-[s8N)CrrQO-^\e%]~>
+S,WZ,!!$0"p\=ah!$[!op&>)C!2/<N"ht$;=f;#errOAEi8=P9]`?+JrrV-Za8Z)>!:^!f#Oh]n
+s8Sts9`4nkZC:dmrrDusrrDusrrE#trrDusrrE#trrE#t!jVg(r;Qi_!7:`FrrDEc!<BghrrE*D
+f)Ga.qu?d5B>=?D!^Hb#dJs4Hq#:DC!58C3!iH#lr;Qf2N;ikW!;uls!;uls!<)rt!;uls!;uls
+!<)rt!;uls!<)p!ktL'YrrO/?335C<!!F$D63*[0s2+g9!6kHE?N@k<s*t~>
+S,WZ,!!$0"p\=ah!$[!op&>)C!2/<N"ht$;=f;#errOAEi8=P9]`?+JrrV-Za8Z)>!:^!f#Oh]n
+s8Sts9`4nkZC:dmrrDusrrDusrrE#trrDusrrE#trrE#t!jVg(r;Qi_!7:`FrrDEc!<BghrrE*D
+f)Ga.qu?d5B>=?D!^Hb#dJs4Hq#:DC!58C3!iH#lr;Qf2N;ikW!;uls!;uls!<)rt!;uls!;uls
+!<)rt!;uls!<)p!ktL'YrrO/?335C<!!F$D63*[0s2+g9!6kHE?N@k<s*t~>
+S,WZ,!!$0"p\=ah!$[!op&>)C!2/<N"ht$;=f;#errOAEi8=P9]`?+JrrV-Za8Z)>!:^!f#Oh]n
+s8Sts9`4nkZC:dmrrDusrrDusrrE#trrDusrrE#trrE#t!jVg(r;Qi_!7:`FrrDEc!<BghrrE*D
+f)Ga.qu?d5B>=?D!^Hb#dJs4Hq#:DC!58C3!iH#lr;Qf2N;ikW!;uls!;uls!<)rt!;uls!;uls
+!<)rt!;uls!<)p!ktL'YrrO/?335C<!!F$D63*[0s2+g9!6kHE?N@k<s*t~>
+S,WQJVt]la!<=<ps7QBnIfQ/#rrV,Vp[\=c+opQXrrT)liVNQUiCp0JrrE,*rVm<,BE/#$!!%E2
+s8UaPiVrlW!;uls!;uls!<)rt!!)Nes8N)ts8N)srrPjoiVicW]k@<DrrDHd!PN.$rrE*Df)Gp3
+!!!aH^\Ig15QJRHs8N)qrr_b<!2oeq$0_EiBA*=bcqMgcs8N)srrRQJnG`Fhi;`lVs8N)ss8N)s
+s8N)ts8N)ss8N)trrS,Zl,s#+*1R!1+on9es2+g9!6kHE?N@k<s*t~>
+S,WQJVt]la!<=<ps7QBnIfQ/#rrV,Vp[\=c+opQXrrT)liVNQUiCp0JrrE,*rVm<,BE/#$!!%E2
+s8UaPiVrlW!;uls!;uls!<)rt!!)Nes8N)ts8N)srrPjoiVicW]k@<DrrDHd!PN.$rrE*Df)Gp3
+!!!aH^\Ig15QJRHs8N)qrr_b<!2oeq$0_EiBA*=bcqMgcs8N)srrRQJnG`Fhi;`lVs8N)ss8N)s
+s8N)ts8N)ss8N)trrS,Zl,s#+*1R!1+on9es2+g9!6kHE?N@k<s*t~>
+S,WQJVt]la!<=<ps7QBnIfQ/#rrV,Vp[\=c+opQXrrT)liVNQUiCp0JrrE,*rVm<,BE/#$!!%E2
+s8UaPiVrlW!;uls!;uls!<)rt!!)Nes8N)ts8N)srrPjoiVicW]k@<DrrDHd!PN.$rrE*Df)Gp3
+!!!aH^\Ig15QJRHs8N)qrr_b<!2oeq$0_EiBA*=bcqMgcs8N)srrRQJnG`Fhi;`lVs8N)ss8N)s
+s8N)ts8N)ss8N)trrS,Zl,s#+*1R!1+on9es2+g9!6kHE?N@k<s*t~>
+N;inY,(]derrRZMT[3W>+opQWrr]q7Vr@XT"50SGd/<qD!!T\.s/,kDrr2uFqZ$Vorr3)I!!(CF
+rr^UJ!7:`F"4.#Jd/O%bVZ;,6s3R27!:[;os*Oh*fo5t2fh>)ds8U,5l2L\b`rH+up&>;F9W..T
+s1NgEh#@BT,1cbqk@_R&rrPFc^XE,bf`2$2nG`Fjfr"gD^&.g0d/*eCVu?W2HiW-YN;rpk!2oks
+]uL*QB70a+!!(^Orr_`j!7:`F$.&YPd/X-m!!(^Orr_`j!7:`F!)31g!2n6E![7WBXM4`MpAbA"
+VtXNuTRm-[s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opQWrr]q7Vr@XT"50SGd/<qD!!T\.s/,kDrr2uFqZ$Vorr3)I!!(CF
+rr^UJ!7:`F"4.#Jd/O%bVZ;,6s3R27!:[;os*Oh*fo5t2fh>)ds8U,5l2L\b`rH+up&>;F9W..T
+s1NgEh#@BT,1cbqk@_R&rrPFc^XE,bf`2$2nG`Fjfr"gD^&.g0d/*eCVu?W2HiW-YN;rpk!2oks
+]uL*QB70a+!!(^Orr_`j!7:`F$.&YPd/X-m!!(^Orr_`j!7:`F!)31g!2n6E![7WBXM4`MpAbA"
+VtXNuTRm-[s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opQWrr]q7Vr@XT"50SGd/<qD!!T\.s/,kDrr2uFqZ$Vorr3)I!!(CF
+rr^UJ!7:`F"4.#Jd/O%bVZ;,6s3R27!:[;os*Oh*fo5t2fh>)ds8U,5l2L\b`rH+up&>;F9W..T
+s1NgEh#@BT,1cbqk@_R&rrPFc^XE,bf`2$2nG`Fjfr"gD^&.g0d/*eCVu?W2HiW-YN;rpk!2oks
+]uL*QB70a+!!(^Orr_`j!7:`F$.&YPd/X-m!!(^Orr_`j!7:`F!)31g!2n6E![7WBXM4`MpAbA"
+VtXNuTRm-[s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opQVrrV\qN;`eXN5tep"p!o$B)m>4r;QrZRK*>8d/O(B!!*&r!!*&r
+!<3!/VZ6^Ed/TO7N9UBBl":!orVm)dRS3]oVss]cqZ-?i#/+XL!)/j.gA_0R,00]b5QJRJs7cQq
+B8jn+rrqAM!!%D[r;Ql`B)nk.rs>u)!1N0P!1LstqZ-Zrqu?`so`5$lquHcs!ROO9!!&qFrrOAE
+i2lqY,5M9@=f;#nrrQO-TRm-[s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opQVrrV\qN;`eXN5tep"p!o$B)m>4r;QrZRK*>8d/O(B!!*&r!!*&r
+!<3!/VZ6^Ed/TO7N9UBBl":!orVm)dRS3]oVss]cqZ-?i#/+XL!)/j.gA_0R,00]b5QJRJs7cQq
+B8jn+rrqAM!!%D[r;Ql`B)nk.rs>u)!1N0P!1LstqZ-Zrqu?`so`5$lquHcs!ROO9!!&qFrrOAE
+i2lqY,5M9@=f;#nrrQO-TRm-[s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opQVrrV\qN;`eXN5tep"p!o$B)m>4r;QrZRK*>8d/O(B!!*&r!!*&r
+!<3!/VZ6^Ed/TO7N9UBBl":!orVm)dRS3]oVss]cqZ-?i#/+XL!)/j.gA_0R,00]b5QJRJs7cQq
+B8jn+rrqAM!!%D[r;Ql`B)nk.rs>u)!1N0P!1LstqZ-Zrqu?`so`5$lquHcs!ROO9!!&qFrrOAE
+i2lqY,5M9@=f;#nrrQO-TRm-[s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcG`L!SOCJrrVG_!7LlK+opQ&rr=8A!!6<$
+p\Xsl?N?aMs2+g9!6kHE?N@k<s*t~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcG`L!SOCJrrVG_!7LlK+opQ&rr=8A!!6<$
+p\Xsl?N?aMs2+g9!6kHE?N@k<s*t~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcG`L!SOCJrrVG_!7LlK+opQ&rr=8A!!6<$
+p\Xsl?N?aMs2+g9!6kHE?N@k<s*t~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcM!q8nJq>UEpdf0@m!8ssY"<mhKVt]ud
+!abr#JcEUerrC:C!abrBqu;0~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcM!q8nJq>UEpdf0@m!8ssY"<mhKVt]ud
+!abr#JcEUerrC:C!abrBqu;0~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcM!q8nJq>UEpdf0@m!8ssY"<mhKVt]ud
+!abr#JcEUerrC:C!abrBqu;0~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcM!K7$SrrMVedf0@m!8ssY!OqgrrrQO-
+TRm-[s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcM!K7$SrrMVedf0@m!8ssY!OqgrrrQO-
+TRm-[s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcM!K7$SrrMVedf0@m!8ssY!OqgrrrQO-
+TRm-[s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcMrr<&XqYpPndJj7l!8sIK!abr#JcEUe
+rrC:C!abrBqu;0~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcMrr<&XqYpPndJj7l!8sIK!abr#JcEUe
+rrC:C!abrBqu;0~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcMrr<&XqYpPndJj7l!8sIK!abr#JcEUe
+rrC:C!abrBqu;0~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcM"OI,KZK_Ag!njmDdJj7l!8sIK!abr#
+JcEUerrC:C!abrBqu;0~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcM"OI,KZK_Ag!njmDdJj7l!8sIK!abr#
+JcEUerrC:C!abrBqu;0~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcGcM"OI,KZK_Ag!njmDdJj7l!8sIK!abr#
+JcEUerrC:C!abrBqu;0~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcG`L#Oo$H!!#]]d*M^n+opPmrrQO-TRm-[
+s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcG`L#Oo$H!!#]]d*M^n+opPmrrQO-TRm-[
+s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcG`L#Oo$H!!#]]d*M^n+opPmrrQO-TRm-[
+s8N)CrrQO-^\e%]~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!2+oC_Z0W9bl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!-j(0_S?*Nbl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!-j(0_S?*Nbl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)Sk!!-j(0_S?*Nbl7`O!5JF2
+J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)SdtJH3Cabl7`O!5JF2J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)SdtJH3Cabl7`O!5JF2J,~>
+N;inY,(]derrRZMT[3W>+opPPs2=p<!$]J`!^Hb#JcE[g![7X&T)SdtJH3Cabl7`O!5JF2J,~>
+N;inY,(]derrRZMT[3W>+olS5J&Hg;!$]J`!^H`mJUbUf!Yk^nT)SeGJO$q7bl7`O!5JF2J,~>
+N;inY,(]derrRZMT[3W>+olS5J&Hg;!$]J`!^H`mJUbUf!Yk^nT)SeGJO$q7bl7`O!5JF2J,~>
+N;inY,(]derrRZMT[3W>+olS5J&Hg;!$]J`!^H`mJUbUf!Yk^nT)SeGJO$q7bl7`O!5JF2J,~>
+N;inY,(]derrRZMT[3W<,(Ta1!!"4`rr><8!5JR7i.:oZs/#_s?N@k<s*t~>
+N;inY,(]derrRZMT[3W<,(Ta1!!"4`rr><8!5JR7i.:oZs/#_s?N@k<s*t~>
+N;inY,(]derrRZMT[3W<,(Ta1!!"4`rr><8!5JR7i.:oZs/#_s?N@k<s*t~>
+N;inY,(]derrRZMT[3W<O+DesIfPPMrrA^CJ&$O6mt(Lis/#_s?N@k<s*t~>
+N;inY,(]derrRZMT[3W<O+DesIfPPMrrA^CJ&$O6mt(Lis/#_s?N@k<s*t~>
+N;inY,(]derrRZMT[3W<O+DesIfPPMrrA^CJ&$O6mt(Lis/#_s?N@k<s*t~>
+N;nG/nGiQ^JcC<$JcC<$JcC<$[/U27!5JF2J,~>
+N;nG/nGiQ^JcC<$JcC<$JcC<$[/U27!5JF2J,~>
+N;nG/nGiQ^JcC<$JcC<$JcC<$[/U27!5JF2J,~>
+N;nG/nGiQ^JcC<$JcC<$JcC<$[/U27!5JF2J,~>
+N;nG/nGiQ^JcC<$JcC<$JcC<$[/U27!5JF2J,~>
+N;nG/nGiQ^JcC<$JcC<$JcC<$[/U27!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+JcC<$JcC<$JcC<$JcC<$Y5\Q1!5JF2J,~>
+g]%?D:j7J?JU`6#JU`6#JU`6#JUc:$!\OJfqu;0~>
+g]%?D:j7J?JU`6#JU`6#JU`6#JUc:$!\OJfqu;0~>
+g]%?D:j7J?JU`6#JU`6#JU`6#JUc:$!\OJfqu;0~>
+g]%8%JH16$JH16$JH16$JH16$df9BBqu;0~>
+g]%8%JH16$JH16$JH16$JH16$df9BBqu;0~>
+g]%8%JH16$JH16$JH16$JH16$df9BBqu;0~>
+g]%>D!'l*bJU`6#JU`6#JU`6#JUc:$!I&_`s*t~>
+g]%>D!'l*bJU`6#JU`6#JU`6#JUc:$!I&_`s*t~>
+g]%>D!'l*bJU`6#JU`6#JU`6#JUc:$!I&_`s*t~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.TS"JcC<$JcC<$JcC<$JcF$qJ,~>
+g]%>J!.VEV!2+lCb5_NlMuNd<JUbjmJcC<$JcC<$s8RT~>
+g]%>J!.VEV!2+lCb5_NlMuNd<JUbjmJcC<$JcC<$s8RT~>
+g]%>J!.VEV!2+lCb5_NlMuNd<JUbjmJcC<$JcC<$s8RT~>
+g]%>J!.VEV!2+lCb5_NlMuNc$JH3jnJcC<$JcC<$s8RT~>
+g]%>J!.VEV!2+lCb5_NlMuNc$JH3jnJcC<$JcC<$s8RT~>
+g]%>J!.VEV!2+lCb5_NlMuNc$JH3jnJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!-!L=c[YrpJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!-!L=c[YrpJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!-!L=c[YrpJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#JcF'r!e13"MuNi&!8rG.ci="FJcC<$JcC<$s8RT~>
+g]%>J!.VEV!h]O#fDkXH!b[J=K`;+'!.Tq,![7X&XT&Cla-m#+s8RK,rr_c2RK1b8rr@WMJcC<$
+JcGcMJ,~>
+g]%>J!.VEV!h]O#fDkXH!b[J=K`;+'!.Tq,![7X&XT&Cla-m#+s8RK,rr_c2RK1b8rr@WMJcC<$
+JcGcMJ,~>
+g]%>J!.VEV!h]O#fDkXH!b[J=K`;+'!.Tq,![7X&XT&Cla-m#+s8RK,rr_c2RK1b8rr@WMJcC<$
+JcGcMJ,~>
+g]%>J!.VEV!h]O#f)Gg)!!)ut"5/V5N3`Han,V&>!e13"MuNi&!8uQ1!N1n-rr\3m!!)rss*Wl,
+"+4_]!7CiH!.k0$s+13$s8W+L~>
+g]%>J!.VEV!h]O#f)Gg)!!)ut"5/V5N3`Han,V&>!e13"MuNi&!8uQ1!N1n-rr\3m!!)rss*Wl,
+"+4_]!7CiH!.k0$s+13$s8W+L~>
+g]%>J!.VEV!h]O#f)Gg)!!)ut"5/V5N3`Han,V&>!e13"MuNi&!8uQ1!N1n-rr\3m!!)rss*Wl,
+"+4_]!7CiH!.k0$s+13$s8W+L~>
+g]%>J!.VEV!h]O#ec5XLqu6_d!55`=!RLhtrrRZMIuF=.+opQSs8N'!nC@R=!;6?mn,V\PrrCIH
+rr@WMJcC<$JcGcMJ,~>
+g]%>J!.VEV!h]O#ec5XLqu6_d!55`=!RLhtrrRZMIuF=.+opQSs8N'!nC@R=!;6?mn,V\PrrCIH
+rr@WMJcC<$JcGcMJ,~>
+g]%>J!.VEV!h]O#ec5XLqu6_d!55`=!RLhtrrRZMIuF=.+opQSs8N'!nC@R=!;6?mn,V\PrrCIH
+rr@WMJcC<$JcGcMJ,~>
+g]%>J!.VEV!h]O#ec5XLqu6`e!)0a!!La#>rrRZMIuF=.+opQTrr^:A!4(/TrrD`l!RLi1s8N)H
+s8N(Ms+13$s+14Ms*t~>
+g]%>J!.VEV!h]O#ec5XLqu6`e!)0a!!La#>rrRZMIuF=.+opQTrr^:A!4(/TrrD`l!RLi1s8N)H
+s8N(Ms+13$s+14Ms*t~>
+g]%>J!.VEV!h]O#ec5XLqu6`e!)0a!!La#>rrRZMIuF=.+opQTrr^:A!4(/TrrD`l!RLi1s8N)H
+s8N(Ms+13$s+14Ms*t~>
+g]%>J!.VEV!h]O#ec5XLqZ$Qq[/U3S!!(UM!e13"MuNi&!8uT2")$Qm9\'1C!;6?mRK2ROrrCIH
+rr@WMJcC<$JcGcMJ,~>
+g]%>J!.VEV!h]O#ec5XLqZ$Qq[/U3S!!(UM!e13"MuNi&!8uT2")$Qm9\'1C!;6?mRK2ROrrCIH
+rr@WMJcC<$JcGcMJ,~>
+g]%>J!.VEV!h]O#ec5XLqZ$Qq[/U3S!!(UM!e13"MuNi&!8uT2")$Qm9\'1C!;6?mRK2ROrrCIH
+rr@WMJcC<$JcGcMJ,~>
+g]%>J!.VEV!h]O#ec5XLqu6`V!,)3/"mMpY!,'"Crro]%9YKZjr;QujVb@(aVss]c$1Q!(!<;#H
+!!'>&rs%GN9E5'?^&J$<nAgsts5BCH!4)V(!0$gU!0#V2!e13"MuNi&!8uW3"mM!GMu_5Us8N)m
+rrUOI!9jI_!7CiH!.k0$s+13$s8W+L~>
+g]%>J!.VEV!h]O#ec5XLqu6`V!,)3/"mMpY!,'"Crro]%9YKZjr;QujVb@(aVss]c$1Q!(!<;#H
+!!'>&rs%GN9E5'?^&J$<nAgsts5BCH!4)V(!0$gU!0#V2!e13"MuNi&!8uW3"mM!GMu_5Us8N)m
+rrUOI!9jI_!7CiH!.k0$s+13$s8W+L~>
+g]%>J!.VEV!h]O#ec5XLqu6`V!,)3/"mMpY!,'"Crro]%9YKZjr;QujVb@(aVss]c$1Q!(!<;#H
+!!'>&rs%GN9E5'?^&J$<nAgsts5BCH!4)V(!0$gU!0#V2!e13"MuNi&!8uW3"mM!GMu_5Us8N)m
+rrUOI!9jI_!7CiH!.k0$s+13$s8W+L~>
+g]%>J!.VEV!h]O#ec5XLqu6_F!87;M#LH/ks5A>*I/a-MZG$;<`rH,<rtXcl^&S,c9MF.>s*SGZ
+!56)Gs/,k1rr3_[!6>->l$NK:s8RIZ!!'^Gs8Sts^&A!2!7q/OIfOtVrrOAEi7n88VpPIj!0$dS
+&Fd`/!<;;P!!&Jfs5BCH9X=Zt$1Q!(!<:Dn!)1*'s8N)urr_c2RK3?e!0$gU!0$jVrr;osqu6ku
+9E:%9!!)rs"mMpY!,'"#s8N(Ms+13$s+14Ms*t~>
+g]%>J!.VEV!h]O#ec5XLqu6_F!87;M#LH/ks5A>*I/a-MZG$;<`rH,<rtXcl^&S,c9MF.>s*SGZ
+!56)Gs/,k1rr3_[!6>->l$NK:s8RIZ!!'^Gs8Sts^&A!2!7q/OIfOtVrrOAEi7n88VpPIj!0$dS
+&Fd`/!<;;P!!&Jfs5BCH9X=Zt$1Q!(!<:Dn!)1*'s8N)urr_c2RK3?e!0$gU!0$jVrr;osqu6ku
+9E:%9!!)rs"mMpY!,'"#s8N(Ms+13$s+14Ms*t~>
+g]%>J!.VEV!h]O#ec5XLqu6_F!87;M#LH/ks5A>*I/a-MZG$;<`rH,<rtXcl^&S,c9MF.>s*SGZ
+!56)Gs/,k1rr3_[!6>->l$NK:s8RIZ!!'^Gs8Sts^&A!2!7q/OIfOtVrrOAEi7n88VpPIj!0$dS
+&Fd`/!<;;P!!&Jfs5BCH9X=Zt$1Q!(!<:Dn!)1*'s8N)urr_c2RK3?e!0$gU!0$jVrr;osqu6ku
+9E:%9!!)rs"mMpY!,'"#s8N(Ms+13$s+14Ms*t~>
+g]%>J!.VEV!h]O#ec5XLrr3,[Z:ms=r;Qif9ZR/4#2&tV^&S++rVlo(!<)ouB>+9D"6feZnG`If
+!!)9_rrVZiBE%o39E>%k!q61`rVult!9sL_!q62&rVultf)Gf$!.Tq,![7X&g]%7drr3$n!:]mc
+*dhT#!85'cs-`qH]tOIGVZ=F1s*SGZ!4'uOn<s?Gr;Zcsrr3(JB)hr0s8N)trrVEb!<)p!i;`lV
+rs8+,Rdg@(MuWkVrs-nEd/W'P!.<W&rr@WMJcC<$JcGcMJ,~>
+g]%>J!.VEV!h]O#ec5XLrr3,[Z:ms=r;Qif9ZR/4#2&tV^&S++rVlo(!<)ouB>+9D"6feZnG`If
+!!)9_rrVZiBE%o39E>%k!q61`rVult!9sL_!q62&rVultf)Gf$!.Tq,![7X&g]%7drr3$n!:]mc
+*dhT#!85'cs-`qH]tOIGVZ=F1s*SGZ!4'uOn<s?Gr;Zcsrr3(JB)hr0s8N)trrVEb!<)p!i;`lV
+rs8+,Rdg@(MuWkVrs-nEd/W'P!.<W&rr@WMJcC<$JcGcMJ,~>
+g]%>J!.VEV!h]O#ec5XLrr3,[Z:ms=r;Qif9ZR/4#2&tV^&S++rVlo(!<)ouB>+9D"6feZnG`If
+!!)9_rrVZiBE%o39E>%k!q61`rVult!9sL_!q62&rVultf)Gf$!.Tq,![7X&g]%7drr3$n!:]mc
+*dhT#!85'cs-`qH]tOIGVZ=F1s*SGZ!4'uOn<s?Gr;Zcsrr3(JB)hr0s8N)trrVEb!<)p!i;`lV
+rs8+,Rdg@(MuWkVrs-nEd/W'P!.<W&rr@WMJcC<$JcGcMJ,~>
+g]%>J!.VEV!h]O#ec5LH!dr&Xqu6\p!;uls!!I]LrrAtrrrMThrr3&?!9sF]!iH%(rr;uur;Zcs
+rr<"Gr;ZcsrVultr;ZcsrVultf)Gf$!.Tq,![7X&h#@E%ZMsk*Z2h3+s8N'!l2L\bn,NIQrr3&h
+!,)91rr<&`rVlq3!7:]ErrDusrrDusrrDusrrDusrrE#ts*XeF!lk9@rr3&h9ZR/4"5*YS^#&eh
+!1<cea4GnBJcC<$lMlA~>
+g]%>J!.VEV!h]O#ec5LH!dr&Xqu6\p!;uls!!I]LrrAtrrrMThrr3&?!9sF]!iH%(rr;uur;Zcs
+rr<"Gr;ZcsrVultr;ZcsrVultf)Gf$!.Tq,![7X&h#@E%ZMsk*Z2h3+s8N'!l2L\bn,NIQrr3&h
+!,)91rr<&`rVlq3!7:]ErrDusrrDusrrDusrrDusrrE#ts*XeF!lk9@rr3&h9ZR/4"5*YS^#&eh
+!1<cea4GnBJcC<$lMlA~>
+g]%>J!.VEV!h]O#ec5LH!dr&Xqu6\p!;uls!!I]LrrAtrrrMThrr3&?!9sF]!iH%(rr;uur;Zcs
+rr<"Gr;ZcsrVultr;ZcsrVultf)Gf$!.Tq,![7X&h#@E%ZMsk*Z2h3+s8N'!l2L\bn,NIQrr3&h
+!,)91rr<&`rVlq3!7:]ErrDusrrDusrrDusrrDusrrE#ts*XeF!lk9@rr3&h9ZR/4"5*YS^#&eh
+!1<cea4GnBJcC<$lMlA~>
+g]%>J!.VEV!h]O#ec5XLs8N/R!0$aR!,)',s8N1i!)1*'rrIKIqu6`V!,)<2rrDusrrDoq"RsHZ
+!!)utrrDusrrE#trrCXM!e13"RK!9=o`"t:!8uZ4!IXD9rrVZi9_n_g!;uls!;uls!<)rt!;uiu
+ciBO5s8N)ss8N)ss8N)ss8N)ss8N)urrUOIg&:pPn,NIfrrK"tr;Zcs!.<Z'rrAGd"FgD!J(N-K
+#KMcs!!#]Oa+=8As.o[F~>
+g]%>J!.VEV!h]O#ec5XLs8N/R!0$aR!,)',s8N1i!)1*'rrIKIqu6`V!,)<2rrDusrrDoq"RsHZ
+!!)utrrDusrrE#trrCXM!e13"RK!9=o`"t:!8uZ4!IXD9rrVZi9_n_g!;uls!;uls!<)rt!;uiu
+ciBO5s8N)ss8N)ss8N)ss8N)ss8N)urrUOIg&:pPn,NIfrrK"tr;Zcs!.<Z'rrAGd"FgD!J(N-K
+#KMcs!!#]Oa+=8As.o[F~>
+g]%>J!.VEV!h]O#ec5XLs8N/R!0$aR!,)',s8N1i!)1*'rrIKIqu6`V!,)<2rrDusrrDoq"RsHZ
+!!)utrrDusrrE#trrCXM!e13"RK!9=o`"t:!8uZ4!IXD9rrVZi9_n_g!;uls!;uls!<)rt!;uiu
+ciBO5s8N)ss8N)ss8N)ss8N)ss8N)urrUOIg&:pPn,NIfrrK"tr;Zcs!.<Z'rrAGd"FgD!J(N-K
+#KMcs!!#]Oa+=8As.o[F~>
+g]%>J!.VEV!h]O#ec5XLrr3%t!587/rrDcm"I];j9W.jhrrDoqrrE&urrDusrrDus#2u"EZKV>h
+rVultr;ZcsrVultf)Gf$!.UF:"$dT6^\@a0+opQWrrMA3r;QhG!7:TBrrDusrrDusrrE#trrDus
+!q60irVultr;Zcsr;Zcsr;Zcsr;Zcsrr3"f!;lfr!<2uuBD;J`s8N(drr@QI!!4Ntf@U$1fh;C)
+g&M**MuZQ)l2La2h#@A%JcC<$jo9i~>
+g]%>J!.VEV!h]O#ec5XLrr3%t!587/rrDcm"I];j9W.jhrrDoqrrE&urrDusrrDus#2u"EZKV>h
+rVultr;ZcsrVultf)Gf$!.UF:"$dT6^\@a0+opQWrrMA3r;QhG!7:TBrrDusrrDusrrE#trrDus
+!q60irVultr;Zcsr;Zcsr;Zcsr;Zcsrr3"f!;lfr!<2uuBD;J`s8N(drr@QI!!4Ntf@U$1fh;C)
+g&M**MuZQ)l2La2h#@A%JcC<$jo9i~>
+g]%>J!.VEV!h]O#ec5XLrr3%t!587/rrDcm"I];j9W.jhrrDoqrrE&urrDusrrDus#2u"EZKV>h
+rVultr;ZcsrVultf)Gf$!.UF:"$dT6^\@a0+opQWrrMA3r;QhG!7:TBrrDusrrDusrrE#trrDus
+!q60irVultr;Zcsr;Zcsr;Zcsr;Zcsrr3"f!;lfr!<2uuBD;J`s8N(drr@QI!!4Ntf@U$1fh;C)
+g&M**MuZQ)l2La2h#@A%JcC<$jo9i~>
+g]%>J!.Vod"$f\Un+Zh`TE&?Ls8N)trrQg5iVWZT!!)N^rs@Y^!!#^Ws8N'!qZ$Qqrr;uur;Zcs
+rVlr)!58C3rrE#trrDusrrE#trrCXM!e13"RK!7PrW!!7B>=<C![7X&h>[JQq#CD`qZ$Qqr;Zcs
+r;ZcsrVultqu?ZrrVultr;Zcsr;Zcsr;Zcsr;Zcsrr;uuqu?Zrrr;uuf)PaMR/[/9q>^REO5Sdm
+"4.#JVu-JrRK*?7li.!E!8[YUMu\G/JcFj3J,~>
+g]%>J!.Vod"$f\Un+Zh`TE&?Ls8N)trrQg5iVWZT!!)N^rs@Y^!!#^Ws8N'!qZ$Qqrr;uur;Zcs
+rVlr)!58C3rrE#trrDusrrE#trrCXM!e13"RK!7PrW!!7B>=<C![7X&h>[JQq#CD`qZ$Qqr;Zcs
+r;ZcsrVultqu?ZrrVultr;Zcsr;Zcsr;Zcsr;Zcsrr;uuqu?Zrrr;uuf)PaMR/[/9q>^REO5Sdm
+"4.#JVu-JrRK*?7li.!E!8[YUMu\G/JcFj3J,~>
+g]%>J!.Vod"$f\Un+Zh`TE&?Ls8N)trrQg5iVWZT!!)N^rs@Y^!!#^Ws8N'!qZ$Qqrr;uur;Zcs
+rVlr)!58C3rrE#trrDusrrE#trrCXM!e13"RK!7PrW!!7B>=<C![7X&h>[JQq#CD`qZ$Qqr;Zcs
+r;ZcsrVultqu?ZrrVultr;Zcsr;Zcsr;Zcsr;Zcsrr;uuqu?Zrrr;uuf)PaMR/[/9q>^REO5Sdm
+"4.#JVu-JrRK*?7li.!E!8[YUMu\G/JcFj3J,~>
+g]%>J!.Vod!'pM`!`5QYqYpVi!+4:VrrE#t!oX,lqu6_1!6>$;!Usb!rs7k:!0$sXB)pW^rrE+Y
+rr;uur;Zcsrr3&*!6>'<rrE#trrDusrrE#trrCXM!e13"RK!7PqZ$[4B>=EF![7X&h>[IfqYpUj
+!:]mcrrDusrrDusrrE#trrDrrrrE#trrDusrrDusrrDusrrDusrrE&urrDrrrrE&urr<&gfDkjN
+R(iW.pAb7IO5Spq"5*YS9_n\j9E5(GmJd68!!(mU!djtJJcC<$jo9i~>
+g]%>J!.Vod!'pM`!`5QYqYpVi!+4:VrrE#t!oX,lqu6_1!6>$;!Usb!rs7k:!0$sXB)pW^rrE+Y
+rr;uur;Zcsrr3&*!6>'<rrE#trrDusrrE#trrCXM!e13"RK!7PqZ$[4B>=EF![7X&h>[IfqYpUj
+!:]mcrrDusrrDusrrE#trrDrrrrE#trrDusrrDusrrDusrrDusrrE&urrDrrrrE&urr<&gfDkjN
+R(iW.pAb7IO5Spq"5*YS9_n\j9E5(GmJd68!!(mU!djtJJcC<$jo9i~>
+g]%>J!.Vod!'pM`!`5QYqYpVi!+4:VrrE#t!oX,lqu6_1!6>$;!Usb!rs7k:!0$sXB)pW^rrE+Y
+rr;uur;Zcsrr3&*!6>'<rrE#trrDusrrE#trrCXM!e13"RK!7PqZ$[4B>=EF![7X&h>[IfqYpUj
+!:]mcrrDusrrDusrrE#trrDrrrrE#trrDusrrDusrrDusrrDusrrE&urrDrrrrE&urr<&gfDkjN
+R(iW.pAb7IO5Spq"5*YS9_n\j9E5(GmJd68!!(mU!djtJJcC<$jo9i~>
+g]%>J!.Vod!'pD]!`5QYrVlql!+4:VrrDus!keT&r;Qhr!)3=j"hflprrDQfrs/#n!<<))!2obp
+!pK^3rr;uur;Zcsrr;uur;ZcsrVultr;ZcsrVultf)Gf$!.UF:!'p;Z"r1dcruqI$hZ!W'Vu$Dp
+VZ=F-s8N)ss8N)ss8N)ts8N)rrrE+YrVultr;Zcsr;Zcsr;Zcsr;Zcsrr3$n!9sF]rrE&u!bVMR
+r;QfeBA`^hpP8eN/s#bdrrYpp!4)G#"0qn,9^hu^iFi,ii;Wi:BDqm^s+143s*t~>
+g]%>J!.Vod!'pD]!`5QYrVlql!+4:VrrDus!keT&r;Qhr!)3=j"hflprrDQfrs/#n!<<))!2obp
+!pK^3rr;uur;Zcsrr;uur;ZcsrVultr;ZcsrVultf)Gf$!.UF:!'p;Z"r1dcruqI$hZ!W'Vu$Dp
+VZ=F-s8N)ss8N)ss8N)ts8N)rrrE+YrVultr;Zcsr;Zcsr;Zcsr;Zcsrr3$n!9sF]rrE&u!bVMR
+r;QfeBA`^hpP8eN/s#bdrrYpp!4)G#"0qn,9^hu^iFi,ii;Wi:BDqm^s+143s*t~>
+g]%>J!.Vod!'pD]!`5QYrVlql!+4:VrrDus!keT&r;Qhr!)3=j"hflprrDQfrs/#n!<<))!2obp
+!pK^3rr;uur;Zcsrr;uur;ZcsrVultr;ZcsrVultf)Gf$!.UF:!'p;Z"r1dcruqI$hZ!W'Vu$Dp
+VZ=F-s8N)ss8N)ss8N)ts8N)rrrE+YrVultr;Zcsr;Zcsr;Zcsr;Zcsrr3$n!9sF]rrE&u!bVMR
+r;QfeBA`^hpP8eN/s#bdrrYpp!4)G#"0qn,9^hu^iFi,ii;Wi:BDqm^s+143s*t~>
+g]%>J!.Vod!'p;Z##Lu]s.B@!ec5XLqu6_F!2oeq%I!imBA*=bcqMgdrrBA'rrE+4rr3$n!9*nV
+!PN.Es8N)ss8N)us8N'!nGWCe!<)rt!;uls!<)rt!8%5Ok7rjS!u1e9i84J7I-LM-!pK\tqu?Zr
+r;Zcsr;ZcsrVultr;QiO!6>'<rrDusrrDusrrDusrrDusrrE&u!h',&r;Zcsrr3%t!)3=j!POHK
+s8N(d5QE#$!!5EPkMlLAa8Q&=iVEKRg&:sQa8c2;!<<)s!<<'!ReZp`s82j"l"9uiZMjh$!<<)s
+!<<'!ReZr7s+146s*t~>
+g]%>J!.Vod!'p;Z##Lu]s.B@!ec5XLqu6_F!2oeq%I!imBA*=bcqMgdrrBA'rrE+4rr3$n!9*nV
+!PN.Es8N)ss8N)us8N'!nGWCe!<)rt!;uls!<)rt!8%5Ok7rjS!u1e9i84J7I-LM-!pK\tqu?Zr
+r;Zcsr;ZcsrVultr;QiO!6>'<rrDusrrDusrrDusrrDusrrE&u!h',&r;Zcsrr3%t!)3=j!POHK
+s8N(d5QE#$!!5EPkMlLAa8Q&=iVEKRg&:sQa8c2;!<<)s!<<'!ReZp`s82j"l"9uiZMjh$!<<)s
+!<<'!ReZr7s+146s*t~>
+g]%>J!.Vod!'p;Z##Lu]s.B@!ec5XLqu6_F!2oeq%I!imBA*=bcqMgdrrBA'rrE+4rr3$n!9*nV
+!PN.Es8N)ss8N)us8N'!nGWCe!<)rt!;uls!<)rt!8%5Ok7rjS!u1e9i84J7I-LM-!pK\tqu?Zr
+r;Zcsr;ZcsrVultr;QiO!6>'<rrDusrrDusrrDusrrDusrrE&u!h',&r;Zcsrr3%t!)3=j!POHK
+s8N(d5QE#$!!5EPkMlLAa8Q&=iVEKRg&:sQa8c2;!<<)s!<<'!ReZp`s82j"l"9uiZMjh$!<<)s
+!<<'!ReZr7s+146s*t~>
+g]%>J!$]<G!#>/,"&NJ-?e55Zf`2$*r;Qoa!!%E"rr2uFqZ$Vorr;uu"g\1.VZ>*Crs7:O9[Nh>
+a%Yasrr^UJ!87AO(%;2'd/X-D!.=;9d$aq7n?W)@!!(^Orr_`j!7:`F"FL4.fo4Yb!Tt2T!!=DF
+!8uc7!SNG,rrRQJa8Gu;!;uls!;uls!<)rt!!(^NrrJ'Pr;Zcsr;Zcsr;Zcsr;QhG!:^!f!oX+Z
+rr3&Y!)3@k!pK[brr3;h!!$Zbs8UG>d,+g&!1<cdJ+s!F5aUZkrrA#W!!)NarrD<_!!A2[s69I^
+s8N)`r;cfrr;cfr!9sF^"fMBh!!%uWrrD<^!<<'!l2:V\s8;qKs+143s*t~>
+g]%>J!$]<G!#>/,"&NJ-?e55Zf`2$*r;Qoa!!%E"rr2uFqZ$Vorr;uu"g\1.VZ>*Crs7:O9[Nh>
+a%Yasrr^UJ!87AO(%;2'd/X-D!.=;9d$aq7n?W)@!!(^Orr_`j!7:`F"FL4.fo4Yb!Tt2T!!=DF
+!8uc7!SNG,rrRQJa8Gu;!;uls!;uls!<)rt!!(^NrrJ'Pr;Zcsr;Zcsr;Zcsr;QhG!:^!f!oX+Z
+rr3&Y!)3@k!pK[brr3;h!!$Zbs8UG>d,+g&!1<cdJ+s!F5aUZkrrA#W!!)NarrD<_!!A2[s69I^
+s8N)`r;cfrr;cfr!9sF^"fMBh!!%uWrrD<^!<<'!l2:V\s8;qKs+143s*t~>
+g]%>J!$]<G!#>/,"&NJ-?e55Zf`2$*r;Qoa!!%E"rr2uFqZ$Vorr;uu"g\1.VZ>*Crs7:O9[Nh>
+a%Yasrr^UJ!87AO(%;2'd/X-D!.=;9d$aq7n?W)@!!(^Orr_`j!7:`F"FL4.fo4Yb!Tt2T!!=DF
+!8uc7!SNG,rrRQJa8Gu;!;uls!;uls!<)rt!!(^NrrJ'Pr;Zcsr;Zcsr;Zcsr;QhG!:^!f!oX+Z
+rr3&Y!)3@k!pK[brr3;h!!$Zbs8UG>d,+g&!1<cdJ+s!F5aUZkrrA#W!!)NarrD<_!!A2[s69I^
+s8N)`r;cfrr;cfr!9sF^"fMBh!!%uWrrD<^!<<'!l2:V\s8;qKs+143s*t~>
+g]%8_ZN(%_!+4@XqZ-Qo!6>$<#iYg`iL0`HI(fLY"p!o$B)m>4r;QucRS3]oVss]cqZ-ZrquHcs
+$)[b'I*hn^!0$1>!<<)s!<<'$l":!of`)#&!.UF:!'p;Z"sS$4ruqI$i;Wo49UbJHrr\2[!7:`F
+"4.#Jg&D!Rkl:_:rr3)b!!(CFs8N''BA*=bVbH@Rrr^UJ!7:`F"4.#Jd/EtfHiW-YN;rpk!2oks
+]uL*QB70aZVZ:Ags5BjU!,#sEs3UWC!2nZQrrAGd!.XkG!^N+8h#@@JrW)]mr;cisr;cisr;cfr
+r;ccqr;Zogs4RAO!87AOr;cisr;cfrr;_EKJcFj3J,~>
+g]%8_ZN(%_!+4@XqZ-Qo!6>$<#iYg`iL0`HI(fLY"p!o$B)m>4r;QucRS3]oVss]cqZ-ZrquHcs
+$)[b'I*hn^!0$1>!<<)s!<<'$l":!of`)#&!.UF:!'p;Z"sS$4ruqI$i;Wo49UbJHrr\2[!7:`F
+"4.#Jg&D!Rkl:_:rr3)b!!(CFs8N''BA*=bVbH@Rrr^UJ!7:`F"4.#Jd/EtfHiW-YN;rpk!2oks
+]uL*QB70aZVZ:Ags5BjU!,#sEs3UWC!2nZQrrAGd!.XkG!^N+8h#@@JrW)]mr;cisr;cisr;cfr
+r;ccqr;Zogs4RAO!87AOr;cisr;cfrr;_EKJcFj3J,~>
+g]%8_ZN(%_!+4@XqZ-Qo!6>$<#iYg`iL0`HI(fLY"p!o$B)m>4r;QucRS3]oVss]cqZ-ZrquHcs
+$)[b'I*hn^!0$1>!<<)s!<<'$l":!of`)#&!.UF:!'p;Z"sS$4ruqI$i;Wo49UbJHrr\2[!7:`F
+"4.#Jg&D!Rkl:_:rr3)b!!(CFs8N''BA*=bVbH@Rrr^UJ!7:`F"4.#Jd/EtfHiW-YN;rpk!2oks
+]uL*QB70aZVZ:Ags5BjU!,#sEs3UWC!2nZQrrAGd!.XkG!^N+8h#@@JrW)]mr;cisr;cisr;cfr
+r;ccqr;Zogs4RAO!87AOr;cisr;cfrr;_EKJcFj3J,~>
+g]%?LVolol!&"!G"]1l\TE&>Ms3L]HIfOtdrr>=]!!4?`ci*kF+opQ[rrA#V!!'_1rrD$T!!*&r
+!<<)s!<<)s!<<*!!!VV7!!&JPrVu`p!<;orrr3)bB)nk.rs>u)!1N0P!1Lstrr3;OHiQj<rrAM.
+nG`FkiL0`HI(e>8rrAGd!.XtJ!^N+8g&M!Np](0lrr;osrr;osrVufrr;Z]qs8N)grVuqerr;os
+rr;osrVufrJcC<$jo9i~>
+g]%?LVolol!&"!G"]1l\TE&>Ms3L]HIfOtdrr>=]!!4?`ci*kF+opQ[rrA#V!!'_1rrD$T!!*&r
+!<<)s!<<)s!<<*!!!VV7!!&JPrVu`p!<;orrr3)bB)nk.rs>u)!1N0P!1Lstrr3;OHiQj<rrAM.
+nG`FkiL0`HI(e>8rrAGd!.XtJ!^N+8g&M!Np](0lrr;osrr;osrVufrr;Z]qs8N)grVuqerr;os
+rr;osrVufrJcC<$jo9i~>
+g]%?LVolol!&"!G"]1l\TE&>Ms3L]HIfOtdrr>=]!!4?`ci*kF+opQ[rrA#V!!'_1rrD$T!!*&r
+!<<)s!<<)s!<<*!!!VV7!!&JPrVu`p!<;orrr3)bB)nk.rs>u)!1N0P!1Lstrr3;OHiQj<rrAM.
+nG`FkiL0`HI(e>8rrAGd!.XtJ!^N+8g&M!Np](0lrr;osrr;osrVufrr;Z]qs8N)grVuqerr;os
+rr;osrVufrJcC<$jo9i~>
+Rf<@Qq>^RnT^Vm[!h]O#JcF'r!e13"RK!7PrW!!DE6nC\![7X&\GuR/RfEBfR/[8<5aUZbs8;rl
+s8;rss8;rss8;rrs8;rqs8;rss8DuuBE%r0!<3#s!<)rr!.k0$s5j92~>
+Rf<@Qq>^RnT^Vm[!h]O#JcF'r!e13"RK!7PrW!!DE6nC\![7X&\GuR/RfEBfR/[8<5aUZbs8;rl
+s8;rss8;rss8;rrs8;rqs8;rss8DuuBE%r0!<3#s!<)rr!.k0$s5j92~>
+Rf<@Qq>^RnT^Vm[!h]O#JcF'r!e13"RK!7PrW!!DE6nC\![7X&\GuR/RfEBfR/[8<5aUZbs8;rl
+s8;rss8;rss8;rrs8;rqs8;rss8DuuBE%r0!<3#s!<)rr!.k0$s5j92~>
+Rf<@Qr;ZmqT^VdX!h]O#JcF'r!e13"RK!@S,&km&rrOAEi4/ge!1Nrf!.k17rrA#W!!)NarrD<_
+!!%uWs8;rss8;rrs8;rqs8;rss8;rss8;rss8;rrs8;qKs+143s*t~>
+Rf<@Qr;ZmqT^VdX!h]O#JcF'r!e13"RK!@S,&km&rrOAEi4/ge!1Nrf!.k17rrA#W!!)NarrD<_
+!!%uWs8;rss8;rrs8;rqs8;rss8;rss8;rss8;rrs8;qKs+143s*t~>
+Rf<@Qr;ZmqT^VdX!h]O#JcF'r!e13"RK!@S,&km&rrOAEi4/ge!1Nrf!.k17rrA#W!!)NarrD<_
+!!%uWs8;rss8;rrs8;rqs8;rss8;rss8;rss8;rrs8;qKs+143s*t~>
+Rf<LU!)T?Wq#:Dg!+1<Wci4&r!.UF:!9!ML![7X&\GuR/RfEBfJcG!7!6>'=!9*bR!87>O!6>*=
+r;cisr;cfrr;ccqr;cisr;cisr;cisr;cfrr;_EKJcFj3J,~>
+Rf<LU!)T?Wq#:Dg!+1<Wci4&r!.UF:!9!ML![7X&\GuR/RfEBfJcG!7!6>'=!9*bR!87>O!6>*=
+r;cisr;cfrr;ccqr;cisr;cisr;cisr;cfrr;_EKJcFj3J,~>
+Rf<LU!)T?Wq#:Dg!+1<Wci4&r!.UF:!9!ML![7X&\GuR/RfEBfJcG!7!6>'=!9*bR!87>O!6>*=
+r;cisr;cfrr;ccqr;cisr;cisr;cisr;cfrr;_EKJcFj3J,~>
+Rf<E'n+H\^TE&>Ms3L]HIfOtVrrOAEi4/ge!1Nrf!.k16rrYpp!4)G#"0qn,9`>"i!<3#s!<)rr
+!;ulq!<3#t!!$[2s8;rss8;rrs8;qKs+143s*t~>
+Rf<E'n+H\^TE&>Ms3L]HIfOtVrrOAEi4/ge!1Nrf!.k16rrYpp!4)G#"0qn,9`>"i!<3#s!<)rr
+!;ulq!<3#t!!$[2s8;rss8;rrs8;qKs+143s*t~>
+Rf<E'n+H\^TE&>Ms3L]HIfOtVrrOAEi4/ge!1Nrf!.k16rrYpp!4)G#"0qn,9`>"i!<3#s!<)rr
+!;ulq!<3#t!!$[2s8;rss8;rrs8;qKs+143s*t~>
+N;isP!+1<Wci4&r!.Tq,![7X&\c2cb!!(]As8N(Ms60Ib`rH*5q>UOj!!(CEs8;rss8;rrs8;rq
+s8;rss8DuuRf<?c!<3#s!<)rr!.k0$s5j92~>
+N;isP!+1<Wci4&r!.Tq,![7X&\c2cb!!(]As8N(Ms60Ib`rH*5q>UOj!!(CEs8;rss8;rrs8;rq
+s8;rss8DuuRf<?c!<3#s!<)rr!.k0$s5j92~>
+N;isP!+1<Wci4&r!.Tq,![7X&\c2cb!!(]As8N(Ms60Ib`rH*5q>UOj!!(CEs8;rss8;rrs8;rq
+s8;rss8DuuRf<?c!<3#s!<)rr!.k0$s5j92~>
+N;isP!+1<Wci4&r!.Tq,![7X&])VX-SH&ThJcFp5"/c,!Vu-JrVZ6^pr;Qb0rW!#Ys*XbFrVljk
+rW!)cd#A#)r;clt!9*nW!7:`F!,)92!oa0,r;cfr!)3@l!pS'jJcC<$kl6/~>
+N;isP!+1<Wci4&r!.Tq,![7X&])VX-SH&ThJcFp5"/c,!Vu-JrVZ6^pr;Qb0rW!#Ys*XbFrVljk
+rW!)cd#A#)r;clt!9*nW!7:`F!,)92!oa0,r;cfr!)3@l!pS'jJcC<$kl6/~>
+N;isP!+1<Wci4&r!.Tq,![7X&])VX-SH&ThJcFp5"/c,!Vu-JrVZ6^pr;Qb0rW!#Ys*XbFrVljk
+rW!)cd#A#)r;clt!9*nW!7:`F!,)92!oa0,r;cfr!)3@l!pS'jJcC<$kl6/~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMk5Ph09E:OGs8V>P!)1c:rrBb1!!%EF!!)9_rrBA&
+!!:jRs8;p$ZN$?n!0$mV!58:1!.=_F!9sL_!4)M&!82r'JcFs6J,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMk5Ph09E:OGs8V>P!)1c:rrBb1!!%EF!!)9_rrBA&
+!!:jRs8;p$ZN$?n!0$mV!58:1!.=_F!9sL_!4)M&!82r'JcFs6J,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMk5Ph09E:OGs8V>P!)1c:rrBb1!!%EF!!)9_rrBA&
+!!:jRs8;p$ZN$?n!0$mV!58:1!.=_F!9sL_!4)M&!82r'JcFs6J,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMjSoJ*N(a3O9T7$errp)0!,&50quH]q"MIJ/I+eN!
+r;ZuiRK-$equ6i59E8_'s82lqrrg#/!.<INs+145s*t~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMjSoJ*N(a3O9T7$errp)0!,&50quH]q"MIJ/I+eN!
+r;ZuiRK-$equ6i59E8_'s82lqrrg#/!.<INs+145s*t~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMjSoJ*N(a3O9T7$errp)0!,&50quH]q"MIJ/I+eN!
+r;ZuiRK-$equ6i59E8_'s82lqrrg#/!.<INs+145s*t~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WM]`7p1JcC<$aT$b~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WM]`7p1JcC<$aT$b~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WM]`7p1JcC<$aT$b~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WM]`7p1JcC<$aT$b~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WM]`7p1JcC<$aT$b~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WM]`7p1JcC<$aT$b~>
+N;isP!+3)4s*XhG"7X@"!2fbtIfOtVrrOAEi.:pSs8N(Ms1JC1!.k0$s2b4j~>
+N;isP!+3)4s*XhG"7X@"!2fbtIfOtVrrOAEi.:pSs8N(Ms1JC1!.k0$s2b4j~>
+N;isP!+3)4s*XhG"7X@"!2fbtIfOtVrrOAEi.:pSs8N(Ms1JC1!.k0$s2b4j~>
+N;isP!+3YDoDnmjs*XhG",pjm!2fbtIfOtVrrOAEi2$ATnAgstYlF_'JcEC_r;_EKJcEgkJ,~>
+N;isP!+3YDoDnmjs*XhG",pjm!2fbtIfOtVrrOAEi2$ATnAgstYlF_'JcEC_r;_EKJcEgkJ,~>
+N;isP!+3YDoDnmjs*XhG",pjm!2fbtIfOtVrrOAEi2$ATnAgstYlF_'JcEC_r;_EKJcEgkJ,~>
+N;isP!+3VC!ndPRqu6`E9E=herrDus!Up)krrRZMIuF=.+opQSs7?<Err\3m!!'8'rr@WM^&J)s
+r;Zi^JcC<$ao?k~>
+N;isP!+3VC!ndPRqu6`E9E=herrDus!Up)krrRZMIuF=.+opQSs7?<Err\3m!!'8'rr@WM^&J)s
+r;Zi^JcC<$ao?k~>
+N;isP!+3VC!ndPRqu6`E9E=herrDus!Up)krrRZMIuF=.+opQSs7?<Err\3m!!'8'rr@WM^&J)s
+r;Zi^JcC<$ao?k~>
+N;isP!+3SBrrDoq!PJL-s8N)srrLIHXoAHP!.Tq,![7X&f`)$+!!)or!oZfQfDkjNYlF_'JcEF`
+qZ)3IJcEjlJ,~>
+N;isP!+3SBrrDoq!PJL-s8N)srrLIHXoAHP!.Tq,![7X&f`)$+!!)or!oZfQfDkjNYlF_'JcEF`
+qZ)3IJcEjlJ,~>
+N;isP!+3SBrrDoq!PJL-s8N)srrLIHXoAHP!.Tq,![7X&f`)$+!!)or!oZfQfDkjNYlF_'JcEF`
+qZ)3IJcEjlJ,~>
+N;isP!+3SBrrDoq!Up*`s8N)srrJPgXoAHP!.Tq,![7X&fDkjNqYpTC!8%8N!3lM'!.k0$s+13$
+s8W+L~>
+N;isP!+3SBrrDoq!Up*`s8N)srrJPgXoAHP!.Tq,![7X&fDkjNqYpTC!8%8N!3lM'!.k0$s+13$
+s8W+L~>
+N;isP!+3SBrrDoq!Up*`s8N)srrJPgXoAHP!.Tq,![7X&fDkjNqYpTC!8%8N!3lM'!.k0$s+13$
+s8W+L~>
+N;isP!+3SBrrDKerrE#t!mgoIXoAHP!.Tq,![7X&fDkjNqYpTc!8%8N!3lM'!.k0$s+13$s8W+L~>
+N;isP!+3SBrrDKerrE#t!mgoIXoAHP!.Tq,![7X&fDkjNqYpTc!8%8N!3lM'!.k0$s+13$s8W+L~>
+N;isP!+3SBrrDKerrE#t!mgoIXoAHP!.Tq,![7X&fDkjNqYpTc!8%8N!3lM'!.k0$s+13$s8W+L~>
+N;isP!+3SBrrDfn"7X@"!;uls!<2uuN;NYUN;ih\l).2TB>+<E#k5m'!<:)P!4'TD!e13"MuNi&
+!8uK/rrC@ErrB;'rr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrDfn"7X@"!;uls!<2uuN;NYUN;ih\l).2TB>+<E#k5m'!<:)P!4'TD!e13"MuNi&
+!8uK/rrC@ErrB;'rr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrDfn"7X@"!;uls!<2uuN;NYUN;ih\l).2TB>+<E#k5m'!<:)P!4'TD!e13"MuNi&
+!8uK/rrC@ErrB;'rr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrE#t!Up*frr[X]!!)rsrrDusrrDus'$s>!s5A>*I/j4ZB)hq;l/?9&`W$!h!.Tq,
+![7X&fDkjNpAYHga-m#.iL0`HZMsk(iVWZWiW&rW!!nP`s66FT!,'"Bs8N)rrs%tj9E7banG`Fo
+nAgsts3Q,n9YL?'"mMpY!,'!rs8N(Ms+13$s+14Ms*t~>
+N;isP!+3SBrrE#t!Up*frr[X]!!)rsrrDusrrDus'$s>!s5A>*I/j4ZB)hq;l/?9&`W$!h!.Tq,
+![7X&fDkjNpAYHga-m#.iL0`HZMsk(iVWZWiW&rW!!nP`s66FT!,'"Bs8N)rrs%tj9E7banG`Fo
+nAgsts3Q,n9YL?'"mMpY!,'!rs8N(Ms+13$s+14Ms*t~>
+N;isP!+3SBrrE#t!Up*frr[X]!!)rsrrDusrrDus'$s>!s5A>*I/j4ZB)hq;l/?9&`W$!h!.Tq,
+![7X&fDkjNpAYHga-m#.iL0`HZMsk(iVWZWiW&rW!!nP`s66FT!,'"Bs8N)rrs%tj9E7banG`Fo
+nAgsts3Q,n9YL?'"mMpY!,'!rs8N(Ms+13$s+14Ms*t~>
+N;isP!+3SBrrE#t!La#cs8N)ss8N)ss8N)trrV[`a8Z)@f`2#crr;uu!78R^!e13"MuNi&!8uK/
+rrDrr!!)ut$@HId!56)Gs/,k1rr3)iHiT-'rsO4Ps8UG>d/W'P!.=_ErrDus($SE*s8UbG9\KIG
+HtNEZZI&X@RK/fTrs-nEd/W'P!.<Durr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrE#t!La#cs8N)ss8N)ss8N)trrV[`a8Z)@f`2#crr;uu!78R^!e13"MuNi&!8uK/
+rrDrr!!)ut$@HId!56)Gs/,k1rr3)iHiT-'rsO4Ps8UG>d/W'P!.=_ErrDus($SE*s8UbG9\KIG
+HtNEZZI&X@RK/fTrs-nEd/W'P!.<Durr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrE#t!La#cs8N)ss8N)ss8N)trrV[`a8Z)@f`2#crr;uu!78R^!e13"MuNi&!8uK/
+rrDrr!!)ut$@HId!56)Gs/,k1rr3)iHiT-'rsO4Ps8UG>d/W'P!.=_ErrDus($SE*s8UbG9\KIG
+HtNEZZI&X@RK/fTrs-nEd/W'P!.<Durr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBq#L<lrrDusrrDusrrE#t!N,qqs8N'!I/a0G!5SU9IfOtVrrOAEi7J#/!;uit]`@s0
+rr<&`rr3&h!,)91!pK]Dr;Qpos8VR^a8Z)@f`2#crVultr;Qe1^&@s5kl=EHrr;uu!9sI^#A4%`
+s8VR^a8Z)@f`2#cf`1sOJcC<$JcC<$s8RT~>
+N;isP!+3SBq#L<lrrDusrrDusrrE#t!N,qqs8N'!I/a0G!5SU9IfOtVrrOAEi7J#/!;uit]`@s0
+rr<&`rr3&h!,)91!pK]Dr;Qpos8VR^a8Z)@f`2#crVultr;Qe1^&@s5kl=EHrr;uu!9sI^#A4%`
+s8VR^a8Z)@f`2#cf`1sOJcC<$JcC<$s8RT~>
+N;isP!+3SBq#L<lrrDusrrDusrrE#t!N,qqs8N'!I/a0G!5SU9IfOtVrrOAEi7J#/!;uit]`@s0
+rr<&`rr3&h!,)91!pK]Dr;Qpos8VR^a8Z)@f`2#crVultr;Qe1^&@s5kl=EHrr;uu!9sI^#A4%`
+s8VR^a8Z)@f`2#cf`1sOJcC<$JcC<$s8RT~>
+N;isP!+3SBrrE#t!PJL1s8N)ss8N)ss8N)trr?^,!<3#u!5SU9IfOtVrrOAEi7J#(!;lfr!;uls
+!;uiuHiW.)rrq)Rs8Stsr;Zcs!.=bFrrE#t!lk<*r;Qhr!4)V(rrDus#1*@=s8Stsr;Zcs!.<H!
+rr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrE#t!PJL1s8N)ss8N)ss8N)trr?^,!<3#u!5SU9IfOtVrrOAEi7J#(!;lfr!;uls
+!;uiuHiW.)rrq)Rs8Stsr;Zcs!.=bFrrE#t!lk<*r;Qhr!4)V(rrDus#1*@=s8Stsr;Zcs!.<H!
+rr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrE#t!PJL1s8N)ss8N)ss8N)trr?^,!<3#u!5SU9IfOtVrrOAEi7J#(!;lfr!;uls
+!;uiuHiW.)rrq)Rs8Stsr;Zcs!.=bFrrE#t!lk<*r;Qhr!4)V(rrDus#1*@=s8Stsr;Zcs!.<H!
+rr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrDus!!)orrrDusrrDusrrE#trrDcmrrBk7!e13"MuNi&!8uK/rrDus!PJL1s8N)s
+s8N)srrUOIVuH]!Rb@`@BD;K*s8N)trrIKIqu6`V!,)<2rrDus"n2Kls8Qa,!8.>O!.k0$s+13$
+s8W+L~>
+N;isP!+3SBrrDus!!)orrrDusrrDusrrE#trrDcmrrBk7!e13"MuNi&!8uK/rrDus!PJL1s8N)s
+s8N)srrUOIVuH]!Rb@`@BD;K*s8N)trrIKIqu6`V!,)<2rrDus"n2Kls8Qa,!8.>O!.k0$s+13$
+s8W+L~>
+N;isP!+3SBrrDus!!)orrrDusrrDusrrE#trrDcmrrBk7!e13"MuNi&!8uK/rrDus!PJL1s8N)s
+s8N)srrUOIVuH]!Rb@`@BD;K*s8N)trrIKIqu6`V!,)<2rrDus"n2Kls8Qa,!8.>O!.k0$s+13$
+s8W+L~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#trr<&gp](6n_#FIc!.Tq,![7X&fDkjNqu6Wrqu?Zrr;Zcs
+qu6Zs9`G%lBE%r2!;6Bl!<)rt!;c`q!<3#u!;lfr!<<*!!7:cG!.k0$s+13$s8W+L~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#trr<&gp](6n_#FIc!.Tq,![7X&fDkjNqu6Wrqu?Zrr;Zcs
+qu6Zs9`G%lBE%r2!;6Bl!<)rt!;c`q!<3#u!;lfr!<<*!!7:cG!.k0$s+13$s8W+L~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#trr<&gp](6n_#FIc!.Tq,![7X&fDkjNqu6Wrqu?Zrr;Zcs
+qu6Zs9`G%lBE%r2!;6Bl!<)rt!;c`q!<3#u!;lfr!<<*!!7:cG!.k0$s+13$s8W+L~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#t!bVMRr;QfeBE%r2!5SU9IfOtVrrOAEi7J#/!;-<k!;uls
+!;ld"VZ>*Da0P^Err<&gpAb-mrVultqZ$Qqrr;uuqu?Zrs8W*!!:\D9rr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#t!bVMRr;QfeBE%r2!5SU9IfOtVrrOAEi7J#/!;-<k!;uls
+!;ld"VZ>*Da0P^Err<&gpAb-mrVultqZ$Qqrr;uuqu?Zrs8W*!!:\D9rr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#t!bVMRr;QfeBE%r2!5SU9IfOtVrrOAEi7J#/!;-<k!;uls
+!;ld"VZ>*Da0P^Err<&gpAb-mrVultqZ$Qqrr;uuqu?Zrs8W*!!:\D9rr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#t!iH#lr;Qf2N;ikW!5SU9IfOtVrrOAEi7J#/!;-<k!;uls
+!;ld"i;e9*BCPp#!bVMRr;QfeBDql1!<)p!B)pW^rrE+Yrr;uuqu6j#N;roj!6>$;!UsaSs8N(M
+s+13$s+14Ms*t~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#t!iH#lr;Qf2N;ikW!5SU9IfOtVrrOAEi7J#/!;-<k!;uls
+!;ld"i;e9*BCPp#!bVMRr;QfeBDql1!<)p!B)pW^rrE+Yrr;uuqu6j#N;roj!6>$;!UsaSs8N(M
+s+13$s+14Ms*t~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#t!iH#lr;Qf2N;ikW!5SU9IfOtVrrOAEi7J#/!;-<k!;uls
+!;ld"i;e9*BCPp#!bVMRr;QfeBDql1!<)p!B)pW^rrE+Yrr;uuqu6j#N;roj!6>$;!UsaSs8N(M
+s+13$s+14Ms*t~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#t$0_EiBA*=bcqMgcs8N)7rrRZMIuF=.+opQQs8N)prrM)+
+rr;uur;ZcsqYpY1!76,lrrT(u9`4nk]o;pirrE#t!jVg(r;Qi_!7:`FrrDus#MB*ts8Sts9`4nk
+]o:VDrr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#t$0_EiBA*=bcqMgcs8N)7rrRZMIuF=.+opQQs8N)prrM)+
+rr;uur;ZcsqYpY1!76,lrrT(u9`4nk]o;pirrE#t!jVg(r;Qi_!7:`FrrDus#MB*ts8Sts9`4nk
+]o:VDrr@WMJcC<$JcGcMJ,~>
+N;isP!+3SBrrD`lrrDusrrDusrrE#t$0_EiBA*=bcqMgcs8N)7rrRZMIuF=.+opQQs8N)prrM)+
+rr;uur;ZcsqYpY1!76,lrrT(u9`4nk]o;pirrE#t!jVg(r;Qi_!7:`FrrDus#MB*ts8Sts9`4nk
+]o:VDrr@WMJcC<$JcGcMJ,~>
+N;isP!+3VC"5*YSg%YLKci='mrr3)I!!(CErs*oOiRs1is3UWC!2ohr"31BAiPGNqIfOtVrrOAE
+i7J#/!;ZWq9ZR/4rrDusrrDoq"2+[7d/EtNkl:]rg&M*!9[Nb<rrDus!_`UQrVlo3BDql1!!(^N
+rrJ'Prr3;h!!$Zbs8UG>d+JBu!.k0$s+13$s8W+L~>
+N;isP!+3VC"5*YSg%YLKci='mrr3)I!!(CErs*oOiRs1is3UWC!2ohr"31BAiPGNqIfOtVrrOAE
+i7J#/!;ZWq9ZR/4rrDusrrDoq"2+[7d/EtNkl:]rg&M*!9[Nb<rrDus!_`UQrVlo3BDql1!!(^N
+rrJ'Prr3;h!!$Zbs8UG>d+JBu!.k0$s+13$s8W+L~>
+N;isP!+3VC"5*YSg%YLKci='mrr3)I!!(CErs*oOiRs1is3UWC!2ohr"31BAiPGNqIfOtVrrOAE
+i7J#/!;ZWq9ZR/4rrDusrrDoq"2+[7d/EtNkl:]rg&M*!9[Nb<rrDus!_`UQrVlo3BDql1!!(^N
+rrJ'Prr3;h!!$Zbs8UG>d+JBu!.k0$s+13$s8W+L~>
+N;isP!+3YDqZ-HlqZ$WrqZ-Wq"6jFuVu?W!iL0`HI(fOZqZ+M5!e13"MuNi&!8uN0"5*YSl2:P_
+fk1<arr^UJ!87AO"7Q9jd/3hEn,NIcrrCFC!!&qqrr^UJ!7:]E#h_mFd/X-d9^2NUrr<79g&M)M
+9^2NU!7:TC!2nHKrr@WMJcC<$JcGcMJ,~>
+N;isP!+3YDqZ-HlqZ$WrqZ-Wq"6jFuVu?W!iL0`HI(fOZqZ+M5!e13"MuNi&!8uN0"5*YSl2:P_
+fk1<arr^UJ!87AO"7Q9jd/3hEn,NIcrrCFC!!&qqrr^UJ!7:]E#h_mFd/X-d9^2NUrr<79g&M)M
+9^2NU!7:TC!2nHKrr@WMJcC<$JcGcMJ,~>
+N;isP!+3YDqZ-HlqZ$WrqZ-Wq"6jFuVu?W!iL0`HI(fOZqZ+M5!e13"MuNi&!8uN0"5*YSl2:P_
+fk1<arr^UJ!87AO"7Q9jd/3hEn,NIcrrCFC!!&qqrr^UJ!7:]E#h_mFd/X-d9^2NUrr<79g&M)M
+9^2NU!7:TC!2nHKrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&g&L^F!h0/hqZ-ZrquHWo!Lfq_rrqAM!!%D[rVu`prVm)dRS3]o
+VssWarr<5eHiO/8l21JaiL0`HI(e,2rr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&g&L^F!h0/hqZ-ZrquHWo!Lfq_rrqAM!!%D[rVu`prVm)dRS3]o
+VssWarr<5eHiO/8l21JaiL0`HI(e,2rr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&g&L^F!h0/hqZ-ZrquHWo!Lfq_rrqAM!!%D[rVu`prVm)dRS3]o
+VssWarr<5eHiO/8l21JaiL0`HI(e,2rr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&NrT+Z`;fi;JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&O8f=8!!(]ks8N(Ms+13$s+14Ms*t~>
+N;isP!+1<Wci4&r!.Tq,![7X&O8f=8!!(]ks8N(Ms+13$s+14Ms*t~>
+N;isP!+1<Wci4&r!.Tq,![7X&O8f=8!!(]ks8N(Ms+13$s+14Ms*t~>
+N;isP!+1<Wci4&r!.Tq,![7X&OT51X`rH&=JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&OT51X`rH&=JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&OT51X`rH&=JcC<$JcC<$s8RT~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!+1<Wci4&r!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!(_[UcbBNg!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!(_[UcbBNg!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;isP!(_[UcbBNg!.Tq,![7X&JcF'rrr@WMJcC<$JcGcMJ,~>
+N;imNJH3jn!.Tq,![7V(JO%OHrr@WMJcC<$JcGcMJ,~>
+N;imNJH3jn!.Tq,![7V(JO%OHrr@WMJcC<$JcGcMJ,~>
+N;imNJH3jn!.Tq,![7V(JO%OHrr@WMJcC<$JcGcMJ,~>
+N;imeJO%CD!2,8M!$Zsob5d+nJcC<$JcGcMJ,~>
+N;imeJO%CD!2,8M!$Zsob5d+nJcC<$JcGcMJ,~>
+N;imeJO%CD!2,8M!$Zsob5d+nJcC<$JcGcMJ,~>
+JcC<$JcFU,!69Z*bJ/W.JcC<$JcGcMJ,~>
+JcC<$JcFU,!69Z*bJ/W.JcC<$JcGcMJ,~>
+JcC<$JcFU,!69Z*bJ/W.JcC<$JcGcMJ,~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+JcC<$JcC<$JcC<$JcC<$V>l&~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/nymanimpl.mss b/docsrc/nyquist/nymanimpl.mss
new file mode 100644
index 0000000..28a9533
--- /dev/null
+++ b/docsrc/nyquist/nymanimpl.mss
@@ -0,0 +1,467 @@
+@part(Implementation,root "nyquistman2.mss")
+@appendix(Extending Nyquist)
+@label(extending-app)
+@p(WARNING:)
+Nyquist sound functions look almost like a human wrote them; they even have
+a fair number of comments for human readers. Don't be fooled: virtually all
+Nyquist functions are written by a special translator. If you try to write
+a new function by hand, you will probably not succeed, and even if you do,
+you will waste a great deal of time. (End of Warning.)
+
+
+@section(Translating Descriptions to C Code)
+
+The translator code used to extend Nyquist resides in the @code(trnsrc)
+directory. This directory also contains a special @code(init.lsp), so if
+you start XLisp or Nyquist in this directory, it will automatically read
+@code(init.lsp), which in turn will load the translator code (which resides
+in several files).
+
+Also in the @code(trnsrc) directory are a number of @code(.alg) files, which
+contain the source code for the translator (more on these will follow), and
+a number of corresponding @code(.h) and @code(.c) files.
+
+To translate a @code(.alg) file to @code(.c) and @code(.h) files, you start
+XLisp or Nyquist in the @code(trnsrc) directory and type
+@begin(example)
+(translate "prod")
+@end(example)
+where @code("prod") should really be replaced by the filename (without a
+suffix) you want to translate. Be sure you have a saved, working copy of
+Nyquist or Xlisp before you recompile!
+
+@p(Note:) On the Macintosh, just run Nyquist out of the @code(runtime) directory and then use the @code(Load) menu command to load @code(init.lsp) from the @code(trnsrc) directory. This will load the translation code and change Nyquist's current directory to @code(trnsrc) so that commands like @code[(translate "prod")] will work.
+
+@section(Rebuilding Nyquist)
+
+After generating @code(prod.c) and
+@code(prod.h), you need to recompile Nyquist. For Unix systems, you will
+want to generate a new Makefile. Modify @code(transfiles.lsp) in your main
+Nyquist directory, run Xlisp or Nyquist and load @code(makefile.lsp).
+Follow the instructions to set your machine type, etc., and
+execute @code[(makesrc)] and @code[(makefile)].
+
+@begin(comment)
+@subsection(Special Macintosh Instructions)
+
+For the Code Warrior/Macintosh implementation, you will need to generate new Lisp-to-C interface files and then modify your project file. To generate Lisp-to-C interface files, first modify the file @code(:nyqsrc:sndfn.cl) to include your newly generated @code(.h) file. If you are not familiar with naming Macintosh folders, this file may look a bit odd. The initial colon in a file name means to start in the current folder. After that, colons separate folder and file names. For example,
+@begin(example)
+:tran:osc.h
+@end(example)
+means to start from the current directory, go to the @code(tran) directory, and there find the @code(osc.h) file.
+
+After modifying @code(sndfn.cl), run the @code(intgen) program, which must be in the top-level Nyquist directory (the parent directory to @code(nyqsrc) and @code(tran). (If you build the @code(intgen) program in @code(misc), copy it to the parent directory.) After starting @code(intgen), to the command line, type:
+@begin(example)
+@@:nyqsrc:sndfn.cl
+@end(example)
+which tells @code(intgen) to use the contents of the @code(sndfn.cl) file as a command line. Read about @code(intgen) in Appendix @ref(intgen-app).
+
+Next, add the @code(.c) file generated by @code(translate) (e.g. @code(prod.c)) to your Nyquist project and recompile Nyquist.
+@end(comment)
+
+@section(Accessing the New Function)
+
+The new Lisp function will generally be named with a @code(snd-) prefix,
+e.g. @code(snd-prod). You can test this by running Nyquist. Debugging is
+usually a combination of calling the code from within the interpreter,
+reading the generated code when things go wrong, and using a C debugger to
+step through the inner loop of the generated code. An approach I like is to
+set the default sample rate to 10 hertz. Then, a one-second sound has only
+10 samples, which are easy to print and study on a text console.
+
+For some functions,
+you must write some Lisp code to impose
+ordinary Nyquist behaviors such as stretching and time shifting. A
+good approach is to find some structurally similar functions and see how
+they are implemented. Most of the Lisp code for Nyquist is in
+@code(nyquist.lsp).
+
+Finally, do not forget to write up some documentation. Also, contributions are
+welcome. Send your @code(.alg) file, documentation, Lisp support
+functions for @code(nyquist.lsp), and examples or test programs
+to @code(rbd@@cs.cmu.edu). I will either put them in the next release or
+make them available at a public ftp site.
+
+
+@section(Why Translation?)
+Many of the Nyquist signal processing operations are similar in form, but
+they differ in details. This code is complicated by many factors: Nyquist
+uses lazy evaluation, so the operator must check to see that input samples
+are available before trying to access them. Nyquist signals can have
+different sample rates, different block sizes, different block boundaries,
+and different start times, all of which must be taken into account. The
+number of software tests is enormous. (This may sound like a lot of
+overhead, but the overhead is amortized over many iterations of the inner
+loop. Of course setting up the inner loop to run efficiently is one more
+programming task.)
+
+The main idea behind the translation is that all of the checks and setup
+code are similar and relatively easy to generate automatically. Programmers
+often use macros for this sort of task, but the C macro processor is too
+limited for the complex translation required here. To tell the translator
+how to generate code, you write @code(.alg) files, which provide many
+details about the operation in a declarative style. For example, the code
+generator can make some optimizations if you declare that two input signals
+are commutative (they can be exchanged with one another). The main part of
+the @code(.alg) file is the inner loop which is the heart of the signal
+processing code.
+
+@section(Writing a .alg File)
+@p(WARNING:) Translation relies heavily on string substitution, which
+is fragile. In particular, variables with names that are substrings of
+other variables will cause problems. For example if you declare STATE
+variables "phase" and "iphase", then the translator will globally
+substitute "phase_reg" for "phase", converting "phase" to "phase_reg"
+and iphase" to "iphase_reg". Then it will substitute "iphase_reg" for
+iphase" which will convert the existing "iphase_reg" to
+"iphase_reg_reg". This will be confusing and will not compile.
+(End of WARNING)
+
+To give you some idea how functions are specified, here is the
+specification for @code(snd-prod), which generates over 250 lines of C code:
+@begin(example)
+(PROD-ALG
+ (NAME "prod")
+ (ARGUMENTS ("sound_type" "s1") ("sound_type" "s2"))
+ (START (MAX s1 s2))
+ (COMMUTATIVE (s1 s2))
+ (INNER-LOOP "output = s1 * s2")
+ (LINEAR s1 s2)
+ (TERMINATE (MIN s1 s2))
+ (LOGICAL-STOP (MIN s1 s2))
+)
+@end(example)
+A @code(.alg) file is always of the form:
+@begin(example)
+(@i(name)
+ (@i(attribute) @i(value))
+ (@i(attribute) @i(value))
+ ...
+)
+@end(example)
+There should be just one of these algorithms descriptions per file.
+The @i(name) field is arbitrary: it is a Lisp symbol whose property list is
+used to save the following attribute/value pairs. There are many
+attributes described below. For more examples, see the @code(.alg) files in
+the @code(trnsrc) directory.
+
+Understanding what the attributes do is not
+easy, so here are three recommendations for implementors. First, if there is
+an existing Nyquist operator that is structurally similar to something you
+want to implement, make a copy of the corresponding @code(.alg) file and
+work from there. In some cases, you can merely rename the parameters and
+substitute a new inner loop. Second, read the generated code, especially
+the generated inner loop. It may not all make sense, but sometimes you can
+spot obvious errors and work your way back to the error in the @code(.alg)
+file. Third, if you know where something bad is generated, see if you can
+find where the code is generated. (The code generator files are listed in
+@code(init.lsp).) This code is poorly written and poorly documented, but in
+some cases it is fairly straightforward to determine what attribute in the
+@code(.alg) file is responsible for the erroneous output.
+
+@section(Attributes)
+Here are the attributes used for code generation. Attributes and values may
+be specified in any order.
+@begin(description)
+@code[(NAME "@i(string)")]@\specifies a base name for many identifiers. In
+particular, the generated filenames will be @i(string)@code(.c) and
+@i(string)@code(.h), and the XLisp function generated will be
+@code(snd-)@i(string).
+
+@code[(ARGUMENTS @i(arglist))]@\describes the arguments to be passed from
+XLisp. @i(Arglist) has the form: @code[(@i(type1) @i(name1)) (@i(type2)
+@i(name2)) ...], where @i(type) and @i(name) are strings in double quotes,
+e.g. ("sound_type" "s") specifies a SOUND parameter named @code(s). Note that @i(arglist) is not surrounded by parentheses. As seen
+in this example, the type names and parameter names are C identifiers. Since
+the parameters are passed in from XLisp, they must be chosen from a
+restricted set. Valid type names are: @code("sound_type"), @code("rate_type"), @code("double"),
+@code("long"), @code("string"), and @code("LVAL").
+
+
+@code[(STATE @i(statelist))]@\describes additional state (variables) needed
+to perform the computation. A @i(statelist) is similar to an @i(arglist)
+(see @code(ARGUMENTS) above), and has the form: @code{(@i(type1) @i(name1)
+@i(init1) [TEMP]) (@i(type2) @i(name2) @i(init2) [TEMP]) ...}.
+The types and names are as
+in @i(arglist), and the "inits" are double-quoted initial values. Initial
+values may be any C expression. State is initialized in the order implied by
+@i(statelist) when the operation is first called from XLisp. If @code(TEMP)
+is omitted the state is preserved in a structure until the sound computation
+completes. Otherwise, the state variable only exists at state
+initialization time.
+
+@code[(INNER-LOOP @i(innerloop-code))]@\describes the inner loop, written as
+C code. The @i(innerloop-code) is in double quotes, and may extend over
+multiple lines. To make generated code extra-beautiful, prefix each line of
+@i(innerloop-code) with 12 spaces. Temporary variables should not
+be declared at the beginning of @i(innerloop-code). Use the
+@code(INNER-LOOP-LOCALS) attribute instead. Within @i(innerloop-code),
+@i(each ARGUMENT of type sound_type) @p(must) @i(be referenced exactly one
+time.) If you need to use a signal value twice, assign it once to a
+temporary and use the temporary twice. The inner loop must also assign
+@i(one) time to the psuedo-variable @i(output). The model here is that the
+name of a sound argument denotes the value of the corresponding signal at
+the current output sample time. The inner loop code will be called once for
+each output sample. In practice, the code generator will substitute some
+expression for each signal name. For example,
+@code(prod.alg) specifies
+@display[@code[(INNER-LOOP "output = s1 * s2")]]
+(@code(s1) and @code(s2) are @code(ARGUMENTS).) This expands to the
+following inner loop in @code(prod.c):
+@display[@code[*out_ptr_reg++ = *s1_ptr_reg++ * *s2_ptr_reg++;]]
+In cases where arguments have different sample rates, sample interpolation
+is in-lined, and the expressions can get very complex. The translator is
+currently very simple-minded about substituting access code in the place of
+parameter names, and @i(this is a frequent source of bugs.) Simple string
+substitution is performed, so @i(you must not use a parameter or state name
+that is a substring of another). For example, if two sound parameters were
+named @code(s) and @code(s2), the translator might substitute for ``s'' in two
+places rather than one. If this problem occurs, you will almost certainly
+get a C compiler syntax error. The fix is to use ``more unique'' parameter
+and state variable names.
+
+@code[(INNER-LOOP-LOCALS "@i(innerloop-code)")]@\The @i(innerloop-code)
+contains C declarations of local variables set and referenced in the inner
+loop.
+
+@code[(SAMPLE-RATE "@i(expr)")]@\specifies the output sample rate; @i(expr)
+can be any C expression, including a parameter from the @code(ARGUMENTS)
+list. You can also write @code[(SAMPLE-RATE (MAX @i(name1) @i(name2) ...))]
+where names are unquoted names of arguments.
+
+@code[(SUPPORT-HEADER "@i(c-code)")]@\specifies arbitrary C code to be
+inserted in the generated @code(.h) file. The code typically contains
+auxiliarly function declarations and definitions of constants.
+
+@code[(SUPPORT-FUNCTIONS "@i(c-code)")]@\specifies arbitrary C code to be
+inserted in the generated @code(.c) file. The code typically contains
+auxiliarly functions and definitions of constants.
+
+@code[(FINALIZATION "@i(c-code)")]@\specifies code to execute when the sound
+has been fully computed and the state variables are about to be
+decallocated. This is the place to deallocate buffer memory, etc.
+
+@code[(CONSTANT "@i(name1)" "@i(name2)" ...)]@\specifies state variables that
+do not change value in the inner loop. The values of state
+variables are loaded into registers before entering the inner loop so that
+access will be fast within the loop. On exiting the inner loop, the final
+register values are preserved in a ``suspension'' structure. If state
+values do not change in the inner loop, this @code(CONSTANT) declaration can
+eliminate the overhead of storing these registers.
+
+@code[(START @i(spec))]@\specifies when the output sound should start (a
+sound is zero and no processing is done before the start time). The @i(spec)
+can take several forms: @code[(MIN @i(name1) @i(name2) ...)] means the start
+time is the minimum of the start times of input signals @i(name1),
+@i(name2), .... Note that these names are not quoted.
+
+@code[(TERMINATE @i(spec))]@\specifies when the output
+sound terminates (a sound is
+zero after this termination time and no more samples are computed). The
+@i(spec) can take several forms: @code[(MIN @i(name1) @i(name2) ...)] means
+the terminate time is the minimum of the terminate times of input arguments
+@i(name1), @i(name2), .... Note that these names are not quoted. To
+terminate at the time of a single argument @code(s1), specify @code[(MIN
+s1)]. To terminate after a specific duration, use @code[(AFTER "@i(c-expr)")],
+where @i(c-expr) is a C variable or expression. To terminate at a
+particular time, use @code[(AT "@i(c-expr)")]. @i(spec) may also be
+@code(COMPUTED), which means to use the maximum sample rate of any input
+signal.
+
+@code[(LOGICAL-STOP @i(spec))]@\specifies the logical stop time of the output
+sound. This @i(spec) is just like the one for @code(TERMINATE). If no
+@code(LOGICAL-STOP) attribute is present, the logical stop will coincide
+with the terminate time.
+
+@code[(ALWAYS-SCALE @i(name1) @i(name2) ...)]@\says that the named sound
+arguments (not in quotes) should always be multiplied by a scale factor.
+This is a space-time tradeoff. When Nyquist sounds are scaled, the scale
+factor is merely stored in a structure. It is the responsibility of
+the user of the samples to actually scale them (unless the scale factor is
+exactly 1.0). The default is to generate code with and without scaling and
+to select the appropriate code at run time. If there are N signal inputs,
+this will generate 2@+(N) versions of the code. To avoid this code
+explosion, use the @code(ALWAYS-SCALE) attribute.
+
+@code[(INLINE-INTERPOLATION T)]@\specifies that sample rate interpolation
+should be performed in-line in the inner loop. There are two forms of sample
+rate interpolation. One is intended for use when the rate change is large
+and many points will be interpolated. This form uses a divide instruction
+and some setup at the low sample rate,
+but the inner loop overhead is just an add. The
+other form, intended for less drastic sample rate changes, performs
+interpolation with 2 multiplies and several adds per sample at the high
+sample rate. Nyquist generates various inner loops and selects the
+appropriate one at run-time. If @code(INLINE-INTERPOLATION) is not set,
+then much less code is generated and interpolation is performed as necessary
+by instantiating a separate signal processing operation.
+
+@code[(STEP-FUNCTION @i(name1) @i(name2) ...)]@\Normally all argument
+signals are
+linearly interpolated to the output sample rate. The linear interpolation
+can be turned off with this attribute. This is used, for example, in Nyquist
+variable filters so that filter coefficients are computed at low sample
+rates. In fact, this attribute was added for the special case of filters.
+
+@code[(DEPENDS @i(spec1) @i(spec2) ...)]@\Specifies dependencies. This
+attribute was also introduced to handle the case of filter coefficients (but
+may have other applications.) Use it when a state variable is a function of
+a potentially low-sample-rate input where the input is in the
+@code(STEP-FUNCTION) list. Consider a filter coefficient that depends upon
+an input signal such as bandwidth. In this case, you want to compute the
+filter coefficient only when the input signal changes rather than every
+output sample, since output may occur at a much higher sample rate. A
+@i(spec) is of the form
+@display{@code{("@i(name)" "@i(arg)" "@i(expr)" [TEMP @i("type")])}}
+which is interpreted as follows: @I(name) depends upon @i(arg); when @i(arg)
+changes, recompute @i(expr) and assign it to @i(name). The @i(name) must be
+declared as a @code(STATE) variable unless @code(TEMP) is present, in which
+case @i(name) is not preserved and is used only to compute other state.
+Variables are updated in the order of the @code(DEPENDS) list.
+
+@code[(FORCE-INTO-REGISTER @i(name1) @i(name2) ...)]@\causes @i(name1),
+@i(name2), ... to be loaded into registers before entering the inner loop.
+If the inner loop references a state variable or argument, this happens
+automatically. Use this attribute only if references are ``hidden'' in a
+@code(#define)'d macro or referenced in a @code(DEPENDS) specification.
+
+@code[(NOT-REGISTER @i(name1) @i(name2) ...)]@\specifies state and arguments
+that should not be loaded into registers before entering an inner loop.
+This is sometimes an optimization for infrequently accessed state.
+
+@code[(NOT-IN-INNER-LOOP "@i(name1)" "@i(name2)" ...)]@\says that certain
+arguments are not used in the inner loop. Nyquist assumes all arguments
+are used in the inner loop, so specify them here if not. For example,
+tables are passed into functions as sounds, but these sounds are not read
+sample-by-sample in the inner loop, so they should be listed here.
+
+@code[(MAINTAIN ("@i(name1)" "@i(expr1)") ("@i(name2)" "@i(expr2)") ...
+)]@\Sometimes the IBM XLC compiler generates better loop code if a variable
+referenced in the loop is not referenced outside of the loop after the loop
+exit. Technically, optimization is better when variables are dead upon loop
+exit. Sometimes, there is an efficient way to compute the final value of a
+state variable without actually referencing it, in which case the variable
+and the computation method are given as a pair in the @code(MAINTAIN)
+attribute. This suppresses a store of the value of the named variable,
+making it a dead variable. Where the store would have been, the expression
+is computed and assigned to the named variable. See @code(partial.alg) for
+an example. This optimization is never necessary and is only for
+fine-tuning.
+
+@code[(LINEAR @i(name1) @i(name2) ...)]@\specifies that named arguments
+(without quotes) are linear with respect to the output. What this
+@i(really) means is that it is numerically OK to eliminate a scale factor from
+the named argument and store it in the output sound descriptor, avoiding a
+potential multiply in this inner loop. For example, both arguments to
+@code(snd-prod) (signal multiplication) are ``linear.'' The inner loop has
+a single multiplication operator to multiply samples vs. a potential 3
+multiplies if each sample were also scaled. To handle scale factors on the
+input signals, the scale factors are automatically multiplied and the
+product becomes the scale factor of the resulting output. (This effectively
+``passes the buck'' to some other, or perhaps more than one, signal
+processing function, which is not always optimal. On the other hand, it
+works great if you multiply a number of scaled signals together: all the
+scale factors are ultimately handled with a single multiply.)
+
+@code[(INTERNAL-SCALING @i(name1) @i(name2) ...)]@\indicates that scaling is
+handled in code that is hidden from the code generator for @i(name1),
+@i(name2), ..., which are sound arguments. Although it is the responsibility
+of the reader of samples to apply any given scale factor, sometimes scaling
+can be had for free. For example, the @code(snd-recip) operation computes
+the reciprocal of the input samples by peforming a division. The simple
+approach would be to specify an inner loop of @code[output = 1.0/s1], where
+@code(s1) is the input. With scaling, this would generate an inner loop
+something like this:
+@display(@code[*output++ = 1.0 / (s1_scale_factor * *s1++);])
+but a much better approach would be the following:
+@display(@code[*output++ = my_scale_factor / *s1++])
+where @code(my_scale_factor) is initialized to @code(1.0 / s1->scale).
+Working backward from the desired inner loop to the @code(.alg) inner loop
+specification, a first attempt might be to specify:
+@display(@code[(INNER-LOOP "output = my_scale_factor / s1")])
+but this will generate the following:
+@display(@code[*output++=my_scale_factor/(s1_scale_factor * *s1++);])
+Since the code generator does not know that scaling is handled elsewhere,
+the scaling is done twice! The solution is to put @code(s1) in the
+@code(INTERNAL-SCALING) list, which essentially means ``I've already
+incorporated scaling into the algorithm, so suppress the multiplication by a
+scale factor.''
+
+@code[(COMMUTATIVE (@i(name1) @i(name2) ...))]@\specifies that the results
+will not be affected by interchanging any of the listed arguments. When
+arguments are commutative, Nyquist rearranges them at run-time into
+decreasing order of sample rates. If interpolation is in-line, this can
+dramatically reduce the amount of code generated to handle all the different
+cases. The prime example is @code(prod.alg).
+
+@code[(TYPE-CHECK "@i(code)")]@\specifies checking code to be inserted after
+argument type checking at initialization time. See @code(downproto.alg) for
+an example where a check is made to guarantee that the output sample rate is
+not greater than the input sample rate. Otherwise an error is raised.
+
+@end(description)
+
+@section(Generated Names)
+The resulting @code(.c) file defines a number of procedures. The procedures
+that do actual sample computation are named something like
+@i(name)@c(_)@i(interp-spec)@c(_fetch), where @i(name) is the @c(NAME)
+attribute from the @code(.alg) file, and @i(interp-spec) is an interpolation
+specification composed of a string of the following letters: n, s, i, and r.
+One letter corresponds to each sound argument, indicating no interpolation
+(r), scaling only (s), ordinary linear interpolation with scaling (i), and
+ramp (incremental) interpolation with scaling (r). The code generator
+determines all the combinations of n, s, i, and r that are necessary and
+generates a separate fetch function for each.
+
+Another function is @i(name)@code(_toss_fetch), which is called when sounds
+are not time-aligned and some initial samples must be discarded from one or
+more inputs.
+
+The function that creates a sound is @code(snd_make_)@i(name). This is
+where state allocation and initialization takes place. The proper fetch
+function is selected based on the sample rates and scale factors of the
+sound arguments, and a @code(sound_type) is returned.
+
+Since Nyquist is a functional language, sound operations are not normally allowed to
+modify their arguments through side effects, but even reading samples from a
+@code(sound_type) causes side effects. To hide these from the Nyquist
+programmer, @code(sound_type) arguments are first copied (this only copies a small structure. The samples themselves are on a shared list). The function
+@code(snd_)@i(name) performs the necessary copies and calls
+@code(snd_make_)@i(name). It is the @code(snd_)@i(name) function that is
+called by XLisp. The XLisp name for the function is @code(SND-)@i(NAME).
+Notice that the underscore in C is converted to a dash in XLisp. Also,
+XLisp converts identifiers to upper case when they are read, so normally,
+you would type @code(snd)-@i(name) to call the function.
+
+@section(Scalar Arguments)
+If you want the option of passing either a number (scalar) or a signal as
+one of the arguments, you have two choices, neither of which is automated.
+Choice 1 is to coerce the constant into a signal from within XLisp. The
+naming convention would be to @code(DEFUN) a new function named
+@i(NAME) or @code(S-)@i(NAME) for ordinary use. The @i(NAME) function tests
+the arguments using XLisp functions such as @code(TYPE-OF), @code(NUMBERP),
+and @code(SOUNDP). Any number is converted to a @code(SOUND), e.g. using
+@code(CONST). Then @code(SND-)@i(NAME) is called with all sound arguments.
+The disadvantage of this scheme is that scalars are expanded into a sample
+stream, which is slower than having a special inner loop where the scalar
+is simply kept in a register, avoiding loads, stores, and addressing
+overhead.
+
+Choice 2 is to generate a different sound operator for each case. The
+naming convention here is to append a string of c's and v's, indicating
+constant (scalar) or variable (signal) inputs. For example, the
+@code(reson) operator comes in four variations: @code(reson),
+@code(resoncv), @code(resonvc), and @code(resonvv). The @code(resonvc)
+version implements a resonating filter with a variable center frequency (a
+sound type) and a constant bandwidth (a @code(FLONUM)). The @code(RESON)
+function in Nyquist is an ordinary Lisp function that checks types and calls
+one of @code(SND-RESON), @code(SND-RESONCV), @code(SND-RESONVC), or
+@code(SND-RESONVV).
+
+Since each of these @code(SND-) functions performs further selection of
+implementation based on sample rates and the need for scaling, there are 25
+different functions for computing RESON! So far, however, Nyquist is
+smaller than Common Lisp and it's about half the size of Microsoft Word.
+Hopefully, exponential growth in memory density will outpace linear (as a
+function of programming effort) growth of Nyquist.
+
diff --git a/docsrc/nyquist/nyquistman-sal-only.mss b/docsrc/nyquist/nyquistman-sal-only.mss
new file mode 100644
index 0000000..de31218
--- /dev/null
+++ b/docsrc/nyquist/nyquistman-sal-only.mss
@@ -0,0 +1,8113 @@
+@device(mac52postscript)
+@make(manual)
+@libraryfile(mathematics10)
+@libraryfile(picture)
+@libraryfile(multilevelindex)
+@style(font timesroman)
+@style(fontscale 11)
+@commandstring(dash @Y[M])
+@commandstring(subtract @Y[N])
+@commandstring(itemsep @Y[M])
+@Modify(indexenv, above=2 lines, leftmargin 8, columns=3, boxed)
+@define(prg=i)
+@define(detail=text, size 9, spacing 1.2, indent 0)
+@define(code, FaceCode T, size 11)
+@comment{codef is used to define a lisp function or variable --
+ a processor uses this to extract completion hint info for jNyqIDE.}
+@define(codef, FaceCode T, size 11)
+@comment{pragma(define) is used to mark a term's point of definition --
+ I tried to define(defn=index), but that didn't work in Scribe,
+ so the approach now is to mark definitions. In s2h, the
+ define pragma sets a flag that the NEXT index term is a definition.
+ The s2h.lsp processor uses this to map terms defined within codef
+ (which go into the completion list) to URLs for the help system.}
+@define(smallcode, FaceCode T, size 8, spacing 0.8) @comment(was 10)
+@define(rbdisplay = display, group)
+@define(fndefs = description, leftmargin 0.5in, indent -0.5in)
+@define(fdescription = text, leftmargin +0.5in, indent -0.5in, spread 1)
+@define(pdescription = text, leftmargin +0.5in, indent -0.5in, spread 0)
+@define(fgroup = text, indent -0.5in, spread 0)
+@textform(html = [])
+@textform(htmltitle = [])
+@textform(pragma = [])
+@use(bibliography = "../bib/music.bib")
+@style(references ClosedAlphabetic)
+@counter(dummy-counter)
+@modify(FigureCounter,Within=dummy-counter,
+ Numbered <@@b[Figure@@ @1:@@ @@ ]@@$>,
+ Referenced "@1",Init 0)
+@modify(TableCounter,Within=dummy-counter,
+ Numbered <@@b[Table@@ @1:@@ @@ ]@@$>,
+ Referenced "@1",Init 0)
+@pageheading(left "", center "@value(page)", right "")
+@include(../template/filcap.mss)
+
+@begin(comment)
+@begin(figure)
+@blankspace(0.3 inches) @comment(scribe doesn't leave enough space)
+@center(@graphic((height = *** in, width = *** in, magnify = ***,
+ postscript = "***.ps"))
+@fillcaption(***)
+@tag(***)
+@end(figure)
+@end(comment)
+
+@html(<head><title>Nyquist Reference Manual</title></head><body>)
+@htmltitle(Nyquist Reference Manual)
+@begin(titlepage)
+@begin(titlebox)
+@blankspace(0.5 inch)
+@majorheading(Nyquist Reference Manual)
+@b(Version 3.04)
+@blankspace(0.3 inch)
+@b(Copyright 2011 by Roger B. Dannenberg)
+@value(date)
+@end(titlebox)
+@pragma(startscribe)
+@center(Carnegie Mellon University)
+@center(School of Computer Science)
+@center(Pittsburgh, PA 15213, U.S.A.)
+@pragma(endscribe)
+@html(<blockquote>Carnegie Mellon University<br>
+School of Computer Science<br>
+Pittsburgh, PA 15213, U.S.A.</blockquote>)
+@blankspace(1 inch)
+@end(titlepage)
+@pragma(startscribe)
+.
+@pragma(endscribe)
+@newpage
+@pageheading(even, left "Page @Value(Page)", right "@c(Nyquist Manual)")
+@pageheading(odd, left "@c[@title(chapter)]", right "Page @Value(page)")
+@style(pagenumbers="@i")
+@set(page=3)
+@Unnumbered(Preface)
+This manual is a guide for users of Nyquist, a language for composition and
+sound synthesis. Nyquist grew out of a series of research projects, notably
+the languages Arctic and Canon. Along with Nyquist, these languages promote a
+functional style of programming and incorporate time into the language
+semantics.
+
+Please help by noting any errors@Index(errors), omissions@Index(omissions),
+or suggestions@Index(suggestions) you may have. You can send your
+suggestions to Dannenberg@@CS.CMU.EDU (internet) via computer mail, or by
+campus mail to Roger B. Dannenberg, School of Computer Science, or by
+ordinary mail to Roger B. Dannenberg, School of Computer Science, Carnegie
+Mellon University, 5000 Forbes Ave., Pittsburgh, PA 15213-3890, USA.
+
+Nyquist is a successor to Fugue, a language originally implemented by Chris
+Fraley, and extended by George Polly and Roger Dannenberg. Peter Velikonja
+and Dean Rubine were early users, and they proved the value as well as
+discovered some early problems of the system. This led to Nyquist, a
+reimplementation of Fugue by Roger Dannenberg with help from Joe Newcomer
+and Cliff Mercer. Ning Hu ported Zheng (Geoffrey) Hua and Jim Beauchamp's
+piano synthesizer to Nyquist and also built NyqIDE, the Nyquist Integrated
+Development Environment for Windows. Dave Mowatt contributed the original
+version of jNyqIDE, the cross-platform interactive development environment.
+Dominic Mazzoni made a special version of Nyquist that runs
+within the Audacity audio editor, giving Nyquist a new interface and
+introducing Nyquist to many new users.
+
+Many others have since contributed to Nyquist.
+Chris Tchou and Morgan Green worked on the Windows port. Eli Brandt contributed
+a number of filters and other synthesis functions. Pedro J. Morales,
+Eduardo Reck Miranda, Ann Lewis, and Erich Neuwirth have all contributed
+nyquist examples found in the demos folder of the Nyquist distribution.
+Philip Yam ported some
+synthesis functions from Perry Cook and Gary Scavone's STK to Nyquist.
+Pedro Morales ported many more STK instruments to Nyquist.
+Dave Borel wrote the Dolby Pro-Logic encoding library and Adam Hartman wrote
+stereo and spatialization effects. Stephen Mangiat wrote the MiniMoog
+emulator. Phil Light recorded the drum samples and wrote drum
+machine software. The Xmusic library, particularly the pattern specification,
+was inspired by Rick Taube's Common Music. The functions for generating
+probability distributions were implemented by Andreas Pfenning.
+
+Starting with Version 3, Nyquist supports a version of SAL, providing
+an alternative to Lisp syntax. SAL was designed by Rick Taube, and the
+SAL implementation in Nyquist is based on Taube's original implementation
+as part of his Common Music system.
+
+The current jNyqIDE includes contributions from many. Chris Yealy and
+Derek D'Souza implemented early versions of the envelope editor. Daren
+Makuck and Michael Rivera wrote the original equalizer editor.
+Priyanka Raghavan implemented the sound browser.
+
+
+Many others have made contributions, offered suggestions, and found bugs.
+If you were expecting to find your name here, I apologize for the omission,
+and please let me know.
+
+I also wish to acknowledge support from CMU, Yamaha, and IBM for this work.
+@newpage
+@blankspace(5 inches)
+@pragma(startscribe)
+.
+@pragma(endscribe)
+@newpage
+@set(page=1)
+@style(pagenumbers="@1")
+
+@chapter(Introduction and Overview)
+
+Nyquist is a language for sound synthesis and music composition. Unlike score
+languages that tend to deal only with events, or signal processing languages
+that tend to deal only with signals and synthesis, Nyquist handles both in a
+single integrated system. Nyquist is also flexible and easy to use because it
+is based on an interactive Lisp interpreter.
+
+With Nyquist, you can design instruments by combining functions (much as you
+would using the orchestra languages of Music V, cmusic, or Csound). You can
+call upon these instruments and generate a sound just by typing a simple
+expression. You can combine simple expressions into complex ones to create
+a whole composition.
+
+Nyquist runs under Linux, Apple Mac OS X, Microsoft Windows NT,
+2000, XP, and Vista,
+and it produces sound files or directly generates audio.
+Recent versions have also run on AIX, NeXT, SGI, DEC pmax, and Sun Sparc
+machines. (Makefiles for many of these are included, but out-of-date).
+Let me know if you have problems with
+any of these machines.
+
+To use Nyquist, you should have a basic knowledge of Lisp. An excellent text
+by Touretzky is recommended @cite(Touretzky). Appendix @ref(xlisp-app) is
+the reference manual for XLISP, of which Nyquist is a superset. Starting with
+Version 3, Nyquist supports a variant of SAL, which is also available in
+Common Music. Since there are some differences, one should generally call this
+implementation ``Nyquist SAL;'' however, in this manual, I will just call it
+``SAL.'' SAL offers most of the capabilities of Lisp, but it uses an Algol-like
+syntax that may be more familiar to programmers with experience in Java, C,
+Basic, etc.
+
+@label(install-sec)
+@section(Installation)
+@index(installation)@index(configure nyquist)@index(setup nyquist)
+Nyquist is a C program intended to run under various operating systems including Unix, MacOS, and Windows.
+@subsection(Unix Installation)
+For Unix systems, Nyquist is distributed as a compressed tar file named @code(nyqsrc3@i(nn).zip),
+where @i(nn) is the version number (e.g. v3.01 was
+in @code(nyqsrc301.zip)). To
+install Nyquist, copy @code(nyqsrc3@i(nn).zip) to the
+directory on your machine where you would like to install Nyquist, and type:
+@begin(example)
+gunzip nyqsrc3@i(nn).zip
+cd nyquist
+ln -s sys/unix/linux/Makefile Makefile
+setenv XLISPPATH `pwd`/runtime:`pwd`/lib
+make
+@end(example)
+The first line creates a @code(nyquist) directory and some subdirectories. The
+second line (cd) changes directories to the new nyquist directory. The third line makes a link from the top-level directory to the Makefile for your
+system. In place of @code(linux) in @code(sys/unix/linux/Makefile), you should
+substitute your system type. Current systems are @code(next), @code(pmax),
+@code(rs6k), @code(sgi), @code(linux), and @code(sparc). The @code(setenv)
+command tells Nyquist where to search for lisp files to be loaded when a file
+is not found in the current directory. The @code(runtime) directory should
+always be on your @code(XLISPPATH) when you run Nyquist, so you may want to
+set @code(XLISPPATH) in your shell startup file, e.g. @code(.cshrc).
+Assuming the make completes successfully, you can run Nyquist as follows:
+@begin(example)
+./ny
+@end(example)
+When you get the prompt, you may begin typing expressions such as
+the ones in the following ``Examples'' section.
+
+One you establish that Nyquist (ny) is working from the command line, you should
+try using jNyqIDE, the Java-based Nyquist development environment. First,
+make @code(jny) executable (do this only once when you install Nyquist):
+@begin(example)
+chmod +x jny
+@end(example)
+Then try running jNyqIDE by typing:
+@begin(example)
+./jny
+@end(example)
+If the jNyqIDE window does not appear, make sure you have Java installed (if not,
+you probably already encountered errors when you ran @code(make)). You can also try recompiling the Java files:
+@begin(example)
+cd jnyqide
+javac *.java
+cd ..
+@end(example)
+
+@p(Note:) With Linux and the Macintosh OS X,
+ jNyqIDE defines the environment passed to Nyquist. If you
+set @code(XLISPPATH)@index(XLISPPATH)@index(search path) as shown above, it
+will be passed along to Nyquist under jNyqIDE. If not,
+a default XLISPPATH will have the @code(lib) and @code(runtime) directories only.
+This does not apply to Windows because even though the environment is there,
+the Windows version of Nyquist reads the @code(XLISPPATH) from the Registry.
+
+You can also specify the search path by creating the
+file @code(nyquist/xlisppath), which should have colon-separated paths
+on a single line of text. This file will override the environment
+variable @code(XLISPPATH).
+
+It is good to have @code(USER) in the environment with your user ID. This string
+is used to construct some file names. jNyqIDE will look for it in the environment.
+You can also specify your user ID using the file @code(nyquist/user), but
+if you have a shared installation of Nyquist, this will not be very useful.
+
+@p(Note:) Nyquist looks for the file @code(init.lsp) in the current
+directory. If you look in the @code(init.lsp) in @code(runtime), you
+will notice two things. First, @code(init.lsp) loads @code(nyquist.lsp)
+from the Nyquist directory, and second, @code(init.lsp) loads @code(system.lsp)
+which in turn defines the macro
+@code(play). You may have to modify @code(system.lsp) to invoke
+the right programs on your machine.
+
+@subsection(Win32 Installation)
+The Win32 version of Nyquist is packaged as a compiled (runtime) system in an
+ executable installer. A source version is also available (the same source
+download is for Win32, Mac OS X, and Linux). The source version is
+intended for developers who
+want to recompile Nyquist.
+The contents of the source archive are extracted to the @code(C:\nyquist)
+directory,
+but you can put it anywhere you like. You can then open the workspace file,
+nyquist.sln, using Microsoft
+Visual C++. You can build and run the command line version of Nyquist
+from within Visual C++. There is a batch file, @code(comp-ide.bat), for
+bulding the Nyquist IDE. This requires the Java SDK from Sun Microsystems.
+
+The runtime version contain everything you need to run Nyquist, including the executable,
+examples, and documentation, packaged as an executable installer program.
+After executing the installer, just find Nyquist in your Start menu to run it.
+You may begin typing expressions such as the ones in the following ``Examples'' section.
+
+@begin(comment) THIS STUFF IS OUT OF DATE
+The Win32 version of Nyquist is packaged as n three versions: the source version
+and two runtime versions. The source version is a superset of the runtime
+version intended for developers who
+want to recompile Nyquist. The source version exists as a @code(.zip) file,
+so you need a utility like WinZip to unpack them. The
+URL @code(http://www.winzip.com/) has information on this product. Typically,
+the contents of the zip file are extracted to the @code(C:\nyquist) directory,
+but you can put it anywhere you like. You can then open the workspace file,
+nyquist.sln, using Microsoft
+Visual C++. You can build and run the command line and the NyqWin versions of Nyquist
+from within Visual C++.
+
+The runtime versions contain everything you need to run Nyquist, including the executable,
+examples, and documentation. Each runtime version is packaged as an executable installer program.
+I recommend @code(setupnyqiderun2xx.exe) (``2xx'' refers to the current version
+number), a graphical interface written in
+Java that runs nyquist.exe as
+a separate process. This IDE has a simple lisp editor built in. Alternatively,
+you can install @code(setupnyqwinrun2xx.exe), a different graphical
+interface written in C++. Just copy the installer you want
+to your system and run it. Then find Nyquist in your Start menu to run it.
+You may begin typing expressions such as the ones in the following ``Examples'' section.
+@end(comment)
+@p(Optional:)@index(Registry)@index(xlisppath)@index(search path) Nyquist needs to know where to find the standard runtime files. The location of runtime files must be stored in the Registry.
+The installers create a registry entry, but if
+you move Nyquist or deal with different versions, you can edit the Registry manually as follows:
+@begin(itemize)
+Run the Registry editor. Under Windows NT, run @code(C:\WINNT\system32\regedt32.exe). Under Windows95, run @code(C:\WINDOWS\regedit.exe).
+
+Find and highlight the @code(SOFTWARE) key under @code(HKEY_LOCAL_MACHINE).
+
+Choose @code(Add key ...) from the @code(Edit) menu, type @code(CMU), and click the @code(OK) button.
+
+Highlight the new @code(CMU) key.
+
+Choose @code(Add key ...) from the @code(Edit) menu, type @code(Nyquist), and click the @code(OK) button. (Note that @code(CMU) and @code(Nyquist) are case sensitive.)
+
+Highlight the new @code(Nyquist) key.
+
+Choose @code(Add value ...) from the @code(Edit) menu, type @code(XLISPPATH), and click the @code(OK) button. (Under WinXP the menu item is @code(Edit:New:String Value), after which you need to select the new string name that appears in the right panel, select @code(Edit:Rename), and type @code(XLISPPATH).)
+
+In the String Edit box (select the @code(Edit:Modify) menu item in WinXP),
+type a list of paths you want Nyquist to search for lisp files. For example, if you installed Nyquist as @code(C:\nyquist), then type:
+@begin(example)
+C:\nyquist\runtime,C:\nyquist\lib
+@end(example)
+The paths should be separated by a comma or semicolon and no space. The @code(runtime) path is essential, and the @code(lib) path may become essential in a future release. You can also add paths to personal libraries of Lisp and Nyquist code.
+
+Click the @code(OK) button of the string box and exit from the Registry Editor application.
+@end(itemize)
+
+@paragraph(What if Nyquist functions are undefined?)
+If you do not have administrative privileges for your machine, the installer may fail to set up the Registry entry that Nyquist uses to find initialization files. In this case, Nyquist will run a lisp interpreter, but many Nyquist functions will not be defined. If you can log in as administrator, do it and reinstall Nyquist. If you do not have permission, you can still run Nyquist as follows:
+
+Create a file named @code(init.lsp) in the same directory as Nyquist.exe (the default location is @code(C:\Program Files\Nyquist), but you may have installed it in some other location.) Put the following text in @code(init.lsp):
+@begin(example)
+@begin(smallcode)
+(setf *search-path* "C:/Program Files/Nyquist/runtime,C:/Program Files/Nyquist/lib")
+(load "C:/Program Files/Nyquist/runtime/init.lsp")
+@end(smallcode)
+@end(example)
+@p(Note:) in the three places where you see @code(C:/Program Files/Nyquist), insert the full path where Nyquist is actually installed. Use forward slashes (@code(/)) rather than back slashes (@code(\)) to separate directories. For example, if Nyquist is installed at @code(D:\rbd\nyquist), then @code(init.lsp) should contain:
+@begin(example)
+@begin(smallcode)
+(setf *search-path* "D:/rbd/nyquist/runtime,D:/rbd/nyquist/lib")
+(load "d:/rbd/nyquist/runtime/init.lsp")
+@end(smallcode)
+@end(example)
+The variable @code(*search-path*), if defined, is used in place of the registry to determine search paths for files.
+
+@paragraph(SystemRoot)
+@index(SystemRoot)
+(Ignore this paragraph if you are not planning to use Open Sound Control under Windows.)
+If Nyquist prints an error message and quits when you enable Open Sound Control (using @code(osc-enable)), check to see if you have an environment variable @code(SystemRoot), e.g. type @code(set) to a command prompt and look for the value of @code(SystemRoot). The normal value is @code(C:\windows). If the value is something else, you should put the environment entry, for example:
+@begin(example)
+SystemRoot="D:\windows"
+@end(example)
+into a file named @code(systemroot) (no extension). Put this file in your @code(nyquist) directory. When you run @code(jNyqIDE), it will look for this file and pass the contents as an environment variable to Nyquist. The Nyquist process needs this to open a UDP socket, which is needed for Open Sound Control.
+
+@paragraph(The "java is not recognized" Error)
+Sometimes, Nyquist will run directly from the installer, but then it will not start from the Windows Start menu. You can try running the
+ @code(nyquist/jnyqide.bat) program from a Windows shell. If that fails, and you see an error similar to "java is not recognized as in internal or external command error", the problem may be that paths are not set up properly to allow the Windows shell to find java. Right click on ``My Computer'' on the Windows
+desktop and select ``Properties.'' Under the ``Advanced'' tap, press the ``Environment Variables'' button, and look for PATH under ``System Variables.'' Make sure the Java bin directory is on the path. If it is not, you will have to find your installation of Java and add the appropriate directory to the PATH variable, e.g. ``C:\Program Files\Java\jdk1.6.0\bin.''
+
+@subsection(MacOS X Installation)
+The OS X version of Nyquist is very similar to the Linux version, but it
+is developed using Xcode, Apple's programming environment. With a little
+work, you can use the Linux installation instructions to compile Nyquist,
+but it might be simpler to just open the Xcode project that is included
+in the Nyquist sources.
+
+You can also download a pre-compiled version of Nyquist for the Mac.
+Just download @code(nyqosx2xx.tgz) to the desktop and open it to
+extract the folder <tt>nyqosx2xx</tt>. (Again, "2xx" refers to the current
+version number, e.g. v2.31 would be named with "231".) Open the folder
+to find a Mac Application named jNyqIDE and a directory named
+<tt>nyquist/doc</tt>. Documentation is in the <tt>nyquist/doc</tt> directory.
+
+The file <tt>jNyqIDE.app/Contents/Resources/Java/ny</tt>
+is the command line executable (if you should need it). To run from the
+command line, you will need to set the XLISPPATH environment variable as
+with Linux. On the topic of the @code(XLISPPATH), note that this variable is
+set by jNyqIDE when running with that application, overriding any other
+value. You can extend the search path by creating the file @code(xlisppath)
+in the same directory as the nyquist executable @code(ny). The
+@code(xlisppath) file should have colon-separated paths
+on a single line of text.
+
+@section(Using jNyqIDE)@index(jNyqIDE)@index(IDE)@index(Integrated Development Environment)
+The program named jNyqIDE is an ``integrated development environment'' for Nyquist. When you run jNyqIDE, it starts the Nyquist program and displays all Nyquist output in a window. jNyqIDE helps you by providing a Lisp and SAL editor, hints for command completion and function parameters, some graphical interfaces for editing envelopes and graphical equalizers, and a panel of buttons for common operations. A more complete description of jNyqIDE is in Chapter @ref(jnyqide-chapter).
+
+For now, all you really need to know is that you can enter Nyquist commands by typing into the upper left window. When you type return, the expression you typed is sent to Nyquist, and the results appear in the window below. You can edit files by clicking on the New File or Open File buttons. After editing some text, you can load the text into Nyquist by clicking the Load button. jNyqIDE always saves the file first; then it tells Nyquist to load the file. You will be prompted for a file name the first time you load a new file.
+
+@section(Using SAL)
+SAL mode means that Nyquist reads and evaluates SAL commands rather than Lisp. The SAL mode prompt is "@code(SAL> )" while the Lisp mode prompt is "@code(> )".
+When Nyquist starts it normally enters SAL mode automatically, but certain errors may exit SAL mode. You can reenter SAL mode by typing the Lisp expression @code[(sal)].
+
+In SAL mode, you type commands in the SAL programming language. Nyquist reads the commands, compiles them into Lisp, and evaluates the commands. Commands can be entered manually by typing into the upper left text box in jNyqIDE.
+
+@section(Helpful Hints)
+Under Win95 and Win98, the console sometimes locks up. Activating another window and then reactivating the Nyquist window should unlock the output.
+(We suggest you use JNyqIDE, the interactive development environment rather than a console window.)
+
+You can cut and paste text into Nyquist, but for serious work, you will want to use the Lisp @code(load) command. To save even more time, write a
+function to load your working file, e.g. @code[(defun l () (load "myfile.lsp"))]. Then you can type @code[(l)] to (re)load your file.
+
+Using SAL, you can type
+@begin(example)
+define function l () load "myfile.lsp"
+@end(example)
+and then
+@begin(example)
+exec l()
+@end(example)
+to (re)load the file.
+
+The Emacs editor is free GNU software and will help you balance parentheses if you use Lisp mode. In fact, you can run nyquist (without the IDE) as a subprocess to Emacs. A helful discussion is at //http://www.audacity-forum.de/download/edgar/nyquist/nyquist-doc/examples/emacs/main.html. If you use Emacs, there is also a SAL mode (the file is @code(sal-mode.el)) included with the Common Music distribution, which you can find on the Web at @code(sourceforge.net).
+
+The jNyqIDE also runs Nyquist as a subprocess and has
+built-in Lisp and SAL editors. If your editor does not help you balance parentheses, you may find yourself counting parens and searching for unbalanced
+expressions. If you are confused or desperate, try the @code(:print t)
+option o fthe @code(load) command. By looking at the expressions printed,
+you should be able to tell where the last unbalanced expression starts.
+Alternatively, type @code[(file-sexprs)] and type the lisp file name at
+the prompt. This function will read and print
+expressions from the file, reporting an error when an extra paren or end-of-file is reached unexpectedly.
+
+@section(Using Lisp)
+Lisp mode means that Nyquist reads and evaluates Nyquist expressions in
+Lisp syntax. Since Nyquist is build on a Lisp interpreter, this is the
+``native'' or machine language of Nyquist, and certain errors and functions
+may break out of the SAL interpreter, leaving you with a prompt for a Lisp
+expression. Alternatively, you can exit SAL simply by typing @code(exit) to
+get a Lisp prompt (@code(> )). Commands can be entered manually by typing
+ into the upper left text box in jNyqIDE.
+
+@section(Examples)
+We will begin with some simple Nyquist programs. Throughout the manual,
+we will assume SAL mode and give examples in SAL, but it should be
+emphasized that all of these examples can be performed using Lisp
+syntax. See Section @ref(sal-vs-lisp-section) on the relationship between
+SAL and Lisp.
+
+Detailed explanations of the functions used in these examples will be
+presented in later chapters, so at this point, you should just read these
+examples to get a sense of how Nyquist is used and what it can do. The
+details will come later. Most of these examples can be found in the
+file @code(nyquist/demos/examples.sal). Corresponding Lisp syntax
+examples are in the file @code(nyquist/demos/examples.lsp).
+
+Our first example makes and plays a sound:@index(osc)@index(play)
+@begin(example)
+@i(;; Making a sound.)
+play osc(60) ; generate a loud sine wave
+@comment{(play (osc 60)) @i(; generate a loud sine wave)} @end(example)
+This example is about the simplest way to create a sound with Nyquist. The
+@code(osc) function generates a sound using a table-lookup oscillator.
+There are a number of optional parameters, but the default is to compute a
+sinusoid with an amplitude of 1.0. The parameter @code(60) designates a
+pitch of middle C. (Pitch specification will be described in greater detail
+later.) The result of the @code(osc) function is a sound. To hear a sound,
+you must use the @code(play) command, which plays the file through the machine's D/A converters. It also writes a soundfile in case the computation cannot keep up with real time. You can then (re)play the file by typing:
+@begin(example)
+exec r()
+@end(example)
+This @code[(r)] function is a general way to ``replay'' the last thing written by @code(play).
+
+Note: when Nyquist plays a sound, it scales the signal by 2@+(15)-1 and (by default) converts to a 16-bit integer format. A signal like @code[(osc 60)], which ranges from +1 to -1, will play as a full-scale 16-bit audio signal.
+
+@subsection(Waveforms)
+@label(waveform-sec)
+Our next example will be presented in several steps. The goal is to create a
+sound using a
+wavetable consisting of several harmonics as opposed to a simple sinusoid.
+In order to build a table, we will use a function that computes a single
+harmonic and add harmonics to form a wavetable. An oscillator
+will be used to compute the harmonics.
+
+@begin(comment)
+Ordinarily, Nyquist programs are sample-rate independent, and time (in
+seconds) is used rather than sample numbers to indicate regions of signals.
+Since we want a wave-table with a certain integer number of samples, we need
+to do some extra calculations to convert from time to samples. The
+@code(build-harmonic) function (see Figure @ref(build-harmonic-fig))
+produces a signal with @code(n) periods in the course of 2048 samples using
+the @code(snd-sine) function.
+
+@begin(figure)
+@begin(example)
+(defun build-harmonic (n tablesize) (snd-sine 0 n tablesize 1))
+@end(example)
+@fillcaption(@code(build-harmonic) uses a low-level function,
+@code(snd-sine), to construct a harmonic. The function parameters denote:
+``compute a sinusoid starting at time zero, with frequency @i(n), a sample
+rate of @i(tablesize) samples per second and a duration of 1 second.'' This signal
+becomes a periodic waveform to be resampled by a table lookup oscillator, so
+the choice of sample rate and duration is a matter of convenience.
+@tag(build-harmonic-fig)
+@end(figure)
+@end(comment)
+
+The function
+@code(mkwave@index(mkwave)) calls upon
+@code(build-harmonic@index(build-harmonic)) to generate a total of four
+harmonics with amplitudes 0.5, 0.25, 0.125, and 0.0625.
+These are scaled and added (using @code(+@index(sim))) to
+create a waveform which is bound temporarily to @code(*table*).
+
+A complete Nyquist waveform is a list consisting of a sound, a pitch,
+ and @code(T), indicating a periodic waveform. The pitch gives the
+nominal pitch of the sound. (This is implicit in a single cycle wave
+table, but a sampled sound may have many periods of the fundamental.)
+Pitch is expressed in half-steps, where middle C is 60 steps, as in MIDI
+pitch numbers.
+The list of sound, pitch, and @code(T) is formed in the last line of
+@code(mkwave): since @code(build-harmonic) computes signals with a duration
+of one second, the fundamental is 1 Hz, and the @code(hz-to-step) function
+converts to pitch (in units of steps) as required.
+
+@begin(example)@label(build-harmonic-example)
+define function mkwave()
+ begin
+ set *table* = 0.5 * build-harmonic(1.0, 2048) +
+ 0.25 * build-harmonic(2.0, 2048) +
+ 0.125 * build-harmonic(3.0, 2048) +
+ 0.0625 * build-harmonic(4.0, 2048)
+ set *table* = list(*table*, hz-to-step(1.0), #t)
+ end
+@end(example)
+
+Now that we have defined a function, the last step of this example is to
+build the wave. The following code calls
+@code(mkwave) the first time the code is executed (loaded from a file). The second time, the variable @code(*mkwave*) will be true, so @code(mkwave) will not be invoked:
+@begin(example)
+if ! fboundp(quote(*mkwave*)) then
+ begin
+ exec mkwave()
+ set *mkwave* = #t
+ end
+@end(example)
+
+@subsection(Wavetables)@index(wavetables)@index(waveforms)@index(triangle wave)@index(sawtooth wave)
+When Nyquist starts, several waveforms are created and stored in global variables for convenience. They are: @code(*sine-table*), @code(*saw-table*), and @code(*tri-table*), implementing sinusoid, sawtooth, and triangle waves, respectively. The variable @code(*table*) is initialized to @code(*sine-table*), and it is @code(*table*) that forms the default wave table for many Nyquist oscillator behaviors. If you want a proper, band-limited waveform, you should construct it yourself, but if you do not understand this sentence and/or you do not mind a bit of aliasing, give @code(*saw-table*) and @code(*tri-table*) a try.
+
+Note that in Lisp and SAL, global variables often start and end with asterisks (*). These are not special syntax, they just happen to be legal characters for names, and their use is purely a convention.
+
+@subsection(Sequences)@index(Sequences)
+Finally, we define @code(my-note@index(my-note)) to use the waveform, and play several notes
+in a simple score. Note that the function @code(my-note) has only one command
+(a @code(return) command), so it is not necessary to use @code(begin) and
+@code(end). These are only necessary when the function body consists of a
+sequence of statements:
+@begin(example)
+define function my-note(pitch, dur)
+ return osc(pitch, dur, *table*)
+
+play seq(my-note(c4, i), my-note(d4, i), my-note(f4, i),
+ my-note(g4, i), my-note(d4, q))
+
+@end(example)
+Here, @code(my-note) is defined to take pitch and duration as parameters;
+it calls @code(osc) to do the work of generating a waveform, using
+@code(*table*) as a wave table.
+
+The @code(seq) function is used to invoke a sequence of behaviors. Each
+note is started at the time the previous note finishes. The parameters to
+@code(my-note) are predefined in Nyquist: @code(c4) is middle C, @code(i) (for
+eIghth note) is 0.5, and @code(q) (for Quarter note) is 1.0. See Section
+@ref(constants-sec) for a complete description. The result is the sum of
+all the computed sounds.
+
+Sequences can also be constructed using the @code(at) transformation to
+specify time offsets. See
+@code(sequence_example.htm)@index(sequence_example.htm)@index(score, musical)
+@code(demos, sequence) for more examples and explanation.
+
+@subsection(Envelopes)@index(Envelopes)
+The next example will illustrate the use of envelopes. In Nyquist,
+envelopes are just ordinary sounds (although they normally have a low sample
+rate). An envelope@index(envelope) is applied to another sound by
+multiplication using the @code(mult@index(mult)) function. The code shows
+the definition of @code(env-note@index(env-note)), defined in terms of the
+@code(note) function in the previous example. In @code(env-note), a 4-phase
+envelope is generated using the @code(env@index(env)) function, which is
+illustrated in Figure @ref(env-fig).
+
+@begin(figure)
+@center(@graphic((height = 2 in, width = 3.75 in, magnify = 1,
+ postscript = "envfig.ps"))
+@html(<img src="fig1.gif"><br><br>)
+@fillcaption(An envelope generated by the @code(env) function.)
+@tag(env-fig)
+@end(figure)
+
+@begin(Example)
+@i[; env-note produces an enveloped note. The duration
+; defaults to 1.0, but stretch can be used to change
+; the duration.
+; Uses my-note, defined above.
+;]
+define function env-note(p)
+ return my-note(p, 1.0) *
+ env(0.05, 0.1, 0.5, 1.0, 0.5, 0.4)
+
+@i[; try it out:
+;]
+play env-note(c4)
+@end(example)
+While this example shows a smooth envelope multiplied by an audio signal,
+you can also multiply audio signals to achieve
+what is often called @i(ring modulation)@index(ring modulation). See
+the code and description in
+@code(demos/scratch_tutorial.htm)@index(demos, ring modulation) for an
+interesting use of ring modulation to create ``scratch'' sounds.
+
+In the next example, The @i(stretch) operator (@code(~))@index(stretch)
+is used to modify durations:
+@begin(example)
+@i[; now use stretch to play different durations
+;]
+play seq(seq(env-note(c4), env-note(d4)) ~ 0.25,
+ seq(env-note(f4), env-note(g4)) ~ 0.5,
+ env-note(c4))
+@end(example)
+
+In addition to @i(stretch), there are a number of transformations supported
+ by Nyquist,
+and transformations of abstract behaviors is perhaps @i(the) fundamental
+idea behind Nyquist. Chapter @ref(behavioral-abstraction-sec) is devoted to
+explaining this concept, and further elaboration can be found elsewhere
+@cite(icmcfugue).
+
+@subsection(Piece-wise Linear Functions)
+It is often convenient to construct signals in Nyquist using a list of
+(time, value) breakpoints which are linearly interpolated to form a smooth
+signal. Envelopes created by @code(env) are a special case of the more
+general piece-wise linear functions created by @code(pwl). Since @code(pwl)
+is used in some examples later on, we will take a look at @code(pwl)
+now. The @code(pwl) function takes a list of parameters which denote (time,
+value) pairs. There is an implicit initial (time, value) pair of (0, 0),
+and an implicit final value of 0. There should always be an odd number of
+parameters, since the final value (but not the final time) is implicit.
+Here are some examples:
+@begin(Example)
+@i[; symetric rise to 10 (at time 1) and fall back to 0 (at time 2):
+;]
+pwl(1, 10, 2)
+
+@i[; a square pulse of height 10 and duration 5.
+; Note that the first pair (0, 10) overrides the default initial
+; point of (0, 0). Also, there are two points specified at time 5:
+; (5, 10) and (5, 0). (The last 0 is implicit). The conflict is
+; automatically resolved by pushing the (5, 10) breakpoint back to
+; the previous sample, so the actual time will be 5 - 1/sr, where
+; sr is the sample rate.
+;]
+pwl(0, 10, 5, 10, 5)
+
+@i[; a constant function with the value zero over the time interval
+; 0 to 3.5. This is a very degenerate form of pwl. Recall that there
+; is an implicit initial point at (0, 0) and a final implicit value of
+; 0, so this is really specifying two breakpoints: (0, 0) and (3.5, 0):
+;]
+pwl(3.5)
+
+@i[; a linear ramp from 0 to 10 and duration 1.
+; Note the ramp returns to zero at time 1. As with the square pulse
+; above, the breakpoint (1, 10) is pushed back to the previous sample.
+;]
+pwl(1, 10, 1)
+
+@i[; If you really want a linear ramp to reach its final value at the
+; specified time, you need to make a signal that is one sample longer.
+; The RAMP function does this:
+;]
+ramp(10) @i[; ramp from 0 to 10 with duration 1 + one sample period
+;
+; RAMP is based on PWL; it is defined in @p(nyquist.lsp).
+;]
+@end(example)
+
+@section(Predefined Constants)
+@label(constants-sec)
+For convenience and readability, Nyquist pre-defines some constants, mostly
+based on the notation of the Adagio score language, as follows:
+@begin(itemize)
+@b(Dynamics)
+Note: these dynamics values are subject to change.
+@begin(display)
+@t(lppp@index(lppp)) = -12.0 (dB)
+@t(lpp@index(lpp)) = -9.0
+@t(lp@index(lp)) = -6.0
+@t(lmp@index(lmp)) = -3.0
+@t(lmf@index(lmf)) = 3.0
+@t(lf@index(lf)) = 6.0
+@t(lff@index(lff)) = 9.0
+@t(lfff@index(lfff)) = 12.0
+@t(dB0@index(dB0)) = 1.00
+@t(dB1@index(dB1)) = 1.122
+@t(dB10@index(dB10)) = 3.1623
+@end(display)
+
+@b(Durations@index(duration notation))
+@begin(display)
+@t(s@index(s)) = Sixteenth@index(Sixteenth note) = 0.25
+@t(i@index(i)) = eIghth@index(eIghth note) = 0.5
+@t(q@index(q)) = Quarter@index(quarter note) = 1.0
+@t(h@index(h)) = Half@index(half note) = 2.0
+@t(w@index(w)) = Whole@index(whole note) = 4.0
+@t(sd@index(sd), id@index(id), qd@index(qd), hd@index(hd), wd@index(wd)) = dotted durations@index(dotted durations).
+@t(st@index(st), it@index(it), qt@index(qt), ht@index(ht), wt@index(wt)) = triplet@index(triplet durations) durations.
+@end(display)
+
+@b(Pitches@index(pitch notation))
+Pitches are based on an A4 of 440Hz. To achieve a different tuning,
+set @code(*A4-Hertz*) to the desired frequency for A4, and call
+@code[(set-pitch-names)]. This will recompute the names listed below with a
+different tuning. In all cases, the pitch value 69.0 corresponds exactly to
+440Hz, but fractional values are allowed, so for example, if you set
+@code(*A4-Hertz*) to 444 (Hz), then the symbol @code(A4) will be bound to
+69.1567, and @code(C4) (middle C), which is normally 60.0, will be 60.1567.
+@begin(display)
+@t(c0) = 12.0
+@t(cs0, df0) = 13.0
+@t(d0) = 14.0
+@t(ds0, ef0) = 15.0
+@t(e0) = 16.0
+@t(f0) = 17.0
+@t(fs0, gf0) = 18.0
+@t(g0) = 19.0
+@t(gs0, af0) = 20.0
+@t(a0) = 21.0
+@t(as0, bf0) = 22.0
+@t(b0) = 23.0
+@t(c1) ... @t(b1) = 24.0 ... 35.0
+@t(c2) ... @t(b2) = 36.0 ... 47.0
+@t(c3) ... @t(b3) = 48.0 ... 59.0
+@t(c4) ... @t(b4) = 60.0 ... 71.0
+@t(c5) ... @t(b5) = 72.0 ... 83.0
+@t(c6) ... @t(b6) = 84.0 ... 95.0
+@t(c7) ... @t(b7) = 96.0 ... 107.0
+@t(c8) ... @t(b8) = 108.0 ... 119.0
+@end(display)
+
+@b(Miscellaneous)
+@begin(display)
+@codef(ny:all)@pragma(defn)@index(ny:all) = ``all the samples'' (i.e. a big number) = 1000000000
+@end(display)
+@end(itemize)
+
+@section(More Examples)
+More examples can be found in the directory @code(demos), part of the standard
+Nyquist release. In this directory, you will find the following and more:
+@begin(itemize)
+Gong sounds by additive synthesis@index(additive synthesis, gongs)
+(@code(demos/pmorales/b1.lsp) and @code(demos/mateos/gong.lsp)@index(Gong sounds)@index(demos, gong sound)
+
+Risset's spectral analysis of a chord
+(@code(demos/pmorales/b2.lsp))@index(Risset)@index(demos, spectral analysis of a chord)
+
+Bell sounds
+(@code(demos/pmorales/b3.lsp), @code(demos/pmorales/e2.lsp), @code(demos/pmorales/partial.lsp), and @code(demos/mateos/bell.lsp))@index(demos, bell sound)@index(bell sound)
+
+Drum sounds by Risset
+(@code(demos/pmorales/b8.lsp)@index(demos, drum sound)@index(drum sound)
+
+Shepard tones (@code(demos/shepard.lsp) and @code(demos/pmorales/b9.lsp))@index(Shepard tones)@index(endless tones)
+
+Random signals (@code(demos/pmorales/c1.lsp))
+
+Buzz with formant filters
+(@code(demos/pmorales/buzz.lsp)@index(vocal sound)@index(demos, formants)
+
+Computing samples directly in Lisp (using Karplus-Strong and physical modelling
+as examples)
+(@code(demos/pmorales/d1.lsp)@index(demos, sample-by-sample)@index(DSP in Lisp)@index(Lisp DSP)@index(Karplus-Strong synthesis)@index(physical model)@index(flute sound)
+
+FM Synthesis examples, including bell@index(bell sound), wood drum@index(wood drum sound),
+brass sounds@index(brass sound), tuba sound @index(tuba) (@code(demos/mateos/tuba.lsp) and clarinet sounds@index(clarinet sound) (@code(demos/pmorales/e2.lsp)@index(demos, FM synthesis)
+
+Rhythmic patterns (@code(demos/rhythm_tutorial.htm)@index(demos, rhythmic pattern)
+
+Drum Samples and Drum Machine (@code(demos/plight/drum.lsp)@index(demos, drum machine)@index(drum samples)@index(drum machine).
+@end(itemize)
+
+@chapter(The jNyqIDE Program)
+@label(jnyqide-chapter)
+The jNyqIDE program combines many helpful functions and interfaces to help you get the most out of Nyquist. jNyqIDE is implemented in Java, and you will need the Java runtime system or development system installed on your computer to use jNyqIDE. The best way to learn about jNyqIDE is to just use it. This chapter introduces some of the less obvious features. If you are confused by something and you do not find the information you need here, please contact the author.
+
+@section(jNyqIDE Overview)
+The jNyqIDE runs the command-line version of Nyquist as a subtask, so everything that works in Nyquist should work when using the jNyqIDE and vice-versa. Input to Nyquist is usually entered in the top left window of the jNyqIDE. When you type return, if the expression or statement appears to be complete, the expression you typed is sent to Nyquist. Output from Nyquist appears in a window below. You cannot type into or edit the output window text.
+
+The normal way to use the jNyqIDE is to create or open one or more files. You edit these files and then click the Load button. To load a file, jNyqIDE saves the file, sets the current directory of Nyquist to that of the file, then issues a @code(load) command to Nyquist. In this case and several others, you may notice that jNyqIDE sends expressions to Nyquist automatically for evaluation. You can always see the commands and their results in the output window.
+
+Notice that when you load a selected file window, jNyqIDE uses @code(setdir) to change Nyquist's current directory. This helps to keep the two programs in sync. Normally, you should keep all the files of a project in the same directory and avoid manually changing Nyquist's current directory (i.e. avoid calling @code(setdir) in your code).
+
+Arranging windows in the jNyqIDE can be time-consuming, and depending on the
+operating system, it is possible for a window to get into a position where you
+cannot drag it to a new position. The Window:Tile menu command can be used
+to automatically lay out windows in a rational way. There is a preference
+setting to determine the height of the completion list relative to the height of the output
+window.
+
+@section(The Button Bar)
+@index(button bar)
+There are a number of buttons with frequently-used operations. These are:
+@begin(itemize)
+Info @itemsep @index(info button)Print information about Nyquist memory
+utilization, including
+the number of free cons cells, the number of garbage collections,
+the total number of cons cells, the total amount of sample buffer memory,
+and the amount of memory in free sample buffers.
+
+Break @itemsep @index(break button)Send a break character to XLISP. This
+can be used to enter the debugger (the break loop) while a program is
+running. Resume by typing @code[(co)].
+
+SAL/Lisp @itemsep @index(SAL button)@index(Lisp button)Switch modes.
+The button names the mode (SAL or Lisp) you will switch to, not the
+current mode. For example, if you are in Lisp mode and want to type
+a SAL command, click the SAL button first.
+
+Top @itemsep @index(top button)Enters @code[(top)] into Nyquist.
+If the XLISP prompt is @code(1>) or
+some other integer followed by ``@code(>)'', clicking the Top button
+will exit the debug loop and return to the top-level prompt.
+
+Replay @itemsep @index(replay button)Enters @code[(r)] into Nyquist.
+This command replays the last computed sound.
+
+F2-F12 @itemsep @index(Fn button)Enters @code[(f2)] etc. into Nyquist.
+These commands are not built-in, and allow users to define their own
+custom actions.
+
+Browse @itemsep @index(browse button)Equivalent to the Window:Browse
+menu item. (See Section @ref(browser).)
+
+EQ @itemsep @index(eq button)Equivalent to the Window:EQ menu item.
+(See Section @ref(eq-window-sec).)
+
+EnvEdit @itemsep @index(envedit button)Equivalent to the Window:Envelope Edit
+menu item. (See Section @ref(envelope-editor-sec).)
+
+NewFile @itemsep @index(newfile button)Equivalent to the File:New menu
+item. Opens a new file editing window for creating and
+loading a Lisp or SAL program file.
+
+OpenFile @itemsep @index(openfile button)Equivalent to the File:Open menu
+item. Opens an existing Lisp or SAL program file for editing and loading.
+
+SaveFile @itemsep @index(savefile button)Equivalent to the File:Save menu
+item (found on the editing window's menu bar). Saves the contents
+of an editing window to its associated file.
+
+Load @itemsep @index(load button)Equivalent to the File:Load menu
+item (found on the editing window's menu bar). Performs a Save operation,
+then sends a command to Nyquist that loads the file as a program.
+
+Mark @itemsep @index(mark button)Sends a Control-A to Nyquist. While
+playing a sound, this displays and records the approximate time in the
+audio stream. (See Section @ref(play-sec) for more detail.)
+
+@end(itemize)
+
+@section(Command Completion)
+To help with programming, jNyqIDE maintains a command-completion window.
+As you type the first letters of function names, jNyqIDE lists matching
+functions and their parameters in the Completion List window. If you click
+on an entry in this window, the displayed expression will replace the
+incompletely typed function name. A preference allows you to match initial
+letters or any substring of the complete function name. This is controlled
+by the ``Use full search for code completion'' preference.
+
+In addition, if you right click (or under Mac OS X, hold down the Alt/Option
+key and click) on an entry, jNyqIDE will display documentation for the function.
+Documentation can come from a local copy or from the online copy (determined
+by the ``Use online manual instead of local copy'' preference). Documentation
+can be displayed within the jNyqIDE window or in an external browser (determined
+by the ``Use window in jNyqIDE for help browser'' preference.) Currently, the
+external browser option does not seem to locate documentation properly, but
+this should be fixed in the future.
+
+@section(Browser)
+@label(browser)
+@index(browser, jnyqide)@index(sound browser, jnyqide)
+If you click on the Browse button or use the Window:Browse menu command,
+jNyqIDE will display a browser window that is pre-loaded with a number of
+ Nyquist commands to create sounds. You can adjust parameters, audition
+the sounds, and capture the expression that creates the sound. In many
+cases, the expression checks to see if necessary functions are defined,
+loading files if necessary before playing the sound. If you want to use
+a sound in your own program, you can often simplify things by explicitly
+loading the required file just once at the beginning of your file.
+
+Since Nyquist now supports a mix of Lisp and SAL, you may find yourself in
+the position of having code from the browser in one language while you are
+working in the other. The best way to handle this is to put the code for
+the sound you want into a function defined in a Lisp (@code(.lsp)) or SAL
+(@code(.sal)) file. Load the file (from Lisp, use the @code(sal-load)
+command to load a SAL file), and call the function from the language of
+your choice.
+
+@section(Envelope Editor)
+@label(envelope-editor-sec)
+@index(envelope editor)
+@index(editor for envelopes)
+@index(graphical envelope editor)
+The envelope editor allows you graphically to design and edit piece-wise
+linear and exponential envelopes. The editor maintains a list of envelopes
+and you select the one to edit or delete using the drop down list in the
+Saved Envelopes List area. The current envelope appears in the Graphical
+Envelope Editor area. You can click to add or drag points. Alternatively,
+you can use the Envelope Points window to select and edit any breakpoint
+by typing coordinates. The duration of the envelope is controlled by the
+Stop field in the Range area, and the vertical axis is controlled by the
+Min and Max fields.
+
+When you click the Save button, @i(all) envelopes are written to Nyquist.
+You can then use the envelope by treating the envelope name as a function.
+For example, if you define an envelope named ``fast-attack,'' then you
+can create the envelope within a Nyquist SAL program by writing
+the expression @code[fast-attack()].
+
+These edited envelopes are saved to a file named @code(workspace.lsp)
+ @index(workspace) in
+the current directory. The workspace is Nyquist's mechanism for saving
+data of all kinds (see Section @ref(workspaces-sec)). The normal way to
+work with workspaces is to (1) load the workspace, i.e.
+ @code[load "workspace"], as soon as you start Nyquist; (2) invoke
+the envelope editor to change values in the workspace; and (3) save the
+workspace at any time, especially before you exit jNyqIDE. If you follow
+these steps, envelopes will be preserved from session to session, and
+the entire collection of envelopes will appear in the editor. Be
+sure to make backups of your @code(workspace.lsp) file along with your
+other project files.
+
+The envelope editor can create linear and exponential envelopes. Use the
+Type pull-down menu to select the type you want. Envelopes can be created
+using default starting and ending values using @code(pwl) or @code(pwe),
+or you can specify the initial values using @code(pwlv) or @code(pwev).
+The envelope editor uses @code(pwl) or @code(pwe) if no point is explicitly
+entered as the initial or final point. To create a @code(pwlv) or @code(pwev)
+function, create a point and drag it to the leftmost or rightmost edge
+of the graphical editing window. You will see the automatically
+generated default starting or ending
+point disappear from the graph.
+
+Exponential envelopes should never decay to zero. If you enter a zero
+amplitude, you will see that the envelope remains at zero to the next
+breakpoint. To get an exponential decay to ``silence,'' try using an
+amplitude of about 0.001 (about -60dB). To enter small values like
+this, you can type them into the Amplitude box and click ``Update Point.''
+
+The Load button refreshes the editor from data saved in the Nyquist
+process. Normally, there is no need to use this because the editor
+automatically loads data when you open it.
+
+@section(Equalizer Editor)
+@label(eq-window-sec)@index(equalization editor)@index(graphical equalization)
+The Equalizer Editor provides a graphical EQ interface for creating and
+adjusting equalizers. Unlike the envelope editor, where you can type
+any envelope name, equalizers are named @code(eq-0), @code(eq-1), etc.,
+and you select the equalizer to edit using a pull-down menu. The @code(Set)
+button should be use to record changes.
+
+@chapter(Behavioral Abstraction)@index(behavioral abstraction)
+@label(behavioral-abstraction-sec)
+In Nyquist, all functions are subject to
+transformations@index(transformations). You can think of transformations as
+additional parameters to every function, and functions are free to use these
+additional parameters in any way. The set of transformation parameters is
+captured in what is referred to as the @i(transformation
+environment@index(transformation environment)). (Note that the term
+@i(environment) is heavily overloaded in computer science. This is yet
+another usage of the term.)
+
+Behavioral abstraction is the ability of functions to adapt their behavior
+to the transformation environment. This environment may contain certain
+abstract notions, such as loudness, stretching a sound in time, etc. These
+notions will mean different things to different functions. For example, an
+oscillator should produce more periods of oscillation in order to stretch
+its output. An envelope, on the other hand, might only change the
+duration of the sustain portion of the envelope in order to stretch.
+Stretching a sample could mean resampling it to change its duration by the
+appropriate amount.
+
+Thus, transformations in Nyquist are not simply operations on signals. For
+example, if I want to stretch a note, it does not make sense to compute the
+note first and then stretch the signal. Doing so would cause a drop in the
+pitch. Instead, a transformation modifies the @i(transformation
+environment) in which the note is computed. Think of transformations as
+making requests to functions. It is up to the function to carry out the
+request. Since the function is always in complete control, it is possible
+to perform transformations with ``intelligence;'' that is, the function can
+perform an appropriate transformation, such as maintaining the desired pitch
+and stretching only the ''sustain'' portion
+of an envelope to obtain a longer note.
+
+@section(The Environment)@index(environment)
+@label(environment-sec)
+The transformation environment consists of a set of special variables.
+These variables should not be read directly and should @i(never) be set
+directly by the programmer. Instead, there are functions to read them, and
+they are automatically set and restored by
+transformation operators, which will be described below.
+
+The transformation environment consists of the following elements. Although
+each element has a ``standard interpretation,'' the designer of an
+instrument or the composer of a complex behavior is free to interpret the
+environment in any way. For example, a change in @code(*loud*) may change
+timbre more than amplitude, and @code(*transpose*) may be ignored by
+percussion instruments:
+
+
+@begin(description)
+ @codef(*warp*@pragma(defn)@index(*warp*))@\Time transformation, including time shift,
+time stretch, and continuous time warp. The value of @code[*warp*] is
+interpreted as a function from logical (local score) time to physical
+(global real) time. Do not access @code(*warp*) directly. Instead, use
+@code[local-to-global(@i(t))] to
+ convert from a logical (local) time to real (global) time. Most often,
+you will call @code[local-to-global(0)]. Several transformation operators
+operate on @code[*warp*], including @i(at) (@code(@@)), @i(stretch) (@code(~)),
+and @code(warp).
+
+ @codef(*loud*@pragma(defn)@index(*loud*))@\Loudness, expressed in decibels. The default
+(nominal) loudness is 0.0 dB (no change). Do not access @code(*loud*)
+directly. Instead, use @code[get-loud()] to get the current value of
+@code(*loud*) and either @code(loud) or @code(loud-abs) to modify it.
+
+ @codef(*transpose*@pragma(defn)@index(*transpose*))@\Pitch transposition,
+expressed in
+semitones. (Default: 0.0). Do not access @code(*transpose*) directly.
+Instead, use @code[get-transpose()] to get the current value of
+@code(*transpose*) and either @code(transpose) or @code(transpose-abs) to
+modify it.
+
+ @codef(*sustain*@pragma(defn)@index(*sustain*))@\The ``sustain,''
+``articulation,'' ``duty factor,'' or amount by which to
+separate or overlap sequential notes. For
+example, staccato might be expressed with a @code(*sustain*) of 0.5, while very
+legato playing might be expressed with a @code(*sustain*) of 1.2.
+Specifically, @code(*sustain*) stretches the duration of notes (sustain)
+without affecting the inter-onset time (the rhythm). Do not access
+@code(*sustain*) directly. Instead, use @code[get-sustain()] to get the
+current value of @code(*sustain*) and either @code(sustain) or
+@code(sustain-abs) to modify it.
+
+ @codef(*start*@pragma(defn)@index(*start*))@\Start
+time of a clipping region. @i(Note:)
+unlike the previous elements of the environment, @code(*start*) has a
+precise interpretation: no sound should be generated before @code(*start*).
+This is implemented in all the low-level sound functions, so it can
+generally be ignored. You can read @code(*start*) directly, but use
+@code(extract) or @code(extract-abs) to modify it. @p(Note 2:) Due
+to some internal confusion between the specified starting time and
+the actual starting time of a signal after clipping, @code(*start*)
+is not fully implemented.
+
+ @codef(*stop*@pragma(defn)@index(*stop*))@\Stop time of clipping
+region. By analogy to
+@code(*start*), no sound should be generated after this time.
+@code(*start*) and
+@code(*stop*) allow a composer to preview a small section of a work
+without computing it from beginning to end. You can read @code(*stop*)
+directly, but use @code(extract) or @code(extract-abs) to modify it.
+ @p(Note:) Due to some internal confusion between the specified
+starting time and the actual starting time of a signal after
+clipping, @code(*stop*) is not fully implemented.
+
+@codef(*control-srate*@pragma(defn)@index(*control-srate*))@\Sample
+rate of control signals. This environment
+element provides the default sample rate for control signals. There is no
+formal distinction between a control signal and an audio signal.
+You can read @code(*control-srate*) directly, but
+use @code(control-srate) or @code(control-srate-abs) to modify it.
+
+ @codef(*sound-srate*@pragma(defn)@index(*sound-srate*))@\Sample
+rate of musical sounds. This environment element provides the
+default sample rate for musical sounds. You can
+read @code(*sound-srate*) directly, but use @code(sound-srate)
+or @code(sound-srate-abs) to modify it.
+
+@end(description)
+
+@section(Sequential Behavior)@index(sequential behavior)
+Previous examples have shown the use of @code(seq), the sequential behavior
+operator. We can now explain @code(seq) in terms of transformations.
+Consider the simple expression:
+@begin(Example)
+play seq(my-note(c4, q), my-note(d4, i))
+@end(example)
+The idea is to create the first note at time 0, and to start the next
+note when the first one finishes. This is all accomplished by manipulating
+the environment. In particular, @code[*warp*] is modified so that what is
+locally time 0 for the second note is transformed, or warped, to the logical
+stop time of the first note.
+
+One way to understand this in detail is to imagine how it
+might be executed: first, @code(*warp*) is set to an initial value that has no
+effect on time, and @code[my-note(c4, q)] is evaluated. A sound is returned and
+saved. The sound has an ending time, which in this case will be @code(1.0)
+because the duration @code(q) is @code(1.0). This ending time, @code(1.0),
+is used to construct a new @code[*warp*] that has the effect of shifting
+time by 1.0. The second note is evaluated, and will start
+at time 1. The sound that is
+returned is now added to the first sound to form a composite sound, whose
+duration will be @code(2.0). @code(*warp*) is restored to its initial value.
+
+Notice that the semantics of @code(seq) can be expressed in terms of
+transformations. To generalize, the operational rule for @code(seq) is:
+evaluate the first behavior according to the current @code(*warp*).
+Evaluate each successive behavior with @code(*warp*) modified to shift the
+new note's starting time to the ending time of the previous behavior.
+Restore @code(*warp*) to its original value and return a sound which is the
+sum of the results.
+
+In the Nyquist implementation, audio samples are only computed when they are
+needed, and the second part of the @code(seq) is not evaluated until the
+ending time (called the logical stop time) of the first part. It is still
+the case that when the second part is evaluated, it will see @code(*warp*)
+bound to the ending time of the first part.
+
+A language detail: Even though Nyquist defers evaluation of the second part of the @code(seq), the expression can reference variables according to ordinary
+Lisp/SAL scope rules. This is because the @code(seq) captures the expression in a closure, which retains all of the variable bindings.
+
+@section(Simultaneous Behavior)@index(Simultaneous Behavior)
+Another operator is @code(sim), which invokes multiple behaviors at the same
+time. For example,
+@begin(example)
+play 0.5 * sim(my-note(c4, q), my-note(d4, i))
+@end(example)
+will play both notes starting at the same time.
+
+The operational rule for @code(sim) is: evaluate each behavior at the
+current @code(*warp*) and return the sum of the results. (In SAL, the
+@code(sim) function applied to sounds is equivalent to adding them
+with the infix @code(+) operator. The following section
+illustrates two concepts: first, a @i(sound) is not a
+@i(behavior), and second, the @code(sim) operator and and the @code(at)
+transformation can be used to place sounds in time.
+
+@section(Sounds vs. Behaviors)@index(Sounds vs. Behaviors)
+The following example loads a sound from a file in the current directory and stores it in @code(a-snd):
+@begin(example)
+@i[; load a sound
+;]
+set a-snd = s-read(strcat(current-path(), "demo-snd.aiff"))
+
+@i[; play it
+;]
+play a-snd
+@end(example)
+
+One
+might then be tempted to write the following:
+@begin(example)
+play seq(a-snd, a-snd) @i(;WRONG!)
+@end(example)
+Why is this wrong? Recall
+that @code(seq) works by modifying @code(*warp*), not by operating on
+sounds. So, @code(seq) will proceed by evaluating @code(a-snd) with
+different values of @code(*warp*). However, the result of evaluating
+@code(a-snd) (a variable) is always the same sound, regardless of the
+environment; in this case, the second @code(a-snd) @i(should) start at time
+@code(0.0), just like the first. In this case, after the first sound ends,
+ Nyquist is unable to ``back up'' to time zero, so in fact, this @i(will)
+play two sounds in sequence, but that is a result of an implementation
+detail rather than correct program execution. In fact, a future version of
+Nyquist might (correctly) stop and report an error when it detects that the
+second sound in the sequence has a real start time that is before the
+requested one.
+
+How then do we obtain a sequence of two sounds properly?
+What we really need here is a
+behavior that transforms a given sound according to the current
+transformation environment. That job is performed by @code(cue). For
+example, the following will behave as expected, producing a sequence of two
+sounds:
+@begin(example)
+play seq(cue(a-snd), cue(a-snd))
+@end(example)
+This example is correct because the second expression will shift the sound
+ stored in @code(a-snd) to start at the end time of the first expression.
+
+The lesson here is very important: @p(sounds are not behaviors!) Behaviors
+are computations that generate sounds according to the transformation
+environment. Once a sound has been generated, it can be stored, copied,
+added to other sounds, and used in many other operations, but sounds are
+@i(not) subject to transformations. To transform a sound, use @code(cue),
+@code(sound), or @code(control). The differences between these operations
+are discussed later. For now, here is a ``cue sheet'' style score that
+plays 4 copies of @code(a-snd):
+
+@begin(example)
+@i[; use sim and at to place sounds in time
+;]
+play sim(cue(a-snd) @@ 0.0,
+ cue(a-snd) @@ 0.7,
+ cue(a-snd) @@ 1.0,
+ cue(a-snd) @@ 1.2)
+@end(example)
+
+@section(The At Transformation)@index(At Transformation)
+The second concept introduced by the previous example is the @code(@@)
+operation, which shifts the @code(*warp*) component of the environment. For
+example,
+@begin(example)
+cue(a-snd) @@ 0.7
+@end(example)
+can be explained operationally as follows: modify @code[*warp*] by shifting
+it by @code(0.7) and evaluate @code[cue(a-snd)]. Return the resulting sound
+after restoring @code(*warp*) to its original value. Notice how @code(@@)
+is used inside a @code(sim) construct to locate copies of @code(a-snd) in
+time. This is the standard way to represent a note-list or a cue-sheet in
+Nyquist.
+
+This also explains why sounds need to be @code(cue)'d in order to be shifted
+in time or arranged in sequence. If this were not the case, then @code(sim)
+would take all of its parameters (a set of sounds) and line them up to start
+at the same time. But @code[cue(a-snd) @@ 0.7] is just a sound, so
+@code(sim) would ``undo'' the effect of @code(@@), making all of the sounds
+in the previous example start simultaneously, in spite of the @code(@@)!
+Since @code(sim) respects the intrinsic starting times of sounds, a special
+operation, @code(cue), is needed to create a new sound with a new starting
+time.
+
+@section(The Stretch Transformation)@index(Stretch Transformation)
+In addition to At (denoted in SAL by the @code(@@) operator, the Stretch
+transformation is very important. It appeared in the introduction, and
+it is denoted in SAL by the @code(~) operator (or in LISP by the @code(stretch)
+special form). Stretch also operates on the @code(*warp*) component of
+the environment. For example,
+@begin(example)
+osc(c4) ~ 3
+@end(example)
+does the following: modify @code(*warp*), scaling the degree of
+"stretch" by 3, and evaluate @code[osc(c4)]. The @code(osc) behavior
+uses the stretch factor to determime the duration, so it will return
+a sound that is 3 seconds long. Restore @code(*warp*) to its original
+value. Like At, Stretch only affects behaviors. @code(a-snd ~ 10) is
+equivalent to @code(a-snd) because @code(a-snd) is a sound, not a
+behavior. Behaviors are functions that compute sounds according to
+the environment and return a sound.
+
+@section(Nested Transformations)@index(Nested Transformations)
+Transformations can be combined using nested expressions. For example,
+@begin(example)
+sim(cue(a-snd),
+ loud(6.0, cue(a-snd) @@ 3))
+@end(example)
+scales the amplitude as well as shifts the second entrance of @code(a-snd).
+
+Why use @code(loud) instead of simply multiplying @code(a-snd) by some
+scale factor? Using @code(loud) gives
+the behavior the chance to implement the abstract
+property @i(loudness) in an appropriate way, e.g. by including timbral
+changes. In this case, the behavior is @code(cue), which implements
+@i(loudness) by simple amplitude scaling, so the result is equivalent
+to multiplication by @code(db-to-linear(6.0)).
+
+Transformations can also be applied to groups of behaviors:
+@begin(example)
+loud(6.0, sim(cue(a-snd) @@ 0.0,
+ cue(a-snd) @@ 0.7))
+@end(example)
+
+@section(Defining Behaviors)@index(Defining Behaviors)
+Groups of behaviors can be named using @code(define) (we already saw this
+in the definitions of @code(my-note) and @code(env-note)). Here is another example
+of a behavior definition and its use. The definition has one parameter:
+@begin(example)
+define function snds(dly)
+ return sim(cue(a-snd) @@ 0.0,
+ cue(a-snd) @@ 0.7,
+ cue(a-snd) @@ 1.0,
+ cue(a-snd) @@ (1.2 + dly))
+
+play snds(0.1)
+play loud(0.25, snds(0.3) ~ 0.9)
+@end(example)
+In the last line, @code(snds) is transformed: the transformations will apply
+to the @code(cue) behaviors within @code(snds). The @code(loud)
+transformation will scale the sounds by @code(0.25), and the @i(stretch)
+(@code(~)) will
+apply to the shift (@code(@@)) amounts @code(0.0), @code(0.7), @code(1.0),
+and @code[1.2 + dly]. The sounds themselves (copies of @code(a-snd)) will
+not be stretched because @code(cue) never stretches sounds.
+
+Section @ref(transformations-sec) describes the full set of transformations.
+
+@section(Overriding Default Transformations)
+In Nyquist, behaviors are @i(the) important abstraction mechanism.
+A behavior represents a class of related functions or sounds. For example,
+a behavior can represent a musical note. When a note is stretched, it
+usually means that the tone sustains for more oscillations, but if the
+``note'' is a drum roll, the note sustains by more repetitions of the
+component drum strokes. The concept of sustain is so fundamental that
+we do not really think of different note durations as being different
+instances of an abstract behavior, but in a music programming language,
+we need a way to model these abtract behaviors. As the tone and drum
+roll examples show, there is no one right way to ``stretch,'' so the
+language must allow users to define exactly what it means to stretch.
+By extension, the Nyquist programmer can define how all of the
+transformations affect different behaviors.
+
+To make programming easier, almost all Nyquist sounds are constructed
+from primitive behaviors that obey the environment in obvious ways:
+Stretch transformations make things longer and At transformations shift
+things in time. But sometimes you have to override the default behaviors.
+Maybe the attack phase of an envelope should not stretch when the note
+is stretched, or maybe when you stretch a trill, you should get more
+notes rather than a slower trill.
+
+To override default behaviors, you almost always follow the same
+programming pattern: first, capture the environment in a local variable;
+then, use one of the absolute transformations to ``turn off'' the
+environment's effect and compute the sound as desired. The following
+example creates a very simple envelope with a fixed rise time to
+illustrate the technique.
+@begin(example)
+define function two-phase-env(rise-time)
+ begin
+ with dur = get-duration(1)
+ return pwl(rise-time, 1, dur) ~~ 1.0
+ end
+@end(example)
+To ``capture the environment in a local variable,'' a @code(with)
+construct is used to create the local variable @code(dur) and set
+it to the value of @code[get-duration(1)], which answers the question:
+``If I apply use the environment to stretch something whose nominal
+duration is 1, what is the resulting duration?'' (Since time transformations
+can involve continuous time deformations, this question is not as
+simple as it may sound, so please use the provided function rather
+than peeking inside the @code(*warp*) structure and trying to do it
+yourself.) Next, we ``turn off'' stretching using the @code(stretch-abs)
+form, which in SAL is denoted by the @code(~~) operator.
+Finally, we are ready to compute the envelope using @code(pwl). Here,
+we use absolute durations. The first breakpoint is at @code(rise-time),
+so the attack time is given by the @code(rise-time) parameter. The
+@code(pwl) decays back to zero at time @code(dur), so the overall
+duration matches the duration expected from the environment encountered
+by this instance of @code(two-phase-env). Note, however, that since
+the @code(pwl) is evaluated in a different environment established
+by @code(~~), it is not stretched (or perhaps more accurately, it is
+stretched by 1.0). This is good because it means @code(rise-time) will
+not be stretched, but we must be careful to extend the envelope to
+@code(dur) so that it has the expected duration.
+
+@section(Sample Rates)
+@index(sample rates)
+The global environment contains @code(*sound-srate*) and
+@code(*control-srate*), which determine the sample rates of sounds and
+control signals. These can be overridden at any point by the
+transformations @code(sound-srate-abs) and @code(control-srate-abs); for
+example,
+@begin(example)
+sound-srate-abs(44100.0, osc(c4)
+@end(example)
+will compute a tone using a 44.1Khz sample rate even if the default rate
+is set to something different.
+
+@index(default sample rate)
+As with other components of the environment, you should @i(never) change
+@code(*sound-srate*) or @code(*control-srate*) directly.
+ The global environment is determined by two additional
+variables: @code(*default-sound-srate*) and @code(*default-control-srate*).
+You can add lines like the following to your @code(init.lsp) file to change
+the default global environment:
+@begin(example)
+(setf *default-sound-srate* 44100.0)
+(setf *default-control-srate* 1102.5)
+@end(example)
+You can also do this using preferences in jNyqIDE.
+If you have already started Nyquist and want to change the defaults, the
+preferences or the following functions can be used:
+@begin(example)
+exec set-control-srate(1102.5)@index(set-control-srate)
+exec set-sound-srate(22050.0)@index(set-sound-srate)
+@end(example)
+These modify the default values and reinitialize the Nyquist environment.
+
+
+@chapter(Continuous Transformations and Time Warps)
+@label(warp-chap)
+Nyquist transformations were discussed in the previous chapter, but all of
+the examples used scalar values. For example, we saw the @code[loud]
+transformation used to change loudness by a fixed amount. What if we want
+to specify a crescendo, where the loudness changes gradually over time?
+
+It turns out that all transformations can accept signals as well as numbers,
+so transformations can be continuous over time. This raises some
+interesting questions about how to interpret continuous transformations.
+Should a loudness transformation apply to the internal details of a note or
+only affect the initial loudness? It might seem unnatural for a decaying
+piano note to perform a crescendo. On the other hand, a sustained
+trumpet sound should probably crescendo continuously. In the case of time
+warping (tempo changes), it might be best for a drum roll to maintain a
+steady rate, a trill may or may not change rates with tempo, and a run of
+sixteenth notes will surely change its rate.
+
+These issues are complex, and Nyquist cannot hope to automatically do the
+right thing in all cases. However, the concept of behavioral abstraction
+provides an elegant solution. Since transformations merely modify the
+environment, behaviors are not forced to implement any particular style of
+transformation. Nyquist is designed so that the default transformation is
+usually the right one, but it is always possible to override the default
+transformation to achieve a particular effect.
+
+@section(Simple Transformations)
+The ``simple'' transformations affect some parameter, but have no effect on time itself. The simple transformations that support continuously changing parameters are: @code(sustain), @code(loud), and @code(transpose).
+
+As a first example, Let us use @code(transpose) to create a chromatic scale.
+First define a sequence of tones at a steady pitch. The @code(seqrep)
+``function'' works like @code(seq) except that it creates copies of a sound
+by evaluating an expression multiple times. Here, @code(i) takes on 16 values
+from 0 to 15, and the expression for the sound could potentially use @code(i).
+Technically, @code(seqrep) is not really a function but an abbreviation for
+a special kind of loop construct.
+@begin(example)
+define function tone-seq()
+ return seqrep(i, 16,
+ osc-note(c4) ~ 0.25)
+@end(example)
+Now define a linearly increasing ramp to serve as a transposition function:
+@begin(code)
+define function pitch-rise()
+ return sustain-abs(1.0, 16 * ramp() ~ 4)
+@end(code)
+This ramp has a duration of 4 seconds, and over that interval it rises from
+0 to 16 (corresponding to the 16 semitones we want to transpose). The ramp
+is inside a @code(sustain-abs) transformation, which prevents a @code(sustain)
+transformation from having any effect on the ramp. (One of the drawbacks of
+behavioral abstraction is that built-in behaviors sometimes do the wrong
+thing implicitly, requiring some explicit correction to turn off the
+unwanted transformation.) Now,
+@code(pitch-rise) is used to transpose @code(tone-seq):
+@begin(code)
+define function chromatic-scale()
+ return transpose(pitch-rise(), tone-seq())
+@end(code)
+
+Similar transformations can be constructed to change the sustain or ``duty
+factor'' of notes and their loudness. The following expression plays the
+@code(chromatic-scale) behavior with increasing note durations. The
+rhythm is unchanged, but the note length changes from staccato to legato:
+@begin(code)
+play sustain((0.2 + ramp()) ~ 4,
+ chromatic-scale())
+@end(code)
+The resulting sustain function will ramp from 0.2 to 1.2. A sustain of 1.2
+denotes a 20 percent overlap between notes. The @code(sum) has a stretch
+factor of 4, so it will extend over the 4 second duration of
+@code(chromatic-scale).
+
+If you try this, you will discover that the @code(chromatic-scale) no longer
+plays a chromatic scale. You will hear the first 4 notes going up in intervals
+of 5 semitones (perfect fourths) followed by repeated pitches. What
+is happening is that the @code(sustain) operation applies to
+@code(pitch-rise) in addition to @code(tone-seq), so now the 4s
+ramp from 0 to 16 becomes a 0.8s ramp. To fix this problem, we need to
+shield @code(pitch-rise) from the effect of @code(sustain) using the
+@code(sustain-abs) transformation. Here is a corrected version of
+@code(chromatic-scale):
+@begin(code)
+define function chromatic-scale()
+ return transpose(sustain-abs(1, pitch-rise()), tone-seq())
+@end(code)
+
+What do these transformations mean? How did the system know to produce a
+pitch rise rather than a continuous glissando? This all relates to the idea
+of behavioral abstraction. It is possible to design sounds that @i(do)
+glissando under the transpose transform, and you can even make sounds that
+@i(ignore) transpose altogether. As explained in Chapter
+@ref(behavioral-abstraction-sec), the transformations modify the
+environment, and behaviors can reference the environment to determine what
+signals to generate. All built-in functions, such as @code(osc), have a
+default behavior.
+
+The default behavior for sound primitives under @code(transpose),
+@code(sustain), and @code(loud) transformations is
+to sample the environment at the beginning of the
+note. Transposition is not quantized to semitones or any other scale,
+but in our example, we arranged for the transposition to work out to integer
+numbers of semitones, so we obtained a chromatic scale anyway.
+
+Transposition only applies to the oscillator and sampling primitives
+@code(osc), @code(partial), @code(sampler), @code(sine), @code(fmosc),
+and @code(amosc). Sustain applies to @code(osc), @code(env), @code(ramp),
+and @code(pwl). (Note that @code(partial), @code(amosc), and
+@code(fmosc) get their durations
+from the modulation signal, so they may indirectly depend upon the sustain.)
+Loud applies to @code(osc), @code(sampler), @code(cue), @code(sound),
+@code(fmosc), and @code(amosc). (But not @code(pwl) or @code(env).)
+
+
+@section(Time Warps)
+The most interesting transformations have to do with transforming time
+itself. The @code(warp) transformation provides a mapping function from
+logical (score) time to real time. The slope of this function tells us how
+many units of real time are covered by one unit of score time. This is
+proportional to 1/tempo. A higher slope corresponds to a slower tempo.
+
+To demonstrate @code(warp), we will define a time warp function using
+@code(pwl):
+@begin(example)
+define function warper()
+ return pwl(0.25, .4, .75, .6, 1.0, 1.0, 2.0, 2.0, 2.0)
+@end(example)
+This function has an initial slope of .4/.25 = 1.6. It may be easier to
+think in reciprocal terms: the initial tempo is .25/.4 = .625. Between 0.25
+and 0.75, the tempo is .5/.2 = 2.5, and from 0.75 to 1.0, the tempo is again
+.625. It is important for warp functions to completely span the interval of
+interest (in our case it will be 0 to 1), and it is safest to extend a bit
+beyond the interval, so we extend the function on to 2.0 with a
+tempo of 1.0. Next, we stretch and scale the @code(warper) function to
+cover 4 seconds of score time and 4 seconds of real time:
+@begin(example)
+define function warp4()
+ return 4 * warper() ~ 4
+@end(example)
+
+@begin(figure)
+@center(@graphic((height = 3.25 in, width = 3.5 in, magnify = 0.5,
+ postscript = "warpfig.ps"))
+@html(<img src="fig2.gif"><br><br>)
+@fillcaption{The result of @code[(warp4)], intended to map 4 seconds of
+score time into 4 seconds of real time. The function extends beyond 4
+seconds (the dashed lines) to make sure the function is well-defined at
+location (4, 4). Nyquist sounds are ordinarily open on the right.}
+@tag(warp-fig)
+@end(figure)
+
+Figure @ref(warp-fig) shows a plot of this warp function. Now, we can
+warp the tempo of the @code(tone-seq) defined above using @code(warp4):
+@begin(example)
+play warp(warp4(), tone-seq())
+@end(example)
+Figure @ref(warp-notes-fig) shows the result graphically. Notice that the
+durations of the tones are warped as well as their onsets. Envelopes are
+not shown in detail in the figure. Because of the way @code(env) is
+defined, the tones will have constant attack and decay times, and the
+sustain will be adjusted to fit the available time.
+
+@begin(figure)
+@center(@graphic((height = 1.75 in, width = 6.75 in, magnify = 1.0,
+ postscript = "warpnotesfig.ps"))
+@html(<img src="fig3.gif"><br><br>)
+@fillcaption[When @code{(warp4)} is applied to @code{(tone-seq-2)}, the note onsets and durations are warped.]
+@tag(warp-notes-fig)
+@end(figure)
+
+@section(Abstract Time Warps)
+We have seen a number of examples where the default behavior did the
+``right thing,'' making the code straightforward. This is not always the
+case. Suppose we want to warp the note onsets but not the durations. We
+will first look at an incorrect solution and discuss the error. Then we
+will look at a slightly more complex (but correct) solution.
+
+The default behavior for most Nyquist built-in functions is to sample the
+time warp function at the nominal starting and ending score times of the
+primitive. For many built-in functions, including @code(osc), the starting
+logical time is 0 and the ending logical time is 1, so the time warp
+function is evaluated at these points to yield real starting and stopping
+times, say 15.23 and 16.79. The difference (e.g. 1.56) becomes the signal
+duration, and there is no internal time warping. The @code(pwl) function
+behaves a little differently. Here, each breakpoint is warped individually,
+but the resulting function is linear between the breakpoints.
+
+A consequence of the default behavior is that notes stretch when the tempo
+slows down. Returning to our example, recall that we want to warp only the
+note onset times and not the duration. One would think that the following
+would work:
+@begin(example)
+define function tone-seq-2 ()
+ return seqrep(i, 16,
+ osc-note(c4) ~~ 0.25)
+
+play warp(warp4(), tone-seq-2())
+@end(example)
+Here, we have redefined @code(tone-seq), renaming it to @code(tone-seq-2)
+and changing the stretch (@code(~)) to absolute stretch (@code(~~)). The
+absolute stretch should override the warp function and produce a fixed
+duration.
+
+If you play the example, you will hear steady
+sixteenths and no tempo changes. What is wrong? In a sense, the ``fix''
+works too well. Recall that sequences (including @code(seqrep)) determine
+the starting time of the next note from the logical stop time of the
+previous sound in the sequence. When we forced the stretch to 0.25, we also
+forced the logical stop time to 0.25 real seconds from the beginning, so
+every note starts 0.25 seconds after the previous one, resulting in a
+constant tempo.
+
+Now let us design a proper solution. The trick is to use absolute
+stretch (@code(~~))
+as before to control the duration, but to restore the logical stop time to a
+value that results in the proper inter-onset time interval:
+@begin(example)
+define function tone-seq-3()
+ return seqrep(i, 16,
+ set-logical-stop(osc-note(c4) ~~ 0.25, 0.25))
+
+play warp(warp4(), tone-seq-3())
+@end(example)
+Notice the addition of @code(set-logical-stop) enclosing the
+absolute stretch (@code(~~)) expression to set the logical
+ stop time. A possible
+point of confusion here is that the logical stop time is set to 0.25, the
+same number given to @code(~~)! How does setting the logical stop
+time to 0.25 result in a tempo change? When used within a @code(warp)
+transformation, the second argument to @code(set-logical-stop) refers to
+@i(score) time rather than @i(real) time. Therefore, the score duration of
+0.25 is warped into real time, producing tempo changes according to the
+enviroment. Figure @ref(warp-onset-fig) illustrates the result graphically.
+
+@begin(figure)
+@center(@graphic((height = 1.75 in, width = 6.75 in, magnify = 1.0,
+ postscript = "warponsetfig.ps"))
+@html(<img src="fig4.gif"><br><br>)
+@fillcaption[When @code[(warp4)] is applied
+to @code[(tone-seq-3)], the note onsets are warped, but not the duration,
+which remains a constant 0.25 seconds. In the fast middle section, this
+causes notes to overlap. Nyquist will sum (mix) them.]
+@tag(warp-onset-fig)
+@end(figure)
+
+@section(Nested Transformations)
+Transformations can be nested. In particular, a simple transformation such
+as transpose can be nested within a time warp transformation. Suppose we
+want to warp our chromatic scale example with the @code(warp4) time warp
+function. As in the previous section, we will show an erroneous simple
+solution followed by a correct one.
+
+The simplest approach to a nested transformation is to simply combine them
+and hope for the best:
+@begin(example)
+play warp(warp4(),
+ transpose(pitch-rise(), tone-seq()))
+@end(example)
+This example will not work the way you might expect. Here is why: the warp
+transformation applies to the @code[(pitch-rise)] expression, which is
+implemented using the @code(ramp) function. The default
+behavior of @code(ramp) is to interpolate linearly (in real time) between two points.
+Thus, the ``warped'' @code(ramp) function will not truly reflect the internal
+details of the intended time warp. When the notes are moving faster, they
+will be closer together in pitch, and the result is not chromatic.
+What we need is a way to properly
+compose the warp and ramp functions. If we continuously warp the ramp function
+in the same way as the note sequence, a chromatic scale should be obtained.
+This will lead to a correct solution.
+
+Here is the modified code to properly warp a transposed sequence. Note that
+the original sequence is used without modification. The only complication
+is producing a properly warped transposition function:
+@begin(example)
+ play warp(warp4(),
+ transpose(
+ control-warp(get-warp(),
+ warp-abs(nil, pitch-rise())),
+ tone-seq()))
+@end(example)
+To properly warp the @code(pitch-rise) transposition function, we use
+@code(control-warp), which applies a warp function to a function of score time,
+yielding a function of real time. We need to pass the desired function
+to @code(control-warp), so we fetch it from the environment with
+@code[get-warp()]. Finally, since the warping is done here, we want to
+shield the @code(pitch-rise) expression from further warping, so we enclose
+it in @code[warp-abs(nil, ...)].
+
+ @i(An aside:) This last example illustrates a difficulty in the design of
+Nyquist. To support behavioral abstraction universally, we must rely upon
+behaviors to ``do the right thing.'' In this case, we would like the
+@code(ramp) function to warp continuously according to the environment. But
+this is inefficient and unnecessary in many other cases where @code(ramp)
+and especially @code(pwl) are used. (@code(pwl) warps its breakpoints, but still interpolates linearly between them.) Also, if the default behavior of
+primitives is to warp in a continuous manner, this makes it difficult to
+build custom abstract behaviors. The final vote is not in.
+
+@chapter(More Examples)
+
+This chapter explores Nyquist through additional examples. The reader may
+wish to browse through these and move on to Chapter @ref(lisp-chap), which
+is a reference section describing Nyquist functions.
+
+@section(Stretching Sampled Sounds)@index(Stretching Sampled Sounds)
+
+This example illustrates how to stretch a sound, resampling it in the process.
+Because sounds in Nyquist are @i(values) that contain the sample rate, start
+time, etc., use @code(sound) to convert a sound into a behavior that can be
+stretched, e.g. @code[sound(a-snd)]. This behavior stretches a sound according
+to the stretch factor in the environment, set using @code(stretch). For
+accuracy and efficiency, Nyquist does not resample a stretched sound until
+absolutely necessary. The @code(force-srate) function is used to resample
+the result so that we end up with a ``normal'' sample rate that is playable
+on ordinary sound cards.
+
+@begin(example)
+@i[; if a-snd is not loaded, load sound sample:
+;]
+if not(boundp(quote(a-snd))) then
+ set a-snd = s-read("demo-snd.aiff")
+
+@i[; the SOUND operator shifts, stretches, clips and scales
+; a sound according to the current environment
+;]
+define function ex23()
+ play force-srate(*default-sound-srate*, sound(a-snd) ~ 3.0)
+
+define function down()
+ return force-srate(*default-sound-srate*,
+ seq(sound(a-snd) ~ 0.2,
+ sound(a-snd) ~ 0.3,
+ sound(a-snd) ~ 0.4,
+ sound(a-snd) ~ 0.6))
+play down()
+
+@i[; that was so much fun, let's go back up:
+;]
+define function up()
+ return force-srate(*default-sound-srate*,
+ seq(sound(a-snd) ~ 0.5,
+ sound(a-snd) ~ 0.4,
+ sound(a-snd) ~ 0.3,
+ sound(a-snd) ~ 0.2))
+
+@i[; and write a sequence
+;]
+play seq(down(), up(), down())
+@end(example)
+
+Notice the use of the @code(sound) behavior as opposed to @code(cue). The
+@code(cue) behavior shifts and scales its sound according to @code(*warp*)
+and @code(*loud*), but it does not change the duration or resample the
+sound. In contrast, @code(sound) not only shifts and scales its sound, but
+it also stretches it by resampling or changing the effective sample rate
+ according to @code(*warp*). If
+@code[*warp*] is a continuous warping function, then the sound will be
+stretched by time-varying amounts.
+(The @code(*transpose*) element of the environment is
+ignored by both @code(cue) and @code(sound).)
+
+@p(Note:) @code(sound) may use linear interpolation rather than a high-quality resampling algorithm. In some cases, this may introduce errors audible as noise. Use @code(resample) (see Section @ref(resample-sec)) for high-quality interpolation.
+
+In the functions @code(up) and @code(down), the @code(*warp*) is set by
+@i(stretch) (@code(~)), which simply scales time by a constant scale factor. In this case,
+@code(sound) can ``stretch'' the signal simply by changing the sample rate without
+any further computation. When @code(seq) tries to add the signals together, it
+discovers the sample rates do not match and uses linear interpolation to adjust
+all sample rates to match that of the first sound in the sequence. The result of
+@code(seq) is then converted using @code(force-srate) to convert the sample rate,
+again using linear interpolation.
+It would be slightly better, from a computational
+standpoint, to apply @code(force-srate) individually
+to each stretched sound rather
+than applying @code(force-srate) after @code(seq).
+
+Notice that the overall duration of @code[sound(a-snd) ~ 0.5] will
+be half the duration of @code(a-snd).
+
+@section(Saving Sound Files)@index(Saving Sound Files)
+
+So far, we have used the @code(play) command to play a sound. The
+@code(play) command works by writing a sound to a file while
+simultaneously playing it.
+This can be done one step at a time, and
+it is often convenient to save a sound to a particular file for later use:
+@begin(example)
+@i[; write the sample to a file,
+; the file name can be any Unix filename. Prepending a "./" tells
+; s-save to not prepend *default-sf-dir*
+;]
+exec s-save(a-snd, 1000000000, "./a-snd-file.snd")
+
+@i[; play a file
+; play command normally expects an expression for a sound
+; but if you pass it a string, it will open and play a
+; sound file]
+play "./a-snd-file.snd"
+
+@i[; delete the file (do this with care!)
+; only works under Unix (not Windows)]
+exec system("rm ./a-snd-file.snd")
+
+@i[; now let's do it using a variable as the file name
+;]
+set my-sound-file = "./a-snd-file.snd"
+
+exec s-save(a-snd, 1000000000, my-sound-file)
+
+@i[; play-file is a function to open and play a sound file]
+exec play-file(my-sound-file)
+
+exec system(strcat("rm ", my-sound-file))
+@end(example)
+This example shows how @code(s-save) can be used to save a sound to a file.
+
+This example also shows how the @code(system) function can be used to invoke
+Unix shell commands, such as a command to play a file or remove it.
+Finally, notice that @code(strcat) can be used to concatenate a command name
+to a file name to create a complete command that is then passed to
+@code(system). (This is convenient if the sound file name is stored in a
+parameter or variable.)
+
+@section(Memory Space and Normalization)
+@label(normalization-sec)
+@index(normalization)@index(peak amplitude)@index(maximum amplitude)@index(clip)@index(s-max)@index(s-min)@index(rescaling)@index(not enough memory for normalization)
+Sound samples take up lots of memory, and often, there is not enough primary (RAM) memory to hold a complete composition. For this reason, Nyquist can compute sounds incrementally, saving the final result on disk. @i(However,) Nyquist can also save sounds in memory so that they can be reused efficiently. In general, if a sound is saved in a global variable, memory will be allocated as needed to save and reuse it.
+
+The standard way to compute a sound and write it to disk is to pass an expression to the @code(play) command:
+@begin(example)
+play my-composition()
+@end(example)
+
+@label(peak-ex-sec)
+Often it is nice to @i(normalize) sounds so that they use the full available
+dynamic range of 16 bits. Nyquist has an automated facility to help with
+normalization. By default, Nyquist computes up to 1 million samples (using
+about 4MB of memory) looking for the peak. The entire sound is normalized so
+that this peak will not cause clipping. If the sound has less than 1 million
+samples, or if the first million samples are a good indication of the overall
+peak, then the signal will not clip.
+
+With this automated normalization technique, you can choose the desired
+peak value by setting @code(*autonorm-target*), which is initialized to 0.9.
+The number of samples examined is @code(*autonorm-max-samples*), initially
+1 million. You can turn this feature off by executing:
+@begin(example)
+exec autonorm-off()@index(autonorm-off)
+@end(example)
+and turn it back on by typing:
+@begin(example)
+exec autonorm-on()@index(autonorm-on)
+@end(example)
+This normalization technique is in effect when @code(*autonorm-type*) is
+@code(quote(lookahead)), which is the default.
+
+An alternative normalization method uses the peak value from the previous
+call to @code(play). After playing a file, Nyquist can adjust an internal
+scale factor so that if you play the same file again, the peak amplitude
+will be @code(*autonorm-target*), which is initialized to 0.9. This can
+be useful if you want to carefully normalize a big sound that does not
+have its peak near the beginning. To select this style of normalization,
+set @code(*autonorm-type*) to the (quoted) atom @code(quote(previous)).
+
+You can also create your own normalization method in Nyquist.
+The @code(peak) function computes the maximum value of a sound.
+The peak value is also returned from the @code(play) macro. You can
+normalize in memory if you have enough memory; otherwise you can compute
+the sound twice. The two techniques are illustrated here:
+@begin(example)
+@i[; normalize in memory. First, assign the sound to a variable so
+; it will be retained:]
+set mysound = sim(osc(c4), osc(c5))
+@i[; now compute the maximum value (ny:all is 1 giga-samples, you may want a
+; smaller constant if you have less than 4GB of memory:]
+set mymax = snd-max(mysound, NY:ALL)
+display "Computed max", mymax
+@i[; now write out and play the sound from memory with a scale factor:]
+play mysound * (0.9 / mymax)
+
+@i[; if you don't have space in memory, here's how to do it:]
+define function myscore()
+ return sim(osc(c4), osc(c5))
+@i[; compute the maximum:]
+set mymax = snd-max(list(quote(myscore)), NY:ALL)
+display "Computed max", mymax
+@i[; now we know the max, but we don't have a the sound (it was garbage
+; collected and never existed all at once in memory). Compute the sound
+; again, this time with a scale factor:]
+play myscore() * (0.9 / mymax)
+@end(example)
+
+You can also write a sound as a floating point file. This
+file can then be converted to 16-bit integer with the proper scaling
+applied. If a long computation was involved, it should be much faster
+to scale the saved sound file than to recompute the sound from scratch.
+Although not implemented yet in Nyquist, some header formats can
+store maximum amplitudes, and some soundfile player programs can
+rescale floating point files on the fly, allowing normalized
+soundfile playback without an extra normalization pass (but at a cost
+of twice the disk space of 16-bit samples).
+You can use Nyquist to rescale a floating point file and
+convert it to 16-bit samples for playback.
+
+@section(Frequency Modulation)@index(Frequency Modulation)
+The next example uses the Nyquist frequency modulation behavior @code(fmosc)
+to generate various sounds. The parameters to @code(fmosc) are:
+@begin(example)
+fmosc(@i(pitch) @i(modulator) @i(table) @i(phase))
+@end(example)
+Note that pitch is the number of half-steps, e.g. @code(c4) has the value of 60 which is middle-C, and phase is in degrees. Only the first two parameters are required:
+@begin(example)
+@i[; make a short sine tone with no frequency modulation
+;]
+play fmosc(c4, pwl(0.1))
+
+@i[; make a longer sine tone -- note that the duration of
+; the modulator determines the duration of the tone
+;]
+play fmosc(c4, pwl(0.5))
+@end(example)
+In the example above, @code(pwl) (for Piece-Wise Linear) is used to generate
+sounds that are zero for the durations of @code(0.1) and @code(0.5) seconds,
+respectively. In effect, we are using an FM oscillator with no modulation
+input, and the result is a sine tone. The duration of the modulation
+determines the duration of the generated tone (when the modulation signal
+ends, the oscillator stops).
+
+The next example uses a more interesting modulation function, a ramp from
+zero to C@-(4), expressed in hz. More explanation of @code(pwl) is in
+order. This operation constructs a piece-wise linear function sampled at
+the @code(*control-srate*). The first breakpoint is always at @code[(0,
+0)], so the first two parameters give the time and value of the second
+breakpoint, the second two parameters give the time and value of the third
+breakpoint, and so on. The last breakpoint has a value of @code(0), so only
+the time of the last breakpoint is given. In this case, we want the ramp to
+end at C@-(4), so we cheat a bit by having the ramp return to zero
+``almost'' instantaneously between times @code(0.5) and @code(0.501).
+
+The @code(pwl) behavior always expects an odd number of parameters. The
+resulting function is shifted and stretched linearly according to
+@code[*warp*] in the environment. Now, here is the example:
+@begin(example)
+@i[; make a frequency sweep of one octave; the piece-wise linear function
+; sweeps from 0 to (step-to-hz c4) because, when added to the c4
+; fundamental, this will double the frequency and cause an octave sweep.
+;]
+play fmosc(c4, pwl(0.5, step-to-hz(c4), 0.501))
+@end(Example)
+
+The same idea can be applied to a non-sinusoidal carrier. Here, we assume that @code(*fm-voice*) is predefined (the next section shows how to define it):
+@begin(example)
+@i[; do the same thing with a non-sine table
+;]
+play fmosc(cs2, pwl(0.5, step-to-hz(cs2), 0.501),
+ *fm-voice*, 0.0)
+@end(example)
+
+The next example shows how a function can be used to make a special
+frequency modulation contour. In this case the contour generates a sweep
+from a starting pitch to a destination pitch:
+@begin(example)
+@i[; make a function to give a frequency sweep, starting
+; after <delay> seconds, then sweeping from <pitch-1>
+; to <pitch-2> in <sweep-time> seconds and then
+; holding at <pitch-2> for <hold-time> seconds.
+;]
+define function sweep(delay, pitch-1, sweep-time,
+ pitch-2, hold-time)
+ begin
+ with interval = step-to-hz(pitch-2) - step-to-hz(pitch-1)
+ return pwl(delay, 0.0,
+ @i[; sweep from pitch 1 to pitch 2]
+ delay + sweep-time, interval,
+ @i[; hold until about 1 sample from the end]
+ delay + sweep-time + hold-time - 0.0005,
+ interval,
+ @i[; quickly ramp to zero (pwl always does this,]
+ @i[; so make it short)]
+ delay + sweep-time + hold-time)
+ end
+
+
+@i[; now try it out
+;]
+play fmosc(cs2, sweep(0.1, cs2, 0.6, gs2, 0.5),
+ *fm-voice*, 0.0)
+@end(example)
+
+FM can be used for vibrato as well as frequency sweeps. Here, we use the
+@code(lfo) function to generate vibrato. The @code(lfo) operation is
+similar to @code(osc), except it generates sounds at the
+@code(*control-srate*), and the parameter is hz rather than a pitch:
+@begin(example)
+play fmosc(cs2, 10.0 * lfo(6.0), *fm-voice*, 0.0)
+@end(Example)
+
+What kind of manual would this be without the obligatory FM sound? Here, a
+sinusoidal modulator (frequency C@-(4)) is multiplied by a slowly increasing
+ramp from zero to @code(1000.0).
+@begin(example)
+set modulator = pwl(1.0, 1000.0, 1.0005) *
+ osc(c4)
+@i[; make the sound]
+play fmosc(c4, modulator)
+@end(example)
+
+For more simple examples of FM in Nyquist, see
+@index(warble)@index(FM synthesis)@index(demos, FM)@index(tutorial, FM)
+@code(demos/warble_tutorial.htm). Another interesting FM sound
+reminiscent of ``scratching'' can be found with a detailed explanation
+in @code(demos/scratch_tutorial.htm).@index(demos, scratch tutorial)
+@index(vinal scratch)@index(scratch sound).
+
+@section(Building a Wavetable)
+In Section @ref(waveform-sec), we saw how to synthesize a wavetable. A
+wavetable for @code(osc) also can be extracted from any sound. This is
+especially interesting if the sound is digitized from some external sound
+source and loaded using the @code(s-read) function. Recall that a table
+is a list consisting of a sound, the pitch of that sound, and T (meaning the
+sound is periodic).
+
+In the following, a sound is first read from the file @code(demo-snd.nh).
+Then, the @code(extract) function is used
+to extract the portion of the sound between 0.110204 and 0.13932 seconds.
+(These numbers might be obtained by first plotting the sound and estimating
+the beginning and end of a period, or by using some software to look for
+good zero crossings.) The result of @code(extract) becomes the first
+element of a list. The next element is the pitch (24.848422), and the last
+element is @code(T). The list is assigned to @code(*fm-voice*).
+@begin(example)
+if not(boundp(quote(a-snd))) then
+ set a-snd = s-read("demo-snd.aiff")
+
+set *fm-voice* = list(extract(0.110204, 0.13932, cue(a-snd)),
+ 24.848422,
+ #T)
+@end(example)
+
+The file
+@i(demos/examples.sal) contains an extensive example of how to locate
+zero-crossings, extract a period, build a waveform, and generate a tone from it. (See @code(ex37) through @code(ex40) in the file.)
+
+@begin(comment)
+The @code(maketable) command is also useful and is documented on page
+@ref(maketable). If @code(sample) is the source sound, then the following
+will extract 0.01 seconds (starting at time 0.2s) of audio and convert it
+into a waveform named @code(mytable):
+@begin(example)
+(setf mytable (maketable (extract -abs 0.2 0.21 sample)))
+@end(example)
+Nyquist does not provide any pitch analysis or other help finding good splice points, so it is up to you to make sure the table you extract is a reasonable one.
+@end(comment)
+
+@section(Filter Examples)
+
+Nyquist provides a variety of filters. All of these filters take either
+real numbers or signals as parameters. If you pass a signal as a filter
+parameter, the filter coefficients are recomputed at the sample rate of the
+@i(control) signal. Since filter coefficients are generally expensive to
+compute, you may want to select filter control rates carefully. Use
+@code(control-srate-abs) (Section @ref(control-srate-abs-sec)) to specify
+the default control sample rate, or use @code(force-srate) (Section
+@ref(force-srate-sec)) to resample a signal before passing it to a filter.
+
+Before presenting examples, let's generate some unfiltered white noise:
+@begin(example)
+play noise()
+@end(example)
+Now low-pass filter the noise with a 1000Hz cutoff:
+@begin(example)
+play lp(noise(), 1000.0)
+@end(example)
+The high-pass filter is the inverse of the low-pass:
+@begin(example)
+play hp(noise(), 1000.0)
+@end(example)
+
+Here is a low-pass filter sweep from 100Hz to 2000Hz:
+@begin(example)
+play lp(noise(), pwl(0.0, 100.0, 1.0, 2000.0, 1.0))
+@end(example)
+And a high-pass sweep from 50Hz to 4000Hz:
+@begin(example)
+play hp(noise(), pwl(0.0, 50.0, 1.0, 4000.0, 1.0))
+@end(example)
+
+The band-pass filter takes a center frequency and a bandwidth parameter.
+This example has a 500Hz center frequency with a 20Hz bandwidth. The scale
+factor is necessary because, due to the resonant peak of the filter, the
+signal amplitude exceeds 1.0:
+@begin(example)
+play reson(10.0 * noise(), 500.0, 20.0, 1)
+@end(example)
+In the next example, the center frequency is swept from 100 to 1000Hz, using a constant 20Hz bandwidth:
+@begin(example)
+play reson(0.04 * noise(),
+ pwl(0.0, 200.0, 1.0, 1000.0, 1.0),
+ 20.0)
+@end(example)
+
+For another example with explanations, see
+@index(wind_tutorial.htm)@index(wind sound)@index(filter example)
+@index(demos, wind sound)
+@code(demos/wind_tutorial.htm).
+
+
+@section(DSP in Lisp)
+@index(DSP in Lisp)@index(Lisp DSP)In almost any
+signal processing system, the vast majority of computation
+takes place in the inner loops of DSP algorithms, and Nyquist is designed so
+that these time-consuming inner loops are in highly-optimized
+machine code rather than relatively slow interpreted lisp code. As a result,
+Nyquist typically spends 95% of its time in these inner loops; the overhead
+of using a Lisp interpreter is negligible.
+
+The drawback is that Nyquist must provide the DSP operations you need, or
+you are out of luck. When Nyquist is found lacking, you can either write a
+new primitive signal operation, or you can perform DSP in Lisp code. Neither
+option is recommended for inexperienced programmers. Instructions for
+extending Nyquist are given in Appendix @ref(extending-app). This section
+describes the process of writing a new signal processing function in Lisp.
+
+Before implementing a new DSP function, you should decide which approach is
+best. First, figure out how much of the new function can be implemented
+using existing Nyquist functions. For example, you might think that a
+tapped-delay line would require a new function, but in fact, it can be
+implemented by composing sound transformations to accomplish delays, scale
+factors for attenuation, and additions to combine the intermediate results.
+This can all be packaged into a new Lisp function, making it easy to use.
+If the function relies on built-in DSP primitives, it will execute very
+efficiently.
+
+Assuming that built-in functions cannot be used, try to define a new
+operation that will be both simple and general. Usually, it makes sense to
+implement only the kernel of what you need, combining it with existing
+functions to build a complete instrument or operation. For example, if you
+want to implement a physical model that requires a varying breath pressure
+with noise and vibrato, plan to use Nyquist functions to add a basic
+pressure envelope to noise and vibrato signals to come up with a composite
+pressure signal. Pass that signal into the physical model rather than
+synthesizing the envelope, noise, and vibrato within the model. This not
+only simplifies the model, but gives you the flexibility to use all of
+Nyquist's operations to synthesize a suitable breath pressure signal.
+
+Having designed the new ``kernel'' DSP operation that must be implemented,
+decide whether to use C or Lisp. (At present, SAL is not a good option
+because it has no support for object-oriented programming.)
+To use C, you must have a C compiler, the
+full source code for Nyquist, and you must learn about extending Nyquist by
+reading Appendix @ref(extending-app). This is the more complex approach, but
+the result will be very efficient. A C implementation will deal properly
+with sounds that are not time-aligned or matched in sample rates.
+To use Lisp, you must learn something
+about the XLISP object system, and the result will be about 50 times slower
+than C. Also, it is more difficult to deal with time alignment and
+differences in sample rates.
+The remainder of this section gives an example of a Lisp version of
+@code(snd-prod) to illustrate how to write DSP functions for Nyquist in Lisp.
+
+The @code(snd-prod) function is the low-level multiply routine. It has two
+sound parameters and returns a sound which is the product of the two. To
+keep things simple, we will assume that two sounds to be multiplied have a
+matched sample rate and matching start times. The DSP algorithm for each
+output sample is simply to fetch a sample from each sound, multiply them,
+and return the product.
+
+To implement @code(snd-prod) in Lisp, three components are required:
+@begin(enumerate)
+An object is used to store the two parameter sounds. This object will be
+called upon to yield samples of the result sound;
+
+Within the object, the @code(snd-fetch) routine is used to fetch samples
+from the two input sounds as needed;
+
+The result must be of type @code(SOUND), so @code(snd-fromobject) is used
+to create the result sound.
+@end(enumerate)
+
+The combined solution will work as follows: The result is a value of type
+@code(sound) that retains a reference to the object. When Nyquist needs
+samples from the sound, it invokes the sound's ``fetch'' function, which in
+turn sends an XLISP message to the object. The object will use
+@code(snd-fetch) to get a sample from each stored sound, multiply the
+samples, and return a result.
+
+Thus the goal is to design an XLISP object that, in response to a
+@code(:next) message will return a proper sequence of samples. When the
+sound reaches the termination time, simply return @code(NIL).
+
+The XLISP manual (see Appendix @ref(XLISP-app) describes the object system,
+but in a very terse style, so this example will include some explanation of
+how the object system is used. First, we need to define a class for the
+objects that will compute sound products. Every class is a subclass of class
+@code(class), and you create a subclass by sending @code(:new) to a class.
+@begin(example)
+(setf product-class (send class :new '(s1 s2)))
+@end(example)
+The parameter @code['(s1 s2)] says that the new class will have two instance
+variables, @code(s1) and @code(s2). In other words, every object which is an
+instance of class @code(product-class) will have its own copy of
+these two variables.
+
+Next, we will define the @code(:next) method for @code(product-class):
+@begin(example)
+(send product-class :answer :next '()
+ '((let ((f1 (snd-fetch s1))
+ (f2 (snd-fetch s2)))
+ (cond ((and f1 f2)
+ (* f1 f2))
+ (t nil)))))
+@end(example)
+The @code(:answer) message is used to insert a new method into our new
+@code(product-class). The method is described in three parts: the name
+(@code(:next)), a parameter list (empty in this case), and a list of
+expressions to be evaluated. In this case, we fetch samples from @code(s1)
+and @code(s2). If both are numbers, we return their product. If either is
+@code(NIL), we terminate the sound by returning @code(nil).
+
+The @code(:next) method assumes that @code(s1) and @code(s2) hold the sounds
+to be multiplied. These must be installed when the object is created.
+Objects are created by sending @code(:new) to a class. A new object is
+created, and any parameters passed to @code(:new) are then sent in a
+@code(:isnew) message to the new object. Here is the @code(:isnew)
+definition for @code(product-class):
+@begin(example)
+(send product-class :answer :isnew '(p1 p2)
+ '((setf s1 (snd-copy p1))
+ (setf s2 (snd-copy p2))))
+@end(example)
+Take careful note of the use of @code(snd-copy) in this initialization. The
+sounds @code(s1) and @code(s2) are modified when accessed by
+@code(snd-fetch) in the @code(:next) method defined above, but this destroys
+the illusion that sounds are immutable values. The solution is to copy the
+sounds before accessing them; the original sounds are therefore unchanged.
+(This copy also takes place implicitly in most Nyquist sound functions.)
+
+To make this code safer for general use, we should add checks that @code(s1)
+and @code(s2) are sounds with identical starting times and sample rates;
+otherwise, an incorrect result might be computed.
+
+Now we are ready to write @code(snd-product), an approximate replacement for
+@code(snd-prod):
+@begin(example)
+(defun snd-product (s1 s2)
+ (let (obj)
+ (setf obj (send product-class :new s1 s2))
+ (snd-fromobject (snd-t0 s1) (snd-srate s1) obj)))
+@end(example)
+This code first creates @code(obj), an instance of @code(product-class), to
+hold @code(s1) and @code(s2). Then, it uses @code(obj) to create a sound
+using @code(snd-fromobject). This sound is returned from
+@code(snd-product). Note that in @code(snd-fromobject), you must also
+specify the starting time and sample rate as the first two parameters. These
+are copied from @code(s1), again assuming that @code(s1) and @code(s2) have
+matching starting times and sample rates.
+
+Note that in more elaborate DSP algorithms we could expect the object to
+have a number of instance variables to hold things such as previous samples,
+waveform tables, and other parameters.
+
+@chapter(SAL)
+@label(SAL-chap)
+Nyquist supports two languages: XLISP and SAL. In some sense, XLISP and SAL
+are the same language, but with differing syntax. This chapter describes SAL: how it works, SAL syntax and semantics, and the relationship between SAL and XLISP, and differences between Nyquist SAL and Common Music SAL.
+
+Nyquist SAL is based on Rick Taube's SAL language, which is
+part of Common Music. SAL offers the power
+of Lisp but features a simple, Algol-like syntax. SAL is implemented
+in Lisp: Lisp code translates SAL into a Lisp program and uses the
+underlying Lisp engine to evaluate the program. Aside from the translation
+time, which is quite fast, SAL programs execute at about the same speed as
+the corresponding Lisp program. (Nyquist SAL programs run just
+ slightly slower than XLISP
+because of some runtime debugging support automatically added to
+user programs by the SAL compiler.)
+
+From the user's perspective, these implementation details are hidden. You
+can enter SAL mode from XLISP by typing @code[(SAL)] to the XLISP prompt.
+The SAL input prompt (@code(SAL> )) will be displayed. From that point on,
+you simply type SAL commands, and they will be executed. By setting a
+preference in the jNyqIDE program, SAL mode will be entered automatically.
+
+It is possible to encounter errors that will take you from the SAL interpreter
+to an XLISP prompt. In general, the way to get back to SAL is by typing
+@code[(top)] to get back to the top level XLISP interpreter and reset the
+Nyquist environment. Then type @code[(sal)] to restart the SAL interpreter.
+
+@section(SAL Syntax and Semantics)
+@index(SAL)
+ The most unusual feature of SAL syntax is that identifiers
+are Lisp-like, including names such as ``play-file'' and even ``*warp*.''
+In SAL, most operators must be separated from identifiers by white space.
+For example, @code(play-file) is one identifier, but @code(play - file)
+is an expression for ``play minus file,'' where @code(play) and @code(file) are
+two separate identifiers. Fortunately, no spaces are needed around commas
+and parentheses.
+
+In SAL, whitespace (any sequence of space, newline, or tab characters)
+is sometimes necessary to separate lexical tokens, but
+otherwise, spaces and indentation are ignored. To make SAL readable,
+it is @i(strongly) advised that you indent SAL programs as in the examples
+here. The jNyqIDE program is purposely insistent about SAL indentation,
+so if you use it to edit SAL programs, your indentation should be
+both beautiful and consistent.
+
+As in Lisp (but very unlike C or Java), comments @index(comments)
+are indicated by
+semicolons. Any text from an unquoted semicolon to the end of the
+line is ignored.
+
+@begin(example)
+@i(; this is a comment)
+@i(; comments are ignored by the compiler)
+print "Hello World" @i(; this is a SAL statement)
+@end(example)
+
+As in Lisp, identifiers are translated to upper-case, making SAL
+case-insensitive@index(case-insensitive). For example, the function name @code(autonorm) can
+be typed in lower case or as @code(AUTONORM), @code(AutoNorm), or even
+@code(AuToNoRm). All forms denote the same function. The recommended
+approach is to write programs in all lower case.
+
+SAL is organized around statements, most of which
+contain expressions. We will begin with expressions and then look at
+statements.
+
+@subsection(Expressions)
+@index(sal expressions)@index(expressions, sal)
+@paragraph(Simple Expressions)
+As in XLISP, simple expressions include:
+@begin(itemize)
+integers (FIXNUM's), such as @code(1215),
+
+floats (FLONUM's) such as @code(12.15),
+
+strings (STRING's) such as @code("Magna Carta"), and
+
+symbols (SYMBOL's) such as @code(magna-carta). A symbol with a leading colon
+(@code(:)) evaluates to itself as in Lisp. Otherwise, a symbol denotes either
+a local variable, a formal parameter, or a global variable. As in Lisp,
+variables do not have data types or type declarations. The type of a
+variable is determined at runtime by its value.
+@end(itemize)
+
+Additional simple expressions in SAL are:
+@begin(itemize)
+lists such as @code[{c 60 e 64}]. Note that there are no commas to separate list elements, and symbols in lists are not evaluated as variables but stand for themselves. Lists may contain numbers, booleans, symbols, strings, and other lists.
+
+Booleans: SAL interprets @code(#t)@index(#t) as true and @code(#f)@index(#f)
+as false. (As far
+as the SAL compiler is concerned, @code(t) and @code(nil) are just variables.
+Since these are the Lisp versions of true and false, they are interchangeable
+with @code(#t) and @code(#f), respectively.)
+@end(itemize)
+A curious property of Lisp and Sal is that @i(false) and the empty list are
+the same value. Since SAL is based on Lisp, @code(#f) and @code({}) (the empty
+list)@index(empty list) are equal.
+
+@paragraph(Operators)
+Expressions can be formed with unary and binary operators using infix notation. The operators are:
+@begin(itemize)
+@index(+)@code(+) - addition, including sounds
+
+@index(-)@code(-) - subtraction, including sounds
+
+@index(*)@code(*) - multiplication, including sounds
+
+@index(/)@code(/) - division (due to divide-by-zero problems, does not operate on sounds)
+
+@index(%)@code(%) - modulus (remainder after division)
+
+@index(^)@code(^) - exponentiation
+
+@index(=)@code(=) - equal (using Lisp @code(eql))
+
+@index(!=)@code(!=) - not equal
+
+@index(>)@code(>) - greater than
+
+@index(<)@code(<) - less than
+
+@index(>=)@code(>=) - greater than or equal
+
+@index(<=)@code(<=) - less than or equal
+
+@index(~=)@code(~=) - general equality (using Lisp @code(equal))
+
+@index(&)@code(&) - logical and
+
+@index(|)@code(|) - logical or
+
+@index(!)@code(!) - logical not (unary)
+
+@index(@@)@index(time shift, sal)@index(at, sal)@code(@@) - time shift
+
+@index(@@@@)@index(absolute time shift, sal)@index(at-abs, sal)@code(@@@@) - time shift to absolute time
+
+@index(~)@index(stretch, sal)@code(~) - time stretch
+
+@index(~~)@index(absolute stretch, sal)@code(~~) - time stretch to absolute stretch factor
+@end(itemize)
+Again, remember that operators @i(must) be delimited from their operands using
+spaces or parentheses. Operator precedence is based on the following levels of
+precedence:
+@begin(example)
+@@ @@@@ ~ ~~
+^
+/ *
+% - +
+~= <= >= > ~= =
+!
+&
+|
+@end(example)
+
+@paragraph(Function Calls)
+@index(function calls, sal)
+A function call is a function name followed by zero or more comma-delimited
+argument expressions
+enclosed within parentheses:
+@begin(example)
+list()
+piano-note(2.0, c4 + interval, 100)
+@end(example)
+Some functions use named parameters,
+in which case the name of the argument with a colon precedes the argument
+expression.
+@begin(example)
+s-save(my-snd(), ny:all, "tmp.wav", play: #t, bits: 16)
+@end(example)
+
+@paragraph(Array Notation)
+@index(array notation, sal)
+An array reference is a variable identifier followed by an index expression
+in square brackets, e.g.:
+@begin(example)
+x[23] + y[i]
+@end(example)
+
+@paragraph(Conditional Values)
+@index(conditional expression, sal)
+@index(#?, sal)
+The special operator @code(#?) evaluates the first argument expression.
+If the result is @i(true), the second expression is evaluated and
+its value is returned. If @i(false), the third expression is evaluated
+and returned (or @i(false) is returned if there is no third expression):
+@begin(example)
+#?(random(2) = 0, unison, major-third)
+#?(pitch >= c4, pitch - c4) ; returns false if pitch < c4
+@end(example)
+
+@subsection(SAL Statements)
+@index(statements, sal)
+SAL compiles and evaluates @i(statements) one at a time. You can type
+statements at the SAL prompt or load a file containing SAL statements.
+SAL statements are described below. The syntax is indicated at the
+beginning of each statement type description: @code(this font) indicates
+literal terms such as keywords, @i(the italic font) indicates a
+place-holder for some other statement or expression. Bracket [like this]
+indicate optional (zero or one) syntax elements, while braces with a plus
+{like this}+ indicate one or more occurrences of a syntax element. Braces
+with a star {like this}* indicate zero or more occurrences of a syntax element: { @i(non-terminal) }* is equivalent to [ {@i(non-terminal)}+ ].
+
+@paragraph(begin and end)
+@index(begin)@index(end)
+@code(begin) [@i(with-stmt)] {@i(statement)}+ @code(end)
+
+A @code(begin)-@code(end) statement
+consists of a sequence of statements surrounded by
+the @code(begin) and @code(end) keywords. This form is often used for function
+definitions and after @code(then) or @code(else) where the syntax demands a
+single statement but you want to perform more than one action. Variables may be
+declared using an optional @code(with) statement immediately after @code(begin).
+For example:
+@begin(example)
+begin
+ with db = 12.0,
+ linear = db-to-linear(db)
+ print db, "dB represents a factor of", linear
+ set scale-factor = linear
+end
+@end(example)
+
+@paragraph(chdir)
+@index(chdir, sal)
+@code(chdir) @i(expression)
+
+The @code(chdir) statement changes the working directory. This statement
+is provided for compatibility with Common Music SAL, but it really
+should be avoided if you use jNyqIDE. The @i(expression) following the
+@code(chdir) keyword should evaluate to a string that is a directory
+path name. Note that literal strings themselves are valid expressions.
+@begin(example)
+chdir "/Users/rbd/tmp"
+@end(example)
+
+@paragraph(define variable)
+@index(global variables, sal)@index(define variable)
+[@code(define)] @code(variable) @i(name) [= @i(expression)] {, @i(name) [= @i(expression)]}*
+
+Global variables can be declared and initialized. A list of variable names,
+each with an optional initialization follows the @code(define variable)
+keywords. (Since @code(variable) is a keyword, @code(define) is redundant
+and optional in Nyquist SAL, but required in Common Music SAL.)
+If the initialization part is omitted, the variable is initialized
+to false. Global variables do not really need to be declared: just using the
+name implicitly creates the corresponding variable. However, it is an error
+to use a global variable that has not been initialized;
+@code(define variable) is a good way to introduce a variable (or constant)
+with an initial value into your program.
+
+@begin(example)
+define variable transposition = 2,
+ print-debugging-info, @i(; initially false)
+ output-file-name = "salmon.wav"
+@end(example)
+
+@paragraph(define function)
+@index(function, sal)@index(define function)
+[@code(define)] @code(function) @i(name) @code[(] [@i(parameter)], {, @i(parameter)}* @code[)] @i(statement)
+
+Before a function be called from an expression (as described above), it must
+be defined. A function definition gives the function @i(name), a list of
+@i(parameters), and a @i(statement). When a function is called, the actual
+parameter expressions are evaluated from left to right and the formal parameters
+of the function definition are set to these values. Then, @i(statement) is
+evaluated.
+
+The formal parameters may be positional parameters that are matched with
+actual parameters by position from left to right. Syntactically, these are
+symbols and these symbols
+are essentially local variables that exist only until @i(statement) completes
+or a @code(return) statement causes the function evaluation to end. As in Lisp,
+parameters are passed by value, so assigning a new value to a formal parameter
+has no effect on the actual value. However, lists and arrays are not copied,
+so internal changes to a list or array produce observable side effects.
+
+Alternatively, formal parameters may be keyword parameters. Here the @i(parameter)
+is actually a pair: a keyword parameter, which is a symbol followed by a colon,
+and a default value, given by any expression. Within the body of the function,
+the keyword parameter is named by a symbol whose name matches the keyword
+parameter except there is no final colon.
+@begin(example)
+define function foo(x: 1, y: bar(2, 3))
+ display "foo", x, y
+
+exec foo(x: 6, y: 7)
+@end(example)
+In this example, @code(x) is bound to the value 6 and @code(y) is bound to
+the value 7, so the example prints ``@code(foo : X = 6, Y = 7)''. Note that
+while the keyword parameters are @code(x:) and @code(y:), the corresponding
+variable names in the function body are @code(x) and @code(y), respectively.
+
+The @i(parameters) are meaningful only within the lexical (static) scope of
+@i(statement). They are not accessible from within other
+functions even if they are called by this function.
+
+Use a @code(begin)-@code(end) statement if the body of the function should
+contain more than one statement or you need to define local variables. Use
+a @code(return) statement to return a value from the function. If @i(statement)
+completes without a @code(return), the value false is returned.
+
+@paragraph(display)
+@index(display statement, sal)
+@code(display) @i(string) {, @i(expression)}*
+
+The @code(display) statement is handy for debugging. At present, it is only
+implemented in Nyquist SAL. When executed, @code(display) prints the @i(string)
+followed by a colon and then, for each @i(expression), the expression and its
+value are printed, after the last expression, a newline is printed. For example,
+@begin(example)
+display "In function foo", bar, baz
+@end(example)
+prints
+@begin(example)
+In function foo : bar = 23, baz = 5.3
+@end(example)
+SAL may print the expressions using Lisp syntax, e.g. if the expression is
+``bar + baz,'' do not be surprised if the output is ``@code[(sum bar baz) = 28.3].''
+
+@paragraph(exec)
+@index(exec statement, sal)
+@code(exec) @i(expression)
+
+Unlike most other programming languages, you cannot simply type an expression as
+a statement. If you want to evaluate an expression, e.g. call a function,
+you must use an @code(exec) statement. The statement simply evaluates
+the @i(expression). For example,
+@begin(example)
+exec set-sound-srate(22050.0) @i(; change default sample rate)
+@end(example)
+
+@paragraph(if)
+@index(if statement, sal)
+@code(if) @i(test-expr) @code(then) @i(true-stmt) [@code(else) @i(false-stmt)]
+
+An @code(if) statement evaluates the expression @i(test-expr). If it is true,
+it evaluates the statement @i(true-stmt). If false, the statement
+@i(false-stmt) is evaluated. Use a @code(begin)-@code(end) statement
+to evaluate more than one statement in then @code(then) or @code(else)
+parts.
+
+@begin(example)
+if x < 0 then x = -x @i(; x gets its absoute value)
+
+if x > upper-bound then
+ begin
+ print "x too big, setting to", upper-bound
+ x = upper-bound
+ end
+else
+ if x < lower-bound then
+ begin
+ print "x too small, setting to", lower-bound
+ x = lower-bound
+ end
+@end(example)
+Notice in this example that the @code(else) part is another @code(if)
+statement. An @code(if) may also be the @code(then) part of another
+@code(if), so there could be two possible @code(if)'s with which to
+associate an @code(else). An @code(else) clause always associates
+with the closest previous @code(if) that does not already have an
+@code(else) clause.
+
+@paragraph(when)
+@code(when) @i(test) @i(statement)
+
+The @code(when) statement is similar to @code(if), but there is no @code(else) clause.
+
+@begin(example)
+when *debug-flag* print "you are here"
+@end(example)
+
+@paragraph(unless)
+@code(unless) @i(test) @i(statement)
+
+The @code(unless) statement is similar to @code(when) (and @code(if)) but the
+@i(statement) is executed when the @i(test) expression is @i(false).
+
+@begin(example)
+unless count = 0 set average = sum / count
+@end(example)
+
+@paragraph(load)
+@index(load statement, sal)
+@code(load) @i(expression)
+
+The @code(load) command loads a file named by @i(expression), which must
+evauate to a string path name for the file. To load a file, SAL interprets
+each statement in the file, stopping when the end of the file or an error
+is encountered. If the file ends in @code(.lsp), the file is assumed to
+contain Lisp expressions, which are evaluated by the XLISP interpreter.
+In general, SAL files should end with the extension @code(.sal).
+
+@paragraph(loop)
+@index(loop statement, sal)
+@code(loop) [@i(with-stmt)] {@i(stepping)}* {@i(stopping)* @i(action)+ [@i(finally)] @code(end)
+
+The @code(loop) statement is by far the most complex statement in SAL, but
+it offers great flexibility for just about any kind of iteration. The basic
+function of a loop is to repeatedly evaluate a sequence of @i(action)'s which
+are statements. Before the loop begins, local variables may be declared in
+@i(with-stmt), a @code(with) statement.
+
+The @i(stepping) clauses do several
+things. They introduce and initialize additional local variables similar
+to the @i(with-stmt).
+However, these local variables are updated to new values after the @i(action)'s.
+In addition, some @i(stepping) clauses have associated stopping conditions,
+which are tested on each iteration @i(before) evaluating the @i(action)'s.
+
+There are also @i(stopping) clauses that provide additional tests to
+stop the iteration. These are also evaluated and tested
+on each iteration before evaluating the @i(action)'s.
+
+When some @i(stepping) or @i(stopping) condition causes the iteration to stop,
+the @i(finally) clause is evaluated (if present). Local variables and their
+values can still be accessed in the @i(finally) clause. After the @i(finally)
+clause, the @code(loop) statement completes.
+
+The @i(stepping) clauses are the following:
+@begin(description)
+@code(repeat) @i(expression)@\Sets the number of iterations to the value of @i(expression), which should be an integer (FIXNUM).
+
+@code(for) @i(var) = @i(expression) [ @code(then) @i(expr2) ]@\Introduces a new local
+variable named @i(var) and initializes it to @i(expression). Before each subsequent
+iteration, @i(var) is set to the value of @i(expr2). If the @code(then) part is
+omitted, @i(expression) is re-evaluated and assigned to @i(var)
+on each subsequent iteration. Note that this differs from a @i(with-stmt) where
+expressions are evaluated and variables are only assigned their values once.
+
+@code(for) @i(var) @code(in) @i(expression)@\Evaluates @i(expression) to
+obtain a list and creates a new local variable initialized to the first element
+of the list. After each iteration, @i(var) is assigned the next element of the
+list. Iteration stops when @i(var) has assumed all values from the list. If the
+list is initially empty, the loop @i(action)'s are not evaluated (there are zero
+iterations).
+
+@code(for) @i(var) [@code(from) @i(from-expr)] [[@code(to) | @code(below) | @code(downto) | @code(above)] @i(to-expr)] [@code(by) @i(step-expr)]@\Introduces a new local variable named @i(var) and intialized
+to the value of the expression @i(from-expr) (with a default value of 0). After
+each iteration of the loop, @i(var) is incremented by the value
+of @i(step-expr) (with a default value of 1).
+The iteration ends when @i(var) is greater than
+the value of @i(to-expr) if there is a @code(to) clause,
+greater than or equal to the value of @i(to-expr)
+if there is a @code(below) clause,
+less than the value of @i(to-expr) if there is a @code(downto) clause,
+or less than or equal to the value of @i(to-expr) if there is a @code(above)
+clause. (In the cases of @i(downto) and @i(above), the default increment value
+is -1. If there
+is no @code(to), @code(below), @code(downto), @code(above), or @code(below) clause, no interation stop test is created for this
+stepping clause.
+@end(description)
+
+The @i(stopping) clauses are the following:
+@begin(description)
+@code(while) @i(expression)@\The iterations are stopped when @i(expression) evaluates to @i(false). Anything not false is considered to mean true.
+
+@code(until) @i(expression)@\The iterations are stopped when @i(expression) evaluates to @i(true).
+@end(description)
+
+The @i(finally) clause is defined as follows:
+@index(finally clause, sal)
+@begin(description)
+@code(finally) @i(statement)@\The @i(statement) is evaluated when one of the
+@i(stepping) or @i(stopping) clauses ends the loop. As always, @i(statement) may
+be a @code(begin)-@code(end) statement. If an @i(action) evaluates a @code(return)
+statement, the @code(finally) statement is not executed.
+@end(description)
+
+@index(loop examples, sal)Loops often fall into common patterns, such as iteratiing a fixed number of
+times, performing an operation on some range of integers, collecting results
+in a list, and linearly searching for a solution. These forms are illustrated
+in the examples below.
+
+@begin(example)
+@i(; iterate 10 times)
+loop
+ repeat 10
+ print random(100)
+end
+
+@i(; print even numbers from 10 to 20
+; note that 20 is printed. On the next iteration,
+; i = 22, so i >= 22, so the loop exits.)
+loop
+ for i from 10 to 22 by 2
+ print i
+end
+
+@i(; collect even numbers in a list)
+loop
+ with lis
+ for i = 0 to 10 by 2
+ set lis @@= i @i(; push integers on front of list,)
+ @i(; which is much faster than append,)
+ @i(; but list is built in reverse)
+ finally result = reverse(lis)
+end
+@i(; now, the variable result has a list of evens)
+
+@i(; find the first even number in a list)
+result = #f @i(; #f means "false")
+loop
+ for elem in lis
+ until evenp(elem)
+ finally result = elem
+end
+@i[; result has first even value in lis (or it is #f)]
+@end(example)
+
+@paragraph(print)
+@index(print statement, sal)
+@code(print) @i(expr) {, @i(expr)}*
+
+The @code(print) statement prints the values separated by
+spaces and followed by a newline. [Note that in the original
+SAL, the newline is printed @i(before) the values, not after.]
+
+
+@begin(example)
+print "The value of x is", x
+@end(example)
+
+@paragraph(return)
+@index(return statement, sal)
+@code(return) @i(expression)
+
+The @code(return) statement can only be used inside a function. It evaluates
+@i(expression) and then the function returns the value of the expression
+to its caller.
+
+@paragraph(set)
+@index(set statement, sal)
+@code(set) @i(var) @i(op) @i(expression) {, @i(var) @i(op) @i(expression)}*
+
+The @code(set) statement changes the value of a variable @i(var) according
+to the operator @i(op) and the value of the @i(expression). The operators are:
+@begin(description)
+@code(=)@\The value of @i(expression) is assigned to @i(var).
+
+@index(+=)@code(+=)@\The value of @i(expression) is added to @i(var).
+
+@index(*=)@code(*=)@\The value of @i(var) is multiplied by the value of the expression.
+
+@index(&=)@code(&=)@\The value of @i(expression) is inserted as the last element of
+the list referenced by @i(var). If @i(var) is the empty list (denoted by @code(#f)),
+then @i(var) is assigned a newly constructed list of one element, the value
+of @i(expression).
+
+@index(^=)@code(^=)@\The value of @i(expression), a list, is appended to the list referenced
+by @i(var). If @i(var) is the empty list (denoted by @code(#f)), then @i(var)
+is assigned the (list) value of @i(expression).
+
+@index(@@=)@code(@@=)@\Pushes the value of @i(expression) onto the front of the list
+referenced by @i(var). If @i(var) is empty (denoted by @code(#f)), then @i(var)
+is assigned a newly constructed list of one element, the value of @i(expression).
+
+@index(<=)@code(<=)@\Sets the new value of @i(var) to the minimum of the old value
+of @i(var) and the value of @i(expression).
+
+@index(>=)@code(>=)@\Sets the new value of @i(var) to the maximum of the old value
+of @i(var) and the value of @i(expression).
+@end(description)
+
+@begin(example)
+@i(; example from Rick Taube's SAL description)
+loop
+ with a, b = 0, c = 1, d = {}, e = {}, f = -1, g = 0
+ for i below 5
+ set a = i, b += 1, c *= 2, d &= i, e @@= i, f <= i, g >= i
+ finally display "results", a, b, c, d, e, f, g
+end
+@end(example)
+
+@paragraph(with)
+@index(with statement, sal)
+@code(with) @i(var) [= @i(expression)] {, @i(var) [= @i(expression)]}*
+
+The @code(with) statement declares and initializes local variables. It
+can appear only after @code(begin) or @code(loop). If the @i(expression) is
+omitted, the initial value is @i(false). The variables are visible only
+inside the @code(begin)-@code(end) or @code(loop) statement where the
+@code(with) statement appears. Even in @code(loop)'s the variables
+are intialized only when the loop is entered, not on each iteration.
+
+@paragraph(exit)
+@index(exit statement, sal)
+@code(exit) [@code(nyquist)]
+
+The @code(exit) statement is unique to Nyquist SAL. It returns from SAL
+mode to the XLISP interpreter. (Return to SAL mode by typing ``@code[(sal)]'').
+If @code(nyquist) is included in the statement, then the entire Nyquist
+process will exit.
+
+@section(Interoperability of SAL and XLISP)
+@index(sal and lisp)@index(interoperability, sal and lisp)
+@label(sal-vs-lisp-section)
+When SAL evaluatas command or loads files, it translates SAL into XLISP.
+You can think of SAL as a program that translates everything you write
+into XLISP and entering it for you. Thus, when you define a SAL function,
+the function actually exists as an XLISP function (created using
+Lisp's @code(defun) special form). When you set or evaluate global variables
+in SAL, these are exactly the same Lisp global variables. Thus, XLISP
+functions can call SAL functions and vice-versa. At run time,
+everything is Lisp.
+
+@subsection(Function Calls)
+In general, there is a very simple translation from SAL to Lisp syntax
+and back. A function call is SAL, for example,
+@begin(example)
+osc(g4, 2.0)
+@end(example)
+is translated to Lisp by moving the open parenthesis in front of the
+function name and removing the commas:
+@begin(example)
+(osc g4 2.0)
+@end(example)
+Similarly, if you want to translate a Lisp function call to SAL, just
+reverse the translation.
+
+@subsection(Symbols and Functions)
+SAL translates keywords with trailing colons (such as @code(foo:))
+into Lisp keywords with leading colons (such as @code(:foo)), but
+SAL keywords are not treated as expressions as they are in Lisp.
+You cannot write @code[open("myfile.txt", direction: output:)]
+because SAL expects an expression after direction. A special form
+@code(keyword) is defined to generate a Lisp keyword as an
+expression. The argument is the keyword @i(without) a colon, e.g.
+@code[open("myfile.txt", direction: keyword(output))]. Alternatively,
+you can write the Lisp-style keyword with the leading colon, e.g.
+@code[open("myfile.txt", direction: :output)].
+
+In Nyquist SAL, the hash character (#), can be used as a prefix to a
+Lisp function name. For example, the following command is not legal
+because @code(print) is a SAL command name, not a legal function name:
+@code[set v = append(print(a), print(b))]. (Here the intent is to print
+arguments to append). However, you can use the hash character to access
+the Lisp @code(print) function: @code[set v = append(#print(a), #print(b))].
+
+@subsection(Playing Tricks On the SAL Compiler)
+In many cases, the close coupling between SAL and XLISP gives SAL
+unexpected expressive power. A good example is @code(seqrep). This
+is a special looping construct in Nyquist, implemented as a macro in
+XLISP. In Lisp, you would write something like:
+@begin(example)
+(seqrep (i 10) (pluck c4))
+@end(example)
+One might expect SAL would have to define a special @code(seqrep)
+statement to express this, but since statements do not return values,
+this approach would be problematic. The solution (which is already
+fully implemented in Nyquist) is to define a
+new macro @code(sal-seqrep) that is equivalent to @code(seqrep)
+except that it is called as follows:
+@begin(example)
+(sal-seqrep i 10 (pluck c4))
+@end(example)
+The SAL compiler automatically translates the identifier @code(seqrep) to
+ @code(sal-seqrep). Now, in SAL, you can just write
+@begin(example)
+seqrep(i, 10, pluck(c4))
+@end(example)
+which is translated in a pretty much semantics-unaware fashion to
+@begin(example)
+(sal-seqrep i 10 (pluck c4))
+@end(example)
+and viola!, we have Nyquist control constructs in SAL even though SAL
+is completely unaware that @code(seqrep) is actually a special form.
+
+@chapter(Nyquist Functions)
+@label(lisp-chap)
+This chapter provides a language reference for Nyquist. Operations
+are categorized by functionality and abstraction level.
+Nyquist is implemented in two important levels: the ``high level'' supports
+behavioral abstraction, which means that operations like @code(stretch) and
+@code(at) can be applied. These functions are the ones that typical users
+are expected to use, and most of these functions are written in XLISP.
+
+The ``low-level'' primitives directly operate on sounds, but know nothing of
+environmental variables (such as @code(*warp*), etc.). The
+names of most of these low-level functions start with ``@code(snd-)''. In
+general, programmers should avoid any function with the ``@code(snd-)''
+prefix. Instead, use the ``high-level'' functions, which know about the
+environment and react appropriately. The names of high-level functions
+do not have prefixes like the low-level functions.
+
+There are certain low-level operations that apply directly to sounds (as
+opposed to behaviors) and are relatively ``safe'' for ordinary use. These
+are marked as such.
+
+Nyquist uses both linear frequency and equal-temperament pitch numbers to
+specify repetition rates. Frequency is always specified in either cycles
+per second (hz), or pitch numbers, also referred to as ``steps,'' as in
+steps of the chromatic scale. Steps are floating point numbers such that 60
+= Middle C, 61 = C#, 61.23 is C# plus 23 cents, etc. The mapping from pitch
+number to frequency is the standard exponential conversion, and fractional
+pitch numbers are allowed:
+@pragma(startscribe)
+@math[frequency = 440 @mult 2@+{(pitch - 69)/12}].
+@pragma(endscribe)
+@html[@center{frequency = 440 * 2^((pitch - 69)/12)}]
+There are many
+predefined pitch names. By default these are tuned in equal temperament,
+with A4 = 440Hz, but these may be changed. (See Section @ref(constants-sec)).
+
+@section(Sounds)@index(Sounds)
+A sound is a primitive data type in Nyquist. Sounds can be created, passed
+as parameters, garbage collected, printed, and set to variables just like
+strings, atoms, numbers, and other data types.
+
+@subsection(What is a Sound?)
+Sounds have 5 components:
+@begin(itemize)
+@code(srate@index(srate)) @itemsep the sample rate of the sound.
+
+@code(samples@index(samples)) @itemsep the samples.
+
+@code(signal-start@index(signal-start)) @itemsep the time of the first sample.
+
+@code(signal-stop@index(signal-stop)) @itemsep the time of one past the last sample.
+
+@code(logical-stop@index(logical-stop)) @itemsep the time at which the sound logically ends, e.g. a
+sound may end at the beginning of a decay. This value defaults
+to @code(signal-stop),
+but may be set to any value.
+@end(itemize)
+It may seem that there should be @code(logical-start) to indicate the
+logical or perceptual beginning of a sound as well as a @code(logical-stop)
+to indicate the logical ending of a sound. In practice, only
+@code(logical-stop) is needed; this attribute tells when the next sound
+should begin to form a sequence of sounds. In this respect, Nyquist sounds
+are asymmetric: it is possible to compute sequences forward in time by
+aligning the logical start of each sound with the @code(logical-stop) of the
+previous one, but one cannot compute ``backwards'', aligning the logical end
+of each sound with the logical start of its successor. The root of this
+asymmetry is the fact that when we invoke a behavior, we say when to start,
+and the result of the behavior tells us its logical duration. There is no
+way to invoke a behavior with a direct specification of when to
+stop@foot(Most behaviors will stop at time 1, warped according to @code(*warp*) to some real time, but this is by convention and is not a direct specification.).
+
+@p(Note:) there is no way to enforce the
+intended ``perceptual'' interpretation of
+@code(logical-stop). As far as Nyquist is concerned, these are just numbers to
+guide the alignment of sounds within various control constructs.
+
+@subsection(Multichannel Sounds)
+@index(Multichannel Sounds)
+Multichannel sounds are represented by Lisp arrays of sounds. To create an
+array of sounds the XLISP @code(vector) function is useful. Most low-level
+Nyquist functions (the ones starting with @code(snd-)) do not operate on
+multichannel sounds. Most high-level functions do operate on multichannel
+sounds.
+
+@subsection(Accessing and Creating Sound)
+@label(flatten-sec)
+@label(snd-srate-sec)
+
+Several functions display information concerning a sound and can be used to
+query the components of a sound. There are functions that access samples in
+a sound and functions that construct sounds from samples.
+
+@begin(fndefs)
+@codef[sref(@pragma(defn)@index(sref)@indexSecondary(primary="sound",
+secondary="accessing point")@i(sound), @i(time))]@\Accesses @i(sound) at
+the point @i(time), which is a local time. If @i(time) does not
+correspond to a sample time, then the nearest samples are linearly
+interpolated to form the result. To access a particular sample, either
+convert the sound to an array (see @code(snd-samples) below), or use
+@code(snd-srate) and @code(snd-t0) (see below) to find the sample rate
+and starting time, and compute a time (@i(t)) from the sample number (@i(n)):
+@pragma(startscribe)
+@begin(math)
+t = (n / srate) + t0
+@end(math)
+@pragma(endscribe)
+@html[<blockquote>t = (n / srate) + t0</blockquote>]
+Thus, the lisp code to access the n@+(th) sample of a sound would look like:
+@begin(code)
+(sref sound (global-to-local (+ (/ n (snd-srate sound)) (snd-t0 sound))))
+@end(code)
+Here is why @code(sref) interprets its time argument as a local time:
+@begin(example)
+> (sref (ramp 1) 0.5) @i(; evaluate a ramp at time 0.5)
+0.5
+> (at 2.0 (sref (ramp 1) 0.5)) @i(; ramp is shifted to start at 2.0)
+ @i(; the time, 0.5, is shifted to 2.5)
+0.5
+@end(example)
+If you were to use @code(snd-sref), which treats time as global, instead of @code(sref), which treats time as local, then the first example above would return the same answer (0.5), but the second example would return 0. Why? Because the @code[(ramp 1)] behavior would be shifted to start at time 2.0, but the resulting sound would be evaluated at global time 0.5. By definition, sounds have a value of zero before their start time.
+
+@codef[sref-inverse(@pragma(defn)@index(sref-inverse)@i(sound), @i(value))]@\Search @i(sound) for the first point at which it achieves @i(value) and return the corresponding (linearly interpolated) time. If no inverse exists, an error is raised. This function is used by Nyquist in the implementation of time warping.
+
+@label(snd-from-array-sec)
+@codef[snd-from-array(@IndexSecondary(primary="sound",
+ secondary = "creating from array")@pragma(defn)@index(snd-from-array)@i(t0), @i(sr),
+@i(array))]@\Converts a lisp array of @code(FLONUM)s into a sound with starting
+time @i(t0) and sample rate @i(sr). Safe for ordinary use. Be aware that
+arrays of floating-point samples use 14 bytes per sample, and an additional
+4 bytes per sample are allocated by this function to create a sound type.
+
+@codef[snd-fromarraystream(@pragma(defn)@index(snd-fromarraystream)@i(t0), @i(sr), @i(object))]@\Creates a sound for which samples come from
+@i(object). The starting time is @i(t0) (a @code(FLONUM)), and the sample rate is
+@i(sr). The @i(object) is an XLISP object (see Section @ref(objects-sec) for
+information on objects.) A sound is returned. When the sound needs samples,
+they are generated by sending the message @code(:next) to @i(object). If
+@i(object) returns @code(NIL), the sound terminates. Otherwise, @i(object)
+must return an array of @code(FLONUM)s. The values in these arrays are
+concatenated to form the samples of the resulting sound.
+There is no provision for @i(object) to specify the
+logical stop time of the sound, so the logical stop time is the termination
+time.
+
+@codef[snd-fromobject(@pragma(defn)@index(snd-fromobject)@index(sound from Lisp data)@i(t0), @i(sr), @i(object))]@\Creates a sound for which samples come from
+@i(object). The starting time is @i(t0) (a @code(FLONUM)), and the sample rate is
+@i(sr). The @i(object) is an XLISP object (see Section @ref(objects-sec) for
+information on objects. A sound is returned. When the sound needs samples,
+they are generated by sending the message @code(:next) to @i(object). If
+@i(object) returns @code(NIL), the sound terminates. Otherwise, @i(object)
+must return a @code(FLONUM). There is no provision for @i(object) to specify the
+logical stop time of the sound, so the logical stop time is the termination
+time.
+
+@codef[snd-extent(@pragma(defn)@index(snd-extent)@i(sound), @i(maxsamples))]@\Returns a list of two numbers: the starting time of @i(sound) and the terminate time of @i(sound). Finding the terminate time requires that samples be computed. Like most Nyquist functions, this is non-destructive, so memory will be allocated to preserve the sound samples. If the sound is very long or infinite, this may exhaust all memory, so the @i(maxsamples) parameter specifies a limit on how many samples to compute. If this limit is reached, the terminate time will be (incorrectly) based on the sound having @i(maxsamples) samples. This function is safe for ordinary use.
+
+@codef[snd-fetch(@index(access samples)@index(samples,
+reading)@pragma(defn)@index(snd-fetch)@index(read samples)@i(sound))]@\Reads samples
+sequentially from @i(sound). This returns a @code(FLONUM) after each call, or
+@code(NIL) when @i(sound) terminates. @p(Note:) @code(snd-fetch) modifies
+@i(sound); it is strongly recommended to copy @i(sound) using
+@code(snd-copy) and access only the copy with @code(snd-fetch).
+
+@codef[snd-fetch-array(@pragma(defn)@index(snd-fetch-array)@i(sound), @i(len),
+@i(step))]@\Reads sequential arrays of samples from @i(sound), returning
+either an array of @code(FLONUM)s or @code(NIL) when the sound terminates. The
+@i(len) parameter, a @code(FIXNUM), indicates how many samples should be returned
+in the result array. After the array is returned, @i(sound) is modified by
+skipping over @i(step) (a @code(FIXNUM)) samples. If @i(step) equals @i(len), then
+every sample is returned once. If @i(step) is less than @i(len), each
+returned array will overlap the previous one, so some samples will be
+returned more than once. If @i(step) is greater than @i(len), then some
+samples will be skipped and not returned in any array. The @i(step)
+and @i(len) may change at each call, but in the current implementation, an
+internal buffer is allocated for @i(sound) on the first call, so subsequent
+calls may not specify a greater @i(len) than the first. @p(Note:)
+@code(snd-fetch-array) modifies
+@i(sound); it is strongly recommended to copy @i(sound) using
+@code(snd-copy) and access only the copy with @code(snd-fetch-array).
+
+@codef[snd-flatten(@pragma(defn)@index(snd-flatten)@i(sound), @i(maxlen))]@\This function is identical
+to @code(snd-length). You would use this function to force samples to be computed in memory. Normally, this is not a good thing to do, but here is one appropriate use: In the case of sounds intended for wavetables, the unevaluated
+sound may be larger than the evaluated (and typically short) one.
+Calling @code(snd-flatten) will compute the samples and allow the unit generators to be freed in the next garbage collection. @p(Note:) If a sound is computed from many instances of table-lookup oscillators, calling @code(snd-flatten) will free the oscillators and their tables. Calling @code[(stats)] will print how many total bytes have been allocated to tables.
+
+ @codef[snd-length(@pragma(defn)@index(snd-length)@i(sound), @i(maxlen))]@\Counts the
+number of samples in @i(sound) up to the physical stop time. If the sound
+has more than @i(maxlen) samples, @i(maxlen) is returned. Calling this
+function will cause all samples of the sound to be computed and saved in
+memory (about 4 bytes per sample). Otherwise, this function is safe for ordinary use.
+
+ @codef[snd-maxsamp(@pragma(defn)@index(snd-maxsamp)@i(sound))]@\Computes the maximum of
+the absolute value of the samples in @i(sound). Calling this function will
+cause samples to be computed and saved in memory. (This function should
+have a @i(maxlen) parameter to allow self-defense against sounds that would
+exhaust available memory.) Otherwise, this function is safe for ordinary use.
+This function will probably be removed in a future version. See @code(peak), a replacement (@pragma(startref) page @pageref(peak-sec)).
+
+
+ @codef[snd-play(@pragma(defn)@index(snd-play)@i(expression))]@\Evaluates @i(expression)
+to obtain a sound or array of sounds, computes all of the samples (without
+retaining them in memory), and returns. Originally, this was a placeholder
+for a facility to play samples directly to an audio output device, but
+playback is now accomplished by @code(s-save).
+Meanwhile, since this
+function does not save samples in memory or write them to a disk, it is
+useful in determining how much time is spent calculating samples. See
+@code(s-save) (Section @ref(s-save-sec)) for saving samples to a file, and
+ @code(play) (Section @ref(play-sec)) to play a sound. This function is
+safe for ordinary use.
+
+@codef[snd-print-tree(@pragma(defn)@index(snd-print-tree)@i(sound))]@\Prints an ascii
+representation of the internal data structures representing a sound. This
+is useful for debugging Nyquist. This function is
+safe for ordinary use.
+
+ @codef[snd-samples(@index(samples)@pragma(defn)@index(snd-samples)@index(array from sound)@index(convert sound to array)@i(sound), @i(limit))]@\Converts the
+samples into a lisp array. The data is taken directly from the samples,
+ignoring shifts. For example, if the sound starts at 3.0 seconds, the first
+sample will refer to time 3.0, not time 0.0. A maximum of @i(limit) samples
+is returned. This function is safe for ordinary use, but like
+@code(snd-from-array), it requires a total of slightly over 18 bytes per
+sample.
+
+ @codef[snd-srate(@pragma(defn)@index(snd-srate)@i(sound))]@\Returns the sample rate of
+the sound. Safe for ordinary use.
+
+@begin(comment)
+ @codef[snd-show(@pragma(defn)@index(snd-show)@i(sound))]@\Print the entire (internal)
+structure of the sound for debugging. Safe for ordinary use.
+@end(comment)
+
+@codef[snd-time(@pragma(defn)@index(snd-time)@i(sound))]@\Returns the start time of the
+sound. This will probably go away in a future version, so use @code(snd-t0)
+instead.
+
+@codef[snd-t0(@pragma(defn)@index(snd-t0)@i(sound))]@\Returns the time of the
+first sample of the sound. Note that Nyquist operators such as add always
+copy the sound and are allowed to shift the copy up to one half sample
+period in either direction to align the samples of two operands. Safe for
+ordinary use.
+
+@codef[snd-print(@pragma(defn)@index(snd-print)@i(expression), @i(maxlen))]@\Evaluates
+@i(expression) to yield a sound or an array of sounds, then prints up to
+@i(maxlen) samples to the screen (stdout). This is similar to
+@code(snd-save), but samples appear in text on the screen instead of in
+binary in a file. This function is intended for debugging@index(debugging).
+Safe for ordinary use.
+
+ @codef[snd-set-logical-stop(@pragma(defn)@index(snd-set-logical-stop)@i(sound),
+@i(time))]@\Returns a sound which is
+@i(sound), except that the logical stop of the sound occurs at @i(time).
+ @p(Note:) do not call this function. When defining a behavior, use
+@code(set-logical-stop) or @code(set-logical-stop-abs) instead.
+
+@codef[snd-sref(@pragma(defn)@index(snd-sref)@i(sound), @i(time))]@\Evaluates @i(sound)
+at the global time given by @i(time). Safe for ordinary use, but normally, you should
+call @code(sref) instead.
+
+ @codef[snd-stop-time(@pragma(defn)@index(snd-stop-time)@i(sound))]@\Returns the stop time of @i(sound).
+Sounds can be ``clipped'' or truncated at a particular time. This function
+returns that time or MAX-STOP-TIME if he programmer has not specified a stop
+time for the sound. Safe for ordinary use.
+
+@codef[soundp(@pragma(defn)@index(soundp)@i(sound))]@\Returns true iff @i(sound) is a
+SOUND. Safe for ordinary use.
+
+@codef[stats(@pragma(defn)@index(stats)@index(memory usage)@index(table memory))]@\Prints the memory usage status. See also the
+XLISP @code(mem) function. Safe for ordinary use. This is the only way to find out how much memory is being used by table-lookup oscillator instances.
+
+@end(fndefs)
+
+@subsection(Miscellaneous Functions)
+These are all safe and recommended for ordinary use.
+
+@begin(fndefs)
+@codef[db-to-linear(@pragma(defn)@index(db-to-linear)@i(x))]@\Returns the conversion of @i(x) from decibels to linear. 0dB is converted to 1. 20dB represents a linear factor of 10. If @i(x) is a sound, each sample is converted and a sound is returned. If @i(x) is a multichannel sound, each channel is converted and a multichannel sound (array) is returned. @p(Note:) With sounds, conversion is only performed on actual samples, not on the implicit zeros before the beginning and after the termination of the sound. Sample rates, start times, etc. are taken from @i(x).
+
+@codef[follow(@pragma(defn)@index(follow)@index(envelope follower)@index(compressor)@index(limiter)@i(sound), @i(floor), @i(risetime), @i(falltime), @i(lookahead))]@\An envelope follower intended as a commponent for compressor and limiter functions. The basic goal of this function is to generate a smooth signal
+that rides on the peaks of the input signal. The usual objective is to
+produce an amplitude envelope given a low-sample rate (control rate)
+signal representing local RMS measurements. The first argument is the
+input signal. The @i(floor) is the minimum output value. The @i(risetime)
+is the time (in seconds) it takes for the output to rise (exponentially)
+from @i(floor) to unity (1.0) and the @i(falltime) is the time it takes
+for the output to fall (exponentially) from unity to @i(floor). The
+algorithm looks ahead for peaks and will begin to increase the output
+signal according to @i(risetime) in anticipation of a peak. The amount
+of anticipation (in seconds) is given by @i(lookahead). The algorithm
+is as follows: the output value is allowed to increase according to
+@i(risetime) or decrease according to @i(falltime). If the next input
+sample is in this range, that sample is simply output as the next output
+sample. If the next input sample is too large, the algorithm goes back in
+time as far as necessary to compute an envelope that rises according to
+@i(risetime) to meet the new value. The algorithm will only work backward
+as far as @i(lookahead). If that is not far enough, then there is a final
+forward pass computing a rising signal from the earliest output sample. In
+this case, the output signal will be at least momentarily less than the
+input signal and will continue to rise exponentially until it intersects
+the input signal. If the input signal falls faster than indicated by
+@i(falltime), the output fall rate will be limited by @i(falltime),
+and the fall in output will stop when the output reaches @i(floor).
+This algorithm can make two passes througth the buffer on sharply rising
+inputs, so it is not particularly fast. With short buffers and low sample
+rates this should not matter. See @code(snd-avg) for a function that
+can help to generate a low-sample-rate input for @code(follow).
+See @code(snd-chase) in Section @ref(snd-chase-sec) for a related filter.
+
+@label(gate-sec)
+@codef[gate(@pragma(defn)@index(gate)@index(noise-gate)@i(sound),
+@i(lookahead), @i(risetime), @i(falltime), @i(floor),
+@i(threshold))]@\Generate an exponential rise and decay intended
+for noise gate implementation. The decay starts when the signal drops
+below @i(threshold) and stays there for longer than @i(lookahead) (a
+@code(FLONUM) in seconds). (The signal begins to drop when the signal
+crosses @i(threshold), not after @i(lookahead).) Decay continues until
+the value reaches @i(floor) (a @code(FLONUM)), at which point the decay
+stops and the output value is held constant. Either during the decay or
+after the floor is reached, if the signal goes above @i(threshold), then
+the ouptut value will rise to unity (1.0) at the point the signal crosses
+the threshold. Because of internal lookahead, the signal actually begins
+to rise before the signal crosses @i(threshold). The rise is a
+constant-rate exponential and set so that a rise from @i(floor) to unity
+occurs in @i(risetime). Similary, the fall is a constant-rate exponential
+such that a fall from unity to @i(floor) takes @i(falltime).
+
+@codef[hz-to-step(@pragma(defn)@index(hz-to-step)@i(freq))]@\Returns a step number for @i(freq) (in hz), which can be either a number of a @code(SOUND). The result has the same type as the argument. See also @code(step-to-hz) (below).
+
+@codef[linear-to-db(@pragma(defn)@index(linear-to-db)@i(x))]@\Returns the conversion of @i(x) from linear to decibels. 1 is converted to 0. 0 is converted to -INF (a special IEEE floating point value.) A factor of 10 represents a 20dB change. If @i(x) is a sound, each sample is converted and a sound is returned. If @i(x) is a multichannel sound, each channel is converted and a multichannel sound (array) is returned. @p(Note:) With sounds, conversion is only performed on actual samples, not on the implicit zeros before the beginning and after the termination of the sound. Start times, sample rates, etc. are taken from @i(x).
+
+@codef[log(@index(log function)@pragma(defn)@index(log)@i(x))]@\Calculates the natural log of @i(x) (a @code(FLONUM)). (See @code(s-log) for a version that operates on signals.)
+
+@codef[set-control-srate(@pragma(defn)@index(set-control-srate)@index(sampling rate)@i(rate))]@\Sets the default sampling rate for control signals to @i(rate) by setting @code(*default-control-srate*) and reinitializing the environment. Do not call this within any synthesis function (see the @code(control-srate-abs) transformation, Section @ref(control-srate-abs-sec)).
+
+@codef[set-sound-srate(@pragma(defn)@index(set-sound-srate)@index(sampling rate)@i(rate))]@\Sets the default sampling rate for audio signals to @i(rate) by setting @code(*default-sound-srate*) and reinitializing the environment. Do not call this within any synthesis function (see the @code(sound-srate-abs) transformation, Section @ref(sound-srate-abs-sec)).
+
+@codef[set-pitch-names(@pragma(defn)@index(set-pitch-names))]@\Initializes pitch variables (@code(c0), @code(cs0), @code(df0), @code(d0), ... @code(b0), @code(c1), ... @code(b7)). A440 (the default tuning) is represented by the step 69.0, so the variable @code(a4) (fourth octave A) is set to 69.0. You can change the tuning by setting @code(*A4-Hertz*)@index(tuning)@index(A440)@index(*A4-Hertz*) to a value (in Hertz) and calling @code(set-pitch-names) to reinitialize the pitch variables. Note that this will result in non-integer step values. It does not alter the mapping from step values to frequency. There is no built-in provision for stretched scales or non-equal temperament, although users can write or compute any desired fractional step values.
+
+ @codef[step-to-hz(@pragma(defn)@index(step-to-hz)@i(pitch))]@\Returns a frequency in hz
+for @i(pitch), a step number or a @code(SOUND) type representing a time-varying step number. The result is a @code(FLONUM) if @i(pitch) is a number, and a @code(SOUND) if @i(pitch) is a @code(SOUND). See also @code(hz-to-step) (above).
+
+
+@codef{get-duration(@pragma(defn)@index(get-duration)@i(dur))}@\Gets the actual duration of of something starting at a local time of 0 and ending at a local time of @i(dur) times the current sustain. For convenience, @code(*rslt*) is set to the global time corresponding to local time zero.
+
+@codef{get-loud(@pragma(defn)@index(get-loud))}@\Gets the current value of the @code(*loud*) environment variable. If @code(*loud*) is a signal, it is evaluated at local time 0 and a number (@code(FLONUM)) is returned.
+
+@codef{get-sustain(@pragma(defn)@index(get-sustain))}@\Gets the current value of the @code(*sustain*) environment variable. If @code(*sustain*) is a signal, it is evaluated at local time 0 and a number (@code(FLONUM)) is returned.
+
+@codef{get-transpose(@pragma(defn)@index(get-transpose))}@\Gets the current value of the @code(*transpose*) environment variable. If @code(*transpose*) is a signal, it is evaluated at local time 0 and a number (@code(FLONUM)) is returned.
+
+@codef{get-warp(@pragma(defn)@index(get-warp))}@\Gets a function corresponding to the current value of the @code(*warp*) environment variable. For efficiency, @code(*warp*) is stored in three parts representing a shift, a scale factor, and a continuous warp function. @code(Get-warp) is used to retrieve a signal that maps logical time to real time. This signal combines the information of all three components of @code(*warp*) into a single signal. If the continuous warp function component is not present (indicating that the time warp is a simple combination of @code(at) and @code(stretch) transformations), an error is raised. This function is mainly for internal system use. In the future, @code(get-warp) will probably be reimplemented to always return a signal and never raise an error.
+
+@codef{local-to-global(@pragma(defn)@index(local-to-global)@i(local-time))}@\Converts a score (local) time to a real (global) time according to the current environment.
+
+@codef{osc-enable(@pragma(defn)@index(osc-enable)@index(osc)@index(open sound control)@i(flag))}@\Enable or disable Open Sound Control.
+(See Appendix @ref(osc-app).)
+Enabling creates a socket and a service that listens for UDP
+packets on port 7770. Currently, only two messages are accepted
+by Nyquist. The first is of the form @code(/slider)
+with an integer index and a floating point value. These set internal
+slider values accessed by the @code(snd-slider)
+function. The second is of the form @code(/wii/orientation) with
+two floating point values. This message is a special case to
+support the DarwiinRemoteOsc@index(DarwiinRemoteOsc) program
+ which can relay data from
+a Nintendo@index(Nintendo WiiMote) WiiMote@index(Wii Controller)
+ device to Nyquist via OSC. The two orientation
+values control sliders 0 and 1.
+Disabling terminates the service (polling for messages)
+and closes the socket. The @i(previous) state of enablement
+is returned, e.g. if OSC is enabled and @i(flag) is @i(nil),
+OSC is disabled and @code(T) (true) is returned because OSC
+was enabled at the time of the call. This function only exists
+if Nyquist is compiled with the compiler flag @code(OSC).
+Otherwise, the function
+exists but always returns the symbol @code(DISABLED). Consider
+lowering the audio latency using @code(snd-set-latency).
+@i(Warning:) there is the potential for
+network-based attacks using OSC. It is tempting to add the
+ability to evaluate XLISP expressions sent via OSC, but
+this would create
+unlimited and unprotected access to OSC clients. For now,
+it is unlikely that an attacker could do more than
+manipulate slider values.
+
+@codef{snd-set-latency(@index(latency)@pragma(defn)@index(snd-set-latency)@i(latency))}@\Set the latency requested when Nyquist plays sound to
+ @i(latency), a @code(FLONUM). The previous value is returned. The default is 0.3 seconds. To avoid glitches, the latency should be
+greater than the time required for garbage collection and message printing and any other system activity external to Nyquist.
+@end(fndefs)
+
+@section(Behaviors)@index(Behaviors)
+@label(behavior-sec)
+
+@subsection(Using Previously Created Sounds)
+@label(use-sounds-sec)
+These behaviors take a sound and transform that sound according to the
+environment. These are useful when writing code to make
+a high-level function from a low-level function, or when cuing sounds
+which were previously created:
+@begin(fndefs)
+@codef[cue(@pragma(defn)@index(cue)@i(sound))]@\Applies @code(*loud*), the starting time from @code(*warp*), @code(*start*),
+ and @code(*stop*) to @i(sound).
+
+@codef[cue-file(@pragma(defn)@index(cue-file)@i(filename))]@\Same as @code(cue), except
+the sound comes from the named file, samples from which are coerced to the current default @code(*sound-srate*) sample rate.
+
+@codef[sound(@pragma(defn)@index(sound)@i(sound))]@\Applies @code(*loud*), @code(*warp*),
+@code(*start*), and @code(*stop*) to @i(sound).
+
+@codef[control(@pragma(defn)@index(control)@i(sound))]@\This function is identical to
+@code(sound), but by convention is used when @i(sound) is a control signal
+rather than an audio signal.
+@end(fndefs)
+
+@subsection(Sound Synthesis)
+
+These functions provide musically interesting creation behaviors that
+react to their environment; these are the ``unit generators'' of Nyquist:
+
+@begin(fndefs)
+@codef{const(@pragma(defn)@index(const)@index(constant function)@i(value)[ ,@i(duration)])}@\Creates a constant function at the @code(*control-srate*). Every sample has the given @i(value), and the default @i(duration) is 1.0. See also @code(s-rest), which is equivalent to calling @code(const) with zero, and note that you can pass scalar constants (numbers) to @code(sim), @code(sum), and @code(mult) where they are handled more efficiently than constant functions.
+
+@codef{env(@pragma(defn)@index(env)@i(t@-[1]), @i(t@-[2]), @i(t@-[4]), @i(l@-[1]), @i(l@-[2]), @i(l@-[3]),
+[@i(dur)])}@\Creates a 4-phase envelope.
+@i(t@-[@i(i)]) is the duration of phase @i(i), and @i(l@-[@i(i)])
+is the final level of phase @i(i). @i(t@-[3]) is implied by the duration
+@i(dur), and @i(l@-[4]) is @code(0.0). If @i(dur) is not supplied, then
+@code(1.0) is assumed. The envelope duration is the product of @i(dur),
+@code(*stretch*), and @code(*sustain*). If
+@i(t@-[1]) + @i(t@-[2]) + 2ms + @i(t@-[4]) is greater than the envelope
+duration, then a two-phase envelope is
+substituted that has an attack/release time ratio of @i(t@-[1])/@i(t@-[4]).
+The sample rate of the returned sound is @code(*control-srate*). (See
+@code(pwl) for a more general piece-wise linear function generator.)
+The effect of time warping is to warp the starting time and ending time.
+The intermediate breakpoints are then computed as described above.
+
+
+@codef{exp-dec(@pragma(defn)@index(exp-dec)@index(exponential envelope)@i(hold), @i(halfdec), @i(length))}@\This convenient envelope shape is a special case of @code(pwev) (see Section @ref(pwev-sec)). The envelope starts at 1 and is constant for @i(hold) seconds. It then decays with a half life of @i(halfdec) seconds until @i(length). (The total duration is @i(length).) In other words, the amplitude falls by half each @i(halfdec) seconds. When stretched, this envelope scales linearly, which means the hold time increases and the half decay time increases.
+
+
+@label(force-srate-sec)
+@codef{force-srate(@pragma(defn)@index(force-srate)@index(sample rate, forcing)@index(resampling)@i(srate), @i(sound))}@\Returns a sound which is up- or
+down-sampled to @i(srate). Interpolation is linear, and no prefiltering is
+applied in the down-sample case, so aliasing may occur. See also
+@code(resample).
+
+
+@codef{lfo(@pragma(defn)@index(lfo)@index(low-frequency oscillator)@i(freq)[ ,@i(duration), @i(table), @i(phase)])}@\Just
+like @code(osc) (below)
+except this computes at the @code(*control-srate*) and frequency
+is specified in Hz. Phase is specified in degrees.
+ The @code(*transpose*) and @code(*sustain*) is not
+applied. The effect of time warping is to warp the starting and ending
+times. The signal itself will have a constant unwarped frequency.
+
+@codef{fmlfo(@pragma(defn)@index(fmlfo)@i(freq)[ ,@i(table), @i(phase)])}@\A low-frequency oscillator
+that computes at the @code(*control-srate*) using a sound to specify a time-varying
+frequency in Hz. Phase is a @code(FLONUM) in degrees. The duration of the result is determined by @i(freq).
+
+@codef{maketable(@pragma(defn)@index(maketable)@label(maketable)@i(sound))}@\Assumes that
+the samples in @i(sound) constitute one period of a wavetable, and returns a wavetable
+suitable for use as the @i(table) argument to the @code(osc) function (see
+below). Currently, tables are limited to 1,000,000 samples. This limit is the compile-time constant @code(max_table_len) set in @code(sound.h).
+
+@codef{build-harmonic(@pragma(defn)@index(build-harmonic)@index(harmonic)@i(n), @i(table-size))}@\Intended for
+constructing wavetables@index(wavetables)@index(waveforms), this function returns a sound of length @i(table-size)
+samples containing @i(n) periods of a sinusoid. These can be scaled and
+summed to form a waveform with the desired harmonic content. See @pragma(startref) page @pageref(build-harmonic-example) for an example.
+
+@codef{control-warp(@pragma(defn)@index(control-warp)@i(warp-fn), @i(signal), [@i(wrate)])}@\Applies a
+warp function @i(warp-fn) to @i(signal) using function composition. If @i(wrate) is omitted, linear
+interpolation is used. @i(warp-fn) is a mapping from score (logical) time
+to real time, and @i(signal) is a function from score time to real values.
+The result is a function from real time to real values at a sample rate of
+@code(*control-srate*). See @code(sound-warp) for an explanation of
+@i(wrate) and high-quality warping.
+
+@label(mult-sec)
+@codef{mult(@pragma(defn)@index(mult)@i(beh@-[1]), @i(beh@-[2]), ...)}@\Returns the product of
+behaviors. The arguments may also be numbers, in which case simple multiplication is performed. If a number and sound are mixed, the @code(scale) function is used to scale the sound by the number. When sounds are multiplied, the resulting sample rate is the maximum sample rate of the factors.
+
+@codef{prod(@pragma(defn)@index(prod)@i(beh@-[1]), @i(beh@-[2]), ...)}@\Same as @code(mult).
+
+@label(pan-sec)
+@codef{pan(@pragma(defn)@index(pan)@index(stereo panning)@i(sound), @i(where))}@\Pans @i(sound) (a behavior) according to @i(where) (another behavior or a number). @i(Sound) must be monophonic. @i(Where) may be a monophonic sound (e.g. @code[(ramp)] or simply a number (e.g. @code(0.5)). In either case, @i(where) should range from 0 to 1, where 0 means pan completely left, and 1 means pan completely right. For intermediate values, the sound to each channel is scaled linearly. Presently, @code(pan) does not check its arguments carefully.
+
+@codef{prod(@pragma(defn)@index(prod)@i(beh@-[1]), @i(beh@-[2]), ...)}@\Same as @code(mult).
+
+@label(resample-sec)
+@codef{resample(@pragma(defn)@index(resample)@i(sound), @i(srate))}@\Similar to @code(force-srate), except
+high-quality interpolation is used to prefilter and reconstruct the signal
+at the new sample rate. Also, the result is scaled by 0.95 to reduce problems with
+clipping. (See also @code(sound-warp).)
+
+@label(scale-sec)
+@codef{scale(@pragma(defn)@index(scale)@i(scale), @i(sound))}@\Scales the amplitude of @i(sound) by the factor @i(scale). Identical function to @code(snd-scale), except that it handles multichannel sounds. Sample rates, start times, etc. are taken from @i(sound).
+
+@codef{scale-db(@pragma(defn)@index(scale-db)@i(db), @i(sound))}@\Scales the amplitude of @i(sound) by the factor @i(db), expressed in decibels. Sample rates, start times, etc. are taken from @i(sound).
+
+@codef[scale-srate(@pragma(defn)@index(scale-srate)@i(sound), @i(scale))]@\Scales the sample rate of @i(sound) by @i(scale) factor. This has the effect of linearly shrinking or stretching time (the sound is not upsampled or downsampled). This is a special case of @code(snd-xform) (see Section @ref(snd-xform-sec)).
+
+@codef[shift-time(@pragma(defn)@index(shift-time)@i(sound), @i(shift))]@\Shift @i(sound)
+by @i(shift) seconds. If the sound is
+@pragma(startscribe)
+@math[f(t)], then the result is
+@pragma(endscribe)
+@html[f(t), then the result is]
+@pragma(startscribe)
+@math[f(t - shift)].
+@pragma(endscribe)
+@html[f(t - shift).]
+See Figure @ref(shift-time-fig). This is a special
+case of @code(snd-xform) (see Section @ref(snd-xform-sec)).
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 3 in, width = 4.5 in, magnify = 0.75,
+ postscript = "shifttimefig.ps"))
+@html(<img src="fig5.gif"><br><br>)
+@fillcaption(The @code(shift-time) function shifts a sound in time
+according to its @i(shift) argument.)
+@tag(shift-time-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{sound-warp(@pragma(defn)@index(sound-warp)@i(warp-fn), @i(signal)[ ,@i(wrate)])}@\Applies a
+warp function @i(warp-fn) to @i(signal) using function composition. If the optional parameter @i(wrate) is omitted or NIL, linear
+interpolation is used. Otherwise, high-quality sample interpolation is used, and the
+result is scaled by 0.95 to reduce problems with clipping (interpolated samples can
+exceed the peak values of the input samples.)
+@i(warp-fn) is a mapping from score (logical) time
+to real time, and @i(signal) is a function from score time to real values.
+The result is a function from real time to real values at a sample rate of @code(*sound-srate*).
+See also @code(control-warp).
+@blankspace(1)
+If @i(wrate) is not NIL, it must be a number. The parameter indicates that
+high-quality resampling should be used and specifies the sample rate for the
+inverse of @i(warp-fn). Use the lowest number you can.
+ (See below for details.) Note that high-quality resampling is
+much slower than linear interpolation.
+@blankspace(1)
+To perform high-quality resampling by a fixed ratio, as opposed to a
+variable ratio allowed in @code(sound-warp), use @code(scale-srate) to
+stretch or shrink the sound, and then @code(resample) to restore the
+original sample rate.
+@blankspace(1)
+@code(Sound-warp) and @code(control-warp) both take the inverse of
+@i(warp-fn) to get a function from real time to score time. Each sample
+of this inverse is thus a score time; @i(signal) is evaluated at each of
+these score times to yield a value, which is the desired result. The
+sample rate of the inverse warp function is somewhat arbitrary. With linear
+interpolation, the inverse warp function sample rate is taken to be the
+output sample rate. Note, however, that the samples of the inverse warp
+function are stored as 32-bit floats, so they have limited precision. Since
+these floats represent sample times, rounding can be a problem. Rounding
+in this case is equivalent to adding jitter to the sample times. Nyquist
+ignores this problem for ordinary warping, but for high-quality warping, the
+jitter cannot be ignored.
+@blankspace(1)
+The solution is to use a rather low sample rate
+for the inverse warp function. @code(Sound-warp) can then linearly
+interpolate this signal using double-precision floats to minimize jitter
+between samples. The sample rate is a compromise: a low sample rate
+minimizes jitter, while a high sample rate does a better job of capturing
+detail (e.g. rapid fluctuations) in the warp function. A good rule of thumb
+is to use at most 1,000 to 10,000 samples for the inverse warp function. For
+example, if the result will be 1 minute of sound, use a sample rate of
+3000 samples / 60 seconds = 50 samples/second. Because Nyquist has no
+advance information about the warp function, the inverse warp function
+sample rate must be provided as a parameter. When in doubt, just try
+something and let your ears be the judge.
+
+@codef[integrate(@pragma(defn)@index(integrate)@index(smooth)@i(signal))]@\Computes the integral of @i(signal). The start time, sample rate, etc. are taken from @i(signal).
+
+@codef[slope(@pragma(defn)@index(slope)@index(derivative)@index(first derivative)@i(signal))]@\Computes the first derivative (slope) of @i(signal). The start time, sample rate, etc. are taken from @i(signal).
+@end(fndefs)
+
+@paragraph(Oscillators)
+@label(osc-sec)
+@begin(fndefs)
+@codef{osc(@pragma(defn)@index(osc)@i(pitch)[, @i(duration), @i(table), @i(phase)])}@\Returns
+a sound which
+is the @i(table) oscillated at @i(pitch) for the given @i(duration),
+starting with the @i(phase) (in degrees).
+Defaults are: @i(duration) @code(1.0)
+(second), @i(table) @code(*table*),
+@i(phase) @code(0.0). The default value of @code(*table*) is a sinusoid. Duration is stretched by @code(*warp*) and
+@code(*sustain*), amplitude is nominally 1, but scaled by @code(*loudness*), the start time is logical time 0, transformed by @code(*warp*), and the sample rate is @code(*sound-srate*).
+The effect of time-warping is to warp the starting and ending times only; the
+signal has a constant unwarped frequency.
+ @p(Note 1:) @i(table) is a list of the form
+@begin(display)
+(@i(sound) @i(pitch-number) @i(periodic))
+@end(display)
+where the first element is a sound, the second is the pitch of the sound
+(this is not redundant, because the sound may represent any number of
+periods), and the third element is @code(T) if the sound is one period of
+a periodic signal, or @code(nil) if the sound is a sample that should not
+be looped. The maximum table size is set by @code(max_table_len) in @code(sound.h), and is currently set to 1,000,000.
+@p(Note 2:) in the current implementation, it is assumed that the
+output should be periodic. See @code(snd-down) and @code(snd-up) for resampling one-shot sounds to a desired sample rate. A future version of @code(osc)
+will handle both cases.
+@p(Note 3:) When @code(osc) is called, memory is allocated for the table, and samples are copied from the sound (the first element of the list which is the @i(table) parameter) to the memory. Every instance of @code(osc) has a private copy of the table, so the total storage can become large in some cases, for example in granular synthesis with many instances of @code(osc). In some cases, it may make sense to use @code(snd-flatten) (see Section @ref(flatten-sec)) to cause the sound to be fully realized, after which the @code(osc) and its table memory can be reclaimed by garbage collection. The @code(partial) function (see below) does not need a private table and does not use much space.
+
+@label(partial-sec)
+@codef{partial(@pragma(defn)@index(partial)@i(pitch), @i(env))}@\Returns a sinusoid at
+the indicated pitch; the sound is multiplied by @i(env). The start time and
+duration are taken from @i(env), which is of course subject to
+transformations. The sample rate is @code(*sound-srate*). The @code(partial)
+function is faster than @code(osc).
+
+@label(sine-sec)
+@codef{sine(@pragma(defn)@index(sine)@i(pitch)[ ,@i(duration)])}@\Returns a sinusoid at
+the indicated pitch. The sample rate is @code(*sound-srate*).
+This function is like @code(osc) with
+respect to transformations. The @code(sine) function is faster than
+@code(osc).
+
+@codef{hzosc(@pragma(defn)@index(hzosc)@i(hz)[ ,@i(table), @i(phase)])}@\Returns a sound which is the @i(table) oscillated at @i(hz) starting at @i(phase) degrees. The default @i(table) is @code(*table*) and the default @i(phase) is @i(0.0). The default duration is @code(1.0), but this is stretched as in @code(osc) (see above). The @i(hz) parameter may be a @code(SOUND), in which case the duration of the result is the duration of @i(hz). The sample rate is @code(*sound-srate*).
+
+@codef{osc-saw(@pragma(defn)@index(osc-saw)@index(sawtooth oscillator)@i(hz))}@\Returns a sawtooth waveshape at the indicated frequency (in Hertz). The sample rate is @code(*sound-srate*). The @i(hz) parameter may be a sound as in @i(hzosc) (see above).
+
+@codef{osc-tri(@pragma(defn)@index(osc-tri)@index(triangle oscillator)@i(hz))}@\Returns a triangle waveshape at the indicated frequency (in Hertz). The sample rate is @code(*sound-srate*). The @i(hz) parameter may be a sound as in @i(hzosc) (see above).
+
+@codef{osc-pulse(@pragma(defn)@index(osc-pulse)@index(square oscillator)@index(pulse oscillator)@index(pulse-width modulation)@i(hz), @i(bias)[ ,@i(compare-shape)])}@\Returns a square pulse with variable width at the indicated frequency (in Hertz). The @i(bias) parameter controls the pulse width and should be between @code(-1) and @code(+1), giving a pulse width from 0% (always at @code(-1)) to 100% (always at @code(+1)). When bias is zero, a square wave is generated. Bias may be a @code(SOUND) to create varying pulse width. If bias changes rapidly, strange effects may occur. The optional @i(compare-shape) defaults to a hard step at zero, but other shapes may be used to achieve non-square pulses. The @code(osc-pulse) behavior is written in terms of other behaviors and defined in the file @code(nyquist.lsp) using just a few lines of code. Read the code for the complete story.
+
+@label(amosc-sec)
+@codef{amosc(@pragma(defn)@index(amosc)@i(pitch), @i(modulation)[ ,@i(table),
+@i(phase)])}@\Returns a
+sound which is @i(table) oscillated at @i(pitch). The output
+is multiplied by @i(modulation)
+for the duration of the sound @i(modulation).
+@i(osc-table) defaults to
+@code(*table*), and @i(phase) is the starting phase (default 0.0 degrees)
+within @i(osc-table). The sample rate is @code(*sound-srate*).
+
+@label(fmosc-sec)
+@codef{fmosc(@pragma(defn)@index(fmosc)@i(pitch), @i(modulation)[, @i(table),
+@i(phase)])}@\Returns a
+sound which is @i(table) oscillated at @i(pitch) plus @i(modulation)
+for the duration of the sound @i(modulation).
+@i(osc-table) defaults to
+@code(*table*), and @i(phase) is the starting phase (default 0.0 degrees)
+within @i(osc-table). The @i(modulation)
+is expressed in hz, e.g. a sinusoid modulation signal with an
+amplitude of 1.0 (2.0 peak to peak), will cause a +/@subtract 1.0 hz
+frequency deviation in @i(sound). Negative frequencies are correctly
+handled. The sample rate is @code(*sound-srate*).
+
+@label(fmfb-sec)
+@codef{fmfb(@pragma(defn)@index(fmfb)@index(Feedback FM Oscillator)@i(pitch), @i(index)[ ,@i(dur)])}@\Returns
+a sound generated by feedback FM synthesis. The @i(pitch) parameter
+(given in the usual half-step units)
+controls the fundamental frequency. The @i(index) is the amount of
+feedback, which may be a @code(SOUND) or a @code(FLONUM). If @i(index) is
+a @code(FLONUM), @i(dur) must be provided (a @code(FLONUM)) to specify
+the duration. Otherwise, @i(dur) is ignored if present and the duration is
+determined by that of @i(index). The sample rate is @code(*sound-srate*).
+A sinusoid table is used.
+If @i(index) is below 1.1, this generates a sawtooth-like waveform.
+
+@label(buzz-sec)
+@codef{buzz(@pragma(defn)@index(buzz)@i(n), @i(pitch), @i(modulation))}@\Returns a
+sound with @i(n) harmonics of equal amplitude and a total amplitude
+of 1.0, using a well-known function of two cosines. If @i(n) (an integer)
+is less than 1, it is set to 1. Aliasing will occur if @i(n) is too large.
+The duration is
+determined by the duration of the sound @i(modulation), which is a
+frequency modulation term expressed in Hz (see Section @ref(fmosc-sec)).
+Negative frequencies are correctly handled.
+The sample rate is @code(*sound-srate*).
+
+@label(pluck-sec)
+@codef{pluck(@pragma(defn)@index(pluck)@index(Karplus-Strong)@index(string synthesis)
+@index(plucked string)@i(pitch)[ ,@i(duration)] [, @i(final-amplitude)])}@\Returns a sound at the
+given @i(pitch) created using a modified Karplus-Strong plucked string
+algorithm. The tone decays from an amplitude of about 1.0 to about
+@i(final-amplitude) in @i(duration) seconds. The default values are to
+decay to 0.001 (-60dB) in 1 second. The sample rate is @code(*sound-srate*).
+
+@label(siosc-sec)
+@codef{siosc(@pragma(defn)@index(siosc)@index(spectral interpolation)@i(pitch),
+@i(modulation), @i(tables))}@\Returns a sound constructed by
+interpolating through a succession of periodic waveforms. The frequency is
+given (in half steps) by @i(pitch) to which a @i(modulation) signal (in hz)
+is added, exactly as in @code(fmosc). The @i(tables) specify a list of
+waveforms as follows: (@i(table0) @i(time1) @i(table2) ... @i(timeN)
+@i(tableN)), where each @i(table) is a sound representing one period. Each
+@i(time) is a time interval measured from the starting time. The time is
+scaled by the nominal duration (computed using @code[(local-to-global
+(get-sustain))]) to get the actual time. Note that this implies linear
+stretching rather than continuous timewarping of the interpolation or the
+breakpoints. The waveform is @i(table0) at the starting time, @i(table1)
+after @i(time1) (scaled as described), and so on. The duration and logical
+stop time is given by @i(modulation). If @i(modulation) is shorter than
+@i(timeN), then the full sequence of waveforms is not used. If
+@i(modulation) is longer than @i(timeN), @i(tableN) is used after @i(timeN)
+without further interpolation.
+
+
+@label(sampler-sec)
+@codef{sampler(@pragma(defn)@index(sampler)@i(pitch), @i(modulation)[ ,@i(sample),
+@i(npoints)])}@\Returns a sound constructed by reading a sample from
+beginning to end and then splicing on copies of the same sound from
+a loop point to the end.
+The @i(pitch) and @i(modulation) parameters are used as in @code(fmosc)
+described above. The optional @i(sample) (which defaults to the global
+variable @code(*table*) is a list of the form
+@begin(display)
+(@i(sound) @i(pitch-number) @i(loop-start))
+@end(display)
+where the first element is a sound containing the sample, the second is the
+pitch of the sample, and the third element is the time of the loop point. If
+the loop point is not in the bounds of the sound, it is set to zero.
+The optional @i(npoints) specifies how many points should be used for sample
+interpolation. Currently this parameter defaults to 2 and only 2-point
+(linear) interpolation is implemented. It is an error to modulate such that the frequency
+is negative. Note also that the loop point may be fractional.
+The sample rate is @code(*sound-srate*).
+@end(fndefs)
+
+@paragraph(Piece-wise Approximations)
+@index(piece-wise)@index(approximation)@index(splines)
+There are a number of related behaviors for piece-wise approximations to functions. The simplest of these, @code(pwl) was mentioned earlier in the manual. It takes a list of breakpoints, assuming an initial point at (0, 0), and a final value of 0. An analogous piece-wise exponential function, @code(pwe), is provided. Its implicit starting and stopping values are 1 rather than 0. Each of these has variants. You can specify the initial and final values (instead of taking the default). You can specify time in intervals rather than cummulative time. Finally, you can pass a list rather than an argument list. This leads to 16 versions:
+@pragma(startscribe)
+@begin(display)
+@tabclear
+@tabset(0.4 inches, 0.8 inches, 1.2 inches)
+Piece-wise Linear Functions:
+@\Cummulative Time:
+@\@\Default initial point at (0, 0), final value at 0:
+@\@\@\@code(pwl)
+@\@\@\@code(pwl-list)
+@\@\Explicit initial value:
+@\@\@\@code(pwlv)
+@\@\@\@code(pwlv-list)
+@\Relative Time:
+@\@\Default initial point at (0, 0), final value at 0:
+@\@\@\@code(pwlr)
+@\@\@\@code(pwlr-list)
+@\@\Explicit initial value:
+@\@\@\@code(pwlvr)
+@\@\@\@code(pwlvr-list)
+Piece-wise Exponential Functions:
+@\Cummulative Time:
+@\@\Default initial point at (0, 1), final value at 1:
+@\@\@\@code(pwe)
+@\@\@\@code(pwe-list)
+@\@\Explicit initial value:
+@\@\@\@code(pwev)
+@\@\@\@code(pwev-list)
+@\Relative Time:
+@\@\Default initial point at (0, 1), final value at 1:
+@\@\@\@code(pwer)
+@\@\@\@code(pwer-list)
+@\@\Explicit initial value:
+@\@\@\@code(pwevr)
+@\@\@\@code(pwevr-list)
+@end(display)
+@pragma(endscribe)
+@html[<pre><b>Piece-wise Linear Functions:</b>
+ <i>Cummulative Time:</i>
+ <i>Default initial point at (0, 0), final value at 0:</i>
+ pwl
+ pwl-list
+ <i>Explicit initial value:</i>
+ pwlv
+ pwlv-list
+ <i>Relative Time:</i>
+ <i>Default initial point at (0, 0), final value at 0:</i>
+ pwlr
+ pwlr-list
+ <i>Explicit initial value:</i>
+ pwlvr
+ pwlvr-list
+
+<b>Piece-wise Exponential Functions:</b>
+ <i>Cummulative Time:</i>
+ <i>Default initial point at (0, 1), final value at 1:</i>
+ pwe
+ pwe-list
+ <i>Explicit initial value:</i>
+ pwev
+ pwev-list
+ <i>Relative Time:</i>
+ <i>Default initial point at (0, 1), final value at 1:</i>
+ pwer
+ pwer-list
+ <i>Explicit initial value:</i>
+ pwevr
+ pwevr-list
+</pre>]
+All of these functions are implemented in terms of @code(pwl) (see @code(nyquist.lsp) for the implementations. There are infinite opportunities for errors in these functions: if you leave off a data point, try to specify points in reverse order, try to create an exponential that goes to zero or negative values, or many other bad things, the behavior is not well-defined. Nyquist should not crash, but Nyquist does not necessarily attempt to report errors at this time.
+
+@begin(fndefs)
+@label(pwl-sec)
+@codef{pwl(@pragma(defn)@index(pwl)@i(t@-[1]), @i(l@-[1]), @i(t@-[2]), @i(l@-[2]), ... @i(t@-[n]))}@\Creates
+a piece-wise linear envelope with breakpoints at (0, 0), (@i(t@-[1]),
+@i(l@-[1])), (@i(t@-[2]), @i(l@-[2])), ... (@i(t@-[n]), 0). The breakpoint
+times are scaled linearly by the value of @code(*sustain*) (if
+@code(*sustain*) is a @code(SOUND), it is evaluated once at the starting
+time of the envelope). Each breakpoint time is then mapped according to
+@code(*warp*). The result is a linear interpolation (unwarped) between
+the breakpoints. The sample rate is @code(*control-srate*). Breakpoint
+times are quantized to the nearest sample time. If you specify one or more
+breakpoints withing one sample period, @code(pwl) attempts to give a good
+approximation to the specified function. In particular, if two breakpoints
+are simultaneous, @code(pwl) will move one of them to an adjacent sample,
+producing a steepest possible step in the signal. The exact details of this
+``breakpoint munging'' is subject to change in future versions. Please report
+any cases where breakpoint lists give unexpected behaviors. The author will
+try to apply the ``principle of least surprise'' to the design. Note that
+the times are relative to 0; they are not durations of each envelope
+segment.
+
+@codef{pwl-list(@pragma(defn)@index(pwl-list)@i(breakpoints))}@\If you have a list of
+breakpoints, you can use @code(apply) to apply the @code(pwl) function to
+the breakpoints, but if the list is very long (hundreds or thousands of
+points), you might get a stack overflow because XLISP has a fixed-size
+argument stack. Instead, call @code(pwl-list), passing one argument, the
+list of breakpoints.
+
+@codef{pwlv(@pragma(defn)@index(pwlv)@i(l@-[1]), @i(t@-[2]), @i(l@-[2]), @i(t@-[3]), @i(t@-[3]), ... @i(t@-[n]), @i(l@-[n]))}@\Creates
+a piece-wise linear envelope with breakpoints at (0, l@-[1]), (@i(t@-[2]), @i(l@-[2])), etc., ending with (@i(t@-[n], @i(l@-[n])). Otherwise, the behavior is like that of @code(pwl).
+
+@codef{pwlv-list(@pragma(defn)@index(pwlv-list)@i(breakpoints))}@\A version of @code(pwlv) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@codef{pwlr(@pragma(defn)@index(pwlr)@i(i@-[1]), @i(l@-[1]), @i(i@-[2]), @i(l@-[2]), ... @i(i@-[n]))}@\Creates
+a piece-wise linear envelope with breakpoints at (0, 0), (@i(t@-[1]),
+@i(l@-[1])), (@i(t@-[2]), @i(l@-[2])), ... (@i(t@-[n]), 0), where @i(t@-[j]) is the sum of @i(i@-[1]) through @i(i@-[j]). In other words, the breakpoint times are specified in terms of intervals rather than cummulative time. Otherwise, the behavior is like that of @code(pwl).
+
+@codef{pwlr-list(@pragma(defn)@index(pwlr-list)@i(breakpoints))}@\A version of @code(pwlr) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@codef{pwlvr(@pragma(defn)@index(pwlvr)@i(l@-[1]), @i(i@-[2]), @i(l@-[2]), @i(i@-[3]), @i(i@-[3]), ... @i(i@-[n]), @i(l@-[n]))}@\Creates
+a piece-wise linear envelope with breakpoints at (0, l@-[1]), (@i(t@-[2]), @i(l@-[2])), etc., ending with (@i(t@-[n], @i(l@-[n])), where @i(t@-[j]) is the sum of @i(i@-[2]) through @i(i@-[j]). In other words, the breakpoint times are specified in terms of intervals rather than cummulative time. Otherwise, the behavior is like that of @code(pwlv).
+
+@codef{pwlvr-list(@pragma(defn)@index(pwlvr-list)@i(breakpoints))}@\A version of @code(pwlvr) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@codef{pwe(@pragma(defn)@index(pwe)@i(t@-[1]), @i(l@-[1]), @i(t@-[2]), @i(l@-[2]), ...
+@i(t@-[n]))}@\Creates
+a piece-wise exponential envelope with breakpoints at (0, 1), (@i(t@-[1]),
+@i(l@-[1])), (@i(t@-[2]), @i(l@-[2])), ... (@i(t@-[n]), 1). Exponential segments means that the ratio of values from sample to sample is constant within the segment. (The current implementation actually takes the log of each value, computes a piece-wise exponential from the points using @code(pwl), then exponentiates each resulting sample. A faster implementation is certainly possible!) Breakpoint values (@i(l@-[j])) must be greater than zero. Otherwise, this function is similar to @code(pwl), including stretch by @code(*sustain*), mapping according to @code(*warp*), sample rate based on @code(*control-srate*), and "breakpoint munging" (see @code(pwl) described above). @i(Default initial and final values are of dubious value with exponentials. See @code(pwev) below for the function you are probably looking for.)
+
+@codef{pwe-list(@pragma(defn)@index(pwe-list)@i(breakpoints))}@\A version of @code(pwe) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@label(pwev-sec)
+@codef{pwev(@pragma(defn)@index(pwev)@i(l@-[1]), @i(t@-[2]), @i(l@-[2]), @i(t@-[3]), @i(t@-[3]), ... @i(t@-[n]), @i(l@-[n]))}@\Creates
+a piece-wise exponential envelope with breakpoints at (0, l@-[1]), (@i(t@-[2]), @i(l@-[2])), etc., ending with (@i(t@-[n], @i(l@-[n])). Otherwise, the behavior is like that of @code(pwe).
+
+@codef{pwev-list(@pragma(defn)@index(pwev-list)@i(breakpoints))}@\A version of @code(pwev) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@codef{pwer(@pragma(defn)@index(pwer)@i(i@-[1]), @i(l@-[1]), @i(i@-[2]), @i(l@-[2]), ... @i(i@-[n]))}@\Creates
+a piece-wise exponential envelope with breakpoints at (0, 1), (@i(t@-[1]),
+@i(l@-[1])), (@i(t@-[2]), @i(l@-[2])), ... (@i(t@-[n]), 1), where @i(t@-[j]) is the sum of @i(i@-[1]) through @i(i@-[j]). In other words, the breakpoint times are specified in terms of intervals rather than cummulative time. Otherwise, the behavior is like that of @code(pwe). Consider using @code(pwerv) instead of this one.
+
+@codef{pwer-list(@pragma(defn)@index(pwer-list)@i(breakpoints))}@\A version of @code(pwer) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@codef{pwevr(@index(GEN05)@pragma(defn)@index(pwevr)@i(l@-[1]), @i(i@-[2]), @i(l@-[2]), @i(i@-[3]), @i(i@-[3]), ... @i(i@-[n]), @i(l@-[n]))}@\Creates
+a piece-wise exponential envelope with breakpoints at (0, l@-[1]), (@i(t@-[2]), @i(l@-[2])), etc., ending with (@i(t@-[n], @i(l@-[n])), where @i(t@-[j]) is the sum of @i(i@-[2]) through @i(i@-[j]). In other words, the breakpoint times are specified in terms of intervals rather than cummulative time. Otherwise, the behavior is like that of @code(pwev). Note that this is similar to the csound GEN05 generator. Which is uglier, @i(GEN05) or @i(pwevr)?
+
+@codef{pwevr-list(@pragma(defn)@index(pwevr-list)@i(breakpoints))}@\A version of @code(pwevr) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+@end(fndefs)
+@paragraph(Filter Behaviors)
+@begin(fndefs)
+@label(alpass-sec)
+@codef{alpass(@index(all pass filter)@index(alpass filter)@pragma(defn)@index(alpass)@i(sound), @i(decay), @i(hz)[ ,@i(minhz)])}@\Applies an all-pass filter to @i(sound). This all-pass filter creates a delay effect without the resonances of a comb filter. The decay time of the filter is given by @i(decay). The @i(hz) parameter must be a number or sound greater than zero. It is used to compute delay, which is then rounded to the nearest integer number of samples (so the frequency is not always exact. Higher sampling rates yield better delay resolution.) The @i(decay) may be a sound or a number. In either case, it must also be positive. (Implementation note: an exponentiation is needed to convert @i(decay) into the @i(feedback) parameter, and exponentiation is typically more time-consuming than the filter operation itself. To get high performance, provide @i(decay) at a low sample rate.) The resulting sound will have the start time, sample rate, etc. of @i(sound). If @i(hz) is of type @code(SOUND), the delay may be time-varying. Linear interpolation is then used for fractional sample delay, but it should be noted that linear interpolation implies a low-pass transfer function. Thus, this filter may behave differently with a constant @code(SOUND) than it does with a @code(FLONUM) value for @i(hz). In addition, if @i(hz) is of type @code(SOUND), then @i(minhz) is required. The @i(hz) parameter will be clipped to be greater than @i(minhz), placing an upper bound on the delay buffer length.
+
+@label(comb-sec)
+@codef{comb(@pragma(defn)@index(comb)@index(comb filter)@i(sound), @i(decay), @i(hz))}@\Applies a comb filter to @i(sound). A comb filter emphasizes (resonates at) frequencies that are multiples of a @i(hz). The decay time of the resonance is given by @i(decay). This is a variation on @code(feedback-delay) (see below). The @i(hz) parameter must be a number greater than zero. It is used to compute delay, which is then rounded to the nearest integer number of samples (so the frequency is not always exact. Higher sampling rates yield better delay resolution.) The @i(decay) may be a sound or a number. In either case, it must also be positive. (Implementation note: an exponentiation is needed to convert @i(decay) into the @i(feedback) parameter for @code(feedback-delay), and exponentiation is typically more time-consuming than the filter operation itself. To get high performance, provide @i(decay) at a low sample rate.) The resulting sound will have the start time, sample rate, etc. of @i(sound).
+
+@label(congen-sec)
+@codef{congen(@pragma(defn)@index(congen)@index(contour generator)@index(envelope generator)@i(gate), @i(risetime), @i(falltime))}@\Implements an analog synthesizer-style contour generator. The input @i(gate) normally goes from 0.0 to 1.0 to create an attack and from 1.0 to 0.0 to start a release. During the attack (output is increasing), the output converges half-way to @i(gate) in @i(risetime) (a @code(FLONUM)) seconds. During the decay, the half-time is @i(falltime) seconds. The sample rate, start time, logical stop, and terminate time all come from @i(gate). If you want a nice decay, be sure that the @i(gate) goes to zero and stays there for awhile before @i(gate) terminates, because @code(congen) (and all Nyquist sounds) go immediately to zero at termination time. For example, you can use @code(pwl) to build a pulse followed by some zero time:
+@begin(example)
+(pwl 0 1 duty 1 duty 0 1)
+@end(example)
+Assuming @i(duty) is less than 1.0, this will be a pulse of duration @i(duty) followed by zero for a total duration of 1.0.
+@begin(example)
+(congen (pwl 0 1 duty 1 duty 0 1) 0.01 0.05)
+@end(example)
+will have a duration of 1.0 because that is the termination time of the @code(pwl) input. The decaying release of the resulting envelope will be truncated to zero at time 1.0. (Since the decay is theoretically infinite, there is no way to avoid truncation, although you could multiply by another envelope that smoothly truncates to zero in the last millisecond or two to get both an exponential decay and a smooth final transition to zero.)
+
+@label(convolve-sec)
+@codef{convolve(@pragma(defn)@index(convolve)@index(convolution)@index(FIR filter)@i(sound),
+@i(response))}@\Convolves two signals. The first can be any length, but the
+computation time per sample and the total space required are proportional to
+the length of @i(response).
+
+@label(feedback-delay-sec)
+@codef{feedback-delay(@pragma(defn)@index(feedback-delay)@index(delay)@index(echo)@i(sound), @i(delay), @i(feedback))}@\Applies feedback delay to @i(sound). The @i(delay) must be a number (in seconds). It is rounded to the nearest sample to determine the length of the delay. The sample rate is the maximum from @i(sound) and @i(feedback) (if feedback is also a sound). The amound of @i(feedback) should be less than one to avoid an exponential increase in amplitude. The start time and stop time, and logical stop time are taken from @i(sound). Since output is truncated at the stop time of @i(sound), you may want to append some silence to @i(sound) to give the filter time to decay.
+
+@label(lp-sec)
+@codef{lp(@pragma(defn)@index(lp)@index(low-pass filter)@i(sound), @i(cutoff))}@\Filters @i(sound)
+using a first-order Butterworth low-pass filter. @i(Cutoff) may be a float
+or a signal (for time-varying filtering) and expresses hertz. Filter
+coefficients (requiring trig functions) are recomputed at the sample rate of
+@i(cutoff). The resulting sample rate, start time, etc. are taken from @i(sound).
+
+@codef{tone(@pragma(defn)@index(tone)@i(sound), @i(cutoff))}@\No longer defined; use @code(lp) instead, or define it by adding @code[(setfn tone lp)] to your program.
+
+
+@label(hp-sec)
+@codef{hp(@pragma(defn)@index(hp)@index(high-pass filter)@i(sound), @i(cutoff))}@\Filters @i(sound)
+using a first-order Butterworth high-pass filter. @i(Cutoff) may be a
+float or a signal (for time-varying filtering) and expresses hertz. Filter
+coefficients (requiring trig functions) are recomputed at the sample rate of
+@i(cutoff). This filter is an exact complement of @code(lp).
+
+@codef{atone(@pragma(defn)@index(atone)@i(sound), @i(cutoff))}@\No longer defined; use @code(hp) instead, or define it by adding @code[(setfn atone hp)] to your program.
+
+@label(reson-sec)
+@codef{reson(@pragma(defn)@index(reson)@index(bandpass filter)@i(sound), @i(center), @i(bandwidth), @i(n))}@\Apply
+a resonating filter to @i(sound) with center frequency @i(center) (in hertz),
+which may be a float or a signal. @i(Bandwidth) is the filter bandwidth (in
+hertz), which may also be a signal. Filter coefficients (requiring trig
+functions) are recomputed at each new sample of either @i(center) or
+@i(bandwidth), and coefficients are @i(not) interpolated. The last
+parameter @i(n) specifies the type of normalization as in Csound: A value of 1 specifies a peak amplitude
+response of 1.0; all frequencies other than @i(hz) are attenuated. A
+value of 2 specifies the overall RMS value of the amplitude response
+is 1.0; thus filtered white noise would retain the same power. A value of
+zero specifies no scaling. The resulting sample rate, start time, etc. are taken from @i(sound).
+
+One application of @code(reson) is to simulate resonances in the human vocal tract.
+See @code(demos/voice_synthesis.htm)@index(voice synthesis)@index(demos, voice synthesis)
+for sample code and documentation.
+
+@label(areson-sec)
+@codef{areson(@pragma(defn)@index(areson)@index(notch filter)@i(sound), @i(center), @i(bandwidth), @i(n))}@\The @code(areson) filter is an exact
+complement of @code(reson) such that if both are applied to the
+same signal with the same parameters, the sum of the results yeilds
+the original signal.
+
+@label(shape-sec)
+@codef{shape(@pragma(defn)@index(shape)@index(waveshaping)@index(table)@i(signal), @i(table), @i(origin))}@\A waveshaping function. Use @i(table) as a function; apply the function to each sample of @i(signal) to yield a new sound. @i(Signal) should range from -1 to +1. Anything beyond these bounds is clipped. @i(Table) is also a sound, but it is converted into a lookup table (similar to table-lookup oscillators). The @i(origin) is a @code(FLONUM) and gives the time which should be considered the origin of @i(table). (This is important because @i(table) cannot have values at negative times, but @i(signal) will often have negative values. The @i(origin) gives an offset so that you can produce suitable tables.) The output at time @i(t) is:
+@begin(display)
+@i(table)(@i(origin) + clip(@i(signal)(@i(t)))
+@end(display)
+where clip(@i(x)) = @i(max)(1, @i(min)(-1, @i(x))).
+(E.g. if @i(table) is a signal defined over the interval [0, 2], then @i(origin) should be 1.0. The value of @i(table) at time 1.0 will be output when the input signal is zero.) The output has the same start time, sample rate, etc. as @i(signal). The @code(shape) function will also accept multichannel @i(signal)s and @i(table)s.
+
+Further discussion and examples can be found in
+@code(demos/distortion.htm)@index(distortion tutorial)@index(demos, distortion).
+The @code(shape)
+function is also used to map frequency to amplitude to achieve a spectral envelope for
+Shepard tones in @code(demos/shepard.lsp).@index(Shepard tones)@index(demos, Shepard tones)
+
+@label(biquad-sec)
+@codef{biquad(@pragma(defn)@index(biquad)@i(signal), @i(b0), @i(b1), @i(b2), @i(a0), @i(a1), @i(a2))}@\A fixed-parameter biquad filter. All filter coefficients are @code(FLONUM)s. See also @code(lowpass2), @code(highpass2), @code(bandpass2), @code(notch2), @code(allpass2), @code(eq-lowshelf), @code(eq-highshelf), @code(eq-band), @code(lowpass4), @code(lowpass6), @code(highpass4), and @code(highpass8) in this section for convenient variations based on the same filter. The equations for the filter are: z@-[n] = s@-[n] + a1 * z@-[n-1] + a2 * z@-[n-2], and y@-[n] = z@-[n] * b0 + z@-[n-1] * b1 + z@-[n-2] * b2.
+
+@label(biquad-m-sec)
+@codef{biquad-m(@pragma(defn)@index(biquad-m)@i(signal), @i(b0), @i(b1), @i(b2), @i(a0), @i(a1), @i(a2))}@\A fixed-parameter biquad filter with Matlab sign conventions for @i(a0), @i(a1), and @i(a2). All filter coefficients are @code(FLONUM)s.
+
+@label(lowpass2-sec)
+@codef{lowpass2(@pragma(defn)@index(lowpass2)@i(signal), @i(hz)[ ,@i(q)])}@\A fixed-parameter, second-order lowpass filter based on @code(snd-biquad). The cutoff frequency is given by @i(hz) (a @code(FLONUM)) and an optional Q factor is given by @i(q) (a @code(FLONUM)).
+
+@label(highpass2-sec)
+@codef{highpass2(@pragma(defn)@index(highpass2)@i(signal), @i(hz)[ ,@i(q)])}@\A fixed-parameter, second-order highpass filter based on @code(snd-biquad). The cutoff frequency is given by @i(hz) (a @code(FLONUM)) and an optional Q factor is given by @i(q) (a @code(FLONUM)).
+
+@label(bandpass2-sec)
+@codef{bandpass2(@pragma(defn)@index(bandpass2)@i(signal), @i(hz)[ ,@i(q)])}@\A fixed-parameter, second-order bandpass filter based on @code(snd-biquad). The center frequency is given by @i(hz) (a @code(FLONUM)) and an optional Q factor is given by @i(q) (a @code(FLONUM)).
+
+@label(notch2-sec)
+@codef{notch2(@pragma(defn)@index(notch2)@i(signal), @i(hz)[ ,@i(q)])}@\A fixed-parameter, second-order notch filter based on @code(snd-biquad). The center frequency is given by @i(hz) (a @code(FLONUM)) and an optional Q factor is given by @i(q) (a @code(FLONUM)).
+
+@label(allpass2-sec)
+@codef{allpass2(@pragma(defn)@index(allpass2)@i(signal), @i(hz)[ ,@i(q)])}@\A fixed-parameter, second-order allpass filter based on @code(snd-biquad). The frequency is given by @i(hz) (a @code(FLONUM)) and an optional Q factor is given by @i(q) (a @code(FLONUM)).
+
+@label(eq-lowshelf-sec)
+@codef{eq-lowshelf(@pragma(defn)@index(eq-lowshelf)@index(equalization)@i(signal), @i(hz), @i(gain)[ ,@i(slope)])}@\A fixed-parameter, second-order bass shelving equalization (EQ) filter based on @code(snd-biquad). The @i(hz) parameter (a @code(FLONUM))is the halfway point in the transition, and @i(gain) (a @code(FLONUM)) is the bass boost (or cut) in dB. The optional @i(slope) (a @code(FLONUM)) is 1.0 by default, and response becomes peaky at values greater than 1.0.
+
+@label(eq-highshelf-sec)
+@codef{eq-highshelf(@pragma(defn)@index(eq-highshelf)@index(equalization)@i(signal), @i(hz), @i(gain)[ ,@i(slope)])}@\A fixed-parameter, second-order treble shelving equalization (EQ) filter based on @code(snd-biquad). The @i(hz) parameter (a @code(FLONUM))is the halfway point in the transition, and @i(gain) (a @code(FLONUM)) is the treble boost (or cut) in dB. The optional @i(slope) (a @code(FLONUM)) is 1.0 by default, and response becomes peaky at values greater than 1.0.
+
+@label(eq-band-sec)
+@codef{eq-band(@pragma(defn)@index(eq-band)@index(equalization)@i(signal), @i(hz), @i(gain), @i(width))}@\A fixed- or variable-parameter, second-order midrange equalization (EQ) filter based on @code(snd-biquad), @code(snd-eqbandcv) and @code(snd-eqbandvvv). The @i(hz) parameter (a @code(FLONUM)) is the center frequency, @i(gain) (a @code(FLONUM)) is the boost (or cut) in dB, and @i(width) (a @code(FLONUM)) is the half-gain width in octaves. Alternatively, @i(hz), @i(gain), and @i(width) may be @code(SOUND)s, but they must all have the same sample rate, e.g. they should all run at the control rate or at the sample rate.
+
+@label(lowpass4-sec)
+@codef{lowpass4(@pragma(defn)@index(lowpass4)@i(signal), @i(hz))}@\A four-pole Butterworth lowpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(lowpass6-sec)
+@codef{lowpass6(@pragma(defn)@index(lowpass6)@i(signal), @i(hz))}@\A six-pole Butterworth lowpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(lowpass8-sec)
+@codef{lowpass8(@pragma(defn)@index(lowpass8)@i(signal), @i(hz))}@\An eight-pole Butterworth lowpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(highpass4-sec)
+@codef{highpass4(@pragma(defn)@index(highpass4)@i(signal), @i(hz))}@\A four-pole Butterworth highpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(highpass6-sec)
+@codef{highpass6(@pragma(defn)@index(highpass6)@i(signal), @i(hz))}@\A six-pole Butterworth highpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(highpass8-sec)
+@codef{highpass8(@pragma(defn)@index(highpass8)@i(signal), @i(hz))}@\An eight-pole Butterworth highpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(tapv-sec)
+@codef{tapv(@pragma(defn)@index(tapv)@index(variable delay)@index(tapped delay)@i(sound), @i(offset),
+@i(vardelay), @i(maxdelay))}@\A delay line with a variable position tap.
+Identical to @code(snd-tapv). See it for details (@ref(snd-tapv-sec)).
+
+@end(fndefs)
+
+@paragraph(Effects)
+@begin(fndefs)
+@label(stkrev-sec)
+@codef{nrev(@pragma(defn)@index(nrev)@index(reverb)@index(effect,
+reverberation)@index(STK nreverb)@i(sound), @i(decay), @i(mix))}
+
+@codef{jcrev(@pragma(defn)@index(jcrev)@index(reverb)@index(effect,
+ reverberation)@index(STK jcreverb)@i(sound), @i(decay), @i(mix))}
+
+@codef{prcrev(@pragma(defn)@index(prcrev)@index(reverb)@index(effect,
+ reverberation)@index(STK prcreverb)@i(sound), @i(decay), @i(mix))}
+These reverbs (@code(nrev), @code(jcrev), and @code(prcrev)) are implemented
+in STK (running within Nyquist). @code(nrev) derives from Common Music's
+NRev, which consists of 6 comb filters followed by 3 allpass filters, a
+ lowpass filter, and another allpass in series followed by two allpass
+filters in parallel. @code(jcrev) is the John Chowning
+reverberator which is based on the use of networks of simple allpass
+and comb delay filters. This reverb implements three series allpass units,
+followed by four parallel comb filters, and two decorrelation delay
+lines in parallel at the output. @code(prcrev) is a Perry Cook's
+reverberator which is based on the Chowning/Moorer/Schroeder
+reverberators using networks of simple allpass and comb delay filters.
+This one implements two series allpass units and two parallel comb filters.
+The @i(sound) input may be single or multi-channel. The @i(decay) time is
+in seconds, and @i(mix) sets the mixture of input sound reverb sound,
+where 0.0 means input only (dry) and 1.0 means reverb only (wet).
+
+@label(stkchorus-sec)
+@codef{stkchorus(@pragma(defn)@index(stkchorus)@index(chorus)@index(effect, chorus)@index(STK chorus)@i(sound), @i(depth), @i(freq), @i(mix)[ ,@i(delay)])}@\Chorus
+implemented in STK. The input @i(sound) can be single or multi-channel.
+The @code(FLONUM) parameters @i(depth) and @i(freq) set
+the modulation
+depth from 0 to 1
+and modulation frequency (in Hz), and @i(mix) sets the mixture
+of input sound and chorused sound, where 0.0 means input sound only (dry)
+and 1.0 means chorused sound only (wet). The parameter @i(delay) is a
+ @code(FIXNUM) representing the median desired delay length in samples.
+
+@label(stkpitshift-sec)
+@codef{pitshift(@pragma(defn)@index(pitshift)@index(pitch shift)@index(effect, pitch shift)@index(STK pitch shift)@i(sound), @i(shift), @i(mix))}@\A pitch
+ shifter implemented in STK. The input @i(sound), a single-channel
+ or multi-channel @code(SOUND) is pitch-shifted by @i(shift),
+a @code(FLONUM) ratio. A value of 1.0 means no shift. The parameter @i(mix)
+ sets the mixture of input and shifted sounds. A value of 0.0
+means input only (dry)
+and a value of 1.0 means shifted sound only (wet).
+@end(fndefs)
+
+@paragraph(Physical Models)
+@begin(fndefs)
+@label(clarinet-sec)
+@codef{clarinet(@pragma(defn)@index(clarinet)@index(stk clarinet)@i(step), @i(breath-env))}@\A
+physical model of a clarinet from STK. The @i(step) parameter is a @code(FLONUM)
+that controls the tube length, and the @i(breath-env) (a @code(SOUND))
+controls the air pressure
+and also determines the length of the resulting sound. The @i(breath-env) signal
+should range from zero to one.
+
+@codef{clarinet-freq(@index(clarinet)@pragma(defn)@index(clarinet-freq)@index(stk clarinet)@i(step), @i(breath-env), @i(freq-env))}@\A variation of @code(clarinet)
+that includes a variable frequency control, @i(freq-env), which specifies
+frequency deviation in Hz. The duration of the resulting sound is the minimum
+duration of @i(breath-env) and @i(freq-env). These parameters may be of type
+@code(FLONUM) or @code(SOUND). @code(FLONUM)s are coerced into @code(SOUND)s
+with a nominal duration arbitrarily set to 30.
+
+@codef{clarinet-all(@index(clarinet)@pragma(defn)@index(clarinet-all)@index(stk clarinet)@i(step), @i(breath-env), @i(freq-env), @i(vibrato-freq), @i(vibrato-gain),
+@i(reed-stiffness), @i(noise))}@\A variation of @code(clarinet-freq)
+that includes controls @i(vibrato-freq) (a @code(FLONUM) for vibrato frequency in Hertz),
+@i(vibrato-gain) (a @code(FLONUM) for the amount of amplitude vibrato),
+@i(reed-stiffness) (a @code(FLONUM) or @code(SOUND) controlling reed stiffness in the clarinet
+model), and @i(noise) (a @code(FLONUM) or @code(SOUND) controlling noise amplitude in the input
+air pressure). The @i(vibrato-gain) is a number from zero to one, where zero
+indicates no vibrato, and one indicates a plus/minus 50% change in breath
+envelope values. Similarly, the @i(noise) parameter ranges from zero to one where
+zero means no noise and one means white noise with a peak amplitude of
+plus/minus 40% of the @i(breath-env). The @i(reed-stiffness) parameter varies
+from zero to one.
+The duration of the resulting sound is the minimum duration of
+@i(breath-env), @i(freq-env), @i(reed-stiffness), and @i(noise). As with
+@code(clarinet-freq), these parameters may be either @code(FLONUM)s or
+@code(SOUND)s, and @code(FLONUM)s are coerced to sounds with a nominal
+duration of 30.
+
+@label(sax-sec)
+@codef{sax(@pragma(defn)@index(sax)@index(stk sax)@i(step), @i(breath-env))}@\A
+physical model of a sax from STK. The @i(step) parameter is a @code(FLONUM)
+that controls the tube length, and the @i(breath-env) controls the air pressure
+and also determines the length of the resulting sound. The @i(breath-env) signal
+should range from zero to one.
+
+@codef{sax-freq(@pragma(defn)@index(sax)@index(sax-freq)@index(stk sax)@i(step), @i(breath-env), @i(freq-env))}@\A variation of @code(sax)
+that includes a variable frequency control, @i(freq-env), which specifies
+frequency deviation in Hz. The duration of the resulting sound is the minimum
+duration of @i(breath-env) and @i(freq-env). These parameters may be of type
+@code(FLONUM) or @code(SOUND). @code(FLONUM)s are coerced into @code(SOUND)s
+with a nominal duration arbitrarily set to 30.
+
+@codef{sax-all(@pragma(defn)@index(sax)@index(sax-all)@index(stk sax)@i(step), @i(breath-env), @i(freq-env), @i(vibrato-freq), @i(vibrato-gain),
+@i(reed-stiffness), @i(noise), @i(blow-pos), @i(reed-table-offset))}@\A variation of
+ @code(sax-freq)
+that includes controls @i(vibrato-freq) (a @code(FLONUM) for vibrato frequency in Hertz),
+@i(vibrato-gain) (a @code(FLONUM) for the amount of amplitude vibrato),
+@i(reed-stiffness) (a @code(SOUND) controlling reed stiffness in the sax
+model), @i(noise) (a @code(SOUND) controlling noise amplitude in the input
+air pressure), @i(blow-pos) (a @code(SOUND) controlling the point of excitation
+of the air column), and @i(reed-table-offset) (a @code(SOUND) controlling a
+parameter of the reed model). The @i(vibrato-gain) is a number from zero to one, where zero
+indicates no vibrato, and one indicates a plus/minus 50% change in breath
+envelope values. Similarly, the @i(noise) parameter ranges from zero to one where
+zero means no noise and one means white noise with a peak amplitude of
+plus/minus 40% of the @i(breath-env). The @i(reed-stiffness), @i(blow-pos), and
+@i(reed-table-offset) parameters all vary from zero to one.
+The duration of the resulting sound is the minimum duration of
+@i(breath-env), @i(freq-env), @i(reed-stiffness), @i(noise), @i(breath-env),
+ @i(blow-pos), and @i(reed-table-offset). As with
+@code(sax-freq), these parameters may be either @code(FLONUM)s or
+@code(SOUND)s, and @code(FLONUM)s are coerced to sounds with a nominal
+duration of 30.
+
+@label(flute-sec)
+@codef{flute(@pragma(defn)@index(flute)@index(STK flute)@i(step), @i(breath-env))}@\A physical model of a flute from STK.
+The @i(step) parameter is a @code(FLONUM) that controls the tube
+length, and the @i(breath-env)
+controls the air pressure and also determines the starting time and
+length of the resulting sound. The @i(breath-env) signal should
+ range from zero to one.
+
+@codef{flute-freq(@pragma(defn)@index(flute-freq)@index(STK flute)@i(step), @i(breath-env), @i(freq-env))}@\A variation of @code(flute)
+ that includes a variable frequency control, @i(freq-env), which
+ specifies frequency deviation in Hz. The duration of the
+resulting sound is the minimum duration of @i(breath-env) and
+@i(freq-env). These parameters may be of type @code(FLONUM) or
+ @code(SOUND). @code(FLONUM)s are coerced into SOUNDs with a
+nominal duration arbitrary set to 30.
+
+@codef{flute-all(@pragma(defn)@index(flute-all)@index(STK flute)@i(step), @i(breath-env), @i(freq-env), @i(vibrato-freq),
+ @i(vibrato-gain), @i(jet-delay), @i(noise))}@\A variation of
+@code(clarinet-freq) that includes controls @i(vibrato-freq) (a
+@code(FLONUM) for vibrato frequency in Hz), @i(vibrato-gain) (a
+ @code(FLONUM) for the amount of amplitude vibrato), @i(jet-delay)
+ (a @code(FLONUM) or @code(SOUND) controlling jet delay in the
+ flute model), and
+noise (a @code(FLONUM) or @code(SOUND) controlling noise amplitude
+in the input air pressure). The @i(vibrato-gain) is a number from zero
+ to one where zero means no vibrato, and one indicates a plus/minus
+50% change in breath envelope values. Similarly, the @i(noise) parameter
+ ranges from zero to one, where zero means no noise and one means white
+noise with a peak amplitude of
+ plus/minus 40% of the @i(breath-env). The @i(jet-delay) is a ratio
+ that controls a delay length from the flute model, and therefore it
+changes the pitch of the resulting sound. A value of 0.5 will maintain
+the pitch indicated by the step parameter. The duration of the
+resulting sound is the minimum duration of @i(breath-env), @i(freq-env),
+@i(jet-delay), and @i(noise). These parameters may be either
+@code(FLONUM)s or @code(SOUND)s, and @code(FLONUM)s are coerced
+ to sounds with a nominal duration of 30.
+
+@label(bowed-sec)
+@codef{bowed(@pragma(defn)@index(bowed)@index(STK bowed string)@i(step), @i(bowpress-env))}@\A physical model of a bowed string
+ instrument from STK. The @i(step) parameter is a @code(FLONUM)
+ that controls the string length,
+ and the @i(bowpress-env) controls the bow pressure and also
+determines the duration of the resulting sound. The @i(bowpress-env)
+ signal should range from zero to one.
+
+@codef{bowed-freq(@pragma(defn)@index(bowed-freq)@index(STK bowed-freq)@i(step), @i(bowpress-env), @i(freq-env))}@\A variation of @code(bowed)
+ that includes a variable frequency control, @i(freq-env), which
+ specifies frequency deviation in Hz. The duration of the resulting
+ sound is the minimum duration of @i(bowpress-env) and @i(freq-env).
+These parameters may be of type @code(FLONUM) or @code(SOUND).
+@code(FLONUM)s are coerced into @code(SOUND)s
+ with a nominal duration arbitrarily set to 30s.
+
+@label(mandolin-sec)
+@codef{mandolin(@pragma(defn)@index(mandolin)@index(STK mandolon)@i(step), @i(dur), &optional @i(detune))}@\A physical model of a
+ plucked double-string instrument from STK. The @i(step) parameter
+ is a @code(FLONUM) wich specifies the desired pitch, @i(dur)
+ means the duration of the resulting sound and detune is a
+@code(FLONUM) that controls the relative detune of the two strings.
+A value of 1.0 means unison. The default value is 4.0.
+Note: @i(body-size) (see @code(snd-mandolin) does not seem to
+ work correctly, so a default value is always used
+ by @code(mandolin).
+
+@label(bandedwg-sec)
+@codef{wg-uniform-bar(@pragma(defn)@index(wg-uniform-bar)@index(STK uniform bar)@i(step), @i(bowpress-env))}
+
+@codef{wg-tuned-bar(@pragma(defn)@index(wg-tuned-bar)@index(STK tuned bar)@i(step), @i(bowpress-env))}
+
+@codef{wg-glass-harm(@pragma(defn)@index(wg-glass-harm)@index(STK glass harmonica)@i(step), @i(bowpress-env))}
+
+@codef{wg-tibetan-bowl(@pragma(defn)@index(wg-tibetan-bowl)@index(STK tibetan bowl)@i(step), @i(bowpress-env))}@\These
+sounds are presets for a Banded Wave Guide Percussion instrument implemented in STK.
+The parameter @i(step) is a @code(FLONUM)
+ that controls the resultant pitch, and @i(bowpress-env) is a @code(SOUND) ranging
+from zero to one that controls a parameter of the model. In addition,
+@i(bowpress-env) determines the duration of the resulting sound.
+(Note: The @i(bowpress-env) does not seems influence the timbral
+quality of the resulting sound).
+
+@label(modalbar-sec)
+@codef{modalbar(@pragma(defn)@index(modalbar)@index(STK modal bar)@i(preset), @i(step), @i(dur))}@\A physical model of a struck bar
+ instrument implemented in STK. The parameter @i(preset) is one of the
+symbols
+@code(MARIMBA), @code(VIBRAPHONE), @code(AGOGO), @code(WOOD1),
+@code(RESO), @code(WOOD2), @code(BEATS), @code(TWO-FIXED), or
+@code(CLUMP). The symbol must be quoted, e.g. for SAL syntax use
+@code[quote(marimba)], and for Lisp syntax use @code('marimba).
+The parameter @i(step) is a @code(FLONUM) that
+sets the pitch (in steps), and @i(dur) is the duration in seconds.
+
+@label(sitar-sec)
+@codef{sitar(@pragma(defn)@index(sitar)@index(STK sitar)@i(step), @i(dur))}@\A sitar physical model implemented in STK.
+The parameter @i(step) is a @code(FLONUM) that sets the pitch,
+ and @i(dur) is the duration.
+@end(fndefs)
+
+@paragraph(More Behaviors)
+@begin(fndefs)
+@label(clip-sec)
+@codef{clip(@pragma(defn)@index(clip)@index(limit)@i(sound), @i(peak))}@\Hard limit @i(sound)
+to the given @i(peak), a positive number. The samples of @i(sound) are constrained between an upper value
+of @i(peak) and a lower value of @subtract()@i(peak). If @i(sound) is a number, @code(clip) will return @i(sound) limited by @i(peak). If @i(sound) is a multichannel sound, @code(clip) returns a multichannel sound where each channel is clipped. The result has the type, sample rate, starting time, etc. of @i(sound).
+
+@label(s-abs-sec)
+@codef{s-abs(@pragma(defn)@index(s-abs)@index(absolute value)@i(sound))}@\A generalized absolute value function. If @i(sound) is a @code(SOUND), compute the absolute value of each sample. If @i(sound) is a number, just compute the absolute value. If @i(sound) is a multichannel sound, return a multichannel sound with @code(s-abs) applied to each element. The result has the type, sample rate, starting time, etc. of @i(sound).
+
+@label(s-sqrt-sec)
+@codef{s-sqrt(@pragma(defn)@index(s-sqrt)@index(square root)@i(sound))}@\A generalized square root function. If @i(sound) is a @code(SOUND), compute the square root of each sample. If @i(sound) is a number, just compute the square root. If @i(sound) is a multichannel sound, return a multichannel sound with @code(s-sqrt) applied to each element. The result has the type, sample rate, starting time, etc. of @i(sound). In taking square roots, if an input sample is less than zero, the corresponding output sample is zero. This is done because the square root of a negative number is undefined.
+
+@label(s-exp-sec)
+@codef{s-exp(@pragma(defn)@index(s-exp)@index(exponential)@i(sound))}@\A generalized exponential function. If @i(sound) is a @code(SOUND), compute @i(e)@+(@i(x)) for each sample @i(x). If @i(sound) is a number @i(x), just compute @i(e)@+(@i(x)). If @i(sound) is a multichannel sound, return a multichannel sound with @code(s-exp) applied to each element. The result has the type, sample rate, starting time, etc. of @i(sound).
+
+@label(s-log-sec)
+@codef{s-log(@pragma(defn)@index(s-log)@index(logorithm)@index(natural log)@i(sound))}@\A generalized natural log function. If @i(sound) is a @code(SOUND), compute @i(ln)(@i(x)) for each sample @i(x). If @i(sound) is a number @i(x), just compute @i(ln)(@i(x)). If @i(sound) is a multichannel sound, return a multichannel sound with @code(s-log) applied to each element. The result has the type, sample rate, starting time, etc. of @i(sound). Note that the @i(ln) of 0 is undefined (some implementations return negative infinity), so use this function with care.
+
+@label(s-max-sec)
+@codef{s-max(@pragma(defn)@index(s-max)@index(maximum)@i(sound1), @i(sound2))}@\Compute the maximum of two functions, @i(sound1) and @i(sound2). This function also accepts numbers and multichannel sounds and returns the corresponding data type. The start time of the result is the maximum of the start times of @i(sound1) and @i(sound2). The logical stop time and physical stop time of the result is the minimum of the logical stop and physical stop times respectively of @i(sound1) and @i(sound2). Note, therefore, that the result value is zero except within the bounds of @i(both) input sounds.
+
+@codef{s-min(@pragma(defn)@index(s-min)@index(minimum)@i(sound1), @i(sound2))}@\Compute the minimum of two functions, @i(sound1) and @i(sound2). This function also accepts numbers and multichannel sounds and returns the corresponding data type. The start time of the result is the maximum of the start times of @i(sound1) and @i(sound2). The logical stop time and physical stop time of the result is the minimum of the logical stop and physical stop times respectively of @i(sound1) and @i(sound2). Note, therefore, that the result value is zero except within the bounds of @i(both) input sounds.
+
+@codef{osc-note(@pragma(defn)@index(osc-note)@i(pitch)[ ,@i(duration), @i(env), @i(loud),
+@i(table)])}@\Same as @code(osc), but @code(osc-note)
+multiplies the result by @i(env). The @i(env) may be a sound,
+or a list supplying (@i(t@-[1]) @i(t@-[2])
+@i(t@-[4]) @i(l@-[1]) @i(l@-[2]) @i(l@-[3])). The result has a sample rate of @code(*sound-srate*).
+
+@label(quantize-sec)
+@codef{quantize(@pragma(defn)@index(quantize)@i(sound), @i(steps))}@\Quantizes @i(sound) as follows: @i(sound) is multiplied by @i(steps) and rounded to the nearest integer. The result is then divided by @i(steps). For example, if @i(steps) is 127, then a signal that ranges from -1 to +1 will be quantized to 255 levels (127 less than zero, 127 greater than zero, and zero itself). This would match the quantization Nyquist performs when writing a signal to an 8-bit audio file. The @i(sound) may be multi-channel.
+
+@codef{ramp(@pragma(defn)@index(ramp) [@i(duration)])}@\Returns a linear ramp from 0 to 1
+over @i(duration) (default is 1). The function actually reaches 1 at
+@i(duration), and therefore has one extra sample, making the total duration
+be @i(duration) + 1/@code(*Control-srate*). See Figure @ref(ramp-fig) for
+more detail. Ramp is unaffected by the @code(sustain) transformation. The
+effect of time warping is to warp the starting and ending times only. The
+ramp itself is unwarped (linear). The sample rate is @code(*control-srate*).
+
+@label(rms-sec)
+@codef{rms(@pragma(defn)@index(rms)@i(sound)[ ,@i(rate), @i(window-size)])}@\Computes the RMS of @i(sound) using a square window of size @i(window-size). The result has a sample rate of @i(rate). The default value of @i(rate) is 100 Hz, and the default window size is 1/rate seconds (converted to samples). The @i(rate) is a @code(FLONUM) and @i(window-size) is a @code(FIXNUM).
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.37 in, width = 4.5 in, magnify = 0.75,
+ postscript = "rampfig.ps"))
+@html(<img src="fig6.gif"><br><br>)
+@fillcaption[Ramps generated by @code(pwl) and @code(ramp) functions. The
+@code(pwl) version ramps toward the breakpoint (1, 1), but in order to ramp
+back to zero at breakpoint (1, 0), the function never reaches an amplitude
+of 1. If used at the beginning of a @code(seq) construct, the next sound
+will begin at time 1. The @code(ramp) version actually reaches breakpoint
+(1, 1); notice that it is one sample longer than the @code(pwl) version. If
+used in a sequence, the next sound after @code(ramp) would start at time 1 +
+@i(P), where @i(P) is the sample period.]
+@tag(ramp-fig)
+@end(figure)
+
+@begin(fndefs)
+@label(recip-sec)
+@codef{recip(@pragma(defn)@index(recip)@index(reciprocal)@index(division)@i(sound))}@\A generalized reciprocal function.
+If @i(sound) is a @code(SOUND), compute 1/@i(x) for each sample @i(x). If @i(sound) is a number @i(x), just compute 1/@i(x). If @i(sound) is a multichannel sound, return a multichannel sound with @code(recip) applied to each element. The result has the type, sample rate, starting time, etc. of @i(sound). Note that the reciprocal of 0 is undefined (some implementations return infinity), so use this function with care on sounds. Division of sounds is accomplished by multiplying by the reciprocal. Again, be careful not to divide by zero.
+
+@codef{s-rest(@index(rest)@pragma(defn)@index(s-rest) [@i(duration)])}@\Create silence (zero samples)
+for the given
+@i(duration) at the sample rate @code(*sound-srate*).
+Default duration is 1.0 sec, and the sound is transformed in time according
+to @code[*warp*]. @p(Note:) @code(rest) is a Lisp function that is equivalent to @code(cdr). Be careful to use @code(s-rest) when you need a sound!
+
+@label(noise-sec)
+@codef{noise(@pragma(defn)@index(noise) [@i(duration)])}@\Generate noise with the given
+@i(duration). Duration (default is 1.0)
+is transformed according to @code[*warp*]. The
+sample rate is @code(*sound-srate*) and the amplitude is +/- @code(*loud*).
+
+@label(yin-sec)
+@codef{yin(@pragma(defn)@index(yin)@index(pitch detection)@index(fundamenal frequency
+estimation)@index(estimate frequency)@index(frequency analysis)@index(period
+estimation)@i(sound), @i(minstep), @i(maxstep), @i(stepsize))}@\Fundamental
+frequency estimation (pitch detection. Use the YIN algorithm to estimate
+the fundamental frequency of @i(sound), which must be a @code(SOUND).
+The @i(minstep), a @code(FLONUM), is the minimum frequency considered (in steps),
+@i(maxstep), a @code(FLONUM), is the maximum frequency considered (in steps), and
+@i(stepsize), a @code(FIXNUM), is the desired hop size. The result is
+a ``stereo'' signal,
+i.e. an array of two @code(SOUND)s, both at the same sample rate, which is
+approximately the sample rate of @i(sound) divided by @i(stepsize).
+The first @code(SOUND) consists of frequency estimates. The second sound consists
+of values that measure the confidence or reliability of the frequency estimate.
+A small value (less than 0.1) indicates fairly high confidence. A larger value
+indicates lower confidence. This number can also be thought of as a ratio of
+non-periodic power to periodic power. When the number is low, it means the signal
+is highly periodic at that point in time, so the period estimate will be
+reliable.
+Hint #1: See
+Alain de Cheveigne and Hideki Kawahara's article "YIN, a Fundamental Frequency
+Estimator for Speech and Music" in the Journal of the
+Acoustic Society of America, April 2002 for details on the yin algorithm.
+Hint #2: Typically, the @i(stepsize) should be at least the expected number
+of samples in one period so that the
+fundamental frequency estimates are calculated at a rate far below
+the sample rate of the signal. Frequency does not change rapidly and
+the yin algorithm is fairly slow. To optimize speed,
+you may want to use less than 44.1 kHz sample rates for input sounds. Yin
+uses interpolation to achieve potentially fractional-sample-accurate estimates,
+so higher sample rates do not necessarily help the algorithm and definitely
+slow it down. The computation time is O(@i(n)@+(2)) per estimate,
+where @i(n) is the number
+of samples in the longest period considered. Therefore, each increase
+of @i(minstep) by 12 (an octave) gives you a factor of 4 speedup, and
+each decrease of the sample rate of @i(sound) by a factor of
+two gives you another factor of 4 speedup. Finally, the number of estimates is
+inversely proportional to @i(stepsize).
+Hint #3: Use @code(snd-srate) (see Section @ref(snd-srate-sec)) to get
+the exact sample rate of the result, which will be the sample rate of
+ @i(sound) divided by @i(stepsize).
+E.g. @code{(snd-srate (aref yin-output 0))},
+where @code(yin-output) is a result returned by @code(yin), will be the
+sample rate of the estimates.
+
+@end(fndefs)
+
+@section(Transformations)@index(Transformations)
+@label(transformations-sec)
+These functions change the environment that is seen by other high-level
+functions. Note that these changes are usually relative to the
+current environment. There are also ``absolute'' versions of each
+transformation function, with the exception of @code(seq),
+ @code(seqrep), @code(sim), and @code(simrep). The
+``absolute'' versions (starting or ending with ``abs'') do not look at the
+current environment, but rather set an environment variable to a specific value.
+In this way, sections of code can be insulated from external
+transformations.
+
+@begin(fndefs)
+@codef{abs-env(@pragma(defn)@index(abs-env)@i(beh))}@\Compute @i(beh) in the default environment.
+This is useful for computing waveform tables and signals that are
+``outside'' of
+time. For example, @code[(at 10.0 (abs-env (my-beh)))] is equivalent to
+@code[(abs-env (my-beh))] because @code(abs-env) forces the default environment. Or in SAL, we would say @code[abs-env(my-beh()) @@ 10] is equivalent to @code[abs-env(my-beh())].
+
+@codef{at(@pragma(defn)@index(at)@i(time), @i(beh))}@\Evaluate @i(beh) with
+@code(*warp*@index(*warp*)) shifted by @i(time). In SAL, you can use the infix
+operator @code(@@) as in @code[@i(beh) @@ @i(time)]. To discover how the
+environment is shifting time, use @code[local-to-global(@i(time))]. Most
+commonly, you call @code[local-to-global(0)] to find when a sound created
+in the current environment will start, expressed in absolute (global) terms.
+This can be regarded as the ``current time.''
+
+@codef{at-abs(@pragma(defn)@index(at-abs)@i(time), @i(beh))}@\Evaluate @i(beh) with
+@code(*warp*@index(*warp*)) shifted so that local time 0 maps to @i(time). In SAL, you can use the infix operator @code[@@@@] as in @code[@i(beh) @@@@ @i(time)].
+
+@label(continuous-control-warp)
+@codef{continuous-control-warp(@pragma(defn)@index(continuous-control-warp)@i(beh))}@\Applies the current warp environment to the signal returned by @i(beh). The result has the default control sample rate @code(*control-srate*). Linear interpolation is currently used. Implementation: @i(beh) is first evaluated without any shifting, stretching, or warping. The result is functionally composed with the inverse of the environment's warp function.
+
+@label(continuous-sound-warp)
+@codef{continuous-sound-warp(@pragma(defn)@index(continuous-sound-warp)@i(beh))}@\Applies the current warp environment to the signal returned by @i(beh). The result has the default sound sample rate @code(*sound-srate*). Linear interpolation is currently used. See @code(continuous-control-warp) for implementation notes.
+
+@label(control-srate-abs-sec)
+@codef{control-srate-abs(@pragma(defn)@index(control-srate-abs)@i(srate),
+@i(beh))}@\Evaluate @i(beh) with @code(*control-srate*@index(*control-srate*))
+set to sample rate @i(srate). @p(Note:) there is no ``relative'' version of
+this function.
+
+@codef{extract(@pragma(defn)@index(extract)@i(start), @i(stop), @i(beh))}@\Returns a sound
+which is the portion of
+@i(beh) between @i(start) and @i(stop). Note that this is done
+relative to the current @code(*warp*). The result is shifted
+to start according to @code(*warp*), so normally the result will start without a delay of @i(start).
+
+@codef{extract-abs(@pragma(defn)@index(extract-abs)@i(start), @i(stop), @i(beh))}@\Returns a sound which
+is the portion of
+@i(beh) between @i(start) and @i(stop), independent of the
+current @code(*warp*). The result is shifted
+to start according to @code(*warp*).
+
+@codef{loud(@pragma(defn)@index(loud)@i(volume), @i(beh))}@\Evaluates @i(beh) with @code(*loud*)
+incremented by @i(volume). (Recall that @code(*loud*) is in decibels, so increment is the proper operation.)
+
+@codef{loud-abs(@pragma(defn)@index(loud-abs)@i(volume), @i(beh))}@\Evaluates @i(beh) with @code(*loud*)
+set to @i(volume).
+
+@label(sound-srate-abs-sec)
+@codef{sound-srate-abs(@pragma(defn)@index(sound-srate-abs)@i(srate), @i(beh))}@\Evaluate @i(beh) with @code(*sound-srate*@index(*sound-srate*)) set to sample rate @i(srate). @p(Note:) there is no ``relative'' version of this function.
+
+@codef{stretch(@pragma(defn)@index(stretch)@i(factor), @i(beh))}@\Evaluates @i(beh) with
+@code(*warp*) scaled by @i(factor). The effect is to ``stretch'' the result
+of @i(beh) (under the current environment) by @i(factor). See Chapter
+@ref(warp-chap) for more information. Use @code[get-duration(@i(dur))] to
+get the nominal actual duration of a behavior that locally has a duration
+of @i(dur). Here, ``nominal'' means what would be expected if the behavior
+obeys the shift, stretch, and warp components of the environment. (Any
+behavior is free to deviate from the nominal timing. For example, a percussion
+sound might have a fixed duration independent of the stretch factor.) Also,
+``actual'' means global or absolute time, and ``locally'' means within the
+environment where @code[get-duration] is called. @code[get-duration] works
+by mapping the current time (local time 0) using @code[local-to-global] to
+obtain an actual start time, and mapping @i(dur) to obtain an actual end time.
+The difference is returned.
+
+@codef{stretch-abs(@pragma(defn)@index(stretch-abs)@i(factor), @i(beh))}@\Evaluates @i(beh) with @code(*warp*) set to a linear time transformation where each unit of logical time maps to @i(factor) units of real time. The effect is to stretch the nominal behavior of @i(beh) (under the default global environment) by @i(factor). See Chapter @ref(warp-chap) for more information.
+
+@codef{sustain(@pragma(defn)@index(sustain)@index(legato)@index(overlap)@index(stacatto)@i(factor), @i(beh))}@\Evaluates @i(beh) with @code(*sustain*) scaled by @i(factor). The effect is to ``stretch'' the result of @i(beh) (under the current environment) by @i(factor); however, the logical stop times are not stretched. Therefore, the overall duration of a sequence is not changed, and sounds will tend to overlap if @code(*sustain*) is greater than one (legato) and be separated by silence if @code(*sustain*) is less than one.
+
+@codef{sustain-abs(@pragma(defn)@index(sustain-abs)@i(factor), @i(beh))}@\Evaluates @i(beh) with @code(*sustain*) set to @i(factor). (See @code(sustain), above.)
+
+@codef{transpose(@pragma(defn)@index(transpose)@i(amount), @i(beh))}@\Evaluates @i(beh) with
+@code(*transpose*) shifted by @i(amount). The effect is relative transposition by @i(amount) semitones.
+
+@codef{transpose-abs(@pragma(defn)@index(transpose-abs)@i(amount), @i(beh))}@\Evaluates @i(beh) with
+@code(*transpose*) set to @i(amount). The effect is the transposition of the nominal pitches in @i(beh) (under the default global environment) by @i(amount).
+
+@codef{warp(@pragma(defn)@index(warp)@i(fn), @i(beh))}@\Evaluates @i(beh) with @code(*warp*) modified by @i(fn). The idea is that @i(beh) and @i(fn) are written in the same time system, and @i(fn) warps that time system to local time. The current environment already contains a mapping from local time to global (real) time. The value of @code(*warp*) in effect when @i(beh) is evaluated is the functional composition of the initial @code(*warp*) with @i(fn).
+
+@codef{warp-abs(@pragma(defn)@index(warp-abs)@i(fn), @i(beh))}@\Evaluates @i(beh) with @code(*warp*) set to @i(fn). In other words, the current @code(*warp*) is ignored and not composed with @i(fn) to form the new @code(*warp*).
+@end(fndefs)
+
+@section(Combination and Time Structure)@index(Combination)@index(Time Structure)
+These behaviors combine component behaviors into structures, including
+sequences (melodies), simultaneous sounds (chords), and structures based
+on iteration.
+
+@begin(fndefs)
+@label(seq-sec)
+ @codef{seq(@pragma(defn)@index(seq)@i(beh@-[1])[ ,@i(beh@-[2]), ...])}@\Evaluates the first behavior
+@i(beh@-[1]) according to @code(*time*) and each successive behavior at the
+@code(logical-stop) time of the previous one. The results are summed to form a
+sound whose @code(logical-stop) is
+the @code(logical-stop) of the last behavior in the sequence. Each behavior
+can result in a multichannel sound, in which case, the logical stop time is
+considered to be the maximum logical stop time of any channel. The number
+of channels in the result is the number of channels of the first behavior.
+If other behaviors return fewer channels, new channels are created containing
+constant zero signals until the required number of channels is obtained. If
+other behaviors return a simple sound rather than multichannel sounds, the
+sound is automatically assigned to the first channel of a multichannel sound
+that is then filled out with zero signals. If another behavior returns more
+channels than the first behavior, the error is reported and the computation
+is stopped. Sample rates are converted up or down to match the sample rate of the first sound in a sequence.
+
+@codef{seqrep(@pragma(defn)@index(seqrep)@i(var), @i(limit), @i(beh))}@\Iteratively
+evaluates @i(beh) with the atom
+@i(var) set with values from 0 to @i(limit)-1, inclusive. These sounds
+are placed sequentially in time as if by @code(seq). The symbol @i(var) is
+a @i(read-only) local variable to @i(beh). Assignments are not restricted
+or detected, but may cause a run-time error or crash. In LISP, the syntax is
+ @code[(seqrep (@i(var) @i(limit)) @i(beh))].
+
+@label(sim-sec)
+@codef{sim(@pragma(defn)@index(sim)[@i(beh@-[1]), @i(beh@-[2]), ...])}@\Returns a sound which is the
+sum of the given behaviors evaluated with current value of @code(*warp*).
+If behaviors return multiple channel sounds, the corresponding channels are
+added. If the number of channels does not match, the result has the
+maximum. For example, if a two-channel sound [L, R] is added to a four-channel
+sound [C1, C2, C3, C4], the result is [L + C1, R + C2, C3, C4]. Arguments to @code(sim) may also be numbers. If all arguments are numbers, @code(sim) is equivalent (although slower than) the @code(+) function. If a number is added to a sound, @code(snd-offset) is used to add the number to each sample of the sound. The result of adding a number to two or more sounds with different durations is not defined. Use @code(const) to coerce a number to a sound of a specified duration. An important limitation of @code(sim) is that it cannot handle hundreds of behaviors due to a stack size limitation in XLISP. To compute hundreds of sounds (e.g. notes) at specified times, see @code(timed-seq), below.
+See also @code(sum) below.
+
+@codef{simrep(@pragma(defn)@index(simrep)@i(var), @i(limit), @i(beh))}@\Iteratively
+evaluates @i(beh) with the atom
+@i(var) set with values from 0 to @i(limit)-1, inclusive. These sounds
+are then placed simultaneously in time as if by @code(sim).
+In LISP, the syntax is
+ @code[(seqrep (@i(var) @i(limit)) @i(beh))].
+
+@label(trigger-sec)
+@codef[trigger(@pragma(defn)@index(trigger)@i(s), @i(beh))]@\Returns a sound which is the
+sum of instances of the behavior @i(beh). One instance is created each time
+@code(SOUND) @i(s) makes a transition from less than or equal to zero to
+greater than zero. (If the first sample of @i(s) is greater than zero, an
+instance is created immediately.) The sample rate of @i(s) and all behaviors
+must be the same, and the behaviors must be (monophonic) @code(SOUND)s.
+This function is particularly designed to allow behaviors to be invoked
+in real time by making @i(s) a function of a Nyquist slider, which can be
+controlled by a graphical interface or by OSC messages. See @code(snd-slider)
+in Section @ref(snd-slider-sec).
+
+@codef[set-logical-stop(@pragma(defn)@index(set-logical-stop)@i(beh), @i(time))]@\Returns a sound with @i(time) as
+the logical stop time.
+
+@codef{sum(@pragma(defn)@index(sum)@index(mix)@i(a)[ ,@i(b), @i(c), ...])}@\Returns the sum of @i(a), @i(b), @i(c), ..., allowing mixed addition of sounds, multichannel sounds and numbers. Identical to @i(sim).
+
+@codef{mult(@pragma(defn)@index(mult)@index(product)@index(multiply signals)@i(a)[ ,@i(b), @i(c), ...])}@\Returns the product of @i(a), @i(b), @i(c), ..., allowing mixed multiplication of sounds, multichannel sounds and numbers.
+
+@codef{diff(@pragma(defn)@index(diff)@index(difference of sounds)@i(a), @i(b))}@\Returns the difference between @i(a) and @i(b). This function is defined as @code[(sum a (prod -1 b))].
+
+@label(timed-seq-sec)
+@codef{timed-seq(@pragma(defn)@index(timed-seq)@index(score)@index(note list)@i(score))}@\Computes sounds from a note list or ``score.'' The @i(score)
+is of the form: @code[`((@i(time1) @i(stretch1) @i(beh1)) (@i(time2)
+@i(stretch2) @i(beh2)) ...)], where @i(timeN) is the starting time,
+@i(stretchN) is the stretch factor, and @i(behN) is the behavior. Note
+that @i(score) is normally a @i(quoted list)! The times must be in
+increasing order, and each @i(behN) is evaluated using lisp's @code(eval),
+so the @i(behN) behaviors cannot refer to local parameters or local
+variables. The advantage of this form over @code(seq) is that the
+behaviors are evaluated one-at-a-time which can take much less stack
+space and overall memory. One special ``behavior'' expression is
+interpreted directly by @code(timed-seq): @code[(SCORE-BEGIN-END)]
+is ignored, not evaluated as a function. Normally, this special
+behavior is placed at time 0 and has two parameters: the score
+start time and the score end time. These are used in Xmusic
+functions. If the behavior has a @code(:pitch) keyword parameter
+which is a list, the list represents a chord, and the expression is
+replaced by a set of behaviors, one for each note in the chord.
+It follows that if @code(:pitch) is @code(nil), the behavior
+represents a rest and is ignored.
+
+@end(fndefs)
+
+
+@section(Sound File Input and Output)
+@index(sound file I/O)
+@begin(fndefs)
+@label(play-sec)
+@codef[play @pragma(defn)@index(play)@i(sound)]@\Play the sound
+through the DAC.
+Note that @code(play) is a command in SAL. In XLISP, it is a function,
+so the syntax is @code[(play @i(sound))], and in SAL, you can call the
+XLISP function as @code[#play(@i(sound))].
+The @code(play) command or function
+writes a file and plays it. The details of this
+are system-dependent, but @code(play) is defined in the file
+@code(system.lsp). The variable @code(*default-sf-dir*)@index(sound file directory default)@index(directory, default sound file)@index(default sound file directory)@index(temporary sound files directory)
+@index(*default-sf-dir*) names a directory into which to save a sound file. Be careful not to call @code(play) or @code(sound-play) within a function and then
+invoke that function from another @code(play) command.
+
+By default, Nyquist will try to normalize sounds using the method named by
+@code(*autonorm-type*), which is @code('lookahead) by default.
+The @i(lookahead) method precomputes and buffers @code(*autonorm-max-samples*)
+samples, finds the peak value, and normalizes accordingly. The
+@code('previous) method bases the normalization of the current sound on the peak value of the (entire) previous sound. This might be good if you are working with long sounds that start rather softly. See Section @ref(peak-ex-sec) for more details.
+
+If you want precise control over output levels, you should turn this feature off by typing:
+@begin(example)
+autonorm-off()@index(autonorm-off)
+@end(example)
+Reenable the automatic normalization feature by typing:
+@begin(example)@index(autonorm-on)
+autonorm-on()
+@end(example)
+
+Play normally produces real-time output. The default is to send audio data to the DAC as it is computed in addition to saving samples in a file. If computation is slower than real-time, output will be choppy, but since the samples end up in a file, you can type @code[(r)] to replay the stored sound. Real-time playback can be disabled by:
+@begin(example)
+sound-off()@index(sound-off)
+@end(example)
+and reenabled by:
+@begin(example)
+sound-on()@index(sound-on)
+@end(example)
+Disabling real-time playback has no effect on @code[(play-file)] or @code[(r)].
+
+While sounds are playing, typing control-A@index(control-A) to Nyquist will push the estimated
+elapsed@index(elapsed audio time) audio time onto the head of the list
+stored in @code(*audio-markers*).
+@index(*audio-markers*)@index(audio markers)@index(markers, audio)
+Because samples are computed in blocks and because there is latency
+between sample computation and sample playback, the elapsed time may not
+be too accurate, and the computed elapsed time may not advance after all
+samples have been computed but the sound is still playing.
+
+@codef[play-file(@pragma(defn)@index(play-file)@i(filename))]@\Play the contents of a sound file named by @i(filename). The @code(s-read) function is used to read the file, and unless
+@i(filename) specifies an absolute path or starts with ``.'', it will be read from
+@code(*default-sf-dir*).
+
+@codef[autonorm-on(@pragma(defn)@index(autonorm-on))]@\Enable automatic adjustment of a scale factor applied to sounds computed using the @code(play) command.
+
+@codef[autonorm-off(@pragma(defn)@index(autonorm-off))]@\Disable automatic adjustment of a scale factor applied to sounds computed using the @code(play) command.
+
+@codef[sound-on(@pragma(defn)@index(sound-on))]@\Enable real-time audio output when sound is computed by the the @code(play) command.
+
+@codef[sound-off(@pragma(defn)@index(sound-off))]@\Disable real-time audio output when sound is computed by the the @code(play) command.
+
+@label(s-save-sec)
+@codef{s-save(@pragma(defn)@index(s-save)@index(save samples to file)@index(write samples to file)@index(output samples to file)@i(expression), @i(maxlen),
+@i(filename)[ ,format: @i(format)] [, mode: @i(mode)] [, bits: @i(bits)] [, swap: @i(flag)] [, play: @i(play)])}@\@label(s-save)Evaluates the @i(expression), which should result in a sound
+or an array of sounds, and writes the result to the given @i(filename). A
+@code(FLONUM) is returned giving the maximum absolute value of all samples
+written. (This is useful for normalizing sounds and detecting sample
+overflow.) If @i(play) is not @code(NIL), the sound will be output through the computer's audio output system. (@i(:play) is not implemented on all systems; if it is implemented, and @i(filename) is @code(NIL), then this will play the file without also writing a file.)
+The latency (length of audio buffering) used to play the sound is 0.3s by default, but see @code(snd-set-latency).
+If
+a multichannel sound (array) is written, the channels are up-sampled to the
+highest rate in any channel so that all channels have the same sample rate.
+The maximum number of samples written per channel is given by @i(maxlen),
+which allows writing the initial part of a very long or infinite sound. A
+header is written according to @i(format), samples are encoded according to
+@i(mode), using @i(bits) bits/sample, and bytes are swapped if @i(swap) is not NIL. Defaults for these are
+@code(*default-sf-format*), @code(*default-sf-mode*), and
+@code(*default-sf-bits*). The default for @i(swap) is NIL.
+The @i(bits) parameter may be 8, 16, or 32. The values for the @i(format) and @i(mode) options are described below:
+@end(fndefs)
+@b(Format)
+@begin(description, leftmargin +2 in, indent -2 in)
+@code(snd-head-none)@\The format is unknown and should be determined
+by reading the file.
+
+@code(snd-head-raw)@\A raw format file has no header.
+
+@code(snd-head-AIFF)@\AIFF format header.
+
+@code(snd-head-IRCAM)@\IRCAM format header.
+
+@code(snd-head-NeXT)@\1024-byte NeXT/SUN format header followed by IRCAM
+header ala CMIX. Note that the NeXT/SUN format has a header-length field,
+so it really is legal to have a large header, even though the normal minimal
+header is only 24 bytes. The additional space leaves room for maximum
+amplitudes, which can be used for normalizing floating-point soundfiles, and
+for other data. Nyquist follows the CMIX convention of placing an IRCAM
+format header immediately after the NeXT-style header.
+
+@code(snd-head-Wave)@\Microsoft Wave format header.
+
+@code(snd-head-*)@\See sndfnint.lsp for more formats.
+@end(description)
+
+@b(Mode)
+@begin(description, leftmargin +2 in, indent -2 in)
+@code(snd-mode-adpcm)@\ADPCM mode (not supported).
+
+@code(snd-mode-pcm)@\signed binary PCM mode.
+
+@code(snd-mode-ulaw)@\8-bit U-Law mode.
+
+@code(snd-mode-alaw)@\8-bit A-Law mode (not supported).
+
+@code(snd-mode-float)@\32-bit floating point mode.
+
+@code(snd-mode-upcm)@\unsigned binary PCM mode.
+
+@code(snd-mode-*)@\See sndfnint.lsp for more modes.
+@end(description)
+
+The defaults for format, mode, and bits are as follows:
+@begin(description, leftmargin +2 in, indent -2 in)
+NeXT and Sun machines:@\@code(snd-head-NeXT), @code(snd-mode-pcm),
+@code(16)
+
+SGI and Macintosh machines:@\@code(snd-head-AIFF), @code(snd-mode-pcm), @code(16)
+
+@end(description)
+
+@begin(fndefs)
+@label(s-read-sec)
+@codef{s-read(@pragma(defn)@index(s-read)@index(read samples from file)@i(filename)[ ,time-offset: @i(offset)] [, srate:
+@i(sr)] [, dur: @i(dur)] [, nchans: @i(chans)] [, format: @i(format)] [, mode: @i(mode),] [bits: @i(n)] [, swap: @i(flag)])}@\Reads a sound from
+ @i(filename). The global @code(*default-sf-dir*) applies. If a header is
+detected, the header is used to determine the format
+of the file, and header information overrides format information provided by
+keywords (except for @code(:time-offset) and @code(:dur)).
+@begin(example)
+s-read("mysound.snd", srate: 44100)
+@end(example)
+specifies a sample rate of 44100 hz, but if the file has a header specifying 22050 hz, the resulting sample rate will be 22050. The parameters are:
+@begin(itemize)
+ @code(:time-offset) @itemsep the amount of time (in seconds) to skip from
+the beginning of the file. The default is 0.0.
+
+@code(:srate) @itemsep the sample rate of the samples in the file. Default is
+@code(*default-sf-srate*) @index(*default-sf-srate*), which is normally 44100.
+
+ @code(:dur) @itemsep the maximum duration in seconds to read. Default is
+10000.
+
+ @code(:nchans) @itemsep the number of channels to read. It is assumed that
+samples from each channel are interleaved. Default is 1.
+
+ @code(:format) @itemsep the header format. See @code(s-save) for details.
+Default is @code(*default-sf-format*), although this parameter is currently
+ignored.
+
+ @code(:mode) @itemsep the sample representation, e.g. PCM or float. See
+@code(s-save) for details. Default is @code(*default-sf-format*).
+
+ @code(:bits) @itemsep the number of bits per sample. See @code(s-save) for
+details. Default is @code(*default-sf-bits*).
+
+ @code(:swap) @itemsep (T or NIL) swap byte order of each sample. Default is NIL.
+@end(itemize)
+If there is an error, for example if @code(:time-offset) is greater than the length of the file, then @code(NIL) is returned rather than a sound. Information about the sound is also returned by @code(s-read) through @code(*rslt*)@foot(Since XLISP does not support multiple value returns, multiple value returns are simulated by having the function assign additional return values in a list to the global variable @code(*rslt*). Since this is a global, it should be inspected or copied immediately after the function return to insure that return values are not overwritten by another function.). The list assigned to @code(*rslt*) is of the form: (@i(format) @i(channels) @i(mode) @i(bits) @i(samplerate) @i(duration) @i(flags) @i(byte-offset)), which are defined as follows:
+@begin(itemize)
+@i(format) @itemsep the header format. See @code(s-save) for details.
+
+@i(channels) @itemsep the number of channels.
+
+@i(mode) @itemsep the sample representation, e.g. PCM or float. See @code(s-save) for details.
+
+@i(bits) @itemsep the number of bits per sample.
+
+@i(samplerate) @itemsep the sample rate, expressed as a @code(FLONUM).
+
+@i(duration) @itemsep the duration of the sound, in seconds.
+
+@i(flags) @itemsep The values for @i(format), @i(channels), @i(mode), @i(bits), @i(samplerate), and @i(duration) are initially just the values passed in as parameters or default values to @code(s-read). If a value is actually read from the sound file header, a flag is set. The flags are: @code(snd-head-format), @code(snd-head-channels), @code(snd-head-mode), @code(snd-head-bits), @code(snd-head-srate), and @code(snd-head-dur). For example,
+@begin(example)
+(let ((flags (caddr (cddddr *rslt*))))
+ (not (zerop (logand flags snd-head-srate))))
+@end(example)
+tells whether the sample rate was specified in the file. See also @code(sf-info) below.
+
+@i(byte-offset) @itemsep the byte offset into the file of the first sample
+to be read (this is used by the @code(s-overwrite) and @code(s-add-to)
+functions).
+@end(itemize)
+
+@codef{s-add-to(@pragma(defn)@index(s-add-to)@index(add to file samples)@index(mix to file)@i(expression), @i(maxlen),
+@i(filename)[ ,@i(offset)])}@\@label(s-add-to-sec)Evaluates the @i(expression), which should result in a sound
+or an array of sounds, and adds the result to the given @i(filename).
+The global @code(*default-sf-dir*) applies. A @code(FLONUM) is returned,
+giving the maximum absolute value of all samples written. The
+sample rate(s) of @i(expression) must match those of the file.
+The maximum number of samples written per channel is given by @i(maxlen),
+which allows writing the initial part of a very long or infinite sound.
+If @i(offset) is specified, the new sound is added to the file beginning at
+an @i(offset) from the beginning (in seconds). The file is extended if
+necessary to accommodate the new addition, but if @i(offset)
+falls outside of the original file, the file is not modified. (If necessary,
+use @code(s-add-to) to extend the file with zeros.)
+The file must be a recognized
+sound file with a header (not a raw sound file).
+
+
+@codef{s-overwrite(@pragma(defn)@index(s-overwrite)@index(replace file samples)@index(overwrite samples)@i(expression), @i(maxlen), @i(filename)[ ,@i(offset)])}@\@label(s-overwrite-sec)Evaluates
+the @i(expression), which should result in a sound
+or an array of sounds, and replaces samples in the given @i(filename).
+The global @code(*default-sf-dir*) applies.
+A @code(FLONUM) is returned, giving the maximum absolute value of all
+samples written. The
+sample rate(s) of @i(expression) must match those of the file.
+The maximum number of samples written per channel is given by @i(maxlen),
+which allows writing the initial part of a very long or infinite sound.
+If @i(offset) is specified, the new sound is written to the file beginning at
+an @i(offset) from the beginning (in seconds). The file is extended if
+necessary to accommodate the new insert, but if @i(offset) falls outside of
+the original file, the file is not modified. (If necessary, use
+@code(s-add-to) to extend the file with zeros.) The file must be a recognized
+sound file with a header (not a raw sound file).
+
+@codef{sf-info(@pragma(defn)@index(sf-info)@index(sound file info)@i(filename))}@\Prints information about a sound file. The parameter @i(filename) is a string. The file is assumed to be in *default-sf-dir* (see @code(soundfilename) below) unless the filename begins with ``.'' or ``/''. The source for this function is in the @code(runtime) and provides an example of how to determine sound file parameters.
+
+@codef{soundfilename(@pragma(defn)@index(soundfilename)@i(name))}@\Converts a string @i(name) to a soundfile name. If @i(name) begins with ``.'' or ``/'', the name is returned without alteration. Otherwise, a path taken from @code(*default-sf-dir*) is prepended to @i(name). The @code(s-plot), @code(s-read), and @code(s-save) functions all use @code(soundfilename) translate filenames.
+
+@codef{s-plot(@pragma(defn)@index(s-plot)@i(sound)[, @i(n), @i(dur)])}@\Plots sound in a window. This function was designed to run a @code(plot) program on a Unix workstation, but now is
+primarily used with @code(jNyqIDE), which has self-contained plotting. Normally,
+time/value pairs in ascii are written to @code(points.dat) and system-dependent code
+(or the @code(jNyqIDE) program) takes it from there. If the @i(sound) is
+longer than the optional @i(dur) (default is 2 seconds), only the
+first @i(dur) seconds are plotted.
+If there are more than @i(n) samples to be plotted, the signal is interpolated
+to have @i(n) samples before plotting.
+The data file used is:
+@begin(description, leftmargin +2 in, indent -2 in)
+@codef(*default-plot-file*)@pragma(defn)@index(*default-plot-file*)@\The file containing the data points, defaults to "points.dat".
+@end(description)
+
+@codef{s-print-tree(@pragma(defn)@index(s-print-tree)@index(snd-print-tree)@i(sound))}@\Prints an ascii
+representation of the internal data structures representing a sound. This
+is useful for debugging@index(debugging) Nyquist. Identical to @code(snd-print-tree).
+
+@end(fndefs)
+
+@section(Low-level Functions)
+Nyquist includes many low-level functions that are used to implement the functions and behaviors described in previous sections. For completeness, these functions are described here. Remember that
+these are low-level functions that are not intended for normal use. Unless
+you are trying to understand the inner workings of Nyquist, you can skip this section.
+
+@subsection(Creating Sounds)
+The basic operations that create sounds are described here.
+
+@begin(fndefs)
+
+@codef[snd-const(@pragma(defn)@index(snd-const)@i(value), @i(t0), @i(srate),
+@i(duration))]@\Returns a sound with constant @i(value), starting at @i(t0)
+with the given @i(duration), at the sample rate @i(srate). You might want
+to use @code(pwl) (see Section @ref(pwl-sec)) instead.
+
+@codef[snd-read(@pragma(defn)@index(snd-read)@i(filename), @i(offset), @i(t0), @i(format),
+@i(channels), @i(mode), @i(bits), @i(swap), @i(sr),
+@i(dur))]@\Loads a sound from a file with name @i(filename). Files are
+assumed to consist of a header followed by frames consisting of one sample
+from each channel. The @i(format) specifies the type of header, but this
+information is currently ignored. Nyquist looks for a number of header
+formats and automatically figures out which format to read. If a header can
+be identified, the header is first read from the file. Then, the file
+pointer is advanced by the indicated
+@i(offset) (in seconds). If there is an unrecognized header, Nyquist will
+assume the file has no header. If the header size is a multiple of the
+frame size (bytes/sample * number-of-channels), you can use @i(offset) to
+skip over the header. To skip N bytes, use an @i(offset) of:
+@begin(example)
+(/ (float N) @i(sr) (/ @i(bits) 8) @i(channels))
+@end(example)
+If the header is not a multiple of the frame size, either write a header or
+contact the author (dannenberg@@cs.cmu.edu) for assistance. Nyquist will
+round @i(offset) to the nearest sample. The resulting sound will start at
+time @i(t0). If a header is found, the file will be interpreted according
+to the header information. If no header was found, @i(channels) tells how
+many channels there are, the samples are encoded according to @i(mode), the
+sample length is @i(bits), and @i(sr) is the sample rate. The @i(swap) flag is 0 or 1, where 1 means to swap sample bytes. The duration to
+be read (in seconds) is given by @i(dur). If @i(dur) is longer than the
+data in the file, then a shorter duration will be returned. If the file
+contains one channel, a sound is returned. If the file contains 2 or more
+channels, an array of sounds is returned. @p(Note:) you probably want to
+call @code(s-read) (see Section @ref(s-read-sec)) instead of
+@code(snd-read). Also, see Section @ref(s-read-sec) for information on the
+@i(mode) and @i(format) parameters.
+
+@codef[snd-save(@pragma(defn)@index(snd-save)@i(expression), @i(maxlen),
+@i(filename), @i(format), @i(mode), @i(bits), @i(swap), @i(play))]@\@label(snd-save)Evaluates
+the @i(expression), which should result in a sound
+or an array of sounds, and writes the result to the given @i(filename). If
+a multichannel sound (array) is written, the channels are up-sampled to the
+highest rate in any channel so that all channels have the same sample rate.
+The maximum number of samples written per channel is given by @i(maxlen),
+which allows writing the initial part of a very long or infinite sound. A
+header is written according to @i(format), samples are encoded according to
+@i(mode), using @i(bits) bits/sample, and swapping bytes if @i(swap) is 1 (otherwise it should be 0).
+If @i(play) is not null, the audio is played in real time (to the extent possible) as it is computed. The peak value of the sound is returned. In addition,
+the symbol @code(*RSLT*) is bound to a list containing the sample rate,
+number of channels, and duration (in that order) of the saved sound.
+@p(Note:) you probably want to call
+@code(s-save) (see Section @ref(s-save-sec)) instead. The @i(format) and
+@i(mode) parameters are described in Section @ref(s-save-sec).
+
+@codef[snd-overwrite(@pragma(defn)@index(snd-overwrite)@i(expression), @i(maxlen), @i(filename), @i(offset), @i(format), @i(mode), @i(bits), @i(swap))]@\@label(snd-overwrite-sec)Evaluates
+the @i(expression), which should result in a sound
+or an array of sounds, and replaces samples in the given @i(filename),
+writing the first frame at a time of @i(offset) seconds. The @i(offset) must
+be less than or equal to the duration of the existing file. The
+duration of the written samples may
+be greater than that of the file, in which case the file is extended
+as necessary. The
+sample rate(s) of @i(expression) and the number of channels
+must match those of the file. If @i(format) is
+ @code(SND-HEAD-RAW), then the file
+format is given by @i(mode) (see
+@code(snd-save), @i(bits) (per channel), @i(swap) (1 means to
+swap bytes and 0 means write them in the native byte order), and the
+number of channels and sample rate of the sound returned by evaluating
+@i(expression). If the
+file is a known
+audio file format, @i(format) should be @code(SND-HEAD-NONE), and the
+other parameters are ignored. Up to a maximum of @i(maxlen)
+samples will be written per channel. The peak value of the sound is returned.
+In addition, the symbol @code(*RSLT*) is bound to a list containing the
+duration of the written sound (which may not be the duration of the sound
+file).
+Use @code(s-add-to) (in Section @ref(s-add-to-sec) or
+@code(s-overwrite) (in Section @ref(s-overwrite-sec) instead of this function.
+
+@codef[snd-coterm(@pragma(defn)@index(snd-coterm)@index(co-termination)@index(duration of
+another sound)@i(s1), @i(s2))]@\Returns a copy of @i(s1), except the start
+time is the maximum of the start times of @i(s1) and @i(s2), and the
+termination time is the minimum of @i(s1) and @i(s2). (After the termination
+time, the sound is zero as if @i(s1) is gated by @i(s2).) Some rationale
+follows: In order to implement @code(s-add-to), we need to read from the
+target sound file, add the sounds to a new sound, and overwrite the result
+back into the file. We only want to write as many samples into the file as
+there are samples in the new sound. However, if we are adding
+in samples read from
+the file, the result of a @code(snd-add) in Nyquist will have the maximum
+duration of either sound. Therefore, we may read to the end of the file.
+What we need is a way to truncate the read, but we cannot easily do that,
+because we do not know in advance how long the new sound will be. The
+solution is to use @code(snd-coterm), which will allow us to truncate the
+sound that is read from the file (@i(s1)) according to the duration of the
+new sound (@i(s2)). When this truncated sound is added to the new sound,
+the result will have only the duration of the new sound, and this can be
+used to overwrite the file. This function is used in the implementation of
+@code(s-add-to), which is defined in @code(runtime/fileio.lsp).
+
+@codef[(snd-from-array @i(...))]@\See @pragma(startref) page @pageref(snd-from-array-sec).
+
+@codef[snd-white(@pragma(defn)@index(snd-white)@i(t0), @i(sr), @i(d))]@\Generate white noise, starting at
+@i(t0), with sample rate @i(sr), and duration @i(d). You probably want to
+use @code(noise) (see Section @ref(noise-sec)).
+
+ @codef[snd-zero(@pragma(defn)@index(snd-zero)@i(t0), @i(srate))]@\Creates a sound that is
+zero everywhere, starts at @i(t0), and has sample rate @i(srate). The
+logical stop time is immediate, i.e. also at @i(t0). You probably want
+to use @code(pwl) (see Section @ref(pwl-sec)) instead.
+
+ @codef[get-slider-value(@pragma(defn)@index(get-slider-value)@i(index))]@\@label(get-slider-value-sec)Return the current value of the slider
+named by @i(index) (an integer index into the array of sliders).
+Note that this ``slider'' is just a floating point
+value in an array. Sliders can be changed by OSC messages (see @code(osc-enable)) and by sending character
+sequences to Nyquist's standard input. (Normally, these character sequences would
+not be typed but generated by the jNyqIDE interactive development environment, which
+runs Nyquist as a sub-process, and which present the user with graphical sliders.)
+
+@codef[snd-slider(@pragma(defn)@index(snd-slider)@i(index), @i(t0), @i(srate), @i(duration))]@\@label(snd-slider-sec)Create
+a sound controlled by the slider named by @i(index) (an integer
+index into the array of sliders; see @code(get-slider-value) for more information).
+The function returns a sound. Since Nyquist sounds are computed in blocks of samples,
+and each block is computed at once, each block will contain copies of the current slider
+value. To obtain reasonable responsiveness, slider sounds should have high (audio)
+sample rates so that the block rate will be reasonably high. Also, consider lowering the audio
+latency using @code(snd-set-latency). To ``trigger'' a Nyquist behavior using slider input, see the @code(trigger) function in Section @ref(trigger-sec).
+
+@end(fndefs)
+
+@subsection(Signal Operations)
+This next set of functions take sounds as arguments, operate on them, and
+return a sound.
+
+@begin(fndefs)
+@codef[snd-abs(@pragma(defn)@index(snd-abs)@index(absolute value)@i(sound))]@\Computes a new
+sound where each sample is the absolute value of the corresponding sample in
+@i(sound). You should probably use @code(s-abs) instead. (See Section @ref(s-abs-sec).)
+
+@codef[snd-sqrt(@pragma(defn)@index(snd-sqrt)@index(square root)@i(sound))]@\Computes a new
+sound where each sample is the square root of the corresponding sample in
+@i(sound). If a sample is negative, it is taken to be zero to avoid raising a floating point error. You should probably use @code(s-sqrt) instead. (See Section @ref(s-sqrt-sec).)
+
+ @codef[snd-add(@pragma(defn)@index(snd-add)@i(sound1), @i(sound))]@\Adds two sounds. The
+resulting start time is the minimum of the two parameter start times, the
+logical stop time is the maximum of the two parameter stop times, and the
+sample rate is the maximum of the two parameter sample rates. Use
+@code(sim) or @code(sum) instead of @code(snd-add) (see Section @ref(sim-sec)).
+
+@codef[snd-offset(@pragma(defn)@index(snd-offset)@index(offset to a sound)@index(add
+offset to sound)@i(sound), @i(offset))]@\Add an offset to a sound. The
+resulting start time, logical stop time, stop time, and sample rate are
+those of @i(sound). Use @code(sum) instead (see Section @ref(sim-sec)).
+
+@codef[snd-avg(@pragma(defn)@index(snd-avg)@index(moving average)@index(RMS)@index(average)@i(sound), @i(blocksize), @i(stepsize), @i(operation))]@\Computes the averages
+or peak values of blocks of samples. Each output sample is an average or
+peak of @i(blocksize) (a fixnum) adjacent samples from the input @i(sound).
+After each average or peak is taken, the input is advanced by @i(stepsize),
+a fixnum which may be greater or less than @i(blocksize). The output
+sample rate is the @i(sound) (input) sample rate divided by @i(stepsize).
+This function is useful for computing low-sample-rate rms or peak
+amplitude signals for input to @code(snd-gate) or @code(snd-follow).
+To select the operation, @i(operation) should be one of @code(OP-AVERAGE)
+or @code(OP-PEAK). (These are global lisp variables; the actual
+@i(operation) parameter is an integer.) For RMS computation, see
+@code(rms) in Section @ref(rms-sec).
+
+@codef[snd-clip(@index(clip)@pragma(defn)@index(snd-clip)@i(sound), @i(peak))]@\Hard limit @i(sound)
+to the given @i(peak), a positive number. The samples of @i(sound) are constrained between an upper value
+of @i(peak) and a lower value of @subtract()@i(peak). Use @code(clip) instead (see Section @ref(clip-sec)).
+
+@codef[snd-compose(@index(compose)@index(signal composition)@pragma(defn)@index(snd-compose)@i(f), @i(g))]@\Compose two signals, i.e.
+compute @i(f)(@i(g)(@i(t))), where @i(f) and @i(g) are sounds. This function
+is used primarily to implement time warping, but it can be used in other
+applications such as frequency modulation. For each sample @i(x) in @i(g),
+@i(snd-compose) looks up the value of @i(f)(@i(x)) using linear
+interpolation. The resulting sample rate, start time, etc. are taken from
+@i(g). The sound @i(f) is used in effect as a lookup table, but it is
+assumed that @i(g) is non-decreasing, so that @i(f) is accessed in time
+order. This allows samples of @i(f) to be computed and discarded
+incrementally. If in fact @i(g) decreases, the current sample of @i(g) is
+replaced by the previous one, forcing @i(g) into compliance with the
+non-decreasing restriction. See also @code(sref), @code(shape), and
+@code(snd-resample).
+
+For an extended example that uses @code(snd-compose) for variable pitch shifting,
+see @code(demos/pitch_change.htm).@index(demos, pitch change)@index(pitch shifting)
+@index(variable-resample function)@index(resampling)
+
+@label(snd-tapv-sec)
+@codef[snd-tapv(@pragma(defn)@index(snd-tapv)@index(tap)@index(variable delay)@index(delay,
+variable)@index(chorus)@i(sound), @i(offset), @i(vardelay), @i(maxdelay))]@\A
+variable delay: @i(sound) is delayed by the sum of @i(offset) (a @code(FIXNUM) or @code(FLONUM))
+and @i(vardelay) (a @code(SOUND)). The specified delay is adjusted to lie in the range
+of zero to @i(maxdelay) seconds to yield the actual delay, and the delay is
+implemented using linear interpolation. This function was designed specifically
+for use in a chorus effect: the @i(offset) is set to half of @i(maxdelay), and
+the @i(vardelay) input is a slow sinusoid. The maximum delay is limited to
+@i(maxdelay), which determines the length of a fixed-sized buffer. The function
+@code(tapv) is equivalent and preferred (see Section @ref(tapv-sec)).
+
+@codef[snd-tapf(@pragma(defn)@index(snd-tapf)@index(variable delay)@index(delay, variable)@i(sound), @i(offset), @i(vardelay), @i(maxdelay))]@\A
+variable delay like @code(snd-tapv) except there is no linear interpolation. By
+eliminating interpolation, the output is an exact copy of the input with no filtering
+or distortion. On the other hand, delays jump by samples causing samples to double or
+skip even when the delay is changed smoothly.
+
+@codef[snd-copy(@pragma(defn)@index(snd-copy)@i(sound))]@\Makes a copy of @i(sound).
+Since operators always make (logical) copies of their sound parameters, this
+function should never be needed. This function is here for debugging@index(dubugging).
+
+@codef[snd-down(@pragma(defn)@index(snd-down)@i(srate), @i(sound))]@\Linear interpolation
+of samples down to the given sample rate @i(srate), which must be lower than
+the sample rate of @i(sound). Do not call this function. Nyquist performs
+sample-rate conversion automatically as needed. If you want to force a
+conversion, call @code(force-srate) (see Section @ref(force-srate-sec)).
+
+@codef[snd-exp(@pragma(defn)@index(snd-exp)@i(sound))]@\Compute the exponential of each sample of @i(sound). Use @code(s-exp) instead (see Section @ref(s-exp-sec)).
+
+@label(snd-follow-sec)
+@codef[snd-follow(@pragma(defn)@index(snd-follow)@index(follower)@index(envelope follower)@i(sound), @i(floor), @i(risetime), @i(falltime), @i(lookahead))]@\An envelope
+follower. The basic goal of this function is to generate a smooth signal
+that rides on the peaks of the input signal. The usual objective is to
+produce an amplitude envelope given a low-sample rate (control rate)
+signal representing local RMS measurements. The first argument is the
+input signal. The @i(floor) is the minimum output value. The @i(risetime) is the time (in seconds) it takes for the output to rise (exponentially) from @i(floor) to unity (1.0) and the @i(falltime) is the time it takes for the output to fall (exponentially) from unity to @i(floor). The algorithm looks ahead for peaks and will begin to increase the output signal according to @i(risetime) in anticipation of a peak. The amount of anticipation (in sampless) is given by @i(lookahead). The algorithm is as follows: the output value is allowed to increase according to @i(risetime) or decrease according to @i(falltime). If the next input sample is in this range, that sample is simply output as the next output sample. If the next input sample is too large, the algorithm goes back in time as far as necessary to compute an envelope that rises according to @i(risetime) to meet the new value. The algorithm will only work backward as far as @i(lookahead). If that is not far enough, then there is a final forward pass computing a rising signal from the earliest output sample. In this case, the output signal will be at least momentarily less than the input signal and will continue to rise exponentially until it intersects the input signal. If the input signal falls faster than indicated by @i(falltime), the output fall rate will be limited by @i(falltime), and the fall in output will stop when the output reaches @i(floor). This algorithm can make two passes througth the buffer on sharply rising inputs, so it is not particularly fast. With short buffers and low sample rates this should not matter. See @code(snd-avg) above for a function that can help to generate a low-sample-rate input for @code(snd-follow). See @code(snd-chase) in Section @ref(snd-chase-sec) for a related filter.
+
+@codef[snd-gate(@pragma(defn)@index(snd-gate)@index(noise gate)@index(gate)@i(sound), @i(lookahead), @i(risetime), @i(falltime), @i(floor), @i(threshold))]@\This function generates an exponential rise and decay intended for noise gate implementation. The decay starts when the signal drops below threshold and stays there for longer than lookahead. Decay continues until the value reaches floor, at which point the decay stops and the output value is held constant. Either during the decay or after the floor is reached, if the signal goes above threshold, then the output value will rise to unity (1.0) at the point the signal crosses the threshold. Again, look-ahead is used, so the rise actually starts before the signal crosses the threshold. The rise is a constant-rate exponential and set so that a rise from @i(floor) to unity occurs in @i(risetime). Similarly, the fall is a constant-rate exponential such that a fall from unity to @i(floor) takes @i(falltime). The result is delayed by @i(lookahead), so the output is not actually synchronized with the input. To compensate, you should drop the initial @i(lookahead) of samples. Thus, @code(snd-gate) is not recommended for direct use. Use @code(gate) instead (see Section @ref(gate-sec)).
+
+@codef[snd-inverse(@index(inverse)@pragma(defn)@index(snd-inverse)@i(signal), @i(start), @i(srate))]@\Compute the function inverse of @i(signal), that is, compute @i(g)(@i(t)) such that @i(signal)(@i(g)(@i(t))) = @i(t). This function assumes that @i(signal) is non-decreasing, it uses linear interpolation, the resulting sample rate is @i(srate), and the result is shifted to have a starting time of @i(start). If @i(signal) decreases, the true inverse may be undefined, so we define @code(snd-inverse) operationally as follows: for each output time point @i(t), scan ahead in @i(signal) until the value of signal exceeds @i(t). Interpolate to find an exact time point @i(x) from @i(signal) and output @i(x) at time @i(t). This function is intended for internal system use in implementing time warps.
+
+@codef[snd-log(@pragma(defn)@index(snd-log)@i(sound))]@\Compute the natural logorithm of each sample of @i(sound). Use @code(s-log) instead (see Section @ref(s-log-sec)).
+
+@label(peak-sec)
+@codef[peak(@index(peak, maximum amplitude)@pragma(defn)@index(peak)@i(expression), @i(maxlen))]@\Compute the maximum absolute value of the amplitude of a sound. The sound is created by evaluating @i(expression) (as in @code(s-save)). Only the first @i(maxlen) samples are evaluated. The @i(expression) is automatically quoted (@code(peak) is a macro), so do not quote this parameter. If @i(expression) is a variable, then the @i(global binding) of that variable will be used. Also, since the variable retains a reference to the sound, the sound will be evaluated and left in memory. See Section @ref(peak-ex-sec) on @pragma(startref) page @pageref(peak-ex-sec) for examples.
+
+@label(snd-max-sec)
+@codef[snd-max(@pragma(defn)@index(snd-max)@index(maximum amplitude)@i(expression), @i(maxlen))]@\Compute the maximum absolute value of the amplitude of a sound. The sound is created by evaluating @i(expression) (as in @code(snd-save)), which is therefore normally quoted by the caller. At most @i(maxlen) samples are computed. The result is the maximum of the absolute values of the samples. @p(Notes:) It is recommended to use @code(peak) (see above) instead. If you want to find the maximum of a sound bound to a local variable and it is acceptable to save the samples in memory, then this is probably the function to call. Otherwise, use @code(peak).
+
+@codef[snd-maxv(@pragma(defn)@index(snd-maxv)@index(maximum of two sounds)@i(sound1), @i(sound2))]@\Compute the maximum of @i(sound1) and @i(sound2) on a sample-by-sample basis. The resulting
+sound has its start time at the maximum of the input start times and a logical stop
+at the minimum logical stop of the inputs. The physical stop time is the minimum of
+the physical stop times of the two sounds. @i(Note that this violates the ``normal''
+interpretation that sounds are zero outside their start and stop times. For
+example, even if) sound1 @i(extends beyond) sound2 @i(and is greater than zero,
+the result
+value in this extension will be zero because it will be after the physical stop time,
+whereas if we simply treated) sound2 @i(as zero in this region and took the maximum, we
+would get a non-zero result.) Use @code(s-max) instead (see Section @ref(s-max-sec)).
+
+@codef[snd-normalize(@pragma(defn)@index(snd-normalize)@i(sound))]@\Internally, sounds
+are stored with a scale factor that applies to all samples of the sound.
+All operators that take sound arguments take this scale factor into account
+(although it is not always necessary to perform an actual multiply per
+sample), so you should never need to call this function. This function
+multiplies each sample of a sound by its scale factor, returning a sound
+that represents the same signal, but whose scale factor is 1.0.
+
+@codef[snd-oneshot(@pragma(defn)@index(snd-oneshot)@index(oneshot)@index(threshold)@i(sound), @i(threshold), @i(ontime))]@\Computes a new sound that is zero
+except where @i(sound) exceeds threshold. From these points, the result is
+1.0 until @i(sound) remains below @i(threshold) for @i(ontime) (in seconds).
+The result has the same sample rate, start time, logical stop time, and
+duration as @i(sound).
+
+@codef[snd-prod(@pragma(defn)@index(snd-prod)@index(signal multiplication)@index(multiplication)@i(sound1), @i(sound2))]@\Computes the
+product of @i(sound1) and @i(sound2). The resulting sound has its start
+time at the maximum of the input start times and a logical stop at the minimum
+logical stop of the inputs. Do not use this function. Use @code(mult) or
+@code(prod) instead (see Section @ref(mult-sec)). Sample rate, start time, etc. are taken from @i(sound).
+
+@codef[snd-pwl(@pragma(defn)@index(snd-pwl)@index(piece-wise linear)@i(t0), @i(sr),
+@i(lis))]@\Computes a piece-wise linear function according to the breakpoints
+in @i(lis). The starting time is @i(t0), and the sample rate is @i(sr).
+The breakpoints are passed in an XLISP list (of type @code(LVAL)) where the
+list alternates sample numbers (@code(FIXNUM)s, computed in samples
+from the beginning of the pwl function) and values (the value of the pwl
+function, given as a @code(FLONUM)). There is an implicit starting
+point of (0, 0). The list must contain an odd number of points, the omitted
+last
+value being implicitly zero (0). The list is assumed to be well-formed. Do
+not call this function. Use @code(pwl) instead (see Section @ref(pwl-sec)).
+
+@codef[snd-quantize(@pragma(defn)@index(snd-quantize)@i(sound), @i(steps))]@\Quantizes a sound. See Section
+@ref(quantize-sec) for details.
+
+@codef[snd-recip(@pragma(defn)@index(snd-recip)@i(sound))]@\Compute the reciprocal of each sample of @i(sound). Use @code(recip) instead (see Section @ref(recip-sec)).
+
+@codef[snd-resample(@pragma(defn)@index(snd-resample)@index(sample interpolation)@i(f),
+@i(rate))]@\Resample sound @i(f) using high-quality interpolation, yielding
+a new sound with the specified @i(rate). The result is scaled by 0.95 because often,
+in resampling, interpolated values exceed the original sample values, and this
+could lead to clipping.
+The resulting start time, etc. are taken from
+@i(f). Use @code(resample) instead.
+
+@codef[snd-resamplev(@pragma(defn)@index(snd-resamplev)@index(sample interpolation)@index(signal composition)@i(f), @i(rate), @i(g))]@\Compose two
+signals, i.e. compute @i(f)(@i(g)(@i(t))), where @i(f) and @i(g) are
+sounds. The result has sample rate given by @i(rate). At each time @i(t)
+(according to the @i(rate)), @i(g) is linearly interpolated to yield an
+increasing sequence of high-precision score-time values. @i(f) is then
+interpolated at each value to yield a result sample. If in fact @i(g)
+decreases, the current sample of @i(g) is replaced by the previous one,
+forcing @i(g) into compliance with the non-decreasing restriction.
+The result is scaled by 0.95 because often,
+in resampling, interpolated values exceed the original sample values, and this
+could lead to clipping. Note that
+if @i(g) has a high sample rate, this may introduce unwanted jitter into
+sample times. See @code(sound-warp) for a detailed discussion. See
+@code(snd-compose) for a fast, low-quality alternative to this function.
+Normally, you should use @code(sound-warp) instead of this function.
+
+
+@codef[snd-scale(@pragma(defn)@index(snd-scale)@i(scale), @i(sound))]@\Scales the amplitude of @i(sound) by the factor @i(scale). Use @code(scale) instead (see Section
+@ref(scale-sec)).
+
+@codef{snd-shape(@pragma(defn)@index(snd-shape)@i(signal), @i(table), @i(origin))}@\A waveshaping function. This is the primitive upon which @code(shape) is based. The @code(snd-shape) function is like @code(shape) except that @i(signal) and @i(table) must be (single-channel) sounds. Use @code(shape) instead (see Section @ref(shape-sec)).
+
+@codef[snd-up(@pragma(defn)@index(snd-up)@i(srate), @i(sound))]@\Increases sample rate by linear
+interpolation. The @i(sound) is the signal to be up-sampled, and @i(srate)
+is the output sample rate. Do not call this function. Nyquist performs
+sample-rate conversion automatically as needed. If you want to force a
+conversion, call @code(force-srate) (see Section @ref(force-srate-sec)).
+
+@label(snd-xform-sec)
+@codef[snd-xform(@pragma(defn)@index(snd-xform)@i(sound), @i(sr), @i(time), @i(start),
+@i(stop), @i(scale))]@\Makes a copy of @i(sound) and then alters it in
+the following order: (1) the start time (@code(snd-t0)) of the sound is shifted to
+@i(time), (1) the sound is stretched as a result of setting the sample rate
+to @i(sr) (the start time is unchanged by this), (3) the sound is clipped
+ from @i(start) to @i(stop), (4) if @i(start) is greater than @i(time), the sound is shifted
+shifted by @i(time) - @i(start), so that the start time is @i(time), (5) the
+sound is scaled by @i(scale). An empty (zero) sound at @i(time) will be
+returned if all samples are clipped. Normally, you should accomplish all
+this using transformations. A transformation applied to a sound has no
+effect, so use @code(cue) to create a transformable sound (see Section
+@ref(use-sounds-sec)).
+
+@label(snd-yin-sec)
+@codef{snd-yin(@pragma(defn)@index(snd-yin)@i(sound), @i(minstep), @i(maxstep), @i(rate))}@\Identical to
+@code[yin]. See Section @ref(yin-sec).
+
+@end(fndefs)
+
+@subsection(Filters)
+These are also ``Signal Operators,'' the subject of the previous section,
+but there are so many filter functions, they are
+documented in this special section.
+
+Some filters allow time-varying filter parameters. In these functions,
+filter coefficients are calculated at the sample rate of the filter
+parameter, and coefficients are not interpolated.
+
+@begin(fndefs)
+
+@codef[snd-alpass(@pragma(defn)@index(snd-alpass)@i(sound), @i(delay), @i(feedback))]@\An all-pass filter. This produces a repeating echo effect without the resonances of @code(snd-delay). The @i(feedback) should be less than one to avoid exponential amplitude blowup. Delay is rounded to the nearest sample. You should use @code(alpass) instead (see Section @ref(alpass-sec)).
+
+@codef[snd-alpasscv(@pragma(defn)@index(snd-alpasscv)@i(sound), @i(delay),
+@i(feedback))]@\An all-pass filter with variable @i(feedback).
+This is just like @i(snd-alpass) except @i(feedback) is a sound.
+You should use @code(alpass) instead (see Section @ref(alpass-sec)).
+
+@codef[snd-alpassvv(@pragma(defn)@index(snd-alpassvv)@i(sound), @i(delay), @i(feedback), @i(maxdelay))]@\An all-pass filter with variable @i(feedback) and @i(delay). This is just like @i(snd-alpass) except @i(feedback) and @i(delay) are sounds, and there is an additional @code(FLONUM) parameter, @i(maxdelay), that gives an upper bound on the value of @i(delay). @p(Note:) @i(delay) must remain between zero and @i(maxdelay). If not, results are undefined, and Nyquist may crash. You should use @code(alpass) instead (see Section @ref(alpass-sec)).
+
+@codef[snd-areson(@pragma(defn)@index(snd-areson)@i(sound), @i(hz), @i(bw),
+@i(normalization))]@\A notch filter modeled after the @code(areson)
+unit generator in Csound. The @code(snd-areson) filter is an exact
+complement of @code(snd-reson) such that if both are applied to the
+same signal with the same parameters, the sum of the results yeilds
+the original signal. Note that because of this complementary design,
+the power is not normalized as in @code(snd-reson). See @code(snd-reson)
+for details on @i(normalization). You should use @code(areson) instead (see
+Section @ref(areson-sec)).
+
+@codef[snd-aresoncv(@pragma(defn)@index(snd-aresoncv)@i(sound), @i(hz), @i(bw),
+@i(normalization))]@\This function is identical to @code(snd-areson) except
+the @i(bw) (bandwidth) parameter is a sound. Filter coefficients are
+updated at the sample rate of @i(bw). The ``@code(cv)'' suffix stands for Constant,
+Variable, indicating that @i(hz) and @i(bw) are constant (a number) and
+variable (a sound), respectively. This naming convention is used throughout.
+You should use @code(areson) instead (see
+Section @ref(areson-sec)).
+
+@codef[snd-aresonvc(@pragma(defn)@index(snd-aresonvc)@i(sound), @i(hz), @i(bw),
+@i(normalization))]@\This function is identical to @code(snd-areson) except
+the @i(hz) (center frequency) parameter is a sound. Filter coefficients are
+updated at the sample rate of @i(hz).
+You should use @code(areson) instead (see
+Section @ref(areson-sec)).
+
+@codef[snd-aresonvv(@pragma(defn)@index(snd-aresonvv)@i(sound), @i(hz), @i(bw),
+@i(normalization))]@\This function is identical to @code(snd-areson) except
+both @i(hz) (center frequency) and @i(bw) (bandwidth) are sounds. Filter
+coefficients are updated at the next sample of either @i(hz) or @i(bw).
+You should use @code(areson) instead (see
+Section @ref(areson-sec)).
+
+@codef[snd-atone(@pragma(defn)@index(snd-atone)@i(sound), @i(hz))]@\A high-pass filter
+modeled after the @code(atone) unit generator in Csound. The @code(snd-atone) filter is an exact
+complement of @code(snd-tone) such that if both are applied to the
+same signal with the same parameters, the sum of the results yeilds
+the original signal. You should use @code(hp) instead (see
+Section @ref(hp-sec)).
+
+@codef[snd-atonev(@pragma(defn)@index(snd-atonev)@i(sound), @i(hz))]@\This is just like
+@code(snd-atone) except that the @i(hz) cutoff frequency is a sound. Filter
+coefficients are updated at the sample rate of @i(hz). You should use
+@code(hp) instead (see Section @ref(hp-sec)).
+
+@codef[snd-biquad(@pragma(defn)@index(snd-biquad)@i(sound), @i(b0), @i(b1), @i(b2), @i(a1), @i(a2), @i(z1init), @i(z2init))]@\A general second order IIR filter, where @i(a0) is assumed to be unity. For @i(a1) and @i(a2), the sign convention is opposite to that of Matlab. All parameters except the input @i(sound) are of type @code(FLONUM). You should probably use one of @code(lowpass2), @code(highpass2), @code(bandpass2), @code(notch2), @code(allpass2), @code(eq-lowshelf), @code(eq-highshelf), @code(eq-band), @code(lowpass4), @code(lowpass6), @code(lowpass8), @code(highpass4), @code(highpass6), or @code(highpass8), which are all based on @code(snd-biquad) and described in Section @ref(lowpass2-sec). For completeness, you will also find @code(biquad) and @code(biquad-m) described in that section.
+
+@label(snd-chase-sec)
+@codef[snd-chase(@pragma(defn)@index(snd-chase)@i(sound), @i(risetime), @i(falltime))]@\A slew rate limiter. The output ``chases'' the input at rates determined by @i(risetime) and @i(falltime). If the input changes too fast, the output will lag behind the input. This is a form of lowpass filter, but it was created to turn hard-switching square waves into smoother control signals that could be used for linear crossfades. If the input switches from 0 to 1, the output will linearly rise to 1 in @i(risetime) seconds. If the input switches from 1 to 0, the output will linearly fall to 0 in @i(falltime) seconds. The generated slope is constant; the transition is linear; this is not an exponential rise or fall. The @i(risetime) and @i(falltime) must be scalar constants; complain to the author if this is not adequate. The @code(snd-chase) function is safe for ordinary use. See @code(snd-follow) in Section @ref(snd-follow-sec) for a related function.
+
+@codef[snd-congen(@pragma(defn)@index(snd-congen)@i(gate), @i(risetime), @i(falltime))]@\A simple ``contour generator'' based
+on analog synthesizers. The @i(gate) is a sound that normally steps from 0.0 to 1.0 at the start of an envelop and goes from
+1.0 back to 0.0 at the beginning of the release. At each sample, the output converges to the input exponentially. If @i(gate) is greater than the output, e.g. the attack, then the output converges half-way to the output in @i(risetime). If the @i(gate) is less than the output, the half-time is @i(falltime). The sample rate, starting time, logical-stop-time, and terminate time are taken from @i(gate). You should use @code(congen) instead (see Section @ref(congen-sec).
+
+@codef[snd-convolve(@pragma(defn)@index(snd-convolve)@i(sound), @i(response))]@\Convolves
+@i(sound) by @i(response) using a simple O(N x M) algorithm. The @i(sound)
+can be any length, but the @i(response) is computed and stored in a table. The required compuation time per sample and total space are proportional to the
+length of @i(response). Use @code(convolve) instead (see Section
+@ref(convolve-sec)).
+
+@codef[snd-delay(@pragma(defn)@index(snd-delay)@i(sound), @i(delay), @i(feedback))]@\Feedback
+delay. The output, initially @i(sound), is recursively delayed by @i(delay), scaled by @i(feedback), and added to itself, producing an repeating echo effect. The @i(feedback) should be less than one to avoid exponential amplitude blowup. Delay is rounded to the nearest sample. You should use @code(feedback-delay) instead (see Section @ref(feedback-delay-sec))
+
+@codef[snd-delaycv(@pragma(defn)@index(snd-delaycv)@i(sound), @i(delay),
+@i(feedback))]@\Feedback delay with variable @i(feedback). This is just like
+@i(snd-delay) except @i(feedback) is a sound. You should use
+@code(feedback-delay) instead (see Section @ref(feedback-delay-sec)).
+
+@codef[snd-reson(@pragma(defn)@index(snd-reson)@i(sound), @i(hz), @i(bw), @i(normalization))]@\A
+second-order resonating (bandpass) filter with center frequency @i(hz) and
+bandwidth @i(bw), modeled after the @code(reson) unit generator in Csound.
+The @i(normalization) parameter must be an integer and (like in Csound)
+specifies a scaling factor. A value of 1 specifies a peak amplitude
+response of 1.0; all frequencies other than @i(hz) are attenuated. A
+value of 2 specifies the overall RMS value of the amplitude response
+is 1.0; thus filtered white noise would retain the same power. A value of
+zero specifies no scaling. The result sample rate, start time, etc. are takend from @i(sound).
+You should use @code(reson) instead (see Section
+@ref(reson-sec)).
+
+@codef[snd-resoncv(@pragma(defn)@index(snd-resoncv)@i(sound), @i(hz), @i(bw),
+@i(normalization))]@\This function is identical to @code(snd-reson) except
+@i(bw) (bandwidth) is a sound. Filter coefficients are updated at the
+sample rate of @i(bw). You should use @code(reson) instead (see Section
+@ref(reson-sec)).
+
+@codef[snd-resonvc(@pragma(defn)@index(snd-resonvc)@i(sound), @i(hz), @i(bw),
+@i(normalization))]@\This function is identical to @code(snd-reson) except
+@i(hz) (center frequency) is a sound. Filter coefficients are updated at the
+sample rate of @i(hz). You should use @code(reson) instead (see Section
+@ref(reson-sec)).
+
+@codef[snd-resonvv(@pragma(defn)@index(snd-resonvv)@i(sound), @i(hz), @i(bw),
+@i(normalization))]@\This function is identical to @code(snd-reson) except
+botth @i(hz) (center frequency) and @i(bw) (bandwidth) are sounds. Filter
+coefficients are updated at the next sample from either @i(hz) or @i(bw). You should use @code(reson) instead (see Section
+@ref(reson-sec)).
+
+@codef[snd-stkchorus(@pragma(defn)@index(snd-stkchorus)@index(chorus)@index(effect, chorus)@index(STK chorus)@i(sound), @i(delay), @i(depth), @i(freq), @i(mix),
+@i(sr))]@\A chorus implemented in STK. The parameter @i(delay) is a @code(FIXNUM)
+representing the median desired delay length in samples. A typical
+value is 6000. The @code(FLONUM) parameters @i(depth) and @i(freq) set the modulation
+depth (from 0 to 1) and modulation frequency (in Hz), @i(mix) sets the mixture
+of input sound and chorused sound, where a value of 0.0 means input sound
+only (dry) and a value of 1.0 means chorused sound only (wet).
+The parameter @i(sr) is the desired sample rate of the resulting sound@foot(This
+is probably a mistake since sample rate is implied by @i(sound). This parameter
+may be removed in a future release.) You should use @code(pitshift) instead
+(see Section @ref(stkchorus-sec)).
+
+@codef[snd-stkpitshift(@pragma(defn)@index(snd-stkpitshift)@index(pitch shift)@index(effect, pitch shift)@index(STK pitch shift)@i(sound), @i(shift), @i(mix), @i(sr))]@\A
+pitch shifter implemented in STK. The @i(sound) is shifted in pitch by
+@i(shift), a @code(FLONUM) representing the shift factor. A value of 1.0 means
+ no shift. The parameter @i(mix) sets the mixture of input and shifted sounds.
+A value of 0.0 means input only (dry) and a value of 1.0 means shifted
+sound only (wet). The @i(sr) is the desired sampling frequency.@foot(This
+is probably a mistake since sample rate is implied by @i(sound). This parameter
+may be removed in a future release.) You should use @code(pitshift) instead
+(see Section @ref(stkpitshift-sec)).
+
+@codef[snd-stkrev(@pragma(defn)@index(snd-stkrev)@index(reverb)@index(effect, reverberation)@index(STK reverb)@i(rev-type), @i(sound), @i(decay), @i(mix), @i(sr))]@\A reverb
+implemented in STK. The parameter rev-type is a @code(FIXNUM) ranging from zero to
+two and selects the type of reverb. Zero selects NRev type, one selects JCRev,
+and two selects PRCRev. The input @i(sound) is processed by the reverb with
+a @i(decay) time in seconds (a @code(FLONUM)). The @i(mix), a @code(FLONUM),
+sets the
+mixture of dry input and reverb output. A value of 0.0 means input only (dry)
+and a value of 1.0 means reverb only (wet). The sample rate
+is @i(sr)@foot(This is probably a mistake since sample rate is implied
+by @i(sound). This parameter may be removed in a future release.) You
+should use @code(nrev), @code(jcrev) or @code(prcrev) instead (see
+Section @ref(stkrev-sec)).
+
+@codef[snd-tone(@pragma(defn)@index(snd-tone)@index(low-pass filter)@i(sound), @i(hz))]@\A
+first-order recursive low-pass filter, based on the @i(tone) unit generator
+of Csound. The @i(hz) parameter is the cutoff frequency, the response
+curve's half-power point. The result sample rate, start time, etc. are takend from @i(sound).
+You should use @code(lp) instead (see Section
+@ref(lp-sec)).
+
+@codef[snd-tonev(@pragma(defn)@index(snd-tonev)@i(sound), @i(hz))]@\This function is
+identical to @code(snd-tone) except @i(hz) (cutoff frequency) is a sound.
+The filter coefficients are updated at the sample rate of @i(hz). You
+should use @code(lp) instead (see Section
+@ref(lp-sec)).
+
+
+@end(fndefs)
+
+
+@subsection(Table-Lookup Oscillator Functions)
+These functions all use a sound to describe one period of a periodic
+waveform. In the current implementation, the sound samples are copied to an
+array (the waveform table) when the function is called. To make a
+table-lookup oscillator generate a specific pitch, we need to have several
+pieces of information:
+@begin(itemize)
+A waveform to put into the table. This comes from the @i(sound) parameter.
+
+The length (in samples) of the waveform. This is obtained by reading
+samples (starting at the sound's start time, not necessarily at time zero)
+until the physical stop time of the sound. (If you read the waveform from a
+file or generate it with functions like @code(sim) and @code(sine), then the
+physical and logical stop times will be the same and will correspond to the
+duration you specified, rounded to the nearest sample.)
+
+The intrinsic sample rate of the waveform. This sample rate is simply the
+sample rate property of @i(sound).
+
+The pitch of the waveform. This is supplied by the @i(step) parameter and
+indicates the pitch (in steps) of @i(sound). You might expect that the
+pitch would be related to the period (length) of @i(sound), but there is the
+interesting case that synthesis based on sampling often loops over multiple
+periods. This means that the fundamental frequency of a generated tone may
+be some multiple of the looping rate. In Nyquist, you always specify the
+perceived pitch of the looped @i(sound) if the sound is played at the
+@i(sound)'s own sample rate.
+
+The desired pitch. This is specified by the @i(hz) parameter
+in Hertz (cycles per second) in these low-level functions. Note that this
+is not necessarily the ``loop'' rate at which the table is scanned.
+Instead, Nyquist figures what sample rate conversion would be necessary to
+``transpose'' from the @i(step) which specifies the original pitch of
+@i(sound) to @i(hz), which gives the desired pitch. The mixed use of steps
+and Hertz came about because it seemed that sample tables would be tagged
+with steps (``I sampled a middle-C''), whereas frequency deviation in the
+@code(fmosc) function is linear, thus calling for a specification in Hertz.
+
+The desired sample rate. This is given by the @i(sr) parameter in Hertz.
+@end(itemize)
+
+Other parameters common to all of these oscillator functions are:
+@begin(itemize)
+@i(t0), the starting time, and
+
+@i(phase), the starting phase in degrees. Note that if the @i(step)
+parameter indicates that the table holds more than one fundamental period, then a starting phase of 360 will be different than a starting phase of 0.
+@end(itemize)
+
+@begin(fndefs)
+ @codef[snd-amosc(@pragma(defn)@index(snd-amosc)@i(sound), @i(step), @i(sr), @i(hz), @i(t0),
+@i(am), @i(phase))]@\An oscillator with amplitude modulation. The sound
+@i(am) specifies the amplitude and the logical stop time. The physical stop
+time is also that of @i(am). You should use @code(amosc) instead (see
+Section @ref(amosc-sec)).
+
+@codef[snd-fmosc(@pragma(defn)@index(snd-fmosc)@i(s), @i(step), @i(sr), @i(hz), @i(t0), @i(fm),
+@i(phase))]@\A Frequency Modulation oscillator. The sound @i(fm) specifies
+frequency deviation (in Hertz) from @i(hz). You should use @code(fmosc)
+instead (see Section @ref(fmosc-sec)).
+
+@code[snd-fmfb(@pragma(defn)@index(snd-fmfb)@i(t0), @i(hz), @i(sr),
+@i(index), @i(dur))]@\A Feedback FM oscillator. The resulting sound starts
+at @i(t0), has a fundamental frequency of @i(hz), a sample rate of @i(sr),
+and a duration of @i(dur) seconds. The @i(index) is a @code(FLONUM) that
+specifies the amount of feedback. You should use @code(fmfb) instead (see
+Section @ref(fmfb-sec)).
+
+@code[snd-fmfbv(@pragma(defn)@index(snd-fmfb)@i(t0), @i(hz), @i(sr),
+@i(index))]@\A Feedback FM oscillator. The resulting sound starts
+at @i(t0), has a fundamental frequency of @i(hz), and
+a sample rate of @i(sr). The @i(index) is a @code(SOUND) that
+specifies the amount of feedback and determines the duration.
+You should use @code(fmfb) instead (see Section @ref(fmfb-sec)).
+
+@codef[snd-buzz(@pragma(defn)@index(snd-buzz)@i(n), @i(sr), @i(hz), @i(t0), @i(fm))]@\A
+buzz oscillator, which generates @i(n) harmonics of equal amplitude.
+The @i(fm) specifies
+frequency deviation (in Hertz) from @i(hz). You should use @code(buzz)
+instead (see Section @ref(buzz-sec)).
+
+@codef[snd-pluck(@pragma(defn)@index(snd-pluck)@i(sr), @i(hz), @i(t0), @i(d),
+ @i(final-amp))]@\A Karplus-Strong plucked string oscillator with sample rate
+@i(sr), fundamental frequency @i(hz), starting time @i(t0), duration @i(d),
+initial amplitude approximately 1.0 (not exact because the string is
+initialized with random values) and final amplitude approximately
+@i(final-amp). You should use @code(pluck) instead (see Section
+ @ref(pluck-sec)).
+
+@codef[snd-osc(@pragma(defn)@index(snd-osc)@i(s), @i(step), @i(sr), @i(hz), @i(t0), @i(d), @i(phase))]@\A simple table lookup oscillator with fixed frequency. The duration
+is @i(d) seconds. You should use @code(osc) instead (see Section
+@ref(osc-sec)).
+
+@codef[snd-partial(@pragma(defn)@index(snd-partial)@i(sr), @i(hz), @i(t0), @i(env))]@\This is a
+special case of @code(snd-amosc) that generates a sinusoid starting at phase
+0 degrees. The @i(env) parameter gives the envelope or any other amplitude
+modulation. You should use @code(partial) instead (see Section
+@ref(partial-sec)).
+
+@codef[snd-sine(@pragma(defn)@index(snd-sine)@i(t0), @i(hz), @i(sr), @i(d))]@\This is a
+special case of @code(snd-osc) that always generates a sinusoid with initial
+phase of 0 degrees. You should use @code(sine) instead (see Section @ref(sine-sec)).
+
+@codef[snd-siosc(@pragma(defn)@index(snd-siosc)@i(tables), @i(sr), @i(hz), @i(t0),
+@i(fm))]@\A Spectral Interpolation Oscillator with frequency modulation. The
+@i(tables) is a list of sounds and sample counts as follows: (@i(table0)
+@i(count1) @i(table1) ... @i(countN) @i(tableN)). The initial waveform is given by @i(table0), which is interpolated linearly to @i(table1) over the first
+@i(count1) samples. From @i(count1) to @i(count2) samples, the waveform is
+interpolated from @i(table1) to @i(table2), and so on. If more than
+@i(countN) samples are generated, @i(tableN) is used for the remainder of
+the sound. The duration and logical stop time of the sound is taken from
+@i(fm), which specified frequency modulation (deviation) in Hertz. You
+should use @code(siosc) instead (see Section @ref(siosc-sec)).
+
+@end(fndefs)
+
+@subsection(Physical Model Functions)
+These functions perform some sort of physically-based modeling synthesis.
+@begin(fndefs)
+@code[(snd-bandedwg@pragma(defn)@index(snd-bandedwg)@index(STK banded waveguide) @i(freq) @i(bowpress-env) @i(preset) @i(sr))]@\A Banded Wave Guide
+Percussion instrument implemented in STK. The parameter @i(freq) is a
+@code(FLONUM) in Hz, @i(bowpress-env) is
+a @code(SOUND) that ranges from zero to one, @i(preset) is a @code(FIXNUM),
+and @i(sr) is the desired sample rate in Hz. Currently, there are four
+presets: uniform-bar (0), tuned-bar (1), glass-harmonica (2), and
+tibetan-bowl (3). You should use @code(wg-uniform-bar), @code(wg-tuned-bar),
+ @code(wg-glass-harm), or @code(wg-tibetan-bowl) instead (see Section
+@ref(bandedwg-sec)).
+
+@codef[snd-bowed(@pragma(defn)@index(snd-bowed)@index(stk bowed)@i(freq),
+@i(bowpress-env), @i(sr))]@\A bowed string instrument implemented in
+STK. The freq is a @code(FLONUM) in Hertz, bowpress-env is a
+ @code(SOUND) that ranges from z
+ero to one, and sr is the desired sample rate (a @code(FLONUM)).
+You should use bowed instead (see Section @ref(bowed-sec)).
+
+@codef[snd-bowed-freq(@pragma(defn)@index(snd-bowed-freq)@index(stk bowed)@i(freq), @i(bowpress-env), @i(freq-env), @i(sr))]@\A bowed model just like @code(snd-bowed) but with
+an additional parameter for continuous frequency control. You should use
+@code(bowed-freq) instead (see Section @ref(bowed-sec)).
+
+@codef[snd-clarinet(@pragma(defn)@index(snd-clarinet)@index(stk clarinet)@i(freq), @i(breath-env), @i(sr))]@\A clarinet
+model implemented in STK. The @i(freq) is a @code(FLONUM) in Hertz,
+ @i(breath-env) is
+a @code(SOUND) that ranges from zero to one, and @i(sr) is the
+ desired sample
+rate (a @code(FLONUM)). You should use @code(clarinet) instead
+ (see Section
+@ref(clarinet-sec)).
+
+@codef[snd-clarinet-freq(@pragma(defn)@index(snd-clarinet-freq)@index(STK clarinet)@i(freq), @i(breath-env), @i(freq-env), @i(sr))]@\A clarinet model just like @code(snd-clarinet) but with
+an additional parameter for continuous frequency control. You should use
+@code(clarinet-freq) instead (see Section @ref(clarinet-sec)).
+
+@codef[snd-clarinet-all(@pragma(defn)@index(snd-clarinet-all)@i(freq), @i(vibrato-freq),
+@i(vibrato-gain), @i(freq-env), @i(breath-env),
+@i(reed-stiffness), @i(noise), @i(sr))]@\A clarinet model just like
+@code(snd-clarinet-freq) but with
+additional parameters for vibrato generation and continuous control of
+reed stiffness and breath noise. You should use
+@code(clarinet-all) instead (see Section @ref(clarinet-sec)).
+
+@codef[snd-flute(@pragma(defn)@index(snd-flute)@index(stk flute)@i(freq),
+ @i(breath-env), @i(sr))]@\A flute implemented in STK. The @i(freq) is a
+@code(FLONUM) in Hertz, @i(breath-env) is a @code(SOUND)
+ that ranges from zero to one, and @i(sr) is
+ the desired sample rate (a @code(FLONUM)). You should use @code(flute)
+ instead (see Section @ref(flute-sec)).
+
+@codef[snd-flute-freq(@pragma(defn)@index(snd-flute-freq)@index(stk flute)@i(freq), @i(breath-env),
+@i(freq-env), @i(sr))]@\A flute model just like @code(snd-flute) but with
+an additional parameter for continuous frequency control. You should use
+@code(flute-freq) instead (see Section @ref(flute-sec)).
+
+@codef[snd-flute-all(@pragma(defn)@index(snd-flute-all)@index(stk flute)@i(freq), @i(vibrato-freq), @i(vibrato-gain), @i(freq-env), @i(breath-env),
+@i(jet-delay), @i(noise), @i(sr))]@\A flute model just like
+@code(snd-flute-freq) but with
+additional parameters for vibrato generation and continuous control of
+breath noise. You should use
+@code(flute-all) instead (see Section @ref(flute-sec)).
+
+@codef[snd-mandolin(@pragma(defn)@index(snd-mandolin)@index(STK mandolin)@i(t0), @i(freq), @i(dur), @i(body-size), @i(detune), @i(sr))]@\A plucked
+ double-string instrument model implemented in STK. The @i(t0) parameter
+ is the starting time (in seconds), @i(freq) is a @code(FLONUM) in
+ Hz, @i(body-size) and @i(detune) are @code(FLONUM)s, and @code(sr)
+ is the desired sample
+ rate. You should use @code(mandolin) instead (see Section @ref(mandolin-sec)).
+
+@codef[snd-modalbar(@pragma(defn)@index(snd-modalbar)@index(STK modal bar)@i(t0), @i(freq), @i(preset), @i(dur), @i(sr))]@\Struck bar instrument
+ model implemented in STK. The parameter @i(t0) is the starting
+time (in seconds), @i(freq) is a @code(FLONUM) in Hz,
+ @code(preset) is a @code(FIXNUM) ranging from 0 to 8, @i(dur) is a
+@code(FLONUM) that
+ sets the duration (in seconds) and @i(sr) is the desired sample rate. You
+should use @code(modalbar) instead (see Section @ref(modalbar-sec)).
+
+@codef[snd-sax(@pragma(defn)@index(snd-sax)@index(STK sax)@i(freq), @i(breath-env), @i(sr))]@\A sax
+model implemented in STK. The @i(freq) is a @code(FLONUM) in Hertz, @i(breath-env) is
+a @code(SOUND) that ranges from zero to one, and @i(sr) is the desired sample
+rate (a @code(FLONUM)). You should use @code(sax) instead (see Section
+@ref(sax-sec)).
+
+@codef[snd-sax-freq(@pragma(defn)@index(snd-sax-freq)@i(freq), @i(freq-env), @i(breath-env),
+ @i(sr))]@\A sax model just like @code(snd-sax) but with
+an additional parameter for continuous frequency control. You should use
+@code(sax-freq) instead (see Section @ref(sax-sec)).
+
+@codef[snd-sax-all(@pragma(defn)@index(snd-sax-all)@i(freq), @i(vibrato-freq),
+@i(vibrato-gain), @i(freq-env), @i(breath-env),
+@i(reed-stiffness), @i(noise), @i(blow-pos), @i(reed-table-offset), @i(sr))]@\A
+sax model just like
+@code(snd-sax-freq) but with
+additional parameters for vibrato generation and continuous control of
+reed stiffness, breath noise, excitation position, and reed table offset.
+ You should use
+@code(sax-all) instead (see Section @ref(sax-sec)).
+
+@codef[snd-sitar(@pragma(defn)@index(snd-sitar)@index(STK sitar)@i(t0),
+@i(freq), @i(dur), @i(sr))]@\A sitar model implemented in STK. The parameter
+@i(t0) is the starting time, @i(freq) is a @code(FLONUM) (in Hz), E
+@i(dur) sets the duration and @i(sr) is the sample rate (in Hz)
+of the resulting sound. You should use @code(sitar) instead (see Section
+@ref(sitar-sec)).
+
+
+@end(fndefs)
+
+
+@subsection(Sequence Support Functions)
+The next two functions are used to implement Nyquist's @code(seq) construct.
+
+@begin(fndefs)
+@codef[snd-seq(@pragma(defn)@index(snd-seq)@i(sound), @i(closure))]@\This function returns
+@i(sound) until the logical stop time of @i(sound). Then, the XLISP
+@i(closure)
+is evaluated, passing it the logical stop time of @i(sound) as a
+parameter. The closure must return a sound, which is then added to
+@i(sound). (An add is used so that @i(sound) can continue past its logical
+stop if desired.) Do not call this function. See @code(seq) in Section
+@ref(seq-sec).
+
+@codef[snd-multiseq(@pragma(defn)@index(snd-multiseq)@i(array), @i(closure))]@\This
+function is similar to @code(snd-seq) except the first parameter is a
+multichannel sound rather than a single sound. A multichannel sound is
+simply an XLISP array of sounds. An array of sounds is returned which is
+the sum of @i(array) and another array of sounds returned by @i(closure).
+The @i(closure) is passed the logical stop time of the multichannel sound,
+which is the maximum logical stop time of any element of @i(array). Do
+not call this function. See @code(seq) in Section @ref(seq-sec).
+@end(fndefs)
+
+@codef[snd-trigger(@pragma(defn)@index(snd-trigger)@i(s), @i(closure))]@\This is one of
+the only ways in which a behavior instance can be created by changes in a
+signal. When @i(s) (a @code(SOUND)) makes a transition from less than or
+equal to zero to greater than zero, the closure, which takes a starting
+time parameter, is evaluated. The closure must return a @code(SOUND). The
+sum of all these sounds is returned. If there are no sounds, the result will
+be zero. The stop time of the result is the maximum stop time of @i(s) and
+all sounds returned by the closure. The sample rate of the return value is
+the sample rate of @i(s), and the sounds returned by the closure must all
+have that same sample rate. Do not call this function.
+See @code(trigger) in Section @ref(trigger-sec).
+
+An implementation note: There is no way to have @code(snd-trigger) return
+a multichannel sound. An alternative implementation would be a built-in
+function to scan ahead in a sound to find the time of the next zero crossing.
+This could be combined with some LISP code similar to @code(seq) to sum up
+instances of the closure. However, this would force arbitrary look-ahead
+and therefore would not work with real-time inputs, which was the motivation
+for @code(snd-trigger) in the first place.
+
+@chapter(Nyquist Globals)
+@index(Global Variables)
+There are many global variables in Nyquist. A convention in Lisp is to place asterisks (*) around global variables, e.g. @code(*table*). This is only a convention, and the asterisks are just like any other letter as far as variable names are concerned. Here are some globals users should know about:
+
+@begin(description, leftmargin +2 in, indent -2 in)
+@codef(*table*)@index(*table*)@\Default table used by @code(osc) and other oscillators.
+
+@codef(*A4-Hertz*)@pragma(defn)@index(*a4-hertz*)@\Frequency of A4 in Hertz.. Note: you must call @code[(set-pitch-names)] to recompute pitches after changing @code(*A4-Hertz*).
+
+@codef(*autonorm*)@pragma(defn)@index(*autonorm*)@\The normalization factor to be applied to the next sound when @code(*autonorm-type*) is @code('previous). See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*autonormflag*)@pragma(defn)@index(*autonormflag*)@\Enables the automatic normalization feature of the @code(play) command. You should use @code[(autonorm-on)] and @code[(autonorm-off)] rather than setting @code(*autonormflag*) directly. See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*autonorm-max-samples*)@pragma(defn)@index(*autonorm-max-samples*)@\Specifies how many samples will be computed searching for a peak value when @code(*autonorm-type*) is @code('lookahead). See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*autonorm-previous-peak*)@pragma(defn)@index(*autonorm-previous-peak*)@\The peak of the previous sound generated by @code(play). This is used to compute the scale factor for the next sound when @code(*autonorm-type*) is @code('previous). See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*autonorm-target*)@pragma(defn)@index(*autonorm-target*)@\The target peak amplitude for the autonorm feature. The default value is 0.9. See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*autonorm-type*)@pragma(defn)@index(*autonorm-type*)@\Determines how the autonorm feature is implemented. Valid values are @code('lookahead) (the default) and @code('previous). See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*breakenable*)@pragma(defn)@index(*breakenable*)@\Controls whether XLISP enters a break loop when an error is encountered. See Section @ref(symbols-sec).
+
+@codef(*control-srate*)@pragma(defn)@index(*control-srate*)@\Part of the environment, establishes the control sample rate. See Section @ref(environment-sec) for details.
+
+@codef(*default-sf-bits*)@pragma(defn)@index(*default-sf-bits*)@\The default bits-per-sample for sound files. Typically 16.
+
+@codef(*default-sf-dir*)@pragma(defn)@index(*default-sf-dir*)@\The default sound file directory. Unless you give a full path for a file, audio files are assumed to be in this directory. (Applies to many functions that deal with sound files. Check the function description to see if @code(*default-sf-dir*) applies.)
+
+@codef(*default-sf-format*)@pragma(defn)@index(*default-sf-format*)@\The default sound file format. When you write a file, this will be the default format: AIFF for Mac and most Unix systems, NeXT for NeXT systems, and WAV for Win32.
+
+@codef(*default-sf-srate*)@pragma(defn)@index(*default-sf-srate*)@\The default sample rate for sound files. Typically 44100.0, but often set to 22050.0 for speed in non-critical tasks.
+
+@codef(*default-control-srate*)@pragma(defn)@index(*default-control-srate*)@\Default value for @code(*control-srate*). This value is restored when you execute @code[(top)] to pop out of a debugging session. Change it by calling @code[(set-control-srate @i(value))].
+
+@codef(*default-sound-srate*)@pragma(defn)@index(*default-sound-srate*)@\Default value for @code(*sound-srate*). This value is restored when you execute @code[(top)] to pop out of a debugging session. Change it by calling @code[(set-sound-srate @i(value))].
+
+@codef(*file-separator*)@pragma(defn)@index(*file-separator*)@\The character that separates directories in a path,
+e.g. ``@code(/)'' for Unix, ``@code(:)'' for Mac, and ``@code(\)'' for Win32.
+This is normally set in @code(system.lsp).
+
+@codef(*rslt*)@pragma(defn)@index(*rslt*)@\When a function returns more than one value, @code(*rslt*) is set to a list of the ``extra'' values. This provides a make-shift version of the @code(multiple-value-return) facility in Common Lisp.
+
+@codef(*sound-srate*)@pragma(defn)@index(*sound-srate*)@\Part of the environment, establishes the audio sample rate. See Section @ref(environment-sec) for details.
+
+@codef(*soundenable*)@pragma(defn)@index(*soundenable*)@\Controls whether writes to a sound file will also be played as audio. Set this variable by calling @code{(sound-on)} or @code{(sound-off)}.
+
+@codef(*tracenable*)@pragma(defn)@index(*tracenable*)@\Controls whether XLISP prints a backtrace when an error is encountered.
+
+@b(XLISP variables)@\See Section @ref(symbols-sec) for a list of
+global variables defined by XLISP.
+
+@b(Environment variables)@\See Section @ref(environment-sec) for definitions of variables used in the environment for behaviors. In general, you should never set or access these variables directly.
+
+@b(Various constants)@\See Section @ref(constants-sec) for definitions of predefined constants for loudness, duration, and pitch.
+
+@end(description)
+
+@chapter(Time/Frequency Transformation)
+Nyquist provides functions for FFT and inverse FFT operations on streams of audio data.
+Because sounds can be of any length, but an FFT operates on a fixed amount of data, FFT
+processing is typically done in short blocks or windows that move through the audio. Thus,
+a stream of samples is converted in to a sequence of FFT frames representing short-term
+spectra.
+
+Nyquist does not have a special data type corresponding to a sequence of FFT frames.
+This would be nice, but it would require creating a large set of operations suitable for
+processing frame sequences. Another approach, and perhaps the most ``pure'' would
+be to convert a single sound into a multichannel sound, with one channel per bin of the
+FFT.
+
+Instead, Nyquist violates its ``pure'' functional model and resorts to objects
+for FFT processing. A sequence of frames is represented by an XLISP object. Whenever you
+send the selector @code[:next] to the object, you get back either NIL, indicating the
+end of the sequence, or you get an array of FFT coefficients.
+
+The Nyquist function @code[snd-fft] (mnemonic, isn't it?) returns one of the frame sequence
+generating objects. You can pass any frame sequence generating object to another function,
+@code[snd-ifft], and turn the sequence back into audio.
+
+With @code[snd-fft] and @code[snd-ifft], you can create all sorts of interesting processes. The main
+idea is to create intermediate objects that both accept and generate sequences of frames.
+These objects can operate on the frames to implement the desired spectral-domain
+processes. Examples of this can be found in the file
+@code[fft_tutorial.htm]@index(fft tutorial)@index(fast fourier transform tutorial)@index(demos, fft),
+which is part of the standard Nyquist release. The documentation for @code[snd-fft] and
+@code[snd-ifft] follows.
+
+@begin(fndefs)
+@codef[snd-fft(@pragma(defn)@index(snd-fft)@index(fft)@i(sound), @i(length), @i(skip), @i(window))]@\This
+function performs an FFT on the first samples in @i(sound) and returns a Lisp array of @code[FLONUM]s.
+The function modifies the @i(sound), violating the normal rule that sounds are immutable in Nyquist, so
+it is advised that you copy the sound using @code[snd-copy] if there are any other references to
+@i(sound). The length of the FFT is specified by @i(length), a @code[FIXNUM] (integer) which must
+be a power of 2. After
+each FFT, the sound is advanced by @i(skip) samples, also of type @code[FIXNUM]. Overlapping FFTs,
+where @i(skip) is less than @i(length), are allowed. If @i(window) is not @code[NIL], it must be a sound.
+The first @i(length) samples of @i(window) are multiplied by @i(length) samples of @i(sound) before
+performing the FFT. When there are no more samples in @i(sound) to transform,
+this function returns @code[NIL]. The coefficients in the returned array, in order, are the DC coefficient,
+the first real, the first imaginary, the second real, the second imaginary, etc.
+The last array element corresponds to the real coefficient at the Nyquist frequency.
+
+@codef[snd-ifft(@pragma(defn)@index(snd-ifft)@index(ifft)@index(inverse fft)@i(time), @i(srate), @i(iterator), @i(skip), @i(window))]@\This function performs an IFFT on a sequence of spectral frames obtained from @i(iterator)
+and returns a sound. The start time of the sound is given by @i(time). Typically, this would be computed
+by calling @code[(local-to-global 0)]. The sample rate is given by @i(srate). Typically, this would
+be @code[*sound-srate*], but it might also depend upon the sample rate of the sound from which the
+spectral frames were derived. To obtain each frame, the function sends the message @code[:next] to the
+@i(iterator) object, using XLISP's primitives for objects and message passing. The object should return
+an array in the same format as obtained from @code[snd-fft], and the object should return @code[NIL]
+when the end of the sound is reached. After each frame is inverse transformed into the time domain, it is
+added to the resulting sound. Each successive frame is added with a sample offset specified by @i(skip)
+relative to the previous frame. This must be an integer greater than zero. If @i(window) is
+not @code[NIL], it must be a sound. This window signal is multiplied by the inverse transformed frame
+before the frame is added to the output sound. The length of each frame should be the same power of 2.
+The length
+is implied by the array returned by @i(iterator), so it does not appear as a parameter. This length
+is also the number of samples used from @i(window). Extra samples are ignored, and window is padded
+with zeros if necessary, so be sure @i(window) is the right length. The resulting sound is computed on
+demand as with other Nyquist sounds, so @code[:next] messages are sent to @i(iterator) only when new
+frames are needed. One should be careful not to reuse or modify @i(iterator) once it is passed to
+@code[snd-ifft].
+@end(fndefs)
+
+@chapter(MIDI, Adagio, and Sequences)
+@label(adagio-chap)
+@index(MIDI)@index(Sequences)
+Nyquist includes facilities to read and write MIDI files as well as an ASCII
+text-based score representation language, Adagio. XLISP and Nyquist can be
+used to generate MIDI files using compositional algorithms. (See also Section @ref(xmusic-sec).)
+A tutorial on using the Adadio representation and MIDI can be found in
+@code(demos/midi_tutorial.htm)@index(demos, midi). The Adagio language is
+described below. Adagio was originally developed as part of the CMU MIDI
+Toolkit, which included a program to record and play MIDI using the
+Adagio representation. Some of the MIDI features of Adagio may not be
+useful within Nyquist.
+
+Nyquist offers a number of different score representations, and you may
+find this confusing. In general, MIDI files are a common way to exchange
+music performance data, especially with sequencers and score notation
+systems. The @code(demos/midi_tutorial.htm) examples show how to get the most
+precise control when generating MIDI data. Adagio is most useful as a
+text-based score entry language, and it is certainly more compact
+than Lisp expressions for MIDI-like data. The Xmusic library
+(Chapter @ref(xmusic-sec)) is best for algorithmic generation of music
+and score manipulation. There are functions to convert between the
+Adagio, MIDI sequence data, and Xmusic score representations.
+
+@pragma(doinclude)
+@include(adagio-nyquist.mss)
+
+@chapter(Linear Prediction Analysis and Synthesis)
+@index(Linear Prediction)@index(LPC)
+Nyquist provides functions to perform Linear Prediction Coding (LPC)
+analysis and synthesis. In simple terms, LPC analysis assumes that a
+sound is the result of an all-pole filter applied to a source with a
+flat spectrum. LPC is good for characterizing the general spectral
+shape of a signal, which may be time-varying as in speech sounds.
+For synthesis, any source can be filtered, allowing the general
+spectral shape of one signal (used in analysis) to be applied to
+any source (used in synthesis). A popular effect is to give vowel-like
+spectra to musical tones, creating an artificial (or sometimes natural)
+singing voice.
+
+Examples of LPC analysis and synthesis can be found in the file
+@code[lpc_tutorial.htm]@index(lpc tutorial)@index(linear prediction tutorial)@index(demos, lpc),
+which is part of the standard Nyquist release.
+
+As with FFT processing, LPC analysis takes a sound as input and returns
+a stream of frames. Frames are returned from an object using the @code(:next)
+selector just as with FFT frames. An LPC frame is a list consisting of:
+@i(RMS1), the energy of the input signal, @i(RMS2), the energy of the
+residual signal, @i(ERR), the square root of @i(RMS1)/@i(RMS2), and
+@i(FILTER-COEFS), an array of filter coefficients. To make code more
+readable and to avoid code dependence on the exact format of a frame,
+the functions @code(lpc-frame-rms1)@index(lpc-frame-rms1),
+@code(lpc-frame-rms2)@index(lpc-frame-rms2),
+@code(lpc-frame-err)@index(lpc-frame-err), and
+@code(lpc-frame-filter-coefs)@index(lpc-frame-filter-coefs) can be
+applied to a frame to obtain the respective fields.
+
+The @i(z) transform
+of the filter is @i(H)(@i(z)) = 1/@i(A)(@i(z)), where @i(A)(@i(z)) is a
+polynomial of the form @i(A)(@i(z)) = 1 + @i(a@-[1])@i(z) +
+@i(a@-[2])@i(z) + ... + @i(a@-[p])@i(z). The @i(FILTER-COEFS) array has
+the form @code[#(]@i(a@-[p]) @i(a@-[p-1]) ... @i(a@-[3])
+@i(a@-[2]) @i(a@-[1])@code[)].
+
+The file @code(lpc.lsp) defines some useful classes and functions. The file
+is @i(not) automatically loaded with Nyquist, so you must execute
+@code[(load "lpc")] before using them.
+
+@section(LPC Classes and Functions)
+@begin(fndefs)
+@codef[make-lpanal-iterator(@pragma(defn)@index(make-lpanal-iterator)@i(sound), @i(framedur), @i(skiptime), @i(npoles))]@\Makes an iterator
+object, an instance of @code(lpanal-class),
+that returns LPC frames from successive frames of samples in
+@i(sound). The duration (in seconds)
+of each frame is given by @i(framedur), a
+@code(FLONUM). The skip size (in seconds) between successive frames
+is given by @i(skiptime), a @code(FLONUM). Typical values for
+@i(framedur) and @i(skiptime) are 0.08 and 0.04, giving 25 frames
+per second and a 50% frame overlap. The number of poles is given
+by @i(npoles), a @code(FIXNUM). The result is an object that
+responds to the @code(:next) selector by returning a frame as
+described above. @code(NIL) is returned when @i(sound) terminates.
+(Note that one or more of the last analysis windows may be
+padded with zeros. @code(NIL) is only returned when the corresponding
+window would begin after the termination time of the sound.)
+
+@codef[make-lpc-file-iterator(@pragma(defn)@index(make-lpc-file-iterator)@i(filename))]@\Another way to get LPC frames is to read them from a
+ file. This function opens an ASCII file containing LPC frames and
+ creates an iterator object, an instance of class @code(lpc-file-class)
+ to access them. Create a file using @code(save-lpc-file) (see below).
+
+@codef[save-lpc-file(@pragma(defn)@index(save-lpc-file)@i(lpc-iterator), @i(filename))]@\Create a file containing LPC frames.
+This file can be read by @code[make-lpc-file-iterator] (see above).
+
+@codef{show-lpc-data(@pragma(defn)@index(show-lpc-data)@i(lpc-iterator),
+@i(iniframe), @i(endframe)[ ,@i(poles?)])}@\Print values of LPC
+frames from an LPC iterator object. The object is @i(lpc-iterator),
+which is typically an instance of @code(lpanal-class) or
+@code(lpc-file-class). Frames are numbered from zero, and only
+files starting at @i(iniframe) (a @code[FIXNUM]) and ending before
+@i(endframe) (also a @code[FIXNUM]) are printed. By default, only
+the values for @i(RMS1), @i(RMS2), and @i(ERR) are printed, but
+if optional parameter @i(poles?) is non-@code[NIL], then
+the LPC coefficients are also printed.
+
+@codef[allpoles-from-lpc(@pragma(defn)@index(allpoles-from-lpc)@i(snd), @i(lpc-frame))]@\A single LPC frame defines a filter.
+Use @code(allpoles-from-lpc) to apply this filter to @i(snd),
+a @code(SOUND). To obtain @i(lpc-frame), a @code(LIST)
+ containing an LPC frame, either send @code(:next) to an
+ LPC iterator, or use @code(nth-frame) (see below). The result
+ is a @code(SOUND) whose duration is the same as that of @i(snd).
+
+@codef[lpreson(@pragma(defn)@index(lpreson)@i(snd), @i(lpc-iterator),
+@i(skiptime))]@\Implements a time-varying all-pole filter
+controlled by a sequence of LPC frames from an iterator. The
+@code(SOUND) to be filtered is @i(snd), and the source of
+LPC frames is @i(lpc-iterator), typically an instance of
+@code(lpanal-class) or @code(lpc-file-class). The frame
+period (in seconds) is given by @i(skiptime) (a @code(FLONUM)).
+This number does not have to agree with the @i(skiptime) used
+to analyze the frames. (Greater values will cause the filter
+evolution slow down, and smaller values will cause it to
+speed up.) The result is a @code(SOUND). The duration of the
+result is the minimum of the duration of @i(snd) and that of
+the sequence of frames.
+
+@codef[lpc-frame-rms1(@pragma(defn)@index(lpc-frame-rms1)@i(frame))]@\Get the energy of the input signal from a frame.
+
+@codef[lpc-frame-rms2(@pragma(defn)@index(lpc-frame-rms2)@i(frame))]@\Get the energy of the residual from a frame.
+
+@codef[lpc-frame-err(@pragma(defn)@index(lpc-frame-err)@i(frame))]@\Get the square root of @i(RMS1)/@i(RMS2) from a frame.
+
+@codef[lpc-frame-filter-coefs(@pragma(defn)@index(lpc-frame-filter-coefs)@i(frame))]@\Get the filter coefficients from a frame.
+
+@end(fndefs)
+
+@section(Low-level LPC Functions)
+The lowest-level Nyquist functions for LPC are
+@begin(itemize)
+@code(snd-lpanal) for analysis,
+
+@code(snd-allpoles), an all-pole filter with fixed coefficients, and
+
+@code(snd-lpreson), an all-pole filter that takes frames from an LPC iterator.
+@end(itemize)
+
+@begin(fndefs)
+@codef[snd-lpanal(@pragma(defn)@index(snd-lpanal)@i(samps), @i(npoles))]@\Compute
+an LPC frame with @i(npoles) (a @code(FIXNUM)) poles from an
+@code(ARRAY) of samples (@code(FLONUMS)). Note that @code(snd-fetch-array)
+can be used to fetch a sequence of frames from a sound. Ordinarily, you
+should not use this function. Use @code(make-lpanal-iterator) instead.
+
+@codef[snd-allpoles(@pragma(defn)@index(snd-allpoles)@i(snd), @i(lpc-coefs), @i(gain))]@\A fixed all-pole filter. The input is
+@i(snd), a @code(SOUND). The filter coefficients are given by @i(lpc-coefs)
+(an @code(ARRAY)), and the filter gain is given by @i(gain), a @code(FLONUM).
+The result is a @code(SOUND) whose duration matches that of @i(snd).
+Ordinarily, you should use @code(allpoles-from-lpc) instead (see above).
+
+@codef[snd-lpreson(@pragma(defn)@index(snd-lpreson)@i(snd), @i(lpc-iterator),
+@i(skiptime))]@\This function is identical to @code(lpreson) (see above).
+@end(fndefs)
+
+
+@chapter(Developing and Debugging in Nyquist)
+@index(debugging)@index(developing code)
+There are a number of tools, functions, and techniques that can help to debug Nyquist programs. Since these are described in many places
+throughout this manual, this chapter brings together many suggestions and techniques for developing code and debugging. You @i(really)
+should read this chapter before you spend too much time with Nyquist. Many problems that you will certainly run into are addressed here.
+
+@section(Debugging)
+Probably the most important debugging tool is the backtrace. When
+Nyquist encounters an error, it suspends execution and prints an
+error message. To find out where in the program the error occurred
+and how you got there, start by typing @code[(bt)]. This will print
+out the last several function calls and their arguments, which is
+usually sufficient to see what is going on.
+
+In order for @code[(bt)] to work, you must have a couple of global
+variables set: @code(*tracenable*) is ordinarily set to @code(NIL).
+If it is true, then a backtrace is automatically printed when an
+error occurs; @code(*breakenable*) must be set to @code(T), as
+it enables the execution to be suspended when an error is
+encountered. If @code(*breakenable*) is @code(NIL) (false),
+then execution stops when an error occurs but the stack is
+not saved and you cannot get a backtrace. Finally, @code(bt)
+is just a macro to save typing. The actual backtrace function
+is @code(baktrace), which takes an integer argument telling how
+many levels to print. All of these things are set up by default
+when you start Nyquist.
+
+Since Nyquist sounds are executed with a lazy evaluation scheme, some
+errors are encountered when samples are being generated. In this
+case, it may not be clear which expression is in error. Sometimes, it
+is best to explore a function or set of functions by examining
+intermediate results. Any expression that yields a sound can be
+assigned to a variable and examined using one or more of:
+@code(s-plot), @code(snd-print-tree), and of course @code(play). The
+@code(snd-print-tree) function prints a lot of detail about the inner
+representaion of the sound. Keep in mind that if you assign a sound
+to a global variable and then look at the samples (e.g. with
+@code(play) or @code(s-plot)), the samples will be retained in
+memory. At 4 bytes per sample, a big sound may use all of your
+memory and cause a crash.
+
+Another technique is to use low sample rates so that it is easier to
+plot results or look at samples directly. The calls:
+@begin(example)
+set-sound-srate(100)
+set-control-srate(100)
+@end(example)
+set the default sample rates to 100, which is too slow for audio, but useful for examining programs and results. The function
+@begin(example)
+snd-samples(@i(sound), @i(limit))
+@end(example)
+will convert up to @i(limit) samples from @i(sound) into a Lisp
+array. This is another way to look at results in detail.
+
+The @code(trace) function is sometimes useful. It prints the name of
+a function and its arguments everytimg the function is called, and the
+result is printed when the function exits. To trace the osc function,
+type:
+@begin(example)
+trace(osc)
+@end(example)
+and to stop tracing, type @code[untrace(osc)].
+
+If a variable needs a value or a function is undefined, and if @code(*breakenable*) was set, you will get a prompt where you can fix
+the error (by setting the variable or loading the function definition)
+and keep going. At the debug (or break) prompt, your input must
+be in XLISP, not SAL syntax. Use @code[(co)], short for @code[(continue)] to
+reevaluate the variable or function and continue execution.
+
+When you finish debugging a particular call, you can ``pop''
+up to the top level by typing @code[(top)], a short name for @code[(top-level)].
+There is a button named "Top" in the NyquistIDE that takes you back to the
+top level (ready to accept XLISP expressions),
+and another button named "SAL" that puts you back in SAL mode.
+
+@section(Useful Functions)
+@begin(fndefs)
+@codef[grindef(@pragma(defn)@index(grindef)@index(listing of lisp function)@i(name))]@\Prints
+a formatted listing of a lisp function. This is often useful to quickly inspect
+a function without searching for it in source files. Do not forget to quote the
+name, e.g. @code[(grindef 'prod)].
+
+@codef[args(@pragma(defn)@index(args)@index(arguments to a lisp function)@i(name))]@\Similar
+to @code(grindef), this function prints the arguments to a function. This may
+be faster than looking up a function in the documentation if you just need a
+reminder. For example, @code[(args 'lp)] prints ``(LP S C),'' which may help you
+to remember that the arguments are a sound (S) followed by the cutoff (C)
+frequency.
+@end(fndefs)
+
+The following functions are useful short-cuts that might have been included in
+XLISP. They are so useful that they are defined as part of Nyquist.
+
+@begin(fndefs)
+@codef[incf(@pragma(defn)@index(incf)@index(increment)@i(symbol))]@\Increment @i(symbol)
+by one. This is a macro, and @i(symbol) can be anything that can be set by
+@code(setf). Typically, @i(symbol) is a variable: ``@code[(incf i)],'' but
+@i(symbol) can also be an array element: ``@code[(incf (aref myarray i))].''
+
+@codef[decf(@pragma(defn)@index(decf)@index(decrement)@i(symbol))]@\Decrement @i(symbol)
+by one. (See @code(incf), above.)
+
+@codef[push(@pragma(defn)@index(push)@i(val), @i(lis))]@\Push @i(val) onto @i(lis) (a Lisp
+list). This is a macro that is equivalent to writing
+@code[(setf @i(lis) (cons @i(val) @i(lis)))].
+
+@codef[pop(@pragma(defn)@index(pop)@i(lis))]@\Remove (pop) the first item from @i(lis) (a
+Lisp list). This is a macro that is equivalent to writing
+@code[(setf @i(lis) (cdr @i(lis)))]. Note that the remaining list is returned,
+not the head of the list that has been popped. Retrieve the head of the list
+(i.e. the top of the stack) using @code(first) or, equivalently, @code(car).
+@end(fndefs)
+
+The following macros are useful control constructs.
+
+@begin(fndefs)
+@codef[while(@pragma(defn)@index(while)@i(test), @i(stmt1), @i(stmt2), ...)]@\A conventional
+``while'' loop. If @i(test) is true, perform the statements
+ (@i(stmt1), @i(stmt2), etc.) and repeat. If @i(test) is false, return. This
+ expression evaluates to NIL unless the expression @code[(return @i(expr))]
+ is evaluated, in which case the value of @i(expr) is returned.
+
+@codef[when(@pragma(defn)@index(when)@i(test), @i(action))]@\A conventional ``if-then''
+statement. If @i(test) is true, @i(action) is evaluated and returned. Otherwise,
+NIL is returned. (Use @code(if) or @code(cond) to implement
+ ``if-then-else'' and more complex conditional forms.
+@end(fndefs)
+
+It is often necessary to load a file @i(only if) it has not already been
+loaded. For example, the @code(pianosyn) library loads very slowly, so if
+some other file already loaded it, it would be good to avoid loading it
+again. How can you load a file once? Nyquist does not keep track of files
+that are loaded, but you must be loading a file to define some function,
+so the idea is to tell Nyquist "I require @i(function) from @i(file)"; if
+the function does not yet exist, Nyquist satisfies the requirement by loading
+the file.
+@begin(fndefs)
+@codef{require-from(@pragma(defn)@index(require-from)@index(load file conditionally)@i(fnsymbol),
+@i(filename) [, @i(path)])}@\Tests whether @i(fnsymbol), an unquoted
+function name, is defined. If
+not, @i(filename), a @code(STRING),
+is loaded. Normally @i(fnsymbol) is a function that will be called from
+within the current file, and @i(filename) is the file that defines
+@i(fnsymbol). The @i(path), if a @code(STRING), is prepended to @i(filename).
+If @i(path) is @code(t) (true), then the directory of the current file is
+used as the path.
+@end(fndefs)
+
+Sometimes it is important to load files relative to the current file. For example,
+the @code(lib/piano.lsp) library loads data files from the @code(lib/piano) directory,
+but how can we find out the full path of @code(lib)? The solution is:
+@begin(fndefs)
+@codef[current-path(@pragma(defn)@index(current-path)@index(path,
+current)@index(full path name))]@\Returns the full path name of the file that is
+currently being loaded (see @code(load)). Returns NIL if no file is being loaded.
+@end(fndefs)
+
+Finally, there are some helpful math functions:
+@begin(fndefs)
+@codef[real-random(@index(random)@index(uniform random)@pragma(defn)@index(real-random)@i(from), @i(to))]@\Returns a random @code(FLONUM) between @i(from) and @i(to). (See also @code(rrandom), which is equivalent to @code((real-random 0 1))).
+
+@codef[power(@pragma(defn)@index(power)@index(exponent)@i(x), @i(y))]@\Returns @i(x) raised to
+the @i(y) power.
+@end(fndefs)
+
+@chapter(Xmusic and Algorithmic Composition)
+@label(xmusic-sec)
+@index(Xmusic)@index(Algorithmic Composition)
+Several Nyquist libraries offer support for algorithmic composition. Xmusic
+is a library for generating sequences and patterns of data. Included in Xmusic
+is the @code(score-gen) macro which helps to generate scores from patterns.
+Another important facility is the @code(distributions.lsp) library,
+containing many different random number generators.
+
+@section(Xmusic Basics)
+Xmusic is inspired by and based on Common Music by Rick Taube. Currently,
+Xmusic only implements patterns and some simple support for scores to be
+realized as sound by Nyquist. In contrast, Common Music supports MIDI and
+various other synthesis languages and includes a graphical interface, some
+visualization tools, and many other features. Common Music runs in Common
+Lisp and Scheme, but not XLISP, which is the base language for Nyquist.
+
+Xmusic patterns are objects that generate data streams. For example,
+the @code(cycle-class) of objects generate cyclical patterns such as
+"1 2 3 1 2 3 1 2 3 ...", or "1 2 3 4 3 2 1 2 3 4 ...". Patterns can
+be used to specify pitch sequences, rhythm, loudness, and other parameters.
+
+Xmusic functions are automatically loaded when you start Nyquist.
+To use a pattern object, you first create the pattern, e.g.
+@begin(example)
+set pitch-source = make-cycle(list(c4, d4, e4, f4))
+@end(example)
+After creating the pattern, you can access it repeatedly
+with @code(next)@index(next in pattern) to generate data, e.g.
+@begin(example)
+play seqrep(i, 13, pluck(next(pitch-source), 0.2))
+@end(example)
+This will create a sequence of notes with the following pitches: c, d,
+e, f, c, d, e, f, c, d, e, f, c. If you evaluate this again, the
+pitch sequence will continue, starting on "d".
+
+It is very important not to confuse the creation of a sequence with
+its access. Consider this example:
+@begin(example)
+play seqrep(i, 13,
+ pluck(next(make-cycle(list(c4, d4, e4, f4))), 0.2))
+@end(example)
+This looks very much like the previous example, but it only repeats notes
+on middle-C. The reason is that every time @code(pluck) is evaluated,
+@code(make-cycle) is called and creates a new pattern object. After the
+first item of the pattern is extracted with @code(next), the cycle is not
+used again, and no other items are generated.
+
+To summarize this important point, there are two steps to using a pattern.
+First, the pattern is created and stored in a
+variable using @code(setf). Second, the pattern is accessed (multiple
+times) using @code(next).
+
+Patterns can be nested, that is, you can write patterns of patterns.
+In general, the @code(next) function does not return patterns. Instead,
+if the next item in a pattern is a (nested) pattern, @code(next) recursively
+gets the next item of the nested pattern.
+
+While you might expect that each call to @code(next) would advance the
+top-level pattern to the next item, and descend recursively if necessary
+to the inner-most nesting level, this is not how @code(next) works. Instead,
+@code(next) remembers the last top-level item, and if it was a pattern,
+@code(next) continues to generate items from that same inner pattern
+until the end of the inner pattern's @i(period) is reached. The next
+paragraph explains the concept of the @i(period).
+
+The data returned by a pattern object is structured into logical groups
+called @i(periods). You can get an entire period (as a list) by calling
+@code[next(@i(pattern), t)]@index(next pattern). For example:
+@begin(example)
+set pitch-source = make-cycle(list(c4, d4, e4, f4))
+print next(pitch-source, t)
+@end(example)
+This prints the list @code[(60 62 64 65)], which is one period
+of the cycle.
+
+You can also get explicit markers that
+delineate periods by calling @code[send(@i(pattern), :next)]. In this
+case, the value returned is either the next item of the pattern, or the
+symbol @code(+eop+) if the end of a period has been reached. What
+determines a period? This is up to the specific pattern class, so see the
+documentation for specifics. You can override the ``natural'' period
+using the keyword @code(:for), e.g.
+@begin(example)
+set pitch-source = make-cycle(list(c4, d4, e4, f4), for: 3)
+print next(pitch-source, t)
+print next(pitch-source, t)
+@end(example)
+This prints the lists @code[(60 62 64) (65 60 62)]. Notice that
+these periods just restructure the stream of items
+into groups of 3.
+
+Nested patterns are probably easier to understand by example than by
+specification. Here is a simple nested pattern of cycles:
+@begin(example)
+set cycle-1 = make-cycle({a b c})
+set cycle-2 = make-cycle({x y z})
+set cycle-3 = make-cycle(list(cycle-1, cycle-2))
+exec dotimes(i, 9, format(t, "~A ", next(cycle-3)))
+@end(example)
+This will print "A B C X Y Z A B C". Notice that the inner-most
+cycles @code(cycle-1) and @code(cycle-2) generate a period of items
+before the top-level @code(cycle-3) advances to the next pattern.
+
+Before describing specific pattern classes, there are several optional
+parameters that apply in the creating of any pattern object. These are:
+@begin(description, leftmargin +2 in, indent -2 in)
+@code(:for)@\The length of a period. This overrides the default
+by providing a numerical length. The value of this optional
+parameter may be a pattern that generates a sequence of integers
+that determine the length of each successive period. A period
+length may not be negative, but it may be zero.
+
+@code(:name)@\A pattern object may be given a name. This is useful
+if the @code(:trace) option is used.
+
+@code(:trace)@\If non-null, this optional parameter causes information
+about the pattern to be printed each time an item is generated
+from the pattern.
+
+@end(description)
+The built-in pattern classes are described in the following section.
+
+@section(Pattern Classes)
+@subsection(cycle)
+The @code(cycle-class) iterates repeatedly through a list of items.
+For example, two periods of @code[make-cycle({a b c})] would be
+@code[(A B C) (A B C)].
+
+@begin(fndefs)
+@codef{make-cycle(@pragma(defn)@index(make-cycle)@index(cycle pattern)@index(pattern, cycle)@i(items)[ ,for: @i(for)] [, name: @i(name),]
+[trace: @i(trace)])}@\Make a cycle
+pattern that iterates over @i(items). The default period length is the
+length of @i(items). (See above for a description of the
+optional parameters.) If @i(items) is a pattern, a period of the
+pattern becomes the list from which items are generated. The
+list is replaced every period of the cycle.
+@end(fndefs)
+
+@subsection(line)
+The @code(line-class) is similar to the cycle class, but when it reaches the
+end of the list of items, it simply repeats the last item in the list.
+For example, two periods of @code[make-line({a b c})] would be
+@code[(A B C) (C C C)].
+
+@begin(fndefs)
+@codef{make-line(@pragma(defn)@index(make-line)@index(line pattern)@index(pattern, line)@i(items)[ ,for: @i(for)] [, name: @i(name)] [, trace: @i(trace)])}@\Make a line
+pattern that iterates over @i(items). The default period length is the
+length of @i(items). As with @code(make-cycle), @i(items) may be a
+pattern. (See above for a description of the optional parameters.)
+@end(fndefs)
+
+@subsection(random)
+The @code(random-class) generates items at random from a list. The default
+selection is uniform random with replacement, but items may be further
+specified with a weight, a minimum repetition count, and a maximum
+repetition count. Weights give the relative probability of the selection
+of the item (with a default weight of one). The minimum count specifies how
+many times an item, once selected at random, will be repeated. The maximum
+count specifies the maximum number of times an item can be selected in a row.
+If an item has been generated @i(n) times in succession, and the maximum
+is equal to @i(n), then the item is disqualified in the next random selection.
+Weights (but not currently minima and maxima) can be patterns. The patterns
+(thus the weights) are recomputed every period.
+
+@begin(fndefs)
+@codef{make-random(@pragma(defn)@index(make-random)@index(random pattern)@index(pattern, random)@i(items)[ ,for: @i(for)] [, name: @i(name)] [, trace: @i(trace)])}@\Make a random
+pattern that selects from @i(items). Any (or all) element(s) of @i(items)
+may be lists of the following form: @code{(@i(value) [:weight @i(weight)]
+[:min @i(mincount)] [:max @i(maxcount)]}, where @i(value) is the item
+(or pattern) to be generated, @i(weight) is the relative probability of
+selecting this item, @i(mincount) is the minimum number of repetitions
+when this item is selected, and @i(maxcount) is the maximum number of
+repetitions allowed before selecting some other item. The default period
+length is the length of @i(items). If @i(items) is a pattern, a period
+from that pattern becomes the list from which random selections are
+made, and a new list is generated every period.
+@end(fndefs)
+
+@subsection(palindrome)
+The @code(palindrome-class) repeatedly traverses a list forwards and then
+backwards. For example, two periods of @code[make-palindrome({a b c})]
+would be @code[(A B C C B A) (A B C C B A)]. The @code(:elide)
+keyword parameter controls whether the first and/or last elements are
+repeated:
+@begin(example)
+make-palindrome({a b c}, elide: nil)
+ ;; generates A B C C B A A B C C B A ...
+
+make-palindrome({a b c}, elide: t)
+ ;; generates A B C B A B C B ...
+
+make-palindrome({a b c}, elide: :first)
+ ;; generates A B C C B A B C C B ...
+
+make-palindrome({a b c}, elide: :last)
+ ;; generates A B C B A A B C B A ...
+@end(example)
+
+@begin(fndefs)
+@codef{make-palindrome(@pragma(defn)@index(make-palindrome)@index(palindrome pattern)@index(pattern, palindrome)@i(items)[ ,elide: @i(elide),]
+[for: @i(for)] [, name: @i(name)] [, trace: @i(trace)])}@\Generate items
+from list alternating in-order and reverse-order sequencing. The keyword
+parameter @i(elide) can have the values @code(:first), @code(:last),
+@code(t), or @code(nil) to control repetition of the first and last elements.
+The @i(elide) parameter can also be a pattern, in which case it is evaluated
+every period. One period is one complete forward and backward traversal
+of the list. If @i(items) is a pattern, a period
+from that pattern becomes the list from which random selections are
+made, and a new list is generated every period.
+@end(fndefs)
+
+@subsection(heap)
+The @code(heap-class) selects items in random order from a list
+ without replacement, which means that all items are generated once before
+any item is repeated. For example, two periods of @code[make-heap({a b c})]
+ might be @code[(C A B) (B A C)]. Normally, repetitions can occur
+even if all list elements are distinct. This happens when the last element
+of a period is chosen first in the next period. To avoid repetitions, the
+@code(:max) keyword argument can be set to 1. The @code(:max) keyword only
+controls repetitions from the end of one period to the beginning of the next.
+If the list contains more than one copy of the same value, it may be repeated
+within a period regardless of the value of @code(:max).
+
+@begin(fndefs)
+@codef{make-heap(@pragma(defn)@index(make-heap)@index(heap pattern)@index(pattern, heap)@i(items),
+[for: @i(for)] [, max: @i(max)] [, name: @i(name)] [, trace: @i(trace)])}@\Generate items
+randomly from list without replacement. If @i(max) is 1, the first element of
+a new period will not be the same as the last element of the previous period,
+avoiding repetition. The default value of @i(max) is 2, meaning repetition is
+allowed. The period length is the length
+of @i(items). If @i(items) is a pattern, a period
+from that pattern becomes the list from which random selections are
+made, and a new list is generated every period.
+@end(fndefs)
+
+@subsection(accumulation)
+The @code(accumulation-class) takes a list of values and returns
+the first, followed by the first two, followed by the first three,
+etc. In other words, for each list item, return all items from the
+first through the item. For example, if the list is (A B C), each
+generated period is (A A B A B C).
+
+@begin(fndefs)
+@codef{make-accumulation(@pragma(defn)@index(make-accumulation)@index(accumulation pattern)@index(pattern, accumulation)@i(items)[ ,name: @i(name),]
+[trace: @i(trace)])}@\For each item, generate items from the first to
+the item including the item. The period length is (@i(n)@+(2) + @i(n)) / 2
+where @i(n) is the length of @i(items). If @i(items) is a pattern, a period
+from that pattern becomes the list from which items are generated,
+and a new list is generated every period. Note that this is similar in
+name but different from @code(make-accumulate).
+
+@subsection(copier)
+The @code(copier-class) makes copies of periods from a sub-pattern.
+For example, three periods
+of @code[make-copier(make-cycle({a b c}, for: 1), repeat: 2, merge: t)]
+would be @code[(A A) (B B) (C C)]. Note that entire periods (not
+individual items) are repeated, so in this example the @code(:for)
+keyword was used to force periods to be of length one so that
+each item is repeated by the @code(:repeat) count.
+
+@codef{make-copier(@pragma(defn)@index(make-copier)@index(copier
+pattern)@index(pattern, copier)@i(sub-pattern)[ ,repeat: @i(repeat)] [, merge: @i(merge),]
+[for: @i(for)] [, name: @i(name)] [, trace: @i(trace)])}@\Generate a period
+from @i(sub-pattern) and repeat it @i(repeat) times. If @i(merge) is false
+(the default), each repetition of a period from @i(sub-pattern) results
+in a period by default. If @i(merge) is true (non-null), then all
+ @i(repeat) repetitions of the period are merged into one result
+period by default. If the @code(:for) keyword is used, the same items
+are generated, but the items are grouped into periods determined by
+the @code(:for) parameter. If the @code(:for) parameter is a pattern,
+it is evaluated every result period. The @i(repeat) and @i(merge) values
+may be patterns that return a repeat count and a boolean value, respectively.
+If so, these patterns are evaluated initially and after each @i(repeat)
+ copies are made (independent of the @code(:for) keyword parameter, if any).
+The @i(repeat) value returned by a pattern can also be negative. A negative
+number indicates how many periods of @i(sub-pattern) to skip. After skipping
+these patterns, new @i(repeat) and @i(merge) values are generated.
+@end(fndefs)
+
+@subsection(accumulate)
+The @code(accumulate-class) forms the sum of numbers returned by another
+pattern. For example, each period
+of @code[make-accumulate(make-cycle({1 2 -3}))] is @code[(1 3 0)].
+The default output period length is the length of the input period.
+
+@begin(fndefs)
+@codef{make-accumulate(@pragma(defn)@index(make-accumulate)@index(accumulate
+pattern)@index(pattern, accumulate)@i(sub-pattern)[ ,for: @i(for)] [, max: @i(maximum)] [, min: @i(minimum)] [, name: @i(name)] [, trace: @i(trace)])}@\Keep
+a running sum of numbers generated by @i(sub-pattern). The default
+period lengths match the period lengths from @i(sub-pattern). If @i(maximum) (a pattern or a number) is specified, and the running sum exceeds @i(maximum), the running sum is reset to @i(maximum). If @i(minimum) (a pattern or a number) is specified, and the running sum falls below @i(minimum), the running sum is reset to @i(minimum). If @i(minimum) is greater than @i(maximum), the running sum will be set to one of the two values. Note that this is similar in name but not in function to
+@code(make-accumulation).
+@end(fndefs)
+
+@subsection(sum)
+The @code(sum-class) forms the sum of numbers, one from each of two other
+patterns. For example, each period
+of @code[make-sum(make-cycle({1 2 3}), make-cycle({4 5 6}))]
+is @code[(5 7 9)].
+The default output period length is the length of the input period of the
+first argument. Therefore, the first argument must be a pattern, but the
+second argument can be a pattern or a number.
+
+@begin(fndefs)
+@codef{make-sum(@pragma(defn)@index(make-sum)@index(sum
+pattern)@index(pattern, sum)@i(x), @i(y)[ ,for: @i(for)] [, name: @i(name)] [, trace: @i(trace)])}@\Form
+sums of items (which must be numbers) from pattern
+ @i(x) and pattern or number @i(y). The default
+period lengths match the period lengths from @i(x).
+@end(fndefs)
+
+@subsection(product)
+The @code(product-class) forms the product of numbers, one
+from each of two other
+patterns. For example, each period
+of @code[make-product(make-cycle({1 2 3}), make-cycle({4 5 6}))]
+is @code[(4 10 18)].
+The default output period length is the length of the input period of the
+first argument. Therefore, the first argument must be a pattern, but the
+second argument can be a pattern or a number.
+
+@begin(fndefs)
+@codef{make-product(@pragma(defn)@index(make-product)@index(product pattern)@index(pattern, product)@i(x), @i(y)[ ,for: @i(for)] [, name: @i(name)] [, trace: @i(trace)])}@\Form
+products of items (which must be numbers) from pattern
+ @i(x) and pattern or number @i(y). The default
+period lengths match the period lengths from @i(x).
+@end(fndefs)
+
+
+@subsection(eval)
+The @code(eval-class) evaluates an expression to produce each output item.
+The default output period length is 1.
+
+@begin(fndefs)
+@codef{make-eval(@pragma(defn)@index(make-eval)@index(eval pattern)@index(pattern, eval)@index(expression pattern)@index(pattern, expression)@i(expr)[ ,for: @i(for)] [, name: @i(name)] [, trace: @i(trace)])}@\Evaluate
+@i(expr) to generate each item. If @i(expr) is a pattern, each item is generated by getting the next item from @i(expr) and evaluating it.
+@end(fndefs)
+
+
+@subsection(length)
+The @code(length-class) generates periods of a specified length from
+another pattern. This is similar to using the @code(:for) keyword, but
+for many patterns, the @code(:for) parameter alters the points at which
+other patterns are generated. For example, if the palindrome pattern
+has an @code(:elide) pattern parameter, the value will be computed every
+period. If there is also a @code(:for) parameter with a value of 2, then
+@code(:elide) will be recomputed every 2 items. In contrast, if the
+palindrome (without a @code(:for) parameter) is embedded in a @i(length)
+pattern with a lenght of 2, then the periods will all be of length 2, but
+the items will come from default periods of the palindrome, and therefore
+the @code(:elide) values will be recomputed at the beginnings of
+default palindrome periods.
+
+@begin(fndefs)
+@codef{make-length(@index(length pattern)@index(pattern,
+length)@pragma(defn)@index(make-length)@i(pattern), @i(length-pattern),
+[name: @i(name)] [, trace: @i(trace)])}@\Make a pattern of class
+@code(length-class) that regroups items generated by a
+@i(pattern) according to pattern lengths given by @i(length-pattern).
+Note that @i(length-pattern) is not optional: There is no default
+pattern length and no @code(:for) keyword.
+@end(fndefs)
+
+@subsection(window)
+The @code(window-class) groups items from another pattern by using a sliding
+window. If the @i(skip) value is 1, each output period is formed
+by dropping the first item of the previous perioda and appending the next item
+from the pattern. The @i(skip) value and the output period length can change
+every period. For a simple example, if the period length is 3 and the
+skip value is 1, and the input pattern generates the sequence A, B, C, ...,
+then the output periods will be (A B C), (B C D), (C D E), (D E F), ....
+
+@begin(fndefs)
+@codef{make-window(@index(window pattern)@index(pattern,
+window)@pragma(defn)@index(make-window)@i(pattern), @i(length-pattern),
+@i(skip-pattern)[ ,name: @i(name)] [, trace: @i(trace)])}@\Make
+ a pattern of class
+@code(window-class) that regroups items generated by a
+@i(pattern) according to pattern lengths given by @i(length-pattern)
+and where the period advances by the number of items given by
+@i(skip-pattern).
+Note that @i(length-pattern) is not optional: There is no default
+pattern length and no @code(:for) keyword.
+@end(fndefs)
+
+
+@subsection(markov)
+The @code(markov-class) generates items from a Markov model. A Markov model
+generates a sequence of @i(states) according to rules which specify possible
+future states
+given the most recent states in the past. For example, states might be
+pitches, and each pitch might lead to a choice of pitches for the next state.
+In the @code(markov-class), states can be either symbols or numbers, but
+not arbitrary values or patterns. This makes it easier to specify rules.
+However, symbols can be mapped to arbitrary values including pattern
+objects, and these become the actual generated items.
+By default, all future states are weighted equally, but weights
+may be associated with future states. A Markov model must be
+initialized with
+a sequence of past states using the @code(:past) keyword.
+The most common form of Markov model is a "first
+order Markov model" in which the future item depends only upon one
+past item. However, higher order models where the future items depend on
+two or more past items are possible. A "zero-order" Markov model, which
+depends on no past states, is essentially equivalent to the random pattern.
+As an example of a first-order Markov pattern,
+two periods of @code[make-markov({{a -> b c} {b -> c} {c -> a}}, past: {a})]
+might be @code[(C A C) (A B C)].
+
+@begin(fndefs)
+@codef{make-markov(@pragma(defn)@index(make-markov)@index(markov pattern)@index(pattern, markov)@i(rules)[ ,past: @i(past)] [, produces: @i(produces),]
+[for: @i(for)] [, name: @i(name)] [, trace: @i(trace)])}@\Generate a sequence
+of items from a Markov process. The @i(rules) parameter has the form:
+@code[(@i(prev1) @i(prev2) ... @i(prevn) -> @i(next1) @i(next2) ... @i(nextn))]
+where @i(prev1) through @i(prevn) represent a sequence of most recent
+(past) states. The symbol @code(*) is treated specially: it matches any
+previous state. If @i(prev1) through @i(prevn) (which may be just one state
+as in the example above) match the previously generated states, this
+rule applies. Note that every rule must specify the same number of previous
+states; this number is known as the order of the Markov model.
+The first rule in @i(rules) that applies is used to select the
+next state. If no rule applies, the next state is @code(NIL) (which is
+a valid state that can be used in rules).
+Assuming a rule applies, the list of possible next
+states is specified by @i(next1)
+through @i(nextn). Notice that these are alternative choices for the
+next state, not a sequence of future states, and each rule can have
+any number of choices. Each choice may be the state
+itself (a symbol or a number), or the choice may be a list consisting of
+the state and a weight. The weight may be given by a pattern, in which
+case the next item of the pattern is obtained every time the rule is
+applied. For example, this rules says that if the previous states were
+A and B, the next state can be A with a weight of 0.5 or C with an
+implied weight of 1: @code[(A B -> (A 0.5) C)]. The
+default length of the period is the length of @i(rules). The
+@i(past) parameter must be provided. It is a list of states whose length
+matches the order of the Markov model. The keyword parameter @i(produces)
+may be used to map from state symbols or numbers to other values or
+patterns. The parameter is a list of alternating symbols and values. For
+example, to map A to 69 and B to 71, use @code[list(quote(a), 69, quote(b), 71)].
+ You can
+also map symbols to patterns, for example
+@code[list(quote(a), make-cycle({57 69}), quote(b), make-random({59 71}))]. The
+next item of the pattern is is generated each time the Markov model generates
+the corresponding state. Finally, the @i(produces) keyword can be
+@code(:eval), which means to evaluate the Markov model state. This could
+be useful if states are Nyquist global variables such as
+@code(C4, CS4, D4, ]..., which evaluate to numerical
+values (60, 61, 62, ...).
+
+@codef{markov-create-rules(@pragma(defn)@index(markov-create-rules)@index(markov analysis)@i(sequence), @i(order)[ ,@i(generalize)])}@\Generate a set of rules suitable for the
+@code(make-markov) function. The @i(sequence) is a ``typical'' sequence
+of states, and @i(order) is the order of the Markov model. It is often the
+case that a sample sequence will not have a transition from the last state
+to any other state, so the generated Markov model can reach a ``dead end''
+where no rule applies. This might lead to an infinite stream of NIL's. To
+avoid this, the optional parameter @i(generalize) can be set to @code(t)
+(true), indicating that there should be a fallback rule that matches any
+previous states and whose future states are weighted according to their
+frequency in @i(sequence). For example, if sequence contains 5 A's, 5 B's and
+10 G's, the default rule will be @code[(* -> (A 5) (B 5) (G 10))]. This
+rule will be appended to the end so it will only apply if no other rule does.
+@end(fndefs)
+
+@section(Random Number Generators)
+@index(random)@index(probability distributions)@index(distributions, probability)@index(stochastic functions)
+The @code(distributions.lsp) library implements random number generators that return random values with various probability distributions. Without this library, you can generate random numbers with @i(uniform) distributions. In a uniform distribution, all values are equally likely. To generate a random integer in some range, use @code(random). To generate a real number (FLONUM) in some range, use @code(real-random) (or @code(rrandom) if the range is 0-1). But there are other interesting distributions. For example, the Gaussian distribution is often used to model
+real-world errors and fluctuations where values are clustered around some central value and large deviations are more unlikely than small ones. See Dennis Lorrain, "A Panoply of Stochastic 'Canons'," @i(Computer Music Journal) vol. 4, no. 1, 1980, pp. 53-81.
+
+In most of the random number generators described below, there are optional parameters to indicate a maximum and/or minimum value. These can be used to truncate the distribution. For example, if you basically want a Gaussian distribution, but you never want a value greater than 5, you can specify 5 as the maximum value.
+The upper and lower bounds are implemented simply by drawing a random number from the full distribution repeatedly until a number falling into the desired range is obtained. Therefore, if you select an acceptable range that is unlikely, it may take Nyquist a long time to find each acceptable random number. The intended use of the upper and lower bounds is to weed out values that are already fairly unlikely.
+
+
+@begin(fndefs)
+@codef[linear-dist(@pragma(defn)@index(linear-dist)@index(linear distribution)@i(g))]@\Return a @code(FLONUM) value from a linear distribution, where the probability of a value decreases linearly from zero to @i(g) which must be greater than zero. (See Figure @ref(linear-fig).) The linear distribution is useful for generating for generating time and pitch intervals.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "linear-fig.ps"))
+@html(<img src="linear-fig.gif"><br><br>)
+@fillcaption(The Linear Distribution, @i(g) = 1.)
+@tag(linear-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{exponential-dist(@pragma(defn)@index(exponential-dist)@index(exponential distribution)@i(delta)[ ,@i(high)])}@\Return a @code(FLONUM) value from an exponential distribution. The initial downward slope is steeper with larger values of @i(delta), which must be greater than zero. (See Figure @ref(exponential-fig). The optional @i(high) parameter puts an artificial upper bound on the return value.
+The exponential distribution generates values greater
+than 0, and can be used to generate time intervals. Natural random intervals such as the time intervals between the release of atomic particles or the passing of yellow volkswagons in traffic have exponential distributions. The
+exponential distribution is memory-less: knowing that a random number from this distribution is greater than some value (e.g. a note duration is at least 1 second) tells you nothing new about how soon the note will end. This
+is a continuous distribution, but @code(geometric-dist) (described below) implements the discrete form.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "exponential-fig.ps"))
+@html(<img src="exponential-fig.gif"><br><br>)
+@fillcaption(The Exponential Distribution, @i(delta) = 1.)
+@tag(exponential-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{gamma-dist(@pragma(defn)@index(gamma-dist)@i(nu)[ ,@i(high)])}@\Return a @code(FLONUM) value from a Gamma distribution. The value is greater than zero, has a mean of @i(nu) (a @code(FIXNUM) greater than zero), and a mode (peak) of around @i(nu) - 1.
+ The optional @i(high) parameter puts an artificial upper bound on the return value.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "gamma-fig.ps"))
+@html(<img src="gamma-fig.gif"><br><br>)
+@fillcaption(The Gamma Distribution, @i(nu) = 4.)
+@tag(gamma-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{bilateral-exponential-dist(@pragma(defn)@index(bilateral-exponential-dist)@index(bilateral exponential distribution)@i(xmu),
+ @i(tau)[ ,@i(low)] [, @i(high)])}@\Returns a @code(FLONUM) value from a bilateral exponential distribution, where @i(xmu) is the center of the double exponential and @i(tau) controls the spread of the distribution. A larger @i(tau) gives a wider distribution (greater variance), and @i(tau) must be greater than zero. The @i(low) and @i(high) parameters give optional artificial bounds on the minimum and maximum output values, respectively.
+This distribution is similar to the exponential, except
+it is centered at 0 and can output negative values as well. Like
+the exponential, it can be used to generate time intervals; however, it might be necessary to add a lower bound so as not to compute a negative time interval.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "bilateral-fig.ps"))
+@html(<img src="bilateral-fig.gif"><br><br>)
+@fillcaption(The Bilateral Exponential Distribution.)
+@tag(bilateral-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{cauchy-dist(@pragma(defn)@index(cauchy-dist)@index(cauchy distribution)@i(tau)[ ,@i(low)] [, @i(high)])}@\Returns a @code(FLONUM) from the Cauchy distribution, a symetric distribution with a high peak at zero and a width (variance) that increases with parameter @i(tau), which must be greater than zero. The @i(low) and @i(high) parameters give optional artificial bounds on the minimum and maximum output values, respectively.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "cauchy-fig.ps"))
+@html(<img src="cauchy-fig.gif"><br><br>)
+@fillcaption(The Cauchy Distribution, @i(tau) = 1.)
+@tag(cauchy-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{hyperbolic-cosine-dist(@pragma(defn)@index(hyperbolic-cosine-dist) [@i(low)] [, @i(high)])}@\Returns a @code(FLONUM) value from the hyperbolic cosine distribution, a symetric distribution with its peak at zero. The @i(low) and @i(high) parameters give optional artificial bounds on the minimum and maximum output values, respectively.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "hyperbolic-fig.ps"))
+@html(<img src="hyperbolic-fig.gif"><br><br>)
+@fillcaption(The Hyperbolic Cosine Distribution.)
+@tag(hyperbolic-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{logistic-dist(@pragma(defn)@index(logistic-dist)@index(logistic distribution)@i(alpha), @i(beta)[ ,@i(low)] [, @i(high)])}@\Returns a @code(FLONUM) value from the logistic distribution, which is symetric about the mean. The @i(alpha) parameter primarily affects dispersion (variance), with larger values resulting in values closer to the mean (less variance), and the @i(beta) parameter primarily influences the mean. The @i(low) and @i(high) parameters give optional artificial bounds on the minimum and maximum output values, respectively.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "logistic-fig.ps"))
+@html(<img src="logistic-fig.gif"><br><br>)
+@fillcaption(The Logistic Distribution, alpha = 1, beta = 2.)
+@tag(logistic-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{arc-sine-dist(@pragma(defn)@index(arc-sine-dist)@index(arcsine distribution))}@\Returns a @code(FLONUM) value from the arc sine distribution, which outputs values between 0 and 1. It is symetric about the mean of 1/2, but is more likely to generate values closer to 0 and 1.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "arcsine-fig.ps"))
+@html(<img src="arcsine-fig.gif"><br><br>)
+@fillcaption(The Arc Sine Distribution.)
+@tag(arcsine-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{gaussian-dist(@index(Gaussian distribution)@pragma(defn)@index(gaussian-dist)@i(xmu), @i(sigma)[ ,@i(low)] [, @i(high)])}@\Returns a @code(FLONUM) value from the Gaussian or Gauss-Laplace distribution, a linear function of the normal distribution. It is symetric about the mean of @i(xmu), with a standard deviation of @i(sigma), which must be greater than zero. The @i(low) and @i(high) parameters give optional artificial bounds on the minimum and maximum output values, respectively.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "gaussian-fig.ps"))
+@html(<img src="gaussian-fig.gif"><br><br>)
+@fillcaption{The Gauss-Laplace (Gaussian) Distribution, @i(xmu) = 0, @i(sigma) = 1.}
+@tag(gaussian-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{beta-dist(@index(beta distribution)@pragma(defn)@index(beta-dist)@i(a), @i(b))}@\Returns a @code(FLONUM) value from the Beta distribution. This distribution outputs values between 0 and 1, with outputs more likely to be close to 0 or 1. The parameter @i(a) controls the height (probability) of the right side of the distribution (at 1) and @i(b) controls the height of the left side (at 0). The distribution is symetric about 1/2 when @i(a) = @i(b).
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "beta-fig.ps"))
+@html(<img src="beta-fig.gif"><br><br>)
+@fillcaption(The Beta Distribution, @i(alpha) = .5, @i(beta) = .25.)
+@tag(beta-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{bernoulli-dist(@index(Bernoulli distribution)@pragma(defn)@index(bernoulli-dist)@i(px1)[ ,@i(x1)] [, @i(x2)])}@\Returns either @i(x1) (default value is 1) with probability @i(px1) or @i(x2) (default value is 0) with probability 1 - @i(px1). The value of @i(px1) should be between 0 and 1. By
+convention, a result of @i(x1) is viewed as a success while @i(x2) is viewed as
+a failure.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 3.5 in, width = 3.75 in, magnify = 0.75,
+ postscript = "bernoulli-fig.ps"))
+@html(<img src="bernoulli-fig.gif"><br><br>)
+@fillcaption(The Bernoulli Distribution, @i(px1) = .75.)
+@tag(bernoulli-fig)
+@end(figure)
+
+@begin(fndefs)
+@code{(binomial-dist@index(binomial distribution)@pragma(defn)@index(binomial-dist) @i(n) @i(p)}@\Returns a @code(FIXNUM) value from the binomial distribution, where @i(n) is the number of Bernoulli trials run (a @code(FIXNUM)) and @i(p) is the probability of success in the Bernoulli trial (a @code(FLONUM) from 0 to 1). The mean is the product of @i(n) and @i(p).
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 3.5 in, width = 3.75 in, magnify = 0.75,
+ postscript = "binomial-fig.ps"))
+@html(<img src="binomial-fig.gif"><br><br>)
+@fillcaption(The Binomial Distribution, @i(n) = 5, @i(p) = .5.)
+@tag(binomial-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{geometric-dist(@index(geometric distribution)@pragma(defn)@index(geometric-dist)@i(p))}@\Returns a @code(FIXNUM) value from the geometric distribution, which is defined as the number of failures before a success is achieved in a Bernoulli trial with probability of success @i(p) (a @code(FLONUM) from 0 to 1).
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 3.5 in, width = 3.75 in, magnify = 0.75,
+ postscript = "geometric-fig.ps"))
+@html(<img src="geometric-fig.gif"><br><br>)
+@fillcaption(The Geometric Distribution, @i(p) = .4.)
+@tag(geometric-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{poisson-dist(@index(Poisson distribution)@pragma(defn)@index(poisson-dist)@i(delta))}@\Returns a @code(FIXNUM) value from the Poisson distribution with a mean of @i(delta) (a @code(FIXNUM)). The Poisson distribution is often used to generate a sequence of time intervals, resulting in random but often pleasing rhythms.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 3.5 in, width = 3.75 in, magnify = 0.75,
+ postscript = "poisson-fig.ps"))
+@html(<img src="poisson-fig.gif"><br><br>)
+@fillcaption(The Poisson Distribution, @i(delta) = 3.)
+@tag(poisson-fig)
+@end(figure)
+
+@begin(comment)
+*****************
+Note: this should remain out of Nyquist until the granulate code is cleaned up (why are there separate functions for pitch-dist and len-dist instead of a single function where any parameter can be specified by a closure?)
+*****************
+@begin(fndefs)
+@codef{pitch-dist-granulate(@pragma(defn)@index(pitch-dist-granulate)@index(granular synthesis)@i(filename), @i(grain-dur), @i(grain-dev), @i(ioi), @i(ioi-dev), @i(pitch-dist)[ ,@i(file-start)] [, @i(file-end)])}@\*** need to write this ***
+
+@i(filename) @dash name of the file
+
+@i(dist) @dash the distribution that determines the length of the grains
+
+@i(ioi) @dash the basic inter-onset-interval for grains
+
+@i(ioi-dev) @dash ioi is actually: ioi + random(0, ioi-dev)
+
+@i(pitch-dev) @dash grains are resampled at rate between 1 and pitch-dev
+
+@i(file-start) @dash when to start reading the file (an offset from start). The
+default is 0.
+
+@i(file-end) @dash when to stop reading the file (an offset from end) the
+default is 0
+
+returns @dash a set of sound grains created from the input file
+
+This is a granular
+synthesis function based on the one by Roger B. Dannenberg. The
+pitch of the grains will be based on the distribution you give to it. The
+distribution must be passed in as a continuation.
+
+(len-dist-granulate @i(filename) @i(dist ioi ioi-dev) @i(pitch-dev) [@i(file-start)] [@i(file-end)])
+
+@i(filename) @dash name of the file
+
+@i(grain-dur)– the duration of a grain
+
+@i(grain-dev)– grain dur is actually grain-dur + random(0, grain-dev)
+
+@i(ioi</span>)– the basic inter-onset-interval for grains
+
+@i(ioi</span>-dev)– ioi is actually: ioi + random(0, ioi-dev)
+
+@i(pitch-dist)– the distribution of the alteration in pitch to the grains. The
+distribution values should be > 1.
+
+@i(file-start)– when to start reading the file (an offset from start). The
+default is 0
+
+@i(file-end)– when to stop reading the file (an offset from end). The
+default is 0
+
+returns– a set of sound grains created from the input file
+
+This is a granular
+synthesis function based on the one by Roger B. Dannenberg. The
+length of the grains will be based on the distribution you give to it. The
+distribution must be passed in as a continuation.
+@end(fndefs)
+@end(comment)
+
+@section(Score Generation and Manipulation)
+
+A common application of pattern generators is to specify parameters
+for notes. (It should be understood that ``notes'' in this context
+means any Nyquist behavior, whether it represents a conventional note,
+an abstract sound object, or even some micro-sound event that is just
+a low-level component of a hierarchical sound organization. Similarly,
+``score'' should be taken to mean a specification for a
+sequence of these ``notes.'')
+The @code(score-gen) macro (defined by
+loading @code(xm.lsp)) establishes a convention for representing
+scores and for generating them using patterns.
+
+The @code(timed-seq) macro, described in Section @ref(timed-seq-sec),
+already provides a way to represent a ``score'' as a list of expressions.
+The Xmusic representation goes a bit further by specifying that
+@i(all notes are specified by an alternation of keywords and values, where
+some keywords have specific meanings and interpretations.)
+
+The basic idea of @code(score-gen)@index(score-gen) is you provide a template for notes in
+a score as a set of keywords and values. For example,
+@begin(example)
+set pitch-pattern = make-cycle(list(c4, d4, e4, f4))
+score-gen(dur: 0.4, name: quote(my-sound),
+ pitch: next(pitch-pattern), score-len: 9)
+@end(example)
+generates a score of 9 notes as follows:
+@begin(example)
+((0 0 (SCORE-BEGIN-END 0 3.6))
+ (0 0.4 (MY-SOUND :PITCH 60))
+ (0.4 0.4 (MY-SOUND :PITCH 62))
+ (0.8 0.4 (MY-SOUND :PITCH 64))
+ (1.2 0.4 (MY-SOUND :PITCH 65))
+ (1.6 0.4 (MY-SOUND :PITCH 60))
+ (2 0.4 (MY-SOUND :PITCH 62))
+ (2.4 0.4 (MY-SOUND :PITCH 64))
+ (2.8 0.4 (MY-SOUND :PITCH 65))
+ (3.2 0.4 (MY-SOUND :PITCH 60)))
+@end(example)
+The use of keywords like @code(:PITCH) helps to make scores
+readable and easy to process without specific knowledge of
+about the functions called in the score. For example, one
+could write a transpose operation to transform all the
+@code(:pitch) parameters in a score without having to know
+that pitch is the first parameter of @code(pluck) and the
+second parameter of @code(piano-note). Keyword parameters are
+also used to give flexibility to note specification with
+@code(score-gen). Since this approach requires the use of
+keywords, the next section
+is a brief explanation of how to define functions that use
+keyword parameters.
+
+@subsection(Keyword Parameters)
+@index(keyword parameters)
+@index(parameters, keyword)
+Keyword parameters are parameters whose presence is
+indicated by a special symbol, called a keyword, followed
+by the actual parameter. Keyword parameters in SAL have
+default values that are used if no actual parameter is
+provided by the caller of the function. (See Appendix
+ @ref(xlisp-app) to learn about keywords in XLISP.)
+
+To specify that a parameter is a keyword parameter,
+use a keyword symbol (one that ends in a colon) followed
+by a default value.
+ For example, here is a function that
+accepts keyword parameters and invokes the @code(pluck)
+function:
+@begin(example)
+define function k-pluck(pitch: 60, dur: 1)
+ return pluck(pitch, dur)
+@end(example)
+Now, we can call k-pluck with keyword parameters. The
+keywords are simply the formal parameter names with
+a prepended colon character (@code(:pitch) and @code(:dur)
+in this example), so a function call would look like:
+@begin(example)
+pluck(pitch: c3, dur: 3)
+@end(example)
+Usually, it is best to give keyword parameters useful
+default values. That way, if a parameter such as @code(dur:)
+is missing, a reasonable default value (1) can be used
+automatically.
+It is never an error to omit a keyword parameter, but the
+called function can check to see if a keyword parameter
+was supplied or not.
+Because of default values, we can call
+@code[k-pluck(pitch: c3)] with no duration,
+@code[k-pluck(dur: 3)] with only a duration,
+or even @code[k-pluck()] with no parameters.
+
+In XLISP, there is additional syntax to specify an alternate symbol
+to be used as the keyword and to allow the called function
+to determine whether or not a keyword parameter was
+supplied, but these features are little-used. See the XLISP
+manual for details.
+
+@subsection(Using score-gen)@pragma(defn)@index(score-gen)
+The @code(score-gen) macro computes a score based on keyword parameters.
+Some keywords have a special meaning, while others are not interpreted
+but merely placed in the score. The resulting score can be synthesized
+using @code(timed-seq) (see Section @ref(timed-seq-sec)).
+
+The form of a call to @code(score-gen) is simply:
+@begin(fndefs)
+@codef[score-gen(@pragma(defn)@index(score-gen)@i(k1:) @i(e1), @i(k2:) @i(e2), ... )]@\where the @i(k)'s
+are keywords and the @i(e)'s are
+expressions. A score is generated by evaluating the expressions once for
+each note and constructing a list of keyword-value pairs. A number
+of keywords have special interpretations. The rules for interpreting
+these parameters will be explained through a set of "How do I ..."
+questions below.
+@end(fndefs)
+
+@i(How many notes will be generated?) The keyword
+parameter @code(:score-len) specifies an upper bound on the number
+of notes. The keyword @code(:score-dur) specifies an upper bound
+on the starting time of the last note in the score. (To be more
+precise, the @code(:score-dur) bound is reached when the
+default starting time of the next note is greater than or equal
+to the @code(:score-dur) value. This definition is necessary because
+note times are not strictly increasing.) When either bound
+is reached, score generation ends. At least one of these two
+parameters must be specified or an error is raised. These keyword
+parameters are evaluated just once and are not copied into the
+parameter lists of generated notes.
+
+@i(What is the duration of generated notes?) The
+keyword @code(:dur) defaults to 1 and specifies the nominal duration
+in seconds. Since the generated note list is compatible with
+@code(timed-seq), the starting time and duration (to be precise, the
+@i(stretch factor)) are not passed as parameters to the notes. Instead,
+they control the Nyquist environment in which the note will be evaluated.
+
+@i(What is the start time of a note?) The default start time of the
+first note is zero. Given a note, the default start time of the next note is
+the start time plus the inter-onset time, which is given by the @code(:ioi)
+parameter. If no @code(:ioi) parameter is specified, the inter-onset time
+defaults to the duration, given by @code(:dur). In all cases, the default
+start time of a note can be overridden by the keyword parameter @code(:time).
+
+@i(When does the score begin and end?) The behavior @code[SCORE-BEGIN-END]
+contains the beginning and ending of the
+score (these are used for score manipulations, e.g. when scores are merged,
+their begin times can be aligned.) When @code(timed-seq) is used to
+synthesize a score, the @code(SCORE-BEGIN-END) marker is
+not evaluated. The @code(score-gen) macro inserts a ``note'' of the form
+@code[(0 0 (SCORE-BEGIN-END @i(begin-time) @i(end-time)))]
+at the time given by the @code(:begin) keyword, with @i(begin-time) and
+@i(end-time) determined by the @code(:begin) and @code(:end)
+keyword parameters, respectively. If the @i(:begin) keyword is not
+provided, the score begins at zero. If the @code(:end) keyword
+is not provided, the score ends at the default start time
+of what would be the next note after the last note in the score
+(as described in the previous paragraph). Note: if @code(:time) is used to
+compute note starting times, and these times are not increasing, it is
+strongly advised to use @code(:end) to specify an end time for the score,
+because the default end time may be anywhere in the middle of the
+generated sequence.
+
+@i(What function is called to synthesize the note?) The @code(:name)
+parameter names the function. Like other parameters, the value can be any
+expression, including something like @code[next(fn-name-pattern)],
+allowing function names to be recomputed for each note. The default value
+is @code(note).
+
+@i(Can I make parameters depend upon the starting time or the duration
+of the note?) Parameter expressions can use the variable @code(sg:time)
+to access the start time of the note, @code(sg:ioi) to access the
+inter-onset time, and @code(sg:dur) to access the
+duration (stretch factor) of the note. Also, @code(sg:count) counts how
+many notes have been computed so far, starting at 0. The order of
+computation is: @code(sg:time) first, then @code(sg:ioi) and @code(sg:dur),
+so for example, an expression to compute @code(sg:dur) can
+depend on @code(sg:ioi).
+
+@i(Can parameters depend on each other?) The keyword @code(:pre)
+introduces an expression that is evaluated before each note, and
+@code(:post) provides an expression to be evaluated after each note.
+The @code(:pre) expression can assign one or more global variables
+which are then used in one or more expressions for parameters.
+
+@i(How do I debug @code(score-gen) expressions?) You can set the
+@code(:trace) parameter to true (@code(t)) to enable a print statement
+for each generated note.
+
+@i(How can I save scores generated by @code(score-gen) that I like?) If the
+keyword parameter @code(:save) is set to a symbol, the global variable
+named by the symbol is set to the value of the generated sequence. Of
+course, the value returned by @code(score-gen) is just an ordinary list that
+can be saved like any other value.
+
+In summary, the following keywords have special interpretations
+in @code(score-gen):
+@code(:begin), @code(:end), @code(:time), @code(:dur), @code(:name),
+@code(:ioi), @code(:trace),
+@code(:save), @code(:score-len), @code(:score-dur), @code(:pre), @code(:post).
+ All other keyword
+parameters are expressions that are evaluated once for each note
+and become the parameters of the notes.
+
+@subsection(Score Manipulation)
+@index(score manipulation)@index(manipulation of scores)
+Nyquist encourages the representation of music as
+executable programs, or @i(behaviors), and there are various
+ways to modify behaviors, including time stretching,
+transposition, etc. An alternative to composing executable
+programs is to manipulate scores as editable data. Each
+approach has its strengths and weaknesses. This section
+describes functions intended to manipulate Xmusic scores
+as generated by, or at least in the form generated by,
+@code(score-gen). Recall that this means scores are lists
+of events (e.g. notes), where events are three-element lists of the form
+(@i(time) @i(duration) @i(expression), and where @i(expression)
+is a standard lisp function call where all parameters are
+keyword parameters. In addition, the first ``note'' may be
+the special @code(SCORE-BEGIN-END) expression. If this is
+missing, the score begins at zero and ends at the end of the
+last note.
+
+For convenience, a set of functions is offered to access properties
+of events (or notes) in scores. Although lisp functions such as
+@code(car), @code(cadr), and @code(caddr) can be used, code is more
+readable when more mnemonic functions are used to access events.
+
+@begin(fndefs)
+@codef[event-time(@pragma(defn)@index(event-time)@i(event))]@\Retrieve the time field from
+an event.
+
+@codef[event-set-time(@pragma(defn)@index(event-set-time)@i(event), @i(time))]@\Construct
+a new event where the time of @i(event) is replaced by @i(time).
+
+@codef[event-dur(@pragma(defn)@index(event-dur)@i(event))]@\Retrieve the duration
+(i.e. the stretch factor) field from an event.
+
+@codef[event-set-dur(@pragma(defn)@index(event-set-dur)@i(event), @i(dur))]@\Construct
+a new event where the duration (or stretch factor) of @i(event) is
+replaced by @i(dur).
+
+@codef[event-expression(@pragma(defn)@index(event-expression)@i(event))]@\Retrieve the expression
+field from an event.
+
+@codef[event-set-expression(@pragma(defn)@index(event-set-expression)@i(event),
+@i(dur))]@\Construct
+a new event where the expression of @i(event) is replaced by @i(expression).
+
+@codef[event-end(@pragma(defn)@index(event-end)@i(event))]@\Retrieve the end time
+of @i(event), its time plus its duration.
+
+@codef[expr-has-attr(@pragma(defn)@index(expr-has-attr)@i(expression), @i(attribute))]@\Test
+whether a score event @i(expression) has the given @i(attribute).
+
+@codef{expr-get-attr(@pragma(defn)@index(expr-get-attr)@i(expression), @i(attribute),
+[@i(default)])}@\Get the value of the given @i(attribute) from a score event
+@i(expression). If @i(attribute) is not present, return @i(default) if
+specified, and otherwise @code(nil).
+
+@codef{expr-set-attr(@pragma(defn)@index(expr-set-attr)@i(expr), @i(attribute), @i(value))}@\Construct a new expression identical to @i(expr) except that the @i(attribute) has @i(value).
+
+@codef[event-has-attr(@pragma(defn)@index(event-has-attr)@i(event), @i(attribute))]@\Test
+whether a given score @i(event)'s expression has the given @i(attribute).
+
+@codef{event-get-attr(@pragma(defn)@index(event-get-attr)@i(event), @i(attribute),
+[@i(default)])}@\Get the value of the given @i(attribute) from a score
+@i(event)'s expression. If @i(attribute) is not present, return @i(default) if
+specified, and otherwise @code(nil).
+
+@codef{event-set-attr(@pragma(defn)@index(event-set-attr)@i(event), @i(attribute), @i(value))}@\Construct a new event identical to @i(event) except that the @i(attribute) has @i(value).
+
+@end(fndefs)
+
+Functions are provided to shift the starting times of notes,
+stretch times and durations, stretch only durations,
+add an offset to a keyword parameter, scale a keyword parameter, and
+other manipulations. Functions are also provided to extract
+ranges of notes, notes that match criteria, and to combine scores.
+Most of these functions (listed below in detail)
+share a set of keyword parameters that optionally limit the range over which
+the transformation operates. The @code(:from-index) and @code(:to-index)
+parameters specify the index of the first note and the index of the
+last note to be changed. If these numbers are negative, they are offsets
+from the end of the score, e.g. -1 denotes the last note of the score. The
+@code(:from-time) and @code(:to-time) indicate a range of starting times
+of notes that will be affected by the manipulation. Only notes whose time
+is greater than or equal to the @i(from-time) and @i(strictly less than)
+ the @i(to-time) are modified. If both index and time ranges are specified,
+only notes that satisfy @i(both) constraints are selected.
+
+@begin(fndefs)
+@codef[score-sorted(@pragma(defn)@index(score-sorted)@i(score))]@\Test if @i(score) is sorted.
+
+@codef{score-sort(@pragma(defn)@index(score-sort)@i(score)[ ,@i(copy-flag)])}@\Sort
+ the notes in a
+score into start-time order. If copy-flag is nil, this is a destructive
+operation which should only be performed if the top-level score list
+is a fresh copy that is not shared by any other variables. (The
+@i(copy-flag) is intended for internal system use only.)
+ For the following operations, it is assumed
+that scores are sorted, and all operations return a sorted score.
+
+@codef{score-shift(@pragma(defn)@index(score-shift)@i(score), @i(offset)[ ,from-index: @i(i),]
+[to-index: @i(j)] [, from-time: @i(x)] [, to-time: @i(y)])}@\Add a constant
+@i(offset) to the starting time of a set of notes in @i(score). By default,
+all notes are modified, but the range of notes can be limited with the
+keyword parameters. The begin time of the score is not changed, but the
+end time is increased by @i(offset).
+The original score is not modified, and a new score is returned.
+
+@codef{score-stretch(@pragma(defn)@index(score-stretch)@i(score), @i(factor),
+[dur: @i(dur-flag)] [, time: @i(time-flag)] [, from-index: @i(i),]
+[to-index: @i(j)] [, from-time: @i(x)] [, to-time: @i(y)])}@\Stretch
+note times and durations by @i(factor). The default @i(dur-flag) is
+non-null, but if @i(dur-flag) is null, the original durations are retained
+and only times are stretched. Similarly, the default @i(time-flag) is
+non-null, but if @i(time-flag) is null, the original times are retained
+and only durations are stretched. If both @i(dur-flag) and @i(time-flag)
+are null, the score is not changed. If a range
+of notes is specified, times are scaled within that range, and
+notes after the range are shifted so that the stretched region does not
+create a "hole" or overlap with notes that follow. If the range begins
+or ends with a time (via @code(:from-time) and @code(:to-time)), time
+stretching
+takes place over the indicated time interval independent of whether
+any notes are present or where they start. In other words, the
+``rests'' are stretched along with the notes.
+The original score is not modified, and a new score is returned.
+
+@codef{score-transpose(@pragma(defn)@index(score-transpose)@i(score),
+@i(keyword), @i(amount)[ ,from-index: @i(i),]
+[to-index: @i(j)] [, from-time: @i(x)] [, to-time: @i(y)])}@\For each note
+in the score and in any indicated range, if there is a keyword
+ parameter matching @i(keyword) and the
+parameter value is a number, increment
+the parameter value by @i(amount). For example, to tranpose up by a whole
+step, write @code[(score-transpose 2 :pitch @i(score))]. The
+original score is not modified, and a new score
+is returned.
+
+@codef{score-scale(@pragma(defn)@index(score-scale)@i(score), @i(keyword), @i(amount),
+ [from-index: @i(i),]
+[to-index: @i(j)] [, from-time: @i(x)] [, to-time: @i(y)])}@\For each note
+in the score and in any indicated range, if there is a keyword
+parameter matching @i(keyword) and the
+parameter value is a number, multiply
+the parameter value by @i(amount). The original score is not modified,
+and a new score is returned.
+
+@codef{score-sustain(@pragma(defn)@index(score-sustain)@i(score), @i(factor),
+ [from-index: @i(i),]
+[to-index: @i(j)] [, from-time: @i(x)] [, to-time: @i(y)])}@\For each note
+in the score and in any indicated range, multiply
+the duration (stretch factor) by @i(amount). This can be used to
+make notes sound more legato or staccato, and does not change their
+starting times. The original score is not modified, and
+a new score is returned.
+
+@codef{score-voice(@pragma(defn)@index(score-voice)@i(score), @i(replacement-list),
+ [from-index: @i(i),]
+[to-index: @i(j)] [, from-time: @i(x)] [, to-time: @i(y)])}@\For each note
+in the score and in any indicated range, replace the behavior (function)
+name using @i(replacement-list), which has the format:
+@code[((@i(old1 new1)) (@i(old2 new2)) ...)], where @i(oldi) indicates
+a current behavior name and @i(newi) is the replacement. If @i(oldi)
+is @code(*), it matches anything. For example, to
+replace @code(my-note-1) by @code(trombone) and @code(my-note-2) by
+@code(horn), use @code[score-voice(@i(score), {{my-note-1 trombone}
+{my-note-2 horn}})]. To replace all instruments with
+@code(piano), use @code[score-voice(@i(score), {{* piano}})].
+The original score is not modified, and a
+ new score is returned.
+
+@codef{score-merge(@pragma(defn)@index(score-merge)@i(score1), @i(score2), ...)}@\Create
+a new score containing all the notes of the parameters, which are all
+scores. The resulting notes retain their original times and durations. The
+merged score begin time is the minimum of the begin times of the parameters
+and the merged score end time is the maximum of the end times of
+the parameters. The original scores are not modified, and a new
+score is returned.
+
+@codef{score-append(@pragma(defn)@index(score-append)@i(score1), @i(score2), ...)}@\Create
+a new score containing all the notes of the parameters, which are all
+scores. The begin time of the first score is unaltered. The begin time of
+ each other score is aligned to the end time of the
+previous score; thus, scores are ``spliced'' in sequence. The original
+scores are not modified, and a new score is returned.
+
+@codef{score-select(@pragma(defn)@index(score-select)@index(score-filter)@i(score), @i(predicate),
+ [from-index: @i(i)] [, to-index: @i(j),]
+[from-time: @i(x)] [, to-time: @i(y)] [, reject: @i(flag)])}@\Select (or reject)
+notes to form a new score. Notes are selected if they fall into the
+given ranges of index and time @i(and) they satisfy @i(predicate), a function
+of three parameters that is applied to the start time, duration, and the
+expression of the note. Alternatively, @i(predicate) may be @code(t),
+indicating that all notes in range are to be selected.
+The selected notes along with the existing score begin and end markers, are combined to form a new score. Alternatively, if
+the @code(:reject) parameter is non-null, the notes @i(not) selected form
+ the new score (in other words the selected notes are rejected or removed to
+ form the new score). The original score is not modified, and a
+ new score is returned.
+
+@codef{score-set-begin(@pragma(defn)@index(score-set-begin)@i(score), @i(time))}@\The begin
+time
+ from the @i(score)'s @code(SCORE-BEGIN-END) marker is set to @i(time). The
+original score is not modified, and a new score is returned.
+
+@codef{score-get-begin(@pragma(defn)@index(score-get-begin)@i(score))}@\Return the begin
+time of the @i(score).
+
+@codef{score-set-end(@pragma(defn)@index(score-set-end)@i(score), @i(time))}@\The end time
+ from the @i(score)'s @code(SCORE-BEGIN-END) marker is set to @i(time). The
+original score is not modified, and a new score is returned.
+
+@codef{score-get-end(@pragma(defn)@index(score-get-end)@i(score))}@\Return the end
+time of the @i(score).
+
+@codef{score-must-have-begin-end(@pragma(defn)@index(score-must-have-begin-end)@i(score))}@\If
+ @i(score) does not have a begin and end time, construct a score with a
+ @code(SCORE-BEGIN-END) expression and return it. If score already has a begin
+and end time, just return the score. The orignal score is not modified.
+
+@codef{score-filter-length(@pragma(defn)@index(score-filter-length)@i(score),
+@i(cutoff))}@\Remove notes that extend beyond the @i(cutoff) time. This
+is similar to @code(score-select), but the here, events are removed when
+their nominal ending time (start time plus duration) exceeds the @i(cutoff),
+whereas the @code(:to-time) parameter is compared to the note's start time.
+The original score is not modified, and a new score is returned.
+
+@codef{score-repeat(@pragma(defn)@index(score-repeat)@i(score), @i(n))}@\Make a sequence
+of @i(n) copies of @i(score). Each copy is shifted to that it's begin
+time aligns with the end time of the previous copy, as in @code(score-append).
+The original score is not modified, and a new score is returned.
+
+@codef{score-stretch-to-length(@pragma(defn)@index(score-stretch-to-length)@i(score),
+@i(length))}@\Stretch the score so that the end time of the score is
+the score's begin time plus @i(length).
+The original score is not modified, and a new score is returned.
+
+@codef{score-filter-overlap(@pragma(defn)@index(score-filter-overlap)@i(score))}@\Remove
+overlapping notes (based on the note start time and duration), giving
+priority to the
+positional order within the note list (which is also time order).
+The original score is not modified,
+and a new score is returned.
+
+@codef{score-print(@pragma(defn)@index(score-print)@i(score))}@\Print a score with
+one note per line. Returns @code(nil).
+
+@codef{score-play(@pragma(defn)@index(score-play)@i(score))}@\Play @i(score)
+using @code(timed-seq) to convert the score to a sound, and
+ @code(play) to play the sound.
+
+@codef{score-adjacent-events(@pragma(defn)@index(score-adjacent-events)@i(score),
+ @i(function),
+ [from-index: @i(i)] [, to-index: @i(j),]
+[from-time: @i(x)] [, to-time: @i(y)])}@\Call
+ @code[(@i(function) @i(A) @i(B) @i(C))], where
+@i(A), @i(B), and @i(C) are consecutive notes in the score. The result
+replaces @i(B). If the result is @code(nil), @i(B) is deleted, and the
+next call will be @code[(@i(function A C D))], etc. The first call is
+to @code[(@i(function) nil @i(A B))] and the last is to
+@code[(@i(function) @i(Y Z) nil)]. If there is just one note in the
+score, @code[(@i(function) nil @i(A) nil)] is called. Function calls
+are not made if the note is outside of the indicated range.
+This function
+allows notes and their parameters to be adjusted according to their
+immediate context. The original score is not modified,
+and a new score is returned.
+
+@codef{score-apply(@pragma(defn)@index(score-apply)@i(score), @i(function),
+ [from-index: @i(i)] [, to-index: @i(j),]
+[from-time: @i(x)] [, to-time: @i(y)])}@\Replace
+each note in the score with the result of
+ @code[(@i(function time dur expression))], where @i(time), @i(dur),
+and @i(expression) are the time, duration, and expression of the note.
+If a range is indicated, only notes in the range are replaced.
+The original score is not modified, and a new score is returned.
+
+@codef{score-indexof(@pragma(defn)@index(score-indexof)@i(score), @i(function),
+ [from-index: @i(i)] [, to-index: @i(j),]
+[from-time: @i(x)] [, to-time: @i(y)])}@\Return the index (position)
+of the first score event (in range) for which applying @i(function)
+using @code[(@i(function time dur expression))] returns true.
+
+
+@codef{score-last-indexof(@pragma(defn)@index(score-last-indexof)@i(score), @i(function),
+ [from-index: @i(i)] [, to-index: @i(j),]
+[from-time: @i(x)] [, to-time: @i(y)])}@\Return the index (position)
+of the last score event (in range) for which applying @i(function)
+using @code[(@i(function time dur expression))] returns true.
+
+@codef{score-randomize-start(@pragma(defn)@index(score-randomize-start)@index(jitter)@index(feel factor)@index(offset)@i(score),
+@i(amt)[ ,from-index: @i(i)] [, to-index: @i(j),]
+[from-time: @i(x)] [, to-time: @i(y)])}@\Alter the start times of notes by a
+random amount up to plus or minus @i(amt).
+The original score is not modified, and a new score is returned.
+@end(fndefs)
+
+@subsection(Xmusic and Standard MIDI Files)
+@index(MIDI file)@index(Standard MIDI File)
+Nyquist has a general facility to read and write MIDI files.
+You can even translate to and from a text representation, as described
+in Chapter @ref(adagio-chap). It is also useful sometimes to read notes
+from Standard MIDI Files into Xmusic scores and vice versa. At present,
+Xmusic only translates notes, ignoring the various controls, program
+changes, pitch bends, and other messages.
+
+MIDI notes are translated to Xmusic score events as follows:
+@begin(display)
+@code[(@i(time) @i(dur) (NOTE :chan @i(channel) :pitch @i(keynum) :vel @i(velocity)))],
+@end(display)
+where @i(channel), @i(keynum), and @i(velocity) come directly
+from the MIDI message (channels are numbered starting from zero).
+Note also that note-off messages are implied by the stretch factor
+@i(dur) which is duration in seconds.
+
+@begin(fndefs)
+@codef{score-read-smf(@pragma(defn)@index(score-read-smf)@index(midi file)@i(filename))}@\Read a
+standard MIDI file from @i(filename). Return an Xmusic score, or @code(nil)
+if the file could not be opened. The
+start time is zero, and the end time is the maximum end time of all
+notes. A very limited interface is offered to extract MIDI program numbers
+from the file: The global variable @code(*rslt*) is set to a list of MIDI
+program numbers for each channel. E.g. if @code(*rslt*) is @code[(0 20 77)],
+then program for channel 0 is 0, for channel 1 is 20, and for channel 2 is 77.
+Program changes were not found on other channels. The default program number is
+0, so in this example, it is not known whether the program 0 on channel 0
+is the result of a real MIDI program change command or just a default value.
+If more than one program change exists on a channel, the @i[last] program
+number is recorded and returned, so this information will only be completely
+correct when the MIDI file sends single program change per channel before
+any notes are played. This, however, is a fairly common practice. Note that
+the list returned as @code(*rslt*) can be passed
+to @code(score-write-smf), described below.
+
+@codef{score-write-smf(@pragma(defn)@index(score-write-smf)@index(midi file)@i(score), @i(filename),
+[@i(programs)])}@\Write a standard MIDI file to @i(filename)
+with notes in @i(score). In this function,
+@i(every) event in the score with a @code(:pitch) attribute, regardless of the
+``instrument'' (or function name), generates a
+MIDI note, using the @code(:chan) attribute for the channel (default 0) and
+the @code(:vel) attribute for velocity (default 100). There is no facility
+(in the current implementation) to issue control changes, but to allow
+different instruments, MIDI programs may be set in two ways. The simplest is
+to associate programs with channels using
+the optional @i[programs] parameter, which is simply a list of up to 16 MIDI
+program numbers. Corresponding program change commands are added to the
+beginning of the MIDI file. If @i[programs] has less than 16 elements, program
+change commands are only sent on the first @i[n] channels. The second way to
+issue MIDI program changes is to add a @code(:program) keyword parameter to
+a note in the score. Typically, the note will have a @code(:pitch) of
+@code(nil) so that no actual MIDI note-on message is generated. If program
+changes and notes have the same starting times, their relative playback
+order is undefined, and the note may be cut off by an immediately
+following program change. Therefore, program changes should occur slightly,
+e.g. 1 ms, before any notes. @i(Program numbers and channels are numbered
+starting at zero, matching the internal MIDI representation. This may be
+one less than displayed on MIDI hardware, sequencers, etc.)
+@end(fndefs)
+
+@subsection(Workspaces)
+@label(workspaces-sec)
+@index(workspace)
+When working with scores, you may find it necessary to save
+them in files between work sessions. This is not an issue
+with functions because they are
+normally edited in files and loaded from them. In contrast,
+scores are created as Lisp data, and unless you take care to
+save them, they will be destroyed when you exit the Nyquist
+program.
+
+A simple mechanism called a workspace has been created
+to manage scores (and any other Lisp data, for that matter).
+A workspace is just a set of lisp global variables. These
+variables are stored in the file @code(workspace.lsp).
+For simplicity, there is only one workspace, and no backups
+or versions are maintained, but the user is free to make
+backups and copies of @code(workspace.lsp).
+To help remember what each variable is for, you can also
+associate and retrieve a text string with each variable.
+The following functions manage workspaces.
+
+In addition, when a workspace is loaded, you can request that
+functions be called. For example, the workspace might store
+descriptions of a graphical interface. When the workspace is
+loaded, a function might run to convert saved data into a
+graphical interface. (This is how sliders are saved by the IDE.)
+
+@begin(fndefs)
+@codef[add-to-workspace(@pragma(defn)@index(add-to-workspace)@i(symbol))]@\Adds
+a global variable to the workspace. The @i(symbol) should be a (quoted)
+symbol.
+
+@codef[save-workspace(@pragma(defn)@index(save-workspace))]@\All global variables
+in the workspace are saved to @code(workspace.lsp) (in the current
+directory), overwriting the previous file.
+
+@codef{describe(@pragma(defn)@index(describe)@i(symbol),
+[@i(description)])}@\If @i(description), a text string, is present,
+associate @i(description) with the variable named by the
+@i(symbol). If @i(symbol) is not already in the workspace,
+it is added. If @i(description) is omitted, the function returns
+the current description (from a previous call) for @i(symbol).
+
+@codef{add-action-to-workspace(@pragma(defn)@index(add-action-to-workspace)@i(symbol))}@\Requests that the function named by @i(symbol) be
+called when the workspace is loaded (if the function is defined).
+@end(fndefs)
+
+To restore a workspace, use the command @code[load "workspace"]. This restores
+the values of the workspace variables to the values they had when
+@code(save-workspace) was last called. It also restores the documentation
+strings, if set, by @code(describe). If you load two or more
+@code(workspace.lsp) files, the variables will be merged into a
+single workspace. The current set of workspace variables are saved in
+the list @code(*workspace*). To clear the workspace, set @code(*workspace*)
+to @code(nil). This does not delete any variables, but means that
+no variables will be saved by @code(save-workspace) until variables are
+added again.
+
+Functions to be called are saved in the list @code(*workspace-actions*).
+to clear the functions, set @code(*workspace-actions*) to @code(nil).
+Restore functions to the list with @code(add-action-to-workspace).
+
+@subsection(Utility Functions)
+This chapter concludes with details of various utility functions for score
+manipulation.
+
+@begin(fndefs)
+@codef[patternp(@pragma(defn)@index(patternp)@i(expression))]@\Test if @i(expression) is
+an Xmusic pattern.
+
+@codef[params-transpose(@pragma(defn)@index(params-transpose)@i(params), @i(keyword),
+ @i(amount))]@\Add a transposition amount to a score event parameter. The
+@i(params)
+parameter is a list of keyword/value pairs (not preceded by a function name).
+The @i(keyword) is the keyword of the value to be altered, and @i(amount)
+is a number to be added to the value. If no matching keyword is present
+in @i(params), then @i(params) is returned. Otherwise, a new parameter
+list is constructed and returned. The original @i(params) is not changed.
+
+@codef[params-scale(@pragma(defn)@index(params-scale)@i(params), @i(keyword),
+ @i(amount))]@\Scale a score event parameter by some factor. This is like
+ @code(params-transpose), only using multiplication. The @i(params)
+list is a list of
+keyword/value pairs, @i(keyword) is the parameter keyword,
+and @i(amount) is the scale factor.
+
+@codef[interpolate(@pragma(defn)@index(interpolate)@index(linear interpolation)@i(x), @i(x1), @i(y1), @i(x2), @i(y2))]@\Linearly interpolate (or extrapolate)
+ between points
+(@i(x1), @i(y1)) and (@i(x2), @i(y2)) to compute the y value
+ corresponding to @i(x).
+
+@codef[intersection(@pragma(defn)@index(intersection)@index(set intersection)@i(a),
+ @i(b))]@\Compute the set intersection of lists @i(a) and @i(b).
+
+@codef[union(@pragma(defn)@index(union)@index(set union)@i(a), @i(b))]@\Compute
+the set union of lists @i(a) and @i(b).
+
+@codef[set-difference(@index(difference)@pragma(defn)@index(set-difference)@i(a),
+ @i(b))]@\Compute the set of all elements that are in @i(a) but not in @i(b).
+
+@codef[subsetp(@pragma(defn)@index(subsetp)@index(subset)@i(a), @i(b))]@\Returns true iff
+@i(a) is a subset of @i(b), that is, each element of @i(a) is a member
+of @i(b).
+@end(fndefs)
+
+@chapter(Nyquist Libraries)
+@index(libraries)
+Nyquist is always growing with new functions. Functions that are most fundamental
+are added to the core language. These functions are automatically loaded when you
+start Nyquist, and they are documented in the preceding chapters. Other functions seem
+less central and are implemented as lisp files that you can load. These are called
+library functions, and they are described here.
+
+To use a library function, you
+must first load the library, e.g. @code[(load "pianosyn")] loads the piano synthesis
+library. The libraries are all located in the @code(lib) directory, and you
+should therefore include this directory on your @code(XLISPPATH) variable. (See
+Section @ref(install-sec).) Each library is documented in one of the following
+sections. When you load the library described by the section, all functions
+documented in that section become available.
+
+@section(Piano Synthesizer)
+The piano synthesizer (library name is @code(pianosyn.lsp)) generates
+realistic piano tones using a multiple wavetable implementation by Zheng (Geoffrey)
+Hua and Jim Beauchamp, University of Illinois. Please see the notice about
+acknowledgements that prints when you load the file. Further informations and
+example code can be found in
+@code(demos/piano.htm)@index(demos, piano)@index(piano synthesizer tutorial).
+There are several useful functions in this library:
+@begin(fndefs)
+@codef[piano-note(@pragma(defn)@index(piano-note)@index(piano synthesizer)@i(duration), @i(step),
+ @i(dynamic))]@\Synthesizes a piano tone. @i(Duration) is the duration to the point of
+key release, after which there is a rapid decay. @i(Step) is the pitch in half
+steps, and @i(dynamic) is approximately equivalent to a MIDI key velocity
+parameter. Use a value near 100 for a loud sound and near 10 for a soft sound.
+
+@codef[piano-note-2(@pragma(defn)@index(piano-note-2)@i(step), @i(dynamic))]@\Similar to @code(piano-note) except the duration is nominally 1.0.
+
+@codef[piano-midi(@pragma(defn)@index(piano-midi)@i(midi-file-name))]@\Use the piano synthesizer
+to play a MIDI file. The file name (a string) is given by @i(midi-file-name).
+
+@codef[piano-midi2file(@pragma(defn)@index(piano-midi2file)@i(midi-file-name),
+@i(sound-file-name))]@\Use the piano synthesizer to play a MIDI file. The MIDI file
+is given by @i(midi-file-name) and the (monophonic) result is written to the file
+named @i(sound-file-name).
+@end(fndefs)
+
+@section(Dymanics Compression)
+To use these functions, load the file @code(compress.lsp). This library
+implements a compressor originally intended for noisy speech audio, but
+usable in a variety of situations.
+There are actually two compressors that can be used in
+series. The first, @code(compress), is
+a fairly standard one: it detects signal level with an RMS
+detector and uses table-lookup to determine how much gain
+to place on the original signal at that point. One bit of
+cleverness here is that the RMS envelope is ``followed'' or
+enveloped using @code(snd-follow), which does look-ahead to anticipate
+peaks before they happen.
+
+The other interesting feature is @code(compress-map), which builds
+a map in terms of compression and expansion. For speech, the recommended
+procedure is to figure out the noise floor on the signal you are compressing
+(for example, look at the signal where the speaker is not talking).
+Use a compression map that leaves the noise alone and boosts
+signals that are well above the noise floor. Alas, the @code(compress-map)
+function is not written in these terms, so some head-scratching is
+involved, but the results are quite good.
+
+The second compressor is called @code(agc), and it implements automatic gain
+control that keeps peaks at or below 1.0. By combining @code(compress) and
+@code(agc), you can process poorly recorded speech for playback on low-quality
+speakers in noisy environments. The @code(compress) function modulates the
+short-term gain to to minimize the total dynamic range, keeping the speech at
+a generally loud level, and the @code(agc) function rides the long-term gain
+to set the overall level without clipping.
+
+@begin(fndefs)
+@codef{compress-map(@pragma(defn)@index(compress-map)@i(compress-ratio),
+@i(compress-threshold),
+@i(expand-ratio), @i(expand-ratio)[ ,limit: @i(limit)] [, transition:
+@i(transition)])}@\Construct
+a map for the compress function. The map consists of two parts: a compression
+part and an expansion part.
+The intended use is to compress everything above compress-threshold by
+compress-ratio, and to downward expand everything below expand-ratio
+by expand-ratio. Thresholds are in dB and ratios are dB-per-dB.
+0dB corresponds to a peak amplitude of 1.0 or rms amplitude of 0.7
+If the input goes above 0dB, the output can optionally be limited
+by setting @code(:limit) (a keyword parameter) to @code(T).
+This effectively changes
+the compression ratio to infinity at 0dB. If @code(:limit) is @code(nil)
+(the default), then the compression-ratio continues to apply above 0dB.
+
+Another keyword parameter, @code(:transition), sets the amount below the
+thresholds (in dB) that a smooth transition starts. The default is 0,
+meaning that there is no smooth transition. The smooth transition is a
+2nd-order polynomial that matches the slopes of the straight-line compression
+curve and interpolates between them.
+
+It is assumed that expand-threshold <= compress-threshold <= 0
+The gain is unity at 0dB so if compression-ratio > 1, then gain
+will be greater than unity below 0dB.
+
+The result returned by this function is a sound for use in the @code(shape)
+function. The sound maps input
+dB to gain. Time 1.0 corresponds to 0dB, time 0.0 corresponds to
+-100 dB, and time 2.0 corresponds to +100dB, so this is a
+100hz ``sample rate'' sound. The sound gives gain in dB.
+
+@codef[db-average(@pragma(defn)@index(db-average)@i(input))]@\Compute the average amplitude
+of @i(input) in dB.
+
+@codef{compress(@pragma(defn)@index(compress)@i(input), @i(map), @i(rise-time), @i(fall-time),
+[@i(lookahead)])}@\Compress
+@i(input) using @i(map), a compression curve
+probably generated by @code(compress-map) (see above). Adjustments in gain have
+the given @i(rise-time) and @i(fall-time). Lookahead tells how far ahead to look
+at the signal, and is @i(rise-time) by default.
+
+@codef{agc(@index(automatic gain control)@pragma(defn)@index(agc)@index(gain)@i(input),
+@i(range), @i(rise-time), @i(fall-time)[ ,@i(lookahead)])}@\An automatic
+gain control applied to @i(input). The maximum gain in dB is @i(range). Peaks
+are attenuated to 1.0, and gain is controlled with the given @i(rise-time) and
+@i(fall-time). The look-ahead time default is @i(rise-time).
+@end(fndefs)
+
+@section(Clipping Softener)
+This library, in @code(soften.lsp), was written to improve the quality of
+poorly recorded speech. In recordings of speech, extreme clipping generates
+harsh high frequency noise. This can sound particulary bad on small speakers
+that will emphasize high frequencies. This problem can be ameliorated by
+low-pass filtering regions where clipping occurs. The effect is to dull the
+harsh clipping. Intelligibility is not affected by much, and the result can
+be much more pleasant on the ears. Clipping is detected simply by looking for
+large signal values. Assuming 8-bit recording, this level is set to 126/127.
+
+The function works by cross-fading between the normal signal and a filtered
+signal as opposed to changing filter coefficients.
+
+@begin(fndefs)
+@codef[soften-clipping(@pragma(defn)@index(soften-clipping)@index(clipping repair)@i(snd),
+@i(cutoff))]@\Filter the loud regions of a signal where clipping is likely
+to have generated additional high frequencies. The input signal is @i(snd)
+and @i(cutoff) is the filter cutoff frequency
+(4 kHz is recommended for speech).
+@end(fndefs)
+
+@section(Graphical Equalizer)
+There's nothing really ``graphical'' about this library (@code(grapheq.lsp)), but
+this is a common term for multi-band equalizers. This implementation uses
+Nyquist's @code(eq-band) function to split the incoming signal into different
+frequency bands. Bands are spaced geometrically, e.g. each band could be one
+octave, meaning that each successive band has twice the bandwidth. An interesting
+possibility is using computed control functions to make the equalization change
+over time.
+
+@begin(fndefs)
+@codef[nband-range(@pragma(defn)@index(nband-range)@index(graphical equalizer)@index(equalization)@i(input), @i(gains), @i(lowf), @i(highf))]@\A graphical equalizer applied to
+@i(input) (a @code(SOUND)). The gain controls and number of bands is given by @i(gains), an
+ARRAY of @code(SOUND)s (in other words, a Nyquist multichannel @code(SOUND)). Any sound in the
+array may be replaced by a @code(FLONUM). The bands are
+geometrically equally spaced from the lowest frequency @i(lowf) to the
+highest frequency @i(highf) (both are @code(FLONUM)s).
+
+@codef[nband(@pragma(defn)@index(nband)@i(input), @i(gains))]@\A graphical equalizer, identical
+to @code(nband-range) with a range of 20 to 20,000 Hz.
+@end(fndefs)
+
+@section(Sound Reversal)
+The @code(reverse.lsp) library implements functions to play sounds in reverse.
+
+@begin(fndefs)
+@codef[s-reverse(@index(reverse, sound)@pragma(defn)@index(s-reverse)@index(backward)@index(play in reverse)@i(snd))]@\Reverses @i(snd) (a @code(SOUND)). Sound must be shorter
+than @code(*max-reverse-samples*), which is currently initialized to
+25 million samples. Reversal allocates about 4 bytes per sample. This function
+uses XLISP in the inner sample loop, so do not be surprised if it calls the
+garbage collector a lot and runs slowly. The result starts at the starting
+time given by the current environment (not necessarily the starting time
+of @i(snd)). If @i(snd) has multiple channels, a multiple channel,
+reversed sound is returned.
+
+@codef{s-read-reverse(@index(read samples in reverse)@pragma(defn)@index(s-read-reverse)@i(filename)[ ,time-offset: @i(offset)] [, srate: @i(sr)] [, dur: @i(dur)] [, nchans: @i(chans)] [, format: @i(format)] [, mode: @i(mode)] [, bits: @i(n)] [, swap: @i(flag)])}@\This function is identical to @code(s-read) (see @ref(s-read-sec)), except it reads the indicated samples in reverse. Like
+@code(s-reverse) (see above), it uses XLISP in the inner loop, so it is slow.
+Unlike @code(s-reverse), @code(s-read-reverse) uses a fixed amount of
+memory that is independent of how many samples are computed. Multiple channels
+are handled.
+@end(fndefs)
+
+@section(Time Delay Functions)
+The @code(time-delay-fns.lsp) library implements chorus, phaser, and flange effects.
+
+@begin(fndefs)
+@codef[phaser(@pragma(defn)@index(phaser)@index(effects, phaser)@i(snd))]@\A phaser effect
+applied to @i(snd) (a @code(SOUND)). There are no parameters,
+but feel free to modify the source code of this one-liner.
+
+@codef[flange(@pragma(defn)@index(flange)@index(flange effect)@index(effect, flange)@i(snd))]@\A flange effect
+applied to @i(snd). To vary the rate and other parameters, see the source code.
+
+@codef[stereo-chorus(@index(chorus)@pragma(defn)@index(stereo-chorus)@i(snd))]@\A chorus effect applied to @i(snd),
+a @code(SOUND) (monophonic). The output is a stereo sound. All parameters are built-in,
+but see the simple source code to make modifications.
+
+@codef[chorus(@pragma(defn)@index(chorus)@index(effect, chorus)@i(snd), @i(maxdepth), @i(depth), @i(rate),
+@i(saturation))]@\A chorus effect applied to @i(snd). All parameters may be arrays
+as usual. The @i(maxdepth) is a @code(FLONUM) giving twice the maximum value of @i(depth),
+which may be a @code(FLONUM) or a @code(SOUND). The chorus is implemented as a variable delay
+modulated by a sinusoid running at @i(rate) Hz (a @code(FLONUM)). The sinusoid is
+scaled by @i(depth) and offset by @i(maxdepth)/2. The delayed signal is mixed
+with the original, and @i(saturation) gives the fraction of the delayed signal
+(from 0 to 1) in the mix. A reasonable choice of parameter values is
+@i(maxdepth) = 0.05, @i(depth) = 0.025, @i(rate) = 0.5, and @i(saturation) = 0.5.
+@end(fndefs)
+
+@section(Multiple Band Effects)
+@index(multiple band effects)@index(bandfx.lsp)
+The @code(bandfx.lsp) library implements several effects based on multiple
+frequency bands. The idea is to separate a signal into different frequency
+bands, apply a slightly different effect to each band, and sum the effected
+bands back together to form the result. This file includes its own set of
+examples. After loading the file, try @code[f2()], @code[f3()], @code[f4()],
+and @code[f5()] to hear them.
+
+There is much room for expansion and experimentation with this library. Other
+effects might include distortion in certain bands (for example, there are
+commercial effects that add distortion to low frequencies to enhance the sound
+of the bass), separating bands into different channels for stereo or multi-channel
+effects, adding frequency-dependent reverb, and performing dynamic compression,
+limiting, or noise gate functions on each band. There are also opportunities for
+cross-synthesis: using the content of bands extracted from one signal to modify
+the bands of another. The simplest of these would be to apply amplitude envelopes
+of one sound to another. Please contact us (dannenberg@@cs.cmu.edu) if you
+are interested in working on this library.
+
+@begin(fndefs)
+@codef[apply-banded-delay( @index(banded delay)@pragma(defn)@index(apply-banded-delay)@i(s), @i(lowp), @i(highp), @i(num-bands), @i(lowd), @i(highd), @i(fb), @i(wet))]@\Separates
+input @code(SOUND) @i(s) into @code(FIXNUM) @i(num-bands) bands from a low frequency
+of @i(lowp) to a high frequency of @i(highp) (these are @code(FLONUMS) that specify
+steps, not Hz), and applies a delay to each band. The delay for the lowest band is
+given by the @code(FLONUM) @i(lowd) (in seconds) and the delay for the highest band
+is given by the @code(FLONUM) @i(highd). The delays for other bands are linearly
+interpolated between these values. Each delay has feedback gain controlled by
+@code(FLONUM) @i(fb). The delayed bands are scaled by @code(FLONUM) @i(wet), and
+the original sound is scaled by 1 - @i(wet). All are summed to form the result,
+a @code(SOUND).
+
+@codef[apply-banded-bass-boost(@index(banded bass boost)@pragma(defn)@index(apply-banded-bass-boost)@i(s), @i(lowp), @i(highp), @i(num-bands), @i(num-boost), @i(gain))]@\Applies a boost to
+low frequencies. Separates
+input @code(SOUND) @i(s) into @code(FIXNUM) @i(num-bands) bands from a low frequency
+of @i(lowp) to a high frequency of @i(highp) (these are @code(FLONUMS) that specify
+steps, not Hz), and scales the lowest @i(num-boost) (a @code(FIXNUM)) bands by @i(gain),
+a @code(FLONUM). The bands are summed to form the result, a @code(SOUND).
+
+@codef[apply-banded-treble-boost(@index(banded treble boost)@pragma(defn)@index(apply-banded-treble-boost)@i(s), @i(lowp), @i(highp), @i(num-bands), @i(num-boost), @i(gain))]@\Applies a boost to
+high frequencies. Separates
+input @code(SOUND) @i(s) into @code(FIXNUM) @i(num-bands) bands from a low frequency
+of @i(lowp) to a high frequency of @i(highp) (these are @code(FLONUMS) that specify
+steps, not Hz), and scales the highest @i(num-boost) (a @code(FIXNUM)) bands by @i(gain),
+a @code(FLONUM). The bands are summed to form the result, a @code(SOUND).
+@end(fndefs)
+
+@section(Granular Synthesis)
+Some granular synthesis functions are implemented in the @code(gran.lsp) library
+file. There are many variations and control schemes one could adopt for granular
+synthesis, so it is impossible to create a single universal granular synthesis
+function. One of the advantages of Nyquist is the integration of control and
+synthesis functions, and users are encouraged to build their own granular synthesis
+functions incorporating their own control schemes. The @code(gran.lsp) file
+includes many comments and is intended to be a useful starting point. Another
+possibility is to construct a score with an event for each grain. Estimate a
+few hundred bytes per score event (obviously, size depends on the number of
+parameters) and avoid using all of your computer's memory.
+
+@begin(fndefs)
+@codef{sf-granulate(@index(granular synthesis)@pragma(defn)@index(sf-granulate)@i(filename), @i(grain-dur), @i(grain-dev), @i(ioi), @i(ioi-dev), @i(pitch-dev),
+[@i(file-start)] [, @i(file-end)])}@\Granular synthesis using a sound file
+named @i(filename) as the source for grains. Grains are extracted from
+a sound file named by @i(filename) by stepping through the file in equal
+increments. Each grain duration is the
+sum of @i(grain-dur) and a random number from 0 to @i(grain-dev). Grains are
+then multiplied by a raised cosine smoothing window and resampled at a ratio
+between 1.0 and @i(pitch-dev). If @i(pitch-dev) is greater than one, grains are
+stretched and the pitch (if any) goes down. If @i(pitch-dev) is less than one,
+grains are shortened and the pitch goes up. Grains are then output
+with an
+inter-onset interval between successive grains (which may overlap)
+determined by the sum of
+@i(ioi) and a random number from 0 to @i(ioi-dev).
+The duration of the resulting sound is determined by
+the stretch factor (not by the sound file). The number of grains is
+the total sound duration (determined by the stretch factor)
+divided by the mean inter-onset interval,
+which is @i(ioi) + @i(ioi-dev) * 0.5.
+The grains are taken from equally-spaced starting points in @i(filename),
+and depending on grain size and number, the grains may or may not overlap.
+The output duration will simply be the sum of the inter-onset intervals
+and the duration of the last grain. If @i(ioi-dev) is non-zero, the
+output duration will vary, but the expected value of the duration is
+the stretch factor.
+To achieve a rich granular synthesis effect, it is often a good idea to
+sum four or more copies of @code(sf-granulate) together. (See the @code(gran-test)
+function in @code(gran.lsp).)
+@end(fndefs)
+
+@section(MIDI Utilities)
+The @code(midishow.lsp) library has functions that can print the contents fo MIDI
+files. This intended as a debugging aid.
+
+@begin(fndefs)
+@codef[midi-show-file(@pragma(defn)@index(midi-show-file)@index(print midi file)@index(show midi file)@i(file-name))]@\Print the contents of a MIDI file to the console.
+
+@codef{midi-show(@pragma(defn)@index(midi-show)@i(the-seq)[ ,@i(out-file)])}@\Print the
+contents of the sequence @i(the-seq) to the file @i(out-file) (whose default value
+is the console.)
+@end(fndefs)
+
+@section(Reverberation)
+The @code(reverb.lsp) library implements artificial reverberation.
+
+@begin(fndefs)
+@codef[reverb(@pragma(defn)@index(reverb)@index(effect, reverberation)@i(snd),
+@i(time))]@\Artificial reverberation applied to @i(snd) with a decay time of
+@i(time).
+@end(fndefs)
+
+@section(DTMF Encoding)
+@index(dtmf)@index(touch tone)
+The @code(dtmf.lsp) library implements DTMF encoding. DTMF is the
+``touch tone'' code used by telephones.
+
+@begin(fndefs)
+@codef[dtmf-tone(@pragma(defn)@index(dtmf-tone)@i(key), @i(len), @i(space))]@\Generate a
+single DTMF tone. The @i(key) parameter is either a digit (a @code(FIXNUM)
+from 0 through 9) or the atom @code(STAR) or @code(POUND). The duration of
+the done is given by @i(len) (a @code(FLONUM)) and the tone is followed by
+silence of duration @i(space) (a @code(FLONUM)).
+
+@codef[speed-dial(@pragma(defn)@index(speed-dial)@i(thelist))]@\Generates a sequence
+of DTMF tones using the keys in @i(thelist) (a @code(LIST) of keys as
+described above under @code(dtmf-tone)). The duration of each tone is 0.2
+seconds, and the space between tones is 0.1 second. Use @code(stretch) to
+change the ``dialing'' speed.
+@end(fndefs)
+
+@section[Dolby Surround(R), Stereo and Spatialization Effects]
+@index(spatialization)@index(stereo)@index(pan)@index(Dolby Surround)
+
+The @code(spatial.lsp) library implements various functions for stereo
+manipulation and spatialization. It also includes some functions for
+Dolby Pro-Logic panning, which encodes left, right, center, and surround
+channels into stereo. The stereo signal can then be played through
+a Dolby decoder to drive a surround speaker array. This library has
+a somewhat simplified encoder, so you should certainly test the
+output. Consider using a high-end encoder for critical work. There
+are a number of functions in @code(spatial.lsp) for testing. See the
+source code for comments about these.
+
+@begin(fndefs)
+@codef[stereoize(@pragma(defn)@index(stereoize)@index(mono to stereo)@index(effect, stereo)@i(snd))]@\Convert a mono sound, @i(snd), to stereo. Four bands of
+equalization and some delay are used to create a stereo effect.
+
+@codef[widen(@pragma(defn)@index(widen)@index(effect, widen)@i(snd), @i(amt))]@\Artificially
+widen the stereo field in @i(snd), a two-channel sound. The amount of widening
+is @i(amt), which varies from 0 (@i(snd) is unchanged) to 1 (maximum widening).
+The @i(amt) can be a @code(SOUND) or a number.
+
+@codef[span(@index(stereo pan)@index(pan, stereo)@index(effect, stereo pan)@pragma(defn)@index(span)@i(snd), @i(amt))]@\Pan the virtual center channel of a stereo sound, @i(snd),
+by @i(amt), where 0 pans all the way to the left, while 1 pans all the way
+to the right. The @i(amt) can be a @code(SOUND) or a number.
+
+@codef[swapchannels(@pragma(defn)@index(swapchannels)@index(swap channels)@index(effect, swap channels)@i(snd))]@\Swap left and right channels in @i(snd), a stereo sound.
+
+@codef[prologic(@pragma(defn)@index(prologic)@index(Dolby Pro-Logic)@index(Surround Sound)@i(l), @i(c),
+@i(r), @i(s))]@\Encode four monaural @code(SOUND)s representing the front-left,
+front-center, front-right, and rear channels, respectively.
+The return value is a stereo sound, which is a Dolby-encoded mix of the
+four input sounds.
+
+@codef[pl-left(@pragma(defn)@index(pl-left)@i(snd))]@\Produce a Dolby-encoded (stereo)
+signal with @i(snd), a @code(SOUND), encoded as the front left channel.
+
+@codef[pl-center(@pragma(defn)@index(pl-center)@i(snd))]@\Produce a Dolby-encoded (stereo)
+signal with @i(snd), a @code(SOUND), encoded as the front center channel.
+
+@codef[pl-right(@pragma(defn)@index(pl-right)@i(snd))]@\Produce a Dolby-encoded (stereo)
+signal with @i(snd), a @code(SOUND), encoded as the front right channel.
+
+@codef[pl-rear(@pragma(defn)@index(pl-rear)@i(snd))]@\Produce a Dolby-encoded (stereo)
+signal with @i(snd), a @code(SOUND), encoded as the rear, or surround, channel.
+
+@codef[pl-pan2d(@pragma(defn)@index(pl-pan2d)@i(snd), @i(x), @i(y))]@\Comparable to Nyquist's
+existing pan function, @code(pl-pan2d) provides not only left-to-right
+panning, but front-to-back panning as well. The function
+accepts three parameters: @i(snd) is the (monophonic) input @code(SOUND),
+@i(x) is a left-to-right position, and @i(y) is a front-to-back position.
+Both position parameters may be numbers or @code(SOUND)s. An @i(x) value
+of 0 means left, and 1 means right. Intermediate values map linearly
+between these extremes. Similarly, a @i(y) value of 0 causes the sound
+to play entirely through the front speakers(s), while 1 causes it to play
+entirely through the rear. Intermediate values map linearly.
+Note that, although there are usually two rear speakers in Pro-Logic systems,
+they are both driven by the same signal. Therefore any sound that is
+panned totally to the rear will be played over both rear speakers. For
+example, it is not possible to play a sound exclusively through the
+rear left speaker.
+
+@codef[pl-position(@pragma(defn)@index(pl-position)@i(snd), @i(x), @i(y), @i(config))]@\The
+position function builds upon speaker panning to allow more abstract
+placement of sounds. Like @code(pl-pan2d), it accepts a (monaural) input
+sound as well as left-to-right (@i(x)) and front-to-back (@i(y)) coordinates,
+which may be @code(FLONUM)s or @code(SOUND)s. A fourth parameter @i(config)
+specifies the distance from listeners to the speakers (in meters). Current
+settings assume this to be constant for all speakers, but this assumption
+can be changed easily (see comments in the code for more detail).
+There are several important differences between @code(pl-position) and
+@code(pl-pan2d). First, @code(pl-position) uses a Cartesian coordinate
+system that allows x and y coordinates outside of the
+range (0, 1). This model assumes a listener position of (0,0). Each speaker
+has a predefined position as well. The input sound's position,
+relative to the listener, is given by the vector (@i(x),@i(y)).
+
+@codef[pl-doppler(@pragma(defn)@index(pl-doppler)@index(Doppler effect)@i(snd),
+@i(r))]@\Pitch-shift moving sounds according to the equation: @i(fr) =
+@i(f0)((@i(c)+@i(vr))/@i(c)), where @i(fr) is the output frequency,
+@i(f0) is the emitted (source)
+frequency, @i(c) is the speed of sound (assumed to be 344.31 m/s), and
+@i(vr) is the speed at which the emitter approaches the receiver. (@i(vr)
+is the first derivative of parameter @i(r), the distance from the listener
+in meters.
+
+@end(fndefs)
+
+@section(Drum Machine)
+
+The drum machine software in @code(demos/plight) deserves further explanation.
+to use the software, load the code by evaluating:
+@begin(example)
+load "../demos/plight/drum.lsp"
+exec load-props-file(strcat(*plight-drum-path*,
+ "beats.props"))
+exec create-drum-patches()
+exec create-patterns()
+@end(example)
+
+Drum sounds and patterns are specified in the @code(beats.props) file (or
+whatever name you give to @code(load-props-file)). This file
+contains two types of specifications. First, there are sound file specifications.
+Sound files are located by a line of the form:
+@begin(example)
+set sound-directory = "kit/"
+@end(example)
+This gives the name of the sound file directory, relative to the
+ @code(beats.props) file. Then, for each sound file, there should be a line of
+the form:
+@begin(example)
+track.2.5 = big-tom-5.wav
+@end(example)
+This says that on track 2, a velocity value of 5 means to play the sound file
+ @code(big-tom-5.wav). (Tracks and velocity values are described below.)
+The @code(beats.props) file contains specifications for all the sound files
+in @code(demos/plight/kit) using 8 tracks. If you make your own specifications
+file, tracks should be numbered consecutively from 1, and velocities should be
+in the range of 1 to 9.
+
+The second set of specifications is of beat patterns. A beat pattern is given
+by a line in the following form:
+@begin(example)
+beats.5 = 2--32--43-4-5---
+@end(example)
+The number after @code(beats) is just a pattern number. Each pattern
+is given a unique number. After the equal sign, the digits and dashes are
+velocity values where a dash means ``no sound.'' Beat patterns should be
+numbered consecutively from 1.
+
+Once data is loaded, there are several functions to access drum patterns and
+create drum sounds (described below). The @code(demos/plight/drums.lsp) file
+contains an example function @code(plight-drum-example) to play some drums.
+There is also the file @code(demos/plight/beats.props) to serve as an
+example of how to specify sound files and beat patterns.
+
+@begin(fndefs)
+@codef{drum(@pragma(defn)@index(drum)@i(tracknum), @i(patternnum), @i(bpm))}@\Create
+a sound by playing drums sounds associated with track @i(tracknum) (a
+FIXNUM) using pattern @i(patternnum). The tempo is given by @i(bpm) in
+beats per minute. Normally patterns are a sequence of sixteenth notes, so
+the tempo is in @i(sixteenth notes per minute). For example,
+if @i(patternnum) is 10,
+then use the pattern specified for @code(beats.10). If the third character
+of this pattern is 3 and @i(tracknum) is 5, then on the third beat, play
+the soundfile assigned to @code(track.5.3). This function returns a @code(SOUND).
+
+@codef{drum-loop(@pragma(defn)@index(drum-loop)@i(snd), @i(duration), @i(numtimes))}@\Repeat the sound given by @i(snd) @i(numtimes) times. The repetitions occur at a time offset of @i(duration), regardless of the actual duration of @i(snd). A @code(SOUND) is returned.
+
+@codef{length-of-beat(@pragma(defn)@index(length-of-beat)@i(bpm))}@\Given a tempo of
+@i(bpm), return the duration of the beat in seconds. Note that this software
+has no real notion of beat. A ``beat'' is just the duration of each character
+in the beat pattern strings. This function returns a @code(FLONUM).
+@end(fndefs)
+
+
+
+@section(Minimoog-inspired Synthesis)
+@index(Moog)@index(Minimoog)@index(analog synthesizer)
+
+The @code(moog.lsp) library gives the Nyquist user easy access to ``classic''
+synthesizer sounds through an emulation of the Minimoog Synthesizer.
+Unlike modular Moogs that were very large, the Minimoog was the first
+successful and commonly used portable synthesizer. The trademark filter attack
+was unique and easily recognizable. The goal of this Nyquist instrument is not
+only to provide the user with default sounds, but also to give control over
+many of the ``knobs'' found on the Minimoog. In this implementation, these
+parameters are controlled using keywords. The input to the @code(moog)
+instrument is a user-defined sequence of notes, durations, and articulations
+that simulate notes played on a keyboard. These are translated into
+control voltages that drive multiple oscillators, similar to the Voltage
+Controlled Oscillator or VCO found in the original analog Moog.
+
+The basic functionality of the Minimoog has been implemented, including the
+often-used "glide". The glide feature essentially low-pass filters the control
+voltage sequence in order to create sweeps between notes.
+Figure @ref(moog-fig) is a simplified schematic of the data flow in the Moog.
+The control lines have been omitted.
+
+@begin(figure)
+@center(@graphic((height = 2.514 in, width = 4.65 in, magnify = 0.3,
+ postscript = "moog-fig.ps"))
+@html(<img src="moog-fig.gif" width=558><br><br>)
+@fillcaption(System diagram for Minimoog emulator.)
+@tag(moog-fig)
+@end(figure)
+
+The most recognizable feature of the Minimoog is its resonant filter, a
+Four-Pole Ladder Filter invented by Robert Moog. It is simply implemented
+in a circuit with four transistors and provides an outstanding 24 dB/octave
+rolloff. It is modeled here using the built-in Nyquist resonant filter.
+One of the Moog filter features is a constant Q, or center frequency to
+bandwidth ratio. This is implemented and the user can control the Q.
+
+The user can control many parameters using keywords. Their default values,
+acceptable ranges, and descriptions are shown below. The defaults were
+obtained by experimenting with the official Minimoog software synthesizer
+by Arturia.
+
+@subsection(Oscillator Parameters)
+@code(range-osc1) (2)@*
+@code(range-osc2) (1)@*
+@code(range-osc3) (3)@*
+These parameters control the octave of each oscillator. A value of 1
+corresponds to the octave indicated by the input note. A value of 3
+is two octaves above the fundamental. The allowable range is 1 to 7.
+
+@code(detun2) (-.035861)@*
+@code(detun3) (.0768)@*
+Detuning of two oscillators adds depth to the sound. A value of 1 corresponds
+to an increase of a single semitone and a -1 corresponds to a decrease
+in a semitone. The range is -1 to 1.
+
+@code(shape-osc1) (@code(*saw-table*))@*
+@code(shape-osc2) (@code(*saw-table*))@*
+@code(shape-osc3) (@code(*saw-table*))@*
+Oscilators can use any wave shape. The default sawtooth waveform is
+a built-in Nyquist variable. Other waveforms can be defined by the user.
+
+@code(volume-osc1) (1)@*
+@code(volume-osc2) (1)@*
+@code(volume-osc3) (1)@*
+These parameters control the relative volume of each oscillator. The range
+is any @code(FLONUM) greater than or equal to zero.
+
+@subsection(Noise Parameters)
+@code(noiselevel) (.05)@*
+This parameter controls the relative volume of the noise source. The range
+is any @code(FLONUM) greater than or equal to zero.
+
+@subsection(Filter Parameters)
+@code(filter-cutoff) (768)@*
+The cutoff frequency of the filter in given in Hz. The range is zero
+to 20,000 Hz.
+
+
+@code(Q) (2)@*
+Q is the ratio of center frequency to bandwidth. It is held constant by
+making the bandwidth a function of frequency. The range is any
+@code(FLONUM) greater than zero.
+
+@code(contour) (.65)@*
+Contour controls the range of the transient frequency sweep from a high
+to low cutoff frequency when a note is played. The high frequency is
+proportional to contour. A contour of 0 removes this sweep. The range
+is 0 to 1.
+
+@code(filter-attack) (.0001)@*
+Filter attack controls the attack time of the filter, i.e. the time to
+reach the high cutoff frequency. The range is any @code(FLONUM) greater
+than zero (seconds).
+
+@code(filter-decay) (.5)@*
+Filter decay controls the decay time of the filter, i.e. the time of the
+sweep from the high to low cutoff frequency. The range is
+any @code(FLONUM) greater than zero (seconds).
+
+@code(filter-sustain) (.8)@*
+Filter sustain controls the percentage of the filter cutoff frequency that
+the filter settles on following the sweep. The range is 0 to 1.
+
+@subsection(Amplitude Parameters)
+@code(amp-attack) (.01)@*
+This parameter controls the amplitude envelope attack time, i.e. the time to
+reach maximum amplitude. The range is
+any @code(FLONUM) greater than zero (seconds).
+
+@code(amp-decay) (1)@*
+This parameter controls the amplitude envelope decay time, i.e. the time
+between the maximum and sustain volumes. The range is
+any @code(FLONUM) greater than zero (seconds).
+
+@code(amp-sustain) (1)@*
+This parameter controls the amplitude envelope sustain volume, a fraction
+of the maximum. The range is 0 to 1.
+
+@code(amp-release) (0)@*
+This parameter controls the amplitude envelope release time, i.e. the time
+it takes between the sustain volume and 0 once the note ends.
+The duration controls the overall length of the sound. The range of @code(amp-release) is any @code(FLONUM) greater than zero (seconds).
+
+@subsection(Other Parameters)
+@code(glide) (0)@*
+Glide controls the low-pass filter on the control voltages. This models the
+glide knob on a Minimoog. A higher value corresponds to a lower cutoff
+frequency and hence a longer "glide" between notes. A value of 0
+corresponds to no glide. The range is zero to 10.
+
+@subsection(Input Format)
+A single note or a series of notes can be input to the Moog instrument
+by defining a list with the following format:
+@begin(display)
+(list (list @i(frequency duration articulation)) ... )
+@end(display)
+where @i(frequency) is a @code(FLONUM) in steps, @i(duration) is the duration
+of each note in seconds (regardless of the release time of the amplifier),
+and @i(articulation) is a percentage of the duration that a sound will be
+played, representing the amount of time that a key is pressed. The filter
+and amplitude envelopes are only triggered if a note is played when
+the articulation of the previous note is less than 1, or a key is not down at
+the same time. This Moog instrument is a monophonic instrument, so only
+one note can sound at a time. The release section of the amplifier is
+triggered when the articulation is less than 1 at the time
+(@i(duration) * @i(articulation)).
+
+@subsection(Sample Code/Sounds)
+
+@b[Sound 1 (default parameters):]
+@begin(display)
+@begin(code)
+set s = {{24 .5 .99} {26 .5 .99} {28 .5 .99}
+ {29 .5 .99} {31 2 1}}
+play moog(s)
+@end(code)
+@end(display)
+
+@b[Sound 2 (articulation, with amplitude release):]
+@begin(display)
+@begin(code)
+set s = {{24 .5 .5} {26 .5 1} {28 .5 .25} {29 .5 1} {31 1 .8}}
+play moog(s, amp-release: .2)
+@end(code)
+@end(display)
+
+@b[Sound 3 (glide):]
+@begin(display)
+@begin(code)
+set s = {{24 .5 .5} {38 .5 1} {40 .5 .25}
+ {53 .5 1} {55 2 1} {31 2 .8} {36 2 .8}}
+play moog(s, amp-release: .2, glide: .5)
+@end(code)
+@end(display)
+
+@b[Sound 4 (keyword parameters):] Filter attack and decay are purposely
+longer than notes being played with articulation equal to 1.
+@begin(display)
+@begin(code)
+set s = {{20 .5 1} {27 .5 1} {26 .5 1} {21 .5 1}
+ {20 .5 1} {27 .5 1} {26 .5 1} {21 .5 1}}
+play moog(s, shape-osc1: *tri-table*, shape-osc2: *tri-table*,
+ filter-attack: 2, filter-decay: 2,
+ filter-cutoff: 300, contour: .8, glide: .2, Q: 8)
+@end(code)
+@end(display)
+
+@b[Sound 5:] This example illustrates the ability to completely define a new
+synthesizer with different parameters creating a drastically different
+sound. Sine waves are used for wavetables. There is a high value for glide.
+@begin(display)
+@begin(code)
+define function my-moog(freq)
+ return moog(freq,
+ range-osc1: 3, range-osc2: 2, range-osc3: 4,
+ detun2: -.043155, detun3: .015016,
+ noiselevel: 0,
+ filter-cutoff: 400, Q: .1, contour: .0000001,
+ filter-attack: 0, filter-decay: .01, filter-sustain: 1,
+ shape-osc1: *sine-table*, shape-osc2: *sine-table*,
+ shape-osc3: *sine-table*, volume-osc1: 1, volume-osc2: 1,
+ volume-osc3: .1, amp-attack: .1, amp-decay: 0,
+ amp-sustain: 1, amp-release: .3, glide: 2)
+
+set s = {{80 .4 .75} {28 .2 1} {70 .5 1} {38 1 .5}}
+play my-moog(s)
+@end(code)
+@end(display)
+
+@b[Sound 6:] This example has another variation on the default
+ parameters.
+@begin(display)
+@begin(code)
+set s = {{24 .5 .99} {26 .5 .99} {28 .5 .99}
+ {29 .5 .99} {31 2 1}}
+play moog(s, shape-osc1: *tri-table*, shape-osc2: *tri-table*,
+ filter-attack: .5, contour: .5)
+@end(code)
+@end(display)
+
+@pragma(doinclude)
+@include(nymanimpl.mss)
+
+@appendix(Open Sound Control and Nyquist)@index(Open Sound Control)
+@label(osc-app)
+Open Sound Control (OSC) is a simple protocol for communicating music control parameters between software applications and across networks. For more information, see
+@html[<a href="http://wwww.cnmat.berkeley.edu/OpenSoundControl">]@code(http://www.cnmat.berkeley.edu/OpenSoundControl/)@html[</a>]. The Nyquist implementation of Open Sound Control is simple: an array of floats can be set by OSC messages and read by Nyquist functions. That is about all there is to it.
+
+Note: Open Sound Control must be enabled by calling @code[osc-enable(t)]. If this fails under Windows, see the installation instructions regarding @code(SystemRoot).
+
+To control something in (near) real-time, you need to access a slider value as if it a signal, or more properly, a Nyquist @code(SOUND) type. The function @code(snd-slider), described in Section @ref(snd-slider-sec), takes a slider number and returns a @code(SOUND) type representing the current value of the slider. To fully understand this function, you need to know something about how Nyquist is actually computing sounds.
+
+Sounds are normally computed on demand. So the result returned by @code(snd-slider) does not immediately compute any samples. Samples are only computed when something tries to use this signal. At that time, the slider value is read. Normally, if the slider is used to control a sound, you will hear changes in the sound pretty soon after the slider value changes. However, one thing that can interfere with this is that @code(SOUND) samples are computed in blocks of about 1000 samples. When the slider value is read, the same value is used to fill a block of 1000 samples, so even if the sample rate is 44,100 Hz, the effective slider sample rate is 44,100/1000, or 44.1 Hz. If you give the slider a very low sample rate, say 1000, then slider value changes will only be noticed by Nyquist approximately once per second. For this reason, you should normally use the audio sample rate (typically 44,100 Hz) for the rate of the @code(snd-slider) output @code(SOUND). (Yes, this is terribly wasteful to represent each slider value with 1000 samples, but Nyquist was not designed for low-latency computation, and this is an expedient work-around.)
+
+In addition to reading sliders as continually changing @code(SOUND)s, you can get the slider value as a Lisp @code(FLONUM) (a floating point number) using @code(get-slider-value), described in Section @ref(get-slider-value-sec). This might be useful if you are computing a sequence of many notes (or other sound events) and want to apply the current slider value to the whole note or sound event.
+
+Note that if you store the value returned by @code(snd-slider) in a variable, you will capture the history of the slider changes. This will take a lot of memory, so be careful.
+
+Suppose you write a simple expression such as @code[(hzosc (mult 1000 (snd-slider 0 ...)))] to control an oscillator frequency with a slider. How long does this sound last? The duration of @code[hzosc] is the duration of the frequency control, so what is the duration of a slider? To avoid infinitely long signals, you must specify a duration as one of the parameters of @code[snd-slider].
+
+You might be thinking, what if I just want to tell the slider when to stop? At present, you cannot do that, but in the future there should be a function that stops when its input goes to zero. Then, moving a slider to zero could end the signal (and if you multiplied a complex sound by one of these ending functions, everything in the sound would end and be garbage collected).
+
+Another thing you might want to do with interactive control is start some sound. The @code(trigger) function computes an instance of a behavior each time an input @code(SOUND) goes from zero to greater-than-zero. This could be used, for example, to create a sequence of notes.
+
+The @code(snd-slider) function has some parameters that may be unfamiliar. The second parameter, @i(t0), is the starting time of the sound. This should normally be @code[local-to-global(0)], an expression that computes the instantiation time of the current expression. This will often be zero, but if you call @code[snd-slider] from inside a @code(seq) or @code(seq-rep), the starting time may not be zero.
+
+The @i(srate) parameter is the sample rate to return. This should normally be the audio sample rate you are working with, which is typically @code[*default-sound-srate*].
+
+@section(Sending Open Sound Control Messages)
+A variety of programs support OSC. The only OSC message interpreted by Nyquist has an address of @code[/slider], and two parameters: an integer slider number and a float value, nominally from 0.0 to 1.0.
+
+Two small programs are included in the Nyquist distribution for sending OSC messages. (Both can be found in the same directory as the nyquist executable.) The first one, @code[osc-test-client] sends a sequence of messages that just cause slider 0 to ramp slowly up and down. If you run this on a command line, you can use "?" or "h" to get help information. There is an interactive mode that lets you send each OSC message by typing RETURN.
+
+@section(The ser-to-osc Program)
+The second program is @code[ser-to-osc], a program that reads serial input (for example from a PIC-based microcontroller) and sends OSC messages. Run this command-line program from a shell (a terminal window under OS X or Linux; use the CMD program under Windows). You must name the serial input device on the command line, e.g. under OS X, you might run:
+@begin(display)
+@code(./ser-to-osc /dev/tty.usbserial-0000103D)
+@end(display)
+(Note that the program name is preceded by ``@code(./)". This tells the shell exactly where to find the executable program in case the current directory is not on the search path for executable programs.)
+Under Windows, you might run:
+@begin(display)
+@code(ser-to-osc com4)
+@end(display)
+(Note that you do not type ``@code(./)'' in front of a windows program.)
+
+To use @code(ser-to-osc), you will have to find the serial device. On the Macintosh and Linux, try the following:
+@begin(display)
+@code(ls /dev/*usb*)
+@end(display)
+This will list all serial devices with ``usb'' in their names. Probably, one will be a name similar to @code(/dev/tty.usbserial-0000103D). The @code(ser-to-osc) program will echo data that it receives, so you should know if things are working correctly.
+
+Under Windows, open Control Panel from the Start menu, and open the System control panel. Select the Hardware tab and click the Device Manager button. Look in the device list under Ports (COM & LPT). When you plug in your serial or USB device, you should see a new entry appear, e.g. @code(COM4). This is the device name you need.
+
+The format for the serial input is: any non-whitespace character(s), a slider number, a slider value, and a newline (control-j or ASCII 0x0A). These fields need to be separated by tabs or spaces. An optional carriage return (control-m or ASCII 0x0D) preceding the ASCII 0x0A is ignored. The slider number should be in decimal, and theh slider value is a decimal number from 0 to 255. This is scaled to the range 0.0 to 1.0 (so an input of 255 translates to 1.0).
+
+There is a simple test program in @code[demos/osc-test.lsp] you can run to try out control with Open Sound Control. There are two examples in that file. One uses @code(snd-slider) to control the frequency of an oscillator. The other uses @code(get-slider-value) to control the pitch of grains in a granular synthesis process.
+
+
+@appendix(Intgen)@index(Intgen)
+@label(intgen-app)
+@pragma(doinclude)
+@include(../xlisp/intgen.mss)
+
+@appendix(XLISP: An Object-oriented Lisp)
+@label(xlisp-app)
+@begin(center)
+
+@b(Version 2.0)
+
+February 6, 1988
+
+by
+@b(David Michael Betz)
+127 Taylor Road
+Peterborough, NH 03458
+
+Copyright (c) 1988, by David Michael Betz
+All Rights Reserved
+Permission is granted for unrestricted non-commercial use
+@end(center)
+@newpage
+@pragma(doinclude)
+@include(../xlisp/xlisp.mss)
diff --git a/docsrc/nyquist/nyquistman.mss b/docsrc/nyquist/nyquistman.mss
new file mode 100644
index 0000000..566f081
--- /dev/null
+++ b/docsrc/nyquist/nyquistman.mss
@@ -0,0 +1,8763 @@
+@device(mac52postscript)
+@make(manual)
+@libraryfile(mathematics10)
+@libraryfile(picture)
+@libraryfile(multilevelindex)
+@style(font timesroman)
+@style(fontscale 11)
+@commandstring(dash @Y[M])
+@commandstring(subtract @Y[N])
+@commandstring(itemsep @Y[M])
+@Modify(indexenv, above=2 lines, leftmargin 8, columns=3, boxed)
+@define(prg=i)
+@define(detail=text, size 9, spacing 1.2, indent 0)
+@define(code, FaceCode T, size 11)
+@comment{codef is used to define a lisp function or variable --
+ a processor uses this to extract completion hint info for NyquistIDE.}
+@define(codef, FaceCode T, size 11)
+@comment{pragma(define) is used to mark a term's point of definition --
+ I tried to define(defn=index), but that didn't work in Scribe,
+ so the approach now is to mark definitions. In s2h, the
+ define pragma sets a flag that the NEXT index term is a definition.
+ The s2h.lsp processor uses this to map terms defined within codef
+ (which go into the completion list) to URLs for the help system.}
+@define(smallcode, FaceCode T, size 8, spacing 0.8) @comment(was 10)
+@define(rbdisplay = display, group)
+@define(fndefs = description, leftmargin 0.5in, indent -0.5in)
+@define(fdescription = text, leftmargin +0.5in, indent -0.5in, spread 1)
+@define(pdescription = text, leftmargin +0.5in, indent -0.5in, spread 0)
+@define(fgroup = text, indent -0.5in, spread 0)
+@define(altdef = text, leftmargin +0.0in, indent -0.5in)
+@textform(html = [])
+@textform(htmltitle = [])
+@textform(pragma = [])
+@use(bibliography = "../bib/music.bib")
+@style(references ClosedAlphabetic)
+@counter(dummy-counter)
+@modify(FigureCounter,Within=dummy-counter,
+ Numbered <@@b[Figure@@ @1:@@ @@ ]@@$>,
+ Referenced "@1",Init 0)
+@modify(TableCounter,Within=dummy-counter,
+ Numbered <@@b[Table@@ @1:@@ @@ ]@@$>,
+ Referenced "@1",Init 0)
+@pageheading(left "", center "@value(page)", right "")
+@include(../template/filcap.mss)
+
+@begin(comment)
+@begin(figure)
+@blankspace(0.3 inches) @comment(scribe doesn't leave enough space)
+@center(@graphic((height = *** in, width = *** in, magnify = ***,
+ postscript = "***.ps"))
+@fillcaption(***)
+@tag(***)
+@end(figure)
+@end(comment)
+
+@html(<head><title>Nyquist Reference Manual</title></head><body>)
+@htmltitle(Nyquist Reference Manual)
+@begin(titlepage)
+@begin(titlebox)
+@blankspace(0.5 inch)
+@majorheading(Nyquist Reference Manual)
+@b(Version 3.05)
+@blankspace(0.3 inch)
+@b(Copyright 2011 by Roger B. Dannenberg)
+@value(date)
+@end(titlebox)
+@pragma(startscribe)
+@center(Carnegie Mellon University)
+@center(School of Computer Science)
+@center(Pittsburgh, PA 15213, U.S.A.)
+@pragma(endscribe)
+@html(<blockquote>Carnegie Mellon University<br>
+School of Computer Science<br>
+Pittsburgh, PA 15213, U.S.A.</blockquote>)
+@blankspace(1 inch)
+@end(titlepage)
+@pragma(startscribe)
+.
+@pragma(endscribe)
+@newpage
+@pageheading(even, left "Page @Value(Page)", right "@c(Nyquist Manual)")
+@pageheading(odd, left "@c[@title(chapter)]", right "Page @Value(page)")
+@style(pagenumbers="@i")
+@set(page=3)
+@Unnumbered(Preface)
+This manual is a guide for users of Nyquist, a language for composition and
+sound synthesis. Nyquist grew out of a series of research projects, notably
+the languages Arctic and Canon. Along with Nyquist, these languages promote a
+functional style of programming and incorporate time into the language
+semantics.
+
+Please help by noting any errors@Index(errors), omissions@Index(omissions),
+or suggestions@Index(suggestions) you may have. You can send your
+suggestions to Dannenberg@@CS.CMU.EDU (internet) via computer mail, or by
+campus mail to Roger B. Dannenberg, School of Computer Science, or by
+ordinary mail to Roger B. Dannenberg, School of Computer Science, Carnegie
+Mellon University, 5000 Forbes Ave., Pittsburgh, PA 15213-3890, USA.
+
+Nyquist is a successor to Fugue, a language originally implemented by Chris
+Fraley, and extended by George Polly and Roger Dannenberg. Peter Velikonja
+and Dean Rubine were early users, and they proved the value as well as
+discovered some early problems of the system. This led to Nyquist, a
+reimplementation of Fugue by Roger Dannenberg with help from Joe Newcomer
+and Cliff Mercer. Ning Hu ported Zheng (Geoffrey) Hua and Jim Beauchamp's
+piano synthesizer to Nyquist and also built NyqIDE, the Nyquist Integrated
+Development Environment for Windows. Dave Mowatt contributed the original
+version of NyquistIDE, the cross-platform interactive development environment.
+Dominic Mazzoni made a special version of Nyquist that runs
+within the Audacity audio editor, giving Nyquist a new interface and
+introducing Nyquist to many new users.
+
+Many others have since contributed to Nyquist.
+Chris Tchou and Morgan Green worked on the Windows port. Eli Brandt contributed
+a number of filters and other synthesis functions. Pedro J. Morales,
+Eduardo Reck Miranda, Ann Lewis, and Erich Neuwirth have all contributed
+nyquist examples found in the demos folder of the Nyquist distribution.
+Philip Yam ported some
+synthesis functions from Perry Cook and Gary Scavone's STK to Nyquist.
+Pedro Morales ported many more STK instruments to Nyquist.
+Dave Borel wrote the Dolby Pro-Logic encoding library and Adam Hartman wrote
+stereo and spatialization effects. Stephen Mangiat wrote the MiniMoog
+emulator. Phil Light recorded the drum samples and wrote drum
+machine software. The Xmusic library, particularly the pattern specification,
+was inspired by Rick Taube's Common Music. The functions for generating
+probability distributions were implemented by Andreas Pfenning.
+
+Starting with Version 3, Nyquist supports a version of SAL, providing
+an alternative to Lisp syntax. SAL was designed by Rick Taube, and the
+SAL implementation in Nyquist is based on Taube's original implementation
+as part of his Common Music system.
+
+The current NyquistIDE includes contributions from many. Chris Yealy and
+Derek D'Souza implemented early versions of the envelope editor. Daren
+Makuck and Michael Rivera wrote the original equalizer editor.
+Priyanka Raghavan implemented the sound browser. Dmitry Portnoy wrote the
+original "UPIC" editor.
+
+
+Many others have made contributions, offered suggestions, and found bugs.
+If you were expecting to find your name here, I apologize for the omission,
+and please let me know.
+
+I also wish to acknowledge support from CMU, Yamaha, and IBM for this work.
+@newpage
+@blankspace(5 inches)
+@pragma(startscribe)
+.
+@pragma(endscribe)
+@newpage
+@set(page=1)
+@style(pagenumbers="@1")
+
+@chapter(Introduction and Overview)
+
+Nyquist is a language for sound synthesis and music composition. Unlike score
+languages that tend to deal only with events, or signal processing languages
+that tend to deal only with signals and synthesis, Nyquist handles both in a
+single integrated system. Nyquist is also flexible and easy to use because it
+is based on an interactive Lisp interpreter.
+
+With Nyquist, you can design instruments by combining functions (much as you
+would using the orchestra languages of Music V, cmusic, or Csound). You can
+call upon these instruments and generate a sound just by typing a simple
+expression. You can combine simple expressions into complex ones to create
+a whole composition.
+
+Nyquist runs under Linux, Apple Mac OS X, Microsoft Windows NT,
+2000, XP, and Vista,
+and it produces sound files or directly generates audio.
+Recent versions have also run on AIX, NeXT, SGI, DEC pmax, and Sun Sparc
+machines. (Makefiles for many of these are included, but out-of-date).
+Let me know if you have problems with
+any of these machines.
+
+To use Nyquist, you should have a basic knowledge of Lisp. An excellent text
+by Touretzky is recommended @cite(Touretzky). Appendix @ref(xlisp-app) is
+the reference manual for XLISP, of which Nyquist is a superset. Starting with
+Version 3, Nyquist supports a variant of SAL, which is also available in
+Common Music. Since there are some differences, one should generally call this
+implementation ``Nyquist SAL;'' however, in this manual, I will just call it
+``SAL.'' SAL offers most of the capabilities of Lisp, but it uses an Algol-like
+syntax that may be more familiar to programmers with experience in Java, C,
+Basic, etc.
+
+@label(install-sec)
+@section(Installation)
+@index(installation)@index(configure nyquist)@index(setup nyquist)
+Nyquist is a C++ program intended to run under various operating systems
+including Unix, Mac OS X, and Windows. Nyquist is based on Lisp, but it
+includes its own Lisp interpreter (a modified version of XLISP), so you
+do not need to install some other Lisp to run Nyquist. Other
+Lisp systems are not compatible with Nyquist.
+
+Most Nyquist users run Nyquist under the Nyquist IDE, which is written in Java
+and depends on the Java runtime system. Most systems already have Java, but if
+you do not, you will need to install it. When you install the Nyquist IDE,
+you will automatically get Nyquist and a set of runtime libraries.
+
+There are generally two ways to install Nyquist:
+@begin(itemize)
+Get a pre-compiled version of the Nyquist IDE for Windows or Mac OS X. The
+Windows version comes packaged in an installer that installs and
+configures the Nyquist IDE. The Mac OS X version
+unpacks to a complete OS X application.
+
+Compile from sources. There is one set of sources for Mac, Windows, and Unix.
+Instructions for building applications from the sources are provided in
+the files @code(sys/win/README.txt), @code(sys/mac/README.txt), and
+@code(sys/unix/README.txt).
+@end(itemize)
+
+You can download source code and precompiled versions from the Nyquist project
+on SourceForge (@code(http://sourceforge.net/projects/nyquist)). The latest
+source code can be obtained via Subversion (svn) using the following:
+@begin(example)
+svn co https://nyquist.svn.sourceforge.net/svnroot/nyquist/trunk nyquist
+@end(example)
+or by checking out nyquist using a graphical interface svn client such as
+TortoiseSVN for Windows.
+
+@begin(comment)
+@subsection(Unix Installation)
+For Unix systems, Nyquist is distributed as a compressed tar file named @code(nyqsrc3@i(nn).zip),
+where @i(nn) is the version number (e.g. v3.01 was
+in @code(nyqsrc301.zip)). To
+install Nyquist, copy @code(nyqsrc3@i(nn).zip) to the
+directory on your machine where you would like to install Nyquist, and type:
+@begin(example)
+gunzip nyqsrc3@i(nn).zip
+cd nyquist
+ln -s sys/unix/linux/Makefile Makefile
+setenv XLISPPATH `pwd`/runtime:`pwd`/lib
+make
+@end(example)
+The first line creates a @code(nyquist) directory and some subdirectories. The
+second line (cd) changes directories to the new nyquist directory. The third line makes a link from the top-level directory to the Makefile for your
+system. In place of @code(linux) in @code(sys/unix/linux/Makefile), you should
+substitute your system type. Current systems are @code(next), @code(pmax),
+@code(rs6k), @code(sgi), @code(linux), and @code(sparc). The @code(setenv)
+command tells Nyquist where to search for lisp files to be loaded when a file
+is not found in the current directory. The @code(runtime) directory should
+always be on your @code(XLISPPATH) when you run Nyquist, so you may want to
+set @code(XLISPPATH) in your shell startup file, e.g. @code(.cshrc).
+Assuming the make completes successfully, you can run Nyquist as follows:
+@begin(example)
+./ny
+@end(example)
+When you get the prompt, you may begin typing expressions such as
+the ones in the following ``Examples'' section.
+
+One you establish that Nyquist (ny) is working from the command line, you should
+try using NyquistIDE, the Java-based Nyquist development environment. First,
+make @code(jny) executable (do this only once when you install Nyquist):
+@begin(example)
+chmod +x jny
+@end(example)
+Then try running NyquistIDE by typing:
+@begin(example)
+./jny
+@end(example)
+If the NyquistIDE window does not appear, make sure you have Java installed (if not,
+you probably already encountered errors when you ran @code(make)). You can also try recompiling the Java files:
+@begin(example)
+cd jnyqide
+javac *.java
+cd ..
+@end(example)
+
+@p(Note:) With Linux and the Macintosh OS X,
+ NyquistIDE defines the environment passed to Nyquist. If you
+set @code(XLISPPATH)@index(XLISPPATH)@index(search path) as shown above, it
+will be passed along to Nyquist under NyquistIDE. If not,
+a default XLISPPATH will have the @code(lib) and @code(runtime) directories only.
+This does not apply to Windows because even though the environment is there,
+the Windows version of Nyquist reads the @code(XLISPPATH) from the Registry.
+
+You can also specify the search path by creating the
+file @code(nyquist/xlisppath), which should have colon-separated paths
+on a single line of text. This file will override the environment
+variable @code(XLISPPATH).
+
+It is good to have @code(USER) in the environment with your user ID. This string
+is used to construct some file names. NyquistIDE will look for it in the environment.
+You can also specify your user ID using the file @code(nyquist/user), but
+if you have a shared installation of Nyquist, this will not be very useful.
+
+@p(Note:) Nyquist looks for the file @code(init.lsp) in the current
+directory. If you look in the @code(init.lsp) in @code(runtime), you
+will notice two things. First, @code(init.lsp) loads @code(nyquist.lsp)
+from the Nyquist directory, and second, @code(init.lsp) loads @code(system.lsp)
+which in turn defines the macro
+@code(play). You may have to modify @code(system.lsp) to invoke
+the right programs on your machine.
+
+@subsection(Win32 Installation)
+The Win32 version of Nyquist is packaged as a compiled (runtime) system in an
+ executable installer. A source version is also available (the same source
+download is for Win32, Mac OS X, and Linux). The source version is
+intended for developers who
+want to recompile Nyquist.
+The contents of the source archive are extracted to the @code(C:\nyquist)
+directory,
+but you can put it anywhere you like. You can then open the workspace file,
+nyquist.sln, using Microsoft
+Visual C++. You can build and run the command line version of Nyquist
+from within Visual C++. There is a batch file, @code(comp-ide.bat), for
+bulding the Nyquist IDE. This requires the Java SDK from Sun Microsystems.
+
+The runtime version contain everything you need to run Nyquist, including the executable,
+examples, and documentation, packaged as an executable installer program.
+After executing the installer, just find Nyquist in your Start menu to run it.
+You may begin typing expressions such as the ones in the following ``Examples'' section.
+
+@p(Optional:)@index(Registry)@index(xlisppath)@index(search path) Nyquist needs to know where to find the standard runtime files. The location of runtime files must be stored in the Registry.
+The installers create a registry entry, but if
+you move Nyquist or deal with different versions, you can edit the Registry manually as follows:
+@begin(itemize)
+Run the Registry editor. Under Windows NT, run @code(C:\WINNT\system32\regedt32.exe). Under Windows95, run @code(C:\WINDOWS\regedit.exe).
+
+Find and highlight the @code(SOFTWARE) key under @code(HKEY_LOCAL_MACHINE).
+
+Choose @code(Add key ...) from the @code(Edit) menu, type @code(CMU), and click the @code(OK) button.
+
+Highlight the new @code(CMU) key.
+
+Choose @code(Add key ...) from the @code(Edit) menu, type @code(Nyquist), and click the @code(OK) button. (Note that @code(CMU) and @code(Nyquist) are case sensitive.)
+
+Highlight the new @code(Nyquist) key.
+
+Choose @code(Add value ...) from the @code(Edit) menu, type @code(XLISPPATH), and click the @code(OK) button. (Under WinXP the menu item is @code(Edit:New:String Value), after which you need to select the new string name that appears in the right panel, select @code(Edit:Rename), and type @code(XLISPPATH).)
+
+In the String Edit box (select the @code(Edit:Modify) menu item in WinXP),
+type a list of paths you want Nyquist to search for lisp files. For example, if you installed Nyquist as @code(C:\nyquist), then type:
+@begin(example)
+C:\nyquist\runtime,C:\nyquist\lib
+@end(example)
+The paths should be separated by a comma or semicolon and no space. The @code(runtime) path is essential, and the @code(lib) path may become essential in a future release. You can also add paths to personal libraries of Lisp and Nyquist code.
+
+Click the @code(OK) button of the string box and exit from the Registry Editor application.
+@end(itemize)
+
+@paragraph(What if Nyquist functions are undefined?)
+If you do not have administrative privileges for your machine, the installer may fail to set up the Registry entry that Nyquist uses to find initialization files. In this case, Nyquist will run a lisp interpreter, but many Nyquist functions will not be defined. If you can log in as administrator, do it and reinstall Nyquist. If you do not have permission, you can still run Nyquist as follows:
+
+Create a file named @code(init.lsp) in the same directory as Nyquist.exe (the default location is @code(C:\Program Files\Nyquist), but you may have installed it in some other location.) Put the following text in @code(init.lsp):
+@begin(example)
+@begin(smallcode)
+(setf *search-path* "C:/Program Files/Nyquist/runtime,C:/Program Files/Nyquist/lib")
+(load "C:/Program Files/Nyquist/runtime/init.lsp")
+@end(smallcode)
+@end(example)
+@p(Note:) in the three places where you see @code(C:/Program Files/Nyquist), insert the full path where Nyquist is actually installed. Use forward slashes (@code(/)) rather than back slashes (@code(\)) to separate directories. For example, if Nyquist is installed at @code(D:\rbd\nyquist), then @code(init.lsp) should contain:
+@begin(example)
+@begin(smallcode)
+(setf *search-path* "D:/rbd/nyquist/runtime,D:/rbd/nyquist/lib")
+(load "d:/rbd/nyquist/runtime/init.lsp")
+@end(smallcode)
+@end(example)
+The variable @code(*search-path*), if defined, is used in place of the registry to determine search paths for files.
+
+@paragraph(SystemRoot)
+@index(SystemRoot)
+(Ignore this paragraph if you are not planning to use Open Sound Control under Windows.)
+If Nyquist prints an error message and quits when you enable Open Sound Control (using @code(osc-enable)), check to see if you have an environment variable @code(SystemRoot), e.g. type @code(set) to a command prompt and look for the value of @code(SystemRoot). The normal value is @code(C:\windows). If the value is something else, you should put the environment entry, for example:
+@begin(example)
+SystemRoot="D:\windows"
+@end(example)
+into a file named @code(systemroot) (no extension). Put this file in your @code(nyquist) directory. When you run @code(NyquistIDE), it will look for this file and pass the contents as an environment variable to Nyquist. The Nyquist process needs this to open a UDP socket, which is needed for Open Sound Control.
+
+@paragraph(The "java is not recognized" Error)
+Sometimes, Nyquist will run directly from the installer, but then it will not start from the Windows Start menu. You can try running the
+ @code(nyquist/jnyqide.bat) program from a Windows shell. If that fails, and you see an error similar to "java is not recognized as in internal or external command error", the problem may be that paths are not set up properly to allow the Windows shell to find java. Right click on ``My Computer'' on the Windows
+desktop and select ``Properties.'' Under the ``Advanced'' tap, press the ``Environment Variables'' button, and look for PATH under ``System Variables.'' Make sure the Java bin directory is on the path. If it is not, you will have to find your installation of Java and add the appropriate directory to the PATH variable, e.g. ``C:\Program Files\Java\jdk1.6.0\bin.''
+
+@subsection(MacOS X Installation)
+The OS X version of Nyquist is very similar to the Linux version, but it
+is developed using Xcode, Apple's programming environment. With a little
+work, you can use the Linux installation instructions to compile Nyquist,
+but it might be simpler to just open the Xcode project that is included
+in the Nyquist sources.
+
+You can also download a pre-compiled version of Nyquist for the Mac.
+Just download @code(nyqosx2xx.tgz) to the desktop and open it to
+extract the folder <tt>nyqosx2xx</tt>. (Again, "2xx" refers to the current
+version number, e.g. v2.31 would be named with "231".) Open the folder
+to find a Mac Application named NyquistIDE and a directory named
+<tt>nyquist/doc</tt>. Documentation is in the <tt>nyquist/doc</tt> directory.
+
+The file @code(NyquistIDE.app/Contents/Resources/Java/ny)
+is the command line executable (if you should need it). To run from the
+command line, you will need to set the XLISPPATH environment variable as
+with Linux. On the topic of the @code(XLISPPATH), note that this variable is
+set by NyquistIDE when running with that application, overriding any other
+value. You can extend the search path by creating the file @code(xlisppath)
+in the same directory as the nyquist executable @code(ny). The
+@code(xlisppath) file should have colon-separated paths
+on a single line of text.
+@end(comment)
+
+@section(Using NyquistIDE)@index(NyquistIDE)@index(IDE)@index(Integrated Development Environment)
+The program named NyquistIDE is an ``integrated development environment'' for Nyquist. When you run NyquistIDE, it starts the Nyquist program and displays all Nyquist output in a window. NyquistIDE helps you by providing a Lisp and SAL editor, hints for command completion and function parameters, some graphical interfaces for editing envelopes and graphical equalizers, and a panel of buttons for common operations. A more complete description of NyquistIDE is in Chapter @ref(jnyqide-chapter).
+
+For now, all you really need to know is that you can enter Nyquist commands by typing into the upper left window. When you type return, the expression you typed is sent to Nyquist, and the results appear in the window below. You can edit files by clicking on the New File or Open File buttons. After editing some text, you can load the text into Nyquist by clicking the Load button. NyquistIDE always saves the file first; then it tells Nyquist to load the file. You will be prompted for a file name the first time you load a new file.
+
+@section(Using SAL)
+SAL mode means that Nyquist reads and evaluates SAL commands rather than Lisp. The SAL mode prompt is "@code(SAL> )" while the Lisp mode prompt is "@code(> )".
+When Nyquist starts it normally enters SAL mode automatically, but certain errors may exit SAL mode. You can reenter SAL mode by typing the Lisp expression @code[(sal)].
+
+In SAL mode, you type commands in the SAL programming language. Nyquist reads the commands, compiles them into Lisp, and evaluates the commands. Commands can be entered manually by typing into the upper left text box in NyquistIDE.
+
+@section(Helpful Hints)
+Under Win95 and Win98, the console sometimes locks up. Activating another window and then reactivating the Nyquist window should unlock the output.
+(We suggest you use JNyqIDE, the interactive development environment rather than a console window.)
+
+You can cut and paste text into Nyquist, but for serious work, you will want to use the Lisp @code(load) command. To save even more time, write a
+function to load your working file, e.g. @code[(defun l () (load "myfile.lsp"))]. Then you can type @code[(l)] to (re)load your file.
+
+Using SAL, you can type
+@begin(example)
+define function l () load "myfile.lsp"
+@end(example)
+and then
+@begin(example)
+exec l()
+@end(example)
+to (re)load the file.
+
+The Emacs editor is free GNU software and will help you balance parentheses if you use Lisp mode. In fact, you can run nyquist (without the IDE) as a subprocess to Emacs. A helful discussion is at //http://www.audacity-forum.de/download/edgar/nyquist/nyquist-doc/examples/emacs/main.html. If you use Emacs, there is also a SAL mode (the file is @code(sal-mode.el)) included with the Common Music distribution, which you can find on the Web at @code(sourceforge.net).
+
+The NyquistIDE also runs Nyquist as a subprocess and has
+built-in Lisp and SAL editors. If your editor does not help you balance parentheses, you may find yourself counting parens and searching for unbalanced
+expressions. If you are confused or desperate and using Lisp syntax,
+try the
+@code(:print t)
+option of the @code(load) function. By looking at the expressions printed,
+you should be able to tell where the last unbalanced expression starts.
+Alternatively, type @code[(file-sexprs)] and type the lisp file name at
+the prompt. This function will read and print
+expressions from the file, reporting an error when an extra paren or end-of-file is reached unexpectedly.
+
+@section(Using Lisp)
+Lisp mode means that Nyquist reads and evaluates Nyquist expressions in
+Lisp syntax. Since Nyquist is build on a Lisp interpreter, this is the
+``native'' or machine language of Nyquist, and certain errors and functions
+may break out of the SAL interpreter, leaving you with a prompt for a Lisp
+expression. Alternatively, you can exit SAL simply by typing @code(exit) to
+get a Lisp prompt (@code(> )). Commands can be entered manually by typing
+ into the upper left text box in NyquistIDE.
+
+@section(Examples)
+We will begin with some simple Nyquist programs. Throughout the manual,
+we will assume SAL mode and give examples in SAL, but it should be
+emphasized that all of these examples can be performed using Lisp
+syntax. See Section @ref(sal-vs-lisp-section) on the relationship between
+SAL and Lisp.
+
+Detailed explanations of the functions used in these examples will be
+presented in later chapters, so at this point, you should just read these
+examples to get a sense of how Nyquist is used and what it can do. The
+details will come later. Most of these examples can be found in the
+file @code(nyquist/demos/examples.sal). Corresponding Lisp syntax
+examples are in the file @code(nyquist/demos/examples.lsp).
+
+Our first example makes and plays a sound:@index(osc)@index(play)
+@begin(example)
+@i(;; Making a sound.)
+play osc(60) ; generate a loud sine wave
+@comment{(play (osc 60)) @i(; generate a loud sine wave)} @end(example)
+This example is about the simplest way to create a sound with Nyquist. The
+@code(osc) function generates a sound using a table-lookup oscillator.
+There are a number of optional parameters, but the default is to compute a
+sinusoid with an amplitude of 1.0. The parameter @code(60) designates a
+pitch of middle C. (Pitch specification will be described in greater detail
+later.) The result of the @code(osc) function is a sound. To hear a sound,
+you must use the @code(play) command, which plays the file through the machine's D/A converters. It also writes a soundfile in case the computation cannot keep up with real time. You can then (re)play the file by typing:
+@begin(example)
+exec r()
+@end(example)
+This @code[(r)] function is a general way to ``replay'' the last thing written by @code(play).
+
+Note: when Nyquist plays a sound, it scales the signal by 2@+(15)-1 and (by default) converts to a 16-bit integer format. A signal like @code[(osc 60)], which ranges from +1 to -1, will play as a full-scale 16-bit audio signal.
+
+@subsection(Waveforms)
+@label(waveform-sec)
+Our next example will be presented in several steps. The goal is to create a
+sound using a
+wavetable consisting of several harmonics as opposed to a simple sinusoid.
+In order to build a table, we will use a function that computes a single
+harmonic and add harmonics to form a wavetable. An oscillator
+will be used to compute the harmonics.
+
+@begin(comment)
+Ordinarily, Nyquist programs are sample-rate independent, and time (in
+seconds) is used rather than sample numbers to indicate regions of signals.
+Since we want a wave-table with a certain integer number of samples, we need
+to do some extra calculations to convert from time to samples. The
+@code(build-harmonic) function (see Figure @ref(build-harmonic-fig))
+produces a signal with @code(n) periods in the course of 2048 samples using
+the @code(snd-sine) function.
+
+@begin(figure)
+@begin(example)
+(defun build-harmonic (n tablesize) (snd-sine 0 n tablesize 1))
+@end(example)
+@fillcaption(@code(build-harmonic) uses a low-level function,
+@code(snd-sine), to construct a harmonic. The function parameters denote:
+``compute a sinusoid starting at time zero, with frequency @i(n), a sample
+rate of @i(tablesize) samples per second and a duration of 1 second.'' This signal
+becomes a periodic waveform to be resampled by a table lookup oscillator, so
+the choice of sample rate and duration is a matter of convenience.
+@tag(build-harmonic-fig)
+@end(figure)
+@end(comment)
+
+The function
+@code(mkwave@index(mkwave)) calls upon
+@code(build-harmonic@index(build-harmonic)) to generate a total of four
+harmonics with amplitudes 0.5, 0.25, 0.125, and 0.0625.
+These are scaled and added (using @code(+@index(sim))) to
+create a waveform which is bound temporarily to @code(*table*).
+
+A complete Nyquist waveform is a list consisting of a sound, a pitch,
+ and @code(T), indicating a periodic waveform. The pitch gives the
+nominal pitch of the sound. (This is implicit in a single cycle wave
+table, but a sampled sound may have many periods of the fundamental.)
+Pitch is expressed in half-steps, where middle C is 60 steps, as in MIDI
+pitch numbers.
+The list of sound, pitch, and @code(T) is formed in the last line of
+@code(mkwave): since @code(build-harmonic) computes signals with a duration
+of one second, the fundamental is 1 Hz, and the @code(hz-to-step) function
+converts to pitch (in units of steps) as required.
+
+@begin(example)@label(build-harmonic-example)
+define function mkwave()
+ begin
+ set *table* = 0.5 * build-harmonic(1.0, 2048) +
+ 0.25 * build-harmonic(2.0, 2048) +
+ 0.125 * build-harmonic(3.0, 2048) +
+ 0.0625 * build-harmonic(4.0, 2048)
+ set *table* = list(*table*, hz-to-step(1.0), #t)
+ end
+@end(example)
+
+Now that we have defined a function, the last step of this example is to
+build the wave. The following code calls
+@code(mkwave) the first time the code is executed (loaded from a file). The second time, the variable @code(*mkwave*) will be true, so @code(mkwave) will not be invoked:
+@begin(example)
+if ! fboundp(quote(*mkwave*)) then
+ begin
+ exec mkwave()
+ set *mkwave* = #t
+ end
+@end(example)
+
+@subsection(Wavetables)@index(wavetables)@index(waveforms)@index(triangle wave)@index(sawtooth wave)
+When Nyquist starts, several waveforms are created and stored in global variables for convenience. They are: @code(*sine-table*), @code(*saw-table*), and @code(*tri-table*), implementing sinusoid, sawtooth, and triangle waves, respectively. The variable @code(*table*) is initialized to @code(*sine-table*), and it is @code(*table*) that forms the default wave table for many Nyquist oscillator behaviors. If you want a proper, band-limited waveform, you should construct it yourself, but if you do not understand this sentence and/or you do not mind a bit of aliasing, give @code(*saw-table*) and @code(*tri-table*) a try.
+
+Note that in Lisp and SAL, global variables often start and end with asterisks (*). These are not special syntax, they just happen to be legal characters for names, and their use is purely a convention.
+
+@subsection(Sequences)@index(Sequences)
+Finally, we define @code(my-note@index(my-note)) to use the waveform, and play several notes
+in a simple score. Note that the function @code(my-note) has only one command
+(a @code(return) command), so it is not necessary to use @code(begin) and
+@code(end). These are only necessary when the function body consists of a
+sequence of statements:
+@begin(example)
+define function my-note(pitch, dur)
+ return osc(pitch, dur, *table*)
+
+play seq(my-note(c4, i), my-note(d4, i), my-note(f4, i),
+ my-note(g4, i), my-note(d4, q))
+
+@end(example)
+Here, @code(my-note) is defined to take pitch and duration as parameters;
+it calls @code(osc) to do the work of generating a waveform, using
+@code(*table*) as a wave table.
+
+The @code(seq) function is used to invoke a sequence of behaviors. Each
+note is started at the time the previous note finishes. The parameters to
+@code(my-note) are predefined in Nyquist: @code(c4) is middle C, @code(i) (for
+eIghth note) is 0.5, and @code(q) (for Quarter note) is 1.0. See Section
+@ref(constants-sec) for a complete description. The result is the sum of
+all the computed sounds.
+
+Sequences can also be constructed using the @code(at) transformation to
+specify time offsets. See
+@code(sequence_example.htm)@index(sequence_example.htm)@index(score, musical)
+@code(demos, sequence) for more examples and explanation.
+
+@subsection(Envelopes)@index(Envelopes)
+The next example will illustrate the use of envelopes. In Nyquist,
+envelopes are just ordinary sounds (although they normally have a low sample
+rate). An envelope@index(envelope) is applied to another sound by
+multiplication using the @code(mult@index(mult)) function. The code shows
+the definition of @code(env-note@index(env-note)), defined in terms of the
+@code(note) function in the previous example. In @code(env-note), a 4-phase
+envelope is generated using the @code(env@index(env)) function, which is
+illustrated in Figure @ref(env-fig).
+
+@begin(figure)
+@center(@graphic((height = 2 in, width = 3.75 in, magnify = 1,
+ postscript = "envfig.ps"))
+@html(<img src="fig1.gif"><br><br>)
+@fillcaption(An envelope generated by the @code(env) function.)
+@tag(env-fig)
+@end(figure)
+
+@begin(Example)
+@i[; env-note produces an enveloped note. The duration
+; defaults to 1.0, but stretch can be used to change
+; the duration.
+; Uses my-note, defined above.
+;]
+define function env-note(p)
+ return my-note(p, 1.0) *
+ env(0.05, 0.1, 0.5, 1.0, 0.5, 0.4)
+
+@i[; try it out:
+;]
+play env-note(c4)
+@end(example)
+While this example shows a smooth envelope multiplied by an audio signal,
+you can also multiply audio signals to achieve
+what is often called @i(ring modulation)@index(ring modulation). See
+the code and description in
+@code(demos/scratch_tutorial.htm)@index(demos, ring modulation) for an
+interesting use of ring modulation to create ``scratch'' sounds.
+
+In the next example, The @i(stretch) operator (@code(~))@index(stretch)
+is used to modify durations:
+@begin(example)
+@i[; now use stretch to play different durations
+;]
+play seq(seq(env-note(c4), env-note(d4)) ~ 0.25,
+ seq(env-note(f4), env-note(g4)) ~ 0.5,
+ env-note(c4))
+@end(example)
+
+In addition to @i(stretch), there are a number of transformations supported
+ by Nyquist,
+and transformations of abstract behaviors is perhaps @i(the) fundamental
+idea behind Nyquist. Chapter @ref(behavioral-abstraction-sec) is devoted to
+explaining this concept, and further elaboration can be found elsewhere
+@cite(icmcfugue).
+
+@subsection(Piece-wise Linear Functions)
+It is often convenient to construct signals in Nyquist using a list of
+(time, value) breakpoints which are linearly interpolated to form a smooth
+signal. Envelopes created by @code(env) are a special case of the more
+general piece-wise linear functions created by @code(pwl). Since @code(pwl)
+is used in some examples later on, we will take a look at @code(pwl)
+now. The @code(pwl) function takes a list of parameters which denote (time,
+value) pairs. There is an implicit initial (time, value) pair of (0, 0),
+and an implicit final value of 0. There should always be an odd number of
+parameters, since the final value (but not the final time) is implicit.
+Here are some examples:
+@begin(Example)
+@i[; symetric rise to 10 (at time 1) and fall back to 0 (at time 2):
+;]
+pwl(1, 10, 2)
+
+@i[; a square pulse of height 10 and duration 5.
+; Note that the first pair (0, 10) overrides the default initial
+; point of (0, 0). Also, there are two points specified at time 5:
+; (5, 10) and (5, 0). (The last 0 is implicit). The conflict is
+; automatically resolved by pushing the (5, 10) breakpoint back to
+; the previous sample, so the actual time will be 5 - 1/sr, where
+; sr is the sample rate.
+;]
+pwl(0, 10, 5, 10, 5)
+
+@i[; a constant function with the value zero over the time interval
+; 0 to 3.5. This is a very degenerate form of pwl. Recall that there
+; is an implicit initial point at (0, 0) and a final implicit value of
+; 0, so this is really specifying two breakpoints: (0, 0) and (3.5, 0):
+;]
+pwl(3.5)
+
+@i[; a linear ramp from 0 to 10 and duration 1.
+; Note the ramp returns to zero at time 1. As with the square pulse
+; above, the breakpoint (1, 10) is pushed back to the previous sample.
+;]
+pwl(1, 10, 1)
+
+@i[; If you really want a linear ramp to reach its final value at the
+; specified time, you need to make a signal that is one sample longer.
+; The RAMP function does this:
+;]
+ramp(10) @i[; ramp from 0 to 10 with duration 1 + one sample period
+;
+; RAMP is based on PWL; it is defined in @p(nyquist.lsp).
+;]
+@end(example)
+
+@section(Predefined Constants)
+@label(constants-sec)
+For convenience and readability, Nyquist pre-defines some constants, mostly
+based on the notation of the Adagio score language, as follows:
+@begin(itemize)
+@b(Dynamics)
+Note: these dynamics values are subject to change.
+@begin(display)
+@t(lppp@index(lppp)) = -12.0 (dB)
+@t(lpp@index(lpp)) = -9.0
+@t(lp@index(lp)) = -6.0
+@t(lmp@index(lmp)) = -3.0
+@t(lmf@index(lmf)) = 3.0
+@t(lf@index(lf)) = 6.0
+@t(lff@index(lff)) = 9.0
+@t(lfff@index(lfff)) = 12.0
+@t(dB0@index(dB0)) = 1.00
+@t(dB1@index(dB1)) = 1.122
+@t(dB10@index(dB10)) = 3.1623
+@end(display)
+
+@b(Durations@index(duration notation))
+@begin(display)
+@t(s@index(s)) = Sixteenth@index(Sixteenth note) = 0.25
+@t(i@index(i)) = eIghth@index(eIghth note) = 0.5
+@t(q@index(q)) = Quarter@index(quarter note) = 1.0
+@t(h@index(h)) = Half@index(half note) = 2.0
+@t(w@index(w)) = Whole@index(whole note) = 4.0
+@t(sd@index(sd), id@index(id), qd@index(qd), hd@index(hd), wd@index(wd)) = dotted durations@index(dotted durations).
+@t(st@index(st), it@index(it), qt@index(qt), ht@index(ht), wt@index(wt)) = triplet@index(triplet durations) durations.
+@end(display)
+
+@b(Pitches@index(pitch notation))
+Pitches are based on an A4 of 440Hz. To achieve a different tuning,
+set @code(*A4-Hertz*) to the desired frequency for A4, and call
+@code[(set-pitch-names)]. This will recompute the names listed below with a
+different tuning. In all cases, the pitch value 69.0 corresponds exactly to
+440Hz, but fractional values are allowed, so for example, if you set
+@code(*A4-Hertz*) to 444 (Hz), then the symbol @code(A4) will be bound to
+69.1567, and @code(C4) (middle C), which is normally 60.0, will be 60.1567.
+@begin(display)
+@t(c0) = 12.0
+@t(cs0, df0) = 13.0
+@t(d0) = 14.0
+@t(ds0, ef0) = 15.0
+@t(e0) = 16.0
+@t(f0) = 17.0
+@t(fs0, gf0) = 18.0
+@t(g0) = 19.0
+@t(gs0, af0) = 20.0
+@t(a0) = 21.0
+@t(as0, bf0) = 22.0
+@t(b0) = 23.0
+@t(c1) ... @t(b1) = 24.0 ... 35.0
+@t(c2) ... @t(b2) = 36.0 ... 47.0
+@t(c3) ... @t(b3) = 48.0 ... 59.0
+@t(c4) ... @t(b4) = 60.0 ... 71.0
+@t(c5) ... @t(b5) = 72.0 ... 83.0
+@t(c6) ... @t(b6) = 84.0 ... 95.0
+@t(c7) ... @t(b7) = 96.0 ... 107.0
+@t(c8) ... @t(b8) = 108.0 ... 119.0
+@end(display)
+
+@b(Miscellaneous)
+@begin(display)
+@codef(ny:all)@pragma(defn)@index(ny:all) = ``all the samples'' (i.e. a big number) = 1000000000
+@end(display)
+@end(itemize)
+
+@section(More Examples)
+More examples can be found in the directory @code(demos), part of the standard
+Nyquist release. The file @code(demos/examples_home.htm) is an index to all the demo descriptions. In this directory, you will find the following and more:
+@begin(itemize)
+How to make arpeggios (@code(demos/arpeggiator.htm) and @code(arp.sal)@index(arpeggiator)
+
+Gong sounds by additive synthesis@index(additive synthesis, gongs)
+(@code(demos/pmorales/b1.lsp) and @code(demos/mateos/gong.lsp)@index(Gong sounds)@index(demos, gong sound)
+
+Risset's spectral analysis of a chord
+(@code(demos/pmorales/b2.lsp))@index(Risset)@index(demos, spectral analysis of a chord)
+
+Bell sounds
+(@code(demos/pmorales/b3.lsp), @code(demos/pmorales/e2.lsp), @code(demos/pmorales/partial.lsp), and @code(demos/mateos/bell.lsp))@index(demos, bell sound)@index(bell sound)
+
+Drum sounds by Risset
+(@code(demos/pmorales/b8.lsp)@index(demos, drum sound)@index(drum sound)
+
+Shepard tones (@code(demos/shepard.lsp) and @code(demos/pmorales/b9.lsp))@index(Shepard tones)@index(endless tones)
+
+Random signals (@code(demos/pmorales/c1.lsp))
+
+Buzz with formant filters
+(@code(demos/pmorales/buzz.lsp)@index(vocal sound)@index(demos, formants)
+
+Computing samples directly in Lisp (using Karplus-Strong and physical modelling
+as examples)
+(@code(demos/pmorales/d1.lsp)@index(demos, sample-by-sample)@index(DSP in Lisp)@index(Lisp DSP)@index(Karplus-Strong synthesis)@index(physical model)@index(flute sound)
+
+FM Synthesis examples, including bell@index(bell sound), wood drum@index(wood drum sound),
+brass sounds@index(brass sound), tuba sound @index(tuba) (@code(demos/mateos/tuba.lsp) and clarinet sounds@index(clarinet sound) (@code(demos/pmorales/e2.lsp)@index(demos, FM synthesis)
+
+Rhythmic patterns (@code(demos/rhythm_tutorial.htm)@index(demos, rhythmic pattern)
+
+Drum Samples and Drum Machine
+(@code(demos/plight/drum.lsp)@index(demos, drum machine)@index(drum
+samples)@index(drum machine). (See Section @ref(drum-machine-sec)).
+@end(itemize)
+
+@chapter(The NyquistIDE Program)
+@label(jnyqide-chapter)
+The NyquistIDE program combines many helpful functions and interfaces to help you get the most out of Nyquist. NyquistIDE is implemented in Java, and you will need the Java runtime system or development system installed on your computer to use NyquistIDE. The best way to learn about NyquistIDE is to just use it. This chapter introduces some of the less obvious features. If you are confused by something and you do not find the information you need here, please contact the author.
+
+@section(NyquistIDE Overview)
+The NyquistIDE runs the command-line version of Nyquist as a subtask, so everything that works in Nyquist should work when using the NyquistIDE and vice-versa. Input to Nyquist is usually entered in the top left window of the NyquistIDE. When you type return, if the expression or statement appears to be complete, the expression you typed is sent to Nyquist. Output from Nyquist appears in a window below. You cannot type into or edit the output window text.
+
+The normal way to use the NyquistIDE is to create or open one or more files. You edit these files and then click the Load button. To load a file, NyquistIDE saves the file, sets the current directory of Nyquist to that of the file, then issues a @code(load) command to Nyquist. In this case and several others, you may notice that NyquistIDE sends expressions to Nyquist automatically for evaluation. You can always see the commands and their results in the output window.
+
+Notice that when you load a selected file window, NyquistIDE uses @code(setdir) to change Nyquist's current directory. This helps to keep the two programs in sync. Normally, you should keep all the files of a project in the same directory and avoid manually changing Nyquist's current directory (i.e. avoid calling @code(setdir) in your code).
+
+Arranging windows in the NyquistIDE can be time-consuming, and depending on the
+operating system, it is possible for a window to get into a position where you
+cannot drag it to a new position. The Window:Tile menu command can be used
+to automatically lay out windows in a rational way. There is a preference
+setting to determine the height of the completion list relative to the height of the output
+window.
+
+@section(The Button Bar)
+@index(button bar)
+There are a number of buttons with frequently-used operations. These are:
+@begin(itemize)
+Info @itemsep @index(info button)Print information about Nyquist memory
+utilization, including
+the number of free cons cells, the number of garbage collections,
+the total number of cons cells, the total amount of sample buffer memory,
+and the amount of memory in free sample buffers.
+
+Break @itemsep @index(break button)Send a break character to XLISP. This
+can be used to enter the debugger (the break loop) while a program is
+running. Resume by typing @code[(co)].
+
+SAL/Lisp @itemsep @index(SAL button)@index(Lisp button)Switch modes.
+The button names the mode (SAL or Lisp) you will switch to, not the
+current mode. For example, if you are in Lisp mode and want to type
+a SAL command, click the SAL button first.
+
+Top @itemsep @index(top button)Enters @code[(top)] into Nyquist.
+If the XLISP prompt is @code(1>) or
+some other integer followed by ``@code(>)'', clicking the Top button
+will exit the debug loop and return to the top-level prompt.
+
+Replay @itemsep @index(replay button)Enters @code[(r)] into Nyquist.
+This command replays the last computed sound.
+
+F2-F12 @itemsep @index(Fn button)Enters @code[(f2)] etc. into Nyquist.
+These commands are not built-in, and allow users to define their own
+custom actions.
+
+Browse @itemsep @index(browse button)Equivalent to the Window:Browse
+menu item. (See Section @ref(browser).)
+
+EQ @itemsep @index(eq button)Equivalent to the Window:EQ menu item.
+(See Section @ref(eq-window-sec).)
+
+EnvEdit @itemsep @index(envedit button)Equivalent to the Window:Envelope Edit
+menu item. (See Section @ref(envelope-editor-sec).)
+
+NewFile @itemsep @index(newfile button)Equivalent to the File:New menu
+item. Opens a new file editing window for creating and
+loading a Lisp or SAL program file.
+
+OpenFile @itemsep @index(openfile button)Equivalent to the File:Open menu
+item. Opens an existing Lisp or SAL program file for editing and loading.
+
+SaveFile @itemsep @index(savefile button)Equivalent to the File:Save menu
+item (found on the editing window's menu bar). Saves the contents
+of an editing window to its associated file.
+
+Load @itemsep @index(load button)Equivalent to the File:Load menu
+item (found on the editing window's menu bar). Performs a Save operation,
+then sends a command to Nyquist that loads the file as a program.
+
+Mark @itemsep @index(mark button)Sends a Control-A to Nyquist. While
+playing a sound, this displays and records the approximate time in the
+audio stream. (See Section @ref(play-sec) for more detail.)
+
+@end(itemize)
+
+@section(Command Completion)
+To help with programming, NyquistIDE maintains a command-completion window.
+As you type the first letters of function names, NyquistIDE lists matching
+functions and their parameters in the Completion List window. If you click
+on an entry in this window, the displayed expression will replace the
+incompletely typed function name. A preference allows you to match initial
+letters or any substring of the complete function name. This is controlled
+by the ``Use full search for code completion'' preference.
+
+In addition, if you right click (or under Mac OS X, hold down the Alt/Option
+key and click) on an entry, NyquistIDE will display documentation for the function.
+Documentation can come from a local copy or from the online copy (determined
+by the ``Use online manual instead of local copy'' preference). Documentation
+can be displayed within the NyquistIDE window or in an external browser (determined
+by the ``Use window in NyquistIDE for help browser'' preference.) Currently, the
+external browser option does not seem to locate documentation properly, but
+this should be fixed in the future.
+
+@section(Browser)
+@label(browser)
+@index(browser, jnyqide)@index(sound browser, jnyqide)
+If you click on the Browse button or use the Window:Browse menu command,
+NyquistIDE will display a browser window that is pre-loaded with a number of
+ Nyquist commands to create sounds. You can adjust parameters, audition
+the sounds, and capture the expression that creates the sound. In many
+cases, the expression checks to see if necessary functions are defined,
+loading files if necessary before playing the sound. If you want to use
+a sound in your own program, you can often simplify things by explicitly
+loading the required file just once at the beginning of your file.
+
+Since Nyquist now supports a mix of Lisp and SAL, you may find yourself in
+the position of having code from the browser in one language while you are
+working in the other. The best way to handle this is to put the code for
+the sound you want into a function defined in a Lisp (@code(.lsp)) or SAL
+(@code(.sal)) file. Load the file (from Lisp, use the @code(sal-load)
+command to load a SAL file), and call the function from the language of
+your choice.
+
+@section(Envelope Editor)
+@label(envelope-editor-sec)
+@index(envelope editor)
+@index(editor for envelopes)
+@index(graphical envelope editor)
+The envelope editor allows you graphically to design and edit piece-wise
+linear and exponential envelopes. The editor maintains a list of envelopes
+and you select the one to edit or delete using the drop down list in the
+Saved Envelopes List area. The current envelope appears in the Graphical
+Envelope Editor area. You can click to add or drag points. Alternatively,
+you can use the Envelope Points window to select and edit any breakpoint
+by typing coordinates. The duration of the envelope is controlled by the
+Stop field in the Range area, and the vertical axis is controlled by the
+Min and Max fields.
+
+When you click the Save button, @i(all) envelopes are written to Nyquist.
+You can then use the envelope by treating the envelope name as a function.
+For example, if you define an envelope named ``fast-attack,'' then you
+can create the envelope within a Nyquist SAL program by writing
+the expression @code[fast-attack()].
+
+These edited envelopes are saved to a file named @code(workspace.lsp)
+ @index(workspace) in
+the current directory. The workspace is Nyquist's mechanism for saving
+data of all kinds (see Section @ref(workspaces-sec)). The normal way to
+work with workspaces is to (1) load the workspace, i.e.
+ @code[load "workspace"], as soon as you start Nyquist; (2) invoke
+the envelope editor to change values in the workspace; and (3) save the
+workspace at any time, especially before you exit NyquistIDE. If you follow
+these steps, envelopes will be preserved from session to session, and
+the entire collection of envelopes will appear in the editor. Be
+sure to make backups of your @code(workspace.lsp) file along with your
+other project files.
+
+The envelope editor can create linear and exponential envelopes. Use the
+Type pull-down menu to select the type you want. Envelopes can be created
+using default starting and ending values using @code(pwl) or @code(pwe),
+or you can specify the initial values using @code(pwlv) or @code(pwev).
+The envelope editor uses @code(pwl) or @code(pwe) if no point is explicitly
+entered as the initial or final point. To create a @code(pwlv) or @code(pwev)
+function, create a point and drag it to the leftmost or rightmost edge
+of the graphical editing window. You will see the automatically
+generated default starting or ending
+point disappear from the graph.
+
+Exponential envelopes should never decay to zero. If you enter a zero
+amplitude, you will see that the envelope remains at zero to the next
+breakpoint. To get an exponential decay to ``silence,'' try using an
+amplitude of about 0.001 (about -60dB). To enter small values like
+this, you can type them into the Amplitude box and click ``Update Point.''
+
+The Load button refreshes the editor from data saved in the Nyquist
+process. Normally, there is no need to use this because the editor
+automatically loads data when you open it.
+
+@section(Equalizer Editor)
+@label(eq-window-sec)@index(equalization editor)@index(graphical equalization)
+The Equalizer Editor provides a graphical EQ interface for creating and
+adjusting equalizers. Unlike the envelope editor, where you can type
+any envelope name, equalizers are named @code(eq-0), @code(eq-1), etc.,
+and you select the equalizer to edit using a pull-down menu. The @code(Set)
+button should be use to record changes.
+
+@section(UPIC Editor)
+@label(upic-editor-sec)@index(UPIC)@index(Xenakis)@index(Iannis Xenakis)The
+UPIC Editor is inspired by the UPIC system by Iannis Xenakis at the Centre
+d'Edudes de Mathematique et Automatique Musicales (CEMaMu). The UPIC Editor
+is accessed by the ``Upic Edit'' menu item in the ``Window'' menu of the
+NyquistIDE. Once opened, you can draw pitch contours in the main panel by
+pressing the left mouse button and dragging with the mouse down. Contours
+represent tones in a frequency vs. time coordinate system. Any contour can be
+deleted by right-clicking (or shift-clicking on an Apple computer) to
+select the contour (indicated by the color red), and typing the Delete key.
+
+A collection of contours can be saved to a file and later retrieved using the
+items in the File menu (use the File menu in the UPIC Editor window, not in
+the main NyquistIDE window.) The file is a SAL program in a special format
+that can be parsed by the UPIC Editor. The file can also be loaded
+into Nyquist using the File:Load menu item, or by executing a load command
+in Nyquist.
+
+The panel at the top of the editor offers control over various parameters.
+The Name box is a Nyquist variable name. This name takes effect when you
+save a file from the UPIC Editor. The variable name is stored in the
+file so that when a UPIC Editor-generated file
+is loaded into Nyquist, the data is assigned to this variable name.
+The data is
+a list of contours, where each contour specifies a waveform, an envelope,
+and a list of time-frequency coordinates.
+
+The next item in the panel is the Waveform box. The Waveform box names a
+waveform for a contour. Default waveforms are sinusoid, triangle, and
+sawtooth, but you can type in your own names. The currently selected
+waveform is stored with the contour when it is created (entered by
+drawing). You cannot change or edit the waveform name associated with
+a contour once the contour is created, but you can always delete the
+contour and replace it. The Envelope box names an envelope for a
+contour. The envelope names a Nyquist function. The default, @code(upic-env)
+is a trapezoid shape with an onset time and offset time of 10ms. As with
+waveforms, the envelope is stored with each contour when the contour is
+created and cannot be edited.
+
+The Stop Time box gives the duration of the drawing area in seconds.
+The Min Freq box gives the minimum frequency (at the bottom of the
+drawing area), and the Max Freq box gives the maximum frequency (at the
+top of the drawing area). The vertical frequency axis can use a linear
+scale corresponding to frequency in Hertz or a logarithmic scale
+corresponding to semitones. The ``linear'' checkbox selects the linear
+scale. When @i(any) of these parameters (described in this paragraph and
+delimited by the border labeled ``Range'' on the control panel) is changed,
+you must press the Update Range button for the change to take effect.
+
+The Background menu lets you display a grid that indicates pitch locations.
+The ``C's'' item draws a line at C in every visible octave. E.g. middle C
+is about 260 Hz, so a reference line will be drawn near 260 Hz.
+Lines will be drawn around 130 Hz (an octave below middle C), and around
+520 Hz (an octave above middle C), etc. The ``GrandStaff'' menu item
+draws reference lines for each line of the grand staff commonly used
+for piano music. The pitches are G2, B2, D3, F3, A3, E4, G4, B4, D5, and
+F5. Finally, you can load a picture using the
+Background:Load Picture... menu item. Then, the Background:Show Picture
+menu item toggles whether the picture is displayed or not. This feature
+allows you to trace an image. (For example, see the Sonic Self-Portrait
+at @code(http://www.cs.cmu.edu/~rbd).) You may wish to use an image editor
+to lighten the image so that superimposed contours will be more visible.
+
+Each change to the Range data, background choice, and each entry of a
+contour is an action that you can undo or redo with the Undo and Redo
+buttons.
+
+To convert UPIC data into sound, first load @code(upic.sal) and load
+a file generated by the UPIC Editor. Now, suppose the variable name
+used is @code(upicdata). You can play the data by writing
+@begin(example)
+play upic(upicdata)
+@end(example)
+If you created your own names for waveforms or envelopes, you must be
+sure that these exist before calling the @code(upic) function. Each
+waveform must be the name of a variable which is set to a Nyquist
+wave table. (See Section @ref(waveform-sec) for information on how
+to create a wave table.) Also, each envelope must name a function with
+no parameters that will return an amplitude envelope. The following is
+the built-in definition for @code(upic-env):
+@begin(example)
+define function upic-env()
+ return env(0.01, 0.01, 0.01, 1, 1, 1)
+@end(example)
+To make a custom envelope function named @code(upic-smooth) with a 0.2
+ second attack and a 0.3 second decay, you could write:
+@begin(example)
+define function upic-smooth()
+ return env(0.2, 0.01, 0.3, 1, 1, 1)
+@end(example)
+
+
+@chapter(Behavioral Abstraction)@index(behavioral abstraction)
+@label(behavioral-abstraction-sec)
+In Nyquist, all functions are subject to
+transformations@index(transformations). You can think of transformations as
+additional parameters to every function, and functions are free to use these
+additional parameters in any way. The set of transformation parameters is
+captured in what is referred to as the @i(transformation
+environment@index(transformation environment)). (Note that the term
+@i(environment) is heavily overloaded in computer science. This is yet
+another usage of the term.)
+
+Behavioral abstraction is the ability of functions to adapt their behavior
+to the transformation environment. This environment may contain certain
+abstract notions, such as loudness, stretching a sound in time, etc. These
+notions will mean different things to different functions. For example, an
+oscillator should produce more periods of oscillation in order to stretch
+its output. An envelope, on the other hand, might only change the
+duration of the sustain portion of the envelope in order to stretch.
+Stretching a sample could mean resampling it to change its duration by the
+appropriate amount.
+
+Thus, transformations in Nyquist are not simply operations on signals. For
+example, if I want to stretch a note, it does not make sense to compute the
+note first and then stretch the signal. Doing so would cause a drop in the
+pitch. Instead, a transformation modifies the @i(transformation
+environment) in which the note is computed. Think of transformations as
+making requests to functions. It is up to the function to carry out the
+request. Since the function is always in complete control, it is possible
+to perform transformations with ``intelligence;'' that is, the function can
+perform an appropriate transformation, such as maintaining the desired pitch
+and stretching only the ''sustain'' portion
+of an envelope to obtain a longer note.
+
+@section(The Environment)@index(environment)
+@label(environment-sec)
+The transformation environment consists of a set of special variables.
+These variables should not be read directly and should @i(never) be set
+directly by the programmer. Instead, there are functions to read them, and
+they are automatically set and restored by
+transformation operators, which will be described below.
+
+The transformation environment consists of the following elements. Although
+each element has a ``standard interpretation,'' the designer of an
+instrument or the composer of a complex behavior is free to interpret the
+environment in any way. For example, a change in @code(*loud*) may change
+timbre more than amplitude, and @code(*transpose*) may be ignored by
+percussion instruments:
+
+
+@begin(description)
+ @codef(*warp*@pragma(defn)@index(*warp*))@\Time transformation, including time shift,
+time stretch, and continuous time warp. The value of @code[*warp*] is
+interpreted as a function from logical (local score) time to physical
+(global real) time. Do not access @code(*warp*) directly. Instead, use
+@code[local-to-global(@i(t))] to
+ convert from a logical (local) time to real (global) time. Most often,
+you will call @code[local-to-global(0)]. Several transformation operators
+operate on @code[*warp*], including @i(at) (@code(@@)), @i(stretch) (@code(~)),
+and @code(warp). See also @code[get-duration()] and @code[get-warp()].
+
+ @codef(*loud*@pragma(defn)@index(*loud*))@\Loudness, expressed in decibels. The default
+(nominal) loudness is 0.0 dB (no change). Do not access @code(*loud*)
+directly. Instead, use @code[get-loud()] to get the current value of
+@code(*loud*) and either @code(loud) or @code(loud-abs) to modify it.
+
+ @codef(*transpose*@pragma(defn)@index(*transpose*))@\Pitch transposition,
+expressed in
+semitones. (Default: 0.0). Do not access @code(*transpose*) directly.
+Instead, use @code[get-transpose()] to get the current value of
+@code(*transpose*) and either @code(transpose) or @code(transpose-abs) to
+modify it.
+
+ @codef(*sustain*@pragma(defn)@index(*sustain*))@\The ``sustain,''
+``articulation,'' ``duty factor,'' or amount by which to
+separate or overlap sequential notes. For
+example, staccato might be expressed with a @code(*sustain*) of 0.5, while very
+legato playing might be expressed with a @code(*sustain*) of 1.2.
+Specifically, @code(*sustain*) stretches the duration of notes (sustain)
+without affecting the inter-onset time (the rhythm). Do not access
+@code(*sustain*) directly. Instead, use @code[get-sustain()] to get the
+current value of @code(*sustain*) and either @code(sustain) or
+@code(sustain-abs) to modify it.
+
+ @codef(*start*@pragma(defn)@index(*start*))@\Start
+time of a clipping region. @i(Note:)
+unlike the previous elements of the environment, @code(*start*) has a
+precise interpretation: no sound should be generated before @code(*start*).
+This is implemented in all the low-level sound functions, so it can
+generally be ignored. You can read @code(*start*) directly, but use
+@code(extract) or @code(extract-abs) to modify it. @p(Note 2:) Due
+to some internal confusion between the specified starting time and
+the actual starting time of a signal after clipping, @code(*start*)
+is not fully implemented.
+
+ @codef(*stop*@pragma(defn)@index(*stop*))@\Stop time of clipping
+region. By analogy to
+@code(*start*), no sound should be generated after this time.
+@code(*start*) and
+@code(*stop*) allow a composer to preview a small section of a work
+without computing it from beginning to end. You can read @code(*stop*)
+directly, but use @code(extract) or @code(extract-abs) to modify it.
+ @p(Note:) Due to some internal confusion between the specified
+starting time and the actual starting time of a signal after
+clipping, @code(*stop*) is not fully implemented.
+
+@codef(*control-srate*@pragma(defn)@index(*control-srate*))@\Sample
+rate of control signals. This environment
+element provides the default sample rate for control signals. There is no
+formal distinction between a control signal and an audio signal.
+You can read @code(*control-srate*) directly, but
+use @code(control-srate) or @code(control-srate-abs) to modify it.
+
+ @codef(*sound-srate*@pragma(defn)@index(*sound-srate*))@\Sample
+rate of musical sounds. This environment element provides the
+default sample rate for musical sounds. You can
+read @code(*sound-srate*) directly, but use @code(sound-srate)
+or @code(sound-srate-abs) to modify it.
+
+@end(description)
+
+@section(Sequential Behavior)@index(sequential behavior)
+Previous examples have shown the use of @code(seq), the sequential behavior
+operator. We can now explain @code(seq) in terms of transformations.
+Consider the simple expression:
+@begin(Example)
+play seq(my-note(c4, q), my-note(d4, i))
+@end(example)
+The idea is to create the first note at time 0, and to start the next
+note when the first one finishes. This is all accomplished by manipulating
+the environment. In particular, @code[*warp*] is modified so that what is
+locally time 0 for the second note is transformed, or warped, to the logical
+stop time of the first note.
+
+One way to understand this in detail is to imagine how it
+might be executed: first, @code(*warp*) is set to an initial value that has no
+effect on time, and @code[my-note(c4, q)] is evaluated. A sound is returned and
+saved. The sound has an ending time, which in this case will be @code(1.0)
+because the duration @code(q) is @code(1.0). This ending time, @code(1.0),
+is used to construct a new @code[*warp*] that has the effect of shifting
+time by 1.0. The second note is evaluated, and will start
+at time 1. The sound that is
+returned is now added to the first sound to form a composite sound, whose
+duration will be @code(2.0). @code(*warp*) is restored to its initial value.
+
+Notice that the semantics of @code(seq) can be expressed in terms of
+transformations. To generalize, the operational rule for @code(seq) is:
+evaluate the first behavior according to the current @code(*warp*).
+Evaluate each successive behavior with @code(*warp*) modified to shift the
+new note's starting time to the ending time of the previous behavior.
+Restore @code(*warp*) to its original value and return a sound which is the
+sum of the results.
+
+In the Nyquist implementation, audio samples are only computed when they are
+needed, and the second part of the @code(seq) is not evaluated until the
+ending time (called the logical stop time) of the first part. It is still
+the case that when the second part is evaluated, it will see @code(*warp*)
+bound to the ending time of the first part.
+
+A language detail: Even though Nyquist defers evaluation of the second part of the @code(seq), the expression can reference variables according to ordinary
+Lisp/SAL scope rules. This is because the @code(seq) captures the expression in a closure, which retains all of the variable bindings.
+
+@section(Simultaneous Behavior)@index(Simultaneous Behavior)
+Another operator is @code(sim), which invokes multiple behaviors at the same
+time. For example,
+@begin(example)
+play 0.5 * sim(my-note(c4, q), my-note(d4, i))
+@end(example)
+will play both notes starting at the same time.
+
+The operational rule for @code(sim) is: evaluate each behavior at the
+current @code(*warp*) and return the sum of the results. (In SAL, the
+@code(sim) function applied to sounds is equivalent to adding them
+with the infix @code(+) operator. The following section
+illustrates two concepts: first, a @i(sound) is not a
+@i(behavior), and second, the @code(sim) operator and and the @code(at)
+transformation can be used to place sounds in time.
+
+@section(Sounds vs. Behaviors)@index(Sounds vs. Behaviors)
+The following example loads a sound from a file in the current directory and stores it in @code(a-snd):
+@begin(example)
+@i[; load a sound
+;]
+set a-snd = s-read(strcat(current-path(), "demo-snd.aiff"))
+
+@i[; play it
+;]
+play a-snd
+@end(example)
+
+One
+might then be tempted to write the following:
+@begin(example)
+play seq(a-snd, a-snd) @i(;WRONG!)
+@end(example)
+Why is this wrong? Recall
+that @code(seq) works by modifying @code(*warp*), not by operating on
+sounds. So, @code(seq) will proceed by evaluating @code(a-snd) with
+different values of @code(*warp*). However, the result of evaluating
+@code(a-snd) (a variable) is always the same sound, regardless of the
+environment; in this case, the second @code(a-snd) @i(should) start at time
+@code(0.0), just like the first. In this case, after the first sound ends,
+ Nyquist is unable to ``back up'' to time zero, so in fact, this @i(will)
+play two sounds in sequence, but that is a result of an implementation
+detail rather than correct program execution. In fact, a future version of
+Nyquist might (correctly) stop and report an error when it detects that the
+second sound in the sequence has a real start time that is before the
+requested one.
+
+How then do we obtain a sequence of two sounds properly?
+What we really need here is a
+behavior that transforms a given sound according to the current
+transformation environment. That job is performed by @code(cue). For
+example, the following will behave as expected, producing a sequence of two
+sounds:
+@begin(example)
+play seq(cue(a-snd), cue(a-snd))
+@end(example)
+This example is correct because the second expression will shift the sound
+ stored in @code(a-snd) to start at the end time of the first expression.
+
+The lesson here is very important: @p(sounds are not behaviors!) Behaviors
+are computations that generate sounds according to the transformation
+environment. Once a sound has been generated, it can be stored, copied,
+added to other sounds, and used in many other operations, but sounds are
+@i(not) subject to transformations. To transform a sound, use @code(cue),
+@code(sound), or @code(control). The differences between these operations
+are discussed later. For now, here is a ``cue sheet'' style score that
+plays 4 copies of @code(a-snd):
+
+@begin(example)
+@i[; use sim and at to place sounds in time
+;]
+play sim(cue(a-snd) @@ 0.0,
+ cue(a-snd) @@ 0.7,
+ cue(a-snd) @@ 1.0,
+ cue(a-snd) @@ 1.2)
+@end(example)
+
+@section(The At Transformation)@index(At Transformation)
+The second concept introduced by the previous example is the @code(@@)
+operation, which shifts the @code(*warp*) component of the environment. For
+example,
+@begin(example)
+cue(a-snd) @@ 0.7
+@end(example)
+can be explained operationally as follows: modify @code[*warp*] by shifting
+it by @code(0.7) and evaluate @code[cue(a-snd)]. Return the resulting sound
+after restoring @code(*warp*) to its original value. Notice how @code(@@)
+is used inside a @code(sim) construct to locate copies of @code(a-snd) in
+time. This is the standard way to represent a note-list or a cue-sheet in
+Nyquist.
+
+This also explains why sounds need to be @code(cue)'d in order to be shifted
+in time or arranged in sequence. If this were not the case, then @code(sim)
+would take all of its parameters (a set of sounds) and line them up to start
+at the same time. But @code[cue(a-snd) @@ 0.7] is just a sound, so
+@code(sim) would ``undo'' the effect of @code(@@), making all of the sounds
+in the previous example start simultaneously, in spite of the @code(@@)!
+Since @code(sim) respects the intrinsic starting times of sounds, a special
+operation, @code(cue), is needed to create a new sound with a new starting
+time.
+
+@section(The Stretch Transformation)@index(Stretch Transformation)
+In addition to At (denoted in SAL by the @code(@@) operator, the Stretch
+transformation is very important. It appeared in the introduction, and
+it is denoted in SAL by the @code(~) operator (or in LISP by the @code(stretch)
+special form). Stretch also operates on the @code(*warp*) component of
+the environment. For example,
+@begin(example)
+osc(c4) ~ 3
+@end(example)
+does the following: modify @code(*warp*), scaling the degree of
+"stretch" by 3, and evaluate @code[osc(c4)]. The @code(osc) behavior
+uses the stretch factor to determime the duration, so it will return
+a sound that is 3 seconds long. Restore @code(*warp*) to its original
+value. Like At, Stretch only affects behaviors. @code(a-snd ~ 10) is
+equivalent to @code(a-snd) because @code(a-snd) is a sound, not a
+behavior. Behaviors are functions that compute sounds according to
+the environment and return a sound.
+
+@section(Nested Transformations)@index(Nested Transformations)
+Transformations can be combined using nested expressions. For example,
+@begin(example)
+sim(cue(a-snd),
+ loud(6.0, cue(a-snd) @@ 3))
+@end(example)
+scales the amplitude as well as shifts the second entrance of @code(a-snd).
+
+Why use @code(loud) instead of simply multiplying @code(a-snd) by some
+scale factor? Using @code(loud) gives
+the behavior the chance to implement the abstract
+property @i(loudness) in an appropriate way, e.g. by including timbral
+changes. In this case, the behavior is @code(cue), which implements
+@i(loudness) by simple amplitude scaling, so the result is equivalent
+to multiplication by @code(db-to-linear(6.0)).
+
+Transformations can also be applied to groups of behaviors:
+@begin(example)
+loud(6.0, sim(cue(a-snd) @@ 0.0,
+ cue(a-snd) @@ 0.7))
+@end(example)
+
+@section(Defining Behaviors)@index(Defining Behaviors)
+Groups of behaviors can be named using @code(define) (we already saw this
+in the definitions of @code(my-note) and @code(env-note)). Here is another example
+of a behavior definition and its use. The definition has one parameter:
+@begin(example)
+define function snds(dly)
+ return sim(cue(a-snd) @@ 0.0,
+ cue(a-snd) @@ 0.7,
+ cue(a-snd) @@ 1.0,
+ cue(a-snd) @@ (1.2 + dly))
+
+play snds(0.1)
+play loud(0.25, snds(0.3) ~ 0.9)
+@end(example)
+In the last line, @code(snds) is transformed: the transformations will apply
+to the @code(cue) behaviors within @code(snds). The @code(loud)
+transformation will scale the sounds by @code(0.25), and the @i(stretch)
+(@code(~)) will
+apply to the shift (@code(@@)) amounts @code(0.0), @code(0.7), @code(1.0),
+and @code[1.2 + dly]. The sounds themselves (copies of @code(a-snd)) will
+not be stretched because @code(cue) never stretches sounds.
+
+Section @ref(transformations-sec) describes the full set of transformations.
+
+@section(Overriding Default Transformations)
+In Nyquist, behaviors are @i(the) important abstraction mechanism.
+A behavior represents a class of related functions or sounds. For example,
+a behavior can represent a musical note. When a note is stretched, it
+usually means that the tone sustains for more oscillations, but if the
+``note'' is a drum roll, the note sustains by more repetitions of the
+component drum strokes. The concept of sustain is so fundamental that
+we do not really think of different note durations as being different
+instances of an abstract behavior, but in a music programming language,
+we need a way to model these abtract behaviors. As the tone and drum
+roll examples show, there is no one right way to ``stretch,'' so the
+language must allow users to define exactly what it means to stretch.
+By extension, the Nyquist programmer can define how all of the
+transformations affect different behaviors.
+
+To make programming easier, almost all Nyquist sounds are constructed
+from primitive behaviors that obey the environment in obvious ways:
+Stretch transformations make things longer and At transformations shift
+things in time. But sometimes you have to override the default behaviors.
+Maybe the attack phase of an envelope should not stretch when the note
+is stretched, or maybe when you stretch a trill, you should get more
+notes rather than a slower trill.
+
+To override default behaviors, you almost always follow the same
+programming pattern: first, capture the environment in a local variable;
+then, use one of the absolute transformations to ``turn off'' the
+environment's effect and compute the sound as desired. The following
+example creates a very simple envelope with a fixed rise time to
+illustrate the technique.
+@begin(example)
+define function two-phase-env(rise-time)
+ begin
+ with dur = get-duration(1)
+ return pwl(rise-time, 1, dur) ~~ 1.0
+ end
+@end(example)
+To ``capture the environment in a local variable,'' a @code(with)
+construct is used to create the local variable @code(dur) and set
+it to the value of @code[get-duration(1)], which answers the question:
+``If I apply use the environment to stretch something whose nominal
+duration is 1, what is the resulting duration?'' (Since time transformations
+can involve continuous time deformations, this question is not as
+simple as it may sound, so please use the provided function rather
+than peeking inside the @code(*warp*) structure and trying to do it
+yourself.) Next, we ``turn off'' stretching using the @code(stretch-abs)
+form, which in SAL is denoted by the @code(~~) operator.
+Finally, we are ready to compute the envelope using @code(pwl). Here,
+we use absolute durations. The first breakpoint is at @code(rise-time),
+so the attack time is given by the @code(rise-time) parameter. The
+@code(pwl) decays back to zero at time @code(dur), so the overall
+duration matches the duration expected from the environment encountered
+by this instance of @code(two-phase-env). Note, however, that since
+the @code(pwl) is evaluated in a different environment established
+by @code(~~), it is not stretched (or perhaps more accurately, it is
+stretched by 1.0). This is good because it means @code(rise-time) will
+not be stretched, but we must be careful to extend the envelope to
+@code(dur) so that it has the expected duration.
+
+@section(Sample Rates)
+@index(sample rates)
+The global environment contains @code(*sound-srate*) and
+@code(*control-srate*), which determine the sample rates of sounds and
+control signals. These can be overridden at any point by the
+transformations @code(sound-srate-abs) and @code(control-srate-abs); for
+example,
+@begin(example)
+sound-srate-abs(44100.0, osc(c4)
+@end(example)
+will compute a tone using a 44.1Khz sample rate even if the default rate
+is set to something different.
+
+@index(default sample rate)
+As with other components of the environment, you should @i(never) change
+@code(*sound-srate*) or @code(*control-srate*) directly.
+ The global environment is determined by two additional
+variables: @code(*default-sound-srate*) and @code(*default-control-srate*).
+You can add lines like the following to your @code(init.lsp) file to change
+the default global environment:
+@begin(example)
+(setf *default-sound-srate* 44100.0)
+(setf *default-control-srate* 1102.5)
+@end(example)
+You can also do this using preferences in NyquistIDE.
+If you have already started Nyquist and want to change the defaults, the
+preferences or the following functions can be used:
+@begin(example)
+exec set-control-srate(1102.5)@index(set-control-srate)
+exec set-sound-srate(22050.0)@index(set-sound-srate)
+@end(example)
+These modify the default values and reinitialize the Nyquist environment.
+
+
+@chapter(Continuous Transformations and Time Warps)
+@label(warp-chap)
+Nyquist transformations were discussed in the previous chapter, but all of
+the examples used scalar values. For example, we saw the @code[loud]
+transformation used to change loudness by a fixed amount. What if we want
+to specify a crescendo, where the loudness changes gradually over time?
+
+It turns out that all transformations can accept signals as well as numbers,
+so transformations can be continuous over time. This raises some
+interesting questions about how to interpret continuous transformations.
+Should a loudness transformation apply to the internal details of a note or
+only affect the initial loudness? It might seem unnatural for a decaying
+piano note to perform a crescendo. On the other hand, a sustained
+trumpet sound should probably crescendo continuously. In the case of time
+warping (tempo changes), it might be best for a drum roll to maintain a
+steady rate, a trill may or may not change rates with tempo, and a run of
+sixteenth notes will surely change its rate.
+
+These issues are complex, and Nyquist cannot hope to automatically do the
+right thing in all cases. However, the concept of behavioral abstraction
+provides an elegant solution. Since transformations merely modify the
+environment, behaviors are not forced to implement any particular style of
+transformation. Nyquist is designed so that the default transformation is
+usually the right one, but it is always possible to override the default
+transformation to achieve a particular effect.
+
+@section(Simple Transformations)
+The ``simple'' transformations affect some parameter, but have no effect on time itself. The simple transformations that support continuously changing parameters are: @code(sustain), @code(loud), and @code(transpose).
+
+As a first example, Let us use @code(transpose) to create a chromatic scale.
+First define a sequence of tones at a steady pitch. The @code(seqrep)
+``function'' works like @code(seq) except that it creates copies of a sound
+by evaluating an expression multiple times. Here, @code(i) takes on 16 values
+from 0 to 15, and the expression for the sound could potentially use @code(i).
+Technically, @code(seqrep) is not really a function but an abbreviation for
+a special kind of loop construct.
+@begin(example)
+define function tone-seq()
+ return seqrep(i, 16,
+ osc-note(c4) ~ 0.25)
+@end(example)
+Now define a linearly increasing ramp to serve as a transposition function:
+@begin(code)
+define function pitch-rise()
+ return sustain-abs(1.0, 16 * ramp() ~ 4)
+@end(code)
+This ramp has a duration of 4 seconds, and over that interval it rises from
+0 to 16 (corresponding to the 16 semitones we want to transpose). The ramp
+is inside a @code(sustain-abs) transformation, which prevents a @code(sustain)
+transformation from having any effect on the ramp. (One of the drawbacks of
+behavioral abstraction is that built-in behaviors sometimes do the wrong
+thing implicitly, requiring some explicit correction to turn off the
+unwanted transformation.) Now,
+@code(pitch-rise) is used to transpose @code(tone-seq):
+@begin(code)
+define function chromatic-scale()
+ return transpose(pitch-rise(), tone-seq())
+@end(code)
+
+Similar transformations can be constructed to change the sustain or ``duty
+factor'' of notes and their loudness. The following expression plays the
+@code(chromatic-scale) behavior with increasing note durations. The
+rhythm is unchanged, but the note length changes from staccato to legato:
+@begin(code)
+play sustain((0.2 + ramp()) ~ 4,
+ chromatic-scale())
+@end(code)
+The resulting sustain function will ramp from 0.2 to 1.2. A sustain of 1.2
+denotes a 20 percent overlap between notes. The @code(sum) has a stretch
+factor of 4, so it will extend over the 4 second duration of
+@code(chromatic-scale).
+
+If you try this, you will discover that the @code(chromatic-scale) no longer
+plays a chromatic scale. You will hear the first 4 notes going up in intervals
+of 5 semitones (perfect fourths) followed by repeated pitches. What
+is happening is that the @code(sustain) operation applies to
+@code(pitch-rise) in addition to @code(tone-seq), so now the 4s
+ramp from 0 to 16 becomes a 0.8s ramp. To fix this problem, we need to
+shield @code(pitch-rise) from the effect of @code(sustain) using the
+@code(sustain-abs) transformation. Here is a corrected version of
+@code(chromatic-scale):
+@begin(code)
+define function chromatic-scale()
+ return transpose(sustain-abs(1, pitch-rise()), tone-seq())
+@end(code)
+
+What do these transformations mean? How did the system know to produce a
+pitch rise rather than a continuous glissando? This all relates to the idea
+of behavioral abstraction. It is possible to design sounds that @i(do)
+glissando under the transpose transform, and you can even make sounds that
+@i(ignore) transpose altogether. As explained in Chapter
+@ref(behavioral-abstraction-sec), the transformations modify the
+environment, and behaviors can reference the environment to determine what
+signals to generate. All built-in functions, such as @code(osc), have a
+default behavior.
+
+The default behavior for sound primitives under @code(transpose),
+@code(sustain), and @code(loud) transformations is
+to sample the environment at the beginning of the
+note. Transposition is not quantized to semitones or any other scale,
+but in our example, we arranged for the transposition to work out to integer
+numbers of semitones, so we obtained a chromatic scale anyway.
+
+Transposition only applies to the oscillator and sampling primitives
+@code(osc), @code(partial), @code(sampler), @code(sine), @code(fmosc),
+and @code(amosc). Sustain applies to @code(osc), @code(env), @code(ramp),
+and @code(pwl). (Note that @code(partial), @code(amosc), and
+@code(fmosc) get their durations
+from the modulation signal, so they may indirectly depend upon the sustain.)
+Loud applies to @code(osc), @code(sampler), @code(cue), @code(sound),
+@code(fmosc), and @code(amosc). (But not @code(pwl) or @code(env).)
+
+
+@section(Time Warps)
+The most interesting transformations have to do with transforming time
+itself. The @code(warp) transformation provides a mapping function from
+logical (score) time to real time. The slope of this function tells us how
+many units of real time are covered by one unit of score time. This is
+proportional to 1/tempo. A higher slope corresponds to a slower tempo.
+
+To demonstrate @code(warp), we will define a time warp function using
+@code(pwl):
+@begin(example)
+define function warper()
+ return pwl(0.25, .4, .75, .6, 1.0, 1.0, 2.0, 2.0, 2.0)
+@end(example)
+This function has an initial slope of .4/.25 = 1.6. It may be easier to
+think in reciprocal terms: the initial tempo is .25/.4 = .625. Between 0.25
+and 0.75, the tempo is .5/.2 = 2.5, and from 0.75 to 1.0, the tempo is again
+.625. It is important for warp functions to completely span the interval of
+interest (in our case it will be 0 to 1), and it is safest to extend a bit
+beyond the interval, so we extend the function on to 2.0 with a
+tempo of 1.0. Next, we stretch and scale the @code(warper) function to
+cover 4 seconds of score time and 4 seconds of real time:
+@begin(example)
+define function warp4()
+ return 4 * warper() ~ 4
+@end(example)
+
+@begin(figure)
+@center(@graphic((height = 3.25 in, width = 3.5 in, magnify = 0.5,
+ postscript = "warpfig.ps"))
+@html(<img src="fig2.gif"><br><br>)
+@fillcaption{The result of @code[(warp4)], intended to map 4 seconds of
+score time into 4 seconds of real time. The function extends beyond 4
+seconds (the dashed lines) to make sure the function is well-defined at
+location (4, 4). Nyquist sounds are ordinarily open on the right.}
+@tag(warp-fig)
+@end(figure)
+
+Figure @ref(warp-fig) shows a plot of this warp function. Now, we can
+warp the tempo of the @code(tone-seq) defined above using @code(warp4):
+@begin(example)
+play warp(warp4(), tone-seq())
+@end(example)
+Figure @ref(warp-notes-fig) shows the result graphically. Notice that the
+durations of the tones are warped as well as their onsets. Envelopes are
+not shown in detail in the figure. Because of the way @code(env) is
+defined, the tones will have constant attack and decay times, and the
+sustain will be adjusted to fit the available time.
+
+@begin(figure)
+@center(@graphic((height = 1.75 in, width = 6.75 in, magnify = 1.0,
+ postscript = "warpnotesfig.ps"))
+@html(<img src="fig3.gif"><br><br>)
+@fillcaption[When @code{(warp4)} is applied to @code{(tone-seq-2)}, the note onsets and durations are warped.]
+@tag(warp-notes-fig)
+@end(figure)
+
+@section(Abstract Time Warps)
+We have seen a number of examples where the default behavior did the
+``right thing,'' making the code straightforward. This is not always the
+case. Suppose we want to warp the note onsets but not the durations. We
+will first look at an incorrect solution and discuss the error. Then we
+will look at a slightly more complex (but correct) solution.
+
+The default behavior for most Nyquist built-in functions is to sample the
+time warp function at the nominal starting and ending score times of the
+primitive. For many built-in functions, including @code(osc), the starting
+logical time is 0 and the ending logical time is 1, so the time warp
+function is evaluated at these points to yield real starting and stopping
+times, say 15.23 and 16.79. The difference (e.g. 1.56) becomes the signal
+duration, and there is no internal time warping. The @code(pwl) function
+behaves a little differently. Here, each breakpoint is warped individually,
+but the resulting function is linear between the breakpoints.
+
+A consequence of the default behavior is that notes stretch when the tempo
+slows down. Returning to our example, recall that we want to warp only the
+note onset times and not the duration. One would think that the following
+would work:
+@begin(example)
+define function tone-seq-2 ()
+ return seqrep(i, 16,
+ osc-note(c4) ~~ 0.25)
+
+play warp(warp4(), tone-seq-2())
+@end(example)
+Here, we have redefined @code(tone-seq), renaming it to @code(tone-seq-2)
+and changing the stretch (@code(~)) to absolute stretch (@code(~~)). The
+absolute stretch should override the warp function and produce a fixed
+duration.
+
+If you play the example, you will hear steady
+sixteenths and no tempo changes. What is wrong? In a sense, the ``fix''
+works too well. Recall that sequences (including @code(seqrep)) determine
+the starting time of the next note from the logical stop time of the
+previous sound in the sequence. When we forced the stretch to 0.25, we also
+forced the logical stop time to 0.25 real seconds from the beginning, so
+every note starts 0.25 seconds after the previous one, resulting in a
+constant tempo.
+
+Now let us design a proper solution. The trick is to use absolute
+stretch (@code(~~))
+as before to control the duration, but to restore the logical stop time to a
+value that results in the proper inter-onset time interval:
+@begin(example)
+define function tone-seq-3()
+ return seqrep(i, 16,
+ set-logical-stop(osc-note(c4) ~~ 0.25, 0.25))
+
+play warp(warp4(), tone-seq-3())
+@end(example)
+Notice the addition of @code(set-logical-stop) enclosing the
+absolute stretch (@code(~~)) expression to set the logical
+ stop time. A possible
+point of confusion here is that the logical stop time is set to 0.25, the
+same number given to @code(~~)! How does setting the logical stop
+time to 0.25 result in a tempo change? When used within a @code(warp)
+transformation, the second argument to @code(set-logical-stop) refers to
+@i(score) time rather than @i(real) time. Therefore, the score duration of
+0.25 is warped into real time, producing tempo changes according to the
+enviroment. Figure @ref(warp-onset-fig) illustrates the result graphically.
+
+@begin(figure)
+@center(@graphic((height = 1.75 in, width = 6.75 in, magnify = 1.0,
+ postscript = "warponsetfig.ps"))
+@html(<img src="fig4.gif"><br><br>)
+@fillcaption[When @code[(warp4)] is applied
+to @code[(tone-seq-3)], the note onsets are warped, but not the duration,
+which remains a constant 0.25 seconds. In the fast middle section, this
+causes notes to overlap. Nyquist will sum (mix) them.]
+@tag(warp-onset-fig)
+@end(figure)
+
+@section(Nested Transformations)
+Transformations can be nested. In particular, a simple transformation such
+as transpose can be nested within a time warp transformation. Suppose we
+want to warp our chromatic scale example with the @code(warp4) time warp
+function. As in the previous section, we will show an erroneous simple
+solution followed by a correct one.
+
+The simplest approach to a nested transformation is to simply combine them
+and hope for the best:
+@begin(example)
+play warp(warp4(),
+ transpose(pitch-rise(), tone-seq()))
+@end(example)
+This example will not work the way you might expect. Here is why: the warp
+transformation applies to the @code[(pitch-rise)] expression, which is
+implemented using the @code(ramp) function. The default
+behavior of @code(ramp) is to interpolate linearly (in real time) between two points.
+Thus, the ``warped'' @code(ramp) function will not truly reflect the internal
+details of the intended time warp. When the notes are moving faster, they
+will be closer together in pitch, and the result is not chromatic.
+What we need is a way to properly
+compose the warp and ramp functions. If we continuously warp the ramp function
+in the same way as the note sequence, a chromatic scale should be obtained.
+This will lead to a correct solution.
+
+Here is the modified code to properly warp a transposed sequence. Note that
+the original sequence is used without modification. The only complication
+is producing a properly warped transposition function:
+@begin(example)
+ play warp(warp4(),
+ transpose(
+ control-warp(get-warp(),
+ warp-abs(nil, pitch-rise())),
+ tone-seq()))
+@end(example)
+To properly warp the @code(pitch-rise) transposition function, we use
+@code(control-warp), which applies a warp function to a function of score time,
+yielding a function of real time. We need to pass the desired function
+to @code(control-warp), so we fetch it from the environment with
+@code[get-warp()]. Finally, since the warping is done here, we want to
+shield the @code(pitch-rise) expression from further warping, so we enclose
+it in @code[warp-abs(nil, ...)].
+
+ @i(An aside:) This last example illustrates a difficulty in the design of
+Nyquist. To support behavioral abstraction universally, we must rely upon
+behaviors to ``do the right thing.'' In this case, we would like the
+@code(ramp) function to warp continuously according to the environment. But
+this is inefficient and unnecessary in many other cases where @code(ramp)
+and especially @code(pwl) are used. (@code(pwl) warps its breakpoints, but still interpolates linearly between them.) Also, if the default behavior of
+primitives is to warp in a continuous manner, this makes it difficult to
+build custom abstract behaviors. The final vote is not in.
+
+@chapter(More Examples)
+
+This chapter explores Nyquist through additional examples. The reader may
+wish to browse through these and move on to Chapter @ref(lisp-chap), which
+is a reference section describing Nyquist functions.
+
+@section(Stretching Sampled Sounds)@index(Stretching Sampled Sounds)
+
+This example illustrates how to stretch a sound, resampling it in the process.
+Because sounds in Nyquist are @i(values) that contain the sample rate, start
+time, etc., use @code(sound) to convert a sound into a behavior that can be
+stretched, e.g. @code[sound(a-snd)]. This behavior stretches a sound according
+to the stretch factor in the environment, set using @code(stretch). For
+accuracy and efficiency, Nyquist does not resample a stretched sound until
+absolutely necessary. The @code(force-srate) function is used to resample
+the result so that we end up with a ``normal'' sample rate that is playable
+on ordinary sound cards.
+
+@begin(example)
+@i[; if a-snd is not loaded, load sound sample:
+;]
+if not(boundp(quote(a-snd))) then
+ set a-snd = s-read("demo-snd.aiff")
+
+@i[; the SOUND operator shifts, stretches, clips and scales
+; a sound according to the current environment
+;]
+define function ex23()
+ play force-srate(*default-sound-srate*, sound(a-snd) ~ 3.0)
+
+define function down()
+ return force-srate(*default-sound-srate*,
+ seq(sound(a-snd) ~ 0.2,
+ sound(a-snd) ~ 0.3,
+ sound(a-snd) ~ 0.4,
+ sound(a-snd) ~ 0.6))
+play down()
+
+@i[; that was so much fun, let's go back up:
+;]
+define function up()
+ return force-srate(*default-sound-srate*,
+ seq(sound(a-snd) ~ 0.5,
+ sound(a-snd) ~ 0.4,
+ sound(a-snd) ~ 0.3,
+ sound(a-snd) ~ 0.2))
+
+@i[; and write a sequence
+;]
+play seq(down(), up(), down())
+@end(example)
+
+Notice the use of the @code(sound) behavior as opposed to @code(cue). The
+@code(cue) behavior shifts and scales its sound according to @code(*warp*)
+and @code(*loud*), but it does not change the duration or resample the
+sound. In contrast, @code(sound) not only shifts and scales its sound, but
+it also stretches it by resampling or changing the effective sample rate
+ according to @code(*warp*). If
+@code[*warp*] is a continuous warping function, then the sound will be
+stretched by time-varying amounts.
+(The @code(*transpose*) element of the environment is
+ignored by both @code(cue) and @code(sound).)
+
+@p(Note:) @code(sound) may use linear interpolation rather than a high-quality resampling algorithm. In some cases, this may introduce errors audible as noise. Use @code(resample) (see Section @ref(resample-sec)) for high-quality interpolation.
+
+In the functions @code(up) and @code(down), the @code(*warp*) is set by
+@i(stretch) (@code(~)), which simply scales time by a constant scale factor. In this case,
+@code(sound) can ``stretch'' the signal simply by changing the sample rate without
+any further computation. When @code(seq) tries to add the signals together, it
+discovers the sample rates do not match and uses linear interpolation to adjust
+all sample rates to match that of the first sound in the sequence. The result of
+@code(seq) is then converted using @code(force-srate) to convert the sample rate,
+again using linear interpolation.
+It would be slightly better, from a computational
+standpoint, to apply @code(force-srate) individually
+to each stretched sound rather
+than applying @code(force-srate) after @code(seq).
+
+Notice that the overall duration of @code[sound(a-snd) ~ 0.5] will
+be half the duration of @code(a-snd).
+
+@section(Saving Sound Files)@index(Saving Sound Files)
+
+So far, we have used the @code(play) command to play a sound. The
+@code(play) command works by writing a sound to a file while
+simultaneously playing it.
+This can be done one step at a time, and
+it is often convenient to save a sound to a particular file for later use:
+@begin(example)
+@i[; write the sample to a file,
+; the file name can be any Unix filename. Prepending a "./" tells
+; s-save to not prepend *default-sf-dir*
+;]
+exec s-save(a-snd, 1000000000, "./a-snd-file.snd")
+
+@i[; play a file
+; play command normally expects an expression for a sound
+; but if you pass it a string, it will open and play a
+; sound file]
+play "./a-snd-file.snd"
+
+@i[; delete the file (do this with care!)
+; only works under Unix (not Windows)]
+exec system("rm ./a-snd-file.snd")
+
+@i[; now let's do it using a variable as the file name
+;]
+set my-sound-file = "./a-snd-file.snd"
+
+exec s-save(a-snd, 1000000000, my-sound-file)
+
+@i[; play-file is a function to open and play a sound file]
+exec play-file(my-sound-file)
+
+exec system(strcat("rm ", my-sound-file))
+@end(example)
+This example shows how @code(s-save) can be used to save a sound to a file.
+
+This example also shows how the @code(system) function can be used to invoke
+Unix shell commands, such as a command to play a file or remove it.
+Finally, notice that @code(strcat) can be used to concatenate a command name
+to a file name to create a complete command that is then passed to
+@code(system). (This is convenient if the sound file name is stored in a
+parameter or variable.)
+
+@section(Memory Space and Normalization)
+@label(normalization-sec)
+@index(normalization)@index(peak amplitude)@index(maximum amplitude)@index(clip)@index(s-max)@index(s-min)@index(rescaling)@index(not enough memory for normalization)
+Sound samples take up lots of memory, and often, there is not enough primary (RAM) memory to hold a complete composition. For this reason, Nyquist can compute sounds incrementally, saving the final result on disk. @i(However,) Nyquist can also save sounds in memory so that they can be reused efficiently. In general, if a sound is saved in a global variable, memory will be allocated as needed to save and reuse it.
+
+The standard way to compute a sound and write it to disk is to pass an expression to the @code(play) command:
+@begin(example)
+play my-composition()
+@end(example)
+
+@label(peak-ex-sec)
+Often it is nice to @i(normalize) sounds so that they use the full available
+dynamic range of 16 bits. Nyquist has an automated facility to help with
+normalization. By default, Nyquist computes up to 1 million samples (using
+about 4MB of memory) looking for the peak. The entire sound is normalized so
+that this peak will not cause clipping. If the sound has less than 1 million
+samples, or if the first million samples are a good indication of the overall
+peak, then the signal will not clip.
+
+With this automated normalization technique, you can choose the desired
+peak value by setting @code(*autonorm-target*), which is initialized to 0.9.
+The number of samples examined is @code(*autonorm-max-samples*), initially
+1 million. You can turn this feature off by executing:
+@begin(example)
+exec autonorm-off()@index(autonorm-off)
+@end(example)
+and turn it back on by typing:
+@begin(example)
+exec autonorm-on()@index(autonorm-on)
+@end(example)
+This normalization technique is in effect when @code(*autonorm-type*) is
+@code(quote(lookahead)), which is the default.
+
+An alternative normalization method uses the peak value from the previous
+call to @code(play). After playing a file, Nyquist can adjust an internal
+scale factor so that if you play the same file again, the peak amplitude
+will be @code(*autonorm-target*), which is initialized to 0.9. This can
+be useful if you want to carefully normalize a big sound that does not
+have its peak near the beginning. To select this style of normalization,
+set @code(*autonorm-type*) to the (quoted) atom @code(quote(previous)).
+
+You can also create your own normalization method in Nyquist.
+The @code(peak) function computes the maximum value of a sound.
+The peak value is also returned from the @code(play) macro. You can
+normalize in memory if you have enough memory; otherwise you can compute
+the sound twice. The two techniques are illustrated here:
+@begin(example)
+@i[; normalize in memory. First, assign the sound to a variable so
+; it will be retained:]
+set mysound = sim(osc(c4), osc(c5))
+@i[; now compute the maximum value (ny:all is 1 giga-samples, you may want a
+; smaller constant if you have less than 4GB of memory:]
+set mymax = snd-max(mysound, NY:ALL)
+display "Computed max", mymax
+@i[; now write out and play the sound from memory with a scale factor:]
+play mysound * (0.9 / mymax)
+
+@i[; if you don't have space in memory, here's how to do it:]
+define function myscore()
+ return sim(osc(c4), osc(c5))
+@i[; compute the maximum:]
+set mymax = snd-max(list(quote(myscore)), NY:ALL)
+display "Computed max", mymax
+@i[; now we know the max, but we don't have a the sound (it was garbage
+; collected and never existed all at once in memory). Compute the sound
+; again, this time with a scale factor:]
+play myscore() * (0.9 / mymax)
+@end(example)
+
+You can also write a sound as a floating point file. This
+file can then be converted to 16-bit integer with the proper scaling
+applied. If a long computation was involved, it should be much faster
+to scale the saved sound file than to recompute the sound from scratch.
+Although not implemented yet in Nyquist, some header formats can
+store maximum amplitudes, and some soundfile player programs can
+rescale floating point files on the fly, allowing normalized
+soundfile playback without an extra normalization pass (but at a cost
+of twice the disk space of 16-bit samples).
+You can use Nyquist to rescale a floating point file and
+convert it to 16-bit samples for playback.
+
+@section(Frequency Modulation)@index(Frequency Modulation)
+The next example uses the Nyquist frequency modulation behavior @code(fmosc)
+to generate various sounds. The parameters to @code(fmosc) are:
+@begin(example)
+fmosc(@i(pitch) @i(modulator) @i(table) @i(phase))
+@end(example)
+Note that pitch is the number of half-steps, e.g. @code(c4) has the value of 60 which is middle-C, and phase is in degrees. Only the first two parameters are required:
+@begin(example)
+@i[; make a short sine tone with no frequency modulation
+;]
+play fmosc(c4, pwl(0.1))
+
+@i[; make a longer sine tone -- note that the duration of
+; the modulator determines the duration of the tone
+;]
+play fmosc(c4, pwl(0.5))
+@end(example)
+In the example above, @code(pwl) (for Piece-Wise Linear) is used to generate
+sounds that are zero for the durations of @code(0.1) and @code(0.5) seconds,
+respectively. In effect, we are using an FM oscillator with no modulation
+input, and the result is a sine tone. The duration of the modulation
+determines the duration of the generated tone (when the modulation signal
+ends, the oscillator stops).
+
+The next example uses a more interesting modulation function, a ramp from
+zero to C@-(4), expressed in hz. More explanation of @code(pwl) is in
+order. This operation constructs a piece-wise linear function sampled at
+the @code(*control-srate*). The first breakpoint is always at @code[(0,
+0)], so the first two parameters give the time and value of the second
+breakpoint, the second two parameters give the time and value of the third
+breakpoint, and so on. The last breakpoint has a value of @code(0), so only
+the time of the last breakpoint is given. In this case, we want the ramp to
+end at C@-(4), so we cheat a bit by having the ramp return to zero
+``almost'' instantaneously between times @code(0.5) and @code(0.501).
+
+The @code(pwl) behavior always expects an odd number of parameters. The
+resulting function is shifted and stretched linearly according to
+@code[*warp*] in the environment. Now, here is the example:
+@begin(example)
+@i[; make a frequency sweep of one octave; the piece-wise linear function
+; sweeps from 0 to (step-to-hz c4) because, when added to the c4
+; fundamental, this will double the frequency and cause an octave sweep.
+;]
+play fmosc(c4, pwl(0.5, step-to-hz(c4), 0.501))
+@end(Example)
+
+The same idea can be applied to a non-sinusoidal carrier. Here, we assume that @code(*fm-voice*) is predefined (the next section shows how to define it):
+@begin(example)
+@i[; do the same thing with a non-sine table
+;]
+play fmosc(cs2, pwl(0.5, step-to-hz(cs2), 0.501),
+ *fm-voice*, 0.0)
+@end(example)
+
+The next example shows how a function can be used to make a special
+frequency modulation contour. In this case the contour generates a sweep
+from a starting pitch to a destination pitch:
+@begin(example)
+@i[; make a function to give a frequency sweep, starting
+; after <delay> seconds, then sweeping from <pitch-1>
+; to <pitch-2> in <sweep-time> seconds and then
+; holding at <pitch-2> for <hold-time> seconds.
+;]
+define function sweep(delay, pitch-1, sweep-time,
+ pitch-2, hold-time)
+ begin
+ with interval = step-to-hz(pitch-2) - step-to-hz(pitch-1)
+ return pwl(delay, 0.0,
+ @i[; sweep from pitch 1 to pitch 2]
+ delay + sweep-time, interval,
+ @i[; hold until about 1 sample from the end]
+ delay + sweep-time + hold-time - 0.0005,
+ interval,
+ @i[; quickly ramp to zero (pwl always does this,]
+ @i[; so make it short)]
+ delay + sweep-time + hold-time)
+ end
+
+
+@i[; now try it out
+;]
+play fmosc(cs2, sweep(0.1, cs2, 0.6, gs2, 0.5),
+ *fm-voice*, 0.0)
+@end(example)
+
+FM can be used for vibrato as well as frequency sweeps. Here, we use the
+@code(lfo) function to generate vibrato. The @code(lfo) operation is
+similar to @code(osc), except it generates sounds at the
+@code(*control-srate*), and the parameter is hz rather than a pitch:
+@begin(example)
+play fmosc(cs2, 10.0 * lfo(6.0), *fm-voice*, 0.0)
+@end(Example)
+
+What kind of manual would this be without the obligatory FM sound? Here, a
+sinusoidal modulator (frequency C@-(4)) is multiplied by a slowly increasing
+ramp from zero to @code(1000.0).
+@begin(example)
+set modulator = pwl(1.0, 1000.0, 1.0005) *
+ osc(c4)
+@i[; make the sound]
+play fmosc(c4, modulator)
+@end(example)
+
+For more simple examples of FM in Nyquist, see
+@index(warble)@index(FM synthesis)@index(demos, FM)@index(tutorial, FM)
+@code(demos/warble_tutorial.htm). Another interesting FM sound
+reminiscent of ``scratching'' can be found with a detailed explanation
+in @code(demos/scratch_tutorial.htm).@index(demos, scratch tutorial)
+@index(vinal scratch)@index(scratch sound).
+
+@section(Building a Wavetable)
+In Section @ref(waveform-sec), we saw how to synthesize a wavetable. A
+wavetable for @code(osc) also can be extracted from any sound. This is
+especially interesting if the sound is digitized from some external sound
+source and loaded using the @code(s-read) function. Recall that a table
+is a list consisting of a sound, the pitch of that sound, and T (meaning the
+sound is periodic).
+
+In the following, a sound is first read from the file @code(demo-snd.nh).
+Then, the @code(extract) function is used
+to extract the portion of the sound between 0.110204 and 0.13932 seconds.
+(These numbers might be obtained by first plotting the sound and estimating
+the beginning and end of a period, or by using some software to look for
+good zero crossings.) The result of @code(extract) becomes the first
+element of a list. The next element is the pitch (24.848422), and the last
+element is @code(T). The list is assigned to @code(*fm-voice*).
+@begin(example)
+if not(boundp(quote(a-snd))) then
+ set a-snd = s-read("demo-snd.aiff")
+
+set *fm-voice* = list(extract(0.110204, 0.13932, cue(a-snd)),
+ 24.848422,
+ #T)
+@end(example)
+
+The file
+@i(demos/examples.sal) contains an extensive example of how to locate
+zero-crossings, extract a period, build a waveform, and generate a tone from it. (See @code(ex37) through @code(ex40) in the file.)
+
+@begin(comment)
+The @code(maketable) command is also useful and is documented on page
+@ref(maketable). If @code(sample) is the source sound, then the following
+will extract 0.01 seconds (starting at time 0.2s) of audio and convert it
+into a waveform named @code(mytable):
+@begin(example)
+(setf mytable (maketable (extract -abs 0.2 0.21 sample)))
+@end(example)
+Nyquist does not provide any pitch analysis or other help finding good splice points, so it is up to you to make sure the table you extract is a reasonable one.
+@end(comment)
+
+@section(Filter Examples)
+
+Nyquist provides a variety of filters. All of these filters take either
+real numbers or signals as parameters. If you pass a signal as a filter
+parameter, the filter coefficients are recomputed at the sample rate of the
+@i(control) signal. Since filter coefficients are generally expensive to
+compute, you may want to select filter control rates carefully. Use
+@code(control-srate-abs) (Section @ref(control-srate-abs-sec)) to specify
+the default control sample rate, or use @code(force-srate) (Section
+@ref(force-srate-sec)) to resample a signal before passing it to a filter.
+
+Before presenting examples, let's generate some unfiltered white noise:
+@begin(example)
+play noise()
+@end(example)
+Now low-pass filter the noise with a 1000Hz cutoff:
+@begin(example)
+play lp(noise(), 1000.0)
+@end(example)
+The high-pass filter is the inverse of the low-pass:
+@begin(example)
+play hp(noise(), 1000.0)
+@end(example)
+
+Here is a low-pass filter sweep from 100Hz to 2000Hz:
+@begin(example)
+play lp(noise(), pwl(0.0, 100.0, 1.0, 2000.0, 1.0))
+@end(example)
+And a high-pass sweep from 50Hz to 4000Hz:
+@begin(example)
+play hp(noise(), pwl(0.0, 50.0, 1.0, 4000.0, 1.0))
+@end(example)
+
+The band-pass filter takes a center frequency and a bandwidth parameter.
+This example has a 500Hz center frequency with a 20Hz bandwidth. The scale
+factor is necessary because, due to the resonant peak of the filter, the
+signal amplitude exceeds 1.0:
+@begin(example)
+play reson(10.0 * noise(), 500.0, 20.0, 1)
+@end(example)
+In the next example, the center frequency is swept from 100 to 1000Hz, using a constant 20Hz bandwidth:
+@begin(example)
+play reson(0.04 * noise(),
+ pwl(0.0, 200.0, 1.0, 1000.0, 1.0),
+ 20.0)
+@end(example)
+
+For another example with explanations, see
+@index(wind_tutorial.htm)@index(wind sound)@index(filter example)
+@index(demos, wind sound)
+@code(demos/wind_tutorial.htm).
+
+
+@section(DSP in Lisp)
+@index(DSP in Lisp)@index(Lisp DSP)In almost any
+signal processing system, the vast majority of computation
+takes place in the inner loops of DSP algorithms, and Nyquist is designed so
+that these time-consuming inner loops are in highly-optimized
+machine code rather than relatively slow interpreted lisp code. As a result,
+Nyquist typically spends 95% of its time in these inner loops; the overhead
+of using a Lisp interpreter is negligible.
+
+The drawback is that Nyquist must provide the DSP operations you need, or
+you are out of luck. When Nyquist is found lacking, you can either write a
+new primitive signal operation, or you can perform DSP in Lisp code. Neither
+option is recommended for inexperienced programmers. Instructions for
+extending Nyquist are given in Appendix @ref(extending-app). This section
+describes the process of writing a new signal processing function in Lisp.
+
+Before implementing a new DSP function, you should decide which approach is
+best. First, figure out how much of the new function can be implemented
+using existing Nyquist functions. For example, you might think that a
+tapped-delay line would require a new function, but in fact, it can be
+implemented by composing sound transformations to accomplish delays, scale
+factors for attenuation, and additions to combine the intermediate results.
+This can all be packaged into a new Lisp function, making it easy to use.
+If the function relies on built-in DSP primitives, it will execute very
+efficiently.
+
+Assuming that built-in functions cannot be used, try to define a new
+operation that will be both simple and general. Usually, it makes sense to
+implement only the kernel of what you need, combining it with existing
+functions to build a complete instrument or operation. For example, if you
+want to implement a physical model that requires a varying breath pressure
+with noise and vibrato, plan to use Nyquist functions to add a basic
+pressure envelope to noise and vibrato signals to come up with a composite
+pressure signal. Pass that signal into the physical model rather than
+synthesizing the envelope, noise, and vibrato within the model. This not
+only simplifies the model, but gives you the flexibility to use all of
+Nyquist's operations to synthesize a suitable breath pressure signal.
+
+Having designed the new ``kernel'' DSP operation that must be implemented,
+decide whether to use C or Lisp. (At present, SAL is not a good option
+because it has no support for object-oriented programming.)
+To use C, you must have a C compiler, the
+full source code for Nyquist, and you must learn about extending Nyquist by
+reading Appendix @ref(extending-app). This is the more complex approach, but
+the result will be very efficient. A C implementation will deal properly
+with sounds that are not time-aligned or matched in sample rates.
+To use Lisp, you must learn something
+about the XLISP object system, and the result will be about 50 times slower
+than C. Also, it is more difficult to deal with time alignment and
+differences in sample rates.
+The remainder of this section gives an example of a Lisp version of
+@code(snd-prod) to illustrate how to write DSP functions for Nyquist in Lisp.
+
+The @code(snd-prod) function is the low-level multiply routine. It has two
+sound parameters and returns a sound which is the product of the two. To
+keep things simple, we will assume that two sounds to be multiplied have a
+matched sample rate and matching start times. The DSP algorithm for each
+output sample is simply to fetch a sample from each sound, multiply them,
+and return the product.
+
+To implement @code(snd-prod) in Lisp, three components are required:
+@begin(enumerate)
+An object is used to store the two parameter sounds. This object will be
+called upon to yield samples of the result sound;
+
+Within the object, the @code(snd-fetch) routine is used to fetch samples
+from the two input sounds as needed;
+
+The result must be of type @code(SOUND), so @code(snd-fromobject) is used
+to create the result sound.
+@end(enumerate)
+
+The combined solution will work as follows: The result is a value of type
+@code(sound) that retains a reference to the object. When Nyquist needs
+samples from the sound, it invokes the sound's ``fetch'' function, which in
+turn sends an XLISP message to the object. The object will use
+@code(snd-fetch) to get a sample from each stored sound, multiply the
+samples, and return a result.
+
+Thus the goal is to design an XLISP object that, in response to a
+@code(:next) message will return a proper sequence of samples. When the
+sound reaches the termination time, simply return @code(NIL).
+
+The XLISP manual (see Appendix @ref(XLISP-app) describes the object system,
+but in a very terse style, so this example will include some explanation of
+how the object system is used. First, we need to define a class for the
+objects that will compute sound products. Every class is a subclass of class
+@code(class), and you create a subclass by sending @code(:new) to a class.
+@begin(example)
+(setf product-class (send class :new '(s1 s2)))
+@end(example)
+The parameter @code['(s1 s2)] says that the new class will have two instance
+variables, @code(s1) and @code(s2). In other words, every object which is an
+instance of class @code(product-class) will have its own copy of
+these two variables.
+
+Next, we will define the @code(:next) method for @code(product-class):
+@begin(example)
+(send product-class :answer :next '()
+ '((let ((f1 (snd-fetch s1))
+ (f2 (snd-fetch s2)))
+ (cond ((and f1 f2)
+ (* f1 f2))
+ (t nil)))))
+@end(example)
+The @code(:answer) message is used to insert a new method into our new
+@code(product-class). The method is described in three parts: the name
+(@code(:next)), a parameter list (empty in this case), and a list of
+expressions to be evaluated. In this case, we fetch samples from @code(s1)
+and @code(s2). If both are numbers, we return their product. If either is
+@code(NIL), we terminate the sound by returning @code(nil).
+
+The @code(:next) method assumes that @code(s1) and @code(s2) hold the sounds
+to be multiplied. These must be installed when the object is created.
+Objects are created by sending @code(:new) to a class. A new object is
+created, and any parameters passed to @code(:new) are then sent in a
+@code(:isnew) message to the new object. Here is the @code(:isnew)
+definition for @code(product-class):
+@begin(example)
+(send product-class :answer :isnew '(p1 p2)
+ '((setf s1 (snd-copy p1))
+ (setf s2 (snd-copy p2))))
+@end(example)
+Take careful note of the use of @code(snd-copy) in this initialization. The
+sounds @code(s1) and @code(s2) are modified when accessed by
+@code(snd-fetch) in the @code(:next) method defined above, but this destroys
+the illusion that sounds are immutable values. The solution is to copy the
+sounds before accessing them; the original sounds are therefore unchanged.
+(This copy also takes place implicitly in most Nyquist sound functions.)
+
+To make this code safer for general use, we should add checks that @code(s1)
+and @code(s2) are sounds with identical starting times and sample rates;
+otherwise, an incorrect result might be computed.
+
+Now we are ready to write @code(snd-product), an approximate replacement for
+@code(snd-prod):
+@begin(example)
+(defun snd-product (s1 s2)
+ (let (obj)
+ (setf obj (send product-class :new s1 s2))
+ (snd-fromobject (snd-t0 s1) (snd-srate s1) obj)))
+@end(example)
+This code first creates @code(obj), an instance of @code(product-class), to
+hold @code(s1) and @code(s2). Then, it uses @code(obj) to create a sound
+using @code(snd-fromobject). This sound is returned from
+@code(snd-product). Note that in @code(snd-fromobject), you must also
+specify the starting time and sample rate as the first two parameters. These
+are copied from @code(s1), again assuming that @code(s1) and @code(s2) have
+matching starting times and sample rates.
+
+Note that in more elaborate DSP algorithms we could expect the object to
+have a number of instance variables to hold things such as previous samples,
+waveform tables, and other parameters.
+
+@chapter(SAL)
+@label(SAL-chap)
+Nyquist supports two languages: XLISP and SAL. In some sense, XLISP and SAL
+are the same language, but with differing syntax. This chapter describes SAL: how it works, SAL syntax and semantics, and the relationship between SAL and XLISP, and differences between Nyquist SAL and Common Music SAL.
+
+Nyquist SAL is based on Rick Taube's SAL language, which is
+part of Common Music. SAL offers the power
+of Lisp but features a simple, Algol-like syntax. SAL is implemented
+in Lisp: Lisp code translates SAL into a Lisp program and uses the
+underlying Lisp engine to evaluate the program. Aside from the translation
+time, which is quite fast, SAL programs execute at about the same speed as
+the corresponding Lisp program. (Nyquist SAL programs run just
+ slightly slower than XLISP
+because of some runtime debugging support automatically added to
+user programs by the SAL compiler.)
+
+From the user's perspective, these implementation details are hidden. You
+can enter SAL mode from XLISP by typing @code[(SAL)] to the XLISP prompt.
+The SAL input prompt (@code(SAL> )) will be displayed. From that point on,
+you simply type SAL commands, and they will be executed. By setting a
+preference in the NyquistIDE program, SAL mode will be entered automatically.
+
+It is possible to encounter errors that will take you from the SAL interpreter
+to an XLISP prompt. In general, the way to get back to SAL is by typing
+@code[(top)] to get back to the top level XLISP interpreter and reset the
+Nyquist environment. Then type @code[(sal)] to restart the SAL interpreter.
+
+@section(SAL Syntax and Semantics)
+@index(SAL)
+ The most unusual feature of SAL syntax is that identifiers
+are Lisp-like, including names such as ``play-file'' and even ``*warp*.''
+In SAL, most operators must be separated from identifiers by white space.
+For example, @code(play-file) is one identifier, but @code(play - file)
+is an expression for ``play minus file,'' where @code(play) and @code(file) are
+two separate identifiers. Fortunately, no spaces are needed around commas
+and parentheses.
+
+In SAL, whitespace (any sequence of space, newline, or tab characters)
+is sometimes necessary to separate lexical tokens, but
+otherwise, spaces and indentation are ignored. To make SAL readable,
+it is @i(strongly) advised that you indent SAL programs as in the examples
+here. The NyquistIDE program is purposely insistent about SAL indentation,
+so if you use it to edit SAL programs, your indentation should be
+both beautiful and consistent.
+
+As in Lisp (but very unlike C or Java), comments @index(comments)
+are indicated by
+semicolons. Any text from an unquoted semicolon to the end of the
+line is ignored.
+
+@begin(example)
+@i(; this is a comment)
+@i(; comments are ignored by the compiler)
+print "Hello World" @i(; this is a SAL statement)
+@end(example)
+
+As in Lisp, identifiers are translated to upper-case, making SAL
+case-insensitive@index(case-insensitive). For example, the function name @code(autonorm) can
+be typed in lower case or as @code(AUTONORM), @code(AutoNorm), or even
+@code(AuToNoRm). All forms denote the same function. The recommended
+approach is to write programs in all lower case.
+
+SAL is organized around statements, most of which
+contain expressions. We will begin with expressions and then look at
+statements.
+
+@subsection(Expressions)
+@index(sal expressions)@index(expressions, sal)
+@paragraph(Simple Expressions)
+As in XLISP, simple expressions include:
+@begin(itemize)
+integers (FIXNUM's), such as @code(1215),
+
+floats (FLONUM's) such as @code(12.15),
+
+strings (STRING's) such as @code("Magna Carta"), and
+
+symbols (SYMBOL's) such as @code(magna-carta). A symbol with a leading colon
+(@code(:)) evaluates to itself as in Lisp. Otherwise, a symbol denotes either
+a local variable, a formal parameter, or a global variable. As in Lisp,
+variables do not have data types or type declarations. The type of a
+variable is determined at runtime by its value.
+@end(itemize)
+
+Additional simple expressions in SAL are:
+@begin(itemize)
+lists such as @code[{c 60 e 64}]. Note that there are no commas to separate list elements, and symbols in lists are not evaluated as variables but stand for themselves. Lists may contain numbers, booleans, symbols, strings, and other lists.
+
+Booleans: SAL interprets @code(#t)@index(#t) as true and @code(#f)@index(#f)
+as false. (As far
+as the SAL compiler is concerned, @code(t) and @code(nil) are just variables.
+Since these are the Lisp versions of true and false, they are interchangeable
+with @code(#t) and @code(#f), respectively.)
+@end(itemize)
+A curious property of Lisp and Sal is that @i(false) and the empty list are
+the same value. Since SAL is based on Lisp, @code(#f) and @code({}) (the empty
+list)@index(empty list) are equal.
+
+@paragraph(Operators)
+Expressions can be formed with unary and binary operators using infix notation. The operators are:
+@begin(itemize)
+@index(+)@code(+) - addition, including sounds
+
+@index(-)@code(-) - subtraction, including sounds
+
+@index(*)@code(*) - multiplication, including sounds
+
+@index(/)@code(/) - division (due to divide-by-zero problems, does not operate on sounds)
+
+@index(%)@code(%) - modulus (remainder after division)
+
+@index(^)@code(^) - exponentiation
+
+@index(=)@code(=) - equal (using Lisp @code(eql))
+
+@index(!=)@code(!=) - not equal
+
+@index(>)@code(>) - greater than
+
+@index(<)@code(<) - less than
+
+@index(>=)@code(>=) - greater than or equal
+
+@index(<=)@code(<=) - less than or equal
+
+@index(~=)@code(~=) - general equality (using Lisp @code(equal))
+
+@index(&)@code(&) - logical and
+
+@index(|)@code(|) - logical or
+
+@index(!)@code(!) - logical not (unary)
+
+@index(@@)@index(time shift, sal)@index(at, sal)@code(@@) - time shift
+
+@index(@@@@)@index(absolute time shift, sal)@index(at-abs, sal)@code(@@@@) - time shift to absolute time
+
+@index(~)@index(stretch, sal)@code(~) - time stretch
+
+@index(~~)@index(absolute stretch, sal)@code(~~) - time stretch to absolute stretch factor
+@end(itemize)
+Again, remember that operators @i(must) be delimited from their operands using
+spaces or parentheses. Operator precedence is based on the following levels of
+precedence:
+@begin(example)
+@@ @@@@ ~ ~~
+^
+/ *
+% - +
+~= <= >= > ~= =
+!
+&
+|
+@end(example)
+
+@paragraph(Function Calls)
+@index(function calls, sal)
+A function call is a function name followed by zero or more comma-delimited
+argument expressions
+enclosed within parentheses:
+@begin(example)
+list()
+piano-note(2.0, c4 + interval, 100)
+@end(example)
+Some functions use named parameters,
+in which case the name of the argument with a colon precedes the argument
+expression.
+@begin(example)
+s-save(my-snd(), ny:all, "tmp.wav", play: #t, bits: 16)
+@end(example)
+
+@paragraph(Array Notation)
+@index(array notation, sal)
+An array reference is a variable identifier followed by an index expression
+in square brackets, e.g.:
+@begin(example)
+x[23] + y[i]
+@end(example)
+
+@paragraph(Conditional Values)
+@index(conditional expression, sal)
+@index(#?, sal)
+The special operator @code(#?) evaluates the first argument expression.
+If the result is @i(true), the second expression is evaluated and
+its value is returned. If @i(false), the third expression is evaluated
+and returned (or @i(false) is returned if there is no third expression):
+@begin(example)
+#?(random(2) = 0, unison, major-third)
+#?(pitch >= c4, pitch - c4) ; returns false if pitch < c4
+@end(example)
+
+@subsection(SAL Statements)
+@index(statements, sal)
+SAL compiles and evaluates @i(statements) one at a time. You can type
+statements at the SAL prompt or load a file containing SAL statements.
+SAL statements are described below. The syntax is indicated at the
+beginning of each statement type description: @code(this font) indicates
+literal terms such as keywords, @i(the italic font) indicates a
+place-holder for some other statement or expression. Bracket [like this]
+indicate optional (zero or one) syntax elements, while braces with a plus
+{like this}+ indicate one or more occurrences of a syntax element. Braces
+with a star {like this}* indicate zero or more occurrences of a syntax element: { @i(non-terminal) }* is equivalent to [ {@i(non-terminal)}+ ].
+
+@paragraph(begin and end)
+@index(begin)@index(end)
+@code(begin) [@i(with-stmt)] {@i(statement)}+ @code(end)
+
+A @code(begin)-@code(end) statement
+consists of a sequence of statements surrounded by
+the @code(begin) and @code(end) keywords. This form is often used for function
+definitions and after @code(then) or @code(else) where the syntax demands a
+single statement but you want to perform more than one action. Variables may be
+declared using an optional @code(with) statement immediately after @code(begin).
+For example:
+@begin(example)
+begin
+ with db = 12.0,
+ linear = db-to-linear(db)
+ print db, "dB represents a factor of", linear
+ set scale-factor = linear
+end
+@end(example)
+
+@paragraph(chdir)
+@index(chdir, sal)
+@code(chdir) @i(expression)
+
+The @code(chdir) statement changes the working directory. This statement
+is provided for compatibility with Common Music SAL, but it really
+should be avoided if you use NyquistIDE. The @i(expression) following the
+@code(chdir) keyword should evaluate to a string that is a directory
+path name. Note that literal strings themselves are valid expressions.
+@begin(example)
+chdir "/Users/rbd/tmp"
+@end(example)
+
+@paragraph(define variable)
+@index(global variables, sal)@index(define variable)
+[@code(define)] @code(variable) @i(name) [= @i(expression)] {, @i(name) [= @i(expression)]}*
+
+Global variables can be declared and initialized. A list of variable names,
+each with an optional initialization follows the @code(define variable)
+keywords. (Since @code(variable) is a keyword, @code(define) is redundant
+and optional in Nyquist SAL, but required in Common Music SAL.)
+If the initialization part is omitted, the variable is initialized
+to false. Global variables do not really need to be declared: just using the
+name implicitly creates the corresponding variable. However, it is an error
+to use a global variable that has not been initialized;
+@code(define variable) is a good way to introduce a variable (or constant)
+with an initial value into your program.
+
+@begin(example)
+define variable transposition = 2,
+ print-debugging-info, @i(; initially false)
+ output-file-name = "salmon.wav"
+@end(example)
+
+@paragraph(define function)
+@index(function, sal)@index(define function)
+[@code(define)] @code(function) @i(name) @code[(] [@i(parameter)], {, @i(parameter)}* @code[)] @i(statement)
+
+Before a function be called from an expression (as described above), it must
+be defined. A function definition gives the function @i(name), a list of
+@i(parameters), and a @i(statement). When a function is called, the actual
+parameter expressions are evaluated from left to right and the formal parameters
+of the function definition are set to these values. Then, @i(statement) is
+evaluated.
+
+The formal parameters may be positional parameters that are matched with
+actual parameters by position from left to right. Syntactically, these are
+symbols and these symbols
+are essentially local variables that exist only until @i(statement) completes
+or a @code(return) statement causes the function evaluation to end. As in Lisp,
+parameters are passed by value, so assigning a new value to a formal parameter
+has no effect on the actual value. However, lists and arrays are not copied,
+so internal changes to a list or array produce observable side effects.
+
+Alternatively, formal parameters may be keyword parameters. Here the @i(parameter)
+is actually a pair: a keyword parameter, which is a symbol followed by a colon,
+and a default value, given by any expression. Within the body of the function,
+the keyword parameter is named by a symbol whose name matches the keyword
+parameter except there is no final colon.
+@begin(example)
+define function foo(x: 1, y: bar(2, 3))
+ display "foo", x, y
+
+exec foo(x: 6, y: 7)
+@end(example)
+In this example, @code(x) is bound to the value 6 and @code(y) is bound to
+the value 7, so the example prints ``@code(foo : X = 6, Y = 7)''. Note that
+while the keyword parameters are @code(x:) and @code(y:), the corresponding
+variable names in the function body are @code(x) and @code(y), respectively.
+
+The @i(parameters) are meaningful only within the lexical (static) scope of
+@i(statement). They are not accessible from within other
+functions even if they are called by this function.
+
+Use a @code(begin)-@code(end) statement if the body of the function should
+contain more than one statement or you need to define local variables. Use
+a @code(return) statement to return a value from the function. If @i(statement)
+completes without a @code(return), the value false is returned.
+
+@paragraph(display)
+@index(display statement, sal)
+@code(display) @i(string) {, @i(expression)}*
+
+The @code(display) statement is handy for debugging. At present, it is only
+implemented in Nyquist SAL. When executed, @code(display) prints the @i(string)
+followed by a colon and then, for each @i(expression), the expression and its
+value are printed, after the last expression, a newline is printed. For example,
+@begin(example)
+display "In function foo", bar, baz
+@end(example)
+prints
+@begin(example)
+In function foo : bar = 23, baz = 5.3
+@end(example)
+SAL may print the expressions using Lisp syntax, e.g. if the expression is
+``bar + baz,'' do not be surprised if the output is ``@code[(sum bar baz) = 28.3].''
+
+@paragraph(exec)
+@index(exec statement, sal)
+@code(exec) @i(expression)
+
+Unlike most other programming languages, you cannot simply type an expression as
+a statement. If you want to evaluate an expression, e.g. call a function,
+you must use an @code(exec) statement. The statement simply evaluates
+the @i(expression). For example,
+@begin(example)
+exec set-sound-srate(22050.0) @i(; change default sample rate)
+@end(example)
+
+@paragraph(if)
+@index(if statement, sal)
+@code(if) @i(test-expr) @code(then) @i(true-stmt) [@code(else) @i(false-stmt)]
+
+An @code(if) statement evaluates the expression @i(test-expr). If it is true,
+it evaluates the statement @i(true-stmt). If false, the statement
+@i(false-stmt) is evaluated. Use a @code(begin)-@code(end) statement
+to evaluate more than one statement in then @code(then) or @code(else)
+parts.
+
+@begin(example)
+if x < 0 then x = -x @i(; x gets its absoute value)
+
+if x > upper-bound then
+ begin
+ print "x too big, setting to", upper-bound
+ x = upper-bound
+ end
+else
+ if x < lower-bound then
+ begin
+ print "x too small, setting to", lower-bound
+ x = lower-bound
+ end
+@end(example)
+Notice in this example that the @code(else) part is another @code(if)
+statement. An @code(if) may also be the @code(then) part of another
+@code(if), so there could be two possible @code(if)'s with which to
+associate an @code(else). An @code(else) clause always associates
+with the closest previous @code(if) that does not already have an
+@code(else) clause.
+
+@paragraph(when)
+@code(when) @i(test) @i(statement)
+
+The @code(when) statement is similar to @code(if), but there is no @code(else) clause.
+
+@begin(example)
+when *debug-flag* print "you are here"
+@end(example)
+
+@paragraph(unless)
+@code(unless) @i(test) @i(statement)
+
+The @code(unless) statement is similar to @code(when) (and @code(if)) but the
+@i(statement) is executed when the @i(test) expression is @i(false).
+
+@begin(example)
+unless count = 0 set average = sum / count
+@end(example)
+
+@paragraph(load)
+@index(load statement, sal)
+@code(load) @i(expression)
+
+The @code(load) command loads a file named by @i(expression), which must
+evauate to a string path name for the file. To load a file, SAL interprets
+each statement in the file, stopping when the end of the file or an error
+is encountered. If the file ends in @code(.lsp), the file is assumed to
+contain Lisp expressions, which are evaluated by the XLISP interpreter.
+In general, SAL files should end with the extension @code(.sal).
+
+@paragraph(loop)
+@index(loop statement, sal)
+@code(loop) [@i(with-stmt)] {@i(stepping)}* {@i(stopping)* @i(action)+ [@i(finally)] @code(end)
+
+The @code(loop) statement is by far the most complex statement in SAL, but
+it offers great flexibility for just about any kind of iteration. The basic
+function of a loop is to repeatedly evaluate a sequence of @i(action)'s which
+are statements. Before the loop begins, local variables may be declared in
+@i(with-stmt), a @code(with) statement.
+
+The @i(stepping) clauses do several
+things. They introduce and initialize additional local variables similar
+to the @i(with-stmt).
+However, these local variables are updated to new values after the @i(action)'s.
+In addition, some @i(stepping) clauses have associated stopping conditions,
+which are tested on each iteration @i(before) evaluating the @i(action)'s.
+
+There are also @i(stopping) clauses that provide additional tests to
+stop the iteration. These are also evaluated and tested
+on each iteration before evaluating the @i(action)'s.
+
+When some @i(stepping) or @i(stopping) condition causes the iteration to stop,
+the @i(finally) clause is evaluated (if present). Local variables and their
+values can still be accessed in the @i(finally) clause. After the @i(finally)
+clause, the @code(loop) statement completes.
+
+The @i(stepping) clauses are the following:
+@begin(description)
+@code(repeat) @i(expression)@\Sets the number of iterations to the value of @i(expression), which should be an integer (FIXNUM).
+
+@code(for) @i(var) = @i(expression) [ @code(then) @i(expr2) ]@\Introduces a new local
+variable named @i(var) and initializes it to @i(expression). Before each subsequent
+iteration, @i(var) is set to the value of @i(expr2). If the @code(then) part is
+omitted, @i(expression) is re-evaluated and assigned to @i(var)
+on each subsequent iteration. Note that this differs from a @i(with-stmt) where
+expressions are evaluated and variables are only assigned their values once.
+
+@code(for) @i(var) @code(in) @i(expression)@\Evaluates @i(expression) to
+obtain a list and creates a new local variable initialized to the first element
+of the list. After each iteration, @i(var) is assigned the next element of the
+list. Iteration stops when @i(var) has assumed all values from the list. If the
+list is initially empty, the loop @i(action)'s are not evaluated (there are zero
+iterations).
+
+@code(for) @i(var) [@code(from) @i(from-expr)] [[@code(to) | @code(below) | @code(downto) | @code(above)] @i(to-expr)] [@code(by) @i(step-expr)]@\Introduces a new local variable named @i(var) and intialized
+to the value of the expression @i(from-expr) (with a default value of 0). After
+each iteration of the loop, @i(var) is incremented by the value
+of @i(step-expr) (with a default value of 1).
+The iteration ends when @i(var) is greater than
+the value of @i(to-expr) if there is a @code(to) clause,
+greater than or equal to the value of @i(to-expr)
+if there is a @code(below) clause,
+less than the value of @i(to-expr) if there is a @code(downto) clause,
+or less than or equal to the value of @i(to-expr) if there is a @code(above)
+clause. (In the cases of @i(downto) and @i(above), the default increment value
+is -1. If there
+is no @code(to), @code(below), @code(downto), @code(above), or @code(below) clause, no interation stop test is created for this
+stepping clause.
+@end(description)
+
+The @i(stopping) clauses are the following:
+@begin(description)
+@code(while) @i(expression)@\The iterations are stopped when @i(expression) evaluates to @i(false). Anything not false is considered to mean true.
+
+@code(until) @i(expression)@\The iterations are stopped when @i(expression) evaluates to @i(true).
+@end(description)
+
+The @i(finally) clause is defined as follows:
+@index(finally clause, sal)
+@begin(description)
+@code(finally) @i(statement)@\The @i(statement) is evaluated when one of the
+@i(stepping) or @i(stopping) clauses ends the loop. As always, @i(statement) may
+be a @code(begin)-@code(end) statement. If an @i(action) evaluates a @code(return)
+statement, the @code(finally) statement is not executed.
+@end(description)
+
+@index(loop examples, sal)Loops often fall into common patterns, such as iteratiing a fixed number of
+times, performing an operation on some range of integers, collecting results
+in a list, and linearly searching for a solution. These forms are illustrated
+in the examples below.
+
+@begin(example)
+@i(; iterate 10 times)
+loop
+ repeat 10
+ print random(100)
+end
+
+@i(; print even numbers from 10 to 20
+; note that 20 is printed. On the next iteration,
+; i = 22, so i >= 22, so the loop exits.)
+loop
+ for i from 10 to 22 by 2
+ print i
+end
+
+@i(; collect even numbers in a list)
+loop
+ with lis
+ for i = 0 to 10 by 2
+ set lis @@= i @i(; push integers on front of list,)
+ @i(; which is much faster than append,)
+ @i(; but list is built in reverse)
+ finally result = reverse(lis)
+end
+@i(; now, the variable result has a list of evens)
+
+@i(; find the first even number in a list)
+result = #f @i(; #f means "false")
+loop
+ for elem in lis
+ until evenp(elem)
+ finally result = elem
+end
+@i[; result has first even value in lis (or it is #f)]
+@end(example)
+
+@paragraph(print)
+@index(print statement, sal)
+@code(print) @i(expr) {, @i(expr)}*
+
+The @code(print) statement prints the values separated by
+spaces and followed by a newline. [Note that in the original
+SAL, the newline is printed @i(before) the values, not after.]
+
+
+@begin(example)
+print "The value of x is", x
+@end(example)
+
+@paragraph(return)
+@index(return statement, sal)
+@code(return) @i(expression)
+
+The @code(return) statement can only be used inside a function. It evaluates
+@i(expression) and then the function returns the value of the expression
+to its caller.
+
+@paragraph(set)
+@index(set statement, sal)
+@code(set) @i(var) @i(op) @i(expression) {, @i(var) @i(op) @i(expression)}*
+
+The @code(set) statement changes the value of a variable @i(var) according
+to the operator @i(op) and the value of the @i(expression). The operators are:
+@begin(description)
+@code(=)@\The value of @i(expression) is assigned to @i(var).
+
+@index(+=)@code(+=)@\The value of @i(expression) is added to @i(var).
+
+@index(*=)@code(*=)@\The value of @i(var) is multiplied by the value of the expression.
+
+@index(&=)@code(&=)@\The value of @i(expression) is inserted as the last element of
+the list referenced by @i(var). If @i(var) is the empty list (denoted by @code(#f)),
+then @i(var) is assigned a newly constructed list of one element, the value
+of @i(expression).
+
+@index(^=)@code(^=)@\The value of @i(expression), a list, is appended to the list referenced
+by @i(var). If @i(var) is the empty list (denoted by @code(#f)), then @i(var)
+is assigned the (list) value of @i(expression).
+
+@index(@@=)@code(@@=)@\Pushes the value of @i(expression) onto the front of the list
+referenced by @i(var). If @i(var) is empty (denoted by @code(#f)), then @i(var)
+is assigned a newly constructed list of one element, the value of @i(expression).
+
+@index(<=)@code(<=)@\Sets the new value of @i(var) to the minimum of the old value
+of @i(var) and the value of @i(expression).
+
+@index(>=)@code(>=)@\Sets the new value of @i(var) to the maximum of the old value
+of @i(var) and the value of @i(expression).
+@end(description)
+
+@begin(example)
+@i(; example from Rick Taube's SAL description)
+loop
+ with a, b = 0, c = 1, d = {}, e = {}, f = -1, g = 0
+ for i below 5
+ set a = i, b += 1, c *= 2, d &= i, e @@= i, f <= i, g >= i
+ finally display "results", a, b, c, d, e, f, g
+end
+@end(example)
+
+@paragraph(with)
+@index(with statement, sal)
+@code(with) @i(var) [= @i(expression)] {, @i(var) [= @i(expression)]}*
+
+The @code(with) statement declares and initializes local variables. It
+can appear only after @code(begin) or @code(loop). If the @i(expression) is
+omitted, the initial value is @i(false). The variables are visible only
+inside the @code(begin)-@code(end) or @code(loop) statement where the
+@code(with) statement appears. Even in @code(loop)'s the variables
+are intialized only when the loop is entered, not on each iteration.
+
+@paragraph(exit)
+@index(exit statement, sal)
+@code(exit) [@code(nyquist)]
+
+The @code(exit) statement is unique to Nyquist SAL. It returns from SAL
+mode to the XLISP interpreter. (Return to SAL mode by typing ``@code[(sal)]'').
+If @code(nyquist) is included in the statement, then the entire Nyquist
+process will exit.
+
+@section(Interoperability of SAL and XLISP)
+@index(sal and lisp)@index(interoperability, sal and lisp)
+@label(sal-vs-lisp-section)
+When SAL evaluatas command or loads files, it translates SAL into XLISP.
+You can think of SAL as a program that translates everything you write
+into XLISP and entering it for you. Thus, when you define a SAL function,
+the function actually exists as an XLISP function (created using
+Lisp's @code(defun) special form). When you set or evaluate global variables
+in SAL, these are exactly the same Lisp global variables. Thus, XLISP
+functions can call SAL functions and vice-versa. At run time,
+everything is Lisp.
+
+@subsection(Function Calls)
+In general, there is a very simple translation from SAL to Lisp syntax
+and back. A function call is SAL, for example,
+@begin(example)
+osc(g4, 2.0)
+@end(example)
+is translated to Lisp by moving the open parenthesis in front of the
+function name and removing the commas:
+@begin(example)
+(osc g4 2.0)
+@end(example)
+Similarly, if you want to translate a Lisp function call to SAL, just
+reverse the translation.
+
+@subsection(Symbols and Functions)
+SAL translates keywords with trailing colons (such as @code(foo:))
+into Lisp keywords with leading colons (such as @code(:foo)), but
+SAL keywords are not treated as expressions as they are in Lisp.
+You cannot write @code[open("myfile.txt", direction: output:)]
+because SAL expects an expression after direction. A special form
+@code(keyword) is defined to generate a Lisp keyword as an
+expression. The argument is the keyword @i(without) a colon, e.g.
+@code[open("myfile.txt", direction: keyword(output))]. Alternatively,
+you can write the Lisp-style keyword with the leading colon, e.g.
+@code[open("myfile.txt", direction: :output)].
+
+In Nyquist SAL, the hash character (#), can be used as a prefix to a
+Lisp function name. For example, the following command is not legal
+because @code(print) is a SAL command name, not a legal function name:
+@code[set v = append(print(a), print(b))]. (Here the intent is to print
+arguments to append). However, you can use the hash character to access
+the Lisp @code(print) function: @code[set v = append(#print(a), #print(b))].
+
+@subsection(Playing Tricks On the SAL Compiler)
+In many cases, the close coupling between SAL and XLISP gives SAL
+unexpected expressive power. A good example is @code(seqrep). This
+is a special looping construct in Nyquist, implemented as a macro in
+XLISP. In Lisp, you would write something like:
+@begin(example)
+(seqrep (i 10) (pluck c4))
+@end(example)
+One might expect SAL would have to define a special @code(seqrep)
+statement to express this, but since statements do not return values,
+this approach would be problematic. The solution (which is already
+fully implemented in Nyquist) is to define a
+new macro @code(sal-seqrep) that is equivalent to @code(seqrep)
+except that it is called as follows:
+@begin(example)
+(sal-seqrep i 10 (pluck c4))
+@end(example)
+The SAL compiler automatically translates the identifier @code(seqrep) to
+ @code(sal-seqrep). Now, in SAL, you can just write
+@begin(example)
+seqrep(i, 10, pluck(c4))
+@end(example)
+which is translated in a pretty much semantics-unaware fashion to
+@begin(example)
+(sal-seqrep i 10 (pluck c4))
+@end(example)
+and viola!, we have Nyquist control constructs in SAL even though SAL
+is completely unaware that @code(seqrep) is actually a special form.
+
+@chapter(Nyquist Functions)
+@label(lisp-chap)
+This chapter provides a language reference for Nyquist. Operations
+are categorized by functionality and abstraction level.
+Nyquist is implemented in two important levels: the ``high level'' supports
+behavioral abstraction, which means that operations like @code(stretch) and
+@code(at) can be applied. These functions are the ones that typical users
+are expected to use, and most of these functions are written in XLISP.
+
+The ``low-level'' primitives directly operate on sounds, but know nothing of
+environmental variables (such as @code(*warp*), etc.). The
+names of most of these low-level functions start with ``@code(snd-)''. In
+general, programmers should avoid any function with the ``@code(snd-)''
+prefix. Instead, use the ``high-level'' functions, which know about the
+environment and react appropriately. The names of high-level functions
+do not have prefixes like the low-level functions.
+
+There are certain low-level operations that apply directly to sounds (as
+opposed to behaviors) and are relatively ``safe'' for ordinary use. These
+are marked as such.
+
+Nyquist uses both linear frequency and equal-temperament pitch numbers to
+specify repetition rates. Frequency is always specified in either cycles
+per second (hz), or pitch numbers, also referred to as ``steps,'' as in
+steps of the chromatic scale. Steps are floating point numbers such that 60
+= Middle C, 61 = C#, 61.23 is C# plus 23 cents, etc. The mapping from pitch
+number to frequency is the standard exponential conversion, and fractional
+pitch numbers are allowed:
+@pragma(startscribe)
+@math[frequency = 440 @mult 2@+{(pitch - 69)/12}].
+@pragma(endscribe)
+@html[@center{frequency = 440 * 2^((pitch - 69)/12)}]
+There are many
+predefined pitch names. By default these are tuned in equal temperament,
+with A4 = 440Hz, but these may be changed. (See Section @ref(constants-sec)).
+
+@section(Sounds)@index(Sounds)
+A sound is a primitive data type in Nyquist. Sounds can be created, passed
+as parameters, garbage collected, printed, and set to variables just like
+strings, atoms, numbers, and other data types.
+
+@subsection(What is a Sound?)
+Sounds have 5 components:
+@begin(itemize)
+@code(srate@index(srate)) @itemsep the sample rate of the sound.
+
+@code(samples@index(samples)) @itemsep the samples.
+
+@code(signal-start@index(signal-start)) @itemsep the time of the first sample.
+
+@code(signal-stop@index(signal-stop)) @itemsep the time of one past the last sample.
+
+@code(logical-stop@index(logical-stop)) @itemsep the time at which the sound logically ends, e.g. a
+sound may end at the beginning of a decay. This value defaults
+to @code(signal-stop),
+but may be set to any value.
+@end(itemize)
+It may seem that there should be @code(logical-start) to indicate the
+logical or perceptual beginning of a sound as well as a @code(logical-stop)
+to indicate the logical ending of a sound. In practice, only
+@code(logical-stop) is needed; this attribute tells when the next sound
+should begin to form a sequence of sounds. In this respect, Nyquist sounds
+are asymmetric: it is possible to compute sequences forward in time by
+aligning the logical start of each sound with the @code(logical-stop) of the
+previous one, but one cannot compute ``backwards'', aligning the logical end
+of each sound with the logical start of its successor. The root of this
+asymmetry is the fact that when we invoke a behavior, we say when to start,
+and the result of the behavior tells us its logical duration. There is no
+way to invoke a behavior with a direct specification of when to
+stop@foot(Most behaviors will stop at time 1, warped according to @code(*warp*) to some real time, but this is by convention and is not a direct specification.).
+
+@p(Note:) there is no way to enforce the
+intended ``perceptual'' interpretation of
+@code(logical-stop). As far as Nyquist is concerned, these are just numbers to
+guide the alignment of sounds within various control constructs.
+
+@subsection(Multichannel Sounds)
+@index(Multichannel Sounds)
+Multichannel sounds are represented by Lisp arrays of sounds. To create an
+array of sounds the XLISP @code(vector) function is useful. Most low-level
+Nyquist functions (the ones starting with @code(snd-)) do not operate on
+multichannel sounds. Most high-level functions do operate on multichannel
+sounds.
+
+@subsection(Accessing and Creating Sound)
+@label(flatten-sec)
+@label(snd-srate-sec)
+
+Several functions display information concerning a sound and can be used to
+query the components of a sound. There are functions that access samples in
+a sound and functions that construct sounds from samples.
+
+@begin(fndefs)
+@codef[sref(@pragma(defn)@index(sref)@indexSecondary(primary="sound",
+secondary="accessing point")@i(sound), @i(time))] @c{[sal]}@*
+@altdef{@code[(sref @i(sound) @i(time))] @c{[lisp]}}@\Accesses @i(sound) at
+the point @i(time), which is a local time. If @i(time) does not
+correspond to a sample time, then the nearest samples are linearly
+interpolated to form the result. To access a particular sample, either
+convert the sound to an array (see @code(snd-samples) below), or use
+@code(snd-srate) and @code(snd-t0) (see below) to find the sample rate
+and starting time, and compute a time (@i(t)) from the sample number (@i(n)):
+@pragma(startscribe)
+@begin(math)
+t = (n / srate) + t0
+@end(math)
+@pragma(endscribe)
+@html[<blockquote>t = (n / srate) + t0</blockquote>]
+Thus, the lisp code to access the n@+(th) sample of a sound would look like:
+@begin(code)
+(sref sound (global-to-local (+ (/ n (snd-srate sound)) (snd-t0 sound))))
+@end(code)
+Here is why @code(sref) interprets its time argument as a local time:
+@begin(example)
+> (sref (ramp 1) 0.5) @i(; evaluate a ramp at time 0.5)
+0.5
+> (at 2.0 (sref (ramp 1) 0.5)) @i(; ramp is shifted to start at 2.0)
+ @i(; the time, 0.5, is shifted to 2.5)
+0.5
+@end(example)
+If you were to use @code(snd-sref), which treats time as global, instead of @code(sref), which treats time as local, then the first example above would return the same answer (0.5), but the second example would return 0. Why? Because the @code[(ramp 1)] behavior would be shifted to start at time 2.0, but the resulting sound would be evaluated at global time 0.5. By definition, sounds have a value of zero before their start time.
+
+@codef[sref-inverse(@pragma(defn)@index(sref-inverse)@i(sound), @i(value))] @c{[sal]}@*
+@altdef{@code[(sref-inverse @i(sound) @i(value))] @c{[lisp]}}@\Search @i(sound) for the first point at which it achieves @i(value) and return the corresponding (linearly interpolated) time. If no inverse exists, an error is raised. This function is used by Nyquist in the implementation of time warping.
+
+@label(snd-from-array-sec)
+@codef[snd-from-array(@IndexSecondary(primary="sound",
+ secondary = "creating from array")@pragma(defn)@index(snd-from-array)@i(t0), @i(sr),
+@i(array))] @c{[sal]}@*
+@altdef{@code[(snd-from-array @i(t0) @i(sr) @i(array))] @c{[lisp]}}@\Converts a lisp array of @code(FLONUM)s into a sound with starting
+time @i(t0) and sample rate @i(sr). Safe for ordinary use. Be aware that
+arrays of floating-point samples use 14 bytes per sample, and an additional
+4 bytes per sample are allocated by this function to create a sound type.
+
+@codef[snd-fromarraystream(@pragma(defn)@index(snd-fromarraystream)@i(t0), @i(sr), @i(object))] @c{[sal]}@*
+@altdef{@code[(snd-fromarraystream @i(t0) @i(sr) @i(object))] @c{[lisp]}}@\Creates a sound for which samples come from
+@i(object). The starting time is @i(t0) (a @code(FLONUM)), and the sample rate is
+@i(sr). The @i(object) is an XLISP object (see Section @ref(objects-sec) for
+information on objects.) A sound is returned. When the sound needs samples,
+they are generated by sending the message @code(:next) to @i(object). If
+@i(object) returns @code(NIL), the sound terminates. Otherwise, @i(object)
+must return an array of @code(FLONUM)s. The values in these arrays are
+concatenated to form the samples of the resulting sound.
+There is no provision for @i(object) to specify the
+logical stop time of the sound, so the logical stop time is the termination
+time.
+
+@codef[snd-fromobject(@pragma(defn)@index(snd-fromobject)@index(sound from Lisp data)@i(t0), @i(sr), @i(object))] @c{[sal]}@*
+@altdef{@code[(snd-fromobject @i(t0) @i(sr) @i(object))] @c{[lisp]}}@\Creates a sound for which samples come from
+@i(object). The starting time is @i(t0) (a @code(FLONUM)), and the sample rate is
+@i(sr). The @i(object) is an XLISP object (see Section @ref(objects-sec) for
+information on objects. A sound is returned. When the sound needs samples,
+they are generated by sending the message @code(:next) to @i(object). If
+@i(object) returns @code(NIL), the sound terminates. Otherwise, @i(object)
+must return a @code(FLONUM). There is no provision for @i(object) to specify the
+logical stop time of the sound, so the logical stop time is the termination
+time.
+
+@codef[snd-extent(@pragma(defn)@index(snd-extent)@i(sound), @i(maxsamples))] @c{[sal]}@*
+@altdef{@code[(snd-extent @i(sound) @i(maxsamples))] @c{[lisp]}}@\Returns a list of two numbers: the starting time of @i(sound) and the terminate time of @i(sound). Finding the terminate time requires that samples be computed. Like most Nyquist functions, this is non-destructive, so memory will be allocated to preserve the sound samples. If the sound is very long or infinite, this may exhaust all memory, so the @i(maxsamples) parameter specifies a limit on how many samples to compute. If this limit is reached, the terminate time will be (incorrectly) based on the sound having @i(maxsamples) samples. This function is safe for ordinary use.
+
+@codef[snd-fetch(@index(access samples)@index(samples,
+reading)@pragma(defn)@index(snd-fetch)@index(read samples)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-fetch @i(sound))] @c{[lisp]}}@\Reads samples
+sequentially from @i(sound). This returns a @code(FLONUM) after each call, or
+@code(NIL) when @i(sound) terminates. @p(Note:) @code(snd-fetch) modifies
+@i(sound); it is strongly recommended to copy @i(sound) using
+@code(snd-copy) and access only the copy with @code(snd-fetch).
+
+@codef[snd-fetch-array(@pragma(defn)@index(snd-fetch-array)@i(sound), @i(len),
+@i(step))] @c{[sal]}@*
+@altdef{@code[(snd-fetch-array @i(sound) @i(len) @i(step))]
+@c{[lisp]}}@\Reads
+sequential arrays of samples from @i(sound), returning either an array
+of @code(FLONUM)s or @code(NIL) when the sound terminates. The @i(len)
+parameter, a @code(FIXNUM), indicates how many samples should be
+returned in the result array. After the array is returned, @i(sound)
+is modified by skipping over @i(step) (a @code(FIXNUM)) samples. If
+@i(step) equals @i(len), then every sample is returned once. If
+@i(step) is less than @i(len), each returned array will overlap the
+previous one, so some samples will be returned more than once. If
+@i(step) is greater than @i(len), then some samples will be skipped
+and not returned in any array. The @i(step) and @i(len) may change at
+each call, but in the current implementation, an internal buffer is
+allocated for @i(sound) on the first call, so subsequent calls may not
+specify a greater @i(len) than the first. When an array is returned,
+it will have @i(len) samples. If necessary, @code(snd-fetch-array)
+will read zeros beyond the end of the sound to fill the array. When
+this happens, @code(*rslt*) is set to a FIXNUM number of samples in
+the array that were read from the sound before the physical stop time
+of the sound. If all samples in the array are ``valid'' samples from
+the sound (coming from the sound before the sound
+terminates), @code(*rslt*) is set to @code(NIL). The @code(*rslt*)
+variable is global and used to return extra results from other
+functions, so programs should not assume @code(*rslt*) is valid after
+subsequent function calls. @p(Note:) @code(snd-fetch-array) modifies
+@i(sound); it is strongly recommended to copy @i(sound) using
+@code(snd-copy) and access only the copy with @code(snd-fetch-array).
+
+@codef[snd-flatten(@pragma(defn)@index(snd-flatten)@i(sound), @i(maxlen))] @c{[sal]}@*
+@altdef{@code[(snd-flatten @i(sound) @i(maxlen))] @c{[lisp]}}@\This function is identical
+to @code(snd-length). You would use this function to force samples to be computed in memory. Normally, this is not a good thing to do, but here is one appropriate use: In the case of sounds intended for wavetables, the unevaluated
+sound may be larger than the evaluated (and typically short) one.
+Calling @code(snd-flatten) will compute the samples and allow the unit generators to be freed in the next garbage collection. @p(Note:) If a sound is computed from many instances of table-lookup oscillators, calling @code(snd-flatten) will free the oscillators and their tables. Calling @code[(stats)] will print how many total bytes have been allocated to tables.
+
+ @codef[snd-length(@pragma(defn)@index(snd-length)@i(sound), @i(maxlen))] @c{[sal]}@*
+@altdef{@code[(snd-length @i(sound) @i(maxlen))] @c{[lisp]}}@\Counts the
+number of samples in @i(sound) up to the physical stop time. If the sound
+has more than @i(maxlen) samples, @i(maxlen) is returned. Calling this
+function will cause all samples of the sound to be computed and saved in
+memory (about 4 bytes per sample). Otherwise, this function is safe for ordinary use.
+
+ @codef[snd-maxsamp(@pragma(defn)@index(snd-maxsamp)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-maxsamp @i(sound))] @c{[lisp]}}@\Computes the maximum of
+the absolute value of the samples in @i(sound). Calling this function will
+cause samples to be computed and saved in memory. (This function should
+have a @i(maxlen) parameter to allow self-defense against sounds that would
+exhaust available memory.) Otherwise, this function is safe for ordinary use.
+This function will probably be removed in a future version. See @code(peak), a replacement (@pragma(startref) page @pageref(peak-sec)).
+
+
+ @codef[snd-play(@pragma(defn)@index(snd-play)@i(expression))] @c{[sal]}@*
+@altdef{@code[(snd-play @i(expression))] @c{[lisp]}}@\Evaluates @i(expression)
+to obtain a sound or array of sounds, computes all of the samples (without
+retaining them in memory), and returns. Originally, this was a placeholder
+for a facility to play samples directly to an audio output device, but
+playback is now accomplished by @code(s-save).
+Meanwhile, since this
+function does not save samples in memory or write them to a disk, it is
+useful in determining how much time is spent calculating samples. See
+@code(s-save) (Section @ref(s-save-sec)) for saving samples to a file, and
+ @code(play) (Section @ref(play-sec)) to play a sound. This function is
+safe for ordinary use.
+
+@codef[snd-print-tree(@pragma(defn)@index(snd-print-tree)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-print-tree @i(sound))] @c{[lisp]}}@\Prints an ascii
+representation of the internal data structures representing a sound. This
+is useful for debugging Nyquist. This function is
+safe for ordinary use.
+
+ @codef[snd-samples(@index(samples)@pragma(defn)@index(snd-samples)@index(array from sound)@index(convert sound to array)@i(sound), @i(limit))] @c{[sal]}@*
+@altdef{@code[(snd-samples @i(sound) @i(limit))] @c{[lisp]}}@\Converts the
+samples into a lisp array. The data is taken directly from the samples,
+ignoring shifts. For example, if the sound starts at 3.0 seconds, the first
+sample will refer to time 3.0, not time 0.0. A maximum of @i(limit) samples
+is returned. This function is safe for ordinary use, but like
+@code(snd-from-array), it requires a total of slightly over 18 bytes per
+sample.
+
+ @codef[snd-srate(@pragma(defn)@index(snd-srate)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-srate @i(sound))] @c{[lisp]}}@\Returns the sample rate of
+the sound. Safe for ordinary use.
+
+@begin(comment)
+ @codef[snd-show(@pragma(defn)@index(snd-show)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-show @i(sound))] @c{[lisp]}}@\Print the entire (internal)
+structure of the sound for debugging. Safe for ordinary use.
+@end(comment)
+
+@codef[snd-time(@pragma(defn)@index(snd-time)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-time @i(sound))] @c{[lisp]}}@\Returns the start time of the
+sound. This will probably go away in a future version, so use @code(snd-t0)
+instead.
+
+@codef[snd-t0(@pragma(defn)@index(snd-t0)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-t0 @i(sound))] @c{[lisp]}}@\Returns the time of the
+first sample of the sound. Note that Nyquist operators such as add always
+copy the sound and are allowed to shift the copy up to one half sample
+period in either direction to align the samples of two operands. Safe for
+ordinary use.
+
+@codef[snd-print(@pragma(defn)@index(snd-print)@i(expression), @i(maxlen))] @c{[sal]}@*
+@altdef{@code[(snd-print @i(expression) @i(maxlen))] @c{[lisp]}}@\Evaluates
+@i(expression) to yield a sound or an array of sounds, then prints up to
+@i(maxlen) samples to the screen (stdout). This is similar to
+@code(snd-save), but samples appear in text on the screen instead of in
+binary in a file. This function is intended for debugging@index(debugging).
+Safe for ordinary use.
+
+ @codef[snd-set-logical-stop(@pragma(defn)@index(snd-set-logical-stop)@i(sound),
+@i(time))] @c{[sal]}@*
+@altdef{@code[(snd-set-logical-stop @i(sound) @i(time))] @c{[lisp]}}@\Returns a sound which is
+@i(sound), except that the logical stop of the sound occurs at @i(time).
+ @p(Note:) do not call this function. When defining a behavior, use
+@code(set-logical-stop) or @code(set-logical-stop-abs) instead.
+
+@codef[snd-sref(@pragma(defn)@index(snd-sref)@i(sound), @i(time))] @c{[sal]}@*
+@altdef{@code[(snd-sref @i(sound) @i(time))] @c{[lisp]}}@\Evaluates @i(sound)
+at the global time given by @i(time). Safe for ordinary use, but normally, you should
+call @code(sref) instead.
+
+ @codef[snd-stop-time(@pragma(defn)@index(snd-stop-time)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-stop-time @i(sound))] @c{[lisp]}}@\Returns the stop time of @i(sound).
+Sounds can be ``clipped'' or truncated at a particular time. This function
+returns that time or MAX-STOP-TIME if he programmer has not specified a stop
+time for the sound. Safe for ordinary use.
+
+@codef[soundp(@pragma(defn)@index(soundp)@i(sound))] @c{[sal]}@*
+@altdef{@code[(soundp @i(sound))] @c{[lisp]}}@\Returns true iff @i(sound) is a
+SOUND. Safe for ordinary use.
+
+@codef[stats(@pragma(defn)@index(stats)@index(memory
+usage)@index(table memory))] @c{[sal]}@*
+@altdef{@code[(stats)] @c{[lisp]}}@\Prints the memory usage status.
+See also the
+XLISP @code(mem) function. Safe for ordinary use. This is the only way to find out how much memory is being used by table-lookup oscillator instances.
+
+@end(fndefs)
+
+@subsection(Miscellaneous Functions)
+These are all safe and recommended for ordinary use.
+
+@begin(fndefs)
+@codef[db-to-linear(@pragma(defn)@index(db-to-linear)@i(x))] @c{[sal]}@*
+@altdef{@code[(db-to-linear @i(x))] @c{[lisp]}}@\Returns the conversion of @i(x) from decibels to linear. 0dB is converted to 1. 20dB represents a linear factor of 10. If @i(x) is a sound, each sample is converted and a sound is returned. If @i(x) is a multichannel sound, each channel is converted and a multichannel sound (array) is returned. @p(Note:) With sounds, conversion is only performed on actual samples, not on the implicit zeros before the beginning and after the termination of the sound. Sample rates, start times, etc. are taken from @i(x).
+
+@codef[follow(@pragma(defn)@index(follow)@index(envelope follower)@index(compressor)@index(limiter)@i(sound), @i(floor), @i(risetime), @i(falltime), @i(lookahead))] @c{[sal]}@*
+@altdef{@code[(follow @i(sound) @i(floor) @i(risetime) @i(falltime) @i(lookahead))] @c{[lisp]}}@\An envelope follower intended as a commponent for compressor and limiter functions. The basic goal of this function is to generate a smooth signal
+that rides on the peaks of the input signal. The usual objective is to
+produce an amplitude envelope given a low-sample rate (control rate)
+signal representing local RMS measurements. The first argument is the
+input signal. The @i(floor) is the minimum output value. The @i(risetime)
+is the time (in seconds) it takes for the output to rise (exponentially)
+from @i(floor) to unity (1.0) and the @i(falltime) is the time it takes
+for the output to fall (exponentially) from unity to @i(floor). The
+algorithm looks ahead for peaks and will begin to increase the output
+signal according to @i(risetime) in anticipation of a peak. The amount
+of anticipation (in seconds) is given by @i(lookahead). The algorithm
+is as follows: the output value is allowed to increase according to
+@i(risetime) or decrease according to @i(falltime). If the next input
+sample is in this range, that sample is simply output as the next output
+sample. If the next input sample is too large, the algorithm goes back in
+time as far as necessary to compute an envelope that rises according to
+@i(risetime) to meet the new value. The algorithm will only work backward
+as far as @i(lookahead). If that is not far enough, then there is a final
+forward pass computing a rising signal from the earliest output sample. In
+this case, the output signal will be at least momentarily less than the
+input signal and will continue to rise exponentially until it intersects
+the input signal. If the input signal falls faster than indicated by
+@i(falltime), the output fall rate will be limited by @i(falltime),
+and the fall in output will stop when the output reaches @i(floor).
+This algorithm can make two passes througth the buffer on sharply rising
+inputs, so it is not particularly fast. With short buffers and low sample
+rates this should not matter. See @code(snd-avg) for a function that
+can help to generate a low-sample-rate input for @code(follow).
+See @code(snd-chase) in Section @ref(snd-chase-sec) for a related filter.
+
+@label(gate-sec)
+@codef[gate(@pragma(defn)@index(gate)@index(noise-gate)@i(sound),
+@i(lookahead), @i(risetime), @i(falltime), @i(floor),
+@i(threshold))] @c{[sal]}@*
+@altdef{@code[(gate @i(sound) @i(lookahead) @i(risetime) @i(falltime) @i(floor) @i(threshold))] @c{[lisp]}}@\Generate an exponential rise and decay intended
+for noise gate implementation. The decay starts when the signal drops
+below @i(threshold) and stays there for longer than @i(lookahead) (a
+@code(FLONUM) in seconds). (The signal begins to drop when the signal
+crosses @i(threshold), not after @i(lookahead).) Decay continues until
+the value reaches @i(floor) (a @code(FLONUM)), at which point the decay
+stops and the output value is held constant. Either during the decay or
+after the floor is reached, if the signal goes above @i(threshold), then
+the ouptut value will rise to unity (1.0) at the point the signal crosses
+the threshold. Because of internal lookahead, the signal actually begins
+to rise before the signal crosses @i(threshold). The rise is a
+constant-rate exponential and set so that a rise from @i(floor) to unity
+occurs in @i(risetime). Similary, the fall is a constant-rate exponential
+such that a fall from unity to @i(floor) takes @i(falltime).
+
+@codef[hz-to-step(@pragma(defn)@index(hz-to-step)@i(freq))] @c{[sal]}@*
+@altdef{@code[(hz-to-step @i(freq))] @c{[lisp]}}@\Returns a step number for @i(freq) (in hz), which can be either a number of a @code(SOUND). The result has the same type as the argument. See also @code(step-to-hz) (below).
+
+@codef[linear-to-db(@pragma(defn)@index(linear-to-db)@i(x))] @c{[sal]}@*
+@altdef{@code[(linear-to-db @i(x))] @c{[lisp]}}@\Returns the conversion of @i(x) from linear to decibels. 1 is converted to 0. 0 is converted to -INF (a special IEEE floating point value.) A factor of 10 represents a 20dB change. If @i(x) is a sound, each sample is converted and a sound is returned. If @i(x) is a multichannel sound, each channel is converted and a multichannel sound (array) is returned. @p(Note:) With sounds, conversion is only performed on actual samples, not on the implicit zeros before the beginning and after the termination of the sound. Start times, sample rates, etc. are taken from @i(x).
+
+@codef[log(@index(log function)@pragma(defn)@index(log)@i(x))] @c{[sal]}@*
+@altdef{@code[(log @i(x))] @c{[lisp]}}@\Calculates the natural log of @i(x) (a @code(FLONUM)). (See @code(s-log) for a version that operates on signals.)
+
+@codef[set-control-srate(@pragma(defn)@index(set-control-srate)@index(sampling rate)@i(rate))] @c{[sal]}@*
+@altdef{@code[(set-control-srate @i(rate))] @c{[lisp]}}@\Sets the default sampling rate for control signals to @i(rate) by setting @code(*default-control-srate*) and reinitializing the environment. Do not call this within any synthesis function (see the @code(control-srate-abs) transformation, Section @ref(control-srate-abs-sec)).
+
+@codef[set-sound-srate(@pragma(defn)@index(set-sound-srate)@index(sampling rate)@i(rate))] @c{[sal]}@*
+@altdef{@code[(set-sound-srate @i(rate))] @c{[lisp]}}@\Sets the default sampling rate for audio signals to @i(rate) by setting @code(*default-sound-srate*) and reinitializing the environment. Do not call this within any synthesis function (see the @code(sound-srate-abs) transformation, Section @ref(sound-srate-abs-sec)).
+
+@codef[set-pitch-names(@pragma(defn)@index(set-pitch-names))] @c{[sal]}@*
+@altdef{@code[(set-pitch-names)] @c{[lis]}}@\Initializes pitch
+variables (@code(c0), @code(cs0), @code(df0), @code(d0), ... @code(b0),
+ @code(c1), ... @code(b7)). A440 (the default tuning) is represented by
+ the step 69.0, so the variable @code(a4) (fourth octave A) is set to 69.0.
+You can change the tuning by
+setting @code(*A4-Hertz*)@index(tuning)@index(A440)@index(*A4-Hertz*) to a
+value (in Hertz) and calling @code(set-pitch-names) to reinitialize the pitch
+variables. Note that this will result in non-integer step values. It does not
+alter the mapping from step values to frequency. There is no built-in
+provision for stretched scales or non-equal temperament, although users
+can write or compute any desired fractional step values.
+
+ @codef[step-to-hz(@pragma(defn)@index(step-to-hz)@i(pitch))] @c{[sal]}@*
+@altdef{@code[(step-to-hz @i(pitch))] @c{[lisp]}}@\Returns a frequency in hz
+for @i(pitch), a step number or a @code(SOUND) type representing a time-varying step number. The result is a @code(FLONUM) if @i(pitch) is a number, and a @code(SOUND) if @i(pitch) is a @code(SOUND). See also @code(hz-to-step) (above).
+
+
+@codef{get-duration(@pragma(defn)@index(get-duration)@i(dur))} @c{[sal]}@*
+@altdef{@code[(get-duration @i(dur))] @c{[lisp]}}@\Gets the actual duration of of something starting at a local time of 0 and ending at a local time of @i(dur) times the current sustain. For convenience, @code(*rslt*) is set to the global time corresponding to local time zero.
+
+@codef{get-loud(@pragma(defn)@index(get-loud))} @c{[sal]}@*
+@altdef{@code[(get-loud)] @c{[lisp]}}@\Gets the current value of the @code(*loud*) environment variable. If @code(*loud*) is a signal, it is evaluated at local time 0 and a number (@code(FLONUM)) is returned.
+
+@codef{get-sustain(@pragma(defn)@index(get-sustain))} @c{[sal]}@*
+@altdef{@code[(get-sustain)] @c{[lisp]}}@\Gets the current value of the @code(*sustain*) environment variable. If @code(*sustain*) is a signal, it is evaluated at local time 0 and a number (@code(FLONUM)) is returned.
+
+@codef{get-transpose(@pragma(defn)@index(get-transpose))} @c{[sal]}@*
+@altdef{@code[(get-transpose)] @c{[lisp]}}@\Gets the current value of the @code(*transpose*) environment variable. If @code(*transpose*) is a signal, it is evaluated at local time 0 and a number (@code(FLONUM)) is returned.
+
+@codef{get-warp(@pragma(defn)@index(get-warp))} @c{[sal]}@*
+@altdef{@code[(get-warp)] @c{[lisp]}}@\Gets a function corresponding to
+the current value of the @code(*warp*) environment variable. For
+efficiency, @code(*warp*) is stored in three parts representing a shift,
+ a scale factor, and a continuous warp function. @code(Get-warp) is used
+ to retrieve a signal that maps logical time to real time. This signal
+combines the information of all three components of @code(*warp*) into
+a single signal. If the continuous warp function component is not present
+ (indicating that the time warp is a simple combination of @code(at)
+ and @code(stretch) transformations), an error is raised. This
+function is mainly for internal system use. In the future,
+ @code(get-warp) will probably be reimplemented to always return
+ a signal and never raise an error.
+
+@CODEF{LOCAL-to-global(@pragma(defn)@index(local-to-global)@i(local-time))} @c{[sal]}@*
+@altdef{@code[(local-to-global @i(local-time))] @c{[lisp]}}@\Converts a score (local) time to a real (global) time according to the current environment.
+
+@codef{osc-enable(@pragma(defn)@index(osc-enable)@index(osc)@index(open sound control)@i(flag))} @c{[sal]}@*
+@altdef{@code[(osc-enable @i(flag))] @c{[lisp]}}@\Enable or disable Open Sound Control.
+(See Appendix @ref(osc-app).)
+Enabling creates a socket and a service that listens for UDP
+packets on port 7770. Currently, only two messages are accepted
+by Nyquist. The first is of the form @code(/slider)
+with an integer index and a floating point value. These set internal
+slider values accessed by the @code(snd-slider)
+function. The second is of the form @code(/wii/orientation) with
+two floating point values. This message is a special case to
+support the DarwiinRemoteOsc@index(DarwiinRemoteOsc) program
+ which can relay data from
+a Nintendo@index(Nintendo WiiMote) WiiMote@index(Wii Controller)
+ device to Nyquist via OSC. The two orientation
+values control sliders 0 and 1.
+Disabling terminates the service (polling for messages)
+and closes the socket. The @i(previous) state of enablement
+is returned, e.g. if OSC is enabled and @i(flag) is @i(nil),
+OSC is disabled and @code(T) (true) is returned because OSC
+was enabled at the time of the call. This function only exists
+if Nyquist is compiled with the compiler flag @code(OSC).
+Otherwise, the function
+exists but always returns the symbol @code(DISABLED). Consider
+lowering the audio latency using @code(snd-set-latency).
+@i(Warning:) there is the potential for
+network-based attacks using OSC. It is tempting to add the
+ability to evaluate XLISP expressions sent via OSC, but
+this would create
+unlimited and unprotected access to OSC clients. For now,
+it is unlikely that an attacker could do more than
+manipulate slider values.
+
+@codef{snd-set-latency(@index(latency)@pragma(defn)@index(snd-set-latency)@i(latency))} @c{[sal]}@*
+@altdef{@code[(snd-set-latency @i(latency))] @c{[lisp]}}@\Set the latency requested when Nyquist plays sound to
+ @i(latency), a @code(FLONUM). The previous value is returned. The default is 0.3 seconds. To avoid glitches, the latency should be
+greater than the time required for garbage collection and message printing and any other system activity external to Nyquist.
+@end(fndefs)
+
+@section(Behaviors)@index(Behaviors)
+@label(behavior-sec)
+
+@subsection(Using Previously Created Sounds)
+@label(use-sounds-sec)
+These behaviors take a sound and transform that sound according to the
+environment. These are useful when writing code to make
+a high-level function from a low-level function, or when cuing sounds
+which were previously created:
+@begin(fndefs)
+@codef[cue(@pragma(defn)@index(cue)@i(sound))] @c{[sal]}@*
+@altdef{@code[(cue @i(sound))] @c{[lisp]}}@\Applies @code(*loud*), the starting time from @code(*warp*), @code(*start*),
+ and @code(*stop*) to @i(sound).
+
+@codef[cue-file(@pragma(defn)@index(cue-file)@i(filename))] @c{[sal]}@*
+@altdef{@code[(cue-file @i(filename))] @c{[lisp]}}@\Same as @code(cue), except
+the sound comes from the named file, samples from which are coerced to the current default @code(*sound-srate*) sample rate.
+
+@codef[sound(@pragma(defn)@index(sound)@i(sound))] @c{[sal]}@*
+@altdef{@code[(sound @i(sound))] @c{[lisp]}}@\Applies @code(*loud*), @code(*warp*),
+@code(*start*), and @code(*stop*) to @i(sound).
+
+@codef[control(@pragma(defn)@index(control)@i(sound))] @c{[sal]}@*
+@altdef{@code[(control @i(sound))] @c{[lisp]}}@\This function is identical to
+@code(sound), but by convention is used when @i(sound) is a control signal
+rather than an audio signal.
+@end(fndefs)
+
+@subsection(Sound Synthesis)
+
+These functions provide musically interesting creation behaviors that
+react to their environment; these are the ``unit generators'' of Nyquist:
+
+@begin(fndefs)
+@codef{const(@pragma(defn)@index(const)@index(constant function)@i(value) [, @i(duration)])} @c{[sal]}@*
+@altdef{@code{(const @i(value) [@i(duration)])} @c{[lisp]}}@\Creates a constant function at the @code(*control-srate*). Every sample has the given @i(value), and the default @i(duration) is 1.0. See also @code(s-rest), which is equivalent to calling @code(const) with zero, and note that you can pass scalar constants (numbers) to @code(sim), @code(sum), and @code(mult) where they are handled more efficiently than constant functions.
+
+@codef{env(@pragma(defn)@index(env)@i(t@-[1]), @i(t@-[2]), @i(t@-[4]), @i(l@-[1]), @i(l@-[2]), @i(l@-[3]),
+[@i(dur)])} @c{[sal]}@*
+@altdef{@code[(env @i(t@-[1]) @i(t@-[2]) @i(t@-[4]) @i(l@-[1]) @i(l@-[2]) @i(l@-[3]) @i(dur))] @c{[lisp]}}@\Creates a 4-phase envelope.
+@i(t@-[@i(i)]) is the duration of phase @i(i), and @i(l@-[@i(i)])
+is the final level of phase @i(i). @i(t@-[3]) is implied by the duration
+@i(dur), and @i(l@-[4]) is @code(0.0). If @i(dur) is not supplied, then
+@code(1.0) is assumed. The envelope duration is the product of @i(dur),
+@code(*stretch*), and @code(*sustain*). If
+@i(t@-[1]) + @i(t@-[2]) + 2ms + @i(t@-[4]) is greater than the envelope
+duration, then a two-phase envelope is
+substituted that has an attack/release time ratio of @i(t@-[1])/@i(t@-[4]).
+The sample rate of the returned sound is @code(*control-srate*). (See
+@code(pwl) for a more general piece-wise linear function generator.)
+The effect of time warping is to warp the starting time and ending time.
+The intermediate breakpoints are then computed as described above.
+
+
+@codef{exp-dec(@pragma(defn)@index(exp-dec)@index(exponential envelope)@i(hold), @i(halfdec), @i(length))} @c{[sal]}@*
+@altdef{@code[(exp-dec @i(hold) @i(halfdec) @i(length))] @c{[lisp]}}@\This convenient envelope shape is a special case of @code(pwev) (see Section @ref(pwev-sec)). The envelope starts at 1 and is constant for @i(hold) seconds. It then decays with a half life of @i(halfdec) seconds until @i(length). (The total duration is @i(length).) In other words, the amplitude falls by half each @i(halfdec) seconds. When stretched, this envelope scales linearly, which means the hold time increases and the half decay time increases.
+
+
+@label(force-srate-sec)
+@codef{force-srate(@pragma(defn)@index(force-srate)@index(sample rate, forcing)@index(resampling)@i(srate), @i(sound))} @c{[sal]}@*
+@altdef{@code[(force-srate @i(srate) @i(sound))] @c{[lisp]}}@\Returns a sound which is up- or
+down-sampled to @i(srate). Interpolation is linear, and no prefiltering is
+applied in the down-sample case, so aliasing may occur. See also
+@code(resample).
+
+
+@codef{lfo(@pragma(defn)@index(lfo)@index(low-frequency oscillator)@i(freq) [, @i(duration), @i(table), @i(phase)])} @c{[sal]}@*
+@altdef{@code[(lfo @i(freq) @i(duration) @i(table) @i(phase))] @c{[lisp]}}@\Just
+like @code(osc) (below)
+except this computes at the @code(*control-srate*) and frequency
+is specified in Hz. Phase is specified in degrees.
+ The @code(*transpose*) and @code(*sustain*) is not
+applied. The effect of time warping is to warp the starting and ending
+times. The signal itself will have a constant unwarped frequency.
+
+@codef{fmlfo(@pragma(defn)@index(fmlfo)@i(freq) [, @i(table), @i(phase)])} @c{[sal]}@*
+@altdef{@code{(fmlfo @i(freq) [@i(table) @i(phase)])} @c{[lisp]}}@\A low-frequency oscillator
+that computes at the @code(*control-srate*) using a sound to specify a time-varying
+frequency in Hz. Phase is a @code(FLONUM) in degrees. The duration of the result is determined by @i(freq).
+
+@codef{maketable(@pragma(defn)@index(maketable)@label(maketable)@i(sound))} @c{[sal]}@*
+@altdef{@code[(maketable @i(sound))] @c{[lisp]}}@\Assumes that
+the samples in @i(sound) constitute one period of a wavetable, and returns a wavetable
+suitable for use as the @i(table) argument to the @code(osc) function (see
+below). Currently, tables are limited to 1,000,000 samples. This limit is the compile-time constant @code(max_table_len) set in @code(sound.h).
+
+@codef{build-harmonic(@pragma(defn)@index(build-harmonic)@index(harmonic)@i(n), @i(table-size))} @c{[sal]}@*
+@altdef{@code[(build-harmonic @i(n) @i(table-size))] @c{[lisp]}}@\Intended for
+constructing wavetables@index(wavetables)@index(waveforms), this function returns a sound of length @i(table-size)
+samples containing @i(n) periods of a sinusoid. These can be scaled and
+summed to form a waveform with the desired harmonic content. See @pragma(startref) page @pageref(build-harmonic-example) for an example.
+
+@codef{control-warp(@pragma(defn)@index(control-warp)@i(warp-fn), @i(signal), [@i(wrate)])} @c{[sal]}@*
+@altdef{@code[(control-warp @i(warp-fn) @i(signal) @i(wrate))] @c{[lisp]}}@\Applies a
+warp function @i(warp-fn) to @i(signal) using function composition. If @i(wrate) is omitted, linear
+interpolation is used. @i(warp-fn) is a mapping from score (logical) time
+to real time, and @i(signal) is a function from score time to real values.
+The result is a function from real time to real values at a sample rate of
+@code(*control-srate*). See @code(sound-warp) for an explanation of
+@i(wrate) and high-quality warping.
+
+@label(mult-sec)
+@codef{mult(@pragma(defn)@index(mult)@i(beh@-[1]), @i(beh@-[2]), @r(...))} @c{[sal]}@*
+@altdef{@code[(mult @i(beh@-[1]) @i(beh@-[2] @r(...)))] @c{[lisp]}}@\Returns the product of
+behaviors. The arguments may also be numbers, in which case simple multiplication is performed. If a number and sound are mixed, the @code(scale) function is used to scale the sound by the number. When sounds are multiplied, the resulting sample rate is the maximum sample rate of the factors.
+
+@codef{prod(@pragma(defn)@index(prod)@i(beh@-[1]), @i(beh@-[2]), @r(...))} @c{[sal]}@*
+@altdef{@code[(prod @i(beh@-[1]) @i(beh@-[2]) @r(...))] @c{[lisp]}}@\Same as @code(mult).
+
+@label(pan-sec)
+@codef{pan(@pragma(defn)@index(pan)@index(stereo panning)@i(sound), @i(where))} @c{[sal]}@*
+@altdef{@code[(pan @i(sound) @i(where))] @c{[lisp]}}@\Pans @i(sound) (a behavior) according to @i(where) (another behavior or a number). @i(Sound) must be monophonic. @i(Where) may be a monophonic sound (e.g. @code[(ramp)] or simply a number (e.g. @code(0.5)). In either case, @i(where) should range from 0 to 1, where 0 means pan completely left, and 1 means pan completely right. For intermediate values, the sound to each channel is scaled linearly. Presently, @code(pan) does not check its arguments carefully.
+
+@codef{prod(@pragma(defn)@index(prod)@i(beh@-[1]), @i(beh@-[2]), @r(...))} @c{[sal]}@*
+@altdef{@code[(prod @i(beh@-[1]) @i(beh@-[2]) @r(...))] @c{[lisp]}}@\Same as @code(mult).
+
+@label(resample-sec)
+@codef{resample(@pragma(defn)@index(resample)@i(sound), @i(srate))} @c{[sal]}@*
+@altdef{@code[(resample @i(sound) @i(srate))] @c{[lisp]}}@\Similar to @code(force-srate), except
+high-quality interpolation is used to prefilter and reconstruct the signal
+at the new sample rate. Also, the result is scaled by 0.95 to reduce problems with
+clipping. (See also @code(sound-warp).)
+
+@label(scale-sec)
+@codef{scale(@pragma(defn)@index(scale)@i(scale), @i(sound))} @c{[sal]}@*
+@altdef{@code[(scale @i(scale) @i(sound))] @c{[lisp]}}@\Scales the amplitude of @i(sound) by the factor @i(scale). Identical function to @code(snd-scale), except that it handles multichannel sounds. Sample rates, start times, etc. are taken from @i(sound).
+
+@codef{scale-db(@pragma(defn)@index(scale-db)@i(db), @i(sound))} @c{[sal]}@*
+@altdef{@code[(scale-db @i(db) @i(sound))] @c{[lisp]}}@\Scales the amplitude of @i(sound) by the factor @i(db), expressed in decibels. Sample rates, start times, etc. are taken from @i(sound).
+
+@codef[scale-srate(@pragma(defn)@index(scale-srate)@i(sound), @i(scale))] @c{[sal]}@*
+@altdef{@code[(scale-srate @i(sound) @i(scale))] @c{[lisp]}}@\Scales the sample rate of @i(sound) by @i(scale) factor. This has the effect of linearly shrinking or stretching time (the sound is not upsampled or downsampled). This is a special case of @code(snd-xform) (see Section @ref(snd-xform-sec)).
+
+@codef[shift-time(@pragma(defn)@index(shift-time)@i(sound), @i(shift))] @c{[sal]}@*
+@altdef{@code[(shift-time @i(sound) @i(shift))] @c{[lisp]}}@\Shift @i(sound)
+by @i(shift) seconds. If the sound is
+@pragma(startscribe)
+@math[f(t)], then the result is
+@pragma(endscribe)
+@html[f(t), then the result is]
+@pragma(startscribe)
+@math[f(t - shift)].
+@pragma(endscribe)
+@html[f(t - shift).]
+See Figure @ref(shift-time-fig). This is a special
+case of @code(snd-xform) (see Section @ref(snd-xform-sec)).
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 3 in, width = 4.5 in, magnify = 0.75,
+ postscript = "shifttimefig.ps"))
+@html(<img src="fig5.gif"><br><br>)
+@fillcaption(The @code(shift-time) function shifts a sound in time
+according to its @i(shift) argument.)
+@tag(shift-time-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{sound-warp(@pragma(defn)@index(sound-warp)@i(warp-fn), @i(signal) [, @i(wrate)])} @c{[sal]}@*
+@altdef{@code{(sound-warp @i(warp-fn) @i(signal) [@i(wrate)])} @c{[lisp]}}@\Applies a
+warp function @i(warp-fn) to @i(signal) using function composition. If the optional parameter @i(wrate) is omitted or NIL, linear
+interpolation is used. Otherwise, high-quality sample interpolation is used, and the
+result is scaled by 0.95 to reduce problems with clipping (interpolated samples can
+exceed the peak values of the input samples.)
+@i(warp-fn) is a mapping from score (logical) time
+to real time, and @i(signal) is a function from score time to real values.
+The result is a function from real time to real values at a sample rate of @code(*sound-srate*).
+See also @code(control-warp).
+@blankspace(1)
+If @i(wrate) is not NIL, it must be a number. The parameter indicates that
+high-quality resampling should be used and specifies the sample rate for the
+inverse of @i(warp-fn). Use the lowest number you can.
+ (See below for details.) Note that high-quality resampling is
+much slower than linear interpolation.
+@blankspace(1)
+To perform high-quality resampling by a fixed ratio, as opposed to a
+variable ratio allowed in @code(sound-warp), use @code(scale-srate) to
+stretch or shrink the sound, and then @code(resample) to restore the
+original sample rate.
+@blankspace(1)
+@code(Sound-warp) and @code(control-warp) both take the inverse of
+@i(warp-fn) to get a function from real time to score time. Each sample
+of this inverse is thus a score time; @i(signal) is evaluated at each of
+these score times to yield a value, which is the desired result. The
+sample rate of the inverse warp function is somewhat arbitrary. With linear
+interpolation, the inverse warp function sample rate is taken to be the
+output sample rate. Note, however, that the samples of the inverse warp
+function are stored as 32-bit floats, so they have limited precision. Since
+these floats represent sample times, rounding can be a problem. Rounding
+in this case is equivalent to adding jitter to the sample times. Nyquist
+ignores this problem for ordinary warping, but for high-quality warping, the
+jitter cannot be ignored.
+@blankspace(1)
+The solution is to use a rather low sample rate
+for the inverse warp function. @code(Sound-warp) can then linearly
+interpolate this signal using double-precision floats to minimize jitter
+between samples. The sample rate is a compromise: a low sample rate
+minimizes jitter, while a high sample rate does a better job of capturing
+detail (e.g. rapid fluctuations) in the warp function. A good rule of thumb
+is to use at most 1,000 to 10,000 samples for the inverse warp function. For
+example, if the result will be 1 minute of sound, use a sample rate of
+3000 samples / 60 seconds = 50 samples/second. Because Nyquist has no
+advance information about the warp function, the inverse warp function
+sample rate must be provided as a parameter. When in doubt, just try
+something and let your ears be the judge.
+
+@codef[integrate(@pragma(defn)@index(integrate)@index(smooth)@i(signal))] @c{[sal]}@*
+@altdef{@code[(integrate @i(signal))] @c{[lisp]}}@\Computes the integral of @i(signal). The start time, sample rate, etc. are taken from @i(signal).
+
+@codef[slope(@pragma(defn)@index(slope)@index(derivative)@index(first derivative)@i(signal))] @c{[sal]}@*
+@altdef{@code[(slope @i(signal))] @c{[lisp]}}@\Computes the first derivative (slope) of @i(signal). The start time, sample rate, etc. are taken from @i(signal).
+@end(fndefs)
+
+@paragraph(Oscillators)
+@label(osc-sec)
+@begin(fndefs)
+@codef{osc(@pragma(defn)@index(osc)@i(pitch) [, @i(duration), @i(table), @i(phase)])} @c{[sal]}@*
+@altdef{@code{(osc @i(pitch) [@i(duration) @i(table) @i(phase)])} @c{[lisp]}}@\Returns
+a sound which
+is the @i(table) oscillated at @i(pitch) for the given @i(duration),
+starting with the @i(phase) (in degrees).
+Defaults are: @i(duration) @code(1.0)
+(second), @i(table) @code(*table*),
+@i(phase) @code(0.0). The default value of @code(*table*) is a sinusoid. Duration is stretched by @code(*warp*) and
+@code(*sustain*), amplitude is nominally 1, but scaled by @code(*loudness*), the start time is logical time 0, transformed by @code(*warp*), and the sample rate is @code(*sound-srate*).
+The effect of time-warping is to warp the starting and ending times only; the
+signal has a constant unwarped frequency.
+ @p(Note 1:) @i(table) is a list of the form
+@begin(display)
+(@i(sound) @i(pitch-number) @i(periodic))
+@end(display)
+where the first element is a sound, the second is the pitch of the sound
+(this is not redundant, because the sound may represent any number of
+periods), and the third element is @code(T) if the sound is one period of
+a periodic signal, or @code(nil) if the sound is a sample that should not
+be looped. The maximum table size is set by @code(max_table_len) in @code(sound.h), and is currently set to 1,000,000.
+@p(Note 2:) in the current implementation, it is assumed that the
+output should be periodic. See @code(snd-down) and @code(snd-up) for resampling one-shot sounds to a desired sample rate. A future version of @code(osc)
+will handle both cases.
+@p(Note 3:) When @code(osc) is called, memory is allocated for the table, and samples are copied from the sound (the first element of the list which is the @i(table) parameter) to the memory. Every instance of @code(osc) has a private copy of the table, so the total storage can become large in some cases, for example in granular synthesis with many instances of @code(osc). In some cases, it may make sense to use @code(snd-flatten) (see Section @ref(flatten-sec)) to cause the sound to be fully realized, after which the @code(osc) and its table memory can be reclaimed by garbage collection. The @code(partial) function (see below) does not need a private table and does not use much space.
+
+@label(partial-sec)
+@codef{partial(@pragma(defn)@index(partial)@i(pitch), @i(env))} @c{[sal]}@*
+@altdef{@code[(partial @i(pitch) @i(env))] @c{[lisp]}}@\Returns a sinusoid at
+the indicated pitch; the sound is multiplied by @i(env). The start time and
+duration are taken from @i(env), which is of course subject to
+transformations. The sample rate is @code(*sound-srate*). The @code(partial)
+function is faster than @code(osc).
+
+@label(sine-sec)
+@codef{sine(@pragma(defn)@index(sine)@i(pitch) [, @i(duration)])} @c{[sal]}@*
+@altdef{@code{(sine @i(pitch) [@i(duration)])} @c{[lisp]}}@\Returns a sinusoid at
+the indicated pitch. The sample rate is @code(*sound-srate*).
+This function is like @code(osc) with
+respect to transformations. The @code(sine) function is faster than
+@code(osc).
+
+@codef{hzosc(@pragma(defn)@index(hzosc)@i(hz) [, @i(table), @i(phase)])} @c{[sal]}@*
+@altdef{@code{(hzosc @i(hz) [@i(table) @i(phase)])} @c{[lisp]}}@\Returns a sound which is the @i(table) oscillated at @i(hz) starting at @i(phase) degrees. The default @i(table) is @code(*table*) and the default @i(phase) is @i(0.0). The default duration is @code(1.0), but this is stretched as in @code(osc) (see above). The @i(hz) parameter may be a @code(SOUND), in which case the duration of the result is the duration of @i(hz). The sample rate is @code(*sound-srate*).
+
+@codef{osc-saw(@pragma(defn)@index(osc-saw)@index(sawtooth oscillator)@i(hz))} @c{[sal]}@*
+@altdef{@code[(osc-saw @i(hz))] @c{[lisp]}}@\Returns a sawtooth waveshape at the indicated frequency (in Hertz). The sample rate is @code(*sound-srate*). The @i(hz) parameter may be a sound as in @i(hzosc) (see above).
+
+@codef{osc-tri(@pragma(defn)@index(osc-tri)@index(triangle oscillator)@i(hz))} @c{[sal]}@*
+@altdef{@code[(osc-tri @i(hz))] @c{[lisp]}}@\Returns a triangle waveshape at the indicated frequency (in Hertz). The sample rate is @code(*sound-srate*). The @i(hz) parameter may be a sound as in @i(hzosc) (see above).
+
+@codef{osc-pulse(@pragma(defn)@index(osc-pulse)@index(square oscillator)@index(pulse oscillator)@index(pulse-width modulation)@i(hz), @i(bias) [, @i(compare-shape)])} @c{[sal]}@*
+@altdef{@code{(osc-pulse @i(hz) @i(bias) [@i(compare-shape)])} @c{[lisp]}}@\Returns a square pulse with variable width at the indicated frequency (in Hertz). The @i(bias) parameter controls the pulse width and should be between @code(-1) and @code(+1), giving a pulse width from 0% (always at @code(-1)) to 100% (always at @code(+1)). When bias is zero, a square wave is generated. Bias may be a @code(SOUND) to create varying pulse width. If bias changes rapidly, strange effects may occur. The optional @i(compare-shape) defaults to a hard step at zero, but other shapes may be used to achieve non-square pulses. The @code(osc-pulse) behavior is written in terms of other behaviors and defined in the file @code(nyquist.lsp) using just a few lines of code. Read the code for the complete story.
+
+@label(amosc-sec)
+@codef{amosc(@pragma(defn)@index(amosc)@i(pitch), @i(modulation) [, @i(table),
+@i(phase)])} @c{[sal]}@*
+@altdef{@code{(amosc @i(pitch) @i(modulation) [@i(table) @i(phase)])} @c{[lisp]}}@\Returns a
+sound which is @i(table) oscillated at @i(pitch). The output
+is multiplied by @i(modulation)
+for the duration of the sound @i(modulation).
+@i(osc-table) defaults to
+@code(*table*), and @i(phase) is the starting phase (default 0.0 degrees)
+within @i(osc-table). The sample rate is @code(*sound-srate*).
+
+@label(fmosc-sec)
+@codef{fmosc(@pragma(defn)@index(fmosc)@i(pitch), @i(modulation) [, @i(table),
+@i(phase)])} @c{[sal]}@*
+@altdef{@code{(fmosc @i(pitch) @i(modulation) [@i(table) @i(phase)])} @c{[lisp]}}@\Returns a
+sound which is @i(table) oscillated at @i(pitch) plus @i(modulation)
+for the duration of the sound @i(modulation).
+@i(osc-table) defaults to
+@code(*table*), and @i(phase) is the starting phase (default 0.0 degrees)
+within @i(osc-table). The @i(modulation)
+is expressed in hz, e.g. a sinusoid modulation signal with an
+amplitude of 1.0 (2.0 peak to peak), will cause a +/@subtract 1.0 hz
+frequency deviation in @i(sound). Negative frequencies are correctly
+handled. The sample rate is @code(*sound-srate*).
+
+@label(fmfb-sec)
+@codef{fmfb(@pragma(defn)@index(fmfb)@index(Feedback FM Oscillator)@i(pitch), @i(index) [, @i(dur)])} @c{[sal]}@*
+@altdef{@code{(fmfb @i(pitch) @i(index) [@i(dur)])} @c{[lisp]}}@\Returns
+a sound generated by feedback FM synthesis. The @i(pitch) parameter
+(given in the usual half-step units)
+controls the fundamental frequency. The @i(index) is the amount of
+feedback, which may be a @code(SOUND) or a @code(FLONUM). If @i(index) is
+a @code(FLONUM), @i(dur) must be provided (a @code(FLONUM)) to specify
+the duration. Otherwise, @i(dur) is ignored if present and the duration is
+determined by that of @i(index). The sample rate is @code(*sound-srate*).
+A sinusoid table is used.
+If @i(index) is below 1.1, this generates a sawtooth-like waveform.
+
+@label(buzz-sec)
+@codef{buzz(@pragma(defn)@index(buzz)@i(n), @i(pitch), @i(modulation))} @c{[sal]}@*
+@altdef{@code[(buzz @i(n) @i(pitch) @i(modulation))] @c{[lisp]}}@\Returns a
+sound with @i(n) harmonics of equal amplitude and a total amplitude
+of 1.0, using a well-known function of two cosines. If @i(n) (an integer)
+is less than 1, it is set to 1. Aliasing will occur if @i(n) is too large.
+The duration is
+determined by the duration of the sound @i(modulation), which is a
+frequency modulation term expressed in Hz (see Section @ref(fmosc-sec)).
+Negative frequencies are correctly handled.
+The sample rate is @code(*sound-srate*).
+
+@label(pluck-sec)
+@codef{pluck(@pragma(defn)@index(pluck)@index(Karplus-Strong)@index(string synthesis)@index(plucked string)@i(pitch) [, @i(duration), @i(final-amplitude)])} @c{[sal]}@*
+@altdef{@code{(pluck @i(pitch) [@i(duration) @i(final-amplitude)])} @c{[lisp]}}@\Returns a sound at the
+given @i(pitch) created using a modified Karplus-Strong plucked string
+algorithm. The tone decays from an amplitude of about 1.0 to about
+@i(final-amplitude) in @i(duration) seconds. The default values are to
+decay to 0.001 (-60dB) in 1 second. The sample rate is @code(*sound-srate*).
+
+@label(siosc-sec)
+@codef{siosc(@pragma(defn)@index(siosc)@index(spectral interpolation)@i(pitch),
+@i(modulation), @i(tables))} @c{[sal]}@*
+@altdef{@code[(siosc @i(pitch) @i(modulation) @i(tables))] @c{[lisp]}}@\Returns a sound constructed by
+interpolating through a succession of periodic waveforms. The frequency is
+given (in half steps) by @i(pitch) to which a @i(modulation) signal (in hz)
+is added, exactly as in @code(fmosc). The @i(tables) specify a list of
+waveforms as follows: (@i(table0) @i(time1) @i(table2) ... @i(timeN)
+@i(tableN)), where each @i(table) is a sound representing one period. Each
+@i(time) is a time interval measured from the starting time. The time is
+scaled by the nominal duration (computed using @code[(local-to-global
+(get-sustain))]) to get the actual time. Note that this implies linear
+stretching rather than continuous timewarping of the interpolation or the
+breakpoints. The waveform is @i(table0) at the starting time, @i(table1)
+after @i(time1) (scaled as described), and so on. The duration and logical
+stop time is given by @i(modulation). If @i(modulation) is shorter than
+@i(timeN), then the full sequence of waveforms is not used. If
+@i(modulation) is longer than @i(timeN), @i(tableN) is used after @i(timeN)
+without further interpolation.
+
+
+@label(sampler-sec)
+@codef{sampler(@pragma(defn)@index(sampler)@i(pitch), @i(modulation)
+ [, @i(sample), @i(npoints)])} @c{[sal]}@*
+@altdef{@code{(sampler @i(pitch) @i(modulation) [@i(sample) @i(npoints)])} @c{[lisp]}}@\Returns a sound constructed by reading a sample from
+beginning to end and then splicing on copies of the same sound from
+a loop point to the end.
+The @i(pitch) and @i(modulation) parameters are used as in @code(fmosc)
+described above. The optional @i(sample) (which defaults to the global
+variable @code(*table*) is a list of the form
+@begin(display)
+(@i(sound) @i(pitch-number) @i(loop-start))
+@end(display)
+where the first element is a sound containing the sample, the second is the
+pitch of the sample, and the third element is the time of the loop point. If
+the loop point is not in the bounds of the sound, it is set to zero.
+The optional @i(npoints) specifies how many points should be used for sample
+interpolation. Currently this parameter defaults to 2 and only 2-point
+(linear) interpolation is implemented. It is an error to modulate such that the frequency
+is negative. Note also that the loop point may be fractional.
+The sample rate is @code(*sound-srate*).
+@end(fndefs)
+
+@paragraph(Piece-wise Approximations)
+@index(piece-wise)@index(approximation)@index(splines)
+There are a number of related behaviors for piece-wise approximations to functions. The simplest of these, @code(pwl) was mentioned earlier in the manual. It takes a list of breakpoints, assuming an initial point at (0, 0), and a final value of 0. An analogous piece-wise exponential function, @code(pwe), is provided. Its implicit starting and stopping values are 1 rather than 0. Each of these has variants. You can specify the initial and final values (instead of taking the default). You can specify time in intervals rather than cummulative time. Finally, you can pass a list rather than an argument list. This leads to 16 versions:
+@pragma(startscribe)
+@begin(display)
+@tabclear
+@tabset(0.4 inches, 0.8 inches, 1.2 inches)
+Piece-wise Linear Functions:
+@\Cummulative Time:
+@\@\Default initial point at (0, 0), final value at 0:
+@\@\@\@code(pwl)
+@\@\@\@code(pwl-list)
+@\@\Explicit initial value:
+@\@\@\@code(pwlv)
+@\@\@\@code(pwlv-list)
+@\Relative Time:
+@\@\Default initial point at (0, 0), final value at 0:
+@\@\@\@code(pwlr)
+@\@\@\@code(pwlr-list)
+@\@\Explicit initial value:
+@\@\@\@code(pwlvr)
+@\@\@\@code(pwlvr-list)
+Piece-wise Exponential Functions:
+@\Cummulative Time:
+@\@\Default initial point at (0, 1), final value at 1:
+@\@\@\@code(pwe)
+@\@\@\@code(pwe-list)
+@\@\Explicit initial value:
+@\@\@\@code(pwev)
+@\@\@\@code(pwev-list)
+@\Relative Time:
+@\@\Default initial point at (0, 1), final value at 1:
+@\@\@\@code(pwer)
+@\@\@\@code(pwer-list)
+@\@\Explicit initial value:
+@\@\@\@code(pwevr)
+@\@\@\@code(pwevr-list)
+@end(display)
+@pragma(endscribe)
+@html[<pre><b>Piece-wise Linear Functions:</b>
+ <i>Cummulative Time:</i>
+ <i>Default initial point at (0, 0), final value at 0:</i>
+ pwl
+ pwl-list
+ <i>Explicit initial value:</i>
+ pwlv
+ pwlv-list
+ <i>Relative Time:</i>
+ <i>Default initial point at (0, 0), final value at 0:</i>
+ pwlr
+ pwlr-list
+ <i>Explicit initial value:</i>
+ pwlvr
+ pwlvr-list
+
+<b>Piece-wise Exponential Functions:</b>
+ <i>Cummulative Time:</i>
+ <i>Default initial point at (0, 1), final value at 1:</i>
+ pwe
+ pwe-list
+ <i>Explicit initial value:</i>
+ pwev
+ pwev-list
+ <i>Relative Time:</i>
+ <i>Default initial point at (0, 1), final value at 1:</i>
+ pwer
+ pwer-list
+ <i>Explicit initial value:</i>
+ pwevr
+ pwevr-list
+</pre>]
+All of these functions are implemented in terms of @code(pwl) (see @code(nyquist.lsp) for the implementations. There are infinite opportunities for errors in these functions: if you leave off a data point, try to specify points in reverse order, try to create an exponential that goes to zero or negative values, or many other bad things, the behavior is not well-defined. Nyquist should not crash, but Nyquist does not necessarily attempt to report errors at this time.
+
+@begin(fndefs)
+@label(pwl-sec)
+@codef{pwl(@pragma(defn)@index(pwl)@i(t@-[1]), @i(l@-[1]), @i(t@-[2]), @i(l@-[2]), @r(...) @i(t@-[n]))} @c{[sal]}@*
+@altdef{@code[(pwl @i(t@-[1]) @i(l@-[1]) @i(t@-[2]) @i(l@-[2]) @r(...) @i(t@-[n]))] @c{[lisp]}}@\Creates
+a piece-wise linear envelope with breakpoints at (0, 0), (@i(t@-[1]),
+@i(l@-[1])), (@i(t@-[2]), @i(l@-[2])), ... (@i(t@-[n]), 0). The breakpoint
+times are scaled linearly by the value of @code(*sustain*) (if
+@code(*sustain*) is a @code(SOUND), it is evaluated once at the starting
+time of the envelope). Each breakpoint time is then mapped according to
+@code(*warp*). The result is a linear interpolation (unwarped) between
+the breakpoints. The sample rate is @code(*control-srate*). Breakpoint
+times are quantized to the nearest sample time. If you specify one or more
+breakpoints withing one sample period, @code(pwl) attempts to give a good
+approximation to the specified function. In particular, if two breakpoints
+are simultaneous, @code(pwl) will move one of them to an adjacent sample,
+producing a steepest possible step in the signal. The exact details of this
+``breakpoint munging'' is subject to change in future versions. Please report
+any cases where breakpoint lists give unexpected behaviors. The author will
+try to apply the ``principle of least surprise'' to the design. Note that
+the times are relative to 0; they are not durations of each envelope
+segment.
+
+@codef{pwl-list(@pragma(defn)@index(pwl-list)@i(breakpoints))} @c{[sal]}@*
+@altdef{@code[(pwl-list @i(breakpoints))] @c{[lisp]}}@\If you have a list of
+breakpoints, you can use @code(apply) to apply the @code(pwl) function to
+the breakpoints, but if the list is very long (hundreds or thousands of
+points), you might get a stack overflow because XLISP has a fixed-size
+argument stack. Instead, call @code(pwl-list), passing one argument, the
+list of breakpoints.
+
+@codef{pwlv(@pragma(defn)@index(pwlv)@i(l@-[1]), @i(t@-[2]), @i(l@-[2]), @i(t@-[3]), @i(t@-[3]), ... @i(t@-[n]), @i(l@-[n]))} @c{[sal]}@*
+@altdef{@code[(pwlv @i(l@-[1]) @i(t@-[2]) @i(l@-[2]) @i(t@-[3]) @i(t@-[3]) @r(...) @i(t@-[n]) @i(l@-[n]))] @c{[lisp]}}@\Creates
+a piece-wise linear envelope with breakpoints at (0, l@-[1]), (@i(t@-[2]), @i(l@-[2])), etc., ending with (@i(t@-[n], @i(l@-[n])). Otherwise, the behavior is like that of @code(pwl).
+
+@codef{pwlv-list(@pragma(defn)@index(pwlv-list)@i(breakpoints))} @c{[sal]}@*
+@altdef{@code[(pwlv-list @i(breakpoints))] @c{[lisp]}}@\A version of @code(pwlv) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@codef{pwlr(@pragma(defn)@index(pwlr)@i(i@-[1]), @i(l@-[1]), @i(i@-[2]), @i(l@-[2]), ... @i(i@-[n]))} @c{[sal]}@*
+@altdef{@code[(pwlr @i(i@-[1]) @i(l@-[1]) @i(i@-[2]) @i(l@-[2]) @r(...) @i(i@-[n]))] @c{[lisp]}}@\Creates
+a piece-wise linear envelope with breakpoints at (0, 0), (@i(t@-[1]),
+@i(l@-[1])), (@i(t@-[2]), @i(l@-[2])), ... (@i(t@-[n]), 0), where @i(t@-[j]) is the sum of @i(i@-[1]) through @i(i@-[j]). In other words, the breakpoint times are specified in terms of intervals rather than cummulative time. Otherwise, the behavior is like that of @code(pwl).
+
+@codef{pwlr-list(@pragma(defn)@index(pwlr-list)@i(breakpoints))} @c{[sal]}@*
+@altdef{@code[(pwlr-list @i(breakpoints))] @c{[lisp]}}@\A version of @code(pwlr) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@codef{pwlvr(@pragma(defn)@index(pwlvr)@i(l@-[1]), @i(i@-[2]), @i(l@-[2]), @i(i@-[3]), @i(i@-[3]), ... @i(i@-[n]), @i(l@-[n]))} @c{[sal]}@*
+@altdef{@code[(pwlvr @i(l@-[1]) @i(i@-[2]) @i(l@-[2]) @i(i@-[3]) @i(i@-[3]) @r(...) @i(i@-[n]) @i(l@-[n]))] @c{[lisp]}}@\Creates
+a piece-wise linear envelope with breakpoints at (0, l@-[1]), (@i(t@-[2]), @i(l@-[2])), etc., ending with (@i(t@-[n], @i(l@-[n])), where @i(t@-[j]) is the sum of @i(i@-[2]) through @i(i@-[j]). In other words, the breakpoint times are specified in terms of intervals rather than cummulative time. Otherwise, the behavior is like that of @code(pwlv).
+
+@codef{pwlvr-list(@pragma(defn)@index(pwlvr-list)@i(breakpoints))} @c{[sal]}@*
+@altdef{@code[(pwlvr-list @i(breakpoints))] @c{[lisp]}}@\A version of @code(pwlvr) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@codef{pwe(@pragma(defn)@index(pwe)@i(t@-[1]), @i(l@-[1]), @i(t@-[2]), @i(l@-[2]), @r(...) @i(t@-[n]))} @c{[sal]}@*
+@altdef{@code[(pwe @i(t@-[1]) @i(l@-[1]) @i(t@-[2]) @i(l@-[2]) @r(...) @i(t@-[n]))] @c{[lisp]}}@\Creates
+a piece-wise exponential envelope with breakpoints at (0, 1), (@i(t@-[1]),
+@i(l@-[1])), (@i(t@-[2]), @i(l@-[2])), ... (@i(t@-[n]), 1). Exponential segments means that the ratio of values from sample to sample is constant within the segment. (The current implementation actually takes the log of each value, computes a piece-wise exponential from the points using @code(pwl), then exponentiates each resulting sample. A faster implementation is certainly possible!) Breakpoint values (@i(l@-[j])) must be greater than zero. Otherwise, this function is similar to @code(pwl), including stretch by @code(*sustain*), mapping according to @code(*warp*), sample rate based on @code(*control-srate*), and "breakpoint munging" (see @code(pwl) described above). @i(Default initial and final values are of dubious value with exponentials. See @code(pwev) below for the function you are probably looking for.)
+
+@codef{pwe-list(@pragma(defn)@index(pwe-list)@i(breakpoints))} @c{[sal]}@*
+@altdef{@code[(pwe-list @i(breakpoints))] @c{[lisp]}}@\A version of @code(pwe) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@label(pwev-sec)
+@codef{pwev(@pragma(defn)@index(pwev)@i(l@-[1]), @i(t@-[2]), @i(l@-[2]), @i(t@-[3]), @i(t@-[3]), @r(...) @i(t@-[n]), @i(l@-[n]))} @c{[sal]}@*
+@altdef{@code[(pwev @i(l@-[1]) @i(t@-[2]) @i(l@-[2]) @i(t@-[3]) @i(t@-[3]) @r(...) @i(t@-[n]) @i(l@-[n]))] @c{[lisp]}}@\Creates
+a piece-wise exponential envelope with breakpoints at (0, @i(l@-[1])), (@i(t@-[2]), @i(l@-[2])), etc., ending with (@i(t@-[n]), @i(l@-[n])). Otherwise, the behavior is like that of @code(pwe).
+
+@codef{pwev-list(@pragma(defn)@index(pwev-list)@i(breakpoints))} @c{[sal]}@*
+@altdef{@code[(pwev-list @i(breakpoints))] @c{[lisp]}}@\A version of @code(pwev) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@codef{pwer(@pragma(defn)@index(pwer)@i(i@-[1]), @i(l@-[1]), @i(i@-[2]), @i(l@-[2]), @r(...) @i(i@-[n]))} @c{[sal]}@*
+@altdef{@code[(pwer @i(i@-[1]) @i(l@-[1]) @i(i@-[2]) @i(l@-[2]) @r(...) @i(i@-[n]))] @c{[lisp]}}@\Creates
+a piece-wise exponential envelope with breakpoints at (0, 1), (@i(t@-[1]),
+@i(l@-[1])), (@i(t@-[2]), @i(l@-[2])), ... (@i(t@-[n]), 1), where @i(t@-[j]) is the sum of @i(i@-[1]) through @i(i@-[j]). In other words, the breakpoint times are specified in terms of intervals rather than cummulative time. Otherwise, the behavior is like that of @code(pwe). Consider using @code(pwerv) instead of this one.
+
+@codef{pwer-list(@pragma(defn)@index(pwer-list)@i(breakpoints))} @c{[sal]}@*
+@altdef{@code[(pwer-list @i(breakpoints))] @c{[lisp]}}@\A version of @code(pwer) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+
+@codef{pwevr(@index(GEN05)@pragma(defn)@index(pwevr)@i(l@-[1]), @i(i@-[2]), @i(l@-[2]), @i(i@-[3]), @i(i@-[3]), @r(...) @i(i@-[n]), @i(l@-[n]))} @c{[sal]}@*
+@altdef{@code[(pwevr @i(l@-[1]) @i(i@-[2]) @i(l@-[2]) @i(i@-[3]) @i(i@-[3]) @r(...) @i(i@-[n]) @i(l@-[n]))] @c{[lisp]}}@\Creates
+a piece-wise exponential envelope with breakpoints at (0, l@-[1]), (@i(t@-[2]), @i(l@-[2])), etc., ending with (@i(t@-[n], @i(l@-[n])), where @i(t@-[j]) is the sum of @i(i@-[2]) through @i(i@-[j]). In other words, the breakpoint times are specified in terms of intervals rather than cummulative time. Otherwise, the behavior is like that of @code(pwev). Note that this is similar to the csound GEN05 generator. Which is uglier, @i(GEN05) or @i(pwevr)?
+
+@codef{pwevr-list(@pragma(defn)@index(pwevr-list)@i(breakpoints))} @c{[sal]}@*
+@altdef{@code[(pwevr-list @i(breakpoints))] @c{[lisp]}}@\A version of @code(pwevr) that takes a single list of breakpoints as its argument. See @code(pwl-list) above for the rationale.
+@end(fndefs)
+@paragraph(Filter Behaviors)
+@begin(fndefs)
+@label(alpass-sec)
+@codef{alpass(@index(all pass filter)@index(alpass filter)@pragma(defn)@index(alpass)@i(sound), @i(decay), @i(hz) [, @i(minhz)])} @c{[sal]}@*
+@altdef{@code{(alpass @i(sound) @i(decay) @i(hz) [@i(minhz)])} @c{[lisp]}}@\Applies an all-pass filter to @i(sound). This all-pass filter creates a delay effect without the resonances of a comb filter. The decay time of the filter is given by @i(decay). The @i(hz) parameter must be a number or sound greater than zero. It is used to compute delay, which is then rounded to the nearest integer number of samples (so the frequency is not always exact. Higher sampling rates yield better delay resolution.) The @i(decay) may be a sound or a number. In either case, it must also be positive. (Implementation note: an exponentiation is needed to convert @i(decay) into the @i(feedback) parameter, and exponentiation is typically more time-consuming than the filter operation itself. To get high performance, provide @i(decay) at a low sample rate.) The resulting sound will have the start time, sample rate, etc. of @i(sound). If @i(hz) is of type @code(SOUND), the delay may be time-varying. Linear interpolation is then used for fractional sample delay, but it should be noted that linear interpolation implies a low-pass transfer function. Thus, this filter may behave differently with a constant @code(SOUND) than it does with a @code(FLONUM) value for @i(hz). In addition, if @i(hz) is of type @code(SOUND), then @i(minhz) is required. The @i(hz) parameter will be clipped to be greater than @i(minhz), placing an upper bound on the delay buffer length.
+
+@label(comb-sec)
+@codef{comb(@pragma(defn)@index(comb)@index(comb filter)@i(sound), @i(decay), @i(hz))} @c{[sal]}@*
+@altdef{@code[(comb @i(sound) @i(decay) @i(hz))] @c{[lisp]}}@\Applies a comb filter to @i(sound). A comb filter emphasizes (resonates at) frequencies that are multiples of a @i(hz). The decay time of the resonance is given by @i(decay). This is a variation on @code(feedback-delay) (see below). The @i(hz) parameter must be a number greater than zero. It is used to compute delay, which is then rounded to the nearest integer number of samples (so the frequency is not always exact. Higher sampling rates yield better delay resolution.) The @i(decay) may be a sound or a number. In either case, it must also be positive. (Implementation note: an exponentiation is needed to convert @i(decay) into the @i(feedback) parameter for @code(feedback-delay), and exponentiation is typically more time-consuming than the filter operation itself. To get high performance, provide @i(decay) at a low sample rate.) The resulting sound will have the start time, sample rate, etc. of @i(sound).
+
+@label(congen-sec)
+@codef{congen(@pragma(defn)@index(congen)@index(contour generator)@index(envelope generator)@i(gate), @i(risetime), @i(falltime))} @c{[sal]}@*
+@altdef{@code[(congen @i(gate) @i(risetime) @i(falltime))] @c{[lisp]}}@\Implements an analog synthesizer-style contour generator. The input @i(gate) normally goes from 0.0 to 1.0 to create an attack and from 1.0 to 0.0 to start a release. During the attack (output is increasing), the output converges half-way to @i(gate) in @i(risetime) (a @code(FLONUM)) seconds. During the decay, the half-time is @i(falltime) seconds. The sample rate, start time, logical stop, and terminate time all come from @i(gate). If you want a nice decay, be sure that the @i(gate) goes to zero and stays there for awhile before @i(gate) terminates, because @code(congen) (and all Nyquist sounds) go immediately to zero at termination time. For example, you can use @code(pwl) to build a pulse followed by some zero time:
+@begin(example)
+(pwl 0 1 duty 1 duty 0 1)
+@end(example)
+Assuming @i(duty) is less than 1.0, this will be a pulse of duration @i(duty) followed by zero for a total duration of 1.0.
+@begin(example)
+(congen (pwl 0 1 duty 1 duty 0 1) 0.01 0.05)
+@end(example)
+will have a duration of 1.0 because that is the termination time of the @code(pwl) input. The decaying release of the resulting envelope will be truncated to zero at time 1.0. (Since the decay is theoretically infinite, there is no way to avoid truncation, although you could multiply by another envelope that smoothly truncates to zero in the last millisecond or two to get both an exponential decay and a smooth final transition to zero.)
+
+@label(convolve-sec)
+@codef{convolve(@pragma(defn)@index(convolve)@index(convolution)@index(FIR filter)@i(sound),
+@i(response))} @c{[sal]}@*
+@altdef{@code[(convolve @i(sound) @i(response))] @c{[lisp]}}@\Convolves two signals. The first can be any length, but the
+computation time per sample and the total space required are proportional to
+the length of @i(response).
+
+@label(feedback-delay-sec)
+@codef{feedback-delay(@pragma(defn)@index(feedback-delay)@index(delay)@index(echo)@i(sound), @i(delay), @i(feedback))} @c{[sal]}@*
+@altdef{@code[(feedback-delay @i(sound) @i(delay) @i(feedback))] @c{[lisp]}}@\Applies feedback delay to @i(sound). The @i(delay) must be a number (in seconds). It is rounded to the nearest sample to determine the length of the delay. The sample rate is the maximum from @i(sound) and @i(feedback) (if feedback is also a sound). The amound of @i(feedback) should be less than one to avoid an exponential increase in amplitude. The start time and stop time, and logical stop time are taken from @i(sound). Since output is truncated at the stop time of @i(sound), you may want to append some silence to @i(sound) to give the filter time to decay.
+
+@label(lp-sec)
+@codef{lp(@pragma(defn)@index(lp)@index(low-pass filter)@i(sound), @i(cutoff))} @c{[sal]}@*
+@altdef{@code[(lp @i(sound) @i(cutoff))] @c{[lisp]}}@\Filters @i(sound)
+using a first-order Butterworth low-pass filter. @i(Cutoff) may be a float
+or a signal (for time-varying filtering) and expresses hertz. Filter
+coefficients (requiring trig functions) are recomputed at the sample rate of
+@i(cutoff). The resulting sample rate, start time, etc. are taken from @i(sound).
+
+@codef{tone(@pragma(defn)@index(tone)@i(sound), @i(cutoff))} @c{[sal]}@*
+@altdef{@code[(tone @i(sound) @i(cutoff))] @c{[lisp]}}@\No longer defined; use @code(lp) instead, or define it by adding @code[(setfn tone lp)] to your program.
+
+
+@label(hp-sec)
+@codef{hp(@pragma(defn)@index(hp)@index(high-pass filter)@i(sound), @i(cutoff))} @c{[sal]}@*
+@altdef{@code[(hp @i(sound) @i(cutoff))] @c{[lisp]}}@\Filters @i(sound)
+using a first-order Butterworth high-pass filter. @i(Cutoff) may be a
+float or a signal (for time-varying filtering) and expresses hertz. Filter
+coefficients (requiring trig functions) are recomputed at the sample rate of
+@i(cutoff). This filter is an exact complement of @code(lp).
+
+@codef{atone(@pragma(defn)@index(atone)@i(sound), @i(cutoff))} @c{[sal]}@*
+@altdef{@code[(atone @i(sound) @i(cutoff))] @c{[lisp]}}@\No longer defined; use @code(hp) instead, or define it by adding @code[(setfn atone hp)] to your program.
+
+@label(reson-sec)
+@codef{reson(@pragma(defn)@index(reson)@index(bandpass filter)@i(sound), @i(center), @i(bandwidth), @i(n))} @c{[sal]}@*
+@altdef{@code[(reson @i(sound) @i(center) @i(bandwidth) @i(n))] @c{[lisp]}}@\Apply
+a resonating filter to @i(sound) with center frequency @i(center) (in hertz),
+which may be a float or a signal. @i(Bandwidth) is the filter bandwidth (in
+hertz), which may also be a signal. Filter coefficients (requiring trig
+functions) are recomputed at each new sample of either @i(center) or
+@i(bandwidth), and coefficients are @i(not) interpolated. The last
+parameter @i(n) specifies the type of normalization as in Csound: A value of 1 specifies a peak amplitude
+response of 1.0; all frequencies other than @i(hz) are attenuated. A
+value of 2 specifies the overall RMS value of the amplitude response
+is 1.0; thus filtered white noise would retain the same power. A value of
+zero specifies no scaling. The resulting sample rate, start time, etc. are taken from @i(sound).
+
+One application of @code(reson) is to simulate resonances in the human vocal tract.
+See @code(demos/voice_synthesis.htm)@index(voice synthesis)@index(demos, voice synthesis)
+for sample code and documentation.
+
+@label(areson-sec)
+@codef{areson(@pragma(defn)@index(areson)@index(notch filter)@i(sound), @i(center), @i(bandwidth), @i(n))} @c{[sal]}@*
+@altdef{@code[(areson @i(sound) @i(center) @i(bandwidth) @i(n))] @c{[lisp]}}@\The @code(areson) filter is an exact
+complement of @code(reson) such that if both are applied to the
+same signal with the same parameters, the sum of the results yeilds
+the original signal.
+
+@label(shape-sec)
+@codef{shape(@pragma(defn)@index(shape)@index(waveshaping)@index(table)@i(signal), @i(table), @i(origin))} @c{[sal]}@*
+@altdef{@code[(shape @i(signal) @i(table) @i(origin))] @c{[lisp]}}@\A waveshaping function. Use @i(table) as a function; apply the function to each sample of @i(signal) to yield a new sound. @i(Signal) should range from -1 to +1. Anything beyond these bounds is clipped. @i(Table) is also a sound, but it is converted into a lookup table (similar to table-lookup oscillators). The @i(origin) is a @code(FLONUM) and gives the time which should be considered the origin of @i(table). (This is important because @i(table) cannot have values at negative times, but @i(signal) will often have negative values. The @i(origin) gives an offset so that you can produce suitable tables.) The output at time @i(t) is:
+@begin(display)
+@i(table)(@i(origin) + clip(@i(signal)(@i(t)))
+@end(display)
+where clip(@i(x)) = @i(max)(1, @i(min)(-1, @i(x))).
+(E.g. if @i(table) is a signal defined over the interval [0, 2], then @i(origin) should be 1.0. The value of @i(table) at time 1.0 will be output when the input signal is zero.) The output has the same start time, sample rate, etc. as @i(signal). The @code(shape) function will also accept multichannel @i(signal)s and @i(table)s.
+
+Further discussion and examples can be found in
+@code(demos/distortion.htm)@index(distortion tutorial)@index(demos, distortion).
+The @code(shape)
+function is also used to map frequency to amplitude to achieve a spectral envelope for
+Shepard tones in @code(demos/shepard.lsp).@index(Shepard tones)@index(demos, Shepard tones)
+
+@label(biquad-sec)
+@codef{biquad(@pragma(defn)@index(biquad)@i(signal), @i(b0), @i(b1), @i(b2), @i(a0), @i(a1), @i(a2))} @c{[sal]}@*
+@altdef{@code[(biquad @i(signal) @i(b0) @i(b1) @i(b2) @i(a0) @i(a1) @i(a2))] @c{[lisp]}}@\A fixed-parameter biquad filter. All filter coefficients are @code(FLONUM)s. See also @code(lowpass2), @code(highpass2), @code(bandpass2), @code(notch2), @code(allpass2), @code(eq-lowshelf), @code(eq-highshelf), @code(eq-band), @code(lowpass4), @code(lowpass6), @code(highpass4), and @code(highpass8) in this section for convenient variations based on the same filter. The equations for the filter are: z@-[n] = s@-[n] + a1 * z@-[n-1] + a2 * z@-[n-2], and y@-[n] = z@-[n] * b0 + z@-[n-1] * b1 + z@-[n-2] * b2.
+
+@label(biquad-m-sec)
+@codef{biquad-m(@pragma(defn)@index(biquad-m)@i(signal), @i(b0), @i(b1), @i(b2), @i(a0), @i(a1), @i(a2))} @c{[sal]}@*
+@altdef{@code[(biquad-m @i(signal) @i(b0) @i(b1) @i(b2) @i(a0) @i(a1) @i(a2))] @c{[lisp]}}@\A fixed-parameter biquad filter with Matlab sign conventions for @i(a0), @i(a1), and @i(a2). All filter coefficients are @code(FLONUM)s.
+
+@label(lowpass2-sec)
+@codef{lowpass2(@pragma(defn)@index(lowpass2)@i(signal), @i(hz) [, @i(q)])} @c{[sal]}@*
+@altdef{@code{(lowpass2 @i(signal) @i(hz) [@i(q)])} @c{[lisp]}}@\A fixed-parameter, second-order lowpass filter based on @code(snd-biquad). The cutoff frequency is given by @i(hz) (a @code(FLONUM)) and an optional Q factor is given by @i(q) (a @code(FLONUM)).
+
+@label(highpass2-sec)
+@codef{highpass2(@pragma(defn)@index(highpass2)@i(signal), @i(hz) [, @i(q)])} @c{[sal]}@*
+@altdef{@code{(highpass2 @i(signal) @i(hz) [@i(q)])} @c{[lisp]}}@\A fixed-parameter, second-order highpass filter based on @code(snd-biquad). The cutoff frequency is given by @i(hz) (a @code(FLONUM)) and an optional Q factor is given by @i(q) (a @code(FLONUM)).
+
+@label(bandpass2-sec)
+@codef{bandpass2(@pragma(defn)@index(bandpass2)@i(signal), @i(hz) [, @i(q)])} @c{[sal]}@*
+@altdef{@code{(bandpass2 @i(signal) @i(hz) [@i(q)])} @c{[lisp]}}@\A fixed-parameter, second-order bandpass filter based on @code(snd-biquad). The center frequency is given by @i(hz) (a @code(FLONUM)) and an optional Q factor is given by @i(q) (a @code(FLONUM)).
+
+@label(notch2-sec)
+@codef{notch2(@pragma(defn)@index(notch2)@i(signal), @i(hz) [, @i(q)])} @c{[sal]}@*
+@altdef{@code{(notch2 @i(signal) @i(hz) [@i(q)])} @c{[lisp]}}@\A fixed-parameter, second-order notch filter based on @code(snd-biquad). The center frequency is given by @i(hz) (a @code(FLONUM)) and an optional Q factor is given by @i(q) (a @code(FLONUM)).
+
+@label(allpass2-sec)
+@codef{allpass2(@pragma(defn)@index(allpass2)@i(signal), @i(hz) [, @i(q)])} @c{[sal]}@*
+@altdef{@code{(allpass2 @i(signal) @i(hz) [@i(q)])} @c{[lisp]}}@\A fixed-parameter, second-order allpass filter based on @code(snd-biquad). The frequency is given by @i(hz) (a @code(FLONUM)) and an optional Q factor is given by @i(q) (a @code(FLONUM)).
+
+@label(eq-lowshelf-sec)
+@codef{eq-lowshelf(@pragma(defn)@index(eq-lowshelf)@index(equalization)@i(signal), @i(hz), @i(gain) [, @i(slope)])} @c{[sal]}@*
+@altdef{@code{(eq-lowshelf @i(signal) @i(hz) @i(gain) [@i(slope)])} @c{[lisp]}}@\A fixed-parameter, second-order bass shelving equalization (EQ) filter based on @code(snd-biquad). The @i(hz) parameter (a @code(FLONUM))is the halfway point in the transition, and @i(gain) (a @code(FLONUM)) is the bass boost (or cut) in dB. The optional @i(slope) (a @code(FLONUM)) is 1.0 by default, and response becomes peaky at values greater than 1.0.
+
+@label(eq-highshelf-sec)
+@codef{eq-highshelf(@pragma(defn)@index(eq-highshelf)@index(equalization)@i(signal), @i(hz), @i(gain) [, @i(slope)])} @c{[sal]}@*
+@altdef{@code{(eq-highshelf @i(signal) @i(hz) @i(gain) [@i(slope)])} @c{[lisp]}}@\A fixed-parameter, second-order treble shelving equalization (EQ) filter based on @code(snd-biquad). The @i(hz) parameter (a @code(FLONUM))is the halfway point in the transition, and @i(gain) (a @code(FLONUM)) is the treble boost (or cut) in dB. The optional @i(slope) (a @code(FLONUM)) is 1.0 by default, and response becomes peaky at values greater than 1.0.
+
+@label(eq-band-sec)
+@codef{eq-band(@pragma(defn)@index(eq-band)@index(equalization)@i(signal), @i(hz), @i(gain), @i(width))} @c{[sal]}@*
+@altdef{@code[(eq-band @i(signal) @i(hz) @i(gain) @i(width))] @c{[lisp]}}@\A fixed- or variable-parameter, second-order midrange equalization (EQ) filter based on @code(snd-biquad), @code(snd-eqbandcv) and @code(snd-eqbandvvv). The @i(hz) parameter (a @code(FLONUM)) is the center frequency, @i(gain) (a @code(FLONUM)) is the boost (or cut) in dB, and @i(width) (a @code(FLONUM)) is the half-gain width in octaves. Alternatively, @i(hz), @i(gain), and @i(width) may be @code(SOUND)s, but they must all have the same sample rate, e.g. they should all run at the control rate or at the sample rate.
+
+@label(lowpass4-sec)
+@codef{lowpass4(@pragma(defn)@index(lowpass4)@i(signal), @i(hz))} @c{[sal]}@*
+@altdef{@code[(lowpass4 @i(signal) @i(hz))] @c{[lisp]}}@\A four-pole Butterworth lowpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(lowpass6-sec)
+@codef{lowpass6(@pragma(defn)@index(lowpass6)@i(signal), @i(hz))} @c{[sal]}@*
+@altdef{@code[(lowpass6 @i(signal) @i(hz))] @c{[lisp]}}@\A six-pole Butterworth lowpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(lowpass8-sec)
+@codef{lowpass8(@pragma(defn)@index(lowpass8)@i(signal), @i(hz))} @c{[sal]}@*
+@altdef{@code[(lowpass8 @i(signal) @i(hz))] @c{[lisp]}}@\An eight-pole Butterworth lowpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(highpass4-sec)
+@codef{highpass4(@pragma(defn)@index(highpass4)@i(signal), @i(hz))} @c{[sal]}@*
+@altdef{@code[(highpass4 @i(signal) @i(hz))] @c{[lisp]}}@\A four-pole Butterworth highpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(highpass6-sec)
+@codef{highpass6(@pragma(defn)@index(highpass6)@i(signal), @i(hz))} @c{[sal]}@*
+@altdef{@code[(highpass6 @i(signal) @i(hz))] @c{[lisp]}}@\A six-pole Butterworth highpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(highpass8-sec)
+@codef{highpass8(@pragma(defn)@index(highpass8)@i(signal), @i(hz))} @c{[sal]}@*
+@altdef{@code[(highpass8 @i(signal) @i(hz))] @c{[lisp]}}@\An eight-pole Butterworth highpass filter. The cutoff frequency is @i(hz) (a @code(FLONUM)).
+
+@label(tapv-sec)
+@codef{tapv(@pragma(defn)@index(tapv)@index(variable delay)@index(tapped delay)@i(sound), @i(offset),
+@i(vardelay), @i(maxdelay))} @c{[sal]}@*
+@altdef{@code[(tapv @i(sound) @i(offset) @i(vardelay) @i(maxdelay))] @c{[lisp]}}@\A delay line with a variable position tap.
+Identical to @code(snd-tapv). See it for details (@ref(snd-tapv-sec)).
+
+@end(fndefs)
+
+@paragraph(Effects)
+@begin(fndefs)
+@label(stkrev-sec)
+@codef{nrev(@pragma(defn)@index(nrev)@index(reverb)@index(effect,
+reverberation)@index(STK nreverb)@i(sound), @i(decay), @i(mix))} @c{[sal]}@*
+@altdef{@code[(nrev @i(sound) @i(decay) @i(mix))] @c{[lisp]}}
+
+@codef{jcrev(@pragma(defn)@index(jcrev)@index(reverb)@index(effect,
+ reverberation)@index(STK jcreverb)@i(sound), @i(decay), @i(mix))} @c{[sal]}@*
+@altdef{@code[(jcrev @i(sound) @i(decay) @i(mix))] @c{[lisp]}}
+
+@codef{prcrev(@pragma(defn)@index(prcrev)@index(reverb)@index(effect,
+ reverberation)@index(STK prcreverb)@i(sound), @i(decay), @i(mix))} @c{[sal]}@*
+@altdef{@code[(prcrev @i(sound) @i(decay) @i(mix))] @c{[lisp]}}
+These reverbs (@code(nrev), @code(jcrev), and @code(prcrev)) are implemented
+in STK (running within Nyquist). @code(nrev) derives from Common Music's
+NRev, which consists of 6 comb filters followed by 3 allpass filters, a
+ lowpass filter, and another allpass in series followed by two allpass
+filters in parallel. @code(jcrev) is the John Chowning
+reverberator which is based on the use of networks of simple allpass
+and comb delay filters. This reverb implements three series allpass units,
+followed by four parallel comb filters, and two decorrelation delay
+lines in parallel at the output. @code(prcrev) is a Perry Cook's
+reverberator which is based on the Chowning/Moorer/Schroeder
+reverberators using networks of simple allpass and comb delay filters.
+This one implements two series allpass units and two parallel comb filters.
+The @i(sound) input may be single or multi-channel. The @i(decay) time is
+in seconds, and @i(mix) sets the mixture of input sound reverb sound,
+where 0.0 means input only (dry) and 1.0 means reverb only (wet).
+
+@label(stkchorus-sec)
+@codef{stkchorus(@pragma(defn)@index(stkchorus)@index(chorus)@index(effect, chorus)@index(STK chorus)@i(sound), @i(depth), @i(freq), @i(mix) [, @i(delay)])} @c{[sal]}@*
+@altdef{@code{(stkchorus @i(sound) @i(depth) @i(freq) @i(mix) [@i(delay)])} @c{[lisp]}}@\Chorus
+implemented in STK. The input @i(sound) can be single or multi-channel.
+The @code(FLONUM) parameters @i(depth) and @i(freq) set
+the modulation
+depth from 0 to 1
+and modulation frequency (in Hz), and @i(mix) sets the mixture
+of input sound and chorused sound, where 0.0 means input sound only (dry)
+and 1.0 means chorused sound only (wet). The parameter @i(delay) is a
+ @code(FIXNUM) representing the median desired delay length in samples.
+
+@label(stkpitshift-sec)
+@codef{pitshift(@pragma(defn)@index(pitshift)@index(pitch shift)@index(effect, pitch shift)@index(STK pitch shift)@i(sound), @i(shift), @i(mix))} @c{[sal]}@*
+@altdef{@code[(pitshift @i(sound) @i(shift) @i(mix))] @c{[lisp]}}@\A pitch
+ shifter implemented in STK. The input @i(sound), a single-channel
+ or multi-channel @code(SOUND) is pitch-shifted by @i(shift),
+a @code(FLONUM) ratio. A value of 1.0 means no shift. The parameter @i(mix)
+ sets the mixture of input and shifted sounds. A value of 0.0
+means input only (dry)
+and a value of 1.0 means shifted sound only (wet).
+@end(fndefs)
+
+@paragraph(Physical Models)
+@begin(fndefs)
+@label(clarinet-sec)
+@codef{clarinet(@pragma(defn)@index(clarinet)@index(stk clarinet)@i(step), @i(breath-env))} @c{[sal]}@*
+@altdef{@code[(clarinet @i(step) @i(breath-env))] @c{[lisp]}}@\A
+physical model of a clarinet from STK. The @i(step) parameter is a @code(FLONUM)
+that controls the tube length, and the @i(breath-env) (a @code(SOUND))
+controls the air pressure
+and also determines the length of the resulting sound. The @i(breath-env) signal
+should range from zero to one.
+
+@codef{clarinet-freq(@index(clarinet)@pragma(defn)@index(clarinet-freq)@index(stk clarinet)@i(step), @i(breath-env), @i(freq-env))} @c{[sal]}@*
+@altdef{@code[(clarinet-freq @i(step) @i(breath-env) @i(freq-env))] @c{[lisp]}}@\A variation of @code(clarinet)
+that includes a variable frequency control, @i(freq-env), which specifies
+frequency deviation in Hz. The duration of the resulting sound is the minimum
+duration of @i(breath-env) and @i(freq-env). These parameters may be of type
+@code(FLONUM) or @code(SOUND). @code(FLONUM)s are coerced into @code(SOUND)s
+with a nominal duration arbitrarily set to 30.
+
+@codef{clarinet-all(@index(clarinet)@pragma(defn)@index(clarinet-all)@index(stk clarinet)@i(step), @i(breath-env), @i(freq-env), @i(vibrato-freq), @i(vibrato-gain),
+@i(reed-stiffness), @i(noise))} @c{[sal]}@*
+@altdef{@code[(clarinet-all @i(step) @i(breath-env) @i(freq-env) @i(vibrato-freq) @i(vibrato-gain) @i(reed-stiffness) @i(noise))] @c{[lisp]}}@\A variation of @code(clarinet-freq)
+that includes controls @i(vibrato-freq) (a @code(FLONUM) for vibrato frequency in Hertz),
+@i(vibrato-gain) (a @code(FLONUM) for the amount of amplitude vibrato),
+@i(reed-stiffness) (a @code(FLONUM) or @code(SOUND) controlling reed stiffness in the clarinet
+model), and @i(noise) (a @code(FLONUM) or @code(SOUND) controlling noise amplitude in the input
+air pressure). The @i(vibrato-gain) is a number from zero to one, where zero
+indicates no vibrato, and one indicates a plus/minus 50% change in breath
+envelope values. Similarly, the @i(noise) parameter ranges from zero to one where
+zero means no noise and one means white noise with a peak amplitude of
+plus/minus 40% of the @i(breath-env). The @i(reed-stiffness) parameter varies
+from zero to one.
+The duration of the resulting sound is the minimum duration of
+@i(breath-env), @i(freq-env), @i(reed-stiffness), and @i(noise). As with
+@code(clarinet-freq), these parameters may be either @code(FLONUM)s or
+@code(SOUND)s, and @code(FLONUM)s are coerced to sounds with a nominal
+duration of 30.
+
+@label(sax-sec)
+@codef{sax(@pragma(defn)@index(sax)@index(stk sax)@i(step), @i(breath-env))} @c{[sal]}@*
+@altdef{@code[(sax @i(step) @i(breath-env))] @c{[lisp]}}@\A
+physical model of a sax from STK. The @i(step) parameter is a @code(FLONUM)
+that controls the tube length, and the @i(breath-env) controls the air pressure
+and also determines the length of the resulting sound. The @i(breath-env) signal
+should range from zero to one.
+
+@codef{sax-freq(@pragma(defn)@index(sax)@index(sax-freq)@index(stk sax)@i(step), @i(breath-env), @i(freq-env))} @c{[sal]}@*
+@altdef{@code[(sax-freq @i(step) @i(breath-env) @i(freq-env))] @c{[lisp]}}@\A variation of @code(sax)
+that includes a variable frequency control, @i(freq-env), which specifies
+frequency deviation in Hz. The duration of the resulting sound is the minimum
+duration of @i(breath-env) and @i(freq-env). These parameters may be of type
+@code(FLONUM) or @code(SOUND). @code(FLONUM)s are coerced into @code(SOUND)s
+with a nominal duration arbitrarily set to 30.
+
+@codef{sax-all(@pragma(defn)@index(sax)@index(sax-all)@index(stk sax)@i(step), @i(breath-env), @i(freq-env), @i(vibrato-freq), @i(vibrato-gain),
+@i(reed-stiffness), @i(noise), @i(blow-pos), @i(reed-table-offset))} @c{[sal]}@*
+@altdef{@code[(sax-all @i(step) @i(breath-env) @i(freq-env) @i(vibrato-freq) @i(vibrato-gain) @i(reed-stiffness) @i(noise) @i(blow-pos) @i(reed-table-offset))] @c{[lisp]}}@\A variation of
+ @code(sax-freq)
+that includes controls @i(vibrato-freq) (a @code(FLONUM) for vibrato frequency in Hertz),
+@i(vibrato-gain) (a @code(FLONUM) for the amount of amplitude vibrato),
+@i(reed-stiffness) (a @code(SOUND) controlling reed stiffness in the sax
+model), @i(noise) (a @code(SOUND) controlling noise amplitude in the input
+air pressure), @i(blow-pos) (a @code(SOUND) controlling the point of excitation
+of the air column), and @i(reed-table-offset) (a @code(SOUND) controlling a
+parameter of the reed model). The @i(vibrato-gain) is a number from zero to one, where zero
+indicates no vibrato, and one indicates a plus/minus 50% change in breath
+envelope values. Similarly, the @i(noise) parameter ranges from zero to one where
+zero means no noise and one means white noise with a peak amplitude of
+plus/minus 40% of the @i(breath-env). The @i(reed-stiffness), @i(blow-pos), and
+@i(reed-table-offset) parameters all vary from zero to one.
+The duration of the resulting sound is the minimum duration of
+@i(breath-env), @i(freq-env), @i(reed-stiffness), @i(noise), @i(breath-env),
+ @i(blow-pos), and @i(reed-table-offset). As with
+@code(sax-freq), these parameters may be either @code(FLONUM)s or
+@code(SOUND)s, and @code(FLONUM)s are coerced to sounds with a nominal
+duration of 30.
+
+@label(flute-sec)
+@codef{flute(@pragma(defn)@index(flute)@index(STK flute)@i(step), @i(breath-env))} @c{[sal]}@*
+@altdef{@code[(flute @i(step) @i(breath-env))] @c{[lisp]}}@\A physical model of a flute from STK.
+The @i(step) parameter is a @code(FLONUM) that controls the tube
+length, and the @i(breath-env)
+controls the air pressure and also determines the starting time and
+length of the resulting sound. The @i(breath-env) signal should
+ range from zero to one.
+
+@codef{flute-freq(@pragma(defn)@index(flute-freq)@index(STK flute)@i(step), @i(breath-env), @i(freq-env))} @c{[sal]}@*
+@altdef{@code[(flute-freq @i(step) @i(breath-env) @i(freq-env))] @c{[lisp]}}@\A variation of @code(flute)
+ that includes a variable frequency control, @i(freq-env), which
+ specifies frequency deviation in Hz. The duration of the
+resulting sound is the minimum duration of @i(breath-env) and
+@i(freq-env). These parameters may be of type @code(FLONUM) or
+ @code(SOUND). @code(FLONUM)s are coerced into SOUNDs with a
+nominal duration arbitrary set to 30.
+
+@codef{flute-all(@pragma(defn)@index(flute-all)@index(STK flute)@i(step), @i(breath-env), @i(freq-env), @i(vibrato-freq),
+ @i(vibrato-gain), @i(jet-delay), @i(noise))} @c{[sal]}@*
+@altdef{@code[(flute-all @i(step) @i(breath-env) @i(freq-env) @i(vibrato-freq) @i(vibrato-gain) @i(jet-delay) @i(noise))] @c{[lisp]}}@\A variation of
+@code(clarinet-freq) that includes controls @i(vibrato-freq) (a
+@code(FLONUM) for vibrato frequency in Hz), @i(vibrato-gain) (a
+ @code(FLONUM) for the amount of amplitude vibrato), @i(jet-delay)
+ (a @code(FLONUM) or @code(SOUND) controlling jet delay in the
+ flute model), and
+noise (a @code(FLONUM) or @code(SOUND) controlling noise amplitude
+in the input air pressure). The @i(vibrato-gain) is a number from zero
+ to one where zero means no vibrato, and one indicates a plus/minus
+50% change in breath envelope values. Similarly, the @i(noise) parameter
+ ranges from zero to one, where zero means no noise and one means white
+noise with a peak amplitude of
+ plus/minus 40% of the @i(breath-env). The @i(jet-delay) is a ratio
+ that controls a delay length from the flute model, and therefore it
+changes the pitch of the resulting sound. A value of 0.5 will maintain
+the pitch indicated by the step parameter. The duration of the
+resulting sound is the minimum duration of @i(breath-env), @i(freq-env),
+@i(jet-delay), and @i(noise). These parameters may be either
+@code(FLONUM)s or @code(SOUND)s, and @code(FLONUM)s are coerced
+ to sounds with a nominal duration of 30.
+
+@label(bowed-sec)
+@codef{bowed(@pragma(defn)@index(bowed)@index(STK bowed string)@i(step), @i(bowpress-env))} @c{[sal]}@*
+@altdef{@code[(bowed @i(step) @i(bowpress-env))] @c{[lisp]}}@\A physical model of a bowed string
+ instrument from STK. The @i(step) parameter is a @code(FLONUM)
+ that controls the string length,
+ and the @i(bowpress-env) controls the bow pressure and also
+determines the duration of the resulting sound. The @i(bowpress-env)
+ signal should range from zero to one.
+
+@codef{bowed-freq(@pragma(defn)@index(bowed-freq)@index(STK bowed-freq)@i(step), @i(bowpress-env), @i(freq-env))} @c{[sal]}@*
+@altdef{@code[(bowed-freq @i(step) @i(bowpress-env) @i(freq-env))] @c{[lisp]}}@\A variation of @code(bowed)
+ that includes a variable frequency control, @i(freq-env), which
+ specifies frequency deviation in Hz. The duration of the resulting
+ sound is the minimum duration of @i(bowpress-env) and @i(freq-env).
+These parameters may be of type @code(FLONUM) or @code(SOUND).
+@code(FLONUM)s are coerced into @code(SOUND)s
+ with a nominal duration arbitrarily set to 30s.
+
+@label(mandolin-sec)
+@codef{mandolin(@pragma(defn)@index(mandolin)@index(STK mandolon)@i(step), @i(dur), &optional @i(detune))} @c{[sal]}@*
+@altdef{@code[(mandolin @i(step) @i(dur) @i(detune))] @c{[lisp]}}@\A physical model of a
+ plucked double-string instrument from STK. The @i(step) parameter
+ is a @code(FLONUM) wich specifies the desired pitch, @i(dur)
+ means the duration of the resulting sound and detune is a
+@code(FLONUM) that controls the relative detune of the two strings.
+A value of 1.0 means unison. The default value is 4.0.
+Note: @i(body-size) (see @code(snd-mandolin) does not seem to
+ work correctly, so a default value is always used
+ by @code(mandolin).
+
+@label(bandedwg-sec)
+@codef{wg-uniform-bar(@pragma(defn)@index(wg-uniform-bar)@index(STK uniform bar)@i(step), @i(bowpress-env))} @c{[sal]}@*
+@altdef{@code[(wg-uniform-bar @i(step) @i(bowpress-env))] @c{[lisp]}}
+
+@codef{wg-tuned-bar(@pragma(defn)@index(wg-tuned-bar)@index(STK tuned bar)@i(step), @i(bowpress-env))} @c{[sal]}@*
+@altdef{@code[(wg-tuned-bar @i(step) @i(bowpress-env))] @c{[lisp]}}
+
+@codef{wg-glass-harm(@pragma(defn)@index(wg-glass-harm)@index(STK glass harmonica)@i(step), @i(bowpress-env))} @c{[sal]}@*
+@altdef{@code[(wg-glass-harm @i(step) @i(bowpress-env))] @c{[lisp]}}
+
+@codef{wg-tibetan-bowl(@pragma(defn)@index(wg-tibetan-bowl)@index(STK tibetan bowl)@i(step), @i(bowpress-env))} @c{[sal]}@*
+@altdef{@code[(wg-tibetan-bowl @i(step) @i(bowpress-env))] @c{[lisp]}}@\These
+sounds are presets for a Banded Wave Guide Percussion instrument implemented in STK.
+The parameter @i(step) is a @code(FLONUM)
+ that controls the resultant pitch, and @i(bowpress-env) is a @code(SOUND) ranging
+from zero to one that controls a parameter of the model. In addition,
+@i(bowpress-env) determines the duration of the resulting sound.
+(Note: The @i(bowpress-env) does not seems influence the timbral
+quality of the resulting sound).
+
+@label(modalbar-sec)
+@codef{modalbar(@pragma(defn)@index(modalbar)@index(STK modal bar)@i(preset), @i(step), @i(dur))} @c{[sal]}@*
+@altdef{@code[(modalbar @i(preset) @i(step) @i(dur))] @c{[lisp]}}@\A physical model of a struck bar
+ instrument implemented in STK. The parameter @i(preset) is one of the
+symbols
+@code(MARIMBA), @code(VIBRAPHONE), @code(AGOGO), @code(WOOD1),
+@code(RESO), @code(WOOD2), @code(BEATS), @code(TWO-FIXED), or
+@code(CLUMP). The symbol must be quoted, e.g. for SAL syntax use
+@code[quote(marimba)], and for Lisp syntax use @code('marimba).
+The parameter @i(step) is a @code(FLONUM) that
+sets the pitch (in steps), and @i(dur) is the duration in seconds.
+
+@label(sitar-sec)
+@codef{sitar(@pragma(defn)@index(sitar)@index(STK sitar)@i(step), @i(dur))} @c{[sal]}@*
+@altdef{@code[(sitar @i(step) @i(dur))] @c{[lisp]}}@\A sitar physical model implemented in STK.
+The parameter @i(step) is a @code(FLONUM) that sets the pitch,
+ and @i(dur) is the duration.
+@end(fndefs)
+
+@paragraph(More Behaviors)
+@begin(fndefs)
+@label(clip-sec)
+@codef{clip(@pragma(defn)@index(clip)@index(limit)@i(sound), @i(peak))} @c{[sal]}@*
+@altdef{@code[(clip @i(sound) @i(peak))] @c{[lisp]}}@\Hard limit @i(sound)
+to the given @i(peak), a positive number. The samples of @i(sound) are constrained between an upper value
+of @i(peak) and a lower value of @subtract()@i(peak). If @i(sound) is a number, @code(clip) will return @i(sound) limited by @i(peak). If @i(sound) is a multichannel sound, @code(clip) returns a multichannel sound where each channel is clipped. The result has the type, sample rate, starting time, etc. of @i(sound).
+
+@label(s-abs-sec)
+@codef{s-abs(@pragma(defn)@index(s-abs)@index(absolute value)@i(sound))} @c{[sal]}@*
+@altdef{@code[(s-abs @i(sound))] @c{[lisp]}}@\A generalized absolute value function. If @i(sound) is a @code(SOUND), compute the absolute value of each sample. If @i(sound) is a number, just compute the absolute value. If @i(sound) is a multichannel sound, return a multichannel sound with @code(s-abs) applied to each element. The result has the type, sample rate, starting time, etc. of @i(sound).
+
+@label(s-sqrt-sec)
+@codef{s-sqrt(@pragma(defn)@index(s-sqrt)@index(square root)@i(sound))} @c{[sal]}@*
+@altdef{@code[(s-sqrt @i(sound))] @c{[lisp]}}@\A generalized square root function. If @i(sound) is a @code(SOUND), compute the square root of each sample. If @i(sound) is a number, just compute the square root. If @i(sound) is a multichannel sound, return a multichannel sound with @code(s-sqrt) applied to each element. The result has the type, sample rate, starting time, etc. of @i(sound). In taking square roots, if an input sample is less than zero, the corresponding output sample is zero. This is done because the square root of a negative number is undefined.
+
+@label(s-exp-sec)
+@codef{s-exp(@pragma(defn)@index(s-exp)@index(exponential)@i(sound))} @c{[sal]}@*
+@altdef{@code[(s-exp @i(sound))] @c{[lisp]}}@\A generalized exponential function. If @i(sound) is a @code(SOUND), compute @i(e)@+(@i(x)) for each sample @i(x). If @i(sound) is a number @i(x), just compute @i(e)@+(@i(x)). If @i(sound) is a multichannel sound, return a multichannel sound with @code(s-exp) applied to each element. The result has the type, sample rate, starting time, etc. of @i(sound).
+
+@label(s-log-sec)
+@codef{s-log(@pragma(defn)@index(s-log)@index(logorithm)@index(natural log)@i(sound))} @c{[sal]}@*
+@altdef{@code[(s-log @i(sound))] @c{[lisp]}}@\A generalized natural log function. If @i(sound) is a @code(SOUND), compute @i(ln)(@i(x)) for each sample @i(x). If @i(sound) is a number @i(x), just compute @i(ln)(@i(x)). If @i(sound) is a multichannel sound, return a multichannel sound with @code(s-log) applied to each element. The result has the type, sample rate, starting time, etc. of @i(sound). Note that the @i(ln) of 0 is undefined (some implementations return negative infinity), so use this function with care.
+
+@label(s-max-sec)
+@codef{s-max(@pragma(defn)@index(s-max)@index(maximum)@i(sound1), @i(sound2))} @c{[sal]}@*
+@altdef{@code[(s-max @i(sound1) @i(sound2))] @c{[lisp]}}@\Compute the maximum of two functions, @i(sound1) and @i(sound2). This function also accepts numbers and multichannel sounds and returns the corresponding data type. The start time of the result is the maximum of the start times of @i(sound1) and @i(sound2). The logical stop time and physical stop time of the result is the minimum of the logical stop and physical stop times respectively of @i(sound1) and @i(sound2). Note, therefore, that the result value is zero except within the bounds of @i(both) input sounds.
+
+@codef{s-min(@pragma(defn)@index(s-min)@index(minimum)@i(sound1), @i(sound2))} @c{[sal]}@*
+@altdef{@code[(s-min @i(sound1) @i(sound2))] @c{[lisp]}}@\Compute the minimum of two functions, @i(sound1) and @i(sound2). This function also accepts numbers and multichannel sounds and returns the corresponding data type. The start time of the result is the maximum of the start times of @i(sound1) and @i(sound2). The logical stop time and physical stop time of the result is the minimum of the logical stop and physical stop times respectively of @i(sound1) and @i(sound2). Note, therefore, that the result value is zero except within the bounds of @i(both) input sounds.
+
+@codef{osc-note(@pragma(defn)@index(osc-note)@i(pitch) [, @i(duration), @i(env), @i(loud),
+@i(table)])} @c{[sal]}@*
+@altdef{@code{(osc-note @i(pitch) [@i(duration) @i(env) @i(loud) @i(table)])} @c{[lisp]}}@\Same as @code(osc), but @code(osc-note)
+multiplies the result by @i(env). The @i(env) may be a sound,
+or a list supplying (@i(t@-[1]) @i(t@-[2])
+@i(t@-[4]) @i(l@-[1]) @i(l@-[2]) @i(l@-[3])). The result has a sample rate of @code(*sound-srate*).
+
+@label(quantize-sec)
+@codef{quantize(@pragma(defn)@index(quantize)@i(sound), @i(steps))} @c{[sal]}@*
+@altdef{@code[(quantize @i(sound) @i(steps))] @c{[lisp]}}@\Quantizes @i(sound) as follows: @i(sound) is multiplied by @i(steps) and rounded to the nearest integer. The result is then divided by @i(steps). For example, if @i(steps) is 127, then a signal that ranges from -1 to +1 will be quantized to 255 levels (127 less than zero, 127 greater than zero, and zero itself). This would match the quantization Nyquist performs when writing a signal to an 8-bit audio file. The @i(sound) may be multi-channel.
+
+@codef{ramp(@pragma(defn)@index(ramp)[@i(duration)])} @c{[sal]}@*
+@altdef{@code{(ramp [@i(duration)])} @c{[lisp]}}@\Returns a
+linear ramp from 0 to 1
+over @i(duration) (default is 1). The function actually reaches 1 at
+@i(duration), and therefore has one extra sample, making the total duration
+be @i(duration) + 1/@code(*Control-srate*). See Figure @ref(ramp-fig) for
+more detail. Ramp is unaffected by the @code(sustain) transformation. The
+effect of time warping is to warp the starting and ending times only. The
+ramp itself is unwarped (linear). The sample rate is @code(*control-srate*).
+
+@label(rms-sec)
+@codef{rms(@pragma(defn)@index(rms)@i(sound) [, @i(rate), @i(window-size)])} @c{[sal]}@*
+@altdef{@code{(rms @i(sound) [@i(rate) @i(window-size)])} @c{[lisp]}}@\Computes the RMS of @i(sound) using a square window of size @i(window-size). The result has a sample rate of @i(rate). The default value of @i(rate) is 100 Hz, and the default window size is 1/rate seconds (converted to samples). The @i(rate) is a @code(FLONUM) and @i(window-size) is a @code(FIXNUM).
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.37 in, width = 4.5 in, magnify = 0.75,
+ postscript = "rampfig.ps"))
+@html(<img src="fig6.gif"><br><br>)
+@fillcaption[Ramps generated by @code(pwl) and @code(ramp) functions. The
+@code(pwl) version ramps toward the breakpoint (1, 1), but in order to ramp
+back to zero at breakpoint (1, 0), the function never reaches an amplitude
+of 1. If used at the beginning of a @code(seq) construct, the next sound
+will begin at time 1. The @code(ramp) version actually reaches breakpoint
+(1, 1); notice that it is one sample longer than the @code(pwl) version. If
+used in a sequence, the next sound after @code(ramp) would start at time 1 +
+@i(P), where @i(P) is the sample period.]
+@tag(ramp-fig)
+@end(figure)
+
+@begin(fndefs)
+@label(recip-sec)
+@codef{recip(@pragma(defn)@index(recip)@index(reciprocal)@index(division)@i(sound))} @c{[sal]}@*
+@altdef{@code[(recip @i(sound))] @c{[lisp]}}@\A generalized reciprocal function.
+If @i(sound) is a @code(SOUND), compute 1/@i(x) for each sample @i(x). If @i(sound) is a number @i(x), just compute 1/@i(x). If @i(sound) is a multichannel sound, return a multichannel sound with @code(recip) applied to each element. The result has the type, sample rate, starting time, etc. of @i(sound). Note that the reciprocal of 0 is undefined (some implementations return infinity), so use this function with care on sounds. Division of sounds is accomplished by multiplying by the reciprocal. Again, be careful not to divide by zero.
+
+@codef{s-rest(@index(rest)@pragma(defn)@index(s-rest)[@i(duration)])} @c{[sal]}@*
+@altdef{@code{(s-rest [@i(duration)])} @c{[lisp]}}@\Create silence (zero samples)
+for the given
+@i(duration) at the sample rate @code(*sound-srate*).
+Default duration is 1.0 sec, and the sound is transformed in time according
+to @code[*warp*]. @p(Note:) @code(rest) is a Lisp function that is equivalent to @code(cdr). Be careful to use @code(s-rest) when you need a sound!
+
+@label(noise-sec)
+@codef{noise(@pragma(defn)@index(noise)[@i(duration)])} @c{[sal]}@*
+@altdef{@code[(noise @i(duration))] @c{[lisp]}}@\Generate noise with the given
+@i(duration). Duration (default is 1.0)
+is transformed according to @code[*warp*]. The
+sample rate is @code(*sound-srate*) and the amplitude is +/- @code(*loud*).
+
+@label(yin-sec)
+@codef{yin(@pragma(defn)@index(yin)@index(pitch detection)@index(fundamenal frequency
+estimation)@index(estimate frequency)@index(frequency analysis)@index(period
+estimation)@i(sound), @i(minstep), @i(maxstep), @i(stepsize))} @c{[sal]}@*
+@altdef{@code[(yin @i(sound) @i(minstep) @i(maxstep) @i(stepsize))] @c{[lisp]}}@\Fundamental
+frequency estimation (pitch detection. Use the YIN algorithm to estimate
+the fundamental frequency of @i(sound), which must be a @code(SOUND).
+The @i(minstep), a @code(FLONUM), is the minimum frequency considered (in steps),
+@i(maxstep), a @code(FLONUM), is the maximum frequency considered (in steps), and
+@i(stepsize), a @code(FIXNUM), is the desired hop size. The result is
+a ``stereo'' signal,
+i.e. an array of two @code(SOUND)s, both at the same sample rate, which is
+approximately the sample rate of @i(sound) divided by @i(stepsize).
+The first @code(SOUND) consists of frequency estimates. The second sound consists
+of values that measure the confidence or reliability of the frequency estimate.
+A small value (less than 0.1) indicates fairly high confidence. A larger value
+indicates lower confidence. This number can also be thought of as a ratio of
+non-periodic power to periodic power. When the number is low, it means the signal
+is highly periodic at that point in time, so the period estimate will be
+reliable.
+Hint #1: See
+Alain de Cheveigne and Hideki Kawahara's article "YIN, a Fundamental Frequency
+Estimator for Speech and Music" in the Journal of the
+Acoustic Society of America, April 2002 for details on the yin algorithm.
+Hint #2: Typically, the @i(stepsize) should be at least the expected number
+of samples in one period so that the
+fundamental frequency estimates are calculated at a rate far below
+the sample rate of the signal. Frequency does not change rapidly and
+the yin algorithm is fairly slow. To optimize speed,
+you may want to use less than 44.1 kHz sample rates for input sounds. Yin
+uses interpolation to achieve potentially fractional-sample-accurate estimates,
+so higher sample rates do not necessarily help the algorithm and definitely
+slow it down. The computation time is O(@i(n)@+(2)) per estimate,
+where @i(n) is the number
+of samples in the longest period considered. Therefore, each increase
+of @i(minstep) by 12 (an octave) gives you a factor of 4 speedup, and
+each decrease of the sample rate of @i(sound) by a factor of
+two gives you another factor of 4 speedup. Finally, the number of estimates is
+inversely proportional to @i(stepsize).
+Hint #3: Use @code(snd-srate) (see Section @ref(snd-srate-sec)) to get
+the exact sample rate of the result, which will be the sample rate of
+ @i(sound) divided by @i(stepsize).
+E.g. @code{(snd-srate (aref yin-output 0))},
+where @code(yin-output) is a result returned by @code(yin), will be the
+sample rate of the estimates.
+
+@end(fndefs)
+
+@section(Transformations)@index(Transformations)
+@label(transformations-sec)
+These functions change the environment that is seen by other high-level
+functions. Note that these changes are usually relative to the
+current environment. There are also ``absolute'' versions of each
+transformation function, with the exception of @code(seq),
+ @code(seqrep), @code(sim), and @code(simrep). The
+``absolute'' versions (starting or ending with ``abs'') do not look at the
+current environment, but rather set an environment variable to a specific value.
+In this way, sections of code can be insulated from external
+transformations.
+
+@begin(fndefs)
+@codef{abs-env(@pragma(defn)@index(abs-env)@i(beh))} @c{[sal]}@*
+@altdef{@code[(abs-env @i(beh))] @c{[lisp]}}@\Compute @i(beh) in the default environment.
+This is useful for computing waveform tables and signals that are
+``outside'' of
+time. For example, @code[(at 10.0 (abs-env (my-beh)))] is equivalent to
+@code[(abs-env (my-beh))] because @code(abs-env) forces the default environment. Or in SAL, we would say @code[abs-env(my-beh()) @@ 10] is equivalent to @code[abs-env(my-beh())].
+
+@codef{at(@pragma(defn)@index(at)@i(time), @i(beh))} @c{[sal]}@*
+@altdef{@code[(at @i(time) @i(beh))] @c{[lisp]}}@\Evaluate @i(beh) with
+@code(*warp*@index(*warp*)) shifted by @i(time). In SAL, you can use the infix
+operator @code(@@) as in @code[@i(beh) @@ @i(time)]. To discover how the
+environment is shifting time, use @code[local-to-global(@i(time))]. Most
+commonly, you call @code[local-to-global(0)] to find when a sound created
+in the current environment will start, expressed in absolute (global) terms.
+This can be regarded as the ``current time.''
+
+@codef{at-abs(@pragma(defn)@index(at-abs)@i(time), @i(beh))} @c{[sal]}@*
+@altdef{@code[(at-abs @i(time) @i(beh))] @c{[lisp]}}@\Evaluate @i(beh) with
+@code(*warp*@index(*warp*)) shifted so that local time 0 maps to @i(time). In SAL, you can use the infix operator @code[@@@@] as in @code[@i(beh) @@@@ @i(time)].
+
+@label(continuous-control-warp)
+@codef{continuous-control-warp(@pragma(defn)@index(continuous-control-warp)@i(beh))} @c{[sal]}@*
+@altdef{@code[(continuous-control-warp @i(beh))] @c{[lisp]}}@\Applies the current warp environment to the signal returned by @i(beh). The result has the default control sample rate @code(*control-srate*). Linear interpolation is currently used. Implementation: @i(beh) is first evaluated without any shifting, stretching, or warping. The result is functionally composed with the inverse of the environment's warp function.
+
+@label(continuous-sound-warp)
+@codef{continuous-sound-warp(@pragma(defn)@index(continuous-sound-warp)@i(beh))} @c{[sal]}@*
+@altdef{@code[(continuous-sound-warp @i(beh))] @c{[lisp]}}@\Applies the current warp environment to the signal returned by @i(beh). The result has the default sound sample rate @code(*sound-srate*). Linear interpolation is currently used. See @code(continuous-control-warp) for implementation notes.
+
+@label(control-srate-abs-sec)
+@codef{control-srate-abs(@pragma(defn)@index(control-srate-abs)@i(srate),
+@i(beh))} @c{[sal]}@*
+@altdef{@code[(control-srate-abs @i(srate) @i(beh))] @c{[lisp]}}@\Evaluate @i(beh) with @code(*control-srate*@index(*control-srate*))
+set to sample rate @i(srate). @p(Note:) there is no ``relative'' version of
+this function.
+
+@codef{extract(@pragma(defn)@index(extract)@i(start), @i(stop), @i(beh))} @c{[sal]}@*
+@altdef{@code[(extract @i(start) @i(stop) @i(beh))] @c{[lisp]}}@\Returns a sound
+which is the portion of
+@i(beh) between @i(start) and @i(stop). Note that this is done
+relative to the current @code(*warp*). The result is shifted
+to start according to @code(*warp*), so normally the result will start without a delay of @i(start).
+
+@codef{extract-abs(@pragma(defn)@index(extract-abs)@i(start), @i(stop), @i(beh))} @c{[sal]}@*
+@altdef{@code[(extract-abs @i(start) @i(stop) @i(beh))] @c{[lisp]}}@\Returns a sound which
+is the portion of
+@i(beh) between @i(start) and @i(stop), independent of the
+current @code(*warp*). The result is shifted
+to start according to @code(*warp*).
+
+@codef{loud(@pragma(defn)@index(loud)@i(volume), @i(beh))} @c{[sal]}@*
+@altdef{@code[(loud @i(volume) @i(beh))] @c{[lisp]}}@\Evaluates @i(beh) with @code(*loud*)
+incremented by @i(volume). (Recall that @code(*loud*) is in decibels, so increment is the proper operation.)
+
+@codef{loud-abs(@pragma(defn)@index(loud-abs)@i(volume), @i(beh))} @c{[sal]}@*
+@altdef{@code[(loud-abs @i(volume) @i(beh))] @c{[lisp]}}@\Evaluates @i(beh) with @code(*loud*)
+set to @i(volume).
+
+@label(sound-srate-abs-sec)
+@codef{sound-srate-abs(@pragma(defn)@index(sound-srate-abs)@i(srate), @i(beh))} @c{[sal]}@*
+@altdef{@code[(sound-srate-abs @i(srate) @i(beh))] @c{[lisp]}}@\Evaluate @i(beh) with @code(*sound-srate*@index(*sound-srate*)) set to sample rate @i(srate). @p(Note:) there is no ``relative'' version of this function.
+
+@codef{stretch(@pragma(defn)@index(stretch)@i(factor), @i(beh))} @c{[sal]}@*
+@altdef{@code[(stretch @i(factor) @i(beh))] @c{[lisp]}}@\Evaluates @i(beh) with
+@code(*warp*) scaled by @i(factor). The effect is to ``stretch'' the result
+of @i(beh) (under the current environment) by @i(factor). See Chapter
+@ref(warp-chap) for more information. Use @code[get-duration(@i(dur))] to
+get the nominal actual duration of a behavior that locally has a duration
+of @i(dur). Here, ``nominal'' means what would be expected if the behavior
+obeys the shift, stretch, and warp components of the environment. (Any
+behavior is free to deviate from the nominal timing. For example, a percussion
+sound might have a fixed duration independent of the stretch factor.) Also,
+``actual'' means global or absolute time, and ``locally'' means within the
+environment where @code[get-duration] is called. @code[get-duration] works
+by mapping the current time (local time 0) using @code[local-to-global] to
+obtain an actual start time, and mapping @i(dur) to obtain an actual end time.
+The difference is returned.
+
+@codef{stretch-abs(@pragma(defn)@index(stretch-abs)@i(factor), @i(beh))} @c{[sal]}@*
+@altdef{@code[(stretch-abs @i(factor) @i(beh))] @c{[lisp]}}@\Evaluates @i(beh) with @code(*warp*) set to a linear time transformation where each unit of logical time maps to @i(factor) units of real time. The effect is to stretch the nominal behavior of @i(beh) (under the default global environment) by @i(factor). See Chapter @ref(warp-chap) for more information.
+
+@codef{sustain(@pragma(defn)@index(sustain)@index(legato)@index(overlap)@index(stacatto)@i(factor), @i(beh))} @c{[sal]}@*
+@altdef{@code[(sustain @i(factor) @i(beh))] @c{[lisp]}}@\Evaluates @i(beh) with @code(*sustain*) scaled by @i(factor). The effect is to ``stretch'' the result of @i(beh) (under the current environment) by @i(factor); however, the logical stop times are not stretched. Therefore, the overall duration of a sequence is not changed, and sounds will tend to overlap if @code(*sustain*) is greater than one (legato) and be separated by silence if @code(*sustain*) is less than one.
+
+@codef{sustain-abs(@pragma(defn)@index(sustain-abs)@i(factor), @i(beh))} @c{[sal]}@*
+@altdef{@code[(sustain-abs @i(factor) @i(beh))] @c{[lisp]}}@\Evaluates @i(beh) with @code(*sustain*) set to @i(factor). (See @code(sustain), above.)
+
+@codef{transpose(@pragma(defn)@index(transpose)@i(amount), @i(beh))} @c{[sal]}@*
+@altdef{@code[(transpose @i(amount) @i(beh))] @c{[lisp]}}@\Evaluates @i(beh) with
+@code(*transpose*) shifted by @i(amount). The effect is relative transposition by @i(amount) semitones.
+
+@codef{transpose-abs(@pragma(defn)@index(transpose-abs)@i(amount), @i(beh))} @c{[sal]}@*
+@altdef{@code[(transpose-abs @i(amount) @i(beh))] @c{[lisp]}}@\Evaluates @i(beh) with
+@code(*transpose*) set to @i(amount). The effect is the transposition of the nominal pitches in @i(beh) (under the default global environment) by @i(amount).
+
+@codef{warp(@pragma(defn)@index(warp)@i(fn), @i(beh))} @c{[sal]}@*
+@altdef{@code[(warp @i(fn) @i(beh))] @c{[lisp]}}@\Evaluates @i(beh) with @code(*warp*) modified by @i(fn). The idea is that @i(beh) and @i(fn) are written in the same time system, and @i(fn) warps that time system to local time. The current environment already contains a mapping from local time to global (real) time. The value of @code(*warp*) in effect when @i(beh) is evaluated is the functional composition of the initial @code(*warp*) with @i(fn).
+
+@codef{warp-abs(@pragma(defn)@index(warp-abs)@i(fn), @i(beh))} @c{[sal]}@*
+@altdef{@code[(warp-abs @i(fn) @i(beh))] @c{[lisp]}}@\Evaluates @i(beh) with @code(*warp*) set to @i(fn). In other words, the current @code(*warp*) is ignored and not composed with @i(fn) to form the new @code(*warp*).
+@end(fndefs)
+
+@section(Combination and Time Structure)@index(Combination)@index(Time Structure)
+These behaviors combine component behaviors into structures, including
+sequences (melodies), simultaneous sounds (chords), and structures based
+on iteration.
+
+@begin(fndefs)
+@label(seq-sec)
+ @codef{seq(@pragma(defn)@index(seq)@i(beh@-[1]) [, @i(beh@-[2]), @r(...)])} @c{[sal]}@*
+@altdef{@code{(seq @i(beh@-[1]) [@i(beh@-[2]) @r(...)])} @c{[lisp]}}@\Evaluates the first behavior
+@i(beh@-[1]) according to @code(*time*) and each successive behavior at the
+@code(logical-stop) time of the previous one. The results are summed to form a
+sound whose @code(logical-stop) is
+the @code(logical-stop) of the last behavior in the sequence. Each behavior
+can result in a multichannel sound, in which case, the logical stop time is
+considered to be the maximum logical stop time of any channel. The number
+of channels in the result is the number of channels of the first behavior.
+If other behaviors return fewer channels, new channels are created containing
+constant zero signals until the required number of channels is obtained. If
+other behaviors return a simple sound rather than multichannel sounds, the
+sound is automatically assigned to the first channel of a multichannel sound
+that is then filled out with zero signals. If another behavior returns more
+channels than the first behavior, the error is reported and the computation
+is stopped. Sample rates are converted up or down to match the sample rate of the first sound in a sequence.
+
+@codef{seqrep(@pragma(defn)@index(seqrep)@i(var), @i(limit), @i(beh))} @c{[sal]}@*
+@altdef{@code[(seqrep @i(var) @i(limit) @i(beh))] @c{[lisp]}}@\Iteratively
+evaluates @i(beh) with the atom
+@i(var) set with values from 0 to @i(limit)-1, inclusive. These sounds
+are placed sequentially in time as if by @code(seq). The symbol @i(var) is
+a @i(read-only) local variable to @i(beh). Assignments are not restricted
+or detected, but may cause a run-time error or crash. In LISP, the syntax is
+ @code[(seqrep (@i(var) @i(limit)) @i(beh))].
+
+@label(sim-sec)
+@codef{sim(@pragma(defn)@index(sim)[@i(beh@-[1]), @i(beh@-[2]), @r(...)])} @c{[sal]}@*
+@altdef{@code{(sim [@i(beh@-[1]) @i(beh@-[2]) @r(...)])} @c{[lisp]}}@\Returns a sound which is the
+sum of the given behaviors evaluated with current value of @code(*warp*).
+If behaviors return multiple channel sounds, the corresponding channels are
+added. If the number of channels does not match, the result has the
+maximum. For example, if a two-channel sound [L, R] is added to a four-channel
+sound [C1, C2, C3, C4], the result is [L + C1, R + C2, C3, C4]. Arguments to @code(sim) may also be numbers. If all arguments are numbers, @code(sim) is equivalent (although slower than) the @code(+) function. If a number is added to a sound, @code(snd-offset) is used to add the number to each sample of the sound. The result of adding a number to two or more sounds with different durations is not defined. Use @code(const) to coerce a number to a sound of a specified duration. An important limitation of @code(sim) is that it cannot handle hundreds of behaviors due to a stack size limitation in XLISP. To compute hundreds of sounds (e.g. notes) at specified times, see @code(timed-seq), below.
+See also @code(sum) below.
+
+@codef{simrep(@pragma(defn)@index(simrep)@i(var), @i(limit), @i(beh))} @c{[sal]}@*
+@altdef{@code[(simrep @i(var) @i(limit) @i(beh))] @c{[lisp]}}@\Iteratively
+evaluates @i(beh) with the atom
+@i(var) set with values from 0 to @i(limit)-1, inclusive. These sounds
+are then placed simultaneously in time as if by @code(sim).
+In LISP, the syntax is
+ @code[(seqrep (@i(var) @i(limit)) @i(beh))].
+
+@label(trigger-sec)
+@codef[trigger(@pragma(defn)@index(trigger)@i(s), @i(beh))] @c{[sal]}@*
+@altdef{@code[(trigger @i(s) @i(beh))] @c{[lisp]}}@\Returns a sound which is the
+sum of instances of the behavior @i(beh). One instance is created each time
+@code(SOUND) @i(s) makes a transition from less than or equal to zero to
+greater than zero. (If the first sample of @i(s) is greater than zero, an
+instance is created immediately.) The sample rate of @i(s) and all behaviors
+must be the same, and the behaviors must be (monophonic) @code(SOUND)s.
+This function is particularly designed to allow behaviors to be invoked
+in real time by making @i(s) a function of a Nyquist slider, which can be
+controlled by a graphical interface or by OSC messages. See @code(snd-slider)
+in Section @ref(snd-slider-sec).
+
+@codef[set-logical-stop(@pragma(defn)@index(set-logical-stop)@i(beh), @i(time))] @c{[sal]}@*
+@altdef{@code[(set-logical-stop @i(beh) @i(time))] @c{[lisp]}}@\Returns a sound with @i(time) as
+the logical stop time.
+
+@codef{sum(@pragma(defn)@index(sum)@index(mix)@i(a) [, @i(b), @r(...)])} @c{[sal]}@*
+@altdef{@code{(sum @i(a) [@i(b) @r(...)])} @c{[lisp]}}@\Returns the sum of @i(a), @i(b), ..., allowing mixed addition of sounds, multichannel sounds and numbers. Identical to @i(sim). In SAL, use the infix ``+'' operator.
+
+@codef{mult(@pragma(defn)@index(mult)@index(product)@index(multiply signals)@i(a) [, @i(b), @r(...)])} @c{[sal]}@*
+@altdef{@code{(mult @i(a) [@i(b) @r(...)])} @c{[lisp]}}@\Returns the product of @i(a), @i(b), ..., allowing mixed multiplication of sounds, multichannel sounds and numbers.
+
+@codef{diff(@pragma(defn)@index(diff)@index(difference of sounds)@i(a), @i(b))} @c{[sal]}@*
+@altdef{@code[(diff @i(a) @i(b))] @c{[lisp]}}@\Returns the difference between @i(a) and @i(b). This function is defined as @code[(sum a (prod -1 b))].
+
+@label(timed-seq-sec)
+@codef{timed-seq(@pragma(defn)@index(timed-seq)@index(score)@index(note list)@i(score))} @c{[sal]}@*
+@altdef{@code[(timed-seq @i(score))] @c{[lisp]}}@\Computes sounds from a note list or ``score.'' The @i(score)
+is of the form: @code[`((@i(time1) @i(stretch1) @i(beh1)) (@i(time2)
+@i(stretch2) @i(beh2)) @r(...))], where @i(timeN) is the starting time,
+@i(stretchN) is the stretch factor, and @i(behN) is the behavior. Note
+that @i(score) is normally a @i(quoted list)! The times must be in
+increasing order, and each @i(behN) is evaluated using lisp's @code(eval),
+so the @i(behN) behaviors cannot refer to local parameters or local
+variables. The advantage of this form over @code(seq) is that the
+behaviors are evaluated one-at-a-time which can take much less stack
+space and overall memory. One special ``behavior'' expression is
+interpreted directly by @code(timed-seq): @code[(SCORE-BEGIN-END)]
+is ignored, not evaluated as a function. Normally, this special
+behavior is placed at time 0 and has two parameters: the score
+start time and the score end time. These are used in Xmusic
+functions. If the behavior has a @code(:pitch) keyword parameter
+which is a list, the list represents a chord, and the expression is
+replaced by a set of behaviors, one for each note in the chord.
+It follows that if @code(:pitch) is @code(nil), the behavior
+represents a rest and is ignored.
+
+@end(fndefs)
+
+
+@section(Sound File Input and Output)
+@index(sound file I/O)
+@begin(fndefs)
+@label(play-sec)
+@codef[play @pragma(defn)@index(play)@i(sound)] @c{[sal]}@*
+@altdef{@code[(play @i(sound))] @c{[lisp]}}@\Play the sound
+through the DAC.
+Note that @code(play) is a command in SAL. In XLISP, it is a function,
+so the syntax is @code[(play @i(sound))], and in SAL, you can call the
+XLISP function as @code[#play(@i(sound))].
+The @code(play) command or function
+writes a file and plays it. The details of this
+are system-dependent, but @code(play) is defined in the file
+@code(system.lsp). The variable @code(*default-sf-dir*)@index(sound file directory default)@index(directory, default sound file)@index(default sound file directory)@index(temporary sound files directory)
+@index(*default-sf-dir*) names a directory into which to save a sound file. Be careful not to call @code(play) or @code(sound-play) within a function and then
+invoke that function from another @code(play) command.
+
+By default, Nyquist will try to normalize sounds using the method named by
+@code(*autonorm-type*), which is @code('lookahead) by default.
+The @i(lookahead) method precomputes and buffers @code(*autonorm-max-samples*)
+samples, finds the peak value, and normalizes accordingly. The
+@code('previous) method bases the normalization of the current sound on the peak value of the (entire) previous sound. This might be good if you are working with long sounds that start rather softly. See Section @ref(peak-ex-sec) for more details.
+
+If you want precise control over output levels, you should turn this feature off by typing (using SAL syntax):
+@begin(example)
+autonorm-off()@index(autonorm-off)
+@end(example)
+Reenable the automatic normalization feature by typing:
+@begin(example)
+autonorm-on()@index(autonorm-on)
+@end(example)
+Play normally produces real-time output. The default is to send audio data to the DAC as it is computed in addition to saving samples in a file. If computation is slower than real-time, output will be choppy, but since the samples end up in a file, you can type @code[(r)] to replay the stored sound. Real-time playback can be disabled by (using SAL syntax):
+@begin(example)
+sound-off()@index(sound-off)
+@end(example)
+and reenabled by:
+@begin(example)
+sound-on()@index(sound-on)
+@end(example)
+Disabling real-time playback has no effect on @code[(play-file)] or @code[(r)].
+
+While sounds are playing, typing control-A@index(control-A) to Nyquist will push the estimated
+elapsed@index(elapsed audio time) audio time onto the head of the list
+stored in @code(*audio-markers*).
+@index(*audio-markers*)@index(audio markers)@index(markers, audio)
+Because samples are computed in blocks and because there is latency
+between sample computation and sample playback, the elapsed time may not
+be too accurate, and the computed elapsed time may not advance after all
+samples have been computed but the sound is still playing.
+
+@codef[play-file(@pragma(defn)@index(play-file)@i(filename))] @c{[sal]}@*
+@altdef{@code[(play-file @i(filename))] @c{[lisp]}}@\Play the contents of a sound file named by @i(filename). The @code(s-read) function is used to read the file, and unless
+@i(filename) specifies an absolute path or starts with ``.'', it will be read from
+@code(*default-sf-dir*).
+
+@codef[autonorm-on(@pragma(defn)@index(autonorm-on))] @c{[sal]}@*
+@altdef{@code[(autonorm-on)] @c{[lisp]}}@\Enable automatic adjustment of a scale factor applied to sounds computed using the @code(play) command.
+
+@codef[autonorm-off(@pragma(defn)@index(autonorm-off))] @c{[sal]}@*
+@altdef{@code[(autonorm-off)] @c{[lisp]}}@\Disable automatic adjustment of a scale factor applied to sounds computed using the @code(play) command.
+
+@codef[sound-on(@pragma(defn)@index(sound-on))] @c{[sal]}@*
+@altdef{@code[(sound-on)] @c{[lisp]}}@\Enable real-time audio output when sound is computed by the the @code(play) command.
+
+@codef[sound-off(@pragma(defn)@index(sound-off))] @c{[sal]}@*
+@altdef{@code[(sound-off)] @c{[lisp]}}@\Disable real-time audio output when sound is computed by the the @code(play) command.
+
+@label(s-save-sec)
+@codef{s-save(@pragma(defn)@index(s-save)@index(save samples to file)@index(write samples to file)@index(output samples to file)@i(expression), @i(maxlen),
+@i(filename), format: @i(format), mode: @i(mode), bits: @i(bits), swap: @i(flag), play: @i(play))} @c{[sal]}@*
+@altdef{@code{(s-save @i(expression) @i(maxlen) @i(filename) :format @i(format) :mode @i(mode) :bits @i(bits) :swap @i(flag) :play @i(play))} @c{[lisp]}}@\@label(s-save)Evaluates the @i(expression), which should result in a sound
+or an array of sounds, and writes the result to the given @i(filename). A
+@code(FLONUM) is returned giving the maximum absolute value of all samples
+written. (This is useful for normalizing sounds and detecting sample
+overflow.) If @i(play) is not @code(NIL), the sound will be output
+through the computer's audio output system. (@i(play:) @c{[sal]}
+or @i(:play) @c{[lisp]} is not implemented on all systems; if it is implemented, and @i(filename) is @code(NIL), then this will play the file without also writing a file.)
+The latency (length of audio buffering) used to play the sound is 0.3s by default, but see @code(snd-set-latency).
+If
+a multichannel sound (array) is written, the channels are up-sampled to the
+highest rate in any channel so that all channels have the same sample rate.
+The maximum number of samples written per channel is given by @i(maxlen),
+which allows writing the initial part of a very long or infinite sound. A
+header is written according to @i(format), samples are encoded according to
+@i(mode), using @i(bits) bits/sample, and bytes are swapped if @i(flag) is not NIL. Defaults for these are
+@code(*default-sf-format*), @code(*default-sf-mode*), and
+@code(*default-sf-bits*). The default for @i(flag) is NIL.
+The @i(bits) parameter may be 8, 16, or 32. The values for the @i(format) and @i(mode) options are described below:
+@end(fndefs)
+@b(Format)
+@begin(description, leftmargin +2 in, indent -2 in)
+@code(snd-head-none)@\The format is unknown and should be determined
+by reading the file.
+
+@code(snd-head-raw)@\A raw format file has no header.
+
+@code(snd-head-AIFF)@\AIFF format header.
+
+@code(snd-head-IRCAM)@\IRCAM format header.
+
+@code(snd-head-NeXT)@\1024-byte NeXT/SUN format header followed by IRCAM
+header ala CMIX. Note that the NeXT/SUN format has a header-length field,
+so it really is legal to have a large header, even though the normal minimal
+header is only 24 bytes. The additional space leaves room for maximum
+amplitudes, which can be used for normalizing floating-point soundfiles, and
+for other data. Nyquist follows the CMIX convention of placing an IRCAM
+format header immediately after the NeXT-style header.
+
+@code(snd-head-Wave)@\Microsoft Wave format header.
+
+@code(snd-head-*)@\See sndfnint.lsp for more formats.
+@end(description)
+
+@b(Mode)
+@begin(description, leftmargin +2 in, indent -2 in)
+@code(snd-mode-adpcm)@\ADPCM mode (not supported).
+
+@code(snd-mode-pcm)@\signed binary PCM mode.
+
+@code(snd-mode-ulaw)@\8-bit U-Law mode.
+
+@code(snd-mode-alaw)@\8-bit A-Law mode (not supported).
+
+@code(snd-mode-float)@\32-bit floating point mode.
+
+@code(snd-mode-upcm)@\unsigned binary PCM mode.
+
+@code(snd-mode-*)@\See sndfnint.lsp for more modes.
+@end(description)
+
+The defaults for format, mode, and bits are as follows:
+@begin(description, leftmargin +2 in, indent -2 in)
+NeXT and Sun machines:@\@code(snd-head-NeXT), @code(snd-mode-pcm),
+@code(16)
+
+SGI and Macintosh machines:@\@code(snd-head-AIFF), @code(snd-mode-pcm), @code(16)
+
+@end(description)
+
+@begin(fndefs)
+@label(s-read-sec)
+@codef{s-read(@pragma(defn)@index(s-read)@index(read samples from file)@i(filename), time-offset: @i(offset), srate: @i(sr), dur: @i(dur), nchans: @i(chans),
+ format: @i(format), mode: @i(mode), bits: @i(n), swap: @i(flag))} @c{[sal]}@*
+@altdef{@code{(s-read @i(filename) :time-offset @i(offset) :srate @i(sr)
+ :dur @i(dur) :nchans @i(chans) :format @i(format) :mode @i(mode) :bits @i(n)
+ :swap @i(flag))} @c{[lisp]}}@\Reads a sound from
+ @i(filename). The global @code(*default-sf-dir*) applies. If a header is
+detected, the header is used to determine the format
+of the file, and header information overrides format information provided by
+keywords (except for @code(time-offset:) and @code(dur:)).
+@begin(example)
+s-read("mysound.snd", srate: 44100)
+@end(example)
+specifies a sample rate of 44100 hz, but if the file has a header specifying 22050 hz, the resulting sample rate will be 22050. The parameters are:
+@begin(itemize)
+ @i(offset) @itemsep the amount of time (in seconds) to skip from
+the beginning of the file. The default is 0.0.
+
+@i(sr) @itemsep the sample rate of the samples in the file. Default is
+@code(*default-sf-srate*) @index(*default-sf-srate*), which is normally 44100.
+
+ @i(dur) @itemsep the maximum duration in seconds to read. Default is
+10000.
+
+ @i(chans) @itemsep the number of channels to read. It is assumed that
+samples from each channel are interleaved. Default is 1.
+
+ @i(format) @itemsep the header format. See @code(s-save) for details.
+Default is @code(*default-sf-format*), although this parameter is currently
+ignored.
+
+ @i(mode) @itemsep the sample representation, e.g. PCM or float. See
+@code(s-save) for details. Default is @code(*default-sf-format*).
+
+ @i(n) @itemsep the number of bits per sample. See @code(s-save) for
+details. Default is @code(*default-sf-bits*).
+
+ @i(flag) @itemsep (T or NIL) swap byte order of each sample. Default is NIL.
+@end(itemize)
+If there is an error, for example if @i(offset) is greater than the length of the file, then @code(NIL) is returned rather than a sound. Information about the sound is also returned by @code(s-read) through @code(*rslt*)@foot(Since XLISP does not support multiple value returns, multiple value returns are simulated by having the function assign additional return values in a list to the global variable @code(*rslt*). Since this is a global, it should be inspected or copied immediately after the function return to insure that return values are not overwritten by another function.). The list assigned to @code(*rslt*) is of the form: (@i(format) @i(channels) @i(mode) @i(bits) @i(samplerate) @i(duration) @i(flags) @i(byte-offset)), which are defined as follows:
+@begin(itemize)
+@i(format) @itemsep the header format. See @code(s-save) for details.
+
+@i(channels) @itemsep the number of channels.
+
+@i(mode) @itemsep the sample representation, e.g. PCM or float. See @code(s-save) for details.
+
+@i(bits) @itemsep the number of bits per sample.
+
+@i(samplerate) @itemsep the sample rate, expressed as a @code(FLONUM).
+
+@i(duration) @itemsep the duration of the sound, in seconds.
+
+@i(flags) @itemsep The values for @i(format), @i(channels), @i(mode), @i(bits), @i(samplerate), and @i(duration) are initially just the values passed in as parameters or default values to @code(s-read). If a value is actually read from the sound file header, a flag is set. The flags are: @code(snd-head-format), @code(snd-head-channels), @code(snd-head-mode), @code(snd-head-bits), @code(snd-head-srate), and @code(snd-head-dur). For example,
+@begin(example)
+(let ((flags (caddr (cddddr *rslt*))))
+ (not (zerop (logand flags snd-head-srate))))
+@end(example)
+tells whether the sample rate was specified in the file. See also @code(sf-info) below.
+
+@i(byte-offset) @itemsep the byte offset into the file of the first sample
+to be read (this is used by the @code(s-overwrite) and @code(s-add-to)
+functions).
+@end(itemize)
+
+@codef{s-add-to(@pragma(defn)@index(s-add-to)@index(add to file samples)@index(mix to file)@i(expression), @i(maxlen),
+@i(filename) [, @i(offset)])} @c{[sal]}@*
+@altdef{@code{(s-add-to @i(expression) @i(maxlen) @i(filename) [@i(offset)])} @c{[lisp]}}@\@label(s-add-to-sec)Evaluates the @i(expression), which should result in a sound
+or an array of sounds, and adds the result to the given @i(filename).
+The global @code(*default-sf-dir*) applies. A @code(FLONUM) is returned,
+giving the maximum absolute value of all samples written. The
+sample rate(s) of @i(expression) must match those of the file.
+The maximum number of samples written per channel is given by @i(maxlen),
+which allows writing the initial part of a very long or infinite sound.
+If @i(offset) is specified, the new sound is added to the file beginning at
+an @i(offset) from the beginning (in seconds). The file is extended if
+necessary to accommodate the new addition, but if @i(offset)
+falls outside of the original file, the file is not modified. (If necessary,
+use @code(s-add-to) to extend the file with zeros.)
+The file must be a recognized
+sound file with a header (not a raw sound file).
+
+
+@codef{s-overwrite(@pragma(defn)@index(s-overwrite)@index(replace file samples)@index(overwrite samples)@i(expression), @i(maxlen), @i(filename) [, @i(offset)])} @c{[sal]}@*
+@altdef{@code{(s-overwrite @i(expression) @i(maxlen) @i(filename) [@i(offset)])} @c{[lisp]}}@\@label(s-overwrite-sec)Evaluates
+the @i(expression), which should result in a sound
+or an array of sounds, and replaces samples in the given @i(filename).
+The global @code(*default-sf-dir*) applies.
+A @code(FLONUM) is returned, giving the maximum absolute value of all
+samples written. The
+sample rate(s) of @i(expression) must match those of the file.
+The maximum number of samples written per channel is given by @i(maxlen),
+which allows writing the initial part of a very long or infinite sound.
+If @i(offset) is specified, the new sound is written to the file beginning at
+an @i(offset) from the beginning (in seconds). The file is extended if
+necessary to accommodate the new insert, but if @i(offset) falls outside of
+the original file, the file is not modified. (If necessary, use
+@code(s-add-to) to extend the file with zeros.) The file must be a recognized
+sound file with a header (not a raw sound file).
+
+@codef{sf-info(@pragma(defn)@index(sf-info)@index(sound file info)@i(filename))} @c{[sal]}@*
+@altdef{@code[(sf-info @i(filename))] @c{[lisp]}}@\Prints information about a sound file. The parameter @i(filename) is a string. The file is assumed to be in *default-sf-dir* (see @code(soundfilename) below) unless the filename begins with ``.'' or ``/''. The source for this function is in the @code(runtime) and provides an example of how to determine sound file parameters.
+
+@codef{soundfilename(@pragma(defn)@index(soundfilename)@i(name))} @c{[sal]}@*
+@altdef{@code[(soundfilename @i(name))] @c{[lisp]}}@\Converts a string @i(name) to a soundfile name. If @i(name) begins with ``.'' or ``/'', the name is returned without alteration. Otherwise, a path taken from @code(*default-sf-dir*) is prepended to @i(name). The @code(s-plot), @code(s-read), and @code(s-save) functions all use @code(soundfilename) translate filenames.
+
+@codef{s-plot(@pragma(defn)@index(s-plot)@index(plot)@i(sound)
+ [, @i(dur), @i(n)])} @c{[sal]}@*
+@altdef{@code{(s-plot @i(sound)
+ [@i(dur) @i(n)])} @c{[lisp]}}@\Plots sound in a window. This function was designed to run a @code(plot) program on a Unix workstation, but now is
+primarily used with @code(NyquistIDE), which has self-contained plotting. Normally,
+time/value pairs in ascii are written to @code(points.dat) and system-dependent code
+(or the @code(NyquistIDE) program) takes it from there. If the @i(sound) is
+longer than the optional @i(dur) (default is 2 seconds), only the
+first @i(dur) seconds are plotted.
+If there are more than @i(n) samples to be plotted, the signal is interpolated
+to have @i(n) samples before plotting.
+The data file used is @code(*default-plot-file*):
+
+@codef(*default-plot-file*)@pragma(defn)@index(*default-plot-file*)@\The file containing the data points, defaults to "points.dat".
+
+@codef{s-print-tree(@pragma(defn)@index(s-print-tree)@index(snd-print-tree)@i(sound))} @c{[sal]}@*
+@altdef{@code[(s-print-tree @i(sound))] @c{[lisp]}}@\Prints an ascii
+representation of the internal data structures representing a sound. This
+is useful for debugging@index(debugging) Nyquist. Identical to @code(snd-print-tree).
+
+@end(fndefs)
+
+@section(Low-level Functions)
+Nyquist includes many low-level functions that are used to implement the functions and behaviors described in previous sections. For completeness, these functions are described here. Remember that
+these are low-level functions that are not intended for normal use. Unless
+you are trying to understand the inner workings of Nyquist, you can skip this section.
+
+@subsection(Creating Sounds)
+The basic operations that create sounds are described here.
+
+@begin(fndefs)
+
+@codef[snd-const(@pragma(defn)@index(snd-const)@i(value), @i(t0), @i(srate),
+@i(duration))] @c{[sal]}@*
+@altdef{@code[(snd-const @i(value) @i(t0) @i(srate) @i(duration))] @c{[lisp]}}@\Returns a sound with constant @i(value), starting at @i(t0)
+with the given @i(duration), at the sample rate @i(srate). You might want
+to use @code(pwl) (see Section @ref(pwl-sec)) instead.
+
+@codef[snd-read(@pragma(defn)@index(snd-read)@i(filename), @i(offset), @i(t0), @i(format),
+@i(channels), @i(mode), @i(bits), @i(swap), @i(sr),
+@i(dur))] @c{[sal]}@*
+@altdef{@code[(snd-read @i(filename) @i(offset) @i(t0) @i(format) @i(channels) @i(mode) @i(bits) @i(swap) @i(sr) @i(dur))] @c{[lisp]}}@\Loads a sound from a file with name @i(filename). Files are
+assumed to consist of a header followed by frames consisting of one sample
+from each channel. The @i(format) specifies the type of header, but this
+information is currently ignored. Nyquist looks for a number of header
+formats and automatically figures out which format to read. If a header can
+be identified, the header is first read from the file. Then, the file
+pointer is advanced by the indicated
+@i(offset) (in seconds). If there is an unrecognized header, Nyquist will
+assume the file has no header. If the header size is a multiple of the
+frame size (bytes/sample * number-of-channels), you can use @i(offset) to
+skip over the header. To skip N bytes, use an @i(offset) of:
+@begin(example)
+(/ (float N) @i(sr) (/ @i(bits) 8) @i(channels))
+@end(example)
+If the header is not a multiple of the frame size, either write a header or
+contact the author (dannenberg@@cs.cmu.edu) for assistance. Nyquist will
+round @i(offset) to the nearest sample. The resulting sound will start at
+time @i(t0). If a header is found, the file will be interpreted according
+to the header information. If no header was found, @i(channels) tells how
+many channels there are, the samples are encoded according to @i(mode), the
+sample length is @i(bits), and @i(sr) is the sample rate. The @i(swap) flag is 0 or 1, where 1 means to swap sample bytes. The duration to
+be read (in seconds) is given by @i(dur). If @i(dur) is longer than the
+data in the file, then a shorter duration will be returned. If the file
+contains one channel, a sound is returned. If the file contains 2 or more
+channels, an array of sounds is returned. @p(Note:) you probably want to
+call @code(s-read) (see Section @ref(s-read-sec)) instead of
+@code(snd-read). Also, see Section @ref(s-read-sec) for information on the
+@i(mode) and @i(format) parameters.
+
+@codef[snd-save(@pragma(defn)@index(snd-save)@i(expression), @i(maxlen),
+@i(filename), @i(format), @i(mode), @i(bits), @i(swap), @i(play))] @c{[sal]}@*
+@altdef{@code[(snd-save @i(expression) @i(maxlen) @i(filename) @i(format) @i(mode) @i(bits) @i(swap) @i(play))] @c{[lisp]}}@\@label(snd-save)Evaluates
+the @i(expression), which should result in a sound
+or an array of sounds, and writes the result to the given @i(filename). If
+a multichannel sound (array) is written, the channels are up-sampled to the
+highest rate in any channel so that all channels have the same sample rate.
+The maximum number of samples written per channel is given by @i(maxlen),
+which allows writing the initial part of a very long or infinite sound. A
+header is written according to @i(format), samples are encoded according to
+@i(mode), using @i(bits) bits/sample, and swapping bytes if @i(swap) is 1 (otherwise it should be 0).
+If @i(play) is not null, the audio is played in real time (to the extent possible) as it is computed. The peak value of the sound is returned. In addition,
+the symbol @code(*RSLT*) is bound to a list containing the sample rate,
+number of channels, and duration (in that order) of the saved sound.
+@p(Note:) you probably want to call
+@code(s-save) (see Section @ref(s-save-sec)) instead. The @i(format) and
+@i(mode) parameters are described in Section @ref(s-save-sec).
+
+@codef[snd-overwrite(@pragma(defn)@index(snd-overwrite)@i(expression), @i(maxlen), @i(filename), @i(offset), @i(format), @i(mode), @i(bits), @i(swap))] @c{[sal]}@*
+@altdef{@code[(snd-overwrite @i(expression) @i(maxlen) @i(filename) @i(offset) @i(format) @i(mode) @i(bits) @i(swap))] @c{[lisp]}}@\@label(snd-overwrite-sec)Evaluates
+the @i(expression), which should result in a sound
+or an array of sounds, and replaces samples in the given @i(filename),
+writing the first frame at a time of @i(offset) seconds. The @i(offset) must
+be less than or equal to the duration of the existing file. The
+duration of the written samples may
+be greater than that of the file, in which case the file is extended
+as necessary. The
+sample rate(s) of @i(expression) and the number of channels
+must match those of the file. If @i(format) is
+ @code(SND-HEAD-RAW), then the file
+format is given by @i(mode) (see
+@code(snd-save), @i(bits) (per channel), @i(swap) (1 means to
+swap bytes and 0 means write them in the native byte order), and the
+number of channels and sample rate of the sound returned by evaluating
+@i(expression). If the
+file is a known
+audio file format, @i(format) should be @code(SND-HEAD-NONE), and the
+other parameters are ignored. Up to a maximum of @i(maxlen)
+samples will be written per channel. The peak value of the sound is returned.
+In addition, the symbol @code(*RSLT*) is bound to a list containing the
+duration of the written sound (which may not be the duration of the sound
+file).
+Use @code(s-add-to) (in Section @ref(s-add-to-sec) or
+@code(s-overwrite) (in Section @ref(s-overwrite-sec) instead of this function.
+
+@codef[snd-coterm(@pragma(defn)@index(snd-coterm)@index(co-termination)@index(duration of
+another sound)@i(s1), @i(s2))] @c{[sal]}@*
+@altdef{@code[(snd-coterm @i(s1) @i(s2))] @c{[lisp]}}@\Returns a copy of @i(s1), except the start
+time is the maximum of the start times of @i(s1) and @i(s2), and the
+termination time is the minimum of @i(s1) and @i(s2). (After the termination
+time, the sound is zero as if @i(s1) is gated by @i(s2).) Some rationale
+follows: In order to implement @code(s-add-to), we need to read from the
+target sound file, add the sounds to a new sound, and overwrite the result
+back into the file. We only want to write as many samples into the file as
+there are samples in the new sound. However, if we are adding
+in samples read from
+the file, the result of a @code(snd-add) in Nyquist will have the maximum
+duration of either sound. Therefore, we may read to the end of the file.
+What we need is a way to truncate the read, but we cannot easily do that,
+because we do not know in advance how long the new sound will be. The
+solution is to use @code(snd-coterm), which will allow us to truncate the
+sound that is read from the file (@i(s1)) according to the duration of the
+new sound (@i(s2)). When this truncated sound is added to the new sound,
+the result will have only the duration of the new sound, and this can be
+used to overwrite the file. This function is used in the implementation of
+@code(s-add-to), which is defined in @code(runtime/fileio.lsp).
+
+@code[(snd-from-array @r(...))] @c{[sal]}@*
+@altdef{@code[(snd-from-array @r(...))] @c{[lisp]}}@\See @pragma(startref) page @pageref(snd-from-array-sec).
+
+@codef[snd-white(@pragma(defn)@index(snd-white)@i(t0), @i(sr), @i(d))] @c{[sal]}@*
+@altdef{@code[(snd-white @i(t0) @i(sr) @i(d))] @c{[lisp]}}@\Generate white noise, starting at
+@i(t0), with sample rate @i(sr), and duration @i(d). You probably want to
+use @code(noise) (see Section @ref(noise-sec)).
+
+ @codef[snd-zero(@pragma(defn)@index(snd-zero)@i(t0), @i(srate))] @c{[sal]}@*
+@altdef{@code[(snd-zero @i(t0) @i(srate))] @c{[lisp]}}@\Creates a sound that is
+zero everywhere, starts at @i(t0), and has sample rate @i(srate). The
+logical stop time is immediate, i.e. also at @i(t0). You probably want
+to use @code(pwl) (see Section @ref(pwl-sec)) instead.
+
+ @codef[get-slider-value(@pragma(defn)@index(get-slider-value)@i(index))] @c{[sal]}@*
+@altdef{@code[(get-slider-value @i(index))] @c{[lisp]}}@\@label(get-slider-value-sec)Return the current value of the slider
+named by @i(index) (an integer index into the array of sliders).
+Note that this ``slider'' is just a floating point
+value in an array. Sliders can be changed by OSC messages (see @code(osc-enable)) and by sending character
+sequences to Nyquist's standard input. (Normally, these character sequences would
+not be typed but generated by the NyquistIDE interactive development environment, which
+runs Nyquist as a sub-process, and which present the user with graphical sliders.)
+
+@codef[snd-slider(@pragma(defn)@index(snd-slider)@i(index), @i(t0), @i(srate), @i(duration))] @c{[sal]}@*
+@altdef{@code[(snd-slider @i(index) @i(t0) @i(srate) @i(duration))] @c{[lisp]}}@\@label(snd-slider-sec)Create
+a sound controlled by the slider named by @i(index) (an integer
+index into the array of sliders; see @code(get-slider-value) for more information).
+The function returns a sound. Since Nyquist sounds are computed in blocks of samples,
+and each block is computed at once, each block will contain copies of the current slider
+value. To obtain reasonable responsiveness, slider sounds should have high (audio)
+sample rates so that the block rate will be reasonably high. Also, consider lowering the audio
+latency using @code(snd-set-latency). To ``trigger'' a Nyquist behavior using slider input, see the @code(trigger) function in Section @ref(trigger-sec).
+
+@end(fndefs)
+
+@subsection(Signal Operations)
+This next set of functions take sounds as arguments, operate on them, and
+return a sound.
+
+@begin(fndefs)
+@codef[snd-abs(@pragma(defn)@index(snd-abs)@index(absolute value)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-abs @i(sound))] @c{[lisp]}}@\Computes a new
+sound where each sample is the absolute value of the corresponding sample in
+@i(sound). You should probably use @code(s-abs) instead. (See Section @ref(s-abs-sec).)
+
+@codef[snd-sqrt(@pragma(defn)@index(snd-sqrt)@index(square root)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-sqrt @i(sound))] @c{[lisp]}}@\Computes a new
+sound where each sample is the square root of the corresponding sample in
+@i(sound). If a sample is negative, it is taken to be zero to avoid raising a floating point error. You should probably use @code(s-sqrt) instead. (See Section @ref(s-sqrt-sec).)
+
+ @codef[snd-add(@pragma(defn)@index(snd-add)@i(sound1), @i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-add @i(sound1) @i(sound))] @c{[lisp]}}@\Adds two sounds. The
+resulting start time is the minimum of the two parameter start times, the
+logical stop time is the maximum of the two parameter stop times, and the
+sample rate is the maximum of the two parameter sample rates. Use
+@code(sim) or @code(sum) instead of @code(snd-add) (see Section @ref(sim-sec)).
+
+@codef[snd-offset(@pragma(defn)@index(snd-offset)@index(offset to a sound)@index(add
+offset to sound)@i(sound), @i(offset))] @c{[sal]}@*
+@altdef{@code[(snd-offset @i(sound) @i(offset))] @c{[lisp]}}@\Add an offset to a sound. The
+resulting start time, logical stop time, stop time, and sample rate are
+those of @i(sound). Use @code(sum) instead (see Section @ref(sim-sec)).
+
+@codef[snd-avg(@pragma(defn)@index(snd-avg)@index(moving average)@index(RMS)@index(average)@i(sound), @i(blocksize), @i(stepsize), @i(operation))] @c{[sal]}@*
+@altdef{@code[(snd-avg @i(sound) @i(blocksize) @i(stepsize) @i(operation))] @c{[lisp]}}@\Computes the averages
+or peak values of blocks of samples. Each output sample is an average or
+peak of @i(blocksize) (a fixnum) adjacent samples from the input @i(sound).
+After each average or peak is taken, the input is advanced by @i(stepsize),
+a fixnum which may be greater or less than @i(blocksize). The output
+sample rate is the @i(sound) (input) sample rate divided by @i(stepsize).
+This function is useful for computing low-sample-rate rms or peak
+amplitude signals for input to @code(snd-gate) or @code(snd-follow).
+To select the operation, @i(operation) should be one of @code(OP-AVERAGE)
+or @code(OP-PEAK). (These are global lisp variables; the actual
+@i(operation) parameter is an integer.) For RMS computation, see
+@code(rms) in Section @ref(rms-sec).
+
+@codef[snd-clip(@index(clip)@pragma(defn)@index(snd-clip)@i(sound), @i(peak))] @c{[sal]}@*
+@altdef{@code[(snd-clip @i(sound) @i(peak))] @c{[lisp]}}@\Hard limit @i(sound)
+to the given @i(peak), a positive number. The samples of @i(sound) are constrained between an upper value
+of @i(peak) and a lower value of @subtract()@i(peak). Use @code(clip) instead (see Section @ref(clip-sec)).
+
+@codef[snd-compose(@index(compose)@index(signal composition)@pragma(defn)@index(snd-compose)@i(f), @i(g))] @c{[sal]}@*
+@altdef{@code[(snd-compose @i(f) @i(g))] @c{[lisp]}}@\Compose two signals, i.e.
+compute @i(f)(@i(g)(@i(t))), where @i(f) and @i(g) are sounds. This function
+is used primarily to implement time warping, but it can be used in other
+applications such as frequency modulation. For each sample @i(x) in @i(g),
+@i(snd-compose) looks up the value of @i(f)(@i(x)) using linear
+interpolation. The resulting sample rate, start time, etc. are taken from
+@i(g). The sound @i(f) is used in effect as a lookup table, but it is
+assumed that @i(g) is non-decreasing, so that @i(f) is accessed in time
+order. This allows samples of @i(f) to be computed and discarded
+incrementally. If in fact @i(g) decreases, the current sample of @i(g) is
+replaced by the previous one, forcing @i(g) into compliance with the
+non-decreasing restriction. See also @code(sref), @code(shape), and
+@code(snd-resample).
+
+For an extended example that uses @code(snd-compose) for variable pitch shifting,
+see @code(demos/pitch_change.htm).@index(demos, pitch change)@index(pitch shifting)
+@index(variable-resample function)@index(resampling)
+
+@label(snd-tapv-sec)
+@codef[snd-tapv(@pragma(defn)@index(snd-tapv)@index(tap)@index(variable delay)@index(delay,
+variable)@index(chorus)@i(sound), @i(offset), @i(vardelay), @i(maxdelay))] @c{[sal]}@*
+@altdef{@code[(snd-tapv @i(sound) @i(offset) @i(vardelay) @i(maxdelay))] @c{[lisp]}}@\A
+variable delay: @i(sound) is delayed by the sum of @i(offset) (a @code(FIXNUM) or @code(FLONUM))
+and @i(vardelay) (a @code(SOUND)). The specified delay is adjusted to lie in the range
+of zero to @i(maxdelay) seconds to yield the actual delay, and the delay is
+implemented using linear interpolation. This function was designed specifically
+for use in a chorus effect: the @i(offset) is set to half of @i(maxdelay), and
+the @i(vardelay) input is a slow sinusoid. The maximum delay is limited to
+@i(maxdelay), which determines the length of a fixed-sized buffer. The function
+@code(tapv) is equivalent and preferred (see Section @ref(tapv-sec)).
+
+@codef[snd-tapf(@pragma(defn)@index(snd-tapf)@index(variable delay)@index(delay, variable)@i(sound), @i(offset), @i(vardelay), @i(maxdelay))] @c{[sal]}@*
+@altdef{@code[(snd-tapf @i(sound) @i(offset) @i(vardelay) @i(maxdelay))] @c{[lisp]}}@\A
+variable delay like @code(snd-tapv) except there is no linear interpolation. By
+eliminating interpolation, the output is an exact copy of the input with no filtering
+or distortion. On the other hand, delays jump by samples causing samples to double or
+skip even when the delay is changed smoothly.
+
+@codef[snd-copy(@pragma(defn)@index(snd-copy)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-copy @i(sound))] @c{[lisp]}}@\Makes a copy of @i(sound).
+Since operators always make (logical) copies of their sound parameters, this
+function should never be needed. This function is here for debugging@index(dubugging).
+
+@codef[snd-down(@pragma(defn)@index(snd-down)@i(srate), @i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-down @i(srate) @i(sound))] @c{[lisp]}}@\Linear interpolation
+of samples down to the given sample rate @i(srate), which must be lower than
+the sample rate of @i(sound). Do not call this function. Nyquist performs
+sample-rate conversion automatically as needed. If you want to force a
+conversion, call @code(force-srate) (see Section @ref(force-srate-sec)).
+
+@codef[snd-exp(@pragma(defn)@index(snd-exp)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-exp @i(sound))] @c{[lisp]}}@\Compute the exponential of each sample of @i(sound). Use @code(s-exp) instead (see Section @ref(s-exp-sec)).
+
+@label(snd-follow-sec)
+@codef[snd-follow(@pragma(defn)@index(snd-follow)@index(follower)@index(envelope follower)@i(sound), @i(floor), @i(risetime), @i(falltime), @i(lookahead))] @c{[sal]}@*
+@altdef{@code[(snd-follow @i(sound) @i(floor) @i(risetime) @i(falltime) @i(lookahead))] @c{[lisp]}}@\An envelope
+follower. The basic goal of this function is to generate a smooth signal
+that rides on the peaks of the input signal. The usual objective is to
+produce an amplitude envelope given a low-sample rate (control rate)
+signal representing local RMS measurements. The first argument is the
+input signal. The @i(floor) is the minimum output value. The @i(risetime) is the time (in seconds) it takes for the output to rise (exponentially) from @i(floor) to unity (1.0) and the @i(falltime) is the time it takes for the output to fall (exponentially) from unity to @i(floor). The algorithm looks ahead for peaks and will begin to increase the output signal according to @i(risetime) in anticipation of a peak. The amount of anticipation (in sampless) is given by @i(lookahead). The algorithm is as follows: the output value is allowed to increase according to @i(risetime) or decrease according to @i(falltime). If the next input sample is in this range, that sample is simply output as the next output sample. If the next input sample is too large, the algorithm goes back in time as far as necessary to compute an envelope that rises according to @i(risetime) to meet the new value. The algorithm will only work backward as far as @i(lookahead). If that is not far enough, then there is a final forward pass computing a rising signal from the earliest output sample. In this case, the output signal will be at least momentarily less than the input signal and will continue to rise exponentially until it intersects the input signal. If the input signal falls faster than indicated by @i(falltime), the output fall rate will be limited by @i(falltime), and the fall in output will stop when the output reaches @i(floor). This algorithm can make two passes througth the buffer on sharply rising inputs, so it is not particularly fast. With short buffers and low sample rates this should not matter. See @code(snd-avg) above for a function that can help to generate a low-sample-rate input for @code(snd-follow). See @code(snd-chase) in Section @ref(snd-chase-sec) for a related filter.
+
+@codef[snd-gate(@pragma(defn)@index(snd-gate)@index(noise gate)@index(gate)@i(sound), @i(lookahead), @i(risetime), @i(falltime), @i(floor), @i(threshold))] @c{[sal]}@*
+@altdef{@code[(snd-gate @i(sound) @i(lookahead) @i(risetime) @i(falltime) @i(floor) @i(threshold))] @c{[lisp]}}@\This function generates an exponential rise and decay intended for noise gate implementation. The decay starts when the signal drops below threshold and stays there for longer than lookahead. Decay continues until the value reaches floor, at which point the decay stops and the output value is held constant. Either during the decay or after the floor is reached, if the signal goes above threshold, then the output value will rise to unity (1.0) at the point the signal crosses the threshold. Again, look-ahead is used, so the rise actually starts before the signal crosses the threshold. The rise is a constant-rate exponential and set so that a rise from @i(floor) to unity occurs in @i(risetime). Similarly, the fall is a constant-rate exponential such that a fall from unity to @i(floor) takes @i(falltime). The result is delayed by @i(lookahead), so the output is not actually synchronized with the input. To compensate, you should drop the initial @i(lookahead) of samples. Thus, @code(snd-gate) is not recommended for direct use. Use @code(gate) instead (see Section @ref(gate-sec)).
+
+@codef[snd-inverse(@index(inverse)@pragma(defn)@index(snd-inverse)@i(signal), @i(start), @i(srate))] @c{[sal]}@*
+@altdef{@code[(snd-inverse @i(signal) @i(start) @i(srate))] @c{[lisp]}}@\Compute the function inverse of @i(signal), that is, compute @i(g)(@i(t)) such that @i(signal)(@i(g)(@i(t))) = @i(t). This function assumes that @i(signal) is non-decreasing, it uses linear interpolation, the resulting sample rate is @i(srate), and the result is shifted to have a starting time of @i(start). If @i(signal) decreases, the true inverse may be undefined, so we define @code(snd-inverse) operationally as follows: for each output time point @i(t), scan ahead in @i(signal) until the value of signal exceeds @i(t). Interpolate to find an exact time point @i(x) from @i(signal) and output @i(x) at time @i(t). This function is intended for internal system use in implementing time warps.
+
+@codef[snd-log(@pragma(defn)@index(snd-log)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-log @i(sound))] @c{[lisp]}}@\Compute the natural logorithm of each sample of @i(sound). Use @code(s-log) instead (see Section @ref(s-log-sec)).
+
+@label(peak-sec)
+@codef[peak(@index(peak, maximum amplitude)@pragma(defn)@index(peak)@i(expression), @i(maxlen))] @c{[sal]}@*
+@altdef{@code[(peak @i(expression) @i(maxlen))] @c{[lisp]}}@\Compute the maximum absolute value of the amplitude of a sound. The sound is created by evaluating @i(expression) (as in @code(s-save)). Only the first @i(maxlen) samples are evaluated. The @i(expression) is automatically quoted (@code(peak) is a macro), so do not quote this parameter. If @i(expression) is a variable, then the @i(global binding) of that variable will be used. Also, since the variable retains a reference to the sound, the sound will be evaluated and left in memory. See Section @ref(peak-ex-sec) on @pragma(startref) page @pageref(peak-ex-sec) for examples.
+
+@label(snd-max-sec)
+@codef[snd-max(@pragma(defn)@index(snd-max)@index(maximum amplitude)@i(expression), @i(maxlen))] @c{[sal]}@*
+@altdef{@code[(snd-max @i(expression) @i(maxlen))] @c{[lisp]}}@\Compute the maximum absolute value of the amplitude of a sound. The sound is created by evaluating @i(expression) (as in @code(snd-save)), which is therefore normally quoted by the caller. At most @i(maxlen) samples are computed. The result is the maximum of the absolute values of the samples. @p(Notes:) It is recommended to use @code(peak) (see above) instead. If you want to find the maximum of a sound bound to a local variable and it is acceptable to save the samples in memory, then this is probably the function to call. Otherwise, use @code(peak).
+
+@codef[snd-maxv(@pragma(defn)@index(snd-maxv)@index(maximum of two sounds)@i(sound1), @i(sound2))] @c{[sal]}@*
+@altdef{@code[(snd-maxv @i(sound1) @i(sound2))] @c{[lisp]}}@\Compute the maximum of @i(sound1) and @i(sound2) on a sample-by-sample basis. The resulting
+sound has its start time at the maximum of the input start times and a logical stop
+at the minimum logical stop of the inputs. The physical stop time is the minimum of
+the physical stop times of the two sounds. @i(Note that this violates the ``normal''
+interpretation that sounds are zero outside their start and stop times. For
+example, even if) sound1 @i(extends beyond) sound2 @i(and is greater than zero,
+the result
+value in this extension will be zero because it will be after the physical stop time,
+whereas if we simply treated) sound2 @i(as zero in this region and took the maximum, we
+would get a non-zero result.) Use @code(s-max) instead (see Section @ref(s-max-sec)).
+
+@codef[snd-normalize(@pragma(defn)@index(snd-normalize)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-normalize @i(sound))] @c{[lisp]}}@\Internally, sounds
+are stored with a scale factor that applies to all samples of the sound.
+All operators that take sound arguments take this scale factor into account
+(although it is not always necessary to perform an actual multiply per
+sample), so you should never need to call this function. This function
+multiplies each sample of a sound by its scale factor, returning a sound
+that represents the same signal, but whose scale factor is 1.0.
+
+@codef[snd-oneshot(@pragma(defn)@index(snd-oneshot)@index(oneshot)@index(threshold)@i(sound), @i(threshold), @i(ontime))] @c{[sal]}@*
+@altdef{@code[(snd-oneshot @i(sound) @i(threshold) @i(ontime))] @c{[lisp]}}@\Computes a new sound that is zero
+except where @i(sound) exceeds threshold. From these points, the result is
+1.0 until @i(sound) remains below @i(threshold) for @i(ontime) (in seconds).
+The result has the same sample rate, start time, logical stop time, and
+duration as @i(sound).
+
+@codef[snd-prod(@pragma(defn)@index(snd-prod)@index(signal multiplication)@index(multiplication)@i(sound1), @i(sound2))] @c{[sal]}@*
+@altdef{@code[(snd-prod @i(sound1) @i(sound2))] @c{[lisp]}}@\Computes the
+product of @i(sound1) and @i(sound2). The resulting sound has its start
+time at the maximum of the input start times and a logical stop at the minimum
+logical stop of the inputs. Do not use this function. Use @code(mult) or
+@code(prod) instead (see Section @ref(mult-sec)). Sample rate, start time, etc. are taken from @i(sound).
+
+@codef[snd-pwl(@pragma(defn)@index(snd-pwl)@index(piece-wise linear)@i(t0), @i(sr),
+@i(lis))] @c{[sal]}@*
+@altdef{@code[(snd-pwl @i(t0) @i(sr) @i(lis))] @c{[lisp]}}@\Computes a piece-wise linear function according to the breakpoints
+in @i(lis). The starting time is @i(t0), and the sample rate is @i(sr).
+The breakpoints are passed in an XLISP list (of type @code(LVAL)) where the
+list alternates sample numbers (@code(FIXNUM)s, computed in samples
+from the beginning of the pwl function) and values (the value of the pwl
+function, given as a @code(FLONUM)). There is an implicit starting
+point of (0, 0). The list must contain an odd number of points, the omitted
+last
+value being implicitly zero (0). The list is assumed to be well-formed. Do
+not call this function. Use @code(pwl) instead (see Section @ref(pwl-sec)).
+
+@codef[snd-quantize(@pragma(defn)@index(snd-quantize)@i(sound), @i(steps))] @c{[sal]}@*
+@altdef{@code[(snd-quantize @i(sound) @i(steps))] @c{[lisp]}}@\Quantizes a sound. See Section
+@ref(quantize-sec) for details.
+
+@codef[snd-recip(@pragma(defn)@index(snd-recip)@i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-recip @i(sound))] @c{[lisp]}}@\Compute the reciprocal of each sample of @i(sound). Use @code(recip) instead (see Section @ref(recip-sec)).
+
+@codef[snd-resample(@pragma(defn)@index(snd-resample)@index(sample interpolation)@i(f),
+@i(rate))] @c{[sal]}@*
+@altdef{@code[(snd-resample @i(f) @i(rate))] @c{[lisp]}}@\Resample sound @i(f) using high-quality interpolation, yielding
+a new sound with the specified @i(rate). The result is scaled by 0.95 because often,
+in resampling, interpolated values exceed the original sample values, and this
+could lead to clipping.
+The resulting start time, etc. are taken from
+@i(f). Use @code(resample) instead.
+
+@codef[snd-resamplev(@pragma(defn)@index(snd-resamplev)@index(sample interpolation)@index(signal composition)@i(f), @i(rate), @i(g))] @c{[sal]}@*
+@altdef{@code[(snd-resamplev @i(f) @i(rate) @i(g))] @c{[lisp]}}@\Compose two
+signals, i.e. compute @i(f)(@i(g)(@i(t))), where @i(f) and @i(g) are
+sounds. The result has sample rate given by @i(rate). At each time @i(t)
+(according to the @i(rate)), @i(g) is linearly interpolated to yield an
+increasing sequence of high-precision score-time values. @i(f) is then
+interpolated at each value to yield a result sample. If in fact @i(g)
+decreases, the current sample of @i(g) is replaced by the previous one,
+forcing @i(g) into compliance with the non-decreasing restriction.
+The result is scaled by 0.95 because often,
+in resampling, interpolated values exceed the original sample values, and this
+could lead to clipping. Note that
+if @i(g) has a high sample rate, this may introduce unwanted jitter into
+sample times. See @code(sound-warp) for a detailed discussion. See
+@code(snd-compose) for a fast, low-quality alternative to this function.
+Normally, you should use @code(sound-warp) instead of this function.
+
+
+@codef[snd-scale(@pragma(defn)@index(snd-scale)@i(scale), @i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-scale @i(scale) @i(sound))] @c{[lisp]}}@\Scales the amplitude of @i(sound) by the factor @i(scale). Use @code(scale) instead (see Section
+@ref(scale-sec)).
+
+@codef{snd-shape(@pragma(defn)@index(snd-shape)@i(signal), @i(table), @i(origin))} @c{[sal]}@*
+@altdef{@code[(snd-shape @i(signal) @i(table) @i(origin))] @c{[lisp]}}@\A waveshaping function. This is the primitive upon which @code(shape) is based. The @code(snd-shape) function is like @code(shape) except that @i(signal) and @i(table) must be (single-channel) sounds. Use @code(shape) instead (see Section @ref(shape-sec)).
+
+@codef[snd-up(@pragma(defn)@index(snd-up)@i(srate), @i(sound))] @c{[sal]}@*
+@altdef{@code[(snd-up @i(srate) @i(sound))] @c{[lisp]}}@\Increases sample rate by linear
+interpolation. The @i(sound) is the signal to be up-sampled, and @i(srate)
+is the output sample rate. Do not call this function. Nyquist performs
+sample-rate conversion automatically as needed. If you want to force a
+conversion, call @code(force-srate) (see Section @ref(force-srate-sec)).
+
+@label(snd-xform-sec)
+@codef[snd-xform(@pragma(defn)@index(snd-xform)@i(sound), @i(sr), @i(time), @i(start),
+@i(stop), @i(scale))] @c{[sal]}@*
+@altdef{@code[(snd-xform @i(sound) @i(sr) @i(time) @i(start) @i(stop) @i(scale))] @c{[lisp]}}@\Makes a copy of @i(sound) and then alters it in
+the following order: (1) the start time (@code(snd-t0)) of the sound is shifted to
+@i(time), (1) the sound is stretched as a result of setting the sample rate
+to @i(sr) (the start time is unchanged by this), (3) the sound is clipped
+ from @i(start) to @i(stop), (4) if @i(start) is greater than @i(time), the sound is shifted
+shifted by @i(time) - @i(start), so that the start time is @i(time), (5) the
+sound is scaled by @i(scale). An empty (zero) sound at @i(time) will be
+returned if all samples are clipped. Normally, you should accomplish all
+this using transformations. A transformation applied to a sound has no
+effect, so use @code(cue) to create a transformable sound (see Section
+@ref(use-sounds-sec)).
+
+@label(snd-yin-sec)
+@codef{snd-yin(@pragma(defn)@index(snd-yin)@i(sound), @i(minstep), @i(maxstep), @i(rate))} @c{[sal]}@*
+@altdef{@code[(snd-yin @i(sound) @i(minstep) @i(maxstep) @i(rate))] @c{[lisp]}}@\Identical to
+@code[yin]. See Section @ref(yin-sec).
+
+@end(fndefs)
+
+@subsection(Filters)
+These are also ``Signal Operators,'' the subject of the previous section,
+but there are so many filter functions, they are
+documented in this special section.
+
+Some filters allow time-varying filter parameters. In these functions,
+filter coefficients are calculated at the sample rate of the filter
+parameter, and coefficients are not interpolated.
+
+@begin(fndefs)
+
+@codef[snd-alpass(@pragma(defn)@index(snd-alpass)@i(sound), @i(delay), @i(feedback))] @c{[sal]}@*
+@altdef{@code[(snd-alpass @i(sound) @i(delay) @i(feedback))] @c{[lisp]}}@\An all-pass filter. This produces a repeating echo effect without the resonances of @code(snd-delay). The @i(feedback) should be less than one to avoid exponential amplitude blowup. Delay is rounded to the nearest sample. You should use @code(alpass) instead (see Section @ref(alpass-sec)).
+
+@codef[snd-alpasscv(@pragma(defn)@index(snd-alpasscv)@i(sound), @i(delay),
+@i(feedback))] @c{[sal]}@*
+@altdef{@code[(snd-alpasscv @i(sound) @i(delay) @i(feedback))] @c{[lisp]}}@\An all-pass filter with variable @i(feedback).
+This is just like @i(snd-alpass) except @i(feedback) is a sound.
+You should use @code(alpass) instead (see Section @ref(alpass-sec)).
+
+@codef[snd-alpassvv(@pragma(defn)@index(snd-alpassvv)@i(sound), @i(delay), @i(feedback), @i(maxdelay))] @c{[sal]}@*
+@altdef{@code[(snd-alpassvv @i(sound) @i(delay) @i(feedback) @i(maxdelay))] @c{[lisp]}}@\An all-pass filter with variable @i(feedback) and @i(delay). This is just like @i(snd-alpass) except @i(feedback) and @i(delay) are sounds, and there is an additional @code(FLONUM) parameter, @i(maxdelay), that gives an upper bound on the value of @i(delay). @p(Note:) @i(delay) must remain between zero and @i(maxdelay). If not, results are undefined, and Nyquist may crash. You should use @code(alpass) instead (see Section @ref(alpass-sec)).
+
+@codef[snd-areson(@pragma(defn)@index(snd-areson)@i(sound), @i(hz), @i(bw),
+@i(normalization))] @c{[sal]}@*
+@altdef{@code[(snd-areson @i(sound) @i(hz) @i(bw) @i(normalization))] @c{[lisp]}}@\A notch filter modeled after the @code(areson)
+unit generator in Csound. The @code(snd-areson) filter is an exact
+complement of @code(snd-reson) such that if both are applied to the
+same signal with the same parameters, the sum of the results yeilds
+the original signal. Note that because of this complementary design,
+the power is not normalized as in @code(snd-reson). See @code(snd-reson)
+for details on @i(normalization). You should use @code(areson) instead (see
+Section @ref(areson-sec)).
+
+@codef[snd-aresoncv(@pragma(defn)@index(snd-aresoncv)@i(sound), @i(hz), @i(bw),
+@i(normalization))] @c{[sal]}@*
+@altdef{@code[(snd-aresoncv @i(sound) @i(hz) @i(bw) @i(normalization))] @c{[lisp]}}@\This function is identical to @code(snd-areson) except
+the @i(bw) (bandwidth) parameter is a sound. Filter coefficients are
+updated at the sample rate of @i(bw). The ``@code(cv)'' suffix stands for Constant,
+Variable, indicating that @i(hz) and @i(bw) are constant (a number) and
+variable (a sound), respectively. This naming convention is used throughout.
+You should use @code(areson) instead (see
+Section @ref(areson-sec)).
+
+@codef[snd-aresonvc(@pragma(defn)@index(snd-aresonvc)@i(sound), @i(hz), @i(bw),
+@i(normalization))] @c{[sal]}@*
+@altdef{@code[(snd-aresonvc @i(sound) @i(hz) @i(bw) @i(normalization))] @c{[lisp]}}@\This function is identical to @code(snd-areson) except
+the @i(hz) (center frequency) parameter is a sound. Filter coefficients are
+updated at the sample rate of @i(hz).
+You should use @code(areson) instead (see
+Section @ref(areson-sec)).
+
+@codef[snd-aresonvv(@pragma(defn)@index(snd-aresonvv)@i(sound), @i(hz), @i(bw),
+@i(normalization))] @c{[sal]}@*
+@altdef{@code[(snd-aresonvv @i(sound) @i(hz) @i(bw) @i(normalization))] @c{[lisp]}}@\This function is identical to @code(snd-areson) except
+both @i(hz) (center frequency) and @i(bw) (bandwidth) are sounds. Filter
+coefficients are updated at the next sample of either @i(hz) or @i(bw).
+You should use @code(areson) instead (see
+Section @ref(areson-sec)).
+
+@codef[snd-atone(@pragma(defn)@index(snd-atone)@i(sound), @i(hz))] @c{[sal]}@*
+@altdef{@code[(snd-atone @i(sound) @i(hz))] @c{[lisp]}}@\A high-pass filter
+modeled after the @code(atone) unit generator in Csound. The @code(snd-atone) filter is an exact
+complement of @code(snd-tone) such that if both are applied to the
+same signal with the same parameters, the sum of the results yeilds
+the original signal. You should use @code(hp) instead (see
+Section @ref(hp-sec)).
+
+@codef[snd-atonev(@pragma(defn)@index(snd-atonev)@i(sound), @i(hz))] @c{[sal]}@*
+@altdef{@code[(snd-atonev @i(sound) @i(hz))] @c{[lisp]}}@\This is just like
+@code(snd-atone) except that the @i(hz) cutoff frequency is a sound. Filter
+coefficients are updated at the sample rate of @i(hz). You should use
+@code(hp) instead (see Section @ref(hp-sec)).
+
+@codef[snd-biquad(@pragma(defn)@index(snd-biquad)@i(sound), @i(b0), @i(b1), @i(b2), @i(a1), @i(a2), @i(z1init), @i(z2init))] @c{[sal]}@*
+@altdef{@code[(snd-biquad @i(sound) @i(b0) @i(b1) @i(b2) @i(a1) @i(a2) @i(z1init) @i(z2init))] @c{[lisp]}}@\A general second order IIR filter, where @i(a0) is assumed to be unity. For @i(a1) and @i(a2), the sign convention is opposite to that of Matlab. All parameters except the input @i(sound) are of type @code(FLONUM). You should probably use one of @code(lowpass2), @code(highpass2), @code(bandpass2), @code(notch2), @code(allpass2), @code(eq-lowshelf), @code(eq-highshelf), @code(eq-band), @code(lowpass4), @code(lowpass6), @code(lowpass8), @code(highpass4), @code(highpass6), or @code(highpass8), which are all based on @code(snd-biquad) and described in Section @ref(lowpass2-sec). For completeness, you will also find @code(biquad) and @code(biquad-m) described in that section.
+
+@label(snd-chase-sec)
+@codef[snd-chase(@pragma(defn)@index(snd-chase)@i(sound), @i(risetime), @i(falltime))] @c{[sal]}@*
+@altdef{@code[(snd-chase @i(sound) @i(risetime) @i(falltime))] @c{[lisp]}}@\A slew rate limiter. The output ``chases'' the input at rates determined by @i(risetime) and @i(falltime). If the input changes too fast, the output will lag behind the input. This is a form of lowpass filter, but it was created to turn hard-switching square waves into smoother control signals that could be used for linear crossfades. If the input switches from 0 to 1, the output will linearly rise to 1 in @i(risetime) seconds. If the input switches from 1 to 0, the output will linearly fall to 0 in @i(falltime) seconds. The generated slope is constant; the transition is linear; this is not an exponential rise or fall. The @i(risetime) and @i(falltime) must be scalar constants; complain to the author if this is not adequate. The @code(snd-chase) function is safe for ordinary use. See @code(snd-follow) in Section @ref(snd-follow-sec) for a related function.
+
+@codef[snd-congen(@pragma(defn)@index(snd-congen)@i(gate), @i(risetime), @i(falltime))] @c{[sal]}@*
+@altdef{@code[(snd-congen @i(gate) @i(risetime) @i(falltime))] @c{[lisp]}}@\A simple ``contour generator'' based
+on analog synthesizers. The @i(gate) is a sound that normally steps from 0.0 to 1.0 at the start of an envelop and goes from
+1.0 back to 0.0 at the beginning of the release. At each sample, the output converges to the input exponentially. If @i(gate) is greater than the output, e.g. the attack, then the output converges half-way to the output in @i(risetime). If the @i(gate) is less than the output, the half-time is @i(falltime). The sample rate, starting time, logical-stop-time, and terminate time are taken from @i(gate). You should use @code(congen) instead (see Section @ref(congen-sec).
+
+@codef[snd-convolve(@pragma(defn)@index(snd-convolve)@i(sound), @i(response))] @c{[sal]}@*
+@altdef{@code[(snd-convolve @i(sound) @i(response))] @c{[lisp]}}@\Convolves
+@i(sound) by @i(response) using a simple O(N x M) algorithm. The @i(sound)
+can be any length, but the @i(response) is computed and stored in a table. The required compuation time per sample and total space are proportional to the
+length of @i(response). Use @code(convolve) instead (see Section
+@ref(convolve-sec)).
+
+@codef[snd-delay(@pragma(defn)@index(snd-delay)@i(sound), @i(delay), @i(feedback))] @c{[sal]}@*
+@altdef{@code[(snd-delay @i(sound) @i(delay) @i(feedback))] @c{[lisp]}}@\Feedback
+delay. The output, initially @i(sound), is recursively delayed by @i(delay), scaled by @i(feedback), and added to itself, producing an repeating echo effect. The @i(feedback) should be less than one to avoid exponential amplitude blowup. Delay is rounded to the nearest sample. You should use @code(feedback-delay) instead (see Section @ref(feedback-delay-sec))
+
+@codef[snd-delaycv(@pragma(defn)@index(snd-delaycv)@i(sound), @i(delay),
+@i(feedback))] @c{[sal]}@*
+@altdef{@code[(snd-delaycv @i(sound) @i(delay) @i(feedback))] @c{[lisp]}}@\Feedback delay with variable @i(feedback). This is just like
+@i(snd-delay) except @i(feedback) is a sound. You should use
+@code(feedback-delay) instead (see Section @ref(feedback-delay-sec)).
+
+@codef[snd-reson(@pragma(defn)@index(snd-reson)@i(sound), @i(hz), @i(bw), @i(normalization))] @c{[sal]}@*
+@altdef{@code[(snd-reson @i(sound) @i(hz) @i(bw) @i(normalization))] @c{[lisp]}}@\A
+second-order resonating (bandpass) filter with center frequency @i(hz) and
+bandwidth @i(bw), modeled after the @code(reson) unit generator in Csound.
+The @i(normalization) parameter must be an integer and (like in Csound)
+specifies a scaling factor. A value of 1 specifies a peak amplitude
+response of 1.0; all frequencies other than @i(hz) are attenuated. A
+value of 2 specifies the overall RMS value of the amplitude response
+is 1.0; thus filtered white noise would retain the same power. A value of
+zero specifies no scaling. The result sample rate, start time, etc. are takend from @i(sound).
+You should use @code(reson) instead (see Section
+@ref(reson-sec)).
+
+@codef[snd-resoncv(@pragma(defn)@index(snd-resoncv)@i(sound), @i(hz), @i(bw),
+@i(normalization))] @c{[sal]}@*
+@altdef{@code[(snd-resoncv @i(sound) @i(hz) @i(bw) @i(normalization))] @c{[lisp]}}@\This function is identical to @code(snd-reson) except
+@i(bw) (bandwidth) is a sound. Filter coefficients are updated at the
+sample rate of @i(bw). You should use @code(reson) instead (see Section
+@ref(reson-sec)).
+
+@codef[snd-resonvc(@pragma(defn)@index(snd-resonvc)@i(sound), @i(hz), @i(bw),
+@i(normalization))] @c{[sal]}@*
+@altdef{@code[(snd-resonvc @i(sound) @i(hz) @i(bw) @i(normalization))] @c{[lisp]}}@\This function is identical to @code(snd-reson) except
+@i(hz) (center frequency) is a sound. Filter coefficients are updated at the
+sample rate of @i(hz). You should use @code(reson) instead (see Section
+@ref(reson-sec)).
+
+@codef[snd-resonvv(@pragma(defn)@index(snd-resonvv)@i(sound), @i(hz), @i(bw),
+@i(normalization))] @c{[sal]}@*
+@altdef{@code[(snd-resonvv @i(sound) @i(hz) @i(bw) @i(normalization))] @c{[lisp]}}@\This function is identical to @code(snd-reson) except
+botth @i(hz) (center frequency) and @i(bw) (bandwidth) are sounds. Filter
+coefficients are updated at the next sample from either @i(hz) or @i(bw). You should use @code(reson) instead (see Section
+@ref(reson-sec)).
+
+@codef[snd-stkchorus(@pragma(defn)@index(snd-stkchorus)@index(chorus)@index(effect, chorus)@index(STK chorus)@i(sound), @i(delay), @i(depth), @i(freq), @i(mix),
+@i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-stkchorus @i(sound) @i(delay) @i(depth) @i(freq) @i(mix) @i(sr))] @c{[lisp]}}@\A chorus implemented in STK. The parameter @i(delay) is a @code(FIXNUM)
+representing the median desired delay length in samples. A typical
+value is 6000. The @code(FLONUM) parameters @i(depth) and @i(freq) set the modulation
+depth (from 0 to 1) and modulation frequency (in Hz), @i(mix) sets the mixture
+of input sound and chorused sound, where a value of 0.0 means input sound
+only (dry) and a value of 1.0 means chorused sound only (wet).
+The parameter @i(sr) is the desired sample rate of the resulting sound@foot(This
+is probably a mistake since sample rate is implied by @i(sound). This parameter
+may be removed in a future release.) You should use @code(pitshift) instead
+(see Section @ref(stkchorus-sec)).
+
+@codef[snd-stkpitshift(@pragma(defn)@index(snd-stkpitshift)@index(pitch shift)@index(effect, pitch shift)@index(STK pitch shift)@i(sound), @i(shift), @i(mix), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-stkpitshift @i(sound) @i(shift) @i(mix) @i(sr))] @c{[lisp]}}@\A
+pitch shifter implemented in STK. The @i(sound) is shifted in pitch by
+@i(shift), a @code(FLONUM) representing the shift factor. A value of 1.0 means
+ no shift. The parameter @i(mix) sets the mixture of input and shifted sounds.
+A value of 0.0 means input only (dry) and a value of 1.0 means shifted
+sound only (wet). The @i(sr) is the desired sampling frequency.@foot(This
+is probably a mistake since sample rate is implied by @i(sound). This parameter
+may be removed in a future release.) You should use @code(pitshift) instead
+(see Section @ref(stkpitshift-sec)).
+
+@codef[snd-stkrev(@pragma(defn)@index(snd-stkrev)@index(reverb)@index(effect, reverberation)@index(STK reverb)@i(rev-type), @i(sound), @i(decay), @i(mix), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-stkrev @i(rev-type) @i(sound) @i(decay) @i(mix) @i(sr))] @c{[lisp]}}@\A reverb
+implemented in STK. The parameter rev-type is a @code(FIXNUM) ranging from zero to
+two and selects the type of reverb. Zero selects NRev type, one selects JCRev,
+and two selects PRCRev. The input @i(sound) is processed by the reverb with
+a @i(decay) time in seconds (a @code(FLONUM)). The @i(mix), a @code(FLONUM),
+sets the
+mixture of dry input and reverb output. A value of 0.0 means input only (dry)
+and a value of 1.0 means reverb only (wet). The sample rate
+is @i(sr)@foot(This is probably a mistake since sample rate is implied
+by @i(sound). This parameter may be removed in a future release.) You
+should use @code(nrev), @code(jcrev) or @code(prcrev) instead (see
+Section @ref(stkrev-sec)).
+
+@codef[snd-tone(@pragma(defn)@index(snd-tone)@index(low-pass filter)@i(sound), @i(hz))] @c{[sal]}@*
+@altdef{@code[(snd-tone @i(sound) @i(hz))] @c{[lisp]}}@\A
+first-order recursive low-pass filter, based on the @i(tone) unit generator
+of Csound. The @i(hz) parameter is the cutoff frequency, the response
+curve's half-power point. The result sample rate, start time, etc. are takend from @i(sound).
+You should use @code(lp) instead (see Section
+@ref(lp-sec)).
+
+@codef[snd-tonev(@pragma(defn)@index(snd-tonev)@i(sound), @i(hz))] @c{[sal]}@*
+@altdef{@code[(snd-tonev @i(sound) @i(hz))] @c{[lisp]}}@\This function is
+identical to @code(snd-tone) except @i(hz) (cutoff frequency) is a sound.
+The filter coefficients are updated at the sample rate of @i(hz). You
+should use @code(lp) instead (see Section
+@ref(lp-sec)).
+
+
+@end(fndefs)
+
+
+@subsection(Table-Lookup Oscillator Functions)
+These functions all use a sound to describe one period of a periodic
+waveform. In the current implementation, the sound samples are copied to an
+array (the waveform table) when the function is called. To make a
+table-lookup oscillator generate a specific pitch, we need to have several
+pieces of information:
+@begin(itemize)
+A waveform to put into the table. This comes from the @i(sound) parameter.
+
+The length (in samples) of the waveform. This is obtained by reading
+samples (starting at the sound's start time, not necessarily at time zero)
+until the physical stop time of the sound. (If you read the waveform from a
+file or generate it with functions like @code(sim) and @code(sine), then the
+physical and logical stop times will be the same and will correspond to the
+duration you specified, rounded to the nearest sample.)
+
+The intrinsic sample rate of the waveform. This sample rate is simply the
+sample rate property of @i(sound).
+
+The pitch of the waveform. This is supplied by the @i(step) parameter and
+indicates the pitch (in steps) of @i(sound). You might expect that the
+pitch would be related to the period (length) of @i(sound), but there is the
+interesting case that synthesis based on sampling often loops over multiple
+periods. This means that the fundamental frequency of a generated tone may
+be some multiple of the looping rate. In Nyquist, you always specify the
+perceived pitch of the looped @i(sound) if the sound is played at the
+@i(sound)'s own sample rate.
+
+The desired pitch. This is specified by the @i(hz) parameter
+in Hertz (cycles per second) in these low-level functions. Note that this
+is not necessarily the ``loop'' rate at which the table is scanned.
+Instead, Nyquist figures what sample rate conversion would be necessary to
+``transpose'' from the @i(step) which specifies the original pitch of
+@i(sound) to @i(hz), which gives the desired pitch. The mixed use of steps
+and Hertz came about because it seemed that sample tables would be tagged
+with steps (``I sampled a middle-C''), whereas frequency deviation in the
+@code(fmosc) function is linear, thus calling for a specification in Hertz.
+
+The desired sample rate. This is given by the @i(sr) parameter in Hertz.
+@end(itemize)
+
+Other parameters common to all of these oscillator functions are:
+@begin(itemize)
+@i(t0), the starting time, and
+
+@i(phase), the starting phase in degrees. Note that if the @i(step)
+parameter indicates that the table holds more than one fundamental period, then a starting phase of 360 will be different than a starting phase of 0.
+@end(itemize)
+
+@begin(fndefs)
+ @codef[snd-amosc(@pragma(defn)@index(snd-amosc)@i(sound), @i(step), @i(sr), @i(hz), @i(t0),
+@i(am), @i(phase))] @c{[sal]}@*
+@altdef{@code[(snd-amosc @i(sound) @i(step) @i(sr) @i(hz) @i(t0) @i(am) @i(phase))] @c{[lisp]}}@\An oscillator with amplitude modulation. The sound
+@i(am) specifies the amplitude and the logical stop time. The physical stop
+time is also that of @i(am). You should use @code(amosc) instead (see
+Section @ref(amosc-sec)).
+
+@codef[snd-fmosc(@pragma(defn)@index(snd-fmosc)@i(s), @i(step), @i(sr), @i(hz), @i(t0), @i(fm),
+@i(phase))] @c{[sal]}@*
+@altdef{@code[(snd-fmosc @i(s) @i(step) @i(sr) @i(hz) @i(t0) @i(fm) @i(phase))] @c{[lisp]}}@\A Frequency Modulation oscillator. The sound @i(fm) specifies
+frequency deviation (in Hertz) from @i(hz). You should use @code(fmosc)
+instead (see Section @ref(fmosc-sec)).
+
+@codef[snd-fmfb(@pragma(defn)@index(snd-fmfb)@i(t0), @i(hz), @i(sr), @i(index), @i(dur))] @c{[sal]}@*
+@altdef{@code[(snd-fmfb @i(t0) @i(hz) @i(sr) @i(index) @i(dur))] @c{[lisp]}}@\A Feedback FM oscillator. The resulting sound starts
+at @i(t0), has a fundamental frequency of @i(hz), a sample rate of @i(sr),
+and a duration of @i(dur) seconds. The @i(index) is a @code(FLONUM) that
+specifies the amount of feedback. You should use @code(fmfb) instead (see
+Section @ref(fmfb-sec)).
+
+@codef[snd-fmfbv(@pragma(defn)@index(snd-fmfbv)@i(t0), @i(hz), @i(sr), @i(index))]@*
+@altdef{@code[(snd-fmfv @i(t0) @i(hz) @i(sr) @i(index))] @c{[lisp]}}@\A
+ Feedback FM oscillator. The resulting sound starts
+at @i(t0), has a fundamental frequency of @i(hz), and
+a sample rate of @i(sr). The @i(index) is a @code(SOUND) that
+specifies the amount of feedback and determines the duration.
+You should use @code(fmfb) instead (see Section @ref(fmfb-sec)).
+
+@codef[snd-buzz(@pragma(defn)@index(snd-buzz)@i(n), @i(sr), @i(hz), @i(t0), @i(fm))] @c{[sal]}@*
+@altdef{@code[(snd-buzz @i(n) @i(sr) @i(hz) @i(t0) @i(fm))] @c{[lisp]}}@\A
+buzz oscillator, which generates @i(n) harmonics of equal amplitude.
+The @i(fm) specifies
+frequency deviation (in Hertz) from @i(hz). You should use @code(buzz)
+instead (see Section @ref(buzz-sec)).
+
+@codef[snd-pluck(@pragma(defn)@index(snd-pluck)@i(sr), @i(hz), @i(t0), @i(d),
+ @i(final-amp))] @c{[sal]}@*
+@altdef{@code[(snd-pluck @i(sr) @i(hz) @i(t0) @i(d) @i(final-amp))] @c{[lisp]}}@\A Karplus-Strong plucked string oscillator with sample rate
+@i(sr), fundamental frequency @i(hz), starting time @i(t0), duration @i(d),
+initial amplitude approximately 1.0 (not exact because the string is
+initialized with random values) and final amplitude approximately
+@i(final-amp). You should use @code(pluck) instead (see Section
+ @ref(pluck-sec)).
+
+@codef[snd-osc(@pragma(defn)@index(snd-osc)@i(s), @i(step), @i(sr), @i(hz), @i(t0), @i(d), @i(phase))] @c{[sal]}@*
+@altdef{@code[(snd-osc @i(s) @i(step) @i(sr) @i(hz) @i(t0) @i(d) @i(phase))] @c{[lisp]}}@\A simple table lookup oscillator with fixed frequency. The duration
+is @i(d) seconds. You should use @code(osc) instead (see Section
+@ref(osc-sec)).
+
+@codef[snd-partial(@pragma(defn)@index(snd-partial)@i(sr), @i(hz), @i(t0), @i(env))] @c{[sal]}@*
+@altdef{@code[(snd-partial @i(sr) @i(hz) @i(t0) @i(env))] @c{[lisp]}}@\This is a
+special case of @code(snd-amosc) that generates a sinusoid starting at phase
+0 degrees. The @i(env) parameter gives the envelope or any other amplitude
+modulation. You should use @code(partial) instead (see Section
+@ref(partial-sec)).
+
+@codef[snd-sine(@pragma(defn)@index(snd-sine)@i(t0), @i(hz), @i(sr), @i(d))] @c{[sal]}@*
+@altdef{@code[(snd-sine @i(t0) @i(hz) @i(sr) @i(d))] @c{[lisp]}}@\This is a
+special case of @code(snd-osc) that always generates a sinusoid with initial
+phase of 0 degrees. You should use @code(sine) instead (see Section @ref(sine-sec)).
+
+@codef[snd-siosc(@pragma(defn)@index(snd-siosc)@i(tables), @i(sr), @i(hz), @i(t0),
+@i(fm))] @c{[sal]}@*
+@altdef{@code[(snd-siosc @i(tables) @i(sr) @i(hz) @i(t0) @i(fm))] @c{[lisp]}}@\A Spectral Interpolation Oscillator with frequency modulation. The
+@i(tables) is a list of sounds and sample counts as follows: (@i(table0)
+@i(count1) @i(table1) ... @i(countN) @i(tableN)). The initial waveform is given by @i(table0), which is interpolated linearly to @i(table1) over the first
+@i(count1) samples. From @i(count1) to @i(count2) samples, the waveform is
+interpolated from @i(table1) to @i(table2), and so on. If more than
+@i(countN) samples are generated, @i(tableN) is used for the remainder of
+the sound. The duration and logical stop time of the sound is taken from
+@i(fm), which specified frequency modulation (deviation) in Hertz. You
+should use @code(siosc) instead (see Section @ref(siosc-sec)).
+
+@end(fndefs)
+
+@subsection(Physical Model Functions)
+These functions perform some sort of physically-based modeling synthesis.
+@begin(fndefs)
+@codef[(snd-bandedwg@pragma(defn)@index(snd-bandedwg)@index(STK banded waveguide) @i(freq) @i(bowpress-env) @i(preset) @i(sr))]@*
+@altdef{@code[(snd-bandedwg @i(freq) @i(bowpress-env) @i(preset) @i(sr))] @c{[lisp]}}@\A Banded Wave Guide
+Percussion instrument implemented in STK. The parameter @i(freq) is a
+@code(FLONUM) in Hz, @i(bowpress-env) is
+a @code(SOUND) that ranges from zero to one, @i(preset) is a @code(FIXNUM),
+and @i(sr) is the desired sample rate in Hz. Currently, there are four
+presets: uniform-bar (0), tuned-bar (1), glass-harmonica (2), and
+tibetan-bowl (3). You should use @code(wg-uniform-bar), @code(wg-tuned-bar),
+ @code(wg-glass-harm), or @code(wg-tibetan-bowl) instead (see Section
+@ref(bandedwg-sec)).
+
+@codef[snd-bowed(@pragma(defn)@index(snd-bowed)@index(stk bowed)@i(freq),
+@i(bowpress-env), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-bowed @i(freq) @i(bowpress-env) @i(sr))] @c{[lisp]}}@\A bowed string instrument implemented in
+STK. The freq is a @code(FLONUM) in Hertz, bowpress-env is a
+ @code(SOUND) that ranges from z
+ero to one, and sr is the desired sample rate (a @code(FLONUM)).
+You should use bowed instead (see Section @ref(bowed-sec)).
+
+@codef[snd-bowed-freq(@pragma(defn)@index(snd-bowed-freq)@index(stk bowed)@i(freq), @i(bowpress-env), @i(freq-env), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-bowed-freq @i(freq) @i(bowpress-env) @i(freq-env) @i(sr))] @c{[lisp]}}@\A bowed model just like @code(snd-bowed) but with
+an additional parameter for continuous frequency control. You should use
+@code(bowed-freq) instead (see Section @ref(bowed-sec)).
+
+@codef[snd-clarinet(@pragma(defn)@index(snd-clarinet)@index(stk clarinet)@i(freq), @i(breath-env), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-clarinet @i(freq) @i(breath-env) @i(sr))] @c{[lisp]}}@\A clarinet
+model implemented in STK. The @i(freq) is a @code(FLONUM) in Hertz,
+ @i(breath-env) is
+a @code(SOUND) that ranges from zero to one, and @i(sr) is the
+ desired sample
+rate (a @code(FLONUM)). You should use @code(clarinet) instead
+ (see Section
+@ref(clarinet-sec)).
+
+@codef[snd-clarinet-freq(@pragma(defn)@index(snd-clarinet-freq)@index(STK clarinet)@i(freq), @i(breath-env), @i(freq-env), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-clarinet-freq @i(freq) @i(breath-env) @i(freq-env) @i(sr))] @c{[lisp]}}@\A clarinet model just like @code(snd-clarinet) but with
+an additional parameter for continuous frequency control. You should use
+@code(clarinet-freq) instead (see Section @ref(clarinet-sec)).
+
+@codef[snd-clarinet-all(@pragma(defn)@index(snd-clarinet-all)@i(freq), @i(vibrato-freq),
+@i(vibrato-gain), @i(freq-env), @i(breath-env),
+@i(reed-stiffness), @i(noise), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-clarinet-all @i(freq) @i(vibrato-freq) @i(vibrato-gain) @i(freq-env) @i(breath-env) @i(reed-stiffness) @i(noise) @i(sr))] @c{[lisp]}}@\A clarinet model just like
+@code(snd-clarinet-freq) but with
+additional parameters for vibrato generation and continuous control of
+reed stiffness and breath noise. You should use
+@code(clarinet-all) instead (see Section @ref(clarinet-sec)).
+
+@codef[snd-flute(@pragma(defn)@index(snd-flute)@index(stk flute)@i(freq),
+ @i(breath-env), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-flute @i(freq) @i(breath-env) @i(sr))] @c{[lisp]}}@\A flute implemented in STK. The @i(freq) is a
+@code(FLONUM) in Hertz, @i(breath-env) is a @code(SOUND)
+ that ranges from zero to one, and @i(sr) is
+ the desired sample rate (a @code(FLONUM)). You should use @code(flute)
+ instead (see Section @ref(flute-sec)).
+
+@codef[snd-flute-freq(@pragma(defn)@index(snd-flute-freq)@index(stk flute)@i(freq), @i(breath-env),
+@i(freq-env), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-flute-freq @i(freq) @i(breath-env) @i(freq-env) @i(sr))] @c{[lisp]}}@\A flute model just like @code(snd-flute) but with
+an additional parameter for continuous frequency control. You should use
+@code(flute-freq) instead (see Section @ref(flute-sec)).
+
+@codef[snd-flute-all(@pragma(defn)@index(snd-flute-all)@index(stk flute)@i(freq), @i(vibrato-freq), @i(vibrato-gain), @i(freq-env), @i(breath-env),
+@i(jet-delay), @i(noise), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-flute-all @i(freq) @i(vibrato-freq) @i(vibrato-gain) @i(freq-env) @i(breath-env) @i(jet-delay) @i(noise) @i(sr))] @c{[lisp]}}@\A flute model just like
+@code(snd-flute-freq) but with
+additional parameters for vibrato generation and continuous control of
+breath noise. You should use
+@code(flute-all) instead (see Section @ref(flute-sec)).
+
+@codef[snd-mandolin(@pragma(defn)@index(snd-mandolin)@index(STK mandolin)@i(t0), @i(freq), @i(dur), @i(body-size), @i(detune), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-mandolin @i(t0) @i(freq) @i(dur) @i(body-size) @i(detune) @i(sr))] @c{[lisp]}}@\A plucked
+ double-string instrument model implemented in STK. The @i(t0) parameter
+ is the starting time (in seconds), @i(freq) is a @code(FLONUM) in
+ Hz, @i(body-size) and @i(detune) are @code(FLONUM)s, and @code(sr)
+ is the desired sample
+ rate. You should use @code(mandolin) instead (see Section @ref(mandolin-sec)).
+
+@codef[snd-modalbar(@pragma(defn)@index(snd-modalbar)@index(STK modal bar)@i(t0), @i(freq), @i(preset), @i(dur), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-modalbar @i(t0) @i(freq) @i(preset) @i(dur) @i(sr))] @c{[lisp]}}@\Struck bar instrument
+ model implemented in STK. The parameter @i(t0) is the starting
+time (in seconds), @i(freq) is a @code(FLONUM) in Hz,
+ @code(preset) is a @code(FIXNUM) ranging from 0 to 8, @i(dur) is a
+@code(FLONUM) that
+ sets the duration (in seconds) and @i(sr) is the desired sample rate. You
+should use @code(modalbar) instead (see Section @ref(modalbar-sec)).
+
+@codef[snd-sax(@pragma(defn)@index(snd-sax)@index(STK sax)@i(freq), @i(breath-env), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-sax @i(freq) @i(breath-env) @i(sr))] @c{[lisp]}}@\A sax
+model implemented in STK. The @i(freq) is a @code(FLONUM) in Hertz, @i(breath-env) is
+a @code(SOUND) that ranges from zero to one, and @i(sr) is the desired sample
+rate (a @code(FLONUM)). You should use @code(sax) instead (see Section
+@ref(sax-sec)).
+
+@codef[snd-sax-freq(@pragma(defn)@index(snd-sax-freq)@i(freq), @i(freq-env), @i(breath-env),
+ @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-sax-freq @i(freq) @i(freq-env) @i(breath-env) @i(sr))] @c{[lisp]}}@\A sax model just like @code(snd-sax) but with
+an additional parameter for continuous frequency control. You should use
+@code(sax-freq) instead (see Section @ref(sax-sec)).
+
+@codef[snd-sax-all(@pragma(defn)@index(snd-sax-all)@i(freq), @i(vibrato-freq),
+@i(vibrato-gain), @i(freq-env), @i(breath-env),
+@i(reed-stiffness), @i(noise), @i(blow-pos), @i(reed-table-offset), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-sax-all @i(freq) @i(vibrato-freq) @i(vibrato-gain) @i(freq-env) @i(breath-env) @i(reed-stiffness) @i(noise) @i(blow-pos) @i(reed-table-offset) @i(sr))] @c{[lisp]}}@\A
+sax model just like
+@code(snd-sax-freq) but with
+additional parameters for vibrato generation and continuous control of
+reed stiffness, breath noise, excitation position, and reed table offset.
+ You should use
+@code(sax-all) instead (see Section @ref(sax-sec)).
+
+@codef[snd-sitar(@pragma(defn)@index(snd-sitar)@index(STK sitar)@i(t0),
+@i(freq), @i(dur), @i(sr))] @c{[sal]}@*
+@altdef{@code[(snd-sitar @i(t0) @i(freq) @i(dur) @i(sr))] @c{[lisp]}}@\A sitar model implemented in STK. The parameter
+@i(t0) is the starting time, @i(freq) is a @code(FLONUM) (in Hz), E
+@i(dur) sets the duration and @i(sr) is the sample rate (in Hz)
+of the resulting sound. You should use @code(sitar) instead (see Section
+@ref(sitar-sec)).
+
+
+@end(fndefs)
+
+
+@subsection(Sequence Support Functions)
+The next two functions are used to implement Nyquist's @code(seq) construct.
+
+@begin(fndefs)
+@codef[snd-seq(@pragma(defn)@index(snd-seq)@i(sound), @i(closure))] @c{[sal]}@*
+@altdef{@code[(snd-seq @i(sound) @i(closure))] @c{[lisp]}}@\This function returns
+@i(sound) until the logical stop time of @i(sound). Then, the XLISP
+@i(closure)
+is evaluated, passing it the logical stop time of @i(sound) as a
+parameter. The closure must return a sound, which is then added to
+@i(sound). (An add is used so that @i(sound) can continue past its logical
+stop if desired.) Do not call this function. See @code(seq) in Section
+@ref(seq-sec).
+
+@codef[snd-multiseq(@pragma(defn)@index(snd-multiseq)@i(array), @i(closure))] @c{[sal]}@*
+@altdef{@code[(snd-multiseq @i(array) @i(closure))] @c{[lisp]}}@\This
+function is similar to @code(snd-seq) except the first parameter is a
+multichannel sound rather than a single sound. A multichannel sound is
+simply an XLISP array of sounds. An array of sounds is returned which is
+the sum of @i(array) and another array of sounds returned by @i(closure).
+The @i(closure) is passed the logical stop time of the multichannel sound,
+which is the maximum logical stop time of any element of @i(array). Do
+not call this function. See @code(seq) in Section @ref(seq-sec).
+@end(fndefs)
+
+@begin(fndefs)
+@codef[snd-trigger(@pragma(defn)@index(snd-trigger)@i(s), @i(closure))] @c{[sal]}@*
+@altdef{@code[(snd-trigger @i(s) @i(closure))] @c{[lisp]}}@\This is one of
+the only ways in which a behavior instance can be created by changes in a
+signal. When @i(s) (a @code(SOUND)) makes a transition from less than or
+equal to zero to greater than zero, the closure, which takes a starting
+time parameter, is evaluated. The closure must return a @code(SOUND). The
+sum of all these sounds is returned. If there are no sounds, the result will
+be zero. The stop time of the result is the maximum stop time of @i(s) and
+all sounds returned by the closure. The sample rate of the return value is
+the sample rate of @i(s), and the sounds returned by the closure must all
+have that same sample rate. Do not call this function.
+See @code(trigger) in Section @ref(trigger-sec).
+
+An implementation note: There is no way to have @code(snd-trigger) return
+a multichannel sound. An alternative implementation would be a built-in
+function to scan ahead in a sound to find the time of the next zero crossing.
+This could be combined with some LISP code similar to @code(seq) to sum up
+instances of the closure. However, this would force arbitrary look-ahead
+and therefore would not work with real-time inputs, which was the motivation
+for @code(snd-trigger) in the first place.
+@end(fndefs)
+
+@chapter(Nyquist Globals)
+@index(Global Variables)
+There are many global variables in Nyquist. A convention in Lisp is to place asterisks (*) around global variables, e.g. @code(*table*). This is only a convention, and the asterisks are just like any other letter as far as variable names are concerned. Here are some globals users should know about:
+
+@begin(description, leftmargin +2 in, indent -2 in)
+@codef(*table*)@index(*table*)@\Default table used by @code(osc) and other oscillators.
+
+@codef(*A4-Hertz*)@pragma(defn)@index(*a4-hertz*)@\Frequency of A4 in Hertz.. Note: you must call @code[(set-pitch-names)] to recompute pitches after changing @code(*A4-Hertz*).
+
+@codef(*autonorm*)@pragma(defn)@index(*autonorm*)@\The normalization factor to be applied to the next sound when @code(*autonorm-type*) is @code('previous). See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*autonormflag*)@pragma(defn)@index(*autonormflag*)@\Enables the automatic normalization feature of the @code(play) command. You should use @code[(autonorm-on)] and @code[(autonorm-off)] rather than setting @code(*autonormflag*) directly. See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*autonorm-max-samples*)@pragma(defn)@index(*autonorm-max-samples*)@\Specifies how many samples will be computed searching for a peak value when @code(*autonorm-type*) is @code('lookahead). See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*autonorm-previous-peak*)@pragma(defn)@index(*autonorm-previous-peak*)@\The peak of the previous sound generated by @code(play). This is used to compute the scale factor for the next sound when @code(*autonorm-type*) is @code('previous). See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*autonorm-target*)@pragma(defn)@index(*autonorm-target*)@\The target peak amplitude for the autonorm feature. The default value is 0.9. See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*autonorm-type*)@pragma(defn)@index(*autonorm-type*)@\Determines how the autonorm feature is implemented. Valid values are @code('lookahead) (the default) and @code('previous). See Sections @ref(peak-ex-sec) and @ref(play-sec).
+
+@codef(*breakenable*)@pragma(defn)@index(*breakenable*)@\Controls whether XLISP enters a break loop when an error is encountered. See Section @ref(symbols-sec).
+
+@codef(*control-srate*)@pragma(defn)@index(*control-srate*)@\Part of the environment, establishes the control sample rate. See Section @ref(environment-sec) for details.
+
+@codef(*default-sf-bits*)@pragma(defn)@index(*default-sf-bits*)@\The default bits-per-sample for sound files. Typically 16.
+
+@codef(*default-sf-dir*)@pragma(defn)@index(*default-sf-dir*)@\The default sound file directory. Unless you give a full path for a file, audio files are assumed to be in this directory. (Applies to many functions that deal with sound files. Check the function description to see if @code(*default-sf-dir*) applies.)
+
+@codef(*default-sf-format*)@pragma(defn)@index(*default-sf-format*)@\The default sound file format. When you write a file, this will be the default format: AIFF for Mac and most Unix systems, NeXT for NeXT systems, and WAV for Win32.
+
+@codef(*default-sf-srate*)@pragma(defn)@index(*default-sf-srate*)@\The default sample rate for sound files. Typically 44100.0, but often set to 22050.0 for speed in non-critical tasks.
+
+@codef(*default-control-srate*)@pragma(defn)@index(*default-control-srate*)@\Default value for @code(*control-srate*). This value is restored when you execute @code[(top)] to pop out of a debugging session. Change it by calling @code[(set-control-srate @i(value))].
+
+@codef(*default-sound-srate*)@pragma(defn)@index(*default-sound-srate*)@\Default value for @code(*sound-srate*). This value is restored when you execute @code[(top)] to pop out of a debugging session. Change it by calling @code[(set-sound-srate @i(value))].
+
+@codef(*file-separator*)@pragma(defn)@index(*file-separator*)@\The character that separates directories in a path,
+e.g. ``@code(/)'' for Unix, ``@code(:)'' for Mac, and ``@code(\)'' for Win32.
+This is normally set in @code(system.lsp).
+
+@codef(*rslt*)@pragma(defn)@index(*rslt*)@\When a function returns more than one value, @code(*rslt*) is set to a list of the ``extra'' values. This provides a make-shift version of the @code(multiple-value-return) facility in Common Lisp.
+
+@codef(*sound-srate*)@pragma(defn)@index(*sound-srate*)@\Part of the environment, establishes the audio sample rate. See Section @ref(environment-sec) for details.
+
+@codef(*soundenable*)@pragma(defn)@index(*soundenable*)@\Controls whether writes to a sound file will also be played as audio. Set this variable by calling @code{(sound-on)} or @code{(sound-off)}.
+
+@codef(*tracenable*)@pragma(defn)@index(*tracenable*)@\Controls whether XLISP prints a backtrace when an error is encountered.
+
+@b(XLISP variables)@\See Section @ref(symbols-sec) for a list of
+global variables defined by XLISP.
+
+@b(Environment variables)@\See Section @ref(environment-sec) for definitions of variables used in the environment for behaviors. In general, you should never set or access these variables directly.
+
+@b(Various constants)@\See Section @ref(constants-sec) for definitions of predefined constants for loudness, duration, and pitch.
+
+@end(description)
+
+@chapter(Time/Frequency Transformation)
+Nyquist provides functions for FFT and inverse FFT operations on streams of audio data.
+Because sounds can be of any length, but an FFT operates on a fixed amount of data, FFT
+processing is typically done in short blocks or windows that move through the audio. Thus,
+a stream of samples is converted in to a sequence of FFT frames representing short-term
+spectra.
+
+Nyquist does not have a special data type corresponding to a sequence of FFT frames.
+This would be nice, but it would require creating a large set of operations suitable for
+processing frame sequences. Another approach, and perhaps the most ``pure'' would
+be to convert a single sound into a multichannel sound, with one channel per bin of the
+FFT.
+
+Instead, Nyquist violates its ``pure'' functional model and resorts to objects
+for FFT processing. A sequence of frames is represented by an XLISP object. Whenever you
+send the selector @code[:next] to the object, you get back either NIL, indicating the
+end of the sequence, or you get an array of FFT coefficients.
+
+The Nyquist function @code[snd-fft] (mnemonic, isn't it?) returns one of the frame sequence
+generating objects. You can pass any frame sequence generating object to another function,
+@code[snd-ifft], and turn the sequence back into audio.
+
+With @code[snd-fft] and @code[snd-ifft], you can create all sorts of interesting processes. The main
+idea is to create intermediate objects that both accept and generate sequences of frames.
+These objects can operate on the frames to implement the desired spectral-domain
+processes. Examples of this can be found in the file
+@code[fft_tutorial.htm]@index(fft tutorial)@index(fast fourier transform tutorial)@index(demos, fft),
+which is part of the standard Nyquist release. The documentation for @code[snd-fft] and
+@code[snd-ifft] follows.
+
+@begin(fndefs)
+@codef[snd-fft(@pragma(defn)@index(snd-fft)@index(fft)@i(sound), @i(length), @i(skip), @i(window))] @c{[sal]}@*
+@altdef{@code[(snd-fft @i(sound) @i(length) @i(skip) @i(window))] @c{[lisp]}}@\This
+function performs an FFT on the first samples in @i(sound) and returns a Lisp array of @code[FLONUM]s.
+The function modifies the @i(sound), violating the normal rule that sounds are immutable in Nyquist, so
+it is advised that you copy the sound using @code[snd-copy] if there are any other references to
+@i(sound). The length of the FFT is specified by @i(length), a @code[FIXNUM] (integer) which must
+be a power of 2. After
+each FFT, the sound is advanced by @i(skip) samples, also of type @code[FIXNUM]. Overlapping FFTs,
+where @i(skip) is less than @i(length), are allowed. If @i(window) is not @code[NIL], it must be a sound.
+The first @i(length) samples of @i(window) are multiplied by @i(length) samples of @i(sound) before
+performing the FFT. When there are no more samples in @i(sound) to transform,
+this function returns @code[NIL]. The coefficients in the returned array, in order, are the DC coefficient,
+the first real, the first imaginary, the second real, the second imaginary, etc.
+The last array element corresponds to the real coefficient at the Nyquist frequency.
+
+@codef[snd-ifft(@pragma(defn)@index(snd-ifft)@index(ifft)@index(inverse fft)@i(time), @i(srate), @i(iterator), @i(skip), @i(window))] @c{[sal]}@*
+@altdef{@code[(snd-ifft @i(time) @i(srate) @i(iterator) @i(skip) @i(window))] @c{[lisp]}}@\This function performs an IFFT on a sequence of spectral frames obtained from @i(iterator)
+and returns a sound. The start time of the sound is given by @i(time). Typically, this would be computed
+by calling @code[(local-to-global 0)]. The sample rate is given by @i(srate). Typically, this would
+be @code[*sound-srate*], but it might also depend upon the sample rate of the sound from which the
+spectral frames were derived. To obtain each frame, the function sends the message @code[:next] to the
+@i(iterator) object, using XLISP's primitives for objects and message passing. The object should return
+an array in the same format as obtained from @code[snd-fft], and the object should return @code[NIL]
+when the end of the sound is reached. After each frame is inverse transformed into the time domain, it is
+added to the resulting sound. Each successive frame is added with a sample offset specified by @i(skip)
+relative to the previous frame. This must be an integer greater than zero. If @i(window) is
+not @code[NIL], it must be a sound. This window signal is multiplied by the inverse transformed frame
+before the frame is added to the output sound. The length of each frame should be the same power of 2.
+The length
+is implied by the array returned by @i(iterator), so it does not appear as a parameter. This length
+is also the number of samples used from @i(window). Extra samples are ignored, and window is padded
+with zeros if necessary, so be sure @i(window) is the right length. The resulting sound is computed on
+demand as with other Nyquist sounds, so @code[:next] messages are sent to @i(iterator) only when new
+frames are needed. One should be careful not to reuse or modify @i(iterator) once it is passed to
+@code[snd-ifft].
+@end(fndefs)
+
+@chapter(MIDI, Adagio, and Sequences)
+@label(adagio-chap)
+@index(MIDI)@index(Sequences)
+Nyquist includes facilities to read and write MIDI files as well as an ASCII
+text-based score representation language, Adagio. XLISP and Nyquist can be
+used to generate MIDI files using compositional algorithms. (See also Section @ref(xmusic-sec).)
+A tutorial on using the Adadio representation and MIDI can be found in
+@code(demos/midi_tutorial.htm)@index(demos, midi). The Adagio language is
+described below. Adagio was originally developed as part of the CMU MIDI
+Toolkit, which included a program to record and play MIDI using the
+Adagio representation. Some of the MIDI features of Adagio may not be
+useful within Nyquist.
+
+Nyquist offers a number of different score representations, and you may
+find this confusing. In general, MIDI files are a common way to exchange
+music performance data, especially with sequencers and score notation
+systems. The @code(demos/midi_tutorial.htm) examples show how to get the most
+precise control when generating MIDI data. Adagio is most useful as a
+text-based score entry language, and it is certainly more compact
+than Lisp expressions for MIDI-like data. The Xmusic library
+(Chapter @ref(xmusic-sec)) is best for algorithmic generation of music
+and score manipulation. There are functions to convert between the
+Adagio, MIDI sequence data, and Xmusic score representations.
+
+@pragma(doinclude)
+@include(adagio-nyquist.mss)
+
+@chapter(Linear Prediction Analysis and Synthesis)
+@index(Linear Prediction)@index(LPC)
+Nyquist provides functions to perform Linear Prediction Coding (LPC)
+analysis and synthesis. In simple terms, LPC analysis assumes that a
+sound is the result of an all-pole filter applied to a source with a
+flat spectrum. LPC is good for characterizing the general spectral
+shape of a signal, which may be time-varying as in speech sounds.
+For synthesis, any source can be filtered, allowing the general
+spectral shape of one signal (used in analysis) to be applied to
+any source (used in synthesis). A popular effect is to give vowel-like
+spectra to musical tones, creating an artificial (or sometimes natural)
+singing voice.
+
+Examples of LPC analysis and synthesis can be found in the file
+@code[lpc_tutorial.htm]@index(lpc tutorial)@index(linear prediction tutorial)@index(demos, lpc),
+which is part of the standard Nyquist release.
+
+As with FFT processing, LPC analysis takes a sound as input and returns
+a stream of frames. Frames are returned from an object using the @code(:next)
+selector just as with FFT frames. An LPC frame is a list consisting of:
+@i(RMS1), the energy of the input signal, @i(RMS2), the energy of the
+residual signal, @i(ERR), the square root of @i(RMS1)/@i(RMS2), and
+@i(FILTER-COEFS), an array of filter coefficients. To make code more
+readable and to avoid code dependence on the exact format of a frame,
+the functions @code(lpc-frame-rms1)@index(lpc-frame-rms1),
+@code(lpc-frame-rms2)@index(lpc-frame-rms2),
+@code(lpc-frame-err)@index(lpc-frame-err), and
+@code(lpc-frame-filter-coefs)@index(lpc-frame-filter-coefs) can be
+applied to a frame to obtain the respective fields.
+
+The @i(z) transform
+of the filter is @i(H)(@i(z)) = 1/@i(A)(@i(z)), where @i(A)(@i(z)) is a
+polynomial of the form @i(A)(@i(z)) = 1 + @i(a@-[1])@i(z) +
+@i(a@-[2])@i(z) + ... + @i(a@-[p])@i(z). The @i(FILTER-COEFS) array has
+the form @code[#(]@i(a@-[p]) @i(a@-[p-1]) ... @i(a@-[3])
+@i(a@-[2]) @i(a@-[1])@code[)].
+
+The file @code(lpc.lsp) defines some useful classes and functions. The file
+is @i(not) automatically loaded with Nyquist, so you must execute
+@code[(load "lpc")] before using them.
+
+@section(LPC Classes and Functions)
+@begin(fndefs)
+@codef[make-lpanal-iterator(@pragma(defn)@index(make-lpanal-iterator)@i(sound), @i(framedur), @i(skiptime), @i(npoles))] @c{[sal]}@*
+@altdef{@code[(make-lpanal-iterator @i(sound) @i(framedur) @i(skiptime) @i(npoles))] @c{[lisp]}}@\Makes an iterator
+object, an instance of @code(lpanal-class),
+that returns LPC frames from successive frames of samples in
+@i(sound). The duration (in seconds)
+of each frame is given by @i(framedur), a
+@code(FLONUM). The skip size (in seconds) between successive frames
+is given by @i(skiptime), a @code(FLONUM). Typical values for
+@i(framedur) and @i(skiptime) are 0.08 and 0.04, giving 25 frames
+per second and a 50% frame overlap. The number of poles is given
+by @i(npoles), a @code(FIXNUM). The result is an object that
+responds to the @code(:next) selector by returning a frame as
+described above. @code(NIL) is returned when @i(sound) terminates.
+(Note that one or more of the last analysis windows may be
+padded with zeros. @code(NIL) is only returned when the corresponding
+window would begin after the termination time of the sound.)
+
+@codef[make-lpc-file-iterator(@pragma(defn)@index(make-lpc-file-iterator)@i(filename))] @c{[sal]}@*
+@altdef{@code[(make-lpc-file-iterator @i(filename))] @c{[lisp]}}@\Another way to get LPC frames is to read them from a
+ file. This function opens an ASCII file containing LPC frames and
+ creates an iterator object, an instance of class @code(lpc-file-class)
+ to access them. Create a file using @code(save-lpc-file) (see below).
+
+@codef[save-lpc-file(@pragma(defn)@index(save-lpc-file)@i(lpc-iterator), @i(filename))] @c{[sal]}@*
+@altdef{@code[(save-lpc-file @i(lpc-iterator) @i(filename))] @c{[lisp]}}@\Create a file containing LPC frames.
+This file can be read by @code[make-lpc-file-iterator] (see above).
+
+@codef{show-lpc-data(@pragma(defn)@index(show-lpc-data)@i(lpc-iterator),
+@i(iniframe), @i(endframe) [, @i(poles?)])} @c{[sal]}@*
+@altdef{@code{(show-lpc-data @i(lpc-iterator) @i(iniframe) @i(endframe)
+ [@i(poles?)])} @c{[lisp]}}@\Print values of LPC
+frames from an LPC iterator object. The object is @i(lpc-iterator),
+which is typically an instance of @code(lpanal-class) or
+@code(lpc-file-class). Frames are numbered from zero, and only
+files starting at @i(iniframe) (a @code[FIXNUM]) and ending before
+@i(endframe) (also a @code[FIXNUM]) are printed. By default, only
+the values for @i(RMS1), @i(RMS2), and @i(ERR) are printed, but
+if optional parameter @i(poles?) is non-@code[NIL], then
+the LPC coefficients are also printed.
+
+@codef[allpoles-from-lpc(@pragma(defn)@index(allpoles-from-lpc)@i(snd), @i(lpc-frame))] @c{[sal]}@*
+@altdef{@code[(allpoles-from-lpc @i(snd) @i(lpc-frame))] @c{[lisp]}}@\A single LPC frame defines a filter.
+Use @code(allpoles-from-lpc) to apply this filter to @i(snd),
+a @code(SOUND). To obtain @i(lpc-frame), a @code(LIST)
+ containing an LPC frame, either send @code(:next) to an
+ LPC iterator, or use @code(nth-frame) (see below). The result
+ is a @code(SOUND) whose duration is the same as that of @i(snd).
+
+@codef[lpreson(@pragma(defn)@index(lpreson)@i(snd), @i(lpc-iterator),
+@i(skiptime))] @c{[sal]}@*
+@altdef{@code[(lpreson @i(snd) @i(lpc-iterator) @i(skiptime))] @c{[lisp]}}@\Implements a time-varying all-pole filter
+controlled by a sequence of LPC frames from an iterator. The
+@code(SOUND) to be filtered is @i(snd), and the source of
+LPC frames is @i(lpc-iterator), typically an instance of
+@code(lpanal-class) or @code(lpc-file-class). The frame
+period (in seconds) is given by @i(skiptime) (a @code(FLONUM)).
+This number does not have to agree with the @i(skiptime) used
+to analyze the frames. (Greater values will cause the filter
+evolution slow down, and smaller values will cause it to
+speed up.) The result is a @code(SOUND). The duration of the
+result is the minimum of the duration of @i(snd) and that of
+the sequence of frames.
+
+@codef[lpc-frame-rms1(@pragma(defn)@index(lpc-frame-rms1)@i(frame))] @c{[sal]}@*
+@altdef{@code[(lpc-frame-rms1 @i(frame))] @c{[lisp]}}@\Get the energy of the input signal from a frame.
+
+@codef[lpc-frame-rms2(@pragma(defn)@index(lpc-frame-rms2)@i(frame))] @c{[sal]}@*
+@altdef{@code[(lpc-frame-rms2 @i(frame))] @c{[lisp]}}@\Get the energy of the residual from a frame.
+
+@codef[lpc-frame-err(@pragma(defn)@index(lpc-frame-err)@i(frame))] @c{[sal]}@*
+@altdef{@code[(lpc-frame-err @i(frame))] @c{[lisp]}}@\Get the square root of @i(RMS1)/@i(RMS2) from a frame.
+
+@codef[lpc-frame-filter-coefs(@pragma(defn)@index(lpc-frame-filter-coefs)@i(frame))] @c{[sal]}@*
+@altdef{@code[(lpc-frame-filter-coefs @i(frame))] @c{[lisp]}}@\Get the filter coefficients from a frame.
+
+@end(fndefs)
+
+@section(Low-level LPC Functions)
+The lowest-level Nyquist functions for LPC are
+@begin(itemize)
+@code(snd-lpanal) for analysis,
+
+@code(snd-allpoles), an all-pole filter with fixed coefficients, and
+
+@code(snd-lpreson), an all-pole filter that takes frames from an LPC iterator.
+@end(itemize)
+
+@begin(fndefs)
+@codef[snd-lpanal(@pragma(defn)@index(snd-lpanal)@i(samps), @i(npoles))] @c{[sal]}@*
+@altdef{@code[(snd-lpanal @i(samps) @i(npoles))] @c{[lisp]}}@\Compute
+an LPC frame with @i(npoles) (a @code(FIXNUM)) poles from an
+@code(ARRAY) of samples (@code(FLONUMS)). Note that @code(snd-fetch-array)
+can be used to fetch a sequence of frames from a sound. Ordinarily, you
+should not use this function. Use @code(make-lpanal-iterator) instead.
+
+@codef[snd-allpoles(@pragma(defn)@index(snd-allpoles)@i(snd), @i(lpc-coefs), @i(gain))] @c{[sal]}@*
+@altdef{@code[(snd-allpoles @i(snd) @i(lpc-coefs) @i(gain))] @c{[lisp]}}@\A fixed all-pole filter. The input is
+@i(snd), a @code(SOUND). The filter coefficients are given by @i(lpc-coefs)
+(an @code(ARRAY)), and the filter gain is given by @i(gain), a @code(FLONUM).
+The result is a @code(SOUND) whose duration matches that of @i(snd).
+Ordinarily, you should use @code(allpoles-from-lpc) instead (see above).
+
+@codef[snd-lpreson(@pragma(defn)@index(snd-lpreson)@i(snd), @i(lpc-iterator),
+@i(skiptime))] @c{[sal]}@*
+@altdef{@code[(snd-lpreson @i(snd) @i(lpc-iterator) @i(skiptime))] @c{[lisp]}}@\This function is identical to @code(lpreson) (see above).
+@end(fndefs)
+
+
+@chapter(Developing and Debugging in Nyquist)
+@index(debugging)@index(developing code)
+There are a number of tools, functions, and techniques that can help to debug Nyquist programs. Since these are described in many places
+throughout this manual, this chapter brings together many suggestions and techniques for developing code and debugging. You @i(really)
+should read this chapter before you spend too much time with Nyquist. Many problems that you will certainly run into are addressed here.
+
+@section(Debugging)
+Probably the most important debugging tool is the backtrace. There are
+two kinds of backtrace: one for SAL, and one for Lisp.
+
+SAL mode is actually just an XLISP function (@code(sal)) that reads
+input and evaluates it. When SAL encounters an error, it normally
+prints a trace of the SAL stack (all the active functions written in SAL),
+exists the current command, and reads the next command.
+
+If you call XLISP functions from SAL, including most Nyquist sound
+processing functions, and an error occurs within these XLISP functions,
+you will only see the SAL function that called the XLISP functions
+listed in the stack trace. Sometimes you need more details.
+
+When Nyquist encounters an error when it is not running SAL, it
+normally suspends execution and prints an
+error message. To find out where in the program the error occurred
+and how you got there, start by typing @code[(bt)]. This will print
+out the last several function calls and their arguments, which is
+usually sufficient to see what is going on.
+
+In order for @code[(bt)] to work, you must have a couple of global
+variables set: @code(*tracenable*) is ordinarily set to @code(NIL).
+If it is true, then a backtrace is automatically printed when an
+error occurs; @code(*breakenable*) must be set to @code(T), as
+it enables the execution to be suspended when an error is
+encountered. If @code(*breakenable*) is @code(NIL) (false),
+then execution stops when an error occurs but the stack is
+not saved and you cannot get a backtrace. Finally, @code(bt)
+is just a macro to save typing. The actual backtrace function
+is @code(baktrace), which takes an integer argument telling how
+many levels to print. All of these things are set up by default
+when you start Nyquist.
+
+To get this XLISP backtrace behavior when SAL encounters an error,
+you need to have @code(*breakenable*) set while SAL is running. The
+best way to do this is to run within the NyquistIDE program,
+open the Preferences dialog, and choose the desired settings, e.g.
+``Enable XLISP break on SAL error.''
+
+Since Nyquist sounds are executed with a lazy evaluation scheme, some
+errors are encountered when samples are being generated. In this
+case, it may not be clear which expression is in error. Sometimes, it
+is best to explore a function or set of functions by examining
+intermediate results. Any expression that yields a sound can be
+assigned to a variable and examined using one or more of:
+@code(s-plot), @code(snd-print-tree), and of course @code(play). The
+@code(snd-print-tree) function prints a lot of detail about the inner
+representaion of the sound. Keep in mind that if you assign a sound
+to a global variable and then look at the samples (e.g. with
+@code(play) or @code(s-plot)), the samples will be retained in
+memory. At 4 bytes per sample, a big sound may use all of your
+memory and cause a crash.
+
+Another technique is to use low sample rates so that it is easier to
+plot results or look at samples directly. The calls:
+@begin(example)
+set-sound-srate(100)
+set-control-srate(100)
+@end(example)
+set the default sample rates to 100, which is too slow for audio, but useful for examining programs and results. The function
+@begin(example)
+snd-samples(@i(sound), @i(limit))
+@end(example)
+will convert up to @i(limit) samples from @i(sound) into a Lisp
+array. This is another way to look at results in detail.
+
+The @code(trace) function is sometimes useful. It prints the name of
+a function and its arguments everytimg the function is called, and the
+result is printed when the function exits. To trace the osc function,
+type:
+@begin(example)
+trace(osc)
+@end(example)
+and to stop tracing, type @code[untrace(osc)].
+
+If a variable needs a value or a function is undefined, and if @code(*breakenable*) was set, you will get a prompt where you can fix
+the error (by setting the variable or loading the function definition)
+and keep going. At the debug (or break) prompt, your input must
+be in XLISP, not SAL syntax. Use @code[(co)], short for @code[(continue)] to
+reevaluate the variable or function and continue execution.
+
+When you finish debugging a particular call, you can ``pop''
+up to the top level by typing @code[(top)], a short name for @code[(top-level)].
+There is a button named "Top" in the NyquistIDE that takes you back to the
+top level (ready to accept XLISP expressions),
+and another button named "SAL" that puts you back in SAL mode.
+
+@section(Useful Functions)
+@begin(fndefs)
+@codef[grindef(@pragma(defn)@index(grindef)@index(listing of lisp function)@i(name))] @c{[sal]}@*
+@altdef{@code[(grindef @i(name))] @c{[lisp]}}@\Prints
+a formatted listing of a lisp function. This is often useful to quickly inspect
+a function without searching for it in source files. Do not forget to quote the
+name, e.g. @code[(grindef 'prod)].
+
+@codef[args(@pragma(defn)@index(args)@index(arguments to a lisp function)@i(name))] @c{[sal]}@*
+@altdef{@code[(args @i(name))] @c{[lisp]}}@\Similar
+to @code(grindef), this function prints the arguments to a function. This may
+be faster than looking up a function in the documentation if you just need a
+reminder. For example, @code[(args 'lp)] prints ``(LP S C),'' which may help you
+to remember that the arguments are a sound (S) followed by the cutoff (C)
+frequency.
+@end(fndefs)
+
+The following functions are useful short-cuts that might have been included in
+XLISP. They are so useful that they are defined as part of Nyquist.
+
+@begin(fndefs)
+@codef[incf(@pragma(defn)@index(incf)@index(increment)@i(symbol))] @c{[sal]}@*
+@altdef{@code[(incf @i(symbol))] @c{[lisp]}}@\Increment @i(symbol)
+by one. This is a macro, and @i(symbol) can be anything that can be set by
+@code(setf). Typically, @i(symbol) is a variable: ``@code[(incf i)],'' but
+@i(symbol) can also be an array element: ``@code[(incf (aref myarray i))].''
+
+@codef[decf(@pragma(defn)@index(decf)@index(decrement)@i(symbol))] @c{[sal]}@*
+@altdef{@code[(decf @i(symbol))] @c{[lisp]}}@\Decrement @i(symbol)
+by one. (See @code(incf), above.)
+
+@codef[push(@pragma(defn)@index(push)@i(val), @i(lis))] @c{[sal]}@*
+@altdef{@code[(push @i(val) @i(lis))] @c{[lisp]}}@\Push @i(val) onto @i(lis) (a Lisp
+list). This is a macro that is equivalent to writing (in Lisp)
+@code[(setf @i(lis) (cons @i(val) @i(lis)))].
+
+@codef[pop(@pragma(defn)@index(pop)@i(lis))] @c{[sal]}@*
+@altdef{@code[(pop @i(lis))] @c{[lisp]}}@\Remove (pop) the first item from @i(lis) (a
+Lisp list). This is a macro that is equivalent to writing (in Lisp)
+@code[(setf @i(lis) (cdr @i(lis)))]. Note that the remaining list is returned,
+not the head of the list that has been popped. Retrieve the head of the list
+(i.e. the top of the stack) using @code(first) or, equivalently, @code(car).
+@end(fndefs)
+
+The following macros are useful control constructs.
+
+@begin(fndefs)
+@codef[while(@pragma(defn)@index(while)@i(test), @i(expr1), @i(expr2), @r(...))] @c{[sal]}@*
+@altdef{@code[(while @i(test) @i(expr1) @i(expr2) @r(...))] @c{[lisp]}}@\A conventional
+``while'' loop. If @i(test) is true, evaluate expressions
+ (@i(expr1), @i(expr2), etc.) and repeat. If @i(test) is false, return. This
+ expression evaluates to NIL unless the expression @code[(return @i(expr))]
+ is evaluated, in which case the value of @i(expr) is returned. In SAL, the
+ loop statement is preferred.
+
+@codef[when(@pragma(defn)@index(when)@i(test), @i(action))] @c{[sal]}@*
+@altdef{@code[(when @i(test) @i(action))] @c{[lisp]}}@\A conventional ``if-then''
+statement. If @i(test) is true, @i(action) is evaluated and returned. Otherwise,
+NIL is returned. (Use @code(if) or @code(cond) to implement
+ ``if-then-else'' and more complex conditional forms.
+@end(fndefs)
+
+It is often necessary to load a file @i(only if) it has not already been
+loaded. For example, the @code(pianosyn) library loads very slowly, so if
+some other file already loaded it, it would be good to avoid loading it
+again. How can you load a file once? Nyquist does not keep track of files
+that are loaded, but you must be loading a file to define some function,
+so the idea is to tell Nyquist "I require @i(function) from @i(file)"; if
+the function does not yet exist, Nyquist satisfies the requirement by loading
+the file.
+@begin(fndefs)
+@codef{require-from(@pragma(defn)@index(require-from)@index(load file conditionally)@i(fnsymbol),
+@i(filename) [, @i(path)])} @c{[sal]}@*
+@altdef{@code{(require-from @i(fnsymbol) @i(filename) [@i(path)])} @c{[lisp]}}@\Tests whether @i(fnsymbol), an unquoted
+function name, is defined. If
+not, @i(filename), a @code(STRING),
+is loaded. Normally @i(fnsymbol) is a function that will be called from
+within the current file, and @i(filename) is the file that defines
+@i(fnsymbol). The @i(path), if a @code(STRING), is prepended to @i(filename).
+If @i(path) is @code(t) (true), then the directory of the current file is
+used as the path.
+@end(fndefs)
+
+Sometimes it is important to load files relative to the current file. For example,
+the @code(lib/piano.lsp) library loads data files from the @code(lib/piano) directory,
+but how can we find out the full path of @code(lib)? The solution is:
+@begin(fndefs)
+@codef[current-path(@pragma(defn)@index(current-path)@index(path,
+current)@index(full path name))] @c{[sal]}@*
+@altdef{@code[(current-path)] @c{[lisp]}}@\Returns the full path name of the file that is
+currently being loaded (see @code(load)). Returns NIL if no file is being loaded.
+@end(fndefs)
+
+Finally, there are some helpful math functions:
+@begin(fndefs)
+@codef[real-random(@index(random)@index(uniform random)@pragma(defn)@index(real-random)@i(from), @i(to))] @c{[sal]}@*
+@altdef{@code[(real-random @i(from) @i(to))] @c{[lisp]}}@\Returns a random @code(FLONUM) between @i(from) and @i(to). (See also @code(rrandom), which is equivalent to @code((real-random 0 1))).
+
+@codef[power(@pragma(defn)@index(power)@index(exponent)@i(x), @i(y))] @c{[sal]}@*
+@altdef{@code[(power @i(x) @i(y))] @c{[lisp]}}@\Returns @i(x) raised to
+the @i(y) power.
+@end(fndefs)
+
+@chapter(Xmusic and Algorithmic Composition)
+@label(xmusic-sec)
+@index(Xmusic)@index(Algorithmic Composition)
+Several Nyquist libraries offer support for algorithmic composition. Xmusic
+is a library for generating sequences and patterns of data. Included in Xmusic
+is the @code(score-gen) macro which helps to generate scores from patterns.
+Another important facility is the @code(distributions.lsp) library,
+containing many different random number generators.
+
+@section(Xmusic Basics)
+Xmusic is inspired by and based on Common Music by Rick Taube. Currently,
+Xmusic only implements patterns and some simple support for scores to be
+realized as sound by Nyquist. In contrast, Common Music supports MIDI and
+various other synthesis languages and includes a graphical interface, some
+visualization tools, and many other features. Common Music runs in Common
+Lisp and Scheme, but not XLISP, which is the base language for Nyquist.
+
+Xmusic patterns are objects that generate data streams. For example,
+the @code(cycle-class) of objects generate cyclical patterns such as
+"1 2 3 1 2 3 1 2 3 ...", or "1 2 3 4 3 2 1 2 3 4 ...". Patterns can
+be used to specify pitch sequences, rhythm, loudness, and other parameters.
+
+Xmusic functions are automatically loaded when you start Nyquist.
+To use a pattern object, you first create the pattern, e.g.
+@begin(example)
+set pitch-source = make-cycle(list(c4, d4, e4, f4))
+@end(example)
+After creating the pattern, you can access it repeatedly
+with @code(next)@index(next in pattern) to generate data, e.g.
+@begin(example)
+play seqrep(i, 13, pluck(next(pitch-source), 0.2))
+@end(example)
+This will create a sequence of notes with the following pitches: c, d,
+e, f, c, d, e, f, c, d, e, f, c. If you evaluate this again, the
+pitch sequence will continue, starting on "d".
+
+It is very important not to confuse the creation of a sequence with
+its access. Consider this example:
+@begin(example)
+play seqrep(i, 13,
+ pluck(next(make-cycle(list(c4, d4, e4, f4))), 0.2))
+@end(example)
+This looks very much like the previous example, but it only repeats notes
+on middle-C. The reason is that every time @code(pluck) is evaluated,
+@code(make-cycle) is called and creates a new pattern object. After the
+first item of the pattern is extracted with @code(next), the cycle is not
+used again, and no other items are generated.
+
+To summarize this important point, there are two steps to using a pattern.
+First, the pattern is created and stored in a
+variable using @code(setf). Second, the pattern is accessed (multiple
+times) using @code(next).
+
+Patterns can be nested, that is, you can write patterns of patterns.
+In general, the @code(next) function does not return patterns. Instead,
+if the next item in a pattern is a (nested) pattern, @code(next) recursively
+gets the next item of the nested pattern.
+
+While you might expect that each call to @code(next) would advance the
+top-level pattern to the next item, and descend recursively if necessary
+to the inner-most nesting level, this is not how @code(next) works. Instead,
+@code(next) remembers the last top-level item, and if it was a pattern,
+@code(next) continues to generate items from that same inner pattern
+until the end of the inner pattern's @i(period) is reached. The next
+paragraph explains the concept of the @i(period).
+
+The data returned by a pattern object is structured into logical groups
+called @i(periods). You can get an entire period (as a list) by calling
+@code[next(@i(pattern), t)]@index(next pattern). For example:
+@begin(example)
+set pitch-source = make-cycle(list(c4, d4, e4, f4))
+print next(pitch-source, t)
+@end(example)
+This prints the list @code[(60 62 64 65)], which is one period
+of the cycle.
+
+You can also get explicit markers that
+delineate periods by calling @code[send(@i(pattern), :next)]. In this
+case, the value returned is either the next item of the pattern, or the
+symbol @code(+eop+) if the end of a period has been reached. What
+determines a period? This is up to the specific pattern class, so see the
+documentation for specifics. You can override the ``natural'' period
+using the keyword @code(for:), e.g.
+@begin(example)
+set pitch-source = make-cycle(list(c4, d4, e4, f4), for: 3)
+print next(pitch-source, t)
+print next(pitch-source, t)
+@end(example)
+This prints the lists @code[(60 62 64) (65 60 62)]. Notice that
+these periods just restructure the stream of items
+into groups of 3.
+
+Nested patterns are probably easier to understand by example than by
+specification. Here is a simple nested pattern of cycles:
+@begin(example)
+set cycle-1 = make-cycle({a b c})
+set cycle-2 = make-cycle({x y z})
+set cycle-3 = make-cycle(list(cycle-1, cycle-2))
+exec dotimes(i, 9, format(t, "~A ", next(cycle-3)))
+@end(example)
+This will print "A B C X Y Z A B C". Notice that the inner-most
+cycles @code(cycle-1) and @code(cycle-2) generate a period of items
+before the top-level @code(cycle-3) advances to the next pattern.
+
+Before describing specific pattern classes, there are several optional
+parameters that apply in the creating of any pattern object. These are:
+@begin(description, leftmargin +2 in, indent -2 in)
+@code(for:)@\The length of a period. This overrides the default
+by providing a numerical length. The value of this optional
+parameter may be a pattern that generates a sequence of integers
+that determine the length of each successive period. A period
+length may not be negative, but it may be zero.
+
+@code(name:)@\A pattern object may be given a name. This is useful
+if the @code(trace:) option is used.
+
+@code(trace:)@\If non-null, this optional parameter causes information
+about the pattern to be printed each time an item is generated
+from the pattern.
+
+@end(description)
+The built-in pattern classes are described in the following section.
+
+@section(Pattern Classes)
+@subsection(cycle)
+The @code(cycle-class) iterates repeatedly through a list of items.
+For example, two periods of @code[make-cycle({a b c})] would be
+@code[(A B C) (A B C)].
+
+@begin(fndefs)
+@codef{make-cycle(@pragma(defn)@index(make-cycle)@index(cycle pattern)@index(pattern, cycle)@i(items), for: @i(for), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-cycle @i(items) :for @i(for) :name @i(name)
+ :trace @i(trace))} @c{[lisp]}}@\Make a cycle
+pattern that iterates over @i(items). The default period length is the
+length of @i(items). (See above for a description of the
+optional parameters.) If @i(items) is a pattern, a period of the
+pattern becomes the list from which items are generated. The
+list is replaced every period of the cycle.
+@end(fndefs)
+
+@subsection(line)
+The @code(line-class) is similar to the cycle class, but when it reaches the
+end of the list of items, it simply repeats the last item in the list.
+For example, two periods of @code[make-line({a b c})] would be
+@code[(A B C) (C C C)].
+
+@begin(fndefs)
+@codef{make-line(@pragma(defn)@index(make-line)@index(line pattern)@index(pattern, line)@i(items), for: @i(for), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-line @i(items) :for @i(for) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Make a line
+pattern that iterates over @i(items). The default period length is the
+length of @i(items). As with @code(make-cycle), @i(items) may be a
+pattern. (See above for a description of the optional parameters.)
+@end(fndefs)
+
+@subsection(random)
+The @code(random-class) generates items at random from a list. The default
+selection is uniform random with replacement, but items may be further
+specified with a weight, a minimum repetition count, and a maximum
+repetition count. Weights give the relative probability of the selection
+of the item (with a default weight of one). The minimum count specifies how
+many times an item, once selected at random, will be repeated. The maximum
+count specifies the maximum number of times an item can be selected in a row.
+If an item has been generated @i(n) times in succession, and the maximum
+is equal to @i(n), then the item is disqualified in the next random selection.
+Weights (but not currently minima and maxima) can be patterns. The patterns
+(thus the weights) are recomputed every period.
+
+@begin(fndefs)
+@codef{make-random(@pragma(defn)@index(make-random)@index(random pattern)@index(pattern, random)@i(items), for: @i(for), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-random @i(items) :for @i(for) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Make a random
+pattern that selects from @i(items). Any (or all) element(s) of @i(items)
+may be lists of the following form: @code{(@i(value) :weight @i(weight)
+:min @i(mincount) :max @i(maxcount))}, where @i(value) is the item
+(or pattern) to be generated, @i(weight) is the (optional)
+relative probability of
+selecting this item, @i(mincount) is the (optional) minimum number of repetitions
+when this item is selected, and @i(maxcount) is the (optional) maximum number of
+repetitions allowed before selecting some other item. The default period
+length is the length of @i(items). If @i(items) is a pattern, a period
+from that pattern becomes the list from which random selections are
+made, and a new list is generated every period.
+@end(fndefs)
+
+@subsection(palindrome)
+The @code(palindrome-class) repeatedly traverses a list forwards and then
+backwards. For example, two periods of @code[make-palindrome({a b c})]
+would be @code[(A B C C B A) (A B C C B A)]. The @code(elide:)
+keyword parameter controls whether the first and/or last elements are
+repeated:
+@begin(example)
+make-palindrome({a b c}, elide: nil)
+ ;; generates A B C C B A A B C C B A ...
+
+make-palindrome({a b c}, elide: t)
+ ;; generates A B C B A B C B ...
+
+make-palindrome({a b c}, elide: :first)
+ ;; generates A B C C B A B C C B ...
+
+make-palindrome({a b c}, elide: :last)
+ ;; generates A B C B A A B C B A ...
+@end(example)
+
+@begin(fndefs)
+@codef{make-palindrome(@pragma(defn)@index(make-palindrome)@index(palindrome pattern)@index(pattern, palindrome)@i(items), elide: @i(elide), for: @i(for), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-palindrome @i(items) :elide @i(elide) :for @i(for) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Generate items
+from list alternating in-order and reverse-order sequencing. The keyword
+parameter @i(elide) can have the values @code(:first), @code(:last),
+@code(t), or @code(nil) to control repetition of the first and last elements.
+The @i(elide) parameter can also be a pattern, in which case it is evaluated
+every period. One period is one complete forward and backward traversal
+of the list. If @i(items) is a pattern, a period
+from that pattern becomes the list from which random selections are
+made, and a new list is generated every period.
+@end(fndefs)
+
+@subsection(heap)
+The @code(heap-class) selects items in random order from a list
+ without replacement, which means that all items are generated once before
+any item is repeated. For example, two periods of @code[make-heap({a b c})]
+ might be @code[(C A B) (B A C)]. Normally, repetitions can occur
+even if all list elements are distinct. This happens when the last element
+of a period is chosen first in the next period. To avoid repetitions, the
+@code(max:) keyword argument can be set to 1. The @code(max:) keyword only
+controls repetitions from the end of one period to the beginning of the next.
+If the list contains more than one copy of the same value, it may be repeated
+within a period regardless of the value of @code(max:).
+
+@begin(fndefs)
+@codef{make-heap(@pragma(defn)@index(make-heap)@index(heap pattern)@index(pattern, heap)@i(items), for: @i(for), max: @i(max), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-heap @i(items) :for @i(for) :max @i(max) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Generate items
+randomly from list without replacement. If @i(max) is 1, the first element of
+a new period will not be the same as the last element of the previous period,
+avoiding repetition. The default value of @i(max) is 2, meaning repetition is
+allowed. The period length is the length
+of @i(items). If @i(items) is a pattern, a period
+from that pattern becomes the list from which random selections are
+made, and a new list is generated every period.
+@end(fndefs)
+
+@subsection(accumulation)
+The @code(accumulation-class) takes a list of values and returns
+the first, followed by the first two, followed by the first three,
+etc. In other words, for each list item, return all items from the
+first through the item. For example, if the list is (A B C), each
+generated period is (A A B A B C).
+
+@begin(fndefs)
+@codef{make-accumulation(@pragma(defn)@index(make-accumulation)@index(accumulation pattern)@index(pattern, accumulation)@i(items), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-accumulation @i(items) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\For each item, generate items from the first to
+the item including the item. The period length is (@i(n)@+(2) + @i(n)) / 2
+where @i(n) is the length of @i(items). If @i(items) is a pattern, a period
+from that pattern becomes the list from which items are generated,
+and a new list is generated every period. Note that this is similar in
+name but different from @code(make-accumulate).
+
+@subsection(copier)
+The @code(copier-class) makes copies of periods from a sub-pattern.
+For example, three periods
+of @code[make-copier(make-cycle({a b c}, for: 1), repeat: 2, merge: t)]
+would be @code[(A A) (B B) (C C)]. Note that entire periods (not
+individual items) are repeated, so in this example the @code(for:)
+keyword was used to force periods to be of length one so that
+each item is repeated by the @code(repeat:) count.
+
+@codef{make-copier(@pragma(defn)@index(make-copier)@index(copier
+pattern)@index(pattern, copier)@i(sub-pattern), repeat: @i(repeat), merge: @i(merge), for: @i(for), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-copier @i(sub-pattern) :repeat @i(repeat) :merge @i(merge) :for @i(for) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Generate a period
+from @i(sub-pattern) and repeat it @i(repeat) times. If @i(merge) is false
+(the default), each repetition of a period from @i(sub-pattern) results
+in a period by default. If @i(merge) is true (non-null), then all
+ @i(repeat) repetitions of the period are merged into one result
+period by default. If the @code(for:) keyword is used, the same items
+are generated, but the items are grouped into periods determined by
+the @code(for:) parameter. If the @code(for:) parameter is a pattern,
+it is evaluated every result period. The @i(repeat) and @i(merge) values
+may be patterns that return a repeat count and a boolean value, respectively.
+If so, these patterns are evaluated initially and after each @i(repeat)
+ copies are made (independent of the @code(for:) keyword parameter, if any).
+The @i(repeat) value returned by a pattern can also be negative. A negative
+number indicates how many periods of @i(sub-pattern) to skip. After skipping
+these patterns, new @i(repeat) and @i(merge) values are generated.
+@end(fndefs)
+
+@subsection(accumulate)
+The @code(accumulate-class) forms the sum of numbers returned by another
+pattern. For example, each period
+of @code[make-accumulate(make-cycle({1 2 -3}))] is @code[(1 3 0)].
+The default output period length is the length of the input period.
+
+@begin(fndefs)
+@codef{make-accumulate(@pragma(defn)@index(make-accumulate)@index(accumulate
+pattern)@index(pattern, accumulate)@i(sub-pattern), for: @i(for), max: @i(maximum), min: @i(minimum), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-accumulate @i(sub-pattern) :for @i(for) :max @i(maximum) :min @i(minimum) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Keep
+a running sum of numbers generated by @i(sub-pattern). The default
+period lengths match the period lengths from @i(sub-pattern). If @i(maximum) (a pattern or a number) is specified, and the running sum exceeds @i(maximum), the running sum is reset to @i(maximum). If @i(minimum) (a pattern or a number) is specified, and the running sum falls below @i(minimum), the running sum is reset to @i(minimum). If @i(minimum) is greater than @i(maximum), the running sum will be set to one of the two values. Note that this is similar in name but not in function to
+@code(make-accumulation).
+@end(fndefs)
+
+@subsection(sum)
+The @code(sum-class) forms the sum of numbers, one from each of two other
+patterns. For example, each period
+of @code[make-sum(make-cycle({1 2 3}), make-cycle({4 5 6}))]
+is @code[(5 7 9)].
+The default output period length is the length of the input period of the
+first argument. Therefore, the first argument must be a pattern, but the
+second argument can be a pattern or a number.
+
+@begin(fndefs)
+@codef{make-sum(@pragma(defn)@index(make-sum)@index(sum
+pattern)@index(pattern, sum)@i(x), @i(y), for: @i(for), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-sum @i(x) @i(y) :for @i(for) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Form
+sums of items (which must be numbers) from pattern
+ @i(x) and pattern or number @i(y). The default
+period lengths match the period lengths from @i(x).
+@end(fndefs)
+
+@subsection(product)
+The @code(product-class) forms the product of numbers, one
+from each of two other
+patterns. For example, each period
+of @code[make-product(make-cycle({1 2 3}), make-cycle({4 5 6}))]
+is @code[(4 10 18)].
+The default output period length is the length of the input period of the
+first argument. Therefore, the first argument must be a pattern, but the
+second argument can be a pattern or a number.
+
+@begin(fndefs)
+@codef{make-product(@pragma(defn)@index(make-product)@index(product pattern)@index(pattern, product)@i(x), @i(y), for: @i(for), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-product @i(x) @i(y) :for @i(for) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Form
+products of items (which must be numbers) from pattern
+ @i(x) and pattern or number @i(y). The default
+period lengths match the period lengths from @i(x).
+@end(fndefs)
+
+
+@subsection(eval)
+The @code(eval-class) evaluates an expression to produce each output item.
+The default output period length is 1.
+
+@begin(fndefs)
+@codef{make-eval(@pragma(defn)@index(make-eval)@index(eval pattern)@index(pattern, eval)@index(expression pattern)@index(pattern, expression)@i(expr), for: @i(for), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-eval @i(expr) :for @i(for) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Evaluate
+@i(expr) to generate each item. If @i(expr) is a pattern, each item is generated by getting the next item from @i(expr) and evaluating it.
+@end(fndefs)
+
+
+@subsection(length)
+The @code(length-class) generates periods of a specified length from
+another pattern. This is similar to using the @code(for:) keyword, but
+for many patterns, the @code(for:) parameter alters the points at which
+other patterns are generated. For example, if the palindrome pattern
+has an @code(elide:) pattern parameter, the value will be computed every
+period. If there is also a @code(for:) parameter with a value of 2, then
+@code(elide:) will be recomputed every 2 items. In contrast, if the
+palindrome (without a @code(for:) parameter) is embedded in a @i(length)
+pattern with a lenght of 2, then the periods will all be of length 2, but
+the items will come from default periods of the palindrome, and therefore
+the @code(elide:) values will be recomputed at the beginnings of
+default palindrome periods.
+
+@begin(fndefs)
+@codef{make-length(@index(length pattern)@index(pattern,
+length)@pragma(defn)@index(make-length)@i(pattern), @i(length-pattern),
+name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-length @i(pattern) @i(length-pattern) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Make a pattern of class
+@code(length-class) that regroups items generated by a
+@i(pattern) according to pattern lengths given by @i(length-pattern).
+Note that @i(length-pattern) is not optional: There is no default
+pattern length and no @code(for:) keyword.
+@end(fndefs)
+
+@subsection(window)
+The @code(window-class) groups items from another pattern by using a sliding
+window. If the @i(skip) value is 1, each output period is formed
+by dropping the first item of the previous perioda and appending the next item
+from the pattern. The @i(skip) value and the output period length can change
+every period. For a simple example, if the period length is 3 and the
+skip value is 1, and the input pattern generates the sequence A, B, C, ...,
+then the output periods will be (A B C), (B C D), (C D E), (D E F), ....
+
+@begin(fndefs)
+@codef{make-window(@index(window pattern)@index(pattern,
+window)@pragma(defn)@index(make-window)@i(pattern), @i(length-pattern),
+@i(skip-pattern), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-window @i(pattern) @i(length-pattern) @i(skip-pattern) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Make
+ a pattern of class
+@code(window-class) that regroups items generated by a
+@i(pattern) according to pattern lengths given by @i(length-pattern)
+and where the period advances by the number of items given by
+@i(skip-pattern).
+Note that @i(length-pattern) is not optional: There is no default
+pattern length and no @code(for:) keyword.
+@end(fndefs)
+
+
+@subsection(markov)
+The @code(markov-class) generates items from a Markov model. A Markov model
+generates a sequence of @i(states) according to rules which specify possible
+future states
+given the most recent states in the past. For example, states might be
+pitches, and each pitch might lead to a choice of pitches for the next state.
+In the @code(markov-class), states can be either symbols or numbers, but
+not arbitrary values or patterns. This makes it easier to specify rules.
+However, symbols can be mapped to arbitrary values including pattern
+objects, and these become the actual generated items.
+By default, all future states are weighted equally, but weights
+may be associated with future states. A Markov model must be
+initialized with
+a sequence of past states using the @code(past:) keyword.
+The most common form of Markov model is a "first
+order Markov model" in which the future item depends only upon one
+past item. However, higher order models where the future items depend on
+two or more past items are possible. A "zero-order" Markov model, which
+depends on no past states, is essentially equivalent to the random pattern.
+As an example of a first-order Markov pattern,
+two periods of @code[make-markov({{a -> b c} {b -> c} {c -> a}}, past: {a})]
+might be @code[(C A C) (A B C)].
+
+@begin(fndefs)
+@codef{make-markov(@pragma(defn)@index(make-markov)@index(markov pattern)@index(pattern, markov)@i(rules), past: @i(past), produces: @i(produces), for: @i(for), name: @i(name), trace: @i(trace))} @c{[sal]}@*
+@altdef{@code{(make-markov @i(rules) @i(past) :produces @i(produces) :for @i(for) :name @i(name) :trace @i(trace))} @c{[lisp]}}@\Generate a sequence
+of items from a Markov process. The @i(rules) parameter has the form:
+@code[(@i(prev1) @i(prev2) ... @i(prevn) -> @i(next1) @i(next2) ... @i(nextn))]
+where @i(prev1) through @i(prevn) represent a sequence of most recent
+(past) states. The symbol @code(*) is treated specially: it matches any
+previous state. If @i(prev1) through @i(prevn) (which may be just one state
+as in the example above) match the previously generated states, this
+rule applies. Note that every rule must specify the same number of previous
+states; this number is known as the order of the Markov model.
+The first rule in @i(rules) that applies is used to select the
+next state. If no rule applies, the next state is @code(NIL) (which is
+a valid state that can be used in rules).
+Assuming a rule applies, the list of possible next
+states is specified by @i(next1)
+through @i(nextn). Notice that these are alternative choices for the
+next state, not a sequence of future states, and each rule can have
+any number of choices. Each choice may be the state
+itself (a symbol or a number), or the choice may be a list consisting of
+the state and a weight. The weight may be given by a pattern, in which
+case the next item of the pattern is obtained every time the rule is
+applied. For example, this rules says that if the previous states were
+A and B, the next state can be A with a weight of 0.5 or C with an
+implied weight of 1: @code[(A B -> (A 0.5) C)]. The
+default length of the period is the length of @i(rules). The
+@i(past) parameter must be provided. It is a list of states whose length
+matches the order of the Markov model. The keyword parameter @i(produces)
+may be used to map from state symbols or numbers to other values or
+patterns. The parameter is a list of alternating symbols and values. For
+example, to map A to 69 and B to 71, use @code[list(quote(a), 69, quote(b), 71)].
+ You can
+also map symbols to patterns, for example
+@code[list(quote(a), make-cycle({57 69}), quote(b), make-random({59 71}))]. The
+next item of the pattern is is generated each time the Markov model generates
+the corresponding state. Finally, the @i(produces) keyword can be
+@code(eval:), which means to evaluate the Markov model state. This could
+be useful if states are Nyquist global variables such as
+@code(C4, CS4, D4, ]..., which evaluate to numerical
+values (60, 61, 62, ...).
+
+@codef{markov-create-rules(@pragma(defn)@index(markov-create-rules)@index(markov analysis)@i(sequence), @i(order) [, @i(generalize)])} @c{[sal]}@*
+@altdef{@code{(markov-create-rules @i(sequence) @i(order) [@i(generalize)])} @c{[lisp]}}@\Generate a set of rules suitable for the
+@code(make-markov) function. The @i(sequence) is a ``typical'' sequence
+of states, and @i(order) is the order of the Markov model. It is often the
+case that a sample sequence will not have a transition from the last state
+to any other state, so the generated Markov model can reach a ``dead end''
+where no rule applies. This might lead to an infinite stream of NIL's. To
+avoid this, the optional parameter @i(generalize) can be set to @code(t)
+(true), indicating that there should be a fallback rule that matches any
+previous states and whose future states are weighted according to their
+frequency in @i(sequence). For example, if sequence contains 5 A's, 5 B's and
+10 G's, the default rule will be @code[(* -> (A 5) (B 5) (G 10))]. This
+rule will be appended to the end so it will only apply if no other rule does.
+@end(fndefs)
+
+@section(Random Number Generators)
+@index(random)@index(probability distributions)@index(distributions, probability)@index(stochastic functions)
+The @code(distributions.lsp) library implements random number generators that return random values with various probability distributions. Without this library, you can generate random numbers with @i(uniform) distributions. In a uniform distribution, all values are equally likely. To generate a random integer in some range, use @code(random). To generate a real number (FLONUM) in some range, use @code(real-random) (or @code(rrandom) if the range is 0-1). But there are other interesting distributions. For example, the Gaussian distribution is often used to model
+real-world errors and fluctuations where values are clustered around some central value and large deviations are more unlikely than small ones. See Dennis Lorrain, "A Panoply of Stochastic 'Canons'," @i(Computer Music Journal) vol. 4, no. 1, 1980, pp. 53-81.
+
+In most of the random number generators described below, there are optional parameters to indicate a maximum and/or minimum value. These can be used to truncate the distribution. For example, if you basically want a Gaussian distribution, but you never want a value greater than 5, you can specify 5 as the maximum value.
+The upper and lower bounds are implemented simply by drawing a random number from the full distribution repeatedly until a number falling into the desired range is obtained. Therefore, if you select an acceptable range that is unlikely, it may take Nyquist a long time to find each acceptable random number. The intended use of the upper and lower bounds is to weed out values that are already fairly unlikely.
+
+
+@begin(fndefs)
+@codef[linear-dist(@pragma(defn)@index(linear-dist)@index(linear distribution)@i(g))] @c{[sal]}@*
+@altdef{@code[(linear-dist @i(g))] @c{[lisp]}}@\Return a @code(FLONUM) value from a linear distribution, where the probability of a value decreases linearly from zero to @i(g) which must be greater than zero. (See Figure @ref(linear-fig).) The linear distribution is useful for generating for generating time and pitch intervals.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "linear-fig.ps"))
+@html(<img src="linear-fig.gif"><br><br>)
+@fillcaption(The Linear Distribution, @i(g) = 1.)
+@tag(linear-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{exponential-dist(@pragma(defn)@index(exponential-dist)@index(exponential distribution)@i(delta) [, @i(high)])} @c{[sal]}@*
+@altdef{@code{(exponential-dist @i(delta) [@i(high)])} @c{[lisp]}}@\Return a @code(FLONUM) value from an exponential distribution. The initial downward slope is steeper with larger values of @i(delta), which must be greater than zero. (See Figure @ref(exponential-fig). The optional @i(high) parameter puts an artificial upper bound on the return value.
+The exponential distribution generates values greater
+than 0, and can be used to generate time intervals. Natural random intervals such as the time intervals between the release of atomic particles or the passing of yellow volkswagons in traffic have exponential distributions. The
+exponential distribution is memory-less: knowing that a random number from this distribution is greater than some value (e.g. a note duration is at least 1 second) tells you nothing new about how soon the note will end. This
+is a continuous distribution, but @code(geometric-dist) (described below) implements the discrete form.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "exponential-fig.ps"))
+@html(<img src="exponential-fig.gif"><br><br>)
+@fillcaption(The Exponential Distribution, @i(delta) = 1.)
+@tag(exponential-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{gamma-dist(@pragma(defn)@index(gamma-dist)@i(nu) [, @i(high)])} @c{[sal]}@*
+@altdef{@code{(gamma-dist @i(nu) [@i(high)])} @c{[lisp]}}@\Return a @code(FLONUM) value from a Gamma distribution. The value is greater than zero, has a mean of @i(nu) (a @code(FIXNUM) greater than zero), and a mode (peak) of around @i(nu) - 1.
+ The optional @i(high) parameter puts an artificial upper bound on the return value.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "gamma-fig.ps"))
+@html(<img src="gamma-fig.gif"><br><br>)
+@fillcaption(The Gamma Distribution, @i(nu) = 4.)
+@tag(gamma-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{bilateral-exponential-dist(@pragma(defn)@index(bilateral-exponential-dist)@index(bilateral exponential distribution)@i(xmu),
+ @i(tau) [, @i(low), @i(high)])} @c{[sal]}@*
+@altdef{@code{(bilateral-exponential-dist @i(xmu) @i(tau) [@i(low) @i(high)])} @c{[lisp]}}@\Returns a @code(FLONUM) value from a bilateral exponential distribution, where @i(xmu) is the center of the double exponential and @i(tau) controls the spread of the distribution. A larger @i(tau) gives a wider distribution (greater variance), and @i(tau) must be greater than zero. The @i(low) and @i(high) parameters give optional artificial bounds on the minimum and maximum output values, respectively.
+This distribution is similar to the exponential, except
+it is centered at 0 and can output negative values as well. Like
+the exponential, it can be used to generate time intervals; however, it might be necessary to add a lower bound so as not to compute a negative time interval.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "bilateral-fig.ps"))
+@html(<img src="bilateral-fig.gif"><br><br>)
+@fillcaption(The Bilateral Exponential Distribution.)
+@tag(bilateral-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{cauchy-dist(@pragma(defn)@index(cauchy-dist)@index(cauchy distribution)@i(tau) [, @i(low), @i(high)])} @c{[sal]}@*
+@altdef{@code{(cauchy-dist @i(tau) [@i(low) @i(high)])} @c{[lisp]}}@\Returns a @code(FLONUM) from the Cauchy distribution, a symetric distribution with a high peak at zero and a width (variance) that increases with parameter @i(tau), which must be greater than zero. The @i(low) and @i(high) parameters give optional artificial bounds on the minimum and maximum output values, respectively.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "cauchy-fig.ps"))
+@html(<img src="cauchy-fig.gif"><br><br>)
+@fillcaption(The Cauchy Distribution, @i(tau) = 1.)
+@tag(cauchy-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{hyperbolic-cosine-dist(@pragma(defn)@index(hyperbolic-cosine-dist)[@i(low), @i(high)])} @c{[sal]}@*
+@altdef{@code[(hyperbolic-cosine-dist [@i(low) @i(high)])] @c{[lisp]}}@\Returns a @code(FLONUM) value from the hyperbolic cosine distribution, a symetric distribution with its peak at zero. The @i(low) and @i(high) parameters give optional artificial bounds on the minimum and maximum output values, respectively.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "hyperbolic-fig.ps"))
+@html(<img src="hyperbolic-fig.gif"><br><br>)
+@fillcaption(The Hyperbolic Cosine Distribution.)
+@tag(hyperbolic-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{logistic-dist(@pragma(defn)@index(logistic-dist)@index(logistic distribution)@i(alpha), @i(beta) [, @i(low), @i(high)])} @c{[sal]}@*
+@altdef{@code{(logistic-dist @i(alpha) @i(beta) [@i(low) @i(high)])} @c{[lisp]}}@\Returns a @code(FLONUM) value from the logistic distribution, which is symetric about the mean. The @i(alpha) parameter primarily affects dispersion (variance), with larger values resulting in values closer to the mean (less variance), and the @i(beta) parameter primarily influences the mean. The @i(low) and @i(high) parameters give optional artificial bounds on the minimum and maximum output values, respectively.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "logistic-fig.ps"))
+@html(<img src="logistic-fig.gif"><br><br>)
+@fillcaption(The Logistic Distribution, alpha = 1, beta = 2.)
+@tag(logistic-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{arc-sine-dist(@pragma(defn)@index(arc-sine-dist)@index(arcsine distribution))} @c{[sal]}@*
+@altdef{@code{(arc-sine-dist)} @c{[lisp]}}@\Returns a @code(FLONUM) value from the arc sine distribution, which outputs values between 0 and 1. It is symetric about the mean of 1/2, but is more likely to generate values closer to 0 and 1.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "arcsine-fig.ps"))
+@html(<img src="arcsine-fig.gif"><br><br>)
+@fillcaption(The Arc Sine Distribution.)
+@tag(arcsine-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{gaussian-dist(@index(Gaussian distribution)@pragma(defn)@index(gaussian-dist)@i(xmu), @i(sigma) [, @i(low), @i(high)])} @c{[sal]}@*
+@altdef{@code{(gaussian-dist @i(xmu) @i(sigma) [@i(low) @i(high)])} @c{[lisp]}}@\Returns a @code(FLONUM) value from the Gaussian or Gauss-Laplace distribution, a linear function of the normal distribution. It is symetric about the mean of @i(xmu), with a standard deviation of @i(sigma), which must be greater than zero. The @i(low) and @i(high) parameters give optional artificial bounds on the minimum and maximum output values, respectively.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "gaussian-fig.ps"))
+@html(<img src="gaussian-fig.gif"><br><br>)
+@fillcaption{The Gauss-Laplace (Gaussian) Distribution, @i(xmu) = 0, @i(sigma) = 1.}
+@tag(gaussian-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{beta-dist(@index(beta distribution)@pragma(defn)@index(beta-dist)@i(a), @i(b))} @c{[sal]}@*
+@altdef{@code[(beta-dist @i(a) @i(b))] @c{[lisp]}}@\Returns a @code(FLONUM) value from the Beta distribution. This distribution outputs values between 0 and 1, with outputs more likely to be close to 0 or 1. The parameter @i(a) controls the height (probability) of the right side of the distribution (at 1) and @i(b) controls the height of the left side (at 0). The distribution is symetric about 1/2 when @i(a) = @i(b).
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 2.5 in, width = 3.75 in, magnify = 1,
+ postscript = "beta-fig.ps"))
+@html(<img src="beta-fig.gif"><br><br>)
+@fillcaption(The Beta Distribution, @i(alpha) = .5, @i(beta) = .25.)
+@tag(beta-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{bernoulli-dist(@index(Bernoulli distribution)@pragma(defn)@index(bernoulli-dist)@i(px1) [, @i(x1), @i(x2)])} @c{[sal]}@*
+@altdef{@code{(bernoulli-dist @i(px1) [@i(x1) @i(x2)])} @c{[lisp]}}@\Returns either @i(x1) (default value is 1) with probability @i(px1) or @i(x2) (default value is 0) with probability 1 - @i(px1). The value of @i(px1) should be between 0 and 1. By
+convention, a result of @i(x1) is viewed as a success while @i(x2) is viewed as
+a failure.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 3.5 in, width = 3.75 in, magnify = 0.75,
+ postscript = "bernoulli-fig.ps"))
+@html(<img src="bernoulli-fig.gif"><br><br>)
+@fillcaption(The Bernoulli Distribution, @i(px1) = .75.)
+@tag(bernoulli-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{binomial-dist(@index(binomial distribution)@pragma(defn)@index(binomial-dist)@i(n), @i(p))} @c{[sal]}@*
+@altdef{@code{(binomial-dist @i(n) @i(p))} @c{[lisp]}}@\Returns a @code(FIXNUM) value from the binomial distribution, where @i(n) is the number of Bernoulli trials run (a @code(FIXNUM)) and @i(p) is the probability of success in the Bernoulli trial (a @code(FLONUM) from 0 to 1). The mean is the product of @i(n) and @i(p).
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 3.5 in, width = 3.75 in, magnify = 0.75,
+ postscript = "binomial-fig.ps"))
+@html(<img src="binomial-fig.gif"><br><br>)
+@fillcaption(The Binomial Distribution, @i(n) = 5, @i(p) = .5.)
+@tag(binomial-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{geometric-dist(@index(geometric distribution)@pragma(defn)@index(geometric-dist)@i(p))} @c{[sal]}@*
+@altdef{@code[(geometric-dist @i(p))] @c{[lisp]}}@\Returns a @code(FIXNUM) value from the geometric distribution, which is defined as the number of failures before a success is achieved in a Bernoulli trial with probability of success @i(p) (a @code(FLONUM) from 0 to 1).
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 3.5 in, width = 3.75 in, magnify = 0.75,
+ postscript = "geometric-fig.ps"))
+@html(<img src="geometric-fig.gif"><br><br>)
+@fillcaption(The Geometric Distribution, @i(p) = .4.)
+@tag(geometric-fig)
+@end(figure)
+
+@begin(fndefs)
+@codef{poisson-dist(@index(Poisson distribution)@pragma(defn)@index(poisson-dist)@i(delta))} @c{[sal]}@*
+@altdef{@code[(poisson-dist @i(delta))] @c{[lisp]}}@\Returns a @code(FIXNUM) value from the Poisson distribution with a mean of @i(delta) (a @code(FIXNUM)). The Poisson distribution is often used to generate a sequence of time intervals, resulting in random but often pleasing rhythms.
+@end(fndefs)
+
+@begin(figure)
+@center(@graphic((height = 3.5 in, width = 3.75 in, magnify = 0.75,
+ postscript = "poisson-fig.ps"))
+@html(<img src="poisson-fig.gif"><br><br>)
+@fillcaption(The Poisson Distribution, @i(delta) = 3.)
+@tag(poisson-fig)
+@end(figure)
+
+@begin(comment)
+*****************
+Note: this should remain out of Nyquist until the granulate code is cleaned up (why are there separate functions for pitch-dist and len-dist instead of a single function where any parameter can be specified by a closure?)
+*****************
+@begin(fndefs)
+@codef{pitch-dist-granulate(@pragma(defn)@index(pitch-dist-granulate)@index(granular synthesis)@i(filename), @i(grain-dur), @i(grain-dev), @i(ioi), @i(ioi-dev), @i(pitch-dist) [, @i(file-start), @i(file-end)])} @c{[sal]}@*
+@altdef{@code{(pitch-dist-granulate @i(filename) @i(grain-dur) @i(grain-dev) @i(ioi) @i(ioi-dev) @i(pitch-dist) [@i(file-start) @i(file-end)])} @c{[lisp]}}@\*** need to write this ***
+
+@i(filename) @dash name of the file
+
+@i(dist) @dash the distribution that determines the length of the grains
+
+@i(ioi) @dash the basic inter-onset-interval for grains
+
+@i(ioi-dev) @dash ioi is actually: ioi + random(0, ioi-dev)
+
+@i(pitch-dev) @dash grains are resampled at rate between 1 and pitch-dev
+
+@i(file-start) @dash when to start reading the file (an offset from start). The
+default is 0.
+
+@i(file-end) @dash when to stop reading the file (an offset from end) the
+default is 0
+
+returns @dash a set of sound grains created from the input file
+
+This is a granular
+synthesis function based on the one by Roger B. Dannenberg. The
+pitch of the grains will be based on the distribution you give to it. The
+distribution must be passed in as a continuation.
+
+(len-dist-granulate @i(filename) @i(dist ioi ioi-dev) @i(pitch-dev) [@i(file-start)@i(file-end)])
+
+@i(filename) @dash name of the file
+
+@i(grain-dur) @dash the duration of a grain
+
+@i(grain-dev) @dash grain dur is actually grain-dur + random(0, grain-dev)
+
+@i(ioi</span>) @dash the basic inter-onset-interval for grains
+
+@i(ioi</span>-dev) @dash ioi is actually: ioi + random(0, ioi-dev)
+
+@i(pitch-dist) @dash the distribution of the alteration in pitch to the grains. The
+distribution values should be > 1.
+
+@i(file-start) @dash when to start reading the file (an offset from start). The
+default is 0
+
+@i(file-end) @dash when to stop reading the file (an offset from end). The
+default is 0
+
+returns @dash a set of sound grains created from the input file
+
+This is a granular
+synthesis function based on the one by Roger B. Dannenberg. The
+length of the grains will be based on the distribution you give to it. The
+distribution must be passed in as a continuation.
+@end(fndefs)
+@end(comment)
+
+@section(Score Generation and Manipulation)
+
+A common application of pattern generators is to specify parameters
+for notes. (It should be understood that ``notes'' in this context
+means any Nyquist behavior, whether it represents a conventional note,
+an abstract sound object, or even some micro-sound event that is just
+a low-level component of a hierarchical sound organization. Similarly,
+``score'' should be taken to mean a specification for a
+sequence of these ``notes.'')
+The @code(score-gen) macro (defined by
+loading @code(xm.lsp)) establishes a convention for representing
+scores and for generating them using patterns.
+
+The @code(timed-seq) macro, described in Section @ref(timed-seq-sec),
+already provides a way to represent a ``score'' as a list of expressions.
+The Xmusic representation goes a bit further by specifying that
+@i(all notes are specified by an alternation of keywords and values, where
+some keywords have specific meanings and interpretations.)
+
+The basic idea of @code(score-gen)@index(score-gen) is you provide a template for notes in
+a score as a set of keywords and values. For example,
+@begin(example)
+set pitch-pattern = make-cycle(list(c4, d4, e4, f4))
+score-gen(dur: 0.4, name: quote(my-sound),
+ pitch: next(pitch-pattern), score-len: 9)
+@end(example)
+generates a score of 9 notes as follows:
+@begin(example)
+((0 0 (SCORE-BEGIN-END 0 3.6))
+ (0 0.4 (MY-SOUND :PITCH 60))
+ (0.4 0.4 (MY-SOUND :PITCH 62))
+ (0.8 0.4 (MY-SOUND :PITCH 64))
+ (1.2 0.4 (MY-SOUND :PITCH 65))
+ (1.6 0.4 (MY-SOUND :PITCH 60))
+ (2 0.4 (MY-SOUND :PITCH 62))
+ (2.4 0.4 (MY-SOUND :PITCH 64))
+ (2.8 0.4 (MY-SOUND :PITCH 65))
+ (3.2 0.4 (MY-SOUND :PITCH 60)))
+@end(example)
+The use of keywords like @code(:PITCH) helps to make scores
+readable and easy to process without specific knowledge of
+about the functions called in the score. For example, one
+could write a transpose operation to transform all the
+@code(:pitch) parameters in a score without having to know
+that pitch is the first parameter of @code(pluck) and the
+second parameter of @code(piano-note). Keyword parameters are
+also used to give flexibility to note specification with
+@code(score-gen). Since this approach requires the use of
+keywords, the next section
+is a brief explanation of how to define functions that use
+keyword parameters.
+
+@subsection(Keyword Parameters)
+@index(keyword parameters)
+@index(parameters, keyword)
+Keyword parameters are parameters whose presence is
+indicated by a special symbol, called a keyword, followed
+by the actual parameter. Keyword parameters in SAL have
+default values that are used if no actual parameter is
+provided by the caller of the function. (See Appendix
+ @ref(xlisp-app) to learn about keywords in XLISP.)
+
+To specify that a parameter is a keyword parameter,
+use a keyword symbol (one that ends in a colon) followed
+by a default value.
+ For example, here is a function that
+accepts keyword parameters and invokes the @code(pluck)
+function:
+@begin(example)
+define function k-pluck(pitch: 60, dur: 1)
+ return pluck(pitch, dur)
+@end(example)
+Now, we can call k-pluck with keyword parameters. The
+keywords are simply the formal parameter names with
+a prepended colon character (@code(:pitch) and @code(:dur)
+in this example), so a function call would look like:
+@begin(example)
+pluck(pitch: c3, dur: 3)
+@end(example)
+Usually, it is best to give keyword parameters useful
+default values. That way, if a parameter such as @code(dur:)
+is missing, a reasonable default value (1) can be used
+automatically.
+It is never an error to omit a keyword parameter, but the
+called function can check to see if a keyword parameter
+was supplied or not.
+Because of default values, we can call
+@code[k-pluck(pitch: c3)] with no duration,
+@code[k-pluck(dur: 3)] with only a duration,
+or even @code[k-pluck()] with no parameters.
+
+In XLISP, there is additional syntax to specify an alternate symbol
+to be used as the keyword and to allow the called function
+to determine whether or not a keyword parameter was
+supplied, but these features are little-used. See the XLISP
+manual for details.
+
+@subsection(Using score-gen)@pragma(defn)@index(score-gen)
+The @code(score-gen) macro computes a score based on keyword parameters.
+Some keywords have a special meaning, while others are not interpreted
+but merely placed in the score. The resulting score can be synthesized
+using @code(timed-seq) (see Section @ref(timed-seq-sec)).
+
+The form of a call to @code(score-gen) is simply:
+@begin(fndefs)
+@codef[score-gen(@pragma(defn)@index(score-gen)@i(k1:) @i(e1), @i(k2:) @i(e2), @r(...))] @c{[sal]}@*
+@altdef{@code[(score-gen @i(:k1) @i(e1) @i(:k2) @i(e2) @r(...))] @c{[lisp]}}@\where the @i(k)'s
+are keywords and the @i(e)'s are
+expressions. A score is generated by evaluating the expressions once for
+each note and constructing a list of keyword-value pairs. A number
+of keywords have special interpretations. The rules for interpreting
+these parameters will be explained through a set of "How do I ..."
+questions below.
+@end(fndefs)
+
+@i(How many notes will be generated?) The keyword
+parameter @code(score-len:) specifies an upper bound on the number
+of notes. (Note: in LISP syntax, keywords
+are always @i(preceded) by colons, so you would write
+@code(:score-len) instead.) The keyword @code(score-dur:) specifies an upper bound
+on the starting time of the last note in the score. (To be more
+precise, the @code(score-dur:) bound is reached when the
+default starting time of the next note is greater than or equal
+to the @code(score-dur:) value. This definition is necessary because
+note times are not strictly increasing.) When either bound
+is reached, score generation ends. At least one of these two
+parameters must be specified or an error is raised. These keyword
+parameters are evaluated just once and are not copied into the
+parameter lists of generated notes.
+
+@i(What is the duration of generated notes?) The
+keyword @code(dur:) defaults to 1 and specifies the nominal duration
+in seconds. Since the generated note list is compatible with
+@code(timed-seq), the starting time and duration (to be precise, the
+@i(stretch factor)) are not passed as parameters to the notes. Instead,
+they control the Nyquist environment in which the note will be evaluated.
+
+@i(What is the start time of a note?) The default start time of the
+first note is zero. Given a note, the default start time of the next note is
+the start time plus the inter-onset time, which is given by the @code(ioi:)
+parameter. If no @code(ioi:) parameter is specified, the inter-onset time
+defaults to the duration, given by @code(dur:). In all cases, the default
+start time of a note can be overridden by the keyword parameter @code(time:).
+
+@i(When does the score begin and end?) The behavior @code[SCORE-BEGIN-END]
+contains the beginning and ending of the
+score (these are used for score manipulations, e.g. when scores are merged,
+their begin times can be aligned.) When @code(timed-seq) is used to
+synthesize a score, the @code(SCORE-BEGIN-END) marker is
+not evaluated. The @code(score-gen) macro inserts a ``note'' of the form
+@code[(0 0 (SCORE-BEGIN-END @i(begin-time) @i(end-time)))]
+at the time given by the @code(begin:) keyword, with @i(begin-time) and
+@i(end-time) determined by the @code(begin:) and @code(end:)
+keyword parameters, respectively. If the @i(begin:) keyword is not
+provided, the score begins at zero. If the @code(end:) keyword
+is not provided, the score ends at the default start time
+of what would be the next note after the last note in the score
+(as described in the previous paragraph). Note: if @code(time:) is used to
+compute note starting times, and these times are not increasing, it is
+strongly advised to use @code(end:) to specify an end time for the score,
+because the default end time may be anywhere in the middle of the
+generated sequence.
+
+@i(What function is called to synthesize the note?) The @code(name:)
+parameter names the function. Like other parameters, the value can be any
+expression, including something like @code[next(fn-name-pattern)],
+allowing function names to be recomputed for each note. The default value
+is @code(note).
+
+@i(Can I make parameters depend upon the starting time or the duration
+of the note?) Parameter expressions can use the variable @code(sg:time)
+to access the start time of the note, @code(sg:ioi) to access the
+inter-onset time, and @code(sg:dur) to access the
+duration (stretch factor) of the note. Also, @code(sg:count) counts how
+many notes have been computed so far, starting at 0. The order of
+computation is: @code(sg:time) first, then @code(sg:ioi) and @code(sg:dur),
+so for example, an expression to compute @code(sg:dur) can
+depend on @code(sg:ioi).
+
+@i(Can parameters depend on each other?) The keyword @code(pre:)
+introduces an expression that is evaluated before each note, and
+@code(post:) provides an expression to be evaluated after each note.
+The @code(pre:) expression can assign one or more global variables
+which are then used in one or more expressions for parameters.
+
+@i(How do I debug @code(score-gen) expressions?) You can set the
+@code(trace:) parameter to true (@code(t)) to enable a print statement
+for each generated note.
+
+@i(How can I save scores generated by @code(score-gen) that I like?) If the
+keyword parameter @code(save:) is set to a symbol, the global variable
+named by the symbol is set to the value of the generated sequence. Of
+course, the value returned by @code(score-gen) is just an ordinary list that
+can be saved like any other value.
+
+In summary, the following keywords have special interpretations
+in @code(score-gen):
+@code(begin:), @code(end:), @code(time:), @code(dur:), @code(name:),
+@code(ioi:), @code(trace:),
+@code(save:), @code(score-len:), @code(score-dur:), @code(pre:), @code(post:).
+ All other keyword
+parameters are expressions that are evaluated once for each note
+and become the parameters of the notes.
+
+@subsection(Score Manipulation)
+@index(score manipulation)@index(manipulation of scores)
+Nyquist encourages the representation of music as
+executable programs, or @i(behaviors), and there are various
+ways to modify behaviors, including time stretching,
+transposition, etc. An alternative to composing executable
+programs is to manipulate scores as editable data. Each
+approach has its strengths and weaknesses. This section
+describes functions intended to manipulate Xmusic scores
+as generated by, or at least in the form generated by,
+@code(score-gen). Recall that this means scores are lists
+of events (e.g. notes), where events are three-element lists of the form
+(@i(time) @i(duration) @i(expression), and where @i(expression)
+is a standard lisp function call where all parameters are
+keyword parameters. In addition, the first ``note'' may be
+the special @code(SCORE-BEGIN-END) expression. If this is
+missing, the score begins at zero and ends at the end of the
+last note.
+
+For convenience, a set of functions is offered to access properties
+of events (or notes) in scores. Although lisp functions such as
+@code(car), @code(cadr), and @code(caddr) can be used, code is more
+readable when more mnemonic functions are used to access events.
+
+@begin(fndefs)
+@codef[event-time(@pragma(defn)@index(event-time)@i(event))] @c{[sal]}@*
+@altdef{@code[(event-time @i(event))] @c{[lisp]}}@\Retrieve the time field from
+an event.
+
+@codef[event-set-time(@pragma(defn)@index(event-set-time)@i(event), @i(time))] @c{[sal]}@*
+@altdef{@code[(event-set-time @i(event) @i(time))] @c{[lisp]}}@\Construct
+a new event where the time of @i(event) is replaced by @i(time).
+
+@codef[event-dur(@pragma(defn)@index(event-dur)@i(event))] @c{[sal]}@*
+@altdef{@code[(event-dur @i(event))] @c{[lisp]}}@\Retrieve the duration
+(i.e. the stretch factor) field from an event.
+
+@codef[event-set-dur(@pragma(defn)@index(event-set-dur)@i(event), @i(dur))] @c{[sal]}@*
+@altdef{@code[(event-set-dur @i(event) @i(dur))] @c{[lisp]}}@\Construct
+a new event where the duration (or stretch factor) of @i(event) is
+replaced by @i(dur).
+
+@codef[event-expression(@pragma(defn)@index(event-expression)@i(event))] @c{[sal]}@*
+@altdef{@code[(event-expression @i(event))] @c{[lisp]}}@\Retrieve the expression
+field from an event.
+
+@codef[event-set-expression(@pragma(defn)@index(event-set-expression)@i(event),
+@i(dur))] @c{[sal]}@*
+@altdef{@code[(event-set-expression @i(event) @i(dur))] @c{[lisp]}}@\Construct
+a new event where the expression of @i(event) is replaced by @i(expression).
+
+@codef[event-end(@pragma(defn)@index(event-end)@i(event))] @c{[sal]}@*
+@altdef{@code[(event-end @i(event))] @c{[lisp]}}@\Retrieve the end time
+of @i(event), its time plus its duration.
+
+@codef[expr-has-attr(@pragma(defn)@index(expr-has-attr)@i(expression), @i(attribute))] @c{[sal]}@*
+@altdef{@code[(expr-has-attr @i(expression) @i(attribute))] @c{[lisp]}}@\Test
+whether a score event @i(expression) has the given @i(attribute).
+
+@codef{expr-get-attr(@pragma(defn)@index(expr-get-attr)@i(expression), @i(attribute) [, @i(default)])} @c{[sal]}@*
+@altdef{@code{(expr-get-attr @i(expression) @i(attribute) [@i(default)])} @c{[lisp]}}@\Get the value of the given @i(attribute) from a score event
+@i(expression). If @i(attribute) is not present, return @i(default) if
+specified, and otherwise @code(nil).
+
+@codef{expr-set-attr(@pragma(defn)@index(expr-set-attr)@i(expr), @i(attribute), @i(value))} @c{[sal]}@*
+@altdef{@code[(expr-set-attr @i(expr) @i(attribute) @i(value))] @c{[lisp]}}@\Construct a new expression identical to @i(expr) except that the @i(attribute) has @i(value).
+
+@codef[event-has-attr(@pragma(defn)@index(event-has-attr)@i(event), @i(attribute))] @c{[sal]}@*
+@altdef{@code[(event-has-attr @i(event) @i(attribute))] @c{[lisp]}}@\Test
+whether a given score @i(event)'s expression has the given @i(attribute).
+
+@codef{event-get-attr(@pragma(defn)@index(event-get-attr)@i(event), @i(attribute),
+[@i(default)])} @c{[sal]}@*
+@altdef{@code{(event-get-attr @i(event) @i(attribute) [@i(default)])} @c{[lisp]}}@\Get the value of the given @i(attribute) from a score
+@i(event)'s expression. If @i(attribute) is not present, return @i(default) if
+specified, and otherwise @code(nil).
+
+@codef{event-set-attr(@pragma(defn)@index(event-set-attr)@i(event), @i(attribute), @i(value))} @c{[sal]}@*
+@altdef{@code[(event-set-attr @i(event) @i(attribute) @i(value))] @c{[lisp]}}@\Construct a new event identical to @i(event) except that the @i(attribute) has @i(value).
+
+@end(fndefs)
+
+Functions are provided to shift the starting times of notes,
+stretch times and durations, stretch only durations,
+add an offset to a keyword parameter, scale a keyword parameter, and
+other manipulations. Functions are also provided to extract
+ranges of notes, notes that match criteria, and to combine scores.
+Most of these functions (listed below in detail)
+share a set of keyword parameters that optionally limit the range over which
+the transformation operates. The @code(from-index:) and @code(to-index:)
+parameters specify the index of the first note and the index of the
+last note to be changed. If these numbers are negative, they are offsets
+from the end of the score, e.g. -1 denotes the last note of the score. The
+@code(from-time:) and @code(to-time:) indicate a range of starting times
+of notes that will be affected by the manipulation. Only notes whose time
+is greater than or equal to the @i(from-time) and @i(strictly less than)
+ the @i(to-time) are modified. If both index and time ranges are specified,
+only notes that satisfy @i(both) constraints are selected. (Note: in
+LISP syntax, colons @i(precede) the keyword, so use
+@code(:from-index), @code(:to-index), @code(:from-time), and @code(:to-time).)
+
+@begin(fndefs)
+@codef[score-sorted(@pragma(defn)@index(score-sorted)@i(score))] @c{[sal]}@*
+@altdef{@code[(score-sorted @i(score))] @c{[lisp]}}@\Test if @i(score) is sorted.
+
+@codef{score-sort(@pragma(defn)@index(score-sort)@i(score) [, @i(copy-flag)])} @c{[sal]}@*
+@altdef{@code{(score-sort @i(score) [@i(copy-flag)])} @c{[lisp]}}@\Sort
+ the notes in a
+score into start-time order. If copy-flag is nil, this is a destructive
+operation which should only be performed if the top-level score list
+is a fresh copy that is not shared by any other variables. (The
+@i(copy-flag) is intended for internal system use only.)
+ For the following operations, it is assumed
+that scores are sorted, and all operations return a sorted score.
+
+@codef{score-shift(@pragma(defn)@index(score-shift)@i(score), @i(offset), from-index: @i(i), to-index: @i(j), from-time: @i(x),
+ to-time: @i(y))} @c{[sal]}@*
+@altdef{@code{(score-shift @i(score) @i(offset)
+ :from-index @i(i) :to-index @i(j) :from-time @i(x)
+ :to-time @i(y))} @c{[lisp]}}@\Add a constant
+@i(offset) to the starting time of a set of notes in @i(score). By default,
+all notes are modified, but the range of notes can be limited with the
+keyword parameters. The begin time of the score is not changed, but the
+end time is increased by @i(offset).
+The original score is not modified, and a new score is returned.
+
+@codef{score-stretch(@pragma(defn)@index(score-stretch)@i(score), @i(factor), dur: @i(dur-flag), time: @i(time-flag), from-index: @i(i),
+ to-index: @i(j), from-time: @i(x), to-time: @i(y))} @c{[sal]}@*
+@altdef{@code{(score-stretch @i(score) @i(factor)
+ :dur @i(dur-flag) :time @i(time-flag) :from-index @i(i)
+ :to-index @i(j) :from-time @i(x) :to-time @i(y))} @c{[lisp]}}@\Stretch
+note times and durations by @i(factor). The default @i(dur-flag) is
+non-null, but if @i(dur-flag) is null, the original durations are retained
+and only times are stretched. Similarly, the default @i(time-flag) is
+non-null, but if @i(time-flag) is null, the original times are retained
+and only durations are stretched. If both @i(dur-flag) and @i(time-flag)
+are null, the score is not changed. If a range
+of notes is specified, times are scaled within that range, and
+notes after the range are shifted so that the stretched region does not
+create a "hole" or overlap with notes that follow. If the range begins
+or ends with a time (via @code(from-time:) and @code(to-time:)), time
+stretching
+takes place over the indicated time interval independent of whether
+any notes are present or where they start. In other words, the
+``rests'' are stretched along with the notes.
+The original score is not modified, and a new score is returned.
+
+@codef{score-transpose(@pragma(defn)@index(score-transpose)@i(score),
+ @i(keyword), @i(amount), from-index: @i(i), to-index: @i(j),
+ from-time: @i(x), to-time: @i(y))} @c{[sal]}@*
+@altdef{@code{(score-transpose @i(score)
+ @i(keyword) @i(amount) :from-index @i(i) :to-index @i(j)
+ :from-time @i(x) :to-time @i(y))} @c{[lisp]}}@\For
+ each note in the score and in any indicated range, if there is a keyword
+ parameter matching @i(keyword) and the
+parameter value is a number, increment
+the parameter value by @i(amount). For example, to tranpose up by a whole
+step, write @code[(score-transpose 2 :pitch @i(score))]. The
+original score is not modified, and a new score
+is returned.
+
+@codef{score-scale(@pragma(defn)@index(score-scale)@i(score), @i(keyword), @i(amount), from-index: @i(i), to-index: @i(j), from-time: @i(x),
+ to-time: @i(y))} @c{[sal]}@*
+@altdef{@code{(score-scale @i(score) @i(keyword) @i(amount)
+ :from-index @i(i) :to-index @i(j) :from-time @i(x)
+ :to-time @i(y))} @c{[lisp]}}@\For each note
+in the score and in any indicated range, if there is a keyword
+parameter matching @i(keyword) and the
+parameter value is a number, multiply
+the parameter value by @i(amount). The original score is not modified,
+and a new score is returned.
+
+@codef{score-sustain(@pragma(defn)@index(score-sustain)@i(score), @i(factor), from-index: @i(i), to-index: @i(j), from-time: @i(x),
+ to-time: @i(y))} @c{[sal]}@*
+@altdef{@code{(score-sustain @i(score) @i(factor)
+ :from-index @i(i) :to-index @i(j) :from-time @i(x)
+ :to-time @i(y))} @c{[lisp]}}@\For each note
+in the score and in any indicated range, multiply
+the duration (stretch factor) by @i(amount). This can be used to
+make notes sound more legato or staccato, and does not change their
+starting times. The original score is not modified, and
+a new score is returned.
+
+@codef{score-voice(@pragma(defn)@index(score-voice)@i(score),
+ @i(replacement-list), from-index: @i(i), to-index: @i(j),
+ from-time: @i(x), to-time: @i(y))} @c{[sal]}@*
+@altdef{@code{(score-voice @i(score)
+ @i(replacement-list) :from-index @i(i) :to-index @i(j)
+ :from-time @i(x) :to-time @i(y))} @c{[lisp]}}@\For each note
+in the score and in any indicated range, replace the behavior (function)
+name using @i(replacement-list), which has the format:
+@code[((@i(old1 new1)) (@i(old2 new2)) @r(...))], where @i(oldi) indicates
+a current behavior name and @i(newi) is the replacement. If @i(oldi)
+is @code(*), it matches anything. For example, to
+replace @code(my-note-1) by @code(trombone) and @code(my-note-2) by
+@code(horn), use @code[score-voice(@i(score), {{my-note-1 trombone}
+{my-note-2 horn}})]. To replace all instruments with
+@code(piano), use @code[score-voice(@i(score), {{* piano}})].
+The original score is not modified, and a
+ new score is returned.
+
+@codef{score-merge(@pragma(defn)@index(score-merge)@i(score1), @i(score2), @r(...))} @c{[sal]}@*
+@altdef{@code[(score-merge @i(score1) @i(score2) @r(...))] @c{[lisp]}}@\Create
+a new score containing all the notes of the parameters, which are all
+scores. The resulting notes retain their original times and durations. The
+merged score begin time is the minimum of the begin times of the parameters
+and the merged score end time is the maximum of the end times of
+the parameters. The original scores are not modified, and a new
+score is returned.
+
+@codef{score-append(@pragma(defn)@index(score-append)@i(score1), @i(score2), @r(...))} @c{[sal]}@*
+@altdef{@code[(score-append @i(score1) @i(score2) @r(...))] @c{[lisp]}}@\Create
+a new score containing all the notes of the parameters, which are all
+scores. The begin time of the first score is unaltered. The begin time of
+ each other score is aligned to the end time of the
+previous score; thus, scores are ``spliced'' in sequence. The original
+scores are not modified, and a new score is returned.
+
+@codef{score-select(@pragma(defn)@index(score-select)@index(score-filter)@i(score),
+ @i(predicate), from-index: @i(i), to-index: @i(j), from-time: @i(x),
+ to-time: @i(y), reject: @i(flag))} @c{[sal]}@*
+@altdef{@code{(score-select @i(score)
+ @i(predicate) :from-index @i(i) :to-index @i(j) :from-time @i(x)
+ :to-time @i(y) :reject @i(flag))} @c{[lisp]}}@\Select (or reject)
+notes to form a new score. Notes are selected if they fall into the
+given ranges of index and time @i(and) they satisfy @i(predicate), a function
+of three parameters that is applied to the start time, duration, and the
+expression of the note. Alternatively, @i(predicate) may be @code(t),
+indicating that all notes in range are to be selected.
+The selected notes along with the existing score begin and end markers, are combined to form a new score. Alternatively, if
+the @code(reject:) parameter is non-null, the notes @i(not) selected form
+ the new score (in other words the selected notes are rejected or removed to
+ form the new score). The original score is not modified, and a
+ new score is returned.
+
+@codef{score-set-begin(@pragma(defn)@index(score-set-begin)@i(score), @i(time))} @c{[sal]}@*
+@altdef{@code[(score-set-begin @i(score) @i(time))] @c{[lisp]}}@\The begin
+time
+ from the @i(score)'s @code(SCORE-BEGIN-END) marker is set to @i(time). The
+original score is not modified, and a new score is returned.
+
+@codef{score-get-begin(@pragma(defn)@index(score-get-begin)@i(score))} @c{[sal]}@*
+@altdef{@code[(score-get-begin @i(score))] @c{[lisp]}}@\Return the begin
+time of the @i(score).
+
+@codef{score-set-end(@pragma(defn)@index(score-set-end)@i(score), @i(time))} @c{[sal]}@*
+@altdef{@code[(score-set-end @i(score) @i(time))] @c{[lisp]}}@\The end time
+ from the @i(score)'s @code(SCORE-BEGIN-END) marker is set to @i(time). The
+original score is not modified, and a new score is returned.
+
+@codef{score-get-end(@pragma(defn)@index(score-get-end)@i(score))} @c{[sal]}@*
+@altdef{@code[(score-get-end @i(score))] @c{[lisp]}}@\Return the end
+time of the @i(score).
+
+@codef{score-must-have-begin-end(@pragma(defn)@index(score-must-have-begin-end)@i(score))} @c{[sal]}@*
+@altdef{@code[(score-must-have-begin-end @i(score))] @c{[lisp]}}@\If
+ @i(score) does not have a begin and end time, construct a score with a
+ @code(SCORE-BEGIN-END) expression and return it. If score already has a begin
+and end time, just return the score. The orignal score is not modified.
+
+@codef{score-filter-length(@pragma(defn)@index(score-filter-length)@i(score),
+@i(cutoff))} @c{[sal]}@*
+@altdef{@code[(score-filter-length @i(score) @i(cutoff))] @c{[lisp]}}@\Remove notes that extend beyond the @i(cutoff) time. This
+is similar to @code(score-select), but the here, events are removed when
+their nominal ending time (start time plus duration) exceeds the @i(cutoff),
+whereas the @code(to-time:) parameter is compared to the note's start time.
+The original score is not modified, and a new score is returned.
+
+@codef{score-repeat(@pragma(defn)@index(score-repeat)@i(score), @i(n))} @c{[sal]}@*
+@altdef{@code[(score-repeat @i(score) @i(n))] @c{[lisp]}}@\Make a sequence
+of @i(n) copies of @i(score). Each copy is shifted to that it's begin
+time aligns with the end time of the previous copy, as in @code(score-append).
+The original score is not modified, and a new score is returned.
+
+@codef{score-stretch-to-length(@pragma(defn)@index(score-stretch-to-length)@i(score),
+@i(length))} @c{[sal]}@*
+@altdef{@code[(score-stretch-to-length @i(score) @i(length))] @c{[lisp]}}@\Stretch the score so that the end time of the score is
+the score's begin time plus @i(length).
+The original score is not modified, and a new score is returned.
+
+@codef{score-filter-overlap(@pragma(defn)@index(score-filter-overlap)@i(score))} @c{[sal]}@*
+@altdef{@code[(score-filter-overlap @i(score))] @c{[lisp]}}@\Remove
+overlapping notes (based on the note start time and duration), giving
+priority to the
+positional order within the note list (which is also time order).
+The original score is not modified,
+and a new score is returned.
+
+@codef{score-print(@pragma(defn)@index(score-print)@i(score))} @c{[sal]}@*
+@altdef{@code[(score-print @i(score))] @c{[lisp]}}@\Print a score with
+one note per line. Returns @code(nil).
+
+@codef{score-play(@pragma(defn)@index(score-play)@i(score))} @c{[sal]}@*
+@altdef{@code[(score-play @i(score))] @c{[lisp]}}@\Play @i(score)
+using @code(timed-seq) to convert the score to a sound, and
+ @code(play) to play the sound.
+
+@codef{score-adjacent-events(@pragma(defn)@index(score-adjacent-events)@i(score),
+ @i(function),
+ from-index: @i(i), to-index: @i(j),
+ from-time: @i(x), to-time: @i(y))} @c{[sal]}@*
+@altdef{@code{(score-adjacent-events @i(score) @i(function) :from-index @i(i) :to-index @i(j) :from-time @i(x) :to-time @i(y))} @c{[lisp]}}@\Call
+ @code[(@i(function) @i(A) @i(B) @i(C))], where
+@i(A), @i(B), and @i(C) are consecutive notes in the score. The result
+replaces @i(B). If the result is @code(nil), @i(B) is deleted, and the
+next call will be @code[(@i(function A C D))], etc. The first call is
+to @code[(@i(function) nil @i(A B))] and the last is to
+@code[(@i(function) @i(Y Z) nil)]. If there is just one note in the
+score, @code[(@i(function) nil @i(A) nil)] is called. Function calls
+are not made if the note is outside of the indicated range.
+This function
+allows notes and their parameters to be adjusted according to their
+immediate context. The original score is not modified,
+and a new score is returned.
+
+@codef{score-apply(@pragma(defn)@index(score-apply)@i(score), @i(function),
+ from-index: @i(i), to-index: @i(j), from-time: @i(x), to-time: @i(y))}
+@c{[sal]}@*
+@altdef{@code{(score-apply @i(score) @i(function) :from-index @i(i) :to-index @i(j) :from-time @i(x) :to-time @i(y))} @c{[lisp]}}@\Replace
+each note in the score with the result of
+ @code[(@i(function time dur expression))] (in Lisp) or
+ @code[@i(function)(@i(time), @i(dur), @i(expression))] (in SAL),
+where @i(time), @i(dur),
+and @i(expression) are the time, duration, and expression of the note.
+If a range is indicated, only notes in the range are replaced.
+The original score is not modified, and a new score is returned.
+
+@codef{score-indexof(@pragma(defn)@index(score-indexof)@i(score), @i(function),
+ from-index: @i(i), to-index: @i(j), from-time: @i(x), to-time: @i(y))} @c{[sal]}@*
+@altdef{@code{(score-indexof @i(score) @i(function) :from-index @i(i) :to-index @i(j) :from-time @i(x) :to-time @i(y))} @c{[lisp]}}@\Return the index (position)
+of the first score event (in range) for which applying @i(function)
+using @code[(@i(function time dur expression))] returns true.
+
+
+@codef{score-last-indexof(@pragma(defn)@index(score-last-indexof)@i(score),
+ @i(function), from-index: @i(i), to-index: @i(j), from-time: @i(x),
+to-time: @i(y))} @c{[sal]}@*
+@altdef{@code{(score-last-indexof @i(score) @i(function)
+ :from-index @i(i) :to-index @i(j) :from-time @i(x) :to-time @i(y))} @c{[lisp]}}@\Return the index (position)
+of the last score event (in range) for which applying @i(function)
+using @code[(@i(function time dur expression))] returns true.
+
+@codef{score-randomize-start(@pragma(defn)@index(score-randomize-start)@index(jitter)@index(feel factor)@index(offset)@i(score), @i(amt), from-index: @i(i), to-index: @i(j), from-time: @i(x),
+ to-time: @i(y))} @c{[sal]}@*
+@altdef{@code{(score-randomize-start @i(score) @i(amt)
+ :from-index @i(i) :to-index @i(j) :from-time @i(x)
+ :to-time @i(y))} @c{[lisp]}}@\Alter the start times of notes by a
+random amount up to plus or minus @i(amt).
+The original score is not modified, and a new score is returned.
+@end(fndefs)
+
+@subsection(Xmusic and Standard MIDI Files)
+@index(MIDI file)@index(Standard MIDI File)
+Nyquist has a general facility to read and write MIDI files.
+You can even translate to and from a text representation, as described
+in Chapter @ref(adagio-chap). It is also useful sometimes to read notes
+from Standard MIDI Files into Xmusic scores and vice versa. At present,
+Xmusic only translates notes, ignoring the various controls, program
+changes, pitch bends, and other messages.
+
+MIDI notes are translated to Xmusic score events as follows:
+@begin(display)
+@code[(@i(time) @i(dur) (NOTE :chan @i(channel) :pitch @i(keynum) :vel @i(velocity)))],
+@end(display)
+where @i(channel), @i(keynum), and @i(velocity) come directly
+from the MIDI message (channels are numbered starting from zero).
+Note also that note-off messages are implied by the stretch factor
+@i(dur) which is duration in seconds.
+
+@begin(fndefs)
+@codef{score-read-smf(@pragma(defn)@index(score-read-smf)@index(midi file)@i(filename))} @c{[sal]}@*
+@altdef{@code[(score-read-smf @i(filename))] @c{[lisp]}}@\Read a
+standard MIDI file from @i(filename). Return an Xmusic score, or @code(nil)
+if the file could not be opened. The
+start time is zero, and the end time is the maximum end time of all
+notes. A very limited interface is offered to extract MIDI program numbers
+from the file: The global variable @code(*rslt*) is set to a list of MIDI
+program numbers for each channel. E.g. if @code(*rslt*) is @code[(0 20 77)],
+then program for channel 0 is 0, for channel 1 is 20, and for channel 2 is 77.
+Program changes were not found on other channels. The default program number is
+0, so in this example, it is not known whether the program 0 on channel 0
+is the result of a real MIDI program change command or just a default value.
+If more than one program change exists on a channel, the @i[last] program
+number is recorded and returned, so this information will only be completely
+correct when the MIDI file sends single program change per channel before
+any notes are played. This, however, is a fairly common practice. Note that
+the list returned as @code(*rslt*) can be passed
+to @code(score-write-smf), described below.
+
+@codef{score-write-smf(@pragma(defn)@index(score-write-smf)@index(midi file)@i(score), @i(filename),
+[@i(programs)])} @c{[sal]}@*
+@altdef{@code[(score-write-smf @i(score) @i(filename) @i(programs))] @c{[lisp]}}@\Write a standard MIDI file to @i(filename)
+with notes in @i(score). In this function,
+@i(every) event in the score with a @code(pitch:) attribute, regardless of the
+``instrument'' (or function name), generates a
+MIDI note, using the @code(chan:) attribute for the channel (default 0) and
+the @code(vel:) attribute for velocity (default 100). There is no facility
+(in the current implementation) to issue control changes, but to allow
+different instruments, MIDI programs may be set in two ways. The simplest is
+to associate programs with channels using
+the optional @i[programs] parameter, which is simply a list of up to 16 MIDI
+program numbers. Corresponding program change commands are added to the
+beginning of the MIDI file. If @i[programs] has less than 16 elements, program
+change commands are only sent on the first @i[n] channels. The second way to
+issue MIDI program changes is to add a @code(program:) keyword parameter to
+a note in the score. Typically, the note will have a @code(pitch:) of
+@code(nil) so that no actual MIDI note-on message is generated. If program
+changes and notes have the same starting times, their relative playback
+order is undefined, and the note may be cut off by an immediately
+following program change. Therefore, program changes should occur slightly,
+e.g. 1 ms, before any notes. @i(Program numbers and channels are numbered
+starting at zero, matching the internal MIDI representation. This may be
+one less than displayed on MIDI hardware, sequencers, etc.)
+@end(fndefs)
+
+@subsection(Workspaces)
+@label(workspaces-sec)
+@index(workspace)
+When working with scores, you may find it necessary to save
+them in files between work sessions. This is not an issue
+with functions because they are
+normally edited in files and loaded from them. In contrast,
+scores are created as Lisp data, and unless you take care to
+save them, they will be destroyed when you exit the Nyquist
+program.
+
+A simple mechanism called a workspace has been created
+to manage scores (and any other Lisp data, for that matter).
+A workspace is just a set of lisp global variables. These
+variables are stored in the file @code(workspace.lsp).
+For simplicity, there is only one workspace, and no backups
+or versions are maintained, but the user is free to make
+backups and copies of @code(workspace.lsp).
+To help remember what each variable is for, you can also
+associate and retrieve a text string with each variable.
+The following functions manage workspaces.
+
+In addition, when a workspace is loaded, you can request that
+functions be called. For example, the workspace might store
+descriptions of a graphical interface. When the workspace is
+loaded, a function might run to convert saved data into a
+graphical interface. (This is how sliders are saved by the IDE.)
+
+@begin(fndefs)
+@codef[add-to-workspace(@pragma(defn)@index(add-to-workspace)@i(symbol))] @c{[sal]}@*
+@altdef{@code[(add-to-workspace @i(symbol))] @c{[lisp]}}@\Adds
+a global variable to the workspace. The @i(symbol) should be a (quoted)
+symbol.
+
+@codef[save-workspace(@pragma(defn)@index(save-workspace))] @c{[sal]}@*
+@altdef{@code{(save-workspace)} @c{[lisp]}}@\All global variables
+in the workspace are saved to @code(workspace.lsp) (in the current
+directory), overwriting the previous file.
+
+@codef{describe(@pragma(defn)@index(describe)@i(symbol) [, @i(description)])}
+ @c{[sal]}@*
+@altdef{@code[(describe @i(symbol) [@i(description)])] @c{[lisp]}}@\If @i(description), a text string, is present,
+associate @i(description) with the variable named by the
+@i(symbol). If @i(symbol) is not already in the workspace,
+it is added. If @i(description) is omitted, the function returns
+the current description (from a previous call) for @i(symbol).
+
+@codef{add-action-to-workspace(@pragma(defn)@index(add-action-to-workspace)@i(symbol))} @c{[sal]}@*
+@altdef{@code[(add-action-to-workspace @i(symbol))] @c{[lisp]}}@\Requests that the function named by @i(symbol) be
+called when the workspace is loaded (if the function is defined).
+@end(fndefs)
+
+To restore a workspace, use the command @code[load "workspace"]. This restores
+the values of the workspace variables to the values they had when
+@code(save-workspace) was last called. It also restores the documentation
+strings, if set, by @code(describe). If you load two or more
+@code(workspace.lsp) files, the variables will be merged into a
+single workspace. The current set of workspace variables are saved in
+the list @code(*workspace*). To clear the workspace, set @code(*workspace*)
+to @code(nil). This does not delete any variables, but means that
+no variables will be saved by @code(save-workspace) until variables are
+added again.
+
+Functions to be called are saved in the list @code(*workspace-actions*).
+to clear the functions, set @code(*workspace-actions*) to @code(nil).
+Restore functions to the list with @code(add-action-to-workspace).
+
+@subsection(Utility Functions)
+This chapter concludes with details of various utility functions for score
+manipulation.
+
+@begin(fndefs)
+@codef[patternp(@pragma(defn)@index(patternp)@i(expression))] @c{[sal]}@*
+@altdef{@code[(patternp @i(expression))] @c{[lisp]}}@\Test if @i(expression) is
+an Xmusic pattern.
+
+@codef[params-transpose(@pragma(defn)@index(params-transpose)@i(params), @i(keyword),
+ @i(amount))] @c{[sal]}@*
+@altdef{@code[(params-transpose @i(params) @i(keyword) @i(amount))] @c{[lisp]}}@\Add a transposition amount to a score event parameter. The
+@i(params)
+parameter is a list of keyword/value pairs (not preceded by a function name).
+The @i(keyword) is the keyword of the value to be altered, and @i(amount)
+is a number to be added to the value. If no matching keyword is present
+in @i(params), then @i(params) is returned. Otherwise, a new parameter
+list is constructed and returned. The original @i(params) is not changed.
+
+@codef[params-scale(@pragma(defn)@index(params-scale)@i(params), @i(keyword),
+ @i(amount))] @c{[sal]}@*
+@altdef{@code[(params-scale @i(params) @i(keyword) @i(amount))] @c{[lisp]}}@\Scale a score event parameter by some factor. This is like
+ @code(params-transpose), only using multiplication. The @i(params)
+list is a list of
+keyword/value pairs, @i(keyword) is the parameter keyword,
+and @i(amount) is the scale factor.
+
+@codef[interpolate(@pragma(defn)@index(interpolate)@index(linear interpolation)@i(x), @i(x1), @i(y1), @i(x2), @i(y2))] @c{[sal]}@*
+@altdef{@code[(interpolate @i(x) @i(x1) @i(y1) @i(x2) @i(y2))] @c{[lisp]}}@\Linearly interpolate (or extrapolate)
+ between points
+(@i(x1), @i(y1)) and (@i(x2), @i(y2)) to compute the y value
+ corresponding to @i(x).
+
+@codef[intersection(@pragma(defn)@index(intersection)@index(set intersection)@i(a),
+ @i(b))] @c{[sal]}@*
+@altdef{@code[(intersection @i(a) @i(b))] @c{[lisp]}}@\Compute the set intersection of lists @i(a) and @i(b).
+
+@codef[union(@pragma(defn)@index(union)@index(set union)@i(a), @i(b))] @c{[sal]}@*
+@altdef{@code[(union @i(a) @i(b))] @c{[lisp]}}@\Compute
+the set union of lists @i(a) and @i(b).
+
+@codef[set-difference(@index(difference)@pragma(defn)@index(set-difference)@i(a),
+ @i(b))] @c{[sal]}@*
+@altdef{@code[(set-difference @i(a) @i(b))] @c{[lisp]}}@\Compute the set of all elements that are in @i(a) but not in @i(b).
+
+@codef[subsetp(@pragma(defn)@index(subsetp)@index(subset)@i(a), @i(b))] @c{[sal]}@*
+@altdef{@code[(subsetp @i(a) @i(b))] @c{[lisp]}}@\Returns true iff
+@i(a) is a subset of @i(b), that is, each element of @i(a) is a member
+of @i(b).
+@end(fndefs)
+
+@chapter(Nyquist Libraries)
+@index(libraries)
+Nyquist is always growing with new functions. Functions that are most fundamental
+are added to the core language. These functions are automatically loaded when you
+start Nyquist, and they are documented in the preceding chapters. Other functions seem
+less central and are implemented as lisp files that you can load. These are called
+library functions, and they are described here.
+
+To use a library function, you
+must first load the library, e.g. @code[(load "pianosyn")] loads the piano synthesis
+library. The libraries are all located in the @code(lib) directory, and you
+should therefore include this directory on your @code(XLISPPATH) variable. (See
+Section @ref(install-sec).) Each library is documented in one of the following
+sections. When you load the library described by the section, all functions
+documented in that section become available.
+
+@section(Piano Synthesizer)
+The piano synthesizer (library name is @code(pianosyn.lsp)) generates
+realistic piano tones using a multiple wavetable implementation by Zheng (Geoffrey)
+Hua and Jim Beauchamp, University of Illinois. Please see the notice about
+acknowledgements that prints when you load the file. Further informations and
+example code can be found in
+@code(demos/piano.htm)@index(demos, piano)@index(piano synthesizer tutorial).
+There are several useful functions in this library:
+@begin(fndefs)
+@codef[piano-note(@pragma(defn)@index(piano-note)@index(piano synthesizer)@i(duration), @i(step),
+ @i(dynamic))] @c{[sal]}@*
+@altdef{@code[(piano-note @i(duration) @i(step) @i(dynamic))] @c{[lisp]}}@\Synthesizes a piano tone. @i(Duration) is the duration to the point of
+key release, after which there is a rapid decay. @i(Step) is the pitch in half
+steps, and @i(dynamic) is approximately equivalent to a MIDI key velocity
+parameter. Use a value near 100 for a loud sound and near 10 for a soft sound.
+
+@codef[piano-note-2(@pragma(defn)@index(piano-note-2)@i(step), @i(dynamic))] @c{[sal]}@*
+@altdef{@code[(piano-note-2 @i(step) @i(dynamic))] @c{[lisp]}}@\Similar to @code(piano-note) except the duration is nominally 1.0.
+
+@codef[piano-midi(@pragma(defn)@index(piano-midi)@i(midi-file-name))] @c{[sal]}@*
+@altdef{@code[(piano-midi @i(midi-file-name))] @c{[lisp]}}@\Use the piano synthesizer
+to play a MIDI file. The file name (a string) is given by @i(midi-file-name).
+
+@codef[piano-midi2file(@pragma(defn)@index(piano-midi2file)@i(midi-file-name),
+@i(sound-file-name))] @c{[sal]}@*
+@altdef{@code[(piano-midi2file @i(midi-file-name) @i(sound-file-name))] @c{[lisp]}}@\Use the piano synthesizer to play a MIDI file. The MIDI file
+is given by @i(midi-file-name) and the (monophonic) result is written to the file
+named @i(sound-file-name).
+@end(fndefs)
+
+@section(Dymanics Compression)
+To use these functions, load the file @code(compress.lsp). This library
+implements a compressor originally intended for noisy speech audio, but
+usable in a variety of situations.
+There are actually two compressors that can be used in
+series. The first, @code(compress), is
+a fairly standard one: it detects signal level with an RMS
+detector and uses table-lookup to determine how much gain
+to place on the original signal at that point. One bit of
+cleverness here is that the RMS envelope is ``followed'' or
+enveloped using @code(snd-follow), which does look-ahead to anticipate
+peaks before they happen.
+
+The other interesting feature is @code(compress-map), which builds
+a map in terms of compression and expansion. For speech, the recommended
+procedure is to figure out the noise floor on the signal you are compressing
+(for example, look at the signal where the speaker is not talking).
+Use a compression map that leaves the noise alone and boosts
+signals that are well above the noise floor. Alas, the @code(compress-map)
+function is not written in these terms, so some head-scratching is
+involved, but the results are quite good.
+
+The second compressor is called @code(agc), and it implements automatic gain
+control that keeps peaks at or below 1.0. By combining @code(compress) and
+@code(agc), you can process poorly recorded speech for playback on low-quality
+speakers in noisy environments. The @code(compress) function modulates the
+short-term gain to to minimize the total dynamic range, keeping the speech at
+a generally loud level, and the @code(agc) function rides the long-term gain
+to set the overall level without clipping.
+
+@begin(fndefs)
+@codef{compress-map(@pragma(defn)@index(compress-map)@i(compress-ratio),
+@i(compress-threshold),
+@i(expand-ratio), @i(expand-ratio), limit: @i(limit), transition:
+@i(transition))} @c{[sal]}@*
+@altdef{@code{(compress-map @i(compress-ratio) @i(compress-threshold)
+ @i(expand-ratio) @i(expand-ratio) :limit @i(limit) :transition
+ @i(transition)])} @c{[lisp]}}@\Construct
+a map for the compress function. The map consists of two parts: a compression
+part and an expansion part.
+The intended use is to compress everything above compress-threshold by
+compress-ratio, and to downward expand everything below expand-ratio
+by expand-ratio. Thresholds are in dB and ratios are dB-per-dB.
+0dB corresponds to a peak amplitude of 1.0 or rms amplitude of 0.7
+If the input goes above 0dB, the output can optionally be limited
+by setting @code(limit:) (a keyword parameter) to @code(T).
+This effectively changes
+the compression ratio to infinity at 0dB. If @code(limit:) is @code(nil)
+(the default), then the compression-ratio continues to apply above 0dB.
+
+Another keyword parameter, @code(transition:), sets the amount below the
+thresholds (in dB) that a smooth transition starts. The default is 0,
+meaning that there is no smooth transition. The smooth transition is a
+2nd-order polynomial that matches the slopes of the straight-line compression
+curve and interpolates between them.
+
+It is assumed that expand-threshold <= compress-threshold <= 0
+The gain is unity at 0dB so if compression-ratio > 1, then gain
+will be greater than unity below 0dB.
+
+The result returned by this function is a sound for use in the @code(shape)
+function. The sound maps input
+dB to gain. Time 1.0 corresponds to 0dB, time 0.0 corresponds to
+-100 dB, and time 2.0 corresponds to +100dB, so this is a
+100hz ``sample rate'' sound. The sound gives gain in dB.
+
+@codef[db-average(@pragma(defn)@index(db-average)@i(input))] @c{[sal]}@*
+@altdef{@code[(db-average @i(input))] @c{[lisp]}}@\Compute the average amplitude
+of @i(input) in dB.
+
+@codef{compress(@pragma(defn)@index(compress)@i(input), @i(map), @i(rise-time), @i(fall-time) [, @i(lookahead)])} @c{[sal]}@*
+@altdef{@code[(compress @i(input) @i(map) @i(rise-time) @i(fall-time)
+ [@i(lookahead)])] @c{[lisp]}}@\Compress
+@i(input) using @i(map), a compression curve
+probably generated by @code(compress-map) (see above). Adjustments in gain have
+the given @i(rise-time) and @i(fall-time). Lookahead tells how far ahead to look
+at the signal, and is @i(rise-time) by default.
+
+@codef{agc(@index(automatic gain control)@pragma(defn)@index(agc)@index(gain)@i(input),
+@i(range), @i(rise-time), @i(fall-time) [, @i(lookahead)])} @c{[sal]}@*
+@altdef{@code{(agc @i(input) @i(range) @i(rise-time) @i(fall-time)
+ [@i(lookahead)])} @c{[lisp]}}@\An automatic
+gain control applied to @i(input). The maximum gain in dB is @i(range). Peaks
+are attenuated to 1.0, and gain is controlled with the given @i(rise-time) and
+@i(fall-time). The look-ahead time default is @i(rise-time).
+@end(fndefs)
+
+@section(Clipping Softener)
+This library, in @code(soften.lsp), was written to improve the quality of
+poorly recorded speech. In recordings of speech, extreme clipping generates
+harsh high frequency noise. This can sound particulary bad on small speakers
+that will emphasize high frequencies. This problem can be ameliorated by
+low-pass filtering regions where clipping occurs. The effect is to dull the
+harsh clipping. Intelligibility is not affected by much, and the result can
+be much more pleasant on the ears. Clipping is detected simply by looking for
+large signal values. Assuming 8-bit recording, this level is set to 126/127.
+
+The function works by cross-fading between the normal signal and a filtered
+signal as opposed to changing filter coefficients.
+
+@begin(fndefs)
+@codef[soften-clipping(@pragma(defn)@index(soften-clipping)@index(clipping repair)@i(snd),
+@i(cutoff))] @c{[sal]}@*
+@altdef{@code[(soften-clipping @i(snd) @i(cutoff))] @c{[lisp]}}@\Filter the loud regions of a signal where clipping is likely
+to have generated additional high frequencies. The input signal is @i(snd)
+and @i(cutoff) is the filter cutoff frequency
+(4 kHz is recommended for speech).
+@end(fndefs)
+
+@section(Graphical Equalizer)
+There's nothing really ``graphical'' about this library (@code(grapheq.lsp)), but
+this is a common term for multi-band equalizers. This implementation uses
+Nyquist's @code(eq-band) function to split the incoming signal into different
+frequency bands. Bands are spaced geometrically, e.g. each band could be one
+octave, meaning that each successive band has twice the bandwidth. An interesting
+possibility is using computed control functions to make the equalization change
+over time.
+
+@begin(fndefs)
+@codef[nband-range(@pragma(defn)@index(nband-range)@index(graphical equalizer)@index(equalization)@i(input), @i(gains), @i(lowf), @i(highf))] @c{[sal]}@*
+@altdef{@code[(nband-range @i(input) @i(gains) @i(lowf) @i(highf))] @c{[lisp]}}@\A graphical equalizer applied to
+@i(input) (a @code(SOUND)). The gain controls and number of bands is given by @i(gains), an
+ARRAY of @code(SOUND)s (in other words, a Nyquist multichannel @code(SOUND)). Any sound in the
+array may be replaced by a @code(FLONUM). The bands are
+geometrically equally spaced from the lowest frequency @i(lowf) to the
+highest frequency @i(highf) (both are @code(FLONUM)s).
+
+@codef[nband(@pragma(defn)@index(nband)@i(input), @i(gains))] @c{[sal]}@*
+@altdef{@code[(nband @i(input) @i(gains))] @c{[lisp]}}@\A graphical equalizer, identical
+to @code(nband-range) with a range of 20 to 20,000 Hz.
+@end(fndefs)
+
+@section(Sound Reversal)
+The @code(reverse.lsp) library implements functions to play sounds in reverse.
+
+@begin(fndefs)
+@codef[s-reverse(@index(reverse, sound)@pragma(defn)@index(s-reverse)@index(backward)@index(play in reverse)@i(snd))] @c{[sal]}@*
+@altdef{@code[(s-reverse @i(snd))] @c{[lisp]}}@\Reverses @i(snd) (a @code(SOUND)). Sound must be shorter
+than @code(*max-reverse-samples*), which is currently initialized to
+25 million samples. Reversal allocates about 4 bytes per sample. This function
+uses XLISP in the inner sample loop, so do not be surprised if it calls the
+garbage collector a lot and runs slowly. The result starts at the starting
+time given by the current environment (not necessarily the starting time
+of @i(snd)). If @i(snd) has multiple channels, a multiple channel,
+reversed sound is returned.
+
+@codef{s-read-reverse(@index(read samples in reverse)@pragma(defn)@index(s-read-reverse)@i(filename), time-offset: @i(offset), srate: @i(sr), dur: @i(dur), nchans: @i(chans), format: @i(format), mode: @i(mode), bits: @i(n), swap: @i(flag))} @c{[sal]}@*
+@altdef{@code{(s-read-reverse @i(filename) :time-offset @i(offset)
+ :srate @i(sr) :dur @i(dur) :nchans @i(chans) :format @i(format) :mode @i(mode) :bits @i(n) :swap @i(flag))} @c{[lisp]}}@\This function is identical to @code(s-read) (see @ref(s-read-sec)), except it reads the indicated samples in reverse. Like
+@code(s-reverse) (see above), it uses XLISP in the inner loop, so it is slow.
+Unlike @code(s-reverse), @code(s-read-reverse) uses a fixed amount of
+memory that is independent of how many samples are computed. Multiple channels
+are handled.
+@end(fndefs)
+
+@section(Time Delay Functions)
+The @code(time-delay-fns.lsp) library implements chorus, phaser, and flange effects.
+
+@begin(fndefs)
+@codef[phaser(@pragma(defn)@index(phaser)@index(effects, phaser)@i(snd))] @c{[sal]}@*
+@altdef{@code[(phaser @i(snd))] @c{[lisp]}}@\A phaser effect
+applied to @i(snd) (a @code(SOUND)). There are no parameters,
+but feel free to modify the source code of this one-liner.
+
+@codef[flange(@pragma(defn)@index(flange)@index(flange effect)@index(effect, flange)@i(snd))] @c{[sal]}@*
+@altdef{@code[(flange @i(snd))] @c{[lisp]}}@\A flange effect
+applied to @i(snd). To vary the rate and other parameters, see the source code.
+
+@codef[stereo-chorus(@index(chorus)@pragma(defn)@index(stereo-chorus)@i(snd))] @c{[sal]}@*
+@altdef{@code[(stereo-chorus @i(snd))] @c{[lisp]}}@\A chorus effect applied to @i(snd),
+a @code(SOUND) (monophonic). The output is a stereo sound. All parameters are built-in,
+but see the simple source code to make modifications.
+
+@codef[chorus(@pragma(defn)@index(chorus)@index(effect, chorus)@i(snd), @i(maxdepth), @i(depth), @i(rate),
+@i(saturation))] @c{[sal]}@*
+@altdef{@code[(chorus @i(snd) @i(maxdepth) @i(depth) @i(rate) @i(saturation))] @c{[lisp]}}@\A chorus effect applied to @i(snd). All parameters may be arrays
+as usual. The @i(maxdepth) is a @code(FLONUM) giving twice the maximum value of @i(depth),
+which may be a @code(FLONUM) or a @code(SOUND). The chorus is implemented as a variable delay
+modulated by a sinusoid running at @i(rate) Hz (a @code(FLONUM)). The sinusoid is
+scaled by @i(depth) and offset by @i(maxdepth)/2. The delayed signal is mixed
+with the original, and @i(saturation) gives the fraction of the delayed signal
+(from 0 to 1) in the mix. A reasonable choice of parameter values is
+@i(maxdepth) = 0.05, @i(depth) = 0.025, @i(rate) = 0.5, and @i(saturation) = 0.5.
+@end(fndefs)
+
+@section(Multiple Band Effects)
+@index(multiple band effects)@index(bandfx.lsp)
+The @code(bandfx.lsp) library implements several effects based on multiple
+frequency bands. The idea is to separate a signal into different frequency
+bands, apply a slightly different effect to each band, and sum the effected
+bands back together to form the result. This file includes its own set of
+examples. After loading the file, try @code[f2()], @code[f3()], @code[f4()],
+and @code[f5()] to hear them.
+
+There is much room for expansion and experimentation with this library. Other
+effects might include distortion in certain bands (for example, there are
+commercial effects that add distortion to low frequencies to enhance the sound
+of the bass), separating bands into different channels for stereo or multi-channel
+effects, adding frequency-dependent reverb, and performing dynamic compression,
+limiting, or noise gate functions on each band. There are also opportunities for
+cross-synthesis: using the content of bands extracted from one signal to modify
+the bands of another. The simplest of these would be to apply amplitude envelopes
+of one sound to another. Please contact us (dannenberg@@cs.cmu.edu) if you
+are interested in working on this library.
+
+@begin(fndefs)
+@codef[apply-banded-delay(@index(banded delay)@pragma(defn)@index(apply-banded-delay)@i(s), @i(lowp), @i(highp), @i(num-bands), @i(lowd), @i(highd), @i(fb), @i(wet))] @c{[sal]}@*
+@altdef{@code[(apply-banded-delay @i(s) @i(lowp) @i(highp) @i(num-bands) @i(lowd) @i(highd) @i(fb) @i(wet))] @c{[lisp]}}@\Separates
+input @code(SOUND) @i(s) into @code(FIXNUM) @i(num-bands) bands from a low frequency
+of @i(lowp) to a high frequency of @i(highp) (these are @code(FLONUMS) that specify
+steps, not Hz), and applies a delay to each band. The delay for the lowest band is
+given by the @code(FLONUM) @i(lowd) (in seconds) and the delay for the highest band
+is given by the @code(FLONUM) @i(highd). The delays for other bands are linearly
+interpolated between these values. Each delay has feedback gain controlled by
+@code(FLONUM) @i(fb). The delayed bands are scaled by @code(FLONUM) @i(wet), and
+the original sound is scaled by 1 - @i(wet). All are summed to form the result,
+a @code(SOUND).
+
+@codef[apply-banded-bass-boost(@index(banded bass boost)@pragma(defn)@index(apply-banded-bass-boost)@i(s), @i(lowp), @i(highp), @i(num-bands), @i(num-boost), @i(gain))] @c{[sal]}@*
+@altdef{@code[(apply-banded-bass-boost @i(s) @i(lowp) @i(highp) @i(num-bands) @i(num-boost) @i(gain))] @c{[lisp]}}@\Applies a boost to
+low frequencies. Separates
+input @code(SOUND) @i(s) into @code(FIXNUM) @i(num-bands) bands from a low frequency
+of @i(lowp) to a high frequency of @i(highp) (these are @code(FLONUMS) that specify
+steps, not Hz), and scales the lowest @i(num-boost) (a @code(FIXNUM)) bands by @i(gain),
+a @code(FLONUM). The bands are summed to form the result, a @code(SOUND).
+
+@codef[apply-banded-treble-boost(@index(banded treble boost)@pragma(defn)@index(apply-banded-treble-boost)@i(s), @i(lowp), @i(highp), @i(num-bands), @i(num-boost), @i(gain))] @c{[sal]}@*
+@altdef{@code[(apply-banded-treble-boost @i(s) @i(lowp) @i(highp) @i(num-bands) @i(num-boost) @i(gain))] @c{[lisp]}}@\Applies a boost to
+high frequencies. Separates
+input @code(SOUND) @i(s) into @code(FIXNUM) @i(num-bands) bands from a low frequency
+of @i(lowp) to a high frequency of @i(highp) (these are @code(FLONUMS) that specify
+steps, not Hz), and scales the highest @i(num-boost) (a @code(FIXNUM)) bands by @i(gain),
+a @code(FLONUM). The bands are summed to form the result, a @code(SOUND).
+@end(fndefs)
+
+@section(Granular Synthesis)
+Some granular synthesis functions are implemented in the @code(gran.lsp) library
+file. There are many variations and control schemes one could adopt for granular
+synthesis, so it is impossible to create a single universal granular synthesis
+function. One of the advantages of Nyquist is the integration of control and
+synthesis functions, and users are encouraged to build their own granular synthesis
+functions incorporating their own control schemes. The @code(gran.lsp) file
+includes many comments and is intended to be a useful starting point. Another
+possibility is to construct a score with an event for each grain. Estimate a
+few hundred bytes per score event (obviously, size depends on the number of
+parameters) and avoid using all of your computer's memory.
+
+@begin(fndefs)
+@codef{sf-granulate(@index(granular synthesis)@pragma(defn)@index(sf-granulate)@i(filename), @i(grain-dur), @i(grain-dev), @i(ioi), @i(ioi-dev), @i(pitch-dev),
+[@i(file-start), @i(file-end)])} @c{[sal]}@*
+@altdef{@code{(sf-granulate @i(filename) @i(grain-dur) @i(grain-dev) @i(ioi) @i(ioi-dev) @i(pitch-dev) [@i(file-start) @i(file-end)])} @c{[lisp]}}@\Granular synthesis using a sound file
+named @i(filename) as the source for grains. Grains are extracted from
+a sound file named by @i(filename) by stepping through the file in equal
+increments. Each grain duration is the
+sum of @i(grain-dur) and a random number from 0 to @i(grain-dev). Grains are
+then multiplied by a raised cosine smoothing window and resampled at a ratio
+between 1.0 and @i(pitch-dev). If @i(pitch-dev) is greater than one, grains are
+stretched and the pitch (if any) goes down. If @i(pitch-dev) is less than one,
+grains are shortened and the pitch goes up. Grains are then output
+with an
+inter-onset interval between successive grains (which may overlap)
+determined by the sum of
+@i(ioi) and a random number from 0 to @i(ioi-dev).
+The duration of the resulting sound is determined by
+the stretch factor (not by the sound file). The number of grains is
+the total sound duration (determined by the stretch factor)
+divided by the mean inter-onset interval,
+which is @i(ioi) + @i(ioi-dev) * 0.5.
+The grains are taken from equally-spaced starting points in @i(filename),
+and depending on grain size and number, the grains may or may not overlap.
+The output duration will simply be the sum of the inter-onset intervals
+and the duration of the last grain. If @i(ioi-dev) is non-zero, the
+output duration will vary, but the expected value of the duration is
+the stretch factor.
+To achieve a rich granular synthesis effect, it is often a good idea to
+sum four or more copies of @code(sf-granulate) together. (See the @code(gran-test)
+function in @code(gran.lsp).)
+@end(fndefs)
+
+@section(MIDI Utilities)
+The @code(midishow.lsp) library has functions that can print the contents fo MIDI
+files. This intended as a debugging aid.
+
+@begin(fndefs)
+@codef[midi-show-file(@pragma(defn)@index(midi-show-file)@index(print midi file)@index(show midi file)@i(file-name))] @c{[sal]}@*
+@altdef{@code[(midi-show-file @i(file-name))] @c{[lisp]}}@\Print the contents of a MIDI file to the console.
+
+@codef{midi-show(@pragma(defn)@index(midi-show)@i(the-seq) [, @i(out-file)])} @c{[sal]}@*
+@altdef{@code{(midi-show @i(the-seq) [@i(out-file)])} @c{[lisp]}}@\Print the
+contents of the sequence @i(the-seq) to the file @i(out-file) (whose default value
+is the console.)
+@end(fndefs)
+
+@section(Reverberation)
+The @code(reverb.lsp) library implements artificial reverberation.
+
+@begin(fndefs)
+@codef[reverb(@pragma(defn)@index(reverb)@index(effect, reverberation)@i(snd),
+@i(time))] @c{[sal]}@*
+@altdef{@code[(reverb @i(snd) @i(time))] @c{[lisp]}}@\Artificial reverberation applied to @i(snd) with a decay time of
+@i(time).
+@end(fndefs)
+
+@section(DTMF Encoding)
+@index(dtmf)@index(touch tone)
+The @code(dtmf.lsp) library implements DTMF encoding. DTMF is the
+``touch tone'' code used by telephones.
+
+@begin(fndefs)
+@codef[dtmf-tone(@pragma(defn)@index(dtmf-tone)@i(key), @i(len), @i(space))] @c{[sal]}@*
+@altdef{@code[(dtmf-tone @i(key) @i(len) @i(space))] @c{[lisp]}}@\Generate a
+single DTMF tone. The @i(key) parameter is either a digit (a @code(FIXNUM)
+from 0 through 9) or the atom @code(STAR) or @code(POUND). The duration of
+the done is given by @i(len) (a @code(FLONUM)) and the tone is followed by
+silence of duration @i(space) (a @code(FLONUM)).
+
+@codef[speed-dial(@pragma(defn)@index(speed-dial)@i(thelist))] @c{[sal]}@*
+@altdef{@code[(speed-dial @i(thelist))] @c{[lisp]}}@\Generates a sequence
+of DTMF tones using the keys in @i(thelist) (a @code(LIST) of keys as
+described above under @code(dtmf-tone)). The duration of each tone is 0.2
+seconds, and the space between tones is 0.1 second. Use @code(stretch) to
+change the ``dialing'' speed.
+@end(fndefs)
+
+@section[Dolby Surround(R), Stereo and Spatialization Effects]
+@index(spatialization)@index(stereo)@index(pan)@index(Dolby Surround)
+
+The @code(spatial.lsp) library implements various functions for stereo
+manipulation and spatialization. It also includes some functions for
+Dolby Pro-Logic panning, which encodes left, right, center, and surround
+channels into stereo. The stereo signal can then be played through
+a Dolby decoder to drive a surround speaker array. This library has
+a somewhat simplified encoder, so you should certainly test the
+output. Consider using a high-end encoder for critical work. There
+are a number of functions in @code(spatial.lsp) for testing. See the
+source code for comments about these.
+
+@begin(fndefs)
+@codef[stereoize(@pragma(defn)@index(stereoize)@index(mono to stereo)@index(effect, stereo)@i(snd))] @c{[sal]}@*
+@altdef{@code[(stereoize @i(snd))] @c{[lisp]}}@\Convert a mono sound, @i(snd), to stereo. Four bands of
+equalization and some delay are used to create a stereo effect.
+
+@codef[widen(@pragma(defn)@index(widen)@index(effect, widen)@i(snd), @i(amt))] @c{[sal]}@*
+@altdef{@code[(widen @i(snd) @i(amt))] @c{[lisp]}}@\Artificially
+widen the stereo field in @i(snd), a two-channel sound. The amount of widening
+is @i(amt), which varies from 0 (@i(snd) is unchanged) to 1 (maximum widening).
+The @i(amt) can be a @code(SOUND) or a number.
+
+@codef[span(@index(stereo pan)@index(pan, stereo)@index(effect, stereo pan)@pragma(defn)@index(span)@i(snd), @i(amt))] @c{[sal]}@*
+@altdef{@code[(span @i(snd) @i(amt))] @c{[lisp]}}@\Pan the virtual center channel of a stereo sound, @i(snd),
+by @i(amt), where 0 pans all the way to the left, while 1 pans all the way
+to the right. The @i(amt) can be a @code(SOUND) or a number.
+
+@codef[swapchannels(@pragma(defn)@index(swapchannels)@index(swap channels)@index(effect, swap channels)@i(snd))] @c{[sal]}@*
+@altdef{@code[(swapchannels @i(snd))] @c{[lisp]}}@\Swap left and right channels in @i(snd), a stereo sound.
+
+@codef[prologic(@pragma(defn)@index(prologic)@index(Dolby Pro-Logic)@index(Surround Sound)@i(l), @i(c),
+@i(r), @i(s))] @c{[sal]}@*
+@altdef{@code[(prologic @i(l) @i(c) @i(r) @i(s))] @c{[lisp]}}@\Encode four monaural @code(SOUND)s representing the front-left,
+front-center, front-right, and rear channels, respectively.
+The return value is a stereo sound, which is a Dolby-encoded mix of the
+four input sounds.
+
+@codef[pl-left(@pragma(defn)@index(pl-left)@i(snd))] @c{[sal]}@*
+@altdef{@code[(pl-left @i(snd))] @c{[lisp]}}@\Produce a Dolby-encoded (stereo)
+signal with @i(snd), a @code(SOUND), encoded as the front left channel.
+
+@codef[pl-center(@pragma(defn)@index(pl-center)@i(snd))] @c{[sal]}@*
+@altdef{@code[(pl-center @i(snd))] @c{[lisp]}}@\Produce a Dolby-encoded (stereo)
+signal with @i(snd), a @code(SOUND), encoded as the front center channel.
+
+@codef[pl-right(@pragma(defn)@index(pl-right)@i(snd))] @c{[sal]}@*
+@altdef{@code[(pl-right @i(snd))] @c{[lisp]}}@\Produce a Dolby-encoded (stereo)
+signal with @i(snd), a @code(SOUND), encoded as the front right channel.
+
+@codef[pl-rear(@pragma(defn)@index(pl-rear)@i(snd))] @c{[sal]}@*
+@altdef{@code[(pl-rear @i(snd))] @c{[lisp]}}@\Produce a Dolby-encoded (stereo)
+signal with @i(snd), a @code(SOUND), encoded as the rear, or surround, channel.
+
+@codef[pl-pan2d(@pragma(defn)@index(pl-pan2d)@i(snd), @i(x), @i(y))] @c{[sal]}@*
+@altdef{@code[(pl-pan2d @i(snd) @i(x) @i(y))] @c{[lisp]}}@\Comparable to Nyquist's
+existing pan function, @code(pl-pan2d) provides not only left-to-right
+panning, but front-to-back panning as well. The function
+accepts three parameters: @i(snd) is the (monophonic) input @code(SOUND),
+@i(x) is a left-to-right position, and @i(y) is a front-to-back position.
+Both position parameters may be numbers or @code(SOUND)s. An @i(x) value
+of 0 means left, and 1 means right. Intermediate values map linearly
+between these extremes. Similarly, a @i(y) value of 0 causes the sound
+to play entirely through the front speakers(s), while 1 causes it to play
+entirely through the rear. Intermediate values map linearly.
+Note that, although there are usually two rear speakers in Pro-Logic systems,
+they are both driven by the same signal. Therefore any sound that is
+panned totally to the rear will be played over both rear speakers. For
+example, it is not possible to play a sound exclusively through the
+rear left speaker.
+
+@codef[pl-position(@pragma(defn)@index(pl-position)@i(snd), @i(x), @i(y), @i(config))] @c{[sal]}@*
+@altdef{@code[(pl-position @i(snd) @i(x) @i(y) @i(config))] @c{[lisp]}}@\The
+position function builds upon speaker panning to allow more abstract
+placement of sounds. Like @code(pl-pan2d), it accepts a (monaural) input
+sound as well as left-to-right (@i(x)) and front-to-back (@i(y)) coordinates,
+which may be @code(FLONUM)s or @code(SOUND)s. A fourth parameter @i(config)
+specifies the distance from listeners to the speakers (in meters). Current
+settings assume this to be constant for all speakers, but this assumption
+can be changed easily (see comments in the code for more detail).
+There are several important differences between @code(pl-position) and
+@code(pl-pan2d). First, @code(pl-position) uses a Cartesian coordinate
+system that allows x and y coordinates outside of the
+range (0, 1). This model assumes a listener position of (0,0). Each speaker
+has a predefined position as well. The input sound's position,
+relative to the listener, is given by the vector (@i(x),@i(y)).
+
+@codef[pl-doppler(@pragma(defn)@index(pl-doppler)@index(Doppler effect)@i(snd),
+@i(r))] @c{[sal]}@*
+@altdef{@code[(pl-doppler @i(snd) @i(r))] @c{[lisp]}}@\Pitch-shift moving sounds according to the equation: @i(fr) =
+@i(f0)((@i(c)+@i(vr))/@i(c)), where @i(fr) is the output frequency,
+@i(f0) is the emitted (source)
+frequency, @i(c) is the speed of sound (assumed to be 344.31 m/s), and
+@i(vr) is the speed at which the emitter approaches the receiver. (@i(vr)
+is the first derivative of parameter @i(r), the distance from the listener
+in meters.
+
+@end(fndefs)
+
+@section(Drum Machine)
+@label(drum-machine-sec)@index(drum machine)
+
+The drum machine software in @code(demos/plight) deserves further explanation.
+to use the software, load the code by evaluating:
+@begin(example)
+load "../demos/plight/drum.lsp"
+exec load-props-file(strcat(*plight-drum-path*,
+ "beats.props"))
+exec create-drum-patches()
+exec create-patterns()
+@end(example)
+
+Drum sounds and patterns are specified in the @code(beats.props) file (or
+whatever name you give to @code(load-props-file)). This file
+contains two types of specifications. First, there are sound file specifications.
+Sound files are located by a line of the form:
+@begin(example)
+set sound-directory = "kit/"
+@end(example)
+This gives the name of the sound file directory, relative to the
+ @code(beats.props) file. Then, for each sound file, there should be a line of
+the form:
+@begin(example)
+track.2.5 = big-tom-5.wav
+@end(example)
+This says that on track 2, a velocity value of 5 means to play the sound file
+ @code(big-tom-5.wav). (Tracks and velocity values are described below.)
+The @code(beats.props) file contains specifications for all the sound files
+in @code(demos/plight/kit) using 8 tracks. If you make your own specifications
+file, tracks should be numbered consecutively from 1, and velocities should be
+in the range of 1 to 9.
+
+The second set of specifications is of beat patterns. A beat pattern is given
+by a line in the following form:
+@begin(example)
+beats.5 = 2--32--43-4-5---
+@end(example)
+The number after @code(beats) is just a pattern number. Each pattern
+is given a unique number. After the equal sign, the digits and dashes are
+velocity values where a dash means ``no sound.'' Beat patterns should be
+numbered consecutively from 1.
+
+Once data is loaded, there are several functions to access drum patterns and
+create drum sounds (described below). The @code(demos/plight/drums.lsp) file
+contains an example function @code(plight-drum-example) to play some drums.
+There is also the file @code(demos/plight/beats.props) to serve as an
+example of how to specify sound files and beat patterns.
+
+@begin(fndefs)
+@codef{drum(@pragma(defn)@index(drum)@i(tracknum), @i(patternnum), @i(bpm))} @c{[sal]}@*
+@altdef{@code[(drum @i(tracknum) @i(patternnum) @i(bpm))] @c{[lisp]}}@\Create
+a sound by playing drums sounds associated with track @i(tracknum) (a
+FIXNUM) using pattern @i(patternnum). The tempo is given by @i(bpm) in
+beats per minute. Normally patterns are a sequence of sixteenth notes, so
+the tempo is in @i(sixteenth notes per minute). For example,
+if @i(patternnum) is 10,
+then use the pattern specified for @code(beats.10). If the third character
+of this pattern is 3 and @i(tracknum) is 5, then on the third beat, play
+the soundfile assigned to @code(track.5.3). This function returns a @code(SOUND).
+
+@codef{drum-loop(@pragma(defn)@index(drum-loop)@i(snd), @i(duration), @i(numtimes))} @c{[sal]}@*
+@altdef{@code[(drum-loop @i(snd) @i(duration) @i(numtimes))] @c{[lisp]}}@\Repeat the sound given by @i(snd) @i(numtimes) times. The repetitions occur at a time offset of @i(duration), regardless of the actual duration of @i(snd). A @code(SOUND) is returned.
+
+@codef{length-of-beat(@pragma(defn)@index(length-of-beat)@i(bpm))} @c{[sal]}@*
+@altdef{@code[(length-of-beat @i(bpm))] @c{[lisp]}}@\Given a tempo of
+@i(bpm), return the duration of the beat in seconds. Note that this software
+has no real notion of beat. A ``beat'' is just the duration of each character
+in the beat pattern strings. This function returns a @code(FLONUM).
+@end(fndefs)
+
+
+
+@section(Minimoog-inspired Synthesis)
+@index(Moog)@index(Minimoog)@index(analog synthesizer)
+
+The @code(moog.lsp) library gives the Nyquist user easy access to ``classic''
+synthesizer sounds through an emulation of the Minimoog Synthesizer.
+Unlike modular Moogs that were very large, the Minimoog was the first
+successful and commonly used portable synthesizer. The trademark filter attack
+was unique and easily recognizable. The goal of this Nyquist instrument is not
+only to provide the user with default sounds, but also to give control over
+many of the ``knobs'' found on the Minimoog. In this implementation, these
+parameters are controlled using keywords. The input to the @code(moog)
+instrument is a user-defined sequence of notes, durations, and articulations
+that simulate notes played on a keyboard. These are translated into
+control voltages that drive multiple oscillators, similar to the Voltage
+Controlled Oscillator or VCO found in the original analog Moog.
+
+The basic functionality of the Minimoog has been implemented, including the
+often-used "glide". The glide feature essentially low-pass filters the control
+voltage sequence in order to create sweeps between notes.
+Figure @ref(moog-fig) is a simplified schematic of the data flow in the Moog.
+The control lines have been omitted.
+
+@begin(figure)
+@center(@graphic((height = 2.514 in, width = 4.65 in, magnify = 0.3,
+ postscript = "moog-fig.ps"))
+@html(<img src="moog-fig.gif" width=558><br><br>)
+@fillcaption(System diagram for Minimoog emulator.)
+@tag(moog-fig)
+@end(figure)
+
+The most recognizable feature of the Minimoog is its resonant filter, a
+Four-Pole Ladder Filter invented by Robert Moog. It is simply implemented
+in a circuit with four transistors and provides an outstanding 24 dB/octave
+rolloff. It is modeled here using the built-in Nyquist resonant filter.
+One of the Moog filter features is a constant Q, or center frequency to
+bandwidth ratio. This is implemented and the user can control the Q.
+
+The user can control many parameters using keywords. Their default values,
+acceptable ranges, and descriptions are shown below. The defaults were
+obtained by experimenting with the official Minimoog software synthesizer
+by Arturia.
+
+@subsection(Oscillator Parameters)
+@code(range-osc1) (2)@*
+@code(range-osc2) (1)@*
+@code(range-osc3) (3)@*
+These parameters control the octave of each oscillator. A value of 1
+corresponds to the octave indicated by the input note. A value of 3
+is two octaves above the fundamental. The allowable range is 1 to 7.
+
+@code(detun2) (-.035861)@*
+@code(detun3) (.0768)@*
+Detuning of two oscillators adds depth to the sound. A value of 1 corresponds
+to an increase of a single semitone and a -1 corresponds to a decrease
+in a semitone. The range is -1 to 1.
+
+@code(shape-osc1) (@code(*saw-table*))@*
+@code(shape-osc2) (@code(*saw-table*))@*
+@code(shape-osc3) (@code(*saw-table*))@*
+Oscilators can use any wave shape. The default sawtooth waveform is
+a built-in Nyquist variable. Other waveforms can be defined by the user.
+
+@code(volume-osc1) (1)@*
+@code(volume-osc2) (1)@*
+@code(volume-osc3) (1)@*
+These parameters control the relative volume of each oscillator. The range
+is any @code(FLONUM) greater than or equal to zero.
+
+@subsection(Noise Parameters)
+@code(noiselevel) (.05)@*
+This parameter controls the relative volume of the noise source. The range
+is any @code(FLONUM) greater than or equal to zero.
+
+@subsection(Filter Parameters)
+@code(filter-cutoff) (768)@*
+The cutoff frequency of the filter in given in Hz. The range is zero
+to 20,000 Hz.
+
+
+@code(Q) (2)@*
+Q is the ratio of center frequency to bandwidth. It is held constant by
+making the bandwidth a function of frequency. The range is any
+@code(FLONUM) greater than zero.
+
+@code(contour) (.65)@*
+Contour controls the range of the transient frequency sweep from a high
+to low cutoff frequency when a note is played. The high frequency is
+proportional to contour. A contour of 0 removes this sweep. The range
+is 0 to 1.
+
+@code(filter-attack) (.0001)@*
+Filter attack controls the attack time of the filter, i.e. the time to
+reach the high cutoff frequency. The range is any @code(FLONUM) greater
+than zero (seconds).
+
+@code(filter-decay) (.5)@*
+Filter decay controls the decay time of the filter, i.e. the time of the
+sweep from the high to low cutoff frequency. The range is
+any @code(FLONUM) greater than zero (seconds).
+
+@code(filter-sustain) (.8)@*
+Filter sustain controls the percentage of the filter cutoff frequency that
+the filter settles on following the sweep. The range is 0 to 1.
+
+@subsection(Amplitude Parameters)
+@code(amp-attack) (.01)@*
+This parameter controls the amplitude envelope attack time, i.e. the time to
+reach maximum amplitude. The range is
+any @code(FLONUM) greater than zero (seconds).
+
+@code(amp-decay) (1)@*
+This parameter controls the amplitude envelope decay time, i.e. the time
+between the maximum and sustain volumes. The range is
+any @code(FLONUM) greater than zero (seconds).
+
+@code(amp-sustain) (1)@*
+This parameter controls the amplitude envelope sustain volume, a fraction
+of the maximum. The range is 0 to 1.
+
+@code(amp-release) (0)@*
+This parameter controls the amplitude envelope release time, i.e. the time
+it takes between the sustain volume and 0 once the note ends.
+The duration controls the overall length of the sound. The range of @code(amp-release) is any @code(FLONUM) greater than zero (seconds).
+
+@subsection(Other Parameters)
+@code(glide) (0)@*
+Glide controls the low-pass filter on the control voltages. This models the
+glide knob on a Minimoog. A higher value corresponds to a lower cutoff
+frequency and hence a longer "glide" between notes. A value of 0
+corresponds to no glide. The range is zero to 10.
+
+@subsection(Input Format)
+A single note or a series of notes can be input to the Moog instrument
+by defining a list with the following format:
+@begin(example)
+list(list(@i(frequency), @i(duration), @i(articulation)), @r(...) )
+@end(example)
+where @i(frequency) is a @code(FLONUM) in steps, @i(duration) is the duration
+of each note in seconds (regardless of the release time of the amplifier),
+and @i(articulation) is a percentage of the duration that a sound will be
+played, representing the amount of time that a key is pressed. The filter
+and amplitude envelopes are only triggered if a note is played when
+the articulation of the previous note is less than 1, or a key is not down at
+the same time. This Moog instrument is a monophonic instrument, so only
+one note can sound at a time. The release section of the amplifier is
+triggered when the articulation is less than 1 at the time
+(@i(duration) * @i(articulation)).
+
+@subsection(Sample Code/Sounds)
+
+@b[Sound 1 (default parameters):]
+@begin(display)
+@begin(code)
+set s = {{24 .5 .99} {26 .5 .99} {28 .5 .99}
+ {29 .5 .99} {31 2 1}}
+play moog(s)
+@end(code)
+@end(display)
+
+@b[Sound 2 (articulation, with amplitude release):]
+@begin(display)
+@begin(code)
+set s = {{24 .5 .5} {26 .5 1} {28 .5 .25} {29 .5 1} {31 1 .8}}
+play moog(s, amp-release: .2)
+@end(code)
+@end(display)
+
+@b[Sound 3 (glide):]
+@begin(display)
+@begin(code)
+set s = {{24 .5 .5} {38 .5 1} {40 .5 .25}
+ {53 .5 1} {55 2 1} {31 2 .8} {36 2 .8}}
+play moog(s, amp-release: .2, glide: .5)
+@end(code)
+@end(display)
+
+@b[Sound 4 (keyword parameters):] Filter attack and decay are purposely
+longer than notes being played with articulation equal to 1.
+@begin(display)
+@begin(code)
+set s = {{20 .5 1} {27 .5 1} {26 .5 1} {21 .5 1}
+ {20 .5 1} {27 .5 1} {26 .5 1} {21 .5 1}}
+play moog(s, shape-osc1: *tri-table*, shape-osc2: *tri-table*,
+ filter-attack: 2, filter-decay: 2,
+ filter-cutoff: 300, contour: .8, glide: .2, Q: 8)
+@end(code)
+@end(display)
+
+@b[Sound 5:] This example illustrates the ability to completely define a new
+synthesizer with different parameters creating a drastically different
+sound. Sine waves are used for wavetables. There is a high value for glide.
+@begin(display)
+@begin(code)
+define function my-moog(freq)
+ return moog(freq,
+ range-osc1: 3, range-osc2: 2, range-osc3: 4,
+ detun2: -.043155, detun3: .015016,
+ noiselevel: 0,
+ filter-cutoff: 400, Q: .1, contour: .0000001,
+ filter-attack: 0, filter-decay: .01, filter-sustain: 1,
+ shape-osc1: *sine-table*, shape-osc2: *sine-table*,
+ shape-osc3: *sine-table*, volume-osc1: 1, volume-osc2: 1,
+ volume-osc3: .1, amp-attack: .1, amp-decay: 0,
+ amp-sustain: 1, amp-release: .3, glide: 2)
+
+set s = {{80 .4 .75} {28 .2 1} {70 .5 1} {38 1 .5}}
+play my-moog(s)
+@end(code)
+@end(display)
+
+@b[Sound 6:] This example has another variation on the default
+ parameters.
+@begin(display)
+@begin(code)
+set s = {{24 .5 .99} {26 .5 .99} {28 .5 .99}
+ {29 .5 .99} {31 2 1}}
+play moog(s, shape-osc1: *tri-table*, shape-osc2: *tri-table*,
+ filter-attack: .5, contour: .5)
+@end(code)
+@end(display)
+
+@pragma(doinclude)
+@include(nymanimpl.mss)
+
+@appendix(Open Sound Control and Nyquist)@index(Open Sound Control)
+@label(osc-app)
+Open Sound Control (OSC) is a simple protocol for communicating music
+control parameters between software applications and across
+networks. For more information, see @html[<a
+href="http://wwww.cnmat.berkeley.edu/OpenSoundControl">]@code(http://www.cnmat.berkeley.edu/OpenSoundControl/)@html[</a>]. The
+Nyquist implementation of Open Sound Control is simple: an array of
+floats can be set by OSC messages and read by Nyquist functions. That
+is about all there is to it.
+
+Note: Open Sound Control must be enabled by calling
+@code[osc-enable(t)]. If this fails under Windows, see the
+installation instructions in @code(sys/win/README.txt) regarding
+@code(SystemRoot).
+
+To control something in (near) real-time, you need to access a slider value as if it a signal, or more properly, a Nyquist @code(SOUND) type. The function @code(snd-slider), described in Section @ref(snd-slider-sec), takes a slider number and returns a @code(SOUND) type representing the current value of the slider. To fully understand this function, you need to know something about how Nyquist is actually computing sounds.
+
+Sounds are normally computed on demand. So the result returned by @code(snd-slider) does not immediately compute any samples. Samples are only computed when something tries to use this signal. At that time, the slider value is read. Normally, if the slider is used to control a sound, you will hear changes in the sound pretty soon after the slider value changes. However, one thing that can interfere with this is that @code(SOUND) samples are computed in blocks of about 1000 samples. When the slider value is read, the same value is used to fill a block of 1000 samples, so even if the sample rate is 44,100 Hz, the effective slider sample rate is 44,100/1000, or 44.1 Hz. If you give the slider a very low sample rate, say 1000, then slider value changes will only be noticed by Nyquist approximately once per second. For this reason, you should normally use the audio sample rate (typically 44,100 Hz) for the rate of the @code(snd-slider) output @code(SOUND). (Yes, this is terribly wasteful to represent each slider value with 1000 samples, but Nyquist was not designed for low-latency computation, and this is an expedient work-around.)
+
+In addition to reading sliders as continually changing @code(SOUND)s, you can get the slider value as a Lisp @code(FLONUM) (a floating point number) using @code(get-slider-value), described in Section @ref(get-slider-value-sec). This might be useful if you are computing a sequence of many notes (or other sound events) and want to apply the current slider value to the whole note or sound event.
+
+Note that if you store the value returned by @code(snd-slider) in a variable, you will capture the history of the slider changes. This will take a lot of memory, so be careful.
+
+Suppose you write a simple expression such as @code[(hzosc (mult 1000 (snd-slider 0 @r(...))))] (or in SAL, @code[hzosc(1000 * snd-slider(0 @r(...)))]) to control an oscillator frequency with a slider. How long does this sound last? The duration of @code[hzosc] is the duration of the frequency control, so what is the duration of a slider? To avoid infinitely long signals, you must specify a duration as one of the parameters of @code[snd-slider].
+
+You might be thinking, what if I just want to tell the slider when to stop? At present, you cannot do that, but in the future there should be a function that stops when its input goes to zero. Then, moving a slider to zero could end the signal (and if you multiplied a complex sound by one of these ending functions, everything in the sound would end and be garbage collected).
+
+Another thing you might want to do with interactive control is start some sound. The @code(trigger) function computes an instance of a behavior each time an input @code(SOUND) goes from zero to greater-than-zero. This could be used, for example, to create a sequence of notes.
+
+The @code(snd-slider) function has some parameters that may be unfamiliar. The second parameter, @i(t0), is the starting time of the sound. This should normally be @code[local-to-global(0)], an expression that computes the instantiation time of the current expression. This will often be zero, but if you call @code[snd-slider] from inside a @code(seq) or @code(seq-rep), the starting time may not be zero.
+
+The @i(srate) parameter is the sample rate to return. This should normally be the audio sample rate you are working with, which is typically @code[*default-sound-srate*].
+
+@section(Sending Open Sound Control Messages)
+A variety of programs support OSC. The only OSC message interpreted by Nyquist has an address of @code[/slider], and two parameters: an integer slider number and a float value, nominally from 0.0 to 1.0.
+
+Two small programs are included in the Nyquist distribution for sending OSC messages. (Both can be found in the same directory as the nyquist executable.) The first one, @code[osc-test-client] sends a sequence of messages that just cause slider 0 to ramp slowly up and down. If you run this on a command line, you can use "?" or "h" to get help information. There is an interactive mode that lets you send each OSC message by typing RETURN.
+
+@section(The ser-to-osc Program)
+The second program is @code[ser-to-osc], a program that reads serial input (for example from a PIC-based microcontroller) and sends OSC messages. Run this command-line program from a shell (a terminal window under OS X or Linux; use the CMD program under Windows). You must name the serial input device on the command line, e.g. under OS X, you might run:
+@begin(display)
+@code(./ser-to-osc /dev/tty.usbserial-0000103D)
+@end(display)
+(Note that the program name is preceded by ``@code(./)". This tells the shell exactly where to find the executable program in case the current directory is not on the search path for executable programs.)
+Under Windows, you might run:
+@begin(display)
+@code(ser-to-osc com4)
+@end(display)
+(Note that you do not type ``@code(./)'' in front of a windows program.)
+
+To use @code(ser-to-osc), you will have to find the serial device. On the Macintosh and Linux, try the following:
+@begin(display)
+@code(ls /dev/*usb*)
+@end(display)
+This will list all serial devices with ``usb'' in their names. Probably, one will be a name similar to @code(/dev/tty.usbserial-0000103D). The @code(ser-to-osc) program will echo data that it receives, so you should know if things are working correctly.
+
+Under Windows, open Control Panel from the Start menu, and open the System control panel. Select the Hardware tab and click the Device Manager button. Look in the device list under Ports (COM & LPT). When you plug in your serial or USB device, you should see a new entry appear, e.g. @code(COM4). This is the device name you need.
+
+The format for the serial input is: any non-whitespace character(s), a slider number, a slider value, and a newline (control-j or ASCII 0x0A). These fields need to be separated by tabs or spaces. An optional carriage return (control-m or ASCII 0x0D) preceding the ASCII 0x0A is ignored. The slider number should be in decimal, and theh slider value is a decimal number from 0 to 255. This is scaled to the range 0.0 to 1.0 (so an input of 255 translates to 1.0).
+
+There is a simple test program in @code[demos/osc-test.lsp] you can run to try out control with Open Sound Control. There are two examples in that file. One uses @code(snd-slider) to control the frequency of an oscillator. The other uses @code(get-slider-value) to control the pitch of grains in a granular synthesis process.
+
+
+@appendix(Intgen)@index(Intgen)
+@label(intgen-app)
+@pragma(doinclude)
+@include(../xlisp/intgen.mss)
+
+@appendix(XLISP: An Object-oriented Lisp)
+@label(xlisp-app)
+@begin(center)
+
+@b(Version 2.0)
+
+February 6, 1988
+
+by
+@b(David Michael Betz)
+127 Taylor Road
+Peterborough, NH 03458
+
+Copyright (c) 1988, by David Michael Betz
+All Rights Reserved
+Permission is granted for unrestricted non-commercial use
+@end(center)
+@newpage
+@pragma(doinclude)
+@include(../xlisp/xlisp.mss)
diff --git a/docsrc/nyquist/poisson-fig.ps b/docsrc/nyquist/poisson-fig.ps
new file mode 100644
index 0000000..67a3d07
--- /dev/null
+++ b/docsrc/nyquist/poisson-fig.ps
@@ -0,0 +1,1236 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%Creator: GIMP PostScript file plugin V 1.17 by Peter Kirchgessner
+%%Title: poisson-fig.ps
+%%CreationDate: Wed Jul 13 12:17:22 2005
+%%DocumentData: Clean7Bit
+%%LanguageLevel: 2
+%%Pages: 1
+%%BoundingBox: 14 14 313 364
+%%EndComments
+%%BeginProlog
+% Use own dictionary to avoid conflicts
+10 dict begin
+%%EndProlog
+%%Page: 1 1
+% Translate for offset
+14.173228346456694 14.173228346456694 translate
+% Translate to begin of first scanline
+%0 349 translate
+-20 775 translate
+297.99999999999994 -349 scale
+% Image geometry
+298 349 8
+% Transformation matrix
+[ 298 0 0 349 0 0 ]
+% Strings to hold RGB-samples per scanline
+/rstr 298 string def
+/gstr 298 string def
+/bstr 298 string def
+{currentfile /ASCII85Decode filter /RunLengthDecode filter rstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter gstr readstring pop}
+{currentfile /ASCII85Decode filter /RunLengthDecode filter bstr readstring pop}
+true 3
+%%BeginData: 55088 ASCII Bytes
+colorimage
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+r;V<JJH4[0qu;0~>
+r;V<JJH4[0qu;0~>
+r;V<JJH4[0qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`s`rGr:!1N]_rrD$Xr;["7d/X+G!;ZWqiJdX5rr<-#!!)`m"lYF?rr<&_s8N)ps8N'#s5Aq&
+rrqYU!!%uB`W#o<qu;0~>
+r;Q`s`rGr:!1N]_rrD$Xr;["7d/X+G!;ZWqiJdX5rr<-#!!)`m"lYF?rr<&_s8N)ps8N'#s5Aq&
+rrqYU!!%uB`W#o<qu;0~>
+r;Q`s`rGr:!1N]_rrD$Xr;["7d/X+G!;ZWqiJdX5rr<-#!!)`m"lYF?rr<&_s8N)ps8N'#s5Aq&
+rrqYU!!%uB`W#o<qu;0~>
+r;Q`s`rH&=s8N/@!1MO>rrE*!!h',JpAb-mp](6npAb-mjT#5[q>^Hp!ri6#li.-W!9r_J9u[,4
+!;leH~>
+r;Q`s`rH&=s8N/@!1MO>rrE*!!h',JpAb-mp](6npAb-mjT#5[q>^Hp!ri6#li.-W!9r_J9u[,4
+!;leH~>
+r;Q`s`rH&=s8N/@!1MO>rrE*!!h',JpAb-mp](6npAb-mjT#5[q>^Hp!ri6#li.-W!9r_J9u[,4
+!;leH~>
+r;Q`s`rH&=rr;uus8O=L9`VL!rr<'!l$NI2N9UB,HiO/*l2Udh9`VL!rr<&GHqhuds8N*!rs\,l
+Rf<?fs64n2!0$1@!##;3!/u=*!!*$!!52*crr<'!s8)d-rr<'!s0>?!ZN'q)!76*fd/!\MN+gQ<
+!<<))!!'>)s8)d#s65IB!,1'TrrV-ZI)Z*c!;leH~>
+r;Q`s`rH&=rr;uus8O=L9`VL!rr<'!l$NI2N9UB,HiO/*l2Udh9`VL!rr<&GHqhuds8N*!rs\,l
+Rf<?fs64n2!0$1@!##;3!/u=*!!*$!!52*crr<'!s8)d-rr<'!s0>?!ZN'q)!76*fd/!\MN+gQ<
+!<<))!!'>)s8)d#s65IB!,1'TrrV-ZI)Z*c!;leH~>
+r;Q`s`rH&=rr;uus8O=L9`VL!rr<'!l$NI2N9UB,HiO/*l2Udh9`VL!rr<&GHqhuds8N*!rs\,l
+Rf<?fs64n2!0$1@!##;3!/u=*!!*$!!52*crr<'!s8)d-rr<'!s0>?!ZN'q)!76*fd/!\MN+gQ<
+!<<))!!'>)s8)d#s65IB!,1'TrrV-ZI)Z*c!;leH~>
+r;Q`s`rH&=rr;uu-3(XYa2\1nrr<'!BE8(s!.=f[!<;9`I/gk[a2\1nrr<&4kl=HVs8N)us8N'X
+rr<'!BE8(s!.=eH!<<'!!87DP!!*$!!2mj;VZ6_srr<'!!!*'!!!*&4!6<+[^&J'4^$,MkqYqJ3
+!6:u;!<9_4a3Xh"rr<'!!!*'!I+ePa!)<FlqZ-Nn")%[JnAYD-!;leH~>
+r;Q`s`rH&=rr;uu-3(XYa2\1nrr<'!BE8(s!.=f[!<;9`I/gk[a2\1nrr<&4kl=HVs8N)us8N'X
+rr<'!BE8(s!.=eH!<<'!!87DP!!*$!!2mj;VZ6_srr<'!!!*'!!!*&4!6<+[^&J'4^$,MkqYqJ3
+!6:u;!<9_4a3Xh"rr<'!!!*'!I+ePa!)<FlqZ-Nn")%[JnAYD-!;leH~>
+r;Q`s`rH&=rr;uu-3(XYa2\1nrr<'!BE8(s!.=f[!<;9`I/gk[a2\1nrr<&4kl=HVs8N)us8N'X
+rr<'!BE8(s!.=eH!<<'!!87DP!!*$!!2mj;VZ6_srr<'!!!*'!!!*&4!6<+[^&J'4^$,MkqYqJ3
+!6:u;!<9_4a3Xh"rr<'!!!*'!I+ePa!)<FlqZ-Nn")%[JnAYD-!;leH~>
+r;Q`s`rH&=s8N\E!2oj1!<<'!B`A&4s%NK@d/O%I9`TRfrr3C?!<<'!B`A&4s8N'!rVultrr;uu
+#QFc(s%NK@d/O(F!<<*!!<3#u!$V@B!<<'!9`P1nrr<'!!!*'!!!*%4!<<'!B`A&4s8N'!qYq1&
+!<<'!!<5ans8N(4rr<'!!!*#u"Q?Y6!!)Ng!lk;0`W#o<qu;0~>
+r;Q`s`rH&=s8N\E!2oj1!<<'!B`A&4s%NK@d/O%I9`TRfrr3C?!<<'!B`A&4s8N'!rVultrr;uu
+#QFc(s%NK@d/O(F!<<*!!<3#u!$V@B!<<'!9`P1nrr<'!!!*'!!!*%4!<<'!B`A&4s8N'!qYq1&
+!<<'!!<5ans8N(4rr<'!!!*#u"Q?Y6!!)Ng!lk;0`W#o<qu;0~>
+r;Q`s`rH&=s8N\E!2oj1!<<'!B`A&4s%NK@d/O%I9`TRfrr3C?!<<'!B`A&4s8N'!rVultrr;uu
+#QFc(s%NK@d/O(F!<<*!!<3#u!$V@B!<<'!9`P1nrr<'!!!*'!!!*%4!<<'!B`A&4s8N'!qYq1&
+!<<'!!<5ans8N(4rr<'!!!*#u"Q?Y6!!)Ng!lk;0`W#o<qu;0~>
+r;Q`s`rGr:-`@"E!!*'!!!*$!!<:D?!!#a?s3OI?!):i?!!*'!!!*$!!<<'!!<)rt!<3#u!"f/1
+!<:D?!!#a?rr<'!rr<&us8N'%rr<'!s8;rts8N'5rr<'!rr<'!!!*'!!!*$!!<<'!!;c`q!<<*!
+!!*&r!"Jr.!<3$!s8UFGRcsePrVu`pq>^Hp`W#o<qu;0~>
+r;Q`s`rGr:-`@"E!!*'!!!*$!!<:D?!!#a?s3OI?!):i?!!*'!!!*$!!<<'!!<)rt!<3#u!"f/1
+!<:D?!!#a?rr<'!rr<&us8N'%rr<'!s8;rts8N'5rr<'!rr<'!!!*'!!!*$!!<<'!!;c`q!<<*!
+!!*&r!"Jr.!<3$!s8UFGRcsePrVu`pq>^Hp`W#o<qu;0~>
+r;Q`s`rGr:-`@"E!!*'!!!*$!!<:D?!!#a?s3OI?!):i?!!*'!!!*$!!<<'!!<)rt!<3#u!"f/1
+!<:D?!!#a?rr<'!rr<&us8N'%rr<'!s8;rts8N'5rr<'!rr<'!!!*'!!!*$!!<<'!!;c`q!<<*!
+!!*&r!"Jr.!<3$!s8UFGRcsePrVu`pq>^Hp`W#o<qu;0~>
+r;Q`s`rH&=qu6q8!<<'!B`A&4rr3)RVZ9Hjrt3q^!)<K,!<<'!B`A&4s8N'!rVults8N8e!1Nof
+!<3!*fr"gErr<'!rr<&us8N'Brr<'!rr>an!<<'!!<3$!s8N'!s(DE4rr?a4!!*'!!!)lq#Yb=!
+rr<'!9`Y+krr<E+!!*'!!!*'!!!)Kf!<>j5rr<&rs*t~>
+r;Q`s`rH&=qu6q8!<<'!B`A&4rr3)RVZ9Hjrt3q^!)<K,!<<'!B`A&4s8N'!rVults8N8e!1Nof
+!<3!*fr"gErr<'!rr<&us8N'Brr<'!rr>an!<<'!!<3$!s8N'!s(DE4rr?a4!!*'!!!)lq#Yb=!
+rr<'!9`Y+krr<E+!!*'!!!*'!!!)Kf!<>j5rr<&rs*t~>
+r;Q`s`rH&=qu6q8!<<'!B`A&4rr3)RVZ9Hjrt3q^!)<K,!<<'!B`A&4s8N'!rVults8N8e!1Nof
+!<3!*fr"gErr<'!rr<&us8N'Brr<'!rr>an!<<'!!<3$!s8N'!s(DE4rr?a4!!*'!!!)lq#Yb=!
+rr<'!9`Y+krr<E+!!*'!!!*'!!!)Kf!<>j5rr<&rs*t~>
+r;Q`s`rH&=qu7qT!6<+[^&J'4s*Oh2n,R/%HiWF#!,2DG!6<+[^&J'4s8N'!rVults8Nb$!87AP
+!<7EHl0n[drr<'!rr<&us8N'Err<%sciBtW!9q/s!<3$!s8N'!s1JEQ`rNgQ!!*'!!!*$!!<)p9
+VZ=cN!!*&)!6==(N;ikXrr<'!s%NLX`rH,2rrn>]l,Ne0`W#o<qu;0~>
+r;Q`s`rH&=qu7qT!6<+[^&J'4s*Oh2n,R/%HiWF#!,2DG!6<+[^&J'4s8N'!rVults8Nb$!87AP
+!<7EHl0n[drr<'!rr<&us8N'Err<%sciBtW!9q/s!<3$!s8N'!s1JEQ`rNgQ!!*'!!!*$!!<)p9
+VZ=cN!!*&)!6==(N;ikXrr<'!s%NLX`rH,2rrn>]l,Ne0`W#o<qu;0~>
+r;Q`s`rH&=qu7qT!6<+[^&J'4s*Oh2n,R/%HiWF#!,2DG!6<+[^&J'4s8N'!rVults8Nb$!87AP
+!<7EHl0n[drr<'!rr<&us8N'Err<%sciBtW!9q/s!<3$!s8N'!s1JEQ`rNgQ!!*'!!!*$!!<)p9
+VZ=cN!!*&)!6==(N;ikXrr<'!s%NLX`rH,2rrn>]l,Ne0`W#o<qu;0~>
+r;Q`s`rH&=qYqeG9hhqnrr<'!n<s=WI-L\#RK*>8l2Udh9hhqnrr<'!rr<&ts8;p2B\EFc!!*&g
+RK*>8l2T*1I/a0Hrr;uu,l[iEcqSofcqS3<!!*&G!.=eH!<<))9hhqnrr<'!rr<'!!!)rs)2q;1
+!!*'!Z:t=Xs8N'!s3Lans3OJ7Z2amrrrhSF!)9c;rr<&rs*t~>
+r;Q`s`rH&=qYqeG9hhqnrr<'!n<s=WI-L\#RK*>8l2Udh9hhqnrr<'!rr<&ts8;p2B\EFc!!*&g
+RK*>8l2T*1I/a0Hrr;uu,l[iEcqSofcqS3<!!*&G!.=eH!<<))9hhqnrr<'!rr<'!!!)rs)2q;1
+!!*'!Z:t=Xs8N'!s3Lans3OJ7Z2amrrrhSF!)9c;rr<&rs*t~>
+r;Q`s`rH&=qYqeG9hhqnrr<'!n<s=WI-L\#RK*>8l2Udh9hhqnrr<'!rr<&ts8;p2B\EFc!!*&g
+RK*>8l2T*1I/a0Hrr;uu,l[iEcqSofcqS3<!!*&G!.=eH!<<))9hhqnrr<'!rr<'!!!)rs)2q;1
+!!*'!Z:t=Xs8N'!s3Lans3OJ7Z2amrrrhSF!)9c;rr<&rs*t~>
+r;Q`sJcF:#!U49\rr<&rs*t~>
+r;Q`sJcF:#!U49\rr<&rs*t~>
+r;Q`sJcF:#!U49\rr<&rs*t~>
+r;Q`sJcF:#!K?!#rr<&rs*t~>
+r;Q`sJcF:#!K?!#rr<&rs*t~>
+r;Q`sJcF:#!K?!#rr<&rs*t~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`soD\djrr;rtJcC<$q>UEpqu;0~>
+r;Q`soD\djrr;rtJcC<$q>UEpqu;0~>
+r;Q`soD\djrr;rtJcC<$q>UEpqu;0~>
+r;Q`so`+pks8N'!rr2ruJcC<$qYpNqqu;0~>
+r;Q`so`+pks8N'!rr2ruJcC<$qYpNqqu;0~>
+r;Q`so`+pks8N'!rr2ruJcC<$qYpNqqu;0~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s8)`q!;leH~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s8)`q!;leH~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s8)`q!;leH~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s8)`q!;leH~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s8)`q!;leH~>
+r;Q`sp&>0qrrE*!!<2uu!.k0$s8)`q!;leH~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ)1tNe$s*!!)orJ,~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ)1tNe$s*!!)orJ,~>
+r;Q`spAY<ss8N*!rrE&u!!)orqZ)1tNe$s*!!)orJ,~>
+r;Q`spAb$j!WN0!rr<&orr<%M^l?,0JGK3F!;leH~>
+r;Q`spAb$j!WN0!rr<&orr<%M^l?,0JGK3F!;leH~>
+r;Q`spAb$j!WN0!rr<&orr<%M^l?,0JGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^l?,0JGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^l?,0JGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<%M^l?,0JGK3F!;leH~>
+r;Q`soD\djrr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`soD\djrr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`spAY*mrr3'#s8N)lrr<%M^l?,0JGK3F!;leH~>
+r;Q`spAY*mrr3'#s8N)lrr<%M^l?,0JGK3F!;leH~>
+r;Q`spAY*mrr3'#s8N)lrr<%M^l?,0JGK3F!;leH~>
+r;Q`so)AakrrD]k!!%ScNPGOEq>UEpqu;0~>
+r;Q`so)AakrrD]k!!%ScNPGOEq>UEpqu;0~>
+r;Q`so)AakrrD]k!!%ScNPGOEq>UEpqu;0~>
+r;Q`so`+pks8W#tp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`so`+pks8W#tp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`so`+pks8W#tp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`squ?NnJ\[>^!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`squ?NnJ\[>^!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`squ?NnJ\[>^!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`sq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`sq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`so)A[ir;Q`sq#:<oJ\[8\!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!%ScNPGOEq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3nJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uYJ\[8\!.anF!!)orJ,~>
+r;Q`sir8uY]>4%=J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>4%=J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>4%=J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'XH!!)`m!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'XH!!)`m!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so`+pks8N'!rr2ruq#:<o]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<o]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`so`+pks8N'!rr2ruq#:<o]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`so)AakrrE&u!!)orqZ+=F!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ+=F!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ+=F!!)`m!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'XH!!)`m!!%Sci4o>Cq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'XH!!)`m!!%Sci4o>Cq>UEpqu;0~>
+r;Q`sp&G!krr;rtp\t3n]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<o]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<o]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;osq#:<o]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`spAY*mrr3'#s8N)lrr<&2^]4B.R/d5<^u3!.JGK3F!;leH~>
+r;Q`spAY*mrr3'#s8N)lrr<&2^]4B.R/d5<^u3!.JGK3F!;leH~>
+r;Q`spAY*mrr3'#s8N)lrr<&2^]4B.rr<%M^u3!.JGK3F!;leH~>
+r;Q`so)AakrrD]k!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrD]k!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrD]k!!'XH!!)`m!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)A^js8;rlrr<&2^]4B.R/d5<^u3!.JGK3F!;leH~>
+r;Q`so)A^js8;rlrr<&2^]4B.R/d5<^u3!.JGK3F!;leH~>
+r;Q`so)A^js8;rlrr<&2^]4B.rr<%M^u3!.JGK3F!;leH~>
+r;Q`soD\djqu6Wrqu?Nn]taUJp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`soD\djqu6Wrqu?Nn]taUJp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`soD\djqu6Wrqu?Nn]taUJpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`so`"mkqYpNqq#:<o]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`so`"mkqYpNqq#:<o]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`so`"mkqYpNqq#:<o]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<o]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<o]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<o]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3n]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3n]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3n]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]>+CHp6bm\J\^3Z!.anF!!)orJ,~>
+r;Q`sp&G!krr;rtp\t3n]>+CHpAY*mJ\^3Z!.anF!!)orJ,~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`spAY*mrr3$"rrE&u!!)fo!!'XH!!)`m!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'XH!!)_\!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)fo!!'XH!!)`m!!%Sci4o>Cq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ+=F!!)_\!!)N(oDjHXrkJMaq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ+=F!!)_\!!)N(oDjHXrkJMaq>UEpqu;0~>
+r;Q`so)AakrrE&u!!)orqZ+=F!!)`m!!)N(oDjHXrkJMaq>UEpqu;0~>
+r;Q`soD\mms8N)urr<&orr<&2^]4B.R/d6V^]4B.R/d5<_#D+LJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<&2^]4B.R/d6V^]4B.R/d5<_#D+LJGK3F!;leH~>
+r;Q`soD\mms8N)urr<&orr<&2^]4B.rr<&g^]4B.rr<%M_#D+LJGK3F!;leH~>
+r;Q`so`"mkrr2rurr2ruq#:<o]>+CHp6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<o]>+CHp6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<o]>+CHpAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<o]>+CHp6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<o]>+CHp6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sp&>!lrVlitrr2ruq#:<o]>+CHpAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3n]>+CHp6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3n]>+CHp6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`spAb$js8W&up\t3n]>+CHpAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHp6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uY]>+CHpAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;*=\n%\o'p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;*=\n%\o'p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;*=\n%\o'pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`so`"mkrVufrq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`so`"mkrVufrq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`so`"mkrVufrq#:<og;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`sp&G$lrVlitp&>!lg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sp&G$lrVlitp&>!lg;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`sp&G$lrVlitp&>!lg;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`spAY0orrE&u!!)Zk!!(`g!!)\[!!)N(!!)_\!!)N(!!)_\!!%ScrkJMaq>UEpqu;0~>
+r;Q`spAY0orrE&u!!)Zk!!(`g!!)\[!!)N(!!)_\!!)N(!!)_\!!%ScrkJMaq>UEpqu;0~>
+r;Q`spAY0orrE&u!!)Zk!!(`g!!)]l!!)N(!!)`m!!)N(!!)`m!!%ScrkJMaq>UEpqu;0~>
+r;Q`so`"mkrr;osp\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`so`"mkrr;osp\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\J\_9#!.anF!!)orJ,~>
+r;Q`so`"mkrr;osp\t3ng;![gp&>!lnA##(pAY*mnA##(pAY*mJ\_9#!.anF!!)orJ,~>
+r;Q`so`"mkqYpNqqu?NngqWmiopGd[nA##(p6bm\nA##(p6bm\n%ePqS\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqqu?NngqWmiopGd[nA##(p6bm\nA##(p6bm\n%ePqS\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqqu?NngqWmip&>!lnA##(pAY*mnA##(pAY*mn%ePqS\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`so`"mkqYpNqq#:<og;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sp&G$lrr2rurr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`sp&G$lrr2rurr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`sp&G$lrr2rurr2ruq#:<og;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEp
+qu;0~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!(`g!!)\[!!)N(!!)_\!!)N(!!)_\!!)N(!!)\[!!&S*!.anF
+!!)orJ,~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!(`g!!)\[!!)N(!!)_\!!)N(!!)_\!!)N(!!)\[!!&S*!.anF
+!!)orJ,~>
+r;Q`spAY0orrE&u!!*#u!!)fo!!(`g!!)]l!!)N(!!)`m!!)N(!!)`m!!)N(!!)]l!!&S*!.anF
+!!)orJ,~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruqu?NngqWmiopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruqu?NngqWmiopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruqu?NngqWmip&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrr2rurr2ruq#:<og;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEp
+qu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`so`"mkrVuisp\t3ng;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[S\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lS\P5Uq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[n%ePq]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[n%ePq]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!ln%ePq]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sn,N=dq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,N=dq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,N=dq#:<og;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`sn,E@fp&>!lg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,E@fp&>!lg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,E@fp&>!lg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`snG`Igo`"mkg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`snG`Igo`"mkg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`snG`Igo`"mkg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`snGiFep\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`snGiFep\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`snGiFep\t3ng;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cqu?NngqWmiopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cqu?NngqWmiopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cqu?NngqWmip&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sm/I%cq#:<og;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`snG`Igrr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<og;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMt
+q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<og;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMt
+q>UEpqu;0~>
+r;Q`sn,N@ep\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,N@ep\t3ng;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEp
+qu;0~>
+r;Q`sn,N@ep\t3ng;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEp
+qu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gopGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[]YFMtq>UEpqu;0~>
+r;Q`sir8uYg;![gp&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l]YFMtq>UEpqu;0~>
+r;Q`sir8uYq7uS%nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA+YrnA+Vq
+q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7uS%nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA+YrnA+Vq
+q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7uS%nA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA+YrnA+Vq
+q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA##(
+pAY*mnA##(p&>!lq7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA##(
+pAY*mnA##(p&>!lq7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA##(
+pAY*mnA##(p&>!lq7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA##(
+pAY*mnA##(p&>!lq7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA##(
+pAY*mnA##(p&>!lq7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA##(
+pAY*mnA##(p&>!lq7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[nA##(
+p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sir8uYq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!lnA##(
+pAY*mnA##(p&>!lq7lu\q>UEpqu;0~>
+r;Q`sn,N@ep\t3nq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[
+nA##(p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sn,N@ep\t3nq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(opGd[
+nA##(p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`sn,N@ep\t3nq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(p&>!l
+nA##(pAY*mnA##(p&>!lq7lu\q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(
+opGd[nA##(p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[nA##(opGd[nA##(p6bm\nA##(p6bm\nA##(opGd[nA##(
+opGd[nA##(p6bm\nA##(opGd[q7lu\q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1p&>!lnA##(p&>!lnA##(pAY*mnA##(pAY*mnA##(p&>!lnA##(
+p&>!lnA##(pAY*mnA##(p&>!lq7lu\q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1p6bm\
+q7lt1q7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1p6bm\
+q7lt1q7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1p&>!lq7lt1q7lt1p&>!lq7lt1q7lt1pAY*mq7lt1q7lt1pAY*m
+q7lt1q7lt1p&>!lq7lt1q7lt1p&>!lq7lt1q7lt1pAY*mq7lt1q7lt1p&>!lq7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1p6bm\
+q7lt1q7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1p6bm\
+q7lt1q7lt1opGd[q7lt1q7lt1opGd[q7lt1q7lt1p6bm\q7lt1q7lt1opGd[q7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oq7lt1p&>!lq7lt1q7lt1p&>!lq7lt1q7lt1pAY*mq7lt1q7lt1pAY*m
+q7lt1q7lt1p&>!lq7lt1q7lt1p&>!lq7lt1q7lt1pAY*mq7lt1q7lt1p&>!lq7lt1q>UEpqu;0~>
+r;Q`snG`Igrr2ruqu;3IL]I8N!!)orJ,~>
+r;Q`snG`Igrr2ruqu;3IL]I8N!!)orJ,~>
+r;Q`snG`Igrr2ruqu;3IL]I8N!!)orJ,~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`snG`Igrr2ruq#:<oj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sn,N@ep\t3nj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sn,N@ep\t3nj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sn,N@ep\t3nj8T)Zj8T)ZjSo2[jSo2[j8T)Zj8T)ZjSo2[j8T)Zq>UEpqu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sec5UKjSo2[jT#2Zjo>;[jo5;\jo>8Zk5YD\n,E@fr;Q`sjSo2[qu;0~>
+r;Q`sec5UKjSo2[jT#2Zjo>;[jo5;\jo>8Zk5YD\n,E@fr;Q`sjSo2[qu;0~>
+r;Q`sec5UKjSo2[jT#2Zjo>;[jo5;\jo>8Zk5YD\n,E@fr;Q`sjSo2[qu;0~>
+r;Q`sf)G^Mrr2ruk5YG]jo5;\rr2rukPkM^rr2rukPtP^jo5;\jSo2[rr2runGiLgrr;uujSo2[
+qu;0~>
+r;Q`sf)G^Mrr2ruk5YG]jo5;\rr2rukPkM^rr2rukPtP^jo5;\jSo2[rr2runGiLgrr;uujSo2[
+qu;0~>
+r;Q`sf)G^Mrr2ruk5YG]jo5;\rr2rukPkM^rr2rukPtP^jo5;\jSo2[rr2runGiLgrr;uujSo2[
+qu;0~>
+r;Q`sf)G^Mrr2rukPkS`rrD$X!!)'Z!!)6_!W`6#k5PD]j8T)Zm/R(crr;uus8W&us8N3%rrE*!
+rW)Qi!!)orJ,~>
+r;Q`sf)G^Mrr2rukPkS`rrD$X!!)'Z!!)6_!W`6#k5PD]j8T)Zm/R(crr;uus8W&us8N3%rrE*!
+rW)Qi!!)orJ,~>
+r;Q`sf)G^Mrr2rukPkS`rrD$X!!)'Z!!)6_!W`6#k5PD]j8T)Zm/R(crr;uus8W&us8N3%rrE*!
+rW)Qi!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\iVrlXjo>>\kPkS`rrD3]r;c![r;c<d#QXl)rrE'!rrE&u"p"Z'!<<'!
+rr2ruo`"mkqu;0~>
+r;Q`sf)G^Mrr2rujo5;\iVrlXjo>>\kPkS`rrD3]r;c![r;c<d#QXl)rrE'!rrE&u"p"Z'!<<'!
+rr2ruo`"mkqu;0~>
+r;Q`sf)G^Mrr2rujo5;\iVrlXjo>>\kPkS`rrD3]r;c![r;c<d#QXl)rrE'!rrE&u"p"Z'!<<'!
+rr2ruo`"mkqu;0~>
+r;Q`sf)G^Mrr2rujo5;\ir8uYir8uYl2Lhcs8N)Yrr<&^rr<&urr<&grs/W)!<3'!!<3&urrN3#
+!<3#r!;-9k!;leH~>
+r;Q`sf)G^Mrr2rujo5;\ir8uYir8uYl2Lhcs8N)Yrr<&^rr<&urr<&grs/W)!<3'!!<3&urrN3#
+!<3#r!;-9k!;leH~>
+r;Q`sf)G^Mrr2rujo5;\ir8uYir8uYl2Lhcs8N)Yrr<&^rr<&urr<&grs/W)!<3'!!<3&urrN3#
+!<3#r!;-9k!;leH~>
+r;Q`sf)G^Mrr2rujo5;\j8T)ZiVrlXl2UY]j8T)ZkPkM^rr2runG`aorrE'!rrE'!rr3$"rrE&u
+!!)Ng!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\j8T)ZiVrlXl2UY]j8T)ZkPkM^rr2runG`aorrE'!rrE'!rr3$"rrE&u
+!!)Ng!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\j8T)ZiVrlXl2UY]j8T)ZkPkM^rr2runG`aorrE'!rrE'!rr3$"rrE&u
+!!)Ng!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\jSo2[jSo2[rr2ruk5PD]k5PD]rr2rukPkM^rr2runG`aos8N*!rrE'!
+rr3$"rrE&u!!*#u!!)Zk!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\jSo2[jSo2[rr2ruk5PD]k5PD]rr2rukPkM^rr2runG`aos8N*!rrE'!
+rr3$"rrE&u!!*#u!!)Zk!!)orJ,~>
+r;Q`sf)G^Mrr2rujo5;\jSo2[jSo2[rr2ruk5PD]k5PD]rr2rukPkM^rr2runG`aos8N*!rrE'!
+rr3$"rrE&u!!*#u!!)Zk!!)orJ,~>
+r;Q`sec5UKjSo2[jo>5Yk5YD\jo5;\jo>;[jo>;[n,EXns8N*!rrE*!rW)uu!!)utrW)Qi!!)or
+J,~>
+r;Q`sec5UKjSo2[jo>5Yk5YD\jo5;\jo>;[jo>;[n,EXns8N*!rrE*!rW)uu!!)utrW)Qi!!)or
+J,~>
+r;Q`sec5UKjSo2[jo>5Yk5YD\jo5;\jo>;[jo>;[n,EXns8N*!rrE*!rW)uu!!)utrW)Qi!!)or
+J,~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;Q`sJcC<$jSo2[qu;0~>
+r;V<JJH4[0qu;0~>
+r;V<JJH4[0qu;0~>
+r;V<JJH4[0qu;0~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+JcC<$fDg@~>
+%%EndData
+showpage
+%%Trailer
+end
+%%EOF
diff --git a/docsrc/nyquist/rampfig.ps b/docsrc/nyquist/rampfig.ps
new file mode 100644
index 0000000..3cd9ba1
--- /dev/null
+++ b/docsrc/nyquist/rampfig.ps
@@ -0,0 +1,694 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 36 573 444 752
+%%Title: (rampfig-Layer#1)
+%%Creator: (MacDraw II 1.1v2: LaserWriter 8 8.1.1)
+%%CreationDate: (4:37 AM Sunday, January 24, 1904)
+%%For: (Dannenberg)
+%%Pages: 1
+%%DocumentFonts: Helvetica Courier
+%%DocumentNeededFonts: Helvetica Courier
+%%DocumentSuppliedFonts:
+%%DocumentData: Clean7Bit
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%ADO_PaperArea: -129 -125 3171 2425
+%ADO_ImageableArea: 0 0 3042 2300
+%%EndComments
+/md 154 dict def md begin
+/currentpacking where {pop /sc_oldpacking currentpacking def true setpacking}if
+%%BeginFile: adobe_psp_basic
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/bd{bind def}bind def
+/xdf{exch def}bd
+/xs{exch store}bd
+/ld{load def}bd
+/Z{0 def}bd
+/T/true
+/F/false
+/:L/lineto
+/lw/setlinewidth
+/:M/moveto
+/rl/rlineto
+/rm/rmoveto
+/:C/curveto
+/:T/translate
+/:K/closepath
+/:mf/makefont
+/gS/gsave
+/gR/grestore
+/np/newpath
+14{ld}repeat
+/$m matrix def
+/av 81 def
+/por true def
+/normland false def
+/psb-nosave{}bd
+/pse-nosave{}bd
+/us Z
+/psb{/us save store}bd
+/pse{us restore}bd
+/level2
+/languagelevel where
+{
+pop languagelevel 2 ge
+}{
+false
+}ifelse
+def
+/featurecleanup
+{
+stopped
+cleartomark
+countdictstack exch sub dup 0 gt
+{
+{end}repeat
+}{
+pop
+}ifelse
+}bd
+/noload Z
+/startnoload
+{
+{/noload save store}if
+}bd
+/endnoload
+{
+{noload restore}if
+}bd
+level2 startnoload
+/setjob
+{
+statusdict/jobname 3 -1 roll put
+}bd
+/setcopies
+{
+userdict/#copies 3 -1 roll put
+}bd
+level2 endnoload level2 not startnoload
+/setjob
+{
+1 dict begin/JobName xdf currentdict end setuserparams
+}bd
+/setcopies
+{
+1 dict begin/NumCopies xdf currentdict end setpagedevice
+}bd
+level2 not endnoload
+/pm Z
+/mT Z
+/sD Z
+/realshowpage Z
+/initializepage
+{
+/pm save store mT concat
+}bd
+/endp
+{
+pm restore showpage
+}def
+/$c/DeviceRGB def
+/rectclip where
+{
+pop/rC/rectclip ld
+}{
+/rC
+{
+np 4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+:K
+clip np
+}bd
+}ifelse
+/rectfill where
+{
+pop/rF/rectfill ld
+}{
+/rF
+{
+gS
+np
+4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+fill
+gR
+}bd
+}ifelse
+/rectstroke where
+{
+pop/rS/rectstroke ld
+}{
+/rS
+{
+gS
+np
+4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+:K
+stroke
+gR
+}bd
+}ifelse
+%%EndFile
+%%BeginFile: adobe_psp_colorspace_level1
+%%Copyright: Copyright 1991-1993 Adobe Systems Incorporated. All Rights Reserved.
+/G/setgray ld
+/:F/setrgbcolor ld
+%%EndFile
+%%BeginFile: adobe_psp_uniform_graphics
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/@a
+{
+np :M 0 rl :L 0 exch rl 0 rl :L fill
+}bd
+/@b
+{
+np :M 0 rl 0 exch rl :L 0 rl 0 exch rl fill
+}bd
+/arct where
+{
+pop
+}{
+/arct
+{
+arcto pop pop pop pop
+}bd
+}ifelse
+/x1 Z
+/x2 Z
+/y1 Z
+/y2 Z
+/rad Z
+/@q
+{
+/rad xs
+/y2 xs
+/x2 xs
+/y1 xs
+/x1 xs
+np
+x2 x1 add 2 div y1 :M
+x2 y1 x2 y2 rad arct
+x2 y2 x1 y2 rad arct
+x1 y2 x1 y1 rad arct
+x1 y1 x2 y1 rad arct
+fill
+}bd
+/@s
+{
+/rad xs
+/y2 xs
+/x2 xs
+/y1 xs
+/x1 xs
+np
+x2 x1 add 2 div y1 :M
+x2 y1 x2 y2 rad arct
+x2 y2 x1 y2 rad arct
+x1 y2 x1 y1 rad arct
+x1 y1 x2 y1 rad arct
+:K
+stroke
+}bd
+/@i
+{
+np 0 360 arc fill
+}bd
+/@j
+{
+gS
+np
+:T
+scale
+0 0 .5 0 360 arc
+fill
+gR
+}bd
+/@e
+{
+np
+0 360 arc
+:K
+stroke
+}bd
+/@f
+{
+np
+$m currentmatrix
+pop
+:T
+scale
+0 0 .5 0 360 arc
+:K
+$m setmatrix
+stroke
+}bd
+/@k
+{
+gS
+np
+:T
+0 0 :M
+0 0 5 2 roll
+arc fill
+gR
+}bd
+/@l
+{
+gS
+np
+:T
+0 0 :M
+scale
+0 0 .5 5 -2 roll arc
+fill
+gR
+}bd
+/@m
+{
+np
+arc
+stroke
+}bd
+/@n
+{
+np
+$m currentmatrix
+pop
+:T
+scale
+0 0 .5 5 -2 roll arc
+$m setmatrix
+stroke
+}bd
+%%EndFile
+%%BeginFile: adobe_psp_customps
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/$t Z
+/$p Z
+/$s Z
+/$o 1. def
+/2state? false def
+/ps Z
+level2 startnoload
+/pushcolor/currentrgbcolor ld
+/popcolor/setrgbcolor ld
+/setcmykcolor where
+{
+pop/currentcmykcolor where
+{
+pop/pushcolor/currentcmykcolor ld
+/popcolor/setcmykcolor ld
+}if
+}if
+level2 endnoload level2 not startnoload
+/pushcolor
+{
+currentcolorspace $c eq
+{
+currentcolor currentcolorspace true
+}{
+currentcmykcolor false
+}ifelse
+}bd
+/popcolor
+{
+{
+setcolorspace setcolor
+}{
+setcmykcolor
+}ifelse
+}bd
+level2 not endnoload
+/pushstatic
+{
+ps
+2state?
+$o
+$t
+$p
+$s
+}bd
+/popstatic
+{
+/$s xs
+/$p xs
+/$t xs
+/$o xs
+/2state? xs
+/ps xs
+}bd
+/pushgstate
+{
+save errordict/nocurrentpoint{pop 0 0}put
+currentpoint
+3 -1 roll restore
+pushcolor
+currentlinewidth
+currentlinecap
+currentlinejoin
+currentdash exch aload length
+np clippath pathbbox
+$m currentmatrix aload pop
+}bd
+/popgstate
+{
+$m astore setmatrix
+2 index sub exch
+3 index sub exch
+rC
+array astore exch setdash
+setlinejoin
+setlinecap
+lw
+popcolor
+np :M
+}bd
+/bu
+{
+pushgstate
+gR
+pushgstate
+2state?
+{
+gR
+pushgstate
+}if
+pushstatic
+pm restore
+mT concat
+}bd
+/bn
+{
+/pm save store
+popstatic
+popgstate
+gS
+popgstate
+2state?
+{
+gS
+popgstate
+}if
+}bd
+/cpat{pop 64 div G 8{pop}repeat}bd
+%%EndFile
+%%BeginFile: adobe_psp_basic_text
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/S/show ld
+/A{
+0.0 exch ashow
+}bd
+/R{
+0.0 exch 32 exch widthshow
+}bd
+/W{
+0.0 3 1 roll widthshow
+}bd
+/J{
+0.0 32 4 2 roll 0.0 exch awidthshow
+}bd
+/V{
+0.0 4 1 roll 0.0 exch awidthshow
+}bd
+/fcflg true def
+/fc{
+fcflg{
+vmstatus exch sub 50000 lt{
+(%%[ Warning: Running out of memory ]%%\r)print flush/fcflg false store
+}if pop
+}if
+}bd
+/$f[1 0 0 -1 0 0]def
+/:ff{$f :mf}bd
+/MacEncoding StandardEncoding 256 array copy def
+MacEncoding 39/quotesingle put
+MacEncoding 96/grave put
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/notequal/AE/Oslash
+/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
+/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash
+/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
+/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
+/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
+/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave
+/Oacute/Ocircumflex/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+MacEncoding 128 128 getinterval astore pop
+level2 startnoload
+/copyfontdict
+{
+findfont dup length dict
+begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+}bd
+level2 endnoload level2 not startnoload
+/copyfontdict
+{
+findfont dup length dict
+copy
+begin
+}bd
+level2 not endnoload
+md/fontname known not{
+/fontname/customfont def
+}if
+/Encoding Z
+/:mre
+{
+copyfontdict
+/Encoding MacEncoding def
+fontname currentdict
+end
+definefont :ff def
+}bd
+/:bsr
+{
+copyfontdict
+/Encoding Encoding 256 array copy def
+Encoding dup
+}bd
+/pd{put dup}bd
+/:esr
+{
+pop pop
+fontname currentdict
+end
+definefont :ff def
+}bd
+/scf
+{
+scalefont def
+}bd
+/scf-non
+{
+$m scale :mf setfont
+}bd
+/ps Z
+/fz{/ps xs}bd
+/sf/setfont ld
+/cF/currentfont ld
+/mbf
+{
+/makeblendedfont where
+{
+pop
+makeblendedfont
+/ABlend exch definefont
+}{
+pop
+}ifelse
+def
+}def
+%%EndFile
+%%BeginFile: adobe_psp_dashes
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/:q/setdash ld
+/:r{
+np
+:M
+:L
+stroke
+}bd
+/nodash[]def
+/qdenddash
+{
+nodash 0 setdash
+}bd
+%%EndFile
+/currentpacking where {pop sc_oldpacking setpacking}if
+end % md
+%%EndProlog
+%%BeginSetup
+md begin
+/pT[1 0 0 -1 29.999 761.009]def/mT[.24 0 0 -.24 29.999 761.009]def
+/sD 16 dict def
+%%IncludeFont: Helvetica
+%%IncludeFont: Courier
+/f0_1/Helvetica :mre
+/f0_58 f0_1 58 scf
+/f1_1/Courier :mre
+/f1_58 f1_1 58 scf
+/Courier findfont[10 0 0 -10 0 0]:mf setfont
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+initializepage
+%%EndPageSetup
+gS 0 0 2300 3042 rC
+0 0 :M
+0 setlinecap
+currentscreen
+3 1 roll pop pop 60 45 3 -1 roll setscreen
+np 150 38 :M
+165 96 :L
+150 96 :L
+135 96 :L
+150 38 :L
+eofill
+-4 -4 152 602 4 4 148 94 @b
+np 750 600 :M
+691 615 :L
+691 600 :L
+691 585 :L
+750 600 :L
+4 lw
+eofill
+148 602 -4 4 693 598 4 148 598 @a
+-8 -8 154 604 8 8 559 184 @b
+559 192 -8 8 604 596 8 559 184 @a
+111 152 -4 4 152 148 4 111 148 @a
+-4 -4 602 640 4 4 598 598 @b
+[20.833 16.667 ] 0 :q
+675 150 150 150 :r
+39 179 :M
+f0_58 sf
+(1)S
+47 634 :M
+(0)S
+572 709 :M
+(1)S
+[8.333 8.333 ] 0 :q
+600 150 563 188 :r
+600 600 600 150 :r
+np 1125 38 :M
+1140 96 :L
+1125 96 :L
+1110 96 :L
+1125 38 :L
+[] 0 :q
+eofill
+-4 -4 1127 602 4 4 1123 94 @b
+np 1725 600 :M
+1666 615 :L
+1666 600 :L
+1666 585 :L
+1725 600 :L
+eofill
+1123 602 -4 4 1668 598 4 1123 598 @a
+-8 -8 1129 604 8 8 1571 146 @b
+1571 154 -8 8 1617 596 8 1571 146 @a
+1086 152 -4 4 1127 148 4 1086 148 @a
+-4 -4 1577 640 4 4 1573 598 @b
+[20.833 16.667 ] 0 :q
+1650 150 1125 150 :r
+1014 179 :M
+(1)S
+1022 634 :M
+(0)S
+1547 709 :M
+(1)S
+151 763 :M
+f1_58 sf
+-.071(\(pwl 1 1 1\))A
+1276 763 :M
+-.15(\(ramp\))A
+29 30 450.5 300 @j
+[] 0 :q
+29 30 450.5 300 @f
+29 30 375.5 375 @j
+29 30 375.5 375 @f
+29 30 337.5 413 @j
+29 30 337.5 413 @f
+29 30 300.5 450 @j
+29 30 300.5 450 @f
+29 30 262.5 488 @j
+29 30 262.5 488 @f
+29 30 225.5 525 @j
+29 30 225.5 525 @f
+29 30 187.5 563 @j
+29 30 187.5 563 @f
+29 30 487.5 263 @j
+29 30 487.5 263 @f
+29 30 412.5 338 @j
+29 30 412.5 338 @f
+28 30 525 225 @j
+28 30 525 225 @f
+562.5 187.5 14.5 @i
+562.5 187.5 14.5 @e
+1 G
+28 30 600 150 @j
+0 G
+8 lw
+28 30 600 150 @f
+1 G
+28 30 600 600 @j
+0 G
+28 30 600 600 @f
+28 30 150 600 @j
+4 lw
+28 30 150 600 @f
+28 30 1125 600 @j
+28 30 1125 600 @f
+28 30 1200 525 @j
+28 30 1200 525 @f
+1162.5 562.5 14.5 @i
+1162.5 562.5 14.5 @e
+1237.5 487.5 14.5 @i
+1237.5 487.5 14.5 @e
+28 30 1275 450 @j
+28 30 1275 450 @f
+1312.5 412.5 14.5 @i
+1312.5 412.5 14.5 @e
+28 30 1350 375 @j
+28 30 1350 375 @f
+1387.5 337.5 14.5 @i
+1387.5 337.5 14.5 @e
+28 30 1425 300 @j
+28 30 1425 300 @f
+1462.5 262.5 14.5 @i
+1462.5 262.5 14.5 @e
+28 30 1500 225 @j
+28 30 1500 225 @f
+1537.5 187.5 14.5 @i
+1537.5 187.5 14.5 @e
+28 30 1575 150 @j
+28 30 1575 150 @f
+1 G
+29 30 1612.5 600 @j
+0 G
+8 lw
+29 30 1612.5 600 @f
+4 lw
+[20.833 16.667 ] 0 :q
+1575 600 1575 150 :r
+endp
+%%Trailer
+end % md
+%%EOF
diff --git a/docsrc/nyquist/shifttimefig.ps b/docsrc/nyquist/shifttimefig.ps
new file mode 100644
index 0000000..ce457db
--- /dev/null
+++ b/docsrc/nyquist/shifttimefig.ps
@@ -0,0 +1,643 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 35 522 418 752
+%%Title: (shifttimefig-Layer#1)
+%%Creator: (MacDraw II 1.1v2: LaserWriter 8 8.1.1)
+%%CreationDate: (10:26 PM Sunday, January 24, 1904)
+%%For: (Dannenberg)
+%%Pages: 1
+%%DocumentFonts: Courier
+%%DocumentNeededFonts: Courier
+%%DocumentSuppliedFonts:
+%%DocumentData: Clean7Bit
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%ADO_PaperArea: -129 -125 3171 2425
+%ADO_ImageableArea: 0 0 3042 2300
+%%EndComments
+/md 148 dict def md begin
+/currentpacking where {pop /sc_oldpacking currentpacking def true setpacking}if
+%%BeginFile: adobe_psp_basic
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/bd{bind def}bind def
+/xdf{exch def}bd
+/xs{exch store}bd
+/ld{load def}bd
+/Z{0 def}bd
+/T/true
+/F/false
+/:L/lineto
+/lw/setlinewidth
+/:M/moveto
+/rl/rlineto
+/rm/rmoveto
+/:C/curveto
+/:T/translate
+/:K/closepath
+/:mf/makefont
+/gS/gsave
+/gR/grestore
+/np/newpath
+14{ld}repeat
+/$m matrix def
+/av 81 def
+/por true def
+/normland false def
+/psb-nosave{}bd
+/pse-nosave{}bd
+/us Z
+/psb{/us save store}bd
+/pse{us restore}bd
+/level2
+/languagelevel where
+{
+pop languagelevel 2 ge
+}{
+false
+}ifelse
+def
+/featurecleanup
+{
+stopped
+cleartomark
+countdictstack exch sub dup 0 gt
+{
+{end}repeat
+}{
+pop
+}ifelse
+}bd
+/noload Z
+/startnoload
+{
+{/noload save store}if
+}bd
+/endnoload
+{
+{noload restore}if
+}bd
+level2 startnoload
+/setjob
+{
+statusdict/jobname 3 -1 roll put
+}bd
+/setcopies
+{
+userdict/#copies 3 -1 roll put
+}bd
+level2 endnoload level2 not startnoload
+/setjob
+{
+1 dict begin/JobName xdf currentdict end setuserparams
+}bd
+/setcopies
+{
+1 dict begin/NumCopies xdf currentdict end setpagedevice
+}bd
+level2 not endnoload
+/pm Z
+/mT Z
+/sD Z
+/realshowpage Z
+/initializepage
+{
+/pm save store mT concat
+}bd
+/endp
+{
+pm restore showpage
+}def
+/$c/DeviceRGB def
+/rectclip where
+{
+pop/rC/rectclip ld
+}{
+/rC
+{
+np 4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+:K
+clip np
+}bd
+}ifelse
+/rectfill where
+{
+pop/rF/rectfill ld
+}{
+/rF
+{
+gS
+np
+4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+fill
+gR
+}bd
+}ifelse
+/rectstroke where
+{
+pop/rS/rectstroke ld
+}{
+/rS
+{
+gS
+np
+4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+:K
+stroke
+gR
+}bd
+}ifelse
+%%EndFile
+%%BeginFile: adobe_psp_colorspace_level1
+%%Copyright: Copyright 1991-1993 Adobe Systems Incorporated. All Rights Reserved.
+/G/setgray ld
+/:F/setrgbcolor ld
+%%EndFile
+%%BeginFile: adobe_psp_uniform_graphics
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/@a
+{
+np :M 0 rl :L 0 exch rl 0 rl :L fill
+}bd
+/@b
+{
+np :M 0 rl 0 exch rl :L 0 rl 0 exch rl fill
+}bd
+/arct where
+{
+pop
+}{
+/arct
+{
+arcto pop pop pop pop
+}bd
+}ifelse
+/x1 Z
+/x2 Z
+/y1 Z
+/y2 Z
+/rad Z
+/@q
+{
+/rad xs
+/y2 xs
+/x2 xs
+/y1 xs
+/x1 xs
+np
+x2 x1 add 2 div y1 :M
+x2 y1 x2 y2 rad arct
+x2 y2 x1 y2 rad arct
+x1 y2 x1 y1 rad arct
+x1 y1 x2 y1 rad arct
+fill
+}bd
+/@s
+{
+/rad xs
+/y2 xs
+/x2 xs
+/y1 xs
+/x1 xs
+np
+x2 x1 add 2 div y1 :M
+x2 y1 x2 y2 rad arct
+x2 y2 x1 y2 rad arct
+x1 y2 x1 y1 rad arct
+x1 y1 x2 y1 rad arct
+:K
+stroke
+}bd
+/@i
+{
+np 0 360 arc fill
+}bd
+/@j
+{
+gS
+np
+:T
+scale
+0 0 .5 0 360 arc
+fill
+gR
+}bd
+/@e
+{
+np
+0 360 arc
+:K
+stroke
+}bd
+/@f
+{
+np
+$m currentmatrix
+pop
+:T
+scale
+0 0 .5 0 360 arc
+:K
+$m setmatrix
+stroke
+}bd
+/@k
+{
+gS
+np
+:T
+0 0 :M
+0 0 5 2 roll
+arc fill
+gR
+}bd
+/@l
+{
+gS
+np
+:T
+0 0 :M
+scale
+0 0 .5 5 -2 roll arc
+fill
+gR
+}bd
+/@m
+{
+np
+arc
+stroke
+}bd
+/@n
+{
+np
+$m currentmatrix
+pop
+:T
+scale
+0 0 .5 5 -2 roll arc
+$m setmatrix
+stroke
+}bd
+%%EndFile
+%%BeginFile: adobe_psp_customps
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/$t Z
+/$p Z
+/$s Z
+/$o 1. def
+/2state? false def
+/ps Z
+level2 startnoload
+/pushcolor/currentrgbcolor ld
+/popcolor/setrgbcolor ld
+/setcmykcolor where
+{
+pop/currentcmykcolor where
+{
+pop/pushcolor/currentcmykcolor ld
+/popcolor/setcmykcolor ld
+}if
+}if
+level2 endnoload level2 not startnoload
+/pushcolor
+{
+currentcolorspace $c eq
+{
+currentcolor currentcolorspace true
+}{
+currentcmykcolor false
+}ifelse
+}bd
+/popcolor
+{
+{
+setcolorspace setcolor
+}{
+setcmykcolor
+}ifelse
+}bd
+level2 not endnoload
+/pushstatic
+{
+ps
+2state?
+$o
+$t
+$p
+$s
+}bd
+/popstatic
+{
+/$s xs
+/$p xs
+/$t xs
+/$o xs
+/2state? xs
+/ps xs
+}bd
+/pushgstate
+{
+save errordict/nocurrentpoint{pop 0 0}put
+currentpoint
+3 -1 roll restore
+pushcolor
+currentlinewidth
+currentlinecap
+currentlinejoin
+currentdash exch aload length
+np clippath pathbbox
+$m currentmatrix aload pop
+}bd
+/popgstate
+{
+$m astore setmatrix
+2 index sub exch
+3 index sub exch
+rC
+array astore exch setdash
+setlinejoin
+setlinecap
+lw
+popcolor
+np :M
+}bd
+/bu
+{
+pushgstate
+gR
+pushgstate
+2state?
+{
+gR
+pushgstate
+}if
+pushstatic
+pm restore
+mT concat
+}bd
+/bn
+{
+/pm save store
+popstatic
+popgstate
+gS
+popgstate
+2state?
+{
+gS
+popgstate
+}if
+}bd
+/cpat{pop 64 div G 8{pop}repeat}bd
+%%EndFile
+%%BeginFile: adobe_psp_basic_text
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/S/show ld
+/A{
+0.0 exch ashow
+}bd
+/R{
+0.0 exch 32 exch widthshow
+}bd
+/W{
+0.0 3 1 roll widthshow
+}bd
+/J{
+0.0 32 4 2 roll 0.0 exch awidthshow
+}bd
+/V{
+0.0 4 1 roll 0.0 exch awidthshow
+}bd
+/fcflg true def
+/fc{
+fcflg{
+vmstatus exch sub 50000 lt{
+(%%[ Warning: Running out of memory ]%%\r)print flush/fcflg false store
+}if pop
+}if
+}bd
+/$f[1 0 0 -1 0 0]def
+/:ff{$f :mf}bd
+/MacEncoding StandardEncoding 256 array copy def
+MacEncoding 39/quotesingle put
+MacEncoding 96/grave put
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/notequal/AE/Oslash
+/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
+/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash
+/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
+/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
+/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
+/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave
+/Oacute/Ocircumflex/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+MacEncoding 128 128 getinterval astore pop
+level2 startnoload
+/copyfontdict
+{
+findfont dup length dict
+begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+}bd
+level2 endnoload level2 not startnoload
+/copyfontdict
+{
+findfont dup length dict
+copy
+begin
+}bd
+level2 not endnoload
+md/fontname known not{
+/fontname/customfont def
+}if
+/Encoding Z
+/:mre
+{
+copyfontdict
+/Encoding MacEncoding def
+fontname currentdict
+end
+definefont :ff def
+}bd
+/:bsr
+{
+copyfontdict
+/Encoding Encoding 256 array copy def
+Encoding dup
+}bd
+/pd{put dup}bd
+/:esr
+{
+pop pop
+fontname currentdict
+end
+definefont :ff def
+}bd
+/scf
+{
+scalefont def
+}bd
+/scf-non
+{
+$m scale :mf setfont
+}bd
+/ps Z
+/fz{/ps xs}bd
+/sf/setfont ld
+/cF/currentfont ld
+/mbf
+{
+/makeblendedfont where
+{
+pop
+makeblendedfont
+/ABlend exch definefont
+}{
+pop
+}ifelse
+def
+}def
+%%EndFile
+/currentpacking where {pop sc_oldpacking setpacking}if
+end % md
+%%EndProlog
+%%BeginSetup
+md begin
+/pT[1 0 0 -1 29.999 761.009]def/mT[.24 0 0 -.24 29.999 761.009]def
+/sD 16 dict def
+%%IncludeFont: Courier
+/f0_1/Courier :mre
+/f0_58 f0_1 58 scf
+/Courier findfont[10 0 0 -10 0 0]:mf setfont
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+initializepage
+%%EndPageSetup
+gS 0 0 2300 3042 rC
+0 0 :M
+0 setlinecap
+currentscreen
+3 1 roll pop pop 60 45 3 -1 roll setscreen
+np 38 38 :M
+52 96 :L
+38 96 :L
+23 96 :L
+38 38 :L
+eofill
+-4 -4 40 265 4 4 36 94 @b
+np 1613 263 :M
+1554 277 :L
+1554 263 :L
+1554 248 :L
+1613 263 :L
+4 lw
+eofill
+36 265 -4 4 1556 261 4 36 261 @a
+36 261 :M
+2 setlinecap
+8 lw
+44 263 :M
+71.332 234.996 97.498 217.497 122.5 210.5 :C
+147.498 203.497 167.664 202.83 183 208.5 :C
+198.331 214.164 216.496 209.33 237.5 194 :C
+258.497 178.664 277.995 165.498 296 154.5 :C
+313.996 143.498 331.995 140.664 350 146 :C
+367.995 151.331 382.494 157.497 393.5 164.5 :C
+404.494 171.498 419.16 173.664 437.5 171 :C
+455.827 168.331 471.826 173.83 485.5 187.5 :C
+499.159 201.164 519.991 210.83 548 216.5 :C
+575.992 222.163 595.491 222.997 606.5 219 :C
+617.491 214.997 640.323 226.163 675 252.5 :C
+709.657 278.83 735.655 296.495 753 305.5 :C
+770.322 314.495 791.821 321.328 817.5 326 :C
+843.154 330.662 866.486 324.995 887.5 309 :C
+908.487 292.995 928.985 287.829 949 293.5 :C
+968.986 299.162 985.318 300.329 998 297 :C
+1010.652 293.662 1027.984 289.162 1050 283.5 :C
+1071.984 277.829 1110.316 270.996 1165 263 :C
+stroke
+1083 275 :M
+0 setlinecap
+np 38 638 :M
+52 696 :L
+38 696 :L
+23 696 :L
+38 638 :L
+eofill
+-4 -4 40 865 4 4 36 694 @b
+np 1613 863 :M
+1554 877 :L
+1554 863 :L
+1554 848 :L
+1613 863 :L
+4 lw
+eofill
+36 865 -4 4 1556 861 4 36 861 @a
+36 861 :M
+2 setlinecap
+8 lw
+344 863 :M
+371.328 834.987 397.493 817.488 422.5 810.5 :C
+447.494 803.488 467.659 802.821 483 808.5 :C
+498.326 814.154 516.492 809.321 537.5 794 :C
+558.492 778.654 577.991 765.489 596 754.5 :C
+613.991 743.488 631.99 740.655 650 746 :C
+667.99 751.322 682.489 757.488 693.5 764.5 :C
+704.489 771.488 719.155 773.655 737.5 771 :C
+755.822 768.322 771.821 773.821 785.5 787.5 :C
+799.155 801.155 819.987 810.821 848 816.5 :C
+875.987 822.154 895.486 822.988 906.5 819 :C
+917.486 814.987 940.318 826.153 975 852.5 :C
+1009.652 878.821 1035.65 896.486 1053 905.5 :C
+1070.317 914.486 1091.816 921.319 1117.5 926 :C
+1143.15 930.653 1166.482 924.986 1187.5 909 :C
+1208.482 892.986 1228.981 887.82 1249 893.5 :C
+1268.981 899.153 1285.313 900.32 1298 897 :C
+1310.647 893.653 1327.979 889.153 1350 883.5 :C
+1371.98 877.82 1410.312 870.987 1465 863 :C
+stroke
+1383 875 :M
+0 setlinecap
+np 338 525 :M
+268 542 :L
+268 525 :L
+268 508 :L
+338 525 :L
+eofill
+37 529 -8 8 272 521 8 37 521 @a
+-4 -4 40 565 4 4 36 486 @b
+-4 -4 340 565 4 4 336 486 @b
+39 375 :M
+f0_58 sf
+-.187(snd)A
+1 G
+71 492 171 62 rF
+72 538 :M
+0 G
+(shift)S
+30 975 :M
+-.019(\(shift-time snd shift\))A
+endp
+%%Trailer
+end % md
+%%EOF
diff --git a/docsrc/nyquist/test.ps b/docsrc/nyquist/test.ps
new file mode 100644
index 0000000..7d35dc5
--- /dev/null
+++ b/docsrc/nyquist/test.ps
@@ -0,0 +1,1020 @@
+%!PS-Adobe-2.0
+%%Title: test.mss
+%%DocumentFonts: (atend)
+%%Creator: Roger Dannenberg and Scribe 7(1700)
+%%CreationDate: 18 December 1996 16:16
+%%Pages: (atend)
+%%EndComments
+% PostScript Prelude for Scribe.
+/BS {/SV save def 0.0 792.0 translate .01 -.01 scale} bind def
+/ES {showpage SV restore} bind def
+/SC {setrgbcolor} bind def
+/FMTX matrix def
+/RDF {WFT SLT 0.0 eq
+ {SSZ 0.0 0.0 SSZ neg 0.0 0.0 FMTX astore}
+ {SSZ 0.0 SLT neg sin SLT cos div SSZ mul SSZ neg 0.0 0.0 FMTX astore}
+ ifelse makefont setfont} bind def
+/SLT 0.0 def
+/SI { /SLT exch cvr def RDF} bind def
+/WFT /Courier findfont def
+/SF { /WFT exch findfont def RDF} bind def
+/SSZ 1000.0 def
+/SS { /SSZ exch 100.0 mul def RDF} bind def
+/AF { /WFT exch findfont def /SSZ exch 100.0 mul def RDF} bind def
+/MT /moveto load def
+/XM {currentpoint exch pop moveto} bind def
+/UL {gsave newpath moveto dup 2.0 div 0.0 exch rmoveto
+ setlinewidth 0.0 rlineto stroke grestore} bind def
+/LH {gsave newpath moveto setlinewidth
+ 0.0 rlineto
+ gsave stroke grestore} bind def
+/LV {gsave newpath moveto setlinewidth
+ 0.0 exch rlineto
+ gsave stroke grestore} bind def
+/BX {gsave newpath moveto setlinewidth
+ exch
+ dup 0.0 rlineto
+ exch 0.0 exch neg rlineto
+ neg 0.0 rlineto
+ closepath
+ gsave stroke grestore} bind def
+/BX1 {grestore} bind def
+/BX2 {setlinewidth 1 setgray stroke grestore} bind def
+/PB {/PV save def newpath 3 -1 roll sub translate
+ 100.0 -100.0 scale /showpage {} def} bind def
+/PE {PV restore} bind def
+/GB {/PV save def newpath translate rotate
+ div dup scale 100.0 -100.0 scale
+ /showpage {} def
+ /letter {} def
+ /lettersmall {} def
+ /note {} def
+ } bind def
+/GE {PV restore} bind def
+/FB {dict dup /FontMapDict exch def begin} bind def
+/FM {cvn exch cvn exch def} bind def
+/FE {end /original-findfont /findfont load def /findfont
+ {dup FontMapDict exch known{FontMapDict exch get} if
+ original-findfont} def} bind def
+/BC {gsave moveto dup 0 exch rlineto exch 0 rlineto neg 0 exch rlineto closepath clip} bind def
+/EC /grestore load def
+/SH /show load def
+/MX {exch show 0.0 rmoveto} bind def
+/W {0 32 4 -1 roll widthshow} bind def
+/WX {0 32 5 -1 roll widthshow 0.0 rmoveto} bind def
+/RC {100.0 -100.0 scale
+612.0 0.0 translate
+-90.0 rotate
+.01 -.01 scale} bind def
+/URC {100.0 -100.0 scale
+90.0 rotate
+-612.0 0.0 translate
+.01 -.01 scale} bind def
+/RCC {100.0 -100.0 scale
+0.0 -792.0 translate 90.0 rotate
+.01 -.01 scale} bind def
+/URCC {100.0 -100.0 scale
+-90.0 rotate 0.0 792.0 translate
+.01 -.01 scale} bind def
+
+
+% Scribe Systems version of LaserPrep v5.2
+% All lines added/changed by Scribe Systems contain "%UNI"
+%
+%{appledict version #65
+% CopyRight Apple Computer, Inc. 1984,1985,1986,1987 All Rights Reserved.
+systemdict/currentpacking known{currentpacking true setpacking}if
+/LW{save statusdict/product get(LaserWriter)anchorsearch
+exch pop{length 0 eq{1}{2}ifelse}{0}ifelse exch restore}bind def
+/LW+{LW 2 eq}bind def
+/ok{systemdict/statusdict known dup{LW 0 gt and}if}bind def
+%UNI ok{statusdict begin 9 sccinteractive 3 ne exch 0 ne or{9 0 3 setsccinteractive}if end}if
+/md 250 dict def md begin
+/av 65 def
+/T true def
+/F false def
+/mtx matrix def
+/s75 75 string def
+/s8 8 string def
+/s1 ( ) def
+/pxs 1 def
+/pys 1 def
+1 0 mtx defaultmatrix dtransform exch atan/pa exch def
+/nlw .24 def
+/ppr [-32 -29.52 762 582.48] def % default printable page rectangle
+/pgs 1 def
+/por true def
+/xb 500 array def
+/so true def
+/fillflag false def
+/pnm 1 def
+/fmv true def
+/sfl false def
+/ma 0 def
+/invertflag false def
+/xflip false def
+/yflip false def
+/noflips true def
+/scaleby96 false def
+/fNote true def
+/fBitStretch true def
+/fg (Rvd\001\001\000\000\177) def
+/bdf{bind def}bind def
+/xdf{exch def}bdf
+/xl{neg exch neg translate}bdf
+/fp{pnsh 0 ne pnsv 0 ne and}bdf
+/nop{}bdf/lnop[/nop load]cvx bdf
+/vrb[
+{fp{gsave 1 setlinewidth pnsh pnsv scale stroke grestore}if newpath}bind
+/eofill load
+dup
+/newpath load
+2 index
+dup
+{clip newpath}bind
+{}bind
+dup
+2 copy
+]def
+currentscreen/spf xdf/rot xdf/freq xdf
+/doop{vrb exch get exec}bdf
+
+% psu - page setup called at begining of page
+% args: smooth, por, bbs1, bbs2, bbey, bbex, scale, dpix, dpiy, pgs,
+% invert, xflip, yflip, scaleby96, fBitStretch, fNote
+%
+% smooth is T if smoothing was selected in page setup, else F
+% por is T for portrait orientation, F for landscape
+% bbs2 seems to be offset for start of image area (in 72nds of an inch)
+% bbs1 seems to be offset for start of image area (in 72nds of an inch)
+% bbey is length (or end?) of printable area in 72nd of an inch
+% bbex is width (or end?) of printable area in 72nd of an inch
+% dpix is dots per inch of coordinate system
+% dpiy is dots per inch of coordinate system
+% scale is scale factor selected in page setup
+% pgs is a small integer denoting paper cassette type (legal, a4, etc.)
+% invert is T to reverse black/white
+% xflip is T to rotate image horizontally
+% yflip is T to rotate image vertically
+% scaleby96 is T if "Precision Bitmap Graphics" requested
+% fBitStretch is T if "Faster Bitmap Printing" requested
+% fNote is T to use small imageable region, F to use large
+/psu{ pop
+ /fNote xdf
+ /fBitStretch xdf
+ /scaleby96 xdf
+ pop F %UNI force yflip off
+ /yflip xdf
+ pop F %UNI force xflip off
+ /xflip xdf
+ pop F %UNI force black/white reversing off
+ /invertflag xdf
+ xflip yflip or{/noflips false def}if
+ /pgs xdf % set pgs
+ 2 index % get copy of scale
+ .72 mul exch div /pys xdf % pys = (.72 * scale) / dpiy
+ % S: smooth por bbs1 bbs2 bbey bbex scale dpix
+ div .72 mul /pxs xdf % pxs = .72 * (scale / dpix)
+ 2 index pxs mul 4 index pys mul neg translate %UNI xlate for scribe
+ ppr astore pop % put "bbs1 bbs2 bbey bbex" into ppr
+ pop T %UNI force portrait on
+ /por xdf % set por
+ pop F %UNI force smooth request off
+ sn and /so xdf % set "so" T if smooth req'd AND avail in LW
+}bdf
+
+/txpose{
+%UNI don't change paper type
+%UNI fNote{smalls}{bigs}ifelse pgs get exec
+ pxs pys scale
+ ppr aload pop
+ por
+ {
+ noflips{pop exch neg exch translate pop 1 -1 scale}if
+ xflip yflip and{
+ pop exch neg exch translate
+ 180 rotate
+ 1 -1 scale
+ ppr 3 get
+ ppr 1 get neg sub neg
+ ppr 2 get
+ ppr 0 get neg sub neg
+ translate
+ }if
+ xflip yflip not and{
+ pop exch neg exch translate pop
+ 180 rotate
+ ppr 3 get
+ ppr 1 get neg sub neg 0
+ translate
+ }if
+ yflip xflip not and{
+ ppr 1 get neg
+ ppr 0 get neg
+ translate
+ }if
+ }
+ {
+ noflips{translate pop pop 270 rotate 1 -1 scale}if
+ xflip yflip and{
+ translate pop pop
+ 90 rotate
+ 1 -1 scale
+ ppr 3 get
+ ppr 1 get neg sub neg
+ ppr 2 get
+ ppr 0 get neg sub neg
+ translate
+ }if
+ xflip yflip not and{
+ translate
+ pop pop 90 rotate
+ ppr 3 get
+ ppr 1 get neg sub neg 0
+ translate
+ }if
+ yflip xflip not and{
+ translate
+ pop pop 270 rotate
+ ppr 2 get
+ ppr 0 get neg sub neg 0 exch
+ translate
+ }if
+ }
+ ifelse
+ %UNI statusdict begin waittimeout 300 lt{/waittimeout 300 def}if end
+ scaleby96{
+ ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy
+ translate
+ .96 dup scale
+ neg exch neg exch translate
+ }if
+}bdf
+
+/fr{3 index 3 index xl ppr aload pop 3 -1 roll 2 mul add 3 1 roll exch 2 mul add
+6 2 roll 3 -1 roll sub 3 1 roll exch sub 3 1 roll exch 3 -1 roll div 3 1 roll div exch scale}bdf
+/lws{show}bdf
+/tv{show pop pop}bdf
+/obl{{0.212557 mul}{pop 0}ifelse}bdf
+/sfd{ps fg 5 -1 roll get mul 100 div 0 ps 5 -1 roll obl ps neg 0 0 6a astore makefont setfont}bdf
+/fnt{findfont sfd}bdf
+/bt{sa 3 1 roll 3 index and put}bdf
+/sa(\000\000\000\000\000\000\000\000\000\000)def
+/fs{0 1 bt 1 2 bt 2 4 bt 3 8 bt 4 16 bt 5 32 bt 6 64 bt 7 128 bt sa exch 8 exch put}bdf
+/mx1 matrix def
+/mx2 matrix def
+/mx3 matrix def
+/bu{currentpoint currentgray currentlinewidth currentlinecap currentlinejoin currentdash exch aload length
+fg 5 sfl{1}{0}ifelse put pnsv pnsh
+2t aload pop 3a aload pop mx2 aload pop mx1 aload pop mtx currentmatrix aload pop
+mx3 aload pop ps pm restore/ps xdf mx3 astore pop}bdf
+/bn{/pm save def mx3 setmatrix newpath 0 0 moveto ct dup 39 get 0 exch getinterval cvx exec
+mtx astore setmatrix mx1 astore pop mx2 astore pop 3a astore pop
+2t astore pop/pnsh xdf/pnsv xdf gw
+/sfl fg 5 get 0 ne def array astore exch setdash setlinejoin setlinecap
+setlinewidth setgray moveto}bdf
+/fc{save vmstatus exch sub 50000 lt
+{(%%[|0|]%%)=print flush}if pop restore}bdf
+/tc{32768 div add 3 1 roll 32768 div add 2t astore pop}bdf
+/3a [0 0 0] def
+/2t 2 array def
+/tp{3a astore pop}bdf
+/tt{mx2 currentmatrix pop currentpoint 2 copy 2t aload pop qa 2 copy translate 3a aload pop exch dup 0 eq
+{pop}{1 eq{-1 1}{1 -1}ifelse scale}ifelse rotate pop neg exch neg exch translate moveto}bdf
+/te{mx2 setmatrix}bdf
+/th{3 -1 roll div 3 1 roll exch div 2 copy mx1 scale pop scale/sfl true def}bdf
+/tu{1 1 mx1 itransform scale/sfl false def}bdf
+/ts{1 1 mx1 transform scale/sfl true def}bdf
+/fz{/ps xdf}bdf
+/dv{dup 0 ne{div}{pop}ifelse}bdf
+/pop4{pop pop pop pop}bdf
+/it{sfl{mx1 itransform}if}bdf
+/gm{exch it moveto}bdf/rm{it rmoveto}bdf
+/lm{currentpoint sfl{mx1 transform}if exch pop sub 0 exch it rmoveto}bdf
+/fm{statusdict/manualfeed known}bdf
+/se{statusdict exch/manualfeed exch put}bdf
+/mf{
+pop %UNI never allow manual feed
+%UNI dup/ma exch def 0 gt{fm se/t1 5 st ok ma 1 gt and{/t2 0 st/t3 0 st statusdict/manualfeedtimeout 3600 put}if}if
+}bdf
+/jn{
+pop %UNI don't set job name
+%UNI /statusdict where exch pop{statusdict exch/jobname exch put}if
+}bdf
+/pen{pnm mul/pnsh xdf pnm mul/pnsv xdf pnsh setlinewidth}bdf
+/min{2 copy gt{exch}if pop}bdf
+/max{2 copy lt{exch}if pop}bdf
+/dh{fg 6 1 put array astore exch pop exch pop exch setdash}bdf
+/ih[currentdash]def
+/rh{fg 6 0 put ih aload pop setdash}bdf
+/dl{gsave nlw pys div setlinewidth 0 setgray}bdf
+/dlin{exch currentpoint currentlinewidth 2 div dup
+translate newpath moveto lineto currentpoint stroke grestore moveto}bdf
+/lin{fg 6 get 0 ne{exch lineto currentpoint 0 doop moveto}
+{exch currentpoint/pnlv xdf/pnlh xdf gsave newpath/@1 xdf/@2 xdf fp{pnlh @2 lt{pnlv @1 ge
+{pnlh pnlv moveto @2 @1 lineto pnsh 0 rlineto
+0 pnsv rlineto pnlh pnsh add pnlv pnsv add lineto pnsh neg 0 rlineto}
+{pnlh pnlv moveto pnsh 0 rlineto @2 pnsh add @1 lineto 0 pnsv rlineto
+pnsh neg 0 rlineto pnlh pnlv pnsv add lineto}ifelse}{pnlv @1 gt
+{@2 @1 moveto pnsh 0 rlineto pnlh pnsh add pnlv lineto 0 pnsv rlineto
+pnsh neg 0 rlineto @2 @1 pnsv add lineto}{pnlh pnlv moveto pnsh 0 rlineto
+0 pnsv rlineto @2 pnsh add @1 pnsv add lineto pnsh neg 0 rlineto
+0 pnsv neg rlineto}ifelse}ifelse
+closepath fill}if @2 @1 grestore moveto}ifelse}bdf
+/gw{/pnm fg 3 get fg 4 get div def}bdf
+/lw{fg exch 4 exch put fg exch 3 exch put gw pnsv pnsh pen}bdf
+/barc{/@1 xdf/@2 xdf/@3 xdf/@4 xdf/@5 xdf
+/@6 xdf/@7 xdf/@8 xdf gsave
+@5 @7 add 2 div @6 @8 add 2 div translate newpath 0 0 moveto
+@5 @7 sub @6 @8 sub mtx currentmatrix pop scale @1{newpath}if
+0 0 0.5 @4 @3 arc @4 @3 sub abs 360 ge{closepath}if
+mtx setmatrix @2 doop grestore}bdf
+/ar{dup 0 eq barc}bdf
+/ov{0 exch 360 exch true barc}bdf
+/rc{/@t xdf currentpoint 6 2 roll newpath 4 copy 4 2 roll exch moveto
+6 -1 roll lineto lineto lineto closepath @t doop moveto}bdf
+/mup{dup pnsh 2 div le exch pnsv 2 div le or}bdf
+/rr{/@1 xdf 2. div/@2 xdf 2. div/@3 xdf
+/@4 xdf/@5 xdf/@6 xdf/@7 xdf
+@7 @5 eq @6 @4 eq @2 mup or or{@7 @6 @5 @4 @1 rc}
+{@4 @6 sub 2. div dup @2 lt{/@2 xdf}{pop}ifelse
+@5 @7 sub 2. div dup @2 lt{/@2 xdf}{pop}ifelse
+@1 0 eq{/@2 @2 pnsh 2 div 2 copy gt{sub def}{0 pop4}ifelse}if
+currentpoint newpath
+@4 @6 add 2. div @7 moveto
+@4 @7 @4 @5 @2 arcto pop4
+@4 @5 @6 @5 @2 arcto pop4
+@6 @5 @6 @7 @2 arcto pop4
+@6 @7 @4 @7 @2 arcto pop4
+closepath @1 doop moveto}ifelse}bdf
+/pr{gsave newpath/pl{exch moveto/pl{exch lineto}def}def}bdf
+/pl{exch lineto}bdf
+/ep{dup 0 eq{{moveto}{exch lin}{}{(%%[|1|]%%)= flush}pathforall
+pop grestore}{doop grestore}ifelse currentpoint newpath moveto}bdf
+/gr{64. div setgray}bdf
+/pat{s8 copy pop 9.375 pa por not{90 add}if{1 add 4 mul cvi s8 exch get exch 1 add 4 mul cvi 7 sub bitshift 1 and}setscreen gr}bdf
+/sg{freq rot/spf load setscreen gr}bdf
+/dc{transform round .5 sub exch round .5 sub exch itransform}bdf
+/sn{userdict/smooth4 known}bdf
+/x8{3 bitshift}bdf
+/x4{2 bitshift}bdf
+/d4{-2 bitshift}bdf
+/d8{-3 bitshift}bdf
+/rb{15 add -4 bitshift 1 bitshift}bdf
+/db{/@7 save def/@1 xdf/@2 xdf/@3 xdf/@4 xdf/@5 xdf/@6 @5 @3 4 add mul def
+dc translate scale/xdbit 1 1 idtransform abs/ydbit exch def abs def{0 0 1 ydbit add 1 10 rc clip}if
+@1 0 eq @1 4 eq or{1 setgray ydbit 0 1 ydbit add 1 2 rc}if
+@1 3 eq @1 7 eq or{1}{0}ifelse setgray/@9 @1 0 eq @1 1 eq @1 3 eq or or invertflag xor def/@13 @6 def
+@2 fBitStretch or{/@10 @4 x4 def/@11 @3 x4 def/@12 @10 rb def/@13 @12 @11 mul def/@15 1 1 dtransform abs/calcY 1 index def round cvi/@14 exch def
+abs/calcX 1 index def round cvi scaleby96 not{1 add}if def/@16 @15 rb def/@17 @16 @14 mul def}if
+sn @13 60000 lt and @2 fBitStretch or and{mtx currentmatrix dup 1 get exch 2 get 0. eq exch 0. eq and @17 60000 lt and fBitStretch and{@16 3 bitshift @14 @9 [calcX 0 0 calcY 0 0]{@17 string @13 string
+currentfile @6 string readhexstring pop 1 index @4 @3 @5 @12 @2 smooth4
+@10 @11 @12 dup string 5 index @15 @14 @16 dup string stretch}imagemask}{@12 x8 @11 @9 [@10 0 0 @11 0 0]{@13 string
+currentfile @6 string readhexstring pop 1 index @4 @3 @5 @12 @2 smooth4}imagemask}ifelse}{@5 3 bitshift @3 4 add @9 [@4 0 0 @3 0 2]{currentfile @6 string readhexstring pop}imagemask}ifelse
+@7 restore}bdf
+/wd 16 dict def
+/mfont 14 dict def
+/mdf{mfont wcheck not{/mfont 14 dict def}if mfont begin xdf end}bdf
+/cf{{1 index/FID ne{def}{pop pop}ifelse}forall}bdf
+/rf{/@1 exch def/@2 exch def
+FontDirectory @2 known{cleartomark pop}{findfont dup begin dup length @1 add dict begin
+cf {/Encoding macvec def}{Encoding dup length array copy/Encoding exch def
+counttomark 2 idiv{Encoding 3 1 roll put}repeat}ifelse
+pop
+exec currentdict end end @2 exch definefont pop}ifelse}bdf
+/bmbc{exch begin wd begin
+/cr xdf
+save
+CharTable cr 6 mul 6 getinterval{}forall
+/bitheight xdf/bitwidth xdf
+.96 div/width xdf
+Gkernmax add/XOffset xdf Gdescent add/YOffset xdf/rowbytes xdf
+rowbytes 255 eq{0 0 0 0 0 0 setcachedevice}
+{Gnormsize dup scale
+width 0 XOffset YOffset bitwidth XOffset add bitheight YOffset add
+setcachedevice
+rowbytes 0 ne{
+XOffset YOffset translate newpath 0 0 moveto
+bitwidth bitheight scale
+sn{
+/xSmt bitwidth x4 def
+/ySmt bitheight x4 def
+/rSmt xSmt rb def
+rSmt x8 ySmt true
+[xSmt 0 0 ySmt neg 0 ySmt]
+{rSmt ySmt mul string CharData cr get
+1 index bitwidth bitheight rowbytes rSmt so smooth4}
+}{rowbytes 3 bitshift bitheight 4 add true
+[bitwidth 0 0 bitheight neg 0 bitheight 2 add]
+{CharData cr get}
+}ifelse
+imagemask
+}if
+}ifelse
+restore
+end end
+}bdf
+/bb{.96 exch div/Gnormsize mdf 2 index
+/Gkernmax mdf 1 index/Gdescent mdf
+3 index div 4 1 roll
+2 index div 1. 5 2 roll
+exch div 4 1 roll
+4 array astore/FontBBox mdf
+}bdf
+/cdf{mfont/CharData get 3 1 roll put}bdf
+/bf{
+mfont begin
+/FontType 3 def
+/FontMatrix [1 0 0 1 0 0] def
+/Encoding macvec def
+/BuildChar/bmbc load def
+end
+mfont definefont pop
+}bdf
+/wi LW 1 eq{{gsave 0 0 0 0 0 0 0 0 moveto lineto lineto lineto closepath clip stringwidth grestore}bind}{/stringwidth load}ifelse def
+/aps{0 get 124 eq}bdf
+/xc{s75 cvs dup}bdf
+/xp{put cvn}bdf
+/scs{xc 3 67 put dup 0 95 xp}bdf
+/sos{xc 3 79 xp}bdf
+/sbs{xc 1 66 xp}bdf
+/sis{xc 2 73 xp}bdf
+/sob{xc 2 79 xp}bdf
+/sss{xc 4 83 xp}bdf
+/dd{exch 1 index add 3 1 roll add exch}bdf
+/smc{moveto dup lws}bdf
+/kwn{FontDirectory 1 index known{findfont exch pop}}bdf
+/gl{1 currentgray sub setgray}bdf
+/mm{/mfont 10 dict def mfont begin
+/FontMatrix [1 0 0 1 0 0] def
+/FontType 3 def
+/Encoding macvec def
+/df 4 index findfont def
+/FontBBox [0 0 1 1] def
+/xda xdf/mbc xdf
+/BuildChar{wd begin/cr xdf/fd xdf/cs s1 dup 0 cr put def fd/mbc get exec end}def
+exec end mfont definefont}bdf
+/ac{dup scs kwn{exch findfont dup length 1 add dict begin
+cf fmv{/Encoding macvec def}if/StrokeWidth nlw 1000 mul pys div ps div dup 12 lt{pop 12}if def
+/PaintType 2 def currentdict /UniqueID known{/UniqueID UniqueID 16#A80000 xor def}if currentdict end definefont}ifelse}bdf
+/mb{dup sbs kwn{exch{pop}{bbc}{}mm}ifelse sfd}bdf
+/mo{dup sos kwn{exch{pop}{boc}{}mm}ifelse sfd}bdf
+/ms{dup sss kwn{exch{pop}{bsc}{}mm}ifelse sfd}bdf
+/ou{dup sos kwn{exch dup ac pop{scs findfont /df2 xdf}{aoc}{}mm}ifelse sfd}bdf
+/su{dup sss kwn{exch dup ac pop{scs findfont /df2 xdf}{asc}{}mm}ifelse sfd}bdf
+/ao{/fmv true def ou}bdf/as{/fmv true def su}bdf
+/vo{/fmv false def ou}bdf/vs{/fmv false def su}bdf
+/bbc{/da .03 def fd/df get setfont
+gsave cs wi 1 index 0 ne{exch da add exch}if grestore setcharwidth
+cs 0 0 smc da 0 smc da da smc 0 da moveto lws}bdf
+/boc{/da 1 ps div def fd/df get setfont
+gsave cs wi 1 index 0 ne{exch da add exch}if grestore setcharwidth
+cs 0 0 smc da 0 smc da da smc 0 da smc gl da 2. div dup moveto lws}bdf
+/bsc{/da 1 ps div def
+/ds .05 def/da2 da 2. div def fd/df get setfont
+gsave cs wi 1 index 0 ne{exch ds add da2 add exch}if grestore setcharwidth
+cs ds da2 add .01 add 0 smc 0 ds da2 sub translate 0 0 smc
+da 0 smc da da smc 0 da smc gl da 2. div dup moveto lws}bdf
+/aoc{fd/df get setfont
+gsave cs wi grestore setcharwidth
+gl cs 0 0 smc fd/df2 get setfont gl 0 0 moveto lws}bdf
+/asc{/da .05 def fd/df get setfont
+gsave cs wi 1 index 0 ne{exch da add exch}if grestore setcharwidth
+cs da .01 add 0 smc 0 da translate gl 0 0 smc gl fd/df2 get setfont 0 0 moveto lws}bdf
+/st{1000 mul usertime add dup 2147483647 gt{2147483647 sub}if def}bdf
+/the{usertime sub dup 0 lt exch -2147483648 gt and}bdf
+/6a 6 array def
+/2a 2 array def
+/3q 3 array def
+/qs{3 -1 roll sub exch 3 -1 roll sub exch}bdf
+/qa{3 -1 roll add exch 3 -1 roll add exch}bdf
+/qm{3 -1 roll 1 index mul 3 1 roll mul}bdf
+/qn{6a exch get mul}bdf
+/qA .166667 def/qB .833333 def/qC .5 def
+/qx{6a astore pop
+qA 0 qn qB 2 qn add qA 1 qn qB 3 qn add
+qB 2 qn qA 4 qn add qB 3 qn qA 5 qn add
+qC 2 qn qC 4 qn add qC 3 qn qC 5 qn add}bdf
+/qp{6 copy 12 -2 roll pop pop}bdf
+/qc{exch qp qx curveto}bdf
+/qi{{exch 4 copy 2a astore aload pop qa .5 qm newpath moveto}{exch 2 copy 6 -2 roll 2 qm qs 4 2 roll}ifelse}bdf
+/qq{{qc 2a aload pop qx curveto}{exch 4 copy qs qa qx curveto}ifelse}bdf
+/pt{currentpoint newpath moveto}bdf
+/qf{/fillflag true def}bdf
+/ec{1 and 0 ne{0 doop}if grestore currentpoint newpath moveto/fillflag false def}bdf
+/eu{currentpoint fp{0 ep}{grestore newpath}ifelse moveto/fillflag false def}bdf
+/bp{currentpoint newpath 2 copy moveto}bdf
+/ef{gsave fillflag{gsave eofill grestore}if}bdf
+/sm{0 exch{@1 eq{1 add}if}forall}bdf
+/lshow{4 1 roll exch/@1 exch def{1 index wi pop sub 1 index sm dv 0 @1 4 -1 roll widthshow}{1 index wi pop sub
+1 index dup sm 10 mul exch length 1 sub add dv dup 10. mul 0 @1 4 -1 roll 0 6 -1 roll awidthshow}ifelse}bdf
+/setTxMode{sa 9 2 index put 3 eq{1}{0}ifelse setgray}bdf
+/SwToSym{{}mark false/Symbol/|______Symbol 0 rf 0 sa 6 get 0 ne{pop 1}{sa 7 get 0 eq{pop 2}if}ifelse
+sa 1 get 0 ne/|______Symbol
+sa 4 get 0 ne{vs}{sa 3 get 0 ne{vo}{fnt}ifelse}ifelse}bdf
+/mc{0 3 1 roll transform neg exch pop}bdf
+/ul{dup 0 ne sa 2 get 0 ne and{gsave 0 0
+/UnderlinePosition kif{mc}{ps -10 div}ifelse/UnderlineThickness kif{mc}{ps 15 div}ifelse
+abs setlinewidth neg rmoveto
+sa 4 get 0 ne{gsave currentlinewidth 2. div dup rmoveto currentpoint newpath moveto
+2 copy rlineto stroke grestore}if
+sa 3 get sa 4 get or 0 ne{gsave gl 2 copy rlineto stroke grestore rlineto strokepath nlw pys div setlinewidth}{rlineto}ifelse
+stroke grestore}{pop}ifelse}bdf
+/sgt{2 copy known{get true}{pop pop false}ifelse}bdf
+/kif{currentfont dup/FontMatrix get exch/FontInfo sgt{true}{currentfont/df sgt
+{dup/FontInfo sgt{3 1 roll/FontMatrix get mtx concatmatrix exch true}{pop pop pop false}
+ifelse}{pop pop false}ifelse}ifelse{3 -1 roll sgt{exch true}{pop false}ifelse}{false}ifelse}bdf
+/blank/Times-Roman findfont/CharStrings get/space get def
+/macvec 256 array def
+/NUL/SOH/STX/ETX/EOT/ENQ/ACK/BEL/BS/HT/LF/VT/FF/CR/SO/SI
+/DLE/DC1/DC2/DC3/DC4/NAK/SYN/ETB/CAN/EM/SUB/ESC/FS/GS/RS/US
+macvec 0 32 getinterval astore pop
+macvec 32/Times-Roman findfont/Encoding get
+32 96 getinterval putinterval macvec dup 39/quotesingle put 96/grave put
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/notequal/AE/Oslash
+/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
+/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash
+/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
+/guillemotright/ellipsis/blank/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
+/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand/Acircumflex/Ecircumflex/Aacute
+/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave/Oacute/Ocircumflex
+/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+macvec 128 128 getinterval astore pop
+{}mark true/Courier/|______Courier 0 rf
+{/Metrics 21 dict begin/zero 600 def/one 600 def/two 600 def/three 600 def/four 600 def/five 600 def/six 600 def/seven 600 def/eight 600 def
+/nine 600 def/comma 600 def/period 600 def/dollar 600 def/numbersign 600 def/percent 600 def/plus 600 def/hyphen 600 def/E 600 def/parenleft 600 def/parenright 600 def/space 600 def
+currentdict end def currentdict/UniqueID known{/UniqueID 16#800000 def}if/FontBBox FontBBox 4 array astore def}mark true/Helvetica/|______Seattle 1 rf
+/oldsettransfer/settransfer load def
+/concatprocs{/proc2 exch cvlit def/proc1 exch cvlit def/newproc proc1 length proc2 length add array def
+newproc 0 proc1 putinterval newproc proc1 length proc2 putinterval newproc cvx}def
+/settransfer{currenttransfer concatprocs oldsettransfer}def
+/PaintBlack{{1 exch sub}settransfer gsave newpath clippath 1 setgray fill grestore}def
+/od{(Rvd\001\001\000\000\177) fg copy pop txpose
+1 0 mtx defaultmatrix dtransform exch atan/pa exch def
+newpath clippath mark
+{transform{itransform moveto}}{transform{itransform lineto}}
+{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform
+{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}
+{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put
+10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack}if}bdf
+/cd{}bdf
+/op{/sfl false def/pm save def}bdf
+
+% two args, booleans
+/cp{
+%UNI don't actually print page
+ pop pop %UNI ignore two args
+%UNI not{userdict/#copies 0 put}if
+%UNI ma 0 gt{{t1 the{exit}if}loop}if
+%UNI {copypage}{showpage}ifelse
+ pm restore
+}bdf
+/px{0 3 1 roll tp tt}bdf
+/psb{/us save def}bdf
+/pse{us restore}bdf
+/ct 40 string def
+/nc{currentpoint initclip newpath gc{dup type dup/arraytype eq exch/packedarraytype eq or{exec}if}
+forall clip newpath moveto}bdf
+/kp{ct 0 2 index length 2 index 39 2 index put getinterval copy cvx exec mx3 currentmatrix pop}bdf
+end % dict "md"
+
+%UNI don't initialize LaserWriter
+%UNI LW 1 eq userdict/a4small known not and{/a4small
+%UNI [[300 72 div 0 0 -300 72 div -120 3381]
+%UNI 280 3255
+%UNI {statusdict/jobstate (printing) put 0 setblink
+%UNI margins
+%UNI exch 196 add exch 304 add 8 div round cvi frametoroket
+%UNI statusdict/jobstate (busy) put
+%UNI 1 setblink}
+%UNI /framedevice load
+%UNI 60 45{dup mul exch dup mul add 1.0 exch sub}/setscreen load
+%UNI {}/settransfer load/initgraphics load/erasepage load]cvx
+%UNI statusdict begin bind end readonly def}if
+%UNI md begin/bigs[lnop lnop/legal load userdict/a4 known{/a4 load}{lnop}ifelse lnop lnop lnop lnop lnop]def
+%UNI /smalls[lnop userdict/note known{/note load}{dup}ifelse lnop userdict/a4small known{/a4small load}{lnop}ifelse 2 index lnop lnop lnop lnop ]def end
+systemdict/currentpacking known{setpacking}if
+%UNI currentfile ok userdict/stretch known not and{eexec}{flushfile}ifelse
+
+%%EndProlog
+%%Page: 0 1
+BS
+0 SI
+16 /Times-Bold AF
+22526 20648 MT
+(Nyquist Reference Manual)SH
+11 SS
+29022 22993 MT
+(Version 2.0)SH
+26562 26761 MT
+(Roger B. Dannenberg)SH
+/Times-Roman SF
+27496 28138 MT
+(18 December 1996)SH
+25509 39635 MT
+(Carnegie Mellon University)SH
+25371 41387 MT
+(School of Computer Science)SH
+25140 43139 MT
+(Pittsburgh, PA 15213, U.S.A.)SH
+ES
+%%Page: 1 2
+BS
+0 SI
+10 /Times-Roman AF
+31430 4286 MT
+(1)SH
+11 SS
+9280 7955 MT
+(.)SH
+ES
+%%Page: iii 3
+BS
+0 SI
+8 /Times-Roman AF
+8280 4286 MT
+(PREFACE)SH
+10 SS
+52052 XM
+(Page iii)SH
+16 /Times-Bold AF
+8280 8272 MT
+(Preface)SH
+11 /Times-Roman AF
+9280 9649 MT
+(This manual is a guide for users of Nyquist, a)
+51 W( language for composition and sound synthesis. Nyquist)50 W
+8280 11026 MT
+(grew out of a series)
+75 W( of research projects, notably the languages Arctic and Canon. Along with Nyquist,)76 W
+8280 12403 MT
+(these languages promote a functional style of programming and incorporate time into the language)261 W
+8280 13780 MT
+(semantics.)SH
+9280 16259 MT
+(Please help by noting any errors,)
+267 W( omissions, or suggestions you may have. You can send your)268 W
+8280 17636 MT
+(suggestions to Dannenberg@CS.CMU.EDU \050internet\051 via computer mail, or by campus mail to Roger)147 W
+8280 19013 MT
+(B. Dannenberg, School of Computer Science, or by)
+138 W( ordinary mail to Roger B. Dannenberg, School of)139 W
+8280 20390 MT
+(Computer Science, Carnegie Mellon University, 5000 Forbes Ave., Pittsburgh, PA 15213-3890, USA.)SH
+9280 22869 MT
+(Nyquist is a successor to Fugue, a language originally implemented by Chris Fraley,)
+78 W( and extended by)77 W
+8280 24246 MT
+(George Polly and Roger Dannenberg. Peter Velikonja and Dean Rubine)
+210 W( were early users, and they)211 W
+8280 25623 MT
+(proved the value as well as discovered some early problems of the system.)
+221 W( This)
+715 W( led to Nyquist, a)220 W
+8280 27000 MT
+(reimplementation of Fugue by Roger Dannenberg with help from Joe Newcomer and Cliff Mercer.)SH
+9280 29479 MT
+(I also wish to acknowledge support from CMU, Yamaha, and IBM for this work.)SH
+ES
+%%Page: iv 4
+BS
+0 SI
+10 /Times-Roman AF
+6120 4286 MT
+(Page iv)SH
+8 SS
+45696 XM
+(NYQUIST MANUAL)SH
+11 SS
+6120 44577 MT
+(.)SH
+ES
+%%Page: 1 5
+BS
+0 SI
+8 /Times-Roman AF
+8280 4286 MT
+(NYQUIST FUNCTIONS)SH
+10 SS
+52386 XM
+(Page 1)SH
+16 /Times-Bold AF
+8280 8272 MT
+(1. Nyquist Functions)SH
+14 SS
+8280 12090 MT
+(1.1. Behaviors)SH
+12 SS
+8280 15774 MT
+(1.1.1. Sound Synthesis)SH
+11 /Times-Roman AF
+9280 17151 MT
+(These functions provide musically interesting)
+74 W( creation behaviors that react to their environment; these)75 W
+8280 18528 MT
+(are the ``unit generators'' of Nyquist:)SH
+/Courier SF
+8280 20476 MT
+(\050sound-warp)SH
+/Times-Italic SF
+16200 XM
+(warp-fn signal)385 W
+/Courier SF
+23694 XM
+([)SH
+/Times-Italic SF
+(wrate)SH
+/Courier SF
+(]\051)SH
+/Times-Roman SF
+11880 21672 MT
+(Applies a warp function)50 W
+/Times-Italic SF
+22954 XM
+(warp-fn)SH
+/Times-Roman SF
+26763 XM
+(to)SH
+/Times-Italic SF
+27944 XM
+(signal)SH
+/Times-Roman SF
+30959 XM
+(using function composition. If)
+50 W( the optional parameter)51 W
+/Times-Italic SF
+11880 22868 MT
+(wrate)SH
+/Times-Roman SF
+14742 XM
+(is omitted or NIL,)
+81 W( linear interpolation is used.)80 W
+/Times-Italic SF
+36210 XM
+(warp-fn)SH
+/Times-Roman SF
+40049 XM
+(is a mapping from score \050logical\051)80 W
+11880 24064 MT
+(time to real)
+39 W( time, and)40 W
+/Times-Italic SF
+21732 XM
+(signal)SH
+/Times-Roman SF
+24737 XM
+(is a function from score time to real values. The result is a function)40 W
+11880 25260 MT
+(from real time to real values at a sample rate of)SH
+/Courier SF
+32923 XM
+(*sound-srate*)SH
+/Times-Roman SF
+(. See)
+275 W( also)SH
+/Courier SF
+46238 XM
+(control-warp)SH
+/Times-Roman SF
+(.)SH
+11880 26456 MT
+(If)SH
+/Times-Italic SF
+13004 XM
+(wrate)SH
+/Times-Roman SF
+15902 XM
+(is not NIL, it)
+117 W( must be a number. The parameter indicates that high-quality resampling)116 W
+11880 27652 MT
+(should be used and specifies the sample rate for the inverse of)94 W
+/Times-Italic SF
+40558 XM
+(warp-fn)SH
+/Times-Roman SF
+(. Use the lowest)
+94 W( number)95 W
+11880 28848 MT
+(you can. \050See below for)
+109 W( details.\051 Note that high-quality resampling is much slower than linear)108 W
+11880 30044 MT
+(interpolation.)SH
+11880 31240 MT
+(To perform)
+138 W( high-quality resampling by a fixed ratio, as opposed to a variable ratio allowed in)139 W
+/Courier SF
+11880 32436 MT
+(sound-warp)SH
+/Times-Roman SF
+(, use)249 W
+/Courier SF
+21269 XM
+(scale-srate)SH
+/Times-Roman SF
+29053 XM
+(to stretch)
+249 W( or shrink the sound, and then)248 W
+/Courier SF
+48421 XM
+(resample)SH
+/Times-Roman SF
+54224 XM
+(to)SH
+11880 33632 MT
+(restore the original sample rate.)SH
+/Courier SF
+11880 36265 MT
+(Sound-warp)SH
+/Times-Roman SF
+18783 XM
+(and)SH
+/Courier SF
+20674 XM
+(control-warp)SH
+/Times-Roman SF
+28897 XM
+(both take the inverse of)28 W
+/Times-Italic SF
+39636 XM
+(warp-fn)SH
+/Times-Roman SF
+43423 XM
+(to get a function)
+28 W( from real)29 W
+11880 37461 MT
+(time to score time. Each sample of this inverse)
+33 W( is thus a score time;)32 W
+/Times-Italic SF
+42183 XM
+(signal)SH
+/Times-Roman SF
+45180 XM
+(is evaluated at each of)32 W
+11880 38657 MT
+(these score times to yield a value, which is)
+17 W( the desired result. The sample rate of the inverse warp)18 W
+11880 39853 MT
+(function is somewhat arbitrary. With linear interpolation, the inverse warp function sample rate is)17 W
+11880 41049 MT
+(taken to be the output sample rate. Note,)
+63 W( however, that the samples of the inverse warp function)64 W
+11880 42245 MT
+(are stored as 32-bit floats, so they have limited precision. Since)
+171 W( these floats represent sample)170 W
+11880 43441 MT
+(times, rounding can)
+190 W( be a problem. Rounding in this case is equivalent to adding jitter to the)191 W
+11880 44637 MT
+(sample times. Nyquist ignores this problem for ordinary)
+110 W( warping, but for high-quality warping,)109 W
+11880 45833 MT
+(the jitter cannot be ignored.)SH
+11880 47029 MT
+(The solution is to use a)
+59 W( rather low sample rate for the inverse warp function.)60 W
+/Courier SF
+46619 XM
+(Sound-warp)SH
+/Times-Roman SF
+53554 XM
+(can)SH
+11880 48225 MT
+(then linearly interpolate this signal using double-precision floats to minimize jitter between)275 W
+11880 49421 MT
+(samples. The)
+205 W( sample rate is a compromise: a low sample rate minimizes jitter, while a high)206 W
+11880 50617 MT
+(sample rate)
+76 W( does a better job of capturing detail \050e.g. rapid fluctuations\051 in the warp function. A)75 W
+11880 51813 MT
+(good rule of thumb is to use at)
+69 W( most 1,000 to 10,000 samples for the inverse warp function. For)70 W
+11880 53009 MT
+(example, if the result will be 1 minute of sound, use a sample rate of 3000 samples / 60)
+9 W( seconds =)8 W
+11880 54205 MT
+(50 samples/second. Because Nyquist has no advance information about)
+153 W( the warp function, the)154 W
+11880 55401 MT
+(inverse warp function sample rate must be)
+173 W( provided as a parameter. When in doubt, just try)172 W
+11880 56597 MT
+(something and let your ears be the judge.)SH
+/Courier SF
+8280 58292 MT
+(\050slope)SH
+/Times-Italic SF
+12900 XM
+(signal)SH
+/Courier SF
+(\051)SH
+/Times-Roman SF
+11880 59488 MT
+(Computes the first derivative \050slope\051 of)100 W
+/Times-Italic SF
+30076 XM
+(signal)SH
+/Times-Roman SF
+(. The)
+475 W( start time, sample rate,)
+100 W( etc. are taken from)99 W
+/Times-Italic SF
+11880 60684 MT
+(signal)SH
+/Times-Roman SF
+(.)SH
+ES
+%%Page: 2 6
+BS
+0 SI
+10 /Times-Roman AF
+6120 4286 MT
+(Page 2)SH
+8 SS
+45696 XM
+(NYQUIST MANUAL)SH
+ES
+%%Page: 3 7
+BS
+0 SI
+8 /Times-Roman AF
+8280 4286 MT
+(INDEX)SH
+10 SS
+52386 XM
+(Page 3)SH
+16 /Times-Bold AF
+8280 8272 MT
+(Index)SH
+8 /Times-Roman AF
+8280 10469 MT
+(Behaviors 1)400 W
+8280 12317 MT
+(Errors iii)400 W
+8280 14165 MT
+(Omissions iii)400 W
+8280 16013 MT
+(Slope, derivative, first derivative)
+SH( 1)400 W
+8280 16937 MT
+(Sound-warp 1)400 W
+8280 17861 MT
+(Suggestions iii)400 W
+ES
+%%Page: 4 8
+BS
+0 SI
+10 /Times-Roman AF
+6120 4286 MT
+(Page 4)SH
+8 SS
+45696 XM
+(NYQUIST MANUAL)SH
+ES
+%%Page: i 9
+BS
+0 SI
+8 /Times-Roman AF
+8280 4286 MT
+(TABLE OF CONTENTS)SH
+10 SS
+52608 XM
+(Page i)SH
+16 /Times-Bold AF
+25591 8272 MT
+(Table of Contents)SH
+12 SS
+8280 9796 MT
+(Preface)SH
+54078 XM
+(iii)SH
+8280 11320 MT
+(1. Nyquist Functions)SH
+54480 XM
+(1)SH
+10 SS
+9780 12710 MT
+(1.1. Behaviors)SH
+54580 XM
+(1)SH
+11780 13790 MT
+(1.1.1. Sound Synthesis)SH
+54580 XM
+(1)SH
+12 SS
+8280 15314 MT
+(Index)SH
+54480 XM
+(3)SH
+ES
+%%Trailer
+%%Pages: 9
+%%DocumentFonts: Times-Roman Times-Bold Courier Times-Italic
diff --git a/docsrc/nyquist/warpfig.ps b/docsrc/nyquist/warpfig.ps
new file mode 100644
index 0000000..10015cd
--- /dev/null
+++ b/docsrc/nyquist/warpfig.ps
@@ -0,0 +1,650 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 31 334 444 752
+%%Title: (warpfig-Layer#1)
+%%Creator: (MacDraw II 1.1v2: LaserWriter 8 8.1.1)
+%%CreationDate: (10:26 PM Sunday, January 24, 1904)
+%%For: (Dannenberg)
+%%Pages: 1
+%%DocumentFonts: Helvetica
+%%DocumentNeededFonts: Helvetica
+%%DocumentSuppliedFonts:
+%%DocumentData: Clean7Bit
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%ADO_PaperArea: -129 -125 3171 2425
+%ADO_ImageableArea: 0 0 3042 2300
+%%EndComments
+/md 153 dict def md begin
+/currentpacking where {pop /sc_oldpacking currentpacking def true setpacking}if
+%%BeginFile: adobe_psp_basic
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/bd{bind def}bind def
+/xdf{exch def}bd
+/xs{exch store}bd
+/ld{load def}bd
+/Z{0 def}bd
+/T/true
+/F/false
+/:L/lineto
+/lw/setlinewidth
+/:M/moveto
+/rl/rlineto
+/rm/rmoveto
+/:C/curveto
+/:T/translate
+/:K/closepath
+/:mf/makefont
+/gS/gsave
+/gR/grestore
+/np/newpath
+14{ld}repeat
+/$m matrix def
+/av 81 def
+/por true def
+/normland false def
+/psb-nosave{}bd
+/pse-nosave{}bd
+/us Z
+/psb{/us save store}bd
+/pse{us restore}bd
+/level2
+/languagelevel where
+{
+pop languagelevel 2 ge
+}{
+false
+}ifelse
+def
+/featurecleanup
+{
+stopped
+cleartomark
+countdictstack exch sub dup 0 gt
+{
+{end}repeat
+}{
+pop
+}ifelse
+}bd
+/noload Z
+/startnoload
+{
+{/noload save store}if
+}bd
+/endnoload
+{
+{noload restore}if
+}bd
+level2 startnoload
+/setjob
+{
+statusdict/jobname 3 -1 roll put
+}bd
+/setcopies
+{
+userdict/#copies 3 -1 roll put
+}bd
+level2 endnoload level2 not startnoload
+/setjob
+{
+1 dict begin/JobName xdf currentdict end setuserparams
+}bd
+/setcopies
+{
+1 dict begin/NumCopies xdf currentdict end setpagedevice
+}bd
+level2 not endnoload
+/pm Z
+/mT Z
+/sD Z
+/realshowpage Z
+/initializepage
+{
+/pm save store mT concat
+}bd
+/endp
+{
+pm restore showpage
+}def
+/$c/DeviceRGB def
+/rectclip where
+{
+pop/rC/rectclip ld
+}{
+/rC
+{
+np 4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+:K
+clip np
+}bd
+}ifelse
+/rectfill where
+{
+pop/rF/rectfill ld
+}{
+/rF
+{
+gS
+np
+4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+fill
+gR
+}bd
+}ifelse
+/rectstroke where
+{
+pop/rS/rectstroke ld
+}{
+/rS
+{
+gS
+np
+4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+:K
+stroke
+gR
+}bd
+}ifelse
+%%EndFile
+%%BeginFile: adobe_psp_colorspace_level1
+%%Copyright: Copyright 1991-1993 Adobe Systems Incorporated. All Rights Reserved.
+/G/setgray ld
+/:F/setrgbcolor ld
+%%EndFile
+%%BeginFile: adobe_psp_uniform_graphics
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/@a
+{
+np :M 0 rl :L 0 exch rl 0 rl :L fill
+}bd
+/@b
+{
+np :M 0 rl 0 exch rl :L 0 rl 0 exch rl fill
+}bd
+/arct where
+{
+pop
+}{
+/arct
+{
+arcto pop pop pop pop
+}bd
+}ifelse
+/x1 Z
+/x2 Z
+/y1 Z
+/y2 Z
+/rad Z
+/@q
+{
+/rad xs
+/y2 xs
+/x2 xs
+/y1 xs
+/x1 xs
+np
+x2 x1 add 2 div y1 :M
+x2 y1 x2 y2 rad arct
+x2 y2 x1 y2 rad arct
+x1 y2 x1 y1 rad arct
+x1 y1 x2 y1 rad arct
+fill
+}bd
+/@s
+{
+/rad xs
+/y2 xs
+/x2 xs
+/y1 xs
+/x1 xs
+np
+x2 x1 add 2 div y1 :M
+x2 y1 x2 y2 rad arct
+x2 y2 x1 y2 rad arct
+x1 y2 x1 y1 rad arct
+x1 y1 x2 y1 rad arct
+:K
+stroke
+}bd
+/@i
+{
+np 0 360 arc fill
+}bd
+/@j
+{
+gS
+np
+:T
+scale
+0 0 .5 0 360 arc
+fill
+gR
+}bd
+/@e
+{
+np
+0 360 arc
+:K
+stroke
+}bd
+/@f
+{
+np
+$m currentmatrix
+pop
+:T
+scale
+0 0 .5 0 360 arc
+:K
+$m setmatrix
+stroke
+}bd
+/@k
+{
+gS
+np
+:T
+0 0 :M
+0 0 5 2 roll
+arc fill
+gR
+}bd
+/@l
+{
+gS
+np
+:T
+0 0 :M
+scale
+0 0 .5 5 -2 roll arc
+fill
+gR
+}bd
+/@m
+{
+np
+arc
+stroke
+}bd
+/@n
+{
+np
+$m currentmatrix
+pop
+:T
+scale
+0 0 .5 5 -2 roll arc
+$m setmatrix
+stroke
+}bd
+%%EndFile
+%%BeginFile: adobe_psp_customps
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/$t Z
+/$p Z
+/$s Z
+/$o 1. def
+/2state? false def
+/ps Z
+level2 startnoload
+/pushcolor/currentrgbcolor ld
+/popcolor/setrgbcolor ld
+/setcmykcolor where
+{
+pop/currentcmykcolor where
+{
+pop/pushcolor/currentcmykcolor ld
+/popcolor/setcmykcolor ld
+}if
+}if
+level2 endnoload level2 not startnoload
+/pushcolor
+{
+currentcolorspace $c eq
+{
+currentcolor currentcolorspace true
+}{
+currentcmykcolor false
+}ifelse
+}bd
+/popcolor
+{
+{
+setcolorspace setcolor
+}{
+setcmykcolor
+}ifelse
+}bd
+level2 not endnoload
+/pushstatic
+{
+ps
+2state?
+$o
+$t
+$p
+$s
+}bd
+/popstatic
+{
+/$s xs
+/$p xs
+/$t xs
+/$o xs
+/2state? xs
+/ps xs
+}bd
+/pushgstate
+{
+save errordict/nocurrentpoint{pop 0 0}put
+currentpoint
+3 -1 roll restore
+pushcolor
+currentlinewidth
+currentlinecap
+currentlinejoin
+currentdash exch aload length
+np clippath pathbbox
+$m currentmatrix aload pop
+}bd
+/popgstate
+{
+$m astore setmatrix
+2 index sub exch
+3 index sub exch
+rC
+array astore exch setdash
+setlinejoin
+setlinecap
+lw
+popcolor
+np :M
+}bd
+/bu
+{
+pushgstate
+gR
+pushgstate
+2state?
+{
+gR
+pushgstate
+}if
+pushstatic
+pm restore
+mT concat
+}bd
+/bn
+{
+/pm save store
+popstatic
+popgstate
+gS
+popgstate
+2state?
+{
+gS
+popgstate
+}if
+}bd
+/cpat{pop 64 div G 8{pop}repeat}bd
+%%EndFile
+%%BeginFile: adobe_psp_basic_text
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/S/show ld
+/A{
+0.0 exch ashow
+}bd
+/R{
+0.0 exch 32 exch widthshow
+}bd
+/W{
+0.0 3 1 roll widthshow
+}bd
+/J{
+0.0 32 4 2 roll 0.0 exch awidthshow
+}bd
+/V{
+0.0 4 1 roll 0.0 exch awidthshow
+}bd
+/fcflg true def
+/fc{
+fcflg{
+vmstatus exch sub 50000 lt{
+(%%[ Warning: Running out of memory ]%%\r)print flush/fcflg false store
+}if pop
+}if
+}bd
+/$f[1 0 0 -1 0 0]def
+/:ff{$f :mf}bd
+/MacEncoding StandardEncoding 256 array copy def
+MacEncoding 39/quotesingle put
+MacEncoding 96/grave put
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/notequal/AE/Oslash
+/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
+/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash
+/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
+/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
+/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
+/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave
+/Oacute/Ocircumflex/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+MacEncoding 128 128 getinterval astore pop
+level2 startnoload
+/copyfontdict
+{
+findfont dup length dict
+begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+}bd
+level2 endnoload level2 not startnoload
+/copyfontdict
+{
+findfont dup length dict
+copy
+begin
+}bd
+level2 not endnoload
+md/fontname known not{
+/fontname/customfont def
+}if
+/Encoding Z
+/:mre
+{
+copyfontdict
+/Encoding MacEncoding def
+fontname currentdict
+end
+definefont :ff def
+}bd
+/:bsr
+{
+copyfontdict
+/Encoding Encoding 256 array copy def
+Encoding dup
+}bd
+/pd{put dup}bd
+/:esr
+{
+pop pop
+fontname currentdict
+end
+definefont :ff def
+}bd
+/scf
+{
+scalefont def
+}bd
+/scf-non
+{
+$m scale :mf setfont
+}bd
+/ps Z
+/fz{/ps xs}bd
+/sf/setfont ld
+/cF/currentfont ld
+/mbf
+{
+/makeblendedfont where
+{
+pop
+makeblendedfont
+/ABlend exch definefont
+}{
+pop
+}ifelse
+def
+}def
+%%EndFile
+%%BeginFile: adobe_psp_dashes
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/:q/setdash ld
+/:r{
+np
+:M
+:L
+stroke
+}bd
+/nodash[]def
+/qdenddash
+{
+nodash 0 setdash
+}bd
+%%EndFile
+/currentpacking where {pop sc_oldpacking setpacking}if
+end % md
+%%EndProlog
+%%BeginSetup
+md begin
+/pT[1 0 0 -1 29.999 761.009]def/mT[.24 0 0 -.24 29.999 761.009]def
+/sD 16 dict def
+%%IncludeFont: Helvetica
+/f0_1/Helvetica :mre
+/f1_1 f0_1 1.04 scf
+/f1_58 f1_1 58 scf
+/Courier findfont[10 0 0 -10 0 0]:mf setfont
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+initializepage
+%%EndPageSetup
+gS 0 0 2300 3042 rC
+0 0 :M
+0 setlinecap
+currentscreen
+3 1 roll pop pop 60 45 3 -1 roll setscreen
+np 113 38 :M
+127 96 :L
+113 96 :L
+98 96 :L
+113 38 :L
+eofill
+-4 -4 115 1652 4 4 111 94 @b
+np 1725 1650 :M
+1666 1665 :L
+1666 1650 :L
+1666 1635 :L
+1725 1650 :L
+4 lw
+eofill
+111 1652 -4 4 1668 1648 4 111 1648 @a
+111 1648 :M
+2 setlinecap
+8 lw
+113 1650 :M
+237.663 1449.978 300 1350 300 1350 :C
+300 1350 362.492 1324.981 487.5 1275 :C
+612.494 1224.98 675 1200 675 1200 :C
+675 1200 706.321 1149.985 769 1050 :C
+831.655 949.983 863 900 863 900 :C
+863 900 987.979 774.994 1238 525 :C
+1487.983 274.99 1613 150 1613 150 :C
+1613 150 1613 399.982 1613 900 :C
+1613 1399.99 1613 1650 1613 1650 :C
+stroke
+1613 1650 :M
+0 setlinecap
+-4 -4 302 1690 4 4 298 1648 @b
+-4 -4 490 1690 4 4 486 1648 @b
+-4 -4 677 1690 4 4 673 1648 @b
+-4 -4 865 1690 4 4 861 1648 @b
+-4 -4 1052 1690 4 4 1048 1648 @b
+-4 -4 1240 1690 4 4 1236 1648 @b
+-4 -4 1427 1690 4 4 1423 1648 @b
+-4 -4 1615 1690 4 4 1611 1648 @b
+-4 -4 115 1690 4 4 111 1648 @b
+93 1754 :M
+f1_58 sf
+(0)S
+280 1754 :M
+(1)S
+468 1754 :M
+(2)S
+655 1754 :M
+(3)S
+843 1754 :M
+(4)S
+1030 1754 :M
+(5)S
+1218 1754 :M
+(6)S
+1405 1754 :M
+(7)S
+1593 1754 :M
+(8)S
+73 152 -4 4 115 148 4 73 148 @a
+73 340 -4 4 115 336 4 73 336 @a
+73 527 -4 4 115 523 4 73 523 @a
+73 715 -4 4 115 711 4 73 711 @a
+73 902 -4 4 115 898 4 73 898 @a
+73 1090 -4 4 115 1086 4 73 1086 @a
+73 1277 -4 4 115 1273 4 73 1273 @a
+73 1465 -4 4 115 1461 4 73 1461 @a
+73 1652 -4 4 115 1648 4 73 1648 @a
+18 1679 :M
+(0)S
+18 1491 :M
+(1)S
+18 1304 :M
+(2)S
+18 1116 :M
+(3)S
+18 929 :M
+(4)S
+18 741 :M
+(5)S
+18 554 :M
+(6)S
+18 366 :M
+(7)S
+18 179 :M
+(8)S
+4 lw
+[16.667 12.5 ] 0 :q
+863 900 113 900 :r
+863 1650 863 900 :r
+endp
+%%Trailer
+end % md
+%%EOF
diff --git a/docsrc/nyquist/warpnotesfig.ps b/docsrc/nyquist/warpnotesfig.ps
new file mode 100644
index 0000000..8757149
--- /dev/null
+++ b/docsrc/nyquist/warpnotesfig.ps
@@ -0,0 +1,851 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 31 670 426 755
+%%Title: (warpnotesfig-Layer#1)
+%%Creator: (MacDraw II 1.1v2: LaserWriter 8 8.1.1)
+%%CreationDate: (10:27 PM Sunday, January 24, 1904)
+%%For: (Dannenberg)
+%%Pages: 1
+%%DocumentFonts: Helvetica
+%%DocumentNeededFonts: Helvetica
+%%DocumentSuppliedFonts:
+%%DocumentData: Clean7Bit
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%ADO_PaperArea: -129 -125 3171 2425
+%ADO_ImageableArea: 0 0 3042 2300
+%%EndComments
+/md 149 dict def md begin
+/currentpacking where {pop /sc_oldpacking currentpacking def true setpacking}if
+%%BeginFile: adobe_psp_basic
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/bd{bind def}bind def
+/xdf{exch def}bd
+/xs{exch store}bd
+/ld{load def}bd
+/Z{0 def}bd
+/T/true
+/F/false
+/:L/lineto
+/lw/setlinewidth
+/:M/moveto
+/rl/rlineto
+/rm/rmoveto
+/:C/curveto
+/:T/translate
+/:K/closepath
+/:mf/makefont
+/gS/gsave
+/gR/grestore
+/np/newpath
+14{ld}repeat
+/$m matrix def
+/av 81 def
+/por true def
+/normland false def
+/psb-nosave{}bd
+/pse-nosave{}bd
+/us Z
+/psb{/us save store}bd
+/pse{us restore}bd
+/level2
+/languagelevel where
+{
+pop languagelevel 2 ge
+}{
+false
+}ifelse
+def
+/featurecleanup
+{
+stopped
+cleartomark
+countdictstack exch sub dup 0 gt
+{
+{end}repeat
+}{
+pop
+}ifelse
+}bd
+/noload Z
+/startnoload
+{
+{/noload save store}if
+}bd
+/endnoload
+{
+{noload restore}if
+}bd
+level2 startnoload
+/setjob
+{
+statusdict/jobname 3 -1 roll put
+}bd
+/setcopies
+{
+userdict/#copies 3 -1 roll put
+}bd
+level2 endnoload level2 not startnoload
+/setjob
+{
+1 dict begin/JobName xdf currentdict end setuserparams
+}bd
+/setcopies
+{
+1 dict begin/NumCopies xdf currentdict end setpagedevice
+}bd
+level2 not endnoload
+/pm Z
+/mT Z
+/sD Z
+/realshowpage Z
+/initializepage
+{
+/pm save store mT concat
+}bd
+/endp
+{
+pm restore showpage
+}def
+/$c/DeviceRGB def
+/rectclip where
+{
+pop/rC/rectclip ld
+}{
+/rC
+{
+np 4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+:K
+clip np
+}bd
+}ifelse
+/rectfill where
+{
+pop/rF/rectfill ld
+}{
+/rF
+{
+gS
+np
+4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+fill
+gR
+}bd
+}ifelse
+/rectstroke where
+{
+pop/rS/rectstroke ld
+}{
+/rS
+{
+gS
+np
+4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+:K
+stroke
+gR
+}bd
+}ifelse
+%%EndFile
+%%BeginFile: adobe_psp_colorspace_level1
+%%Copyright: Copyright 1991-1993 Adobe Systems Incorporated. All Rights Reserved.
+/G/setgray ld
+/:F/setrgbcolor ld
+%%EndFile
+%%BeginFile: adobe_psp_uniform_graphics
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/@a
+{
+np :M 0 rl :L 0 exch rl 0 rl :L fill
+}bd
+/@b
+{
+np :M 0 rl 0 exch rl :L 0 rl 0 exch rl fill
+}bd
+/arct where
+{
+pop
+}{
+/arct
+{
+arcto pop pop pop pop
+}bd
+}ifelse
+/x1 Z
+/x2 Z
+/y1 Z
+/y2 Z
+/rad Z
+/@q
+{
+/rad xs
+/y2 xs
+/x2 xs
+/y1 xs
+/x1 xs
+np
+x2 x1 add 2 div y1 :M
+x2 y1 x2 y2 rad arct
+x2 y2 x1 y2 rad arct
+x1 y2 x1 y1 rad arct
+x1 y1 x2 y1 rad arct
+fill
+}bd
+/@s
+{
+/rad xs
+/y2 xs
+/x2 xs
+/y1 xs
+/x1 xs
+np
+x2 x1 add 2 div y1 :M
+x2 y1 x2 y2 rad arct
+x2 y2 x1 y2 rad arct
+x1 y2 x1 y1 rad arct
+x1 y1 x2 y1 rad arct
+:K
+stroke
+}bd
+/@i
+{
+np 0 360 arc fill
+}bd
+/@j
+{
+gS
+np
+:T
+scale
+0 0 .5 0 360 arc
+fill
+gR
+}bd
+/@e
+{
+np
+0 360 arc
+:K
+stroke
+}bd
+/@f
+{
+np
+$m currentmatrix
+pop
+:T
+scale
+0 0 .5 0 360 arc
+:K
+$m setmatrix
+stroke
+}bd
+/@k
+{
+gS
+np
+:T
+0 0 :M
+0 0 5 2 roll
+arc fill
+gR
+}bd
+/@l
+{
+gS
+np
+:T
+0 0 :M
+scale
+0 0 .5 5 -2 roll arc
+fill
+gR
+}bd
+/@m
+{
+np
+arc
+stroke
+}bd
+/@n
+{
+np
+$m currentmatrix
+pop
+:T
+scale
+0 0 .5 5 -2 roll arc
+$m setmatrix
+stroke
+}bd
+%%EndFile
+%%BeginFile: adobe_psp_customps
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/$t Z
+/$p Z
+/$s Z
+/$o 1. def
+/2state? false def
+/ps Z
+level2 startnoload
+/pushcolor/currentrgbcolor ld
+/popcolor/setrgbcolor ld
+/setcmykcolor where
+{
+pop/currentcmykcolor where
+{
+pop/pushcolor/currentcmykcolor ld
+/popcolor/setcmykcolor ld
+}if
+}if
+level2 endnoload level2 not startnoload
+/pushcolor
+{
+currentcolorspace $c eq
+{
+currentcolor currentcolorspace true
+}{
+currentcmykcolor false
+}ifelse
+}bd
+/popcolor
+{
+{
+setcolorspace setcolor
+}{
+setcmykcolor
+}ifelse
+}bd
+level2 not endnoload
+/pushstatic
+{
+ps
+2state?
+$o
+$t
+$p
+$s
+}bd
+/popstatic
+{
+/$s xs
+/$p xs
+/$t xs
+/$o xs
+/2state? xs
+/ps xs
+}bd
+/pushgstate
+{
+save errordict/nocurrentpoint{pop 0 0}put
+currentpoint
+3 -1 roll restore
+pushcolor
+currentlinewidth
+currentlinecap
+currentlinejoin
+currentdash exch aload length
+np clippath pathbbox
+$m currentmatrix aload pop
+}bd
+/popgstate
+{
+$m astore setmatrix
+2 index sub exch
+3 index sub exch
+rC
+array astore exch setdash
+setlinejoin
+setlinecap
+lw
+popcolor
+np :M
+}bd
+/bu
+{
+pushgstate
+gR
+pushgstate
+2state?
+{
+gR
+pushgstate
+}if
+pushstatic
+pm restore
+mT concat
+}bd
+/bn
+{
+/pm save store
+popstatic
+popgstate
+gS
+popgstate
+2state?
+{
+gS
+popgstate
+}if
+}bd
+/cpat{pop 64 div G 8{pop}repeat}bd
+%%EndFile
+%%BeginFile: adobe_psp_basic_text
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/S/show ld
+/A{
+0.0 exch ashow
+}bd
+/R{
+0.0 exch 32 exch widthshow
+}bd
+/W{
+0.0 3 1 roll widthshow
+}bd
+/J{
+0.0 32 4 2 roll 0.0 exch awidthshow
+}bd
+/V{
+0.0 4 1 roll 0.0 exch awidthshow
+}bd
+/fcflg true def
+/fc{
+fcflg{
+vmstatus exch sub 50000 lt{
+(%%[ Warning: Running out of memory ]%%\r)print flush/fcflg false store
+}if pop
+}if
+}bd
+/$f[1 0 0 -1 0 0]def
+/:ff{$f :mf}bd
+/MacEncoding StandardEncoding 256 array copy def
+MacEncoding 39/quotesingle put
+MacEncoding 96/grave put
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/notequal/AE/Oslash
+/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
+/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash
+/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
+/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
+/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
+/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave
+/Oacute/Ocircumflex/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+MacEncoding 128 128 getinterval astore pop
+level2 startnoload
+/copyfontdict
+{
+findfont dup length dict
+begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+}bd
+level2 endnoload level2 not startnoload
+/copyfontdict
+{
+findfont dup length dict
+copy
+begin
+}bd
+level2 not endnoload
+md/fontname known not{
+/fontname/customfont def
+}if
+/Encoding Z
+/:mre
+{
+copyfontdict
+/Encoding MacEncoding def
+fontname currentdict
+end
+definefont :ff def
+}bd
+/:bsr
+{
+copyfontdict
+/Encoding Encoding 256 array copy def
+Encoding dup
+}bd
+/pd{put dup}bd
+/:esr
+{
+pop pop
+fontname currentdict
+end
+definefont :ff def
+}bd
+/scf
+{
+scalefont def
+}bd
+/scf-non
+{
+$m scale :mf setfont
+}bd
+/ps Z
+/fz{/ps xs}bd
+/sf/setfont ld
+/cF/currentfont ld
+/mbf
+{
+/makeblendedfont where
+{
+pop
+makeblendedfont
+/ABlend exch definefont
+}{
+pop
+}ifelse
+def
+}def
+%%EndFile
+/currentpacking where {pop sc_oldpacking setpacking}if
+end % md
+%%EndProlog
+%%BeginSetup
+md begin
+/pT[1 0 0 -1 29.999 761.009]def/mT[.24 0 0 -.24 29.999 761.009]def
+/sD 16 dict def
+%%IncludeFont: Helvetica
+/f0_1/Helvetica :mre
+/f1_1 f0_1 1.04 scf
+/f1_50 f1_1 50 scf
+/Courier findfont[10 0 0 -10 0 0]:mf setfont
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+initializepage
+%%EndPageSetup
+gS 0 0 2300 3042 rC
+0 0 :M
+0 setlinecap
+currentscreen
+3 1 roll pop pop 60 45 3 -1 roll setscreen
+2 setlinecap
+.75 G
+1013 52.5 :M
+1062.985 68.166 1088 76 1088 76 :C
+1088 76 1062.985 83.832 1013 99.5 :C
+962.984 115.165 938 123 938 123 :C
+938 123 938 107.332 938 76 :C
+938 44.665 938 29 938 29 :C
+938 29 962.984 36.832 1013 52.5 :C
+8 lw
+:K
+gS
+eofill
+gR
+0 G
+stroke
+938 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+1163 52.5 :M
+1212.983 68.166 1238 76 1238 76 :C
+1238 76 1212.983 83.832 1163 99.5 :C
+1112.982 115.165 1088 123 1088 123 :C
+1088 123 1088 107.332 1088 76 :C
+1088 44.665 1088 29 1088 29 :C
+1088 29 1112.982 36.832 1163 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+1088 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+1313 52.5 :M
+1362.98 68.166 1388 76 1388 76 :C
+1388 76 1362.98 83.832 1313 99.5 :C
+1262.98 115.165 1238 123 1238 123 :C
+1238 123 1238 107.332 1238 76 :C
+1238 44.665 1238 29 1238 29 :C
+1238 29 1262.98 36.832 1313 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+1238 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+1463 52.5 :M
+1512.978 68.166 1538 76 1538 76 :C
+1538 76 1512.978 83.832 1463 99.5 :C
+1412.977 115.165 1388 123 1388 123 :C
+1388 123 1388 107.332 1388 76 :C
+1388 44.665 1388 29 1388 29 :C
+1388 29 1412.977 36.832 1463 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+1388 29 :M
+0 setlinecap
+np 1650 263 :M
+1591 277 :L
+1591 263 :L
+1591 248 :L
+1650 263 :L
+eofill
+36 265 -4 4 1593 261 4 36 261 @a
+-4 -4 415 302 4 4 411 261 @b
+-4 -4 602 302 4 4 598 261 @b
+-4 -4 790 302 4 4 786 261 @b
+-4 -4 977 302 4 4 973 261 @b
+-4 -4 1165 302 4 4 1161 261 @b
+-4 -4 1352 302 4 4 1348 261 @b
+-4 -4 1540 302 4 4 1536 261 @b
+18 358 :M
+f1_50 sf
+(0)S
+393 358 :M
+(1)S
+768 358 :M
+(2)S
+1143 358 :M
+(3)S
+1518 358 :M
+(4)S
+4 lw
+1551 358 :M
+2 setlinecap
+.75 G
+919 52.5 :M
+931.653 68.166 938 76 938 76 :C
+938 76 931.653 83.832 919 99.5 :C
+906.319 115.165 900 123 900 123 :C
+900 123 900 107.332 900 76 :C
+900 44.665 900 29 900 29 :C
+900 29 906.319 36.832 919 52.5 :C
+8 lw
+:K
+gS
+eofill
+gR
+0 G
+stroke
+900 29 :M
+0 setlinecap
+-4 -4 227 302 4 4 223 261 @b
+-4 -4 40 302 4 4 36 261 @b
+4 lw
+36 261 :M
+2 setlinecap
+.75 G
+881.5 52.5 :M
+893.82 68.166 900 76 900 76 :C
+900 76 893.82 83.832 881.5 99.5 :C
+869.153 115.165 863 123 863 123 :C
+863 123 863 107.332 863 76 :C
+863 44.665 863 29 863 29 :C
+863 29 869.153 36.832 881.5 52.5 :C
+8 lw
+:K
+gS
+eofill
+gR
+0 G
+stroke
+863 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+844 52.5 :M
+856.654 68.166 863 76 863 76 :C
+863 76 856.654 83.832 844 99.5 :C
+831.32 115.165 825 123 825 123 :C
+825 123 825 107.332 825 76 :C
+825 44.665 825 29 825 29 :C
+825 29 831.32 36.832 844 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+825 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+806.5 52.5 :M
+818.821 68.166 825 76 825 76 :C
+825 76 818.821 83.832 806.5 99.5 :C
+794.154 115.165 788 123 788 123 :C
+788 123 788 107.332 788 76 :C
+788 44.665 788 29 788 29 :C
+788 29 794.154 36.832 806.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+788 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+769 52.5 :M
+781.655 68.166 788 76 788 76 :C
+788 76 781.655 83.832 769 99.5 :C
+756.321 115.165 750 123 750 123 :C
+750 123 750 107.332 750 76 :C
+750 44.665 750 29 750 29 :C
+750 29 756.321 36.832 769 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+750 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+731.5 52.5 :M
+743.822 68.166 750 76 750 76 :C
+750 76 743.822 83.832 731.5 99.5 :C
+719.155 115.165 713 123 713 123 :C
+713 123 713 107.332 713 76 :C
+713 44.665 713 29 713 29 :C
+713 29 719.155 36.832 731.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+713 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+694 52.5 :M
+706.656 68.166 713 76 713 76 :C
+713 76 706.656 83.832 694 99.5 :C
+681.323 115.165 675 123 675 123 :C
+675 123 675 107.332 675 76 :C
+675 44.665 675 29 675 29 :C
+675 29 681.323 36.832 694 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+675 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+656.5 52.5 :M
+668.823 68.166 675 76 675 76 :C
+675 76 668.823 83.832 656.5 99.5 :C
+644.157 115.165 638 123 638 123 :C
+638 123 638 107.332 638 76 :C
+638 44.665 638 29 638 29 :C
+638 29 644.157 36.832 656.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+638 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+113 52.5 :M
+162.999 68.166 188 76 188 76 :C
+188 76 162.999 83.832 113 99.5 :C
+62.998 115.165 38 123 38 123 :C
+38 123 38 107.332 38 76 :C
+38 44.665 38 29 38 29 :C
+38 29 62.998 36.832 113 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+38 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+263 52.5 :M
+312.996 68.166 338 76 338 76 :C
+338 76 312.996 83.832 263 99.5 :C
+212.996 115.165 188 123 188 123 :C
+188 123 188 107.332 188 76 :C
+188 44.665 188 29 188 29 :C
+188 29 212.996 36.832 263 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+188 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+413 52.5 :M
+462.994 68.166 488 76 488 76 :C
+488 76 462.994 83.832 413 99.5 :C
+362.993 115.165 338 123 338 123 :C
+338 123 338 107.332 338 76 :C
+338 44.665 338 29 338 29 :C
+338 29 362.993 36.832 413 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+338 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+563 52.5 :M
+612.992 68.166 638 76 638 76 :C
+638 76 612.992 83.832 563 99.5 :C
+512.991 115.165 488 123 488 123 :C
+488 123 488 107.332 488 76 :C
+488 44.665 488 29 488 29 :C
+488 29 512.991 36.832 563 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+488 29 :M
+0 setlinecap
+endp
+%%Trailer
+end % md
+%%EOF
diff --git a/docsrc/nyquist/warponsetfig.ps b/docsrc/nyquist/warponsetfig.ps
new file mode 100644
index 0000000..76720cf
--- /dev/null
+++ b/docsrc/nyquist/warponsetfig.ps
@@ -0,0 +1,864 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 31 670 426 755
+%%Title: (warponsetfig-Layer#1)
+%%Creator: (MacDraw II 1.1v2: LaserWriter 8 8.1.1)
+%%CreationDate: (10:28 PM Sunday, January 24, 1904)
+%%For: (Dannenberg)
+%%Pages: 1
+%%DocumentFonts: Helvetica
+%%DocumentNeededFonts: Helvetica
+%%DocumentSuppliedFonts:
+%%DocumentData: Clean7Bit
+%%PageOrder: Ascend
+%%Orientation: Portrait
+%ADO_PaperArea: -129 -125 3171 2425
+%ADO_ImageableArea: 0 0 3042 2300
+%%EndComments
+/md 149 dict def md begin
+/currentpacking where {pop /sc_oldpacking currentpacking def true setpacking}if
+%%BeginFile: adobe_psp_basic
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/bd{bind def}bind def
+/xdf{exch def}bd
+/xs{exch store}bd
+/ld{load def}bd
+/Z{0 def}bd
+/T/true
+/F/false
+/:L/lineto
+/lw/setlinewidth
+/:M/moveto
+/rl/rlineto
+/rm/rmoveto
+/:C/curveto
+/:T/translate
+/:K/closepath
+/:mf/makefont
+/gS/gsave
+/gR/grestore
+/np/newpath
+14{ld}repeat
+/$m matrix def
+/av 81 def
+/por true def
+/normland false def
+/psb-nosave{}bd
+/pse-nosave{}bd
+/us Z
+/psb{/us save store}bd
+/pse{us restore}bd
+/level2
+/languagelevel where
+{
+pop languagelevel 2 ge
+}{
+false
+}ifelse
+def
+/featurecleanup
+{
+stopped
+cleartomark
+countdictstack exch sub dup 0 gt
+{
+{end}repeat
+}{
+pop
+}ifelse
+}bd
+/noload Z
+/startnoload
+{
+{/noload save store}if
+}bd
+/endnoload
+{
+{noload restore}if
+}bd
+level2 startnoload
+/setjob
+{
+statusdict/jobname 3 -1 roll put
+}bd
+/setcopies
+{
+userdict/#copies 3 -1 roll put
+}bd
+level2 endnoload level2 not startnoload
+/setjob
+{
+1 dict begin/JobName xdf currentdict end setuserparams
+}bd
+/setcopies
+{
+1 dict begin/NumCopies xdf currentdict end setpagedevice
+}bd
+level2 not endnoload
+/pm Z
+/mT Z
+/sD Z
+/realshowpage Z
+/initializepage
+{
+/pm save store mT concat
+}bd
+/endp
+{
+pm restore showpage
+}def
+/$c/DeviceRGB def
+/rectclip where
+{
+pop/rC/rectclip ld
+}{
+/rC
+{
+np 4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+:K
+clip np
+}bd
+}ifelse
+/rectfill where
+{
+pop/rF/rectfill ld
+}{
+/rF
+{
+gS
+np
+4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+fill
+gR
+}bd
+}ifelse
+/rectstroke where
+{
+pop/rS/rectstroke ld
+}{
+/rS
+{
+gS
+np
+4 2 roll
+:M
+1 index 0 rl
+0 exch rl
+neg 0 rl
+:K
+stroke
+gR
+}bd
+}ifelse
+%%EndFile
+%%BeginFile: adobe_psp_colorspace_level1
+%%Copyright: Copyright 1991-1993 Adobe Systems Incorporated. All Rights Reserved.
+/G/setgray ld
+/:F/setrgbcolor ld
+%%EndFile
+%%BeginFile: adobe_psp_uniform_graphics
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/@a
+{
+np :M 0 rl :L 0 exch rl 0 rl :L fill
+}bd
+/@b
+{
+np :M 0 rl 0 exch rl :L 0 rl 0 exch rl fill
+}bd
+/arct where
+{
+pop
+}{
+/arct
+{
+arcto pop pop pop pop
+}bd
+}ifelse
+/x1 Z
+/x2 Z
+/y1 Z
+/y2 Z
+/rad Z
+/@q
+{
+/rad xs
+/y2 xs
+/x2 xs
+/y1 xs
+/x1 xs
+np
+x2 x1 add 2 div y1 :M
+x2 y1 x2 y2 rad arct
+x2 y2 x1 y2 rad arct
+x1 y2 x1 y1 rad arct
+x1 y1 x2 y1 rad arct
+fill
+}bd
+/@s
+{
+/rad xs
+/y2 xs
+/x2 xs
+/y1 xs
+/x1 xs
+np
+x2 x1 add 2 div y1 :M
+x2 y1 x2 y2 rad arct
+x2 y2 x1 y2 rad arct
+x1 y2 x1 y1 rad arct
+x1 y1 x2 y1 rad arct
+:K
+stroke
+}bd
+/@i
+{
+np 0 360 arc fill
+}bd
+/@j
+{
+gS
+np
+:T
+scale
+0 0 .5 0 360 arc
+fill
+gR
+}bd
+/@e
+{
+np
+0 360 arc
+:K
+stroke
+}bd
+/@f
+{
+np
+$m currentmatrix
+pop
+:T
+scale
+0 0 .5 0 360 arc
+:K
+$m setmatrix
+stroke
+}bd
+/@k
+{
+gS
+np
+:T
+0 0 :M
+0 0 5 2 roll
+arc fill
+gR
+}bd
+/@l
+{
+gS
+np
+:T
+0 0 :M
+scale
+0 0 .5 5 -2 roll arc
+fill
+gR
+}bd
+/@m
+{
+np
+arc
+stroke
+}bd
+/@n
+{
+np
+$m currentmatrix
+pop
+:T
+scale
+0 0 .5 5 -2 roll arc
+$m setmatrix
+stroke
+}bd
+%%EndFile
+%%BeginFile: adobe_psp_customps
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/$t Z
+/$p Z
+/$s Z
+/$o 1. def
+/2state? false def
+/ps Z
+level2 startnoload
+/pushcolor/currentrgbcolor ld
+/popcolor/setrgbcolor ld
+/setcmykcolor where
+{
+pop/currentcmykcolor where
+{
+pop/pushcolor/currentcmykcolor ld
+/popcolor/setcmykcolor ld
+}if
+}if
+level2 endnoload level2 not startnoload
+/pushcolor
+{
+currentcolorspace $c eq
+{
+currentcolor currentcolorspace true
+}{
+currentcmykcolor false
+}ifelse
+}bd
+/popcolor
+{
+{
+setcolorspace setcolor
+}{
+setcmykcolor
+}ifelse
+}bd
+level2 not endnoload
+/pushstatic
+{
+ps
+2state?
+$o
+$t
+$p
+$s
+}bd
+/popstatic
+{
+/$s xs
+/$p xs
+/$t xs
+/$o xs
+/2state? xs
+/ps xs
+}bd
+/pushgstate
+{
+save errordict/nocurrentpoint{pop 0 0}put
+currentpoint
+3 -1 roll restore
+pushcolor
+currentlinewidth
+currentlinecap
+currentlinejoin
+currentdash exch aload length
+np clippath pathbbox
+$m currentmatrix aload pop
+}bd
+/popgstate
+{
+$m astore setmatrix
+2 index sub exch
+3 index sub exch
+rC
+array astore exch setdash
+setlinejoin
+setlinecap
+lw
+popcolor
+np :M
+}bd
+/bu
+{
+pushgstate
+gR
+pushgstate
+2state?
+{
+gR
+pushgstate
+}if
+pushstatic
+pm restore
+mT concat
+}bd
+/bn
+{
+/pm save store
+popstatic
+popgstate
+gS
+popgstate
+2state?
+{
+gS
+popgstate
+}if
+}bd
+/cpat{pop 64 div G 8{pop}repeat}bd
+%%EndFile
+%%BeginFile: adobe_psp_basic_text
+%%Copyright: Copyright 1990-1993 Adobe Systems Incorporated. All Rights Reserved.
+/S/show ld
+/A{
+0.0 exch ashow
+}bd
+/R{
+0.0 exch 32 exch widthshow
+}bd
+/W{
+0.0 3 1 roll widthshow
+}bd
+/J{
+0.0 32 4 2 roll 0.0 exch awidthshow
+}bd
+/V{
+0.0 4 1 roll 0.0 exch awidthshow
+}bd
+/fcflg true def
+/fc{
+fcflg{
+vmstatus exch sub 50000 lt{
+(%%[ Warning: Running out of memory ]%%\r)print flush/fcflg false store
+}if pop
+}if
+}bd
+/$f[1 0 0 -1 0 0]def
+/:ff{$f :mf}bd
+/MacEncoding StandardEncoding 256 array copy def
+MacEncoding 39/quotesingle put
+MacEncoding 96/grave put
+/Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis/Udieresis/aacute
+/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave
+/ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute
+/ograve/ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis
+/dagger/degree/cent/sterling/section/bullet/paragraph/germandbls
+/registered/copyright/trademark/acute/dieresis/notequal/AE/Oslash
+/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff/summation
+/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash
+/questiondown/exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft
+/guillemotright/ellipsis/space/Agrave/Atilde/Otilde/OE/oe
+/endash/emdash/quotedblleft/quotedblright/quoteleft/quoteright/divide/lozenge
+/ydieresis/Ydieresis/fraction/currency/guilsinglleft/guilsinglright/fi/fl
+/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand
+/Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave
+/Oacute/Ocircumflex/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde
+/macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron
+MacEncoding 128 128 getinterval astore pop
+level2 startnoload
+/copyfontdict
+{
+findfont dup length dict
+begin
+{
+1 index/FID ne{def}{pop pop}ifelse
+}forall
+}bd
+level2 endnoload level2 not startnoload
+/copyfontdict
+{
+findfont dup length dict
+copy
+begin
+}bd
+level2 not endnoload
+md/fontname known not{
+/fontname/customfont def
+}if
+/Encoding Z
+/:mre
+{
+copyfontdict
+/Encoding MacEncoding def
+fontname currentdict
+end
+definefont :ff def
+}bd
+/:bsr
+{
+copyfontdict
+/Encoding Encoding 256 array copy def
+Encoding dup
+}bd
+/pd{put dup}bd
+/:esr
+{
+pop pop
+fontname currentdict
+end
+definefont :ff def
+}bd
+/scf
+{
+scalefont def
+}bd
+/scf-non
+{
+$m scale :mf setfont
+}bd
+/ps Z
+/fz{/ps xs}bd
+/sf/setfont ld
+/cF/currentfont ld
+/mbf
+{
+/makeblendedfont where
+{
+pop
+makeblendedfont
+/ABlend exch definefont
+}{
+pop
+}ifelse
+def
+}def
+%%EndFile
+/currentpacking where {pop sc_oldpacking setpacking}if
+end % md
+%%EndProlog
+%%BeginSetup
+md begin
+/pT[1 0 0 -1 29.999 761.009]def/mT[.24 0 0 -.24 29.999 761.009]def
+/sD 16 dict def
+%%IncludeFont: Helvetica
+/f0_1/Helvetica :mre
+/f1_1 f0_1 1.04 scf
+/f1_50 f1_1 50 scf
+/Courier findfont[10 0 0 -10 0 0]:mf setfont
+%%EndSetup
+%%Page: 1 1
+%%BeginPageSetup
+initializepage
+%%EndPageSetup
+gS 0 0 2300 3042 rC
+0 0 :M
+0 setlinecap
+currentscreen
+3 1 roll pop pop 60 45 3 -1 roll setscreen
+np 1650 263 :M
+1591 277 :L
+1591 263 :L
+1591 248 :L
+1650 263 :L
+eofill
+36 265 -4 4 1593 261 4 36 261 @a
+-4 -4 415 302 4 4 411 261 @b
+-4 -4 602 302 4 4 598 261 @b
+-4 -4 790 302 4 4 786 261 @b
+-4 -4 977 302 4 4 973 261 @b
+-4 -4 1165 302 4 4 1161 261 @b
+-4 -4 1352 302 4 4 1348 261 @b
+-4 -4 1540 302 4 4 1536 261 @b
+18 358 :M
+f1_50 sf
+(0)S
+393 358 :M
+(1)S
+768 358 :M
+(2)S
+1143 358 :M
+(3)S
+1518 358 :M
+(4)S
+4 lw
+1551 358 :M
+2 setlinecap
+.75 G
+82.5 52.5 :M
+112.166 68.166 127 76 127 76 :C
+127 76 112.166 83.832 82.5 99.5 :C
+52.832 115.165 38 123 38 123 :C
+38 123 38 107.332 38 76 :C
+38 44.665 38 29 38 29 :C
+38 29 52.832 36.832 82.5 52.5 :C
+8 lw
+:K
+gS
+eofill
+gR
+0 G
+stroke
+38 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+232.5 52.5 :M
+262.163 68.166 277 76 277 76 :C
+277 76 262.163 83.832 232.5 99.5 :C
+202.83 115.165 188 123 188 123 :C
+188 123 188 107.332 188 76 :C
+188 44.665 188 29 188 29 :C
+188 29 202.83 36.832 232.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+188 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+382.5 52.5 :M
+412.161 68.166 427 76 427 76 :C
+427 76 412.161 83.832 382.5 99.5 :C
+352.827 115.165 338 123 338 123 :C
+338 123 338 107.332 338 76 :C
+338 44.665 338 29 338 29 :C
+338 29 352.827 36.832 382.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+338 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+532.5 52.5 :M
+562.159 68.166 577 76 577 76 :C
+577 76 562.159 83.832 532.5 99.5 :C
+502.825 115.165 488 123 488 123 :C
+488 123 488 107.332 488 76 :C
+488 44.665 488 29 488 29 :C
+488 29 502.825 36.832 532.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+488 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+682.5 52.5 :M
+712.156 68.166 727 76 727 76 :C
+727 76 712.156 83.832 682.5 99.5 :C
+652.823 115.165 638 123 638 123 :C
+638 123 638 107.332 638 76 :C
+638 44.665 638 29 638 29 :C
+638 29 652.823 36.832 682.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+638 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+720 52.5 :M
+749.989 68.166 765 76 765 76 :C
+765 76 749.989 83.832 720 99.5 :C
+689.989 115.165 675 123 675 123 :C
+675 123 675 107.332 675 76 :C
+675 44.665 675 29 675 29 :C
+675 29 689.989 36.832 720 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+675 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+757.5 52.5 :M
+787.155 68.166 802 76 802 76 :C
+802 76 787.155 83.832 757.5 99.5 :C
+727.822 115.165 713 123 713 123 :C
+713 123 713 107.332 713 76 :C
+713 44.665 713 29 713 29 :C
+713 29 727.822 36.832 757.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+713 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+795 52.5 :M
+824.988 68.166 840 76 840 76 :C
+840 76 824.988 83.832 795 99.5 :C
+764.988 115.165 750 123 750 123 :C
+750 123 750 107.332 750 76 :C
+750 44.665 750 29 750 29 :C
+750 29 764.988 36.832 795 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+750 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+832.5 52.5 :M
+862.154 68.166 877 76 877 76 :C
+877 76 862.154 83.832 832.5 99.5 :C
+802.82 115.165 788 123 788 123 :C
+788 123 788 107.332 788 76 :C
+788 44.665 788 29 788 29 :C
+788 29 802.82 36.832 832.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+788 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+870 52.5 :M
+899.987 68.166 915 76 915 76 :C
+915 76 899.987 83.832 870 99.5 :C
+839.986 115.165 825 123 825 123 :C
+825 123 825 107.332 825 76 :C
+825 44.665 825 29 825 29 :C
+825 29 839.986 36.832 870 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+825 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+907.5 52.5 :M
+937.153 68.166 952 76 952 76 :C
+952 76 937.153 83.832 907.5 99.5 :C
+877.819 115.165 863 123 863 123 :C
+863 123 863 107.332 863 76 :C
+863 44.665 863 29 863 29 :C
+863 29 877.819 36.832 907.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+863 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+945 52.5 :M
+974.986 68.166 990 76 990 76 :C
+990 76 974.986 83.832 945 99.5 :C
+914.985 115.165 900 123 900 123 :C
+900 123 900 107.332 900 76 :C
+900 44.665 900 29 900 29 :C
+900 29 914.985 36.832 945 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+900 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+982.5 52.5 :M
+1012.152 68.166 1027 76 1027 76 :C
+1027 76 1012.152 83.832 982.5 99.5 :C
+952.818 115.165 938 123 938 123 :C
+938 123 938 107.332 938 76 :C
+938 44.665 938 29 938 29 :C
+938 29 952.818 36.832 982.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+938 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+1132.5 52.5 :M
+1162.15 68.166 1177 76 1177 76 :C
+1177 76 1162.15 83.832 1132.5 99.5 :C
+1102.816 115.165 1088 123 1088 123 :C
+1088 123 1088 107.332 1088 76 :C
+1088 44.665 1088 29 1088 29 :C
+1088 29 1102.816 36.832 1132.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+1088 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+1282.5 52.5 :M
+1312.147 68.166 1327 76 1327 76 :C
+1327 76 1312.147 83.832 1282.5 99.5 :C
+1252.814 115.165 1238 123 1238 123 :C
+1238 123 1238 107.332 1238 76 :C
+1238 44.665 1238 29 1238 29 :C
+1238 29 1252.814 36.832 1282.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+1238 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+1432.5 52.5 :M
+1462.145 68.166 1477 76 1477 76 :C
+1477 76 1462.145 83.832 1432.5 99.5 :C
+1402.811 115.165 1388 123 1388 123 :C
+1388 123 1388 107.332 1388 76 :C
+1388 44.665 1388 29 1388 29 :C
+1388 29 1402.811 36.832 1432.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+1388 29 :M
+0 setlinecap
+2 setlinecap
+.75 G
+1432.5 52.5 :M
+1462.145 68.166 1477 76 1477 76 :C
+1477 76 1462.145 83.832 1432.5 99.5 :C
+1402.811 115.165 1388 123 1388 123 :C
+1388 123 1388 107.332 1388 76 :C
+1388 44.665 1388 29 1388 29 :C
+1388 29 1402.811 36.832 1432.5 52.5 :C
+:K
+gS
+eofill
+gR
+0 G
+stroke
+1388 29 :M
+0 setlinecap
+-4 -4 227 302 4 4 223 261 @b
+-4 -4 40 302 4 4 36 261 @b
+endp
+%%Trailer
+end % md
+%%EOF
diff --git a/docsrc/s2h/citations.lsp b/docsrc/s2h/citations.lsp
new file mode 100644
index 0000000..b7208aa
--- /dev/null
+++ b/docsrc/s2h/citations.lsp
@@ -0,0 +1,21 @@
+(expand 100)
+
+(setf *citations* '(
+ (Anderson "../JITLBIB.HTM#anderson" "(Anderson 1985)")
+ (Beare "../JITLBIB.HTM#beare" "(Beare 1989)")
+ (Bloom "../JITLBIB.HTM#bloom" "(Bloom 1956)")
+ (Capell "../JITLBIB.HTM#capell" "(Capell 1995)")
+ (ptinterface "../JITLBIB.HTM#dannenberg" "(Dannenberg 1990)")
+ (Fletcher "../JITLBIB.HTM#fletcher" "(Fletcher 1990)")
+ (Ford "../JITLBIB.HTM#ford" "(Ford 1959)")
+ (Lehman "../JITLBIB.HTM#lehman" "(Lehman 1993)")
+ (Moore "../JITLBIB.HTM#moore96" "(Moore 1996)")
+ (Moore97 "../JITLBIB.HTM#moore97" "(Moore 1997)")
+ (Pflieger "../JITLBIB.HTM#pflieger" "(Pflieger 1961)")
+ (Russell "../JITLBIB.HTM#russel" "(Russell 1997)")
+ (Whittington "../JITLBIB.HTM#whittington" "(Whittington 1989)")
+
+ (touretzky "musicbib.html#touretzky" "(Touretzky 1984)")
+ (icmcfugue "http://www.cs.cmu.edu/~rbd/bib-arctic.html#icmcfugue" "(Dannenberg and Frayley 1989)")))
+
+
diff --git a/docsrc/s2h/do-nyquist-manual.lsp b/docsrc/s2h/do-nyquist-manual.lsp
new file mode 100644
index 0000000..87c9e5d
--- /dev/null
+++ b/docsrc/s2h/do-nyquist-manual.lsp
@@ -0,0 +1,6 @@
+;; build html for nyquist manual
+(load "s2h")
+(expand 10)
+;; sourcedir source destdir dest
+(g "../nyquist" "nyquistman" "../../doc" "home" t)
+(g "../nyquist" "nyquistman" "../../doc" "home" t)
diff --git a/docsrc/s2h/s2h.lsp b/docsrc/s2h/s2h.lsp
new file mode 100644
index 0000000..09490e3
--- /dev/null
+++ b/docsrc/s2h/s2h.lsp
@@ -0,0 +1,1642 @@
+; s2h -- scribe to html
+
+; MajorHeading = H1
+; Chapter, Unnumbered, Appendix = H2
+; Section = Heading = H3
+; SubSection = SubHeading = H4
+; Paragraph = H5
+
+; Files:
+; *dest* -- the title and table of contents
+; part1.html -- for each unnumbered, chapter, appendix,
+; at end of each part, link to: next part,
+; index, and table of contents
+; at beginning of each part, link to: prev part,
+; next part, index, and table of contents
+; indx.html -- the index (not "index", because that's a special name)
+; title.html -- the title page and table of contents
+; guide.html -- the table of contents and index for left frame
+; home.html -- the top-level document with two frames, the actual name
+; of this file is given by the dest parameter of (G ...)
+; NyquistWords.txt -- completion list file
+
+
+; Fancy control:
+; add the following to Scribe file:
+; @textform(html = [])
+; @textform(htmltitle = [])
+; @textform(pragma = [])
+; To get a title, add this to the file:
+; @html(<head><title>Your Title Here</title></head><body>)
+; If you use frames, you should add this to the scribe document:
+; @htmltitle(Your Title Here)
+; This tells the translator the html title to use for the root
+; html file.
+; anything inside @html{...} is output directly to output html file
+; anything in the @pragma{...} is executed as a command to this translator
+; some pragma commands are:
+; defn -- the next @index() marks a term's definition in the manual
+; startscribe -- ignore scribe file starting here
+; endscribe -- stop ignoring scribe file
+; startref -- use text between here and an @ref or @pageref as link text
+; doinclude -- process the next include file (default is to ignore)
+; endcodef -- end a code definition (used for completion list)
+; citations are translated to links according to data in citations.lsp
+; (the actual bibliographic references must be hand-translated to HTML)
+; alter *bgcolorinfo* to set background color of html documents
+; set *8.3* to change from "indx.html" to "INDX.HTM" format for file names
+
+;; label-list shall look like this:
+;; ((label-symbol "label text" file-name number) ...)
+;; where label-symbol is the scribe label,
+;; and the rest is used like this:
+;; <a href = "file-name#number">label text</a>
+(cond ((boundp '*label-list*)
+ (setf *previous-label-list* *label-list*)))
+(setf *label-list* nil)
+
+;; number of parts must be obtained from previous pass
+(cond ((boundp '*number-of-parts*)
+ (setf *previous-number-of-parts* *number-of-parts*)))
+(setf *number-of-parts* nil)
+
+(cond ((not (boundp '*citations*))
+ (load (strcat (current-path) "/citations.lsp"))))
+
+;; set this to trace parser input to help locate errors in input file
+(cond ((not (boundp '*token-trace*))
+ (setf *token-trace* nil)))
+
+(cond ((and (boundp '*inf*) *inf*)
+ (format t "closing *inf*\n")
+ (setf *inf* nil)))
+(cond ((and (boundp '*footnotefile*) *footnotefile*)
+ (format t "closing *footnotefile*\n")
+ (close *footnotefile*)
+ (setf *footnotefile* nil)))
+(cond ((and (boundp '*outf*) *outf*)
+ (setf *outf* nil)))
+
+;; when @pragma(defn) is seen, this flag is set to t, when
+;; the following @index(...) is seen, the flag is cleared and
+;; the index is entered as a definition of the term, meaning
+;; the referenced location will go to the head of the list.
+;; Later, when we want to find help for a term, we know that
+;; the help information is located by the first entry in the
+;; index for this term.
+(setf definition-flag nil)
+
+(defun open-paren ()
+ (let ((tok (get-token)))
+ (cond ((member tok '(#\( #\{ #\[ #\<))
+ (push tok paren-stack))
+ (t
+ (push tok *next-tokens*)
+ ;; if no open paren, then fake open and close
+ (push #\( paren-stack)
+ (push #\) *next-tokens*)))))
+
+
+;; ((label-symbol "label text" file-name number) ...)
+(defun write-label ()
+ (let ((body (get-body "label" nil)))
+ (push (list (list-to-symbol body) *name-reference*
+ *file-name* *name-number*)
+ *label-list*)))
+
+(defun do-make ()
+ (let ((what (get-body "make" nil)))
+ (setf what (string-upcase
+ (list-to-string what)))
+ (setf what (intern what))
+ (cond ((member what '(manual article))
+ (setf *document-type* what))
+ (t
+ (format t "Unknown document type: ~A, assuming ARTICLE~%" what)
+ (setf *document-type* 'ARTICLE)))))
+
+(defun get-body (what spacesok)
+ (prog (tok body)
+loop
+ (setf tok (get-token))
+ (cond ((not (characterp tok))
+ (format t "expected characters in ~A: ~A\n" what tok))
+ ((paren-match tok)
+ (pop paren-stack)
+ (return (reverse body)))
+ ((and (not spacesok) (eql #\Space tok)))
+ ((null tok)
+ (format t "early end of file\n")
+ (break))
+ (t
+ (push tok body)))
+ (go loop)))
+
+
+(defun write-code ()
+ (if *omit* nil (format *outf* "<code>"))
+ (translate)
+ (if *omit* nil (format *outf* "</code>")))
+
+(defun write-codef ()
+ (progv '(*codef*) '(t) (write-code) (codef-complete)))
+
+(defun write-quotation ()
+ (format *outf* "<blockquote>")
+ (translate)
+ (format *outf* "</blockquote>"))
+
+(defun write-normal ()
+ (format *outf* "<span style=\"font-style:normal\">")
+ (translate)
+ (format *outf* "</span>"))
+
+(defun write-t ()
+ (let (paren)
+ (format *outf* "<tt>")
+ (translate)
+ (format *outf* "</tt>")))
+
+(defun list-to-string (body)
+ (let ((str ""))
+ (dolist (ch body)
+ (setf str (strcat str (string ch))))
+ str))
+
+(defun list-to-symbol (body)
+ (setf cmd (intern (string-upcase (list-to-string body)))))
+
+;; index-casify -- first letter upper, all others lower
+;;
+(defun index-casify (item)
+ (nstring-downcase item)
+ (nstring-upcase item :start 0 :end 1))
+
+(defun enter-index-item (item def-flag)
+ (setf item (index-casify item))
+ (setf *index-number* (1+ *index-number*))
+ (let ((entry (assoc item *index-list* :test #'equal))
+ (ref (list *file-name* *index-number*))
+ front)
+ (cond ((and entry def-flag)
+ ;; put new reference at beginning of list
+ (rplacd entry (cons ref (cdr entry))))
+ (entry
+ (nconc entry (list ref)))
+ (t
+ (push (list item ref) *index-list*)))
+ *index-number*))
+
+(defun write-index (&optional def-flag)
+ (let (body str n)
+ (setf body (get-body "index" t))
+ (setf str (list-to-string body))
+ (if *token-trace* (format t "Index item: ~A~%" str))
+ (setf n (enter-index-item str def-flag))
+ (format *outf* "<a name=\"index~A\">" n)))
+
+(defun index-sort-fn (a b)
+ (string< (car a) (car b)))
+
+(defun mysort (list)
+ (setf list (cons 'header list))
+ (prog (first ptr result)
+loop1
+ (cond ((null (cdr list))
+ (return result)))
+; (display "loop1" list result)
+ (setf first list)
+ (setf ptr (cdr first))
+loop
+ (cond ((null (cdr ptr))
+ (go gotone))
+ ((index-sort-fn (cadr first) (cadr ptr))
+ (setf first ptr)))
+ (setf ptr (cdr ptr))
+ (go loop)
+gotone
+ (push (cadr first) result)
+ (rplacd first (cddr first))
+ (go loop1)))
+
+(cond ((not (boundp '*bgcolorinfo*))
+ (setf *bgcolorinfo* " bgcolor=\"ffffff\"")))
+(cond ((not (boundp '*8.3*))
+ (setf *8.3* nil)))
+
+(defun html-file (namestring)
+ (cond (*8.3*
+ (setf namestring (string-upcase namestring))
+ (cond ((> (length namestring) 8)
+ (setf namestring (subseq namestring 0 8))))
+ (strcat namestring ".HTM"))
+ (t
+ (strcat namestring ".html"))))
+
+(defun generate-index-entry (entry target)
+ (let (n)
+ ;; if only one target for index entry, make the word be a link
+ (cond ((= 1 (length (cdr entry)))
+ (format *outf* "<a href=\"~A#index~A\"~A>~A</a><br>~%"
+ (caadr entry) (cadadr entry) target (car entry)))
+ (t
+ (setf n 1)
+ ; (car entry) may have formatting commands...
+ (format *outf* "~A" (car entry))
+ (dolist (ref (cdr entry))
+ (format *outf* " <a href = \"~A#index~A\"~A>~A</a> "
+ (car ref) (cadr ref) target n)
+ (setf n (1+ n)))
+ (format *outf* "<br>\n")))))
+
+;; HAS-ALPHA - trim non-alpha from beginning of key and capitalize
+;; returns: nil if no alpha chars, *rslt* = key without non-alpha prefix
+;;
+(defun has-alpha (key)
+ (while (and (> (length key) 0)
+ (not (both-case-p (char key 0))))
+ (setf key (subseq key 1)))
+ (setf *rslt* key)
+ ;(display "non-alpha" key)
+ (cond ((> (length key) 0)
+ (setf *rslt* (index-casify *rslt*))
+ t)
+ (t nil)))
+
+
+;; FIX-NON-ALPHA -- duplicate non-alpha entries that have an alpha char
+;; and make all entries have sort keys
+(defun fix-non-alpha (lis)
+ (let (rslt)
+ (dolist (entry lis)
+ (setf key (car entry))
+ (push (cons key entry) rslt)
+ (cond ((both-case-p (char key 0)) nil) ;; normal alpha key
+ ((has-alpha key)
+ (push (cons *rslt* entry) rslt))))
+ rslt))
+
+
+;; GENERATE-INDEX -- generate the index and write to outf
+;;
+;; if frame-flag is provided, it signals that the output goes
+;; to an already open file, which is in fact the value of frame-flag
+;; This would be the second time generate-index is called, so the
+;; preprocessing and sorting is not needed when frame-flag is a file
+;;
+(defun generate-index (&optional frame-flag)
+ (let (n target initial-char)
+ (setf *outf* (if frame-flag frame-flag
+ (open (strcat *dest-dir* (html-file "indx"))
+ :direction :output)))
+ (cond (frame-flag t)
+ (t
+ (incf *part-number*)
+ (display "generate-index top" *part-number*)
+ (write-chapter-links t t)
+ (setf *index-list* (fix-non-alpha *index-list*))
+ (setf *index-list* (mysort *index-list*))
+ (generate-index-chars)
+ (format *outf* "<html><head><title>Index</title></head>\n")
+ (format *outf* "<body~A>" *bgcolorinfo*)))
+ (setf initial-char (car *index-chars*))
+ (format *outf* "<h2>Index</h2>~%")
+ (setf target (if frame-flag " target=m" ""))
+ (format *outf* "<a name=\"index-~A\"><h2>~A</h2></a>~%"
+ initial-char initial-char)
+ (format *outf* "<a href=\"#top\">TOP</a><br>~%")
+ ;; generate all non-alpha entries
+ (dolist (entry *index-list*)
+ (cond ((both-case-p (char (car entry) 0)))
+ (t
+ (generate-index-entry (cdr entry) target))))
+ ;; generate A - Z
+ (dolist (entry *index-list*)
+ ;; put headings for every new starting character
+ (let ((c (char (car entry) 0)))
+ (cond ((not (both-case-p c)) nil) ; ignore non-alphas here
+ ((eql initial-char (char (car entry) 0))) ; no change
+ (t
+ (setf initial-char (char (car entry) 0))
+ (format *outf* "<a name=\"index-~A\"><h2>~A</h2></a>~%"
+ initial-char initial-char)
+ (format *outf* "<a href=\"#top\">TOP</a><br>~%")))
+ (if (both-case-p c)
+ (generate-index-entry (cdr entry) target))))
+ (cond (frame-flag t)
+ (t (display "generate-index bottom" *part-number*)
+ (write-chapter-links nil t)
+ (format t "closing indx.html\n")
+ (close *outf*)))))
+
+
+;; GENERATE-TOC-2 -- generate table of contents body
+;;
+;; if frame-flag is t, generate html for left frame
+;; output to *outf*
+;;
+(defun generate-toc-2 (lis &optional frame-flag)
+ (format *outf* "<ul>\n")
+ (dolist (lis1 lis)
+ (let (lis2 target)
+ (setf lis1 (reverse lis1))
+ (setf lis2 (car lis1))
+; (display "part1" lis2)
+ (if frame-flag (setf target " target=\"m\""))
+ (format *outf* "<li><a href = \"~A#~A\"~A>~A</a>\n"
+ ;filename ;ref-number ;target ;name
+ (car lis2) (cadr lis2) target (caddr lis2))
+ (setf lis2 (cdr lis1))
+; (display "part2" lis2)
+ (cond (lis2
+ (generate-toc-2 lis2 frame-flag)))))
+ (format *outf* "</ul>\n"))
+
+
+(defun generate-toc (&optional frame-flag)
+ (format *outf* "<a name = \"toc\">\n")
+ (format *outf* "<h2>Table of Contents</h2>\n")
+ (generate-toc-2 (reverse *chapter-list*) frame-flag)
+ (cond (frame-flag t)
+ (t
+ (format *outf* "<ul><li><a href = \"~A\">Index</a>\n</ul>"
+ (html-file "indx")))))
+
+
+(defun get-primary (str)
+ (get-string-after "primary" str))
+
+(defun get-secondary (str)
+ (get-string-after "secondary" str))
+
+(defun get-string-after (key str)
+ (let ((n (string-search key str))
+ m)
+ (cond ((null n)
+ (format t "get-string-after could not find ~A in ~A~%"
+ key str)
+ (break)))
+ (setf n (+ n (length key)))
+ (display "a" n)
+ (setf n (string-search "\"" str :start n))
+ (display "b" n)
+ (cond ((null n)
+ (format t "get-string-after: no quote after ~A in ~A~%"
+ key str)
+ (break)))
+ (setf n (1+ n))
+ (setf m (string-search "\"" str :start n))
+ (display "c" m)
+ (cond ((null m)
+ (format t
+ "get-string-after: no close quote after ~A in ~A~%"
+ key str)
+ (break)))
+ (subseq str n m)))
+
+(defun write-indexsecondary ()
+ (let (body str n)
+ (setf body (get-body "secondaryindex" t))
+ (setf str (list-to-string body))
+ (if *token-trace* (format t "SecondaryIndex item: ~A~%" str))
+ (setf str (strcat (get-primary str) ", " (get-secondary str)))
+ (setf n (enter-index-item str nil))
+ (format *outf* "<a name=\"~A~A\">" str n)))
+
+
+(defun read-begin-command ()
+ (let (cmd n
+ (body (get-body "begin" nil)))
+ (setf cmd (list-to-string body))
+ (setf n (string-search "," cmd))
+ (cond (n
+ (format t
+ "warning: dropping parameters after comma in @begin(~A)~%"
+ cmd)
+ (setf cmd (subseq cmd 0 n))))
+ (setf cmd (intern (string-upcase cmd)))
+ (push cmd paren-stack)
+ cmd))
+
+
+(defun read-end-command ()
+ (let (cmd
+ (body (get-body "end" nil)))
+ (setf cmd (list-to-symbol body))
+ (list 'end cmd)))
+
+(defun read-pragma-command ()
+ (let ((body (get-body "end" nil)) cmd)
+ (setf cmd (list-to-symbol body))
+ cmd))
+
+(defun write-style (style)
+ (format *outf* "<~A>" style)
+ (translate)
+ (format *outf* "</~A>" style))
+
+(defun write-bold-italic ()
+ (format *outf* "<b><i>")
+ (translate)
+ (format *outf* "</i></b>"))
+
+(defun write-superscript ()
+ (output-char #\^)
+ (output-char #\()
+ (translate)
+ (output-char #\)))
+
+(defun write-subscript ()
+; (output-char #\[)
+ (translate)
+; (output-char #\])
+ )
+
+(defun write-dd ()
+ (if (and *description* (not *omit*))
+ (format *outf* "<dd>")))
+
+(defun write-description ()
+ (format *outf* "<dl>\n<dt>")
+ (progv '(*description*) '(t)
+ (translate))
+ (format *outf* "</dl>"))
+
+(defun write-fdescription ()
+ (format *outf* "<dl>\n<dt>")
+ (progv '(*fdescription*) '(t)
+ (progv '(*codef*) '(t)
+ (translate)
+ (codef-complete)))
+ (format *outf* "</dl>"))
+
+(defun write-fgroup ()
+ (progv '(*fgroup*) '(t)
+; (format *outf* " enter fgroup ")
+ (translate)))
+; (format *outf* " exit fgroup ")
+
+(defun write-pdescription ()
+ (let ((pdesc *pdescription*))
+ (if pdesc (format *outf* "<dl>"))
+ (format *outf* "<dd>")
+ (setf *pdescription* t)
+ (codef-complete) ;; finish preceding function completion string
+ (progv '(*codef*) '(nil)
+ (translate))
+ (setf *codef* t) ;; turn back on for next definition
+ (if pdesc (format *outf* "</dl>"))
+ (setf *pdescription* pdesc)))
+
+(defun close-paren-p (tok)
+ (or (and (listp tok)
+ (eq (car tok) 'end))
+ (paren-match tok)))
+
+
+(defun paren-match (p2)
+ (let ((p1 (car paren-stack)))
+ (or (and (eql p2 #\))
+ (eql p1 #\())
+ (and (eql p2 #\])
+ (eql p1 #\[))
+ (and (eql p2 #\})
+ (eql p1 #\{))
+ (and (eql p2 #\>)
+ (eql p1 #\<))
+ (and (listp p2)
+ (eq (car p2) 'end)
+ (eq p1 (cadr p2))))))
+
+(defun skip-it ()
+ (let ((omit *omit*))
+ (setf *omit* t)
+ (translate)
+ (setf *omit* omit)))
+
+(defun write-titlepage ()
+ (translate))
+
+
+(defun write-titlebox ()
+ (translate))
+
+(defun write-majorheading ()
+ (format *outf* "<h1>")
+ (translate)
+ (format *outf* "</h1>"))
+
+(defun write-h2 ()
+ (format *outf* "<h2>")
+ (translate)
+ (format *outf* "</h2>"))
+
+(defun write-h3 ()
+ (format *outf* "<h3>")
+ (translate)
+ (format *outf* "</h3>"))
+
+(defun write-h4 ()
+ (format *outf* "<h4>")
+ (translate)
+ (format *outf* "</h4>"))
+
+(defun write-paragraph ()
+ (let ((body (get-body "paragraph" t)))
+ (setf body (list-to-string body))
+ (setf *name-reference* (format nil "\"~A\"" body))
+ (setf *name-number* (1+ *name-number*))
+ (push (list (list *file-name* *name-number* body)) *paragraph-list*)
+ (format *outf* "<a name = \"~A\"><h5>~A</h5></a>" *name-number* body)))
+
+(defun finish-subsection ()
+ (push *paragraph-list* *subsection-list*)
+ (setf *paragraph-list* nil))
+
+(defun write-subsection ()
+ (let ((body (get-body "subsection" t)))
+ (setf body (list-to-string body))
+ (setf *name-reference* (format nil "\"~A\"" body))
+ (setf *name-number* (1+ *name-number*))
+ (cond (*paragraph-list*
+ (finish-subsection)))
+ (setf *paragraph-list*
+ (list (list *file-name* *name-number* body)))
+ (format *outf* "<a name = \"~A\"><h4>~A</h4></a>" *name-number* body)))
+
+
+(defun finish-section ()
+ (cond (*paragraph-list*
+ (finish-subsection)))
+ (push *subsection-list* *section-list*)
+ (setf *subsection-list* nil))
+
+(defun write-section ()
+ (let ((body (get-body "section" t)))
+ (setf body (list-to-string body))
+ (setf *name-reference* (format nil "\"~A\"" body))
+ (setf *name-number* (1+ *name-number*))
+ (cond (*subsection-list*
+ (finish-section)))
+ (setf *subsection-list*
+ (list (list *file-name* *name-number* body)))
+ (format *outf* "<a name = \"~A\"><h3>~A</h3></a>" *name-number* body)))
+
+(defun previous-part-file-name ()
+ (cond ((> *part-number* 2)
+ (html-file (format nil "part~A" (- *part-number* 2))))
+ (t *dest*)))
+
+;; called when new chapter is encountered,
+;; lastflag = nil means write a Next Section link
+(defun finish-chapter ()
+ (cond (*subsection-list*
+ (finish-section)))
+ (push *section-list* *chapter-list*)
+ (setf *section-list* nil)
+ ; *dest* links get added after table of contents
+ (cond ((not (eq *outf* *rootf*))
+ (write-chapter-links)
+ (format *outf* "</body></html>\n") )))
+
+
+(defun write-title-page-links ()
+ (format *outf* "<hr>\n")
+ (let (name)
+ (setf name (html-file "part1"))
+ (format *outf* "<a href = \"~A\">Next Section</a> | " name))
+ (format *outf* "<a href = \"~A\">Index</a> | " (html-file "indx"))
+ (format *outf* "<hr>\n"))
+
+
+(defun write-chapter-links (&optional top-flag index-flag title-flag)
+ (display "write-chapter-links" *part-number* *previous-number-of-parts*)
+ (let ((lastflag (eql *part-number* *previous-number-of-parts*)))
+ (if top-flag t (format *outf* "<hr>\n"))
+ (cond ((not title-flag)
+ (format *outf* "<a href = \"~A\">Previous Section</a> | "
+ (previous-part-file-name))))
+ (cond (index-flag nil)
+ ((not lastflag)
+ (let (name)
+ (setf name (html-file (if title-flag "part1"
+ (format nil "part~A" *part-number*))))
+ (format *outf* "<a href = \"~A\">Next Section</a> | " name)))
+ (t
+ (format *outf* "<a href = \"~A\">Next Section (Index)</a> | "
+ (html-file "indx"))))
+ (format *outf* "<a href = \"~A#toc\">Table of Contents</a> | " *dest*)
+ (cond ((and (not lastflag) (not index-flag))
+ (format *outf* "<a href = \"~A\">Index</a> | " (html-file "indx"))))
+ (format *outf* "<a href = \"~A\">Title Page</a>\n" *dest*)
+ (if top-flag (format *outf* "<hr>\n"))))
+
+
+(defun set-html-title ()
+ (setf *title* (get-body "htmltitle" t))
+ (setf *title* (list-to-string *title*)))
+
+
+(defun write-chapter ()
+ (let ((body (get-body "chapter" t)))
+ ;(display "write-chapter" body)
+ (setf body (list-to-string body))
+ (setf *name-reference* (format nil "\"~A\"" body))
+ (setf *name-number* (1+ *name-number*))
+ (cond (*section-list*
+ (finish-chapter)))
+ (cond ((eq *outf* *rootf*))
+ (t
+ (format t "Closing ~A~%" *file-name*)
+ (close *outf*)))
+ (setf *file-name* (html-file (format nil "part~A" *part-number*)))
+ (setf *section-list*
+ (list (list *file-name* *name-number* body)))
+ (setf *outf* (open (strcat *dest-dir* *file-name*)
+ :direction :output))
+ (setf *part-number* (1+ *part-number*))
+ (format *outf* "<html><head><title>~A</title></head>\n<body~A>\n"
+ body *bgcolorinfo*)
+ (write-chapter-links t)
+ (format *outf* "<a name = \"~A\"><h2>~A</h2></a>" *name-number* body)))
+
+(defun write-detail ()
+ (format *outf* "<small>")
+ (translate)
+ (format *outf* "</small>\n"))
+
+(defun write-appendix ()
+ (let ((body (get-body "appendix" t)))
+ (setf body (list-to-string body))
+ (setf *name-reference* (format nil "\"~A\"" body))
+ (setf body (format nil "Appendix ~A: ~A" *appendix-number* body))
+ (setf *appendix-number* (1+ *appendix-number*))
+ (setf *name-number* (1+ *name-number*))
+ (cond (*section-list*
+ (finish-chapter)))
+ (cond ((eq *outf* *rootf*))
+ (t
+ (format t "Closing ~A~%" *file-name*)
+ (close *outf*)))
+ (setf *file-name* (html-file (format nil "part~A" *part-number*)))
+ (setf *section-list*
+ (list (list *file-name* *name-number* body)))
+ (setf *outf* (open (strcat *dest-dir* *file-name*)
+ :direction :output))
+ (setf *part-number* (1+ *part-number*))
+ (write-chapter-links t)
+ (format *outf* "<html><head><title>~A</title></head>\n" body)
+ (format *outf* "<a name = \"~A\"><h2>~A</h2></a>" *name-number* body)))
+
+
+(defun write-blankspace ()
+ (cond (*fdescription*
+ ; what we want is <br><br><dt> after pdescription environment
+ ; to set up the next fdescription, but we may have output one <br>
+ ; after the last pdescription. By using (linebreak) we avoid a
+ ; third <br> which would output too much space.
+ (linebreak)
+ (format *outf* "<br><dt>"))
+ (t
+ (paragraph)))
+ (get-body "blankspace" t))
+
+
+;(defun write-center ()
+; (linebreak)
+; (translate)
+; (linebreak))
+
+(defun write-newpage ()
+ (translate))
+
+; ignore multiple calls in sequence
+;
+(defun paragraph ()
+ (cond ((null *paragraph*)
+ (cond (*itemize*
+ (format *outf* "\n<li>"))
+ (*description*
+ (format *outf* "<br><br>\n<dt>"))
+ ((or *pdescription* *fgroup*)
+ (linebreak))
+ (*fdescription*) ; and not *pdescription*: no paragraph
+ (t
+ (format *outf* "\n<p>\n")))
+ (setf *paragraph* t))))
+
+(defun linebreak ()
+ (cond ((and (null *paragraph*)
+ (null *linebreak*))
+ (format *outf* "<br>\n")
+ (setf *linebreak* t))))
+
+(defun write-smallcaps ()
+ (let ((sc *smallcap*))
+ (setf *smallcap* t)
+ (translate)
+ (setf *smallcap* sc)))
+
+
+(defun write-cite ()
+ (let (body link)
+ (setf body (get-body "cite" nil))
+ (setf body (list-to-symbol body))
+ (format t "Citation: ~A ~%" body)
+ (setf link (assoc body *citations*))
+ (cond ((null link)
+ (format t "Undefined citation: ~A~%" body))
+ (t
+ (format *outf* " <a href = \"~A\">~A</a>"
+ (cadr link) (caddr link))))))
+
+
+(defun write-ref ()
+ (let ((body (get-body "ref" nil)) ref (file ""))
+ (cond (*startref*
+ (setf *startref* nil)
+ (setf *omit* nil)))
+ (setf body (list-to-symbol body))
+ (setf ref (assoc body *previous-label-list*))
+ (cond ((null ref)
+ (format t "warning: undefined label ~A~%" body))
+ (t
+ (cond ((not (equal (caddr ref) *file-name*))
+ (setf file (caddr ref))))
+ (format *outf* "<a href = \"~A#~A\">~A</a>"
+ file (cadddr ref) (cadr ref))))))
+
+(defun write-example ()
+ (format *outf* "<pre>")
+ (translate)
+ (format *outf* "</pre>\n"))
+
+(defun write-enumerate ()
+ (let ((itemize *itemize*))
+ (format *outf* "<ol>\n<li>")
+ (setf *itemize* t)
+ (translate)
+ (format *outf* "</ol>")
+ (setf *itemize* itemize)))
+
+(defun write-itemize ()
+ (let ((itemize *itemize*))
+ (format *outf* "<ul>\n<li>")
+ (setf *itemize* t)
+ (translate)
+ (format *outf* "</ul>")
+ (setf *itemize* itemize)))
+
+
+
+(defun write-format ()
+ (let ((display *display*))
+ ; hopefully, we'll get a linebreak to separate the text as does scribe
+ (setf *display* t)
+ (translate)
+ (format *outf* "<p>~%") ; separate the text from what follows
+ (setf *display* display)))
+
+(defun write-display ()
+ (let ((display *display*))
+ (format *outf* "<blockquote>")
+ (setf *display* t)
+ (setf *linebreak* t) ; it's automatic with blockquote,
+ ; so we do this to suppress an extra <br>
+ (translate)
+ (format *outf* "</blockquote>")
+ (setf *display* display)))
+
+
+(defun write-figure ()
+ (format *outf* "<hr>")
+ (translate)
+ (format *outf* "<hr>"))
+
+
+(defun write-dash ()
+ (get-body "dash" nil)
+ (output-char #\-))
+
+
+(defun write-html ()
+ (setf *html* t)
+ (translate)
+ (setf *html* nil))
+
+(defun write-foot ()
+ (let ((outf *outf*)
+ (name (html-file "foot")))
+ (format *outf* " <a href = \"~A#foot~A\">(Footnote ~A)</a> "
+ name *footnote-number* *footnote-number*)
+ (cond ((null *footnotefile*)
+ (setf *footnotefile* (open (strcat *dest-dir* name) :direction :output))
+ (format *footnotefile* "<html><head><title>Footnotes</title></head>\n")
+ (format *footnotefile* "<body~A>\n<h2>Footnotes</h2>\n" *bgcolorinfo*)
+ ))
+ (setf *outf* *footnotefile*)
+ (format *outf* "<a name = \"foot~A\"> ~A. </a>" *footnote-number* *footnote-number*)
+ (setf *footnote-number* (1+ *footnote-number*))
+ (translate)
+ (format *outf* "\n<P>\n")
+ (setf *outf* outf)))
+
+
+(defun write-fillcaption ()
+ (paragraph)
+ (format *outf* "<b>Figure ~A: </b>" *figure-number*)
+ (translate))
+
+
+(defun do-include ()
+ (setf *include* t))
+
+(defun write-include ()
+ (let ((body (get-body "include" nil))
+ file)
+ (cond (*include*
+ (setf *include* nil)
+ (setf body (list-to-string body))
+ (setf file *inf*)
+ (setf *inf* (open (strcat *include-prefix* body)))
+ (cond ((null *inf*)
+ (format t "Could not open include file ~A\n" body)
+ (break))
+ (t
+ (format t "Processing include file ~A\n" body)
+ (translate)
+ (format t "Closing include file ~A\n" body)
+ (close *inf*)
+ (setf *inf* file))) ))))
+
+(defun do-tag ()
+ (let ((body (get-body "tag" nil)))
+ (push (list (list-to-symbol body) (format nil "~A" *figure-number*)
+ *file-name* *name-number*)
+ *label-list*)
+ (setf *figure-number* (1+ *figure-number*)) ))
+
+
+(defun write-math ()
+ (translate))
+
+(defun write-underline ()
+ (format *outf* "<u>")
+ (translate)
+ (format *outf* "</u>\n"))
+
+; initiated by @startscribe()
+; and ended by @endscribe()
+;
+(defun do-startscribe ()
+ (setf *omit* t))
+
+(defun do-endscribe ()
+ (setf *omit* nil))
+
+(defun do-startref ()
+ (setf *omit* t)
+ (setf *startref* t))
+
+(defun write-title ()
+ (translate))
+
+
+(defun do-comment ()
+ ; skip everything until matching paren
+ (prog (tok)
+loop
+ (setf tok (get-comment-token))
+; (display "do-comment" tok paren-stack)
+ (cond ((and (close-paren-p tok)
+ (paren-match tok))
+; (display "do-comment" paren-stack)
+ (pop paren-stack)
+; (format t "do-comment done\n")
+ (return)))
+ (go loop)))
+
+
+(defun output-char (c)
+ (cond (*omit* t)
+ (t
+ (cond ((and *smallcap*
+ (alpha-char-p c))
+ (setf c (char-upcase c))))
+ ; (display "output-char" *display*)
+ (cond ((and *display* (eql c #\Newline))
+ (linebreak))
+ ((member c '(#\Space #\Newline)))
+ (t
+ (setf *paragraph* nil)
+ (setf *linebreak* nil)))
+ (cond (*html*) ; no translation if we're in an @html(...) section
+ ((eq c #\<)
+ (write-char #\& *outf*)
+ (write-char #\l *outf*)
+ (write-char #\t *outf*)
+ (setf c #\;))
+ ((eq c #\>)
+ (write-char #\& *outf*)
+ (write-char #\g *outf*)
+ (write-char #\t *outf*)
+ (setf c #\;))
+ ((eq c #\&)
+ (write-char #\& *outf*)
+ (write-char #\a *outf*)
+ (write-char #\m *outf*)
+ (write-char #\p *outf*)
+ (setf c #\;)))
+ ; (display "output-char" c)
+ (write-char c *outf*))))
+
+
+(setf *translate-depth* 0)
+
+(defun translate ()
+ (setf *translate-depth* (1+ *translate-depth*))
+ (if *token-trace* (format t "(~A " *translate-depth*))
+ (prog (tok)
+loop
+ (setf tok (get-token))
+ (cond ((and tok (symbolp tok) *token-trace*)
+ (format t "[~A]" tok)))
+ (cond ((null tok) (go ret))
+ ((close-paren-p tok)
+ (cond ((paren-match tok)
+ (pop paren-stack))
+ (t
+ (format t "unmatched end: ~A~%" tok)
+ (break)))
+ (go ret))
+ ((eq tok 'altdef)
+ (translate))
+ ((characterp tok)
+ ;; output completion hints file
+ (cond (*codef* (codef-char tok)))
+ (output-char tok))
+ ((eq tok 'label)
+ (write-label))
+ ((member tok '(code smallcode xlcode))
+ (write-code))
+ ((eq tok 'codef)
+ (write-codef))
+ ((eq tok 'index)
+ (write-index definition-flag)
+ (setf definition-flag nil))
+ ((eq tok 'indexsecondary)
+ (write-indexsecondary))
+ ((eq tok 'indexdef) ;; this is obsolete now
+ (write-index t))
+ ((eq tok 'r)
+ (write-normal))
+ ((eq tok 'i)
+ (write-style "i"))
+ ((eq tok 'b)
+ (write-style "b"))
+ ((eq tok 'titlepage)
+ (write-titlepage))
+ ((eq tok 'titlebox)
+ (write-titlebox))
+ ((member tok '(majorheading chapnum)) ; chapnum is for Tomayko
+ (write-majorheading))
+ ((member tok '(skip blankspace)) ; skip is for Tomayko
+ (write-blankspace))
+ ((member tok '(verse center))
+ (write-display)) ;; seems to be best substitute for center
+ ((eq tok 'format)
+ (write-format))
+ ((eq tok 'newpage)
+ (write-newpage))
+ ((eq tok 'c)
+ (write-smallcaps))
+ ((member tok '(text quotation))
+ (write-quotation))
+ ((eq tok 't)
+ (write-t))
+ ((eq tok 'title)
+ (write-title))
+ ((eq tok 'htmltitle)
+ (set-html-title))
+ ((member tok '(chapter unnumbered))
+ (write-chapter))
+ ((eq tok 'appendix)
+ (write-appendix))
+ ((eq tok 'detail)
+ (write-detail))
+ ((eq tok 'section)
+ (write-section))
+ ((eq tok 'heading)
+ (write-h3))
+ ((eq tok 'subsection)
+ (write-subsection))
+ ((eq tok 'subheading)
+ (write-h4))
+ ((eq tok 'paragraph)
+ (write-paragraph))
+ ((eq tok 'cite)
+ (write-cite))
+ ((member tok '(ref pageref))
+ (write-ref))
+ ((eq tok 'startref)
+ (do-startref))
+ ((eq tok 'p)
+ (write-bold-italic))
+ ((eq tok 'plus)
+ (write-superscript))
+ ((eq tok 'minus)
+ (write-subscript))
+ ((eq tok 'html) ; special way to insert html
+ (write-html))
+ ((member tok '(example programexample))
+ (write-example))
+ ((eq tok 'figure)
+ (write-figure))
+ ((eq tok 'fillcaption)
+ (write-fillcaption))
+ ((eq tok 'tag)
+ (do-tag))
+ ((eq tok 'doinclude)
+ (do-include))
+ ((eq tok 'include)
+ (write-include))
+ ((eq tok 'backslash)
+ (write-dd))
+ ((eq tok 'math)
+ (write-math))
+ ((member tok '(foot note)) ; note is for Tomayko
+ (codef-complete)
+ (setf *codef* nil)
+ (write-foot))
+ ((member tok '(description fndefs))
+ (write-description))
+ ((eq tok 'fdescription)
+ (write-fdescription))
+ ((eq tok 'pdescription)
+ (write-pdescription))
+ ((eq tok 'fgroup)
+ (write-fgroup))
+ ((eq tok 'itemize)
+ (write-itemize))
+ ((eq tok 'enumerate)
+ (write-enumerate))
+ ((eq tok 'display)
+ (write-display))
+ ((member tok '(subtract itemsep dash ndash))
+ (cond ((eq tok 'itemsep)
+ (codef-complete)
+ (setf *codef* nil))) ;; end completion string
+ (write-dash))
+ ((eq tok 'star)
+ (linebreak))
+ ((eq tok 'new-paragraph)
+ (paragraph))
+ ((member tok '(y value definefont))
+ (format t "warning: omitting @~A[] text\n" tok)
+ (skip-it))
+ ((member tok '(one colon shout slash bar bibliography))
+ (format t "ignoring ~A\n" tok))
+ ((eq tok 'make)
+ (do-make))
+ ((member tok '(device libraryfile style commandstring modify define use counter pageheading set graphic mult tabset tabclear textform part))
+ (skip-it))
+ ((eq tok 'comment)
+ (do-comment))
+ ((eq tok 'defn)
+ (setf definition-flag t))
+ ((eq tok 'startscribe)
+ (do-startscribe))
+ ((eq tok 'endscribe)
+ (do-endscribe))
+ ((eq tok 'endcodef)
+ (codef-complete))
+ ((eq tok 'stopcodef)
+ (setf *codef* nil))
+ ((eq tok 'startcodef)
+ (setf *codef* t))
+ ((member tok '(u ux))
+ (write-underline))
+ ((member tok '(group flushleft)) ; ignore it, flushleft is for Tomayko
+ (translate))
+ (t
+ (format t "unrecognized token: ~A~%" tok)
+ (break)))
+ (go loop)
+ret
+ (if *token-trace* (format t ")"))
+ (setf *translate-depth* (- *translate-depth* 1))
+
+ ))
+
+(defun manualp () (eq *document-type* 'manual))
+
+
+(format t "To run, call:\n")
+(format t " (g \"scribe source directory\" ; omit the trailing slash\n")
+(format t " \"scribe file\" ; omit the .mss suffix\n")
+(format t " \"html directory\" ; omit the trailing slash\n")
+(format t " \"html root file\" ; omit the .html suffix\n")
+(format t " [t]) ; optional flag generates html with frames\n")
+
+(defun g (sourcedir source destdir dest &optional frame-flag)
+ (setf *codef-capture* "")
+ (setf *codef-list* nil)
+ (setf *figure-number* 1)
+ (setf *index-number* 1)
+ (setf *appendix-number* 1)
+ (setf *footnotefile* nil)
+ (setf *footnote-number* 1)
+ (setf *name-number* 0)
+ (setf *name-reference* nil)
+ (setf *omit* nil)
+ (setf *html* nil) ; says we're in section to dump html literally
+ (setf *include* nil) ; process include or not?
+ (setf *next-tokens* nil)
+ (setf *smallcap* nil)
+ (setf *paragraph* t)
+ (setf *linebreak* t)
+ (setf *itemize* nil)
+ (setf *display* nil)
+ (setf *description* nil)
+ (setf *fdescription* nil)
+ (setf *fgroup* nil)
+ (setf *pdescription* nil)
+ (setf *codef* nil) ; says we're defining a function, add to completion list
+ ;; paragraph-list is initialized to:
+ ;; ((file number sectionname))
+ ;; and after each paragraph, expands, e.g.:
+ ;; ((file number paragraphname) (file number sectionname))
+ (setf *paragraph-list* nil)
+ ;; likewise, the subsection-list is initialized to:
+ ;; ((file number sectionname))
+ ;; and after each subsection, expands, e.g.:
+ ;; (((file number paragraphname) (file number subsectionname))
+ ;; (file number sectionname)))
+ (setf *subsection-list* nil)
+ ;; and so on...
+ (setf *section-list* nil)
+ (setf *chapter-list* nil)
+ ; *dest* is the root HTML file
+ (setf *dest* (if frame-flag
+ (html-file "title")
+ (html-file dest)))
+ ; *file-name* is the current HTML file
+ (setf *file-name* *dest*)
+ (format t "Destination HTML file: ~A~%" *file-name*)
+ (setf *part-number* 1)
+
+ ; *startref* is set when @startref() is encountered, at which
+ ; point text is omitted until a reference is encountered, at
+ ; which point text is resumed.
+ (setf *startref* nil)
+
+ ;; index-list shall look like this:
+ ;; (("key" "indexterm" (filename num) (filename num) ...)
+ ;; ("key" "indexterm" (filename num) (filename num) ...) ...)
+ ;; where key is the sortkey (usually indexterm) and indexterm is
+ ;; what gets printed. This allows non-alphabetic items to be sorted
+ ;; according to their first alphabetic character, e.g. *rslt* can
+ ;; be sorted as "rslt" as well as "*rslt*"
+ ;;
+ (setf *index-list* nil)
+
+ (setf paren-stack nil)
+
+ ;; run this twice to get labels right
+ ;; if *label-list* is NIL, it may be because we reloaded this file,
+ ;; in which case *previous-label-list* has already been copied from
+ ;; *label-list*
+ (cond (*label-list*
+ (setf *previous-label-list* *label-list*))
+ ((not (boundp '*previous-label-list*))
+ (setf *previous-label-list* nil)))
+ (cond (*number-of-parts*
+ (setf *previous-number-of-parts* *number-of-parts*)))
+ (cond ((not (boundp '*previous-number-of-parts*))
+ (setf *previous-number-of-parts* 0)))
+
+ (setf *inf* (open (strcat sourcedir "/" source ".mss")))
+; "test.mss"))
+; "/afs/cs/user/rbd/doc/man/nyquist/nyquistman.mss"))
+ (setf *include-prefix* (strcat sourcedir "/"))
+ (setf *dest-dir* (strcat destdir "/"))
+ (setf *outf* (open (strcat *dest-dir* *file-name*) :direction :output))
+ (setf *codef-file* (open (strcat *dest-dir* "NyquistWords.txt" )
+ :direction :output))
+ (setf *rootf* *outf*)
+ (display "g-before translate" *outf* *rootf* *inf*)
+ (translate)
+ (display "g-after translate" *outf* *rootf* *inf*)
+ (format t "g: closing *inf*\n")
+ (close *inf*)
+ (setf *inf* nil)
+ (format t "g: closing *outf*\n")
+ (finish-chapter)
+ (cond ((not (eq *outf* *rootf*))
+ (close *outf*)
+ (setf *outf* nil)))
+ (cond (*footnotefile*
+ (format *footnotefile* "</body></html>\n")
+ (close *footnotefile*)))
+ (setf *footnotefile* nil)
+ (setf *outf* *rootf*)
+ (display "g-before toc" *outf* *rootf* *inf*)
+ (setf *number-of-parts* *part-number*)
+ (cond ((manualp)
+ (setf *part-number* 1) ;; reset for title page
+ (write-title-page-links)
+ (generate-toc)
+ (write-chapter-links nil nil t)))
+ (format *rootf* "</body></html>\n")
+ (format t "g: closing *rootf*\n")
+ (close *rootf*)
+ (setf *outf* (setf *rootf* nil))
+ (cond ((manualp)
+ (setf *part-number* *number-of-parts*) ;; restore from above
+ (generate-index))
+ ; if this is not a manual, there are no chapters, so there are no
+ ; links between chapters or table of contents, so index cannot be
+ ; reached, so index is not generated. This is bad if there really
+ ; are index terms!!!!
+ (*index-list*
+ (format t "WARNING: NO INDEX IS BEING GENERATED, THIS IS A BUG~%")))
+ (cond (frame-flag
+ (if (not (manualp))
+ (error "frame option only works with manual document types"))
+ (generate-home *title* (strcat *dest-dir* (html-file dest)))
+ (generate-guide (strcat *dest-dir* (html-file "guide")))
+ ))
+ (codef-close)
+)
+
+
+(defun generate-home (title filename)
+ (let ((outf (open filename :direction :output)))
+ (format outf "<html><head><title>~A</title></head>~%" title)
+ (format outf "<frameset cols=\"1*, 2*\">~%")
+ (format outf "<frame scrolling=auto src=guide.html frameborder=0>~%")
+ (format outf
+ "<frame name=m scrolling=auto src=title.html frameborder=0>~%")
+ (format outf "<noframes><body><p>This browser does not support frames.~%")
+ (format outf "<p><a href=title.html>The no-frames version is here.</a>~%")
+ (format outf "</body></noframes></frameset></html>~%")
+ (close outf)))
+
+
+;; FIND-ALPHA-AND-NON-ALPHA -- sublist with only alpha chars
+;; return the range of the rest in *rslt*, e.g. "!-~"
+;;
+(defun find-alpha-and-non-alpha (lis)
+ (let (prev first last rslt)
+ (dolist (c lis)
+ (cond ((eql prev c))
+ (t
+ (setf prev c)
+ (cond ((both-case-p prev)
+ (push prev rslt))
+ ((null first)
+ (setf first prev)
+ (setf last prev))
+ (t
+ (setf last prev))))))
+ (setf *rslt* (strcat (string first) "-" (string last)))
+ rslt))
+
+
+(defun generate-index-chars ()
+ (let (term initial prev)
+ (setf *index-chars* nil)
+ ;; compute the list of characters for index
+ (dolist (entry *index-list*)
+ (setf term (car entry))
+ (setf initial (char term 0))
+ (cond ((eql prev (char term 0)))
+ (t
+ (setf prev initial)
+ (push prev *index-chars*))))
+ (setf *index-chars* (reverse *index-chars*))
+ (setf *index-chars* (find-alpha-and-non-alpha *index-chars*))
+ (setf *index-chars* (reverse *index-chars*))
+ (push *rslt* *index-chars*)))
+
+
+(defun generate-guide (dest)
+ (let (term initial prev index-chars non-alpha)
+ (setf *outf* (open dest :direction :output))
+ (format *outf* "<html><head><title>Links</title></head><body>~%")
+ (format *outf* "<h3><a name=top>~%")
+ (dotimes (n (length *index-chars*))
+ (setf c (nth n *index-chars*))
+ (format *outf* "<a href=\"#index-~A\">~A</a>~%" c c)
+ (if (zerop (rem (1+ n) 9))
+ (format *outf* "<br>~%")))
+ (format *outf* "</h3>~%")
+ (generate-toc t)
+ (generate-index *outf*)
+ (format *outf* "</body></html>~%")
+ (close *outf*)))
+
+
+(defun alpha-char-p (c)
+ (let ((cc (char-code c)))
+ (or (and (>= cc (char-code #\a))
+ (<= cc (char-code #\z)))
+ (and (>= cc (char-code #\A))
+ (<= cc (char-code #\Z))))))
+
+
+(defun process-comment-at ()
+ (let (c cmd)
+ (read-char *inf*) ; read the @
+ (setf c (peek-char nil *inf*))
+ (cond ((alpha-char-p c)
+ (setf cmd (read-command))
+ (cond ((eq cmd 'end)
+ (open-paren)
+ (read-end-command))
+ (t #\z))))))
+
+
+(defun process-at ()
+ (let (c cmd)
+ (read-char *inf*) ; read the @
+ (setf c (peek-char nil *inf*))
+ (cond ((eql c #\@) (read-char *inf*))
+ ((eql c #\\) (read-char *inf*) 'backslash)
+ ((eql c #\/) (read-char *inf*) 'slash)
+ ((eql c #\1) (read-char *inf*) 'one)
+ ((eql c #\+) (read-char *inf*)
+ (open-paren)
+ 'plus)
+ ((eql c #\*) (read-char *inf*) 'star)
+ ((eql c #\-) (read-char *inf*)
+ (open-paren)
+ 'minus)
+ ((eql c #\:) (read-char *inf*) 'colon)
+ ((eql c #\!) (read-char *inf*) 'shout)
+ ((eql c #\|) (read-char *inf*) 'bar)
+ ((alpha-char-p c)
+ (setf cmd (read-command))
+ (cond ((eq cmd 'begin)
+ (open-paren)
+ (read-begin-command))
+ ((eq cmd 'end)
+ (open-paren)
+ (read-end-command))
+ ((eq cmd 'pragma)
+ (open-paren)
+ (read-pragma-command))
+ (t
+ (open-paren)
+ cmd)))
+ (t (format t "unexpected char after @: ~A~%" c)
+ (break)))))
+
+
+(defun process-newline ()
+ (let (c)
+ (read-char *inf*) ; read the newline
+ (setf c (peek-char nil *inf*))
+ (cond ((eql c #\Newline)
+ (while (eql (peek-char nil *inf*) #\Newline)
+ (read-char *inf*))
+ 'new-paragraph)
+ (t #\Newline))))
+
+
+;; READ-COMMAND -- read command after an @
+;
+(defun read-command ()
+ (let ((command ""))
+ (while (alpha-char-p (peek-char nil *inf*))
+ (setf command
+ (strcat command (string (read-char *inf*)))))
+ (intern (string-upcase command))))
+
+
+
+;; (read-char *inf*))
+
+(defun get-token ()
+ (let ((c (peek-char nil *inf*))
+ result)
+
+ ;; allow others to force next token:
+ (cond (*next-tokens*
+ (setf result (car *next-tokens*))
+ (setf *next-tokens* (cdr *next-tokens*)))
+ (t
+ (setf result
+ (cond ((eql c #\@) (process-at))
+ ((eql c #\Newline) (process-newline))
+ ((eql c #\`) ;; double `` -> "
+ (read-char *inf*)
+ (setf c (peek-char nil *inf*))
+ (cond ((eql c #\`)
+ (read-char *inf*)
+ #\")
+ (t #\`)))
+ ((eql c #\') ;; double '' -> "
+ (read-char *inf*)
+ (setf c (peek-char nil *inf*))
+ (cond ((eql c #\')
+ (read-char *inf*)
+ #\")
+ (t #\')))
+ (t (read-char *inf*))))))
+ (if *token-trace* (format t "->~A " result))
+ result
+ ))
+
+
+(defun get-comment-token ()
+ (let ((c (peek-char nil *inf*))
+ result)
+ (setf result
+ (cond ((eql c #\@) (process-comment-at))
+ (t (read-char *inf*))))
+ (if *token-trace* (format t "->~A " result))
+ result
+ ))
+
+(defun codef-char (c)
+ (if (member c '(#\Newline #\Tab)) (setf c #\Space))
+ (setf *codef-capture* (strcat *codef-capture* (string c))))
+
+(defun codef-complete ()
+; (write-char #\) *codef-file*)
+ (let (index)
+ ;; remove [lisp] and [sal] and everything after it
+ (if (setf index (string-search "[lisp]" *codef-capture*))
+ (setf *codef-capture* (subseq *codef-capture* 0 index)))
+ (if (setf index (string-search "[sal]" *codef-capture*))
+ (setf *codef-capture* (subseq *codef-capture* 0 index)))
+ ;; trim extra blanks
+ (while (setf index (string-search " " *codef-capture*))
+ (setf *codef-capture* (strcat (subseq *codef-capture* 0 index)
+ (subseq *codef-capture* (1+ index)))))
+ ;; replace "expr..." with "expr ..." Want to replace all occurences,
+ ;; so scan string, starting at previous spot + 2 (to get beyond the
+ ;; inserted space character) until nothing is found
+ (setf index 0)
+ (while (and (< (+ index 2) (length *codef-capture*))
+ (setf index (string-search "..." *codef-capture*
+ :start (+ 2 index))))
+ (cond ((and index (> index 0)
+ (not (eq (char *codef-capture* (1- index)) #\Space)))
+ (setf *codef-capture*
+ (strcat (subseq *codef-capture* 0 index) " "
+ (subseq *codef-capture* index))))))
+ ;; trim blanks after open bracket/comma and before close paren
+ (while (setf index (string-search "[, " *codef-capture*))
+ (setf index (+ 2 index))
+ (setf *codef-capture* (strcat (subseq *codef-capture* 0 index)
+ (subseq *codef-capture* (1+ index)))))
+ (while (setf index (string-search " )" *codef-capture*))
+ (setf *codef-capture* (strcat (subseq *codef-capture* 0 index)
+ (subseq *codef-capture* (1+ index)))))
+ )
+
+ ;; trim blanks
+ (setf *codef-capture* (string-trim " " *codef-capture*))
+ ;; translate &key to example format
+ (cond ((or (string-search "&key" *codef-capture*)
+ (string-search "&optional" *codef-capture*))
+ (setf *codef-capture* (codef-expand *codef-capture*))))
+ (if (and (> (length *codef-capture*) 0) ; must be non-empty
+ (not (eq (char *codef-capture* 0) #\:))) ; ignore messages
+ (push (string-downcase
+ (convert-sal-to-lisp *codef-capture*))
+ *codef-list*))
+ ;; trim leading open paren
+ (if (and (> (length *codef-capture*) 0)
+ (eq (char *codef-capture* 0) #\())
+ (setf *codef-capture* (subseq *codef-capture* 1)))
+
+ (setf *codef-capture* ""))
+
+
+(defun convert-sal-to-lisp (codef)
+ ;(format *codef-file* "sal-to-lisp |~A|~%" codef)
+ ;; some of these strings are already lisp. The SAL strings have an
+ ;; open paren after the function call
+ (cond ((eq (char codef 0) #\()
+ (setf codef (subseq codef 1)))
+ ((string-search "(" codef)
+ (setf codef (do-convert-sal-to-lisp codef))))
+ codef)
+
+(defun do-convert-sal-to-lisp (codef)
+ ;; take out initial "(" and replace with space
+ ;; delete each subsequent comma
+ ;; for each colon, flip it to a keyword (key: -> :key)
+ (let ((p (string-search "(" codef)))
+ ;; replace "(" with " "
+ (setf codef (strcat (subseq codef 0 p) " " (subseq codef (1+ p))))
+ ;; delete commas:
+ (setf p (string-search "," codef))
+ (while p
+ (setf codef (strcat (subseq codef 0 p) (subseq codef (1+ p))))
+ (setf p (string-search "," codef)))
+ ;; for each colon, flip it to a keyword
+ (setf p (string-search ":" codef))
+ (while p
+ ;; back up
+ (setf q (1- p))
+ (while (not (member (char codef q) '(#\Space #\[)))
+ (setf q (1- q)))
+ (incf q)
+ (setf codef (strcat (subseq codef 0 q) ":"
+ (subseq codef q p) (subseq codef (1+ p))))
+ (setf p (string-search ":" codef :start (1+ p)))
+ '(display "do-cstl" p codef))
+ codef))
+
+
+(defun split (s)
+ (let (rslt (token "") c)
+ (dotimes (i (length s))
+ (setf c (char s i))
+ (cond ((eq c #\Space)
+ (cond ((> (length token) 0)
+ (push token rslt)
+ (setf token ""))))
+ ((member c '(#\( #\)))
+ (cond ((> (length token) 0)
+ (push token rslt)
+ (setf token "")))
+ (push (string c) rslt))
+ (t
+ (setf token (strcat token (string c))))))
+ (cond ((> (length token) 0)
+ (push token rslt)))
+ (reverse rslt)))
+
+
+(defun colonize (word)
+ (if (eq (char word 0) #\:)
+ word
+ (strcat ":" word)))
+
+(defun uncolonize (word)
+ (if (eq (char word 0) #\:)
+ (subseq word 1)
+ word))
+
+
+(defun codef-expand (s)
+ (let (words (r "") mode (space ""))
+ (setf words (split s))
+ (dolist (word words)
+ (cond ((equal word "&key")
+ (setf mode :key))
+ ((equal word "&optional")
+ (setf mode :optional))
+ ((equal word "(")
+ (setf r (strcat r space word))
+ (setf space ""))
+ ((equal word ")")
+ (setf r (strcat r word))
+ (setf space " "))
+ ((eq mode :key)
+ (setf r (strcat r space "[" (colonize word) " "
+ (uncolonize word) "]"))
+ (setf space " "))
+ ((eq mode :optional)
+ (setf r (strcat r space "[" word "]"))
+ (setf space " "))
+ (t
+ (setf r (strcat r space word))
+ (setf space " "))))
+ r))
+
+(defun find-url-for (item)
+ (let (i entry)
+ ;; first, extract the initial symbol from item
+ (setf i (string-search " " item))
+ (cond (i (setf item (subseq item 0 i))))
+ ;; trim trailing (or any) close parenthesis
+ (setf i (string-search ")" item))
+ (cond (i (setf item (subseq item 0 i))))
+ ;; fix the case/capitalization to match what's in *index-list*
+ (setf item (index-casify item))
+ ;; look it up
+ (setf entry (assoc item *index-list* :test #'equal))
+ ;; return the URL
+ (cond (entry
+ ;; entry has (sort-key, name, ref1, ref2, ...)
+ (setf entry (third entry)) ;; get first reference
+ (format nil "~A#index~A" (first entry) (second entry)))
+ (t
+ (format t "WARNING: ~A IS NOT IN INDEX~%" item)
+ "home.htm"))))
+
+
+(defun codef-close () ;; called to close file
+ ;; nothing written yet
+ (let (url)
+ (setf *codef-list* (sort *codef-list* #'string<))
+ (dolist (item *codef-list*)
+ (setf url (find-url-for item))
+ (format *codef-file* "~A~%~A~%" item url))
+ (close *codef-file*)))
diff --git a/docsrc/scribe.htm b/docsrc/scribe.htm
new file mode 100644
index 0000000..6b9e875
--- /dev/null
+++ b/docsrc/scribe.htm
@@ -0,0 +1,1523 @@
+<html><head>
+
+<title>Scribe</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<br>
+
+<hr>
+
+<h1>Scribe</h1>
+
+<hr>
+
+<ul>
+<li><nobr>@@ - insert an '@' sign</nobr></li>
+<li><nobr><a href="#inline">@+</a> - superscript</nobr></li>
+<li><nobr><a href="#inline">@&minus;</a> - subscript</nobr></li>
+<li><nobr><a href="#figures">@~</a> - unknown meaning</nobr></li>
+<li><nobr><a href="#whitespace">@\</a> - horizontal tabulator</nobr></li>
+<li><nobr><a href="#breaks">@*</a> - force a line break</nobr></li>
+<li><nobr><a href="#headings">@appendix</a> - start appendix chapter</nobr></li>
+<li><nobr><a href="#inline">@b</a> - bold text</nobr></li>
+<li><nobr><a href="#region">@begin</a> - start a region</nobr></li>
+<ul>
+<li><nobr><a href="#region-center">center</a> - centered text</nobr></li>
+<li><nobr><a href="#region-code">code</a> - code example, use typewriter font</nobr></li>
+<li><nobr><a href="#comments">comment</a> - invisible in the final document</nobr></li>
+<li><nobr><a href="#region-description">description</a> - definition list</nobr></li>
+<li><nobr><a href="#region-detail">detail</a> - use small font</nobr></li>
+<li><nobr><a href="#region-display">display</a> - non-justified text</nobr></li>
+<li><nobr><a href="#region-enumerate">enumerate</a> - ordered list</nobr></li>
+<li><nobr><a href="#region-example">example</a> - code example, use typewriter font</nobr></li>
+<li><nobr><a href="#region-fdescription">fdescription</a> - special definition-list format</nobr></li>
+<li><nobr><a href="#definitions">fgroup</a> - special PDF format for function definitions</nobr></li>
+<li><nobr><a href="#figures">figure</a> - insert a figure</nobr></li>
+<li><nobr><a href="#definitions">fndefs</a> - special PDF format for function definitions</nobr></li>
+<li><nobr><a href="#region-itemize">itemize</a> - unordered list</nobr></li>
+<li><nobr><a href="#figures">math</a> - render and insert a math formula</nobr></li>
+<li><nobr><a href="#region-pdescription">pdescription</a> - special definition-list format</nobr></li>
+<li><nobr><a href="#region-programexample">programexample</a> - code example, typewriter font</nobr></li>
+<li><nobr><a href="#region-smallcode">smallcode</a> - typewriter font, use small font in PDF</nobr></li>
+<li><nobr><a href="#title-page">titlebox</a> - put text into the title box</nobr></li>
+<li><nobr><a href="#title-page">titlepage</a> - define the title page</nobr></li>
+<li><nobr><a href="#figures">transparent</a> - transparent background color</nobr></li>
+</ul>
+<li><nobr><a href="#whitespace">@blankspace</a> - insert witepace with specific width</nobr></li>
+<li><nobr><a href="#inline">@c</a> - small capitals</nobr></li>
+<li><nobr><a href="#figures">@caption</a> - add text to an object</nobr></li>
+<li><nobr><a href="#headings">@chapter</a> - start an numbered chapter</nobr></li>
+<li><nobr><a href="#region-center">@center</a> - centered text</nobr></li>
+<li><nobr><a href="#bibliography">@cite</a> - cite an entry from the bibliograpy</nobr></li>
+<li><nobr><a href="#insert">@code</a> - inline code example, use typewriter font</nobr></li>
+<li><nobr><a href="#insert">@codef</a> - inline code example, use typewriter font</nobr></li>
+<li><nobr><a href="#settings">@commandstring</a> - define printing commands [for CMU use only]</nobr></li>
+<li><nobr><a href="#comments">@comment</a> - a comment, invisible in the final document</nobr></li>
+<li><nobr><a href="#settings">@dash</a> - insert a horizontal dash with specific width</nobr></li>
+<li><nobr><a href="#definitions">@define</a> - define a command or a variable</nobr></li>
+<li><nobr><a href="#settings">@device</a> - the printer device [for CMU use only]</nobr></li>
+<li><nobr><a href="#region-display">@display</a> - non-justified text</nobr></li>
+<li><nobr><a href="#region">@end</a> - end of a region</nobr></li>
+<li><nobr><a href="#figures">@fillcaption</a> - add formatted text to an object</nobr></li>
+<li><nobr><a href="#footnotes">@foot</a> - add a footnote</nobr></li>
+<li><nobr><a href="#figures">@graphic</a> - insert a picture</nobr></li>
+<li><nobr><a href="#html">@html</a> - insert text in HTML only</nobr></li>
+<li><nobr><a href="#html">@htmltitle</a> - insert a HTML header with title (HTML only)</nobr></li>
+<li><nobr><a href="#inline">@i</a> - italics</nobr></li>
+<li><nobr><a href="#at-include">@include</a> - read a different Scribe file</nobr></li>
+<li><nobr><a href="#indexing">@index</a> - index reference</nobr></li>
+<li><nobr><a href="#settings">@itemsep</a> - insert a horizontal dash with specific width</nobr></li>
+<li><nobr><a href="#cross-reference">@label</a> - add a label to a section</nobr></li>
+<li><nobr><a href="#settings">@libraryfile</a> - load Scribe library [for CMU use only]</nobr></li>
+<li><nobr><a href="#headings">@majorheading</a> - document title</nobr></li>
+<li><nobr><a href="#settings">@make</a> - printer output format [for CMU use only]</nobr></li>
+<li><nobr><a href="#figures">@math</a> - render and insert a math formula</nobr></li>
+<li><nobr><a href="#inline">@mult</a> - insert a multiplication sign</nobr></li>
+<li><nobr><a href="#settings">@modify</a> - change internal Scribe settings [for CMU use only]</nobr></li>
+<li><nobr><a href="#breaks">@newpage</a> - force a page break</nobr></li>
+<li><nobr><a href="#inline">@p</a> - bold italics</nobr></li>
+<li><nobr><a href="#at-pageheading">@pageheading</a> - format of the page heading</nobr></li>
+<li><nobr><a href="#cross-reference">@pageref</a> - insert the page number of a @label</nobr></li>
+<li><nobr><a href="#headings">@paragraph</a> - start a new paragraph</nobr></li>
+<li><nobr><a href="#figures">@parm</a> - unknown meaning</nobr></li>
+<li><nobr><a href="#at-part">@part</a> - faciliates separate compilation of parts of a larger document</nobr></li>
+<li><nobr><a href="#html">@pragma</a> - control the 's2h.lsp' HTML converter</nobr></li>
+<li><nobr><a href="#cross-reference">@ref</a> - insert the section number of a @label</nobr></li>
+<li><nobr><a href="#headings">@section</a> - start a section</nobr></li>
+<li><nobr>@set - set a Scribe variable [for CMU use only]</nobr></li>
+<li><nobr><a href="#at-style">@style</a> - change a Scribe document preset [for CMU use only]</nobr></li>
+<li><nobr><a href="#headings">@subsection</a> - start a sub-section</nobr></li>
+<li><nobr><a href="#settings">@subtract</a> - insert a horizontal dash with specific width</nobr></li>
+<li><nobr><a href="#inline">@t</a> - use typewriter font</nobr></li>
+<li><nobr><a href="#whitespace">@tabclear</a> - reset tabulator settings</nobr></li>
+<li><nobr><a href="#whitespace">@tabset</a> - define new tabulator settings</nobr></li>
+<li><nobr><a href="#whitespace">@tag</a> - add a label to a figure or table</nobr></li>
+<li><nobr><a href="#html">@textform</a> - define a text-formatting Scribe command</nobr></li>
+<li><nobr><a href="#at-title">@title</a> - define the page heading title</nobr></li>
+<li><nobr><a href="#headings">@unnumbered</a> - start an unnumbered chapter</nobr></li>
+<li><nobr><a href="#at-use">@use</a> - use a external database file</nobr></li>
+<li><nobr><a href="#">@value</a> - insert the value of a command or a variable</nobr></li>
+</ul>
+
+<hr>
+
+<h2>Table of Contents</h2>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#scribe">Scribe</a> - basic Syntax rules</nobr></li>
+<li><nobr><a href="#settings">General Settings</a> - start of 'myquistman.mss'</nobr></li>
+<ul>
+<li><nobr><a href="#at-dash">Dashes with different Width</a></nobr></li>
+<li><nobr><a href="#at-include">Commands for Large Documents</a></nobr></li>
+<li><nobr><a href="#at-style">The '@style' Command</a></nobr></li>
+<li><nobr><a href="#at-title">Numbering Pages and Page Headings</a></nobr></li>
+</ul>
+<li><nobr><a href="#definitions">Command Definitions</a> - Nyquist Scribe commands</nobr></li>
+<ul>
+<li><nobr><a href="#html">HTML Commands</a> - controling the 's2l.lsp' HTML converter</nobr></li>
+</ul>
+<li><nobr><a href="#inline">Inline Markup</a></nobr></li>
+<li><nobr><a href="#region">Regions</a></nobr></li>
+<li><nobr><a href="#lists">Lists</a></nobr></li>
+<li><nobr><a href="#comments">Comments</a></nobr></li>
+<li><nobr><a href="#footnotes">Footnotes</a></nobr></li>
+<li><nobr><a href="#indexing">Indexing</a></nobr></li>
+<li><nobr><a href="#headings">Headings</a></nobr></li>
+<li><nobr><a href="#title-page">Title Page</a></nobr></li>
+<li><nobr><a href="#whitespace">Tab Stops and Whitespace</a></nobr></li>
+<li><nobr><a href="#breaks">Line and Page Breaks</a></nobr></li>
+<li><nobr><a href="#cross-reference">Cross References</a></nobr></li>
+<li><nobr><a href="#bibliography">Bibliography and Citation</a></nobr></li>
+<li><nobr><a href="#figures">Figures and Tables</a></nobr></li>
+</ol>
+
+<a name="scribe"></a>
+
+<hr>
+
+<h2>Scribe</h2>
+
+<hr>
+
+<p>Scribe is a markup language and word processing system. <nobr>It
+was</nobr> designed and developed by Brian Reid of Carnegie Mellon
+University <nobr>around 1980</nobr>.</p>
+
+<ul>
+<li><nobr><a href="http://en.wikipedia.org/wiki/Scribe_(markup_language)"
+>http://en.wikipedia.org/wiki/Scribe_(markup_language)</a></nobr></li>
+</ul>
+
+<p>A source file prepared for input to Scribe consists primarily of plain
+text. Paragraphs are separated by blank lines, and commands, if present, are
+flagged with <nobr>'@' signs</nobr>. <nobr>If you</nobr> want an <nobr>'@'
+sign</nobr> to appear within your output, you must type two of <nobr>them
+'@@'</nobr>. <nobr>A file</nobr> containing no commands at all will work
+just fine, it will yield simple justified paragraphed text. <nobr>A
+Scribe</nobr> source file should be given the <nobr>extension '.mss'</nobr>.
+Upper and lower case may be used interchangeably in any Scribe command.</p>
+
+<p>A perhaps confusing aspect of Scribe is that you get to use any bracket
+as long as you close it with a matching one, so for example:</p>
+
+<pre class="example">
+@i(This is italic.)
+@i[This is also italic]
+@i{This italic has (parentheses) but it's ok because there is no curly brace}
+@begin(i)This form is allows [any] (brackets) {in} the text, but "at" (@@) must be escaped@end(i)
+</pre>
+
+<p>Legal delimiter pairs are:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>(<font color="#008844">...</font>)</code></nobr></td>
+ <td><nobr>&nbsp;,&nbsp;</nobr></td>
+ <td class="button"><nobr><code>[<font color="#008844">...</font>]</code></nobr></td>
+ <td><nobr>&nbsp;,&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#008844">...</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;,&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&quot;<font color="#008844">...</font>&quot;</code></nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>It doesn't really matter which delimiter is used as long as the closing
+delimiter matches the opening limiter.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="settings"></a>
+
+<hr>
+
+<h2>General Settings</h2>
+
+<hr>
+
+<p>Most of the definitions in this section affect the Scribe system at the
+<nobr>CMU only</nobr>.</p>
+
+<pre class="example">
+@device(mac52postscript) <font color="#008844">@comment(printer device)</font>
+@make(manual) <font color="#008844">@comment(printer output format)</font>
+@libraryfile(mathematics10)
+@libraryfile(picture)
+@libraryfile(multilevelindex)
+@style(font timesroman) <font color="#008844">@comment(printer font)</font>
+@style(fontscale 11) <font color="#008844">@comment(printer font size)</font>
+@commandstring(dash @Y[M])
+@commandstring(subtract @Y[N])
+@commandstring(itemsep @Y[M])
+@Modify(indexenv, above=2 lines, leftmargin 8, columns=3, boxed)
+@define(prg=i)
+</pre>
+
+<a name="at-dash"></a><a name="at-subtract"></a><a name="at-itemsep"></a>
+
+<p>The '@commandstring' lines define three formatting directices:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">dash</code></nobr></td>
+ <td><nobr>&nbsp;,&nbsp;</nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">subtract</code></nobr></td>
+ <td><nobr>&nbsp;,&nbsp;</nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">itemsep</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a minus sign in HTML, but different widths in PDF</td>
+</tr>
+</tbody></table></p>
+
+<p>[A block with
+<nobr><a href="#definitions"> Command Definitions</a></nobr> follows
+here in the original file, moved to a separate paragraph below.]</p>
+
+<pre class="example">
+@use(bibliography = "../bib/music.bib")
+@style(references ClosedAlphabetic)
+@counter(dummy-counter)
+@modify(FigureCounter,Within=dummy-counter,
+ Numbered &lt;@@b[Figure@@ @1:@@ @@ ]@@$&gt;,
+ Referenced "@1",Init 0)
+@modify(TableCounter,Within=dummy-counter,
+ Numbered &lt;@@b[Table@@ @1:@@ @@ ]@@$&gt;,
+ Referenced "@1",Init 0)
+@pageheading(left "", center "@value(page)", right "")
+@include(../template/filcap.mss)
+</pre>
+
+<a name="at-part"></a><a name="at-use"></a><a name="at-include"></a>
+
+<p>Scribe commands for producing large documents:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">part</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">faciliates separate compilation of parts of a larger document.</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">use</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">tells Scribe to use a particular database file, used to include the bibliography file</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">include</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">read another Scribe file</td>
+</tr>
+</tbody></table></p>
+
+<a name="at-style"></a>
+
+<p><b>The @style Command</b></p>
+
+<p>The database entry for a document type presets the value of all Scribe
+parameters. The '@style' command can be used to override these values. All
+'@style' commands used in a document must come at the beginning. Styles
+can't be changed in the middle of a document. Here is a list of '@style'
+commands used in the Nymqust manual:</p>
+
+<pre class="example">
+@<font color="#AA0000">style</font>(font timesroman)
+@<font color="#AA0000">style</font>(fontscale 11)
+@<font color="#AA0000">style</font>(references ClosedAlphabetic)
+@<font color="#AA0000">style</font>(pagenumbers="@i")
+@<font color="#AA0000">style</font>(pagenumbers="@1")
+</pre>
+
+<a name="at-pageheading"></a><a name="at-title"></a>
+
+<p><b>Numbering Pages and Page Headings</b></p>
+
+<p>The page heading and footing areas are divided into three parts. <nobr>A
+'left'</nobr> part, a 'center' part, and a 'right' part:</p>
+
+<pre class="example">
+@<font color="#AA0000">pageheading</font>(left "", center "@value(page)", right "")
+@<font color="#AA0000">pageheading</font>(even, left "Page @Value(Page)", right "@c(Nyquist Manual)")
+@<font color="#AA0000">pageheading</font>(odd, left "@c[@title(chapter)]", right "Page @Value(page)")
+</pre>
+
+<p>The text fields inside the quotes can contain anything, including Scribe
+commands.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="definitions"></a>
+
+<hr>
+
+<h2>Command Definitions</h2>
+
+<hr>
+
+<p>The definitions in this section are used in the Scribe sources.</p>
+
+<pre class="example">
+@define(detail=text, size 9, spacing 1.2, indent 0)
+@define(code, FaceCode T, size 11)
+@define(codef, FaceCode T, size 11)
+@define(smallcode, FaceCode T, size 8, spacing 0.8) @comment(was 10)
+@define(rbdisplay = display, group)
+@define(fndefs = description, leftmargin 0.5in, indent -0.5in)
+@define(fdescription = text, leftmargin +0.5in, indent -0.5in, spread 1)
+@define(pdescription = text, leftmargin +0.5in, indent -0.5in, spread 0)
+@define(fgroup = text, indent -0.5in, spread 0)
+</pre>
+
+<ul>
+<li><nobr><a href="#region-detail">detail</a> defines text with a small font</nobr></li>
+<li><nobr><a href="#at-code">code</a> and <a href="#at-codef">codef</a> define text with a typewriter font</nobr></li>
+<li><nobr><a href="#region-smallcode">smallcode</a> defines text with typewriter font, with a small font in PDF</nobr></li>
+<li><nobr>'rbdisplay' seems nowhere else to be used in the Nyquist manual</nobr></li>
+<li><nobr><font color="#AA0000">fndefs</font> and <font color="#AA0000">fgroup</font> define special PDF formatting parameters for function definitions</nobr></li>
+<li><nobr><a href="#region-fdescription">fdesription</a> and <a href="#region-pdescription">pdescription</a> define a special definition list format</nobr></li>
+</ul>
+
+<p>'@codef' is used to define a lisp function or variable. <nobr>A
+processor</nobr> uses this to extract completion hint info for jNyqIDE.</p>
+
+<a name="html"></a>
+
+<p><b>HTML Commands</b></p>
+
+<p>Three Scribe commands are added for the 's2h.lsp' HTML converter::</p>
+
+<pre class="example">
+@textform(html = [])
+@textform(htmltitle = [])
+@textform(pragma = [])
+</pre>
+
+<p>The first two commands insert text in the HTML file only, but not in
+<nobr>the PDF</nobr>:</p>
+
+<a name="at-html"></a><a name="at-htmltitle"></a>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">html</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">insert HTML text</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">htmltitle</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">insert a HTML header with title</td>
+</tr>
+</tbody></table></p>
+
+<a name="at-pragme"></a>
+
+<p>The '@pragma' command controls the 's2h.lsp' HTML converter:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@pragma(<font color="#AA0000">defn</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the next @index marks a term's definition in the manual</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@pragma(<font color="#AA0000">startscribe</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">ignore scribe file starting here</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@pragma(<font color="#AA0000">endscribe</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">stop ignoring scribe file</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@pragma(<font color="#AA0000">startref</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">use text between here and an @ref or @pageref as link text</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@pragma(<font color="#AA0000">doinclude</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">process the next include file (default is to ignore)</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@pragma(<font color="#AA0000">endcodef</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">end a code definition (used for completion list)</td>
+</tr>
+</tbody></table></p>
+
+<p><b>RBD:</b> '@pragma(defn)' is used to mark a term's point of definition.
+<nobr>I tried</nobr> to define(defn=index), but that didn't work in Scribe,
+so the approach now is to mark definitions. <nobr>In s2h</nobr>, the 'defn'
+pragma sets a flag that the NEXT index term is a definition. <nobr>The
+'s2h.lsp'</nobr> processor uses this to map terms defined within 'codef'
+(which go into the completion list) to URLs for the help system.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="inline"></a>
+
+<hr>
+
+<h2>Inline Markup</h2>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>Scribe&nbsp;</nobr></td>
+ <td></td>
+ <td align="center"><nobr>HTML&nbsp;</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">b</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">b</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">b</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">bold</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">i</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">i</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">i</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">italics</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">p</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">b</font>&gt;&lt;<font color="#AA0000">i</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">i</font>&gt;&lt;/<font color="#AA0000">b</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">bold + italics</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">t</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">tt</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">tt</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">typewriter font</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">c</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">small</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">small</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">small capitals</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">+</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">sup</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">sup</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">superscript</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">&minus;</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">sub</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">sub</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">subscript</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td colspan="6"><nobr>User-<a href="#definitions">defined</a></nobr>
+ Scribe commands:</nobr></td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="at-code">&nbsp;</a><a name="at-codef">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">code</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">code</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">code</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">code example inside text</td>
+</tr>
+<tr>
+ <td height="2px"></a></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">codef</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">code</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">code</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">code example inside text</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td colspan="6"><nobr>Named entities:</nobr></td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="at-mult">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">mult</font></code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>*</code></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">insert a multiplication sign</td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="region"></a>
+
+<hr>
+
+<h2>Regions</h2>
+
+<hr>
+
+<p><nobr>Text-formatting</nobr> Scribe commands can be written as
+<a href="#inline">inline</a> command or as a region command, delimited by
+'@begin' <nobr>and '@end'</nobr>:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">command</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><a href="#inline">inline</a> command</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">command</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">command</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">region command</td>
+</tr>
+</tbody></table></p>
+
+<p>The most often used Scribe region commands in the Nyquist manual are:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>Scribe&nbsp;</nobr></td>
+ <td></td>
+ <td align="center"><nobr>HTML&nbsp;</nobr></td>
+</tr>
+<tr>
+ <td height="2px"><a name="region-programexample"></a></a></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">programexample</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">programexample</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code><nobr>&lt;<font color="#AA0000">pre</font>&gt;</nobr><br><font color="#0000CC">text</font><br><nobr>&lt;/<font color="#AA0000">pre</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">code example, typewriter font</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="region-example">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">example</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">example</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code><nobr>&lt;<font color="#AA0000">pre</font>&gt;</nobr><br><font color="#0000CC">text</font><br><nobr>&lt;/<font color="#AA0000">pre</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">code example, typewriter font</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="region-display">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">display</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">display</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code><nobr>&lt;<font color="#AA0000">blockquote</font>&gt;</nobr><br><font color="#0000CC">text</font><br><nobr>&lt;/<font color="#AA0000">blockquote</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">normal text, non-justified, each line separate</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">display</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td colspan="3" width="100%">same as above</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td colspan="6"><b>Scribe:</b> The 'example' and 'display' inserts types
+ are very similar, they differ only in the type face that will be used.
+ <nobr>In either</nobr> 'example' or 'display' inserts, each line of the
+ manuscript will produce one line in the document. Since 'example' is for
+ showing examples of computer <nobr>type-in</nobr> and
+ <nobr>type-out</nobr>, it will appear in a typeface that is designed to
+ look like computer output. 'display' inserts will appear in the normal
+ body typeface. If the document is printed on a device that cannot change
+ fonts, then 'example' and 'display' will look nearly identical.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="region-center">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">center</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">center</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code><nobr>&lt;<font color="#AA0000">center</font>&gt;</nobr><br><font color="#0000CC">text</font><br><nobr>&lt;/<font color="#AA0000">center</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">each line centered</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">center</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td colspan="3" width="100%">same as above</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td colspan="6"><b>Scribe:</b> The 'center' insert is similar to
+ 'display', except that it centers its lines rather than
+ <nobr>left-justifying</nobr> them. Like 'display', 'center' produces one
+ line in the document for each line of the manuscript file that is inside
+ the 'center'. <nobr>If there</nobr> is more than one line in a 'center'
+ insert, each line will be centered individually.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="region-detail">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">detail</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">detail</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code><nobr>&lt;<font color="#AA0000">small</font>&gt;</nobr><br><font color="#0000CC">text</font><br><nobr>&lt;/<font color="#AA0000">small</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">use small font</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="region-code">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">code</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">code</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code><nobr>&lt;<font color="#AA0000">code</font>&gt;</nobr><br><font color="#0000CC">text</font><br><nobr>&lt;/<font color="#AA0000">code</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">typewriter font</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="region-smallcode">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">smallcode</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">smallcode</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code><nobr>&lt;<font color="#AA0000">code</font>&gt;</nobr><br><font color="#0000CC">text</font><br><nobr>&lt;/<font color="#AA0000">code</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">typewriter font, use small font in PDF</td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lists"></a>
+
+<hr>
+
+<h2>Lists</h2>
+
+<hr>
+
+<a name="region-itemize"></a>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>Scribe&nbsp;</nobr></td>
+ <td></td>
+ <td align="center"><nobr>HTML&nbsp;</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></a></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">itemize</font>)</nobr><br><font color="#0000CC">item-1</font><br><br><font color="#0000CC">item-2</font><br><br><font color="#0000CC">item-3</font><br><nobr>@end(<font color="#AA0000">itemize</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code><nobr>&lt;<font color="#AA0000">ul</font>&gt;</nobr><br>&lt;<font color="#AA0000">li</font>&gt;<font color="#0000CC">item-1</font><br>&lt;<font color="#AA0000">li</font>&gt;<font color="#0000CC">item-2</font><br>&lt;<font color="#AA0000">li</font>&gt;<font color="#0000CC">item-3</font><br><nobr>&lt;/<font color="#AA0000">ul</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">unordered list</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="region-enumerate">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">enumerate</font>)</nobr><br><font color="#0000CC">item-1</font><br><br><font color="#0000CC">item-2</font><br><br><font color="#0000CC">item-3</font><br><nobr>@end(<font color="#AA0000">enumerate</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code><nobr>&lt;<font color="#AA0000">ol</font>&gt;</nobr><br>&lt;<font color="#AA0000">li</font>&gt;<font color="#0000CC">item-1</font><br>&lt;<font color="#AA0000">li</font>&gt;<font color="#0000CC">item-2</font><br>&lt;<font color="#AA0000">li</font>&gt;<font color="#0000CC">item-3</font><br><nobr>&lt;/<font color="#AA0000">ol</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">ordered list</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td colspan="6"><b>Scribe:</b> 'itemize' and 'enumerate' each expect a
+ sequence of paragraphs, separated by blank lines, and each justifies
+ those paragraphs into inset margins and puts a mark in front of each.
+ 'itemize' puts a <nobr>tick-mark</nobr> or a bullet in front of each
+ paragraph, while 'enumerate' puts a number in front of each.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="region-description">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">description</font>)</nobr><br><font color="#0000CC">item-1</font>@\<font color="#0000CC">text-1</font><br><br><font color="#0000CC">item-2</font>@\<font color="#0000CC">text-2</font><br><br><font color="#0000CC">item-3</font>@\<font color="#0000CC">text-3</font><br><nobr>@end(<font color="#AA0000">description</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code><nobr>&lt;<font color="#AA0000">dl</font>&gt;</nobr><br><nobr>&lt;<font color="#AA0000">dt</font>&gt;<font color="#0000CC">item-1</font>&lt;<font color="#AA0000">dd</font>&gt;<font color="#0000CC">text-1</font></nobr><br><nobr>&lt;<font color="#AA0000">dt</font>&gt;<font color="#0000CC">item-2</font>&lt;<font color="#AA0000">dd</font>&gt;<font color="#0000CC">text-2</font></nobr><br><nobr>&lt;<font color="#AA0000">dt</font>&gt;<font color="#0000CC">item-3</font>&lt;<font color="#AA0000">dd</font>&gt;<font color="#0000CC">text-3</font></nobr><br><nobr>&lt;/<font color="#AA0000">dl</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">definition list</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td colspan="6"><b>Scribe:</b> <nobr>A 'description'</nobr> insert is
+ designed for the 'command description' style that is very common in
+ reference manuals. <nobr>The first</nobr> line of a 'description' insert
+ will be at the left margin, and the second and remaining lines will be
+ indented substantially, so that the word or phrase at the end of the head
+ of the description <nobr>stands out</nobr>. <nobr>If three</nobr> or more
+ blanks in a row are found in the first line of a 'description', they will
+ be taken as a signal to tab to the left margin provided that the left
+ margin has not been passed.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2"><a name="region-fdescription">&nbsp;</a><a name="region-pdescription">&nbsp;</a></font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">fdescription</font>)</nobr><br><font color="#0000CC">item</font><br><nobr>@begin(<font color="#AA0000">pdescription</font>)</nobr><br><font color="#0000CC">text-1</font><br><br><font color="#0000CC">text-2</font><br><br><font color="#0000CC">text-3</font><br><nobr>@end(<font color="#AA0000">pdescription</font>)</nobr><br><nobr>@end(<font color="#AA0000">fdescription</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><code>&lt;<font color="#AA0000">dl</font>&gt;<br>&lt;<font color="#AA0000">dt</font>&gt;<br><font color="#0000CC">item</font><br>&lt;<font color="#AA0000">dd</font>&gt;<br><font color="#0000CC">text-1</font>&lt;<font color="#AA0000">br</font>&gt;<br><font color="#0000CC">text-2</font>&lt;<font color="#AA0000">br</font>&gt;<br><font color="#0000CC">text-3</font>&lt;<font color="#AA0000">br</font>&gt;<br><nobr>&lt;/<font color="#AA0000">dl</font>&gt;</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">definition list</td>
+</tr>
+
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="comments"></a>
+
+<hr>
+
+<h2>Comments</h2>
+
+<hr>
+
+<p>Comments produce no text in the final document and can be written as
+<a href="#inline">inline</a> or as <a href="#region">region</a> command:</p>
+
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">comment</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><a href="#inline">inline</a> comment</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">comment</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">comment</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><a href="#region">region</a> comment</td>
+</tr>
+</tbody></table></p>
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Nach oben</a></nobr></p>
+
+<a name="footnotes"></a>
+
+<hr>
+
+<h2>Footnotes</h2>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">foot</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">footnote</td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="indexing"></a>
+
+<hr>
+
+<h2>Indexing</h2>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">index</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;a name="index<font color="#0000CC">XX</font>"&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">nothing will appear in the printed text, but the 'text'
+ will appear in the index together with the current page number.</td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="headings"></a>
+
+<hr>
+
+<h2>Headings</h2>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>Scribe&nbsp;</nobr></td>
+ <td></td>
+ <td align="center"><nobr>HTML&nbsp;</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">majorheading</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">h1</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">h1</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">document title</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">unnumbered</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">h2</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">h2</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">unnumbered chapter (e.g. preface)</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">chapter</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">h2</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">h2</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">numbered chapter</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">appendix</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">h2</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">h2</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">appendix</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td colspan="6"><b>Scribe:</b> Notice that 'unnumbered', 'chapter', and
+ 'appendix' cause Scribe to start at the top of a new page.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">section</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">h3</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">h3</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">section</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">subsection</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">h4</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">h4</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">subsection</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">paragraph</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>&lt;<font color="#AA0000">h5</font>&gt;<font color="#0000CC">text</font>&lt;/<font color="#AA0000">h5</font>&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">paragraph</td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="title-page"></a>
+
+<hr>
+
+<h2>Title Page</h2>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">titlepage</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">titlepage</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">this will cause the title page to be a page by itself,
+ and text within the titlepage will be centered.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td colspan="4"><b>Scribe:</b> The title page for a technical report
+ usually has the title, author, and date of publication visible within a
+ box that will be reproduced on the cover of the report. <nobr>The
+ 'titlebox'</nobr> command can be used to put text in <nobr>this
+ box:</nobr></td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">titlebox</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">titlebox</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">this will produce a titlebox.</td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="whitespace"></a>
+
+<hr>
+
+<h2>Tab Stops and Whitespace</h2>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">tabclear</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">clear all tabs</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">tabset</font>(<font color="#0000CC">number</font> <font color="#0000CC">unit</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">set tab width to 'number' of units, 'unit' should be 'inch' or 'inches'</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">\</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">go to the right until the next tab. If there is no tab
+ stop to the right of the cursor position, then the cursor will be moved
+ to the right margin.</td>
+</tr>
+</tbody></table></p>
+
+<pre class="example">
+@tabset(.5 inches)
+@tabset(0.8 in, 3 in, 3.8 in)
+@tabset(1.5 inch)
+@tabset(0.8 inches)
+@tabset(0.5 inch)
+</pre>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">blankspace</font>(<font color="#0000CC">number</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">forces a 'number' units of whitespace</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">blankspace</font>(<font color="#0000CC">number <font color="#0000CC">unit</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">forces a 'number' units of whitespace, 'unit' should be 'inch' or 'inches'</td>
+</tr>
+</tbody></table></p>
+
+<pre class="example">
+@blankspace(0.3 inches)
+@blankspace(0.5 inch)
+@blankspace(0.3 inch)
+@blankspace(1 inch)
+@blankspace(5 inches)
+@blankspace(1)
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="breaks"></a>
+
+<hr>
+
+<h2>Line and Page Breaks</h2>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">*</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">force a line break</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">newpage</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">force a page break</td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cross-reference"></a>
+
+<hr>
+
+<h2>Cross References</h2>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">label</font>(<font color="#0000CC">word</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">define a label (text reference to a section or page number)</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">ref</font>(<font color="#0000CC">word</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">insert the section number of the label</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">pageref</font>(<font color="#0000CC">word</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">insert the page number of the label</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">tag</font>(<font color="#0000CC">word</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">define a tag (object reference to a figure or a table)</td>
+</tr>
+</tbody></table></p>
+
+<p><b>Scribe:</b> The difference between a 'label' and a tag is a bit
+subtle. <nobr>A section</nobr> document has many different sequences of
+numbers that identify the pieces <nobr>of it</nobr>. Pages are numbered
+sequentially, chapters and sections are usually numbered independently of
+the pages. Figures and tables are often numbered within a chapter, ignoring
+section numbers. <nobr>If you</nobr> want to attach a codeword to the
+section number of the section that contains a particular figure or table,
+then use '@label'. If you want to attach a codeword to the figure or table,
+rather than to the section that it is contained in, then use the '@tag'
+command.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="bibliography"></a>
+
+<hr>
+
+<h2>Bibliography and Citation</h2>
+
+<hr>
+
+<p>A bibliography is a labeled list of books, articles, or papers. <nobr>A
+citation</nobr> is a marker in the text that refers to an entry in the
+bibliography. Because Scribe selects and prints only those entries in a
+bibliography that are actually cited in the text, a common bibliography file
+may be used for many different documents. The bibliography file consists of
+a series of entries, each with an identifier.</p>
+
+<pre class="example">
+@book(<font color="#AA0000">Touretzky</font>
+ ,key "Touretzky"
+ ,author "Touretzky, David S."
+ ,title "LISP: a gentle introduction to symbolic computation"
+ ,address "New York"
+ ,publisher "Harper & Row"
+ ,year 1984
+ )
+
+@inproceedings(<font color="#AA0000">ICMCFugue</font>
+ ,key "Dannenberg"
+ ,author "Dannenberg, R. B. and C. L. Fraley"
+ ,title "Fugue: Composition and Sound Synthesis With Lazy Evaluation
+ and Behavioral Abstraction"
+ ,booktitle = "Proceedings of the 1989
+ International Computer Music Conference"
+ ,editor "T. Wells and D. Butler"
+ ,year = "1989"
+ ,organization = "International Computer Music Association"
+ ,address "San Francisco"
+ ,pages "76-79"
+ )
+</pre>
+
+<p>Then just put a '@cite' command into the text at the spot where the
+citation should appear:</p>
+
+<pre class="example">
+@cite(<font color="#AA0000">Touretzky</font>)
+@cite(<font color="#AA0000">icmcfugue</font>)
+</pre>
+
+<p><b>RBD:</b> HTML citations are translated by '<nobr>s2h.lsp</nobr>' to
+links according to data in '<nobr>docsrc/s2h/citations.lsp</nobr>'.
+<nobr>The actual</nobr> bibliographic references must be
+<nobr>hand-translated</nobr> <nobr>to HTML</nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="figures"></a>
+
+<hr>
+
+<h2>Figures and Tables</h2>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><code><nobr>@begin(<font color="#AA0000">figure</font>)</nobr><br><font color="#0000CC">text</font><br><nobr>@end(<font color="#AA0000">figure</font>)</nobr></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">define a region to insert an object</td>
+</tr>
+</tbody></table></p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">graphic</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">insert a picture</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">math</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">insert a rendered math formula</td>
+</tr>
+</tbody></table></p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">caption</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">add text to an object</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>@<font color="#AA0000">fillcaption</font>(<font color="#0000CC">text</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">add formatted text to an object and modify object counters</td>
+</tr>
+</tbody></table></p>
+
+<p>With the Scribe <a href="#cross-reference">@tag</a> command a label can
+be added to an object. The best place to put the
+<a href="#cross-reference">@tag</a> command is after the '@caption' or
+'@fillcaption' command. If the <a href="#cross-reference">@tag</a> command
+appears before the '@caption' or '@fillcaption' command, then the wrong
+figure number will get assigned to the tag, because the number will not yet
+have been incremented.</p>
+
+<p>The '@fillcaption' command is defined in the file
+'<nobr>docsrc/template/filcap.mss</nobr>':</p>
+
+<pre class="example">
+@textform[FillCaption="@begin(transparent)@modify(captionenv,fill,indent 0,
+leftmargin +0.5 inch,rightmargin +0.5 inch)@modify(figurecounter,
+numbered &lt;@@b[Figure@@ @#@:-@1:@@ @@ ]&gt;)@modify(tablecounter,
+numbered &lt;@@b[Figure@@ @#@:-@1:@@ @@ ]&gt;)@caption&lt;@parm&lt;text&gt;&gt;@~
+@end(transparent)"]
+</pre>
+
+<p>The exact meaning of the Scribe '@parm' and '@~' commands are currently
+unknown.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>Formatting of the Nyquist Manual</h2>
+
+<hr>
+
+<p>The 's2h.lsp' HTML converter assumes a number of definitions in Scribe
+source, so for example, <a href="#settings">@dash</a> is defined for
+<nobr>Scribe by:</nobr></p>
+
+<pre class="example">
+@commandstring(dash @Y[M])
+</pre>
+
+<p>In the Scribe output this will create an '<nobr>em-dash</nobr>'
+(horizontal dash with a width of the <nobr>letter 'm')</nobr>, but the
+'s2h.lsp' HTML converter will always translate <a href="#settings">@dash</a>
+to a hyphen character, regardless of the Scribe
+<a href="#settings">@commandstring</a> definition, which 's2h.lsp' ignores.
+<nobr>In other</nobr> words, 's2h.lsp' is not written to handle any of the
+mechanisms provided by Scribe to extend the command set, but there are some
+<nobr>built-in</nobr> extensions such as <a href="#settings">@dash</a> so
+that 's2h.lsp' can translate Nyquist manuals.</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>@<font color="#AA0000">codef</font>(<font color="#0000CC">name</font>)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><a href="#definitions">@codef</a> is used to define a
+ lisp function or variable. <nobr>A processor</nobr> uses this to extract
+ completion hint info for jNyqIDE.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>@<font color="#AA0000">pragma</font>(defn)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><a href="#html">@pragma(defn)</a> tells 's2h.lsp' that
+ the next <a href="#indexing">@index</a> marks a term's definition in
+ the manual.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>@<font color="#AA0000">index</font>(<font color="#0000CC">term</font>)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><a href="#indexing">@index</a> is used to insert 'term'
+ in the manual's index.</td>
+</tr>
+</tbody></table></p>
+
+<p>Although Scribe has no support for marking up why a location is indexed,
+'s2h.lsp' uses <nobr><a href="#html">@pragma(defn)</a></nobr> before
+<nobr><a href="#indexing">@index(term)</a></nobr> to indicate that this
+location in the text provides the definition of 'term'. This information
+helps 's2h.lsp' give priority to this location in the text in cases where
+term may be indexed from multiple locations. <nobr>In short</nobr>, if you
+define a term, you should insert:</p>
+
+<pre class="example">
+@pragma(defn)@index(<font color="#0000CC">term</font>)
+</pre>
+
+<p>at the beginning of the definition.</p>
+
+<p>Function definitions in the Nyquist manual should be documented like
+this:</p>
+
+<pre class="example">
+@begin(fndefs)
+@codef[myfunction(@pragma(defn)@index(myfunction) ... parameters ...]@\Description of myfunction.
+
+@codef[myotherfn(@pragma(defn)@index(myotherfn) ... parameters ...]@\Description of myothernfn.
+@end(fndefs)
+</pre>
+
+<p>Where one or more function definitions can be inside the
+<nobr><a href="#settings">@begin(fndefs)</a></nobr> and
+<nobr><a href="#settings">@end(fndefs)</a></nobr> brackets.</p>
+
+<p>Another style of documenting functions, used in the XLISP documentation
+is to document the function and provide indented detailed descriptions of
+each parameter and the return value. This style is shown here and uses
+<a href="#region-fdescription">@fdescription</a> and
+<a href="#region-pdescription">@pdescription</a>:</p>
+
+<pre class="example">
+@begin(fdescription)
+ (eval@pragma(defn)@index(eval) @i&lt;expr&gt;) @itemsep evaluate an xlisp expression
+@begin(pdescription)
+ @i&lt;expr&gt; @itemsep the expression to be evaluated
+
+ returns @itemsep the result of evaluating the expression
+@end(pdescription)
+@blankspace(1)
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<br>
+
+</body></html>
diff --git a/docsrc/sdl/part1.tex b/docsrc/sdl/part1.tex
new file mode 100755
index 0000000..d0e8a92
--- /dev/null
+++ b/docsrc/sdl/part1.tex
@@ -0,0 +1,606 @@
+% Manual de SDL
+% part1.tex
+% pmorales. Junio, 2007
+
+
+\section{Introduction}
+
+Usually, Computer Music compositions are formally specified by means
+of programming language algorithms. Owing to the fact that {\it Nyquist} is
+actually an extension of Lisp, this language can be used for both
+sound synthesis and algorithmic composition.
+
+In addition, Nyquist can be also employed for rendering music that is
+described as a note sequence, for instance, a score in traditional
+music notation. However, in this case, every note parameter has to be
+specified which makes difficult to compose music confortably.
+
+The {\it Score Description Library} (SDL) is aimed at facilitating the
+translation from traditional score notation to {\it Nyquist} source
+code and also allowing a fine control over the performance and synthesis
+parameters.
+
+\section{Description}
+\subsection{\textit{SDL} score example}
+
+A SDL score is a quoted list in which the notes along with the pitch, duration attributes and other arguments related to timing and
+synthesis parameters, are specified.
+
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm]
+; Begin of BWV 1069
+
+(setf *my-sdl-score*
+ '((TF 1)
+ (INIT-INSTR "i1" sinte) (INSTRUMENT "i1") (PWL-POINT :mm 100) (ATTR :idur 0.1)
+ 2 (:c4 1) :d4 (:e4 2) :c4 :g4 :e4 :a4 (:g4 1) :f4 (:g4 4)
+ (:a4 1) :c5 :f4 :a4 :g4 :f4 :e4 :g4 :f4 :a4 :d4 :f4 :e4 :d4 :c4 :d4 :e4 :f4 (:g4 2)
+ :a3 :c4 :d4 :f4
+ :g3 :b3 :c4 :e4 (:f3 1) :e4 :d4 :c4 :g3 :d4 :c4 :b3 (ATTR :idur 1) (LABEL :t1)
+ (:c4 4)))
+\end{Verbatim}
+
+\begin{itemize}
+\item \texttt{TF} stands for \textit{Time Factor}. All the durations will
+ be multiplied by this factor (default value is 1).
+\item \texttt{INIT-INSTR} declares an instrument to be used in
+ synthesis. The first argument \textit{``i1''} is the instrument name in
+ the SDL score. The second one is the {\it Nyquist} function name
+ which defines the instrument. This function must be defined independently from
+ the score by means of an expression \mbox{\texttt{(defun sinte
+ \ldots)}}
+
+
+
+\item \texttt{INSTRUMENT} causes that all the notes from now on are
+ synthesized by the instrument \textit{``i1''} until a new instrument
+ is specified.
+
+\item \texttt{PWL-POINT} defines a piece wise linear function in order
+ to set the time-variable parameters. For instance, \texttt{:mm} takes
+ a value of \texttt{100} when the instruction is called.
+
+
+\item \texttt{ATTR} sets the value of a constant parameter. The
+ parameter value is not changed until a new \texttt{ATTR} instruction
+ is reached. For example, the \texttt{:idur} parameter takes a
+ value of {\it 0.1} in every note until a new value is specified by a
+ new \texttt{ATTR}.
+
+
+\item \texttt{2} defines a 2 beat rest. Two different time types can
+ be considered: a {\it score time} measured in beat and a {\it physical
+ time} measured in second. A quarter has a duration of 4 beats.
+ The physical time is computed according to the score time, {\it tempo} and Time Factor {\tt TF}.
+
+\item \texttt{(:c4 1)} represents a note given by a C4 pitch and a 1
+ beat duration.(i.e, a sixteenth). Only pitch and duration are
+ specified. Pitch can be specified by using an alternative syntax.
+ Duration can be any {\it Lisp } expression. The rest of attributes the
+ needed for synthesis are provided by \texttt{ATTR} y
+ \texttt{PWL-POINT} instructions.
+
+
+\item \texttt{:d4} is a D4 pitch note and inherited duration of 1
+ beat. Rests do not alter the default duration. Changes in duration
+ are explicitly set by a note attribute.
+
+\item \texttt{LABEL} sets a time label aimed at synchronizing score
+ sections. {\tt LABEL} is related to the score time. Coincidence among
+ {\tt LABEL} references depends on the score {\it tempi} map.
+ Therefore, the user is responsible for controlling this issue.
+
+\end{itemize}
+
+\subsection{\textit{SDL} score processing}
+ A \textit{SDL} score is processed by using the \texttt{sdl->score} function. For example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+(load ``sdl'')
+(sdl->score *my-sdl-score*)
+
+=> ((0.3 0.15 (SINTE :PITCH 60 :MM 100 :IDUR 0.1))
+ (0.45 0.15 (SINTE :PITCH 62 :MM 100 :IDUR 0.1))
+ (0.6 0.3 (SINTE :PITCH 64 :MM 100 :IDUR 0.1))
+ (0.9 0.3 (SINTE :PITCH 60 :MM 100 :IDUR 0.1))
+ (1.2 0.3 (SINTE :PITCH 67 :MM 100 :IDUR 0.1))
+ +ldots
+)
+\end{Verbatim}
+
+
+As can be noticed, an {\it Xmusic} score is obtained as a result.
+
+Every {\it Xmusic} score event has three elements. The first one indicates the note starting time. The second one is the stretching factor and the third one is a call to the synthesis function. For instance, the first event:
+
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm]
+(0.3 0.15 (SINTE :PITCH 60 :MM 100 :IDUR 0.1))
+\end{Verbatim}
+starts at {\tt 0.3} seconds; the stretching factor is {\tt 0.15} and the synthesis function call is \texttt{(sinte :pitch 60 :idur 0.1)}.\par
+
+
+\texttt{:mm} argument is not a synthesis parameter but a control for {\it tempo}. Thus, {\tt sinte} implementation must not include any argument with this name.
+
+
+The strecthing factor multiplies the note duration by the stretching value. For instance, for a sytnthesis function call returning a 1 second note and a stretching factor equals to {\tt 0.15} the overall note duration would be {\tt 0.15}.
+
+One of the most remarkable features of Nyquist is the
+\textit{Behavioral Abstraction} which constitutes a framework for
+addressing context-dependent transformations that includes stretching.
+
+Every synthesis function has a default behavior that properly works in
+most of the situations. Nevertheless, this default behavior may not
+be appropriated in some cases. Therefore, for instance, the amplitude
+envelope attack of a sound may be changed by different strecthing factor
+values which can be unsuitable for a harpsichord-like sound.
+
+To fix this problem, the synthesis function can be defined so that the
+attack time is constant and independent form the stretching factor
+\footnote{Extensive knowledge of Behavioral Abstraction is required to
+ perform this task}.
+
+Alternatively, all the stretching factors can be set to \texttt{1} and
+a specific parameter can be used to indicate the specific duration of
+any event. \texttt{:idur} parameter is used for this purpose. This
+way, sound duration can be higher or lower allowing for several
+articulation modes from {\it legato} to {\it stacatto}. The time-control
+parameters can not be called \texttt{:dur} since this name is a {\it
+ Xmusic} reserved keyword.
+
+
+
+
+\texttt{sdl:normalize-score-duration} is used to set the stretching
+factors to 1 as is shown in the following example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+
+(sdl:normalize-score-duration (sdl->score *my-sdl-score*))
+
+=> ((0.3 1 (SINTE :PITCH 60 :MM 100 :IDUR 0.1))
+ (0.45 1 (SINTE :PITCH 62 :MM 100 :IDUR 0.1))
+ (0.6 1 (SINTE :PITCH 64 :MM 100 :IDUR 0.1))
+ (0.9 1 (SINTE :PITCH 60 :MM 100 :IDUR 0.1))
+ (1.2 1 (SINTE :PITCH 67 :MM 100 :IDUR 0.1))
+ +ldots
+ )
+\end{Verbatim}
+
+\subsection{\textit{SDL} score rendering}
+Once a \textit{SDL} score has been translated to \textit{Xmusic}
+format, a {\it Nyquist} {\it behavior} can be obtained by using the \texttt{timed-seq} function \footnote{It is also possible to use the \texttt{score-play} function in order to directly render the score}
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm]
+(play (timed-seq (sdl:normalize-score-duration (sdl->score *my-sdl-score*))))
+\end{Verbatim}
+
+
+\subsection{Synchronization}
+
+When dealing with complex scores it is suitable to split them into
+smaller parts. Temporal references must be
+established in order to synchronize all the parts involved. These
+temporal reference can be set by using a \texttt{LABEL}
+instruction. \texttt{sdl->timelabels} function is used to obtain the
+temporal references list. This data is registered as a property list
+of a symbol created on-the-fly. For example:
+
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+(setf *my-time-labels* (sdl->timelabels *my-sdl-score*))
+(print (symbol-plist *my-time-labels*))
+
+=> (:T1 64)
+\end{Verbatim}
+
+\texttt{AT-LABEL} instruction allow us to match the temporal label which has been
+previously specified by \texttt{LABEL} and another time value from a
+different score. The temporal references list must be sent, as an
+argument, to the \texttt{sdl->score} function as can be seen in the following example:
+
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm]
+(setf *my-time-labels* (sdl->timelabels *my-sdl-score*))
+
+(setf *voz-2*
+ '((TF 1)
+ (INIT-INSTR "i1" sinte) (INSTRUMENT "i1") (PWL-POINT :mm 100) (ATTR :idur 0.1)
+ (AT-LABEL :t1)
+ 2 (:g4 1) :a4 (:b4 2) :g4))
+
+(sdl->score *voz-2* *my-time-labels*)
+
+=> ((9.9 0.15 (SINTE :PITCH 67 :MM 100 :IDUR 0.1))
+ (10.05 0.15 (SINTE :PITCH 69 :MM 100 :IDUR 0.1))
+ (10.2 0.3 (SINTE :PITCH 71 :MM 100 :IDUR 0.1))
+ (10.5 0.3 (SINTE :PITCH 67 :MM 100 :IDUR 0.1)))
+\end{Verbatim}
+
+\subsubsection*{Warnings}
+
+Users should notice that time labels are actually score times (measured in beats), whereas in \textit{Xmusic} scores the time is specified in seconds, which in turn are mapped from the score time, the \texttt{TF} parameter and the \textit{tempi} map. For that reason, time labels always coincide in score time, but they have to use the same \texttt{TF} parameter and \textit{tempi} map to achieve a coincidence in physical time.
+
+\section{Reference guide}
+% Incluir ejemplos en los apartados que interese
+\subsection{Overall \textit{SDL} score structure}
+A \textit{SDL} score is a quoted list containing notes, rests or other elements related to synthesis and performance.
+The following elements have to be present in any \textit{SDL} score:
+
+\begin{itemize}
+ \item One instrument initialization \texttt{INIT-INSTR}.
+ \item One instrument assignment \texttt{INSTRUMENT}.
+ \item One tempo specification \texttt{:mm}, by means of either \texttt{PWL-POINT} or \texttt{ATTR}.
+ \item One note, at least.
+\end{itemize}
+Examples:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm]
+(setf *minimal-sco-1* '((INIT-INSTR "i1" xx) (INSTRUMENT "i1") (PWL-POINT :mm 100)
+ (:c4 2)))
+(setf *minimal-sco-2* '((INIT-INSTR "i2" yy) (INSTRUMENT "i2") (ATTR :mm 100) :c4))
+\end{Verbatim}
+Function \texttt{sdl->score} returns an error if the score does not have this basic data.
+
+\subsection{Pitch specification}
+Pitches can be given by using:
+
+\begin{itemize}
+ \item A number. The standard MIDI pitch scale has been adopted here (60 = C4). No tempered pitches are allowed when using floating point numbers (FLONUM).
+ \item The standard \textit{Nyquist} symbols. Example: \texttt{cs4} = C4 sharp = 61.
+ \item The standard \textit{lambda~Music} symbols\footnote{A library for music composition developed by Pedro Morales in \textit{Common Lisp}} Pitches are represented by symbols starting with a colon. Sharps and flats are notated by \texttt{\#} and \texttt{b}. Examples: \texttt{:c4 :C4 :c\#4 :C\#4 :cb4 :Cb4}
+ \item Quoted symbols. Examples: \texttt{'c4 'cs4 'c\#4 'cb4}
+ \item Strings. Examples: \texttt{``c4'' ``cs4'' ``c\#4'' ``cb4''}
+\end{itemize}
+Example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm]
+(setf *pitches* (list 60 60.0 c4 'c4 C4 'C4 cs4 df4 :c4 :c#4 :cb4 :df4
+ "c4" "cs4" "cb4" "c#4"))
+(mapcar #'sdl:pitch-lex *pitches*)
+
+=> (60 60 60 60 60 60 61 61 60 61 59 62 60 61 59 61)
+\end{Verbatim}
+
+\subsection{Durations}\label{duraciones}
+Durations are measured in beats. A quarter worth 4~beats; a half, 8~beats, and so on. Fractional durations are allowed.\par
+Durations can be given by:
+\begin{itemize}
+ \item A number.
+ \item A \textit{Lisp} expression. Example: \texttt{(/ 4.0 3.0)} represents a third of a quarter, that is, an eighth triplet.
+\end{itemize}
+
+
+\subsubsection*{Physical time and score time}
+Physical time (measured in seconds) is computed after score time (measured in beats), the \textit{time factor}, \texttt{TF} and the \textit{tempi} map (given by the parameter \texttt{:mm}).
+
+\subsubsection*{Global Time Factor}
+It is given by the score instruction \texttt{TF}. Example: \texttt{(TF 2.0)} multiplies by 2.0 all the durations in the score, whereas \texttt{(TF 0.5)} does it by 0.5. \par
+This instruction must appear only once in the score. Its default value is 1.0.
+\subsubsection*{\textit{Tempi}}
+\textit{Tempi} values are given by the parameter \texttt{:mm} whose value is set by means of the instructions \texttt{ATTR} or \texttt{PWL-POINT}.
+\subsection{Notes}
+There are two alternatives for specifying notes:
+\begin{itemize}
+ \item By using a two-element list (pitch and duration). Example: \texttt{(:c4 4)} is a quarter \texttt{C4}.
+ \item By the pitch only. Duration is taken from the last note.
+\end{itemize}
+The default duration can be changed by means of the \texttt{DUR} instruction.
+
+\subsection{Rests}
+Can be noted by:
+\begin{itemize}
+ \item A number representing the amount of beats.
+ \item \texttt{DELTA} or \texttt{PAU} instructions\footnote{Both instructions are equivalent.}, indicating the duration by a number or by a \textit{Lisp} expression.
+\end{itemize}
+Example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+(setf *sco3*
+ '((TF 1.0) ; Overall Time Factor
+ (INIT-INSTR ``i1'' xx) ; Preamble. instr. init.
+ (INSTRUMENT ``i1'') ; instr. assign.
+ (ATTR :mm 60) ; metronome MM=60. 1 quarter = 1 sec.
+ (:c4 4) ; c4 quarter
+ 4 ; quarter rest
+ :d4 ; d4. duration = quarter (inherited)
+ (PAU 8) ; half rest
+ (:e4 (/ 4.0 3.0)) ; e4. eighth triplet
+ :e4 ;
+ :e4 ;
+ (DELTA (* 2 4)) ; half rest
+ (:f4 (* 2 1.5)) ; f4 duration = 3 = dotted eighth
+ (DUR 4) ; current duration = 4 (quarter)
+ :g4 ; g4 duration = quarter
+ (DUR (/ 4.0 3.0)) ; current duration = triplet eighth
+ :a4 :a4 :a4 ; a4 triplets
+))
+\end{Verbatim}
+
+\subsection{Chords}
+Polyphonic music can be achieved in \textit{SDL} by gathering several scores. Nevertheless, \textit{SDL} predefined instructions can be more appropriated in simple cases. \par
+\texttt{CH} produces simultaneous notes, having the current duration. Example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+(setf *sco4*
+ '((TF 1.0) ; Overall Time Factor
+ (INIT-INSTR ``i1'' xx) ; preamble. init. instr.
+ (INSTRUMENT ``i1'') ; assign. instr.
+ (ATTR :mm 60) ; metronome MM=60. 1 quarter = 1 sec.
+ (:c4 4) ; c4 quarter
+ 4 ; quarter rest
+ (DUR 8) ; current duration = 8 = half
+ (CH :c4 :e4 :g4) ; three-note chord. duration = half
+ ;
+\end{Verbatim}
+\texttt{CH1} produces one note without increasing the time. Time increments can be indicated by the \texttt{DELTA} instruction. This way independent duration chords can be built for each note. Example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+(setf *sco5*
+ '((TF 1.0) ; Overall Time Factor
+ (INIT-INSTR ``i1'' xx) ; preamble. Init. instr.
+ (INSTRUMENT ``i1'') ; assign. instr.
+ (ATTR :mm 60) ; metronome MM=60. 1 quarter = 1 sec.
+ (:c4 4) ; c4 quarter
+ 4 ; quarter rest
+ (CH1 :c4 4) ; CHORD BEGINNING. c4 quarter
+ (CH1 :e4 8) ; e4 half. SIMULTANEOUS BEGINNING c4
+ (:g4 4) ; g4 quarter. SIMULTANEOUS BEGINNING. c4, e4
+ (:c5 4) ; c5 quarter. Starts when g4 ends
+ ; e4 keeps playing because of the half
+ ; duration
+ (CH1 :c4 8) ; Arpeggiated chord BEGINNING
+ (DELTA 0.2) ; time increases 0.2 beats
+ (CH1 :e4 (- 8 0.2)) ; e4 starts 0.2 beats after c4
+ ; ends at the same time
+ (DELTA 0.2) ; time increases 0.2 beats
+ (CH1 :g4 (- 8 0.2 0.2)) ; g4. another arpeggio note
+ (:c5 (- 8 0.2 0.2 0.2)) ; c5 final arpeggio note
+ (:g3 4) ; g3 quarter after arpeggio
+)) ; (total arpeggio duration = 8)
+\end{Verbatim}
+
+ \subsection{Instruments}
+In every score notes must be tied to a synthesis instrument. \texttt{INIT-INSTR} is the instruction used for mapping the score instrument name to a \textit{Nyquist} function that implements the instrument itself.\par
+The \texttt{INSTRUMENT} instruction assigns the instrument name to the notes. The current instrument can be set by a new \texttt{INSTRUMENT} instruction. Example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+(setf *sco6*
+ '((TF 1.0)
+ (INIT-INSTR ``i1'' flute) ; assign i1 instrument score name
+ ; to the +textbf[flute] function
+ (INSTRUMENT ``i1'') ; current instr. = i1
+ (ATTR :mm 60)
+ (:c4 4) ; rendered by +textbf[flute]
+ 4
+ (INIT-INSTR ``i2'' clarinet) ; assign i2 instrument score name
+ ; to the +textbf[clarinet] function
+ :d4 ; rendered by +textbf[flute]
+ (INSTRUMENT ``i2) ; current instr. = i2
+ :e4 ; rendered by +textbf[clarinet]
+))
+\end{Verbatim}
+
+\subsection{Attributes}
+In \textit{SDL} scores, parameters for synthesis functions in \textit{Nyquist} are defined by \texttt{ATTR} and \texttt{PWL-POINT} instructions.\par
+\begin{itemize}
+ \item \texttt{ATTR} has two arguments. The first one is the parameter name (starting with a colon). The second one is used just to set the parameter value. The current parameter value can be changed by another \texttt{ATTR} instruction.
+ \item \texttt{PWL-POINT} behaves like the \texttt{ATTR} instruction. The only difference is that a linear interpolation is performed between two consecutive \texttt{PWL-POINT} instructions.
+\end{itemize}
+It is not allowed to define the same attribute value by using both \texttt{ATTR} and \texttt{PWL-POINT} instructions.
+
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+(setf *sco7*
+ '((TF 1.0)
+ (INIT-INSTR ``i1'' flute) ; maps i1 to +textbf[flute]
+ (INSTRUMENT ``i1'') ; current instr. i1 (flute)
+ (:c4 4) ; mm = 100; rel = 4; decay = 3.2
+ (ATTR :decay 3.2) ;
+ (:d4 4) ; mm = 100; rel = 4; decay = 5.1
+ (ATTR :decay 5.1)
+ (:e4 4) ; mm = 100; rel = 4; decay = 5.1
+ (PWL-POINT :rel 4.0)
+ (PWL-POINT :mm 100)
+ (:f4 4) ; mm = 100; rel = 4; decay = 5.1
+ (:g4 4) ; mm = 100; rel = 5; decay = 5.1
+ (:a4 4) ; mm = 100; rel = 6; decay = 5.1
+ (PWL-POINT :rel 7.0)
+ (:b4 4) ; mm = 100; rel = 7; decay = 5.1
+ (:c5 4) ; mm = 100; rel = 7; decay = 5.1
+ (:d5 4) ; mm = 100; rel = 7; decay = 5.1
+ (PWL-POINT :rel 7.0)
+ (:e5 4) ; mm = 100; rel = 7; decay = 5.1
+))
+\end{Verbatim}
+
+
+\subsection{Tempi}
+\texttt{ATTR} can be used in case of sharp tempo changes, whereas \texttt{PWL-POINT} performs gradual tempo changes. Example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+(setf *sco-8*
+ '((TF 1)
+ (INIT-INSTR "i1" flute) (INSTRUMENT "i1")
+ (:c4 4)
+ (PWL-POINT :mm 60)
+ :d4 :e4 :f4 :g4
+ (PWL-POINT :mm 60)
+ :e5 :d5 :c5 :b4 :c5
+ (PWL-POINT :mm 30)))
+
+(score-print (sdl->score *voz-8*))
+
+=> ((0 1 (FLUTE :PITCH 60 :MM 60))
+ (1 1 (FLUTE :PITCH 62 :MM 60))
+ (2 1 (FLUTE :PITCH 64 :MM 60))
+ (3 1 (FLUTE :PITCH 65 :MM 60))
+ (4 1 (FLUTE :PITCH 67 :MM 60))
+ (5 1 (FLUTE :PITCH 76 :MM 60))
+ (6 1.11111 (FLUTE :PITCH 74 :MM 54)) ; ritardando
+ (7.11111 1.25 (FLUTE :PITCH 72 :MM 48))
+ (8.36111 1.42857 (FLUTE :PITCH 71 :MM 42))
+ (9.78968 1.66667 (FLUTE :PITCH 72 :MM 36))
+)
+\end{Verbatim}
+\subsection{Macros}
+A basic macro implementation is available in \textit{SDL} which allows for a specification of repetitive structures such as tremeloes, etc. The \texttt{MAC} instruction is used for this purpose. The first argument is the name of a \textit{Lisp} function and the rest ones represents the arguments for this function. Example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+; +textit[Nyquist] function that repeats an event n times
+
+(defun sdl-repeat (n quoted-event)
+ (let (result)
+ (dotimes (i n (apply #'append result))
+ (push quoted-event result))))
+
+; macro +textit[sdl-repeat] called from a score
+; the sequence :f4 :g4 is repeated 4 times
+
+(setf *score*
+ '((TF 1.0)
+ (INIT-INSTR "i1" flute2)(INSTRUMENT "i1")(ATTR :mm 60)
+ (:e4 4) (MAC sdl-repeat 4 (:f4 :g4))))
+
+(sdl->score *score*))
+
+=> ((0 1 (FLUTE2 :PITCH 64 :MM 60))
+ (1 1 (FLUTE2 :PITCH 65 :MM 60)) ; f4 repite 4 veces f4 g4
+ (2 1 (FLUTE2 :PITCH 67 :MM 60)) ; g4
+ (3 1 (FLUTE2 :PITCH 65 :MM 60)) ; f4
+ (4 1 (FLUTE2 :PITCH 67 :MM 60)) ; g4
+ (5 1 (FLUTE2 :PITCH 65 :MM 60)) ; f4
+ (6 1 (FLUTE2 :PITCH 67 :MM 60)) ; g4
+ (7 1 (FLUTE2 :PITCH 65 :MM 60)) ; f4
+ (8 1 (FLUTE2 :PITCH 67 :MM 60)) ; g4
+)
+\end{Verbatim}
+Macros can be also used to control the parameter values through a \textit{Lisp} function instead of specifying them note by note. Example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+; pitches controlled by logistic equation
+
+(setf *logistica* 0.3)
+(setf *k* 3.97)
+
+(defun logistica ()
+ (setf *logistica* (* *k* (- 1.0 *logistica*) *logistica*)))
+
+(defun call-logistica (n dur pitch-min pitch-interval)
+ (let (result)
+ (dotimes (i n (reverse result))
+ (push (list (+ pitch-min (round (* (logistica) pitch-interval))) dur)
+ result))))
+
+(setf *score2*
+ '((TF 1.0)
+ (INIT-INSTR "i1" flute2)(INSTRUMENT "i1")(ATTR :mm 60)
+ (:e4 4) (MAC call-logistica 5 4 30 15)))
+
+(score-print (sdl->score *score2*))
+
+=> ((0 1 (FLUTE2 :PITCH 64 :MM 60))
+ (1 1 (FLUTE2 :PITCH 43 :MM 60))
+ (2 1 (FLUTE2 :PITCH 38 :MM 60))
+ (3 1 (FLUTE2 :PITCH 45 :MM 60))
+ (4 1 (FLUTE2 :PITCH 31 :MM 60))
+ (5 1 (FLUTE2 :PITCH 34 :MM 60))
+)
+\end{Verbatim}
+
+\subsection{\textit{SDL} Functions}
+\texttt{FUN} instruction allows for defining score events through \textit{Lisp} functions. \par
+\textbf{Warning:} The inclusion of attribute \texttt{:mm} is mandatory if the event to be generated is a note. Example:
+\begin{Verbatim}[frame=single,fontsize=\small,numbers=left,numbersep=2mm,
+ commandchars=+\[\]]
+(load "xm")
+
+(setf *my-durations* (make-heap (list 4 6 8)))
+
+(defun heap-durations (inicio pitch)
+ (let ((dur (next *my-durations*)))
+ (list inicio dur (list 'sinte-fun :pitch pitch :mm 60 :idur dur))))
+
+(setf *score3*
+ '((TF 1.0)
+ (INIT-INSTR "i1" flute2)(INSTRUMENT "i1")(ATTR :mm 60)
+ (:e4 4)
+ (FUN #'heap-durations 1 :c4)
+ (FUN #'heap-durations 2 :d4)
+ (FUN #'heap-durations 3 :e4)
+ (FUN #'heap-durations 4 :c4)
+ (FUN #'heap-durations 7 :d4)))
+
+(sdl->score *score3*)
+
+=> ((0 1 (FLUTE2 :PITCH 64 :MM 60))
+ (0.25 1.5 (SINTE-FUN :PITCH :C4 :MM 60 :IDUR 6))
+ (0.5 1 (SINTE-FUN :PITCH :D4 :MM 60 :IDUR 4))
+ (0.75 2 (SINTE-FUN :PITCH :E4 :MM 60 :IDUR 8))
+ (1 1.5 (SINTE-FUN :PITCH :C4 :MM 60 :IDUR 6))
+ (1.75 1 (SINTE-FUN :PITCH :D4 :MM 60 :IDUR 4))
+)
+\end{Verbatim}
+
+\section{Reference summary}
+\subsection{\textit{SDL} format for score instructions}
+
+\noindent\texttt{(TF args: time-factor)} \par
+Overall Time Factor. All the durations in the score are multiplied by this factor.\\
+
+\noindent\texttt{(TIME-IN-SECONDS)}\par
+No arguments needed. Durations are measured in seconds when tempo is set to~60.\\
+
+\noindent\texttt{(DUR lisp-expr)}\par
+Sets the value of the current duration. Any \textit{Lisp} expression can be used as argument.\\
+
+\noindent\texttt{(DELTA lisp-expr)}\par
+ Increases the time value.\\
+
+\noindent\texttt{(PAU lisp-expr)}\par
+ The same as \texttt{DELTA}.\\
+
+\noindent\texttt{(INIT-INSTR string function-name)}\par
+Initializes an instrument. It maps the score name instrument \texttt{string} to the synthesis function \texttt{function-name}.\\
+
+\noindent\texttt{(INSTRUMENT string)}\par
+ Sets the current instrument to \texttt{string}. The notes following this instruction are rendered by the instrument \texttt{string} until a new instrument is set.\\
+
+\noindent\texttt{(ATTR :symbol lisp-expr)} \par
+Sets \texttt{:symbol} value to \texttt{lisp-expr}. The first argument must start with a colon. The value for this attribute is kept until a new \texttt{ATTR} instruction is reached.\\
+
+\noindent\texttt{(PWL-POINT :symbol lisp-expr)}\par
+ Behaves like \texttt{ATTR}. The only difference is that a linear interpolation is performed between two consecutive \texttt{PWL-POINT} instructions.\\
+
+\noindent\texttt{(CH \&rest pitches)} \par
+Produces a chord containing the pitches given by its argument and the current duration.\\
+
+\noindent\texttt{(CH1 pitch duration)} \par
+Produces a note whose pitch and duration are given by the arguments. Time is not increased, so that the next event starts at the same time.\\
+
+\noindent\texttt{(FUN \#'function-name \&rest args)} \par
+Calls the function \texttt{function-name} sending the arguments in the \texttt{args} list. The returning value must be an event to be added to an Xmusic score. This event has to be processed by the \textit{Nyquist} function \texttt{timed-seq}. Hence, the event must follow the format \texttt{(start-time stretching-factor synthesis-function-call)}\\
+
+\noindent\texttt{(MAC macro-name \&rest args)} \par
+Calls the function \texttt{macro-name} sending the arguments in the \texttt{args} list. The returning value must be \textit{SDL} code which replaces the call to the macro. \\
+
+\noindent\texttt{number}\par
+ This is actually a rest of \texttt{number} beat duration.\\
+
+\noindent\texttt{symbol}\par
+A note whose pitch is given by \texttt{symbol} and with the current duration.\\
+
+\noindent\texttt{(pitch dur)} \par
+Note specified by pitch and dur arguments.
+
+\subsection{\textit{SDL} library functions}
+\noindent\texttt{(sdl->score score-data \&optional time-marks)}\par
+Produces an \textit{Xmusic} score consisting of a \mbox{\texttt{(onset-time stretch-factor synthesis-function)}} format event list.\par
+\noindent\texttt{score-data} is a \textit{SDL} score. \texttt{time-marks} is a symbol whose property list contains the time labels to be referenced from \texttt{score-data}.\\
+
+\noindent\texttt{(sdl->timelabels score-data \&optional time-marks)}\par
+Returns a symbol whose property-list contains the time labels in \texttt{time-marks} added to \texttt{score-data} time labels. Sinchronicity can be ensured by using time labels.
+
+\noindent\texttt{(sdl:normalize-score-duration score)}\par
+\texttt{score} is an \textit{Xmusic} score. This function sets all the event stretching factors to 1.0. This is intended for making synthesis parameters independent from notes duration.
+
+\section{\textit{lambda~Music} compatibility}
+\textit{lambda Music} is a library developed in Common~Lisp and intended for MIDI rendering. Many scores from \textit{lambda~Music} can be converted to \textit{SDL} by introducing just minor changes.
+
+\section{Final remarks}
+This library is just an attempt to facilitate the music transcription from traditional notation to synthesis in \textit{Nyquist}. Currently it is under development and therefore some features have to be improved. For instance, the inconsistency between physical and score time. In addition, an extended implementation of the macros should be considered.
+
diff --git a/docsrc/sdl/pjmcfg.sty b/docsrc/sdl/pjmcfg.sty
new file mode 100755
index 0000000..f734661
--- /dev/null
+++ b/docsrc/sdl/pjmcfg.sty
@@ -0,0 +1,127 @@
+% ------------------------
+% PAQUETE DE CONFIGURACION
+% EJERCICIO FINAL de LaTeX
+% pjm. Junio, 2007
+% ------------------------
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{pjmcfg}[2007/06/07 pjm]
+
+
+% Estilo de pagina
+
+\newcommand{\ps@pjmx}{%
+ \renewcommand{\@oddhead}{\sffamily \rightmark \hfill \thepage}
+ \renewcommand{\@evenhead}{\sffamily \thepage \hfill Score Description Library}
+ \renewcommand{\@oddfoot}{}
+ \renewcommand{\@evenfoot}{}
+ \renewcommand{\sectionmark}[1]{%
+ \markright{\MakeUppercase{\thesection.\quad ##1}}}}
+
+% Dimensiones
+
+\setlength{\hoffset}{-1in}
+\setlength{\oddsidemargin}{2cm}
+\setlength{\evensidemargin}{2.5cm}
+\setlength{\textwidth}{\paperwidth}
+\addtolength{\textwidth}{-\oddsidemargin}
+\addtolength{\textwidth}{-\evensidemargin}
+\setlength{\voffset}{-1in}
+\setlength{\topmargin}{2cm}
+\setlength{\headsep}{0.5cm}
+\setlength{\footskip}{1.5cm}
+\setlength{\textheight}{\paperheight}
+\addtolength{\textheight}{-2\topmargin}
+\addtolength{\textheight}{-\footskip}
+
+
+% Titulos de secciones
+
+\renewcommand{\section}{\@startsection{section}{1}{0ex}%
+ {-3.5ex plus -1ex minus -0.2ex}%
+ {2.3ex plus 0.2ex}%
+ {\normalfont\Large\bfseries\sffamily}}
+\renewcommand{\subsection}{\@startsection{subsection}{2}{0ex}%
+ {-3.25ex plus -1ex minus -0.2ex}%
+ {1.5ex plus 0.2ex}%
+ {\normalfont\large\bfseries\sffamily}}
+\renewcommand{\subsubsection}{\@startsection{subsubsection}{3}{0ex}%
+ {-3.25ex plus -1ex minus -0.2ex}%
+ {1.5ex plus 0.2ex}%
+ {\normalfont\normalsize\bfseries\itshape}}
+
+% estos mantienen su configuracion por defecto
+% \newcommand{\paragraph}{\@startsection{paragraph}{4}{0ex}%
+% {3.25ex plus 1ex minus 0.2ex}%
+% {-1em}%
+% {\normalfont\normalsize\bfseries}}
+% \newcommand{\subparagraph}{\@startsection{subparagraph}{5}{\parindent}%
+% {3.25ex plus 1ex minus 0.2ex}%
+% {-1em}%
+% {\normalfont\normalsize\bfseries}}
+
+
+% Leyenda de figuras y cuadros
+
+\renewcommand{\@makecaption}[2]{%
+ \vspace{\abovecaptionskip}
+ \sbox{\@tempboxa}{\textbf{#1}. #2}%
+ \ifdim \wd\@tempboxa >\linewidth
+ \textbf{#1}. #2\par
+ \else
+ \global\@minipagefalse
+ \makebox[\linewidth]{\hfil\usebox{\@tempboxa}\hfil}%
+ \fi
+ \vspace{\belowcaptionskip}}
+
+
+
+% Definicion de ordenes
+
+
+% flecha para resaltar el inicio de un parrafo
+\newcommand{\flecha}{\noindent\ding{'324}}
+
+
+% -----------------------------------------------------------
+% \figura{nombre-fichero}{argumentos}{titulo}{etiqueta}
+% Resultado:
+% Inserta una figura. ``La figura~\ref{etiqueta} muestra...''
+% permite referenciar la figura desde el texto.
+% Argumentos: width=Xcm,height=Ycm,angle=Z
+% ------------------------------------------------------------
+
+\newcommand{\figura}[4]{%
+
+ \begin{figure}[ht]
+ \begin{center}
+ \includegraphics[#2]{#1}
+ \caption{#3}
+ \label{#4}
+ \end{center}
+ \end{figure}
+}
+
+% Entornos
+
+% -----------------------------------------------------------
+% \begin{tabla}{titulo}{etiqueta}
+% ... (contenido tabla)
+% \end{tabla}
+% Resultado:
+% Inserta una tabla.
+% Contenido de la tabla se define mediante el entorno 'tabular'
+% ``Tabla~\ref{etiqueta}'' permite referenciar la tabla.
+% -----------------------------------------------------------
+
+\newenvironment{tabla}[2]{%
+ \begin{table}[ht]
+ \caption{#1}
+ \label{#2}
+ \begin{center}}
+ {\end{center}
+ \end{table}}
+
+
+% fin del paquete
+\endinput
diff --git a/docsrc/sdl/sdl-man.tex b/docsrc/sdl/sdl-man.tex
new file mode 100755
index 0000000..c101c3c
--- /dev/null
+++ b/docsrc/sdl/sdl-man.tex
@@ -0,0 +1,87 @@
+\documentclass[a4paper,11pt,twoside,titlepage]{article}
+
+%\usepackage[T1]{fontenc}
+%\usepackage[spanish]{babel}
+\usepackage{graphicx}
+\usepackage{makeidx}
+\usepackage{amsmath}
+\usepackage{pifont}
+\usepackage{fancyvrb}
+\usepackage{pjmcfg}
+
+% subordinacion de contadores
+\numberwithin{figure}{section}
+\numberwithin{table}{section}
+\numberwithin{equation}{section} % AVISO: no hay ecuaciones numeradas en el texto
+
+
+\makeindex
+
+\pagestyle{pjmx}
+
+
+
+\begin{document}
+
+% TITULO -----------------------------------------------------------------------
+
+\begin{titlepage}
+
+% titulo
+ {\ \vfill \Huge\bfseries\sffamily \hfill Score Description Library\\[0.5cm]
+ \mdseries \mbox{} \hfill Reference Manual\\
+ \rule{\textwidth}{1mm}} \\[0.2cm]
+% autor
+ {\sffamily \mbox{} \hfill Pedro J. Morales.} \\
+{\sffamily \mbox{} \hfill English translation by Luis Rodr\'iguez and Pedro J. Morales.} \\
+
+
+% fecha
+ {\sffamily \hfill \today} \\[1cm]
+
+\end{titlepage}
+
+% REVERSO DEL TITULO EN BLANCO ------------------------------------------------
+\thispagestyle{empty}
+\mbox{}
+\pagebreak
+
+
+% TABLA DE CONTENIDOS, FIGURAS, CUADROS ---------------------------------------
+
+% inicia contador de paginas (MANEJO DE CONTADORES)
+\setcounter{page}{1}
+% numeracion de paginas en roman
+\renewcommand{\thepage}{\roman{page}}
+% comando equivalente
+% \pagenumbering{roman}
+
+
+\tableofcontents
+%\listoffigures
+%\listoftables
+
+\newpage
+
+% INICIO DEL TEXTO ------------------------------------------------------------
+
+% inicia contador de paginas
+\setcounter{page}{1}
+% las paginas se numeran en arabic
+\renewcommand{\thepage}{\arabic{page}}
+% comando equivalente
+% \pagenumbering{arabic}
+
+
+\input{part1}
+
+
+% referencias
+% \bibliographystyle{alpha}
+% \bibliography{ejfinal}
+
+
+% indice alfabetico
+% \printindex
+
+\end{document} \ No newline at end of file
diff --git a/docsrc/template/filcap.mss b/docsrc/template/filcap.mss
new file mode 100644
index 0000000..2c1bb8a
--- /dev/null
+++ b/docsrc/template/filcap.mss
@@ -0,0 +1,5 @@
+@textform[FillCaption="@begin(transparent)@modify(captionenv,fill,indent 0,
+leftmargin +0.5 inch,rightmargin +0.5 inch)@modify(figurecounter,
+numbered <@@b[Figure@@ @#@:-@1:@@ @@ ]>)@modify(tablecounter,
+numbered <@@b[Figure@@ @#@:-@1:@@ @@ ]>)@caption<@parm<text>>@~
+@end(transparent)"]
diff --git a/docsrc/toafs.bat b/docsrc/toafs.bat
new file mode 100644
index 0000000..3a84c9d
--- /dev/null
+++ b/docsrc/toafs.bat
@@ -0,0 +1,5 @@
+copy nyquist\*.mss p:\doc\man\nyquist
+copy nyquist\*.ps p:\doc\man\nyquist
+copy bib\music.bib p:\doc\man\bib\music.bib
+copy template\filcap.mss p:\doc\man\template\filcap.mss
+copy xlisp\*.mss p:\doc\man\xlisp
diff --git a/docsrc/toafs.sh b/docsrc/toafs.sh
new file mode 100644
index 0000000..e2c30f6
--- /dev/null
+++ b/docsrc/toafs.sh
@@ -0,0 +1,5 @@
+scp nyquist/*.mss rbd@linux.gp.cs.cmu.edu:doc/man/nyquist
+scp nyquist/*.ps rbd@linux.gp.cs.cmu.edu:doc/man/nyquist
+scp bib/music.bib rbd@linux.gp.cs.cmu.edu:doc/man/bib/music.bib
+scp template/filcap.mss rbd@linux.gp.cs.cmu.edu:doc/man/template/filcap.mss
+scp xlisp/*.mss rbd@linux.gp.cs.cmu.edu:doc/man/xlisp
diff --git a/docsrc/xlisp/intgen.mss b/docsrc/xlisp/intgen.mss
new file mode 100644
index 0000000..dcd009d
--- /dev/null
+++ b/docsrc/xlisp/intgen.mss
@@ -0,0 +1,241 @@
+This documentation describes Intgen, a program for generating XLISP to C
+interfaces. Intgen works by scanning @code(.h) files with special comments in
+them. Intgen builds stubs that implement XLISP SUBR's. When the SUBR is
+called, arguments are type-checked and passed to the C routine declared in
+the @code(.h) file. Results are converted into the appropriate XLISP type and
+returned to the calling XLISP function. Intgen lets you add C functions
+into the XLISP environment with very little effort.
+
+The interface generator will take as command-line input:
+@begin(itemize)
+the name of the @code(.c) file to generate (do not include the @code(.c) extension; e.g. write
+@code(xlexten), not @code(xlexten.c));
+
+a list of @code(.h) files.
+@end(itemize)
+Alternatively, the command line may specify a command file from which to read file names. The command file name should be preceded by "@@", for example:
+@begin(example)
+intgen @@sndfns.cl
+@end(example)
+reads sndfns.cl to get the command-line input. Only one level of indirection is allowed.
+
+The output is:
+@begin(itemize)
+a single @code(.c) file with one SUBR defined for each designated
+routine in a @code(.h) file.
+
+a @code(.h) file that declares each new C routine. E.g. if the @code(.c) file is named @code(xlexten.c), this file will be named @code(xlextendefs.h);
+
+a @code(.h) file that extends the SUBR table used by Xlisp. E.g. if the @code(.c) file is named @code(xlexten.c), then this file is named @code(xlextenptrs.h);
+
+a @code(.lsp) file with lisp initialization expressions copied from the
+@code(.h)
+files. This file is only generated if at least one initialization expression is encountered.
+@end(itemize)
+
+For example, the command line
+@begin(example)
+intgen seint ~setypes.h access.h
+@end(example)
+generates the file @code(seint.c), using declarations in @code(setypes.h)
+and @code(access.h). Normally, the @code(.h) files are included by the
+generated file using @code(#include) commands. A @code(~) before a file
+means do not include the @code(.h) file. (This may be useful if you extend
+@code(xlisp.h), which will be included anyway). Also generated will be
+@code(setintdefs.h) and @code(seintptrs.h).
+
+@subsection(Extending Xlisp)@index(Extending Xlisp)
+Any number of @code(.h) files may be named on the command line to Intgen,
+and Intgen will make a single @code(.c) file with interface routines for all
+of the @code(.h) files. On the other hand, it is not necessary to put all
+of the extensions to Xlisp into a single interface file. For example, you
+can run Intgen once to build interfaces to window manager routines, and
+again to build interfaces to a new data type. Both interfaces can be linked
+into Xlisp.
+
+To use the generated files, you must compile the @code(.c) files and link
+them with all of the standard Xlisp object files. In addition, you must
+edit the file @code(localdefs.h) to contain an @code(#include) for each
+@code(*defs.h) file, and edit the file @code(localptrs.h) to include each
+@code(*ptrs.h) file. For example, suppose you run Intgen to build
+@code(soundint.c), @code(fugueint.c), and @code(tableint.c). You would then
+edit @code(localdefs.h) to contain the following:
+@begin(example)
+#include "soundintdefs.h"
+#include "fugueintdefs.h"
+#include "tableintdefs.h"
+@end(example)
+and edit @code(localptrs.h) to contain:
+@begin(example)
+#include "soundintptrs.h"
+#include "fugueintptrs.h"
+#include "tableintptrs.h"
+@end(example)
+These @code(localdefs.h) and @code(localptrs.h) files are in turn included
+by @code(xlftab.c) which is where Xlisp builds a table of SUBRs.
+
+To summarize, building an interface requires just a few simple steps:
+@begin(itemize)
+Write C code to be called by Xlisp interface routines. This C code does the
+real work, and in most cases is completely independent of Xlisp.
+
+Add comments to @code(.h) files to tell Intgen which routines to build
+interfaces to, and to specify the types of the arguments.
+
+Run Intgen to build interface routines.
+
+Edit @code(localptrs.h) and @code(localdefs.h) to include generated
+@code(.h) files.
+
+Compile and link Xlisp, including the new C code.
+@end(itemize)
+
+@section(Header file format)@index(Header file format)
+
+Each routine to be interfaced with Xlisp must be declared as
+follows:
+@begin(example)
+@i(type-name) @i(routine-name)(); /* LISP: (@i(func-name) @i(type@-(1)) @i(type@-(2)) ...) */
+@end(example)
+The comment may be on the line following the declaration, but the
+declaration and the comment must each be on no more than one line.
+The characters @code(LISP:) at the beginning of the comment mark routines
+to put in the interface. The comment also gives the
+type and number of arguments. The function, when accessed from lisp will
+be known as @I(func-name), which need not bear any relationship to
+@i(routine-name). By convention, underscores in the C @i(routine-name)
+should be converted to dashes in @i(func-name), and @i(func-name) should be in
+all capitals. None of this is enforced or automated though.
+
+Legal type_names are:
+@begin(description)
+@code(LVAL)@\returns an Xlisp datum.
+
+@code(atom_type)@\equivalent to @code(LVAL), but the result is expected to
+be an atom.
+
+@code(value_type)@\a value as used in Dannenberg's score editor.
+
+@code(event_type)@\an event as used in Dannenberg's score editor.
+
+@code(int)@\interface will convert int to Xlisp @code(FIXNUM).
+
+@code(boolean)@\interface will convert int to @code( T) or @code(nil).
+
+@code(float) or @code(double)@\interface converts to @code(FLONUM).
+
+@code(char *) or @code(string) or @code(string_type)@\interface converts to @code(STRING). The result string will be copied into the XLISP heap.
+
+ void@\interface will return @code(nil).
+@end(description)
+
+It is easy to extend this list. Any unrecognized type will
+be coerced to an @code(int) and then returned as a @code(FIXNUM), and a warning will be
+issued.
+
+The ``@code(*)'' after char must be followed by @i(routine-name) with
+no intervening space.
+
+Parameter types may be any of the following:
+@begin(description)
+@code(FIXNUM)@\C routine expects an int.
+
+@code(FLONUM) or @code(FLOAT)@\C routine expects a @code(double).
+
+@code(STRING)@\C routine expects @code(char *), the string is not copied.
+
+@code(VALUE)@\C routine expects a @code(value_type). (Not applicable to Fugue.)
+
+@code(EVENT)@\C routine expects an @code(event_type). (Not applicable to Fugue.)
+
+@code(ANY)@\C routine expects @code(LVAL).
+
+@code(ATOM)@\C routine expects @code(LVAL) which is a lisp atom.
+
+@code(FILE)@\C routine expects @code(FILE *).
+
+@code(SOUND)@\C routine expects a @code(SoundPtr).
+
+@end(description)
+Any of these may be followed by ``@code(*)'': @code(FIXNUM*), @code(FLONUM*), @code(STRING*), @code(ANY*), @code(FILE*),
+indicating C routine expects @code(int *), @code(double *), @code(char **), @code(LVAL *), or @code(FILE **) .
+This is basically a mechanism for returning more than one value, @i(not)
+a mechanism for clobbering XLisp values. In this spirit, the interface
+copies the value (an @code(int), @code(double), @code(char *), @code(LVAL), or @code(FILE *)) to a local variable
+and passes the address of that variable to the C routine. On return,
+a list of resulting ``@code(*)'' parameters is constructed and bound to the
+global XLisp symbol @code(*RSLT*@index(*RSLT*)). (Strings are copied.) If the C routine is void, then the result list is also returned by the corresponding XLisp function.
+
+Note 1: this does not support C routines like strcpy that modify strings,
+because the C routine gets a pointer to the string in the XLisp heap.
+However, you can always add an intermediate routine that allocates
+space and then calls @code(strcpy), or whatever.
+
+Note 2: it follows that a new XLisp @code(STRING) will be created for each @code(STRING*) parameter.
+
+Note 3: putting results on a (global!) symbol seems a bit unstructured, but note that one could write a multiple-value binding macro that hides this ugliness from the user if desired. In practice, I find that pulling the extra result values from @code(*RSLT*) when needed is perfectly acceptable.
+
+For parameters that are result values only, the character ``@code(^)'' may
+be substituted for ``@code(*)''. In this case, the parameter is @i(not) to be passed in the XLisp calling site.
+However, the address of an initialized
+local variable of the given type is passed to the corresponding
+C function, and the resulting value is passed back through @code(*RSLT*) as
+ordinary result parameter as described above.
+The local variables are initialized to zero or @code(NULL).
+
+@section(Using #define'd macros)@index(#define'd macros)
+If a comment of the form:
+@begin(example)
+/* LISP: @i(type-name) (@i(routine-name-2) @i(type-1) @i(type-2) ...) */
+@end(example)
+appears on a line by itself and there was a @code(#define) on the previous
+line, then the preceding @code(#define) is treated as a C routine, e.g.
+@begin(example)
+#define leftshift(val, count) ((val) << (count))
+/* LISP: int (LOGSHIFT INT INT) */
+@end(example)
+will implement the LeLisp function @code(LOGSHIFT).
+
+The @i(type-name) following ``@code(LISP:)'' should have no spaces, e.g. use @code(ANY*), not
+@code(ANY *).
+
+@section(Lisp Include Files)@index(Lisp Include Files)
+Include files often define constants that we would like to have around
+in the Lisp world, but which are easier to initialize just by loading
+a text file. Therefore, a comment of the form:
+@begin(example)
+/* LISP-SRC: (any lisp expression) */
+@end(example)
+will cause Intgen to open a file @i(name)@code(.lsp) and append
+@begin(example)
+(any lisp expression)
+@end(example)
+to @i(name)@code(.lsp), where @i(name) is the interface name passed on the command line. If none of the include files examined have comments of
+this form, then no @i(name)@code(.lsp) file is generated.
+@p(Note:) @i(the LISP-SRC comment must be on a new line.)
+
+@section(Example)
+This file was used for testing Intgen. It uses a trick (ok, it's a hack) to interface
+to a standard library macro (tolower). Since tolower is already
+defined, the macro ToLower is defined just to give Intgen a name
+to call. Two other routines, strlen and tough, are interfaced as
+well.
+@begin(example)
+/* igtest.h -- test interface for intgen */
+
+#define ToLower(c) tolower(c)
+/* LISP: int (TOLOWER FIXNUM) */
+
+int strlen(); /* LISP: (STRLEN STRING) */
+
+void tough();
+ /* LISP: (TOUGH FIXNUM* FLONUM* STRING ANY FIXNUM) */
+@end(example)
+
+@section(More Details)
+
+Intgen has some compiler switches to enable/disable the use of certain types, including
+@code(VALUE) and @code(EVENT) types used by Dannenberg's score editing work, the @code(SOUND) type used by Fugue, and @code(DEXT) and @code(SEXT) types added for Dale Amon.
+Enabling all of these is not likely to cause problems,
+and the chances of an accidental use of these types getting through
+the compiler and linker seems very small.
diff --git a/docsrc/xlisp/xlisp-doc/README b/docsrc/xlisp/xlisp-doc/README
new file mode 100644
index 0000000..d1249c9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/README
@@ -0,0 +1,11 @@
+January 11, 2011
+
+The XLISP dos in this directory still in an unfinished state.
+The hyperlinking works, but many pages are still too messy.
+
+Just load "start.htm" into your web browser, everything else
+is linked from there.
+
+In case of doubt write to:
+
+edgar-rft@web.de
diff --git a/docsrc/xlisp/xlisp-doc/examples/apropos.htm b/docsrc/xlisp/xlisp-doc/examples/apropos.htm
new file mode 100644
index 0000000..f0657b2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/apropos.htm
@@ -0,0 +1,268 @@
+<html><head>
+
+<title>apropos</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>apropos</h1>
+
+<hr>
+
+
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><nobr>(<b>apropos</b> &amp;optional <i>pattern type</i>)</nobr></p></dt>
+
+<dd><p>The 'apropos' function searches the Nyquist/XLISP *obarray* for
+matching symbol names containing 'pattern' and being of 'type'. <nobr>It
+prints</nobr> a list of the results in alphabetical order.</p>
+
+<p>'pattern and 'type' can be given as symbols or strings. <nobr>If
+no</nobr> 'pattern' is given, all symbol names are considered as matching.
+<nobr>If no</nobr> 'type' is given, all symbol types are considered as
+matching. With 'type', only the first letter is important. <nobr>A
+type</nobr> of 'f' searches for symbols with a valid function value, while a
+type of 'v' searches for symbols with a valid variable value.</p></dd>
+
+</dd>
+
+</dl>
+
+</div></p>
+
+<p>Examples:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(apropos)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>all symbols known by Nyquist</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(apropos nil 'f)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>all bound functions known by Nyquist</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(apropos nil 'v)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>all bound variables known by Nyquist</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(apropos 'snd 'f)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>all function names containing 'snd'</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>A method to introspect classes and objects:</p>
+
+<pre class="example">
+(setq instance-var '*wrong-variable*) ; value outside the object
+
+(setq my-class (send class :new '(instance-var))) ; class with instance variable
+(send my-class :answer :isnew '() '((setq instance-var '*OK*))) ; value inside an object
+(send my-class :answer :eval '(list) '((eval list))) ; evaluation method
+
+(setq my-object (send my-class :new)) ; instance of my-class
+(send my-object :eval 'instance-var) =&gt; <font color="#008844">*OK*</font>
+(send my-object :eval '(apropos 'instance-var 'v t)) =&gt; <font color="#AA0000">*WRONG-VARIABLE*</font>
+</pre>
+
+<p>The first version works because the call to 'eval' happens inside the
+object:</p>
+
+<pre class="example">
+(send my-class :answer :eval '(list) '((eval list))) =&gt; <font color="#008844">*OK*</font>
+</pre>
+
+<p>The second version doesn't work because the call to 'eval' happens
+outside the object:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">external-function</font> (list)
+ (eval list))
+
+(send my-class :answer :eval '(list) '((external-function list))) =&gt; <font color="#AA0000">*WRONG-VARIABLE*</font>
+</pre>
+
+<p>The call to 'apropos' doesn't work because 'apropos' is executed outside
+the object:</p>
+
+<pre class="example">
+(send my-object :eval '(apropos)) =&gt; <font color="#AA0000">*WRONG-VARIABLE*</font>
+</pre>
+
+<p>The trick is to pass the Lisp code of 'apropos' as a list into the inside
+of the object and 'apply' it there to the arguments:</p>
+
+<pre class="example">
+(send my-class :answer :apropos '(args)
+ '((apply (get-lambda-expression #'apropos) args)))
+
+(send my-object :apropos '(instance-var v t)) =&gt; <font color="#008844">*OK*</font>
+</pre>
+
+<p>But this only works if all function that need access to internal instance
+or class variables are executed inside the object. For example, if 'apropos'
+calls a function that needs access to an internal instance variable, I
+would get a 'unbound variable' error.</p>
+
+<p>Here is the code of the 'apropos' function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">apropos</font> (&amp;optional pattern type)
+ (let (result-list (<font color="#AA5500">*gc-flag*</font> nil))
+ <font color="#008844">;; make sure 'pattern' is a string, either empty or upper-case</font>
+ (if pattern
+ (setf pattern (string-upcase (string pattern)))
+ (setf pattern <font color="#880000">""</font>))
+ <font color="#008844">;; take only the first letter of 'type' and make it an upper-case string</font>
+ (if type (setf type (string-upcase (subseq (string type) 0 1))))
+ <font color="#008844">;; go through all entries in the *obarray* symbol hash table</font>
+ (dotimes (i (length <font color="#AA5500">*obarray*</font>))
+ (let ((entry (aref <font color="#AA5500">*obarray*</font> i))) <font color="#008844">; *obarray* is an array of lists</font>
+ <font color="#008844">;; if the *obarray* entry is not an empty list</font>
+ (if entry
+ <font color="#008844">;; go through all elements of the *obarray* entry list</font>
+ <font color="#008844">;; do not use 'dolist' because *obarray* contains *unbound*</font>
+ (dotimes (j (length entry))
+ <font color="#008844">;; convert the symbol to a string to enable pattern matching</font>
+ (let ((string (string (nth j entry))))
+ <font color="#008844">;; if the symbol string matches the search pattern</font>
+ (if (string-search pattern string)
+ <font color="#008844">;; if a special symbol type to search for was given</font>
+ (if type
+ <font color="#008844">;; if a 'type' search was initiated and the current</font>
+ <font color="#008844">;; symbol has no 'type' value bound to it, do nothing</font>
+ <font color="#008844">;; and return from 'cond' without adding the symbol</font>
+ <font color="#008844">;; string to the result list</font>
+ (cond ((and (string= type <font color="#880000">"F"</font>) <font color="#008844">; bound functions only</font>
+ (not (fboundp (nth j entry))))
+ nil)
+ ((and (string= type <font color="#880000">"V"</font>) <font color="#008844">; bound variables only</font>
+ (not (boundp (nth j entry))))
+ nil)
+ <font color="#008844">;; if the symbol has passed all tests,</font>
+ <font color="#008844">;; add the symbol string to the result list</font>
+ (t (setf result-list (cons string result-list))))
+ <font color="#008844">;; if no special symbol type to search for had been given,</font>
+ <font color="#008844">;; but the symbol string had matched the search pattern,</font>
+ <font color="#008844">;; add the symbol string to the result list</font>
+ (setf result-list (cons string result-list)))))))))
+ <font color="#008844">;; if the result list contains more than one element</font>
+ <font color="#008844">;; make it become an alphabetically sorted list</font>
+ (if (> (length result-list) 1)
+ (setf result-list (sort result-list 'string&lt;)))
+ <font color="#008844">;; print a message according to the search type and pattern</font>
+ (cond ((and type (string= type <font color="#880000">"F"</font>)) (setf type <font color="#880000">"function"</font>))
+ ((and type (string= type <font color="#880000">"V"</font>)) (setf type <font color="#880000">"variable"</font>))
+ (t (setf type <font color="#880000">"symbol"</font>)))
+ (if (string= pattern <font color="#880000">""</font>)
+ (format t <font color="#880000">"All ~a names known by Nyquist:~%"</font> type)
+ (format t <font color="#880000">"All ~a names containing pattern ~a:~%"</font> type pattern))
+ <font color="#008844">;; print the search results</font>
+ (cond (result-list
+ (let ((list-length (length result-list)))
+ (format t <font color="#880000">";; number of symbols: ~a~%"</font> list-length)
+ (dolist (i result-list) (format t <font color="#880000">"~a~%"</font> i))
+ (if (> list-length 20)
+ (format t <font color="#880000">";; number of symbols: ~a~%"</font> list-length))))
+ (t (format t <font color="#880000">"No matches found."</font>)))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/arrays.htm b/docsrc/xlisp/xlisp-doc/examples/arrays.htm
new file mode 100644
index 0000000..6e258ff
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/arrays.htm
@@ -0,0 +1,430 @@
+<html><head>
+
+<title>Arrays</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Arrays</h1>
+
+<hr>
+
+<p>Arrays are also <a href="sequences.htm">Sequences</a>.</p>
+
+<ul>
+<li><nobr><a href="#make-array-star">make-array*</a> - create multi-dimensional arrays</nobr></li>
+<li><nobr><a href="#aref-star">aref*</a> - access multi-dimensional-arrays</nobr></li>
+<li><nobr><a href="#vector-star">vector*</a> - make a one-dimensional array out of arbitrary Lisp expressions</nobr></li>
+<li><nobr><a href="#vector-star">array*</a> - make a multi-dimensional array out of arbitrary Lisp expressions</nobr></li>
+</ul>
+
+<a name="make-array-star"></a>
+
+<hr>
+
+<h2>make-array*</h2>
+
+<hr>
+
+<p>XLISP already has the
+<nobr><a href="../reference/make-array.htm">make-array</a></nobr>
+function to create <nobr>one-dimensional</nobr> arrays:</p>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<a href="../reference/make-array.htm">make-array</a> <i>size</i>)</nobr></dt>
+<dd><i>size</i> - the size [integer] of the array to be created<br>
+returns - the new array</dd>
+</dl>
+
+</div></p>
+
+<p>Here is a function to create <nobr>multi-dimensional</nobr> arrays:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>make-array*</b> <i>size-1</i> [<i>size-2</i> ...])</dt>
+<dd><i>sizeN</i> - the size [integer] of the <i>N</i>-th dimension in the array to be created<br>
+returns - the new array</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">make-array*</font> (&amp;rest dimensions-list)
+ (cond ((null dimensions-list)
+ (error <font color="#880000">"too few arguments"</font>))
+ ((and (null (rest dimensions-list))
+ (eql 0 (first dimensions-list)))
+ (make-array 0))
+ (t (labels ((multi-vector (dimensions-list)
+ (let ((count (first dimensions-list)))
+ (if (not (and (integerp count) (plusp count)))
+ (error <font color="#880000">"not a positive integer"</font> count)
+ (let ((rest (rest dimensions-list))
+ (elements-list nil))
+ (dotimes (i count)
+ (push (when rest
+ (multi-vector rest))
+ elements-list))
+ (apply #'vector (reverse elements-list)))))))
+ (multi-vector dimensions-list)))))
+</pre>
+
+<p>Examples:</p>
+
+<pre class="example">
+(make-array* 2 3) =&gt; #(#(NIL NIL NIL) #(NIL NIL NIL)))
+(make-array* 2 2 1) =&gt; #(#(#(NIL) #(NIL)) #(#(NIL) #(NIL)))
+</pre>
+
+<p>Like <nobr><a href="../reference/make-array.htm">make-array</a></nobr> it
+is possible to create <nobr>one-dimensional</nobr> arrays with zero
+elements:</p>
+
+<pre class="example">
+(make-array* 0) =&gt; #()
+(make-array 0) =&gt; #()
+</pre>
+
+<p>But it is not allowed to create <nobr>multi-dimensional</nobr> arrays
+with <nobr>zero-size</nobr> dimensions:</p>
+
+<pre class="example">
+(make-array* 1 0 1) =&gt; <font color="#AA0000">error: not a positive integer - 0</font>
+</pre>
+
+<p><b>Rationale:</b> Multi-dimensional arrays are implemented as nested
+vectors and a <nobr>zero-element</nobr> vector cannot hold the vector for
+the subsequent dimension. <nobr>We would</nobr> need some additional
+administration overhead to keep the subsequent dimensions accessible, but
+this would break the compatibility to the <nobr>build-in</nobr> XLISP
+<a href="../reference/aref.htm">aref</a> function.</p>
+
+<p>More practical examples see 'aref*' below.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="aref-star"></a>
+
+<hr>
+
+<h2>aref*</h2>
+
+<hr>
+
+<p>XLISP already has the <a href="../reference/aref.htm">aref</a> function
+to access elements in one-dimensional arrays:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<a href="../reference/aref.htm">aref</a> <i>array dimension-1</i>)</dt>
+<dd><i>array</i> - one-dimensional array<br>
+<i>dimension-1</i> - element number in the first dimension<br>
+returns - the value of the array element</dd>
+</dl>
+
+</div></p>
+
+<p>Here is a macro for accessing elements in <nobr>multi-dimensional</nobr>
+arrays:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>aref*</b> <i>array dimension-1</i> [<i>dimension-2</i> ...])</dt>
+<dd><i>array</i> - any-dimensional array<br>
+<i>dimensionN</i> - element number in the <i>N</i>-th dimension<br>
+returns - the value of the array element</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">aref*</font> (array &amp;rest index-list)
+ (labels ((multi-aref (array-name index-list)
+ (let ((index (first index-list)))
+ (if (not (integerp index))
+ (error <font color="#880000">"not an integer"</font> index)
+ (let ((rest (rest index-list))
+ (expansion-list (list 'aref)))
+ (push (if rest
+ (multi-aref array-name rest)
+ array-name)
+ expansion-list)
+ (push index expansion-list)
+ (reverse expansion-list))))))
+ (multi-aref `,array (reverse `,index-list))))
+</pre>
+
+<p>The symbols inside the <a href="../reference/labels.htm">labels</a> form
+do not leak into the expansion, so 'aref*' also works with array names like
+'array', '<nobr>array-name</nobr>' 'index', '<nobr>index-list</nobr>' or
+'<nobr>expansion-list</nobr>'. Also the values of local or global variables
+with these names are not changed.</p>
+
+<pre class="example">
+(macroexpand-1 '(aref* a 1 2 3)) =&gt; (aref (aref (aref a 1) 2) 3)
+</pre>
+
+<p>Examples:</p>
+
+<pre class="example">
+&gt; (setq a (make-array* 2 3))
+#(#(NIL NIL NIL) #(NIL NIL NIL)))
+
+&gt; (setf (aref* a 0 1) "hello")
+"hello"
+
+&gt; a
+#(#(NIL "hello" NIL) #(NIL NIL NIL))
+
+&gt; (aref* a 0 1)
+"hello"
+</pre>
+
+<p>'aref*' with only one 'dimension' argument behaves
+<nobr>like <a href="../reference/aref.htm">aref</a>:</nobr></p>
+
+<pre class="example">
+(aref* a 0) =&gt; #(NIL "hello" NIL)
+(aref a 0) =&gt; #(NIL "hello" NIL)
+
+(aref* (aref* a 0) 1) =&gt; "hello"
+(aref (aref a 0) 1) =&gt; "hello"
+
+(aref* a 0 1) =&gt; "hello"
+(aref a 0 1) =&gt; <font color="#AA0000">error: too many arguments</font>
+</pre>
+
+<p>'aref*' like <a href="../reference/aref.htm">aref</a> also works
+<nobr>with <a href="../reference/setf.htm">setf</a></nobr> to store
+values in <nobr>multi-dimensional</nobr> arrays:</p>
+
+<pre class="example">
+(setf (aref* (aref* a 0) 1) "1") =&gt; "1" <font color="#008844">; a =&gt; #(#(NIL "1" NIL) #(NIL NIL NIL)))</font>
+(setf (aref (aref a 0) 1) "2") =&gt; "2" <font color="#008844">; a =&gt; #(#(NIL "2" NIL) #(NIL NIL NIL)))</font>
+
+(setf (aref* 0 1) "3") =&gt; "3" <font color="#008844">; a =&gt; #(#(NIL "3" NIL) #(NIL NIL NIL)))</font>
+(setf (aref 0 1) "4") =&gt; <font color="#AA0000">error: too many arguments</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="vector-star"></a>
+
+<hr>
+
+<h2>vector*</h2>
+
+<hr>
+
+<pre class="example">
+(defun <font color="#0000CC">vector*</font> (&amp;rest items)
+ (if (null items)
+ (make-array 0)
+ (let* ((end (length items))
+ (result (make-array end)))
+ (if (&gt; end 1)
+ (dotimes (index end) <font color="#008844">; more than one item</font>
+ (setf (aref result index)
+ (if (eq (nth index items) '*unbound*)
+ '*unbound*
+ (nth index items))))
+ (if (eq (first items) '*unbound*) <font color="#008844">; one item only</font>
+ (setf (aref result 0) '*unbound*)
+ (let ((item (first items)))
+ (case (type-of item)
+ (cons (let ((end (length item)))
+ (setq result (make-array end))
+ (dotimes (index end)
+ (setf (aref result index)
+ (if (eq (nth index item) '*unbound*)
+ '*unbound*
+ (nth index item))))))
+ (array (let ((end (length item)))
+ (setq result (make-array end))
+ (dotimes (index end)
+ (setf (aref result index)
+ (if (eq (aref item index) '*unbound*)
+ '*unbound*
+ (aref item index))))))
+ (string (let ((end (length item)))
+ (setq result (make-array end))
+ (dotimes (index end)
+ (setf (aref result index)
+ (char item index)))))
+ (t (setf (aref result 0) item))))))
+ result)))
+</pre>
+
+<pre class="example">
+(defun <font color="#0000CC">list*</font> (&amp;rest items)
+ (if (null items)
+ nil
+ (let* ((end (length items))
+ (result nil))
+ (labels ((push-element (element)
+ (if (member (type-of element) '(array cons string))
+ (setq result (append (reverse (list* element)) result))
+ (push element result))))
+ (dotimes (index end)
+ (if (eq (nth index items) '*unbound*)
+ (push '*unbound* result)
+ (let ((item (nth index items)))
+ (case (type-of item)
+ (nil (push item result))
+ (cons (let ((end (length item)))
+ (when (not (consp (last item))) (incf end))
+ (dotimes (index end)
+ (if (eq (nth index item) '*unbound*)
+ (push '*unbound* result)
+ (push-element (nth index item))))))
+ (array (let ((end (length item)))
+ (dotimes (index end)
+ (if (eq (aref item index) '*unbound*)
+ (push '*unbound* result)
+ (push-element (aref item index))))))
+ (string (let ((end (length item)))
+ (dotimes (index end)
+ (push (char item index) result))))
+ (t (push item result))))))
+ (reverse result)))))
+</pre>
+
+
+<pre class="example">
+(defun <font color="#0000CC">tree*</font> (&amp;rest items)
+ (if (null items)
+ nil
+ (let* ((end (length items))
+ (result nil))
+ (labels ((push-element (element)
+ (if (member (type-of element) '(array cons string))
+ (push (reverse (list* element)) result)
+ (push element result))))
+ (dotimes (index end)
+ (if (eq (nth index items) '*unbound*)
+ (push '*unbound* result)
+ (let ((item (nth index items)))
+ (case (type-of item)
+ (nil (push item result))
+ (cons (let ((end (length item)))
+ (when (not (consp (last item))) (incf end))
+ (dotimes (index end)
+ (if (eq (nth index item) '*unbound*)
+ (push '*unbound* result)
+ (push-element (nth index item))))))
+ (array (let ((end (length item)))
+ (dotimes (index end)
+ (if (eq (aref item index) '*unbound*)
+ (push '*unbound* result)
+ (push-element (aref item index))))))
+ (string (let ((end (length item)))
+ (dotimes (index end)
+ (push (char item index) result))))
+ (t (push item result))))))
+ (reverse result)))))
+</pre>
+
+
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="array-star"></a>
+
+<hr>
+
+<h2>array*</h2>
+
+<hr>
+
+<pre class="example">
+(defun <font color="#0000CC">array*</font> (&amp;rest items)
+ (if (null items)
+ (make-array 0)
+ (let* ((end (length items))
+ (result (make-array end)))
+ (labels ((vector-element (element index)
+ (setf (aref result index)
+ (if (member (type-of element) '(cons string array))
+ (array* element)
+ element))))
+ (dotimes (index end)
+ (if (eq (nth index items) '*unbound*)
+ (setf (aref result index) '*unbound*)
+ (let ((item (nth index items)))
+ (case (type-of item)
+ (cons (let ((end (length item)))
+ (dotimes (index end)
+ (if (eq (nth index item) '*unbound*)
+ (strcat-element <font color="#880000">"*UNBOUND*"</font>)
+ (strcat-element (nth index item))))))
+ (array (let ((end (length item)))
+ (dotimes (index end)
+ (if (eq (aref item index) '*unbound*)
+ (strcat-element <font color="#880000">"*UNBOUND*"</font>)
+ (strcat-element (aref item index))))))
+ (t (strcat-element item))))))
+ result))))
+</pre>
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/binary.htm b/docsrc/xlisp/xlisp-doc/examples/binary.htm
new file mode 100644
index 0000000..3ae5d56
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/binary.htm
@@ -0,0 +1,160 @@
+<html><head>
+
+<title>Binary Integer Numbers</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Binary Integer Numbers</h1>
+
+<hr>
+
+<p>XLISP provides the <a href="../manual/xlisp.htm#binary">#b</a>
+<nobr>read-macro</nobr> for binary numbers:</p>
+
+<pre class="example">
+#b0 =&gt; 0 #b1000 =&gt; 8 #b100000 =&gt; 16
+#b1 =&gt; 1 #b1001 =&gt; 9 #b100001 =&gt; 17
+#b10 =&gt; 2 #b1010 =&gt; 10 #b100010 =&gt; 18
+#b11 =&gt; 3 #b1011 =&gt; 11 #b100011 =&gt; 19
+#b100 =&gt; 4 #b1100 =&gt; 12 #b100100 =&gt; 20
+#b101 =&gt; 5 #b1101 =&gt; 13 #b100101 =&gt; 21
+#b110 =&gt; 6 #b1110 =&gt; 14 #b100110 =&gt; 22
+#b111 =&gt; 7 #b1111 =&gt; 15 #b100111 =&gt; 23
+</pre>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>bin-string</b> <i>integer</i> [<i>all</i>])</dt>
+<dd><i>integer</i> - an integer expression<br>
+<i>all</i> - a boolean expression<br>
+returns - the <i>integer</i> in binary form as string</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">bin-string</font> (integer &amp;optional all)
+ (if (integerp integer)
+ (let ((digits (or (dolist (bits '(16 32 64 128) nil)
+ (let ((fixnum (round (expt 2.0 (1- bits)))))
+ (and (plusp (1- fixnum))
+ (minusp fixnum)
+ (return bits))))
+ (error <font color="#880000">"integer limit not found"</font>)))
+ (string <font color="#880000">""</font>))
+ (dotimes (x digits)
+ (let ((digit (logand (round (expt 2.0 x)) integer)))
+ (setq string (strcat (if (zerop digit) <font color="#880000">"0" "1"</font>) string))))
+ (format nil <font color="#880000">"~a"</font> (if all string (string-left-trim <font color="#880000">"0"</font> string))))
+ (error <font color="#880000">"not an integer"</font> integer)))
+</pre>
+
+<p>The '<nobr>bin-string</nobr>' function converts the 'integer' argument
+into binary form and returns is as a string. <nobr>If the</nobr>
+optional 'all' argument is not given or
+<a href="../reference/nil.htm">NIL</a>, leading zeros are not included in
+the string. <nobr>If the</nobr> optional 'all' argument is
+<nobr>non-<a href="../reference/nil.htm">NIL</a></nobr>, all digits of the
+internal representation of the 'integer' argument, including leading zeros,
+are contained in the string. This is useful for debugging integer overflow
+and <nobr>bit-wise</nobr> functions.</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>bin</b> <i>integer</i> [<i>all</i>])</dt>
+<dd><i>integer</i> - an integer expression<br>
+<i>all</i> - a boolean expression<br>
+prints - the <i>integer</i> in binary form<br>
+returns - the <i>integer</i> argument</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">bin</font> (integer &amp;optional all)
+ (if (integerp integer)
+ (format t <font color="#880000">"#b~a~%"</font> (bin-string integer all))
+ (format t <font color="#880000">";; not an integer~%"</font>))
+ integer)
+</pre>
+
+<p>The 'bin' function prints the 'integer' argument in binary form on
+the screen. Together with the
+<a href="../manual/xlisp.htm#binary">#b</a> <nobr>read-macro</nobr>
+this can be used for interactive binary computations.</p>
+
+<pre class="example">
+&gt; (bin 12345678)
+#b101111000110000101001110
+12345678
+
+&gt; (bin 12345678 :all)
+#b00000000101111000110000101001110
+12345678
+
+&gt; (bin 1.2345678)
+;; not an integer
+1.2345678
+
+&gt; (bin (logand #b1011 #b1101))
+#b1001
+9
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/circular-lists.htm b/docsrc/xlisp/xlisp-doc/examples/circular-lists.htm
new file mode 100644
index 0000000..48d7cdf
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/circular-lists.htm
@@ -0,0 +1,133 @@
+<html><head>
+
+<title>Circular Lists</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Circular Lists</h1>
+
+<hr>
+
+
+<hr>
+
+<h2>Known XLISP Problems with Circular Lists</h2>
+
+<hr>
+
+<p><b>Warning:</b> do <b>not</b> try this with XLISP:</p>
+
+<pre class="example">
+&gt; (setq my-list (cons 'item nil)) <font color="#008844">; create a 1-item list</font>
+(ITEM)
+
+&gt; (setf (cdr my-list) my-list)) <font color="#008844">; create the circle</font>
+ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM
+ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM
+ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM
+ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ITEM ...
+</pre>
+
+<p>If you're lucky you can <a href="../reference/break.htm">break</a> the
+loop. <nobr>If not</nobr>, then XLISP will print the ITEM forever.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="circular-nth"></a>
+
+<hr>
+
+<h2>c-nth</h2>
+
+<hr>
+
+<p>The '<nobr>c-nth</nobr>' macro accesses a linear list as if it were
+circular:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">c-nth</font> (index list)
+ `(nth ,(rem index (length list)) ,list))
+</pre>
+
+<p>Note that with every call to '<nobr>c-nth</nobr>', the length of the list
+will be computed again.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(c-nth 0 '(1 2 3)) =&gt; 1
+(c-nth 1 '(1 2 3)) =&gt; 2
+(c-nth 2 '(1 2 3)) =&gt; 3
+(c-nth 3 '(1 2 3)) =&gt; 1
+(c-nth 4 '(1 2 3)) =&gt; 2
+(c-nth 5 '(1 2 3)) =&gt; 3
+(c-nth 6 '(1 2 3)) =&gt; 1
+(c-nth 7 '(1 2 3)) =&gt; 2
+</pre>
+
+Because '<nobr>c-nth</nobr>' is a macro expanding into a regular
+<a href="../reference/nth.htm">nth</a> form, '<nobr>c-nth</nobr>' can be
+used <nobr>with <a href="../reference/setf.htm">setf</a></nobr>:
+
+<pre class="example">
+(setq lst '(1 2 3)) =&gt; (1 2 3)
+lst =&gt; (1 2 3)
+(setf (c-nth 4 lst) 'x) =&gt; X
+lst =&gt; (1 X 3)
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp.htm
new file mode 100644
index 0000000..add5cc7
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp.htm
@@ -0,0 +1,161 @@
+<html><head>
+
+<title>Common Lisp</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Where is the Nyquist Common Lisp Library?</h1>
+
+<hr>
+
+<p>Short answer - nowhere.</p>
+
+<p>Rationale:</p>
+
+<ol>
+
+<li><p>XLISP is a very simple Lisp. Many of the XLISP functions are just simple
+wrappers around the underlying <nobr>C functions</nobr>. This makes XLISP,
+as an interpreted language, run with reasonable speed. <nobr>The main</nobr>
+advantage of XLISP over <nobr>Common Lisp</nobr> is that XLISP is much
+smaller and therefore much easier to learn.</p></li>
+
+<li><p>The main trick of Nyquist is to use XLISP only in the initial setup
+phase, where the Lisp code is parsed, to <nobr>set-up</nobr> the
+<nobr>low-level</nobr> sound sample functions, written <nobr>in C</nobr>,
+not in Lisp.</p>
+
+<p><nobr>The Nyquist</nobr> <nobr>low-level</nobr> '<nobr>snd-...</nobr>'
+functions only look like Lisp functions, but they are direct wrappers around
+<nobr>C functions</nobr> and behave like that. They do not provide type
+contagion, instead they expect a correct number of arguments, given in
+correct order with correct data types, and if not given exactly as expected,
+chances are good that Nyquist will crash.</p>
+
+<p><nobr>In Nyquist</nobr>, <nobr>XLISP [slow]</nobr> is used to make sure
+that the <nobr>low-level</nobr> functions will be given the correct
+arguments, while the <nobr>low-level</nobr> sound sample functions after the
+initial setup phase will run in <nobr>high-speed C</nobr>, and not in Lisp
+anymore.</nobr></p></li>
+
+</ol>
+
+<p>Because the Nyquist <nobr>Common Lisp</nobr> functions are running in
+interpreted XLISP, they run slower than the <nobr>built-in</nobr> XLISP
+functions. Because many <nobr>Common Lisp</nobr> functions do extensive
+parsing and/or type checking on their arguments, they run many times
+slower than XLISP. That's why overloading Nyquist with an extensive
+<nobr>Common Lisp</nobr> layer makes not much sense.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>But why did you write so many Common Lisp functions?</h2>
+
+<hr>
+
+<p>I usually work with <nobr>Common Lisp</nobr> for prototyping, so if I'm
+porting code from <nobr>Common Lisp</nobr> to Nyquist:</p>
+
+<ol>
+
+<li><p>I first copy the <nobr>Common Lisp</nobr> code together with the
+respective Nyquist <nobr>Common Lisp</nobr> functions from screen into a
+Nyquist lisp file to see if the <nobr>Common Lisp</nobr> code works with
+Nyquist <nobr>at all</nobr>. Many of the Nyquist <nobr>Common Lisp</nobr>
+functions have argument tests to help with error tracking.</p></li>
+
+<li><p>When the <nobr>Common Lisp</nobr> code works with Nyquist I start to
+strip out everything I don't need for the particular problem at hand, making
+the Nyquist code run faster. Because this second step is highly depending on
+the particular problem at hand, there probably never will be a general
+solution for this.</p></li>
+
+</ol>
+
+<p><div class="box">
+
+<p>I have tried to keep the functions as <nobr>self-contained</nobr> as
+possible, any dependencies to <nobr>non-Nyquist</nobr> functions are noted
+directly below the code.</p>
+
+</div></p>
+
+<p>There are many XLISP functions that behave exactly like their
+<nobr>Common Lisp</nobr> counterparts, so I haven't written extra functions
+for them.</p>
+
+<ul>
+
+<li><p>If you already know <nobr>Common Lisp</nobr> then the Nyquist
+<nobr>Common Lisp</nobr> functions may help to understand how XLISP
+works.</p></li>
+
+<li><p>If you still don't know <nobr>Common Lisp</nobr> and maybe one day
+you decide to learn more <nobr>about it</nobr>, then the Nyquist
+<nobr>Common Lisp</nobr> functions may save you from learning everything
+double.</p></li>
+
+</ul>
+
+<p>In either case you can use the Nyquist <nobr>Common Lisp</nobr> functions
+as a <nobr>grab-bag</nobr> for your own functions.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/ceiling.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/ceiling.htm
new file mode 100644
index 0000000..a39f495
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/ceiling.htm
@@ -0,0 +1,137 @@
+<html><head>
+
+<title>cl:ceiling</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:ceiling</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>ceiling</b></nobr> function
+<a href="../../reference/truncate.htm">truncate</a>s an integer or
+<nobr>floating-point</nobr> number toward positive infinity:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>ceiling</b> <i>number </i> [<i>divisor</i>])</dt>
+<dd><i>number</i> - an integer or <nobr>floating-point</nobr> number<br>
+<i>divisor</i> - an integer or <nobr>floating-point</nobr> number, except zero<br>
+<table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td valign="top"><nobr>returns</nobr></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the result of truncating the result of <i>number</i> divided by <i>divisor</i></td>
+</tr>
+<tr>
+ <td></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the remainder of the truncate operation</td>
+</tr>
+</tbody></table></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:ceiling</font> (number &amp;optional (divisor
+ (if (integerp number) 1 1.0)
+ divisor-p))
+ (let ((quotient
+ (cond ((and (not divisor-p) (integerp number)) number)
+ ((= number divisor) 1)
+ (t (let ((i-quotient (/ (truncate number) (truncate divisor)))
+ (f-quotient (/ (float number) divisor)))
+ (if (or (= i-quotient f-quotient) <font color="#008844">; integer result</font>
+ (not (plusp f-quotient)))
+ (truncate f-quotient)
+ (1+ (truncate f-quotient))))))))
+ (setq <font color="#AA5500">*rslt*</font> (list quotient (- number (* quotient divisor)))
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ quotient))
+</pre>
+
+<p>The <nobr>cl:<b>ceiling</b></nobr> function computes a quotient that has
+been truncated toward positive infinity. <nobr>That is</nobr>, the quotient
+represents the smallest mathematical integer that is not smaller than the
+mathematical result.</p>
+
+<p>The quotient is directly returned by the function, while a list:</p>
+
+<pre class="example">
+(quotient remainder)
+</pre>
+
+<p>is stored in the Nyquist/XLISP
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable and the
+<a href="global-multiple-values.htm">cl:*multiple-values*</a> is set to
+<a href="../../reference/t.htm">&nbsp;T&nbsp;</a> to signal that
+<a href="multiple-values.htm">Multiple Values</a> are returned.</p>
+
+<nobr>See
+<a href="rounding-and-truncation.htm">Rounding and Truncation</a></nobr>
+for more details.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(cl:ceiling 3.5) =&gt; 4 <font color="#008844">; *rslt* =&gt; ( 4 -0.5)</font>
+(cl:ceiling -3.5) =&gt; -3 <font color="#008844">; *rslt* =&gt; (-3 -0.5)</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/debug-mv.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/debug-mv.htm
new file mode 100644
index 0000000..c61cb23
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/debug-mv.htm
@@ -0,0 +1,110 @@
+<html><head>
+
+<title>cl:debug:mv</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:debug:mv</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>debug:mv</b></b></nobr> function can be used to debug
+multiple value expressions:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>debug:mv</b> <i>expr</i></dt>
+<dd><i>expr</i> - a Lisp expression, returning an arbitrary number of values<br>
+returns - the normal Lisp return value from evaluating <i>expr</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:debug:mv</font> (expr)
+ (setq <font color="#AA5500">cl:*multiple-values*</font> nil)
+ (let ((result (eval expr)))
+ (format t <font color="#880000">";; cl:*multiple-values* =&gt; ~a~%"</font> <font color="#AA5500">cl:*multiple-values*</font>)
+ (format t <font color="#880000">";; *rslt* =&gt; ~a~a~%"</font> <font color="#AA5500">*rslt*</font>
+ (if <font color="#AA5500">cl:*multiple-values*</font> <font color="#880000">"" " [invalid]"</font>))
+ result))
+</pre>
+
+<p>The <nobr>cl:<b>debug:mv</b></nobr> function first sets the
+<nobr><a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+variable <nobr>to <a href="../../reference/nil.htm">NIL</a></nobr>, then it
+evaluates the expression. After evaluation it prints the values of the
+<nobr><a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+and <a href="../../reference/global-rslt.htm">*rslt*</a> variables and
+returns the normal Lisp return value from the evaluation.</p>
+
+<p>Example:</p>
+
+<pre class="example">
+&gt; (cl:debug:mv '(cl:values 1 2 3))
+;; cl:*multiple-values* =&gt; T
+;; *rslt* =&gt; (1 2 3)
+1
+
+&gt; (cl:debug:mv 1)
+;; cl:*multiple-values* =&gt; NIL
+;; *rslt* =&gt; (1 2 3) [invalid]
+1
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/equalp.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/equalp.htm
new file mode 100644
index 0000000..14835c5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/equalp.htm
@@ -0,0 +1,162 @@
+<html><head>
+
+<title>cl:equalp</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:equalp</h1>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>equalp</b> <i>expr1 expr2</i>)</dt>
+<dd><i>exprN</i> - arbitrary Lisp expressions<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the expressions
+are structurally equal, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<p>Two expressions are 'equalp':</p>
+
+<ul>
+
+<li><p>If the expressions
+<nobr>are <a href="../../reference/equal.htm">equal</a></nobr>.</p></li>
+
+<li><p>If two numbers of arbitrary type <nobr>are
+<a href="../../reference/number-equal.htm">&nbsp;=&nbsp;</a></nobr>.</p></li>
+
+<li><p>If two characters are
+<nobr><a href="../../reference/char-equal-i.htm">char-equal</a></nobr>.</p></li>
+
+<li><p>If two strings are <nobr><a
+href="../../reference/string-equal-i.htm">string-equal</a></nobr>.</p></li>
+
+<li><p>If the two <a href="../../reference/car.htm">car</a>s in conses are
+'equalp' and the two <a href="../../reference/cdr.htm">cdr</a>s in conses
+are 'equalp'.</p></li>
+
+<li><p>If two arrays have the same number of elements and dimensions, and
+the corresponding elements in all dimensions are 'equalp'.</p></li>
+
+</ul>
+
+<p>Note that only 'equalp' can compare arrays.</p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:equalp</font> (expr-1 expr-2)
+ (or (equal expr-1 expr-2)
+ (and (numberp expr-1) (numberp expr-2) (= expr-1 expr-2))
+ (let ((type (type-of expr-1)))
+ (when (eq type (type-of expr-2))
+ (case type
+ (character (char-equal expr-1 expr-2))
+ (string (string-equal expr-1 expr-2))
+ (cons (do ((x (first expr-1)
+ (if (consp expr-1) (first expr-1) expr-1))
+ (y (first expr-2)
+ (if (consp expr-2) (first expr-2) expr-2)))
+ ((or (null expr-1)
+ (null expr-2)
+ (not (equalp x y)))
+ (and (null expr-1)
+ (null expr-2)))
+ (setq expr-1 (and (consp expr-1) (rest expr-1))
+ expr-2 (and (consp expr-2) (rest expr-2)))))
+ (array (let ((end (length expr-1)))
+ (when (eql end (length expr-2))
+ (dotimes (index end t)
+ (and (not (equalp (aref expr-1 index)
+ (aref expr-2 index)))
+ (return nil)))))))))))
+</pre>
+
+<p><b>cons:</b> <a href="../../reference/do.htm">do</a> is used instead of
+recursion because XLISP has only two kilobytes stack size. <nobr>The
+(<a href="../../reference/consp.htm">consp</a> <i>expr</i>)</nobr> tests are
+necessary because in a dotted list the last
+<a href="../../reference/rest.htm">rest</a> element is not a cons.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(cl:equalp 1 1.0) =&gt; T
+(cl:equalp #\a #\A) =&gt; T
+(cl:equalp "Abc" "aBc") =&gt; T
+(cl:equalp '(1 #\a "Abc") '(1.0 #\A "aBc")) =&gt; T
+(cl:equalp #(1 #\a "Abc") #(1.0 #\A "aBc")) =&gt; T
+</pre>
+
+<p>Nested expressions only match if the nesting matches:</p>
+
+<pre class="example">
+(cl:equalp '(1 <font color="#AA0000">(</font>2 3<font color="#AA0000">)</font>) '(1.0 <font color="#AA0000">(</font>2.0 3.0<font color="#AA0000">)</font>) =&gt; T
+(cl:equalp '(1 <font color="#AA0000">(</font>2 3<font color="#AA0000">)</font>) '(<font color="#AA0000">(</font>1.0 2.0<font color="#AA0000">)</font> 3.0) =&gt; NIL
+(cl:equalp '(<font color="#AA0000">(</font>1 2<font color="#AA0000">)</font> 3) '(<font color="#AA0000">(</font>1.0 2.0<font color="#AA0000">)</font> 3.0) =&gt; T
+(cl:equalp '(<font color="#AA0000">(</font>1 2<font color="#AA0000">)</font> 3) '(1.0 <font color="#AA0000">(</font>2.0 3.0<font color="#AA0000">)</font>) =&gt; NIL
+</pre>
+
+<p>A character does not match a string with the same character:</p>
+
+<pre class="example">
+(cl:equalp #\a "a") =&gt; NIL
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/exp.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/exp.htm
new file mode 100644
index 0000000..707e28e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/exp.htm
@@ -0,0 +1,92 @@
+<html><head>
+
+<title>cl:exp</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:exp</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>exp</b></nobr> function does the same as the
+Nyquist/XLISP <a href="../../reference/exp.htm">exp</a> function, but
+also accepts integer numbers as argument:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>exp</b> <i>power</i>)</dt>
+<dd><i>power</i> - an integer or floating-point number<br>
+returns - the result of <nobr>'e' [2.7128]</nobr> to the power of <i>power</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:exp</font> (x)
+ (exp (float x)))
+</pre>
+
+<p>See <a href="../../reference/defun.htm">defun</a>,
+<a href="../../reference/exp.htm">exp</a>,
+<a href="../../reference/float.htm">float</a>.</p>
+
+<p>The <nobr>cl:<b>exp</b></nobr> function computes <nobr>'e'
+[2.7128]</nobr> raised to the specified 'power' and returns the result as a
+<nobr>floating-point</nobr> number.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/expt.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/expt.htm
new file mode 100644
index 0000000..05e95ea
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/expt.htm
@@ -0,0 +1,105 @@
+<html><head>
+
+<title>cl:expt</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:expt</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>expt</b></nobr> function computes the result of 'x' to
+the power <nobr>of 'y'</nobr>:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>expt</b> <i>base power</i>)</dt>
+<dd><i>base</i> - the base<br>
+<i>power</i> - the exponent<br>
+returns - the result of <i>base</i> to the power of <i>power</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:expt</font> (x y)
+ (let ((power (expt (float x) y)))
+ (if (and (integerp x) (integerp y))
+ (round power)
+ power)))
+</pre>
+
+<p>See <a href="../reference/and.htm">and</a>,
+<a href="../reference/defun.htm">defun</a>,
+<a href="../reference/expt.htm">expt</a>,
+<a href="../reference/float.htm">float</a>,
+<nobr><a href="../reference/if.htm">&nbsp;if&nbsp;</a></nobr>,
+<a href="../reference/integerp.htm">integerp</a>,
+<a href="../reference/let.htm">let</a>,
+<a href="../reference/power.htm">power</a>,
+<a href="../reference/round.htm">round</a>.</p>
+
+<p>The <nobr>cl:<b>expt</b></nobr> function accepts integer and floating
+point numbers as arguments. <nobr>If both</nobr> arguments are integer
+numbers, the result will be an integer number, <nobr>if one</nobr> or both
+arguments are <nobr>floating-point</nobr> numbers, the result will be a
+<nobr>floating-point</nobr> number. <nobr>In contrast</nobr> to the
+Nyquist/XLISP <a href="../../reference/expt.htm">expt</a> function, the
+'<nobr>cl:expt</nobr>' function accepts exactly two arguments.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/floor.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/floor.htm
new file mode 100644
index 0000000..79e046c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/floor.htm
@@ -0,0 +1,150 @@
+<html><head>
+
+<title>cl:floor</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:floor</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>floor</b></nobr> function
+<a href="../../reference/truncate.htm">truncate</a>s an integer or
+<nobr>floating-point</nobr> number toward negative infinity:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>floor</b> <i>number </i> [<i>divisor</i>])</dt>
+<dd><i>number</i> - an integer or <nobr>floating-point</nobr> number<br>
+<i>divisor</i> - an integer or <nobr>floating-point</nobr> number, except zero<br>
+<table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td valign="top"><nobr>returns</nobr></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the result of truncating the result of <i>number</i> divided by <i>divisor</i></td>
+</tr>
+<tr>
+ <td></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the remainder of the truncate operation</td>
+</tr>
+</tbody></table></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:floor</font> (number &amp;optional (divisor
+ (if (integerp number) 1 1.0)
+ divisor-p))
+ (let ((quotient
+ (cond ((and (not divisor-p) (integerp number)) number)
+ ((= number divisor) 1)
+ (t (let ((i-quotient (/ (truncate number) (truncate divisor)))
+ (f-quotient (/ (float number) divisor)))
+ (if (or (= i-quotient f-quotient) <font color="#008844">; integer result</font>
+ (not (minusp f-quotient)))
+ (truncate f-quotient)
+ (1- (truncate f-quotient))))))))
+ (setq <font color="#AA5500">*rslt*</font> (list quotient (- number (* quotient divisor)))
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ quotient))
+</pre>
+
+<p>The <nobr>cl:<b>floor</b></nobr> function computes a quotient that has
+been truncated toward negative infinity. <nobr>That is</nobr>, the quotient
+represents the largest mathematical integer that is not larger than the
+mathematical quotient.</p>
+
+<p>The quotient is directly returned by the function, while a list:</p>
+
+<pre class="example">
+(quotient remainder)
+</pre>
+
+<p>is stored in the Nyquist/XLISP
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable and the
+<a href="global-multiple-values.htm">cl:*multiple-values*</a> is set to
+<a href="../../reference/t.htm">&nbsp;T&nbsp;</a> to signal that
+<a href="multiple-values.htm">Multiple Values</a> are returned.</p>
+
+<nobr>See
+<a href="rounding-and-truncation.htm">Rounding and Truncation</a></nobr>
+for more details.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(cl:floor 3.5) =&gt; 3 <font color="#008844">; *rslt* =&gt; ( 3 0.5)</font>
+(cl:floor -3.5) =&gt; -4 <font color="#008844">; *rslt* =&gt; (-4 0.5)</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr><a href="../../reference/rem.htm">rem</a> - remainder of an integer division</nobr></li>
+<li><nobr><a href="../../reference/round.htm">round</a> - round arbitrary numbers to integers</nobr></li>
+<li><nobr><a href="../../reference/truncate.htm">truncate</a> - truncate arbitrary numbers toward zero</nobr></li>
+<li><nobr><a href="mod.htm">cl:mod</a></nobr></li>
+<li><nobr><a href="rem.htm">cl:rem</a></nobr></li>
+<li><nobr><a href="round.htm">cl:round</a></nobr></li>
+<li><nobr><a href="truncate.htm">cl:truncate</a></nobr></li>
+<li><nobr><a href="ceiling.htm">cl:ceiling</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/global-multiple-values.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/global-multiple-values.htm
new file mode 100644
index 0000000..5ca1757
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/global-multiple-values.htm
@@ -0,0 +1,142 @@
+<html><head>
+
+<title>cl:*multiple-values*</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:*multiple-values*</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>*multiple-values*</b></nobr> variable is used to signal
+if a function has returned multiple values:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>cl:<b>*multiple-values*</b></dt>
+<dd>returns - <a href="../../reference/t.htm">&nbsp;T&nbsp;</a> if a
+function returned multiple values</dd>
+</dl>
+
+</div></p>
+
+<p>Test if a function has returned multiple values:</p>
+
+<pre class="example">
+(setf cl:*multiple-values* nil)
+(let ((result (function ...)))
+ (if cl:*multiple-values*
+ (do-something-with *rslt* ...)
+ (do-something-with result ...))
+ ... )
+</pre>
+
+<p>Do not use <nobr>cl:<b>*multiple-values*</b></nobr> with
+<a href="../../reference/let.htm">let</a> like this:</p>
+
+<pre class="example">
+(let ((cl:*multiple-values* nil)
+ (result (function ...)))
+ (if cl:*multiple-values*
+ (do-something-with *rslt* ...)
+ (do-something-with result ...))
+ ... )
+</pre>
+
+<p>This doesn't work because 'function' is evaluated in the global XLISP
+environment, where the lexical <a href="../../reference/let.htm">let</a>
+binding of the <nobr>cl:<b>*multiple-values*</b></nobr> variable does not
+exist, while the <a href="../../reference/if.htm">&nbsp;if&nbsp;</a> form
+inside the <a href="../../reference/let.htm">let</a> form cannot see a
+global change of the <nobr>cl:<b>*multiple-values*</b></nobr> variable,
+because the global value is shadowed by the lexical
+<a href="../../reference/let.htm">let</a> binding.
+<nobr>See <a href="../environment.htm">Environment</a></nobr> for more
+details about variables.</p>
+
+<p>The XLISP <a href="../../reference/progv.htm">progv</a> special form can
+be used to encapsulate a multiple value call while automatically restoring
+the old values at the end like this:</p>
+
+<pre class="example">
+(values 1 2 3) =&gt; 1
+
+cl:*multiple-values* =&gt; T
+*rslt* =&gt; (1 2 3)
+
+(progv '(cl:*multiple-values* *rslt*) '(nil nil)
+ (let ((result (function ...)))
+ (if cl:*multiple-values*
+ (do-something-with *rslt* ...)
+ (do-something-with result ...))))
+
+cl:*multiple-values* =&gt; T
+*rslt* =&gt; (1 2 3)
+</pre>
+
+<p><div class="box">
+
+<p><b>Note:</b> All functions returning multiple values set
+<nobr>cl:<b>*multiple-values*</b></nobr> to
+<a href="../../reference/t.htm">&nbsp;T&nbsp;</a>, but it's up to the
+Lisp programmer to reset the variable
+<nobr>to <a href="../../reference/nil.htm">NIL</a></nobr>.</p>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/log.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/log.htm
new file mode 100644
index 0000000..c7e5c5f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/log.htm
@@ -0,0 +1,95 @@
+<html><head>
+
+<title>cl:log</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:log</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>log</b></nobr> function does the same as the
+Nyquist/XLISP <a href="../../reference/log.htm">log</a> function, but also
+accepts integer numbers and has an optional 'base' argument:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>log</b> <i>number</i> [<i>base</i>])</dt>
+<dd><i>number</i> - an integer or floating-point number<br>
+<i>base</i> - an integer or floating-point number<br>
+returns - the the logarithm of <i>number</i> in base <i>base</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:log</font> (number &amp;optional base)
+ (if base
+ (if (zerop base)
+ 0.0
+ (/ (log (float number)) (log (float base))))
+ (log (float number))))
+</pre>
+
+<p>The '<nobr>cl:log</nobr>' function returns the logarithm of 'number' in
+base 'base'. <nobr>If 'base'</nobr> is not supplied its value <nobr>is
+'e'</nobr>, the base of the natural logarithms. <nobr>If the</nobr> 'base'
+argument is zero, then 'cl:log' returns zero. <nobr>The result</nobr> is
+always a <nobr>floating-point</nobr> number.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/mod.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/mod.htm
new file mode 100644
index 0000000..9454d4e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/mod.htm
@@ -0,0 +1,97 @@
+<html><head>
+
+<title>cl:mod</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:mod</h1>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>mod</b> <i>number divisor</i>)</dt>
+<dd><i>number</i> - an integer or floating-point number<br>
+<i>divisor</i> - an integer or floating-point number<br>
+returns - the remainder of a <a href="#cl-floor">cl:floor</a> operation</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:mod</font> (number divisor)
+ (if (= (abs number) (abs divisor))
+ (if (and (integerp number) (integerp divisor)) 0 0.0)
+ (let* ((i-quotient (/ (truncate number) (truncate divisor)))
+ (f-quotient (/ (float number) divisor))
+ (quotient (if (or (= i-quotient f-quotient) <font color="#008844">; integer result</font>
+ (not (minusp f-quotient)))
+ (truncate f-quotient)
+ (1- (truncate f-quotient)))))
+ (- number (* quotient divisor)))))
+</pre>
+
+<p>The <nobr>cl:<b>mod</b></nobr> function performs the
+<a href="floor.htm">cl:floor</a> operation on its arguments and returns the
+remainder of the <a href="floor.htm">cl:floor</a> operation. <nobr>The
+result</nobr> is either zero or an integer or <nobr>floating-point</nobr>
+number with the same sign as the 'divisor' argument. <nobr>If both</nobr>
+arguments are integer numbers, the <nobr>cl:<b>mod</b></nobr> function is
+equal to the mathematical modulus function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-bind.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-bind.htm
new file mode 100644
index 0000000..32fdadf
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-bind.htm
@@ -0,0 +1,193 @@
+<html><head>
+
+<title>cl:multiple-value-bind</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:multiple-value-bind</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>multiple-value-bind</b></nobr> macro creates new bindings
+for a list of symbols and evaluates expressions that use these bindings:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>multiple-value-bind</b> <i>symbols values</i> [<i>expr1</i> ...])</dt>
+<dd><i>symbols</i> - a list of symbols<br>
+<i>values</i> - a Lisp expression returning one or more values<br>
+<i>exprN</i> - arbitrary Lisp expressions<br>
+returns - the value[s] returned by the last expression</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">cl:multiple-value-bind</font> (symbols expr &rest body)
+ (and (or (not (consp symbols))
+ (eq 'quote (first symbols))
+ (dolist (symbol symbols)
+ (or (symbolp symbol) (return t))))
+ (error <font color="#880000">"not a list of symbols"</font> symbols))
+ (setq <font color="#AA5500">cl:*multiple-values*</font> nil)
+ (let* ((result (eval expr))
+ (values (if <font color="#AA5500">cl:*multiple-values*</font>
+ <font color="#AA5500">*rslt*</font>
+ (list result)))
+ (number-of-symbols (length symbols))
+ (number-of-values (length values))
+ (bindings nil))
+ (dotimes (index number-of-symbols)
+ (push (if (&lt; index number-of-values)
+ (list (nth index symbols)
+ (list 'quote (nth index values)))
+ (nth index symbols))
+ bindings))
+ (setq bindings (reverse bindings))
+ `(let ,bindings ,@body)))
+</pre>
+
+<p>The 'values' expression is evaluated, and each of the symbols is bound to
+the respective value returned by the evaluation. <nobr>If there</nobr> are
+more symbols than values returned, extra values of
+<a href="../../reference/nilo.htm">NIL</a> are bound to the remaining
+symbols. <nobr>If there</nobr> are more values than symbols, the extra
+values are ignored. The symbols are bound to the values <nobr>by
+<a href="../../reference/let.htm">let</a></nobr>, behaving like an
+<nobr>implicit <a href="../../reference/progn.htm">progn</a></nobr>.</p>
+
+<p><nobr>Before evaluating 'expr1', the
+<a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+variable <nobr>is <a href="../../reference/t.htm">&nbsp;T&nbsp;</a></nobr>
+if evaluating the 'values' expression returned multiple values and
+<a href="../../reference/nil.htm">NIL</a> with a normal return value.</p>
+
+<p>The <nobr>cl:<b>multiple-value-bind</b></nobr> macro binds multiple
+values to local <a href="../../reference/let.htm">let</a> variables::</p>
+
+<pre class="example">
+&gt; (macroexpand-1 '(cl:multiple-value-bind (a b c)
+ (cl:values 1 2 3)
+ (list a b c)))
+(LET ((A (QUOTE 1))
+ (B (QUOTE 2))
+ (C (QUOTE 3)))
+ (LIST A B C))
+</pre>
+
+<p>The <a href="../../reference/quote.htm">quote</a>s are necessary to
+prevent 'unbound variable' and 'unbound function' errors with symbols and
+lists.</p>
+
+<p>Examples:</p>
+
+<p><b>1.</b> The <nobr>cl:<b>multiple-value-bind</b></nobr> macro binds
+values returned by the <a href="values.htm">cl:values</a> function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">multiple-value-function</font> ()
+ (cl:values 1 2 3)) <font color="#008844">; multiple return values</font>
+
+&gt; (cl:multiple-value-bind (a b c)
+ (multiple-value-function)
+ (list a b c))
+(1 2 3)
+</pre>
+
+<p><b>2.</b> If there are no values returned in the Nyquist
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable, the normal
+function return value is bound to the first symbol and all remaining symbols
+are bound <nobr>to <a href="../../reference/nil.htm">NIL</a></nobr>:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">normal-lisp-function</font> ()
+ (+ 1 1)) <font color="#008844">; normal return value</font>
+
+&gt; (cl:multiple-value-bind (a b c)
+ (normal-lisp-function)
+ (list a b c))
+(2 NIL NIL)
+</pre>
+
+<p><b>3.</b> If there are less values than symbols, the extra symbols are
+bound <nobr>to <a href="../../reference/nil.htm">NIL</a></nobr>:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">not-enough-values-function</font> ()
+ (cl:values 1 2)) <font color="#008844">; multiple return values</font>
+
+&gt; (cl:multiple-value-bind (a b c)
+ (not-enough-values-function)
+ (list a b c))
+(1 2 NIL)
+</pre>
+
+<p><b>4.</b> If there are more values than symbols, the extra values are
+ignored:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">too-many-values-function</font> ()
+ (cl:values 1 2 3 4 5)) <font color="#008844">; multiple return values</font>
+
+&gt; (cl:multiple-value-bind (a b c)
+ (too-many-values-function)
+ (list a b c))
+(1 2 3)
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-call.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-call.htm
new file mode 100644
index 0000000..dba7c45
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-call.htm
@@ -0,0 +1,119 @@
+<html><head>
+
+<title>cl:multiple-value-call</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:multiple-value-call</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>multiple-value-call</b></nobr> macro applies a function
+to a list of return values:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>multiple-value-call</b> <i>function</i> [<i>expr1</i> ...])</dt>
+<dd><i>function</i> - a Lisp expression evaluating to a function call<br>
+<i>exprN</i> - arbitrary Lisp expressions<br>
+returns - the values returned by the function</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">cl:multiple-value-call</font> (function &amp;rest exprs)
+ (let (args)
+ (dolist (expr exprs)
+ (setq <font color="#AA5500">cl:*multiple-values*</font> nil)
+ (let* ((result (eval expr)))
+ (if <font color="#AA5500">cl:*multiple-values*</font>
+ (dolist (rslt <font color="#AA5500">*rslt*</font>) (push rslt args))
+ (push result args))))
+ (setq args (reverse args))
+ `(progn
+ (setq <font color="#AA5500">cl:*multiple-values*</font> nil)
+ (apply ,function ',args)))
+</pre>
+
+<p>The <nobr>cl:<b>multiple-value-call</b></nobr> macro first evaluates the
+expressions and collects all return values in a single list, then the
+'function' form is evaluated and the resulting function call is applied to
+the list of values.</p>
+
+<p>Before applying the function to the list of values the
+<nobr><a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+variable is set to <a href="../../reference/nil.htm">NIL</a>, the final value of
+<nobr><a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+depends on the 'function' argument.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+&gt; (funcall #'+
+ (cl:values 1 2)
+ (cl:values 3 4))
+4 <font color="#008844">; (apply #'+ (1 3))</font>
+
+&gt; (cl:multiple-value-call #'+
+ (cl:values 1 2)
+ (cl:values 3 4))
+10 <font color="#008844">; (apply #'+ (1 2 3 4))</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-list.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-list.htm
new file mode 100644
index 0000000..6e3a374
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-list.htm
@@ -0,0 +1,112 @@
+<html><head>
+
+<title>cl:multiple-value-list</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:multiple-value-list</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>multiple-value-list</b></nobr> macro evaluates a Lisp
+expression and returns all values in a list:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>multiple-value-list</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - an arbitrary Lisp expression<br>
+returns - all values in a list</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">cl:multiple-value-list</font> (expr)
+ (setq <font color="#AA5500">cl:*multiple-values*</font> nil)
+ (let ((result (eval expr)))
+ (if <font color="#AA5500">cl:*multiple-values*</font>
+ '<font color="#AA5500">*rslt*</font>
+ `(list ,result))))
+</pre>
+
+<p>The <nobr>cl:<b>multiple-value-list</b></nobr> macro first evaluates the
+expression. <nobr>If the</nobr> evaluation returned multiple values, the
+value of the <a href="../../reference/global-rslt.htm">*rslt*</a> variable
+is returned, otherwise the normal Lisp return value is returned in a list of
+one element.</p>
+
+<p><nobr>The
+<a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+variable <nobr>is <a href="../../reference/t.htm">&nbsp;T&nbsp;</a></nobr>
+if evaluating the expression returns multiple values and
+<a href="../../reference/nil.htm">NIL</a> with a normal return value.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(cl:multiple-value-list 1) =&gt; (1) <font color="#008844">; cl:*multiple-values* =&gt; NIL</font>
+ <font color="#008844">; *rslt* =&gt; [invalid]</font>
+(cl:multiple-value-list
+ (+ 1 1)) =&gt; (2) <font color="#008844">; cl:*multiple-values* =&gt; NIL</font>
+ <font color="#008844">; *rslt* =&gt; [invalid]</font>
+(cl:multiple-value-list
+ (cl:values 1 2 3)) =&gt; (1 2 3) <font color="#008844">; cl:*multiple-values* =&gt; T</font>
+ <font color="#008844">; *rslt* =&gt; (1 2 3)</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-prog1.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-prog1.htm
new file mode 100644
index 0000000..d5f5fc6
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-prog1.htm
@@ -0,0 +1,106 @@
+<html><head>
+
+<title>cl:multiple-value-prog1</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:multiple-value-prog1</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>multiple-value-prog1</b></nobr> macro is like
+<a href="../../reference/prog1.htm">prog1</a>, but it can handle multiple
+values:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>multiple-value-prog1</b> <i>expr1</i> [<i>expr2</i> ...])</dt>
+<dd><i>exprN</i> - arbitrary Lisp expressions<br>
+returns - the values returned by the first expression</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">cl:multiple-value-prog1</font> (expr &amp;rest body)
+ (setq <font color="#AA5500">cl:*multiple-values*</font> nil)
+ (let* ((result (eval expr)))
+ (if <font color="#AA5500">cl:*multiple-values*</font>
+ `(progn ,@body
+ (setq <font color="#AA5500">*rslt*</font> ',<font color="#AA5500">*rslt*</font>
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ ',result)
+ `(progn ,@body ',result))))
+</pre>
+
+<p>The <nobr>cl:<b>multiple-value-prog1</b></nobr> macro evaluates the first
+expression and saves all the values returned by the evaluation. <nobr>It
+then</nobr> evaluates each of the following expressions from left to right,
+discarding their values. After the evaluation is finished, the
+<nobr><a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+and <a href="../../reference/global-rslt.htm">*rslt*</a> variables are
+restored and the primary value from evaluating the fist expression is
+returned.</p>
+
+<p><nobr>The
+<a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+variable <nobr>is <a href="../../reference/t.htm">&nbsp;T&nbsp;</a></nobr>
+if evaluating the first expression returns multiple values and
+<a href="../../reference/nil.htm">NIL</a> with a normal return value.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-setq.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-setq.htm
new file mode 100644
index 0000000..3a8b701
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-value-setq.htm
@@ -0,0 +1,239 @@
+<html><head>
+
+<title>cl:multiple-value-setq</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:multiple-value-setq</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>multiple-value-setq</b></nobr> macro assigns multiple
+values to multiple variables:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>multiple-value-setq</b> <i>symbols expr</i>)</dt>
+<dd><i>symbols</i> - a list of symbols<br>
+<i>expr</i> - a Lisp expression returning one or more values<br>
+returns - the primary value returned by evaluating the expression</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">cl:multiple-value-setq</font> (symbols expr)
+ (and (or (not (consp symbols))
+ (eq 'quote (first symbols))
+ (dolist (symbol symbols)
+ (or (symbolp symbol) (return t))))
+ (error <font color="#880000">"not a list of symbols"</font> symbols))
+ (setq <font color="#AA5500">cl:*multiple-values*</font> nil)
+ (let* ((result (eval expr))
+ (values (if <font color="#AA5500">cl:*multiple-values*</font>
+ <font color="#AA5500">*rslt*</font>
+ (list result)))
+ (number-of-symbols (length symbols))
+ (number-of-values (length values))
+ (assignments (list 'setq)))
+ (dotimes (index number-of-symbols)
+ (push (nth index symbols) assignments)
+ (push (when (&lt; index number-of-values)
+ (list 'quote (nth index values)))
+ assignments))
+ (setq assignments (reverse assignments))
+ `(progn ,assignments ',result)))
+</pre>
+
+<p>The expression is evaluated, and each symbol is assigned to the
+corresponding value returned by the evaluation. <nobr>If there</nobr> are
+more symbols than values returned,
+<a href="../../reference/nil.htm">NIL</a> is assigned to the extra symbols.
+<nobr>If there</nobr> are more values than symbols, the extra values are
+discarded.</p>
+
+<p><nobr>The
+<a href="#cl-global-multiple-values">cl:*multiple-values*</a></nobr>
+variable <nobr>is <a href="../../reference/t.htm">&nbsp;T&nbsp;</a></nobr>
+if evaluating the expression returns multiple values and
+<a href="../../reference/nil.htm">NIL</a> with a normal return value.</p>
+
+<p>The <nobr>cl:<b>multiple-value-setq</b></nobr> macro assigns multiple
+values to multiple variables
+<nobr>using <a href="../../reference/setq.htm">setq</a>:</nobr></p>
+
+<pre class="example">
+&gt; (macroexpand-1 '(cl:multiple-value-setq (a b c)
+ (cl:values 1 2 3)))
+(PROGN (SETQ A (QUOTE 1)
+ B (QUOTE 2)
+ C (QUOTE 3))
+ (QUOTE 1))
+</pre>
+
+<p>The <a href="../../reference/quote.htm">quote</a>s are necessary to
+prevent 'unbound variable' and 'unbound function' errors with symbols and
+lists.</p>
+
+<p>Examples:</p>
+
+<p><b>1.</b> The <nobr>cl:<b>multiple-value-setq</b></nobr> macro assigns
+values returned by the <a href="values.htm">cl:values</a> function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">multiple-value-function</font> ()
+ (cl:values 1 2 3)) <font color="#008844">; multiple return values</font>
+
+&gt; (let ((a 'A) (b 'B) (c 'C))
+ (cl:multiple-value-setq (a b c)
+ (multiple-value-function))
+ (list a b c))
+(1 2 3)
+</pre>
+
+<p><b>2.</b> If there are no values returned in the Nyquist
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable, the normal
+function return value is assigned to the first symbol and all remaining
+symbols are assigned
+<nobr>to <a href="../../reference/nil.htm">NIL</a></nobr>:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">normal-lisp-function</font> ()
+ (+ 1 1)) <font color="#008844">; normal return value</font>
+
+&gt; (let ((a 'A) (b 'B) (c 'C))
+ (cl:multiple-value-setq (a b c)
+ (normal-lisp-function))
+ (list a b c))
+(2 NIL NIL)
+</pre>
+
+<p><b>3.</b> If there are less values than symbols, the extra symbols are
+assigned <nobr>to <a href="../../reference/nil.htm">NIL</a></nobr>:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">not-enough-values-function</font> ()
+ (cl:values 1 2)) <font color="#008844">; multiple return values</font>
+
+&gt; (let ((a 'A) (b 'B) (c 'C))
+ (cl:multiple-value-setq (a b c)
+ (not-enough-values-function))
+ (list a b c))
+(1 2 NIL)
+</pre>
+
+<p><b>4.</b> If there are more values than symbols, the extra values are
+ignored:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">too-many-values-function</font> ()
+ (cl:values 1 2 3 4 5)) <font color="#008844">; multiple return values</font>
+
+&gt; (let ((a 'A) (b 'B) (c 'C))
+ (cl:multiple-value-setq (a b c)
+ (too-many-values-function))
+ (list a b c))
+(1 2 3)
+</pre>
+
+<p><b>5.</b> Symbols not contained in the
+<nobr>cl:<b>multiple-value-setq</b></nobr> <nobr>symbol-list</nobr> are not
+changed:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">multiple-value-function</font> ()
+ (cl:values 1 2 3)) <font color="#008844">; multiple return values</font>
+
+&gt; (let ((a 'A) (b 'B) (c 'C) (d 'D) (e 'E))
+ (cl:multiple-value-setq (a b c)
+ (multiple-value-function))
+ (list a b c d e))
+(1 2 3 D E)
+</pre>
+
+<p><b>5.</b> If no bindings exist, new variables will be created:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">multiple-value-function</font> ()
+ (cl:values 1 2 3)) <font color="#008844">; multiple return values</font>
+
+&gt; (let ((c 'C) (d 'D) (e 'E))
+ (cl:multiple-value-setq (a b c)
+ (multiple-value-function))
+ (list a b c d e))
+(1 2 3 D E)
+</pre>
+
+<p><b>Caution:</b> In the last example, two global variables 'a' and 'b'
+were created, while the lexical <a href="../../reference/let.htm">let</a>
+variable 'c' was assigned to the <nobr>value 3</nobr>:</p>
+
+<pre class="example">
+&gt; (list a b)
+(1 2)
+
+&gt; (list a b c)
+<font color="#AA0000">error: unbound variable - C</font>
+</pre>
+
+<p>The lexical <a href="../../reference/let.htm">let</a> binding of 'c' does
+not exist in the global <nobr>top-level</nobr>.
+<nobr>See <a href="../environment.htm">Environment</a></nobr> for more
+details about variables.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-values.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-values.htm
new file mode 100644
index 0000000..d05df73
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/multiple-values.htm
@@ -0,0 +1,181 @@
+<html><head>
+
+<title>Multiple Values</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Multiple Values</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#multiple-values">Multiple Values</a></nobr></li>
+<ul>
+<li><nobr>Nyquist/XLISP helpers</nobr></li>
+<ul>
+<li><nobr><a href="global-multiple-values.htm">cl:*multiple-values*</a> - [Variable] - signals if a function has returned multiple values</nobr></li>
+<li><nobr><a href="debug-mv.htm">cl:debug:mv</a> - [Function] - debug multiple values</nobr></li>
+</ul>
+<li><nobr>Returning Multiple Values</nobr></li>
+<ul>
+<li><nobr><a href="values.htm">cl:values</a> - [Function] - return multiple values</nobr></li>
+<li><nobr><a href="values-list.htm">cl:values-list</a> - [Function] - return multiple values from a list</nobr></li>
+</ul>
+<li><nobr>Working with Multiple Values</nobr></li>
+<ul>
+<li><nobr><a href="multiple-value-list.htm">cl:multiple-value-list</a> - [Macro] - evaluate an expression and return all values in a list</nobr></li>
+<li><nobr><a href="multiple-value-bind.htm">cl:multiple-value-bind</a> - [Macro] - bind multiple values to multiple <a href="../reference/let.htm">let</a> variables</nobr></li>
+<li><nobr><a href="multiple-value-setq.htm">cl:multiple-value-setq</a> - [Macro] - assign multiple values to multiple variables using <a href="../reference/setq.htm">setq</a></nobr></li>
+<li><nobr><a href="multiple-value-prog1.htm">cl:multiple-value-prog1</a> - [Macro] - eveluate multiple expressions, return the values of the first expression</nobr></li>
+<li><nobr><a href="multiple-value-call.htm">cl:multiple-value-call</a> - [Macro] - apply a function to multiple values collected in a list</nobr></li>
+</ul>
+</ul>
+</ol>
+
+<a name="multiple-values"></a>
+
+<hr>
+
+<h2>Multiple Values</h2>
+
+<hr>
+
+<p>This is a port of the Common List framework for passing multiple values
+from one place to another. <nobr>It is</nobr> most often used to return
+multiple values from a function with
+<a href="values.htm">cl:values</a> or to bind multiple values to multiple
+variables with
+<nobr><a href="multiple-value-bind.htm">cl:multiple-value-bind</a></nobr> or
+<nobr><a href="multiple-value-setq.htm">cl:multiple-value-setq</a></nobr>.</p>
+
+<p>The multiple value functions and macros use the
+<nobr>Nyquist/XLISP</nobr>
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable to store the
+values as a list, while the
+<nobr><a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+variable is used as a flag to indicate if a function has returned multiple
+values.</p>
+
+<p><b>What happens if a normal Lisp function are given multiple
+values?</b></p>
+
+<p>A normal Lisp function only sees the 'primary' return value, as returned
+by every Lisp function. <nobr>The additional</nobr> return values
+[including the primary return value] are stored in the
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable and are only read
+by the multiple value functions. This also means that with multiple values,
+the most important value should always be returned as the first value,
+because only the first value can be seen by a normal Lisp function.
+<nobr>See <a href="values.htm">cl:values</a></nobr> for examples.</p>
+
+<p><b>What happens if a function expecting multiple values is given a normal
+Lisp return value?</b></p>
+
+<p>The first symbol will be set to the function's return value, while all
+other symbol will be set to <a href="../../reference/nil.htm">NIL</a>.
+<nobr>No symbol</nobr> will be left unset. <nobr>All functions</nobr>
+expecting multiple values are protected against a wrong number of values.
+<nobr>If there</nobr> are more symbols than values, then the extra symbols
+are set to <a href="../../reference/nil.htm">NIL</a>, if there are more
+values than symbols, the extra values will be ignored.</p>
+
+<p><div class="box">
+
+<p><b>Known Limitations</b></p>
+
+<p><b>1.</b> In Nyquist/XLISP, <a href="values.htm">cl:values</a> cannot be
+used as argument to <a href="../../reference/setf.htm">setf</a>. <nobr>But
+this</nobr> is not a real problem, because the values are stored as a
+simple list in the <a href="../../reference/global-rslt.htm">*rslt*</a>
+variable, where they can be manipulated with any arbitrary Lisp
+functions, not only <nobr>with
+<a href="../../reference/setf.htm">setf</a></nobr>.</p>
+
+<p><b>2.</b> In <nobr>Common Lisp</nobr> there exists the option to return
+<nobr>'no value</nobr>' by calling the 'values' function with no arguments.
+<nobr>In Nyquist/XLISP</nobr> there is no <nobr>built-in</nobr> way to
+return '<nobr>no value</nobr>' from a function. <nobr>The symbol</nobr>
+<a href="../../reference/global-unbound.htm">*unbound*</a> cannot be used for
+this because in <nobr>Common Lisp</nobr>, if '<nobr>no value</nobr>' is
+assigned to a symbol as variable value, the new value will be
+<a href="../../reference/nil.htm">NIL</a> and not
+<a href="../../reference/global-unbound.htm">*unbound*</a>.</p>
+
+<p>In Nyquist/XLISP, the <a href="values.htm">cl:values</a> function, if
+called with no arguments, always returns
+<a href="../../reference/nil.htm">NIL</a>, and the
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable will be
+set <nobr>to <a href="../../reference/nil.htm">NIL</a>, too:</nobr></p>
+
+<pre class="example">
+(cl:values) =&gt; NIL <font color="#008844">; *rslt* = NIL</font>
+(cl:values nil) =&gt; NIL <font color="#008844">; *rslt* = (NIL)</font>
+</pre>
+
+<p>Maybe this observation helps to write a '<nobr>no values</nobr>' test if
+anybody really <nobr>needs it</nobr>.</p>
+
+<p><b>3.</b> Neither in <nobr>Common Lisp</nobr> nor in Nyquist/XLISP is it
+possibe to return nested multiple values:</p>
+
+<pre class="example">
+(cl:values (1 (cl:values 2 3) 4) =&gt; 1 <font color="#008844">; *rslt* = (1 2 4)</font>
+</pre>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/numbers.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/numbers.htm
new file mode 100644
index 0000000..d1b684c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/numbers.htm
@@ -0,0 +1,104 @@
+<html><head>
+
+<title>Numbers</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Numbers</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#number-types">Number Types</a></nobr></li>
+<li><nobr><a href="#integer-limits">Integer Limits</a></nobr></li>
+</ol>
+
+<a name="number-types"></a>
+
+<hr>
+
+<h2>Number Types</h2>
+
+<hr>
+
+<p>In Nyquist/XLISP only two types of numers exist:</p>
+
+<ul>
+<li><nobr><b>fixnum</b> - integer numbers</nobr></li>
+<li><nobr><b>flonum</b> - floating-point numbers</nobr></li>
+</ul>
+
+<p>In Nyquist/XLISP, there are no ratios or complex numbers. Even if the
+math functions in this section are modelled after <nobr>Common Lisp</nobr>,
+no attempt is made to emulate these numbers.</p>
+
+<a name="integer-limits"></a>
+
+<hr>
+
+<h2>Integer Limits</h2>
+
+<hr>
+
+<pre class="example">
+(setq <font color="#AA5500">*most-positive-fixnum*</font> 2147483647)
+(setq <font color="#AA5500">*most-negative-fixnum*</font> -2147483648)
+</pre>
+
+<p><b>Note:</b> these are the limits for <nobr>32-bit</nobr> machines.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/rem.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/rem.htm
new file mode 100644
index 0000000..aba20c5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/rem.htm
@@ -0,0 +1,93 @@
+<html><head>
+
+<title>cl:rem</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:rem</h1>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>rem</b> <i>number divisor</i>)</dt>
+<dd><i>number</i> - an integer or floating-point number<br>
+<i>divisor</i> - an integer or floating-point number<br>
+returns - the remainder of a <a href="cl-truncate">cl:truncate</a> operation</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:rem</font> (number divisor)
+ (if (= (abs number) (abs divisor))
+ (if (and (integerp number) (integerp divisor)) 0 0.0)
+ (let ((quotient (truncate (/ (float number) divisor))))
+ (- number (* quotient divisor)))))
+</pre>
+
+<p>The <nobr>cl:<b>rem</b></nobr> function performs the
+<a href="truncate.htm">cl:truncate</a> operation on its arguments and
+returns the remainder of the <a href="truncate.htm">cl:truncate</a>
+operation. <nobr>The result</nobr> is either zero or an integer or
+<nobr>floating-point</nobr> number with the same sign as the 'number'
+argument. <nobr>If both</nobr> arguments are integer numbers, the
+<nobr>cl:<b>rem</b></nobr> function is equal to the mathematical remainder
+function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/remainder-and-modulus.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/remainder-and-modulus.htm
new file mode 100644
index 0000000..b7e89c4
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/remainder-and-modulus.htm
@@ -0,0 +1,93 @@
+<html><head>
+
+<title>Remainder and Modulus</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Remainder and Modulus</h1>
+
+<hr>
+
+<p>The <a href="mod.htm">cl:mod</a> and <a href="rem.htm">cl:rem</a>
+function are generalizations of the modulus and remainder functions.</p>
+
+<ul>
+
+<li><p><nobr>The <a href="mod.htm">cl:mod</a></nobr> function performs the
+<a href="floor.htm">cl:floor</a> operation on its arguments and returns the
+remainder of the <a href="floor.htm">cl:floor</a> operation.</p></li>
+
+<li><p><nobr>The <a href="rem.htm">cl:rem</a></nobr> function performs the
+<a href="truncate.htm">cl:truncate</a> operation on its arguments and returns
+the remainder of the <a href="truncate.htm">cl:truncate</a> operation.</p></li>
+
+</ul>
+
+<p><nobr>The <a href="mod.htm">cl:mod</a></nobr> and
+<a href="rem.htm">cl:rem</a> functions are the modulus and remainder
+functions when the 'number' and 'divisor' arguments both are integers.</p>
+
+<pre class="example">
+(mod 13 4) =&gt; 1 (rem 13 4) =&gt; 1
+(mod -13 4) =&gt; 3 (rem -13 4) =&gt; -1
+(mod 13 -4) =&gt; -3 (rem 13 -4) =&gt; 1
+(mod -13 -4) =&gt; -1 (rem -13 -4) =&gt; -1
+(mod 13.4 1) =&gt; 0.4 (rem 13.4 1) =&gt; 0.4
+(mod -13.4 1) =&gt; 0.6 (rem -13.4 1) =&gt; -0.4
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/round.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/round.htm
new file mode 100644
index 0000000..cf0be2c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/round.htm
@@ -0,0 +1,141 @@
+<html><head>
+
+<title>cl:round</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:round</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>round</b></nobr> function
+<a href="../../reference/truncate.htm">truncate</a>s an integer or
+<nobr>floating-point</nobr> number toward the next integer:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>round</b> <i>number </i> [<i>divisor</i>])</dt>
+<dd><i>number</i> - an integer or <nobr>floating-point</nobr> number<br>
+<i>divisor</i> - an integer or <nobr>floating-point</nobr> number, except zero<br>
+<table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td valign="top"><nobr>returns</nobr></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the result of runding the result of <i>number</i> divided by <i>divisor</i></td>
+</tr>
+<tr>
+ <td></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the remainder of the round operation</td>
+</tr>
+</tbody></table></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:round</font> (number &amp;optional (divisor
+ (if (integerp number) 1 1.0)
+ divisor-p))
+ (let* ((x (/ (float number) divisor))
+ (quotient (cond ((and (not divisor-p) (integerp number)) number)
+ ((= number divisor) 1)
+ ((plusp x) (truncate (+ x 0.5)))
+ ((= (- x 0.5) (truncate (- x 0.5)))
+ (if (minusp x)
+ (1- (truncate x))
+ (truncate x)))
+ (t (truncate (- x 0.5))))))
+ (setq <font color="#AA5500">*rslt*</font> (list quotient (- number (* quotient divisor)))
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ quotient))
+</pre>
+
+<p>The <nobr>cl:<b>round</b></nobr> function computes a quotient that has
+been rounded to the nearest mathematical integer. <nobr>If the</nobr>
+mathematical quotient is exactly halfway between two integers, [that is, it
+has the form <nobr>'integer+1/2']</nobr>, then the quotient has been rounded
+to the even [divisible <nobr>by two]</nobr> integer.</p>
+
+<p>The quotient is directly returned by the function, while a list:</p>
+
+<pre class="example">
+(quotient remainder)
+</pre>
+
+<p>is stored in the Nyquist/XLISP
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable and the
+<a href="global-multiple-values.htm">cl:*multiple-values*</a> is set to
+<a href="../../reference/t.htm">&nbsp;T&nbsp;</a> to signal that
+<a href="multiple-values.htm">Multiple Values</a> are returned.</p>
+
+<nobr>See
+<a href="rounding-and-truncation.htm">Rounding and Truncation</a></nobr>
+for more details.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(round 3.5) =&gt; 4
+(round -3.5) =&gt; -3
+
+(cl:round 3.5) =&gt; 4 <font color="#008844">; *rslt* = ( 4 -0.5)</font>
+(cl:round -3.5) =&gt; -4 <font color="#008844">; *rslt* = (-4 0.5)</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/rounding-and-truncation.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/rounding-and-truncation.htm
new file mode 100644
index 0000000..40eaebc
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/rounding-and-truncation.htm
@@ -0,0 +1,179 @@
+<html><head>
+
+<title>Rounding and Truncation</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Rounding and Truncation</h1>
+
+<hr>
+
+<p>The <a href="round.htm">cl:round</a>,
+<a href="truncate.htm">cl:truncate</a>,
+<a href="ceiling.htm">cl:ceiling</a> and
+<a href="floor.htm">cl:floor</a> functions divide a number by a divisor,
+returning a quotient and a remainder:</p>
+
+<p><div class="box">
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr valign="top">
+ <td align="right"><nobr>(<a href="round.htm">cl:round</a>&nbsp;</nobr></td>
+ <td><nobr><i>number</i> [<i>divisor</i>])</nobr></td>
+ <td><nobr>&nbsp; &rArr; &nbsp;</nobr></td>
+ <td><nobr><i>quotient</i>, <i>remainder</i></nobr></td>
+</tr>
+<tr valign="top">
+ <td align="right"><nobr>(<a href="truncate.htm">cl:truncate</a>&nbsp;</nobr></td>
+ <td><nobr><i>number</i> [<i>divisor</i>])</nobr></td>
+ <td><nobr>&nbsp; &rArr; &nbsp;</nobr></td>
+ <td><nobr><i>quotient</i>, <i>remainder</i></nobr></td>
+</tr>
+<tr valign="top">
+ <td align="right"><nobr>(<a href="ceiling.htm">cl:ceiling</a>&nbsp;</nobr></td>
+ <td><nobr><i>number</i> [<i>divisor</i>])</nobr></td>
+ <td><nobr>&nbsp; &rArr; &nbsp;</nobr></td>
+ <td><nobr><i>quotient</i>, <i>remainder</i></nobr></td>
+</tr>
+<tr valign="top">
+ <td align="right"><nobr>(<a href="floor.htm">cl:floor</a>&nbsp;</nobr></td>
+ <td><nobr><i>number</i> [<i>divisor</i>])</nobr></td>
+ <td><nobr>&nbsp; &rArr; &nbsp;</nobr></td>
+ <td><nobr><i>quotient</i>, <i>remainder</i></nobr></td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;
+<i>quotient</i> * <i>divisor</i> + <i>remainder</i> = <i>number</i></nobr></p>
+
+</div></p>
+
+<p>The 'quotient' always represents a mathematical integer. <nobr>The
+'remainder'</nobr> is an integer if both 'number' and 'divisor' arguments
+are integers, and a <nobr>floating-point</nobr> number if either the
+'number' or the 'divisor' or both are <nobr>floating-point</nobr>
+numbers.</p>
+
+<p>With Nyquist/XLISP, the 'quotient' is always directly returned by the
+function, while a list:</p>
+
+<pre class="example">
+(<font color="#0000CC">quotient remainder</font>)
+</pre>
+
+<p>is stored in the Nyquist/XLISP
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable and the
+<a href="global-multiple-values.htm">cl:*multiple-values*</a> is set to
+<a href="../../reference/t.htm">&nbsp;T&nbsp;</a> to signal that
+<a href="multiple-values.htm">Multiple Values</a> are returned.</p>
+
+Examples:
+
+<pre class="example">
+(cl:round 3.5) =&gt; 4 <font color="#008844">; *rslt* = ( 4 -0.5)</font>
+(cl:truncate 3.5) =&gt; 3 <font color="#008844">; *rslt* = ( 3 0.5)</font>
+(cl:ceiling 3.5) =&gt; 4 <font color="#008844">; *rslt* = ( 4 -0.5)</font>
+(cl:floor 3.5) =&gt; 3 <font color="#008844">; *rslt* = ( 3 0.5)</font>
+
+(cl:round -3.5) =&gt; -4 <font color="#008844">; *rslt* = (-4 0.5)</font>
+(cl:truncate -3.5) =&gt; -3 <font color="#008844">; *rslt* = (-3 -0.5)</font>
+(cl:ceiling -3.5) =&gt; -3 <font color="#008844">; *rslt* = (-3 -0.5)</font>
+(cl:floor -3.5) =&gt; -4 <font color="#008844">; *rslt* = (-4 0.5)</font>
+</pre>
+
+<p>Force an integer division:</p>
+
+<pre class="example">
+(cl:truncate 3.0 2.0) =&gt; 1 <font color="#008844">; Common Lisp</font>
+(/ (truncate 3.0) (truncate 2.0)) =&gt; 1 <font color="#008844">; Nyquist/XLISP</font>
+(/ 3 2) =&gt; 1 <font color="#008844">; integer division</font>
+</pre>
+
+<p><div class="box">
+
+<p><b>Implementation Notes</b></p>
+
+<pre class="example">
+(defun <font color="#0000CC">name</font> (number &amp;optional (divisor (if (<font color="#AA0000">integerp</font> number) 1 1.0)))
+ ... )
+</pre>
+
+<p>The <a href="../../reference/integerp.htm">integerp</a> test in the
+parameter list signals an error if the 'number' argument is not a number,
+also the <nobr><a href="../../reference/division.htm">&nbsp;/&nbsp;</a>
+[division]</nobr> function signals errors if the 'divisor' argument is zero
+or not a number, so we do not explicitely need to test the arguments.</p>
+
+<p>The <nobr><a href="ceiling.htm">cl:ceiling</a></nobr> and
+<nobr><a href="floor.htm">cl:floor</a></nobr> functions test if 'number' is
+an integer multiple of 'divisor' by comparing the results of an integer
+division and a <nobr>floating-point</nobr> division:</p>
+
+<pre class="example">
+(let ((<font color="#AA0000">i-quotient</font> (/ (truncate number) (truncate divisor)))
+ (<font color="#AA0000">f-quotient</font> (/ (float number) divisor)))
+ (if (= <font color="#AA0000">i-quotient f-quotient</font>)
+ ...
+</pre>
+
+<p>I'm not sure if this really catches all cases <nobr>[e.g.
+regarding</nobr> floating point precision], but have found no problems so
+far.</p>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/sqrt.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/sqrt.htm
new file mode 100644
index 0000000..b430da3
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/sqrt.htm
@@ -0,0 +1,92 @@
+<html><head>
+
+<title>cl:sqrt</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:sqrt</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>sqrt</b></nobr> function does the same as the
+Nyquist/XLISP <a href="../../reference/sqrt.htm">sqrt</a> function, but
+also accepts integer numbers as argument:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>sqrt</b> <i>number</i>)</dt>
+<dd><i>number</i> - an integer or floating-point number<br>
+returns - the square root of <i>number</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:sqrt</font> (x)
+ (sqrt (float x)))
+</pre>
+
+<p>See <a href="../../reference/defun.htm">defun</a>,
+<a href="../../reference/float.htm">float</a>,
+<a href="../../reference/sqrt.htm">sqrt</a>.</p>
+
+The <nobr>cl:<b>sqrt</b></nobr> function computes the square root of its
+argument and returns the result. as a <nobr>floating-point</nobr>
+number.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/truncate.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/truncate.htm
new file mode 100644
index 0000000..6032dd3
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/truncate.htm
@@ -0,0 +1,135 @@
+<html><head>
+
+<title>cl:truncate</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:truncate</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>truncate</b></nobr> function
+<a href="../../reference/truncate.htm">truncate</a>s an integer or
+<nobr>floating-point</nobr> number toward zero:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>truncate</b> <i>number </i> [<i>divisor</i>])</dt>
+<dd><i>number</i> - an integer or <nobr>floating-point</nobr> number<br>
+<i>divisor</i> - an integer or <nobr>floating-point</nobr> number, except zero<br>
+<table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td valign="top"><nobr>returns</nobr></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the result of truncating the result of <i>number</i> divided by <i>divisor</i></td>
+</tr>
+<tr>
+ <td></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the remainder of the truncate operation</td>
+</tr>
+</tbody></table></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:truncate</font> (number &amp;optional (divisor (if (integerp number) 1 1.0)))
+ (let ((quotient (truncate (/ (float number) divisor))))
+ (setq <font color="#AA5500">*rslt*</font> (list quotient (- number (* quotient divisor)))
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ quotient))
+</pre>
+
+<p>The <nobr>cl:<b>truncate</b></nobr> function computes a quotient that has
+been truncated towards zero. <nobr>That is</nobr>, the quotient represents
+the mathematical integer of the same sign as the mathematical quotient, and
+that has the greatest integral magnitude not greater than that of the
+mathematical quotient.</p>
+
+<p>The quotient is directly returned by the function, while a list:</p>
+
+<pre class="example">
+(quotient remainder)
+</pre>
+
+<p>is stored in the Nyquist/XLISP
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable and the
+<a href="global-multiple-values.htm">cl:*multiple-values*</a> is set to
+<a href="../../reference/t.htm">&nbsp;T&nbsp;</a> to signal that
+<a href="multiple-values.htm">Multiple Values</a> are returned.</p>
+
+<nobr>See
+<a href="rounding-and-truncation.htm">Rounding and Truncation</a></nobr>
+for more details.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(cl:truncate 3.5) =&gt; 0 <font color="#008844">; *rslt* =&gt; ( 3 0.5)</font>
+(cl:truncate -3.5) =&gt; -3 <font color="#008844">; *rslt* =&gt; (-3 -0.5)</font>
+</pre>
+
+<p>Force an integer division:</p>
+
+<pre class="example">
+(cl:truncate 3.1 2.6) =&gt; 1 <font color="#008844">; *rslt* =&gt; (1 0.5)</font>
+(/ 3 2) =&gt; 1
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/values-list.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/values-list.htm
new file mode 100644
index 0000000..52fa6e6
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/values-list.htm
@@ -0,0 +1,113 @@
+<html><head>
+
+<title>cl:values-list</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:values-list</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>values-list</b></nobr> function returns the elements of a
+list unevaluated as multiple values:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>values-list</b> <i>list</i>)</dt>
+<dd><i>list</i> - a list of values<br>
+returns - the elements of the list as multiple values</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:values-list</font> (list)
+ (or (listp list) (error <font color="#880000">"not a list"</font> list))
+ (or (null list) (consp (last list)) (error <font color="#880000">"not a proper list"</font> list))
+ (setq <font color="#AA5500">*rslt*</font> list
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ (first list))
+</pre>
+
+<p>The unevaluated first value from the list is returned as the primary
+return value, and the list is assigned to the Nyquist
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable. <nobr>If
+an</nobr> an empty list is given, <a href="../../reference/nil.htm">NIL</a>
+is returned and the <a href="../../reference/global-rslt.htm">*rslt*</a>
+variable is set <nobr>to <a href="../../reference/nil.htm">NIL</a></nobr>.
+<nobr>An error</nobr> is signalled if the 'list' argument is not a list or
+if the list does not end
+<nobr>with <a href="../../reference/nil.htm">NIL</a></nobr>.</p>
+
+<p><nobr>The
+<a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+variable is set <nobr>to
+<a href="../../reference/t.htm">&nbsp;T&nbsp;</a></nobr> to indicate that
+multiple values are returned.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(cl:values-list nil) =&gt; NIL <font color="#008844">; *rslt* = NIL</font>
+(cl:values-list '(1)) =&gt; 1 <font color="#008844">; *rslt* = (1)</font>
+(cl:values-list '(1 2)) =&gt; 1 <font color="#008844">; *rslt* = (1 2)</font>
+(cl:values-list '(1 2 3)) =&gt; 1 <font color="#008844">; *rslt* = (1 2 3)</font>
+(cl:values-list '(1 2 . 3)) =&gt; <font color="#AA0000">error: not a proper list - (1 2 . 3)</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/common-lisp/values.htm b/docsrc/xlisp/xlisp-doc/examples/common-lisp/values.htm
new file mode 100644
index 0000000..92a828e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/common-lisp/values.htm
@@ -0,0 +1,160 @@
+<html><head>
+
+<title>cl:values</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cl:values</h1>
+
+<hr>
+
+<p>The <nobr>cl:<b>values</b></nobr> function evaluates all given Lisp
+expressions and returns the results as multiple values:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>values</b> [<i>expr1</i> ...])</dt>
+<dd><i>exprN</i> - an arbitrary Lisp expression<br>
+returns - the results of evaluating the expressions, as multiple values</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:values</font> (&amp;rest exprs)
+ (setq <font color="#AA5500">*rslt*</font> exprs
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ (first exprs))
+</pre>
+
+<p>The primary return value <nobr>[the result</nobr> from evaluating the
+first expression] is returned by the <nobr>cl:<b>values</b></nobr> function
+and a list with the results of evaluating all expressions is assigned to the
+Nyquist <a href="../../reference/global-rslt.htm">*rslt*</a> variable.
+<nobr>If no</nobr> expressions are given,
+<a href="..././reference/nil.htm">NIL</a> is returned and the
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable is set
+<nobr>to <a href="../../reference/nil.htm">NIL</a></nobr>.</p>
+
+<p><nobr>The
+<a href="global-multiple-values.htm">cl:*multiple-values*</a></nobr>
+variable is set
+<nobr>to <a href="../../reference/t.htm">&nbsp;T&nbsp;</a></nobr>
+to indicate that multiple values are returned.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(cl:values 1 2 3) =&gt; 1 <font color="#008844">; primary value</font>
+*rslt* =&gt; (1 2 3) <font color="#008844">; all values</font>
+
+(cl:values 'a 'b) =&gt; A <font color="#008844">; primary value</font>
+*rslt* =&gt; (A B) <font color="#008844">; all values</font>
+
+&gt; (cl:multiple-value-bind (a b c)
+ (cl:values 1 2 3)
+ (list a b c))
+(1 2 3)
+</pre>
+
+<p>See
+<nobr><a href="multiple-value-bind.htm">cl:multiple-value-bind</a></nobr>,
+<a href="../../reference/list.htm">list</a>,
+<a href="../../reference/global-rslt.htm">*rslt*</a>.</p>
+
+<p><div class="box">
+
+<p><b>Known Limitations</b></p>
+
+<p><b>1.</b> In Nyquist/XLISP, <nobr>cl:<b>values</b></nobr> cannot be
+used as argument to <a href="../../reference/setf.htm">setf</a>. <nobr>But
+this</nobr> is not a real problem, because the values are stored as a
+simple list in the <a href="../../reference/global-rslt.htm">*rslt*</a>
+variable, where they can be manipulated with any arbitrary Lisp
+functions, not only <nobr>with
+<a href="../../reference/setf.htm">setf</a></nobr>.</p>
+
+<p><b>2.</b> In <nobr>Common Lisp</nobr> there exists the option to return
+<nobr>'no value</nobr>' by calling the 'values' function with no arguments.
+<nobr>In Nyquist/XLISP</nobr> there is no <nobr>built-in</nobr> way to
+return '<nobr>no value</nobr>' from a function. <nobr>The symbol</nobr>
+<a href="../../reference/global-unbound.htm">*unbound*</a> cannot be used for
+this because in <nobr>Common Lisp</nobr>, if '<nobr>no value</nobr>' is
+assigned to a symbol as variable value, the new value will be
+<a href="../../reference/nil.htm">NIL</a> and not
+<a href="../../reference/global-unbound.htm">*unbound*</a>.</p>
+
+<p>In Nyquist/XLISP, the cl:<b>values</b> function, if called with no
+arguments, always returns <a href="../../reference/nil.htm">NIL</a>, and the
+<a href="../../reference/global-rslt.htm">*rslt*</a> variable will be
+set <nobr>to <a href="../../reference/nil.htm">NIL</a>, too:</nobr></p>
+
+<pre class="example">
+(cl:values) =&gt; NIL <font color="#008844">; primary value</font>
+*rslt* =&gt; NIL <font color="#008844">; all values</font>
+
+(cl:values nil) =&gt; NIL <font color="#008844">; primary value</font>
+*rslt* =&gt; (NIL) <font color="#008844">; all values</font>
+</pre>
+
+<p>Maybe this observation helps to write a '<nobr>no values</nobr>' test if
+anybody really <nobr>needs it</nobr>.</p>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/environment.htm b/docsrc/xlisp/xlisp-doc/examples/environment.htm
new file mode 100644
index 0000000..13a362d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/environment.htm
@@ -0,0 +1,1001 @@
+<html><head>
+
+<title>Environment</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Environment</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#unbound">*unbound*</a></nobr></li>
+<li><nobr><a href="#lexical-environment">Lexical Environment</a></nobr></li>
+<ul>
+<li><nobr><a href="#getenv">getenv</a> - [Macro]</nobr></li>
+<li><nobr><a href="#eval-env">eval-env</a> - [Macro]</nobr></li>
+</ul>
+<li><nobr><a href="#lboundp">lboundp</a> - [Macro] - has this symbol a lexical variable value bound to it?</nobr></li>
+<ul>
+<li><nobr><a href="#valuep">valuep</a> - [Macro] - has this symbol a valid variable value bound to it?</nobr></li>
+</ul>
+<li><nobr><a href="#lfboundp">lfboundp</a> - [Macro] - has this symbol a lexical function value bound to it?</nobr></li>
+<li><nobr><a href="#lsymbol-value">lsymbol-value</a> - [Macro] - get the lexical variable value</nobr></li>
+<li><nobr><a href="#lsymbol-function">lsymbol-function</a> - [Macro] - get the lexical <a href="../reference/flet.htm">flet</a>, <a href="../reference/labels.htm">labels</a>, or <a href="../reference/macrolet.htm">macrolet</a> function value</nobr></li>
+<li><nobr><a href="#lmacroexpand-1">lmacroexpand-1</a> - [Macro] - expand the first level of a a <a href="../reference/macrolet.htm">macrolet</a> form</nobr></li>
+<li><nobr><a href="#known-problems">Known Problems</a></nobr></li>
+</ol>
+
+<a name="unbound"></a>
+
+<hr>
+
+<h2>*unbound*</h2>
+
+<hr>
+
+<p>A tricky problem with XLISP is that the symbol
+<a href="../reference/global-unbound.htm">*unbound*</a> can be bound as a
+value to any Lisp symbol, also to a lexical parameter variable if passed
+as a value to a Lisp function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">test</font> (x)
+ (print x))
+
+(test '*unbound*) =&gt; <font color="#880000">error: unbound variable</font>
+</pre>
+
+<p>The problem here is that the symbol
+<a href="../reference/global-unbound.htm">*unbound*</a> has been bound to
+the parameter variable 'x'</nobr>, so the expression <nobr>(print x)</nobr>
+instead of printing &quot;*UNBOUND*&quot; now causes an 'unbound variable'
+error. How can</nobr> I test from inside of a function if the lexical
+parameter variable 'x' is bound to the symbol
+<a href="../reference/global-unbound.htm">*unbound*</a>? Unfortunately there
+is no standard Lisp way to solve this problem.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="obarray"></a>
+
+<hr>
+
+<h2>*obarray*</h2>
+
+<hr>
+
+<p>A symbol in the *obarray* is protected from garbage collection.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lexical-environment"></a>
+
+<hr>
+
+<h2>Lexical Environment</h2>
+
+<hr>
+
+<p>Lisp parameter variables together with local variables bound with
+<a href="../reference/let.htm">let</a> and
+<a href="../reference/let-star.htm">let*</a> and functions defined by
+<a href="../reference/flet.htm">flet</a> and
+<a href="../reference/labels.htm">labels</a> are not interned in the
+<a href="../reference/global-obarray.htm">*obarray*</a>, instead they are
+stored in the local lexical environment, maintained via an internal
+association list. <nobr>The key</nobr> for reading this list is the
+<a href="../reference/global-evalhook.htm">*evalhook*</a> variable and the
+<a href="../reference/evalhook.htm">evalhook</a> function.</p>
+
+<p>Here are two Nyquist macros from 'evalenv.lsp':</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">getenv</font> () <font color="#008844">; return the current environment</font>
+ '(progv '(*evalhook*) (list #'(lambda (exp env) env))
+ (eval nil)))
+
+(defmacro <font color="#0000CC">eval-env</font> (arg) <font color="#008844">; evaluate in the current environment</font>
+ `(evalhook ,arg nil nil (getenv)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="getenv"></a>
+
+<hr>
+
+<h2>getenv</h2>
+
+<hr>
+
+<p>The 'getenv' macro returns the association list of the current lexical
+environment:</p>
+
+<pre class="example">
+(let ((<font color="#AA5500">v1</font> 1) <font color="#008844">; first variable</font>
+ (<font color="#AA5500">v2</font> 2)) <font color="#008844">; second variable</font>
+ (flet ((<font color="#0000CC">f1</font> (a) a) <font color="#008844">; first function</font>
+ (<font color="#0000CC">f2</font> (b) b)) <font color="#008844">; second function</font>
+ (getenv)))
+
+=&gt; ((((<font color="#AA5500">V2</font> . <font color="#444444">1</font>) (<font color="#AA5500">V1</font> . <font color="#444444">2</font>))) ((<font color="#0000CC">F2</font> . <font color="#444444">#&lt;Closure...&gt;</font>) (<font color="#0000CC">F1</font> . <font color="#444444">#&lt;Closure...&gt;</font>)))
+</pre>
+
+<p>The asymmetric layout is produced by
+<a href="../reference/print.htm">print</a>, the real structure of the
+lexical environment is a <a href="../reference/cons.htm">cons</a> of two
+association lists:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">print-env</font> ()
+ (let ((env (gensym)))
+ `(let ((,env (getenv)))
+ (format t <font color="#880000">"(~s . ~s)~%"</font> (car ,env) (cdr ,env)))))
+</pre>
+
+<p><b>Note:</b> You could also use
+<a href="lists.htm#print-cons">print-cons</a> instead of
+<a href="../reference/format.htm">format</a> to print really all the
+details of the list, but <a href="../reference/format.htm">format</a> is
+enough for the examples here.</p>
+
+<pre class="example">
+(let ((<font color="#AA5500">v1</font> 1) <font color="#008844">; first variable</font>
+ (<font color="#AA5500">v2</font> 2)) <font color="#008844">; second variable</font>
+ (flet ((<font color="#0000CC">f1</font> (a) a) <font color="#008844">; first function</font>
+ (<font color="#0000CC">f2</font> (b) b)) <font color="#008844">; second function</font>
+ (print-env)))
+
+((((<font color="#AA5500">V2</font> . <font color="#444444">2</font>) (<font color="#AA5500">V1</font> . <font color="#444444">1</font>))) . (((<font color="#0000CC">F2</font> . <font color="#444444">#&lt;Closure...&gt;</font>) (<font color="#0000CC">F1</font> . <font color="#444444">#&lt;Closure...&gt;</font>))))
+</pre>
+
+<p>The basic <nobr>layout is</nobr>:</p>
+
+<pre class="example">
+((((<font color="#AA5500">V2</font> . value) (<font color="#AA5500">V1</font> . value))) . (((<font color="#0000CC">F2</font> . value) (<font color="#0000CC">F1</font> . value))))
+
+<font color="#444444">((&lt;----- <font color="#AA5500">variable-list</font> -----&gt;) . (&lt;----- <font color="#0000CC">function-list</font> -----&gt;))</font>
+
+(car (getenv)) =&gt; (<font color="#AA5500">variable-list</font>)
+(cdr (getenv)) =&gt; (<font color="#0000CC">function-list</font>)
+</pre>
+
+<p>The different levels of bindings are maintained via multiple
+sublists:</p>
+
+<pre class="example">
+(let ((<font color="#AA5500">v1</font> 1)) <font color="#008844">; first level variable</font>
+ (let ((<font color="#AA5500">v2</font> 2)) <font color="#008844">; second level variable</font>
+ (flet ((<font color="#0000CC">f1</font> (a) a)) <font color="#008844">; first level function</font>
+ (flet ((<font color="#0000CC">f2</font> (b) b)) <font color="#008844">; second level function</font>
+ (print-env)))))
+
+((((<font color="#AA5500">V2</font> . value)) ((<font color="#AA5500">V1</font> . value))) . (((<font color="#0000CC">F2</font> . value)) ((<font color="#0000CC">F1</font> . value))))
+
+<font color="#444444">(((&lt;--<font color="#AA5500">level2</font>--&gt;) (&lt;--<font color="#AA5500">level1</font>--&gt;)) . ((&lt;--<font color="#0000CC">level2</font>--&gt;) (&lt;--<font color="#0000CC">level1</font>--&gt;)))</font>
+<font color="#444444">((&lt;------ <font color="#AA5500">variable-list</font> ------&gt;) . (&lt;------ <font color="#0000CC">function-list</font> ------&gt;))</font>
+</pre>
+
+<p>Variables appear always in the variable list, functions always in the
+function list:</p>
+
+<pre class="example">
+(let ((<font color="#AA5500">v1</font> 1)) <font color="#008844">; first level variable</font>
+ (flet ((<font color="#0000CC">f1</font> (a) a)) <font color="#008844">; first level function</font>
+ (let ((<font color="#AA5500">v2</font> 2)) <font color="#008844">; second level variable</font>
+ (flet ((<font color="#0000CC">f2</font> (b) b)) <font color="#008844">; second level function</font>
+ (print-env)))))
+
+((((<font color="#AA5500">V2</font> . value)) ((<font color="#AA5500">V1</font> . value))) . (((<font color="#0000CC">F2</font> . value)) ((<font color="#0000CC">F1</font> . value))))
+
+<font color="#444444">(((&lt;--<font color="#AA5500">level2</font>--&gt;) (&lt;--<font color="#AA5500">level1</font>--&gt;)) . ((&lt;--<font color="#0000CC">level2</font>--&gt;) (&lt;--<font color="#0000CC">level1</font>--&gt;)))</font>
+<font color="#444444">((&lt;------ <font color="#AA5500">variable-list</font> ------&gt;) . (&lt;------ <font color="#0000CC">function-list</font> ------&gt;))</font>
+</pre>
+
+<p>The <nobr>inner-most</nobr> bindings always appear at the front of the
+lists:</p>
+
+<pre class="example">
+(let ((<font color="#AA5500">v1</font> 1)) <font color="#008844">; first level variable</font>
+ (let ((<font color="#AA5500">v2</font> 2)) <font color="#008844">; second level variable</font>
+ (flet ((<font color="#0000CC">f1</font> (a) a)) <font color="#008844">; first level function</font>
+ (flet ((<font color="#0000CC">f2</font> (b) b)) <font color="#008844">; second level function</font>
+ (let ((<font color="#AA5500">v3</font> 3)) <font color="#008844">; third level variable</font>
+ (print-env))))))
+
+((((<font color="#AA5500">V3</font> . value)) ((<font color="#AA5500">V2</font> . value)) ((<font color="#AA5500">V1</font> . value))) . (((<font color="#0000CC">F2</font> . value)) ((<font color="#0000CC">F1</font> . value))))
+
+<font color="#444444">(((&lt;--<font color="#AA5500">level3</font>--&gt;) (&lt;--<font color="#AA5500">level2</font>--&gt;) (&lt;--<font color="#AA5500">level1</font>--&gt;)) . ((&lt;--<font color="#0000CC">level2</font>--&gt;) (&lt;--<font color="#0000CC">level1</font>--&gt;)))</font>
+<font color="#444444">((&lt;------------- <font color="#AA5500">variable-list</font> --------------&gt;) . (&lt;------ <font color="#0000CC">function-list</font> ------&gt;))</font>
+</pre>
+
+<p>There may appear several variable bindings in the same sublist:</p>
+
+<pre class="example">
+(let ((<font color="#AA5500">v1</font> 1) (<font color="#AA5500">v2</font> 2)) <font color="#008844">; first level variables</font>
+ (flet ((<font color="#0000CC">f1</font> (a) a) <font color="#008844">; first level functions</font>
+ (<font color="#0000CC">f2</font> (b) b))
+ (let ((<font color="#AA5500">v3</font> 3)) <font color="#008844">; second level variable</font>
+ (print-env))))
+
+((((V3 . value)) ((V2 . value) (V1 . value))) . (((F2 . value) (F1 . value))))
+
+<font color="#444444">(((&lt;--<font color="#AA5500">level2</font>--&gt;) (&lt;--------<font color="#AA5500">level1</font>---------&gt;)) . ((&lt;---------<font color="#0000CC">level1</font>--------&gt;)))</font>
+<font color="#444444">((&lt;------------ <font color="#AA5500">variable-list</font> -------------&gt;) . (&lt;----- <font color="#0000CC">function-list</font> -----&gt;))</font>
+</pre>
+
+<p>The basic principle is always the same:</p>
+
+<pre class="example">
+(((<font color="#AA5500">level n</font> <font color="#008844">...</font>) <font color="#008844">...</font> (<font color="#AA5500">level 1 variables</font>)) . ((<font color="#0000CC">level n</font> <font color="#008844">...</font>) <font color="#008844">...</font> (<font color="#0000CC">level 1 functions</font>)))
+
+(car (getenv)) =&gt; ((<font color="#AA5500">level n</font> <font color="#008844">...</font>) (<font color="#AA5500">level n-1</font> <font color="#008844">...</font>) <font color="#008844">...</font> (<font color="#AA5500">level 1 variables</font>))
+(cdr (getenv)) =&gt; ((<font color="#0000CC">level n</font> <font color="#008844">...</font>) (<font color="#0000CC">level n-1</font> <font color="#008844">...</font>) <font color="#008844">...</font> (<font color="#0000CC">level 1 functions</font>))
+</pre>
+
+<p>Also the function parameter variables appear in the the lexical
+environment association list:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">test</font> (<font color="#AA0000">parameter-var</font>)
+ (let ((<font color="#AA5500">local-var</font> 'value))
+ (print-env)))
+
+((((<font color="#AA5500">LOCAL-VAR</font> . value)) ((<font color="#AA0000">PARAMETER-VAR</font> . value))) . NIL) <font color="#008844">; NIL = no functions</font>
+
+<font color="#444444">(((&lt;-----<font color="#AA5500">level2</font>------&gt;) (&lt;-------<font color="#AA5500">level1</font>--------&gt;)) . NIL)</font>
+<font color="#444444">((&lt;--------------- <font color="#AA5500">variable-list</font> ---------------&gt;) . NIL)</font>
+</pre>
+
+<p>The variables bound by <a href="../reference/let.htm">let</a> appear
+before the function's parameter variables, that's why
+<a href="../reference/let.htm">let</a> bindings 'shadow' parameter variables
+with the same name. <nobr>The 'test'</nobr> function name does not appear in
+the environment list because the function name was
+<a href="../reference/intern.htm">intern</a>ed in the
+<a href="../reference/global-obarray.htm">*obarray*</a> by
+<a href="../reference/defun.htm">defun</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="eval-env"></a>
+
+<hr>
+
+<h2>eval-env</h2>
+
+<hr>
+
+<p>This still doen't work:</p>
+
+<pre class="example">
+(setq x 'global) ; define a global variable 'x'
+
+(defun print-x () ; define a function PRINT-X in the global environment
+ (print (getenv)) ; always prints ((NIL)), also with EVAL-ENV or EVALHOOK
+ (print x)) ; always prints GLOBAL, also with EVAL-ENV or EVALHOOK
+
+(let ((x 'local)) ; create a lexical variable 'x'
+ (print-x)) ; evaluate PRINT-X
+=&gt; GLOBAL ; value from the environment, where PRINT-X was defined
+
+(let ((x 'local)) ; create a lexical variable 'x'
+ (eval-env (print-x)) ; evaluate PRINT-X in the current environment
+=&gt; GLOBAL ;wrong ; value from the environment, where PRINT-X was called
+
+(let ((x 'local)) ; create a lexical variable 'x'
+ (eval-env (funcall 'print-x)) ; evaluate PRINT-X in the current environment
+=&gt; GLOBAL ;wrong ; value from the environment, where PRINT-X was called
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lboundp"></a>
+
+<hr>
+
+<h2>lboundp</h2>
+
+<hr>
+
+<p>The 'lboundp' function tests if a valid variable value is bound to a
+symbol in the current lexical environment:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>lboundp</b> <i>symbol</i>)</dt>
+<dd><i>symbol</i> - a quoted lisp symbol<br>
+returns - <a href="../reference/t.htm">&nbsp;T&nbsp;</a> if a lexical
+variable value is bound to the symbol, <a href="../reference/nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">lboundp</font> (symbol)
+ (cond ((not (or (symbolp symbol)
+ (and (consp symbol)
+ (eq 'quote (car symbol))
+ (symbolp (cadr symbol)))))
+ (error <font color="#880000">"bad argument type"</font> symbol))
+ ((and (consp symbol) (cddr symbol))
+ (error <font color="#880000">"too many arguments"</font>))
+ (t (let ((a-cons (gensym)) (level (gensym)) (binding (gensym)))
+ `(let ((,a-cons (dolist (,level (car (getenv)) nil)
+ (let ((,binding (assoc ,symbol ,level)))
+ (when ,binding (return ,binding))))))
+ (and ,a-cons (not (eq (cdr ,a-cons) '<font color="#AA5500">*unbound*</font>))))))))
+</pre>
+
+<p>The XLISP <a href="../reference/boundp.htm">boundp</a> function only
+can test global variables, interned in the
+<a href="../reference/global-obarray.htm">*obarray*</a>, so it cannot be
+used to test if a symbol has a variable value bound to it in the lexical
+environment:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">test</font> (x) <font color="#008844">; bad example</font>
+ (if (boundp 'x) <font color="#AA0000">; &lt;- global test</font>
+ (print x)
+ (print '*unbound*)))
+
+(test 'hello!) =&gt; *UNBOUND* <font color="#AA0000">; bad result</font>
+(test 123) =&gt; *UNBOUND* <font color="#AA0000">; bad result</font>
+
+(setq x t) =&gt; T <font color="#008844">; create a global variable 'x'</font>
+
+(test 'hello!) =&gt; 'HELLO! <font color="#008844">; OK</font>
+(test 123) =&gt; 123 <font color="#008844">; OK</font>
+(test '*unbound*) =&gt; <font color="#AA0000">error: unbound variable - X ; bad result</font>
+</pre>
+
+<p>Here the same example with 'lboundp':</p>
+
+<pre class="example">
+(defun <font color="#0000CC">test</font> (x) <font color="#008844">; good example</font>
+ (if (lboundp 'x) <font color="#008844">; &lt;- local test</font>
+ (print x)
+ (print '*unbound*)))
+
+(test 'hello!) =&gt; 'HELLO! <font color="#008844">; OK</font>
+(test 123) =&gt; 123 <font color="#008844">; OK</font>
+(test '*unbound*) =&gt; *UNBOUND* <font color="#008844">; OK</font>
+</pre>
+
+<p>The 'lboundp' function cannot test symbol values at the
+<nobr>top-level</nobr>, because there is no lexical environment:</p>
+
+<pre class="example">
+(setq x t) =&gt; T <font color="#008844">; create a global variable 'x'</font>
+(lboundp 'x) =&gt; NIL <font color="#AA0000">; lexical test fails</font>
+(boundp 'x) =&gt; T <font color="#008844">; global test succeeds</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="valuep"></a>
+
+<hr>
+
+<h2>valuep</h2>
+
+<hr>
+
+<p>The 'valuep' function tests if a valid variable value is bound to a
+symbol at any level:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">valuep</font> (symbol)
+ (cond ((not (or (symbolp symbol)
+ (and (consp symbol)
+ (eq 'quote (car symbol))
+ (symbolp (cadr symbol)))))
+ (error <font color="#880000">"bad argument type"</font> ,symbol))
+ ((and (consp symbol) (cddr symbol))
+ (error <font color="#880000">"too many arguments"</font>))
+ (t (let ((a-cons (gensym)) (level (gensym)) (binding (gensym)))
+ `(let ((,a-cons (dolist (,level (car (getenv)) nil)
+ (let ((,binding (assoc ,symbol ,level)))
+ (when ,binding (return ,binding))))))
+ (if ,a-cons
+ (not (eq (cdr ,a-cons) '<font color="#AA5500">*unbound*</font>))
+ (boundp ,symbol)))))))
+</pre>
+
+<p>It's tricky to test if a symbol has a valid variable value bound to
+it because if the symbol is bound to
+<a href="../reference/global-unbound.htm">*unbound*</a> in a lexical
+environment, it still shadows a symbol with the same name in the
+<a href="../reference/global-obarray.htm">*obarray*</a>, making a possibly
+existing global variable inaccessible, like shown in the examples
+below.</p>
+
+<p><b>Note:</b> The lexical environment must be tested first, because this
+is the way how XLISP searches for symbol bindings.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(when (valuep 'x) x) =&gt; NIL <font color="#008844">; no global binding of 'x' found</font>
+(setq x 'ok) =&gt; OK <font color="#008844">; create a global variable 'x'</font>
+(when (valuep 'x) x) =&gt; OK <font color="#008844">; global binding of 'x' found</font>
+
+(let ((x 'local)) <font color="#008844">; create a lexical variable 'x'</font>
+ (when (valuep 'x) x)) <font color="#008844">; try to access the lexical variable</font>
+=&gt; LOCAL <font color="#008844">; lexical binding of 'x' found</font>
+</pre>
+
+<p>XLISP problems with
+<a href="../reference/global-unbound.htm">*unbound*</a>
+lexical variables:</p>
+
+<pre class="example">
+(setq x 'ok) =&gt; OK <font color="#008844">; create a global variable 'x'</font>
+(when (valuep 'x) x) =&gt; OK <font color="#008844">; global binding of 'x' found</font>
+
+(let ((x '*unbound*)) <font color="#008844">; create an unbound lexical variable 'x'</font>
+ (when (valuep 'x) x)) <font color="#008844">; try to access the global variable</font>
+=&gt; <font color="#AA0000">NIL ; global binding of 'x' NOT found</font>
+
+(let ((x '*unbound*)) <font color="#008844">; create an unbound lexical variable 'x'</font>
+ x) <font color="#008844">; try to access the global variable</font>
+<font color="#AA0000">error: unbound variable - X</font>
+</pre>
+
+<p>The 'valuep' function recognizes if a global variable value is shadowed
+by an <a href="../reference/global-unbound.htm">*unbound*</a> lexical
+variable and returns NIL if the global variable is inaccessible..</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lfboundp"></a>
+
+<hr>
+
+<h2>lfboundp</h2>
+
+<hr>
+
+<p>The 'lfboundp' function tests if a valid function value is bound to a
+symbol in the current lexical environment:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>lfboundp</b> <i>symbol</i>)</dt>
+<dd><i>symbol</i> - a quoted lisp symbol<br>
+returns - <a href="../reference/t.htm">&nbsp;T&nbsp;</a> if a lexical
+function value is bound to the symbol, <a href="../reference/nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">lfboundp</font> (symbol)
+ (cond ((not (or (symbolp symbol)
+ (and (consp symbol)
+ (eq 'quote (car symbol))
+ (symbolp (cadr symbol)))))
+ (error <font color="#880000">"bad argument type"</font> symbol))
+ ((and (consp symbol) (cddr symbol))
+ (error <font color="#880000">"too many arguments"</font>))
+ (t (let ((a-cons (gensym)) (level (gensym)) (binding (gensym)))
+ `(let ((,a-cons (dolist (,level (cdr (getenv)) nil)
+ (let ((,binding (assoc ,symbol ,level)))
+ (when ,binding (return ,binding))))))
+ (and ,a-cons (not (eq (cdr ,a-cons) '<font color="#AA5500">*unbound*</font>))))))))
+</pre>
+
+<p>The XLISP <a href="../reference/fboundp.htm">fboundp</a> function only
+works with symbols interned in the
+<a href="../reference/global-obarray.htm">*obarray*</a>, so it cannot be
+used to test if a symbol has a function value bound to it in the lexical
+environment:</p>
+
+<pre class="example">
+(flet ((my-function (x) 'hello))
+ (fboundp 'my-function)) <font color="#AA0000">; &lt;- global test</font>
+=&gt; NIL
+
+(flet ((my-function (x) 'hello))
+ (lfboundp 'my-function)) <font color="#008844">; &lt;- local test</font>
+=&gt; T
+</pre>
+
+<p>The 'lfboundp' function cannot test symbol function values at the
+<nobr>top-level</nobr>, because there is no lexical environment:</p>
+
+<pre class="example">
+(lfboundp 'car) =&gt; NIL <font color="#AA0000">; lexical test fails</font>
+(fboundp 'car) =&gt; T <font color="#008844">; global test succeeds</font>
+</pre>
+
+<p>Problems with <a href="../reference/global-unbound.htm">*unbound*</a>
+lexical functions are less likely then with
+<a href="../reference/global-unbound.htm">*unbound*</a> parameter
+variables, because there is no <nobr>buit-in</nobr> way to bind a lexical
+function to <a href="../reference/global-unbound.htm">*unbound*</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr><a href="predicates.htm#subrp">suprp</a> - is this a built-in function?</nobr></li>
+<li><nobr><a href="predicates.htm#fsubrp">fsubrp</a> - is this a built-in special form?</nobr></li>
+<li><nobr><a href="predicates.htm#closurep">closurep</a> - is this a user-defined function or macro?</nobr></li>
+<li><nobr><a href="predicates.htm#functionp">functionp</a> - is this a build-in or a user-defined function?</nobr></li>
+<li><nobr><a href="predicates.htm#macrop">macrop</a> - is this a user-defined macro?</nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lsymbol-value"></a>
+
+<hr>
+
+<h2>lsymbol-value</h2>
+
+<hr>
+
+<p>The function 'lsymbol-value' returns a variable value from the lexical
+environment:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">lsymbol-value</font> (symbol)
+ (cond ((not (or (symbolp symbol)
+ (and (consp symbol)
+ (eq 'quote (car symbol))
+ (symbolp (cadr symbol)))))
+ (error <font color="#880000">"bad argument type"</font> symbol))
+ ((and (consp ,symbol) (cddr symbol))
+ (error <font color="#880000">"too many arguments"</font>))
+ (t (let ((a-cons (gensym)) (level (gensym)) (binding (gensym)))
+ `(let ((,a-cons (dolist (,level (car (getenv)) nil)
+ (let ((,binding (assoc ,symbol ,level)))
+ (when ,binding (return ,binding))))))
+ (when ,a-cons
+ (if (eq (cdr ,a-cons) '<font color="#AA5500">*unbound*</font>)
+ '*unbound*
+ (cdr ,a-cons))))))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lsymbol-function"></a>
+
+<hr>
+
+<h2>lsymbol-function</h2>
+
+<hr>
+
+<p>The function 'lsymbol-function' returns a function value from the lexical
+environment:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">lsymbol-function</font> (symbol)
+ (cond ((not (or (symbolp symbol)
+ (and (consp symbol)
+ (eq 'quote (car symbol))
+ (symbolp (cadr symbol)))))
+ (error <font color="#880000">"bad argument type"</font> symbol))
+ ((and (consp symbol) (cddr symbol))
+ (error <font color="#880000">"too many arguments"</font>))
+ (t (let ((a-cons (gensym)) (level (gensym)) (binding (gensym)))
+ `(let ((,a-cons (dolist (,level (cdr (getenv)) nil)
+ (let ((,binding (assoc ,symbol ,level)))
+ (when ,binding (return ,binding))))))
+ (when ,a-cons
+ (if (eq (cdr ,a-cons) '<font color="#AA5500">*unbound*</font>)
+ '*unbound*
+ (cdr ,a-cons))))))))
+</pre>
+
+<p>The XLISP function
+<nobr><a href="../reference/symbol-function.htm">symbol-function</a></nobr>
+only works with symbols interned in the
+<a href="../reference/global-obarray.htm">*obarray*</a>, so it cannot return
+a function value, bound to a symbol in the lexical environment:</p>
+
+<pre class="example">
+(flet ((my-function (x) 'hello))
+ (symbol-function 'my-function)) <font color="#AA0000">; &lt;- searches the *obarray*</font>
+=&gt; <font color="#AA0000">error: unbound function - MY-FUNCTION</font>
+
+(flet ((my-function (x) 'hello))
+ (lsymbol-function 'my-function)) <font color="#008844">; &lt;- searches the lexical environment</font>
+=&gt; #&lt;Closure-MY-FUNCTION...&gt;
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lmacroexpand-1"></a>
+
+<hr>
+
+<h2>lmacroexpand-1</h2>
+
+<hr>
+
+<pre class="example">
+(defmacro <font color="#0000CC">with-static-env</font> (&rest body)
+ (let ((env (gensym)) (rval (gensym)))
+ `(let ((,env (getenv))) <font color="#008844">; environment snapshot</font>
+ (progv '(*evalhook*)
+ '((lambda (exp env)
+ (labels ((,rval (exp env) <font color="#008844">; recursive eval</font>
+ (format t "exp: ~a env: ~a ,env: ~a~%" exp env ,env)
+ (evalhook exp #',rval NIL ,env)))
+ (format t "exp: ~a env: ~a ,env: ~a~%" exp env ,env)
+ (evalhook exp #',rval NIL ,env))))
+ ,@body))))
+</pre>
+
+<pre class="example">
+(defmacro <font color="#0000CC">with-dynamic-env</font> (&rest body)
+ (let ((env (gensym)) (rval (gensym)))
+ `(let ((,env (getenv))) <font color="#008844">; environment snapshot</font>
+ (progv '(*evalhook*)
+ '((lambda (exp env)
+ (labels ((,rval (exp env) <font color="#008844">; recursive eval</font>
+ (format t "inner exp: ~a env: ~a~%" exp env)
+ (evalhook exp #',rval NIL env)))
+ (format t "outer exp: ~a env: ~a~%" exp env)
+ (evalhook exp #',rval NIL env))))
+ ,@body))))
+</pre>
+
+<pre class="example">
+(defun <font color="#0000CC">display-env</font> (env &amp;optional (exp nil exp-p))
+ (flet ((display-bindings (name bindings)
+ (format t <font color="#880000">" ~a bindings: ~s~%"</font> name bindings)
+ (let ((frame-counter 1))
+ (dolist (frame bindings)
+ (format t <font color="#880000">" ~a frame ~a: ~a~%"</font> name frame-counter frame)
+ (let ((binding-counter 1))
+ (dolist (binding frame)
+ (when (consp binding)
+ (format t <font color="#880000">" ~a ~a: ~s - value: ~s~%"</font>
+ name binding-counter (car binding) (cdr binding))
+ (incf binding-counter))))
+ (incf frame-counter)))))
+ (when exp-p (format t <font color="#880000">"eval: ~s~%"</font> exp))
+ (format t <font color="#880000">"environment: ~s~%"</font> env)
+ (display-bindings <font color="#880000">"variable"</font> (car env))
+ (display-bindings <font color="#880000">"function"</font> (cdr env))))
+
+(defmacro <font color="#0000CC">debug:env</font> ()
+ '(progv '(*evalhook*) '(nil)
+ (display-env (getenv))))
+
+(defmacro <font color="#0000CC">debug:env</font> ()
+ '(progv '(*evalhook*) '((lambda (exp env)
+ (display-env env)))
+ (eval nil)))
+
+(defmacro <font color="#0000CC">debug:env</font> (&rest body)
+ (when *evalhook*
+ (format t "DEBUG:ENV ")
+ (format t "*evalhook* was already modified~%"))
+ (if (null body)
+ '(progv '(<font color="#AA5500">*evalhook*</font>) '((lambda (exp env)
+ (display-env env)))
+ (eval nil))
+ (let ((init (gensym)) (rval (gensym)))
+ `(let ((,init (getenv))) <font color="#008844">; environment snapshot</font>
+ (progv '(<font color="#AA5500">*evalhook*</font>)
+ '((lambda (exp env)
+ (labels ((,rval (exp env) <font color="#008844">; recursive eval</font>
+ (display-env env exp)
+ (evalhook exp #',rval nil env)))
+ (display-env ,init exp)
+ (evalhook exp #',rval nil ,init))))
+ ,@body)))))
+
+(defmacro <font color="#0000CC">with-evalhook</font> (&amp;rest body)
+ (let ((init (gensym)) (rval (gensym)) (hook (gensym)) debug)
+ `(let ((,init (getenv))) <font color="#008844">; environment snapshot</font>
+ (progv '(<font color="#AA5500">*evalhook*</font>)
+ '((lambda (exp env)
+ (labels ((,rval (exp env) <font color="#008844">; recursive eval</font>
+ ,(print *evalhook*)
+ ,(when T `(funcall ,*evalhook* exp env))
+
+ (evalhook exp #',rval nil env)))
+ (evalhook exp #',rval nil ,init))))
+ ,@body))))
+
+(defmacro <font color="#0000CC">with-current-environment</font> (&amp;rest body)
+ (when <font color="#AA5500">*evalhook*</font> (error <font color="#880000">"*evalhook* already modified"</font>))
+ (let ((init (gensym)) (rval (gensym)) debug)
+ (when (eq :debug (car body)) (setq debug t body (cdr body)))
+ `(let ((,init (getenv))) <font color="#008844">; environment snapshot</font>
+ (progv '(<font color="#AA5500">*evalhook*</font>)
+ '((lambda (exp env)
+ (labels ((,rval (exp env) <font color="#008844">; recursive eval</font>
+ <font color="#008844">;; append environment from snapshot</font>
+ (setq env (cons (append (car env) (car ,init))
+ (append (cdr env) (cdr ,init))))
+ ,(when debug '(display-env env exp))
+ (evalhook exp #',rval nil env)))
+ <font color="#008844">;; start with environment snapshot</font>
+ ,(when debug `(display-env ,init exp))
+ (evalhook exp #',rval nil ,init))))
+ ,@body))))
+
+(defmacro <font color="#0000CC">with-env</font> (&amp;rest body)
+ (let ((init (gensym)) (rval (gensym)))
+ `(let ((,init (getenv))) <font color="#008844">; environment snapshot</font>
+ (progv '(*evalhook*)
+ '((lambda (exp env)
+ (labels ((,rval (exp env) <font color="#008844">; recursive eval</font>
+ (display-env env exp)
+ (evalhook exp #',rval nil env)))
+ (display-env ,init exp)
+ (evalhook exp #',rval nil ,init))))
+ ,@body))))
+</pre>
+
+<pre class="example">
+(with-current-environment
+ (debug:env
+ body))
+
+(progv '(*evalhook)
+ '((lambda (exp env)
+ (labels ((rval (exp env)
+ (append-current-environment)
+ (debug:env ...)
+ (evalhook exp #'rval nil env)))
+ (evalhook exp #'rval nil init)))))
+
+(debug:env
+ (with-current-environment
+ body))
+
+(progv '(*evalhook)
+ '((lambda (exp env)
+ (labels ((rval (exp env)
+</pre>
+
+<pre class="example">
+(defmacro <font color="#0000CC">with-current-environment</font> (&amp;rest body)
+ (when <font color="#AA5500">*evalhook*</font> (error <font color="#880000">"*evalhook* already modified"</font>))
+ (let ((debug nil) (init (gensym)) (rval (gensym)))
+ (when (eq :debug (car body)) (setq debug t body (cdr body)))
+ `(let ((,init (getenv))) <font color="#008844">; environment snapshot</font>
+ (progv '(<font color="#AA5500">*evalhook*</font>)
+ '((lambda (exp env)
+ (labels ((,rval (exp env) <font color="#008844">; recursive eval</font>
+ ,(cond (debug
+ `(setq env
+ (cons (append (car env) (car ,init))
+ (append (cdr env) (cdr ,init))))
+ '(display-env env exp)
+ `(evalhook exp #',rval nil env))
+ (t
+ `(evalhook exp #',rval nil
+ (cons (append (car env) (car ,init))
+ (append (cdr env) (cdr ,init))))))))
+ ,(when debug `(display-env ,init exp))
+ (evalhook exp #',rval nil ,init))))
+ ,@body))))
+</pre>
+
+<pre class="example">
+(setq *rvalhook* nil)
+
+(defmacro <font color="#0000CC">with-current-environment</font> (&amp;rest body)
+ (let ((init (gensym)))
+ `(let ((,init (getenv)))
+ (rval-env #'(lambda (exp env)
+ (cons exp (cons (append (car env) (car ,init))
+ (append (cdr env) (cdr ,init)))))
+ ,@body))))
+
+(defmacro debug:env (&amp;rest body)
+ (rval-env #'(lambda (exp env)
+ (display-env env exp)
+ (cons exp env))
+ ,@body))
+
+(defmacro <font color="#0000CC">run-rvalhooks</font> ()
+ (let ((func (gensym)) (result (gensym)))
+ `(dolist (,func <font color="#AA5500">*rvalhook*</font>)
+ (format t "func: ~a~%" ,func)
+ (format t "exp: ~a~%" exp)
+ (format t "env: ~a~%" env)
+ (let ((,result (eval (list ,func 'exp 'env) )))
+ (format t "result: ~a~%" ,result)
+ (format t "exp: ~a~%" exp)
+ (format t "car: ~a~%" (car ,result))
+ (format t "env: ~a~%" env)
+ (format t "cdr: ~a~%" (cdr ,result))
+ (setq exp (car ,result) env (cdr ,result))
+ ))))
+
+(defmacro <font color="#0000CC">rval-env</font> (function &amp;rest body)
+ (format t "function: ~a~%" function)
+ (format t "body: ~a~%" body)
+ (or <font color="#AA5500">*evalhook*</font> (setq <font color="#AA5500">*rvalhook*</font> nil))
+ (format t "*rvalhook*: ~a~%" *rvalhook*)
+ (if <font color="#AA5500">*rvalhook*</font>
+ `(prog2
+ (push ,function <font color="#AA5500">*rvalhook*</font>)
+ (progn ,@body)
+ (setq <font color="#AA5500">*rvalhook*</font> (remove ,function <font color="#AA5500">*rvalhook*</font>)))
+ (let ((rval (gensym)) (func (gensym)) (result (gensym)))
+ `(prog2
+ (push ,function <font color="#AA5500">*rvalhook*</font>)
+ (progv '(<font color="#AA5500">*evalhook*</font>)
+ `((lambda (exp env)
+ (print 'hallo)
+ (labels ((,rval (exp env)
+ (run-rvalhooks)
+ (evalhook exp #',rval nil env)))
+ ; (run-rvalhooks)
+ (evalhook exp #',rval nil env))))
+ ,@body)
+ (setq <font color="#AA5500">*rvalhook*</font> (remove ,function <font color="#AA5500">*rvalhook*</font>))))))
+</pre>
+
+<p>*rvalhook* must be a list of functions, each taking two arguments 'exp'
+[the Lisp expressions to evaluate] and 'env' [the environment], returning
+a cons of the format <nobr>(exp . env)</nobr>.</p>
+
+<p>In case of an error, the
+<a href="../reference/global-evalhook.htm">*evalhook*</a> variable is
+automatically reset by the XLISP
+<nobr><a href="../reference/top-level.htm">top-level</a></nobr> function.
+This means that if <a href="../reference/global-evalhook.htm">*evalhook*</a>
+is <a href="../reference/nil.htm">NIL</a> and *rvalhook* is
+<nobr>non-<a href="../reference/nil.htm">NIL</a></nobr>, then *rvalhook* is
+invalid and must also be reset to <a href="../reference/nil.htm">NIL</a>
+before pushing the next function <nobr>on it</nobr>.</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">lmacroexpand-1</font> (form)
+ (if (not (and (consp form)
+ (eq 'quote (car form))
+ (symbolp (caadr form))))
+ form <font color="#008844">; if the form isn't '(symbol ... )</font>
+ (let ((a-cons (gensym)) (l-expr (gensym)))
+ `(let ((,a-cons (assoc ',(caadr form) (cadr (getenv)))))
+ (if (null ,a-cons) <font color="#008844">; (caadr form) = macro-name</font>
+ ,form <font color="#008844">; if no lexical binding was found</font>
+ (let ((,l-expr (get-lambda-expression (cdr ,a-cons))))
+ (if (eq 'macro (car ,l-expr)) <font color="#008844">; if l-expr is a macro</font>
+ (with-current-environment
+ <font color="#008844">;; create an *unbound* macro in the *obarray*</font>
+ (eval (append '(defmacro *unbound*) (cdr ,l-expr)))
+ <font color="#008844">;; expand the macro in the current environment</font>
+ (eval (list 'macroexpand-1 <font color="#008844">; (cdadr form) =</font>
+ (list 'quote <font color="#008844">; macro-arguments as list</font>
+ (cons '*unbound* ',(cdadr form))))))
+ ,form))))))) <font color="#008844">; if l-expr is not a macro</font>
+</pre>
+
+<pre class="example">
+(let ((x 1))
+ (macrolet ((test (arg)
+ `(progn
+ (print ,arg)
+ (print ,(eval x)))))
+ (lmacroexpand-1 '(test 'hallo))))
+=&gt;
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="known-problems"></a>
+
+<hr>
+
+<h2>Known Problems</h2>
+
+<hr>
+
+<p>A lexical variable with the symbol
+<a href="../reference/global-unbound.htm">*unbound*</a> as a variable value
+bound to it will continue to shadow a global variable with the same name,
+even if the the lexical variable is 'unbound':</p>
+
+<pre class="example">
+(setq x t) =&gt; T <font color="#008844">; create a global variable 'x'</font>
+
+(let ((x '*unbound*)) <font color="#008844">; create an unbound lexical variable 'x'</font>
+ (print x)) <font color="#008844">; try to print the global variable</font>
+<font color="#AA0000">error: unbound variable - X</font>
+</pre>
+
+<p>Tested with <nobr>Nyquist 3.03</nobr> in <nobr>December 2010</nobr>.</p>
+
+<p><b>Nyquist Bug:</b> let* causes infinite recursion problems with either
+progv, evalhook, or *evalhook* [still needs more investigation], so this
+doesnt work:</p>
+
+<pre class="example">
+(let* ((init (getenv)))
+ (progv '(*evalhook*)
+ '((lambda (exp env)
+ (labels ((rval (exp env)
+ (print init) <font color="#AA0000">; &lt;- causes infinite recursion</font>
+ (evalhook exp #'rval nil env)))
+ (evalhook exp #'rval nil init))))
+ (eval nil)))
+=&gt; <font color="#AA0000">infinite recursion</font>
+</pre>
+
+while exactly the same form using let instead of let* works:
+
+<pre class="example">
+(let ((init (getenv)))
+ (progv '(*evalhook*)
+ '((lambda (exp env)
+ (labels ((rval (exp env)
+ (print init) <font color="#008844">; &lt;- no infinite recursion</font>
+ (evalhook exp #'rval nil env)))
+ (evalhook exp #'rval nil init))))
+ (eval nil)))
+(NIL) <font color="#008844">; PRINT output</font>
+=&gt; NIL
+</pre>
+
+<p>Bug tested with <nobr>Nyquist 3.03</nobr> in <nobr>December 2010</nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/evaluation.htm b/docsrc/xlisp/xlisp-doc/examples/evaluation.htm
new file mode 100644
index 0000000..fc46780
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/evaluation.htm
@@ -0,0 +1,131 @@
+<html><head>
+
+<title>Evaluation</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Evaluation</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#with-errset">with-errset</a> - evaluate expressions without entering the <nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr></nobr></li>
+<li><nobr><a href="#apply-star.htm">apply*</a> and <a href="#funcall-star.htm">funcall*</a> - work also with macros and special forms</nobr></li>
+</ol>
+
+<a name="with-errset"></a>
+
+<hr>
+
+<h2>with-errset</h2>
+
+<hr>
+
+<p>Evaluate an expression without entering the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>
+on <a href="../reference/error.htm">error</a>
+<nobr>or <a href="../reference/cerror.htm">cerror</a></nobr>:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">with-errset</font> (expr &amp;optional (print-flag nil))
+ `(progv '(<font color="#AA5500">*breakenable*</font>) '(nil)
+ (errset ,expr ,print-flag)))
+</pre>
+
+<p>See <a href="../reference/defmacro.htm">defmacro</a>,
+<a href="../reference/errset.htm">errset</a>,
+<a href="../reference/nil.htm">nil</a>,
+<a href="../reference/lambda-keyword-optional.htm.htm">&amp;optional</a>,
+<a href="../reference/progv.htm">progv</a>.</p>
+
+<p><b>Note:</b> <a href="../reference/errset.htm">errset</a> does not
+protect against the <a href="../reference/break.htm">break</a> function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="apply-star"></a><a name="funcall-star"></a>
+
+<hr>
+
+<h2>apply* and funcall*</h2>
+
+<hr>
+
+<p>In Lisp, macros and <nobr>special forms</nobr> are no functions. This
+means that <a href="../reference/apply.htm">apply</a> and
+<a href="../reference/funcall.htm">funcall</a> only work with functions of
+type SUBR <nobr>[built-in</nobr> function] or CLOSURE [functions defined by
+<a href="defun.htm">defun</a>, <a href="flet.htm">flet</a>,
+<a href="labels.htm">labels</a>, or <a href="lambda.htm">lambda</a>], but
+with macros and <nobr>special forms</nobr> a '<nobr>bad function</nobr>'
+error is signalled. Here are two examples how to work around this
+behaviour:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">apply*</font> (function args)
+ (eval (cons function args)))
+
+(defun <font color="#0000CC">funcall*</font> (function args)
+ (eval (cons function args)))
+</pre>
+
+<p><b>Warning:</b> These functions can produce unwanted
+<nobr>side-effects</nobr> because macros and <nobr>special forms</nobr> do
+not need to conform to functional evaluation rules. Use them on your own
+risk.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
+
diff --git a/docsrc/xlisp/xlisp-doc/examples/examples.htm b/docsrc/xlisp/xlisp-doc/examples/examples.htm
new file mode 100644
index 0000000..2140ebe
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/examples.htm
@@ -0,0 +1,211 @@
+<html><head><title>XLISP Examples</title></head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+Examples |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>XLISP Examples</h1>
+
+<hr>
+
+<p><b>Nyquist/XLISP</b></p>
+
+<ul>
+<li><nobr><a href="lists.htm">Lists</a></nobr></li>
+<ul>
+<li><nobr>print-cons - print lists as dotted conses</nobr></li>
+<li><nobr>dolist* - a <a href="../reference/dolist.htm">dolist</a> version that can iterate dotted lists</nobr></li>
+</ul>
+<li><nobr><a href="arrays.htm">Arrays</a></nobr></li>
+<ul>
+<li><nobr>make-array* - create multi-dimensional arrays</nobr></li>
+<li><nobr>aref* - access multi-dimensional arrays</nobr></li>
+</ul>
+<li><nobr><a href="circular-lists.htm">Circular Access</a></nobr></li>
+<ul>
+<li><nobr>c-nth - circular list accessor</nobr></li>
+<li><nobr>c-aref - circular array accessor</nobr></li>
+</ul>
+<li><nobr><a href="hash-tables.htm">Hash Tables</a></nobr></li>
+<ul>
+<li><nobr>make-hash-table - create a hash-table</nobr></li>
+<li><nobr>puthash - store a key/value pair in a hash-table</nobr></li>
+<li><nobr>gethash - get a value from a hash-table by using a key</nobr></li>
+<li><nobr>remhash - remove a key/value pair from a hash-table</nobr></li>
+<li><nobr>clrhash - remove all key/value pairs from a hash-table</nobr></li>
+<li><nobr>hash-table-p - is this a hash-table?</nobr></li>
+<li><nobr>hash-table-size - get the number of buckets</nobr></li>
+<li><nobr>hash-table count - get the number of key/value pairs</nobr></li>
+<li><nobr>hash-table-test - get the :test argument given to to make-hash-table</nobr></li>
+<li><nobr>print-hash-table - print a hash-table in human-readable form</nobr></li>
+</ul>
+<li><nobr><a href="strings.htm">Strings and Characters</a></nobr></li>
+<ul>
+<li><nobr>string* - make a string out of everything</nobr></li>
+<li><nobr><a href="posix-chars.htm">POSIX Character Classes</a></nobr></li>
+</ul>
+<li><nobr><a href="sequences.htm">Sequences</a> - lists, strings, and arrays</nobr></li>
+<li><nobr><a href="predicates.htm">Predicates and Comparison</a></nobr></li>
+<li><nobr><a href="files.htm">Files and Directories</a></nobr></li>
+<li><nobr><a href="math.htm">Numbers</a></nobr></li>
+<ul>
+<li><nobr>Non-decimal Number Formats</nobr></li>
+<ul>
+<li><nobr><a href="binary.htm">Binary Integer Numbers</a></nobr></li>
+<li><nobr><a href="octal.htm">Octal Integer Numbers</a></nobr></li>
+<li><nobr><a href="hexadecimal.htm">Hexadecimal Integer Numbers</a></nobr></li>
+</ul>
+<li><nobr>divide-float - divide numbers as floating-point numbers</nobr></li>
+<li><nobr><a href="xlisp/ceiling.htm">ceiling</a> - truncate a number toward positive infinity</nobr></li>
+<li><nobr><a href="xlisp/floor.htm">floor</a> - truncate a number toward negative infinity</nobr></li>
+<li><nobr><a href="xlisp/ash.htm">ash</a> - arithmetic bit-shift left or right</nobr></li>
+<li><nobr><a href="xlisp/bsh.htm">bsh</a> - binary bit-shift left or right</nobr></li>
+<li><nobr>csh - circular bit-shift left or right</nobr></li>
+</ul>
+<li><nobr><a href="reader.htm">Reader</a></nobr></li>
+<ul>
+<li><nobr>read-from-string</nobr></li>
+<li><nobr>*readtable*</nobr></li>
+<ul>
+<li><nobr>print-readtable - print the XLISP *readtable* in human-readable form</nobr></li>
+<li><nobr>get-macro-character</nobr></li>
+<li><nobr>set-macro-character</nobr></li>
+</ul>
+</ul>
+</ul>
+
+<ul>
+<li><nobr><a href="apropos.htm">Apropos</a></nobr></li>
+<li><nobr><a href="macros.htm">Macro Programming</a></nobr></li>
+<li><nobr><a href="evaluation.htm">Evaluation</a></nobr></li>
+<li><nobr><a href="environment.htm">Environment</a></nobr></li>
+<li><nobr><a href="../objects/advanced-objects.htm">Advanced XLISP Objects</a></nobr></li>
+</ul>
+
+<ul>
+<li><nobr><a href="reader.htm">XLISP Reader</a></nobr></li>
+</ul>
+
+<p><b>Common Lisp</b> - written in Nyquist/XLISP</p>
+
+<ul>
+<li><nobr><a href="common-lisp.htm">Where is the Nyquist Common Lisp Library?</a></nobr></li>
+</ul>
+
+<ul>
+<li><nobr>Data and Control Flow</nobr></li>
+<ul>
+<li><nobr>Comparison</nobr></li>
+<ul>
+<li><nobr><a href="../reference/eq.htm">eq</a></nobr> - [Function] - test if arguments are identical</li>
+<li><nobr><a href="../reference/eql.htm">eql</a> - [Function] - test if arguments are identical or same integer value</nobr></li>
+<li><nobr><a href="../reference/equal.htm">equal</a> - [Function] - test if arguments are structurally equivalent</nobr></li>
+<li><nobr><a href="common-lisp/equalp.htm">cl:equalp</a> - [Function] - test arguments with 'equality' functions</nobr></li>
+</ul>
+<li><nobr><a href="common-lisp/multiple-values.htm">Multiple Values</a></nobr></li>
+<ul>
+<li><nobr>XLISP helpers</nobr></li>
+<ul>
+<li><nobr><a href="common-lisp/global-multiple-values.htm">cl:*multiple-values*</a> - [Variable] - signals if a function has returned multiple values</nobr></li>
+<li><nobr><a href="common-lisp/debug-mv.htm">cl:debug:mv</a> - [Function] - debug multiple value expressions</nobr></li>
+</ul>
+<li><nobr>Returning Multiple Values</nobr></li>
+<ul>
+<li><nobr><a href="common-lisp/values.htm">cl:values</a> - [Function] - return results from evaluated arguments as multiple values</nobr></li>
+<li><nobr><a href="common-lisp/values-list.htm">cl:values-list</a> - [Function] - return multiple values from a list unevaluated</nobr></li>
+</ul>
+<li><nobr>Working with Multiple Values</nobr></li>
+<ul>
+<li><nobr><a href="common-lisp/multiple-value-list.htm">cl:multiple-value-list</a> - [Macro] - evaluate an expression and return all values in a list</nobr></li>
+<li><nobr><a href="common-lisp/multiple-value-bind.htm">cl:multiple-value-bind</a> - [Macro] - bind multiple values to multiple <a href="../reference/let.htm">let</a> variables</nobr></li>
+<li><nobr><a href="common-lisp/multiple-value-setq.htm">cl:multiple-value-setq</a> - [Macro] - assign multiple values to multiple variables using <a href="../reference/setq.htm">setq</a></nobr></li>
+<li><nobr><a href="common-lisp/multiple-value-prog1.htm">cl:multiple-value-prog1</a> - [Macro] - eveluate multiple expressions, return the values of the first expression</nobr></li>
+<li><nobr><a href="common-lisp/multiple-value-call.htm">cl:multiple-value-call</a> - [Macro] - apply a function to multiple values collected in a list</nobr></li>
+</ul>
+</ul>
+</ul>
+<li><nobr><a href="common-lisp/numbers.htm">Numbers</a></nobr></li>
+<ul>
+<li><nobr><a href="common-lisp/rounding-and-truncation.htm">Rounding and Truncation</a></nobr></li>
+<ul>
+<li><nobr><a href="common-lisp/round.htm">cl:round</a> - round towards the next integer</nobr></li>
+<li><nobr><a href="common-lisp/truncate.htm">cl:truncate</a> - truncate towards zero</nobr></li>
+<li><nobr><a href="common-lisp/ceiling.htm">cl:ceiling</a> - truncate towards positive infinity</nobr></li>
+<li><nobr><a href="common-lisp/floor.htm">cl:floor</a> - truncate towards negative infinity</nobr></li>
+</ul>
+<li><nobr><a href="common-lisp/remainder-and-modulus.htm">Remainder and Modulus</a></nobr></li>
+<ul>
+<li><nobr><a href="common-lisp/rem.htm">cl:rem</a></nobr></li>
+<li><nobr><a href="common-lisp/mod.htm">cl:mod</a></nobr></li>
+</ul>
+<li><nobr>Exponentiation, Logarithms, and Roots</nobr></li>
+<ul>
+<li><nobr><a href="common-lisp/exp.htm">cl:exp</a> - compute 'e' to the power of 'x'</nobr></li>
+<li><nobr><a href="common-lisp/expt.htm">cl:expt</a> - compute 'x' to the power of 'y'</nobr></li>
+<li><nobr><a href="common-lisp/log.htm">cl:log</a> - logarithms of arbitrary base</nobr></li>
+<li><nobr><a href="common-lisp/sqrt.htm">cl:sqrt</a> - sqare root or arbitrary numbers</nobr></li>
+</ul>
+</ul>
+<li><nobr>Conses</nobr></li>
+<ul>
+<li><nobr>List Membership</nobr></li>
+<ul>
+<li><nobr>cl:member - [Function] - test for membership in lists and sub-elements</nobr></li>
+<li><nobr>cl:member-if - [Function] - search for the first element matching a predicate</nobr></li>
+<li><nobr>cl:member-if-not - [Function] - search for the first element not matching a predicate</nobr></li>
+</ul>
+<li><nobr>Non-destructive Removal</nobr></li>
+<ul>
+<li><nobr>cl:remove</nobr></li>
+<li><nobr>cl:remove-if</nobr></li>
+<li><nobr>cl:remove-if-not</nobr></li>
+</ul>
+<li><nobr>Destructive Removal = Deletion</nobr></li>
+<ul>
+<li><nobr>cl:delete</nobr></li>
+<li><nobr>cl:delete-if</nobr></li>
+<li><nobr>cl:delete-if-not</nobr></li>
+</ul>
+<li><nobr>Lists as Sets</nobr></li>
+<ul>
+<li><nobr>cl:pushnew - [Macro] -</nobr></li>
+<li><nobr>cl:union - [Function]</nobr></li>
+<li><nobr>cl:intersection - [Function]</nobr></li>
+<li><nobr>cl:set-difference - [Function]</nobr></li>
+<li><nobr>cl:set-exclusive-or - [Function]</nobr></li>
+<li><nobr>cl:subsetp - [Function]</nobr></li>
+</ul>
+</ul>
+<li><nobr>Sequences</nobr></li>
+<ul>
+<li><nobr>Subsequences</nobr></li>
+<ul>
+<li><nobr>cl:subseq - subsequences of lists, strings, or arrays</nobr></li>
+</ul>
+<li><nobr>Properties of elements in sequences:</nobr></li>
+<ul>
+<li><nobr>cl:find</nobr></li>
+<li><nobr>cl:count</nobr></li>
+<li><nobr>cl:position</nobr></li>
+</ul>
+<li><nobr>Predicates for testing sequences:</nobr></li>
+<ul>
+<li><nobr>cl:every</nobr></li>
+<li><nobr>cl:some</nobr></li>
+<li><nobr>cl:notevery</nobr></li>
+<li><nobr>cl:notany</nobr></li>
+</ul>
+<li><nobr>Functions to modify sequences:</nobr></li>
+<ul>
+<li><nobr>cl:map</nobr></li>
+</ul>
+</ul>
+</ul>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/files.htm b/docsrc/xlisp/xlisp-doc/examples/files.htm
new file mode 100644
index 0000000..a43f4fe
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/files.htm
@@ -0,0 +1,459 @@
+<html><head>
+
+<title>Files and Directories</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Files and Directories</h1>
+
+<hr>
+
+<ul>
+<li><nobr>Interactive Functions</nobr></li>
+<ul>
+<li><nobr><a href="#pwd">pwd</a> - returns the current working directory</nobr></li>
+<li><nobr><a href="#cd">cd</a> - changes the current working directory</nobr></li>
+</ul>
+<li><nobr>Testing Files and Directories</nobr></li>
+<ul>
+<li><nobr><a href="#directory-exists-p">directory-exists-p</a> - tests if a directory exists</nobr></li>
+<li><nobr><a href="#file-exists-p">file-exists-p</a> - tests if a file exists</nobr></li>
+<li><nobr><a href="#filename-exists-p">filename-exists-p</a> - tests if a file or directory exists</nobr></li>
+</ul>
+<li><nobr>Testing Filenames</nobr></li>
+<ul>
+<li><nobr><a href="#absolute-filename-p">absolute-filename-p</a> - tests if a string is an absolute filename</nobr></li>
+</ul>
+<li><nobr>System Environment Variables</nobr></li>
+<ul>
+<li><nobr><a href="#windows-p">windows-p</a> - tests if the operation system is a Windows system</nobr></li>
+<li><nobr><a href="#user-home-directory">user-home-directory</a> - returns path to the user's HOME directory</nobr></li>
+<li><nobr><a href="#expand-tilde">expand-tilde</a> - replaces &quot;~/&quot; with the user's HOME directory</nobr></li>
+</ul>
+</ul>
+
+<a name="pwd"></a>
+
+<hr>
+
+<h2>pwd</h2>
+
+<hr>
+
+<p>The 'pwd' function returns the current working directory:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">pwd</font> ()
+ (setdir <font color="#880000">"."</font>))
+</pre>
+
+<p>Ok, this function does not belong to the masterpieces of computer
+science, but (pwd) is much easier to remember than <nobr>(setdir
+&quot;.&quot;)</nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cd"></a>
+
+<hr>
+
+<h2>cd</h2>
+
+<hr>
+
+<p>The 'cd' function changes the current working directory. <nobr>The
+directory</nobr> name must be given as a string:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">cd</font> (string)
+ (cond ((not (stringp string))
+ (error <font color="#880000">"argument must be a string"</font> string))
+ ((string= <font color="#880000">"."</font> string)
+ (setdir <font color="#880000">"."</font>))
+ (t
+ (let ((orig-dir (setdir <font color="#880000">"."</font>))
+ (new-dir (setdir string)))
+ (when (string/= orig-dir new-dir)
+ new-dir)))))
+</pre>
+
+<p>Possible actions and return values are:</p>
+
+<ul>
+
+<li><p>It the argument is not a string, then an error will be
+raised.</p></li>
+
+<li><p>If the directory name is &quot;.&quot;, then the name of the current
+working directory is returned as a string. This is the same effect as if the
+directory has been changed to itself.</p></li>
+
+<li><p>If the directory has successfully been changed to the given
+directory, then the name of the new working directory is returned as a
+string.</p></li>
+
+<li><p>If the given directory has not been found, then NIL <nobr>[=
+false]</nobr> is returned.</p></li>
+
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="directory-exists-p"></a>
+
+<hr>
+
+<h2>directory-exists-p</h2>
+
+<hr>
+
+<p>The '<nobr>directory-exists-p</nobr>' function tests if a directory
+exists. <nobr>The directory</nobr> name must be given as a string:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">directory-exists-p</font> (string)
+ (cond ((not (stringp string))
+ (error <font color="#880000">"argument must be a string"</font> string))
+ ((string= <font color="#880000">"."</font> string)
+ (setdir <font color="#880000">"."</font>))
+ (t
+ (let ((orig-dir (setdir <font color="#880000">"."</font>))
+ (new-dir (setdir string)))
+ (when (string/= orig-dir new-dir)
+ (setdir orig-dir)
+ new-dir)))))
+</pre>
+
+<p>Possible actions and return values are:</p>
+
+<ul>
+
+<li><p>It the argument is not a string, then an error will be
+raised.</p></li>
+
+<li><p>If the directory name is &quot;.&quot;, then the absolute name of the
+current working directory is returned as a string. <nobr>This is</nobr> not
+a very useful test, but makes the return values consistent.</p></li>
+
+<li><p>If the directory has been found, then the absolute name of the
+directory is returned as a string.</p></li>
+
+<li><p>If the directory has not been found, then NIL <nobr>[= false]</nobr>
+is returned.</p></li>
+
+</ul>
+
+<p>The '<nobr>directory-exists-p</nobr>' function is nearly the same as the
+<a href="#cd">cd</a> function above. <nobr>The only</nobr> difference is
+that the working directory will automatically be changed back to the initial
+directory.</p>
+
+<p>On Unix, with <nobr>soft-links</nobr>, the absolute name of the target
+directory <nobr>[i.e. not</nobr> the name of the <nobr>link-file</nobr>
+itself, but the name of the directory the link <nobr>points to]</nobr> is
+returned.</p>
+
+<p><div class="box">
+
+<p><b>Implementation Notes</b></p>
+
+<p>The Nyquist 'setdir' function always returns absolute directory names,
+even if a relative directory name has been given as a string by the user.
+That's why it's not possible to reliably compare the return value of
+<nobr>(setdir string)</nobr> directly with 'string'. Instead the absolute
+name of the initial working directory, returned by <nobr>(setdir
+&quot;.&quot;)</nobr>, is compared to the absolute name, returned when
+<nobr>(setdir string)</nobr> tries to change the directory. <nobr>If
+both</nobr> return values are the same, then <nobr>(setdir string)</nobr>
+has failed because the directory has not been found.</p>
+
+<p>If the directory string is &quot;.&quot;, then this trick doesn't work,
+because the initial directory is the same as the target directory, so even
+if the directory has 'successfully' been changed to itself, both return
+values still would be the same. This is one of the reasons why &quot;.&quot;
+has a separate 'cond' clause. The other reason is of course that it makes
+not really much sense to change a directory to itself, that's why we save
+the work and just return the absolute name of the current working
+directory.</p>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="file-exists-p"></a>
+
+<hr>
+
+<h2>file-exists-p</h2>
+
+<hr>
+
+<p>The '<nobr>file-exists-p</nobr>' function tests if a file exists.
+<nobr>The file</nobr> name must be given as a string:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">file-exists-p</font> (string)
+ (if (not (stringp string))
+ (error <font color="#880000">"argument must be a string"</font> string)
+ (unless (directory-exists-p string)
+ (let (file-stream)
+ (unwind-protect
+ (setq file-stream (open string))
+ (when file-stream (close file-stream)))
+ (when file-stream string)))))
+</pre>
+
+<p>On Unix systems a directory is a special kind of file, so on Unix the
+XLisp 'open' function can open directories, too. That's why we first must
+make sure that no directory exists with the same name as the file that we
+are looking for.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="filename-exists-p"></a>
+
+<hr>
+
+<h2>filename-exists-p</h2>
+
+<hr>
+
+<pre class="example">
+(defun <font color="#0000CC">filename-exists-p</font> (string)
+ (if (not (stringp string))
+ (error <font color="#880000">"argument must be a string"</font> string)
+ (or (directory-exists-p string)
+ (file-exists-p string)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="absolute-filename-p"></a>
+
+<hr>
+
+<h2>absolute-filename-p</h2>
+
+<hr>
+
+<p>The 'absolute-filename-p' function tests if a string is an absolute file
+or directory name:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">absolute-filename-p</font> (string)
+ (if (not (stringp string))
+ (error <font color="#880000">"argument must be a string"</font> string)
+ (let ((end (length string)))
+ (when (or (and (&gt;= end 1) <font color="#008844">; Unix "/..."</font>
+ (char= #\/ (char string 0)))
+ (and (&gt;= end 3) <font color="#008844">; Windows "[a-zA-Z]:[\/]..."</font>
+ (let ((char (char string 0)))
+ <font color="#008844">;; upper- or lowercase character a-z, A-Z</font>
+ (and (&gt; (char-code (char-downcase char)) 96)
+ (&lt; (char-code (char-downcase char)) 123)))
+ (char= #\: (char string 1))
+ (let ((char (char string 2)))
+ (or (char= #\\ char)
+ (char= #\/ char)))))
+ string))))
+</pre>
+
+
+<p>Note that it is only tested whether the beginning of the string
+matches the beginning of an absolute file or directory name. <nobr>It
+is</nobr> not tested whether the string reperesents a meaningful name.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="system-environment-variables"></a>
+
+<hr>
+
+<h2>System Environment Variables</h2>
+
+<a name="get-env"></a>
+
+<hr>
+
+<h2>get-env</h2>
+
+<hr>
+
+<p>[This function works only with <nobr>Audacity 1.3.13</nobr> and
+above.]</p>
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><nobr>(<b>get-env</b> &quot;<i>environment-variable</i>&quot;)</nobr></p></dt>
+
+
+
+
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="windows-p"></a>
+
+<hr>
+
+<h2>windows-p</h2>
+
+<hr>
+
+<p>[This function works only with <nobr>Audacity 1.3.13</nobr> and
+above.]</p>
+
+<p>The '<nobr>windows-p</nobr>' function tests if the underlying operation
+system is a Microsoft <nobr>Windows[tm]</nobr> system:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">windows-p</font> ()
+ (let* ((home (let ((drive (get-env <font color="#880000">"HOMEDRIVE"</font>))
+ (path (get-env <font color="#880000">"HOMEPATH"</font>)))
+ (if (and drive path)
+ (strcat drive path)
+ (get-env <font color="#880000">"UserProfile"</font>))))
+ (path (get-env <font color="#880000">"PATH"</font>)))
+ (when home <font color="#008844">; if HOMEDRIVE + HOMEPATH or UserProfile exist</font>
+ (if path <font color="#008844">; search for Windows :\ drive-letter patterns</font>
+ (string-search ":\\" path)
+ (error <font color="#880000">"no PATH environment variable found"</font>)))))
+</pre>
+
+<p>Nquist has a <nobr>*file-separator*</nobr> variable, that could be used
+much easier to detect the operation system:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">windows-p</font> ()
+ (char= <font color="#AA5500">*file-separator*</font> #\\))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="user-home-directory"></a>
+
+<hr>
+
+<h2>user-home-directory</h2>
+
+<hr>
+
+<p>[This function works only with <nobr>Audacity 1.3.13</nobr> and
+above.]</p>
+
+<p>The '<nobr>user-home-directory</nobr>' function returns the path to the
+user's home directory on Linux, Mac, and Windows:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">user-home-directory</font> ()
+ (or (get-env <font color="#880000">"HOME"</font>)
+ (let ((drive (get-env <font color="#880000">"HOMEDRIVE"</font>))
+ (path (get-env <font color="#880000">"HOMEPATH"</font>)))
+ (when (and drive path)
+ (strcat drive path)))
+ (get-env <font color="#880000">"UserProfile"</font>)))
+</pre>
+
+<p>If the user's home directory could be identified, then the path to the
+home directory is returned as a string. <nobr>If the</nobr> user's home
+directory could not be identified, then <nobr>NIL [= false]</nobr> is
+returned.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(user-home-directory) <font color="#444444">=&gt;</font> <font color="#008844">"/home/edgar" ; Linux</font>
+(user-home-directory) <font color="#444444">=&gt;</font> <font color="#008844">"C:\\Documents and Settings\\Edgar" ; Windows</font>
+</pre>
+
+<p>On Windows there is no HOME variable defined by Windows itself, but most
+programs will respect a HOME variable, if one had been defined by the user.
+This means that on Windows, if a HOME variable exists, the HOME variable
+will be used instead of HOMEDRIVE and HOMEPATH or 'UserProfile'.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="expand-tilde"></a>
+
+<hr>
+
+<h2>expand-tilde</h2>
+
+<hr>
+
+<p>[This function works only with <nobr>Audacity 1.3.13</nobr> and
+above.]</p>
+
+<pre class="example">
+(defun <font color="#0000CC">expand-filename</font> (string)
+ (cond ((not (stringp string))
+ (error <font color="#880000">"argument must be a string"</font> string))
+ ((and (> (length string) 1)
+ (char= #\~ (char string 0))
+ (or (char= #\/ (char string 1))
+ (char= #\\ (char string 1))))
+ (strcat (user-home-directory)
+ (subseq string 1)))
+ (t string)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
+
diff --git a/docsrc/xlisp/xlisp-doc/examples/hash-tables.htm b/docsrc/xlisp/xlisp-doc/examples/hash-tables.htm
new file mode 100644
index 0000000..3a74ffa
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/hash-tables.htm
@@ -0,0 +1,496 @@
+<html><head>
+
+<title>Hash Tables</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Hash Tables</h1>
+
+<hr>
+
+<p>The internal XLISP 'hash' function from 'xlsym.c':</p>
+
+<pre class="example">
+<font color="#008844">/* hash - hash a symbol name string */</font>
+int <font color="#0000CC">hash</font>(char *str, int len)
+{
+ int i;
+ for (i = 0; *str; )
+ i = (i &lt;&lt; 2) ^ *str++;
+ i %= len;
+ return (i &lt; 0 ? -i : i);
+}
+</pre>
+
+<p>In XLISP this would look like:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">lisp-hash</font> (string table-size)
+ (let ((i 0))
+ (dotimes (index (length string))
+ (setq i (logxor (bsh i 2) (char-code (char string index)))))
+ (setq i (rem i table-size))
+ (if (minusp i) (- i) i)))
+</pre>
+
+<p>A <a href="../reference/hash.htm">hash</a> function is a kind of random
+number generator, where the same input always produces the same output
+number. <nobr>The XLISP</nobr> <a href="../reference/hash.htm">hash</a>
+function computes equally distributed integer numbers in a given range from
+the characters of an input string.</p>
+
+<p>A very simple example:</p>
+
+<ol>
+
+<li><p>We want to store <nobr>4 strings</nobr> in <nobr>2 lists</nobr>,
+stored in <nobr>2 array</nobr> elements:</p>
+
+<pre class="example">
+&gt; (setq my-array (make-array 2))
+#(NIL NIL) <font color="#008844">; NIL NIL = two empty lists</font>
+</pre>
+
+<p>If the array index is computed by the
+<a href="../reference/hash.htm">hash</a> function, then the equally
+distributed numbers make sure that every list will contain approximately
+the same number of strings:</p>
+
+<pre class="example">
+&gt; (dolist (string '("a" "b" "c" "d") my-array)
+ (push string (aref my-array (<font color="#AA0000">hash</font> string (length my-array)))))
+#(("d" "b") ("c" "a"))
+</pre>
+
+<p>The order of the strings in the array was computed by the
+<a href="../reference/hash.htm">hash</a> function, it is not the same order
+as given to <a href="../reference/dolist.htm">dolist</a>.</p></li>
+
+<li><p><nobr>If we</nobr> now search for a string in the lists then the
+<a href="../reference/hash.htm">hash</a> function will tell us the number of
+the array element with the list containing the string because the same input
+string to the <a href="../reference/hash.htm">hash</a> function always
+produces the same output number, as long as the same
+'<nobr>table-size</nobr>' [the same number of array elements] is used:</p>
+
+<pre class="example">
+&gt; (dolist (string '("a" "b" "c" "d"))
+ (format t "~s = ~s~%" string
+ (aref my-array (<font color="#AA0000">hash</font> string (length my-array)))))
+"a" = ("c" "a")
+"b" = ("d" "b")
+"c" = ("c" "a")
+"d" = ("d" "b")
+NIL
+</pre>
+
+<p>The <a href="../reference/hash.htm">hash</a> function will always find
+the correct list as long as the number of array elements has not
+changed.</p> </li>
+
+</ol>
+
+<p>The two main tasks of the <a href="../reference/hash.htm">hash</a>
+<nobr>function are</nobr>:</p>
+
+<ol>
+
+<li><p>Make sure that all lists contain approximately the same number of
+elements, independent from the characters in the input strings, no matter if
+the strings are very similar or completely different. With the
+<a href="../reference/hash.htm">hash</a> function it will nearly never
+happen that one list contains all strings while all other lists are
+empty.</p></li>
+
+<li><p>With the same 'name' and '<nobr>table-size</nobr>' arguments the
+<a href="../reference/hash.htm">hash</a> function will always return exactly
+the same integer number, so a string can always be found no matter in what
+order the strings are stored in the lists of the array.</p></li>
+
+</ol>
+
+<p>Now we can find strings stored in lists, but we want to store and find
+arbitrary things. Therefore we replace the ordinary lists with association
+lists:</p>
+
+<pre class="example">
+&gt; (setq my-array (make-array 2))
+#(() ())
+
+&gt; (dolist (a-cons '(("a" . 1) ("b" . 2) ("c" . 3) ("d" . 4)) my-array)
+ (push a-cons (aref my-array (<font color="#AA0000">hash</font> (car a-cons) (length my-array)))))
+#((("d" . 4) ("b" . 2)) (("c" . 3) ("a" . 1)))
+</pre>
+
+<p>We now have an array like this:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td></td>
+ <td align="center"><nobr>Array&nbsp;</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td align="right"><nobr><code>&nbsp;&nbsp;</code>0<code>&nbsp;</code></nobr></td>
+ <td class="button"><nobr>Association List 1</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>(("d" . 4) ("b" . 2))</code></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td align="right"><nobr><code>&nbsp;&nbsp;</code>1<code>&nbsp;</code></nobr></td>
+ <td class="button"><nobr>Association List 2</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>(("c" . 3) ("a" . 1))</code></nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>The association lists give the flexibility to store an arbitrary number
+of <nobr>key/value</nobr> pairs, we are not limited by the fixed number of
+array elements, while the array together with the
+<a href="../reference/hash.htm">hash</a> function gives much more speed than
+a single association list if we want to manage a big number of
+ <nobr>key/value pairs</nobr>.</p>
+
+<p>With a big number of key/value pairs it is faster to keep them in many
+small association lists than in one single <nobr>big list</nobr>. Arrays
+provide random access, where every element can be accessed in the same time,
+while a list can only be searched from the beginning up to the matching
+element. <nobr>The longer</nobr> the list, the slower the search
+becomes.</p>
+
+<p>With the <a href="../reference/hash.htm">hash</a> function we find the
+association list containing <nobr>the key</nobr>:</p>
+
+<pre class="example">
+&gt; (dolist (key '("a" "b" "c" "d"))
+ (format t "~s = ~s~%" key
+ (aref my-array (<font color="#AA0000">hash</font> key (length my-array)))))
+"a" = (("c" . 3) ("a" . 1))
+"b" = (("d" . 4) ("b" . 2))
+"c" = (("c" . 3) ("a" . 1))
+"d" = (("d" . 4) ("b" . 2))
+NIL
+</pre>
+
+<p>With the <a href="../reference/assoc.htm">assoc</a> function we find the
+<nobr>key/value pair</nobr>:</p>
+
+<pre class="example">
+&gt; (dolist (key '("a" "b" "c" "d"))
+ (format t "~s = ~s~%" key
+ (<font color="#AA0000">assoc</font> key (aref my-array (<font color="#AA0000">hash</font> key (length my-array)))
+ :test #'equal)))
+"a" = ("a" . 1)
+"b" = ("b" . 2)
+"c" = ("c" . 3)
+"d" = ("d" . 4)
+NIL
+</pre>
+
+<p>With the <a href="../reference/cdr.htm">cdr</a> function we get the
+value:</p>
+
+<pre class="example">
+&gt; (dolist (key '("a" "b" "c" "d"))
+ (format t "~s = ~s~%" key
+ (<font color="#AA0000">cdr</font> (<font color="#AA0000">assoc</font> key (aref my-array (<font color="#AA0000">hash</font> key (length my-array)))
+ :test #'equal))))
+"a" = 1
+"b" = 2
+"c" = 3
+"d" = 4
+NIL
+</pre>
+
+<p>And now we have our first working <nobr>hash-table</nobr>.</p>
+
+<p>But we still have one problem. <nobr>The
+<a href="../reference/hash.htm">hash</a></nobr> function works only with
+symbols or strings, while <a href="../reference/assoc.htm">assoc</a> can
+also work with numbers, strings and even lists as 'key' argument. <nobr>To
+make</nobr> our <nobr>hash-table</nobr> work with all types
+<a href="../reference/assoc.htm">assoc</a> can handle, we must make the
+<a href="../reference/hash.htm">hash</a> function happy and convert the
+'key' argument with <a href="../reference/format.htm">format</a> into a
+string before computing the <nobr>hash index:</nobr></p>
+
+<pre class="example">
+&gt; (setq my-array (make-array 2))
+#(() ())
+
+&gt; (dolist (a-cons '((#\x . 1) ((y z) . 2) (12 . 3) (6.5 . 4)) my-array)
+ (push a-cons (aref my-array (<font color="#AA0000">hash</font> (<font color="#AA0000">format</font> nil "~s" (car a-cons))
+ (length my-array)))))
+#(((12 . 3) (#\x . 1)) ((6.5 . 4) ((Y Z) . 2)))
+
+&gt; (dolist (key '(#\x (y z) 12 6.5))
+ (format t "~s = ~s~%" key
+ (<font color="#AA0000">cdr</font> (<font color="#AA0000">assoc</font> key (aref my-array (<font color="#AA0000">hash</font> (<font color="#AA0000">format</font> nil "~s" key)
+ (length my-array)))
+ :test #'equal))))
+#\x = 1
+(Y Z) = 2
+12 = 3
+6.5 = 4
+NIL
+</pre>
+
+<p>Wonderful.</p>
+
+<p>A final quirk still needs to be solved. Maybe you have noticed the :test
+argument to <a href="../reference/assoc.htm">assoc</a>. Like with all Lisp
+functions providing :test arguments, the
+<a href="../reference/assoc.htm">assoc</a> :test defaults to
+<a href="../reference/eql.htm">eql</a> [because
+<a href="../reference/eq.htm">eq</a> is unreliable with numbers, and
+<a href="../reference/eql.htm">eql</a> is faster
+<nobr>than <a href="../reference/equal.htm">equal</a>]</nobr>, but
+<a href="../reference/eql.htm">eql</a> doesn't work with
+<nobr>floating-point</nobr> numbers, strings and lists, so we had to
+<nobr>use <a href="../reference/equal.htm">equal</a></nobr>.</p>
+
+<p>The typical Lisp solution is to provide a :test argument to the
+'make-hash-table' function, so the programmer can choose which function to
+use. <nobr>The :test</nobr> argument to 'make-hash-table' becomes a property
+of the <nobr>hash-table</nobr> itself, so the :test only needs to be given
+once, at the time when the <nobr>hash-table</nobr> is created, and not every
+time the <nobr>hash-table</nobr> is accessed afterwards.</p>
+
+<p>We have the problem that <nobr>hash-tables</nobr> are no
+<nobr>built-in</nobr> XLISP data type and we want use
+<nobr>make-hash-table</nobr> in the same way
+<nobr>as <a href="../reference/make-array.htm">make-array</a></nobr>:</p>
+
+<pre class="example">
+(setq my-hash-table (make-hash-table <font color="#0000CC">size</font> :test #'equal))
+</pre>
+
+<p>Here the make-hash-table function has no access to the property list of
+the '<nobr>my-hash-table</nobr>' symbol, so the only solution is to make the
+:test function become part of the <nobr>hash-table</nobr> itself:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td></td>
+ <td align="center"><nobr>Array&nbsp;</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td align="right"><nobr><code>&nbsp;&nbsp;</code>0<code>&nbsp;</code></nobr></td>
+ <td class="button"><nobr>Test Function</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><nobr>the :test argument to
+ <a href="../reference/assoc.htm">assoc</a></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td align="right"><nobr><code>&nbsp;&nbsp;</code>1<code>&nbsp;</code></nobr></td>
+ <td class="button"><nobr>Association List 1</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><nobr>((<i>key1</i> . <i>value1</i>)
+ ... (<i>keyN</i> . <i>valueN</i>))</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td align="right"><nobr><code>&nbsp;&nbsp;</code>2<code>&nbsp;</code></nobr></td>
+ <td class="button"><nobr>Association List 2</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><nobr>((<i>key1</i> . <i>value1</i>)
+ ... (<i>keyN</i> . <i>valueN</i>))</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td align="right"><nobr><code>&nbsp;&nbsp;</code>3<code>&nbsp;</code></nobr></td>
+ <td class="button"><nobr>Association List 3</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><nobr>((<i>key1</i> . <i>value1</i>)
+ ... (<i>keyN</i> . <i>valueN</i>))</nobr></td>
+</tr>
+<tr>
+ <td></td>
+ <td align="center"><nobr>...<code>&nbsp;</code></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td align="right"><nobr><code>&nbsp;&nbsp;</code><i>n</i><code>&nbsp;</code></nobr></td>
+ <td class="button"><nobr>Association List <i>n</i></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><nobr>((<i>key1</i> . <i>value1</i>)
+ ... (<i>keyN</i> . <i>valueN</i>))</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>This is the final layout of our <nobr>hash-tables</nobr>, so we can start
+to implement the <nobr>hash-table</nobr> functions.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="make-hash-table"></a>
+
+<hr>
+
+<h2>make-hash-table</h2>
+
+<hr>
+
+<pre class="example">
+(defun <font color="#0000CC">make-hash-table</font> (size &amp;optional (test #'eql))
+ (and (&lt; size 1) (error <font color="#880000">"hash-table minimum size is 1"</font> size))
+ (let ((hash-table (make-array (1+ size))))
+ (setf (aref hash-table 0) test)
+ hash-table))
+
+(defun <font color="#0000CC">gethash</font> (key hash-table)
+ (let* ((size (1- (length hash-table)))
+ (index (1+ (hash (format nil "~s" key) size)))
+ (a-list (aref hash-table index))
+ (test (aref hash-table 0)))
+ (cdr (assoc key a-list :test test))))
+
+(defun <font color="#0000CC">puthash</font> (key value hash-table)
+ (let* ((size (1- (length hash-table)))
+ (index (1+ (hash (format nil "~s" key) size)))
+ (a-list (aref hash-table index))
+ (test (aref hash-table 0))
+ (a-cons (assoc key a-list :test test)))
+ (setf (aref hash-table index)
+ (cons (cons key value)
+ (if a-cons
+ (remove-if #'(lambda (x)
+ (funcall test key (car x)))
+ a-list)
+ a-list)))))
+
+(defun <font color="#0000CC">remhash</font> (key hash-table)
+ (let* ((size (1- (length hash-table)))
+ (index (1+ (hash (format nil "~s" key) size)))
+ (a-list (aref hash-table index))
+ (test (aref hash-table 0))
+ (a-cons (assoc key a-list :test test)))
+ (and a-cons
+ (setf (aref hash-table index)
+ (remove-if #'(lambda (x)
+ (funcall test key (car x)))
+ a-list)))
+ a-cons))
+
+(defun <font color="#0000CC">clrhash</font> (hash-table)
+ (let ((size (1- (length hash-table))))
+ (do ((index 1 (1+ index)))
+ ((&gt; index size))
+ (setf (aref hash-table index) nil))
+ hash-table))
+
+(defun <font color="#0000CC">hash-table-p</font> (expr)
+ (and (arrayp expr) <font color="#008844">; expression is an array</font>
+ (&gt; (length expr) 1) <font color="#008844">; with more than one elements</font>
+ (fboundp (aref expr 0)) <font color="#008844">; first element is a function</font>
+ (let ((size (1- (length expr)))) <font color="#008844">; all other</font>
+ (do ((index 1 (1+ index))) <font color="#008844">; elements are lists</font>
+ ((or (&gt; index size)
+ (not (listp (aref expr index))))
+ (&gt; index size))))))
+
+(defun <font color="#0000CC">hash-table-count</font> (hash-table)
+ (let ((size (1- (length hash-table)))
+ (entries 0))
+ (do ((index 1 (1+ index)))
+ ((&gt; index size))
+ (setf entries (+ entries (length (aref hash-table index)))))
+ entries))
+
+(defun <font color="#0000CC">hash-table-size</font> (hash-table)
+ (1- (length hash-table)))
+
+(defun <font color="#0000CC">hash-table-test</font> (hash-table)
+ (aref hash-table 0))
+
+(defun <font color="#0000CC">print-hash-table</font> (hash-table)
+ (if (not (arrayp hash-table))
+ (format t <font color="#880000">";; Not an array: ~s~%"</font> hash-table)
+ (dotimes (index (length hash-table))
+ (let ((element (aref hash-table index)))
+ (cond ((not (listp element))
+ (format t <font color="#880000">";; array element ~a: ~s~%"</font> index element))
+ ((null element)
+ (format t <font color="#880000">";; bucket ~a: ()~%"</font> index))
+ (t
+ (format t <font color="#880000">";; bucket ~a:~%"</font> index)
+ (let ((entry-counter 1))
+ (dolist (entry element)
+ (format t <font color="#880000">";; ~a.~a: ~s~%"</font> index entry-counter entry)
+ (incf entry-counter)))))))))
+</pre>
+
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
+
diff --git a/docsrc/xlisp/xlisp-doc/examples/hexadecimal.htm b/docsrc/xlisp/xlisp-doc/examples/hexadecimal.htm
new file mode 100644
index 0000000..4b483b0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/hexadecimal.htm
@@ -0,0 +1,151 @@
+<html><head>
+
+<title>Hexadecimal Integer Numbers</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Hexadecimal Integer Numbers</h1>
+
+<hr>
+
+<p>XLISP provides the <a href="../manual/xlisp.htm#hexadecimal">#x</a>
+<nobr>read-macro</nobr> for hexadecimal numbers:</p>
+
+<pre class="example">
+#x0 =&gt; 0 #x8 =&gt; 8 #x10 =&gt; 16
+#x1 =&gt; 1 #x9 =&gt; 9 #x11 =&gt; 17
+#x2 =&gt; 2 #xa =&gt; 10 #x12 =&gt; 18
+#x3 =&gt; 3 #xb =&gt; 11 #x13 =&gt; 19
+#x4 =&gt; 4 #xc =&gt; 12 #x14 =&gt; 20
+#x5 =&gt; 5 #xd =&gt; 13 #x15 =&gt; 21
+#x6 =&gt; 6 #xe =&gt; 14 #x16 =&gt; 22
+#x7 =&gt; 7 #xf =&gt; 15 #x17 =&gt; 23
+</pre>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>hex-string</b> <i>integer</i> [<i>all</i>])</dt>
+<dd><i>integer</i> - an integer expression<br>
+<i>all</i> - a boolean expression<br>
+returns - the <i>integer</i> in hexadecimal form as string</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">hex-string</font> (integer &amp;optional all)
+ (if (integerp integer)
+ (let ((fmt (if all
+ (or (dolist (bits '(16 32 64 128) nil)
+ (let ((fixnum (round (expt 2.0 (1- bits)))))
+ (and (plusp (1- fixnum))
+ (minusp fixnum)
+ (return (format nil <font color="#880000">"%.~ax"</font> (/ bits 4))))))
+ (error <font color="#880000">"integer limit not found"</font>))
+ <font color="#880000">"%x"</font>)))
+ (progv '(<font color="#AA5500">*integer-format*</font>) (list fmt)
+ (format nil <font color="#880000">"~a"</font> integer)))
+ (error <font color="#880000">"not an integer"</font> integer)))
+</pre>
+
+<p>The '<nobr>hex-string</nobr>' function converts the 'integer' argument
+into hexadecimal form and returns is as a string. <nobr>If the</nobr>
+optional 'all' argument is not given or
+<a href="../reference/nil.htm">NIL</a>, leading zeros are not included in
+the string. <nobr>If the</nobr> optional 'all' argument is
+<nobr>non-<a href="../reference/nil.htm">NIL</a></nobr>, all digits of the
+internal representation of the 'integer' argument, including leading zeros,
+are contained in the string. This is useful for debugging integer overflow
+and <nobr>bit-wise</nobr> functions.</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>hex</b> <i>integer</i> [<i>all</i>])</dt>
+<dd><i>integer</i> - an integer expression<br>
+<i>all</i> - a boolean expression<br>
+prints - the <i>integer</i> in hexadecimal form<br>
+returns - the <i>integer</i> argument</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">hex</font> (integer &amp;optional all)
+ (if (integerp integer)
+ (format t <font color="#880000">"#x~a~%"</font> (hex-string integer all))
+ (format t <font color="#880000">";; not an integer~%"</font>))
+ integer)
+</pre>
+
+<p>The 'hex' function prints the 'integer' argument in hexadecimal form on
+the screen. Together with the
+<a href="../manual/xlisp.htm#hexadecimal">#x</a> <nobr>read-macro</nobr>
+this can be used for interactive hexadecimal computations.</p>
+
+<pre class="example">
+&gt; (hex 12345678)
+#xbc614e
+12345678
+
+&gt; (hex (+ #x1f #xa3))
+#xc2
+194
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/lists.htm b/docsrc/xlisp/xlisp-doc/examples/lists.htm
new file mode 100644
index 0000000..34f9053
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/lists.htm
@@ -0,0 +1,580 @@
+<html><head>
+
+<title>Lists</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Lists</h1>
+
+<hr>
+
+<p>Lists are also <a href="sequences.htm">Sequences</a>.</p>
+
+<ul>
+<li><nobr><a href="#print-cons">print-cons</a> - print lists as conses</nobr></li>
+<li><nobr><a href="#dolist-star">dolist*</a> - a <a href="../reference/dolist.htm">dolist</a> version that can iterate dotted lists</nobr></li>
+<li><nobr>List Accessors</nobr></li>
+<ul>
+<li><nobr><a href="#cl-list-accessor">cl:list:unary-accessor</a></nobr></li>
+<li><nobr><a href="#cl-list-accessor">cl:list:binary-accessor</a></nobr></li>
+</ul>
+<li><nobr>List Membership</nobr></li>
+<ul>
+<li><nobr><a href="#cl-member">cl:member</a> - [Function] - test for membership in lists and sub-elements</nobr></li>
+<li><nobr><a href="#cl-member-if">cl:member-if</a> - [Function] - search for the first element matching a predicate</nobr></li>
+<li><nobr><a href="#cl-member-if-not">cl:member-if-not</a> - [Function] - search for the first element not matching a predicate</nobr></li>
+</ul>
+<li><nobr>Non-destructive Removal</nobr></li>
+<ul>
+<li><nobr>cl:remove</nobr></li>
+<li><nobr>cl:remove-if</nobr></li>
+<li><nobr>cl:remove-if-not</nobr></li>
+</ul>
+<li><nobr>Destructive Removal = Deletion</nobr></li>
+<ul>
+<li><nobr>cl:delete</nobr></li>
+<li><nobr>cl:delete-if</nobr></li>
+<li><nobr>cl:delete-if-not</nobr></li>
+</ul>
+<li><nobr>Lists as Sets</nobr></li>
+<ul>
+<li><nobr><a href="#cl-pushnew">cl:pushnew</a> - [Macro] -</nobr></li>
+<li><nobr><a href="#cl-union">cl:union</a></nobr> - [Function]</li>
+<li><nobr><a href="#cl-intersection">cl:intersection</a> - [Function]</nobr></li>
+<li><nobr><a href="#cl-set-difference">cl:set-difference</a> - [Function]</nobr></li>
+<li><nobr><a href="#cl-set-exclusive-or">cl:set-exclusive-or</a> - [Function]</nobr></li>
+<li><nobr><a href="#cl-subsetp">cl:subsetp</a> - [Function]</nobr></li>
+</ul>
+</ul>
+
+<a name="print-cons"></a>
+
+<hr>
+
+<h2>print-cons</h2>
+
+<hr>
+
+<pre class="example">
+(defun <font color="#0000CC">print-cons</font> (item)
+ (labels ((cons-string (item)
+ (case (type-of item)
+ (array (let ((end (length item))
+ (result <font color="#880000">""</font>))
+ (dotimes (index end)
+ (let ((string (cons-string (aref item index))))
+ (setq result
+ (if (eql 0 index)
+ (format nil <font color="#880000">"#(~a"</font> string)
+ (format nil <font color="#880000">"~a ~a"</font> result string)))))
+ (format nil <font color="#880000">"~a)"</font> result)))
+ (character (format nil <font color="#880000">"~s"</font> item))
+ (cons (format nil <font color="#880000">"(~a . ~a)"</font>
+ (cons-string (car item))
+ (cons-string (cdr item))))
+ (string (format nil <font color="#880000">"\"~a\""</font> item))
+ (t item))))
+ (format t <font color="#880000">"~a~%"</font> (cons-string item))
+ item))
+</pre>
+
+<p>Examples:</p>
+
+<pre class="example">
+&gt; (print-cons '(1 2 3))
+(1 . (2 . (3 . NIL)))
+(1 2 3)
+</pre>
+
+<p>The 'print-cons' function is useful for debugging association lists,
+where <a href="../reference/print.htm">print</a> often fails to display the
+correct layout:</p>
+
+<pre class="example">
+&gt; (print-cons (cons '((1 . 2) (3 . 4)) '((a . b) (c . d))))
+(((1 . 2) . ((3 . 4) . NIL)) . ((A . B) . ((C . D) . NIL)))
+(((1 . 2) (3 . 4)) (A . B) (C . D)) <font color="#008844">; &lt;- output of PRINT</font>
+</pre>
+
+<p>Do not think that <a href="../reference/print.htm">print</a> is bad, it
+saves you from reading things like this:</p>
+
+<pre class="example">
+&gt; (print-cons '(defun hello-world ()
+ (print "Hello World!")))
+(DEFUN . (HELLO-WORLD . (NIL . ((PRINT . ("Hello World!" . NIL)) . NIL))))
+(DEFUN HELLO-WORLD NIL (PRINT "Hello World!")) <font color="#008844">; &lt;- output of PRINT</font>
+</pre>
+
+<p>Test this if you don't believe:</p>
+
+<pre class="example">
+&gt; (DEFUN . (HELLO-WORLD . (NIL . ((PRINT . ("Hello World!" . NIL)) . NIL))))
+HELLO-WORLD
+
+&gt; (hello-world)
+"Hello World!"
+</pre>
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="dolist-star"></a>
+
+<hr>
+
+<h2>dolist*</h2>
+
+<hr>
+
+<p>A <a href="../reference/dolist.htm">dolist</a> version that can iterate
+dotted lists:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">dolist*</font> (fargs &amp;rest body)
+ (let ((list (gensym)))
+ `(let ((,list ,(second fargs)))
+ (if (not (listp ,list))
+ (error <font color="#880000">"not a list"</font> ,list)
+ (do ((,(first fargs) (first ,list)
+ (if (consp ,list) (first ,list) ,list)))
+ ((null ,list))
+ (setq ,list (and (consp ,list) (rest ,list)))
+ ,@body)))))
+</pre>
+
+<pre class="example">
+(dolist (i '(1 2 3)) (print i)) <font color="#008844">; prints 1 2 3</font>
+(dolist* (i '(1 2 3)) (print i)) <font color="#008844">; prints 1 2 3</font>
+
+(dolist (i '(1 2 . 3)) (print i)) <font color="#008844">; prints 1 2</font>
+(dolist* (i '(1 2 . 3)) (print i)) <font color="#008844">; prints 1 2 3</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-member"></a>
+
+<hr>
+
+<h2>cl:member</h2>
+
+<hr>
+
+<p>XLISP already has the <a href="../reference/member.htm">member</a>
+function to for search elements in lists:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<a href="../reference/member.htm">member</a> <i>expr list</i> [{:test | :test-not} <i>test</i>])</dt>
+<dd><i>expr</i> - the expression to find [an atom or a list]<br>
+<i>list</i> - the list to search<br>
+<i>test</i> - optional test function, default is <a href="../reference/eql.htm">eql</a><br>
+returns - the remainder of the list starting with <i>expr</i></dd>
+</dl>
+
+</div></p>
+
+<nobr>The 'cl:member' function provides an additional :key argument for
+accessing <nobr>sub-elements</nobr> in the list:</nobr>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>cl:member</b> <i>expr list</i> [{:test | :test-not} <i>test</i> :key <i>key</i>])</dt>
+<dd><i>expr</i> - the expression to find [an atom or a list]<br>
+<i>list</i> - the list to search<br>
+<i>test</i> - an optional test function, default is <a href="../reference/eql.htm">eql</a><br>
+<i>key</i> - an optional accessor function for sub-elements in the list<br>
+returns - the remainder of the list starting with <i>expr</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:member</font> (expr list &amp;key test test-not key)
+ (and test test-not (error <font color="#880000">"both :TEST and :TEST-NOT specified"</font>))
+ (if key
+ (cond (test
+ (member expr list
+ :test #'(lambda (x y)
+ (funcall test x (funcall key y)))))
+ (test-not
+ (member expr list
+ :test-not #'(lambda (x y)
+ (funcall test-not x (funcall key y)))))
+ (t (member expr list
+ :test #'(lambda (x y)
+ (eql x (funcall key y))))))
+ (cond (test (member expr list :test test))
+ (test-not (member expr list :test-not test-not))
+ (t (member expr list)))))
+</pre>
+
+<p>Test if the number 4 matches the first or the second element in several
+sublists:</p>
+
+<pre class="example">
+(cl:member 4 '((1 2) (3 4) (5 6)) :key #'first) =&gt; NIL <font color="#008844">; no match</font>
+(cl:member 4 '((1 2) (3 4) (5 6)) :key #'second) =&gt; ((3 4) (5 6)) <font color="#008844">; number found</font>
+</pre>
+
+<p>Subtle differences between XLISP and Common Lisp:</p>
+
+<pre class="example">
+<font color="#008844">;; Lisp Form XLISP Common Lisp</font>
+(member 1 '(1 2 . 3)) =&gt; (1 2 . 3) =&gt; (1 2 . 3)
+(member 2 '(1 2 . 3)) =&gt; (2 . 3) =&gt; (2 . 3)
+(member 3 '(1 2 . 3)) =&gt; NIL =&gt; <font color="#AA0000">error: not a proper list</font>
+</pre>
+
+
+<p>Here is a 'cl:member' version that behaves <nobr>error-conform</nobr> to
+<nobr>Common Lisp</nobr> but produces an unintelligible backtrace in case of
+Lisp errors. <nobr>I also</nobr> have found no way how to macroexpand
+macrolets, so debugging this function is a real pain.</p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:member</font> (expr list &amp;key test test-not key)
+ (and test test-not (error <font color="#880000">"both :TEST and :TEST-NOT specified"</font>))
+ (macrolet ((internal-loop (list)
+ `(do ()
+ <font color="#008844">;; termination test</font>
+ ((or (not (consp list))
+ ,(if key
+ (cond (test `(funcall ,test ,expr (funcall ,key (car list))))
+ (test-not `(not (funcall ,test ,expr (funcall ,key (car list)))))
+ (t `(eql ,expr (funcall ,key (car list)))))
+ (cond (test `(funcall ,test ,expr (car list)))
+ (test-not `(not (funcall ,test ,expr (car list))))
+ (t `(eql ,expr (car list))))))
+ <font color="#008844">;; return value</font>
+ (if (not (listp list))
+ (error <font color="#AA0000">"a proper list must not end with"</font> list)
+ list))
+ <font color="#008844">;; body</font>
+ (setq list (cdr list)))))
+ (internal-loop list)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-member-if"></a>
+
+<hr>
+
+<h2>cl:member-if</h2>
+
+<hr>
+
+<p>Here are two functions to search for elements that satisfy a given
+predicate:</p>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>member-if</b> <i>predicate list</i> [:key <i>key</i>])</nobr></dt>
+<dd><i>predicate</i> - a test function with one argument<br>
+<i>list</i> - the list to search<br>
+<i>key</i> - optional accessor function for sub-elements in the list<br>
+returns - the remainder of the list starting with the first matching element</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:member-if-not</font> (predicate list &amp;key key)
+ (member nil list :test (if key
+ #'(lambda (x y)
+ (funcall predicate (funcall key y)))
+ #'(lambda (x y)
+ (funcall predicate y)))))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-member-if-not"></a>
+
+<hr>
+
+<h2>cl:member-if-not</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>member-if-not</b> <i>predicate list</i> [:key <i>key</i>])</nobr></dt>
+<dd><i>predicate</i> - a test function with one argument<br>
+<i>list</i> - the list to search<br>
+<i>key</i> - optional accessor function for sub-elements in the list<br>
+returns - the remainder of the list starting with the first non-matching element</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:member-if-not</font> (predicate list &amp;key key)
+ (member nil list :test-not (if key
+ #'(lambda (x y)
+ (funcall predicate (funcall key y)))
+ #'(lambda (x y)
+ (funcall predicate y)))))))
+</pre>
+
+<p>Examples:</p>
+
+<pre class="example">
+(cl:member-if #'plusp '(-2 -1 0 1 2)) =&gt; (1 2) <font color="#008844">; 1 = first positive number</font>
+(cl:member-if-not #'minusp '(-2 -1 0 1 2)) =&gt; (0 1 2) <font color="#008844">; 0 = first non-negative number</font>
+</pre>
+
+<p>More test functions see <a href="predicates.htm">Predicates</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-list-accessor"></a>
+
+<hr>
+
+<h2>cl:list:accessor</h2>
+
+<hr>
+
+<p>The 'lists as sets' functions have common :test, <nobr>:test-not</nobr>
+and :key parameters:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">cl:list:accessor</font> (test test-not &amp;optional key)
+ (if (and test test-not)
+ (error <font color="#880000">"both :TEST and :TEST-NOT specified"</font>))
+ (if key
+ (cond (test `(lambda (x y)
+ (funcall ,test (funcall ,key x)
+ (funcall ,key y))))
+ (test-not `(lambda (x y)
+ (not (funcall ,test-not (funcall ,key x)
+ (funcall ,key y)))))
+ (t `(lambda (x y)
+ (eql (funcall ,key x) (funcall ,key y)))))
+ (cond (test `(lambda (x y)
+ (funcall ,test x y)))
+ (test-not `(lambda (x y)
+ (not (funcall ,test-not x y))))
+ (t `(lambda (x y)
+ (eql x y))))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-pushnew"></a>
+
+<hr>
+
+<h2>cl:pushnew</h2>
+
+<hr>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-union"></a>
+
+<hr>
+
+<h2>cl:union</h2>
+
+<hr>
+
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>union</b> <i>list1 list2</i> [{:test | :test-not} <i>test</i> :key <i>key</i>])</nobr></dt>
+<dd><i>listN</i> - a list of symbols or numbers<br>
+returns - the union of <i>list1</i> and <i>list2</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">union</font> (a b)
+ (let (result)
+ (dolist (element a)
+ (unless (member element result)
+ (push element result)))
+ (dolist (element b)
+ (unless (member element result)
+ (push element result)))
+ result))
+</pre>
+
+<p>The 'cl:union' function returns a list that contains every element that
+occurs in either 'list1' or 'list2'.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-intersection"></a>
+
+<hr>
+
+<h2>cl:intersection</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(intersection <i>list1 list2</i> [{:test | :test-not} <i>test</i> :key <i>key</i>])</nobr></dt>
+<dd><i>listN</i> - a list of symbols or numbers<br>
+returns - the intersection of <i>list1</i> and <i>list2</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">intersection</font> (a b)
+ (let (result)
+ (dolist (element a)
+ (when (member element b)
+ (push element result)))
+ result))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-set-difference"></a>
+
+<hr>
+
+<h2>cl:set-difference</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>set-difference</b> <i>list1 list2</i>)</nobr></dt>
+<dd><i>listN</i> - a list of symbols or numbers<br>
+returns - the set-difference of <i>list1</i> and <i>list2</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">set-difference</font> (a b)
+ (remove-if #'(lambda (element)
+ (member element b))
+ a))
+</pre>
+
+<p>An element of list1 appears in the result if and only if it does not
+match any element of list2.</p>
+
+<pre class="example">
+(set-difference '(1 2 3) '(2 3 4)) =&gt; (1)
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-set-exclusive-or"></a>
+
+<hr>
+
+<h2>cl:set-exclusive-or</h2>
+
+<hr>
+
+<p>The result contains precisely those elements of list1 and list2 that
+appear in no matching pair.</p>
+
+<pre class="example">
+(set-exclusive-or '(1 2 3) '(2 3 4)) =&gt; (1 4)
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-subsetp"></a>
+
+<hr>
+
+<h2>cl:subsetp</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>subsetp</b> <i>list1 list2</i>)</nobr></dt>
+<dd><i>listN</i> - a list of symbols or numbers<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if <i>list1</i> is a subset of <i>list2</i>, NIL otherwise</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">subsetp</font> (a b)
+ (let ((result t))
+ (dolist (element a)
+ (when (not (member element b)
+ (setf result nil)
+ (return))))
+ result))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
+
diff --git a/docsrc/xlisp/xlisp-doc/examples/macros.htm b/docsrc/xlisp/xlisp-doc/examples/macros.htm
new file mode 100644
index 0000000..1781381
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/macros.htm
@@ -0,0 +1,302 @@
+<html><head>
+
+<title>Macros</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Macro Programming</h1>
+
+<hr>
+
+<ul>
+<li><nobr><a href="#with-unique-names">with-unique-names</a> - create local <a href="../reference/gensym.htm">gensym</a> variables</nobr></li>
+</ul>
+
+<p><div class="box">
+
+<p><b>Note:</b> The best book for Lisp macro programming is Paul
+Graham's '<nobr>On Lisp</nobr>', available for free under:</p>
+
+<ul>
+<li><nobr><a href="http://www.paulgraham.com/onlisp.html"
+>http://www.paulgraham.com/onlisp.html</a></nobr></li>
+</ul>
+
+</div></p>
+
+<a name="with-unique-names"></a>
+
+<hr>
+
+<h2>with-unique-names</h2>
+
+<hr>
+
+<p>See <a href="http://www.cliki.net/WITH-UNIQUE-NAMES"
+>http://www.cliki.net/WITH-UNIQUE-NAMES</a>. This macro also appears in
+<nobr>Chapter 11</nobr> of Paul Graham's
+<nobr><a href="http://www.paulgraham.com/onlisp.html">On Lisp</a></nobr>
+under the name '<nobr>with-gensyms</nobr>'.</p>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>with-unique-names</b> (<i>symbols</i>) <i>body</i>)</nobr></dt>
+<dd><i>symbols</i> - a list of Lisp symbols, representing variable names<br>
+<i>body</i> - some Lisp code to execute<br>
+returns - the <i>body</i> with all <i>symbols</i> bound to different
+<a href="../reference/gensym.htm">gensym</a>s</dd>
+</dl>
+
+</div></p>
+
+<p>The '<nobr>with-unique-names</nobr>' macro helps to avoid name clashes in
+Lisp macros.</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">with-unique-names</font> (symbols &amp;rest body)
+ `(let ,(mapcar #'(lambda (x) `(,x (gensym))) symbols) ,@body))
+</pre>
+
+<p>The '<nobr>with-unique-names</nobr>' macro belongs to the category of
+<nobr>write-only</nobr> code. <nobr>No matter</nobr> how you write it, it's
+nearly impossible to understand its meaning by reading the macro definition.
+<nobr>It's easier</nobr> to understand if you look at the macro
+expansion:</p>
+
+<pre class="example">
+&gt; (macroexpand-1 '(with-unique-names (a b c)
+ `(let ((,a 1) (,b 2) (,c 3))
+ (list ,a ,b ,c))))
+
+(let ((a (gensym)) (b (gensym)) (c (gensym)))
+ `(let ((,a 1) (,b 2) (,c 3))
+ (list ,a ,b ,c)))
+</pre>
+
+<p>This translates in practice to the following idea:</p>
+
+<pre class="example">
+(let ((a (gensym)) (b (gensym)) (c (gensym))) <font color="#008844">; outside the expansion</font>
+ `(let ((<font color="#AA5500">gensym1</font> 1) (<font color="#AA5500">gensym2</font> 2) (<font color="#AA5500">gensym3</font> 3)) <font color="#008844">; inside the expansion</font>
+ (list <font color="#AA5500">gensym1 gensym2 gensym3</font>)))
+</pre>
+
+<p>The variable names 'a', 'b', and 'c' have been replaced inside the macro
+expansion by three <a href="../reference/gensym.htm">gensym</a>s. This way a
+variable name inside the macro expansion cannot accidentally collide with a
+variable of the same name in the environment of the macro's expansion like
+shown here:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">print-macro</font> (x) <font color="#008844">; bad example</font>
+ `(let ((<font color="#AA0000">macro-var</font> 'macro))
+ (print ,x)))
+
+&gt; (let ((<font color="#AA0000">local-var</font> 'let)) <font color="#008844">; this works</font>
+ (print local-var)
+ (print-macro local-var))
+LET <font color="#008844">; printed by PRINT</font>
+LET <font color="#008844">; printed by PRINT-MACRO</font>
+
+&gt; (let ((<font color="#AA0000">macro-var</font> 'let)) <font color="#008844">; this doesn't</font>
+ (print macro-var)
+ (print-macro macro-var))
+LET <font color="#008844">; printed by PRINT</font>
+MACRO <font color="#008844">; printed by PRINT-MACRO</font>
+</pre>
+
+<p>The reason for this behaviour is that the '<nobr>print-macro</nobr>'
+<nobr>expands to:</nobr></p>
+
+<pre class="example">
+&gt; (let ((<font color="#AA0000">local-var</font> 'let)) <font color="#008844">; this works</font>
+ (print local-var)
+ (let ((<font color="#AA0000">macro-var</font> 'macro))
+ (print local-var)))
+LET <font color="#008844">; LOCAL-VAR inside the first LET</font>
+LET <font color="#008844">; LOCAL-VAR inside the second LET</font>
+
+&gt; (let ((<font color="#AA0000">macro-var</font> 'let)) <font color="#008844">; this doesn't</font>
+ (print macro-var)
+ (let ((<font color="#AA0000">macro-var</font> 'macro))
+ (print macro-var)))
+LET <font color="#008844">; MACRO-VAR inside the first LET</font>
+MACRO <font color="#008844">; MACRO-VAR inside the second LET</font>
+</pre>
+
+<p>Now the same example with unique names. Note the
+<a href="..reference/backquote.htm">comma</a> before the
+'<nobr>macro-var</nobr>' inside the
+<nobr><a href="../reference/let.htm">let</a> form of the macro
+definition:</nobr></p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">print-macro</font> (x) <font color="#008844">; good example</font>
+ (with-unique-names (<font color="#AA0000">macro-var</font>)
+ `(let ((,<font color="#AA0000">macro-var</font> 'macro))
+ (print ,x))))
+
+&gt; (let ((<font color="#AA0000">macro-var</font> 'let)) <font color="#008844">; now it works</font>
+ (print macro-var)
+ (print-macro macro-var))
+LET <font color="#008844">; printed by PRINT</font>
+LET <font color="#008844">; printed by PRINT-MACRO</font>
+</pre>
+
+<p>The reason why it works is that the '<nobr>print-macro</nobr>' now
+<nobr>expands to:</nobr></p>
+
+<pre class="example">
+&gt; (let ((<font color="#AA0000">macro-var</font> 'let)) <font color="#008844">; works</font>
+ (print macro-var)
+ (let ((<font color="#AA5500">gensym</font> 'macro))
+ (print macro-var)))
+LET <font color="#008844">; MACRO-VAR inside the first LET</font>
+LET <font color="#008844">; MACRO-VAR inside the second LET</font>
+</pre>
+
+<nobr>Now '<nobr>macro-var</nobr>' can even be used as a variable name
+inside the macro definition without colliding with the
+'<nobr>macro-var</nobr>' bound
+<nobr>by <a href="../reference/let.htm">let</a>:</nobr></nobr>
+
+<pre class="example">
+(defmacro <font color="#0000CC">print-macro</font> (x) <font color="#008844">; good example</font>
+ (with-unique-names (<font color="#AA0000">macro-var</font>)
+ `(let ((,<font color="#AA0000">macro-var</font> 'macro))
+ (print ,<font color="#AA0000">macro-var</font>)
+ (print ,x))))
+
+&gt; (let ((<font color="#AA0000">macro-var</font> 'let)) <font color="#008844">; works</font>
+ (print macro-var)
+ (print-macro macro-var))
+LET <font color="#008844">; MACRO-VAR printed inside LET</font>
+MACRO <font color="#008844">; GENSYMed MACRO-VAR, printed inside PRINT-MACRO</font>
+LET <font color="#008844">; MACRO-VAR bound by LET, printed inside PRINT-MACRO</font>
+</pre>
+
+<p>The expansion of the '<nobr>print-macro</nobr>' shows why this works:</p>
+
+<pre class="example">
+&gt; (let ((<font color="#AA0000">macro-var</font> 'let)) <font color="#008844">; works</font>
+ (print macro-var)
+ (let ((<font color="#AA5500">gensym</font> 'macro))
+ (print <font color="#AA5500">gensym</font>)
+ (print macro-var)))
+LET <font color="#008844">; MACRO-VAR printed inside LET</font>
+MACRO <font color="#008844">; GENSYMed MACRO-VAR printed inside PRINT-MACRO</font>
+LET <font color="#008844">; MACRO-VAR bound by LET, printed inside PRINT-MACRO</font>
+</pre>
+
+<p>You can give as many variable names as you like to
+'<nobr>with-unique-names</nobr>', the
+<a href="../reference/gensym.htm">gensym</a> management is done
+automatically:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">print-macro</font> (x y z)
+ (with-unique-names (a b c)
+ `(let ((,a 1) (,b 2) (,c 3))
+ (format t <font color="#880000">"outside: a: ~a b: ~a c: ~a~%"</font> ,x ,y ,z)
+ (format t <font color="#880000">" inside: a: ~a b: ~a c: ~a~%"</font> ,a ,b ,c))))
+
+&gt; (let ((a 'a) (b 'b) (c 'c))
+ (print-macro a b c))
+outside: a: A b: B c: C
+ inside: a: 1 b: 2 c: 3
+</pre>
+
+<p>Two things you still have to care about:</p>
+
+<ol>
+
+<li><p>The 'unique names' should not use the same smbol names as the
+parameter variables of the macro, otherwise you will have the same
+'shadowing' effect like in ordinary Lisp functions. This is not a real
+problem because when writing a macro you can see the parameter names before
+your eyes, while you usually cannot see the variable names of the
+environment, where the macro will be expanded. <nobr>You also</nobr> do not
+have to care which variable names had been used in a macro if you call the
+macro from arbitrary Lisp code, where you usually cannot see the code of the
+macro definition.</p></li>
+
+<li><p>The local <a href="../reference/gensym.htm">gensym</a>ed variables
+now themselves must be expanded by writing a
+<a href="../reference/backquote.htm">comma</a> in front of each when they appear
+inside a <a href="../reference/backquote.htm">backquote</a> scope.
+This sometimes can lead to tricky situations, because the
+<a href="../reference/backquote.htm">comma</a> expansion of the symbol does not
+produce the variable's value, instead it produces the name of the
+<a href="../reference/gensym.htm">gensym</a>, which holds the value.
+<nobr>But this</nobr> is a general phenomenon of
+<a href="../reference/gensym.htm">gensym</a>s in Lisp macro programming
+and not a bug of the '<nobr>with-unique-names</nobr>' macro.</p></li>
+
+</ol>
+
+<p>The alternative would be writing:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">print-macro</font> (x y z)
+ (let ((a (gensym)) (b (gensym)) (c (gensym)))
+ `(let ((,a 1) (,b 2) (,c 3))
+ (format t <font color="#880000">"outside: a: ~a b: ~a c: ~a~%"</font> ,x ,y ,z)
+ (format t <font color="#880000">" inside: a: ~a b: ~a c: ~a~%"</font> ,a ,b ,c))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/math.htm b/docsrc/xlisp/xlisp-doc/examples/math.htm
new file mode 100644
index 0000000..b1a6414
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/math.htm
@@ -0,0 +1,824 @@
+<html><head>
+
+<title>Math</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Math</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#number-types">Number Types</a></nobr></li>
+<li><nobr><a href="#integer-limits">Integer Limits</a></nobr></li>
+<li><nobr><a href="#rounding-and-truncation">Rounding and Truncation</a></nobr></li>
+<ul>
+<li><nobr><a href="#cl-round">cl:round</a> - round towards the next integer</nobr></li>
+<li><nobr><a href="#cl-truncate">cl:truncate</a> - truncate towards zero</nobr></li>
+<li><nobr><a href="#cl-ceiling">cl:ceiling</a> - truncate towards positive infinity</nobr></li>
+<li><nobr><a href="#cl-floor">cl:floor</a> - truncate towards negative infinity</nobr></li>
+</ul>
+<li><nobr><li><nobr><a href="#remainder-and-modulus">Remainder and Modulus</a></nobr></li></nobr></li>
+<ul>
+<li><nobr><a href="#cl-rem">cl:rem</a></nobr></li>
+<li><nobr><a href="#cl-mod">cl:mod</a></nobr></li>
+</ul>
+<li><nobr>Power and Roots</nobr></li>
+<ul>
+<li><nobr><a href="#cl-exp">cl:exp</a> - compute 'e' to the power of 'x'</nobr></li>
+<li><nobr><a href="#cl-expt">cl:expt</a> - compute 'x' to the power of 'y'</nobr></li>
+<li><nobr><a href="#cl-log">cl:log</a></nobr></li>
+<li><nobr><a href="#cl-sqrt">cl:sqrt</a></nobr></li>
+</ul>
+</ol>
+
+<hr>
+
+<h2>Number Types</h2>
+
+<hr>
+
+<p>Nyquist/XLISP only knows two types of numers:</p>
+
+<ul>
+<li><nobr><b>fixnum</b> - integer numbers</nobr></li>
+<li><nobr><b>flonum</b> - floating-point numbers</nobr></li>
+</ul>
+
+<p>In Nyquist/XLISP, there are no ratios or complex numbers. Even if the
+math functions on this page are modelled after <nobr>Common Lisp</nobr>, no
+attempt is made to emulate these numbers.</p>
+
+<a name="integer-limits"></a>
+
+<hr>
+
+<h2>Integer Limits</h2>
+
+<hr>
+
+<pre class="example">
+(setq <font color="#AA5500">*most-positive-fixnum*</font> 2147483647)
+(setq <font color="#AA5500">*most-negative-fixnum*</font> -2147483648)
+</pre>
+
+<p><b>Note:</b> these are the limits for <nobr>32-bit</nobr> machines.</p>
+
+<pre class="example">
+(defun <font color="#0000CC">fixnum-bits</font> ()
+ (dolist (bits '(15 31 63) nil)
+ (let ((fixnum (round (expt 2.0 bits))))
+ (and (plusp (1- fixnum))
+ (minusp fixnum)
+ (return (1+ bits))))))
+</pre>
+
+<pre class="example">
+(defun <font color="#0000CC">fixnum-limits</font> ()
+ (if (dolist (bits '(15 31 63) nil)
+ (let* ((negative (round (expt 2.0 bits)))
+ (positive (1- negative)))
+ (when (and (plusp positive)
+ (minusp negative))
+ (setq most-positive-fixnum positive
+ most-negative-fixnum negative)
+ (return t))))
+ most-positive-fixnum
+ (error <font color="#880000">"fixnum limit not found"</font>)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="print-float"></a>
+
+<hr>
+
+<h2>print-float</h2>
+
+<hr>
+
+<p>The '<nobr>print-float</nobr>' function prints
+<nobr>floating-point</nobr> numbers ending in '.0' as
+<nobr>floating-point</nobr> numbers and not as integers:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">print-float</font> (item)
+ (if (not (floatp item))
+ item
+ (let ((string (format nil <font color="#880000">"~a"</font> item)))
+ (if (not (string-search <font color="#880000">"."</font> string))
+ (strcat string <font color="#880000">".0"</font>)
+ string))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="divide-float"></a>
+
+<hr>
+
+<h2>divide-float</h2>
+
+<hr>
+
+<p>An easy way to force a sequence of integers to be divided as floating
+point numbers is to insert the number 1.0 after the first argument in the
+list of arguments to the divider function or to explicitely convert the
+first argument into a floating point number by using the XLISP <a
+href="float.htm">float</a> function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">divide-float</font> (&rest args)
+ (if (null args)
+ (error <font color="#880000">"too few arguments"</font>)
+ (apply #'/ (cons (float (first args)) (rest args)))))
+</pre>
+
+<p>See <a href="apply.htm">apply</a>, <a href="cons.htm">cons</a>,
+<a href="defun.htm">defun</a>, <a href="error.htm">error</a>,
+<a href="first.htm">first</a>, <a href="float.htm">float</a>,
+<a href="if.htm">if</a>, <a href="null.htm">null</a>,
+<a href="rest.htm">rest</a>,
+<a href="lambda-keyword-rest.htm">&amp;rest</a>.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(divide-float 1) =&gt; 1.0
+(divide-float 1 2) =&gt; 0.5
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="rounding-and-truncation"></a>
+
+<hr>
+
+<h2>Rounding and Truncation</h2>
+
+<hr>
+
+<p>The <a href="#cl-round">cl:round</a>,
+<a href="#cl-truncate">cl:truncate</a>,
+<a href="#cl-ceiling">cl:ceiling</a> and
+<a href="#cl-floor">cl:floor</a> functions divide a number by a divisor,
+returning a quotient and a remainder:</p>
+
+<p><div class="box">
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr valign="top">
+ <td align="right"><nobr>(<a href="#cl-round">cl:round</a>&nbsp;</nobr></td>
+ <td><nobr><i>number</i> [<i>divisor</i>])</nobr></td>
+ <td><nobr>&nbsp; &rArr; &nbsp;</nobr></td>
+ <td><nobr><i>quotient</i>, <i>remainder</i></nobr></td>
+</tr>
+<tr valign="top">
+ <td align="right"><nobr>(<a href="#cl-truncate">cl:truncate</a>&nbsp;</nobr></td>
+ <td><nobr><i>number</i> [<i>divisor</i>])</nobr></td>
+ <td><nobr>&nbsp; &rArr; &nbsp;</nobr></td>
+ <td><nobr><i>quotient</i>, <i>remainder</i></nobr></td>
+</tr>
+<tr valign="top">
+ <td align="right"><nobr>(<a href="#cl-ceiling">cl:ceiling</a>&nbsp;</nobr></td>
+ <td><nobr><i>number</i> [<i>divisor</i>])</nobr></td>
+ <td><nobr>&nbsp; &rArr; &nbsp;</nobr></td>
+ <td><nobr><i>quotient</i>, <i>remainder</i></nobr></td>
+</tr>
+<tr valign="top">
+ <td align="right"><nobr>(<a href="#cl-floor">cl:floor</a>&nbsp;</nobr></td>
+ <td><nobr><i>number</i> [<i>divisor</i>])</nobr></td>
+ <td><nobr>&nbsp; &rArr; &nbsp;</nobr></td>
+ <td><nobr><i>quotient</i>, <i>remainder</i></nobr></td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;
+<i>quotient</i> * <i>divisor</i> + <i>remainder</i> = <i>number</i></nobr></p>
+
+</div></p>
+
+<p>The 'quotient' always represents a mathematical integer. <nobr>The
+'remainder'</nobr> is an integer if both 'number' and 'divisor' arguments
+are integers, and a <nobr>floating-point</nobr> number if either the
+'number' or the 'divisor' or both are <nobr>floating-point</nobr>
+numbers.</p>
+
+<p>With Nyquist/XLISP, the 'quotient' is always directly returned by the
+function, while a list:</p>
+
+<pre class="example">
+(<font color="#0000CC">quotient remainder</font>)
+</pre>
+
+<p>is stored in the Nyquist/XLISP
+<a href="../reference/global-rslt.htm">*rslt*</a> variable and the
+<a href="values.htm#cl-global-multiple-values">cl:*multiple-values*</a> is
+set to <a href="../reference/t.htm">&nbsp;T&nbsp;</a> to signal that
+<a href="values.htm">Multiple Values</a> are returned.</p>
+
+Examples:
+
+<pre class="example">
+(cl:round 3.5) =&gt; 4 <font color="#008844">; *rslt* = ( 4 -0.5)</font>
+(cl:truncate 3.5) =&gt; 3 <font color="#008844">; *rslt* = ( 3 0.5)</font>
+(cl:ceiling 3.5) =&gt; 4 <font color="#008844">; *rslt* = ( 4 -0.5)</font>
+(cl:floor 3.5) =&gt; 3 <font color="#008844">; *rslt* = ( 3 0.5)</font>
+
+(cl:round -3.5) =&gt; -4 <font color="#008844">; *rslt* = (-4 0.5)</font>
+(cl:truncate -3.5) =&gt; -3 <font color="#008844">; *rslt* = (-3 -0.5)</font>
+(cl:ceiling -3.5) =&gt; -3 <font color="#008844">; *rslt* = (-3 -0.5)</font>
+(cl:floor -3.5) =&gt; -4 <font color="#008844">; *rslt* = (-4 0.5)</font>
+</pre>
+
+Force integer division:
+
+<pre class="example">
+(cl:truncate 3.0 2.0) =&gt; 1
+(/ (truncate 3.0) (truncate 2.0)) =&gt; 1
+(/ 3 4) =&gt; 1
+</pre>
+
+<p><div class="box">
+
+<p><b>Implementation Notes</b></p>
+
+<pre class="example">
+(defun <font color="#0000CC">name</font> (number &amp;optional (divisor (if (<font color="#AA0000">integerp</font> number) 1 1.0)))
+ ... )
+</pre>
+
+<p>The <a href="../reference/integerp.htm">integerp</a> test in the
+parameter list signals an error if the 'number' argument is not a number,
+also the <nobr><a href="../reference/division.htm">&nbsp;/&nbsp;</a>
+[division]</nobr> function signals errors if the 'divisor' argument is zero
+or not a number, so we do not explicitely need to test the arguments.</p>
+
+<p>The <nobr><a href="#cl-ceiling">cl:ceiling</a></nobr> and <nobr><a
+href="#cl-floor">cl:floor</a></nobr> functions test if 'number' is an
+integer multiple of 'divisor' by comparing the results of an integer
+division and a <nobr>floating-point</nobr> division:</p>
+
+<pre class="example">
+(let ((<font color="#AA0000">i-quotient</font> (/ (truncate number) (truncate divisor)))
+ (<font color="#AA0000">f-quotient</font> (/ (float number) divisor)))
+ (if (= <font color="#AA0000">i-quotient f-quotient</font>)
+ ...
+</pre>
+
+<p>I'm not sure if this really catches all cases <nobr>[e.g.
+regarding</nobr> floating point precision], but have found no problems so
+far.</p>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-round"></a>
+
+<hr>
+
+<h2>cl:round</h2>
+
+<hr>
+
+<p>The '<nobr>cl:round</nobr>' function truncates towards the next
+integer:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>round</b> <i>number </i> [<i>divisor</i>])</dt>
+<dd><i>number</i> - an integer or <nobr>floating-point</nobr> number<br>
+<i>divisor</i> - an integer or <nobr>floating-point</nobr> number, except zero<br>
+<table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td valign="top"><nobr>returns</nobr></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the result of runding the result of <i>number</i> divided by <i>divisor</i></td>
+</tr>
+<tr>
+ <td></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the remainder of the round operation</td>
+</tr>
+</tbody></table></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:round</font> (number &amp;optional (divisor
+ (if (integerp number) 1 1.0)
+ divisor-p))
+ (let* ((x (/ (float number) divisor))
+ (quotient (cond ((and (not divisor-p) (integerp number)) number)
+ ((= number divisor) 1)
+ ((plusp x) (truncate (+ x 0.5)))
+ ((= (- x 0.5) (truncate (- x 0.5)))
+ (if (minusp x)
+ (1- (truncate x))
+ (truncate x)))
+ (t (truncate (- x 0.5))))))
+ (setq <font color="#AA5500">*rslt*</font> (list quotient (- number (* quotient divisor)))
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ quotient))
+</pre>
+
+<p>The '<nobr>cl:round</nobr>' function computes a quotient that has been rounded to the
+nearest mathematical integer. <nobr>If the</nobr> mathematical quotient is
+exactly halfway between two integers, [that is, it has the form
+<nobr>'integer+1/2']</nobr>, then the quotient has been rounded to the even
+[divisible <nobr>by two]</nobr> integer. <nobr>See
+<a href="#rounding-and-truncation">Rounding and Truncation</a></nobr>
+above for more details.</p>
+
+<pre class="example">
+(round 3.5) =&gt; 4
+(round -3.5) =&gt; -3
+
+(cl:round 3.5) =&gt; 4 <font color="#008844">; *rslt* = ( 4 -0.5)</font>
+(cl:round -3.5) =&gt; -4 <font color="#008844">; *rslt* = (-4 0.5)</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-truncate"></a>
+
+<hr>
+
+<h2>cl:truncate</h2>
+
+<hr>
+
+<p>The '<nobr>cl:truncate</nobr>' function truncates towards zero:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>truncate</b> <i>number </i> [<i>divisor</i>])</dt>
+<dd><i>number</i> - an integer or <nobr>floating-point</nobr> number<br>
+<i>divisor</i> - an integer or <nobr>floating-point</nobr> number, except zero<br>
+<table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td valign="top"><nobr>returns</nobr></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the result of truncating the result of <i>number</i> divided by <i>divisor</i></td>
+</tr>
+<tr>
+ <td></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the remainder of the truncate operation</td>
+</tr>
+</tbody></table></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:truncate</font> (number &amp;optional (divisor (if (integerp number) 1 1.0)))
+ (let ((quotient (truncate (/ (float number) divisor))))
+ (setq <font color="#AA5500">*rslt*</font> (list quotient (- number (* quotient divisor)))
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ quotient))
+</pre>
+
+<p>The '<nobr>cl:truncate</nobr>' function computes a quotient that has been
+truncated towards zero. That is, the quotient represents the mathematical
+integer of the same sign as the mathematical quotient, and that has the
+greatest integral magnitude not greater than that of the mathematical
+quotient. <nobr>See
+<a href="#rounding-and-truncation">Rounding and Truncation</a></nobr>
+above for more details.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-ceiling"></a>
+
+<hr>
+
+<h2>cl:ceiling</h2>
+
+<hr>
+
+<p>The '<nobr>cl:ceiling</nobr>' function truncates towards positive
+infinity:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>ceiling</b> <i>number </i> [<i>divisor</i>])</dt>
+<dd><i>number</i> - an integer or <nobr>floating-point</nobr> number<br>
+<i>divisor</i> - an integer or <nobr>floating-point</nobr> number, except zero<br>
+<table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td valign="top"><nobr>returns</nobr></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the result of truncating the result of <i>number</i> divided by <i>divisor</i></td>
+</tr>
+<tr>
+ <td></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the remainder of the truncate operation</td>
+</tr>
+</tbody></table></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:ceiling</font> (number &amp;optional (divisor
+ (if (integerp number) 1 1.0)
+ divisor-p))
+ (let ((quotient
+ (cond ((and (not divisor-p) (integerp number)) number)
+ ((= number divisor) 1)
+ (t (let ((i-quotient (/ (truncate number) (truncate divisor)))
+ (f-quotient (/ (float number) divisor)))
+ (if (or (= i-quotient f-quotient) <font color="#008844">; integer result</font>
+ (not (plusp f-quotient)))
+ (truncate f-quotient)
+ (1+ (truncate f-quotient))))))))
+ (setq <font color="#AA5500">*rslt*</font> (list quotient (- number (* quotient divisor)))
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ quotient))
+</pre>
+
+<p>The '<nobr>cl:ceiling</nobr>' function computes a quotient that has been
+truncated toward positive infinity. That is, the quotient represents the
+smallest mathematical integer that is not smaller than the mathematical
+result. <nobr>See
+<a href="#rounding-and-truncation">Rounding and Truncation</a></nobr>
+above for more details.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-floor"></a>
+
+<hr>
+
+<h2>cl:floor</h2>
+
+<hr>
+
+<p>The '<nobr>cl:floor</nobr>' function truncates towards negative infinity:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>floor</b> <i>number </i> [<i>divisor</i>])</dt>
+<dd><i>number</i> - an integer or <nobr>floating-point</nobr> number<br>
+<i>divisor</i> - an integer or <nobr>floating-point</nobr> number, except zero<br>
+<table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td valign="top"><nobr>returns</nobr></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the result of truncating the result of <i>number</i> divided by <i>divisor</i></td>
+</tr>
+<tr>
+ <td></td>
+ <td valign="top"><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the remainder of the truncate operation</td>
+</tr>
+</tbody></table></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:floor</font> (number &amp;optional (divisor
+ (if (integerp number) 1 1.0)
+ divisor-p))
+ (let ((quotient
+ (cond ((and (not divisor-p) (integerp number)) number)
+ ((= number divisor) 1)
+ (t (let ((i-quotient (/ (truncate number) (truncate divisor)))
+ (f-quotient (/ (float number) divisor)))
+ (if (or (= i-quotient f-quotient) <font color="#008844">; integer result</font>
+ (not (minusp f-quotient)))
+ (truncate f-quotient)
+ (1- (truncate f-quotient))))))))
+ (setq <font color="#AA5500">*rslt*</font> (list quotient (- number (* quotient divisor)))
+ <font color="#AA5500">cl:*multiple-values*</font> t)
+ quotient))
+</pre>
+
+<p>The <nobr>'cl:floor</nobr>' function computes a quotient that has been
+truncated toward negative infinity. That is, the quotient represents the
+largest mathematical integer that is not larger than the mathematical
+quotient. <nobr>See
+<a href="#rounding-and-truncation">Rounding and Truncation</a></nobr>
+above for more details.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="remainder-and-modulus"></a>
+
+<hr>
+
+<h2>Remainder and Modulus</h2>
+
+<hr>
+
+<p>The <a href="#cl-mod">cl:mod</a> and <a href="#cl-rem">cl:rem</a>
+function are generalizations of the modulus and remainder functions.
+<nobr>The <a href="#cl-mod">cl:mod</a></nobr> function performs the
+<a href="#cl-floor">cl:floor</a> operation on its arguments and returns the
+remainder of the <a href="#cl-floor">cl:floor</a> operation.
+<nobr>The <a href="#cl-rem">cl:rem</a></nobr> function performs the
+<a href="cl-truncate">cl:truncate</a> operation on its arguments and returns
+the remainder of the <a href="cl-truncate">cl:truncate</a> operation.
+<nobr>The <a href="#cl-mod">cl:mod</a></nobr> and
+<a href="#cl-rem">cl:rem</a> functions are the modulus and remainder
+functions when the 'number' and 'divisor' arguments both are integers.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-rem"></a>
+
+<hr>
+
+<h2>cl:rem</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>rem</b> <i>number divisor</i>)</dt>
+<dd><i>number</i> - an integer or floating-point number<br>
+<i>divisor</i> - an integer or floating-point number<br>
+returns - the remainder of a <a href="cl-truncate">cl:truncate</a> operation</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:rem</font> (number divisor)
+ (if (= (abs number) (abs divisor))
+ (if (and (integerp number) (integerp divisor)) 0 0.0)
+ (let ((quotient (truncate (/ (float number) divisor))))
+ (- number (* quotient divisor)))))
+</pre>
+
+<p>The '<nobr>cl:rem</nobr>' function performs the
+<a href="cl-truncate">cl:truncate</a> operation on its arguments and returns
+the remainder of the <a href="cl-truncate">cl:truncate</a> operation.
+<nobr>The result</nobr> is either zero or an integer or
+<nobr>floating-point</nobr> number with the same sign as the 'number'
+argument. <nobr>If both</nobr> arguments are integer numbers, the
+'<nobr>cl:rem</nobr>' function is equal to the mathematical remainder
+function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-mod"></a>
+
+<hr>
+
+<h2>cl:mod</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>mod</b> <i>number divisor</i>)</dt>
+<dd><i>number</i> - an integer or floating-point number<br>
+<i>divisor</i> - an integer or floating-point number<br>
+returns - the remainder of a <a href="#cl-floor">cl:floor</a> operation</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:mod</font> (number divisor)
+ (if (= (abs number) (abs divisor))
+ (if (and (integerp number) (integerp divisor)) 0 0.0)
+ (let* ((i-quotient (/ (truncate number) (truncate divisor)))
+ (f-quotient (/ (float number) divisor))
+ (quotient (if (or (= i-quotient f-quotient) <font color="#008844">; integer result</font>
+ (not (minusp f-quotient)))
+ (truncate f-quotient)
+ (1- (truncate f-quotient)))))
+ (- number (* quotient divisor)))))
+</pre>
+
+<p>The '<nobr>cl:mod</nobr>' function performs the
+<a href="#cl-floor">cl:floor</a> operation on its arguments and returns the
+remainder of the <a href="#cl-floor">cl:floor</a> operation. <nobr>The
+result</nobr> is either zero or an integer or <nobr>floating-point</nobr>
+number with the same sign as the 'divisor' argument. <nobr>If both</nobr>
+arguments are integer numbers, the '<nobr>cl:rem</nobr>' function is equal
+to the mathematical modulus function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-exp"></a>
+
+<hr>
+
+<h2>cl:exp</h2>
+
+<hr>
+
+<p>The '<nobr>cl:exp</nobr>' function does the same as the Nyquist/XLISP
+<a href="../reference/exp.htm">exp</a> function, but it also accepts
+integer numbers as argument:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>exp</b> <i>power</i>)</dt>
+<dd><i>power</i> - an integer or floating-point number<br>
+returns - the result of <nobr>'e' [2.7128]</nobr> to the power of <i>power</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:exp</font> (x)
+ (exp (float x)))
+</pre>
+
+<p>The '<nobr>cl:exp</nobr>' function computes <nobr>'e' [2.7128]</nobr>
+raised to the specified 'power'. <nobr>The result</nobr> is always a
+<nobr>floating-point</nobr> number.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-expt"></a>
+
+<hr>
+
+<h2>cl:expt</h2>
+
+<hr>
+
+<p>The '<nobr>cl:expt</nobr>' function computes the result of 'x' to the
+power <nobr>of 'y'</nobr>:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>expt</b> <i>base power</i>)</dt>
+<dd><i>base</i> - the base<br>
+<i>power</i> - the exponent<br>
+returns - the result of <i>base</i> to the power of <i>power</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:expt</font> (x y)
+ (let ((power (expt (float x) y)))
+ (if (and (integerp x) (integerp y))
+ (round power)
+ power)))
+</pre>
+
+<p>See <a href="../reference/and.htm">and</a>,
+<a href="../reference/defun.htm">defun</a>,
+<a href="../reference/expt.htm">expt</a>,
+<a href="../reference/float.htm">float</a>,
+<nobr><a href="../reference/if.htm">&nbsp;if&nbsp;</a></nobr>,
+<a href="../reference/integerp.htm">integerp</a>,
+<a href="../reference/let.htm">let</a>,
+<a href="../reference/power.htm">power</a>,
+<a href="../reference/round.htm">round</a>.</p>
+
+<p>The '<nobr>cl:expt</nobr>' function accepts integer and floating point
+numbers as arguments. <nobr>If both</nobr> arguments are integer numbers,
+the result will be an integer number, <nobr>if one</nobr> or both arguments
+are <nobr>floating-point</nobr> numbers, the result will be a
+<nobr>floating-point</nobr> number. <nobr>In contrast</nobr> to the
+Nyquist/XLISP <a href="../reference/expt.htm">expt</a> function, the
+'<nobr>cl:expt</nobr>' function specifies exactly two arguments.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-log"></a>
+
+<hr>
+
+<h2>cl:log</h2>
+
+<hr>
+
+<p>The '<nobr>cl:log</nobr>' function does the same as the Nyquist/XLISP
+<a href="../reference/log.htm">log</a> function, but also accepts
+integer numbers and has an optional 'base' argument:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>log</b> <i>number</i> [<i>base</i>])</dt>
+<dd><i>number</i> - an integer or floating-point number<br>
+<i>base</i> - an integer or floating-point number<br>
+returns - the the logarithm of <i>number</i> in base <i>base</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:log</font> (number &amp;optional base)
+ (if base
+ (if (zerop base)
+ 0.0
+ (/ (log (float number)) (log (float base))))
+ (log (float number))))
+</pre>
+
+<p>The '<nobr>cl:log</nobr>' function returns the logarithm of 'number' in
+base 'base'. <nobr>If 'base'</nobr> is not supplied its value <nobr>is
+'e'</nobr>, the base of the natural logarithms. <nobr>If the</nobr> 'base'
+argument is zero, then 'cl:log' returns zero. <nobr>The result</nobr> is
+always a <nobr>floating-point</nobr> number.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-sqrt"></a>
+
+<hr>
+
+<h2>cl:sqrt</h2>
+
+<hr>
+
+<p>The '<nobr>cl:sqrt</nobr>' function does the same as the Nyquist/XLISP
+<a href="../reference/sqrt.htm">sqrt</a> function, but it also accepts
+integer numbers as argument:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(cl:<b>sqrt</b> <i>number</i>)</dt>
+<dd><i>number</i> - an integer or floating-point number<br>
+returns - the square root of <i>number</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:sqrt</font> (x)
+ (sqrt (float x)))
+</pre>
+
+<p><nobr>The result</nobr> is always a <nobr>floating-point</nobr>
+number.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/octal.htm b/docsrc/xlisp/xlisp-doc/examples/octal.htm
new file mode 100644
index 0000000..f72ba4d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/octal.htm
@@ -0,0 +1,148 @@
+<html><head>
+
+<title>Octal Integer Numbers</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Octal Integer Numbers</h1>
+
+<hr>
+
+<p>XLISP provides the <a href="../manual/xlisp.htm#octal">#o</a>
+<nobr>read-macro</nobr> for octal numbers:</p>
+
+<pre class="example">
+#o0 =&gt; 0 #o10 =&gt; 8 #o20 =&gt; 16
+#o1 =&gt; 1 #o11 =&gt; 9 #o21 =&gt; 17
+#o2 =&gt; 2 #o12 =&gt; 10 #o22 =&gt; 18
+#o3 =&gt; 3 #o13 =&gt; 11 #o23 =&gt; 19
+#o4 =&gt; 4 #o14 =&gt; 12 #o24 =&gt; 20
+#o5 =&gt; 5 #o15 =&gt; 13 #o25 =&gt; 21
+#o6 =&gt; 6 #o16 =&gt; 14 #o26 =&gt; 22
+#o7 =&gt; 7 #o17 =&gt; 15 #o27 =&gt; 23
+</pre>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>oct-string</b> <i>integer</i> [<i>all</i>])</dt>
+<dd><i>integer</i> - an integer expression<br>
+<i>all</i> - a boolean expression<br>
+returns - the <i>integer</i> in octal form as string</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">oct-string</font> (integer &amp;optional all)
+ (if (integerp integer)
+ (let ((fmt (if all
+ (or (dolist (bits '(16 32 64 128) nil)
+ (let ((fixnum (round (expt 2.0 (1- bits)))))
+ (and (plusp (1- fixnum))
+ (minusp fixnum)
+ (return (format nil <font color="#880000">"%.~ao"</font>
+ (1+ (/ bits 3)))))))
+ (error <font color="#880000">"integer limit not found"</font>))
+ <font color="#880000">"%o"</font>)))
+ (progv '(<font color="#AA5500">*integer-format*</font>) (list fmt)
+ (format nil <font color="#880000">"~a"</font> integer)))
+ (error <font color="#880000">"not an integer"</font> integer)))
+</pre>
+
+<p>The '<nobr>oct-string</nobr>' function converts the 'integer' argument
+into octal form and returns is as a string. <nobr>If the</nobr>
+optional 'all' argument is not given or
+<a href="../reference/nil.htm">NIL</a>, leading zeros are not included in
+the string. <nobr>If the</nobr> optional 'all' argument is
+<nobr>non-<a href="../reference/nil.htm">NIL</a></nobr>, all digits of the
+internal representation of the 'integer' argument, including leading zeros,
+are contained in the string. This is useful for debugging integer overflow
+and <nobr>bit-wise</nobr> functions.</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>oct</b> <i>integer</i> [<i>all</i>])</dt>
+<dd><i>integer</i> - an integer expression<br>
+<i>all</i> - a boolean expression<br>
+prints - the <i>integer</i> in octal form<br>
+returns - the <i>integer</i> argument</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">oct</font> (integer &amp;optional all)
+ (if (integerp integer)
+ (format t <font color="#880000">"#o~a~%"</font> (oct-string integer all))
+ (format t <font color="#880000">";; not an integer~%"</font>))
+ integer)
+</pre>
+
+<p>The 'oct' function prints the 'integer' argument in octal form on
+the screen. Together with the
+<a href="../manual/xlisp.htm#octal">#o</a> <nobr>read-macro</nobr>
+this can be used for interactive octal computations.</p>
+
+<pre class="example">
+&gt; (oct 12345678)
+#o57060516
+12345678
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/posix-chars.htm b/docsrc/xlisp/xlisp-doc/examples/posix-chars.htm
new file mode 100644
index 0000000..9e6c4e0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/posix-chars.htm
@@ -0,0 +1,459 @@
+<html><head>
+
+<title>Characters and Strings</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>POSIX Character Classes</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#posix-character-classes">POSIX Character Classes</a></nobr></li>
+<li><nobr><a href="#internal-functions">Internal Functions</a></nobr></li>
+<li><nobr><a href="#user-functions">User Functions</a></nobr></li>
+</ol>
+
+<hr>
+
+<h2>POSIX Character Classes</h2>
+
+<hr>
+
+<p>The functions on this page implement tests for the standard POSIX
+character classes, where all functions return the tested character if the
+test succeeds, or <a href="../reference/nil.htm">NIL</a></nobr> if the test
+fails.</p>
+
+<p>The <nobr>built-in</nobr> XLISP character test functions
+<a href="../reference/upper-case-p.htm">upper-case-p</a>,
+<a href="../reference/lower-case-p.htm">lower-case-p</a>,
+<a href="../reference/both-case-p.htm">both-case-p</a>,
+<a href="../reference/alphanumericp.htm">alphanumericp</a>, return the
+boolean values <a href="../reference/t.htm">&nbsp;T&nbsp;</a> or
+<a href="../reference/nil.htm">NIL</a> instead of the tested character,
+while <a href="../reference/digit-char-p.htm">digit-char-p</a> returns an
+integer <nobr>or <a href="../reference/nil.htm">NIL</a></nobr>, what is
+handy if you want to convert arbitrary Lisp symbols into numbers without
+producing an error, but all this is impractical for writing a string
+parser.</p>
+
+<p><nobr>The <a href="#internal-functions">Internal Functions</a></nobr>
+do not check if the argument is a character and therefore are faster than
+the <nobr><a href="#user-functions">User Functions</a></nobr>. Also note
+that XLISP is limited to ASCII characters, so there is no way to find out if
+an unicode character is upper- or lowercase if the character code is greater
+than <nobr>ASCII 127</nobr>.</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td colspan="3"><nobr><b>POSIX</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><b>Internal</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><b>User Function</b></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>alnum</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-alnum-p">char:alnum-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#alnum-character-p">alnum-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>alphanumeric = [a-z], [A-Z], [0-9]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>alpha</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-alpha-p">char:alpha-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#alpha-character-p">alpha-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>alphabetic = [a-z], [A-Z]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>blank</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-blank-p">char:blank-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#blank-character-p">blank-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>space and horizontal-tab</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>cntrl</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-cntrl-p">char:cntrl-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#cntrl-character-p">cntrl-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>code-chars 0-31 and 127</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>digit</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-digit-p">char:digit-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#digit-character-p">digit-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>decimal = [0-9]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>graph</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-graph-p">char:graph-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#graph-character-p">graph-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>graphical = alnum + punct</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>lower</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-lower-p">char:lower-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#lower-character-p">lower-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>lowercase = [a-z]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>print</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-print-p">char:print-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#print-character-p">print-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>printable = alnum + punct + space</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>punct</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-punct-p">char:punct-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#punct-character-p">punct-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>punctuation marks</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>space</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-space-p">char:space-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#space-character-p">space-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>characters producing whitespace</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>upper</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-upper-p">char:upper-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#upper-character-p">upper-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>uppercase = [A-Z]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>xdigit</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-xdigit-p">char:xdigit-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#xdigit-character-p">xdigit-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>hexadecimal = [0-9], [a-f], [A-F]</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>The main difference is:</p>
+
+<pre class="example">
+&gt; (char:alnum-p 'nonsense-value)
+<font color="#AA0000">error: bad argument type - NONSENSE-VALUE</font>
+
+&gt; (alnum-character-p 'nonsense-value)
+NIL
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="internal-functions"></a>
+
+<hr>
+
+<h2>Internal Functions</h2>
+
+<hr>
+
+<p>The internal functions are based on <nobr>built-in</nobr> XLISP
+functions, there are no external dependencies.</p>
+
+<a name="char-alnum-p"></a>
+
+<pre class="example">
+<font color="#008844">;; alphanumeric characters = a-z, A-z, 0-9</font>
+
+(defun <font color="#0000CC">char:alnum-p</font> (char)
+ (and (alphanumericp char)
+ char))
+<a name="char-alpha-p"></a>
+<font color="#008844">;; alphabetic characters = a-z, A-Z</font>
+
+(defun <font color="#0000CC">char:alpha-p</font> (char)
+ (and (both-char-p char)
+ char))
+<a name="char-blank-p"></a>
+<font color="#008844">;; blanks = space and horizontal-tab</font>
+
+(defun <font color="#0000CC">char:blank-p</font> (char)
+ (and (or (char= char #\Space)
+ (char= char #\Tab))
+ char))
+<a name="char-cntrl-p"></a>
+<font color="#008844">;; control characters = code-chars 0-31 and 127</font>
+
+(defun <font color="#0000CC">char:cntrl-p</font> (char)
+ (let ((code (char-code char)))
+ (and (or (&lt;= 0 code 31)
+ (= code 127))
+ char)))
+<a name="char-digit-p"></a>
+<font color="#008844">;; decimal digits = 0-9</font>
+
+(defun <font color="#0000CC">char:digit-p</font> (char)
+ (and (digit-char-p char)
+ char))
+<a name="char-graph-p"></a>
+<font color="#008844">;; graphical characters = alnum + punct</font>
+
+(defun <font color="#0000CC">char:graph-p</font> (char)
+ (and (&lt;= 33 (char-code char) 126)
+ char))
+<a name="char-lower-p"></a>
+<font color="#008844">;; lowercase characters = a-z</font>
+
+(defun <font color="#0000CC">char:lower-p</font> (char)
+ (and (lower-case-p char)
+ char))
+<a name="char-print-p"></a>
+<font color="#008844">;; printable characters = alnum + punct + space</font>
+
+(defun <font color="#0000CC">char:print-p</font> (char)
+ (and (&lt;= 32 (char-code char) 126)
+ char))
+<a name="char-punct-p"></a>
+<font color="#008844">;; punctuation marks</font>
+
+(defun <font color="#0000CC">char:punct-p</font> (char)
+ (let ((code (char-code char)))
+ (and (or (&lt;= 33 code 47) <font color="#008844">; ! " # $ % &amp; ' ( ) * + , - . /</font>
+ (&lt;= 58 code 64) <font color="#008844">; : ; &lt; = &gt; ? @</font>
+ (&lt;= 91 code 96) <font color="#008844">; [ \ ] ^ _ `</font>
+ (&lt;= 123 code 126)) <font color="#008844">; { | } ~</font>
+ char)))
+<a name="char-space-p"></a>
+<font color="#008844">;; characters producing whitespace</font>
+<font color="#008844">;;</font>
+<font color="#008844">;; 9 = horizontal tab 10 = line feed 11 = vertical tab</font>
+<font color="#008844">;; 12 = form feed 13 = carriage return 32 = space</font>
+
+(defun <font color="#0000CC">char:space-p</font> (char)
+ (and (member (char-code char) '(9 10 11 12 13 32))
+ char))
+<a name="char-upper-p"></a>
+<font color="#008844">;; uppercase characters = A-Z</font>
+
+(defun <font color="#0000CC">char:upper-p</font> (char)
+ (and (upper-case-p char)
+ char))
+<a name="char-xdigit-p"></a>
+<font color="#008844">;; hexadecimal digits = 0-9, a-f, A-F</font>
+
+(defun <font color="#0000CC">char:xdigit-p</font> (char)
+ (and (or (digit-char-p char)
+ (let ((code (char-code char)))
+ (or (&lt;= 65 code 70) <font color="#008844">; A-Z</font>
+ (&lt;= 97 code 102)))) <font color="#008844">; a-z</font>
+ char))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="user-functions"></a>
+
+<hr>
+
+<h2>User Functions</h2>
+
+<hr>
+
+<p>The user functions are based on the
+<nobr><a href="#internal-functions">Internal Functions</a></nobr> above.
+There are no other dependencies.</p>
+
+<a name="alnum-character-p"></a>
+
+<pre class="example">
+<font color="#008844">;; alphanumeric characters = a-z, A-z, 0-9</font>
+
+(defun <font color="#0000CC">alnum-character-p</font> (char)
+ (and (characterp char)
+ (char:alnum-p char)))
+<a name="alpha-character-p"></a>
+<font color="#008844">;; alphabetic characters = a-z, A-Z</font>
+
+(defun <font color="#0000CC">alpha-character-p</font> (char)
+ (and (characterp char)
+ (char:alpha-p char)))
+<a name="blank-character-p"></a>
+<font color="#008844">;; blanks = space and horizontal-tab</font>
+
+(defun <font color="#0000CC">blank-character-p</font> (char)
+ (and (characterp char)
+ (char:blank-p char)))
+<a name="cntrl-character-p"></a>
+<font color="#008844">;; control characters = code-chars 0-31 and 127</font>
+
+(defun <font color="#0000CC">cntrl-character-p</font> (char)
+ (and (characterp char)
+ (char:cntrl-p char)))
+<a name="digit-character-p"></a>
+<font color="#008844">;; decimal digits = 0-9</font>
+
+(defun <font color="#0000CC">digit-character-p</font> (char)
+ (and (characterp char)
+ (char:digit-p char)))
+<a name="graph-character-p"></a>
+<font color="#008844">;; graphical characters = alnum + punct</font>
+
+(defun <font color="#0000CC">graph-character-p</font> (char)
+ (and (characterp char)
+ (char:graph-p char)))
+<a name="lower-character-p"></a>
+<font color="#008844">;; lowercase characters = a-z</font>
+
+(defun <font color="#0000CC">lower-character-p</font> (char)
+ (and (characterp char)
+ (char:lower-p char)))
+<a name="print-character-p"></a>
+<font color="#008844">;; printable characters = alnum + punct + space</font>
+
+(defun <font color="#0000CC">print-character-p</font> (char)
+ (and (characterp char)
+ (char:print-p char)))
+<a name="punct-character-p"></a>
+<font color="#008844">;; punctuation marks</font>
+
+(defun <font color="#0000CC">punct-character-p</font> (char)
+ (and (characterp char)
+ (char:punct-p char)))
+<a name="space-character-p"></a>
+<font color="#008844">;; characters producing whitespace</font>
+
+(defun <font color="#0000CC">space-character-p</font> (char)
+ (and (characterp char)
+ (char:space-p char)))
+<a name="upper-character-p"></a>
+<font color="#008844">;; uppercase characters = A-Z</font>
+
+(defun <font color="#0000CC">upper-character-p</font> (char)
+ (and (characterp char)
+ (char:upper-p char)))
+<a name="xdigit-character-p"></a>
+<font color="#008844">;; hexadecimal digits = 0-9, a-f, A-F</font>
+
+(defun <font color="#0000CC">xdigit-character-p</font> (char)
+ (and (characterp char)
+ (char:xdigit-p char)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/predicates.htm b/docsrc/xlisp/xlisp-doc/examples/predicates.htm
new file mode 100644
index 0000000..5846f2d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/predicates.htm
@@ -0,0 +1,526 @@
+<html><head>
+
+<title>Predicates</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Predicates and Comparison</h1>
+
+<hr>
+
+<p>Lisp has extensive support for <nobr>run-time</nobr> tests.</p>
+
+<p><nobr><b>Generalized Lisp Functions</b> - slower than the build-ins, but no errors</nobr></p>
+
+<ol>
+<li><nobr><a href="#built-in-xlisp-functions">Built-in XLISP Functions</a></nobr></li>
+<li><nobr>Generalized Comparison - one or more arguments</nobr></li>
+<ul>
+<li><nobr><a href="#equalp">equalp</a> - compares expressions with 'equality' functions.</nobr></li>
+</ul>
+<li><nobr>Symbol Predicates - one argument</nobr></li>
+<ul>
+<li><nobr><a href="#variablep">variablep</a> - is this a symbol with a variable value bound to it?</nobr></li>
+<li><nobr><a href="#functionp">functionp</a> - is this a function or a symbol with a function value bound to it?</nobr></li>
+<li><nobr><a href="#specialp">specialp</a> - is this a special form or a symbol with a special form bound to it?</nobr></li>
+<li><nobr><a href="#subrp">macrop</a> - is this a Lisp macro or a symbol with a Lisp macro bound to it?</nobr></li>
+</ul>
+<li><nobr>Function Predicates - one argument</nobr></li>
+<ul>
+<li><nobr><a href="#subrp">subrp</a> - is this a build-in function?</nobr></li>
+<li><nobr><a href="#fsubrp">fsubrp</a> - is this a build-in special form?</nobr></li>
+<li><nobr><a href="#closurep">closurep</a> - is this a user-defined function?</nobr></li>
+</ul>
+<li><nobr>Character Predicates - one argument</nobr></li>
+<ul>
+<li><nobr><a href="strings.htm#posix">POSIX Character Classes</a></nobr></li>
+</ul>
+</ol>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="built-in-xlisp-functions"></a>
+
+<hr>
+
+<h2>Built-in XLISP Functions</h2>
+
+<hr>
+
+<ol>
+<li><nobr><b>Boolean Predicates</b> - one argument [all types]</nobr></li>
+<ul>
+<li><nobr><a href="../reference/not.htm">not</a> - does this expression evaluate to false?</nobr></li>
+</ul>
+<li><nobr><b>Generalized Comparison</b> - two arguments [all types]</nobr></li>
+<ul>
+<li><nobr><a href="../reference/eq.htm">eq</a> - are the expressions identical?</nobr></li>
+<li><nobr><a href="../reference/eql.htm">eql</a> - are the expressions identical or equal numbers?</nobr></li>
+<li><nobr><a href="../reference/equal.htm">equal</a> - do the <a href="../reference/print.htm">print</a>ed expressions look the same?</nobr></li>
+</ul>
+<li><nobr><b>Type Predicates</b> - one argument [all types]</nobr></li>
+<ul>
+<li><nobr><a href="../reference/atom.htm">atom</a> - is this an atom?</nobr></li>
+<li><nobr><a href="../reference/symbolp.htm">symbolp</a> - is this a symbol?</nobr></li>
+<ul>
+<li><nobr><b>Symbol Predicates</b> - one argument [error if not a symbol]</nobr></li>
+<ul>
+<li><nobr><a href="../reference/boundp.htm">boundp</a> - has the symbol a variable value?</nobr></li>
+<li><nobr><a href="../reference/fboundp.htm">fboundp</a> - has the symbol a function value?</nobr></li>
+</ul>
+</ul>
+<li><nobr><a href="../reference/numberp.htm">numberp</a> - is this a number?</nobr></li>
+<ul>
+<li><nobr><b>Number Predicates</b> - one argument [error if not a number]</nobr></li>
+<ul>
+<li><nobr><a href="../reference/plusp.htm">plusp</a> - is the number positive?</nobr></li>
+<li><nobr><a href="../reference/minusp.htm">minusp</a> - is the number negative?</nobr></li>
+<li><nobr><a href="../reference/zerop.htm">zerop</a> - is the number equal to zero?</nobr></li>
+<li><nobr><a href="../reference/integerp.htm">integerp</a> - is the number an integer?</nobr></li>
+<ul>
+<li><nobr><b>Integer Predicates</b> - one argument [error if not an integer]</nobr></li>
+<ul>
+<li><nobr><a href="../reference/evenp.htm">evenp</a> - is the integer even?</nobr></li>
+<li><nobr><a href="../reference/oddp.htm">oddp</a> - is the integer odd?</nobr></li>
+</ul>
+</ul>
+<li><nobr><a href="../reference/floatp.htm">floatp</a> - is the number a floating-point number?</nobr></li>
+</ul>
+<li><nobr><b>Numerical Comparison</b> - one or more arguments [error if not numbers only]</nobr></li>
+<ul>
+<li><nobr><a href="../reference/number-lessp.htm">&nbsp;&lt;&nbsp;</a> - true if all numbers are monotonically increasing</nobr></li>
+<li><nobr><a href="../reference/number-not-greaterp.htm">&nbsp;&lt;=&nbsp;</a> - true if all numbers are monotonically nondecreasing</nobr></li>
+<li><nobr><a href="../reference/number-equal.htm">&nbsp;=&nbsp;</a> - true if all all numbers are the same value</nobr></li>
+<li><nobr><a href="../reference/number-not-equal.htm">&nbsp;/=&nbsp;</a> - true if no two numbers have the same value</nobr></li>
+<li><nobr><a href="../reference/number-not-lessp.htm">&nbsp;&gt;=&nbsp;</a> - true if all numbers are monotonically nonincreasing</nobr></li>
+<li><nobr><a href="../reference/number-greaterp.htm">&nbsp;&gt;&nbsp;</a> - true if all numbers are monotonically decreasing</nobr></li>
+</ul>
+</ul>
+<li><nobr><a href="../reference/null.htm">null</a> - is this an empty list?</nobr></li>
+<li><nobr><a href="../reference/consp.htm">consp</a> - is it a non-empty list?</nobr></li>
+<li><nobr><a href="../reference/listp.htm">listp</a> - is this a list?</nobr></li>
+<ul>
+<li><nobr><b>List Predicates</b> - one argument [error if not a list]</nobr></li>
+<ul>
+<li><nobr><a href="../reference/endp.htm">endp</a> - is this the end of a list?</nobr></li>
+</ul>
+</ul>
+<li><nobr><a href="../reference/stringp.htm">stringp</a> - is this a string?</nobr></li>
+<ul>
+<li><nobr><b>String Comparison</b> - one or more arguments [error if not strings only]</nobr></li>
+<ul>
+<li><nobr>Case Sensitive</nobr></li>
+<ul>
+<li><nobr><a href="../reference/string-lessp-s.htm">string&lt;</a> - test for less than in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/string-not-greaterp-s.htm">string&lt;=</a> - test for less than or equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/string-equal-s.htm">string=</a> - test for equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/string-not-equal-s.htm">string/=</a> - test for not equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/string-not-lessp-s.htm">string&gt;=</a> - test for greater than or equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/string-greaterp-s.htm">string&gt;</a> - test for greater than in ASCII ordering</nobr></li>
+</ul>
+<li><nobr>Case Insensitive</nobr></li>
+<ul>
+<li><nobr><a href="../reference/string-lessp-i.htm">string-lessp</a> - is this less than in ASCII ordering ?</nobr></li>
+<li><nobr><a href="../reference/string-not-greaterp-i.htm">string-not-greaterp</a> - is this not greater than in ASCII ordering ?</nobr></li>
+<li><nobr><a href="../reference/string-equal-i.htm">string-equal</a> - is this equal in ASCII ordering ?</nobr></li>
+<li><nobr><a href="../reference/string-not-equal-i.htm">string-not-equal</a> - is this not equal in ASCII ordering ?</nobr></li>
+<li><nobr><a href="../reference/string-not-lessp-i.htm">string-not-lessp</a> - is this not less than in ASCII ordering ?</nobr></li>
+<li><nobr><a href="../reference/string-greaterp-i.htm">string-greaterp</a> - is this greater than in ASCII ordering ?</nobr></li>
+</ul>
+<li><nobr>See also <a href="strings.htm#unicode">Unicode</a> examples.</nobr></li>
+</ul>
+</ul>
+<li><nobr><a href="../reference/characterp.htm">characterp</a> - is this a character?</nobr></li>
+<ul>
+<li><nobr><b>Character Predicates</b> - one argument [error if not a character]</nobr></li>
+<ul>
+<li><nobr><a href="../reference/upper-case-p.htm">upper-case-p</a> - is this an upper case character?</nobr></li>
+<li><nobr><a href="../reference/lower-case-p.htm">lower-case-p</a> - is this a lower case character?</nobr></li>
+<li><nobr><a href="../reference/both-case-p.htm">both-case-p</a> - is this an alphabetic [either case] character?</nobr></li>
+<li><nobr><a href="../reference/digit-char-p.htm">digit-char-p</a> - is this a digit character?</nobr></li>
+<li><nobr><a href="../reference/alphanumericp.htm">alphanumericp</a> - is this an alphabetic or a digit character?</nobr></li>
+<li><nobr>See also <a href="strings.htm#posix">POSIX Character Classes</a>.</nobr></li>
+</ul>
+<li><nobr><b>Character Comparison</b> - one or more arguments [error if not characters only]</nobr></li>
+<ul>
+<li><nobr>Case Sensitive</nobr></li>
+<ul>
+<li><nobr><a href="../reference/char-lessp-s.htm">char&lt;</a> - test for less than in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/char-not-greaterp-s.htm">char&lt;=</a> - test for less than or equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/char-equal-s.htm">char=</a> - test for equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/char-not-equal-s.htm">char/=</a> - test for not equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/char-not-lessp-s.htm">char&gt;=</a> - test for greater than or equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/char-greaterp-s.htm">char&gt;</a> - test for greater than in ASCII ordering</nobr></li>
+</ul>
+<li><nobr>Case Insensitive</nobr></li>
+<ul>
+<li><nobr><a href="../reference/char-lessp-i.htm">char-lessp</a> - is this less than in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/char-not-greaterp-i.htm">char-not-greaterp</a> - is this not greater than in ASCII ordering ?</nobr></li>
+<li><nobr><a href="../reference/char-equal-i.htm">char-equal</a> - is this equal in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/char-not-equal-i.htm">char-not-equal</a> - is this not equal in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/char-not-lessp-i.htm">char-not-lessp</a> - is this not less than in ASCII ordering ?</nobr></li>
+<li><nobr><a href="../reference/char-greaterp-i.htm">char-greaterp</a> - is this greater than in ASCII ordering?</nobr></li>
+</ul>
+<li><nobr>See also <a href="strings.htm#unicode">Unicode</a> examples.</nobr></li>
+</ul>
+</ul>
+<li><nobr><a href="../reference/arrayp.htm">arrayp</a> - is this an array?</nobr></li>
+<li><nobr><a href="../reference/streamp.htm">streamp</a> - is this a stream?</nobr></li>
+<li><nobr><a href="../reference/objectp.htm">objectp</a> - is this an object?</nobr></li>
+<li><nobr>filep - is this a file?</nobr></li>
+<li><nobr>soundp - is this a sound?</nobr></li>
+</ul>
+</ol>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="equalp"></a>
+
+<hr>
+
+<h2>equalp</h2>
+
+<hr>
+
+<p>Two expressions are 'equalp':</p>
+
+<ul>
+
+<li><p>If two numbers <nobr>are
+<a href="../reference/number-equal.htm">&nbsp;=&nbsp;</a></nobr>
+numerical equal.</p></li>
+
+<li><p>If two characters are
+<nobr><a href="../reference/char-equal.htm">char-equal</a></nobr>.</p></li>
+
+<li><p>If two strings are <nobr><a
+href="../reference/string-equal.htm">string-equal</a></nobr>.</p></li>
+
+<li><p>If the two <a href="../reference/car.htm">car</a>s in conses are
+'equalp' and the two <a href="../reference/cdr.htm">cdr</a>s in conses
+are 'equalp'.</p></li>
+
+<li><p>If two arrays have the same number of elements and dimensions, and
+the corresponding elements in all dimensions are 'equalp'.</p></li>
+
+</ul>
+
+<pre class="example">
+(defun <font color="#0000CC">equalp</font> (expr-1 expr-2)
+ (or (equal expr-1 expr-2)
+ (and (numberp expr-1) (numberp expr-2) (= expr-1 expr-2))
+ (let ((type (type-of expr-1)))
+ (when (eq type (type-of expr-2))
+ (case type
+ (character (char-equal expr-1 expr-2))
+ (string (string-equal expr-1 expr-2))
+ (cons (do ((x (first expr-1)
+ (if (consp expr-1) (first expr-1) expr-1))
+ (y (first expr-2)
+ (if (consp expr-2) (first expr-2) expr-2)))
+ ((or (null expr-1)
+ (null expr-2)
+ (not (equalp x y)))
+ (and (null expr-1)
+ (null expr-2)))
+ (setq expr-1 (and (consp expr-1) (rest expr-1))
+ expr-2 (and (consp expr-2) (rest expr-2)))))
+ (array (let ((end (length expr-1)))
+ (when (eql end (length expr-2))
+ (dotimes (index end t)
+ (and (not (equalp (aref expr-1 index)
+ (aref expr-2 index)))
+ (return nil)))))))))))
+</pre>
+
+<p><b>cons:</b> I used <a href="../reference/do.htm">do</a> instead of
+recursion because XLISP has only two kilobytes stack size. <nobr>The
+(<a href="../reference/consp.htm">consp</a> <i>expr</i>)</nobr> tests are
+necessary because in a dotted list the last
+<a href="../reference/rest.htm">rest</a> element is not a cons.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(equalp 1 1.0) =&gt; T
+(equalp #\a #\A) =&gt; T
+(equalp "Abc" "aBc") =&gt; T
+(equalp '(1 #\a "Abc") '(1.0 #\A "aBc")) =&gt; T
+(equalp #(1 #\a "Abc") #(1.0 #\A "aBc")) =&gt; T
+</pre>
+
+<p>Nested expressions only match if the nesting matches:</p>
+
+<pre class="example">
+(equalp '(1 <font color="#AA0000">(</font>2 3<font color="#AA0000">)</font>) '(1.0 <font color="#AA0000">(</font>2.0 3.0<font color="#AA0000">)</font>) =&gt; T
+(equalp '(1 <font color="#AA0000">(</font>2 3<font color="#AA0000">)</font>) '(<font color="#AA0000">(</font>1.0 2.0<font color="#AA0000">)</font> 3.0) =&gt; NIL
+(equalp '(<font color="#AA0000">(</font>1 2<font color="#AA0000">)</font> 3) '(<font color="#AA0000">(</font>1.0 2.0<font color="#AA0000">)</font> 3.0) =&gt; T
+(equalp '(<font color="#AA0000">(</font>1 2<font color="#AA0000">)</font> 3) '(1.0 <font color="#AA0000">(</font>2.0 3.0<font color="#AA0000">)</font>) =&gt; NIL
+</pre>
+
+<p>A character does not match a string with the same character:</p>
+
+<pre class="example">
+(equalp #\a "a") =&gt; NIL
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="variablep"></a>
+
+<hr>
+
+<h2>variablep</h2>
+
+<hr>
+
+<p>The 'variablep' macro tests if a Lisp expression evaluates to a symbol
+with a valid variable value bound to it in the current global or lexical
+environment:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">variablep</font> (expr)
+ `(and (symbolp ,expr)
+ (valuep ,expr)))
+</pre>
+
+<p>Depends on <a href="environment.htm#valuep">valuep</a>, see
+<a href="../reference/and.htm">and</a>,
+<a href="../reference/defmacro.htm">defmacro</a>,
+<a href="../reference/symbolp.htm">symbolp</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="functionp"></a>
+
+<hr>
+
+<h2>functionp</h2>
+
+<hr>
+
+<p>The 'functionp' macro tests if a Lisp expression eveluates to a function
+or a symbol with a valid function value bound to it in the current global or
+lexical environment:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">functionp</font> (expr)
+ `(case (type-of ,expr)
+ (closure (eq 'lambda (car (get-lambda-expression ,expr))))
+ (subr t)
+ (symbol (and (or (lfboundp ,expr) (fboundp ,expr))
+ (functionp (function ,(if (consp expr) (cadr expr) expr)))))
+ (t nil)))
+</pre>
+
+<p>Depends on <a href="environment.htm#lfboundp">lfboundp</a>, see
+<a href="../reference/and.htm">and</a>,
+<a href="../reference/caar.htm">cadr</a>,
+<a href="../reference/car.htm">car</a>,
+<a href="../reference/case.htm">case</a>,
+<a href="../manual/xlisp.htm#data-types">closure</a>,
+<a href="../reference/defmacro.htm">defmacro</a>,
+<a href="../reference/eq.htm">eq</a>,
+<a href="../reference/fboundp.htm">fboundp</a>,
+<a href="../reference/function.htm">function</a>,
+<nobr><a href="../reference/get-lambda-expression.htm">get-lambda-expression</a></nobr>,
+<a href="../reference/lambda.htm">lambda</a>,
+<a href="../reference/nil.htm">nil</a>,
+<a href="../reference/or.htm">or</a>,
+<a href="../manual/xlisp.htm#data-types">subr</a>,
+<a href="../manual/xlisp.htm#data-types">symbol</a>,
+<nobr><a href="../reference/t.htm">&nbsp;t&nbsp;</a></nobr>,
+<nobr><a href="../reference/type-of.htm">type-of</a></nobr>.</p>
+
+<p>The awkward <nobr>(function ,(if (consp expr) (cadr expr) expr))</nobr>
+construct is necessary because the
+<a href="../reference/function.htm">function</a> special form needs a
+<nobr>pre-evaluated</nobr> argument, what must be
+done at <nobr>macro-expansion</nobr> time, so an additional
+<nobr><a href="../reference/consp.htm">consp</a></nobr> test is
+needed if the 'expr' argument is a list at all, otherwise
+<a href="../reference/cadr.htm">cadr</a> will produce an error.</p>
+
+Examples:
+
+<pre class="example">
+(functionp #'car) =&gt; T <font color="#008844">; subr = built-in function</font>
+(functionp 'car) =&gt; T <font color="#008844">; symbol with a function value</font>
+
+(functionp #'and) =&gt; NIL <font color="#008844">; fsubr = built-in special form</font>
+(functionp "and") =&gt; NIL <font color="#008844">; string</font>
+
+(defun a () nil) =&gt; A <font color="#008844">; closure = user-defined function</font>
+(functionp #'a) =&gt; T <font color="#008844">; closure</font>
+(functionp 'a) =&gt; T <font color="#008844">; symbol with a function value</font>
+
+(setq b #'a) =&gt; A <font color="#008844">; function A stored in variable B</font>
+(fboundp 'b) =&gt; NIL <font color="#008844">; no function B found</font>
+(fboundp b) =&gt; T <font color="#008844">; variable B evaluates to function A</font>
+
+(functionp #'(lambda () nil)) =&gt; T <font color="#008844">; closure</font>
+(functionp '(lambda () nil)) =&gt; NIL <font color="#008844">; list</font>
+(functionp (lambda () nil)) =&gt; T <font color="#008844">; closure</font>
+
+(functionp #'functionp) =&gt; NIL <font color="#008844">; macro</font>
+
+(let ((x nil)) <font color="#008844">; lexical variable</font>
+ (functionp x))
+=&gt; NIL
+
+(flet ((y () nil)) <font color="#008844">; lexical closure</font>
+ (functionp y))
+=&gt; T
+
+(labels ((z () nil)) <font color="#008844">; lexical closure</font>
+ (functionp z))
+=&gt; T
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="specialp"></a>
+
+<hr>
+
+<h2>specialp</h2>
+
+<hr>
+
+<pre class="example">
+(defmacro <font color="#0000CC">specialp</font> (expr)
+ `(case (type-of ,expr)
+ (fsubr t)
+ (symbol (and (or (lfboundp ,expr) (fboundp ,expr))
+ (functionp (function ,(if (consp expr) (cadr expr) expr)))))
+ (t nil)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="macrop"></a>
+
+<hr>
+
+<h2>macrop</h2>
+
+<hr>
+
+<pre class="example">
+(defmacro <font color="#0000CC">macrop</font> (expr)
+ `(case (type-of ,expr)
+ (closure (eq 'macro (car (get-lambda-expression ,expr))))
+ (symbol (and (or (lfboundp ,expr) (fboundp ,expr))
+ (macrop (function ,(if (consp expr) (cadr expr) expr)))))
+ (t nil)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="subrp"></a>
+
+<hr>
+
+<h2>subrp</h2>
+
+<hr>
+
+<p>The 'subrp' function returns T if the symbol is a build-in function.</p>
+
+<pre class="example">
+(defun <font color="#0000CC">subrp</font> (symbol)
+ (eq 'subr (type-of symbol)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="fsubrp"></a>
+
+<hr>
+
+<h2>fsubrp</h2>
+
+<hr>
+
+<p>The 'fsubrp' function returns T if the symbol is a build-in special
+function.</p>
+
+<pre class="example">
+(defun <font color="#0000CC">fsubrp</font> (symbol)
+ (eq 'fsubr (type-of symbol)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="closurep"></a>
+
+<hr>
+
+<h2>closurep</h2>
+
+<hr>
+
+<p>The 'closurep' function returns T if the symbol is a user-defined
+function.</p>
+
+<pre class="example">
+(defun <font color="#0000CC">closurep</font> (symbol)
+ (eq 'closure (type-of symbol)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
+
diff --git a/docsrc/xlisp/xlisp-doc/examples/reader.htm b/docsrc/xlisp/xlisp-doc/examples/reader.htm
new file mode 100644
index 0000000..8321c48
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/reader.htm
@@ -0,0 +1,311 @@
+<html><head>
+
+<title>XLISP reader</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Reader</h1>
+
+<hr>
+
+
+
+<hr>
+
+<h2>read-from-string</h2>
+
+<hr>
+
+<pre class="example">
+(defun <font color="#0000CC">read-from-string</font> (string)
+ (read (make-string-input-stream string)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="global-readtable"></a>
+
+<hr>
+
+<h2>*readtable*</h2>
+
+<hr>
+
+<p>The <a href="../reference/global-readtable.htm">*readtable*</a> system
+variable contains the reader table array. <nobr>The table</nobr> is
+<nobr>128 entries</nobr> <nobr>[0..127]</nobr> for each of the
+<nobr>7-bit</nobr> ASCII characters that XLISP
+<nobr>can <a href="../reference/read.htm">read</a></nobr>.</p>
+
+<ul>
+<li><nobr><a href="../reference/read.htm">read</a> - function to read a lisp expression</nobr></li>
+<li><nobr><a href="../reference/global-readtable.htm">*readtable*</a> - system variable, holding the readtable</nobr></li>
+<ul>
+<li><nobr><a href="../reference/nil.htm">NIL</a> - invalid character</nobr></li>
+<li><nobr><a href="../reference/keyword-constituent.htm">:constituent</a> - symbol constituent</nobr></li>
+<li><nobr><a href="../reference/keyword-sescape.htm">:sescape</a> - whitespace character</nobr></li>
+<li><nobr><a href="../reference/keyword-mescape.htm">:mescape</a> - multiple escape character</nobr></li>
+<li><nobr><a href="../reference/keyword-white-space.htm">:white-space</a> - single escape character</nobr></li>
+<li><nobr><a href="../reference/keyword-tmacro.htm">:tmacro</a> - terminating readmacro</nobr></li>
+<li><nobr><a href="../reference/keyword-nmacro.htm">:nmacro</a> - non-terminating readmacro</nobr></li>
+</ul>
+</ul>
+
+<p>See also the
+<nobr><a href="../manual/xlisp.htm#lexical-conventions">Lexical Conventions</a></nobr>
+and <a href="../manual/xlisp.htm#the-readtable">Readtable</a> sections in the
+<nobr>XLISP 2.0</nobr> manual.</p>
+
+<a name="print-readtable"></a>
+
+<hr>
+
+<h2>print-readtable</h2>
+
+<hr>
+
+<pre class="example">
+(defun <font color="#0000CC">print-readtable</font> ()
+ (dotimes (index 128)
+ (format t <font color="#880000">"ASCII-~a ~a = ~a~%"</font>
+ (cond ((&lt;= 0 index 9) (format nil "00~a" index))
+ ((&lt;= 10 index 99) (format nil "0~a" index))
+ (t index))
+ (if (&lt; 31 index 127)
+ (code-char index)
+ (case index
+ (0 "[null] ")
+ (1 "[start of heading] ")
+ (2 "[start of text] ")
+ (3 "[end of text] ")
+ (4 "[end of transmission] ")
+ (5 "[enquiry] ")
+ (6 "[acknowledge] ")
+ (7 "[terminal bell] ")
+ (8 "[backspace] ")
+ (9 "[horizontal tab] ")
+ (10 "[line feed] ")
+ (11 "[vertical tab] ")
+ (12 "[form feed] ")
+ (13 "[carriage return] ")
+ (14 "[shift out] ")
+ (15 "[shift in] ")
+ (16 "[data link escape] ")
+ (17 "[device control 1, xon] ")
+ (18 "[device control 2] ")
+ (19 "[device control 3, xoff]")
+ (20 "[device control 4] ")
+ (21 "[negative acknowledge] ")
+ (22 "[synchronous idle] ")
+ (23 "[end transmission block]")
+ (24 "[cancel line] ")
+ (25 "[end of medium] ")
+ (26 "[substitute] ")
+ (27 "[escape] ")
+ (28 "[file separator] ")
+ (29 "[group separator] ")
+ (30 "[record separator] ")
+ (31 "[unit separator] ")
+ (127 "[delete]")))
+ (aref <font color="#AA5500">*readtable*</font> index))))
+</pre>
+
+<hr>
+
+<h2>get-macro-character</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>get-macro-character</b> <i>char</i>)</dt>
+<dd><i>char</i> - a character<br>
+returns - the code associated with the
+<a href="../reference/global-readtable.htm">*readtable*</a> entry or
+<a href="../reference/nil.htm">NIL</a></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">get-macro-character</font> (char)
+ (if (consp (aref <font color="#AA5500">*readtable*</font> (char-code char)))
+ (cdr (aref <font color="#AA5500">*readtable*</font> (char-int char)))
+ nil))
+</pre>
+
+<p> The '<nobr>get-macro-character</nobr>' function returns the code that
+will be executed when the specified character 'char' is encountered by the
+XLISP reader.</p>
+
+<p>The 'get-macro-character' function will return a
+<a href="../reference/nil.htm">NIL</a> value if the table entry is
+<nobr><a href="../reference/nil.htm">NIL</a> ,</nobr>
+<nobr><a href="../reference/keyword-constituent.htm">:constituent</a> ,</nobr>
+<nobr><a href="../reference/keyword-sescape.htm">:sescape</a> ,</nobr>
+<a href="../reference/keyword-mescape.htm">:mescape</a> or
+<a href="../reference/keyword-white-space.htm">:white-space</a>. If the table entry is
+<a href="../reference/keyword-tmacro.htm">:tmacro</a> or
+<nobr><a href="../reference/keyword-nmacro.htm">:nmacro</a> ,</nobr> then the code
+associated with the entry is returned.
+<a href="../reference/keyword-tmacro.htm">:tmacro</a> is used for a terminating
+read-macro. <a href="../reference/keyword-nmacro.htm">:nmacro</a> is used for a
+non-terminating read-macro. 'get-macro-character' does not differentiate
+whether the code returned is a
+<a href="../reference/keyword-tmacro.htm">:tmacro</a> or an
+<a href="../reference/keyword-nmacro.htm">:nmacro</a>.</p>
+
+<p>The function returned may be a built-in read-macro function or a user
+defined <a href="../reference/lambda.htm">lambda</a> expression. The function
+takes two parameters, an input stream specification, and an integer that is
+the character value. The function should return
+<a href="../reference/nil.htm">NIL</a> if the character is 'white-space' or a
+value <a href="../reference/cons.htm">cons</a>ed with
+<a href="../reference/nil.htm">NIL</a> to return the value.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(get-macro-character #\() =&gt; #&lt;Subr-(null): #...&gt;</font>
+(get-macro-character #\#) =&gt; #&lt;Subr-(null): #...&gt;</font>
+(get-macro-character #\Space) =&gt; NIL</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<a name="set-macro-character"></a>
+
+<hr>
+
+<h2>set-macro-character</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>set-macro-character</b> <i>char function</i> [<i>termination-flag</i>])</dt>
+<dd><i>char</i> - a character expression<br>
+<i>function</i> - a function definition<br>
+<i>termination-flag</i> - an expression, <a href="../reference/nil.htm">NIL</a> or
+non-<a href="../reference/nil.htm">NIL</a><br>
+returns - always returns <a href="../reference/t.htm">&nbsp;T&nbsp;</a></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">set-macro-character</font> (char function &optional terminate-p)
+ (setf (aref <font color="#AA5500">*readtable*</font> (char-code char))
+ (cons (if terminate-p :tmacro :nmacro) function))
+ t)
+</pre>
+
+<p>The '<nobr>set-macro-character</nobr>' function installs the code that
+will be executed when the specified character 'char' is encountered by the
+XLISP reader.</p>
+
+<p>The 'set-macro-character' function only allows you to put in a
+terminating read-macro function <a href="../reference/keyword-tmacro.htm">:tmacro</a> or
+a non-terminating read-macro-function
+<a href="../reference/keyword-nmacro.htm">:nmacro</a>. If the 'termflag' is present and
+non-<nobr><a href="../reference/nil.htm">NIL</a> ,</nobr> then the 'function'
+will be put in <a href="../reference/global-readtable.htm">*readtable*</a> as a
+<a href="../reference/keyword-tmacro.htm">:tmacro</a> entry. If 'termflag' is not present
+or <nobr><a href="../reference/nil.htm">NIL</a> ,</nobr> then 'function' will
+be put in <a href="../reference/global-readtable.htm">*readtable*</a> as a
+<a href="../reference/keyword-nmacro.htm">:nmacro</a> entry. The 'function' can be a
+built-in read-macro function or a user defined
+<a href="../reference/defun.htm">defun</a> symbol or a
+<a href="../reference/lambda.htm">lambda</a> expression.</p>
+
+<p>The 'function' takes two parameters, an input stream specification, and
+an integer that is the character value. The 'function' should return
+<a href="../reference/nil.htm">NIL</a> if the character is 'white-space' or a
+value <a href="../reference/cons.htm">cons</a>ed with
+<a href="../reference/nil.htm">NIL</a> to return the value. The function
+'set-macro-character' always returns
+<a href="../reference/t.htm">&nbsp;T&nbsp;</a>.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+&gt; (print "hi") % comment
+"hi"
+"hi"
+<font color="#AA0000">error: unbound variable - %</font> <font color="#008844">; % is interpreted as a variable</font>
+
+&gt; (setq readtable-backup *readtable*)
+#( ... very-long-value ... )
+
+&gt; (set-macro-character #\% (get-macro-character #\;) t)
+T
+
+&gt; (print "hi") % comment
+"hi" <font color="#008844">; no error because</font>
+"hi" <font color="#008844">; % is now a comment character</font>
+
+&gt; (setq *readtable* readtable-backup)
+#( ... very-long-value ... )
+</pre>
+
+<p><b>Important:</b> before manipulating the XLISP
+<a href="../reference/global-readtable.htm">*readtable*</a> it's always a
+good idea to store the original contents in some other variable.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/sequences.htm b/docsrc/xlisp/xlisp-doc/examples/sequences.htm
new file mode 100644
index 0000000..fb69a4b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/sequences.htm
@@ -0,0 +1,563 @@
+<html><head>
+
+<title>Sequences</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Sequences</h1>
+
+<hr>
+
+<p>Sequences are <a href="lists.htm">Lists</a>,
+<a href="strings.htm">Strings</a>,
+<nobr>or <a href="arrays.htm">Arrays</a></nobr>.</p>
+
+<ul>
+<li><nobr><a href="#sequencep">sequencep</a> - test if a Lisp object is a sequence</nobr></li>
+<li><nobr><a href="#length">length</a> - the length of a sequence</nobr></li>
+<li><nobr><a href="#identity">identity</a> - do nothing, just return the value</nobr></li>
+<li><nobr><a href="#cl-subseq">cl:subseq</a> - subsequences of lists, strings, or arrays</nobr></li>
+<li><nobr>Properties of elements in sequences:</nobr></li>
+<ul>
+<li><nobr>find</nobr></li>
+<li><nobr>count</nobr></li>
+<li><nobr>position</nobr></li>
+</ul>
+<li><nobr>Predicates for testing sequences:</nobr></li>
+<ul>
+<li><nobr>every</nobr></li>
+<li><nobr>some</nobr></li>
+<li><nobr>notevery</nobr></li>
+<li><nobr>notany </nobr></li>
+</ul>
+<li><nobr>Functions to modify sequences:</nobr></li>
+<ul>
+<li><nobr>map</nobr></li>
+<li><nobr>flatten</nobr></li>
+</ul>
+</ul>
+
+<a name="sequencep"></a>
+
+<hr>
+
+<h2>sequencep</h2>
+
+<hr>
+
+<p>The following example demonstrates how a XLISP expression can be tested
+for being a sequence:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">sequencep</font> (x)
+ (and (lboundp 'x) <font color="#008844">; not *unbound*</font>
+ (or (and (listp x) <font color="#008844">; a list or NIL</font>
+ (consp (last x))) <font color="#008844">; but not a dotted list</font>
+ (stringp x) <font color="#008844">; or a string</font>
+ (arrayp x)))) <font color="#008844">; or an array</font>
+</pre>
+
+<p>Depends on <a href="environment.htm#lboundp">lboundp</a>,
+see also <a href="../reference/and.htm">and</a>,
+<a href="../reference/arrayp.htm">arrayp</a>,
+<a href="../reference/consp.htm">consp</a>,
+<a href="../reference/defun.htm">defun</a>,
+<a href="../reference/last.htm">last</a>,
+<a href="../reference/listp.htm">listp</a>,
+<a href="../reference/or.htm">or</a>,
+<a href="../reference/stringp.htm">stringp</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="length"></a>
+
+<hr>
+
+<h2>length</h2>
+
+<hr>
+
+<p>XLISP already knows sequences, even if the manual doesn't explicitely
+<nobr>tell you:</nobr></p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<a href="../reference/length.htm">length</a> <i>expr</i>)</dt>
+<dd><i>expr</i> - expression, evaluating to a list, string, or array<br>
+returns - the length of the list, string, or array</dd>
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="identity"></a>
+
+<hr>
+
+<h2>identity</h2>
+
+<hr>
+
+<pre class="example">
+(defun <font color="#0000CC">identity</font> (x)
+ x)
+</pre>
+
+<p>The 'identity' function is handy if a mapping function needs a '<nobr>do
+nothing</nobr>, just return the value' function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-subseq"></a>
+
+<hr>
+
+<h2>cl:subseq</h2>
+
+<hr>
+
+<p>XLISP already has a <a href="../reference/subseq.htm">subseq</a> function
+returning a subsequence of a string:</p>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<a href="../reference/subseq.htm">subseq</a> <i>string start</i> [<i>end</i>])</nobr></dt>
+<dd><i>string</i> - a string expression<br>
+<i>start</i> - the position of the first element, an integer<br>
+<i>end</i> - the position following last element, defaults to the end of the sequence<br>
+returns - the substring between <i>start</i> and <i>end</i></dd>
+</dl>
+
+</div></p>
+
+<p>The 'cl:subseq' function works like
+<a href="../reference/subseq.htm">subseq</a>, but returns subsequences of
+lists, strings, and arrays:</p>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(cl:<b>subseq</b> <i>sequence start</i> [<i>end</i>])</nobr></dt>
+<dd><i>sequence</i> - a list, string, or array<br>
+<i>start</i> - the position of the first element, an integer<br>
+<i>end</i> - the position following last element, defaults to the end of the sequence<br>
+returns - the subsequence in the same type as <i>sequence</i></dd>
+</dl>
+
+</div></p>
+
+<p>The 'cl:subseq' function creates a sequence that is a copy of the
+subsequence of 'sequence' bounded by 'start' and 'end'. 'cl:subseq' always
+allocates a new sequence for a result, it never shares storage with an old
+sequence. <nobr>The resulting</nobr> subsequence is always of the same type
+as the input sequence.</p>
+
+<pre class="example">
+(defun <font color="#0000CC">cl:subseq</font> (sequence start &amp;optional (end nil end-p))
+ (let ((type (type-of sequence)))
+ (if (not (member type '(nil cons string array)))
+ (error <font color="#880000">"not a sequence"</font> sequence)
+ (let* ((length (length sequence))
+ (end (or end length)))
+ (cond ((or (&gt; start length) (minusp start))
+ (error <font color="#880000">"start index out of bounds"</font> start))
+ ((and end-p (or (&gt; end length) (minusp end)))
+ (error <font color="#880000">"end index out of bounds"</font> end))
+ ((&gt; start end)
+ (error (format nil <font color="#880000">"bad range start ~a end ~a"</font> start end)))
+ (t (case type
+ (nil nil)
+ (cons (if (not (consp (last sequence)))
+ <font color="#008844">;; a dotted list is not a sequence</font>
+ (error <font color="#880000">"not a proper sequence"</font> sequence)
+ (if (&gt;= start end)
+ nil
+ (nthcdr start
+ (if end-p
+ (reverse
+ (nthcdr (- length end)
+ (reverse sequence)))
+ sequence)))))
+ (string (subseq sequence start end))
+ (array (if (&gt;= start end)
+ (make-array 0)
+ (let ((new-array (make-array (- end start))))
+ (do ((n-index 0 (1+ n-index))
+ (s-index start (1+ s-index)))
+ ((&gt;= s-index end))
+ (setf (aref new-array n-index)
+ (aref sequence s-index)))
+ new-array))))))))))
+</pre>
+
+<p>Examples:</p>
+
+<pre class="example">
+(cl:subseq "012345" 2) =&gt; "2345"
+(cl:subseq "012345" 3 5) =&gt; "34"
+
+(cl:subseq '(0 1 2 3 4 5) 2) =&gt; (2 3 4 5)
+(cl:subseq '(0 1 2 3 4 5) 3 5) =&gt; (3 4)
+
+(cl:subseq #(0 1 2 3 4 5) 2) =&gt; #(2 3 4 5)
+(cl:subseq #(0 1 2 3 4 5) 3 5) =&gt; #(3 4)
+</pre>
+
+<p>In XLISP, neither <a href="../reference/subseq.htm">subseq</a> nor
+'cl:subseq' can be used as arguments to
+<a href="../reference/setf.htm">setf</a>.
+<nobr>See <a href="#cl-replace">cl:replace</a></nobr> below how to replace
+subsequences.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="cl-replace"></a>
+
+<hr>
+
+<h2>cl:replace</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(cl:<b>replace</b> <i>sequence1 sequence2</i> &amp;key <i>start1 end1 start2 end2</i>)</nobr></dt>
+<dd><i>sequenceN</i> - a list, string, or array<br>
+<i>startN</i> - the position of the first element in <i>sequenceN</i>, an integer<br>
+<i>endN</i> - the position following last element in <i>sequenceN</i>, defaults to the end of <i>sequenceN</i><br>
+returns - the subsequence in the same type as <i>sequence</i></dd>
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<h2>map</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+
+<dt><nobr><b>map</b> <i>result-type function</i> <i>sequence-1</i> [<i>sequence-2</i> ...]</nobr></dt>
+<dd><i>result-type</i> - list, string, or array<br>
+<i>function</i> - a function, applied to each element of each sequenceN<br>
+<i>sequenceN</i> - a list, string, or array<br>
+returns - a sequence where each element is the result of applying the function to each element of each sequenceN</dd>
+</dl>
+
+<dl>
+
+</div></p>
+
+<p>The 'sequence:string' function can handle lists and arrays containing not
+only characters but also strings, because XLISP Unicode characters are
+represented as strings.</p>
+
+<pre class="example">
+(defun <font color="#0000CC">sequence:string</font> (sequence)
+ (if (stringp sequence)
+ sequence
+ (let ((result <font color="#880000">""</font>))
+ (flet ((strcat-element (element)
+ (let ((string (cond ((stringp element) element)
+ ((characterp element) (string element))
+ (t (error <font color="#880000">"not a character or string"</font>
+ element)))))
+ (setq result (strcat result string)))))
+ (case (type-of sequence)
+ (array (let ((end (length sequence)))
+ (dotimes (index end)
+ (if (eq (aref sequence index) '*unbound*)
+ (error <font color="#880000">"not a character or string"</font> '*unbound*)
+ (strcat-element (aref sequence index))))))
+ (cons (let ((end (length sequence)))
+ (if (not (consp (last sequence)))
+ (error <font color="#880000">"not a proper sequence"</font> sequence)
+ (dotimes (index end)
+ (if (eq (nth index sequence) '*unbound*)
+ (error <font color="#880000">"not a character or string"</font> '*unbound*)
+ (strcat-element (nth index sequence)))))))
+ (nil nil)
+ (t (error <font color="#880000">"not a sequence"</font> sequence)))
+ result))))
+
+(defun <font color="#0000CC">list-to-string</font> (list)
+ (let ((string ""))
+ (dolist (element list string)
+ (setq string (strcat string (if (consp element)
+ (list-to-string element)
+ (format nil "~a" element)))))))
+</pre>
+
+<pre class="example">
+(defun <font color="#0000CC">sequence:vector</font> (sequence)
+ (if (not (boundp 'sequence))
+ (error <font color="#880000">"not a sequence"</font> '*unbound*)
+ (let ((type (type-of sequence)))
+ (if (not (member type '(array cons nil string)))
+ (error <font color="#880000">"not a sequence"</font> sequence)
+ (let* ((end (length sequence))
+ (result (make-array end)))
+ (unless (zerop end)
+ (case type
+ (array (dotimes (index end)
+ (setf (aref result index)
+ (if (eq (aref sequence index) '*unbound*)
+ '*unbound*
+ (aref sequence index)))))
+ (cons (if (not (consp (last sequence)))
+ (error <font color="#880000">"not a proper sequence"</font> sequence)
+ (dotimes (index end)
+ (setf (aref result index)
+ (if (eq (nth index sequence) '*unbound*)
+ '*unbound*
+ (nth index sequence))))))
+ (string (dotimes (index end)
+ (setf (aref result index)
+ (char sequence index))))))
+ result)))))
+</pre>
+
+<pre class="example">
+(defun <font color="#0000CC">sequence:array</font> (sequence)
+ (let ((type (type-of sequence)))
+ (if (not (member type '(array cons nil string)))
+ (error <font color="#880000">"not a sequence"</font> sequence)
+ (let* ((end (length sequence))
+ (result (make-array end)))
+ (if (zerop end)
+ result
+ (labels ((array-element (element index)
+ (setf (aref result index)
+ (if (or (consp element) (arrayp element))
+ (sequence:array element)
+ element))))
+ (case type
+ (array (dotimes (index end)
+ (if (eq (aref sequence index) '*unbound*)
+ (setf (aref result index) '*unbound*)
+ (array-element (aref sequence index) index))))
+ (cons (if (not (consp (last sequence)))
+ (error <font color="#880000">"not a proper sequence"</font> sequence)
+ (dotimes (index end)
+ (if (eq (nth index sequence) '*unbound*)
+ (setf (aref result index) '*unbound*)
+ (array-element (nth index sequence) index)))))
+ (string (dotimes (index end)
+ (setf (aref result index)
+ (char sequence index)))))
+ result))))))
+
+
+(defun <font color="#0000CC">list-to-array</font> (list)
+ (let* ((end (length list))
+ (array (make-array end)))
+ (dotimes (index end array)
+ (let ((element (nth index list)))
+ (setf (aref array index) (if (consp element)
+ (list-to-array element)
+ element))))))
+
+(defun <font color="#0000CC">list-from-input</font> (input)
+ (let (result)
+ (dolist (element input) <font color="#008844">; input is always a list</font>
+ (format t ";; ~s ~s~%" element (type-of element))
+ (case (type-of element)
+ (nil (push element result))
+ (cons (if (consp (last element))
+ (push element result)
+ (error <font color="#880000">"not a proper list"</font> element)))
+ (array (let (local (end (length element)))
+ (dotimes (index end)
+ (push (aref element index) local))
+ (push (reverse local) result)))
+ (string (let (local (end (length element)))
+ (dotimes (index end)
+ (push (char element index) local))
+ (push (reverse local) result)))
+ (t (error <font color="#880000">"not a sequence"</font> element))))
+ (reverse result)))
+
+(defun <font color="#0000CC">list-from-input*</font> (input &optional recursion-p)
+ (let (result)
+ (labels ((test (element)
+ (if (member (type-of element) '(array cons string))
+ (list-from-input* element t)
+ (if (or recursion-p (null element))
+ element
+ (error <font color="#880000">"not a sequence"</font> element)))))
+ (format t ";; ~s~%" input)
+ (case (type-of input)
+ (nil (push input result))
+ (cons (if (consp (last input))
+ (dolist (element input)
+ (push (test element) result))
+ (error <font color="#880000">"not a proper list"</font> input)))
+ (array (let ((end (length input)))
+ (dotimes (index end)
+ (push (test (aref input index)) result))))
+ (string (let ((end (length input)))
+ (dotimes (index end)
+ (push (test (char input index)) result))))
+ (t (error <font color="#880000">"not a sequence"</font> input)))
+ (reverse result))))
+
+(defun <font color="#0000CC">map</font> (result-type function &amp;rest sequences)
+ (if (not (member result-type '(list string array)))
+ (error <font color="#880000">"invalid result type"</font> result-type)
+ (let* ((input-list (list-from-input sequences))
+ (result (if function
+ (apply #'mapcar (cons function input-list))
+ (if (rest sequences)
+ input-list
+ (first input-list)))))
+ (case result-type
+ (list result)
+ (string (list-to-string result))
+ (array (list-to-array result))))))
+
+(defun <font color="#0000CC">mapcar*</font> (function &amp;rest lists)
+ (unless (or (null lists)
+ (dolist (list lists nil)
+ (and (null list) (return t))))
+ (let ((end (length lists))
+ (result nil))
+ (do ((stop nil) (recurse t t)) (stop)
+ (let (local)
+ (dotimes (index end)
+ (let ((first (first (nth index lists)))
+ (rest (rest (nth index lists))))
+ (push first local)
+ (unless (consp first) (setq recurse nil))
+ (setf (nth index lists) rest)
+ (when (null rest) (setq stop t))))
+ (setq local (reverse local))
+ (format t ";; local: ~a~%" local)
+ (format t ";; lists: ~a~%" lists)
+ (format t ";; recurse: ~a~%" recurse)
+ (if recurse
+ (push (apply #'mapcar* (cons function local)) result)
+ (push (apply function local) result))))
+ (reverse result))))
+
+(defun <font color="#0000CC">map*</font> (result-type function &amp;rest sequences)
+ (if (not (member result-type '(list string array)))
+ (error <font color="#880000">"invalid result type"</font> result-type)
+ (let* ((input-list (list-from-input* sequences))
+ (result (if function
+ (apply #'mapcar* (cons function input-list))
+ (if (rest sequences)
+ input-list
+ (first input-list)))))
+ (format t ";; ~s~%" input-list)
+ (case result-type
+ (list result)
+ (string (list-to-string result))
+ (array (list-to-array result))))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<dt><nobr><b>find</b> <i>item sequence</i> &amp;key <i>from-end test test-not start end key</i> &rArr; <i>element</i></nobr></dt>
+<dt><nobr><b>find-if</b> predicate sequence &amp;key from-end start end key &rArr; element</nobr></dt>
+<dt><nobr><b>find-if-not</b> predicate sequence &amp;key from-end start end key &rArr; element</nobr></dt>
+
+<dd><p>Search for an element of the sequence bounded by start and end that
+satisfies the predicate or that satisfies the test or test-not, as
+appropriate.</p></dd>
+
+<dt><nobr><b>count</b> item sequence &amp;key from-end start end key test test-not &rArr; n</nobr></dt>
+<dt><nobr><b>count-if</b> predicate sequence &amp;key from-end start end key &rArr; n</nobr></dt>
+<dt><nobr><b>count-if-not</b> predicate sequence &amp;key from-end start end key &rArr; n</nobr></dt>
+
+<dd><p>Count and return the number of elements in the sequence bounded by
+start and end that satisfy the test. </p></dd>
+
+<dt><b>position</b> item sequence &amp;key from-end test test-not start end key &rArr; position</dt>
+<dt><b>position-if</b> predicate sequence &amp;key from-end start end key &rArr; position</dt>
+<dt><b>position-if-not</b> predicate sequence &amp;key from-end start end key &rArr; position</dt>
+
+<dd><p>Search sequence for an element that satisfies the test. The position
+returned is the index within sequence of the leftmost (if from-end is true)
+or of the rightmost (if from-end is false) element that satisfies the test;
+otherwise nil is returned. The index returned is relative to the left-hand
+end of the entire sequence, regardless of the value of start, end, or
+from-end.</p></dd>
+
+</dl>
+
+<pre class="example">
+(defun <font color="#0000CC">list-find</font> (element list &amp;key from-end test test-not start end)
+ (when from-end (setq list (reverse-list)))
+ (first (cond (test (member element list :test test))
+ (test-not (member element list :test-not test-not))
+ (t (member element list)))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/strings.htm b/docsrc/xlisp/xlisp-doc/examples/strings.htm
new file mode 100644
index 0000000..1842c08
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/strings.htm
@@ -0,0 +1,802 @@
+<html><head>
+
+<title>Characters and Strings</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Characters and Strings</h1>
+
+<hr>
+
+<p>Strings are also <a href="sequences.htm">Sequences</a>.</p>
+
+<ul>
+<li><nobr><a href="#make-string">make-string</a> - make a string of a specific number of characters</nobr></li>
+<li><nobr><a href="#string-star">string*</a> - make a string out of arbitrary Lisp expressions</nobr></li>
+<li><nobr><a href="#posix">POSIX Character Classes</a> - character predicates</nobr></li>
+<li><nobr><a href="#unicode">Unicode Strings</a></nobr></li>
+<ul>
+<li><nobr><a href="#utf-8-byte-p">utf-8-byte-p</a> - tests if a XLISP character is a valid UTF-8 byte</nobr></li>
+<li><nobr><a href="#utf-8-bytes">utf-8-bytes</a> - returns the number of bytes of an UTF-8 character</nobr></li>
+<li><nobr><a href="#utf-8-bytes">utf-8-string-to-list</a> - converts an UTF-8 string to a list of 'string-characters'</nobr></li>
+<li><nobr><a href="#utf-8-bytes">utf-8-list-to-string</a> - converts a list of 'string-characters' to an XLISP string</nobr></li>
+</ul>
+</ul>
+
+<a name=""></a>
+
+<hr>
+
+<h2>make-string</h2>
+
+<hr>
+
+<pre class="example">
+(defun <font color="#0000CC">make-string</font> (length initial-element)
+ (cond ((not (and (integerp length)
+ (plusp length)))
+ (error <font color="#AA0000">"not a positive integer"</font> length))
+ ((not (characterp initial-element))
+ (error <font color="#AA0000">"not a character"</font> initial-element))
+ (t
+ (let ((element (string initial-element))
+ (string <font color="#AA0000">""</font>))
+ (dotimes (x length)
+ (setq string (strcat string element)))
+ string))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="string-star"></a>
+
+<hr>
+
+<h2>string*</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+
+<dt><nobr>(<b>string*</b> [<i>expr1</i> ...])</nobr></dt>
+<dd><i>exprN</i> - arbitrary Lisp expressions<br>
+returns - the expression[s], converted and concatenated into a single string</dd>
+</dl>
+
+<dl>
+
+</div></p>
+
+<p>The 'string*' function tries to make a string out of everything:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">string*</font> (&amp;rest items)
+ (if (null items)
+ <font color="#880000">""</font>
+ (let ((end (length items))
+ (result <font color="#880000">""</font>))
+ (labels ((strcat-element (element)
+ (let ((string (if (or (consp element) (arrayp element))
+ (string* element)
+ (format nil <font color="#880000">"~a"</font> element))))
+ (setq result (strcat result string)))))
+ (dotimes (index end)
+ (if (eq (nth index items) '*unbound*)
+ (strcat-element <font color="#880000">"*UNBOUND*"</font>)
+ (let ((item (nth index items)))
+ (case (type-of item)
+ (cons (let ((end (length item)))
+ (when (not (consp (last item))) (incf end))
+ (dotimes (index end)
+ (if (eq (nth index item) '*unbound*)
+ (strcat-element <font color="#880000">"*UNBOUND*"</font>)
+ (strcat-element (nth index item))))))
+ (array (let ((end (length item)))
+ (dotimes (index end)
+ (if (eq (aref item index) '*unbound*)
+ (strcat-element <font color="#880000">"*UNBOUND*"</font>)
+ (strcat-element (aref item index))))))
+ (t (strcat-element item))))))
+ result))))
+</pre>
+
+<p>Examples:</p>
+
+<pre class="example">
+(string*) =&gt; ""
+
+(string* #\A "B" 'c) =&gt; "ABC"
+(string* 1 2 3) =&gt; "123"
+
+(string* 1 "st") =&gt; "1st"
+(string* "2" #\n #\d) =&gt; "2nd"
+
+(setq a 3) =&gt; 3
+(string* 'a "=" a) =&gt; "A=3"
+</pre>
+
+<p>Nested expressions will be flattened:</p>
+
+<pre class="example">
+(string* #(1 (#\2) "3")) =&gt; "123"
+</pre>
+
+<p>The result may contain nonsense:</p>
+
+<pre class="example">
+(string* #'car) =&gt; "#&lt;Subr-CAR: #8645768&gt;"
+(string* '(lambda (x) (print x))) =&gt; "LAMBDAXPRINTX"
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="posix"></a>
+
+<hr>
+
+<h2>POSIX Character Classes</h2>
+
+<hr>
+
+<p>The <nobr>built-in</nobr> XLISP character test functions
+<a href="../reference/upper-case-p.htm">upper-case-p</a>,
+<a href="../reference/lower-case-p.htm">lower-case-p</a>,
+<a href="../reference/both-case-p.htm">both-case-p</a>, return the boolean
+values <a href="../reference/t.htm">&nbsp;T&nbsp;</a> or
+<a href="../reference/nil.htm">NIL</a> instead of the tested character,
+while <a href="../reference/digit-char-p.htm">digit-char-p</a> returns an
+integer <nobr>or <a href="../reference/nil.htm">NIL</a></nobr>, what is
+handy if you want to convert arbitrary Lisp symbols into numbers without
+producing an error, but all this is impractical for writing a string
+parser.</p>
+
+<p>The following functions implement tests for the standard POSIX character
+classes, where all functions return the tested character if the test
+succeeds, or <a href="../reference/nil.htm">NIL</a></nobr> if the test
+fails. <nobr>The 'internal'</nobr> functions do not check if the argument is
+a character and therefore are faster than the 'user' functions. Also note
+that XLISP is limited to ASCII characters, so there is no way to find out if
+an unicode character is upper- or lowercase if the character code is greater
+than <nobr>ASCII 127</nobr>.</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td colspan="3"><nobr><b>POSIX</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><b>Internal</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><b>User Function</b></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>alnum</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-alnum-p">char:alnum-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#alnum-character-p">alnum-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>alphanumeric = [a-z], [A-Z], [0-9]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>alpha</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-alpha-p">char:alpha-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#alpha-character-p">alpha-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>alphabetic = [a-z], [A-Z]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>blank</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-blank-p">char:blank-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#blank-character-p">blank-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>space and horizontal-tab</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>cntrl</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-cntrl-p">char:cntrl-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#cntrl-character-p">cntrl-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>code-chars 0-31 and 127</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>digit</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-digit-p">char:digit-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#digit-character-p">digit-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>decimal = [0-9]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>graph</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-graph-p">char:graph-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#graph-character-p">graph-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>graphical = alnum + punct</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>lower</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-lower-p">char:lower-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#lower-character-p">lower-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>lowercase = [a-z]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>print</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-print-p">char:print-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#print-character-p">print-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>printable = alnum + punct + space</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>punct</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-punct-p">char:punct-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#punct-character-p">punct-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>punctuation marks</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>space</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-space-p">char:space-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#space-character-p">space-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>characters producing whitespace</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>upper</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-upper-p">char:upper-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#upper-character-p">upper-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>uppercase = [A-Z]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>[:</nobr></td>
+ <td align="center"><nobr>xdigit</nobr></td>
+ <td><nobr>:]</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#char-xdigit-p">char:xdigit-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr><a href="#xdigit-character-p">xdigit-character-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>hexadecimal = [0-9], [a-f], [A-F]</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p><b>Internal Functions</b> for POSIX character classes:</p>
+
+<a name="char-alnum-p"></a>
+
+<pre class="example">
+<font color="#008844">;; alphanumeric characters = a-z, A-z, 0-9</font>
+
+(defun <font color="#0000CC">char:alnum-p</font> (char)
+ (and (alphanumericp char)
+ char))
+<a name="char-alpha-p"></a>
+<font color="#008844">;; alphabetic characters = a-z, A-Z</font>
+
+(defun <font color="#0000CC">char:alpha-p</font> (char)
+ (and (both-char-p char)
+ char))
+<a name="char-blank-p"></a>
+<font color="#008844">;; blanks = space and horizontal-tab</font>
+
+(defun <font color="#0000CC">char:blank-p</font> (char)
+ (and (or (char= char #\Space)
+ (char= char #\Tab))
+ char))
+<a name="char-cntrl-p"></a>
+<font color="#008844">;; control characters = code-chars 0-31 and 127</font>
+
+(defun <font color="#0000CC">char:cntrl-p</font> (char)
+ (let ((code (char-code char)))
+ (and (or (&lt;= 0 code 31)
+ (= code 127))
+ char)))
+<a name="char-digit-p"></a>
+<font color="#008844">;; decimal digits = 0-9</font>
+
+(defun <font color="#0000CC">char:digit-p</font> (char)
+ (and (digit-char-p char)
+ char))
+<a name="char-graph-p"></a>
+<font color="#008844">;; graphical characters = alnum + punct</font>
+
+(defun <font color="#0000CC">char:graph-p</font> (char)
+ (and (&lt;= 33 (char-code char) 126)
+ char))
+<a name="char-lower-p"></a>
+<font color="#008844">;; lowercase characters = a-z</font>
+
+(defun <font color="#0000CC">char:lower-p</font> (char)
+ (and (lower-case-p char)
+ char))
+<a name="char-print-p"></a>
+<font color="#008844">;; printable characters = alnum + punct + space</font>
+
+(defun <font color="#0000CC">char:print-p</font> (char)
+ (and (&lt;= 32 (char-code char) 126)
+ char))
+<a name="char-punct-p"></a>
+<font color="#008844">;; punctuation marks</font>
+
+(defun <font color="#0000CC">char:punct-p</font> (char)
+ (let ((code (char-code char)))
+ (and (or (&lt;= 33 code 47) <font color="#008844">; ! " # $ % &amp; ' ( ) * + , - . /</font>
+ (&lt;= 58 code 64) <font color="#008844">; : ; &lt; = &gt; ? @</font>
+ (&lt;= 91 code 96) <font color="#008844">; [ \ ] ^ _ `</font>
+ (&lt;= 123 code 126)) <font color="#008844">; { | } ~</font>
+ char)))
+<a name="char-space-p"></a>
+<font color="#008844">;; characters producing whitespace</font>
+<font color="#008844">;;</font>
+<font color="#008844">;; 9 = horizontal tab 10 = line feed 11 = vertical tab</font>
+<font color="#008844">;; 12 = form feed 13 = carriage return 32 = space</font>
+
+(defun <font color="#0000CC">char:space-p</font> (char)
+ (and (member (char-code char) '(9 10 11 12 13 32))
+ char))
+<a name="char-upper-p"></a>
+<font color="#008844">;; uppercase characters = A-Z</font>
+
+(defun <font color="#0000CC">char:upper-p</font> (char)
+ (and (upper-case-p char)
+ char))
+<a name="char-xdigit-p"></a>
+<font color="#008844">;; hexadecimal digits = 0-9, a-f, A-F</font>
+
+(defun <font color="#0000CC">char:xdigit-p</font> (char)
+ (and (or (digit-char-p char)
+ (let ((code (char-code char)))
+ (or (&lt;= 65 code 70) <font color="#008844">; A-Z</font>
+ (&lt;= 97 code 102)))) <font color="#008844">; a-z</font>
+ char))
+</pre>
+
+<p><b>User Functions</b> for POSIX character classes:</p>
+
+<a name="alnum-character-p"></a>
+
+<pre class="example">
+<font color="#008844">;; alphanumeric characters = a-z, A-z, 0-9</font>
+
+(defun <font color="#0000CC">alnum-character-p</font> (char)
+ (and (characterp char)
+ (char:alnum-p char)))
+<a name="alpha-character-p"></a>
+<font color="#008844">;; alphabetic characters = a-z, A-Z</font>
+
+(defun <font color="#0000CC">alpha-character-p</font> (char)
+ (and (characterp char)
+ (char:alpha-p char)))
+<a name="blank-character-p"></a>
+<font color="#008844">;; blanks = space and horizontal-tab</font>
+
+(defun <font color="#0000CC">blank-character-p</font> (char)
+ (and (characterp char)
+ (char:blank-p char)))
+<a name="cntrl-character-p"></a>
+<font color="#008844">;; control characters = code-chars 0-31 and 127</font>
+
+(defun <font color="#0000CC">cntrl-character-p</font> (char)
+ (and (characterp char)
+ (char:cntrl-p char)))
+<a name="digit-character-p"></a>
+<font color="#008844">;; decimal digits = 0-9</font>
+
+(defun <font color="#0000CC">digit-character-p</font> (char)
+ (and (characterp char)
+ (char:digit-p char)))
+<a name="graph-character-p"></a>
+<font color="#008844">;; graphical characters = alnum + punct</font>
+
+(defun <font color="#0000CC">graph-character-p</font> (char)
+ (and (characterp char)
+ (char:graph-p char)))
+<a name="lower-character-p"></a>
+<font color="#008844">;; lowercase characters = a-z</font>
+
+(defun <font color="#0000CC">lower-character-p</font> (char)
+ (and (characterp char)
+ (char:lower-p char)))
+<a name="print-character-p"></a>
+<font color="#008844">;; printable characters = alnum + punct + space</font>
+
+(defun <font color="#0000CC">print-character-p</font> (char)
+ (and (characterp char)
+ (char:print-p char)))
+<a name="punct-character-p"></a>
+<font color="#008844">;; punctuation marks</font>
+
+(defun <font color="#0000CC">punct-character-p</font> (char)
+ (and (characterp char)
+ (char:punct-p char)))
+<a name="space-character-p"></a>
+<font color="#008844">;; characters producing whitespace</font>
+
+(defun <font color="#0000CC">space-character-p</font> (char)
+ (and (characterp char)
+ (char:space-p char)))
+<a name="upper-character-p"></a>
+<font color="#008844">;; uppercase characters = A-Z</font>
+
+(defun <font color="#0000CC">upper-character-p</font> (char)
+ (and (characterp char)
+ (char:upper-p char)))
+<a name="xdigit-character-p"></a>
+<font color="#008844">;; hexadecimal digits = 0-9, a-f, A-F</font>
+
+(defun <font color="#0000CC">xdigit-character-p</font> (char)
+ (and (characterp char)
+ (char:xdigit-p char)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="unicode"></a>
+
+<hr>
+
+<h2>Unicode</h2>
+
+<hr>
+
+<p>The UTF-8 functions may help to write custom <nobr>UTF-8</nobr> string
+access functions like <nobr>UTF-8-SUBSEQ</nobr> or
+<nobr>UTF-8-STRING-SEARCH</nobr> with no need to care about the underlying
+<nobr>low-level</nobr> octal sequences.</p>
+
+
+
+<p>In the list of "string-characters" every ASCII or UTF-8 character
+from 1-byte to 4-byte is represented by its own list element:</p>
+
+<pre class="example">
+(utf-8-string-to-list "hällö") => ("h" "\303\244" "l" "l" "\303\266")
+ h ä l l ö
+</pre>
+
+<p>The list can be manipulated by standard Nyquist list functions and
+then re-converted into a string by UTF-8-LIST-TO-STRING.</p>
+
+Practical examples
+
+<p>In Nyquist code, non-ASCII characters are represented by their
+native bytes sequences, represented by escaped octal numbers:</p>
+
+<pre class="example">
+(print "ä") =&gt; "\303\244" <font color="#008844">; on UTF-8 systems</font>
+</pre>
+
+<p>So for example matching the second "ä" from "hällo" in the list
+above, represented by the octal sequence "\303\244":</p>
+
+<pre class="example">
+(let ((string-list (utf-8-string-to-list "hällö")))
+ (string= "ä" (nth 1 string-list))) ; 0 = first, 1 = second element
+=&gt; T ; T = true = identified
+</pre>
+
+<p>Advantage: The number of the element in the list is the same as the
+number of the character in the string, independent from the number of bytes
+in the underlying character encoding.</p>
+
+;; The UTF-8 toolbox is intended to manipulate UTF-8 encoded file-
+;; or directory names, typed in by the user or read from environment
+;; variables, before they are given to SETDIR or OPEN.
+;;
+;; Information from the environment
+;;
+;; Because the encoding of the non-ASCII characters depends on the
+;; underlying operation system [with non-unicode operation systems
+;; there will be no UTF-8 encoding available], it's always better
+;; to refer to strings from environment variables, user input, or
+;; strings returned from the underlying file system, instead of
+;; hand-coded strings in the Nyquist source code, for example:
+;;
+;; GET-ENV - can read strings from environment variables:
+;;
+;; (defun user-home-directory ()
+;; (or (get-env "HOME") ; Unix
+;; (get-env "UserProfile"))) ; Windows
+;;
+;; On Windows, there is no HOME variable defined by Windows itself,
+;; but most programs will respect a HOME variable, if one has been
+;; defined by the user. That's why the HOME variable is read first.
+;;
+;; SETDIR - can test if a directory exists and return its name:
+;;
+;; (defun directory-exists-p (string)
+;; (let ((orig-dir (setdir "."))
+;; (new-dir (setdir string)))
+;; (when (string/= orig-dir new-dir)
+;; (setdir orig-dir)
+;; new-dir)))
+;;
+;; SETDIR always returns abloute direcory names, even if STRING is a
+;; relative direcory name. That's why DIRECTORY-EXISTS-P first stores
+;; the absolute name of the current working directory in the ORIG-DIR
+;; variable and compares it then against the absolute directory name
+;; returned by SETDIR when it tries to change the directory to STRING.
+;;
+;; OPEN - can test if a file exists and return its name:
+;;
+;; (defun file-exists-p (string)
+;; (unless (directory-exists-p string)
+;; (let (file-stream)
+;; (unwind-protect
+;; (setq file-stream (open string))
+;; (when file-stream (close file-stream)))
+;; (when file-stream string))))
+;;
+;; On Unix, a directory is a special kind of file, so the Nyquist/XLISP
+;; OPEN function opens directories, too. That's why FILE-EXISTS-P first
+;; must test and make sure that STRING is not the name of a directory.
+;;
+;;; Known bugs and limitations of the UTF-8 toolbox:
+;;
+;; The UTF-8 toolbox does not provide support for UTF-8 case-detection
+;; or UTF-8 case-conversion. It cannot be detected if a UTF-8 character
+;; is upper- or lowercase, it's also not possible to convert characters
+;; from upper- to lowercase or vice versa.
+;;
+;; The library does not provide functions to compare UTF-8 characters
+;; or to sort UTF-8 characters.
+;;
+;; The XLISP character functions do not work with UTF-8 octal sequences,
+;; so matching must be done via XLISP's STRING= and STRING/= functions.
+;;
+;; The XLISP string comparison functions like STRING<, STRING>, etc.
+;; do not work reliably with multibyte characters.
+;;
+;; The string matching and sorting algorithms of the Unicode Consortium
+;; are too complex to be implemented in XLISP with reasonable speed.
+;;
+;; See: http://www.unicode.org/reports/tr10/ - string comparison
+;;
+;; The library is implemented in interpreted Lisp, so please do not
+;; expect high-speed performance with advanced list manipulations.
+;;
+;; The library still has not been tested with ISO encoded systems.
+;;
+
+<p><b>UTF-8 Encoding</b> - see also http://en.wikipedia.org/wiki/UTF-8</p>
+
+
+<p>In an UTF-8 encoded character the first byte starts with:</p>
+
+<pre class="example">
+;; one-byte 0xxxxxxx -> legal char-codes 0 to 127 [UTF-8/ASCII]
+;; two-byte 110xxxxx -> legal char-codes 194 to 223 [UTF-8]
+;; three-byte 1110xxxx -> legal char-codes 224 to 239 [UTF-8]
+;; four-byte 11110xxx -> legal char-codes 240 to 244 [UTF-8]
+;;
+;; The second, third, and fourth characters start with:
+;;
+;; 10xxxxxx -> legal char-codes 128 to 191 [UTF-8]
+</pre>
+
+
+<p>UTF-8-BYTE-P tests if a XLISP character is a valid UTF-8 byte</p>
+
+<pre class="example">
+(defun utf-8-byte-p (char)
+ (when (characterp char)
+ (let ((code (char-code char)))
+ (when (or (&lt;= 0 code 191)
+ (&lt;= 194 code 244))
+ char))))
+</pre>
+
+<p>UTF-8-BYTES tries to determine from the XLISP character code
+how many bytes the character has in UTF-8 encoding</p>
+
+<pre class="example">
+(defun utf-8-bytes (char)
+ (cond ((not (characterp char))
+ (error "not a character" char))
+ ((not (utf-8-byte-p char))
+ (error "invalid UTF-8 byte" char))
+ (t
+ (let ((code (char-code char)))
+ (cond ((&lt;= 0 code 127) 1) ; one byte [= ASCII]
+ ((&lt;= 194 code 223) 2) ; two bytes
+ ((&lt;= 224 code 239) 3) ; three bytes
+ ((&lt;= 240 code 244) 4) ; four bytes
+ (t (error "utf-8-bytes: not an UTF-8 identifer" char)))))))
+</pre>
+
+<p>UTF-8-STRING-TO-LIST converts a string containing ASCII or UTF-8
+characters from one to four bytes into a list, where:</p>
+
+<ul>
+<li><nobr><b>ASCII</b> - ASCII string</nobr></li>
+<li><nobr><b>UTF-8</b> - string of octal-sequences</nobr></li>
+</ul>
+
+;; Every character (single-byte or multi-byte) is represented
+;; by its own list element:
+;;
+;; (utf-8-string-to-list "hällö") => ("h" "\303\244" "l" "l" "\303\266")
+;; h ä l l ö
+;;
+;; The list can be manipulated by standard XLISP list functions and
+;; then re-converted into a string by UTF-8-LIST-TO-STRING below.
+
+<pre class="example">
+(defun utf-8-string-to-list (string)
+ (cond
+ ((not (stringp string))
+ (error "utf-8-string-to-list: not a string" string))
+ ((string= "" string) nil)
+ (t
+ (let ((end (length string))
+ (list nil))
+ (do ((index 0 (1+ index)))
+ ((>= index end))
+ (let* ((char (char string index))
+ (bytes (1- (utf-8-bytes char)))
+ (utf-8 (string char)))
+ (dotimes (rest-of bytes) ; runs only if bytes > 0
+ (incf index)
+ (if (> index end)
+ (error "utf-8-string-to-list: index out of range" index)
+ (let ((byte (char string index)))
+ (if (not (utf-8-byte-p byte))
+ (error "utf-8-string-to-list: invalid UTF-8 byte" byte)
+ (setq utf-8 (strcat utf-8 (string byte)))))))
+ (push utf-8 list)))
+ (reverse list)))))
+</pre>
+
+;; UTF-8-LIST-TO-STRING re-converts a list containing ASCII and
+;; UTF-8 "string-characters" back to a XLISP string, intended
+;; to be given to SETDIR or OPEN for file or directory operations.
+
+<pre class="example">
+(defun utf-8-list-to-string (list)
+ (cond ((not (listp list))
+ (error "utf-8-list-to-string: not a list" list))
+ ((null list) "")
+ (t
+ (let ((result ""))
+ (dolist (string list)
+ (if (not (stringp string))
+ (error "utf-8-list-to-string: not a string" string)
+ (setq result (strcat result string))))
+ result))))
+</pre>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/xlisp/ash.htm b/docsrc/xlisp/xlisp-doc/examples/xlisp/ash.htm
new file mode 100644
index 0000000..2d17d98
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/xlisp/ash.htm
@@ -0,0 +1,130 @@
+<html><head>
+
+<title>ash</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>ash</h1>
+
+<hr>
+
+<p>The 'ash' functio performs an '<nobr>arithmetic shift</nobr>' operation:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>ash</b> <i>integer count</i>)</dt>
+<dd><i>integer</i> - an integer expression<br>
+<i>count</i> - an integer expression<br>
+returns - the <i>number</i> shifted by <i>count</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">ash</font> (integer count)
+ (or (integerp integer) (error <font color="#880000">"not an integer"</font> integer))
+ (or (integerp count) (error <font color="#880000">"not an integer"</font> count))
+ (let* ((shift (* integer (expt 2.0 count)))
+ (trunc (truncate shift)))
+ <font color="#008844">;; XLISP implementation of (FLOOR SHIFT)</font>
+ (if (or (plusp shift) (= shift trunc))
+ trunc
+ (1- trunc))))
+</pre>
+
+<p>The 'ash' functio performs an arithmetic shift operation on the binary
+representation of the 'integer' argument, which is treated as if it were
+binary. <nobr>The 'integer'</nobr> argument is shifted arithmetically to the
+left by 'count' bit positions if 'count' is positive, or to the right by
+'count' bit positions if 'count' is negative. <nobr>The shifted</nobr> value
+of the same sign as 'integer' is returned.</p>
+
+<p>The 'ash' function performs the computation:</p>
+
+<pre class="example">
+floor (integer * 2^count)
+</pre>
+
+<p>Logically, the 'ash' function moves all of the bits in integer to the
+left, adding <nobr>zero-bits</nobr> at the right, or moves them to the
+right, discarding bits.</p>
+
+<p>The 'ash' function is defined to behave as if integer were represented in
+two's complement form, regardless of how integers are represented
+internally.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(ash 16 1) =&gt; 32
+(ash 16 0) =&gt; 16
+(ash 16 -1) =&gt; 8
+</pre>
+
+<pre class="example">
+(defun <font color="#0000CC">debug:ash</font> (integer count)
+ (let ((shifted (ash integer count)))
+ (format t <font color="#880000">"integer: ~a~%"</font> (bin-string integer :all))
+ (format t <font color="#880000">"shifted: ~a~%"</font> (bin-string shifted :all))
+ shifted))
+</pre>
+
+<p>See <nobr><a href="../binary.htm">Binary Integer Numbers</a></nobr> for
+the '<nobr>bin-string</nobr>' function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/xlisp/bsh.htm b/docsrc/xlisp/xlisp-doc/examples/xlisp/bsh.htm
new file mode 100644
index 0000000..31c8af6
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/xlisp/bsh.htm
@@ -0,0 +1,127 @@
+<html><head>
+
+<title>bsh</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>bsh</h1>
+
+<hr>
+
+<p>The 'bsh' functio performs an '<nobr>binary shift</nobr>' operation:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>bsh</b> <i>integer count</i>)</dt>
+<dd><i>integer</i> - an integer expression<br>
+<i>count</i> - an integer expression<br>
+returns - the <i>number</i> shifted by <i>count</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">bsh</font> (integer count)
+ (or (integerp integer) (error <font color="#880000">"not an integer"</font> integer))
+ (or (integerp count) (error <font color="#880000">"not an integer"</font> count))
+ (if (zerop count)
+ integer
+ (let ((digits (or (dolist (bits '(16 32 64 128) nil)
+ (let ((fixnum (round (expt 2.0 (1- bits)))))
+ (and (plusp (1- fixnum))
+ (minusp fixnum)
+ (return bits))))
+ (error <font color="#880000">"integer limit not found"</font>)))
+ (list nil)
+ (string "#b"))
+ (dotimes (x digits)
+ (let ((digit (logand (round (expt 2.0 x)) integer)))
+ (push (if (zerop digit) "0" "1") list)))
+ (dotimes (x digits)
+ (let ((digit (if (&lt; -1 count digits) (nth count list) "0")))
+ (setq string (strcat string digit))
+ (incf count)))
+ (eval (read (make-string-input-stream string))))))
+</pre>
+
+<p>The 'bsh' function performs a binary shift operation on the 'integer'
+argument. <nobr>The bits</nobr> of the 'integer' argument is shifted to the
+left by 'count' positions if 'count' is positive, or to the right by 'count'
+positions if 'count' is negative. <nobr>The missing</nobr> bits are filled
+with zeros.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(bsh 16 1) =&gt;
+(bsh 16 0) =&gt;
+(bsh 16 -1) =&gt;
+</pre>
+
+<pre class="example">
+(defun <font color="#0000CC">debug:bsh</font> (integer count)
+ (let ((shifted (bsh integer count)))
+ (format t <font color="#880000">"integer: ~a~%"</font> (bin-string integer :all))
+ (format t <font color="#880000">"shifted: ~a~%"</font> (bin-string shifted :all))
+ shifted))
+</pre>
+
+<p>See <nobr><a href="../binary.htm">Binary Integer Numbers</a></nobr> for
+the '<nobr>bin-string</nobr>' function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/xlisp/ceiling.htm b/docsrc/xlisp/xlisp-doc/examples/xlisp/ceiling.htm
new file mode 100644
index 0000000..a005ff1
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/xlisp/ceiling.htm
@@ -0,0 +1,103 @@
+<html><head>
+
+<title>ceiling</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>ceiling</h1>
+
+<hr>
+
+<p>The 'ceiling' function
+<a href="../../reference/truncate.htm">truncate</a>s an integer or
+<nobr>floating-point</nobr> number toward positive infinity:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>ceiling</b> <i>number</i>)</dt>
+<dd><i>number</i> - an integer or <nobr>floating-point</nobr> expression<br>
+returns - the integer result of truncating <i>number</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">ceiling</font> (number)
+ (let ((trunc (truncate number)))
+ (if (or (minusp number) (= number trunc))
+ trunc
+ (1+ trunc))))
+</pre>
+
+<p>The 'ceiling' function computes an integer number that has
+been truncated toward positive infinity. <nobr>That is</nobr>, the result
+represents the smallest mathematical integer that is not smaller than the
+number given as argument.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(ceiling 3) =&gt; 3 (ceiling -3) =&gt; -3
+(ceiling 3.0) =&gt; 3 (ceiling -3.0) =&gt; -3
+(ceiling 3.1) =&gt; 4 (ceiling -3.1) =&gt; -3
+(ceiling 3.5) =&gt; 4 (ceiling -3.5) =&gt; -3
+(ceiling 3.9) =&gt; 4 (ceiling -3.9) =&gt; -3
+(ceiling 4.0) =&gt; 4 (ceiling -4.0) =&gt; -4
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/examples/xlisp/floor.htm b/docsrc/xlisp/xlisp-doc/examples/xlisp/floor.htm
new file mode 100644
index 0000000..5851166
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/examples/xlisp/floor.htm
@@ -0,0 +1,103 @@
+<html><head>
+
+<title>floor</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>floor</h1>
+
+<hr>
+
+<p>The 'floor' function
+<a href="../../reference/truncate.htm">truncate</a>s an integer or
+<nobr>floating-point</nobr> number toward negative infinity:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>floor</b> <i>number</i>)</dt>
+<dd><i>number</i> - an integer or <nobr>floating-point</nobr> expression<br>
+returns - the integer result of truncating <i>number</i></dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">floor</font> (number)
+ (let ((trunc (truncate number)))
+ (if (or (plusp number) (= number trunc))
+ trunc
+ (1- trunc))))
+</pre>
+
+<p>The 'floor' function computes an integer number that has been truncated
+toward negative infinity. <nobr>That is</nobr>, the result represents the
+largest mathematical integer that is not larger than the number given as
+argument.</p>
+
+<p>Examples:</p>
+
+<pre class="example">
+(floor 3) =&gt; 3 (floor -3) =&gt; -3
+(floor 3.0) =&gt; 3 (floor -3.0) =&gt; -3
+(floor 3.1) =&gt; 3 (floor -3.1) =&gt; -4
+(floor 3.5) =&gt; 3 (floor -3.5) =&gt; -4
+(floor 3.9) =&gt; 3 (floor -3.9) =&gt; -4
+(floor 4.0) =&gt; 4 (floor -4.0) =&gt; -4
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../../manual/contents.htm">Contents</a> |
+<a href="../../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/internals/c-printf.htm b/docsrc/xlisp/xlisp-doc/internals/c-printf.htm
new file mode 100644
index 0000000..d5e552a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/internals/c-printf.htm
@@ -0,0 +1,518 @@
+<html><head>
+
+<title>ANSI C 'printf' Format</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>ANSI C 'printf' Format</h1>
+
+<hr>
+
+<p><b>Nyquist/XLISP:</b> The
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr> and
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+variables define format strings for the underlying 'sprintf' <nobr>C
+function</nobr>. <nobr>In C,</nobr> the same format string specification is
+used for 'fprint' [writes to <nobr>a file]</nobr>, 'printf' [writes to
+standard output] and 'sprintf' [writes to another string]. These three
+functions are meant in the following text with 'the printf functions'.</p>
+
+<p><b>ANSI C:</b> The printf functions write output under control of a
+format string that specifies how subsequent arguments are converted for
+output. If there are insufficient arguments for the format, the behavior is
+undefined. If the format is exhausted while arguments remain, the excess
+arguments are evaluated but are otherwise ignored. The printf functions
+return when the end of the format string is encountered.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="format-string"></a>
+
+<hr>
+
+<h2>Format String</h2>
+
+<hr>
+
+<p>The format string is composed of zero or more directives, which are
+ordinary characters <nobr>[except &quot;%&quot;]</nobr>, which are copied
+unchanged to the output stream, and conversion specifications, each of which
+results in fetching zero or more subsequent arguments. Each conversion
+specification is introduced by the <nobr>character &quot;%&quot;</nobr>:</p>
+
+<pre class="example">
+<font color="#AA0000">%</font>[<font color="#0000CC">flags</font>][<font color="#0000CC">field-with</font>][<font color="#0000CC">precision</font>][<font color="#0000CC">data-type</font>]<font color="#880000">conversion-type</font>
+</pre>
+
+<p>After the &quot;%&quot;, the following appear in sequence:</p>
+
+<ul>
+
+<li><p><b>Flags</b> - Zero or more <a href="#flags">flags</a> that modify
+the meaning of the conversion specification.</p></li>
+
+<li><p><b>Field Width</b> - <nobr>An optional</nobr> decimal integer
+specifying a minimum field width. <nobr>If the</nobr> converted value has
+fewer characters than the field width, it will be padded with spaces on the
+left to the field width. <nobr>The field</nobr> is padded on the right if
+the <nobr><a href="#minus-flag">&nbsp;&minus;&nbsp;</a> flag</nobr> has been
+given, or padded with zeros if the
+<nobr><a href="#zero-flag">&nbsp;0&nbsp;</a> flag</nobr> had been
+given. <nobr>A negative</nobr> integer, given as '<nobr>field width</nobr>'
+argument, is interpreted as a
+<nobr><a href="#minus-flag">&nbsp;&minus;&nbsp;</a> flag</nobr> followed by
+a positive <nobr>field width</nobr>.</p></li>
+
+<li><p><b>Precision</b> - <nobr>An optional</nobr> decimal integer that
+gives the minimum number of digits to appear for
+<a href="#integer">integer</a> conversions, the number of digits to appear
+after the
+<nobr>decimal-point</nobr> character for <nobr>floating-point</nobr>
+<nobr><a href="#float-e">&nbsp;e&nbsp;</a></nobr> and
+<nobr><a href="#float-f">&nbsp;f&nbsp;</a></nobr> conversions, or the
+maximum number of significant digits for the <nobr>floating-point</nobr>
+<nobr><a href="#float-g">&nbsp;g&nbsp;</a></nobr> conversion.</p>
+
+<p>The precision takes the form of a period character followed by an
+optional decimal integer:</p>
+
+<pre class="example">
+.[<font color="#0000CC">integer</font>]
+</pre>
+
+<p><nobr>If the</nobr> integer is omitted, it is treated as zero, a
+negative precision argument is taken as if it were missing.</p>
+
+<p><b>Note:</b> <nobr>In C</nobr>, the precision also specifies the
+maximum number of characters to be written from a string in <nobr>'s'
+conversion</nobr>, but &quot;%s&quot; should not be used in the XLISP
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr> or
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+variables, otherwise XLISP will crash.</p></li>
+
+</li>
+
+<li><p><b>Data Type</b> - <nobr>An optional</nobr> character specifying a
+<nobr><a href="#data-type">data type</a></nobr> to be used for the
+conversion.</p>
+
+<p><b>XLISP:</b> Nyquist/XLISP uses <nobr>C 'long'</nobr> signed integers
+and <nobr>C 'double'</nobr> floats only, so with <nobr>floating-point</nobr>
+numbers no special <nobr><a href="#data-type">data type</a></nobr> needs to
+be given, while <a href="#integer">integer</a> conversions should always be
+prefixed by a <nobr>'l' [lowercase L]</nobr>, otherwise the printed
+representation of integer numbers may be differently than the behaviour of
+the Nyquist/XLISP functions.</nobr></p></li>
+
+<li><p><b>Conversion Type</b> - <nobr>A character</nobr> that specifies the
+<nobr><a href="#conversion-type">conversion type</a></nobr> to be
+applied.</p></li>
+
+</ul>
+
+<p><b>Not with Nyquist/XLISP:</b> <nobr>In C</nobr>, a '<nobr>field
+width</nobr>' or 'precision', or both, may be indicated by an asterisk *
+instead of a digit string. In this case, an int argument supplies the field
+width or precision. The arguments specifying field width or precision, or
+both, shall appear [in that order] before the argument [if any] to be
+converted.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="flags"></a>
+
+<hr>
+
+<h2>Flags</h2>
+
+<hr>
+
+<p>The flag characters and their meanings are:</p>
+
+<p><div class="box">
+
+<dl>
+
+<a name="minus-flag"></a>
+
+<dt><p><nobr>&minus;&nbsp; [minus sign character]</nobr></p></dt>
+
+<dd><p>The result of the conversion will be <nobr>left-justified</nobr>
+within the field.</p></dd>
+
+<a name="plus-flag"></a>
+
+<dt><p><nobr>+&nbsp; [plus sign character]</nobr></p></dt>
+
+<dd><p>The result of a signed conversion will always begin with a plus or
+minus sign.</p></dd>
+
+<a name="space-flag"></a>
+
+<dt><p><nobr><i>space</i>&nbsp; [space character]</nobr></p></dt>
+
+<dd><p>If the first character of a signed conversion is not a sign, or if a
+signed conversion results in no characters, a space will be prepended to the
+result. <nobr>If the</nobr> 'space' and
+<nobr><a href="#plus-flag">&nbsp;+&nbsp;</a> flags</nobr> both appear, the
+'space' flag will be ignored.</p></dd>
+
+<a name="hash-flag"></a>
+
+<dt><p><nobr>#&nbsp; [hash character]</nobr></p></dt>
+
+<dd><p>The result is to be converted to an 'alternate form':</p>
+
+<p>Octal Numbers - For o conversion, it increases the precision to force the
+first digit of the result to be a zero.</p>
+
+<p>Hexadecimal Numbers - For x or X conversion, a nonzero result will have
+0x or 0X prepended to it.</p>
+
+<p>Floating-point Numbers - For e, E, f, g, and G conversions, the result
+will always contain a decimal-point character, even if no digits follow it
+(normally, a decimal-point character appears in the result of these
+conversions only if a digit follows it). For g and G conversions, trailing
+zeros will not be removed from the result. For other conversions, the
+behavior is undefined.</p>
+
+</dd>
+
+<a name="zero-flag"></a>
+
+<dt><p><nobr>0&nbsp; [number zero character]</nobr></p></dt>
+
+<dd><p>For integer d, i, o, u, x, X, and floating-point e, E, f, g, G
+conversions, leading zeros [following any indication of sign or base] are
+used to pad to the <nobr><a href="#format-string">field width</a></nobr>.
+<nobr>No <a href="#space-flag">space</a></nobr> padding is performed.
+<nobr>If the</nobr> '0' and
+<nobr><a href="#minus-flag">&nbsp;&minus;&nbsp;</a> flags</nobr> both
+appear, the <nobr>'0' flag</nobr> will be ignored. For integer d, i, o, u,
+x, X conversions, if a <a href="#format-string">precision</a> is specified,
+the <nobr>'0' flag</nobr> will be ignored. <nobr>For other</nobr>
+conversions, the behavior is undefined.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="data-type"></a>
+
+<hr>
+
+<h2>Data Type</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><nobr><b>h</b>&nbsp; [lowercase H character]</nobr></p></dt>
+
+<dd><p>A following d, i, o, u, x, or X conversion specifier applies to a
+short int or unsigned short int argument [the argument will have been
+promoted according to the integral promotions, and its value shall be
+converted to short int or unsigned short int before printing].</p>
+
+<p>A following n conversion specifier applies to a pointer to a short int
+argument.</p></dd>
+
+<dt><p><nobr><b>l</b>&nbsp; [lowercase L character]</nobr></p></dt>
+
+<dd><p>A following d, i, o, u, x, or X conversion specifier applies to a
+long int or unsigned long int argument.</p>
+
+<p>A following n conversion specifier applies to a pointer to a long int
+argument.</p></dd>
+
+<dt><p><nobr><b>L</b>&nbsp; [uppercase L character]</nobr></p></dt>
+
+<dd><p>A following e, E, f, g, or G conversion specifier applies to a long
+double argument.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p>If an h, l, or L appears with any other conversion specifier, the
+behavior is undefined.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="conversion-type"></a>
+
+<hr>
+
+<h2>Conversion Type</h2>
+
+<hr>
+
+<p><b>Integer</b> conversion:</p>
+
+<p><div class="box">
+
+<dl>
+
+<a name="integer"></a>
+
+<dt><p><nobr><b>d</b>, <b>i</b>, <b>o</b>, <b>u</b>, <b>x</b>,
+<b>X</b></nobr></p></dt>
+
+<dd><p>The integer argument is converted to:
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>d</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>signed decimal</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>i</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>signed decimal</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>o</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>unsigned octal</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>u</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>unsigned decimal</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>x</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>unsigned hexadecimal, using 'abcdef'</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>X</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>unsigned hexadecimal, using 'ABCDEF'</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>The <a href="#format-string">precision</a> specifies the minimum number
+of digits to appear. <nobr>If the</nobr> value being converted can be
+represented in fewer digits, it will be expanded with leading zeros. The
+default precision <nobr>is 1</nobr>. The result of converting a zero value
+with an explicit precision of zero results in no characters.</p>
+
+<b>XLISP:</b> Nyquist/XLISP uses <nobr>C 'long'</nobr> signed integers, so
+the integer conversions should always be prefixed by a <nobr>'l' [lowercase
+L]</nobr> indicating a '<nobr>long int</nobr>' <nobr>C
+<a href="#data-type">data type</a></nobr>, otherwise the printed
+representation of integer numbers may be differently than the behaviour of
+the Nyquist/XLISP functions.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p><b>Floating-point</b> conversion:</p>
+
+<p><div class="box">
+
+<dl>
+
+<a name="float-f"></a>
+
+<dt><p><b>f</b></p></dt>
+
+<dd><p>The <nobr>floating-point</nobr> argument of <nobr>C data</nobr> type
+'double' is converted to decimal notation in the style:</p>
+
+<pre class="example">
+[-]<font color="#0000CC">ddd</font>.<font color="#0000CC">ddd</font>
+</pre>
+
+<p>where the number of digits after the <nobr>decimal-point</nobr> character
+is equal to the <a href="#format-string">precision</a> specification.
+<nobr>If the</nobr> <a href="#format-string">precision</a> is missing, it is
+taken <nobr>as 6</nobr>. <nobr>If the</nobr>
+<a href="#format-string">precision</a> is explicitly zero, no
+<nobr>decimal-point</nobr> character appears. <nobr>If a</nobr>
+<nobr>decimal-point</nobr> character appears, at least one digit appears
+<nobr>before it</nobr>. <nobr>The value</nobr> is rounded to the appropriate
+number of digits.</p></dd>
+
+<a name="float-e"></a>
+
+<dt><p><b>e</b>, <b>E</b></p></dt>
+
+<dd><p>The <nobr>floating-point</nobr> argument of <nobr>C data</nobr> type
+'double' is converted in the style:</p>
+
+<pre class="example">
+[-]<font color="#0000CC">d</font>.<font color="#0000CC">ddd</font><font color="#AA0000">e</font>+-<font color="#0000CC">dd</font>
+</pre>
+
+<p>where there is one digit before the <nobr>decimal-point</nobr> character
+[which is nonzero if the argument is nonzero] and the number of digits after
+it is equal to the <a href="#format-string">precision</a>. <nobr>If
+the</nobr> <a href="#format-string">precision</a> is missing, it is taken
+<nobr>as 6</nobr>. <nobr>If the</nobr>
+<a href="#format-string">precision</a> is zero, no
+<nobr>decimal-point</nobr> character appears. <nobr>The value</nobr> is
+rounded to the appropriate number of digits. <nobr>The exponent</nobr>
+always contains at least two digits. <nobr>If the</nobr> value is zero, the
+exponent is zero. <nobr>The &quot;E&quot;</nobr> conversion specifier will
+produce a number with 'E' instead of 'e' introducing the exponent.</p> </dd>
+
+<a name="float-g"></a>
+
+<dt><p><b>g</b>, <b>G</b></p></dt>
+
+<dd><p>The <nobr>floating-point</nobr> argument of <nobr>C data</nobr> type
+'double' is converted in style <a href="#float-f">&nbsp;f&nbsp;</a> or
+<a href="#float-e">&nbsp;e&nbsp;</a> or in style
+<a href="#float-e">&nbsp;E&nbsp;</a> in the case of a &quot;G&quot;
+conversion specifier, with the <a href="#format-string">precision</a>
+specifying the number of significant digits. <nobr>If an</nobr> explicit
+<a href="#format-string">precision</a> is zero, it is taken <nobr>as
+1</nobr>. <nobr>The style</nobr> used depends on the value converted.
+<nobr>Style <a href="#float-">&nbsp;e&nbsp;</a></nobr> will be used only if
+the exponent resulting from such a conversion is less <nobr>than -4</nobr>
+or greater than or equal to the <a href="#format-string">precision</a>.
+Trailing zeros are removed from the fractional portion of the result.
+<nobr>A decimal-point</nobr> character appears only if it is followed by
+<nobr>a digit</nobr>.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p>Other conversion types defined <nobr>in ANSI C</nobr>, but <b>not</b> to
+be used with the XLISP
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr> and
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+variables, because XLISP will produce nonsense or just simply will crash:</p>
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><b>c</b></p></dt>
+
+<dd><p>The integer argument is converted to an '<nobr>unsigned char</nobr>',
+and the resulting character is written.</p>
+
+<p><b>XLISP:</b> If the
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr> or
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+variable is set to &quot;%c&quot;, then with integers or
+<nobr>floating-point</nobr> numbers, the lowest <nobr>8 bit</nobr> of the
+internal binary representation will be interpreted as an
+<a href="">ASCII</a> character.</p></dd>
+
+<dt><p><b>s</b></p></dt>
+
+<dd><p>The argument shall be a pointer to an array of character type.
+Characters from the array are written up to [but not including] a
+terminating null character. <nobr>If the</nobr>
+<a href="#format-string">precision</a> is specified, no more than that many
+characters are written. <nobr>If the</nobr>
+<a href="#format-string">precision</a> is not specified or is greater than
+the size of the array, the array shall contain a null character.</p>
+
+XLISP: If </dd>
+
+<dt><p><b>p</b></p></dt>
+
+<dd><p>The argument shall be a pointer to 'void'. The value of the pointer
+is converted to a sequence of printable characters, in an
+<nobr>implementation-defined</nobr> manner.</p></dd>
+
+<dt><p><b>n</b></p></dt>
+
+<dd><p>The argument shall be a pointer to an integer into which is written
+the number of characters written to the output stream so far by this call to
+the <nobr>C 'fprintf'</nobr> function.<nobr> No argument</nobr> is
+converted.</p></dd>
+
+<dt><p><b>%</b></p></dt>
+
+<dd><p><nobr>A &quot;%&quot;</nobr> is written. <nobr>No argument</nobr> is
+converted. <nobr>The complete</nobr> conversion specification <nobr>shall be
+&quot;%%&quot;</nobr>.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p>If a conversion specification is invalid, the behavior is undefined.
+<nobr>In no</nobr> case does a nonexistent or small
+<nobr><a href="#format-string">field width</a></nobr> cause truncation of a
+field. <nobr>If the</nobr> result of a conversion is wider than the
+<nobr><a href="#format-string">field width</a></nobr>, the field is expanded
+to contain the conversion result.</p>
+
+<p>The minimum value for the maximum number of characters produced by
+any single conversion shall be 509.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/internals/xlisp-internals.html b/docsrc/xlisp/xlisp-doc/internals/xlisp-internals.html
new file mode 100644
index 0000000..2a7ffc0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/internals/xlisp-internals.html
@@ -0,0 +1,1206 @@
+<html><head><title>XLISP Internals</title>
+
+<style type="text/css">
+ pre.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 8px;
+ padding-right: 8px;
+ padding-bottom: 8px;
+ padding-left: 8px;
+ border: #808080;
+ border-style: solid;
+ border-top-width: 1px;
+ border-right-width: 1px;
+ border-bottom-width: 1px;
+ border-left-width: 1px;
+ width:auto;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>XLISP Internals</h1>
+
+<hr>
+
+<p>92Jan14 jsp@glia.biostr.washington.edu [Jeff Prothero]. Public Domain.</p>
+
+<pre>
+ +---------------------+
+ | xlisp 2.1 internals |
+ +---------------------+
+
+ "Trust the Source, Luke, trust the Source!"
+</pre>
+
+<hr>
+
+<h2> Contents</h2>
+
+<hr>
+
+<ol>
+<li><nobr><a href="xlisp-internals.html#SEC01">Who should read this?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC02">What is an LVAL?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC03">What is the obarray?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC04">The Interpreter Stacks</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC05">What is a context?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC06">What is an environment?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC07">How are XLISP entities stored and identified?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC08">How are vectors implemented?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC09">How are strings implemented?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC10">How are symbols implemented?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC11">How are closures implemented?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC12">How are objects implemented?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC13">How are classes implemented?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC14">How is the class hierarchy laid out?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC15">How do we look up the value of a variable?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC16">How are function calls implemented?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC17">How are message-sends implemented?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC18">How is garbage collection implemented?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC19">How are the source files laid out?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC20">How do I add a new primitive fn to xlisp?</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC21">Minor Observations.</a></nobr></li>
+<li><nobr><a href="xlisp-internals.html#SEC22">Acknowledgements.&nbsp;</a></nobr></li>
+</ol>
+
+<a name="SEC01"></a>
+
+<hr>
+
+<h2>Who should read this ?</h2>
+
+<hr>
+
+<p>Anyone poking through the C implementation of XLISP for the first time.
+This is intended to provide a rough roadmap of the global XLISP structures
+and algorithms. If you just want to write lisp code in XLISP, you don't need
+to read this file. Go read the
+<nobr><a href="../manual/xlisp-man-index.htm">XLISP 2.0 Manual</a>,</nobr>
+the <nobr><a href="../tutorials/xlisp-objects.htm">XLisp Objects Primer</a>,</nobr>
+and the <nobr><a href="../reference/reference-index.htm">XLisp Language Reference</a>,</nobr>
+in about that order. If you want to tinker with the XLISP implementation
+code, you should *still* read those three before reading this. The following
+isn't intended to be exhaustively precise, that's what the source code is
+for. It is intended only to allow you a fighting change of understanding the
+code the first time through [instead of the third time].</p>
+
+<p>At the bottom of the file you'll find an example of how to add new
+primitive functions to XLISP.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC02"></a>
+
+<hr>
+
+<h2>What is an LVAL ?</h2>
+
+<hr>
+
+<p>An LVAL is the C type for a generic pointer to an XLISP
+garbage-collectable something. [Cons cell, object, string, closure, symbol,
+vector, whatever.] Virtually every variable in the interpreter is an LVAL.
+Cons cells contain two LVAL slots, symbols contains four LVAL slots,
+etc.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC03"></a>
+
+<hr>
+
+<h2>What is the obarray ?</h2>
+
+<hr>
+
+<p>The obarray is the XLISP symbol table. More precisely, it is a hashtable
+mapping ASCII strings [symbol names] to symbols. [The name 'obarray' is
+traditional but a bit of a misnomer, since it contains only XLISP symbols,
+and in particular contains no XLISP objects.] It is used when converting
+Lisp expressions from text to internal form. Since it is a root for the
+garbage collector, it also serves to distinguish permanent global-variable
+symbols from other symbols. You can permanently protect a symbol from the
+garbage collector by entering it into the obarray. This is called
+'interning' the symbol. The obarray is called 'obarray' in C and
+<a href="../reference/global-obarray.htm">*obarray*</a>
+in XLISP. It is physically implemented as a vector-valued symbol.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC04"></a>
+
+<hr>
+
+<h2>The Interpreter Stacks</h2>
+
+<hr>
+
+<p>XLISP uses two stacks, an 'evaluation stack' and an 'argument stack'.
+Both are roots for the garbage collector. The evaluation stack is largely
+private to the interpreter and protects internal values from garbage
+collection, while the argument stack holds the conventional user-visible
+stackframes.</p>
+
+<p>The evaluation stack is an 'edepth'-long array of LVAL allocated by
+'xldmem.c:xlminit()'. It grows zeroward.</p>
+
+<p>'xlstkbase' points to the zero-near end of the evaluation stack.</p>
+
+<p>'xlstktop' points to the zero-far end of the evaluation stack, the
+occupied part of the stack lies between 'xlstack' and 'xlstktop'. Note that
+'xlstktop' is *NOT* the top of the stack in the conventional sense of
+indicating the most recent entry on the stack. 'xlstktop' is a static bounds
+pointer which never changes once the stack is allocated.</p>
+
+<p>'xlstack' starts at the zero-far end of the evaluation stack. '*xlstack'
+is the most recent LVAL on the stack. The garbage collector marks everything
+reachable from the evaluation stack [among other things], so we frequently
+push things on this stack while C code is manipulating them. [Via
+'xlsave()', 'xlprotect()', 'xlsave1()', 'xlprot1()'.]</p>
+
+<p>The argument stack is an 'adepth'-long array of LVAL. It also grows
+zeroward. The evaluator pushes arguments on the argument stack at the start
+of a function call [form evaluation]. Built-in functions usually eat them
+directly off the stack. For user-lisp functions 'xleval.c:evfun()' pops them
+off the stack and binds them to the appropriate symbols before beginning
+execution of the function body proper.</p>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td colspan="3"><nobr><b>xlargstkbase</b></nobr></td>
+ <td><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">is the zero-near end of argument stack.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr valign="top">
+ <td colspan="3"><nobr><b>xlargstktop</b></nobr></td>
+ <td><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">is the zero-far end of argument stack. Like 'xlstktop',
+ 'xlargstktop' is a static bounds pointer which never changes after the
+ stack is allocated.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>*xlsp</b></nobr></td>
+ <td><nobr><code>&nbsp;</code></nobr></td>
+ <td><nobr>[stack pointer]</nobr></td>
+ <td><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">is the most recent item on the argument stack.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>*xlfp</b></nobr></td>
+ <td><nobr><code>&nbsp;</code></nobr></td>
+ <td><nobr>[frame pointer]</nobr></td>
+ <td><nobr>&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">is the base of the current stackframe.</td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC05"></a>
+
+<hr>
+
+<h2>What is a context ?</h2>
+
+<hr>
+
+<p>A XLISP context is something like a checkpoint, recording a particular
+point buried in the execution history so that we can abort or return back to
+it. Contexts are used to implement call and return, catch and throw,
+signals, gotos, and breaks. 'xlcontext' points to the chain of active
+contexts, the top one being the second-newest active context. [The newest,
+that is, the current, active context is implemented by the variables
+'xlstack', 'xlenv', 'xlfenv', 'xldenv', 'xlcontext', 'xlargv', 'xlargc',
+'xlfp', and 'xlsp'.] Context records are written by 'xljump.c:xlbegin()' and
+read by 'xljump.c:xljump()'. Context records are C structures on the C
+program stack. They are not in the dynamic memory pool or on the Lisp
+execution or argument stacks.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC06"></a>
+
+<hr>
+
+<h2>What is an environment ?</h2>
+
+<hr>
+
+<p>An environment is basically a store of symbol-value pairs, used to
+resolve variable references by the Lisp program. XLISP maintains three
+environments, in the global variables 'xlenv', 'xlfenv' and 'xldenv'.</p>
+
+<p>Lisp supports two sorts of binding, 'lexical binding' and 'dynamic
+binding'. Lexically bound variables are visible only in code textually
+within their binding form. Dynamically bound variables are visible in any
+code *called* from the binding form. [Either kind of binding may be shadowed
+by other declarations, of course.] Historically, Lisp has been moving from
+dynamic binding [which is easy for interpreters to handle], to lexical
+binding [which is easy for humans and compilers to handle]. Almost all XLISP
+binding forms are lexically scoped. The most important exception is
+<a href="../reference/progv.htm">progv</a>.</p>
+
+<p>'xlenv' and 'xlfenv' track lexical bindings. 'xlenv' and 'xlfenf' are
+conceptually a single environment, although they are implemented separately.
+They are linked-list stacks which are pushed when we enter a function and
+popped when we exit it. We also switch 'xlenv+xlfenf' environments entirely
+when we begin executing a new closure [user-function written in Lisp].</p>
+
+<p>The 'xlenv' environment is the most heavily used environment. It is used
+to resolve everyday data references to local variables. It consists of a
+list of frames [and objects]. Each frame is a list of symbol-value pairs. In
+the case of an object, we check all the instance and class variables of the
+object, then do the same for its superclass, until we run out of
+superclasses.</p>
+
+<p>The 'xlfenv' environment is maintained strictly parallel to 'xlenv', but
+is used to find function values instead of variable values. The separation
+may be partly for lookup speed and partly for historical reasons. Merging
+these two lists into a single list [while distinguishing function bindings
+from variable bindings, of course] would slightly decrease fn enter/exit
+overhead while increasing the overhead of looking up each variable or
+function binding.</p>
+
+<p>When we send a message, we set 'xlenv' to the value it had when the
+message closure was built, then push on (obj msg-class), where 'msg-class'
+is the [super]class defining the method. [We also set 'xlfenv' to the value
+'xlfenv' had when the method was built.] This makes the object instance
+variables part of the environment, and saves the information needed to
+correctly resolve references to class variables, and to implement
+<a href="../reference/send-super.htm">send-super</a>.</p>
+
+<p>The 'xldenv' environment tracks dynamic bindings. It is a simple list of
+symbol-value pairs, treated as a stack.
+<a href="../reference/progv.htm">progv</a> uses it to save the old
+values of symbols it binds, and it is also used to save old values of
+'s_evalhook' and 's_applyhook'
+[<a href="../reference/global-evalhook.htm">*evalhook*</a> and
+<a href="../reference/global-applyhook.htm">*applyhook*</a>]. These latter
+mostly support the debug facilities.</p>
+
+<p>These environments are manipulated in C via the 'xlisp.h' macros
+'xlframe(e)', 'xlbind(s,v)', 'xlfbind(s,v)', 'xlpbind(s,v,e)',
+'xldbind(s,v)', 'xlunbind(e)'.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC07"></a>
+
+<hr>
+
+<h2>How are XLISP entities stored and identified ?</h2>
+
+<hr>
+
+<p>Conceptually, XLISP manages memory as a single array of fixed-size
+objects. Keeping all objects the same size simplifies memory management
+enormously, since any object can be allocated anywhere, and complex
+compacting schemes aren't needed. Every LVAL pointer points somewhere in
+this array. Every XLISP object has the basic format <nobr>'xldmem.h:typdef
+struct node':</nobr></p>
+
+<pre class="example">
+struct node {
+ char n_type;
+ char n_flags;
+ LVAL car;
+ LVAL cdr;
+}
+</pre>
+
+<p>where 'n_type' is one of:</p>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr><b>FREE</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a node on the freelist.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>SUBR</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a function implemented in C. [Needs evaluated arguments.]</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>FSUBR</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a 'special form' implemented in C. [Needs unevaluated arguments.]</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>CONS</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a regular lisp cons cell.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>SYMBOL</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a symbol.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>FIXNUM</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">an integer.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>FLONUM</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a floating-point number.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>STRING</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a string.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>OBJECT</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">any object, including
+ <a href="../reference/class.htm">class</a> objects.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>STREAM</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">an input or output file.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>VECTOR</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a variable-size array of LVALs.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>CLOSURE</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">result of <a href="../reference/defun.htm">defun</a>
+ or <a href="../reference/lambda.htm">lambda</a>, a function
+ written in Lisp.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>CHAR</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">an ASCII character.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>USTREAM</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">an internal stream.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>STRUCT</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a structure.</td>
+</tr>
+</tbody></table></p>
+
+<p>Messages may be sent only to nodes with a 'n_type' of OBJECT.</p>
+
+<p>Obviously, several of the above types won't fit in a fixed-size two-slot
+node. The escape is to have them 'malloc()' some memory and have one of the
+slots point to it. VECTOR is the archetype. For example, see
+'xldmem.c:newvector()'. To some extent, this 'malloc()' hack simply exports
+the memory fragmentation problem to the C 'malloc()/free()' routines.
+However, it helps keep XLISP simple, and it has the happy side-effect of
+unpinning the body of the vector, so that vectors can easily be expanded and
+contracted.</p>
+
+<p>The garbage collector has special-case code for each of the above node
+types, so it can find all LVAL slots and recycle any 'malloc()'-ed ram when
+a node is garbage-collected.</p>
+
+<p>XLISP pre-allocates nodes for all ASCII characters, and for small
+integers. These nodes are never garbage-collected.</p>
+
+<p>As a practical matter, allocating all nodes in a single array is not very
+sensible. Instead, nodes are allocated as needed, in segments of one or two
+thousand nodes, and the segments linked by a pointer chain rooted at
+'xldmem.c:segs'.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC08"></a>
+
+<hr>
+
+<h2>How are vectors implemented ?</h2>
+
+<hr>
+
+<p>An XLISP vector is a generic array of LVAL slots. Vectors are also the
+canonical illustration of XLISP's escape mechanism for node types which need
+more than two LVAL slots [the maximum possible in the fixed-size nodes in
+the dynamic memory pool]. The node CAR/CDR slots for a vector hold a size
+field plus a pointer to a 'malloc()'-ed ram chunk, which is automatically
+'free()'-ed when the vector is garbage-collected.</p>
+
+<p>'xldmem.h' defines macros for reading and writing vector fields and
+slots, 'getsize()', 'getelement()' and 'setelement()'. It also defines
+macros for accessing each of the other types of XLISP nodes.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC09"></a>
+
+<hr>
+
+<h2>How are strings implemented ?</h2>
+
+<hr>
+
+<p>Strings work much like vectors. The node has a pointer to a 'malloc()'-ed
+ram chunk which is automatically 'free()'-ed when the string gets
+garbage-collected.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC10"></a>
+
+<hr>
+
+<h2>How are symbols implemented ?</h2>
+
+<hr>
+
+<p>A symbol is a generic user-visible Lisp variable, with separate slots for
+print name, value, function, and property list. Any or all of these slots
+[including name] may be NIL.</p>
+
+<p>You create an XLISP symbol from C by calling 'xlmakesym(name)' or
+'xlenter(name)' [to make a symbol and enter it in the obarray].</p>
+
+<p>You may create symbols from XLISP by explicitly calling
+<a href="../reference/gensym.htm">gensym</a>,
+<a href="reference/make-symbol.htm">make-symbol</a> [uninterned symbols],
+or <a href="../reference/intern.htm">intern</a> [interned symbol].
+However, the Lisp reader will create symbols on sight, so most Lisp symbols
+are created as side-effects of expressions like:</p>
+
+<pre class="example">
+'name
+</pre>
+
+<p>A symbol is <a href="../reference/intern.htm">intern</a>ed if it
+is listed in the <a href="../reference/global-obarray.htm">*obarray*</a>.
+Various parts of the system, like the Lisp reader, treat the
+<a href="../reference/global-obarray.htm">*obarray*</a>
+essentially as the list of all known symbols. It is unusual but occasionally
+useful to create uninterned symbols. You can make
+<a href="../reference/read.htm">read</a> create an uninterned
+symbol by preceding it with '#:'. In XLISP, a newly created symbol has no
+value unless its name begins with a ':', in which case it has itself for its
+value. Handy for keywords and message selectors.]</p>
+
+<p>Most of the symbol-specific code in the interpreter is in 'xlsym.c'.</p>
+
+<p>Physically, a symbol is implemented like a four-slot vector [print name,
+value, function, and property list].</p>
+
+<p>Random musing: Abstractly, the Lisp symbols plus cons cells [etc.]
+constitute a single directed graph, and the symbols mark spots where normal
+recursive evaluation should stop. Normal Lisp programming practice is to
+have a symbol in every cycle in the graph, so that recursive traversal can
+be done without mark bits.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC11"></a>
+
+<hr>
+
+<h2>How are closures implemented ?</h2>
+
+<hr>
+
+<p>A closure, the return value from a
+<a href="../reference/lambda.htm">lambda</a>, is a regular
+coded-in-lisp function. Physically, it is implemented like an eleven-slot
+vector, with the node 'n_type' field hacked to contain CLOSURE instead of
+VECTOR. The vector slots contain:</p>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr><b>name</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">a symbol, the first argument of
+ <a href="../reference/defun.htm">defun</a>.
+ <a href="../reference/nil.htm">nil</a> for
+ <a href="../reference/lambda.htm">lambda</a> closures.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>type</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">'s_lambda' or 's_macro'. Must be 's_lambda' to be
+ executable.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>args</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">list of required formal arguments [as symbols].</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>oargs</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">list of
+ <a href="../reference/lambda-keyword-optional.htm">&amp;optional</a> arguments,
+ each like <nobr>(name (default specified-p)).</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>rest</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">name of '&amp;rest' formal arguments, else
+ <a href="../reference/nil.htm">nil</a>.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>kargs</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><a href="../reference/lambda-keyword-key.htm">&amp;key</a>-word
+ arguments, each like <nobr>((':foo 'bar default specified-p))</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>aargs</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><a href="../reference/lambda-keyword-aux.htm">&amp;aux</a>
+ variables, each like <nobr>(('arg default)).</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>body</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">actual code [as a Lisp list] for the function.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>env</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">value of 'xlenv' when the closure was built.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>fenv</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">value of 'xlfend' when the closure was built.</td>
+</tr>
+<tr valign="top">
+ <td><nobr><b>lambda</b></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the original formal args list in the
+ <a href="../reference/defun.htm">defun</a> or
+ <a href="../reference/lambda.htm">lambda</a>.</td>
+</tr>
+</tbody></table></p>
+
+<p>The lambda field is for printout purposes. The remaining fields store a
+predigested version of the formal arguments list. This is a limited form of
+compilation. By processing the arguments list at closure-creation time, we
+reduce the work needed during calls to the closure.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC12"></a>
+
+<hr>
+
+<h2>How are objects implemented ?</h2>
+
+<hr>
+
+<p>An object is implemented like a vector, with the size determined by the
+number of instance variables. The first slot in the vector points to the
+class of the object, the remaining slots hold the instance variables for the
+object. An object needs enough slots to hold all the instance variables
+defined by its class, *plus* all the instance variables defined by all of
+its superclasses.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="SEC13"></a>
+
+<hr>
+
+<h2>How are classes implemented ?</h2>
+
+<hr>
+
+<p>A class is a specific kind of object, hence has a class pointer plus
+instance variables. All classes have the following instance variables:</p>
+
+<pre>
+ MESSAGES a list of <nobr>(interned-symbol method-closure)</nobr> pairs.
+ IVARS instance variable names, a list of interned symbols.
+ CVARS class variable names, a list of interned symbols.
+ CVALS class variable values, a vector of values.
+ SUPERCLASS a pointer to the superclass.
+ IVARCNT the number of class instance variables, a fixnum.
+ IVARTOTAL the total number of instance variables, a fixnum.
+</pre>
+
+<p>IVARCNT is the count of the number of instance variables defined by our
+class. IVARTOTAL is the total number of instance variables in an object of this
+class -- IVARCNT for this class plus the IVARCNTs from all of our
+superclasses.</p>
+
+<table cellpadding="0"><tbody><tr><td>&nbsp;</td><td bgcolor="eeeeee">
+&nbsp;&nbsp;<a href="xlisp-internals.html#SEC00">Back to Top</a></nobr></li>
+</tr></tbody></table>
+
+<h3><a name="SEC14">How is the class hierarchy laid out ?</a></h3>
+
+<p>The fundamental objects are the OBJECT and CLASS class objects. (Both are
+instances of class CLASS, and since CLASSes are a particular kind of OBJECT,
+both are also objects, with n_type==OBJECT. Bear with me!)</p>
+
+<p>OBJECT is the root of the class hierarchy: everything you can send a message
+to has OBJECT as its class or super*class. (Vectors, chars, integers and so
+forth stand outside the object hierarchy -- you can't send messages to them. I'm
+not sure why Dave did it this way.) OBJECT defines the messages:</p>
+
+<pre>
+ :isnew -- Does nothing but return the object.
+ :class -- Returns contents of class-pointer slot.
+ :show -- Prints names of obj, obj-&gt;class and instance vars.
+</pre>
+
+<p>Since a CLASS is a specialized type of OBJECT (with instance variables like
+MESSAGES which generic OBJECTs lack), class CLASS has class OBJECT as its
+superclass. The CLASS object defines the messages:</p>
+
+<pre>
+ :new -- Create new object with self.IVARTOTAL LVAR slots, plus
+ one for the class pointer. Point class slot to self.
+ Set new.n_type char to OBJECT.
+ :isnew -- Fill in IVARS, CVARS, CVALS, SUPERCLASS, IVARCNT and
+ IVARTOTAL, using parameters from :new call. (The
+ :isnew msg inherits the :new msg parameters because
+ the :isnew msg is generated automatically after
+ each :new msg, courtesy of a special hack in
+ xlobj.c:sendmsg().)
+ :answer -- Add a (msg closure) pair to self.MESSAGES.
+</pre>
+
+<p>Here's a figure to summarize the above, with a generic object thrown in for
+good measure. Note that all instances of CLASS will have a SUPERCLASS pointer,
+but no normal object will. Note also that the messages known to an object are
+those which can be reached by following exactly one Class Ptr and then zero or
+more Superclass Ptrs. For example, the generic object can respond to :ISNEW,
+:CLASS and :SHOW, but not to :NEW or :ANSWER. (The functions implementing the
+given messages are shown in parentheses.)</p>
+
+<pre>
+ NIL
+ ^
+ |
+ |Superclass Ptr
+ |
+ Msg+--------+
+ :isnew (xlobj.c:obisnew) &lt;----| class |Class Ptr
+ :class (xlobj.c:obclass) &lt;----| OBJECT |------------------------------&gt;+
+ :show (xlobj.c:objshow) &lt;----| | |
+ +--------+ |
+ ^ ^ ^ |
+ +---------+ | | | |
+ | generic |Class Ptr | | +&lt;---------------+ |
+ | object |--------------&gt;+ |Superclass Ptr ^Superclass Ptr |
+ +---------+ | | |
+ Msg+--------+ +---------+ |
+ :isnew (xlobj.c:clnew) &lt;----| class |Class Ptr | generic |Class Ptr |
+ :new (xlobj.c:clisnew) &lt;----| CLASS |-------&gt;+ | CLASS |-------&gt;+ |
+ :answer(xlobj.c:clanswer)&lt;----| | | | | | |
+ +--------+ | +---------+ | |
+ ^ ^ | | |
+ | | v v |
+ | +-----------+ &lt;------------------+ v
+ +&lt;------------------------------------+
+</pre>
+
+<p>Thus, class CLASS inherits the :CLASS and :SHOW messages from class OBJECT,
+overrides the default :ISNEW message, and provides new messages :NEW and
+:ANSWER.</p>
+
+<p>New classes are created by (send CLASS :NEW ...) messages. Their Class Ptr
+will point to CLASS. By default, they will have OBJECT as their superclass, but
+this can be overridden by the second optional argument to :NEW.</p>
+
+<p>The above basic structure is set up by xlobj.c:xloinit().</p>
+
+<table cellpadding="0"><tbody><tr><td>&nbsp;</td><td bgcolor="eeeeee">
+&nbsp;&nbsp;<a href="xlisp-internals.html#SEC00">Back to Top</a></nobr></li>
+</tr></tbody></table>
+
+<h3><a name="SEC15">How do we look up the value of a variable ?</a></h3>
+
+<p>When we're cruising along evaluating an expression and encounter a symbol,
+the symbol might refer to a global variable, an instance variable, or a class
+variable in any of our superclasses. Figuring out which means digging through
+the environment. The canonical place this happens is in xleval.c:xleval(), which
+simply passes the buck to xlsym.c:xlgetvalue(), which in turn passes the buck to
+xlxsym.c:xlxgetvalue(), where the fun of scanning down xlenv begins. The xlenv
+environment looks something like</p>
+
+<pre>
+ Backbone Environment frame contents
+ -------- --------------------------
+ xlenv --&gt; frame ((sym val) (sym val) (sym val) ... )
+ frame ...
+ object (obj msg-class)
+ frame ...
+ object ...
+ frame ...
+ ...
+</pre>
+
+<p>The "frame" lines are due to everyday nested constructs like LET expressions,
+while the "object" lines represent an object environment entered via a message
+send. xlxgetvalue scans the enviroment left to right, and then top to bottom. It
+scans down the regular environment frames itself, and calls
+xlobj.c:xlobjgetvalue() to search the object environment frames.</p>
+
+<p>xlobjgetvalue() first searches for the symbol in the msg-class, then in all
+the successive superclasses of msg-class. In each class, it first checks the
+list of instance-variable names in the IVARS slot, then the list of
+class-variables name in the CVARS slot.</p>
+
+<table cellpadding="0"><tbody><tr><td>&nbsp;</td><td bgcolor="eeeeee">
+&nbsp;&nbsp;<a href="xlisp-internals.html#SEC00">Back to Top</a></nobr></li>
+</tr></tbody></table>
+
+<h3><a name="SEC16">How are function calls implemented ?</a></h3>
+
+<p>xleval.c contains the central expression-evaluation code. xleval.c:xleval()
+is the standard top-level entrypoint. The two central functions are
+xleval.c:xlevform() and xleval.c:evfun(). xlevform() can evaluate four kinds of
+expression nodes:</p>
+
+<p><b>SUBR:</b> A normal primitive fn coded in C. We call evpushargs() to
+evaluate and push the arguments, then call the primitive.</p>
+
+<p><b>FSUBR:</b> A special primitive fn coded in C, which (like IF) wants its
+arguments unevaluated. We call pushargs() (instead of evpushargs()) and then the
+C fn.</p>
+
+<p><b>CLOSURE:</b> A preprocessed written-in-lisp fn from a DEFUN or LAMBDA. We
+call evpushargs() and then evfun().</p>
+
+<p><b>CONS:</b> We issue an error if CONS.car isn't a LAMBDA, otherwise we call
+xleval.c:xlclose() to build a CLOSURE from the LAMBDA, and fall into the CLOSURE
+code.</p>
+
+<p>The common thread in all the above cases is that we call evpushargs() or
+pushargs() to push all the arguments on the evaluation stack, leaving the number
+and location of the arguments in the global variables xlargc and xlargv. The
+primitive C functions consume their arguments directly from the argument
+stack.</p>
+
+<p>xleval.c:evfun() evaluates a CLOSURE by:</p>
+
+<p>(1) Switching xlenv and xlfenv to the values they had when the CLOSURE was
+built. (These values are recorded in the CLOSURE.)</p>
+
+<p>(2) Binding the arguments to the environment. This involves scanning through
+the section of the argument stack indicated by xlargc/xlargv, using information
+from the CLOSURE to resolve keyword arguments correctly and assign appropriate
+default values to optional arguments, among other things.</p>
+
+<p>(3) Evaluating the body of the function via xleval.c:xleval().</p>
+
+<p>(4) Cleaning up and restoring the original environment.</p>
+
+<table cellpadding="0"><tbody><tr><td>&nbsp;</td><td bgcolor="eeeeee">
+&nbsp;&nbsp;<a href="xlisp-internals.html#SEC00">Back to Top</a></nobr></li>
+</tr></tbody></table>
+
+<h3><a name="SEC17">How are message-sends implemented ?</a></h3>
+
+<p>We scan the MESSAGES list in the CLASS object of the recipient, looking for a
+(message-symbol method) pair that matches our message symbol. If necessary, we
+scan the MESSAGES lists of the recipient's superclasses too.
+(xlobj.c:sendmsg().) Once we find it, we basically do a normal function
+evaluation. (xlobjl.c:evmethod().)</p>
+
+<p>Two differences between message-send and normal function invocation:</p>
+
+<p>1) We need to replace the message-symbol by the recipient on the argument
+stack to make "self" available in the method closure.</p>
+
+<p>2) We need to push an 'object' stack entry on the xlenv environment to record
+which class is handling the message (so that, for example, SEND-SUPER can find
+our superclass).</p>
+
+<table cellpadding="0"><tbody><tr><td>&nbsp;</td><td bgcolor="eeeeee">
+&nbsp;&nbsp;<a href="xlisp-internals.html#SEC00">Back to Top</a></nobr></li>
+</tr></tbody></table>
+
+<h3><a name="SEC18">How is garbage collection implemented ?</a></h3>
+
+<p>The dynamic memory pool managed by xlisp consists of a chain of memory
+segments (xldmem.h:struct segment) rooted at global C variable "segs". Each
+segment contains an array of "struct node"s plus a pointer to the next segment.
+Each node contains a n_type field and a MARK bit, which is zero except during
+garbage collection.</p>
+
+<p>Xlisp uses a simple, classical mark-and-sweep garbage collector. When it runs
+out of memory (fnodes==NIL), it does a recursive traversal setting the MARK flag
+on all nodes reachable from the obarray, the three environments
+xlenv/xlfenv/xldenv, and the evaluation and argument stacks. (A "switch" on the
+n_type field tells us how to find all the LVAL slots in the node (plus
+associated storage), and a pointer-reversal trick lets us avoid using too much
+stack space during the traversal.) sweep() then adds all un-MARKed LVALs to
+fnodes, and clears the MARK bit on the remaining nodes. If this fails to produce
+enough free nodes, a new segment is malloc()ed.</p>
+
+<p>The code to do this stuff is mostly in xldmem.c.</p>
+
+<table cellpadding="0"><tbody><tr><td>&nbsp;</td><td bgcolor="eeeeee">
+&nbsp;&nbsp;<a href="xlisp-internals.html#SEC00">Back to Top</a></nobr></li>
+</tr></tbody></table>
+
+<h3><a name="SEC19">How are the source files laid out ?</a></h3>
+
+<p>To really understand the source, of course, you simply have to sit down and
+read it. There's no royal road to hacking! So this is a map of the source, not a
+picture of it.</p>
+
+<p>The core portable xlisp files have the prefix 'xl' (for 'xlisp').</p>
+
+<p>The best place to start reading the code is in the two main header files,
+xlisp.h and xldmem.h.</p>
+
+<p>The xldmem.h file ('dmem' for 'dynamic memory') defines the actual structure
+in memory of all the primitive xlisp data types. This is the file you will most
+likely refer to most often.</p>
+
+<p>The xlisp.h file defines essentially all global constants and macros which
+don't need to know about the structures in xldmem.h, mainly manifest constants
+sizing various arrays for different machines, and macros to test for the type of
+a list object and to help parse xlisp argument lists.</p>
+
+<p>The central code files to understand are xlmain.c, xleval.c, xlbfun.c, and
+xlsym.c.</p>
+
+<p><b>xlmain.c</b> contains both main() and the central read-eval-print loop, so
+it is the place from which to begin tracing flow of control.</p>
+
+<p><b>xleval.c</b> (with some support from xlbfun.) contains the heart of xlisp,
+the code to evaluate functions and macros.</p>
+
+<p><b>xlsym.c</b> contains the code to find the value of a symbol.</p>
+
+<p>Once you understand the above three, you know where xlisp decides to evaluate
+an s-expression, how it evaluates it, and how it finds the values needed by the
+expression.</p>
+
+<p>A good file to tackle next is xlobj.c, which handles much of the
+object-oriented support, and has much of the flavor of xleval.c.</p>
+
+<p>Most of the other files are just libraries of functions to handle particular
+types of processing, and are easily understood once the central code is
+grokked.</p>
+
+<p>One of the charms of xlisp *is* that it is small enough to easily read and
+comprehend. I hope it stays that way!</p>
+
+<p>Here's a very brief file-by-file overview of the source. Your files will
+probably be laid out just a little differently. In particular, if you're not
+running on unix, instead of 'unixstuff.c' you'll have something like
+'dosstuff.c'.</p>
+
+<pre>
+ Size Name Contains
+ ----- -------- --------
+ 2054 osdefs.h System specific declarations. Empty file in my case.
+ 2050 osptrs.h System specific pointers. Empty file in my case.
+ 14172 unixstuff.c Isolates I/O fns, which tend to be OS-specific. Unix version.
+ 19049 xlbfun.c 'Basic FUNctions': highlevel eval stuff + random support.
+ 30229 xlcont.c 'CONTrol': case, do, while, dotimes, other special forms.
+ 6380 xldbug.c 'DeBUG': break, abort, error, baktrace...
+ 18006 xldmem.c 'Dynamic MEMory': ram allocation, garbage collector.
+ 9431 xldmem.h Declaration of LVAL, scads of useful macros.
+ 21220 xleval.c 'EVALuation': eval, apply, macroexpand and support for them.
+ 11935 xlfio.c 'File I/O': OPEN, READ-CHAR, WRITE-CHAR ...
+ 18481 xlftab.c 'Function TABle': Array of all xlisp primitives.
+ 4866 xlglob.c 'GLOBal variables': Boring list of declarations.
+ 11048 xlimage.c 'memory IMAGE': Code to save/restore contents of xlisp.
+ 10579 xlinit.c 'INITialization': Start-of-the-world setup code.
+ 6016 xlio.c 'Input/Output': misc I/O stuff, some called by xlfio.c.
+ 12664 xlisp.h consp() ..., xlgetarg() ..., misc types.
+ 5853 xljump.c catch, throw, return ...
+ 20723 xllist.c car, cdr, append, map ... basic list manipulation.
+ 11975 xlmath.c Arithmetic functions -- addition, multiplication ...
+ 16425 xlobj.c Object support -- create objects &amp; classes, send msgs...
+ 4134 xlpp.c A little prettyprinter.
+ 9487 xlprin.c Print an arbitrary lisp value in ascii.
+ 19535 xlread.c Read in an arbitrary ascii lisp expression.
+ 15062 xlstr.c Manipulation of characters and strings.
+ 12889 xlstruct.c Lisp structures -- defstruct and kin.
+ 5957 xlsubr.c eq, equal, some internal utility fns.
+ 7019 xlsym.c Symbols and obarrays ... maksym, getvalue, getprop...
+ 5566 xlsys.c Misc stuff -- read file, print backtrace, peek/poke...
+ 3926 xmain.c main(), with top read-eval-print loop.
+</pre>
+
+<table cellpadding="0"><tbody><tr><td>&nbsp;</td><td bgcolor="eeeeee">
+&nbsp;&nbsp;<a href="xlisp-internals.html#SEC00">Back to Top</a></nobr></li>
+</tr></tbody></table>
+
+<h3><a name="SEC20">How do I add a new primitive fn to xlisp ?</a></h3>
+
+<p>A preliminary comment: You should have a copy of Guy L Steele's "Common Lisp:
+The Language" (2nd Edition), and make your new primitives compatible with the
+standard whenever practical.</p>
+
+<p>Add a line to the end of xlftab.c:funtab[]. This table contains a list of
+triples:</p>
+
+<p>The first element of each triple is the function name as it will appear to
+the programmer. Make it all upper case.</p>
+
+<p>The second element is S (for SUBR) if (like most fns) your function wants its
+arguments pre-evaluated, else F (for FSUBR).</p>
+
+<p>The third element is the name of the C function to call.</p>
+
+<p>Remember that your arguments arrive on the xlisp argument stack rather than
+via the usual C parameter mechanism.</p>
+
+<p>CAUTION: Try to keep your files separate from generic xlisp files, and to
+minimize the number of changes you make in the generic xlisp files. This way,
+you'll have an easier time re-installing your changes when new versions of xlisp
+come out. For example, if you are going to add many primitive functions to your
+xlisp, use an #include file rather than putting them all in xlftab.c. It's a
+good idea to put a marker (like a comment with your initials) on each line you
+change or insert in the generic xlisp fileset.</p>
+
+<p>CAUTION: Remember that you usually need to protect the LVAL variables in your
+function from the garbage-collector. It never hurts to do this, and often
+produces obscure bugs if you do not. You protect uninitialized local variables
+with xlsave1() and initialized local variables with xlprot1().</p>
+
+<p>BE CAREFUL NOT TO PROTECT UNINITIALIZED LOCAL VARIABLES WITH XLPROT1() OR
+XLPROTECT()! This will appear to work fine until garbage collection happens at
+an inconvenient moment, at which point the garbage collector will wind up
+following your uninitialized pointer off to never-never land.</p>
+
+<p>Note: If you have several pointers to protect, you can save a little runtime
+and codespace by using xlstkcheck(number-of-variables-to-protect) followed by
+xlsave()s and xlprotect()s instead of the more expensive xlsave1()s and
+xlprot1()s.</p>
+
+<p>Generic code for a new primitive fn:</p>
+
+<pre>
+ /* xlsamplefun - do useless stuff. */
+ /* Called like (samplefun '(a c b) 1 2.0) */
+ LVAL xlsamplefun()
+ {
+ /* Variables to hold the arguments: */
+ LVAL list_arg, integer_arg, float_arg;
+
+ /* Get the arguments, with appropriate errors */
+ /* if any are of the wrong type. Look in */
+ /* xlisp.h for macros to read other types of */
+ /* arguments. Look in xlmath.c for examples */
+ /* of functions which can handle an argument */
+ /* which may be either int or float: */
+ list_arg = xlgalist() ; /* "XLisp Get A LIST" */
+ integer_arg = xlgafixnum(); /* "XLisp Get A FIXNUM" */
+ float_arg = xlgaflonum(); /* "XLisp Get A FLONUM" */
+
+ /* Issue an error message if there are any extra arguments: */
+ xllastarg();
+
+ /* Call a separate C function to do the actual */
+ /* work. This way, the main function can */
+ /* be called from both xlisp code and C code. */
+ /* By convention, the name of the xlisp wrapper */
+ /* starts with "xl", and the native C function */
+ /* has the same name minus the "xl" prefix: */
+ return samplefun( list_arg, integer_arg, float_arg );
+ }
+ LVAL samplefun( list_arg, integer_arg, float_arg )
+ LVAL list_arg, integer_arg, float_arg;
+ {
+ FIXTYPE val_of_integer_arg;
+ FLOTYPE val_of_float_arg;
+
+ /* Variables which will point to LISP objects: */
+ LVAL result;
+ LVAL list_ptr;
+ LVAL float_ptr;
+ LVAL int_ptr;
+
+ /* Protect our internal pointers by */
+ /* pushing them on the evaluation */
+ /* stack so the garbage collector */
+ /* can't recycle them in the middle */
+ /* of the routine: */
+ xlstkcheck(4); /* Make sure following xlsave */
+ /* calls won't overrun stack. */
+ xlsave(list_ptr); /* Use xlsave1() if you don't */
+ xlsave(float_ptr);/* do an xlstkcheck(). */
+ xlsave(int_ptr);
+ xlsave(result);
+
+ /* Semantic check, illustrating use of xlfail(): */
+ if (list_ptr == NIL) {
+ xlfail("null list");
+ /* Won't return. */
+ }
+
+ /* Create an internal list structure, protected */
+ /* against garbage collection until we exit fn: */
+ list_ptr = cons(list_arg,list_arg);
+
+ /* Get the actual values of our fixnum and flonum: */
+ val_of_integer_arg = getfixnum( integer_arg );
+ val_of_float_arg = getflonum( float_arg );
+
+ /* Semantic check, illustrating use of xlerror(): */
+ if (val_of_integer_arg &lt; -2) {
+ xlerror("bad integer",cvfixnum(val_of_integer_arg));
+ /* Won't return. */
+ }
+
+ /*******************************************/
+ /* You can have any amount of intermediate */
+ /* computations at this point in the fn... */
+ /*******************************************/
+
+ /* Make new numeric values to return: */
+ integer_ptr = cvfixnum( val_of_integer_arg * 3 );
+ float_ptr = cvflonum( val_of_float_arg * 3.0 );
+
+ /* Cons it all together to produce a return value: */
+ result = cons( float_ptr, NIL );
+ result = cons( integer_ptr, result );
+ result = cons( list_ptr, result );
+
+ /* Restore the stack, canceling the xlsave()s: */
+ xlpopn(4); /* Use xlpop() for a single argument.*/
+
+ return result;
+ }
+</pre>
+
+<p><b>Example of what NOT to do:</b></p>
+
+<p>Here's a function I wrote which does *NOT* correctly prevent the garbage
+collector from stealing its dynamically allocated cells:</p>
+
+<pre>
+ LVAL incorrect_Point_To_List( p )/*DON'T USE THIS CODE! */
+ geo_point* p;
+ /*-
+ Convert point to (x y z) list.
+ -*/
+ {
+ LVAL result;
+ xlsave1(result);
+ result = cons( /* THIS CODE IS BROKEN! */
+ cvflonum( p-&gt;x), /* THIS CODE IS BROKEN! */
+ cons( /* THIS CODE IS BROKEN! */
+ cvflonum( p-&gt;y), /* THIS CODE IS BROKEN! */
+ cons( /* THIS CODE IS BROKEN! */
+ cvflonum(p-&gt;z), /* THIS CODE IS BROKEN! */
+ NIL /* THIS CODE IS BROKEN! */
+ ) /* THIS CODE IS BROKEN! */
+ ) /* THIS CODE IS BROKEN! */
+ ); /* THIS CODE IS BROKEN! */
+ xlpop();
+ return result;
+ }
+</pre>
+
+<p>The problem with the above function is that the "z" cell will be allocated
+first, and is not protected during the allocation of the "y" flonum (or vice
+versa, depending on the order the compiler chooses to evaluate these arguments).
+Similarly, the "y" cell is not protected during allocation of the "x" flonum.
+Here is a correct version, in which "result" always protects the
+list-to-date:</p>
+
+<pre>
+ LVAL correct_Point_To_List( p )
+ geo_point* p;
+ /*-
+ Convert point to (x y z) list.
+ -*/
+ {
+ LVAL result;
+ xlsave1(result);
+ result = cons( cvflonum(p-&gt;z), NIL );
+ result = cons( cvflonum(p-&gt;y), result );
+ result = cons( cvflonum(p-&gt;x), result );
+ xlpop();
+ return result;
+ }
+</pre>
+
+<table cellpadding="0"><tbody><tr><td>&nbsp;</td><td bgcolor="eeeeee">
+&nbsp;&nbsp;<a href="xlisp-internals.html#SEC00">Back to Top</a></nobr></li>
+</tr></tbody></table>
+
+<h3><a name="SEC21">Minor Observations:</a></h3>
+
+<p>xlapply, xlevform and sendmsg will issue an error if they encounter a s_macro
+CLOSURE. You are not allowed to use APPLY or FUNCALL with macros in Common Lisp.
+There is no way provided to declare macro methods, nor do they make much
+sense...</p>
+
+<p>Neither xlapply nor sendmsg will handle FSUBRs. Common Lisp does not allow
+APPLYing a special form (FSUBR), and since SEND is a SUBR, all of its arguments
+are already evaluated, so it is not possible to have FSUBR methods.</p>
+
+<p>Since xlisp tracks the three most recent input expressions (in variables +,
+++ and +++) and three most recent results (in variables *, ** and ***), things
+may occasionally not get garbage-collected as soon as you expect!</p>
+
+<p>Both xlobj.c:xloinit() and xlobj.c:obsymvols() initialize the "object" and
+"class" variables. This is neither redundant nor a bug:</p>
+
+<p>xloinit creates the classes class and object, as well as the symbols, but
+sets the C variables class and object to point to the class and object.</p>
+
+<p>obsymbols just sets the C variables by looking up the symbols. It is needed
+because when you restore a workspace you don't create new objects but still need
+to know where the existing objects are (they might be in a different location in
+the saved workspace). Notice that obsymbols is called by xlsymbols which is
+called both when initializing a new workspace and when restoring an old
+workspace.</p>
+
+<table cellpadding="0"><tbody><tr><td>&nbsp;</td><td bgcolor="eeeeee">
+&nbsp;&nbsp;<a href="xlisp-internals.html#SEC00">Back to Top</a></nobr></li>
+</tr></tbody></table>
+
+<h3><a name="SEC22">Acknowledgements</a></h3>
+
+<p>This document is considerably improved thanks to careful reading and
+thoughtful suggestions from Ken Whedbee (kcw@beach.cis.ufl.edu) and (especially)
+Tom Almy (toma@sail.labs.tek.com).</p> </pre>
+
+<table cellpadding="0"><tbody><tr><td>&nbsp;</td><td bgcolor="eeeeee">
+&nbsp;&nbsp;<a href="xlisp-internals.html#SEC00">Back to Top</a></nobr></li>
+</tr></tbody></table>
+
+<br><hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/manual/contents.htm b/docsrc/xlisp/xlisp-doc/manual/contents.htm
new file mode 100644
index 0000000..d959433
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/manual/contents.htm
@@ -0,0 +1,858 @@
+<html><head><title>Table of Contents</title></head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+Contents |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Table of Contents</h1>
+
+<hr>
+
+<ol>
+<li><nobr>Manuals</nobr></li>
+<ul>
+<li><nobr><a href="#xlisp-2-0-manual">XLISP 2.0 Manual</a> - by David Betz</nobr></li>
+<li><nobr><a href="#xlisp-opbject-system">XLISP Object System</a> - by David Betz</nobr></li>
+<li><nobr><a href="../reference/profile.htm">XLISP Profiling</a> - by Roger B. Dannenberg</nobr></li>
+</ul>
+<li><nobr>Reference</nobr></li>
+<ul>
+<li><nobr><a href="#symbols">Symbols</a></nobr></li>
+<li><nobr>Functions</nobr></li>
+<ul>
+<li><nobr><a href="#evaluation-functions">Evaluation</a></nobr></li>
+<li><nobr><a href="#symbol-functions">Symbol Functions</a></nobr></li>
+<li><nobr><a href="#array-functions">Arrays</a></nobr></li>
+<li><nobr><a href="#list-functions">Lists</a></nobr></li>
+<li><nobr><a href="#predicate-functions">Predicates</a></nobr></li>
+<li><nobr><a href="#control-constructs">Control Constructs</a></nobr></li>
+<li><nobr><a href="#debugging-and-error-handling">Debugging and Error Handling</a></nobr></li>
+<li><nobr><a href="#arithmetic-functions">Numbers</a></nobr></li>
+<li><nobr><a href="#string-functions">Strings</a></nobr></li>
+<li><nobr><a href="#character-functions">Characters</a></nobr></li>
+<li><nobr><a href="#input-output-functions">Input/Output</a></nobr></li>
+<li><nobr><a href="#file-io-functions">File I/O</a></nobr></li>
+<li><nobr><a href="#string-stream-functions">String Streams</a></nobr></li>
+<li><nobr><a href="#system-functions">System</a></nobr></li>
+</ul>
+</ul>
+</ol>
+
+<a name="xlisp-2-0-manual"></a>
+
+<hr>
+
+<h2>XLISP 2.0 Manual</h2>
+
+<hr>
+
+<ul>
+<li><nobr><a href="xlisp.htm">XLISP 2.0 Manual</a></nobr></li>
+<ol>
+<li><nobr><a name="1" href="xlisp.htm#introduction">Introduction</a></nobr></li>
+<li><nobr><a name="2" href="xlisp.htm#a-note-from-the-author">A Note From The Author</a></nobr></li>
+<li><nobr><a name="3" href="xlisp.htm#command-loop">Command Loop</a></nobr></li>
+<li><nobr><a name="4" href="xlisp.htm#break-loop">Break Loop</a></nobr></li>
+<li><nobr><a name="5" href="xlisp.htm#data-types">Data Types</a></nobr></li>
+<li><nobr><a name="6" href="xlisp.htm#the-evaluator">The Evaluator</a></nobr></li>
+<li><nobr><a name="7" href="xlisp.htm#lexical-conventions">Lexical Conventions</a></nobr></li>
+<li><nobr><a name="8" href="xlisp.htm#the-readtable">Readtable</a></nobr></li>
+<ul>
+<li><nobr>Read Table Entries</nobr></li>
+<ul>
+<li><nobr><a href="xlisp.htm#constituent">:constituent</a> - indicating a symbol constituent</nobr></li>
+<li><nobr><a href="xlisp.htm#white-space">:white-space</a> - indicating a whitespace character</nobr></li>
+<li><nobr><a href="xlisp.htm#tmacro">:tmacro</a> - terminating readmacro</nobr></li>
+<li><nobr><a href="xlisp.htm#nmacro">:nmacro</a> - terminating non-readmacro</nobr></li>
+<li><nobr><a href="xlisp.htm#sescape">:sescape</a> - single escape character '\'</nobr></li>
+<li><nobr><a href="xlisp.htm#mescape">:mescape</a> - multiple escape character '|'</nobr></li>
+</ul>
+<li><nobr>Read Macros</nobr></li>
+<ul>
+<li><nobr><a href="xlisp.htm#quote">&nbsp;'&nbsp;</a> - read macro for <a href="../reference/quote.htm">quote</a></nobr></li>
+<li><nobr><a href="xlisp.htm#function">&nbsp;#'&nbsp;</a> - read macro for <a href="../reference/function.htm">function</a></nobr></li>
+<li><nobr><a href="xlisp.htm#array">&nbsp;#()&nbsp;</a> - read macro for arrays</nobr></li>
+<li><nobr><a href="xlisp.htm#hexadecimal">&nbsp;#x&nbsp;</a> - read macro for hexadecimal numbers</nobr></li>
+<li><nobr><a href="xlisp.htm#octal">&nbsp;#o&nbsp;</a> - read macro for octal numbers</nobr></li>
+<li><nobr><a href="xlisp.htm#binary">&nbsp;#b&nbsp;</a> - read macro for binary numbers</nobr></li>
+<li><nobr><a href="xlisp.htm#character">&nbsp;#\&nbsp;</a> - read macro for character values</nobr></li>
+<li><nobr><a href="xlisp.htm#comment">#|...|#</a> - read macro for comments</nobr></li>
+<li><nobr><a href="xlisp.htm#uninterned">&nbsp;#:&nbsp;</a> - read macro for uninterned symbols</nobr></li>
+<li><nobr><a href="xlisp.htm#backquote">&nbsp;`&nbsp;</a> - read macro for <a href="../reference/backquote.htm">backquote</a></nobr></li>
+<li><nobr><a href="xlisp.htm#comma">&nbsp;,&nbsp;</a> - read macro for <a href="../reference/backquote.htm">comma</a></nobr></li>
+<li><nobr><a href="xlisp.htm#comma-at">&nbsp;,@&nbsp;</a> - read macro for <a href="../reference/backquote.htm">comma-at</a></nobr></li>
+</ul>
+<li><nobr>Characters Names</nobr></li>
+<ul>
+<li><nobr><a href="xlisp.htm#tmacro">#\Tab</a> - a 'horizontal tab' character</nobr></li>
+<li><nobr><a href="xlisp.htm#tmacro">#\Newline</a> - a 'newline' character</nobr></li>
+<li><nobr><a href="xlisp.htm#tmacro">#\Space</a> - a 'space' character</nobr></li>
+</ul>
+</ul>
+<li><nobr><a name="9" href="xlisp.htm#lambda-lists">Lambda Lists</a></nobr></li>
+<ul>
+<li><nobr><a href="xlisp.htm#arguments">Arguments</a></nobr></li>
+<ul>
+<li><nobr><a href="xlisp.htm#required-arguments">Required Arguments</a></nobr></li>
+<li><nobr><a href="xlisp.htm#optional-arguments">Optional Arguments</a></nobr></li>
+<li><nobr><a href="xlisp.htm#rest-argument">Rest Arguments</a></nobr></li>
+<li><nobr><a href="xlisp.htm#keyword-arguments">Keyword Arguments</a></nobr></li>
+<li><nobr><a href="xlisp.htm#auxiliary-variables">Auxiliary Variables</a></nobr></li>
+</ul>
+<li><nobr><a href="xlisp.htm#lambda-list-syntax">Lambda List Syntax</a></nobr></li>
+</ul>
+</ol>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="xlisp-opbject-system"></a>
+
+<hr>
+
+<h2>XLISP Object System</h2>
+
+<hr>
+
+<ul>
+<li><nobr><a name="10" href="objects.htm">XLISP Object System</a></nobr></li>
+<ul>
+<li><nobr><a href="objects.htm#1">Definitions</a></nobr></li>
+<ul>
+<li><nobr><a href="objects.htm#selector-def">selector</a> - a symbol used to select an appropriate method</nobr></li>
+<li><nobr><a href="objects.htm#message-def">message</a> - a selector and a list of actual arguments</nobr></li>
+<li><nobr><a href="objects.htm#method-def">method</a> - the code that implements a message</nobr></li>
+<li><nobr><a href="objects.htm#object-def">object</a> - the top of the class hierarchy</nobr></li>
+<li><nobr><a href="objects.htm#class-def">class</a> - the class of all object classes</nobr></li>
+</ul>
+<li><nobr><a href="objects.htm#2">The 'send' Function</a></nobr></li>
+<li><nobr><a href="objects.htm#3">The 'self' Symbol</a></nobr></li>
+<li><nobr><a href="objects.htm#4">The 'send-super' Function</a></nobr></li>
+<li><nobr><a href="objects.htm#5">The 'Object' Class</a></nobr></li>
+<ul>
+<li><nobr><a href="objects.htm#object">object</a> - the top of the class hierarchy</nobr></li>
+<ul>
+<li><nobr><a href="objects.htm#object-show">:show</a> - show an object's instance variables</nobr></li>
+<li><nobr><a href="objects.htm#object-class">:class</a> - return the class of an object</nobr></li>
+<li><nobr><a href="objects.htm#object-isnew">:isnew</a> - the default object initialization routine</nobr></li>
+<li><nobr><a href="objects.htm#send-super">send-super</a> - send superclass a message</nobr></li>
+</ul>
+</ul>
+<li><nobr><a href="objects.htm#6">The 'Class' Class</a></nobr></li>
+<ul>
+<li><nobr><a href="objects.htm#class">class</a> - class of all object classes</nobr></li>
+<ul>
+<li><nobr><a href="objects.htm#class-new">:new</a> - create a new instance of a class</nobr></li>
+<li><nobr><a href="objects.htm#class-isnew">:isnew</a> - initialize a new class</nobr></li>
+<li><nobr><a href="objects.htm#class-answer">:answer</a> - add a message to a class</nobr></li>
+</ul>
+</ul>
+</ul>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="symbols"></a>
+
+<hr>
+
+<h2>Symbols</h2>
+
+<hr>
+
+<ul>
+<li><nobr><a href="../reference/self.htm">self</a> - the current object within a method context</nobr></li>
+<li><nobr><a href="../reference/global-obarray.htm">*obarray*</a> - the object hash table</nobr></li>
+<li><nobr><a href="../reference/global-standard-input.htm">*standard-input*</a> - the standard input stream</nobr></li>
+<li><nobr><a href="../reference/global-standard-output.htm">*standard-output*</a> - the standard output stream</nobr></li>
+<li><nobr><a href="../reference/global-error-output.htm">*error-output*</a> - the error output stream</nobr></li>
+<li><nobr><a href="../reference/global-trace-output.htm">*trace-output*</a> - the trace output stream</nobr></li>
+<li><nobr><a href="../reference/global-debug-io.htm">*debug-io*</a> - the debug i/o stream</nobr></li>
+<li><nobr><a href="../reference/global-breakenable.htm">*breakenable*</a> - flag controlling entering break loop on errors</nobr></li>
+<li><nobr><a href="../reference/global-tracelist.htm">*tracelist*</a> - list of names of functions to trace</nobr></li>
+<li><nobr><a href="../reference/global-tracenable.htm">*tracenable*</a> - enable trace back printout on errors</nobr></li>
+<li><nobr><a href="../reference/global-tracelimit.htm">*tracelimit*</a> - number of levels of trace back information</nobr></li>
+<li><nobr><a href="../reference/global-evalhook.htm">*evalhook*</a> - user substitute for the evaluator function</nobr></li>
+<li><nobr><a href="../reference/global-applyhook.htm">*applyhook*</a> - [not yet implemented]</nobr></li>
+<li><nobr><a href="../reference/global-readtable.htm">*readtable*</a> - the current readtable</nobr></li>
+<li><nobr><a href="../reference/global-unbound.htm">*unbound*</a> - indicator for unbound symbols</nobr></li>
+<li><nobr><a href="../reference/global-gc-flag.htm">*gc-flag*</a> - controls the printing of 'gc' messages</nobr></li>
+<li><nobr><a href="../reference/global-gc-hook.htm">*gc-hook*</a> - function to call after garbage collection</nobr></li>
+<li><nobr><a href="../reference/global-integer-format.htm">*integer-format*</a> - format for printing integers</nobr></li>
+<li><nobr><a href="../reference/global-float-format.htm">*float-format*</a> - format for printing floats</nobr></li>
+<li><nobr><a href="../reference/global-print-case.htm">*print-case*</a> - symbol output case</nobr></li>
+<li><nobr><a href="../reference/global-file-separator.htm">*file-separator*</a> - the operating system's file sparator character</nobr></li>
+</ul>
+
+<ul>
+<li><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;+&nbsp;</a> - the most recent input expression</nobr></li>
+<li><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;++&nbsp;</a> - the next to the last input expression</nobr></li>
+<li><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;+++&nbsp;</a> - the second to the last input expression</nobr></li>
+<li><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;*&nbsp;</a> - the result of the previously evaluated expression</nobr></li>
+<li><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;**&nbsp;</a> - the result of the next to the last evaluated expression</nobr></li>
+<li><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;***&nbsp;</a> - the result of the second to the last evaluated expression</nobr></li>
+<li><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;-&nbsp;</a> - the expression currently being evaluated</nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="evaluation-functions"></a>
+
+<hr>
+
+<h2>Evaluation Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr><a href="../reference/eval.htm">eval</a> - evaluate an XLISP expression</nobr></li>
+<li><nobr><a href="../reference/apply.htm">apply</a> - apply a function to a list of arguments</nobr></li>
+<li><nobr><a href="../reference/funcall.htm">funcall</a> - call a function with arguments</nobr></li>
+<li><nobr><a href="../reference/quote.htm">quote</a> - return an expression unevaluated</nobr></li>
+<li><nobr><a href="../reference/function.htm">function</a> - get the functional interpretation</nobr></li>
+<li><nobr><a href="../reference/backquote.htm">backquote</a> - fill in a template</nobr></li>
+<li><nobr><a href="../reference/lambda.htm">lambda</a> - make a function closure</nobr></li>
+<li><nobr><a href="../reference/get-lambda-expression.htm">get-lambda-expression</a> - get the lambda expression</nobr></li>
+<li><nobr><a href="../reference/macroexpand.htm">macroexpand</a> - recursively expand macro calls</nobr></li>
+<li><nobr><a href="../reference/macroexpand-1.htm">macroexpand-1</a> - expand a macro call</nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="symbol-functions"></a>
+
+<hr>
+
+<h2>Symbol Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr>Constructors</nobr></li>
+<ul>
+<li><nobr><a href="../reference/defun.htm">defun</a> - define a function</nobr></li>
+<li><nobr><a href="../reference/defmacro.htm">defmacro</a> - define a macro</nobr></li>
+<li><nobr><a href="../reference/gensym.htm">gensym</a> - generate a symbol</nobr></li>
+<li><nobr><a href="../reference/intern.htm">intern</a> - make an interned symbol</nobr></li>
+<li><nobr><a href="../reference/make-symbol.htm">make-symbol</a> - make an uninterned symbol</nobr></li>
+</ul>
+<li><nobr>Accessors</nobr></li>
+<ul>
+<li><nobr><a href="../reference/symbol-name.htm">symbol-name</a> - get the print name of a symbol</nobr></li>
+<li><nobr><a href="../reference/symbol-value.htm">symbol-value</a> - get the value of a symbol</nobr></li>
+<li><nobr><a href="../reference/symbol-function.htm">symbol-function</a> - get the functional value of a symbol</nobr></li>
+<li><nobr><a href="../reference/symbol-plist.htm">symbol-plist</a> - get the property list of a symbol</nobr></li>
+</ul>
+<li><nobr>Assignment</nobr></li>
+<ul>
+<li><nobr><a href="../reference/set.htm">set</a> - set the value of a symbol</nobr></li>
+<li><nobr><a href="../reference/setq.htm">setq</a> - set the [quoted] value of a symbol</nobr></li>
+<li><nobr><a href="../reference/psetq.htm">psetq</a> - parallel version of setq</nobr></li>
+<li><nobr><a href="../reference/setf.htm">setf</a> - set the value of a field</nobr></li>
+</ul>
+<li><nobr>Utilities</nobr></li>
+<ul>
+<li><nobr><a href="../reference/incf.htm">incf</a> - increment a variable</nobr></li>
+<li><nobr><a href="../reference/decf.htm">decf</a> - decrement a variable</nobr></li>
+</ul>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="array-functions"></a>
+
+<hr>
+
+<h2>Array Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr>Constructors</nobr></li>
+<ul>
+<li><nobr><a href="../reference/make-array.htm">make-array</a> - make a new array</nobr></li>
+<li><nobr><a href="../reference/vector.htm">vector</a> - make an initialized vector</nobr></li>
+</ul>
+<li><nobr>Acessors</nobr></li>
+<ul>
+<li><nobr><a href="../reference/aref.htm">aref</a> - get the nth element of an array</nobr></li>
+</ul>
+<li><nobr>Predicate</nobr></li>
+<ul>
+<li><nobr><a href="../reference/arrayp.htm">arrayp</a> - is this an array?</nobr></li>
+</ul>
+<li><nobr>Utilities</nobr></li>
+<ul>
+<li><nobr><a href="../reference/length.htm">length</a> - find the length of a list, vector or string</nobr></li>
+<li><nobr><a href="../reference/hash.htm">hash</a> - compute the hash index for a symbol</nobr></li>
+</ul>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="list-functions"></a>
+
+<hr>
+
+<h2>List Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr>Constructors</nobr></li>
+<ul>
+<li><nobr><a href="../reference/cons.htm">cons</a> - construct a new list node</nobr></li>
+<li><nobr><a href="../reference/list.htm">list</a> - create a list of values</nobr></li>
+</ul>
+<li><nobr>Accessors</nobr></li>
+<ul>
+<li><nobr><a href="../reference/car.htm">car</a> - return the car of a list node</nobr></li>
+<li><nobr><a href="../reference/caar.htm">caar, cadr</a> - </nobr></li>
+<li><nobr><a href="../reference/caaar.htm">caaar...caddr</a> - </nobr></li>
+<li><nobr><a href="../reference/caaaar.htm">caaaar...cadddr</a> - </nobr></li>
+<li><nobr><a href="../reference/cdr.htm">cdr</a> - return the cdr of a list node</nobr></li>
+<li><nobr><a href="../reference/cddr.htm">cdar, cddr</a> - </nobr></li>
+<li><nobr><a href="../reference/cdddr.htm">cdaar...cdddr</a> - </nobr></li>
+<li><nobr><a href="../reference/cddddr.htm">cdaaar...cddddr</a> - </nobr></li>
+<li><nobr><a href="../reference/first.htm">first</a> - get the first element of a list</nobr></li>
+<li><nobr><a href="../reference/second.htm">second</a> - get the second element of a list</nobr></li>
+<li><nobr><a href="../reference/third.htm">third</a> - get the third element of a list</nobr></li>
+<li><nobr><a href="../reference/fourth.htm">fourth</a> - get the fourth element of a list</nobr></li>
+<li><nobr><a href="../reference/rest.htm">rest</a> - get the rest of the list except the first element</nobr></li>
+<li><nobr><a href="../reference/last.htm">last</a> - return the last list node of a list</nobr></li>
+<li><nobr><a href="../reference/nth.htm">nth</a> - return the nth element of a list</nobr></li>
+<li><nobr><a href="../reference/nthcdr.htm">nthcdr</a> - return the nth cdr of a list</nobr></li>
+</ul>
+<li><nobr>Predicates</nobr></li>
+<ul>
+<li><nobr><a href="../reference/consp.htm">consp</a> - is this a non-empty list?</nobr></li>
+<li><nobr><a href="../reference/listp.htm">listp</a> - is this an empty or non-empty list?</nobr></li>
+<li><nobr><a href="../reference/null.htm">null</a> - is this an empty list?</nobr></li>
+</ul>
+<li><nobr>List Functions</nobr></li>
+<ul>
+<li><nobr><a href="../reference/append.htm">append</a> - append lists</nobr></li>
+<li><nobr><a href="../reference/reverse.htm">reverse</a> - reverse a list</nobr></li>
+<li><nobr><a href="../reference/member.htm">member</a> - find an expression in a list</nobr></li>
+<li><nobr><a href="../reference/length.htm">length</a> - find the length of a list, vector or string</nobr></li>
+<li><nobr><a href="../reference/subst.htm">subst</a> - substitute expressions</nobr></li>
+</ul>
+<li><nobr>Association Lists</nobr></li>
+<ul>
+<li><nobr><a href="../reference/assoc.htm">assoc</a> - find an expression in an a-list</nobr></li>
+<li><nobr><a href="../reference/sublis.htm">sublis</a> - substitute with an a-list</nobr></li>
+</ul>
+<li><nobr>Property Lists</nobr></li>
+<ul>
+<li><nobr><a href="../reference/get.htm">get</a> - get the value of a property</nobr></li>
+<li><nobr><a href="../reference/putprop.htm">putprop</a> - put a property onto a property list</nobr></li>
+<li><nobr><a href="../reference/remprop.htm">remprop</a> - remove a property from a property list</nobr></li>
+</ul>
+<li><nobr>Mapping</nobr></li>
+<ul>
+<li><nobr><a href="../reference/mapc.htm">mapc</a> - apply function to successive cars</nobr></li>
+<li><nobr><a href="../reference/mapcar.htm">mapcar</a> - apply function to successive cars</nobr></li>
+<li><nobr><a href="../reference/mapl.htm">mapl</a> - apply function to successive cdrs</nobr></li>
+<li><nobr><a href="../reference/maplist.htm">maplist</a> - apply function to successive cdrs</nobr></li>
+</ul>
+<li><nobr>Lists as Stack</nobr></li>
+<ul>
+<li><nobr><a href="../reference/push.htm">push</a> - push a value to the front of a list</nobr></li>
+<li><nobr><a href="../reference/pop.htm">pop</a> - pop a value from the front of a list</nobr></li>
+</ul>
+<li><nobr>Lists as Sets</nobr></li>
+<ul>
+<li><nobr><a href="../reference/union.htm">union</a> - compute the union of two lists</nobr></li>
+<li><nobr><a href="../reference/intersection.htm">intersection</a> - compute the intersection of two lists</nobr></li>
+<li><nobr><a href="../reference/set-difference.htm">set-difference</a> - compute the set-difference of two lists</nobr></li>
+<li><nobr><a href="../reference/subsetp.htm">subsetp</a> - test if a list is a subset of another list</nobr></li>
+</ul>
+<li><nobr>Non-destructive List Functions</nobr></li>
+<ul>
+<li><nobr><a href="../reference/remove.htm">remove</a> - remove elements from a list</nobr></li>
+<li><nobr><a href="../reference/remove-if.htm">remove-if</a> - remove elements that pass test</nobr></li>
+<li><nobr><a href="../reference/remove-if-not.htm">remove-if-not</a> - remove elements that fail test</nobr></li>
+</ul>
+<li><nobr>Destructive List Functions</nobr></li>
+<ul>
+<li><nobr><a href="../reference/rplaca.htm">rplaca</a> - replace the car of a list node</nobr></li>
+<li><nobr><a href="../reference/rplacd.htm">rplacd</a> - replace the cdr of a list node</nobr></li>
+<li><nobr><a href="../reference/nconc.htm">nconc</a> - destructively concatenate lists</nobr></li>
+<li><nobr><a href="../reference/delete.htm">delete</a> - delete elements from a list</nobr></li>
+<li><nobr><a href="../reference/delete-if.htm">delete-if</a> - delete elements that pass test</nobr></li>
+<li><nobr><a href="../reference/delete-if-not.htm">delete-if-not</a> - delete elements that fail test</nobr></li>
+<li><nobr><a href="../reference/sort.htm">sort</a> - sort a list</nobr></li>
+</ul>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="predicate-functions"></a>
+
+<hr>
+
+<h2>Predicate Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr>Predicates</nobr></li>
+<ul>
+<li><nobr><a href="../reference/atom.htm">atom</a> - is this an atom?</nobr></li>
+<li><nobr><a href="../reference/symbolp.htm">symbolp</a> - is this a symbol?</nobr></li>
+<ul>
+<li><nobr><a href="../reference/boundp.htm">boundp</a> - is a variable value bound to this symbol?</nobr></li>
+<li><nobr><a href="../reference/fboundp.htm">fboundp</a> - is a function value bound to this symbol?</nobr></li>
+</ul>
+<li><nobr><a href="../reference/keywordp.htm">keywordp</a> - is this a keyword?</nobr></li>
+<li><nobr><a href="../reference/numberp.htm">numberp</a> - is this a number?</nobr></li>
+<ul>
+<li><nobr><a href="../reference/plusp.htm">plusp</a> - is this number positive?</nobr></li>
+<li><nobr><a href="../reference/minusp.htm">minusp</a> - is this number negative?</nobr></li>
+<li><nobr><a href="../reference/zerop.htm">zerop</a> - is this number zero?</nobr></li>
+<li><nobr><a href="../reference/integerp.htm">integerp</a> - is this number an integer?</nobr></li>
+<ul>
+<li><nobr><a href="../reference/evenp.htm">evenp</a> - is this integer even?</nobr></li>
+<li><nobr><a href="../reference/oddp.htm">oddp</a> - is this integer odd?</nobr></li>
+</ul>
+<li><nobr><a href="../reference/floatp.htm">floatp</a> - is this number a float?</nobr></li>
+</ul>
+<li><nobr><a href="../reference/null.htm">null</a> - is this an empty list?</nobr></li>
+<li><nobr><a href="../reference/consp.htm">consp</a> - is this a non-empty list?</nobr></li>
+<li><nobr><a href="../reference/listp.htm">listp</a> - is this a list?</nobr></li>
+<ul>
+<li><nobr><a href="../reference/endp.htm">endp</a> - is this the end of a list?</nobr></li>
+</ul>
+<li><nobr><a href="../reference/stringp.htm">stringp</a> - is this a string?</nobr></li>
+<li><nobr><a href="../reference/characterp.htm">characterp</a> - is this a character?</nobr></li>
+<ul>
+<li><nobr><a href="../reference/upper-case-p.htm">upper-case-p</a> - is this an upper case character?</nobr></li>
+<li><nobr><a href="../reference/lower-case-p.htm">lower-case-p</a> - is this a lower case character?</nobr></li>
+<li><nobr><a href="../reference/both-case-p.htm">both-case-p</a> - is this an alphabetic [either case] character?</nobr></li>
+<li><nobr><a href="../reference/digit-char-p.htm">digit-char-p</a> - is this a digit character?</nobr></li>
+<li><nobr><a href="../reference/alphanumericp.htm">alphanumericp</a> - is this an alphabetic or a digit character?</nobr></li>
+</ul>
+<li><nobr><a href="../reference/arrayp.htm">arrayp</a> - is this an array?</nobr></li>
+<li><nobr><a href="../reference/streamp.htm">streamp</a> - is this a stream?</nobr></li>
+<li><nobr><a href="../reference/filep.htm">filep</a> - is this a file?</nobr></li>
+<li><nobr><a href="../reference/objectp.htm">objectp</a> - is this an object?</nobr></li>
+<li><nobr><a href="../reference/soundp.htm">soundp</a> - is this a Nyquist sound?</nobr></li>
+<li><nobr><a href="../reference/bigendianp.htm">bigendianp</a> - is this a bigendian machine?</nobr></li>
+</ul>
+<li><nobr>Comparison</nobr></li>
+<ul>
+<li><nobr><a href="../reference/eq.htm">eq</a> - are the expressions identical?</nobr></li>
+<li><nobr><a href="../reference/eql.htm">eql</a> - are the expressions identical?</nobr></li>
+<li><nobr><a href="../reference/equal.htm">equal</a> - are the expressions equal?</nobr></li>
+</ul>
+<li><nobr>Boolean</nobr></li>
+<ul>
+<li><nobr><a href="../reference/not.htm">not</a> - is this false?</nobr></li>
+</ul>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="control-constructs"></a>
+
+<hr>
+
+<h2>Control Constructs</h2>
+
+<hr>
+
+<ul>
+<li><nobr>Logical</nobr></li>
+<ul>
+<li><nobr><a href="../reference/and.htm">and</a> - the logical AND of a list of expressions</nobr></li>
+<li><nobr><a href="../reference/or.htm">or</a> - the logical OR of a list of expressions</nobr></li>
+</ul>
+<li><nobr>Conditional</nobr></li>
+<ul>
+<li><nobr><a href="../reference/if.htm">if</a> - evaluate expressions conditionally</nobr></li>
+<li><nobr><a href="../reference/when.htm">when</a> - evaluate only when a condition is true</nobr></li>
+<li><nobr><a href="../reference/unless.htm">unless</a> - evaluate only when a condition is false</nobr></li>
+<li><nobr><a href="../reference/cond.htm">cond</a> - evaluate conditionally</nobr></li>
+<li><nobr><a href="../reference/case.htm">case</a> - select by case</nobr></li>
+</ul>
+<li><nobr>Binding</nobr></li>
+<ul>
+<li><nobr><a href="../reference/let.htm">let</a> - create local bindings</nobr></li>
+<li><nobr><a href="../reference/let-star.htm">let*</a> - let with sequential binding</nobr></li>
+<li><nobr><a href="../reference/flet.htm">flet</a> - create local functions</nobr></li>
+<li><nobr><a href="../reference/labels.htm">labels</a> - flet with recursive functions</nobr></li>
+<li><nobr><a href="../reference/macrolet.htm">macrolet</a> - create local macros</nobr></li>
+</ul>
+<li><nobr>Non-local Exits</nobr></li>
+<ul>
+<li><nobr><a href="../reference/catch.htm">catch, throw</a> - evaluate expressions and catch throws</nobr></li>
+<li><nobr><a href="../reference/unwind-protect.htm">unwind-protect</a> - protect evaluation of an expression</nobr></li>
+</ul>
+<li><nobr>Looping Constructs</nobr></li>
+<ul>
+<li><nobr><a href="../reference/loop.htm">loop</a> - basic looping form</nobr></li>
+<li><nobr><a href="../reference/do.htm">do</a> - loop while the termination test is NIL</nobr></li>
+<li><nobr><a href="../reference/do-star.htm">do*</a> - 'do' loop with sequential binding</nobr></li>
+<li><nobr><a href="../reference/dolist.htm">dolist</a> - loop through a list</nobr></li>
+<li><nobr><a href="../reference/dotimes.htm">dotimes</a> - loop from zero to n-1</nobr></li>
+<li><nobr><a href="../reference/while.htm">while</a> - standard 'while' loop</nobr></li>
+</ul>
+<li><nobr>The Program Feature</nobr></li>
+<ul>
+<li><nobr><a href="../reference/prog.htm">prog</a> - the program feature</nobr></li>
+<li><nobr><a href="../reference/prog-star.htm">prog*</a> - 'prog' with sequential binding</nobr></li>
+<li><nobr><a href="../reference/block.htm">block</a> - named block</nobr></li>
+<li><nobr><a href="../reference/return.htm">return</a> - cause a prog construct to return a value</nobr></li>
+<li><nobr><a href="../reference/return-from.htm">return-from</a> - return from a named block</nobr></li>
+<li><nobr><a href="../reference/tagbody.htm">tagbody</a> - block with labels</nobr></li>
+<li><nobr><a href="../reference/go.htm">go</a> - go to a tag within a tagbody or prog</nobr></li>
+<li><nobr><a href="../reference/progv.htm">progv</a> - dynamically bind symbols</nobr></li>
+<li><nobr><a href="../reference/prog1.htm">prog1</a> - return the value of the first expression</nobr></li>
+<li><nobr><a href="../reference/prog2.htm">prog2</a> - return the value of the second expression</nobr></li>
+<li><nobr><a href="../reference/progn.htm">progn</a> - return the value of the last expression</nobr></li>
+</ul>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="debugging-and-error-handling"></a>
+
+<hr>
+
+<h2>Debugging and Error Handling</h2>
+
+<hr>
+
+<ul>
+<li><nobr><a href="../reference/trace.htm">trace</a> - add a function to the trace list</nobr></li>
+<li><nobr><a href="../reference/untrace.htm">untrace</a> - remove a function from the trace list</nobr></li>
+<li><nobr><a href="../reference/error.htm">error</a> - signal a non-correctable error</nobr></li>
+<li><nobr><a href="../reference/cerror.htm">cerror</a> - signal a correctable error</nobr></li>
+<li><nobr><a href="../reference/break.htm">break</a> - enter a break loop</nobr></li>
+<li><nobr><a href="../reference/clean-up.htm">clean-up</a> - clean-up after an error</nobr></li>
+<li><nobr><a href="../reference/top-level.htm">top-level</a> - clean-up after an error and return to the top level</nobr></li>
+<li><nobr><a href="../reference/continue.htm">continue</a> - continue from a correctable error</nobr></li>
+<li><nobr><a href="../reference/errset.htm">errset</a> - trap errors</nobr></li>
+<li><nobr><a href="../reference/baktrace.htm">baktrace</a> - print n levels of trace back information</nobr></li>
+<li><nobr><a href="../reference/evalhook.htm">evalhook</a> - evaluate with hooks</nobr></li>
+<li><nobr><a href="../reference/profile.htm">profile</a> - turn profiling on or off</nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="arithmetic-functions"></a>
+
+<hr>
+
+<h2>Arithmetic Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr>Integer and Floating Point - error if not a number</nobr></li>
+<ul>
+<li><nobr><a href="../reference/truncate.htm">truncate</a> - truncates a floating point number to an integer</nobr></li>
+<li><nobr><a href="../reference/float.htm">float</a> - converts an integer to a floating point number</nobr></li>
+<li><nobr><a href="../reference/addition.htm">&nbsp;+&nbsp;</a> - add one or several numbers</nobr></li>
+<li><nobr><a href="../reference/subtraction.htm">&nbsp;&minus;&nbsp;</a> - negate a single number or subtract one or several numbers</nobr></li>
+<li><nobr><a href="../reference/multiplication.htm">&nbsp;*&nbsp;</a> - multiply one or several numbers</nobr></li>
+<li><nobr><a href="../reference/division.htm">&nbsp;/&nbsp;</a> - get the reciprocal of a single number or divide several numbers</nobr></li>
+<li><nobr><a href="../reference/increment.htm">1+</a> - increment a number by one</nobr></li>
+<li><nobr><a href="../reference/decrement.htm">1&minus;</a> - decrement a number by one</nobr></li>
+<li><nobr><a href="../reference/min.htm">min</a> - the smallest of one or several numbers</nobr></li>
+<li><nobr><a href="../reference/max.htm">max</a> - the largest of one or several numbers</nobr></li>
+<li><nobr><a href="../reference/abs.htm">abs</a> - the absolute value of a number</nobr></li>
+<li><nobr><a href="../reference/asin.htm">asin</a> - compute the arcsine of a number</nobr></li>
+<li><nobr><a href="../reference/acos.htm">acos</a> - compute the arccosine of a number</nobr></li>
+<li><nobr><a href="../reference/atan.htm">atan</a> - compute the arctangent of a number</nobr></li>
+<li><nobr><a href="../reference/power.htm">power</a> - compute 'x' to the 'y' power</nobr></li>
+<li><nobr><a href="../reference/interpolate.htm">interpolate</a> - compute the 'y' coordinate corresponding to 'x'</nobr></li>
+</ul>
+<li>Comparison - error if not a number</li>
+<ul>
+<li><nobr><a href="../reference/number-lessp.htm">&nbsp;&lt;&nbsp;</a> - test for less than</nobr></li>
+<li><nobr><a href="../reference/number-not-greaterp.htm">&nbsp;&lt;=&nbsp;</a> - test for less than or equal to</nobr></li>
+<li><nobr><a href="../reference/number-equal.htm">&nbsp;=&nbsp;</a> - test for equal to</nobr></li>
+<li><nobr><a href="../reference/number-not-equal.htm">&nbsp;/=&nbsp;</a> - test for not equal to</nobr></li>
+<li><nobr><a href="../reference/number-not-lessp.htm">&nbsp;&gt;=&nbsp;</a> - test for greater than or equal to</nobr></li>
+<li><nobr><a href="../reference/number-greaterp.htm">&nbsp;&gt;&nbsp;</a> - test for greater than</nobr></li>
+</ul>
+<li><nobr>Floating Point - error if not a floating point number</nobr></li>
+<ul>
+<li><nobr><a href="../reference/sin.htm">sin</a> - compute the sine of a floating-point number</nobr></li>
+<li><nobr><a href="../reference/cos.htm">cos</a> - compute the cosine of a floating-point number</nobr></li>
+<li><nobr><a href="../reference/tan.htm">tan</a> - compute the tangent of a floating-point number</nobr></li>
+<li><nobr><a href="../reference/expt.htm">expt</a> - compute x to the y power</nobr></li>
+<li><nobr><a href="../reference/exp.htm">exp</a> - compute e to the x power</nobr></li>
+<li><nobr><a href="../reference/log.htm">exp</a> - compute the natural logarithm of a floating-point number</nobr></li>
+<li><nobr><a href="../reference/sqrt.htm">sqrt</a> - compute the square root of a floating-point number</nobr></li>
+</ul>
+<li><nobr>Integer - error if not an integer number</nobr></li>
+<ul>
+<li><nobr><a href="../reference/gcd.htm">gcd</a> - compute the greatest common divisor</nobr></li>
+<li><nobr><a href="../reference/logand.htm">logand</a> - compute the bitwise 'and' of one or several numbers</nobr></li>
+<li><nobr><a href="../reference/logior.htm">logior</a> - compute the bitwise 'inclusive or' of one or several numbers</nobr></li>
+<li><nobr><a href="../reference/logxor.htm">logxor</a> - compute the bitwise 'exclusive or' of one or several numbers</nobr></li>
+<li><nobr><a href="../reference/lognot.htm">lognot</a> - compute the bitwise 'not' of an number</nobr></li>
+<li><nobr><a href="../reference/rem.htm">rem</a> - remainder of one or several integer numbers</nobr></li>
+</ul>
+<li><nobr>Random Numbers</nobr></li>
+<ul>
+<li><nobr><a href="../reference/random.htm">random</a> - compute an integer random number between 0 and n-1 inclusive</nobr></li>
+<li><nobr><a href="../reference/rrandom.htm">rrandom</a> - compute a floating point random number between 0 and 1 inclusive</nobr></li>
+<li><nobr><a href="../reference/real-random.htm">real-random</a> - compute a floating point random number in an arbitrary range</nobr></li>
+</ul>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="string-functions"></a>
+
+<hr>
+
+<h2>String Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr>String Functions</nobr></li>
+<ul>
+<li><nobr><a href="../reference/string.htm">string</a> - make a string from a character or an integer ASCII value</nobr></li>
+<li><nobr><a href="../reference/strcat.htm">strcat</a> - concatenate strings</nobr></li>
+<li><nobr><a href="../reference/subseq.htm">subseq</a> - extract a substring</nobr></li>
+<li><nobr><a href="../reference/length.htm">length</a> - find the length of a list, vector or string</nobr></li>
+<li><nobr><a href="../reference/string-search.htm">string-search</a> - search for a pattern in a string</nobr></li>
+</ul>
+<li><nobr>Trimming</nobr></li>
+<ul>
+<li><nobr><a href="../reference/string-trim.htm">string-trim</a> - trim both ends of a string</nobr></li>
+<li><nobr><a href="../reference/string-left-trim.htm">string-left-trim</a> - trim the left end of a string</nobr></li>
+<li><nobr><a href="../reference/string-right-trim.htm">string-right-trim</a> - trim the right end of a string</nobr></li>
+</ul>
+<li><nobr>Case Conversion</nobr></li>
+<ul>
+<li><nobr><a href="../reference/string-upcase.htm">string-upcase</a> - convert a string to uppercase</nobr></li>
+<li><nobr><a href="../reference/string-downcase.htm">string-downcase</a> - convert a string to lowercase</nobr></li>
+<li><nobr><a href="../reference/nstring-upcase.htm">nstring-upcase</a> - convert a part of a string to uppercase</nobr></li>
+<li><nobr><a href="../reference/nstring-downcase.htm">nstring-downcase</a> - convert a part of a string to lowercase</nobr></li>
+</ul>
+<li><nobr>Case-sensitive Comparison</nobr></li>
+<ul>
+<li><nobr><a href="../reference/string-lessp-s.htm">string&lt;</a> - test for less than in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/string-not-greaterp-s.htm">string&lt;=</a> - test for less than or equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/string-equal-s.htm">string=</a> - test for equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/string-not-equal-s.htm">string/=</a> - test for not equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/string-not-lessp-s.htm">string&gt;=</a> - test for greater than or equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/string-greaterp-s.htm">string&gt;</a> - test for greater than in ASCII ordering</nobr></li>
+</ul>
+<li><nobr>Case-insensitive Comparison</nobr></li>
+<ul>
+<li><nobr><a href="../reference/string-lessp-i.htm">string-lessp</a> - is this less than in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/string-not-greaterp-i.htm">string-not-greaterp</a> - is this not greater than in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/string-equal-i.htm">string-equal</a> - is this equal in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/string-not-equal-i.htm">string-not-equal</a> - is this not equal in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/string-not-lessp-i.htm">string-not-lessp</a> - is this not less than in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/string-greaterp-i.htm">string-greaterp</a> - is this greater than in ASCII ordering?</nobr></li>
+</ul>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="character-functions"></a>
+
+<hr>
+
+<h2>Character Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr>Character Functions</nobr></li>
+<ul>
+<li><nobr><a href="../reference/char.htm">char</a> - extract a character from a string</nobr></li>
+<li><nobr><a href="../reference/char-code.htm">char-code</a> - get the ASCII code of a character</nobr></li>
+<li><nobr><a href="../reference/code-char.htm">code-char</a> - get the character with a specified ASCII code</nobr></li>
+<li><nobr><a href="../reference/digit-char.htm">digit-char</a> - convert a digit weight to a digit</nobr></li>
+<li><nobr><a href="../reference/char-int.htm">char-int</a> - convert a character to an integer</nobr></li>
+<li><nobr><a href="../reference/int-char.htm">int-char</a> - convert an integer to a character</nobr></li>
+</ul>
+<li><nobr>General Predicate - all data types</nobr></li>
+<ul>
+<li><nobr><a href="../reference/characterp.htm">characterp</a> - is this a character?</nobr></li>
+</ul>
+<li><nobr>Character Predicates - error if not a character</nobr></li>
+<ul>
+<li><nobr><a href="../reference/upper-case-p.htm">upper-case-p</a> - is this an upper case character?</nobr></li>
+<li><nobr><a href="../reference/lower-case-p.htm">lower-case-p</a> - is this a lower case character?</nobr></li>
+<li><nobr><a href="../reference/both-case-p.htm">both-case-p</a> - is this an alphabetic [either case] character?</nobr></li>
+<li><nobr><a href="../reference/digit-char-p.htm">digit-char-p</a> - is this a digit character?</nobr></li>
+<li><nobr><a href="../reference/alphanumericp.htm">alphanumericp</a> - is this an alphabetic or a digit character?</nobr></li>
+</ul>
+<li><nobr>Case Conversion</nobr></li>
+<ul>
+<li><nobr><a href="../reference/char-upcase.htm">char-upcase</a> - convert a character to upper case</nobr></li>
+<li><nobr><a href="../reference/char-downcase.htm">char-downcase</a> - convert a character to lower case</nobr></li>
+</ul>
+<li><nobr>Case-sensitive Comparison</nobr></li>
+<ul>
+<li><nobr><a href="../reference/char-lessp-s.htm">char&lt;</a> - test for less than in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/char-not-greaterp-s.htm">char&lt;=</a> - test for less than or equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/char-equal-s.htm">char=</a> - test for equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/char-not-equal-s.htm">char/=</a> - test for not equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/char-not-lessp-s.htm">char&gt;=</a> - test for greater than or equal to in ASCII ordering</nobr></li>
+<li><nobr><a href="../reference/char-greaterp-s.htm">char&gt;</a> - test for greater than in ASCII ordering</nobr></li>
+</ul>
+<li><nobr>Case-insensitive Comparison</nobr></li>
+<ul>
+<li><nobr><a href="../reference/char-lessp-i.htm">char-lessp</a> - is this less than in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/char-not-greaterp-i.htm">char-not-greaterp</a> - is this not greater than in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/char-equal-i.htm">char-equal</a> - is this equal in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/char-not-equal-i.htm">char-not-equal</a> - is this not equal in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/char-not-lessp-i.htm">char-not-lessp</a> - is this not less than in ASCII ordering?</nobr></li>
+<li><nobr><a href="../reference/char-greaterp-i.htm">char-greaterp</a> - is this greater than in ASCII ordering?</nobr></li>
+</ul>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="input-output-functions"></a>
+
+<hr>
+
+<h2>Input/Output Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr><a href="../reference/get-key.htm">get-key</a> - get a single key stroke from the keyboard</nobr></li>
+<li><nobr><a href="../reference/read.htm">read</a> - read an expression</nobr></li>
+<li><nobr><a href="../reference/print.htm">print</a> - print an expression on a new line</nobr></li>
+<li><nobr><a href="../reference/prin1.htm">prin1</a> - print an expression</nobr></li>
+<li><nobr><a href="../reference/princ.htm">princ</a> - print an expression without quoting</nobr></li>
+<li><nobr><a href="../reference/pprint.htm">pprint</a> - pretty print an expression</nobr></li>
+<li><nobr><a href="../reference/terpri.htm">terpri</a> - terminate the current print line</nobr></li>
+<li><nobr><a href="../reference/flatsize.htm">flatsize</a> - length of printed representation using prin1</nobr></li>
+<li><nobr><a href="../reference/flatc.htm">flatc</a> - length of printed representation using princ</nobr></li>
+<li><nobr><a href="../reference/format.htm">format</a> - do formated output</nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="file-io-functions"></a>
+
+<hr>
+
+<h2>File I/O Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr>Character I/O</nobr></li>
+<ul>
+<li><nobr><a href="../reference/open.htm">open</a> - open a character file stream</nobr></li>
+<li><nobr><a href="../reference/peek-char.htm">peek-char</a> - peek at the next character</nobr></li>
+<li><nobr><a href="../reference/read-char.htm">read-char</a> - read a character from a stream</nobr></li>
+<li><nobr><a href="../reference/read-line.htm">read-line</a> - read a line from a stream</nobr></li>
+<li><nobr><a href="../reference/write-char.htm">write-char</a> - write a character to a stream</nobr></li>
+</ul>
+<li><nobr>Binary I/O</nobr></li>
+<ul>
+<li><nobr><a href="../reference/bigendianp.htm">bigendianp</a> - is this a bigendian machine?</nobr></li>
+<li><nobr><a href="../reference/open-binary.htm">open-binary</a> - open a binary file stream</nobr></li>
+<li><nobr>Bytes</nobr></li>
+<ul>
+<li><nobr><a href="../reference/read-byte.htm">read-byte</a> - read a byte from a stream</nobr></li>
+<li><nobr><a href="../reference/write-byte.htm">write-byte</a> - write a byte to a stream</nobr></li>
+</ul>
+<li><nobr>Integer Numbers</nobr></li>
+<ul>
+<li><nobr><a href="../reference/read-int.htm">read-int</a> - read a binary integer number from a stream</nobr></li>
+<li><nobr><a href="../reference/write-int.htm">write-int</a> - write a binary integer number to a stream</nobr></li>
+</ul>
+<li><nobr>Floating Point Numbers</nobr></li>
+<ul>
+<li><nobr><a href="../reference/read-float.htm">read-float</a> - read a binary floating point number from a stream</nobr></li>
+<li><nobr><a href="../reference/write-float.htm">write-float</a> - write a binary floating point number to a stream</nobr></li>
+</ul>
+</ul>
+<li><nobr>Character and Bibary I/O</nobr></li>
+<ul>
+<li><nobr><a href="../reference/close.htm">close</a> - close a file stream</nobr></li>
+</ul>
+<li><nobr>Operating System</nobr></li>
+<ul>
+<li><nobr><a href="../reference/setdir.htm">setdir</a> - set the current directory</nobr></li>
+<li><nobr><a href="../reference/listdir.htm">listdir</a> - get a directory listing </nobr></li>
+<li><nobr><a href="../reference/get-temp-path.htm">get-temp-path</a> - get a path where a temporary file can be created</nobr></li>
+<li><nobr><a href="../reference/get-user.htm">get-user</a> - get the current user name</nobr></li>
+<li><nobr><a href="../reference/find-in-xlisp-path.htm">find-in-xlisp-path</a> - search the XLISP path for a filename</nobr></li>
+</ul>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="string-stream-functions"></a>
+
+<hr>
+
+<h2>String Stream Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr><a href="../reference/make-string-input-stream.htm">make-string-input-stream</a> - create an unnamed stream from a string expression</nobr></li>
+<li><nobr><a href="../reference/make-string-output-stream.htm">make-string-output-stream</a> - create and return an unnamed output stream</nobr></li>
+<li><nobr><a href="../reference/get-output-stream-string.htm">get-output-stream-string</a> - empty a stream and return the data as a string</nobr></li>
+<li><nobr><a href="../reference/get-output-stream-list.htm">get-output-stream-list</a> - empty a stream and return the data as a list</nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="system-functions"></a>
+
+<hr>
+
+<h2>System Functions</h2>
+
+<hr>
+
+<ul>
+<li><nobr><a href="../reference/load.htm">load</a> - load a source file</nobr></li>
+<li><nobr><a href="../reference/save.htm">save</a> - save workspace to a file</nobr></li>
+<li><nobr><a href="../reference/restore.htm">restore</a> - restore workspace from a file</nobr></li>
+<li><nobr><a href="../reference/dribble.htm">dribble</a> - create a file with a transcript of a session</nobr></li>
+<li><nobr><a href="../reference/gc.htm">gc</a> - force garbage collection</nobr></li>
+<li><nobr><a href="../reference/expand.htm">expand</a> - expand memory by adding segments</nobr></li>
+<li><nobr><a href="../reference/alloc.htm">alloc</a> - change number of nodes to allocate in each segment</nobr></li>
+<li><nobr><a href="../reference/info.htm">info</a> - show information about memory usage</nobr></li>
+<li><nobr><a href="../reference/room.htm">room</a> - show memory allocation statistics</nobr></li>
+<li><nobr><a href="../reference/type-of.htm">type-of</a> - returns the type of the expression</nobr></li>
+<li><nobr><a href="../reference/peek.htm">peek</a> - peek at a location in memory</nobr></li>
+<li><nobr><a href="../reference/poke.htm">poke</a> - poke a value into memory</nobr></li>
+<li><nobr><a href="../reference/bigendianp.htm">bigendianp</a> - is this a big-endian machine?</nobr></li>
+<li><nobr><a href="../reference/address-of.htm">address-of</a> - get the address of an xlisp node</nobr></li>
+<li><nobr><a href="../reference/get-env.htm">get-env</a> - get the value of an environment variable</nobr></li>
+<li><nobr><a href="../reference/system.htm">system</a> - execute a command of the operating system</nobr></li>
+<li><nobr><a href="../reference/quit.htm">quit</a> - exit XLISP</nobr></li>
+<li><nobr><a href="../reference/exit.htm">exit</a> - exit XLISP</nobr></li>
+<li><nobr><a href="../reference/setup-console.htm">setup-console</a> - set default console attributes</nobr></li>
+<li><nobr><a href="../reference/echoenabled.htm">echoenabled</a> - turn console input echo on or off</nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+Contents |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/manual/links.htm b/docsrc/xlisp/xlisp-doc/manual/links.htm
new file mode 100644
index 0000000..eff06d6
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/manual/links.htm
@@ -0,0 +1,3 @@
+
+
+<a href="../reference/object.htm">object</a>
diff --git a/docsrc/xlisp/xlisp-doc/manual/manual.css b/docsrc/xlisp/xlisp-doc/manual/manual.css
new file mode 100644
index 0000000..964dca2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/manual/manual.css
@@ -0,0 +1,34 @@
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+
diff --git a/docsrc/xlisp/xlisp-doc/manual/objects.htm b/docsrc/xlisp/xlisp-doc/manual/objects.htm
new file mode 100644
index 0000000..31c4fea
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/manual/objects.htm
@@ -0,0 +1,358 @@
+<html><head><title>XLISP: An Object-oriented Lisp</title></head>
+
+<link rel="stylesheet" type="text/css" href="manual.css">
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>XLISP Object System</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#1">Definitions</a></nobr></li>
+<ul>
+<li><nobr><a href="#define-selector">selector</a> - a symbol used to select an appropriate method</nobr></li>
+<li><nobr><a href="#define-message">message</a> - a selector and a list of actual arguments</nobr></li>
+<li><nobr><a href="#define-method">method</a> - the code that implements a message</nobr></li>
+<li><nobr><a href="#define-object">object</a> - the top of the class hierarchy</nobr></li>
+<li><nobr><a href="#define-class">class</a> - the class of all object classes</nobr></li>
+</ul>
+<li><nobr><a href="#2">The 'send' Function</a></nobr></li>
+<li><nobr><a href="#3">The 'self' Symbol</a></nobr></li>
+<li><nobr><a href="#4">The 'send-super' Function</a></nobr></li>
+<li><nobr><a href="#5">The 'object' Class</a></nobr></li>
+<ul>
+<li><nobr><a href="#object">object</a> - the top of the class hierarchy</nobr></li>
+<ul>
+<li><nobr><a href="#object-show">:show</a> - show an object's instance variables</nobr></li>
+<li><nobr><a href="#object-class">:class</a> - return the class of an object</nobr></li>
+<li><nobr><a href="#object-isnew">:isnew</a> - the default object initialization routine</nobr></li>
+<li><nobr><a href="#send-super">send-super</a> - send superclass a message</nobr></li>
+</ul>
+</ul>
+<li><nobr><a href="#6">The 'class' Class</a></nobr></li>
+<ul>
+<li><nobr><a href="#class">class</a> - class of all object classes</nobr></li>
+<ul>
+<li><nobr><a href="#class-new">:new</a> - create a new instance of a class</nobr></li>
+<li><nobr><a href="#class-isnew">:isnew</a> - initialize a new class</nobr></li>
+<li><nobr><a href="#class-answer">:answer</a> - add a message to a class</nobr></li>
+</ul>
+</ul>
+</ol>
+
+<a name="1"></a>
+<a name="define-selector"></a>
+<a name="define-message"></a>
+<a name="define-method"></a>
+<a name="define-object"></a>
+<a name="define-class"></a>
+
+<hr>
+
+<h2>1&nbsp; Definitions</h2>
+
+<hr>
+
+<p><div class="box">
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td align="right"><nobr>selector</nobr></td>
+ <td valign="top"><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%"><nobr>a symbol used to select an appropriate method, usually a keyword</nobr></td>
+</tr>
+<tr>
+ <td align="right"><nobr>message</nobr></td>
+ <td valign="top"><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%"><nobr>a selector symbol and a list of actual arguments</nobr></td>
+</tr>
+<tr>
+ <td align="right"><nobr>method</nobr></td>
+ <td valign="top"><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%"><nobr>the Lisp code that implements a message</nobr></td>
+</tr>
+<tr>
+ <td align="right"><nobr><a href="../reference/object.htm">object</a></nobr></td>
+ <td valign="top"><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%"><nobr>the top of the class hierarchy</nobr></td>
+</tr>
+<tr>
+ <td align="right"><nobr><a href="../reference/class.htm">class</a></nobr></td>
+ <td valign="top"><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%"><nobr>the class of all object classes [including itself]</nobr></td>
+</tr>
+</tbody></table></p>
+
+</div></p>
+
+<p>Since XLISP was created to provide a simple basis for experimenting with
+<nobr>object-oriented</nobr> programming, one of the primitive data types
+included is <a href="../reference/object.htm">object</a>. <nobr>In
+XLISP</nobr>, an object consists of a data structure containing a pointer to
+the object's <a href="../reference/class.htm">class</a> as well as an array
+containing the values of the object's instance variables.</p>
+
+<p>Officially, there is no way to see inside an object [look at the values
+of its instance variables]. The only way to communicate with an object is by
+sending it a message.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="2"></a>
+
+<hr>
+
+<h2>2&nbsp; The 'send' Function</h2>
+
+<hr>
+
+<p>You can send a message to an object using the
+<a href="../reference/send.htm">send</a> function:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>send</b> <i>object selector</i> [<i>args</i>])</dt>
+<dd><i>object</i> - an <a href="object.htm">object</a><br>
+<i>selector</i> - message selector for <i>object</i><br>
+<i>arg</i> - parameter sent to <i>object</i> method<br>
+returns - the <i>object</i></dd>
+</dl>
+
+</div></p>
+
+<p>The <a href="../reference/send.htm">send</a> function takes the object as
+its first argument, the message selector as its second argument [which must
+be a symbol] and the message arguments as its remaining arguments. <nobr>It
+determines</nobr> the class of the receiving object and attempts to find a
+method corresponding to the message selector in the set of messages defined
+for that class. <nobr>If the</nobr> message is not found in the object's
+class and the class has a <nobr>super-class</nobr>, the search continues by
+looking at the messages defined for the <nobr>super-class</nobr>. This
+process continues from one <nobr>super-class</nobr> to the next until a
+method for the message is found. <nobr>If no</nobr> method is found, an
+error occurs.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="3"></a>
+
+<hr>
+
+<h2>3&nbsp; The 'self' Symbol</h2>
+
+<hr>
+
+<p>When a method is found, the evaluator binds the receiving object to the
+symbol <a href="../reference/self.htm">self</a> and evaluates the method
+using the remaining elements of the original list as arguments to the
+method. These arguments are always evaluated prior to being bound to their
+corresponding formal arguments. The result of evaluating the method becomes
+the result of the expression.</p>
+
+<p>Within the body of a method, a message can be sent to the current object
+by calling:</p>
+
+<pre class="example">
+(send self ... )
+</pre>
+
+<p>The method lookup starts with the object's class regardless of the class
+containing the current method.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="4"></a>
+
+<hr>
+
+<h2>4&nbsp; The 'send-super' Function</h2>
+
+<hr>
+
+<p>Sometimes it is desirable to invoke a general method in a superclass even
+when it is overridden by a more specific method in a subclass. This can be
+accomplished by calling <a
+href="../reference/send-super.htm">send-super</a>, which begins the
+method lookup in the superclass of the class defining the current method
+rather than in the class of the current object:</p>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>send-super</b> <i>selector</i> [<i>args</i>])</dt>
+<dd><i>selector</i> - the message selector<br>
+<i>args</i> - the optional message arguments<br>
+returns - the result of sending the message</dd>
+</dl>
+
+</div></p>
+
+<p>The <a href="../reference/send-super.htm">send-super</a> function
+takes a selector as its first argument [which must be a symbol] and the
+message arguments as its remaining arguments. Notice that <a
+href="../reference/send-super.htm">send-super</a> can only be sent from
+within a method, and the target of the message is always the current object
+<a href="../reference/self.htm">self</a>.</p>
+
+<pre class="example">
+(send-super ... )
+</pre>
+
+<p>is similar to:</p>
+
+<pre class="example">
+(send self ... )
+</pre>
+
+<p>except that method lookup begins in the superclass of the class
+containing the current method rather than the class of the current
+object.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="5"></a>
+<a name="object"></a>
+<a name="object-show"></a>
+<a name="object-class"></a>
+<a name="object-isnew"></a>
+<a name="send-super"></a>
+
+<hr>
+
+<h2>5&nbsp; The 'object' Class</h2>
+
+<hr>
+
+<p><div class="box">
+
+<p><a href="../reference/object.htm">object</a> - the top of the class hierarchy.</p>
+
+</div></p>
+
+<p>Messages:</p>
+
+<p><div class="box">
+
+<dl>
+
+<dt>(<a href="../reference/send.htm">send</a> <i>object</i> <a href="../reference/keyword-show.htm">:show</a>)
+- show an object's instance variables.</dt>
+<dd>returns - the object</dd>
+
+<br>
+
+<dt>(<a href="../reference/send.htm">send</a> <i>object</i> <a href="../reference/keyword-class.htm">:class</a>)
+- return the class of an object</dt>
+<dd>returns - the class of the object</dd>
+
+<br>
+
+<dt>(<a href="../reference/send.htm">send</a> <i>object</i> <a href="../reference/keyword-isnew.htm">:isnew</a> <i>args</i>)
+- run the default object initialization routine</dt>
+<dd>returns - the object</dd>
+
+<br>
+
+<dt>(<a href="../reference/send.htm">send</a> <i>object</i> <a href="../reference/keyword-isa.htm">:isa</a> <i>class</i>)
+- test if <i>object</i> inherits from <i>class</i></dt>
+<dd>returns - <a href="../reference/t.htm">&nbsp;T&nbsp;</a> if object
+is an instance of class or a subclass of class, otherwise
+<a href="../reference/nil.htm">NIL</a></dd>
+
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="6"></a>
+<a name="class"></a>
+<a name="class-new"></a>
+<a name="class-isnew"></a>
+<a name="class-answer"></a>
+
+<hr>
+
+<h2>6&nbsp; The 'class' Class</h2>
+
+<hr>
+
+<p><div class="box">
+
+<p><a href="../reference/class.htm">class</a>
+ - class of all object classes (including itself)</p>
+
+</div></p>
+
+<p>Messages:</p>
+
+<p><div class="box">
+
+<dl>
+
+<dt>(<a href="../reference/send.htm">send</a> <i>class</i> <a href="../reference/keyword-new.htm">:new</a> <i>ivars</i> [<i>cvars</i> [<i>super</i>]])
+ - create a new instance of a class</dt>
+<dd>returns - the new class object</dd>
+
+<br>
+
+<dt>(<a href="../reference/send.htm">send</a> <i>class</i> <a href="../reference/keyword-isnew.htm">:isnew</a> <i>ivars</i> [<i>cvars</i> [<i>super</i>]])
+ - initialize a new class</dt>
+<dd><i>ivars</i> - list of instance variable symbols<br>
+<i>cvars</i> - list of class variable symbols<br>
+<i>super</i> - the superclass, default is <a href="../reference/object.htm">object</a><br>
+returns - the new class object</dd>
+
+<br>
+
+<dt>(<a href="../reference/send.htm">send</a> <i>class</i> <a href="../reference/keyword-answer.htm">:answer</a> <i>selector</i> <i>fargs</i> <i>body</i>)
+ - add a message to a class</dt>
+<dd><i>selector</i> - a message selector symbol<br>
+<i>fargs</i> - the formal argument list, a lambda list<br>
+<i>body</i> - a list of executable expressions<br>
+returns - the object</dd>
+
+</dl>
+
+</div></p>
+
+<p>When a new instance of a
+<a href="../reference/class.htm">class</a> is created by sending
+the message <a href="../reference/keyword-new.htm">:new</a>
+to an existing <a href="../reference/class.htm">class</a>, the
+message <a href="../reference/keyword-isnew.htm">:isnew</a> followed by
+whatever parameters were passed to the
+<a href="../reference/keyword-new.htm">:new</a> message is sent to the
+newly created <a href="../reference/object.htm">object</a>.</p>
+
+<p>When a new <a href="../reference/class.htm">class</a> is created
+by sending the <a href="../reference/keyword-new.htm">:new</a> message to
+the object <a href="../reference/class.htm">class</a>, an optional
+parameter may be specified indicating the superclass of the new
+<a href="../reference/class.htm">class</a>. If this parameter is
+omitted, the new <a href="../reference/class.htm">class</a> will be
+a subclass of <a href="../reference/object.htm">object</a>. A
+<a href="../reference/class.htm">class</a> inherits all instance
+variables, class variables, and methods from its superclass.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/manual/part15.html b/docsrc/xlisp/xlisp-doc/manual/part15.html
new file mode 100755
index 0000000..23a808d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/manual/part15.html
@@ -0,0 +1,2131 @@
+<html><head><title>Appendix 3: XLISP: An Object-oriented Lisp</title></head>
+<a name = "100"><h2>Appendix 3: XLISP: An Object-oriented Lisp</h2></a>
+
+<blockquote><b>Version 2.0</b>
+<p>
+February 6, 1988
+<p>
+by<br>
+
+<b>David Michael Betz</b><br>
+
+127 Taylor Road<br>
+
+Peterborough, NH 03458
+<p>
+(603) 924-6936 (home)
+<p>
+Copyright (c) 1988, by David Michael Betz<br>
+
+All Rights Reserved<br>
+
+Permission is granted for unrestricted non-commercial use<br>
+
+</blockquote>
+
+
+<a name = "101"><h3>Introduction</h3></a>
+<p>
+ XLISP is an experimental programming language combining some of
+ the features of Common Lisp with an object-oriented extension
+ capability. It was implemented to allow experimentation with
+ object-oriented programming on small computers.
+<p>
+ There are currently implementations of XLISP running on the IBM-
+ PC and clones under MS-DOS, on the Macintosh, the Atari-ST and
+ the Amiga. It is completely written in the programming language
+ C and is easily extended with user written built-in functions
+ and classes. It is available in source form to non-commercial
+ users.
+<p>
+ Many Common Lisp functions are built into XLISP. In addition,
+ XLISP defines the objects Object and Class as primitives.
+ Object is the only class that has no superclass and hence is
+ the root of the class hierarchy tree. Class is the class of
+ which all classes are instances (it is the only object that is
+ an instance of itself).
+<p>
+ This document is a brief description of XLISP. It assumes some
+ knowledge of LISP and some understanding of the concepts of
+ object-oriented programming.
+<p>
+ I recommend the book <i>Lisp</i> by Winston and Horn and published by
+ Addison Wesley for learning Lisp. The first edition of this
+ book is based on MacLisp and the second edition is based on
+ Common Lisp. XLISP will continue to migrate towards
+ compatibility with Common Lisp.
+<p>
+ You will probably also need a copy of <i>Common Lisp: The
+ Language</i> by Guy L. Steele, Jr., published by Digital Press to
+ use as a reference for some of the Common Lisp functions that
+ are described only briefly in this document.
+<p>
+ <a name = "102"><h3>A Note From The Author</h3></a> If you have any problems with XLISP, feel free to contact me [me being David Betz - RBD] for
+ help or advice. Please remember that since XLISP is available
+ in source form in a high level language, many users [e.g. that Dannenberg fellow - RBD] have been
+ making versions available on a variety of machines. If you call
+ to report a problem with a specific version, I may not be able
+ to help you if that version runs on a machine to which I don't
+ have access. Please have the version number of the version that
+ you are running readily accessible before calling me.
+<p>
+ If you find a bug in XLISP, first try to fix the bug yourself
+ using the source code provided. If you are successful in fixing
+ the bug, send the bug report along with the fix to me. If you
+ don't have access to a C compiler or are unable to fix a bug,
+ please send the bug report to me and I'll try to fix it.
+<p>
+ Any suggestions for improvements will be welcomed. Feel free to
+ extend the language in whatever way suits your needs. However,
+ PLEASE DO NOT RELEASE ENHANCED VERSIONS WITHOUT CHECKING WITH ME
+ FIRST!! I would like to be the clearing house for new features
+ added to XLISP. If you want to add features for your own
+ personal use, go ahead. But, if you want to distribute your
+ enhanced version, contact me first. Please remember that the
+ goal of XLISP is to provide a language to learn and experiment
+ with LISP and object-oriented programming on small computers. I
+ don't want it to get so big that it requires megabytes of memory
+ to run.
+<p>
+ <a name = "103"><h3>XLISP Command Loop</h3></a><a name="index664"><a name="index665"> When XLISP is started, it first tries to load the workspace
+ <code>xlisp.wks</code> from the current directory. If that file doesn't
+ exist, XLISP builds an initial workspace, empty except for the
+ built-in functions and symbols.
+<p>
+ Then XLISP attempts to load <code>init.lsp</code> from the current
+ directory. It then loads any files named as parameters on the
+ command line (after appending <code>.lsp</code> to their names).
+<p>
+ XLISP then issues the following prompt:
+<pre>
+ &gt
+</pre>
+
+ This indicates that XLISP is waiting for an expression to be
+ typed.
+<p>
+ When a complete expression has been entered, XLISP attempts to
+ evaluate that expression. If the expression evaluates
+ successfully, XLISP prints the result and then returns to the
+ initial prompt waiting for another expression to be typed.
+<p>
+ <a name = "104"><h3>Break Command Loop</h3></a><a name="index666"> When XLISP encounters an error while evaluating an expression,
+ it attempts to handle the error in the following way:
+<p>
+ If the symbol <code>*breakenable*<a name="index667"></code> is true, the message corresponding
+ to the error is printed. If the error is correctable, the
+ correction message is printed.
+<p>
+ If the symbol <code>*tracenable*<a name="index668"></code> is true, a trace back is printed.
+ The number of entries printed depends on the value of the symbol
+ <code>*tracelimit*<a name="index669"></code>. If this symbol is set to something other than a
+ number, the entire trace back stack is printed.
+<p>
+ XLISP then enters a read/eval/print loop to allow the user to
+ examine the state of the interpreter in the context of the
+ error. This loop differs from the normal top-level
+ read/eval/print loop in that if the user invokes the function
+ <code>continue</code>, XLISP will continue from a correctable error. If
+ the user invokes the function <code>clean-up</code>, XLISP will abort the
+ break loop and return to the top level or the next lower
+ numbered break loop. When in a break loop, XLISP prefixes the
+ break level to the normal prompt.
+<p>
+ If the symbol <code>*breakenable*<a name="index670"></code> is <code>nil</code>, XLISP looks for a
+ surrounding errset function. If one is found, XLISP examines
+ the value of the print flag. If this flag is true, the error
+ message is printed. In any case, XLISP causes the errset
+ function call to return <code>nil</code>.
+<p>
+ If there is no surrounding errset function, XLISP prints the
+ error message and returns to the top level.
+<p>
+ <a name = "105"><h3>Data Types</h3></a><a name="index671"><a name="index672"> There are several different data types available to XLISP
+ programmers.
+<p>
+<ul>
+<li>
+lists
+<li>symbols
+<li>strings
+<li>integers
+<li>characters
+<li>floats
+<li>objects
+<li>arrays
+<li>streams
+<li>subrs (built-in functions)
+<li>fsubrs (special forms)
+<li>closures (user defined functions)
+</ul>
+<p>
+<a name = "106"><h3>The Evaluator</h3></a><a name="index673"><a name="index674"> The process of evaluation in XLISP:
+<ul>
+<li>
+ Strings, integers, characters, floats, objects, arrays, streams,
+ subrs, fsubrs and closures evaluate to themselves.
+<li> Symbols act as variables and are evaluated by retrieving the
+ value associated with their current binding.
+<li> Lists are evaluated by examining the first element of the list
+ and then taking one of the following actions:
+<ul>
+<li>
+ If it is a symbol, the functional binding of the symbol is
+ retrieved.
+<li> If it is a lambda expression, a closure is constructed for
+ the function described by the lambda expression.
+<li> If it is a subr, fsubr or closure, it stands for itself.
+<li> Any other value is an error.
+</ul>
+ Then, the value produced by the previous step is examined:
+<ul>
+<li>
+ If it is a subr or closure, the remaining list elements are
+ evaluated and the subr or closure is called with these
+ evaluated expressions as arguments.
+<li> If it is an fsubr, the fsubr is called using the remaining
+ list elements as arguments (unevaluated).
+<li> If it is a macro, the macro is expanded using the remaining
+ list elements as arguments (unevaluated). The macro
+ expansion is then evaluated in place of the original macro
+ call.
+</ul>
+</ul>
+<p>
+<a name = "107"><h3>Lexical Conventions</h3></a><a name="index675"><a name="index676"> The following conventions must be followed when entering XLISP
+ programs:
+<p>
+ Comments in XLISP code begin with a semi-colon character and
+ continue to the end of the line.
+<p>
+ Symbol names in XLISP can consist of any sequence of non-blank
+ printable characters except the following:
+<pre>
+ ( ) ' ` , " ;
+</pre>
+
+ Uppercase and lowercase characters are not distinguished within
+ symbol names. All lowercase characters are mapped to uppercase
+ on input.
+<p>
+ Integer literals consist of a sequence of digits optionally
+ beginning with a <code>+</code> or <code>-</code>. The range of values an integer can
+ represent is limited by the size of a C <code>long</code> on the machine on
+ which XLISP is running.
+<p>
+ Floating point literals consist of a sequence of digits
+ optionally beginning with a <code>+</code> or <code>-</code> and including an embedded
+ decimal point. The range of values a floating point number can
+ represent is limited by the size of a C <code>float</code> (<code>double</code> on
+ machines with 32 bit addresses) on the machine on which XLISP is
+ running.
+<p>
+ Literal strings are sequences of characters surrounded by double
+ quotes. Within quoted strings the ``<code>\</code>'' character is used to
+ allow non-printable characters to be included. The codes
+ recognized are:
+<ul>
+<li>
+<code>\\</code> means the character ``<code>\</code>''
+<li><code>\n</code> means newline
+<li><code>\t</code> means tab
+<li><code>\r</code> means return
+<li><code>\f</code> means form feed
+<li><code>\nnn</code> means the character whose octal code is nnn
+</ul>
+<p>
+<a name = "108"><h3>Readtables</h3></a><a name="index677"> The behavior of the reader is controlled by a data structure
+ called a <i>readtable</i>. The reader uses the symbol <code>*readtable*<a name="index678"></code> to
+ locate the current readtable. This table controls the
+ interpretation of input characters. It is an array with 128
+ entries, one for each of the ASCII character codes. Each entry
+ contains one of the following things:
+<ul>
+<li>
+ <code>NIL</code> - Indicating an invalid character
+<li> <code>:CONSTITUENT</code> - Indicating a symbol constituent
+<li> <code>:WHITE-SPACE</code> - Indicating a whitespace character
+<li> <code>(:TMACRO . <i>fun</i>)</code> - Terminating readmacro
+<li> <code>(:NMACRO . <i>fun</i>)</code> - Non-terminating readmacro
+<li> <code>:SESCAPE</code> - Single escape character ('\')
+<li> <code>:MESCAPE</code> - Multiple escape character ('|')
+</ul>
+<p>
+ In the case of <code>:TMACRO</code> and <code>:NMACRO</code>, the <i>fun</i> component is a
+ function. This can either be a built-in readmacro function or a
+ lambda expression. The function should take two parameters.
+ The first is the input stream and the second is the character
+ that caused the invocation of the readmacro. The readmacro
+ function should return <code>NIL</code> to indicate that the character should
+ be treated as white space or a value consed with <code>NIL</code> to indicate
+ that the readmacro should be treated as an occurence of the
+ specified value. Of course, the readmacro code is free to read
+ additional characters from the input stream.
+<p>
+ XLISP defines several useful read macros:
+<ul>
+<li>
+ '<i>&ltexpr&gt</i> == (quote <i>&ltexpr&gt</i>)
+<li> #'<i>&ltexpr&gt</i> == (function <i>&ltexpr&gt</i>)
+<li> #(<i>&ltexpr&gt</i>...) == an array of the specified expressions
+<li> #x<i>&lthdigits&gt</i> == a hexadecimal number (0-9,A-F)
+<li> #o<i>&ltodigits&gt</i> == an octal number (0-7)
+<li> #b<i>&ltbdigits&gt</i> == a binary number (0-1)
+<li> #\<i>&ltchar&gt</i> == the ASCII code of the character
+<li> #| ... |# == a comment
+<li> #:<i>&ltsymbol&gt</i> == an uninterned symbol
+<li> `<i>&ltexpr&gt</i> == (backquote <i>&ltexpr&gt</i>)
+<li> ,<i>&ltexpr&gt</i> == (comma <i>&ltexpr&gt</i>)
+<li> ,@<i>&ltexpr&gt</i> == (comma-at <i>&ltexpr&gt</i>)
+<li></ul>
+<a name = "109"><h3>Lambda Lists</h3></a><a name="index679"> There are several forms in XLISP that require that a ``lambda
+ list'' be specified. A lambda list is a definition of the
+ arguments accepted by a function. There are four different
+ types of arguments.
+<p>
+ The lambda list starts with required arguments. Required
+ arguments must be specified in every call to the function.
+<p>
+ The required arguments are followed by the &amp;optional arguments.
+ Optional arguments may be provided or omitted in a call. An
+ initialization expression may be specified to provide a default
+ value for an &amp;optional argument if it is omitted from a call.
+ If no initialization expression is specified, an omitted
+ argument is initialized to <code>NIL</code>. It is also possible to provide
+ the name of a <code>supplied-p</code> variable that can be used to
+ determine if a call provided a value for the argument or if the
+ initialization expression was used. If specified, the supplied-
+ p variable will be bound to T if a value was specified in the
+ call and <code>NIL</code> if the default value was used.
+<p>
+ The &amp;optional arguments are followed by the &amp;rest argument. The
+ &amp;rest argument gets bound to the remainder of the argument list
+ after the required and &amp;optional arguments have been removed.
+<p>
+ The &amp;rest argument is followed by the &amp;key arguments. When a
+ keyword argument is passed to a function, a pair of values
+ appears in the argument list. The first expression in the pair
+ should evaluate to a keyword symbol (a symbol that begins with a
+ ``<code>:</code>''). The value of the second expression is the value of the
+ keyword argument. Like &amp;optional arguments, &amp;key arguments can
+ have initialization expressions and supplied-p variables. In
+ addition, it is possible to specify the keyword to be used in a
+ function call. If no keyword is specified, the keyword obtained
+ by adding a ``<code>:</code>'' to the beginning of the keyword argument symbol
+ is used. In other words, if the keyword argument symbol is
+ <code>foo</code>, the keyword will be <code>':foo</code>.
+<p>
+ The &amp;key arguments are followed by the &amp;aux variables. These
+ are local variables that are bound during the evaluation of the
+ function body. It is possible to have initialization
+ expressions for the &amp;aux variables.
+<p>
+ Here is the complete syntax for lambda lists:
+<blockquote>
+ (<i>rarg</i>...<br>
+
+ [&amp;optional [<i>oarg</i> | (<i>oarg</i> [<i>init</i> [<i>svar</i>]])]...]<br>
+
+ [&amp;rest <i>rarg</i>]<br>
+
+ [&amp;key<br>
+
+ [<i>karg</i> | ([<i>karg</i> | (<i>key</i> <i>karg</i>)] [<i>init</i> [<i>svar</i>]])]...<br>
+
+ &amp;allow-other-keys]<br>
+
+ [&amp;aux<br>
+
+ [<i>aux</i> | (<i>aux</i> [<i>init</i>])]...])
+<p>
+ where:
+<p>
+ <i>rarg</i> is a required argument symbol<br>
+
+ <i>oarg</i> is an &amp;optional argument symbol<br>
+
+ <i>rarg</i> is the &amp;rest argument symbol<br>
+
+ <i>karg</i> is a &amp;key argument symbol<br>
+
+ <i>key</i> is a keyword symbol<br>
+
+ <i>aux</i> is an auxiliary variable symbol<br>
+
+ <i>init</i> is an initialization expression<br>
+
+ <i>svar</i> is a supplied-p variable symbol<br>
+
+</blockquote>
+<p>
+<a name = "110"><h3>Objects</h3></a><a name="index680"> Definitions:
+<ul>
+<li>
+selector - a symbol used to select an appropriate method
+<li>message - a selector and a list of actual arguments
+<li>method - the code that implements a message
+</ul>
+ Since XLISP was created to provide a simple basis for
+ experimenting with object-oriented programming, one of the
+ primitive data types included is <i>object</i>. In XLISP, an object
+ consists of a data structure containing a pointer to the
+ object's class as well as an array containing the values of the
+ object's instance variables.
+<p>
+ Officially, there is no way to see inside an object (look at the
+ values of its instance variables). The only way to communicate
+ with an object is by sending it a message.
+<p>
+ You can send a message to an object using the <code>send</code> function.
+ This function takes the object as its first argument, the
+ message selector as its second argument (which must be a symbol)
+ and the message arguments as its remaining arguments.
+<p>
+ The <code>send</code> function determines the class of the receiving object
+ and attempts to find a method corresponding to the message
+ selector in the set of messages defined for that class. If the
+ message is not found in the object's class and the class has a
+ super-class, the search continues by looking at the messages
+ defined for the super-class. This process continues from one
+ super-class to the next until a method for the message is found.
+ If no method is found, an error occurs.
+<p>
+ A message can also be sent from the body of a method by using
+ the current object, but the method lookup starts with the
+ object's superclass rather than its class. This allows a
+ subclass to invoke a standard method in its parent class even
+ though it overrides that method with its own specialized
+ version.
+<p>
+ When a method is found, the evaluator binds the receiving object
+ to the symbol <code>self</code> and evaluates the method using the
+ remaining elements of the original list as arguments to the
+ method. These arguments are always evaluated prior to being
+ bound to their corresponding formal arguments. The result of
+ evaluating the method becomes the result of the expression.
+<p>
+<a name = "111"><h3>The ``Object'' Class</h3></a><a name="index681"><code>Object</code><a name="index682"> - the top of the class hierarchy.
+<p>
+Messages:
+<dl>
+<dt>
+<code>:show<a name="index683"></code> - show an object's instance variables.
+<dd>
+returns - the object
+
+<br>
+<br><dt><code>:class<a name="index684"></code> - return the class of an object
+<dd>
+returns - the class of the object
+
+<br>
+<br><dt><code>:isnew<a name="index685"></code> - the default object initialization routine
+<dd>
+returns - the object
+<br><dt>
+<code>:sendsuper<a name="index686"></code> <i>sel</i> <i>args</i>... - send superclass a message
+<dd>
+<i>sel</i> - the message selector<br>
+<i>args</i> - the message arguments<br>
+returns - the result of sending the message
+
+<br>
+<br><dt>
+</dl>
+<p>
+<a name = "112"><h3>The ``Class'' Class</h3></a><a name="index687"><code>Class<a name="index688"></code> - class of all object classes (including itself)
+<p>
+ Messages:
+<p>
+<dl>
+<dt>
+ :new<a name="index689"> - create a new instance of a class
+<dd>
+ returns - the new class object
+
+<br>
+<br><dt> :isnew<a name="index690"> <i>ivars</i> [<i>cvars</i> [<i>super</i>]] - initialize a new class
+<dd>
+ <i>ivars</i> - the list of instance variable symbols<br>
+ <i>cvars</i> - the list of class variable symbols<br>
+ <i>super</i> - the superclass (default is object)<br>
+ returns - the new class object
+
+<br>
+<br><dt> :answer<a name="index691"> <i>msg</i> <i>fargs</i> <i>code</i> - add a message to a class
+<dd>
+ <i>msg</i> - the message symbol<br>
+ <i>fargs</i> - the formal argument list (lambda list)<br>
+ <i>code</i> - a list of executable expressions<br>
+ returns - the object
+
+<br>
+<br><dt>
+</dl>
+<p>
+ When a new instance of a class is created by sending the message
+ <code>:new</code> to an existing class, the message <code>:isnew</code> followed by
+ whatever parameters were passed to the <code>:new</code> message is sent to
+ the newly created object.
+<p>
+ When a new class is created by sending the <code>:new</code> message to the
+ object <code>Class</code>, an optional parameter may be specified
+ indicating the superclass of the new class. If this parameter
+ is omitted, the new class will be a subclass of <code>Object</code>. A
+ class inherits all instance variables, class variables, and
+ methods from its super-class.
+<p>
+<a name = "113"><h3>Profiling</h3></a><a name="index692">
+The Xlisp 2.0 release has been extended with a profiling facility, which counts how many times and where <code>eval</code> is executed. A separate count is maintained for each named function, closure, or macro, and a count indicates an <code>eval</code> in the immediately (lexically) enclosing named function, closure, or macro. Thus, the count gives an indication of the amount of time spent in a function, not counting nested function calls. The list of all functions executed is maintained on the global <code>*profile*</code> variable. These functions in turn have <code>*profile*</code> properties, which maintain the counts. The profile system merely increments counters and puts symbols on the <code>*profile*</code> list. It is up to the user to initialize data and gather results. Profiling is turned on or off with the <code>profile</code> function. Unfortunately, methods cannot be profiled with this facility.
+<p>
+<a name = "114"><h3>SYMBOLS</h3></a><a name="index693">
+<ul>
+<li>
+<code>self</code> - the current object (within a method context)
+<li><code>*obarray*<a name="index694"></code> - the object hash table
+<li><code>*standard-input*<a name="index695"></code> - the standard input stream
+<li><code>*standard-output*<a name="index696"></code> - the standard output stream
+<li><code>*error-output*<a name="index697"></code> - the error output stream
+<li><code>*trace-output*<a name="index698"></code> - the trace output stream
+<li><code>*debug-io*<a name="index699"></code> - the debug i/o stream
+<li><code>*breakenable*<a name="index700"></code> - flag controlling entering break loop on errors
+<li><code>*tracelist*<a name="index701"></code> - list of names of functions to trace
+<li><code>*tracenable*<a name="index702"></code> - enable trace back printout on errors
+<li><code>*tracelimit*<a name="index703"></code> - number of levels of trace back information
+<li><code>*evalhook*<a name="index704"></code> - user substitute for the evaluator function
+<li><code>*applyhook*<a name="index705"></code> - (not yet implemented)
+<li><code>*readtable*<a name="index706"></code> - the current readtable
+<li><code>*unbound*<a name="index707"></code> - indicator for unbound symbols
+<li><code>*gc-flag*<a name="index708"></code> - controls the printing of gc messages
+<li><code>*gc-hook*<a name="index709"></code> - function to call after garbage collection
+<li><code>*integer-format*<a name="index710"></code> - format for printing integers (``%d'' or ``%ld'')
+<li><code>*float-format*<a name="index711"></code> - format for printing floats (``%g'')
+<li><code>*print-case*<a name="index712"></code> - symbol output case (:upcase or :downcase)
+</ul>
+<p>
+ There are several symbols maintained by the read/eval/print
+ loop. The symbols <code>+</code>, <code>++</code>, and <code>+++</code> are bound to the most
+ recent three input expressions. The symbols <code>*</code>, <code>**</code> and <code>***</code>
+ are bound to the most recent three results. The symbol <code>-</code> is
+ bound to the expression currently being evaluated. It becomes
+ the value of <code>+</code> at the end of the evaluation.
+<a name = "115"><h3>Evaluation Functions</h3></a><a name="index713">
+<dl>
+<dt>
+ (eval<a name="index714"> <i>expr</i>) - evaluate an xlisp expression
+<dd>
+ <i>expr</i> - the expression to be evaluated<br>
+ returns - the result of evaluating the expression
+
+<br>
+<br><dt> (apply<a name="index715"> <i>fun</i> <i>args</i>) - apply a function to a list of arguments
+<dd>
+ <i>fun</i> - the function to apply (or function symbol)<br>
+ <i>args</i> - the argument list<br>
+ returns - the result of applying the function to the arguments
+
+<br>
+<br><dt> (funcall<a name="index716"> <i>fun</i> <i>arg</i>...) - call a function with arguments
+<dd>
+ <i>fun</i> - the function to call (or function symbol)<br>
+ <i>arg</i> - arguments to pass to the function<br>
+ returns - the result of calling the function with the arguments
+
+<br>
+<br><dt> (quote<a name="index717"> <i>expr</i>) - return an expression unevaluated
+<dd>
+ <i>expr</i> - the expression to be quoted (quoted)<br>
+ returns - <i>expr</i> unevaluated
+
+<br>
+<br><dt> (function<a name="index718"> <i>expr</i>) - get the functional interpretation<dd>
+ <i>expr</i> - the symbol or lambda expression (quoted)<br>
+ returns - the functional interpretation<br>
+
+<br><dt> (backquote<a name="index719"> <i>expr</i>) - fill in a template<dd>
+ <i>expr</i> - the template<br>
+ returns - a copy of the template with comma and comma-at<br>
+ expressions expanded
+
+<br>
+<br><dt> (lambda<a name="index720"> <i>args</i> <i>expr</i>...) - make a function closure<dd>
+ <i>args</i> - formal argument list (lambda list) (quoted)<br>
+ <i>expr</i> - expressions of the function body<br>
+ returns - the function closure<br>
+
+<br><dt> (get-lambda-expression<a name="index721"> <i>closure</i>) - get the lambda expression<dd>
+ <i>closure</i> - the closure<br>
+ returns - the original lambda expression<br>
+
+<br><dt> (macroexpand<a name="index722"> <i>form</i>) - recursively expand macro calls<dd>
+ <i>form</i> - the form to expand<br>
+ returns - the macro expansion<br>
+
+<br><dt> (macroexpand-1<a name="index723"> <i>form</i>) - expand a macro call<dd>
+ <i>form</i> - the macro call form<br>
+ returns - the macro expansion<br>
+
+<br><dt>
+</dl><a name = "116"><h3>Symbol Functions</h3></a><a name="index724">
+<dl>
+<dt>
+ (set<a name="index725"> <i>sym</i> <i>expr</i>) - set the value of a symbol
+<dd>
+ <i>sym</i> - the symbol being set<br>
+ <i>expr</i> - the new value<br>
+ returns - the new value<br>
+
+<br><dt> (setq<a name="index726"> [<i>sym</i> <i>expr</i>]...) - set the value of a symbol
+<dd>
+ <i>sym</i> - the symbol being set (quoted)<br>
+ <i>expr</i> - the new value<br>
+ returns - the new value<br>
+
+<br><dt> (psetq<a name="index727"> [<i>sym</i> <i>expr</i>]...) - parallel version of setq
+<dd>
+ <i>sym</i> - the symbol being set (quoted)<br>
+ <i>expr</i> - the new value<br>
+ returns - the new value<br>
+
+<br><dt> (setf<a name="index728"> [<i>place</i> <i>expr</i>]...) - set the value of a field
+<dd>
+ <i>place</i> - the field specifier (quoted):<br>
+<dl><dd>
+ <i>sym</i> - set value of a symbol<br>
+ (car <i>expr</i>) - set car of a cons node<br>
+ (cdr <i>expr</i>) - set cdr of a cons node<br>
+ (nth <i>n</i> <i>expr</i>) - set nth car of a list<br>
+ (aref <i>expr</i> <i>n</i>) - set nth element of an array<br>
+ (get <i>sym</i> <i>prop</i>) - set value of a property<br>
+ (symbol-value <i>sym</i>) - set value of a symbol<br>
+ (symbol-function <i>sym</i>) - set functional value of a symbol<br>
+ (symbol-plist <i>sym</i>) - set property list of a symbol<br>
+</dl>
+ <i>expr</i> - the new value<br>
+ returns - the new value<br>
+
+<br><dt>
+
+ (defun<a name="index729"> <i>sym</i> <i>fargs</i> <i>expr</i>...) - define a function<br>
+ (defmacro<a name="index730"> <i>sym</i> <i>fargs</i> <i>expr</i>...) - define a macro
+
+<dd>
+ <i>sym</i> - symbol being defined (quoted)<br>
+ <i>fargs</i> - formal argument list (lambda list) (quoted)<br>
+ <i>expr</i> - expressions constituting the body of the<br>
+ function (quoted)
+ returns - the function symbol<br>
+
+<br><dt> (gensym<a name="index731"> [<i>tag</i>]) - generate a symbol
+<dd>
+ <i>tag</i> - string or number<br>
+ returns - the new symbol<br>
+
+<br><dt>(intern<a name="index732"> <i>pname</i>) - make an interned symbol
+<dd>
+ <i>pname</i> - the symbol's print name string<br>
+ returns - the new symbol<br>
+
+<br><dt> (make-symbol<a name="index733"> <i>pname</i>) - make an uninterned symbol
+<dd>
+ <i>pname</i> - the symbol's print name string<br>
+ returns - the new symbol<br>
+
+<br><dt> (symbol-name<a name="index734"> <i>sym</i>) - get the print name of a symbol
+<dd>
+ <i>sym</i> - the symbol<br>
+ returns - the symbol's print name<br>
+
+<br><dt> (symbol-value<a name="index735"> <i>sym</i>) - get the value of a symbol
+<dd>
+ <i>sym</i> - the symbol<br>
+ returns - the symbol's value<br>
+
+<br><dt> (symbol-function<a name="index736"> <i>sym</i>) - get the functional value of a symbol
+<dd>
+ <i>sym</i> - the symbol<br>
+ returns - the symbol's functional value<br>
+
+<br><dt> (symbol-plist<a name="index737"> <i>sym</i>) - get the property list of a symbol
+<dd>
+ <i>sym</i> - the symbol<br>
+ returns - the symbol's property list<br>
+
+<br><dt> (hash<a name="index738"> <i>sym</i> <i>n</i>) - compute the hash index for a symbol
+<dd>
+ <i>sym</i> - the symbol or string<br>
+ <i>n</i> - the table size (integer)<br>
+ returns - the hash index (integer)<br>
+
+<br><dt>
+</dl><a name = "117"><h3>Property List Functions</h3></a><a name="index739">
+<dl>
+<dt>
+ (get<a name="index740"> <i>sym</i> <i>prop</i>) - get the value of a property
+<dd>
+ <i>sym</i> - the symbol<br>
+ <i>prop</i> - the property symbol<br>
+ returns - the property value or <code>nil</code><br>
+
+<br><dt> (putprop<a name="index741"> <i>sym</i> <i>val</i> <i>prop</i>) - put a property onto a property list
+<dd>
+ <i>sym</i> - the symbol<br>
+ <i>val</i> - the property value<br>
+ <i>prop</i> - the property symbol<br>
+ returns - the property value<br>
+
+<br><dt> (remprop<a name="index742"> <i>sym</i> <i>prop</i>) - remove a property
+<dd>
+ <i>sym</i> - the symbol<br>
+ <i>prop</i> - the property symbol<br>
+ returns - <code>nil</code><br>
+
+<br><dt>
+</dl><a name = "118"><h3>Array Functions</h3></a><a name="index743">
+<dl>
+<dt>
+ (aref<a name="index744"> <i>array</i> <i>n</i>) - get the nth element of an array
+<dd>
+ <i>array</i> - the array<br>
+ <i>n</i> - the array index (integer)<br>
+ returns - the value of the array element<br>
+
+<br><dt> (make-array<a name="index745"> <i>size</i>) - make a new array
+<dd>
+ <i>size</i> - the size of the new array (integer)<br>
+ returns - the new array<br>
+
+<br><dt> (vector<a name="index746"> <i>expr</i>...) - make an initialized vector
+<dd>
+ <i>expr</i> - the vector elements<br>
+ returns - the new vector<br>
+
+<br><dt>
+</dl><a name = "119"><h3>List Functions</h3></a><a name="index747">
+<dl>
+<dt>
+ (car<a name="index748"> <i>expr</i>) - return the car of a list node
+<dd>
+ <i>expr</i> - the list node<br>
+ returns - the car of the list node<br>
+
+<br><dt> (cdr<a name="index749"> <i>expr</i>) - return the cdr of a list node
+<dd>
+ <i>expr</i> - the list node<br>
+ returns - the cdr of the list node<br>
+
+<br><dt> (c<i>xx</i>r<a name="index750"> <i>expr</i>) - all c<i>xx</i>r combinations
+<dd>
+
+<br>
+<br><dt> (c<i>xxx</i>r<a name="index751"> <i>expr</i>) - all c<i>xxx</i>r combinations
+<dd>
+
+<br>
+<br><dt> (c<i>xxxx</i>r<a name="index752"> <i>expr</i>) - all c<i>xxxx</i>r combinations
+<dd>
+
+<br>
+<br><dt> (first<a name="index753"> <i>expr</i>) - a synonym for car
+<dd>
+
+<br>
+<br><dt> (second<a name="index754"> <i>expr</i>) - a synonym for cadr
+<dd>
+
+<br>
+<br><dt> (third<a name="index755"> <i>expr</i>) - a synonym for caddr
+<dd>
+
+<br>
+<br><dt> (fourth<a name="index756"> <i>expr</i>) - a synonym for cadddr
+<dd>
+
+<br>
+<br><dt> (rest<a name="index757"> <i>expr</i>) - a synonym for cdr
+<dd>
+
+<br>
+<br><dt> (cons<a name="index758"> <i>expr1</i> <i>expr2</i>) - construct a new list node
+<dd>
+ <i>expr1</i> - the car of the new list node<br>
+ <i>expr2</i> - the cdr of the new list node<br>
+ returns - the new list node<br>
+
+<br><dt> (list<a name="index759"> <i>expr</i>...) - create a list of values
+<dd>
+ <i>expr</i> - expressions to be combined into a list<br>
+ returns - the new list<br>
+
+<br><dt> (append<a name="index760"> <i>expr</i>...) - append lists
+<dd>
+ <i>expr</i> - lists whose elements are to be appended<br>
+ returns - the new list<br>
+
+<br><dt> (reverse<a name="index761"> <i>expr</i>) - reverse a list
+<dd>
+ <i>expr</i> - the list to reverse<br>
+ returns - a new list in the reverse order<br>
+
+<br><dt> (last<a name="index762"> <i>list</i>) - return the last list node of a list
+<dd>
+ <i>list</i> - the list<br>
+ returns - the last list node in the list<br>
+
+<br><dt> (member<a name="index763"> <i>expr</i> <i>list</i> &amp;key :test :test-not) - find an expression in a list
+<dd>
+ <i>expr</i> - the expression to find<br>
+ <i>list</i> - the list to search<br>
+ :test - the test function (defaults to eql)<br>
+ :test-not - the test function (sense inverted) <br>
+ returns - the remainder of the list starting with the expression<br>
+
+<br><dt> (assoc<a name="index764"> <i>expr</i> <i>alist</i> &amp;key :test :test-not) - find an expression in an a-list
+<dd>
+ <i>expr</i> - the expression to find<br>
+ <i>alist</i> - the association list<br>
+ :test - the test function (defaults to eql)<br>
+ :test-not - the test function (sense inverted) <br>
+ returns - the alist entry or <code>nil</code><br>
+
+<br><dt> (remove<a name="index765"> <i>expr</i> <i>list</i> &amp;key :test :test-not) - remove elements from a list
+<dd>
+ <i>expr</i> - the element to remove<br>
+ <i>list</i> - the list<br>
+ :test - the test function (defaults to eql)<br>
+ :test-not - the test function (sense inverted) <br>
+ returns - copy of list with matching expressions removed<br>
+
+<br><dt> (remove-if<a name="index766"> <i>test</i> <i>list</i>) - remove elements that pass test
+<dd>
+ <i>test</i> - the test predicate<br>
+ <i>list</i> - the list<br>
+ returns - copy of list with matching elements removed<br>
+
+<br><dt> (remove-if-not<a name="index767"> <i>test</i> <i>list</i>) - remove elements that fail test
+<dd>
+ <i>test</i> - the test predicate<br>
+ <i>list</i> - the list<br>
+ returns - copy of list with non-matching elements removed<br>
+
+<br><dt> (length<a name="index768"> <i>expr</i>) - find the length of a list, vector or string
+<dd>
+ <i>expr</i> - the list, vector or string<br>
+ returns - the length of the list, vector or string<br>
+
+<br><dt> (nth<a name="index769"> <i>n</i> <i>list</i>) - return the nth element of a list
+<dd>
+ <i>n</i> - the number of the element to return (zero origin)<br>
+ <i>list</i> - the list<br>
+ returns - the nth element or <code>nil</code> if the list isn't that long<br>
+
+<br><dt> (nthcdr<a name="index770"> <i>n</i> <i>list</i>) - return the nth cdr of a list
+<dd>
+ <i>n</i> - the number of the element to return (zero origin)<br>
+ <i>list</i> - the list<br>
+ returns - the nth cdr or <code>nil</code> if the list isn't that long<br>
+
+<br><dt> (mapc<a name="index771"> <i>fcn</i> <i>list1</i> <i>list</i>...) - apply function to successive cars
+<dd>
+ <i>fcn</i> - the function or function name<br>
+ <i>listn</i> - a list for each argument of the function<br>
+ returns - the first list of arguments<br>
+
+<br><dt> (mapcar<a name="index772"> <i>fcn</i> <i>list1</i> <i>list</i>...) - apply function to successive cars
+<dd>
+ <i>fcn</i> - the function or function name<br>
+ <i>listn</i> - a list for each argument of the function<br>
+ returns - a list of the values returned<br>
+
+<br><dt> (mapl<a name="index773"> <i>fcn</i> <i>list1</i> <i>list</i>...) - apply function to successive cdrs
+<dd>
+ <i>fcn</i> - the function or function name<br>
+ <i>listn</i> - a list for each argument of the function<br>
+ returns - the first list of arguments<br>
+
+<br><dt> (maplist<a name="index774"> <i>fcn</i> <i>list1</i> <i>list</i>...) - apply function to successive cdrs
+<dd>
+ <i>fcn</i> - the function or function name<br>
+ <i>listn</i> - a list for each argument of the function<br>
+ returns - a list of the values returned<br>
+
+<br><dt> (subst<a name="index775"> <i>to</i> <i>from</i> <i>expr</i> &amp;key :test :test-not) - substitute expressions
+<dd>
+ <i>to</i> - the new expression<br>
+ <i>from</i> - the old expression<br>
+ <i>expr</i> - the expression in which to do the substitutions<br>
+ :test - the test function (defaults to eql)<br>
+ :test-not - the test function (sense inverted) <br>
+ returns - the expression with substitutions<br>
+
+<br><dt> (sublis<a name="index776"> <i>alist</i> <i>expr</i> &amp;key :test :test-not) - substitute with an a-list
+<dd>
+ <i>alist</i> - the association list<br>
+ <i>expr</i> - the expression in which to do the substitutions<br>
+ :test - the test function (defaults to eql)<br>
+ :test-not - the test function (sense inverted) <br>
+ returns - the expression with substitutions<br>
+
+<br><dt>
+</dl><a name = "120"><h3>Destructive List Functions</h3></a><a name="index777">
+<dl>
+<dt>
+ (rplaca<a name="index778"> <i>list</i> <i>expr</i>) - replace the car of a list node
+<dd>
+ <i>list</i> - the list node<br>
+ <i>expr</i> - the new value for the car of the list node<br>
+ returns - the list node after updating the car<br>
+
+<br><dt> (rplacd<a name="index779"> <i>list</i> <i>expr</i>) - replace the cdr of a list node
+<dd>
+ <i>list</i> - the list node<br>
+ <i>expr</i> - the new value for the cdr of the list node<br>
+ returns - the list node after updating the cdr<br>
+
+<br><dt> (nconc<a name="index780"> <i>list</i>...) - destructively concatenate lists
+<dd>
+ <i>list</i> - lists to concatenate<br>
+ returns - the result of concatenating the lists<br>
+
+<br><dt> (delete<a name="index781"> <i>expr</i> &amp;key :test :test-not) - delete elements from a list
+<dd>
+ <i>expr</i> - the element to delete<br>
+ <i>list</i> - the list<br>
+ :test - the test function (defaults to eql)<br>
+ :test-not - the test function (sense inverted) <br>
+ returns - the list with the matching expressions deleted<br>
+
+<br><dt> (delete-if<a name="index782"> <i>test</i> <i>list</i>) - delete elements that pass test
+<dd>
+ <i>test</i> - the test predicate<br>
+ <i>list</i> - the list<br>
+ returns - the list with matching elements deleted<br>
+
+<br><dt> (delete-if-not<a name="index783"> <i>test</i> <i>list</i>) - delete elements that fail test
+<dd>
+ <i>test</i> - the test predicate<br>
+ <i>list</i> - the list<br>
+ returns - the list with non-matching elements deleted<br>
+
+<br><dt> (sort<a name="index784"> <i>list</i> <i>test</i>) - sort a list
+<dd>
+ <i>list</i> - the list to sort<br>
+ <i>test</i> - the comparison function<br>
+ returns - the sorted list<br>
+
+<br><dt>
+</dl><a name = "121"><h3>Predicate Functions</h3></a><a name="index785">
+<dl>
+<dt>
+ (atom<a name="index786"> <i>expr</i>) - is this an atom?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the value is an atom, <code>nil</code> otherwise<br>
+
+<br><dt> (symbolp<a name="index787"> <i>expr</i>) - is this a symbol?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the expression is a symbol, <code>nil</code> otherwise<br>
+
+<br><dt> (numberp<a name="index788"> <i>expr</i>) - is this a number?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the expression is a number, <code>nil</code> otherwise<br>
+
+<br><dt> (null<a name="index789"> <i>expr</i>) - is this an empty list?
+<dd>
+ <i>expr</i> - the list to check<br>
+ returns - <code>t</code> if the list is empty, <code>nil</code> otherwise<br>
+
+<br><dt> (not<a name="index790"> <i>expr</i>) - is this false?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ return - <code>t</code> if the value is <code>nil</code>, <code>nil</code> otherwise<br>
+
+<br><dt> (listp<a name="index791"> <i>expr</i>) - is this a list?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the value is a cons or <code>nil</code>, <code>nil</code> otherwise<br>
+
+<br><dt> (endp<a name="index792"> <i>list</i>) - is this the end of a list
+<dd>
+ <i>list</i> - the list<br>
+ returns - <code>t</code> if the value is <code>nil</code>, <code>nil</code> otherwise<br>
+
+<br><dt> (consp<a name="index793"> <i>expr</i>) - is this a non-empty list?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the value is a cons, <code>nil</code> otherwise<br>
+
+<br><dt> (integerp<a name="index794"> <i>expr</i>) - is this an integer?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the value is an integer, <code>nil</code> otherwise<br>
+
+<br><dt> (floatp<a name="index795"> <i>expr</i>) - is this a float?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the value is a float, <code>nil</code> otherwise<br>
+
+<br><dt> (stringp<a name="index796"> <i>expr</i>) - is this a string?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the value is a string, <code>nil</code> otherwise<br>
+
+<br><dt> (characterp<a name="index797"> <i>expr</i>) - is this a character?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the value is a character, <code>nil</code> otherwise<br>
+
+<br><dt> (arrayp<a name="index798"> <i>expr</i>) - is this an array?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the value is an array, <code>nil</code> otherwise<br>
+
+<br><dt> (streamp<a name="index799"> <i>expr</i>) - is this a stream?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the value is a stream, <code>nil</code> otherwise<br>
+
+<br><dt> (objectp<a name="index800"> <i>expr</i>) - is this an object?
+<dd>
+ <i>expr</i> - the expression to check<br>
+ returns - <code>t</code> if the value is an object, <code>nil</code> otherwise<br>
+
+<br><dt> (boundp<a name="index801"> <i>sym</i>) - is a value bound to this symbol?
+<dd>
+ <i>sym</i> - the symbol<br>
+ returns - <code>t</code> if a value is bound to the symbol, <code>nil</code> otherwise<br>
+
+<br><dt> (fboundp<a name="index802"> <i>sym</i>) - is a functional value bound to this symbol?
+<dd>
+ <i>sym</i> - the symbol<br>
+ returns - <code>t</code> if a functional value is bound to the symbol,<br>
+ <code>nil</code> otherwise
+
+<br>
+<br><dt> (minusp<a name="index803"> <i>expr</i>) - is this number negative?
+<dd>
+ <i>expr</i> - the number to test<br>
+ returns - <code>t</code> if the number is negative, <code>nil</code> otherwise<br>
+
+<br><dt> (zerop<a name="index804"> <i>expr</i>) - is this number zero?
+<dd>
+ <i>expr</i> - the number to test<br>
+ returns - <code>t</code> if the number is zero, <code>nil</code> otherwise<br>
+
+<br><dt> (plusp<a name="index805"> <i>expr</i>) - is this number positive?
+<dd>
+ <i>expr</i> - the number to test<br>
+ returns - <code>t</code> if the number is positive, <code>nil</code> otherwise<br>
+
+<br><dt> (evenp<a name="index806"> <i>expr</i>) - is this integer even?
+<dd>
+ <i>expr</i> - the integer to test<br>
+ returns - <code>t</code> if the integer is even, <code>nil</code> otherwise<br>
+
+<br><dt> (oddp<a name="index807"> <i>expr</i>) - is this integer odd?
+<dd>
+ <i>expr</i> - the integer to test<br>
+ returns - <code>t</code> if the integer is odd, <code>nil</code> otherwise<br>
+
+<br><dt> (eq<a name="index808"> <i>expr1</i> <i>expr2</i>) - are the expressions identical?
+<dd>
+ <i>expr1</i> - the first expression<br>
+ <i>expr2</i> - the second expression<br>
+ returns - <code>t</code> if they are equal, <code>nil</code> otherwise<br>
+
+<br><dt>(eql<a name="index809"> <i>expr1</i> <i>expr2</i>) - are the expressions
+identical? (works with all numbers)
+<dd>
+ <i>expr1</i> - the first expression<br>
+ <i>expr2</i> - the second expression<br>
+ returns - <code>t</code> if they are equal, <code>nil</code> otherwise<br>
+
+<br><dt> (equal<a name="index810"> <i>expr1</i> <i>expr2</i>) - are the expressions equal?
+<dd>
+ <i>expr1</i> - the first expression<br>
+ <i>expr2</i> - the second expression<br>
+ returns - <code>t</code> if they are equal, <code>nil</code> otherwise<br>
+
+<br><dt>
+</dl><a name = "122"><h3>Control Constructs</h3></a><a name="index811">
+<dl>
+<dt>
+ (cond<a name="index812"> <i>pair</i>...) - evaluate conditionally
+<dd>
+ <i>pair</i> - pair consisting of:<br>
+<dl><dd>
+ (<i>pred</i> <i>expr</i>...)
+</dl>
+ where:
+<dl><dd>
+ <i>pred</i> - is a predicate expression<br>
+ <i>expr</i> - evaluated if the predicate
+ is not <code>nil</code>
+</dl>
+returns - the value of the first expression whose predicate is not
+<code>nil</code>
+
+<br>
+<br><dt> (and<a name="index813"> <i>expr</i>...) - the logical and of a list of expressions
+<dd>
+ <i>expr</i> - the expressions to be anded<br>
+ returns - <code>nil</code> if any expression evaluates to <code>nil</code>,
+ otherwise the value of the last expression
+ (evaluation of expressions stops after the first
+ expression that evaluates to <code>nil</code>)
+
+<br>
+<br><dt> (or<a name="index814"> <i>expr</i>...) - the logical or of a list of expressions
+<dd>
+ <i>expr</i> - the expressions to be ored<br>
+ returns - <code>nil</code> if all expressions evaluate to <code>nil</code>,
+ otherwise the value of the first non-<code>nil</code> expression
+ (evaluation of expressions stops after the first
+ expression that does not evaluate to <code>nil</code>)
+
+<br>
+<br><dt> (if<a name="index815"> <i>texpr</i> <i>expr1</i> [<i>expr2</i>]) - evaluate expressions conditionally
+<dd>
+ <i>texpr</i> - the test expression<br>
+ <i>expr1</i> - the expression to be evaluated if texpr is non-<code>nil</code><br>
+ <i>expr2</i> - the expression to be evaluated if texpr is <code>nil</code><br>
+ returns - the value of the selected expression<br>
+
+<br><dt> (when<a name="index816"> <i>texpr</i> <i>expr</i>...) - evaluate only when a condition is true
+<dd>
+ <i>texpr</i> - the test expression<br>
+ <i>expr</i> - the expression(s) to be evaluated if texpr is non-<code>nil</code><br>
+ returns - the value of the last expression or <code>nil</code>
+
+<br>
+<br><dt> (unless<a name="index817"> <i>texpr</i> <i>expr</i>...) - evaluate only when a condition is false
+<dd>
+ <i>texpr</i> - the test expression<br>
+ <i>expr</i> - the expression(s) to be evaluated if texpr is <code>nil</code><br>
+ returns - the value of the last expression or <code>nil</code><br>
+
+<br><dt> (case<a name="index818"> <i>expr</i> <i>case</i>...) - select by case
+<dd>
+ <i>expr</i> - the selection expression<br>
+ <i>case</i> - pair consisting of:<br>
+<dl><dd>
+ (<i>value</i> <i>expr</i>...)
+</dl>
+ where:
+<dl><dd>
+ <i>value</i> - is a single expression or a list of
+ expressions (unevaluated)<br>
+ <i>expr</i> - are expressions to execute if the
+ case matches
+</dl>
+ returns - the value of the last expression of the matching case<br>
+
+<br><dt>
+
+ (let<a name="index819"> (<i>binding</i>...) <i>expr</i>...) - create local bindings<br>
+ (let*<a name="index820"> (<i>binding</i>...) <i>expr</i>...) - let with sequential binding
+
+<dd>
+ <i>binding</i> - the variable bindings each of which is either:<br>
+<dl><dd>
+ 1) a symbol (which is initialized to <code>nil</code>)<br>
+ 2) a list whose car is a symbol and whose cadr
+ is an initialization expression
+</dl>
+ <i>expr</i> - the expressions to be evaluated<br>
+ returns - the value of the last expression<br>
+
+<br><dt>
+
+ (flet<a name="index821"> (<i>binding</i>...) <i>expr</i>...) - create local functions<br>
+ (labels<a name="index822"> (<i>binding</i>...) <i>expr</i>...) - flet with recursive functions<br>
+ (macrolet<a name="index823"> (<i>binding</i>...) <i>expr</i>...) - create local macros
+
+<dd>
+ <i>binding</i> - the function bindings each of which is:<br>
+<dl><dd>
+ (<i>sym</i> <i>fargs</i> <i>expr</i>...)
+</dl>
+ where:
+<dl><dd>
+ <i>sym</i> - the function/macro name<br>
+ <i>fargs</i> - formal argument list (lambda list)<br>
+ <i>expr</i> - expressions constituting the body of
+ the function/macro
+</dl>
+ <i>expr</i> - the expressions to be evaluated<br>
+ returns - the value of the last expression
+
+<br>
+<br><dt> (catch<a name="index824"> <i>sym</i> <i>expr</i>...) - evaluate expressions and catch throws
+<dd>
+ <i>sym</i> - the catch tag<br>
+ <i>expr</i> - expressions to evaluate<br>
+ returns - the value of the last expression the throw expression<br>
+
+<br><dt> (throw<a name="index825"> <i>sym</i> [<i>expr</i>]) - throw to a catch
+<dd>
+ <i>sym</i> - the catch tag<br>
+ <i>expr</i> - the value for the catch to return (defaults to <code>nil</code>)<br>
+ returns - never returns<br>
+
+<br><dt> (unwind-protect<a name="index826"> <i>expr</i> <i>cexpr</i>...) - protect evaluation of an expression
+<dd>
+ <i>expr</i> - the expression to protect<br>
+ <i>cexpr</i> - the cleanup expressions<br>
+ returns - the value of the expression<br>
+ Note: unwind-protect guarantees to execute the cleanup expressions
+ even if a non-local exit terminates the evaluation of the
+ protected expression
+
+<br>
+<br><dt>
+</dl>
+<p>
+<a name = "123"><h3>Looping Constructs</h3></a><a name="index827">
+<dl>
+<dt>
+ (loop<a name="index828"> <i>expr</i>...) - basic looping form
+<dd>
+ <i>expr</i> - the body of the loop<br>
+ returns - never returns (must use non-local exit)<br>
+
+<br><dt>
+
+ (do<a name="index829"> (<i>binding</i>...) (<i>texpr</i> <i>rexpr</i>...) <i>expr</i>...)<br>
+ (do*<a name="index830"> (<i>binding</i>...) (<i>texpr</i> <i>rexpr</i>...) <i>expr</i>...)
+
+<dd>
+ <i>binding</i> - the variable bindings each of which is either:<br>
+<dl><dd>
+ 1) a symbol (which is initialized to <code>nil</code>)<br>
+ 2) a list of the form: (<i>sym</i> <i>init</i> [<i>step</i>])
+ where:
+<dl><dd>
+ <i>sym</i> - is the symbol to bind<br>
+ <i>init</i> - is the initial value of the symbol<br>
+ <i>step</i> - is a step expression<br>
+</dl>
+</dl>
+ <i>texpr</i> - the termination test expression<br>
+ <i>rexpr</i> - result expressions (the default is <code>nil</code>)<br>
+ <i>expr</i> - the body of the loop (treated like an implicit prog)<br>
+ returns - the value of the last result expression<br>
+
+<br><dt> (dolist<a name="index831"> (<i>sym</i> <i>expr</i> [<i>rexpr</i>]) <i>expr</i>...) - loop through a list
+<dd>
+ <i>sym</i> - the symbol to bind to each list element<br>
+ <i>expr</i> - the list expression<br>
+ <i>rexpr</i> - the result expression (the default is <code>nil</code>)<br>
+ <i>expr</i> - the body of the loop (treated like an implicit prog)<br>
+
+<br><dt> (dotimes<a name="index832"> (<i>sym</i> <i>expr</i> [<i>rexpr</i>]) <i>expr</i>...) - loop from zero to n-1
+<dd>
+ <i>sym</i> - the symbol to bind to each value from 0 to n-1<br>
+ <i>expr</i> - the number of times to loop<br>
+ <i>rexpr</i> - the result expression (the default is <code>nil</code>)<br>
+ <i>expr</i> - the body of the loop (treated like an implicit prog)<br>
+
+<br><dt>
+</dl><a name = "124"><h3>The Program Feature</h3></a><a name="index833">
+<dl>
+<dt>
+
+(prog<a name="index834"> (<i>binding</i>...) <i>expr</i>...) - the program feature<br>
+(prog*<a name="index835"> (<i>binding</i>...) <i>expr</i>...) - prog with sequential binding
+
+<dd>
+ <i>binding</i> - the variable bindings each of which is either:<br>
+<dl><dd>
+ 1) a symbol (which is initialized to <code>nil</code>)<br>
+ 2) a list whose car is a symbol and whose cadr
+ is an initialization expression
+</dl>
+ <i>expr</i> - expressions to evaluate or tags (symbols)<br>
+ returns - <code>nil</code> or the argument passed to the return function<br>
+
+<br><dt> (block<a name="index836"> <i>name</i> <i>expr</i>...) - named block
+<dd>
+ <i>name</i> - the block name (symbol)<br>
+ <i>expr</i> - the block body<br>
+ returns - the value of the last expression<br>
+
+<br><dt> (return<a name="index837"> [<i>expr</i>]) - cause a prog construct to return a value
+<dd>
+ <i>expr</i> - the value (defaults to <code>nil</code>)<br>
+ returns - never returns<br>
+
+<br><dt> (return-from<a name="index838"> <i>name</i> [<i>value</i>]) - return from a named block
+<dd>
+ <i>name</i> - the block name (symbol)<br>
+ <i>value</i> - the value to return (defaults to <code>nil</code>)<br>
+ returns - never returns<br>
+
+<br><dt> (tagbody<a name="index839"> <i>expr</i>...) - block with labels
+<dd>
+ <i>expr</i> - expression(s) to evaluate or tags (symbols)<br>
+ returns - <code>nil</code><br>
+
+<br><dt> (go<a name="index840"> <i>sym</i>) - go to a tag within a tagbody or prog
+<dd>
+ <i>sym</i> - the tag (quoted)<br>
+ returns - never returns<br>
+
+<br><dt> (progv<a name="index841"> <i>slist</i> <i>vlist</i> <i>expr</i>...) - dynamically bind symbols
+<dd>
+ <i>slist</i> - list of symbols<br>
+ <i>vlist</i> - list of values to bind to the symbols<br>
+ <i>expr</i> - expression(s) to evaluate<br>
+ returns - the value of the last expression<br>
+
+<br><dt> (prog1<a name="index842"> <i>expr1</i> <i>expr</i>...) - execute expressions sequentially
+<dd>
+ <i>expr1</i> - the first expression to evaluate<br>
+ <i>expr</i> - the remaining expressions to evaluate<br>
+ returns - the value of the first expression<br>
+
+<br><dt> (prog2<a name="index843"> <i>expr1</i> <i>expr2</i> <i>expr</i>...) - execute expressions sequentially
+<dd>
+ <i>expr1</i> - the first expression to evaluate<br>
+ <i>expr2</i> - the second expression to evaluate<br>
+ <i>expr</i> - the remaining expressions to evaluate<br>
+ returns - the value of the second expression<br>
+
+<br><dt> (progn<a name="index844"> <i>expr</i>...) - execute expressions sequentially
+<dd>
+ <i>expr</i> - the expressions to evaluate<br>
+ returns - the value of the last expression (or <code>nil</code>)<br>
+
+<br><dt>
+</dl><a name = "125"><h3>Debugging and Error Handling</h3></a><a name="index845"><a name="index846">
+<dl>
+<dt>
+ (trace<a name="index847"> <i>sym</i>) - add a function to the trace list
+<dd>
+ <i>sym</i> - the function to add (quoted)<br>
+ returns - the trace list<br>
+
+<br><dt> (untrace<a name="index848"> <i>sym</i>) - remove a function from the trace list
+<dd>
+ <i>sym</i> - the function to remove (quoted)<br>
+ returns - the trace list<br>
+
+<br><dt> (error<a name="index849"> <i>emsg</i> [<i>arg</i>]) - signal a non-correctable error
+<dd>
+ <i>emsg</i> - the error message string<br>
+ <i>arg</i> - the argument expression (printed after the message)<br>
+ returns - never returns<br>
+
+<br><dt> (cerror<a name="index850"> <i>cmsg</i> <i>emsg</i> [<i>arg</i>]) - signal a correctable error
+<dd>
+ <i>cmsg</i> - the continue message string<br>
+ <i>emsg</i> - the error message string<br>
+ <i>arg</i> - the argument expression (printed after the message)<br>
+ returns - <code>nil</code> when continued from the break loop<br>
+
+<br><dt> (break<a name="index851"> [<i>bmsg</i> [<i>arg</i>]]) - enter a break loop
+<dd>
+ <i>bmsg</i> - the break message string (defaults to <code>**break**</code>)<br>
+ <i>arg</i> - the argument expression (printed after the message)<br>
+ returns - <code>nil</code> when continued from the break loop<br>
+
+<br><dt> (clean-up<a name="index852">) - clean-up after an error
+<dd>
+ returns - never returns<br>
+
+<br><dt> (top-level<a name="index853">) - clean-up after an error and return to the top level
+<dd>
+ returns - never returns<br>
+
+<br><dt> (continue<a name="index854">) - continue from a correctable error
+<dd>
+ returns - never returns<br>
+
+<br><dt> (errset<a name="index855"> <i>expr</i> [<i>pflag</i>]) - trap errors
+<dd>
+ <i>expr</i> - the expression to execute<br>
+ <i>pflag</i> - flag to control printing of the error message<br>
+ returns - the value of the last expression consed with <code>nil</code><br>
+ or <code>nil</code> on error
+
+<br>
+<br><dt> (baktrace<a name="index856"><a name="index857"><a name="index858"> [<i>n</i>]) - print n levels of trace back information
+<dd>
+ <i>n</i> - the number of levels (defaults to all levels)<br>
+ returns - <code>nil</code><br>
+
+<br><dt> (evalhook<a name="index859"> <i>expr</i> <i>ehook</i> <i>ahook</i> [<i>env</i>]) - evaluate with hooks
+<dd>
+ <i>expr</i> - the expression to evaluate<br>
+ <i>ehook</i> - the value for <code>*evalhook*</code><br>
+ <i>ahook</i> - the value for <code>*applyhook*</code><br>
+ <i>env</i> - the environment (default is <code>nil</code>)<br>
+ returns - the result of evaluating the expression<br>
+
+<br><dt> (profile<a name="index860"> <i>flag</i>) <a href = "foot.html#foot3">(Footnote 3)</a> - turn profiling on or off.
+<dd>
+ <i>flag</i> - <code>nil</code> turns profiling off, otherwise on<br>
+ returns - the previous state of profiling.<br>
+
+<br><dt>
+</dl><a name = "126"><h3>Arithmetic Functions</h3></a><a name="index861">
+<dl>
+<dt>
+ (truncate<a name="index862"> <i>expr</i>) - truncates a floating point number to an integer
+<dd>
+ <i>expr</i> - the number<br>
+ returns - the result of truncating the number<br>
+
+<br><dt> (float<a name="index863"> <i>expr</i>) - converts an integer to a floating point number
+<dd>
+ <i>expr</i> - the number<br>
+ returns - the result of floating the integer<br>
+
+<br><dt> (+<a name="index864"> <i>expr</i>...) - add a list of numbers
+<dd>
+ <i>expr</i> - the numbers<br>
+ returns - the result of the addition<br>
+
+<br><dt> (-<a name="index865"> <i>expr</i>...) - subtract a list of numbers or negate a single number
+<dd>
+ <i>expr</i> - the numbers<br>
+ returns - the result of the subtraction<br>
+
+<br><dt> (*<a name="index866"> <i>expr</i>...) - multiply a list of numbers
+<dd>
+ <i>expr</i> - the numbers<br>
+ returns - the result of the multiplication<br>
+
+<br><dt> (/<a name="index867"> <i>expr</i>...) - divide a list of numbers
+<dd>
+ <i>expr</i> - the numbers<br>
+ returns - the result of the division<br>
+
+<br><dt> (1+<a name="index868"> <i>expr</i>) - add one to a number
+<dd>
+ <i>expr</i> - the number<br>
+ returns - the number plus one<br>
+
+<br><dt> (1-<a name="index869"> <i>expr</i>) - subtract one from a number
+<dd>
+ <i>expr</i> - the number<br>
+ returns - the number minus one<br>
+
+<br><dt> (rem<a name="index870"><a name="index871"><a name="index872"> <i>expr</i>...) - remainder of a list of numbers
+<dd>
+ <i>expr</i> - the numbers<br>
+ returns - the result of the remainder operation<br>
+
+<br><dt> (min<a name="index873"><a name="index874"> <i>expr</i>...) - the smallest of a list of numbers
+<dd>
+ <i>expr</i> - the expressions to be checked<br>
+ returns - the smallest number in the list<br>
+
+<br><dt> (max<a name="index875"><a name="index876"> <i>expr</i>...) - the largest of a list of numbers
+<dd>
+ <i>expr</i> - the expressions to be checked<br>
+ returns - the largest number in the list<br>
+
+<br><dt> (abs<a name="index877"> <i>expr</i>) - the absolute value of a number
+<dd>
+ <i>expr</i> - the number<br>
+ returns - the absolute value of the number<br>
+
+<br><dt> (gcd<a name="index878"> <i>n1</i> <i>n2</i>...) - compute the greatest common divisor
+<dd>
+ <i>n1</i> - the first number (integer)<br>
+ <i>n2</i> - the second number(s) (integer)<br>
+ returns - the greatest common divisor<br>
+
+<br><dt> (random<a name="index879"> <i>n</i>) - compute a random number between 1 and n-1
+<dd>
+ <i>n</i> - the upper bound (integer)<br>
+ returns - a random number<br>
+
+<br><dt> (sin<a name="index880"> <i>expr</i>) - compute the sine of a number
+<dd>
+ <i>expr</i> - the floating point number<br>
+ returns - the sine of the number<br>
+
+<br><dt> (cos<a name="index881"> <i>expr</i>) - compute the cosine of a number
+<dd>
+ <i>expr</i> - the floating point number<br>
+ returns - the cosine of the number<br>
+
+<br><dt> (tan<a name="index882"> <i>expr</i>) - compute the tangent of a number
+<dd>
+ <i>expr</i> - the floating point number<br>
+ returns - the tangent of the number<br>
+
+<br><dt> (expt<a name="index883"> <i>x-expr</i> <i>y-expr</i>) - compute x to the y power
+<dd>
+ <i>x-expr</i> - the floating point number<br>
+ <i>y-expr</i> - the floating point exponent<br>
+ returns - x to the y power<br>
+
+<br><dt> (exp<a name="index884"> <i>x-expr</i>) - compute e to the x power
+<dd>
+ <i>x-expr</i> - the floating point number<br>
+ returns - e to the x power<br>
+
+<br><dt> (sqrt<a name="index885"> <i>expr</i>) - compute the square root of a number
+<dd>
+ <i>expr</i> - the floating point number<br>
+ returns - the square root of the number<br>
+
+<br><dt>
+
+(&lt<a name="index886"> <i>n1</i> <i>n2</i>...) - test for less than<br>
+(&lt=<a name="index887"> <i>n1</i> <i>n2</i>...) - test for less than or equal to<br>
+(=<a name="index888"> <i>n1</i> <i>n2</i>...) - test for equal to<br>
+(/=<a name="index889"> <i>n1</i> <i>n2</i>...) - test for not equal to<br>
+(&gt=<a name="index890"> <i>n1</i> <i>n2</i>...) - test for greater than or equal to<br>
+(&gt<a name="index891"> <i>n1</i> <i>n2</i>...) - test for greater than
+
+<dd>
+ <i>n1</i> - the first number to compare<br>
+ <i>n2</i> - the second number to compare<br>
+returns - <code>t</code> if the results of comparing <i>n1</i> with <i>n2</i>,
+<i>n2</i> with <i>n3</i>, etc., are all true.<br>
+
+<br><dt>
+</dl><a name = "127"><h3>Bitwise Logical Functions</h3></a><a name="index892">
+<dl>
+<dt>
+ (logand<a name="index893"> <i>expr</i>...) - the bitwise and of a list of numbers
+<dd>
+ <i>expr</i> - the numbers<br>
+ returns - the result of the and operation<br>
+
+<br><dt> (logior<a name="index894"> <i>expr</i>...) - the bitwise inclusive or of a list of numbers
+<dd>
+ <i>expr</i> - the numbers<br>
+ returns - the result of the inclusive or operation<br>
+
+<br><dt> (logxor<a name="index895"> <i>expr</i>...) - the bitwise exclusive or of a list of numbers
+<dd>
+ <i>expr</i> - the numbers<br>
+ returns - the result of the exclusive or operation<br>
+
+<br><dt> (lognot<a name="index896"> <i>expr</i>) - the bitwise not of a number
+<dd>
+ <i>expr</i> - the number<br>
+ returns - the bitwise inversion of number<br>
+
+<br><dt>
+</dl><a name = "128"><h3>String Functions</h3></a><a name="index897">
+<dl>
+<dt>
+ (string<a name="index898"> <i>expr</i>) - make a string from an integer ascii value
+<dd>
+ <i>expr</i> - the integer<br>
+ returns - a one character string<br>
+
+<br><dt> (string-search<a name="index899"> <i>pat</i> <i>str</i> &amp;key :start :end) <a href = "foot.html#foot4">(Footnote 4)</a> - search for pattern in string
+<dd>
+ <i>pat</i> - a string to search for<br>
+ <i>str</i> - the string to be searched<br>
+ :start - the starting offset in str<br>
+ :end - the ending offset + 1<br>
+ returns - index of pat in str or NIL if not found<br>
+
+<br><dt> (string-trim<a name="index900"> <i>bag</i> <i>str</i>) - trim both ends of a string
+<dd>
+ <i>bag</i> - a string containing characters to trim<br>
+ <i>str</i> - the string to trim<br>
+ returns - a trimed copy of the string<br>
+
+<br><dt> (string-left-trim<a name="index901"> <i>bag</i> <i>str</i>) - trim the left end of a string
+<dd>
+ <i>bag</i> - a string containing characters to trim<br>
+ <i>str</i> - the string to trim<br>
+ returns - a trimed copy of the string<br>
+
+<br><dt> (string-right-trim<a name="index902"> <i>bag</i> <i>str</i>) - trim the right end of a string
+<dd>
+ <i>bag</i> - a string containing characters to trim<br>
+ <i>str</i> - the string to trim<br>
+ returns - a trimed copy of the string<br>
+
+<br><dt> (string-upcase<a name="index903"> <i>str</i> &amp;key :start :end) - convert to uppercase
+<dd>
+ <i>str</i> - the string<br>
+ :start - the starting offset<br>
+ :end - the ending offset + 1<br>
+ returns - a converted copy of the string<br>
+
+<br><dt> (string-downcase<a name="index904"> <i>str</i> &amp;key :start :end) - convert to lowercase
+<dd>
+ <i>str</i> - the string<br>
+ :start - the starting offset<br>
+ :end - the ending offset + 1<br>
+ returns - a converted copy of the string<br>
+
+<br><dt> (nstring-upcase<a name="index905"> <i>str</i> &amp;key :start :end) - convert to uppercase
+<dd>
+ <i>str</i> - the string<br>
+ :start - the starting offset<br>
+ :end - the ending offset + 1<br>
+ returns - the converted string (not a copy)<br>
+
+<br><dt> (nstring-downcase<a name="index906"> <i>str</i> &amp;key :start :end) - convert to lowercase
+<dd>
+ <i>str</i> - the string<br>
+ :start - the starting offset<br>
+ :end - the ending offset + 1<br>
+ returns - the converted string (not a copy)<br>
+
+<br><dt> (strcat<a name="index907"><a name="index908"> <i>expr</i>...) - concatenate strings
+<dd>
+ <i>expr</i> - the strings to concatenate<br>
+ returns - the result of concatenating the strings<br>
+
+<br><dt> (subseq<a name="index909"> <i>string</i> <i>start</i> [<i>end</i>]) - extract a substring
+<dd>
+ <i>string</i> - the string<br>
+ <i>start</i> - the starting position (zero origin)<br>
+ <i>end</i> - the ending position + 1 (defaults to end)<br>
+ returns - substring between <i>start</i> and <i>end</i><br>
+
+<br><dt>
+
+ (string&lt<a name="index910"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)<br>
+ (string&lt=<a name="index911"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)<br>
+ (string=<a name="index912"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)<br>
+ (string/=<a name="index913"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)<br>
+ (string&gt=<a name="index914"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)<br>
+ (string&gt<a name="index915"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)
+
+<dd>
+ <i>str1</i> - the first string to compare<br>
+ <i>str2</i> - the second string to compare<br>
+ :start1 - first substring starting offset<br>
+ :end1 - first substring ending offset + 1<br>
+ :start2 - second substring starting offset<br>
+ :end2 - second substring ending offset + 1<br>
+ returns - <code>t</code> if predicate is true, <code>nil</code> otherwise<br>
+ Note: case is significant with these comparison functions.
+
+<br>
+<br><dt>
+
+(string-lessp<a name="index916"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)<br>
+(string-not-greaterp<a name="index917"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)<br>
+(string-equalp<a name="index918"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)<br>
+(string-not-equalp<a name="index919"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)<br>
+(string-not-lessp<a name="index920"> <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)<br>
+(string-greaterp <i>str1</i> <i>str2</i> &amp;key :start1 :end1 :start2 :end2)
+
+<dd>
+ <i>str1</i> - the first string to compare<br>
+ <i>str2</i> - the second string to compare<br>
+ :start1 - first substring starting offset<br>
+ :end1 - first substring ending offset + 1<br>
+ :start2 - second substring starting offset<br>
+ :end2 - second substring ending offset + 1<br>
+ returns - <code>t</code> if predicate is true, <code>nil</code> otherwise<br>
+ Note: case is not significant with these comparison functions.
+
+<br>
+<br><dt>
+</dl>
+<p>
+<a name = "129"><h3>Character Functions</h3></a><a name="index921">
+<dl>
+<dt>
+ (char<a name="index922"> <i>string</i> <i>index</i>) - extract a character from a string
+<dd>
+ <i>string</i> - the string<br>
+ <i>index</i> - the string index (zero relative)<br>
+ returns - the ascii code of the character<br>
+
+<br><dt> (upper-case-p<a name="index923"> <i>chr</i>) - is this an upper case character?
+<dd>
+ <i>chr</i> - the character<br>
+ returns - <code>t</code> if the character is upper case, <code>nil</code> otherwise<br>
+
+<br><dt> (lower-case-p<a name="index924"> <i>chr</i>) - is this a lower case character?
+<dd>
+ <i>chr</i> - the character<br>
+ returns - <code>t</code> if the character is lower case, <code>nil</code> otherwise<br>
+
+<br><dt> (both-case-p<a name="index925"> <i>chr</i>) - is this an alphabetic (either case) character?
+<dd>
+ <i>chr</i> - the character<br>
+ returns - <code>t</code> if the character is alphabetic, <code>nil</code> otherwise<br>
+
+<br><dt> (digit-char-p<a name="index926"> <i>chr</i>) - is this a digit character?
+<dd>
+ <i>chr</i> - the character<br>
+ returns - the digit weight if character is a digit, <code>nil</code> otherwise<br>
+
+<br><dt> (char-code<a name="index927"> <i>chr</i>) - get the ascii code of a character
+<dd>
+ <i>chr</i> - the character<br>
+ returns - the ascii character code (integer)<br>
+
+<br><dt> (code-char<a name="index928"> <i>code</i>) - get the character with a specified ascii code
+<dd>
+ <i>code</i> - the ascii code (integer)<br>
+ returns - the character with that code or <code>nil</code><br>
+
+<br><dt> (char-upcase<a name="index929"> <i>chr</i>) - convert a character to upper case
+<dd>
+ <i>chr</i> - the character<br>
+ returns - the upper case character<br>
+
+<br><dt> (char-downcase<a name="index930"> <i>chr</i>) - convert a character to lower case
+<dd>
+ <i>chr</i> - the character<br>
+ returns - the lower case character<br>
+
+<br><dt> (digit-char<a name="index931"> <i>n</i>) - convert a digit weight to a digit
+<dd>
+ <i>n</i> - the digit weight (integer)<br>
+ returns - the digit character or <code>nil</code><br>
+
+<br><dt> (char-int<a name="index932"> <i>chr</i>) - convert a character to an integer
+<dd>
+ <i>chr</i> - the character<br>
+ returns - the ascii character code<br>
+
+<br><dt> (int-char<a name="index933"> <i>int</i>) - convert an integer to a character
+<dd>
+ <i>int</i> - the ascii character code<br>
+ returns - the character with that code<br>
+
+<br><dt>
+
+ (char&lt<a name="index934"> <i>chr1</i> <i>chr2</i>...)<br>
+ (char&lt=<a name="index935"> <i>chr1</i> <i>chr2</i>...)<br>
+ (char=<a name="index936"> <i>chr1</i> <i>chr2</i>...)<br>
+ (char/=<a name="index937"> <i>chr1</i> <i>chr2</i>...)<br>
+ (char&gt=<a name="index938"> <i>chr1</i> <i>chr2</i>...)<br>
+ (char&gt<a name="index939"> <i>chr1</i> <i>chr2</i>...)
+
+<dd>
+ <i>chr1</i> - the first character to compare<br>
+ <i>chr2</i> - the second character(s) to compare<br>
+ returns - <code>t</code> if predicate is true, <code>nil</code> otherwise<br>
+ Note: case is significant with these comparison functions.
+
+<br>
+<br><dt>
+
+(char-lessp<a name="index940"> <i>chr1</i> <i>chr2</i>...)<br>
+(char-not-greaterp<a name="index941"> <i>chr1</i> <i>chr2</i>...)<br>
+(char-equalp<a name="index942"> <i>chr1</i> <i>chr2</i>...)<br>
+(char-not-equalp<a name="index943"> <i>chr1</i> <i>chr2</i>...)<br>
+(char-not-lessp<a name="index944"> <i>chr1</i> <i>chr2</i>...)<br>
+(char-greaterp<a name="index945"> <i>chr1</i> <i>chr2</i>...)
+
+<dd>
+<i>chr1</i> - the first string to compare<br>
+<i>chr2</i> - the second string(s) to compare<br>
+returns - <code>t</code> if predicate is true, <code>nil</code> otherwise<br>
+
+<br><dt>
+ Note: case is not significant with these comparison functions.
+</dl>
+<p>
+<a name = "130"><h3>Input/Output Functions</h3></a><a name="index946">
+<dl>
+<dt>
+ (read<a name="index947"> [<i>stream</i> [<i>eof</i> [<i>rflag</i>]]]) - read an expression
+<dd>
+ <i>stream</i> - the input stream (default is standard input)<br>
+ <i>eof</i> - the value to return on end of file (default is <code>nil</code>)<br>
+ <i>rflag</i> - recursive read flag (default is <code>nil</code>)<br>
+ returns - the expression read<br>
+
+<br><dt> (print<a name="index948"> <i>expr</i> [<i>stream</i>]) - print an expression on a new line
+<dd>
+ <i>expr</i> - the expression to be printed<br>
+ <i>stream</i> - the output stream (default is standard output)<br>
+ returns - the expression<br>
+
+<br><dt> (prin1<a name="index949"> <i>expr</i> [<i>stream</i>]) - print an expression
+<dd>
+ <i>expr</i> - the expression to be printed<br>
+ <i>stream</i> - the output stream (default is standard output)<br>
+ returns - the expression<br>
+
+<br><dt> (princ<a name="index950"> <i>expr</i> [<i>stream</i>]) - print an expression without quoting
+<dd>
+ <i>expr</i> - the expressions to be printed<br>
+ <i>stream</i> - the output stream (default is standard output)<br>
+ returns - the expression<br>
+
+<br><dt> (pprint<a name="index951"> <i>expr</i> [<i>stream</i>]) - pretty print an expression
+<dd>
+ <i>expr</i> - the expressions to be printed<br>
+ <i>stream</i> - the output stream (default is standard output)<br>
+ returns - the expression<br>
+
+<br><dt> (terpri<a name="index952"> [<i>stream</i>]) - terminate the current print line
+<dd>
+ <i>stream</i> - the output stream (default is standard output)<br>
+ returns - <code>nil</code><br>
+
+<br><dt> (flatsize<a name="index953"> <i>expr</i>) - length of printed representation using prin1
+<dd>
+ <i>expr</i> - the expression<br>
+ returns - the length<br>
+
+<br><dt> (flatc<a name="index954"> <i>expr</i>) - length of printed representation using princ
+<dd>
+ <i>expr</i> - the expression<br>
+ returns - the length<br>
+
+<br><dt>
+</dl><a name = "131"><h3>The Format Function</h3></a><a name="index955">
+<dl>
+<dt>
+(format<a name="index956"> <i>stream</i> <i>fmt</i> <i>arg</i>...) - do formated
+output
+<dd>
+ <i>stream</i> - the output stream<br>
+ <i>fmt</i> - the format string<br>
+ <i>arg</i> - the format arguments<br>
+ returns - output string if <i>stream</i> is <code>nil</code>, <code>nil</code> otherwise<br>
+
+<br><dt>
+</dl>
+ The format string can contain characters that should be copied
+ directly to the output and formatting directives. The
+ formatting directives are:
+<blockquote>
+~A - print next argument using princ<br>
+
+~S - print next argument using prin1<br>
+
+~% - start a new line<br>
+
+~~ - print a tilde character<br>
+
+</blockquote>
+<p>
+<a name = "132"><h3>File I/O Functions</h3></a><a name="index957">
+Note that files are ordinarily opened as text. Binary files (such as standard midi files) must be opened with <code>open-binary</code> on non-unix systems.
+<dl>
+<dt>
+ (open<a name="index958"> <i>fname</i> &amp;key :direction) - open a file stream
+<dd>
+ <i>fname</i> - the file name string or symbol<br>
+ :direction - :input or :output (default is :input)<br>
+ returns - a stream<br>
+
+<br><dt>
+ (open-binary<a name="index959"><a name="index960"> <i>fname</i> &amp;key :direction) - open a binary file stream
+<dd>
+ <i>fname</i> - the file name string or symbol<br>
+ :direction - :input or :output (default is :input)<br>
+ returns - a stream<br>
+
+<br><dt> (close<a name="index961"> <i>stream</i>) - close a file stream
+<dd>
+ <i>stream</i> - the stream<br>
+ returns - <code>nil</code><br>
+
+<br><dt> (read-char<a name="index962"> [<i>stream</i>]) - read a character from a stream
+<dd>
+ <i>stream</i> - the input stream (default is standard input)<br>
+ returns - the character<br>
+
+<br><dt> (peek-char<a name="index963"> [<i>flag</i> [<i>stream</i>]]) - peek at the next character
+<dd>
+ <i>flag</i> - flag for skipping white space (default is <code>nil</code>)<br>
+ <i>stream</i> - the input stream (default is standard input)<br>
+ returns - the character (integer)<br>
+
+<br><dt> (write-char<a name="index964"> <i>ch</i> [<i>stream</i>]) - write a character to a stream
+<dd>
+ <i>ch</i> - the character to write<br>
+ <i>stream</i> - the output stream (default is standard output)<br>
+ returns - the character<br>
+
+<br><dt> (read-int<a name="index965"> [<i>stream</i> [<i>length</i>]]) - read a binary integer from a stream
+<dd>
+ <i>stream</i> - the input stream (default is standard input)<br>
+ <i>length</i> - the length of the integer in bytes (default is 4)<br>
+ returns - the integer<br>
+Note: Integers are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To read little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.<br>
+
+<br><dt> (write-int<a name="index966"> <i>ch</i> [<i>stream</i> [<i>length</i>]]) - write a binary integer to a stream
+<dd>
+ <i>ch</i> - the character to write<br>
+ <i>stream</i> - the output stream (default is standard output)<br>
+ <i>length</i> - the length of the integer in bytes (default is 4)<br>
+ returns - the integer<br>
+Note: Integers are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To write in little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.<br>
+
+<br><dt> (read-float<a name="index967"> [<i>stream</i> [<i>length</i>]]) - read a binary floating-point number from a stream
+<dd>
+ <i>stream</i> - the input stream (default is standard input)<br>
+ <i>length</i> - the length of the float in bytes (default is 4, legal values are -4, -8, 4, and 8)<br>
+ returns - the integer<br>
+Note: Floats are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To read little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.<br>
+
+<br><dt> (write-float<a name="index968"> <i>ch</i> [<i>stream</i> [<i>length</i>]]) - write a binary floating-point number to a stream
+<dd>
+ <i>ch</i> - the character to write<br>
+ <i>stream</i> - the output stream (default is standard output)<br>
+ <i>length</i> - the length of the float in bytes (default is 4, legal values are -4, -8, 4, and 8)<br>
+ returns - the integer<br>
+Note: Floats are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To write in little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.<br>
+
+<br><dt> (read-line<a name="index969"> [<i>stream</i>]) - read a line from a stream
+<dd>
+ <i>stream</i> - the input stream (default is standard input)<br>
+ returns - the string<br>
+
+<br><dt> (read-byte<a name="index970"> [<i>stream</i>]) - read a byte from a stream
+<dd>
+ <i>stream</i> - the input stream (default is standard input)<br>
+ returns - the byte (integer)<br>
+
+<br><dt> (write-byte<a name="index971"> <i>byte</i> [<i>stream</i>]) - write a byte to a stream
+<dd>
+ <i>byte</i> - the byte to write (integer)<br>
+ <i>stream</i> - the output stream (default is standard output)<br>
+ returns - the byte (integer)<br>
+
+<br><dt>
+</dl><a name = "133"><h3>String Stream Functions</h3></a><a name="index972">
+ These functions operate on unnamed streams. An unnamed output
+ stream collects characters sent to it when it is used as the
+ destination of any output function. The functions
+<code>get-output-stream-string</code> and string or a list of characters.
+<p>
+An unnamed input stream is setup with the
+ <code>make-string-input-stream</code> function and returns each character of the string when
+ it is used as the source of any input function.
+<p>
+<dl>
+<dt>
+<br><dt>
+ (make-string-input-stream<a name="index973"> <i>str</i> [<i>start</i> [<i>end</i>]])
+<dd>
+ <i>str</i> - the string<br>
+ <i>start</i> - the starting offset<br>
+ <i>end</i> - the ending offset + 1<br>
+ returns - an unnamed stream that reads from the string<br>
+
+<br><dt> (make-string-output-stream)<a name="index974">
+<dd>
+ returns - an unnamed output stream<br>
+
+<br><dt> (get-output-stream-string<a name="index975"> <i>stream</i>)
+<dd>
+ <i>stream</i> - the output stream<br>
+ returns - the output so far as a string<br>
+
+ Note: the output stream is emptied by this function
+<br>
+<br><dt> (get-output-stream-list<a name="index976"> <i>stream</i>)
+<dd>
+ <i>stream</i> - the output stream<br>
+ returns - the output so far as a list<br>
+
+ Note: the output stream is emptied by this function
+<br>
+<br><dt>
+</dl>
+<p>
+<a name = "134"><h3>System Functions</h3></a><a name="index977">
+Note: the <code>load</code> function first tries to load a file from the current directory. A <code>.lsp</code> extension is added if there is not already an alphanumeric extension following a period. If that fails, XLisp searches the path, which is obtained from the XLISPPATH environment variable in Unix and HKEY_LOCAL_MACHINE\SOFTWARE\CMU\Nyquist\XLISPPATH under Win32. (The Macintosh version has no search path.)
+<p>
+<dl>
+<dt>
+ (load<a name="index978"> <i>fname</i> &amp;key :verbose :print) - load a source file
+<dd>
+ <i>fname</i> - the filename string or symbol<br>
+ :verbose - the verbose flag (default is t)<br>
+ :print - the print flag (default is <code>nil</code>)<br>
+ returns - the filename<br>
+
+<br><dt> (save<a name="index979"> <i>fname</i>) - save workspace to a file
+<dd>
+ <i>fname</i> - the filename string or symbol<br>
+ returns - <code>t</code> if workspace was written, <code>nil</code> otherwise<br>
+
+<br><dt> (restore<a name="index980"> <i>fname</i>) - restore workspace from a file
+<dd>
+ <i>fname</i> - the filename string or symbol<br>
+ returns - <code>nil</code> on failure, otherwise never returns<br>
+
+<br><dt> (dribble<a name="index981"> [<i>fname</i>]) - create a file with a transcript of a session
+<dd>
+ <i>fname</i> - file name string or symbol
+ (if missing, close current transcript)<br>
+ returns - <code>t</code> if the transcript is opened, <code>nil</code> if it is closed<br>
+
+<br><dt> (gc<a name="index982">) - force garbage collection
+<dd>
+ returns - <code>nil</code><br>
+
+<br><dt> (expand<a name="index983"> <i>num</i>) - expand memory by adding segments
+<dd>
+ <i>num</i> - the number of segments to add<br>
+ returns - the number of segments added<br>
+
+<br><dt> (alloc<a name="index984"> <i>num</i>) - change number of nodes to allocate in each segment
+<dd>
+ <i>num</i> - the number of nodes to allocate<br>
+ returns - the old number of nodes to allocate<br>
+
+<br><dt> (room<a name="index985">) - show memory allocation statistics
+<dd>
+ returns - <code>nil</code><br>
+
+<br><dt> (type-of<a name="index986"> <i>expr</i>) - returns the type of the expression
+<dd>
+ <i>expr</i> - the expression to return the type of<br>
+ returns - <code>nil</code> if the value is <code>nil</code> otherwise one of the symbols:<br>
+<dl><dd>
+ SYMBOL - for symbols<br>
+ OBJECT - for objects<br>
+ CONS - for conses<br>
+ SUBR - for built-in functions<br>
+ FSUBR - for special forms<br>
+ CLOSURE - for defined functions<br>
+ STRING - for strings<br>
+ FIXNUM - for integers<br>
+ FLONUM - for floating point numbers<br>
+ CHARACTER - for characters<br>
+ FILE-STREAM - for file pointers<br>
+ UNNAMED-STREAM - for unnamed streams<br>
+ ARRAY - for arrays<br>
+</dl>
+
+<br><dt> (peek<a name="index987"> <i>addrs</i>) - peek at a location in memory
+<dd>
+ <i>addrs</i> - the address to peek at (integer)<br>
+ returns - the value at the specified address (integer)<br>
+
+<br><dt> (poke<a name="index988"> <i>addrs</i> <i>value</i>) - poke a value into memory
+<dd>
+ <i>addrs</i> - the address to poke (integer)<br>
+ <i>value</i> - the value to poke into the address (integer)<br>
+ returns - the value<br>
+
+<br><dt> (address-of<a name="index989"> <i>expr</i>) - get the address of an xlisp node
+<dd>
+ <i>expr</i> - the node<br>
+ returns - the address of the node (integer)<br>
+
+<br><dt> (exit<a name="index990">) - exit xlisp
+<dd>
+ returns - never returns<br>
+
+<br><dt> (setup-console<a name="index991"><a name="index992">) - set default console attributes
+<dd>
+ returns - NIL<br>
+Note: Under Windows, Nyquist normally starts up in a medium-sized console window with black text and a white background, with a window title of ``Nyquist.'' This is normally accomplished by calling <code>setup-console</code> in <code>system.lsp</code>. In Nyquist, you can avoid this behavior by setting <code>*setup-console*</code> to NIL in your <code>init.lsp</code> file. If <code>setup-console</code> is not called, Nyquist uses standard input and output as is. This is what you want if you are running Nyquist inside of emacs, for example.<a name="index993"><br>
+
+</dl><a name = "135"><h3>File I/O Functions</h3></a><a name="index994"><a name = "136"><h4>Input from a File</h4></a><a name="index995">To open a file for input, use the <code>open</code> function with the keyword
+argument <code>:direction</code> set to <code>:input</code>. To open a file for output,
+use the <code>open</code> function with the keyword argument <code>:direction</code> set
+to <code>:output</code>. The <code>open</code> function takes a single required argument which
+is the name of the file to be opened. This name can be in the form of a
+string or a symbol. The <code>open</code> function returns an object of type
+<code>FILE-STREAM</code> if it succeeds in opening the specified file. It returns the
+value <code>nil</code> if it fails. In order to manipulate the file, it is
+necessary to save the value returned by the <code>open</code> function. This is
+usually done by assigning it to a variable with the <code>setq</code> special form or by
+binding it using <code>let</code> or <code>let*</code>. Here is an example:
+<pre>
+(setq fp (open "init.lsp" :direction :input))
+</pre>
+
+ Evaluating this expression will result in the file <code>init.lsp</code>
+ being opened. The file object that will be returned by the <code>open</code>
+ function will be assigned to the variable <code>fp</code>.
+<p>
+ It is now possible to use the file for input. To read an
+ expression from the file, just supply the value of the <code>fp</code>
+ variable as the optional <i>stream</i> argument to <code>read</code>.
+<pre>
+(read fp)
+</pre>
+
+ Evaluating this expression will result in reading the first
+ expression from the file <code>init.lsp</code>. The expression will be
+ returned as the result of the <code>read</code> function. More expressions
+ can be read from the file using further calls to the <code>read</code>
+ function. When there are no more expressions to read, the <code>read</code>
+ function will return <code>nil</code> (or whatever value was supplied as the
+ second argument to <code>read</code>).
+<p>
+ Once you are done reading from the file, you should close it.
+ To close the file, use the following expression:
+<pre>
+(close fp)
+</pre>
+
+ Evaluating this expression will cause the file to be closed.
+<p>
+<a name = "137"><h4>Output to a File</h4></a><a name="index996"> Writing to a file is pretty much the same as reading from one.
+ You need to open the file first. This time you should use the
+ <code>open</code> function to indicate that you will do output to the file.
+ For example:
+<pre>
+(setq fp (open "test.dat" :direction :output))
+</pre>
+
+ Evaluating this expression will open the file <code>test.dat</code> for
+ output. If the file already exists, its current contents will
+ be discarded. If it doesn't already exist, it will be created.
+ In any case, a <code>FILE-STREAM</code> object will be returned by the <code>OPEN</code>
+ function. This file object will be assigned to the <code>fp</code>
+ variable.
+<p>
+ It is now possible to write to this file by supplying the value
+ of the <code>fp</code> variable as the optional <i>stream</i> parameter in the <code>print</code> function.
+<pre>
+(print "Hello there" fp)
+</pre>
+
+ Evaluating this expression will result in the string ``Hello
+ there'' being written to the file <code>test.dat</code>. More data can be
+ written to the file using the same technique.
+<p>
+ Once you are done writing to the file, you should close it.
+ Closing an output file is just like closing an input file.
+<pre>
+(close fp)
+</pre>
+
+ Evaluating this expression will close the output file and make
+ it permanent.
+<p>
+<a name = "138"><h4>A Slightly More Complicated File Example</h4></a> This example shows how to open a file, read each Lisp expression
+ from the file and print it. It demonstrates the use of files
+ and the use of the optional <i>stream</i> argument to the <code>read</code>
+ function.
+<pre>
+(do* ((fp (open "test.dat" :direction :input))
+ (ex (read fp) (read fp)))
+ ((null ex) nil)
+ (print ex))
+</pre>
+
+<p>
+
+<hr>
+<a href = "part14.html">Previous Section</a> | <a href = "indx.html">Next Section (Index)</a> | <a href = "home.html#toc">Table of Contents</a> | <a href = "home.html">Title Page</a>
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/manual/sal.htm b/docsrc/xlisp/xlisp-doc/manual/sal.htm
new file mode 100644
index 0000000..c3eeb30
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/manual/sal.htm
@@ -0,0 +1,160 @@
+<html><head>
+
+<title>SAL</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="xlisp-man-index.htm">XLISP</a>
+
+<hr>
+
+<h1>SAL</h1>
+
+<hr>
+
+<h2>Data Types</h2>
+
+<hr>
+
+<p>Data types used in SAL and XLISP:</p>
+
+<p><table cellpadding="0" cellspacing="2"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td colspan="2"></td>
+ <td align="center" colspan="2">SAL</td>
+ <td align="center" colspan="2">XLISP</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr>integer:</nobr></td>
+ <td><nobr>&nbsp;</nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code>1</code></nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code>1</code></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr>float:</nobr></td>
+ <td><nobr>&nbsp;</nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code>1.0</code></nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code>1.0</code></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr>string:</nobr></td>
+ <td><nobr>&nbsp;</nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code>"hello"</code></nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code>"hello"</code></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr>symbol:</nobr></td>
+ <td><nobr>&nbsp;</nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code><font color="#0000CC">name</font></code></nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code><font color="#0000CC">name</font></code></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr>keyword:</nobr></td>
+ <td><nobr>&nbsp;</nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code><font color="#0000CC">symbol</font>:</code></nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code>:<font color="#0000CC">symbol</font></code></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr>list:</nobr></td>
+ <td><nobr>&nbsp;</nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code>{<font color="#0000CC">item-1 item-2</font> ...}</code></nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code>(<font color="#0000CC">item-1 item-2</font> ...)</code></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr>array:</nobr></td>
+ <td><nobr>&nbsp;</nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code><font color="#0000CC">array</font>[<font color="#0000CC">index</font>]</code></nobr></td>
+ <td align="center" class="button" colspan="2"><nobr><code>(aref <font color="#0000CC">array index</font>)</code></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr>boolean:</nobr></td>
+ <td><nobr>&nbsp;</nobr></td>
+ <td align="center" class="button"><nobr><code><font color="#008844">#t</font></code></nobr></td>
+ <td align="center" class="button"><nobr><code><font color="#AA0000">#f</font></code></nobr></td>
+ <td align="center" class="button"><nobr><code>&nbsp;<font color="#008844">t</font>&nbsp;</code></nobr></td>
+ <td align="center" class="button"><nobr><code><font color="#AA0000">nil</font></code></nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>Data types with different concepts:</p>
+
+<p>SAL:</p>
+
+<ul>
+<li>expressions - evaluated to produce a return value</li>
+<li>statements - evaluated for side-effects</li>
+</ul>
+
+<p>XLISP:</p>
+
+<ul>
+<li>character - a single ASCII character</li>
+<li>object - the XLISP object system</li>
+<li>stream - data type of unknown length</li>
+<li>subr - built-in function</li>
+<li>fsubr - special form</li>
+<li>closure - user defined function</li>
+</ul>
+
+<p>A function to print the Lisp code, produced by the SAL compiler, to the
+screen:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">test</font> (string)
+ (if (not (stringp string))
+ (error "not a string" string)
+ (pprint (third (second (sal-compile string nil nil "&lt;console&gt;"))))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<br>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/manual/xlisp-man-033.htm b/docsrc/xlisp/xlisp-doc/manual/xlisp-man-033.htm
new file mode 100644
index 0000000..223e3c6
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/manual/xlisp-man-033.htm
@@ -0,0 +1,356 @@
+<html><head><title>XLISP: An Object-oriented Lisp</title></head>
+
+<style type="text/css">
+ pre.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+ td.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+</style>
+
+<body>
+
+<a href="../start.htm">XLISP</a> &gt;
+<a href="xlisp-man-index.htm">XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="contents.htm#34">Contents</a>&nbsp; -&nbsp;
+<a href="../reference/reference-index.htm">Reference</a>&nbsp; -&nbsp;
+<a href="xlisp-man-032.htm">Previous</a> |
+<a href="xlisp-man-index.htm">Next</a>
+
+<hr>
+
+<h1>33&nbsp; Nyquist Functions</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#predicate-functions">Predicate Functions</a></nobr></li>
+<ul>
+<li><nobr><a href="#filep">filep</a> - is this a file ?</nobr></li>
+</ul>
+<li><nobr><a href="#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+<ul>
+<li><nobr><a href="#rrandom">rrandom</a> - compute a random real number between 0 and 1 inclusive</li>
+</ul>
+<li><nobr><a href="#string-functions">String Functions</a></nobr></li>
+<ul>
+<li><nobr><a href="#string-search">string-search</a> - search for pattern in string</nobr></li>
+</ul>
+<li><nobr><a href="#file-io-functions">File I/O Functions</a></nobr></li>
+<ul>
+<li><nobr><a href="#open-binary">open-binary</a> - open a binary file stream</nobr></li>
+<li><nobr><a href="#setdir">setdir</a> - set current directory</nobr></li>
+<li><nobr><a href="#listdir">listdir</a> - get a directory listing</nobr></li>
+<li><nobr><a href="#get-temp-path">get-temp-path</a> - get a path where a temporary file can be created</nobr></li>
+<li><nobr><a href="#read-int">read-int</a> - read a binary integer from a stream</nobr></li>
+<li><nobr><a href="#write-int">write-int</a> - write a binary integer to a stream</nobr></li>
+<li><nobr><a href="#read-float">read-float</a> - read a binary floating-point number from a stream</nobr></li>
+<li><nobr><a href="#write-float">write-float</a> - write a binary floating-point number to a stream</nobr></li>
+</ul>
+<li><nobr><a href="#system-functions">System Functions</a></nobr></li>
+<ul>
+<li><nobr><a href="#info">info</a> - show information about memory usage</nobr></li>
+<li><nobr><a href="#bigendiap">bigendiap</a> - is this a big-endian machine ?</nobr></li>
+<li><nobr><a href="#setup-console">setup-console</a> - set default console attributes</nobr></li>
+<li><nobr><a href="#echoenabled">echoenabled</a> - turn console input echoing on or off</nobr></li>
+</ul>
+<li><nobr><a name="11" href="#profiling">Profiling</a></nobr></li>
+<ul>
+<li><nobr><a href="#profile">profile</a> - turn profiling on or off</nobr></li>
+</ul>
+</ol>
+
+<p><b>Note:</b> if you're interested in *all* functions added by Nyquist to
+the XLISP language, I suggest you download the Nyquist manual from:</p>
+
+<ul>
+<li><a href="http://www.cs.cmu.edu/~music/music.software.html"
+>http://www.cs.cmu.edu/~music/music.software.html</a></li>
+</ul>
+
+<p>The following is a list of all Nyquist functions I have found in the
+XLISP section of the <nobr>Nyquist 2.36</nobr> manual but I cannot even
+guarantee that the list is complete. I'm willing to add more functions here
+if you find that some are missing but the best information source is the
+Nyquist manual itself. Roger is always a step ahead and I do not want to
+spread obsolete or wrong information.</p>
+
+<a name="predicate-functions"></a>
+
+<hr>
+
+<h2>Predicate Functions</h2>
+
+<hr>
+
+<a name="filep"></a>
+
+<dl>
+
+<dt>(filep <i>expr</i>) - is this a <nobr>file ?</nobr></dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - T if the value is an object, NIL otherwise</dd>
+
+</dl>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="debugging-functions"></a>
+
+<hr>
+
+<h2>Arithmetic Functions</h2>
+
+<hr>
+
+<a name="rrandom"></a>
+
+<dl>
+
+<dt>(rrandom) - compute a random real number between 0 and 1 inclusive</dt>
+<dd>returns - a random floating point number</dd>
+
+</dl>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="string-functions"></a>
+
+<hr>
+
+<h2>String Functions</h2>
+
+<hr>
+
+<a name="string-search"></a>
+
+<dl>
+
+<dt>(string-search <i>pat</i> <i>str</i> &amp;key :start :end)
+- search for pattern in string</dt><dd>
+<i>pat</i> - a string to search for<br>
+<i>str</i> - the string to be searched<br>
+:start - the starting offset in str<br>
+:end - the ending offset + 1<br>
+returns - index of <i>pat</i> in <i>str</i> or NIL if not found</dd>
+
+</dl>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="file-io-functions"></a>
+
+<hr>
+
+<h2>File I/O Functions</h2>
+
+<hr>
+
+<a name="open-binary"></a>
+
+<p><b>Note:</b> Files are ordinarily opened as text. Binary files [such
+as standard MIDI files] must be opened with 'open-binary' on non-unix
+systems.</p>
+
+<dl>
+
+<dt>(open-binary <i>fname</i> &amp;key :direction) - open a binary file stream</dt>
+<dd><i>fname</i> - the file name string or symbol<br>
+:direction - :input or :output [default is :input]<br>
+returns - a stream</dd>
+
+<a name="setdir"></a><br>
+
+<dt>(setdir <i>path</i>) - set current directory</dt>
+<dd><i>path</i> - the path of the new directory<br>
+returns - the resulting full path, e.g. (setdir ".") gets the current
+working directory, or NIL if an error occurs</dd>
+
+<a name="listdir"></a><br>
+
+<dt>(listdir <i>path</i>) - get a directory listing</dt>
+<dd><i>path</i> - the path of the directory to be listed<br>
+returns - list of filenames in the directory</dd>
+
+<a name="get-temp-path"></a><br>
+
+<dt>(get-temp-path) - get a path where a temporary file can be created</dt>
+<dd>returns - the resulting full path as a string</dd>
+
+</dl>
+
+<p><b>Note:</b> Under Windows, the 'get-temp-path' function is based on
+environment variables. If XLISP is running as a sub-process to Java, the
+environment may not exist, in which case the default result is the
+unfortunate choice 'c:\windows\'.</p>
+
+<dl>
+
+<a name="read-int"></a>
+
+<dt>(read-int [<i>stream</i> [<i>length</i>]]) - read a binary integer from a stream</dt>
+<dd><i>stream</i> - the input stream [default is standard input]<br>
+<i>length</i> - the length of the integer in bytes [default is 4]<br>
+returns - the integer</dd>
+
+<a name="write-int"></a><br>
+
+<dt>(write-int <i>ch</i> [<i>stream</i> [<i>length</i>]]) - write a binary integer to a stream</dt>
+<dd><i>ch</i> - the character to write<br>
+<i>stream</i> - the output stream [default is standard output]<br>
+<i>length</i> - the length of the integer in bytes [default is 4]<br>
+returns - the integer</dd>
+
+<a name="read-float"></a><br>
+
+<dt>(read-float [<i>stream</i> [<i>length</i>]]) - read a binary
+floating-point number from a stream</dt>
+<dd><i>stream</i> - the input stream (default is standard input)<br>
+<i>length</i> - the length of the float in bytes [default is 4,
+legal values are -4, -8, 4, and 8]<br>
+returns - the float</dd>
+
+<a name="write-float"></a><br>
+
+<dt>(write-float <i>ch</i> [<i>stream</i> [<i>length</i>]]) - write a binary floating-point number to a stream</dt>
+<dd><i>ch</i> - the character to write<br>
+<i>stream</i> - the output stream [default is standard output]<br>
+<i>length</i> - the length of the float in bytes [default is 4,
+legal values are -4, -8, 4, and 8]<br>
+returns - the float</dd>
+
+</dl>
+
+<p><b>Note:</b> Integers and floats are assumed to be big-endian [high-order
+byte first] and signed, regardless of the platform. To read little-endian
+format, use a negative number for the length, e.g. '-4' indicates a 4-bytes,
+low-order byte first. The file should be opened in binary mode.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="system-functions"></a>
+
+<hr>
+
+<h2>System Functions</h2>
+
+<hr>
+
+<p><b>Note:</b> in Nyquist, the XLISP
+<a href="../reference/load.htm">load</a> function first tries to
+load a file from the current directory. A '.lsp' extension is added if there
+is not already an alphanumeric extension following a period. If that fails,
+XLISP searches the path, which is obtained from the XLISPPATH environment
+variable in Unix and HKEY_LOCAL_MACHINE\SOFTWARE\CMU\Nyquist\XLISPPATH under
+Win32. [The Macintosh version has no search path.]</p>
+
+<a name="info"></a>
+
+<dl>
+<dt>(info) - show information about memory usage.</dt>
+<dd>returns - NIL</dd>
+</dl>
+
+<a name="bigendiap"></a>
+
+<dl>
+<dt>(bigendiap) - is this a big-endian <nobr>machine ?</nobr></dt>
+<dd>returns - T if this a big-endian architecture, storing the high-order
+byte of an integer at the lowest byte address of the integer, otherwise
+NIL.</dd>
+</dl>
+
+<p><b>Note:</b> Under Windows, Nyquist normally starts up in a medium-sized
+console window with black text and a white background, with a window title
+of "Nyquist." This is normally accomplished by calling 'setup-console' in
+'system.lsp'. In Nyquist, you can avoid this behavior by setting
+*setup-console* to NIL in your 'init.lsp' file. If 'setup-console' is not
+called, Nyquist uses standard input and output as is. This is what you want
+if you are running Nyquist inside of emacs, for example.</p>
+
+<a name="setup-console"></a>
+
+<dl>
+<dt>(setup-console) - set default console attributes</dt>
+<dd>returns - NIL</dd>
+</dl>
+
+<p><b>Note:</b> The 'echoenabled' function is only implemented under Linux
+and <nobr>Mac OS X.</nobr> If Nyquist I/O is redirected through pipes, the
+Windows version does not echo the input, but the Linux and Mac versions do.
+You can turn off echoing with this function. Under windows it is defined to
+do nothing.</p>
+
+<a name="echoenabled"></a>
+
+<dl>
+<dt>(echoenabled <i>flag</i>) - turn console input echoing on or off</dt>
+<dd><i>flag</i> - T to enable echo, NIL to disable<br>
+returns - NIL</dd>
+</dl>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="profiling"></a>
+
+<hr>
+
+<h1>Profiling</h1>
+
+<hr>
+
+<p>The Xlisp 2.0 release has been extended with a profiling facility, which
+counts how many times and where
+<a href="../reference/eval.htm">eval</a> is executed. A separate
+count is maintained for each named function, closure, or macro, and a count
+indicates an <a href="../reference/eval.htm">eval</a> in the
+immediately [lexically] enclosing named function, closure, or macro. Thus,
+the count gives an indication of the amount of time spent in a function, not
+counting nested function calls.</p>
+
+<p>The list of all functions executed is maintained on the global *profile*
+variable. These functions in turn have *profile* properties, which maintain
+the counts. The profile system merely increments counters and puts symbols
+on the *profile* list. It is up to the user to initialize data and gather
+results. Profiling is turned on or off with the 'profile' function.</p>
+
+<a name="profile"></a>
+
+<dl>
+<dt>(profile <i>flag</i>) - turn profiling on or off</dt>
+<dd><i>flag</i> - NIL turns profiling off, otherwise on<br>
+returns - the previous state of profiling</dd>
+</dl>
+
+<p>Unfortunately, methods cannot be profiled with this facility.</p>
+
+<p>[Nyquist sources: xlsys.c, xleval.c]</p>
+
+<p>&nbsp;&nbsp;<a href="#top">Back to Top</a></p>
+
+<hr>
+
+<a href="../start.htm">XLISP</a> &gt;
+<a href="xlisp-man-index.htm">XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="contents.htm#34">Contents</a>&nbsp; -&nbsp;
+<a href="../reference/reference-index.htm">Reference</a>&nbsp; -&nbsp;
+<a href="xlisp-man-032.htm">Previous</a> |
+<a href="xlisp-man-index.htm">Next</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/manual/xlisp.htm b/docsrc/xlisp/xlisp-doc/manual/xlisp.htm
new file mode 100644
index 0000000..c32b7a0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/manual/xlisp.htm
@@ -0,0 +1,1256 @@
+<html><head>
+
+<title>XLISP 2.0</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #the-readtable08080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #the-readtable08080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #the-readtable08080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>XLISP 2.0</h1>
+
+<hr>
+
+<p><nobr><b>XLISP: An Object-oriented Lisp</b>&nbsp;</nobr> <nobr>Version
+2.0</nobr>, <nobr>February 6, 1988</nobr>, by <nobr>David Michael
+Betz</nobr>, <nobr>127 Taylor Road</nobr>, Peterborough, <nobr>NH
+03458</nobr></p>
+
+<p><nobr>Copyright (c) 1988</nobr>, by <nobr>David Michael Betz</nobr>,
+<nobr>All Rights Reserved</nobr>, Permission is granted for unrestricted
+<nobr>non-commercial use</nobr>.</p>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#introduction">Introduction</a></nobr></li>
+<li><nobr><a href="#a-note-from-the-author">A Note From The Author</a></nobr></li>
+<li><nobr><a href="#command-loop">Command Loop</a></nobr></li>
+<li><nobr><a href="#break-loop">Break Loop</a></nobr></li>
+<li><nobr><a href="#data-types">Data Types</a></nobr></li>
+<li><nobr><a href="#the-evaluator">The Evaluator</a></nobr></li>
+<li><nobr><a href="#lexical-conventions">Lexical Conventions</a></nobr></li>
+<li><nobr><a href="#the-readtable">The Readtable</a></nobr></li>
+<li><nobr><a href="#lambda-lists">Lambda Lists</a></nobr></li>
+<ul>
+<li><nobr><a href="#arguments">Arguments</a></nobr></li>
+<ul>
+<li><nobr><a href="#required-arguments">Required Arguments</a></nobr></li>
+<li><nobr><a href="#optional-arguments">Optional Arguments</a></nobr></li>
+<li><nobr><a href="#rest-argument">Rest Argument</a></nobr></li>
+<li><nobr><a href="#keyword-arguments">Keyword Arguments</a></nobr></li>
+<li><nobr><a href="#auxiliary-variables">Auxiliary Variables</a></nobr></li>
+</ul>
+<li><nobr><a href="#lambda-list-syntax">Lambda List Syntax</a></nobr></li>
+</ul>
+</ol>
+
+<a name="introduction"></a>
+
+<hr>
+
+<h2>1&nbsp; Introduction</h2>
+
+<hr>
+
+<p>XLISP is an experimental programming language combining some of the
+features of Common Lisp with an object-oriented extension capability. It was
+implemented to allow experimentation with object-oriented programming on
+small computers. Implementations of XLISP run on virtually every operating
+system. XLISP is completely written in the programming language C and is
+easily extended with user written built-in functions and classes. It is
+available in source form to non-commercial users. Many Common Lisp functions
+are built into XLISP. In addition, XLISP defines the objects <a
+href="../reference/object.htm">object</a> and <a
+href="../reference/class.htm">class</a> as primitives. Object is the
+only class that has no superclass and hence is the root of the class
+hierarchy tree. Class is the class of which all classes are instances [it is
+the only object that is an instance of itself].</p>
+
+<p>This document is a brief description of XLISP. It assumes some knowledge
+of LISP and some understanding of the concepts of object-oriented
+programming. I recommend the book 'Lisp' by Winston and Horn and published
+by Addison Wesley for learning Lisp. The first edition of this book is based
+on MacLisp and the second edition is based on Common Lisp. You will probably
+also need a copy of 'Common Lisp, The Language' by Guy L. Steele, Jr.,
+published by Digital Press to use as a reference for some of the Common Lisp
+functions that are described only briefly in this document.</p>
+
+<p>A list with Lisp books and documents available for free in the internet
+can be found under <a href="../misc/links.htm">Lisp Links</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="a-note-from-the-author"></a>
+
+<hr>
+
+<h2>2&nbsp; A Note From The Author</h2>
+
+<hr>
+
+<p>If you have any problems with XLISP, feel free to contact me [David Betz]
+for help or advice. Please remember that since XLISP is available in source
+form in a high level language, many users have been making versions
+available on a variety of machines. If you call to report a problem with a
+specific version, I may not be able to help you if that version runs on a
+machine to which I don't have access. Please have the version number of the
+version that you are running readily accessible before calling me.</p>
+
+<p>If you find a bug in XLISP, first try to fix the bug yourself using the
+source code provided. If you are successful in fixing the bug, send the bug
+report along with the fix to me. If you don't have access to a C compiler or
+are unable to fix a bug, please send the bug report to me and I'll try to
+fix it.</p>
+
+<p>Any suggestions for improvements will be welcomed. Feel free to extend
+the language in whatever way suits your needs. However,</p>
+
+<p><div class="box">
+
+<p><b>PLEASE DO NOT RELEASE ENHANCED VERSIONS WITHOUT CHECKING WITH ME
+FIRST!!</b></p>
+
+</div></p>
+
+<p>I would like to be the clearing house for new features added to XLISP. If
+you want to add features for your own personal use, go ahead. But, if you
+want to distribute your enhanced version, contact me first. Please remember
+that the goal of XLISP is to provide a language to learn and experiment with
+LISP and object-oriented programming on small computers. I don't want it to
+get so big that it requires megabytes of memory to run.</p>
+
+<p>The official XLISP homepage is:</p>
+
+<ul>
+<li><a href="http://www.mv.com/ipusers/xlisper/">http://www.mv.com/ipusers/xlisper/</a></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="command-loop"></a>
+
+<hr>
+
+<h2>3&nbsp; Command Loop</h2>
+
+<hr>
+
+<p>When XLISP is started, it first tries to load the workspace 'xlisp.wks'
+from the current directory. If that file doesn't exist, XLISP builds an
+initial workspace, empty except for the built-in functions and symbols. Then
+XLISP attempts to load 'init.lsp' from the current directory. It then loads
+any files named as parameters on the command line [after appending '.lsp' to
+their names].</p>
+
+<p>XLISP then issues the following prompt:</p>
+
+<pre class="example">
+&gt;
+</pre>
+
+<p>This indicates that XLISP is waiting for an expression to be typed. When
+a complete expression has been entered, XLISP attempts to evaluate that
+expression. If the expression evaluates successfully, XLISP prints the
+result and then returns to the initial prompt waiting for another expression
+to be typed.</p>
+
+<a name="interactive-programming"></a>
+
+<p><div class="box">
+
+<p><b>Interactive Programming</b></p>
+
+<p>There are several symbols maintained by the <nobr>read-eval-print</nobr>
+loop:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>*</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>the most recent result</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>**</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>the second recent result</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>***</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>the third recent result</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>+</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>the most recent input expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>++</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>the second recent input expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>+++</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>the third recent input expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>&minus;</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the expression currently being evaluated, becomes the
+ value of + at the end of the evaluation</td>
+</tr>
+</tbody></table></p>
+
+<p>These symbols are for interactive programming. <nobr>It is</nobr> not
+recommended to use them in program code.</p>
+
+</div></p>
+
+<a name="special-characters"></a>
+
+<p><div class="box">
+
+<p><b>Special Characters</b></p>
+
+<p>When XLISP is running from a console <nobr>[not in</nobr> the Nyquist
+<nobr>Java IDE]</nobr>, some control characters invoke operations:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>Control-c</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">executes the <a href="../reference/top-level.htm">top-level</a> function</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>Control-g</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">executes the <a href="../reference/clean-up.htm">clean-up</a> function</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>Control-p</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">executes the <a href="../reference/continue.htm">continue</a> function</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>Control-b</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">stops execution and enters the break command loop,
+ execution can be continued by typing Control-p <nobr>or
+ (<a href="../reference/continue.htm">continue</a>)</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>Control-e</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">turns on character echoing [Linux and <nobr>Mac OS X</nobr> only]</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>Control-f</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">turns off character echoing [Linux and <nobr>Mac OS X</nobr> only]</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>Control-t</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">evaluates the <a href="../reference/info.htm">info</a> function</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>Control-u</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">erases the entire input line</td>
+</tr>
+</tbody></table></p>
+
+<p>Backspace and Delete characters erase the previous character on the input
+line <nobr>[if any]</nobr>.</p>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="break-loop"></a>
+
+<hr>
+
+<h2>4&nbsp; Break Loop</h2>
+
+<hr>
+
+<p>When XLISP encounters an error while evaluating an expression, it
+attempts to handle the error in the following way:</p>
+
+<dl>
+
+<p><b>1.</b> If the symbol
+<a href="../reference/global-breakenable.htm">*breakenable*</a> is true, the
+message corresponding to the error is printed. <nobr>If the</nobr> error is
+correctable, the correction message is printed.</p>
+
+<dd>
+<ul>
+
+<li><p>If the symbol
+<a href="../reference/global-tracenable.htm">*tracenable*</a> is true, a
+trace back is printed. The number of entries printed depends on the value of
+the symbol <a href="../reference/global-tracelimit.htm">*tracelimit*</a>.
+<nobr>If this</nobr> symbol is set to something other than a number, the
+entire trace back stack is printed.</p></li>
+
+</ul>
+
+<p>XLISP then enters a '<nobr>read-eval-print</nobr>' loop to allow the user
+to examine the state of the interpreter in the context of the error. This
+loop differs from the normal <nobr>top-level</nobr>
+'<nobr>read-eval-print</nobr>' loop in that if the user invokes the
+<a href="../reference/continue.htm">continue</a> function:</p>
+
+<pre class="example">
+1&gt; (continue)
+</pre>
+
+<p>XLISP will continue from a correctable error. <nobr>If the</nobr> user
+invokes the <a href="../reference/clean-up.htm">clean-up</a> function:</p>
+
+<pre class="example">
+1&gt; (clean-up)
+</pre>
+
+<p>XLISP will abort the break loop and return to the top level or the next
+lower numbered break loop. When in a break loop, XLISP prefixes the break
+level to the normal prompt with a number.</p></dd>
+
+<dt><p><b>2.</b> If the symbol
+<a href="../reference/global-breakenable.htm">*breakenable*</a>
+is <a href="../reference/nil.htm">NIL</a>, XLISP looks for a surrounding
+<a href="../reference/errset.htm">errset</a> function:</p></dt>
+
+</dl>
+
+<ul>
+
+<li type="circle"><p>If an error happened within the scope of an
+<a href="../reference/errset.htm">errset</a> function, XLISP examines the
+value of the <a href="../reference/errset.htm">errset</a> print flag.
+<nobr>If this</nobr> flag is true, the error message is printed.
+<nobr>In case</nobr> of an error, the
+<a href="../reference/errset.htm">errset</a> function always <nobr>returns
+<a href="../reference/nil.htm">NIL</a></nobr>.</p></li>
+
+<li type="circle"><p>If there is no surrounding
+<a href="../reference/errset.htm">errset</a> function, XLISP prints the
+error message and returns to the top level.</p></li>
+
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="data-types"></a>
+
+<hr>
+
+<h2>5&nbsp; Data Types</h2>
+
+<hr>
+
+<p>There are several different data types available to XLISP
+programmers:</p>
+
+<ul>
+<li><nobr><a href="../reference/nil.htm">nil</a> - boolean false as well as the empty <a href="../reference/listp.htm">list</a></nobr></li>
+<li><nobr><a href="../reference/arrayp.htm">array</a> - including <a href="../reference/hash.htm">hash</a>-tables</nobr></li>
+<li><a href="../reference/characterp.htm">character</a></li>
+<li><a href="../reference/numberp.htm">number</a></li>
+<ul>
+<li><a href="../reference/integerp.htm">fixnum</a> - integer number</li>
+<li><a href="../reference/floatp.htm">flonum</a> - floating point number</li>
+</ul>
+<li><nobr><a href="../reference/consp.htm">cons</a> - a non-empty list, where a <a href="../reference/listp.htm">list</a> is of type <a href="../reference/consp.htm">cons</a> or <a href="../reference/nil.htm">nil</a></nobr></li>
+<li><a href="../reference/objectp.htm">object</a></li>
+<li><a href="../reference/streamp.htm">stream</a></li>
+<ul>
+<li><nobr><b>file-stream</b> - returned by <a href="../reference/open.htm">open</a></nobr></li>
+<li><nobr><b>unnamed-stream</b> - returned by <a href="../reference/make-string-input-stream.htm">make-string-input-stream</a></nobr></li>
+</ul>
+<li><nobr><a href="../reference/stringp.htm">string</a></nobr></li>
+<li><nobr><a href="../reference/symbolp.htm">symbol</a> - including keywords</nobr></li>
+<li><nobr><b>subr</b> - built-in function</nobr></li>
+<li><nobr><b>fsubr</b> - special form</nobr></li>
+<li><nobr><b>closure</b> - user defined function</nobr></li>
+<li><nobr><a href="../reference/filep.htm">file</a></nobr></li>
+<li><nobr><a href="../reference/soundp.htm">sound</a> - a Nyquist sound</nobr></li>
+</ul>
+
+<p>See also the <nobr><a href="../reference/type-of.htm">type-of</a></nobr>
+function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="the-evaluator"></a>
+
+<hr>
+
+<h2>6&nbsp; The Evaluator</h2>
+
+<hr>
+
+<p>The process of evaluation in XLISP:</p>
+
+<ul>
+
+<li><p>The following Lisp objects evaluate to themselves:</p>
+
+<ul>
+<li><nobr><a href="../reference/stringp.htm">string</a></nobr></li>
+<li><nobr><a href="../reference/integerp.htm">fixnum</a></nobr></li>
+<li><nobr><a href="../reference/characterp.htm">character</a></nobr></li>
+<li><nobr><a href="../reference/floatp.htm">flonum</a></nobr></li>
+<li><nobr><a href="../reference/objectp.htm">object</a></nobr></li>
+<li><nobr><a href="../reference/arrayp.htm">array</a></nobr></li>
+<li><nobr><a href="../reference/streamp.htm">stream</a></nobr></li>
+<li><nobr><b>subr</b> - built-in function</nobr></li>
+<li><nobr><b>fsubr</b> - special form</nobr></li>
+<li><nobr><b>closure</b> - user defined function</nobr></li>
+</ul>
+</li>
+
+<li><p><font color="#000088"><b>Symbols</b></font> act as variables and are
+evaluated by retrieving the value associated with their current
+binding.</p></li>
+
+<li><p><font color="#000088"><b>Lists</b></font> are evaluated by examining
+the first element of the list and then taking one of the following
+actions:</p></li>
+
+<ul>
+
+<li><p>If it is a <font color="#000088"><b>symbol</b></font>, the functional
+binding of the symbol is retrieved.</p></li>
+
+<li><p>If it is a <font color="#000088"><b>lambda expression</b></font>, a
+closure is constructed for the function described by the lambda
+expression.</p></li>
+
+<li><p>If it is a <font color="#000088"><b>subr</b></font> [built-in
+function], <font color="#000088"><b>fsubr</b></font> [special form] or <font
+color="#000088"><b>closure</b></font> [user defined function], it stands for
+itself.</p></li>
+
+<li><p>Any other value is an <font color="#AA0000"><b>error</b></font>.</p></li>
+
+</ul>
+
+<p>Then, the value produced by the previous step is examined:</p>
+
+<ul>
+
+<li><p>If it is a <font color="#000088"><b>subr</b></font>
+<nobr>[built-in</nobr> function] or <font
+color="#000088"><b>closure</b></font> [user defined function], the remaining
+list elements are evaluated and the subr or closure is called with these
+evaluated expressions as arguments.</p></li>
+
+<li><p>If it is an <font color="#000088"><b>fsubr</b></font> [special form],
+the fsubr is called using the remaining list elements as arguments
+[unevaluated].</p></li>
+
+<li><p>If it is a<font color="#000088"><b> macro</b></font>, the macro is
+expanded using the remaining list elements as arguments [unevaluated]. The
+macro expansion is then evaluated in place of the original macro
+call.</p></li>
+
+</ul>
+
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lexical-conventions"></a>
+
+<hr>
+
+<h2>7&nbsp; Lexical Conventions</h2>
+
+<hr>
+
+<p>The following conventions must be followed when entering XLISP
+programs:</p>
+
+<ul>
+
+<li><p>Comments in XLISP code begin with a semicolon character and continue
+to the end of the line.</p></li>
+
+<li><p>Symbol names in XLISP can consist of any sequence of non-blank
+printable characters except the following:</p></li>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr>(</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>opening parenthesis</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr>)</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>closing parenthesis</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr>'</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>single-quote</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr>`</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>backquote</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr>,</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>comma</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr>&quot;</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>double-quote</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr>;</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>semicolon</nobr></td>
+</tr>
+</tbody></table></p>
+
+<li><p>Uppercase and lowercase characters are not distinguished within
+symbol names. All lowercase characters are mapped to uppercase on
+input.</p></li>
+
+<li><p>Integer literals consist of a sequence of digits optionally beginning
+with a '+' [plus] or '-' [minus]. The range of values an integer can
+represent is limited by the size of a C 'long' value on the machine on which
+XLISP is running. <nobr>Also be</nobr> aware that Nyquist doesn't check for
+CPU register overflow with integer numbers, so for example if you add 1 to
+the biggest Nyquist integer number, the result will be a negative
+number.</p></li>
+
+<li><p>Floating point literals consist of a sequence of digits optionally
+beginning with a '+' [plus] or '-' [minus] and including an embedded decimal
+point. The range of values a floating point number can represent is limited
+by the size of a C 'float' [or 'double' on machines with 32 bit addresses]
+on the machine on which XLISP is running.</p></li>
+
+<li><p>Literal strings are sequences of characters surrounded by double
+quotes. Within quoted strings the '\' [backslash] character is used to allow
+non-printable characters to be included. The codes recognized are:</p></li>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>\\</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the character '\' [backslash]</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>\n</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">newline</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>\t</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">tab</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>\r</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">return</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>\f</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">form feed</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>\<font color="#0000CC">nnn</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">the character whose octal code is 'nnn'</td>
+</tr>
+</tbody></table></p>
+
+<p>An <a href="../misc/ascii-table.htm">ASCII</a> table
+is provided with this version of the XLISP manual with all octal, decimal
+and hexadecimal character values.</p>
+
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="the-readtable"></a>
+
+<hr>
+
+<h2>8&nbsp; The Readtable</h2>
+
+<hr>
+
+<a name="constituent"></a><a name="white-space"></a>
+<a name="tmacro"></a><a name="nmacro"></a>
+<a name="sescape"></a><a name="mescape"></a>
+
+<p>The behavior of the reader is controlled by a data structure called a
+'readtable'. The reader uses the symbol
+<a href="../reference/global-readtable.htm">*readtable*</a> to locate the
+current readtable. This table controls the interpretation of input
+characters. It is an array with 128 entries, one for each of the
+<a href="../misc/ascii-table.htm">ASCII</a> character codes. Each
+entry contains one of the following things:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>&nbsp;NIL</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>indicating an invalid character</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="../reference/nil.htm">nil</a>]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>:CONSTITUENT</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>indicating a symbol constituent</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="../reference/keyword-constituent.htm">:constituent</a>]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>:WHITE-SPACE</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>indicating a whitespace character</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="../reference/keyword-white-space.htm">:white-space</a>]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>(:TMACRO . <font color="#0000CC">function</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>terminating readmacro</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="../reference/keyword-tmacro.htm">:tmacro</a>]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>(:NMACRO . <font color="#0000CC">function</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>non-terminating readmacro</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="../reference/keyword-nmacro.htm">:nmacro</a>]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>:SESCAPE</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>single escape character '\'</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="../reference/keyword-sescape.htm">:sescape</a>]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>:MESCAPE</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>multiple escape character '|'</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="../reference/keyword-mescape.htm">:mescape</a>]</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>In the case of <a href="../reference/keyword-tmacro.htm">:tmacro</a> and
+<a href="../reference/keyword-nmacro.htm">:nmacro</a>, the 'fun' component
+is a function. This can either be a built-in readmacro function or a
+<a href="../reference/lambda.htm">lambda</a> expression. The
+function should take two parameters. The first is the input stream and the
+second is the character that caused the invocation of the readmacro. The
+readmacro function should return
+<a href="../reference/nil.htm">NIL</a> to indicate that the
+character should be treated as white space or a value
+<a href="../reference/cons.htm">cons</a>ed with
+<a href="../reference/nil.htm">NIL</a> to indicate that the
+readmacro should be treated as an occurence of the specified value. Of
+course, the readmacro code is free to
+<a href="../reference/read.htm">read</a> additional characters
+from the input stream.</p>
+
+<a name="quote"></a><a name="function"></a><a name="array"></a>
+<a name="hexadecimal"></a><a name="octal"></a><a name="binary"></a>
+<a name="character"></a><a name="comment"></a><a name="uninterned"></a>
+<a name="backquote"></a><a name="comma"></a><a name="comma-at"></a>
+
+<p>XLISP defines several useful read macros:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>'<font color="#0000CC">expression</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>(<a href="../reference/quote.htm">quote</a>
+ <i>expr</i>)</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#'<font color="#0000CC">expression</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>(<a href="../reference/function.htm">function</a>
+ <i>expr</i>)</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#(<font color="#0000CC">expression</font><font color="#008844">...</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>an array of the specified expressions</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#x<font color="#0000CC">digits</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>a hexadecimal number [0-9,A-F]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#o<font color="#0000CC">digits</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>an octal number [0-7]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#b<font color="#0000CC">digits</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>a binary number [0-1]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#\<font color="#0000CC">character</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>a single character</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#| <font color="#008844">...</font> |#</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>a comment</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#:<font color="#0000CC">symbol</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>an uninterned symbol</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>`<font color="#0000CC">expression</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>(<a href="../reference/backquote.htm">backquote</a>
+ <i>expr</i>)</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>,<font color="#0000CC">expression</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>(<a href="../reference/backquote.htm">comma</a>
+ <i>expr</i>)</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>,@<font color="#0000CC">expression</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>(<a href="../reference/backquote.htm">comma-at</a>
+ <i>expr</i>)</nobr></td>
+</tr>
+</tbody></table></p>
+
+<a name="Tab"></a><a name="Newline"></a><a name="Space"></a>
+
+<p>Characters names handled by the reader:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#\Tab</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td><nobr>horiz. tab</nobr></td>
+ <td><nobr>&nbsp;&nbsp; [<a href="../misc/ascii-table.htm">ASCII</a> decimal value 9]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#\Newline</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td><nobr>newline</nobr></td>
+ <td><nobr>&nbsp;&nbsp; [<a href="../misc/ascii-table.htm">ASCII</a> decimal value 10]</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>#\Space</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;=&nbsp;&nbsp;</nobr></td>
+ <td><nobr>space</nobr></td>
+ <td><nobr>&nbsp;&nbsp; [<a href="../misc/ascii-table.htm">ASCII</a> decimal value 32]</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lambda-lists"></a>
+
+<hr>
+
+<h2>9&nbsp; Lambda Lists</h2>
+
+<a name="arguments"></a>
+
+<hr>
+
+<h2>9.1&nbsp; Arguments</h2>
+
+<hr>
+
+<p>There are several forms in XLISP that require that a <nobr>'lambda
+list'</nobr> be specified. A lambda list is a definition of the arguments
+accepted by a function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="required-arguments"></a>
+
+<hr>
+
+<h2>9.1.1&nbsp; Required Arguments</h2>
+
+<hr>
+
+<p>The lambda list starts with 'required' arguments. Required arguments must
+be specified in every call to the function.</p>
+
+<p>The function '<nobr>print-x</nobr>' has exactly one required
+<nobr>argument 'x'</nobr>:</p>
+
+<pre class="example">
+(defun print-x (x)
+ (print x))
+
+(print-x 1) =&gt; 1
+(print-x) =&gt; <font color="#AA0000">error: too few arguments</font>
+(print-x 1 2) =&gt; <font color="#AA0000">error: too many arguments</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="optional-arguments"></a>
+
+<hr>
+
+<h2>9.1.2&nbsp; Optional Arguments</h2>
+
+<hr>
+
+<p>The <nobr><a href="#required-arguments">Required Arguments</a></nobr> are followed by
+the <a href="../reference/lambda-keyword-optional.htm">&amp;optional</a>
+arguments. Optional arguments may be provided or omitted in a call. An
+initialization expression may be specified to provide a default value for an
+<a href="../reference/lambda-keyword-optional.htm">&amp;optional</a>
+argument if it is omitted from a call. If no initialization expression is
+specified, an omitted argument is initialized to
+<a href="../reference/nil.htm">NIL</a>.</p>
+
+<p>It is also possible to provide the name of a 'supplied-p' variable that
+can be used to determine if a call provided a value for the argument or if
+the initialization expression was used. If specified, the 'supplied-p'
+variable will be bound to
+<a href="../reference/t.htm">&nbsp;T&nbsp;</a> if a value was
+specified in the call and
+<a href="../reference/nil.htm">NIL</a> if the default value was
+used.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="rest-argument"></a>
+
+<hr>
+
+<h2>9.1.3&nbsp; Rest Argument</h2>
+
+<hr>
+
+<p>The <nobr><a href="#optional-arguments">Optional Arguments</a></nobr> are followed by
+the <a href="../reference/lambda-keyword-rest.htm">&amp;rest</a> argument.
+<nobr>The <a href="../reference/lambda-keyword-rest.htm">&amp;rest</a></nobr>
+argument gets bound to the remainder of the argument list after the required
+and <a href="../reference/lambda-keyword-optional.htm">&amp;optional</a>
+arguments have been removed.</p>
+
+<p><div class="box">
+
+<p><b>Known Problems with the Rest Argument</b></p>
+
+<p>A subtle problem arises if
+<nobr><a href="#optional-arguments">Optional Arguments</a></nobr> are used together with
+a <a href="../reference/lambda-keyword-rest.htm">&amp;rest</a> argument:</p>
+
+<pre class="example">
+(defun test (&amp;optional opt &amp;rest rest)
+ (format t "opt = ~a, rest = ~a~%" opt rest))
+
+(test 1) =&gt; opt = 1, rest = NIL
+(test 1 2) =&gt; opt = 1, rest = (2)
+(test 1 2 3) =&gt; opt = 1, rest = (2 3)
+</pre>
+
+<p>Now the
+<a href="../reference/lambda-keyword-optional.htm">&amp;optional</a>
+argument is not optional anymore, there is no way to make the first argument
+appear in the <a href="../reference/lambda-keyword-rest.htm">&amp;rest</a>
+list and not in the
+<a href="../reference/lambda-keyword-optional.htm">&amp;optional</a>
+variable. This is not a XLISP bug, this is a general Lisp phenomenon.
+<nobr>In Lisp</nobr> it's not a good idea to use
+<nobr><a href="#optional-arguments">Optional Arguments</a></nobr> together with a
+<a href="../reference/lambda-keyword-rest.htm">&amp;rest</a> argument.</p>
+
+<p>If a <a href="../reference/lambda-keyword-rest.htm">&amp;rest</a>
+argument is used togethter with
+<nobr><a href="#keyword-arguments">Keyword Arguments</a></nobr>, then the keywords and
+their arguments appear in the list bound to the
+<a href="../reference/lambda-keyword-rest.htm">&amp;rest</a></nobr>
+argument. This is not neccessarily a XLISP bug, this also happens with
+other Lisps. <nobr>In Lisp</nobr> it's also not a good idea to use
+<nobr><a href="#keyword-arguments">Keyword Arguments</a></nobr> together with a
+<a href="../reference/lambda-keyword-rest.htm">&amp;rest</a> argument.</p>
+
+<p><b>XLISP Bug:</b> <nobr>If the</nobr> number of elements in a
+<a href="../reference/lambda-keyword-rest.htm">&amp;rest</a> list
+is odd, then <a href="../reference/lambda-keyword-key.htm">&amp;key</a>
+variables have wrong values:</p>
+
+<pre class="example">
+(defun test (&amp;rest rest &amp;key (key t))
+ (format t "rest = ~a, key = ~a~%" rest key))
+
+(test 1 :key 'a) =&gt; rest = (1 :KEY A), key = T <font color="#AA0000">; wrong KEY value</font>
+(test 1 2 :key 'a) =&gt; rest = (1 2 :KEY A), key = A <font color="#008844">; quirk, but correct KEY value</font>
+(test 1 2 3 :key 'a)) =&gt; rest = (1 2 3 :KEY A), key = T <font color="#AA0000">; again wrong KEY value</font>
+</pre>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="keyword-arguments"></a>
+
+<hr>
+
+<h2>9.1.4&nbsp; Keyword Arguments</h2>
+
+<hr>
+
+<p>The <nobr><a href="#rest-argument">Rest Argument</a></nobr> is
+followed by the <a href="../reference/lambda-keyword-key.htm">&amp;key</a>
+arguments. When a keyword argument is passed to a function, a pair of values
+appears in the argument list. The first expression in the pair should
+evaluate to a keyword symbol [a symbol that begins with a <nobr>colon
+':'].</nobr> The value of the second expression is the value of the keyword
+argument.</p>
+
+<p>Like <a href="../reference/lambda-keyword-optional.htm">&amp;optional</a>
+arguments, <a href="../reference/lambda-keyword-key.htm">&amp;key</a> arguments can
+have initialization expressions and 'supplied-p' variables. In addition, it
+is possible to specify the keyword to be used in a function call. If no
+keyword is specified, the keyword obtained by adding a colon ':' to the
+beginning of the keyword argument symbol is used.</p>
+
+<p>In other words, if the keyword argument symbol is:</p>
+
+<pre class="example">
+foo
+</pre>
+
+<p>the keyword will be:</p>
+
+<pre class="example">
+:foo
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="auxiliary-variables"></a>
+
+<hr>
+
+<h2>9.1.5&nbsp; Auxiliary Variables</h2>
+
+<hr>
+
+<p>The <nobr><a href="#keyword-arguments">Keyword Arguments</a></nobr> are followed by
+the <a href="../reference/lambda-keyword-aux.htm">&amp;aux</a> variables.
+These are local variables that are bound during the evaluation of the
+function body. It is possible to have initialization expressions for the
+<a href="../reference/lambda-keyword-aux.htm">&amp;aux</a> variables.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<a name="lambda-list-syntax"></a>
+
+<hr>
+
+<h2>9.2&nbsp; Lambda List Syntax</h2>
+
+<hr>
+
+<p>Here is the complete syntax for lambda lists:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td width="100%" colspan="2"><nobr>(<i>required-arg</i> ...</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td width="100%"><nobr>[<b>&amp;optional</b> [<i>optional-arg</i> | (<i>optional-arg</i> [<i>init-form</i> [<i>supplied-var</i>]])] ... ]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td width="100%"><nobr>[<b>&amp;rest</b> <i>rest-arg</i>]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td width="100%"><nobr>[<b>&amp;key</b> [<i>key-arg</i> | ([<i>key-arg</i> | (<i>keyword</i> <i>key-arg</i>)] [<i>init-form</i> [<i>supplied-var</i>]]) ...] <b>&amp;allow-other-keys</b>]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td width="100%"><nobr>[<b>&amp;aux</b> [<i>aux-var</i> | (<i>aux-var</i> [<i>init-form</i>])] ... ])</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>where:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr><i>required-arg</i></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%">is a <a href="#required-arguments">required</a> argument symbol</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr><i>optional-arg</i></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%">is an <a href="#optional-arguments">&amp;optional</a> argument symbol</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr><i>rest-arg</i></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%">is the <a href="#rest-argument">&amp;rest</a> argument symbol</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr><i>key-arg</i></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%">is a <a href="#keyword-arguments">&amp;key</a> argument symbol</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr><i>keyword</i></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%">is a <a href="#keyword-arguments">keyword</a> symbol</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr><i>aux-var</i></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%">is an <a href="#auxiliary-variables">auxiliary</a> variable symbol</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr><i>init-form</i></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%">is an initialization expression</td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="right"><nobr><i>supplied-var</i></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td width="100%">is a supplied-p variable symbol</td>
+</tr>
+</tbody></table></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/misc/ascii-table.htm b/docsrc/xlisp/xlisp-doc/misc/ascii-table.htm
new file mode 100644
index 0000000..a313dd5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/misc/ascii-table.htm
@@ -0,0 +1,1403 @@
+<html><head><title>ASCII Character Set</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<H1>The ASCII Character Set</H1>
+
+<hr>
+
+<p>The standard ASCII character set uses only 7 bits of the 8 bit byte for
+each character. There are several larger character sets that use all 8 bits
+of the byte, which gives them an 128 additional characters in the set. The
+extra characters are used to represent characters not used in the English
+language, graphics characters or symbols, and mathematical representations
+or symbols.</p>
+
+<p><b>ASCII Control Characters</b></p>
+
+<p>ASCII control characters are actually commands for the terminal, monitor,
+computer, I/O devices, printer or other peripherals to do something. The
+first 32 values are non-printing control characters, such as 'carriage
+return' and 'line feed'. You generate these characters on the keyboard by
+holding down the 'control' key while you strike another key. These
+characters are also capable of being sent to the device by a software
+sequence, most often by a program. They are usually sent as a string of
+characters following an attention character, usually 'escape', but not
+always.</p>
+
+<h2>ASCII Control Characters</h2>
+
+<p><table cellpadding="0" cellspacing="1" style="margin-left:10px"><tbody>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>Ctrl-key</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">NUL</td>
+ <td class="button" align="right">0</td>
+ <td class="button" align="right">0</td>
+ <td class="button" align="right">0</td>
+ <td class="button">Ctrl+@</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>null character</td>
+</tr>
+<tr>
+ <td class="button">SOH</td>
+ <td class="button" align="right">1</td>
+ <td class="button" align="right">1</td>
+ <td class="button" align="right">1</td>
+ <td class="button">Ctrl+a</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>start of heading</td>
+</tr>
+<tr>
+ <td class="button">STX</td>
+ <td class="button" align="right">2</td>
+ <td class="button" align="right">2</td>
+ <td class="button" align="right">2</td>
+ <td class="button">Ctrl+b</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>start of text</td>
+</tr>
+<tr>
+ <td class="button">ETX</td>
+ <td class="button" align="right">3</td>
+ <td class="button" align="right">3</td>
+ <td class="button" align="right">3</td>
+ <td class="button">Ctrl+c</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>end of text</td>
+</tr>
+<tr>
+ <td class="button">EOT</td>
+ <td class="button" align="right">4</td>
+ <td class="button" align="right">4</td>
+ <td class="button" align="right">4</td>
+ <td class="button">Ctrl+d</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>end of transmission</td>
+</tr>
+<tr>
+ <td class="button">ENQ</td>
+ <td class="button" align="right">5</td>
+ <td class="button" align="right">5</td>
+ <td class="button" align="right">5</td>
+ <td class="button">Ctrl+e</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>enquiry</td>
+</tr>
+<tr>
+ <td class="button">ACK</td>
+ <td class="button" align="right">6</td>
+ <td class="button" align="right">6</td>
+ <td class="button" align="right">6</td>
+ <td class="button">Ctrl+f</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>acknowledge</td>
+</tr>
+<tr>
+ <td class="button">BEL</td>
+ <td class="button" align="right">7</td>
+ <td class="button" align="right">7</td>
+ <td class="button" align="right">7</td>
+ <td class="button">Ctrl+g</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>rings terminal bell</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>Ctrl-key</b></td>
+ <td class="button"><b>XLISP</b></td>
+<tr>
+ <td class="button">BS</td>
+ <td class="button" align="right">10</td>
+ <td class="button" align="right">8</td>
+ <td class="button" align="right">8</td>
+ <td class="button">Ctrl+h</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>backspace (non-destructive)</td>
+</tr>
+<tr>
+ <td class="button">HT</td>
+ <td class="button" align="right">11</td>
+ <td class="button" align="right">9</td>
+ <td class="button" align="right">9</td>
+ <td class="button">Ctrl+i</td>
+ <td class="button"><code>#\Tab</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>horizontal tab</td>
+</tr>
+<tr>
+ <td class="button">LF</td>
+ <td class="button" align="right">12</td>
+ <td class="button" align="right">10</td>
+ <td class="button" align="right">A</td>
+ <td class="button">Ctrl+j</td>
+ <td class="button"><code>#\Newline</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>line feed</td>
+</tr>
+<tr>
+ <td class="button">VT</td>
+ <td class="button" align="right">13</td>
+ <td class="button" align="right">11</td>
+ <td class="button" align="right">B</td>
+ <td class="button">Ctrl+k</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>vertical tab</td>
+</tr>
+<tr>
+ <td class="button">FF</td>
+ <td class="button" align="right">14</td>
+ <td class="button" align="right">12</td>
+ <td class="button" align="right">C</td>
+ <td class="button">Ctrl+l</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>form feed</td>
+</tr>
+<tr>
+ <td class="button">CR</td>
+ <td class="button" align="right">15</td>
+ <td class="button" align="right">13</td>
+ <td class="button" align="right">D</td>
+ <td class="button">Ctrl+m</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>carriage return</td>
+</tr>
+<tr>
+ <td class="button">SO</td>
+ <td class="button" align="right">16</td>
+ <td class="button" align="right">14</td>
+ <td class="button" align="right">E</td>
+ <td class="button">Ctrl+n</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>shift out</td>
+</tr>
+<tr>
+ <td class="button">SI</td>
+ <td class="button" align="right">17</td>
+ <td class="button" align="right">15</td>
+ <td class="button" align="right">F</td>
+ <td class="button">Ctrl+o</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>shift in</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>Ctrl-key</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">DLE</td>
+ <td class="button" align="right">20</td>
+ <td class="button" align="right">16</td>
+ <td class="button" align="right">10</td>
+ <td class="button">Ctrl+p</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>data link escape</td>
+</tr>
+<tr>
+ <td class="button">DC1</td>
+ <td class="button" align="right">21</td>
+ <td class="button" align="right">17</td>
+ <td class="button" align="right">11</td>
+ <td class="button">Ctrl+q</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>device control 1, normally 'xon'</td>
+</tr>
+<tr>
+ <td class="button">DC2</td>
+ <td class="button" align="right">22</td>
+ <td class="button" align="right">18</td>
+ <td class="button" align="right">12</td>
+ <td class="button">Ctrl+r</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>device control 2</td>
+</tr>
+<tr>
+ <td class="button">DC3</td>
+ <td class="button" align="right">23</td>
+ <td class="button" align="right">19</td>
+ <td class="button" align="right">13</td>
+ <td class="button">Ctrl+s</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>device control 3, normally 'xoff'</td>
+</tr>
+<tr>
+ <td class="button">DC4</td>
+ <td class="button" align="right">24</td>
+ <td class="button" align="right">20</td>
+ <td class="button" align="right">14</td>
+ <td class="button">Ctrl+t</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>device control 4</td>
+</tr>
+<tr>
+ <td class="button">NAK</td>
+ <td class="button" align="right">25</td>
+ <td class="button" align="right">21</td>
+ <td class="button" align="right">15</td>
+ <td class="button">Ctrl+u</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>negative acknowledge</td>
+</tr>
+<tr>
+ <td class="button">SYN</td>
+ <td class="button" align="right">26</td>
+ <td class="button" align="right">22</td>
+ <td class="button" align="right">16</td>
+ <td class="button">Ctrl+v</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>synchronous idle</td>
+</tr>
+<tr>
+ <td class="button">ETB</td>
+ <td class="button" align="right">27</td>
+ <td class="button" align="right">23</td>
+ <td class="button" align="right">17</td>
+ <td class="button">Ctrl+w</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>end transmission block</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>Ctrl-key</b></td>
+ <td class="button"><b>XLISP</b></td>
+<tr>
+ <td class="button">CAN</td>
+ <td class="button" align="right">30</td>
+ <td class="button" align="right">24</td>
+ <td class="button" align="right">17</td>
+ <td class="button">Ctrl+x</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>cancel line</td>
+</tr>
+<tr>
+ <td class="button">EM</td>
+ <td class="button" align="right">31</td>
+ <td class="button" align="right">25</td>
+ <td class="button" align="right">19</td>
+ <td class="button">Ctrl+y</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>end of medium</td>
+</tr>
+<tr>
+ <td class="button">SUB</td>
+ <td class="button" align="right">32</td>
+ <td class="button" align="right">26</td>
+ <td class="button" align="right">1A</td>
+ <td class="button">Ctrl+z</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>substitute</td>
+</tr>
+<tr>
+ <td class="button">ESC</td>
+ <td class="button" align="right">33</td>
+ <td class="button" align="right">27</td>
+ <td class="button" align="right">1B</td>
+ <td class="button">Ctrl+[</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>escape</td>
+</tr>
+<tr>
+ <td class="button">FS</td>
+ <td class="button" align="right">34</td>
+ <td class="button" align="right">28</td>
+ <td class="button" align="right">1C</td>
+ <td class="button">Ctrl+\</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>file separator</td>
+</tr>
+<tr>
+ <td class="button">GS</td>
+ <td class="button" align="right">35</td>
+ <td class="button" align="right">29</td>
+ <td class="button" align="right">1D</td>
+ <td class="button">Ctrl+]</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>group separator</td>
+</tr>
+<tr>
+ <td class="button">RS</td>
+ <td class="button" align="right">36</td>
+ <td class="button" align="right">30</td>
+ <td class="button" align="right">1E</td>
+ <td class="button">Ctrl+^</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>record separator</td>
+</td>
+<tr>
+ <td class="button">US</td>
+ <td class="button" align="right">37</td>
+ <td class="button" align="right">31</td>
+ <td class="button" align="right">1F</td>
+ <td class="button">Ctrl+_</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>unit separator</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>Ctrl-key</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+</tbody></table></p>
+
+<h2>ASCII Printing Characters</h2>
+
+<p><table cellpadding="0" cellspacing="1" style="margin-left:10px"><tbody>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+
+</tr>
+<tr>
+ <td class="button">&nbsp;</td>
+ <td class="button" align="right">40</td>
+ <td class="button" align="right">32</td>
+ <td class="button" align="right">20</td>
+ <td class="button"><code>#\Space</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>space</td>
+</tr>
+<tr>
+ <td class="button">!</td>
+ <td class="button" align="right">41</td>
+ <td class="button" align="right">33</td>
+ <td class="button" align="right">21</td>
+ <td class="button"><code>#\!</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>exclamation mark</td>
+</tr>
+<tr>
+ <td class="button">&quot;</td>
+ <td class="button" align="right">42</td>
+ <td class="button" align="right">34</td>
+ <td class="button" align="right">22</td>
+ <td class="button"><code>#\&quot;</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>quotation mark</td>
+</tr>
+<tr>
+ <td class="button">#</td>
+ <td class="button" align="right">43</td>
+ <td class="button" align="right">35</td>
+ <td class="button" align="right">23</td>
+ <td class="button"><code>#\#</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>cross hatch, number sign</td>
+</tr>
+<tr>
+ <td class="button">$</td>
+ <td class="button" align="right">44</td>
+ <td class="button" align="right">36</td>
+ <td class="button" align="right">24</td>
+ <td class="button"><code>#\$</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>dollar sign</td>
+<tr>
+ <td class="button">%</td>
+ <td class="button" align="right">45</td>
+ <td class="button" align="right">37</td>
+ <td class="button" align="right">25</td>
+ <td class="button"><code>#\%</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>percent sign</td>
+</tr>
+<tr>
+ <td class="button">&amp;</td>
+ <td class="button" align="right">46</td>
+ <td class="button" align="right">38</td>
+ <td class="button" align="right">26</td>
+ <td class="button"><code>#\&amp;</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>ampersand</td>
+</tr>
+<tr>
+ <td class="button">`</td>
+ <td class="button" align="right">47</td>
+ <td class="button" align="right">39</td>
+ <td class="button" align="right">27</td>
+ <td class="button"><code>#\`</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>backquote, apostrophe</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">(</td>
+ <td class="button" align="right">50</td>
+ <td class="button" align="right">40</td>
+ <td class="button" align="right">28</td>
+ <td class="button"><code>#\(</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>opening parentheses</td>
+</tr>
+<tr>
+ <td class="button">)</td>
+ <td class="button" align="right">51</td>
+ <td class="button" align="right">41</td>
+ <td class="button" align="right">29</td>
+ <td class="button"><code>#\)</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>closing parentheses</td>
+</tr>
+<tr>
+ <td class="button">*</td>
+ <td class="button" align="right">52</td>
+ <td class="button" align="right">42</td>
+ <td class="button" align="right">2A</td>
+ <td class="button"><code>#\*</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>asterisk, star, multiply</td>
+</tr>
+<tr>
+ <td class="button">+</td>
+ <td class="button" align="right">53</td>
+ <td class="button" align="right">43</td>
+ <td class="button" align="right">2B</td>
+ <td class="button"><code>#\+</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>plus</td>
+</tr>
+<tr>
+ <td class="button">,</td>
+ <td class="button" align="right">54</td>
+ <td class="button" align="right">44</td>
+ <td class="button" align="right">2C</td>
+ <td class="button"><code>#\,</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>comma</td>
+</tr>
+<tr>
+ <td class="button">-</td>
+ <td class="button" align="right">55</td>
+ <td class="button" align="right">45</td>
+ <td class="button" align="right">2D</td>
+ <td class="button"><code>#\-</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>hyphen, dash, minus</td>
+</tr>
+<tr>
+ <td class="button">.</td>
+ <td class="button" align="right">56</td>
+ <td class="button" align="right">46</td>
+ <td class="button" align="right">2E</td>
+ <td class="button"><code>#\.</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>period</td>
+</tr>
+<tr>
+ <td class="button">/</td>
+ <td class="button" align="right">57</td>
+ <td class="button" align="right">47</td>
+ <td class="button" align="right">2F</td>
+ <td class="button"><code>#\/</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>slash forward, divide</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">0</td>
+ <td class="button" align="right">60</td>
+ <td class="button" align="right">48</td>
+ <td class="button" align="right">30</td>
+ <td class="button"><code>#\0</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>zero</td>
+</tr>
+<tr>
+ <td class="button">1</td>
+ <td class="button" align="right">61</td>
+ <td class="button" align="right">49</td>
+ <td class="button" align="right">31</td>
+ <td class="button"><code>#\1</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>one</td>
+</tr>
+<tr>
+ <td class="button">2</td>
+ <td class="button" align="right">62</td>
+ <td class="button" align="right">50</td>
+ <td class="button" align="right">32</td>
+ <td class="button"><code>#\2</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>two</td>
+</tr>
+<tr>
+ <td class="button">3</td>
+ <td class="button" align="right">63</td>
+ <td class="button" align="right">51</td>
+ <td class="button" align="right">33</td>
+ <td class="button"><code>#\3</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>three</td>
+</tr>
+<tr>
+ <td class="button">4</td>
+ <td class="button" align="right">64</td>
+ <td class="button" align="right">52</td>
+ <td class="button" align="right">34</td>
+ <td class="button"><code>#\4</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>four</td>
+</tr>
+<tr>
+ <td class="button">5</td>
+ <td class="button" align="right">65</td>
+ <td class="button" align="right">53</td>
+ <td class="button" align="right">35</td>
+ <td class="button"><code>#\5</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>five</td>
+</tr>
+<tr>
+ <td class="button">6</td>
+ <td class="button" align="right">66</td>
+ <td class="button" align="right">54</td>
+ <td class="button" align="right">36</td>
+ <td class="button"><code>#\6</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>six</td>
+</tr>
+<tr>
+ <td class="button">7</td>
+ <td class="button" align="right">67</td>
+ <td class="button" align="right">55</td>
+ <td class="button" align="right">37</td>
+ <td class="button"><code>#\7</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>seven</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">8</td>
+ <td class="button" align="right">70</td>
+ <td class="button" align="right">56</td>
+ <td class="button" align="right">38</td>
+ <td class="button"><code>#\8</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>eight</td>
+</tr>
+<tr>
+ <td class="button">9</td>
+ <td class="button" align="right">71</td>
+ <td class="button" align="right">57</td>
+ <td class="button" align="right">39</td>
+ <td class="button"><code>#\9</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>nine</td>
+</tr>
+<tr>
+ <td class="button">:</td>
+ <td class="button" align="right">72</td>
+ <td class="button" align="right">58</td>
+ <td class="button" align="right">3A</td>
+ <td class="button"><code>#\:</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>colon</td>
+</tr>
+<tr>
+ <td class="button">;</td>
+ <td class="button" align="right">73</td>
+ <td class="button" align="right">59</td>
+ <td class="button" align="right">3B</td>
+ <td class="button"><code>#\;</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>semicolon</td>
+</tr>
+<tr>
+ <td class="button">&lt;</td>
+ <td class="button" align="right">74</td>
+ <td class="button" align="right">60</td>
+ <td class="button" align="right">3C</td>
+ <td class="button"><code>#\&lt;</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>less than sign</td>
+</tr>
+<tr>
+ <td class="button">=</td>
+ <td class="button" align="right">75</td>
+ <td class="button" align="right">61</td>
+ <td class="button" align="right">3D</td>
+ <td class="button"><code>#\=</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>equals sign</td>
+</tr>
+<tr>
+ <td class="button">&gt;</td>
+ <td class="button" align="right">76</td>
+ <td class="button" align="right">62</td>
+ <td class="button" align="right">3E</td>
+ <td class="button"><code>#\&gt;</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>greater than sign</td>
+</tr>
+<tr>
+ <td class="button">?</td>
+ <td class="button" align="right">77</td>
+ <td class="button" align="right">63</td>
+ <td class="button" align="right">3F</td>
+ <td class="button"><code>#\?</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>question mark</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">@</td>
+ <td class="button" align="right">100</td>
+ <td class="button" align="right">64</td>
+ <td class="button" align="right">40</td>
+ <td class="button"><code>#\@</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>at-sign</td>
+</tr>
+<tr>
+ <td class="button">A</td>
+ <td class="button" align="right">101</td>
+ <td class="button" align="right">65</td>
+ <td class="button" align="right">41</td>
+ <td class="button"><code>#\A</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case A</td>
+</tr>
+<tr>
+ <td class="button">B</td>
+ <td class="button" align="right">102</td>
+ <td class="button" align="right">66</td>
+ <td class="button" align="right">42</td>
+ <td class="button"><code>#\B</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case B</td>
+</tr>
+<tr>
+ <td class="button">C</td>
+ <td class="button" align="right">103</td>
+ <td class="button" align="right">67</td>
+ <td class="button" align="right">43</td>
+ <td class="button"><code>#\C</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case C</td>
+</tr>
+<tr>
+ <td class="button">D</td>
+ <td class="button" align="right">104</td>
+ <td class="button" align="right">68</td>
+ <td class="button" align="right">44</td>
+ <td class="button"><code>#\D</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case D</td>
+</tr>
+<tr>
+ <td class="button">E</td>
+ <td class="button" align="right">105</td>
+ <td class="button" align="right">69</td>
+ <td class="button" align="right">45</td>
+ <td class="button"><code>#\E</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case E</td>
+</tr>
+<tr>
+ <td class="button">F</td>
+ <td class="button" align="right">106</td>
+ <td class="button" align="right">70</td>
+ <td class="button" align="right">46</td>
+ <td class="button"><code>#\F</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case F</td>
+</tr>
+<tr>
+ <td class="button">G</td>
+ <td class="button" align="right">107</td>
+ <td class="button" align="right">71</td>
+ <td class="button" align="right">47</td>
+ <td class="button"><code>#\G</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case G</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">H</td>
+ <td class="button" align="right">110</td>
+ <td class="button" align="right">72</td>
+ <td class="button" align="right">48</td>
+ <td class="button"><code>#\H</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case H</td>
+</tr>
+<tr>
+ <td class="button">I</td>
+ <td class="button" align="right">111</td>
+ <td class="button" align="right">73</td>
+ <td class="button" align="right">49</td>
+ <td class="button"><code>#\I</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case I</td>
+</tr>
+<tr>
+ <td class="button">J</td>
+ <td class="button" align="right">112</td>
+ <td class="button" align="right">74</td>
+ <td class="button" align="right">4A</td>
+ <td class="button"><code>#\J</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case J</td>
+</tr>
+<tr>
+ <td class="button">K</td>
+ <td class="button" align="right">113</td>
+ <td class="button" align="right">75</td>
+ <td class="button" align="right">4B</td>
+ <td class="button"><code>#\K</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case K</td>
+</tr>
+<tr>
+ <td class="button">L</td>
+ <td class="button" align="right">114</td>
+ <td class="button" align="right">76</td>
+ <td class="button" align="right">4C</td>
+ <td class="button"><code>#\L</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case L</td>
+</tr>
+<tr>
+ <td class="button">M</td>
+ <td class="button" align="right">115</td>
+ <td class="button" align="right">77</td>
+ <td class="button" align="right">4D</td>
+ <td class="button"><code>#\M</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case M</td>
+</tr>
+<tr>
+ <td class="button">N</td>
+ <td class="button" align="right">116</td>
+ <td class="button" align="right">78</td>
+ <td class="button" align="right">4E</td>
+ <td class="button"><code>#\N</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case N</td>
+</tr>
+<tr>
+ <td class="button">O</td>
+ <td class="button" align="right">117</td>
+ <td class="button" align="right">79</td>
+ <td class="button" align="right">4F</td>
+ <td class="button"><code>#\O</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case O</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">P</td>
+ <td class="button" align="right">120</td>
+ <td class="button" align="right">80</td>
+ <td class="button" align="right">50</td>
+ <td class="button"><code>#\P</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case P</td>
+</tr>
+<tr>
+ <td class="button">Q</td>
+ <td class="button" align="right">121</td>
+ <td class="button" align="right">81</td>
+ <td class="button" align="right">51</td>
+ <td class="button"><code>#\Q</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case Q</td>
+</tr>
+<tr>
+ <td class="button">R</td>
+ <td class="button" align="right">122</td>
+ <td class="button" align="right">82</td>
+ <td class="button" align="right">52</td>
+ <td class="button"><code>#\R</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case R</td>
+</tr>
+<tr>
+ <td class="button">S</td>
+ <td class="button" align="right">123</td>
+ <td class="button" align="right">83</td>
+ <td class="button" align="right">53</td>
+ <td class="button"><code>#\S</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case S</td>
+</tr>
+<tr>
+ <td class="button">T</td>
+ <td class="button" align="right">124</td>
+ <td class="button" align="right">84</td>
+ <td class="button" align="right">54</td>
+ <td class="button"><code>#\T</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case T</td>
+</tr>
+<tr>
+ <td class="button">U</td>
+ <td class="button" align="right">125</td>
+ <td class="button" align="right">85</td>
+ <td class="button" align="right">55</td>
+ <td class="button"><code>#\U</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case U</td>
+</tr>
+<tr>
+ <td class="button">V</td>
+ <td class="button" align="right">126</td>
+ <td class="button" align="right">86</td>
+ <td class="button" align="right">56</td>
+ <td class="button"><code>#\V</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case V</td>
+</tr>
+<tr>
+ <td class="button">W</td>
+ <td class="button" align="right">127</td>
+ <td class="button" align="right">87</td>
+ <td class="button" align="right">57</td>
+ <td class="button"><code>#\W</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case W</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">X</td>
+ <td class="button" align="right">130</td>
+ <td class="button" align="right">88</td>
+ <td class="button" align="right">58</td>
+ <td class="button"><code>#\X</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case X</td>
+</tr>
+<tr>
+ <td class="button">Y</td>
+ <td class="button" align="right">131</td>
+ <td class="button" align="right">89</td>
+ <td class="button" align="right">59</td>
+ <td class="button"><code>#\Y</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case Y</td>
+</tr>
+<tr>
+ <td class="button">Z</td>
+ <td class="button" align="right">132</td>
+ <td class="button" align="right">90</td>
+ <td class="button" align="right">5A</td>
+ <td class="button"><code>#\Z</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>upper case Z</td>
+</tr>
+<tr>
+ <td class="button">[</td>
+ <td class="button" align="right">133</td>
+ <td class="button" align="right">91</td>
+ <td class="button" align="right">5B</td>
+ <td class="button"><code>#\[</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>opening square bracket</td>
+</tr>
+<tr>
+ <td class="button">\</td>
+ <td class="button" align="right">134</td>
+ <td class="button" align="right">92</td>
+ <td class="button" align="right">5C</td>
+ <td class="button"><code>#\\</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>backslash, reverse slant</td>
+</tr>
+<tr>
+ <td class="button">]</td>
+ <td class="button" align="right">135</td>
+ <td class="button" align="right">93</td>
+ <td class="button" align="right">5D</td>
+ <td class="button"><code>#\]</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>closing square bracket</td>
+</tr>
+<tr>
+ <td class="button">^</td>
+ <td class="button" align="right">136</td>
+ <td class="button" align="right">94</td>
+ <td class="button" align="right">5E</td>
+ <td class="button"><code>#\^</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>caret, circumflex</td>
+</tr>
+<tr>
+ <td class="button">_</td>
+ <td class="button" align="right">137</td>
+ <td class="button" align="right">95</td>
+ <td class="button" align="right">5F</td>
+ <td class="button"><code>#\_</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>underscore</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">`</td>
+ <td class="button" align="right">140</td>
+ <td class="button" align="right">96</td>
+ <td class="button" align="right">60</td>
+ <td class="button"><code>#\`</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>opening single quote</td>
+</tr>
+<tr>
+ <td class="button">a</td>
+ <td class="button" align="right">141</td>
+ <td class="button" align="right">97</td>
+ <td class="button" align="right">61</td>
+ <td class="button"><code>#\a</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case a</td>
+</tr>
+<tr>
+ <td class="button">b</td>
+ <td class="button" align="right">142</td>
+ <td class="button" align="right">98</td>
+ <td class="button" align="right">62</td>
+ <td class="button"><code>#\b</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case b</td>
+</tr>
+<tr>
+ <td class="button">c</td>
+ <td class="button" align="right">143</td>
+ <td class="button" align="right">99</td>
+ <td class="button" align="right">63</td>
+ <td class="button"><code>#\c</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case c</td>
+</tr>
+<tr>
+ <td class="button">d</td>
+ <td class="button" align="right">144</td>
+ <td class="button" align="right">100</td>
+ <td class="button" align="right">64</td>
+ <td class="button"><code>#\d</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case d</td>
+</tr>
+<tr>
+ <td class="button">e</td>
+ <td class="button" align="right">145</td>
+ <td class="button" align="right">101</td>
+ <td class="button" align="right">65</td>
+ <td class="button"><code>#\e</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case e</td>
+</tr>
+<tr>
+ <td class="button">f</td>
+ <td class="button" align="right">146</td>
+ <td class="button" align="right">102</td>
+ <td class="button" align="right">66</td>
+ <td class="button"><code>#\f</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case f</td>
+</tr>
+<tr>
+ <td class="button">g</td>
+ <td class="button" align="right">147</td>
+ <td class="button" align="right">103</td>
+ <td class="button" align="right">67</td>
+ <td class="button"><code>#\g</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case g</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">h</td>
+ <td class="button" align="right">150</td>
+ <td class="button" align="right">104</td>
+ <td class="button" align="right">68</td>
+ <td class="button"><code>#\h</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case h</td>
+</tr>
+<tr>
+ <td class="button">i</td>
+ <td class="button" align="right">151</td>
+ <td class="button" align="right">105</td>
+ <td class="button" align="right">69</td>
+ <td class="button"><code>#\i</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case i</td>
+</tr>
+<tr>
+ <td class="button">j</td>
+ <td class="button" align="right">152</td>
+ <td class="button" align="right">106</td>
+ <td class="button" align="right">6A</td>
+ <td class="button"><code>#\j</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case j</td>
+</tr>
+<tr>
+ <td class="button">k</td>
+ <td class="button" align="right">153</td>
+ <td class="button" align="right">107</td>
+ <td class="button" align="right">6B</td>
+ <td class="button"><code>#\k</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case k</td>
+</tr>
+<tr>
+ <td class="button">l</td>
+ <td class="button" align="right">154</td>
+ <td class="button" align="right">108</td>
+ <td class="button" align="right">6C</td>
+ <td class="button"><code>#\l</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case l</td>
+</tr>
+<tr>
+ <td class="button">m</td>
+ <td class="button" align="right">155</td>
+ <td class="button" align="right">109</td>
+ <td class="button" align="right">6D</td>
+ <td class="button"><code>#\m</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case m</td>
+</tr>
+<tr>
+ <td class="button">n</td>
+ <td class="button" align="right">156</td>
+ <td class="button" align="right">110</td>
+ <td class="button" align="right">6E</td>
+ <td class="button"><code>#\n</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case n</td>
+</tr>
+<tr>
+ <td class="button">o</td>
+ <td class="button" align="right">157</td>
+ <td class="button" align="right">111</td>
+ <td class="button" align="right">6F</td>
+ <td class="button"><code>#\o</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case o</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">p</td>
+ <td class="button" align="right">160</td>
+ <td class="button" align="right">112</td>
+ <td class="button" align="right">70</td>
+ <td class="button"><code>#\p</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case p</td>
+</tr>
+<tr>
+ <td class="button">q</td>
+ <td class="button" align="right">161</td>
+ <td class="button" align="right">113</td>
+ <td class="button" align="right">71</td>
+ <td class="button"><code>#\q</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case q</td>
+</tr>
+<tr>
+ <td class="button">r</td>
+ <td class="button" align="right">162</td>
+ <td class="button" align="right">114</td>
+ <td class="button" align="right">72</td>
+ <td class="button"><code>#\r</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case r</td>
+</tr>
+<tr>
+ <td class="button">s</td>
+ <td class="button" align="right">163</td>
+ <td class="button" align="right">115</td>
+ <td class="button" align="right">73</td>
+ <td class="button"><code>#\s</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case s</td>
+</tr>
+<tr>
+ <td class="button">t</td>
+ <td class="button" align="right">164</td>
+ <td class="button" align="right">116</td>
+ <td class="button" align="right">74</td>
+ <td class="button"><code>#\t</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case t</td>
+</tr>
+<tr>
+ <td class="button">u</td>
+ <td class="button" align="right">165</td>
+ <td class="button" align="right">117</td>
+ <td class="button" align="right">75</td>
+ <td class="button"><code>#\u</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case u</td>
+</tr>
+<tr>
+ <td class="button">v</td>
+ <td class="button" align="right">166</td>
+ <td class="button" align="right">118</td>
+ <td class="button" align="right">76</td>
+ <td class="button"><code>#\v</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case v</td>
+</tr>
+<tr>
+ <td class="button">w</td>
+ <td class="button" align="right">167</td>
+ <td class="button" align="right">119</td>
+ <td class="button" align="right">77</td>
+ <td class="button"><code>#\w</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case w</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+<tr>
+ <td class="button">x</td>
+ <td class="button" align="right">170</td>
+ <td class="button" align="right">120</td>
+ <td class="button" align="right">78</td>
+ <td class="button"><code>#\x</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case x</td>
+</tr>
+<tr>
+ <td class="button">y</td>
+ <td class="button" align="right">171</td>
+ <td class="button" align="right">121</td>
+ <td class="button" align="right">79</td>
+ <td class="button"><code>#\y</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case y</td>
+</tr>
+<tr>
+ <td class="button">z</td>
+ <td class="button" align="right">172</td>
+ <td class="button" align="right">122</td>
+ <td class="button" align="right">7A</td>
+ <td class="button"><code>#\z</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>lower case z</td>
+</tr>
+<tr>
+ <td class="button">{</td>
+ <td class="button" align="right">173</td>
+ <td class="button" align="right">123</td>
+ <td class="button" align="right">7B</td>
+ <td class="button"><code>#\{</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>opening curly brace</td>
+</tr>
+<tr>
+ <td class="button">|</td>
+ <td class="button" align="right">174</td>
+ <td class="button" align="right">124</td>
+ <td class="button" align="right">7C</td>
+ <td class="button"><code>#\|</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>vertical line</td>
+</tr>
+<tr>
+ <td class="button">}</td>
+ <td class="button" align="right">175</td>
+ <td class="button" align="right">125</td>
+ <td class="button" align="right">7D</td>
+ <td class="button"><code>#\}</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>closing curly brace</td>
+</tr>
+<tr>
+ <td class="button">~</td>
+ <td class="button" align="right">176</td>
+ <td class="button" align="right">126</td>
+ <td class="button" align="right">7E</td>
+ <td class="button"><code>#\~</code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>tilde, approximate</td>
+</tr>
+<tr>
+ <td class="button">DEL</td>
+ <td class="button" align="right">177</td>
+ <td class="button" align="right">127</td>
+ <td class="button" align="right">7F</td>
+ <td class="button"><code></code></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td>delete, cross-hatch box</td>
+</tr>
+<tr>
+ <td class="button"><b>Char</b></td>
+ <td class="button"><b>Oct</b></td>
+ <td class="button"><b>Dec</b></td>
+ <td class="button"><b>Hex</b></td>
+ <td class="button"><b>XLISP</b></td>
+</tr>
+</tbody></table></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/misc/c-printf.htm b/docsrc/xlisp/xlisp-doc/misc/c-printf.htm
new file mode 100644
index 0000000..f87d62a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/misc/c-printf.htm
@@ -0,0 +1,560 @@
+<html><head>
+
+<title>ANSI C 'printf' Format</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>ANSI C 'printf' Format</h1>
+
+<hr>
+
+<p><b>Nyquist/XLISP:</b> The
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr> and
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+variables define format strings for the underlying 'sprintf' <nobr>C
+function</nobr>. <nobr>In C,</nobr> the same format string specification is
+used for 'fprint' [writes to <nobr>a file]</nobr>, 'printf' [writes to
+standard output] and 'sprintf' [writes to another string]. These three
+functions are meant in the following text with 'the printf functions'.</p>
+
+<p><b>ANSI C:</b> The printf functions write output under control of a
+format string that specifies how subsequent arguments are converted for
+output. If there are insufficient arguments for the format, the behavior is
+undefined. If the format is exhausted while arguments remain, the excess
+arguments are evaluated but are otherwise ignored. The printf functions
+return when the end of the format string is encountered.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="format-string"></a>
+
+<hr>
+
+<h2>Format String</h2>
+
+<hr>
+
+<p>The format string is composed of zero or more directives, which are
+ordinary characters <nobr>[except &quot;%&quot;]</nobr>, which are copied
+unchanged to the output stream, and conversion specifications, each of which
+results in fetching zero or more subsequent arguments. Each conversion
+specification is introduced by the <nobr>character &quot;%&quot;</nobr>:</p>
+
+<pre class="example">
+<font color="#AA0000">%</font>[<font color="#0000CC">flags</font>][<font color="#0000CC">field-with</font>][<font color="#0000CC">precision</font>][<font color="#0000CC">data-type</font>]<font color="#880000">conversion-type</font>
+</pre>
+
+<p>After the &quot;%&quot;, the following appear in sequence:</p>
+
+<ul>
+
+<li><p><b>Flags</b> - Zero or more <a href="#flags">flags</a> that modify
+the meaning of the conversion specification.</p></li>
+
+<li><p><b>Field Width</b> - <nobr>An optional</nobr> decimal integer
+specifying a minimum field width. <nobr>If the</nobr> converted value has
+fewer characters than the field width, it will be padded with spaces on the
+left to the field width. <nobr>The field</nobr> is padded on the right if
+the <nobr><a href="#minus-flag">&nbsp;&minus;&nbsp;</a> flag</nobr> has been
+given, or padded with zeros if the
+<nobr><a href="#zero-flag">&nbsp;0&nbsp;</a> flag</nobr> had been
+given. <nobr>A negative</nobr> integer, given as '<nobr>field width</nobr>'
+argument, is interpreted as a
+<nobr><a href="#minus-flag">&nbsp;&minus;&nbsp;</a> flag</nobr> followed by
+a positive <nobr>field width</nobr>.</p></li>
+
+<li><p><b>Precision</b> - <nobr>An optional</nobr> decimal integer that
+gives the minimum number of digits to appear for
+<a href="#integer">integer</a> conversions, the number of digits to appear
+after the
+<nobr>decimal-point</nobr> character for <nobr>floating-point</nobr>
+<nobr><a href="#float-e">&nbsp;e&nbsp;</a></nobr> and
+<nobr><a href="#float-f">&nbsp;f&nbsp;</a></nobr> conversions, or the
+maximum number of significant digits for the <nobr>floating-point</nobr>
+<nobr><a href="#float-g">&nbsp;g&nbsp;</a></nobr> conversion.</p>
+
+<p>The precision takes the form of a period character followed by an
+optional decimal integer:</p>
+
+<pre class="example">
+.[<font color="#0000CC">integer</font>]
+</pre>
+
+<p><nobr>If the</nobr> integer is omitted, it is treated as zero, a
+negative precision argument is taken as if it were missing.</p>
+
+<p><b>Note:</b> <nobr>In C</nobr>, the precision also specifies the
+maximum number of characters to be written from a string in <nobr>'s'
+conversion</nobr>, but &quot;%s&quot; should not be used in the XLISP
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr> or
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+variables, otherwise XLISP will crash.</p></li>
+
+</li>
+
+<li><p><b>Data Type</b> - <nobr>An optional</nobr> character specifying a
+<nobr><a href="#data-type">data type</a></nobr> to be used for the
+conversion.</p>
+
+<p><b>XLISP:</b> Nyquist/XLISP uses <nobr>C 'long'</nobr> signed integers
+and <nobr>C 'double'</nobr> floats only, so with <nobr>floating-point</nobr>
+numbers no special <nobr><a href="#data-type">data type</a></nobr> needs to
+be given, while <a href="#integer">integer</a> conversions should always be
+prefixed by a <nobr>'l' [lowercase L]</nobr>, otherwise the printed
+representation of integer numbers may be differently than the behaviour of
+the Nyquist/XLISP functions.</nobr></p></li>
+
+<li><p><b>Conversion Type</b> - <nobr>A character</nobr> that specifies the
+<nobr><a href="#conversion-type">conversion type</a></nobr> to be
+applied.</p></li>
+
+</ul>
+
+<p><b>Not with Nyquist/XLISP:</b> <nobr>In C</nobr>, a '<nobr>field
+width</nobr>' or 'precision', or both, may be indicated by an asterisk *
+instead of a digit string. In this case, an int argument supplies the field
+width or precision. The arguments specifying field width or precision, or
+both, shall appear [in that order] before the argument [if any] to be
+converted.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="flags"></a>
+
+<hr>
+
+<h2>Flags</h2>
+
+<hr>
+
+<p>The flag characters and their meanings are:</p>
+
+<p><div class="box">
+
+<dl>
+
+<a name="minus-flag"></a>
+
+<dt><p><nobr>&minus;&nbsp; [minus sign character]</nobr></p></dt>
+
+<dd><p>The result of the conversion will be <nobr>left-justified</nobr>
+within the field.</p></dd>
+
+<a name="plus-flag"></a>
+
+<dt><p><nobr>+&nbsp; [plus sign character]</nobr></p></dt>
+
+<dd><p>The result of a signed conversion will always begin with a plus or
+minus sign.</p></dd>
+
+<a name="space-flag"></a>
+
+<dt><p><nobr><i>space</i>&nbsp; [space character]</nobr></p></dt>
+
+<dd><p>If the first character of a signed conversion is not a sign, or if a
+signed conversion results in no characters, a space will be prepended to the
+result. <nobr>If the</nobr> 'space' and
+<nobr><a href="#plus-flag">&nbsp;+&nbsp;</a> flags</nobr> both appear, the
+'space' flag will be ignored.</p></dd>
+
+<a name="hash-flag"></a>
+
+<dt><p><nobr>#&nbsp; [hash character]</nobr></p></dt>
+
+<dd><p>The result is to be converted to an 'alternate form':</p>
+
+<p>Octal Numbers - For o conversion, it increases the precision to force the
+first digit of the result to be a zero.</p>
+
+<p>Hexadecimal Numbers - For x or X conversion, a nonzero result will have
+0x or 0X prepended to it.</p>
+
+<p>Floating-point Numbers - For e, E, f, g, and G conversions, the result
+will always contain a decimal-point character, even if no digits follow it
+(normally, a decimal-point character appears in the result of these
+conversions only if a digit follows it). For g and G conversions, trailing
+zeros will not be removed from the result. For other conversions, the
+behavior is undefined.</p>
+
+</dd>
+
+<a name="zero-flag"></a>
+
+<dt><p><nobr>0&nbsp; [number zero character]</nobr></p></dt>
+
+<dd><p>For integer d, i, o, u, x, X, and floating-point e, E, f, g, G
+conversions, leading zeros [following any indication of sign or base] are
+used to pad to the <nobr><a href="#format-string">field width</a></nobr>.
+<nobr>No <a href="#space-flag">space</a></nobr> padding is performed.
+<nobr>If the</nobr> '0' and
+<nobr><a href="#minus-flag">&nbsp;&minus;&nbsp;</a> flags</nobr> both
+appear, the <nobr>'0' flag</nobr> will be ignored. For integer d, i, o, u,
+x, X conversions, if a <a href="#format-string">precision</a> is specified,
+the <nobr>'0' flag</nobr> will be ignored. <nobr>For other</nobr>
+conversions, the behavior is undefined.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="data-type"></a>
+
+<hr>
+
+<h2>Data Type</h2>
+
+<hr>
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><nobr><b>h</b>&nbsp; [lowercase H character]</nobr></p></dt>
+
+<dd><p>A following d, i, o, u, x, or X conversion specifier applies to a
+short int or unsigned short int argument [the argument will have been
+promoted according to the integral promotions, and its value shall be
+converted to short int or unsigned short int before printing].</p>
+
+<p>A following n conversion specifier applies to a pointer to a short int
+argument.</p></dd>
+
+<dt><p><nobr><b>l</b>&nbsp; [lowercase L character]</nobr></p></dt>
+
+<dd><p>A following d, i, o, u, x, or X conversion specifier applies to a
+long int or unsigned long int argument.</p>
+
+<p>A following n conversion specifier applies to a pointer to a long int
+argument.</p></dd>
+
+<dt><p><nobr><b>L</b>&nbsp; [uppercase L character]</nobr></p></dt>
+
+<dd><p>A following e, E, f, g, or G conversion specifier applies to a long
+double argument.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p>If an h, l, or L appears with any other conversion specifier, the
+behavior is undefined.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="conversion-type"></a>
+
+<hr>
+
+<h2>Conversion Type</h2>
+
+<hr>
+
+<p><b>Integer</b> conversion:</p>
+
+<p><div class="box">
+
+<dl>
+
+<a name="integer"></a>
+
+<dt><p><nobr><b>d</b>, <b>i</b>, <b>o</b>, <b>u</b>, <b>x</b>,
+<b>X</b></nobr></p></dt>
+
+<dd><p>The integer argument is converted to:
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>d</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>signed decimal</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>i</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>signed decimal</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>o</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>unsigned octal</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>u</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>unsigned decimal</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>x</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>unsigned hexadecimal, using 'abcdef'</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td align="center"><nobr>X</nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td><nobr>unsigned hexadecimal, using 'ABCDEF'</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>The <a href="#format-string">precision</a> specifies the minimum number
+of digits to appear. <nobr>If the</nobr> value being converted can be
+represented in fewer digits, it will be expanded with leading zeros. The
+default precision <nobr>is 1</nobr>. The result of converting a zero value
+with an explicit precision of zero results in no characters.</p>
+
+<b>XLISP:</b> Nyquist/XLISP uses <nobr>C 'long'</nobr> signed integers, so
+the integer conversions should always be prefixed by a <nobr>'l' [lowercase
+L]</nobr> indicating a '<nobr>long int</nobr>' <nobr>C
+<a href="#data-type">data type</a></nobr>, otherwise the printed
+representation of integer numbers may be differently than the behaviour of
+the Nyquist/XLISP functions.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p><b>Floating-point</b> conversion:</p>
+
+<p><div class="box">
+
+<dl>
+
+<a name="float-f"></a>
+
+<dt><p><b>f</b></p></dt>
+
+<dd><p>The <nobr>floating-point</nobr> argument of <nobr>C data</nobr> type
+'double' is converted to decimal notation in the style:</p>
+
+<pre class="example">
+[-]<font color="#0000CC">ddd</font>.<font color="#0000CC">ddd</font>
+</pre>
+
+<p>The number of digits after the <nobr>decimal-point</nobr> character
+is equal to the <a href="#format-string">precision</a> specification.
+<nobr>If the</nobr> <a href="#format-string">precision</a> is missing, it is
+taken <nobr>as 6</nobr>. <nobr>If the</nobr>
+<a href="#format-string">precision</a> is explicitly zero, no
+<nobr>decimal-point</nobr> character appears. <nobr>If a</nobr>
+<nobr>decimal-point</nobr> character appears, at least one digit appears
+<nobr>before it</nobr>. <nobr>The value</nobr> is rounded to the appropriate
+number of digits.</p></dd>
+
+<a name="float-e"></a>
+
+<dt><p><b>e</b>, <b>E</b></p></dt>
+
+<dd><p>The <nobr>floating-point</nobr> argument of <nobr>C data</nobr> type
+'double' is converted in the style:</p>
+
+<pre class="example">
+[-]<font color="#0000CC">d</font>.<font color="#0000CC">ddd</font><font color="#AA0000">e</font>+-<font color="#0000CC">dd</font>
+</pre>
+
+<p>There is one digit before the <nobr>decimal-point</nobr> character
+[which is nonzero if the argument is nonzero] and the number of digits after
+it is equal to the <a href="#format-string">precision</a>. <nobr>If
+the</nobr> <a href="#format-string">precision</a> is missing, it is taken
+<nobr>as 6</nobr>. <nobr>If the</nobr>
+<a href="#format-string">precision</a> is zero, no
+<nobr>decimal-point</nobr> character appears. <nobr>The value</nobr> is
+rounded to the appropriate number of digits. <nobr>The exponent</nobr>
+always contains at least two digits. <nobr>If the</nobr> value is zero, the
+exponent is zero. <nobr>The &quot;E&quot;</nobr> conversion specifier will
+produce a number with 'E' instead of 'e' introducing the exponent.</p> </dd>
+
+<a name="float-g"></a>
+
+<dt><p><b>g</b>, <b>G</b></p></dt>
+
+<dd><p>The <nobr>floating-point</nobr> argument of <nobr>C data</nobr> type
+'double' is converted in style <a href="#float-f">&nbsp;f&nbsp;</a> or
+<a href="#float-e">&nbsp;e&nbsp;</a>, or in style
+<a href="#float-e">&nbsp;E&nbsp;</a> in the case of a &quot;G&quot;
+conversion specifier, with the <a href="#format-string">precision</a>
+specifying the number of significant digits. <nobr>If an</nobr> explicit
+<a href="#format-string">precision</a> is zero, it is taken <nobr>as
+1</nobr>. <nobr>The style</nobr> used depends on the value converted.
+<nobr>Style <a href="#float-">&nbsp;e&nbsp;</a></nobr> will be used only if
+the exponent resulting from such a conversion is less <nobr>than -4</nobr>
+or greater than or equal to the <a href="#format-string">precision</a>.
+Trailing zeros are removed from the fractional portion of the result.
+<nobr>A decimal-point</nobr> character appears only if it is followed by
+<nobr>a digit</nobr>.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p>If a conversion specification is invalid, the behavior is undefined.
+<nobr>In no</nobr> case does a nonexistent or small
+<nobr><a href="#format-string">field width</a></nobr> cause truncation of a
+field. <nobr>If the</nobr> result of a conversion is wider than the
+<nobr><a href="#format-string">field width</a></nobr>, the field is expanded
+to contain the conversion result.</p>
+
+<p>The minimum value for the maximum number of characters produced by
+any single conversion shall be 509.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="other-conversion-types"></a>
+
+<hr>
+
+<h2>Other Conversion Types</h2>
+
+<hr>
+
+<p>This section contains a list of all other conversion types defined
+<nobr>in ANSI C</nobr>.</p>
+
+<p><b>Warning:</b> Do <b>not</b> use thse conversions with the XLISP
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr> and
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+variables, because XLISP will produce nonsense or just simply will crash.
+<nobr>The XLISP</nobr> behaviour described below was tested with
+<nobr>Nyquist 3.03</nobr> in <nobr>December 2010</nobr>, compiled with
+<nobr>GCC 4.3.2</nobr> and <nobr>glibc 2.7</nobr> on <nobr>Debian 5
+[Lenny]</nobr>. <nobr>The behaviour</nobr> may be different with different
+Nyquist or XLISP versions, different <nobr>C compilers</nobr> and/or
+libraries, or different operating systems.</p>
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><b>c</b></p></dt>
+
+<dd><p><b>ANSI C:</b> The integer argument is converted to an
+'<nobr>unsigned char</nobr>', and the resulting character is written.</p>
+
+<p><b>XLISP:</b> If the
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr> or
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+is set <nobr>to &quot;%c&quot;</nobr>, then the lowest <nobr>8 bit</nobr>
+of the internal binary representation of the respective numbers will be
+printed as an <a href="ascii-table.htm">ASCII</a> character.</p></dd>
+
+<dt><p><b>s</b></p></dt>
+
+<dd><p><b>ANSI C:</b> The argument shall be a pointer to an array of
+character type. Characters from the array are written up to [but not
+including] a terminating null character. <nobr>If the</nobr>
+<a href="#format-string">precision</a> is specified, no more than that many
+characters are written. <nobr>If the</nobr>
+<a href="#format-string">precision</a> is not specified or is greater than
+the size of the array, the array shall contain a null character.</p>
+
+<b>XLISP:</b> If the
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr> or
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+is set to &quot;%s&quot; and XLISP tries to print a respective number,
+XLISP crashes.</dd>
+
+<dt><p><b>p</b></p></dt>
+
+<dd><p><b>ANSI C:</b> The argument shall be a pointer to 'void'. The value
+of the pointer is converted to a sequence of printable characters, in an
+<nobr>implementation-defined</nobr> manner.</p>
+
+<p><b>XLISP:</b> If the
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr>
+is set <nobr>to &quot;%p&quot;</nobr>, then floating-point numbers are
+printed <nobr>as &quot;(nil)&quot;</nobr>. <nobr>If the</nobr>
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+is set <nobr>to &quot;%p&quot;</nobr>, the integer numbers are printed as
+hexadecimal numbers, prefixed <nobr>with &quot;0x&quot;</nobr>.</p></dd>
+
+<dt><p><b>n</b></p></dt>
+
+<dd><p><b>ANSI C:</b> The argument shall be a pointer to an integer into
+which is written the number of characters written to the output stream so
+far by this call to the <nobr>C 'fprintf'</nobr> function.<nobr> No
+argument</nobr> is converted.</p>
+
+<b>XLISP:</b> If the
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr> or
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+is set to &quot;%n&quot; and XLISP tries to print a respective number,
+XLISP crashes.</dd>
+
+<dt><p><b>%</b></p></dt>
+
+<dd><p><nobr><b>ANSI C:</b> A &quot;%&quot;</nobr> is written. <nobr>No
+argument</nobr> is converted. <nobr>The complete</nobr> conversion
+specification <nobr>shall be &quot;%%&quot;</nobr>.</p>
+
+<b>XLISP:</b> If the
+<nobr><a href="../reference/global-float-format.htm">*float-format*</a></nobr>
+is set to &quot;%g%%&quot; or the
+<nobr><a href="../reference/global-integer-format.htm">*integer-format*</a></nobr>
+is set to &quot;%ld%%&quot; then all respective numbers will be printed
+with a <nobr>trailing &quot;%&quot;</nobr>.</dd>
+
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/misc/links.htm b/docsrc/xlisp/xlisp-doc/misc/links.htm
new file mode 100644
index 0000000..d0e47d7
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/misc/links.htm
@@ -0,0 +1,115 @@
+<html><head>
+<title>Lisp Links</title></head>
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Lisp Links</h1>
+
+<hr>
+
+<p>The most helpful book to learn XLISP I found 'Common Lisp, A Gentle
+Introduction to Symbolic Computation' by David Touretzky, mentioned in the
+Nyquist manual by Roger Dannenberg. The book can be downloaded for free
+from:</p>
+
+<ul>
+<li><nobr><a href="http://www.cs.cmu.edu/~dst/LispBook/index.html"
+>http://www.cs.cmu.edu/~dst/LispBook/index.html</a></nobr></li>
+</ul>
+
+<p>It's a book about Lisp in general, not only about Common Lisp, explaining
+and helping a lot to understand the the fundamental principles of Lisp
+programming.</p>
+
+<p>Unfortunately there seems to be no specific information source about
+XLISP programming in the internet [beside the David Betz manual and the Tim
+I Mikkelsen documents], probably because most Lisp dialects have been merged
+into the Common Lisp standard in the 1980s and 1990s.</p>
+
+<p>As a result of this I first had to learn Common Lisp to be able to
+re-construct how the examples in all the books could work with XLISP. This
+was a quite tedious way to learn and the main reason to start this document
+collection.</p>
+
+<hr>
+
+<h2>XLISP links</h2>
+
+<hr>
+
+<p>The official XLISP homepage is:</p>
+
+<ul>
+<li><a href="http://www.mv.com/ipusers/xlisper/">http://www.mv.com/ipusers/xlisper/</a></li>
+</ul>
+
+<p>The official Nyquist homepage is:</p>
+
+<ul>
+<li><a href="http://www.cs.cmu.edu/~music/music.software.html"
+>http://www.cs.cmu.edu/~music/music.software.html</a></li>
+</ul>
+
+<hr>
+
+<h2>Common Lisp links</h2>
+
+<hr>
+
+<p>Copies of 'Common Lisp, the Language, <nobr>2nd Edition'</nobr> by Guy
+Steele [known as 'CltL2'] can be downloaded in various formats for free
+from the CMU archives:</p>
+
+<ul>
+<li><nobr><a href="http://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html"
+>http://www.cs.cmu.edu/Groups/AI/html/cltl/cltl2.html</a></nobr></li>
+</ul>
+
+<p>It is a quite huge book explaining all details and discussions about the
+Common Lisp standard and is a real good Common Lisp information source.
+Unfortunately it is not very useful for learning XLISP out of it.</p>
+
+<p>The most recent document about the Common Lisp standard is the 'Common
+Lisp Hypespec' [re-worked in 2005]. It is available for online reading
+under:</p>
+
+<ul>
+<li><nobr><a href="http://www.lispworks.com/documentation/HyperSpec/Front/index.htm"
+>http://www.lispworks.com/documentation/HyperSpec/Front/index.htm</a></nobr></li>
+</ul>
+
+<p>or as a 'tar.gz' package for offline reading from:</p>
+
+<ul>
+<li><nobr><a href="ftp://ftp.lispworks.com/pub/software_tools/reference/HyperSpec-7-0.tar.gz"
+>ftp://ftp.lispworks.com/pub/software_tools/reference/HyperSpec-7-0.tar.gz</a></nobr></li>
+</ul>
+
+<p>If you have no idea how to deal with 'tar.gz' packages on Windows
+computers and the 'tar.gz' file doesn't open automatically by clicking on
+it, the probably most easiest way is using the '7-zip' program available for
+free from:</p>
+
+<ul>
+<li><nobr><a href="http://www.7-zip.org/"
+>http://www.7-zip.org/</a></nobr></li>
+</ul>
+
+<br>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/misc/preface.htm b/docsrc/xlisp/xlisp-doc/misc/preface.htm
new file mode 100644
index 0000000..eb3293f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/misc/preface.htm
@@ -0,0 +1,116 @@
+<html><head>
+<title>XLISP Preface</title></head>
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Preface</h1>
+
+<hr>
+
+
+<p>This is a collection of documents about <nobr>'XLISP 2.0'</nobr> as a
+programming language in general. It is intended to be used together with
+Nyquist, a language for composition and sound synthesis. It includes the
+second re-work of the Tim I Mikkelsen 'XLISP Language Reference', linked
+against the original <nobr>'XLISP 2.0</nobr> Manual' by David Betz.</p>
+
+<p>Both manuals are linked against each other and intended to be used as
+'one' manual. You can jump back and forth from a function description in the
+'XLISP Manual' to the description in the 'Language Reference' and vice versa
+with ease.</p>
+
+<p>The navigation bar at the top and the bottom of each page need some
+explanation. From the left to right you will find the following links:</p>
+
+<ul>
+
+<li><p><a href="../start.htm">XLISP</a> - always returns to the main
+page from everywhere, helping you to find your way back if you get lost in
+the information jungle.</p></li>
+
+<li><p><a href="../manual/xlisp-man-index.htm">XLISP 2.0</a> - opens the
+front page of the <nobr>'XLISP 2.0</nobr> Manual' by David Betz with links
+to all chapters so you can read it like a book.</p></li>
+
+<li><p><a href="../manual/contents.htm">Contents</a> - opens
+the detailed contents page of the <nobr>'XLISP 2.0</nobr> Manual' with
+links to all functions and symbols sorted by topic.</p></li>
+
+<li><p><a href="../reference/reference-index.htm">Reference</a> - opens the
+index page of the 'XLISP Language Reference' with links to all XLISP
+functions and symbols sorted in alphabetical order.</p></li>
+
+<li><p>The <font color="#0000CC"><u>Previous</u></font> and <font
+color="#0000CC"><u>Next</u></font> links are a bit tricky. As expected they
+move to the previous and next pages, but in the <nobr>'XLISP 2.0</nobr>
+Manual' they move through the manual while in the 'XLISP Language Reference'
+they move through the reference. This needs some accustomisation but I have
+worked like this during the last few month and found it the best possible
+solution. You can always go back to the pages where you have been before by
+using the 'back' button of your browser.</p></li>
+
+</ul>
+
+<p>During the second re-work of the 'XLISP Language Reference' I have sorted
+out all functions that were related to <nobr>'XLISP 2.1'</nobr> and
+<nobr>'XLISP Plus'.</nobr> They can now be found on their own page under
+<a href="../xlisp-plus/xlisp-plus-index.htm">XLISP Plus Functions</a>.</p>
+
+<p>I also have sorted out of the 'XLISP 2.0 Manual' all functions added by
+Nyquist to the XLISP interpreter to an extra page, for just the simple
+reason that unlike <nobr>XLISP 2.0,</nobr> Nyquist still evolves and it is
+easier to maintain a single page with <nobr><a
+href="../manual/xlisp-man-033.htm">Nyquist Functions</a></nobr> than
+sixteen [or more] functions spread all over the manual.</p>
+
+<hr>
+
+<p>Things still to be done and how you can help:</p>
+
+<hr>
+
+<p>First of all, please note that this is a work in progress and not a final
+version. There probably still are bugs and quirks that need to be resolved
+and you can help by writing an e-mail to
+<a href="mailto:edgar-rft@web.de">edgar-rft@web.de</a> if you find some and
+I will try to fix it as soon as possible.</p>
+
+<p>This does not mean that these documents are 'overloaded with
+bugs' but XLISP was <nobr>[and is]</nobr> an experimental language that
+itself was re-worked several times and most of the time during the last
+months I was busy with sorting out what really matters out of the manuals I
+had collected over a period of two and a half years about several XLISP
+versions and mutations.</p>
+
+<p>In case of doubt I will prefer the Nyquist version of <nobr>XLISP
+2.0</nobr> because this is the version I work with most often and the
+original intention of this document collection was to support the Nyquist
+manual with better XLISP information.</p>
+
+<p>Also please note that I do not want to change the David Betz manual more
+than necessary, because I consider it as the most original information
+source. Instead I whould like to improve the 'XLISP Language <a
+href="../reference/reference-index.htm">Reference</a>' by better
+explanations and source code examples. I also have not tested really *all*
+examples with Nyquist yet. If you find bugs please write me an email.</p>
+
+<p>If you have any further ideas or suggestions how these documents can be
+improved please write to
+<a href="mailto:edgar-rft@web.de">edgar-rft@web.de</a>.</p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/objects/advanced-objects.htm b/docsrc/xlisp/xlisp-doc/objects/advanced-objects.htm
new file mode 100644
index 0000000..925d0a8
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/objects/advanced-objects.htm
@@ -0,0 +1,590 @@
+<html><head>
+
+<title>Advanced XLISP Objects</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Advanced XLISP Objects</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="standard-xlisp-objects">Standard XLISP Objects</a></nobr></li>
+<li><nobr><a href="initializing-class-variables">Initializing Class Variables</a></nobr></li>
+<li><nobr><a href="accessing-class-and-instance-variables">Accessing Class and Instance Variables</a></nobr></li>
+</ol>
+
+<a name="standard-xlisp-objects"></a>
+
+<hr>
+
+<h2>Standard XLISP Objects</h2>
+
+<hr>
+
+<p>Define a class with an instance variable and a class variable:</p>
+
+<pre class="example">
+(setq my-class (send class :new '(instance-var) '(class-var)))
+</pre>
+
+<p>Look at the layout of the new class:</p>
+
+<pre class="example">
+&gt; (send my-class :show)
+Object is #&lt;Object...&gt;, Class is #&lt;Object...&gt;
+ MESSAGES = NIL
+ IVARS = (INSTANCE-VAR)
+ CVARS = (CLASS-VAR)
+ CVALS = #(NIL) <font color="#008844">; default init-value of class variables</font>
+ SUPERCLASS = #&lt;Object...&gt;
+ IVARCNT = 1
+ IVARTOTAL = 1
+#&lt;Object...&gt;
+</pre>
+
+<p>Make an instance of '<nobr>my-class</nobr>':</p>
+
+<pre class="example">
+(setq my-object (send my-class :new))
+</pre>
+
+<p>Look at the layout of the new object:</p>
+
+<pre class="example">
+&gt; (send my-object :show)
+Object is #&lt;Object...&gt;, Class is #&lt;Object...&gt;
+ INSTANCE-VAR = NIL <font color="#008844">; default init-value of instance variables</font>
+#&lt;Object...&gt;
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>Initializing Class Variables</h2>
+
+<hr>
+
+<p><b>1.</b> Add an :isnew <nobr>init-method</nobr> to '<nobr>my-class</nobr>':</p>
+
+<pre class="example">
+(send my-class :answer :isnew nil '((setq class-var 1)))
+</pre>
+
+<p>Now reset the class:</p>
+
+<pre class="example">
+(send my-class :isnew) =&gt; <font color="#AA0000">error: too few arguments</font>
+</pre>
+
+<p>It turns out that :isnew needs at least a list of instance variables plus
+an optional list of class variables:</p>
+
+<pre class="example">
+(send my-class :isnew '(ivar)) <font color="#008844">; overwrites INSTANCE-VAR, deletes CLASS-VAR</font>
+(send my-class :isnew '(ivar) '(cvar))) <font color="#008844">; overwrites INSTANCE-VAR and CLASS-VAR</font>
+</pre>
+
+<p><b>2.</b> Add an :init method to '<nobr>my-class</nobr>':</p>
+
+<pre class="example">
+(send my-class :answer :init nil '((setq class-var 1)))
+</pre>
+
+<p>Now call the :init method:</p>
+
+<pre class="example">
+(send my-class :init) =&gt; <font color="#AA0000">error: no method for this message - :INIT</font>
+</pre>
+
+<p>This is not true, there is an :init method:</p>
+
+<pre class="example">
+&gt; (send my-class :show)
+Object is #&lt;Object...&gt;, Class is #&lt;Object...&gt;
+ MESSAGES = ((<font color="#0000CC">:INIT</font> . <font color="#0000CC">#&lt;Closure-:INIT:...&gt;</font>))
+ IVARS = (INSTANCE-VAR)
+ CVARS = (CLASS-VAR)
+ CVALS = #(NIL)
+ SUPERCLASS = #&lt;Object...&gt;
+ IVARCNT = 1
+ IVARTOTAL = 1
+#&lt;Object...&gt;
+</pre>
+
+<p>The problem here is that in XLISP, methods cannot be called from the
+class they were defined in, methods only can be called from instances, and
+exactly the same happens with manipulating class variables. There seems to
+be no standard XLISP way to initialize class variables with values at the
+time when the class is defined.</p>
+
+<p><b>3.</b> The only way I know in XLISP to initialize a class variable is
+to create an instance of the class and set the class variable e.g. from the
+:isnew method of the instance:</p>
+
+<pre class="example">
+(setq my-object (send my-class :new))
+</pre>
+
+<p>The :isnew method of '<nobr>my-object</nobr>', inherited from
+'<nobr>my-class</nobr>', has set the class variable in
+'<nobr>my-class</nobr>' to a new value:</p>
+
+<pre class="example">
+&gt; (send my-class :show)
+Object is #&lt;Object...&gt;, Class is #&lt;Object...&gt;
+ MESSAGES = ((:ISNEW . #&lt;Closure-:ISNEW:...&gt;))
+ IVARS = (INSTANCE-VAR)
+ CVARS = (CLASS-VAR)
+ CVALS = #(1) <font color="#008844">; new value of CLASS-VAR</font>
+ SUPERCLASS = #&lt;Object...&gt;
+ IVARCNT = 1
+ IVARTOTAL = 1
+#&lt;Object...&gt;
+</pre>
+
+<p>This works, but now I have two problems:</p>
+
+<ol>
+
+<li><p>If a class variable is set from an instance's :isnew method,
+inherited from the superclass, then, whenever an instance is created, the
+class variable will be reset to its initial value. <nobr>Note that</nobr> in
+Lisp, instances can be created at arbitrary <nobr>run-time</nobr>, not only
+at the beginning of a program. Setting class variables from an :isnew method
+can produce unexpected <nobr>side-effects</nobr> if a class variable is used
+for object <nobr>inter-communication</nobr>.</p></li>
+
+<li><p>Because instances can be created at arbitrary runtime, a framework
+would need to be written when a class variable is allowed to be set or reset
+and <nobr>when not</nobr>. <nobr>Ok, if</nobr> class variables are used for
+object <nobr>inter-communication</nobr>, a framework needs to be witten
+anyway, but I do not want to be forced to think about this only because I
+want to initialize a single class variable.</p></li>
+
+</ol>
+
+<p><b>4.</b> Here is a trick I use to initialize class variables.</p>
+
+<p>Create a class with class variables:</p>
+
+<pre class="example">
+(setq my-class (send class :new nil '(cvar-1 cvar-2)))
+</pre>
+
+<p>Add an :isnew method to set the class variables:</p>
+
+<pre class="example">
+(send my-class :answer :isnew nil '((setq cvar-1 "a" cvar-2 "b")))
+</pre>
+
+<p>Create a temporary dummy object to initialize the class variables:</p>
+
+<pre class="example">
+(let ((x (send my-class :new))))
+</pre>
+
+<p>Replace the :isnew method with a dummy version <nobr>[or a</nobr> real
+version, initializing the instance variables]:</p>
+
+<pre class="example">
+(send my-class :answer :isnew nil nil)
+</pre>
+
+<p>Now I have a class with initialized class variables:</p>
+
+<pre class="example">
+&gt; (send my-class :show)
+Object is #&lt;Object...&gt;, Class is #&lt;Object...&gt;
+ MESSAGES = ((:ISNEW . #&lt;Closure-:ISNEW...&gt;)) <font color="#008844">; dummy method</font>
+ IVARS = NIL
+ CVARS = (CVAR-1 CVAR-2) <font color="#008844">; class variables</font>
+ CVALS = #("a" "b") <font color="#008844">; init values</font>
+ SUPERCLASS = #&lt;Object...&gt;
+ IVARCNT = 0
+ IVARTOTAL = 0
+#&lt;Object...&gt;
+</pre>
+
+<p>See defclass below how to make this work automatically.</p>
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>Accessing Class and Instance Variables</h2>
+
+<hr>
+
+<pre class="example">
+(setq my-class (send class :new '(i-var) '(c-var)))
+(setq my-object (send my-class :new))
+</pre>
+
+<p>A message to read internal class and instance variables:</p>
+
+<pre class="example">
+(send my-class :answer :<font color="#0000CC">internal-slot-get</font> '(slot-name)
+ '((eval slot-name)))
+</pre>
+
+<p>A message to write internal class and instance variables:</p>
+
+<pre class="example">
+(send my-class :answer :<font color="#0000CC">internal-slot-set</font> '(slot-name value)
+ '((eval (list 'setq slot-name value))))
+</pre>
+
+<p><div class="box">
+
+<p><b>Implementation Notes</b></p>
+
+<p><b>1.</b> It's not really good Lisp style to explicitely call 'eval' in
+Lisp code at <nobr>run-time</nobr>, because 'eval' produces a lot of
+overhead, but here the only way to get access to the internal environment of
+an object is passing the message arguments to 'eval' inside the object
+itself.</p>
+
+<p><b>2.</b> In the XLISP object system, an :answer message can only be
+accessed in an <b>instance</b> of a class <nobr>[a sub-class</nobr> or on
+object], but not in the class, where the :answer message has been defined,
+so the :internal-slot accessor will only work in '<nobr>my-object</nobr>'
+but ont in '<nobr>my-class</nobr>'.</p>
+
+<p><b>3.</b> If a method had been changed in a superclass, the change will
+automatically be inherited by all instances of the class
+[<nobr>sub-classes</nobr> and objects], with no need to redefine them.</p>
+
+<p><b>Warning:</b> If '<nobr>internal-slot-set</nobr>' is given a
+<nobr>slot-name</nobr> that doesn't exist inside the object, a global
+variable will be created.</p>
+
+</div></p>
+
+<p>Reading and writing an instance variable:</p>
+
+<pre class="example">
+&gt; (send my-object :internal-slot-get 'i-var) <font color="#008844">; read</font>
+NIL
+
+&gt; (send my-object :internal-slot-set 'i-var 55) <font color="#008844">; write</font>
+55
+
+&gt; (send my-object :internal-slot-get 'i-var) <font color="#008844">; read</font>
+55
+
+&gt; (send my-object :show)
+Object is #&lt;Object: #9b95998&gt;, Class is #&lt;Object: #9b95c50&gt;
+ I-VAR = 55 <font color="#008844">; new value</font>
+#&lt;Object: #9b95998&gt;
+</pre>
+
+<p>Reading and writing a class variable:</p>
+
+<pre class="example">
+&gt; (send my-object :internal-slot-get 'c-var) <font color="#008844">; read</font>
+NIL
+
+&gt; (send my-object :internal-slot-set 'c-var 123) <font color="#008844">; write</font>
+123
+
+&gt; (send my-object :internal-slot-get 'c-var) <font color="#008844">; read</font>
+123
+
+&gt; (send my-class :show)
+Object is #&lt;Object: #9b95c50&gt;, Class is #&lt;Object: #9af7dd4&gt;
+ MESSAGES = ((:INTERNAL-SLOT-GET . #&lt;Closure-:INTERNAL-SLOT-GET: #9b90080&gt;)
+ (:INTERNAL-SLOT-SET . #&lt;Closure-:INTERNAL-SLOT-SET: #9b900d4&gt;))
+ IVARS = (I-VAR)
+ CVARS = (C-VAR)
+ CVALS = #(123) <font color="#008844">; new value</font>
+ SUPERCLASS = #&lt;Object: #9af7dc8&gt;
+ IVARCNT = 1
+ IVARTOTAL = 1
+#&lt;Object: #9b95c50&gt;
+</pre>
+
+<p>See the '<nobr>slot-get</nobr>' and '<nobr>slot-set</nobr>' functions
+below how this can be generalized to access any class or instance variable
+in any class or object via only two functions.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="defclass"></a>
+
+<hr>
+
+<h2>defclass</h2>
+
+<hr>
+
+<p>The original RBD 'defclass' macro:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">defclass</font> (name super locals class-vars)
+ (if (not (boundp name))
+ (if super
+ `(setq ,name (send class :new ',locals ',class-vars ,super))
+ `(setq ,name (send class :new ',locals ',class-vars)))))
+</pre>
+
+<p>In order to read or write XLISP class or object variables two
+<nobr>slot-acessor</nobr> messages need to be added to every new
+<nobr>top-level</nobr> class:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">defclass</font> (name super locals class-vars)
+ (when (boundp name)
+ (format t <font color="#880000">";; WARNING: redefining ~a~%"</font> name))
+ (if super
+ `(setq ,name (send class :new ',locals ',class-vars ,super))
+ `(progn
+ (setq ,name (send class :new ',locals ',class-vars))
+ (send ,name :answer :internal-slot-set '(slot-name value)
+ '((eval (list 'setq slot-name value))))
+ (send ,name :answer :internal-slot-get '(slot-name)
+ '((eval slot-name))))))
+</pre>
+
+<p>The third version provides <nobr>'let'-syntax</nobr> with instance and
+class variables. <nobr>A list</nobr> of symbols will create variables
+initialized <nobr>to NIL</nobr>. This is the XLISP default behaviour.
+<nobr>If an</nobr> element is a <nobr>(symbol value)</nobr> list, then the
+variable will be initialized with 'value', as soon as an instance of the
+class is created.</p>
+
+<p><div class="box">
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td colspan="7"><nobr>(<b>defclass</b> <i>class</i> {<i>superclass</i> | NIL}</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code>({</nobr></td>
+ <td align="center"><nobr><i>ivar</i></nobr></td>
+ <td><nobr>&nbsp;|&nbsp;(</nobr></td>
+ <td align="center"><nobr><i>ivar</i></nobr></td>
+ <td><nobr>&nbsp;<i>init-form</i></nobr></td>
+ <td><nobr>)} ... )<code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>; instance variables</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code>({</nobr></td>
+ <td align="center"><nobr><i>cvar</i></nobr></td>
+ <td><nobr>&nbsp;|&nbsp;(</nobr></td>
+ <td align="center"><nobr><i>cvar</i></nobr></td>
+ <td><nobr>&nbsp;<i>init-form</i></nobr></td>
+ <td><nobr>)} ... ))<code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr>; class variables</nobr></td>
+</tr>
+</tbody></table></p>
+
+</div></p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">expand-init-values</font> (vars var-list init-list)
+ (let ((var (gensym)))
+ `(dolist (,var ,vars (setq ,var-list (reverse ,var-list)
+ ,init-list (reverse ,init-list)))
+ (cond ((symbolp ,var)
+ <font color="#008844">;; if the element is a single symbol,</font>
+ <font color="#008844">;; then add it to the variable list</font>
+ (push ,var ,var-list))
+ ((and (listp ,var) (symbolp (first ,var)))
+ <font color="#008844">;; if the element is a (symbol value) list, then add</font>
+ <font color="#008844">;; an (setq symbol value) element to the init-list</font>
+ (push (list 'setq (first ,var) (second ,var)) ,init-list)
+ <font color="#008844">;; and add the symbol to the variable-list</font>
+ (push (first ,var) ,var-list))
+ (t (error <font color="#880000">"bad argument type"</font> ,var))))))
+
+(defmacro <font color="#0000CC">with-unique-names</font> (symbols &rest body)
+ `(let ,(mapcar #'(lambda (x) `(,x (gensym))) symbols) ,@body))
+
+(defmacro <font color="#0000CC">defclass</font> (name super class-vars instance-vars)
+ (with-unique-names (class-list class-init instance-list instance-init x)
+ `(let (,instance-list ,instance-init ,class-list ,class-init)
+ (expand-init-values ',class-vars ,class-list ,class-init)
+ (expand-init-values ',instance-vars ,instance-list ,instance-init)
+ (if (boundp ',name)
+ (format t <font color="#880000">";; Redefining ~a~%"</font> ',name)
+ (format t <font color="#880000">";; CLASS ~a~%"</font> ',name))
+ (format t <font color="#880000">";; CVARS ~a~%"</font> ',class-vars)
+ (format t <font color="#880000">";; IVARS ~a~%"</font> ',instance-vars)
+ ,(if super
+ `(setq ,name (send class :new ,instance-list ,class-list ,super))
+ `(setq ,name (send class :new ,instance-list ,class-list)))
+ <font color="#008844">;; initialize class and instance variables</font>
+ (when ,class-list
+ (send ,name :answer :isnew nil ,class-init)
+ (let ((,x (send ,name :new)))))
+ (when (or ,instance-list ,class-list)
+ (send ,name :answer :isnew nil ,instance-init))
+ <font color="#008844">;; add slot-accessors to top-level classes</font>
+ ,(unless super
+ `(progn
+ (send ,name :answer :internal-slot-set '(slot-name value)
+ '((eval (list 'setq slot-name value))))
+ (send ,name :answer :internal-slot-get '(slot-name)
+ '((eval slot-name))))))))
+</pre>
+
+<p><nobr>Sub-classes</nobr> and objects inherit their acessors from the
+<nobr>super-class</nobr>.</p>
+
+<p>Define a class with an <nobr>instance-variable</nobr>, a
+<nobr>class-variable</nobr> and slot acessors:</p>
+
+<pre class="example">
+&gt; (defclass my-class nil
+ ((a 1) (b 2) (c 3))
+ ((d 4) (e 5) (f 6)))
+
+&gt;
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="slot-value"></a>
+
+<hr>
+
+<h2>Generalized Slot Accessors</h2>
+
+<hr>
+
+<p>Now the slot accessors for internal class and instance variables can be
+defined as ordinary XLISP functions:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">slot-set</font> (object slot-name value)
+ (send object :internal-slot-set slot-name value))
+
+(defun <font color="#0000CC">slot-get</font> (object slot-name)
+ (send object :internal-slot-get slot-name))
+</pre>
+
+<p>Examples:</p>
+
+<pre class="example">
+&gt; (slot-set my-object 'i-var 333)
+333
+
+&gt; (slot-get my-object 'i-var)
+333
+</pre>
+
+<p>Even typing the quote could be saved if 'slot-set' and 'slot-get' are
+defined as macros:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">slot-set</font> (object slot-name value)
+ `(send ,object :internal-slot-set ',slot-name ,value))
+
+(defmacro <font color="#0000CC">slot-get</font> (object slot-name)
+ (send ,object :internal-slot-set ',slot-name ,value))
+</pre>
+
+<p>Examples:</p>
+
+<pre class="example">
+&gt; (slot-set my-object i-var 444)
+444
+
+&gt; (slot-get my-object i-var)
+444
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>Removing a Method from a Class or Instance</h2>
+
+<hr>
+
+<p>In Smalltalk, if a method's body is unbound and no other object refernces
+the method, then the method is automatically garbage collected.
+Unfortunately in XLISP this doesn't work because the instance variables,
+including the list of methods, are not accessed by the garbage collector
+<nobr>at all</nobr>. This means that even if the message body is set to NIL,
+the message is not garbage collected, instead the '<nobr>no function</nobr>'
+message returns NIL and blocks the <nobr>built-in</nobr> search for
+<nobr>super-class</nobr> messages.</p>
+
+<p>Because messages cannot be removed from XLISP objects, the only way to
+make a message 'disappear' is to replage it's body by a call to the
+<nobr>super-class</nobr>, passing the arguments of the original message:</p>
+
+<pre class="example">
+(defun remove-method (object message-selector &rest args)
+ (send object message-selector
+ (send-super message-selector args))
+</pre>
+
+<p>Shit: this doesn't work if the metod is defined in a super-class.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/objects/smalltalk.htm b/docsrc/xlisp/xlisp-doc/objects/smalltalk.htm
new file mode 100644
index 0000000..48c4712
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/objects/smalltalk.htm
@@ -0,0 +1,441 @@
+<html><head>
+
+<title>Smalltalk Object Model</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>The Smalltalk Object Model</h1>
+
+<hr>
+
+<p>This page is based on a document written by Glenn Hollowell:</p>
+
+<ul>
+<li><nobr><a href="http://www.objs.com/x3h7/smalltalk.htm"
+>http://www.objs.com/x3h7/smalltalk.htm</a></nobr></li>
+</ul>
+
+<p>The original document has been adapted for use with the <nobr>XLISP
+2.0</nobr> object system.</p>
+
+<hr>
+
+<h2>1&nbsp; Basic Concepts</h2>
+
+<hr>
+
+<p>Within the context of Smalltalk, objects are implemented in code through
+encapsulation and polymorphism.</p>
+
+<p>Encapsulation is the approach used in Smalltalk to bundle everything
+needed into an object to preserve the integrity of the enclosed data.
+<nobr>The code</nobr> within an object performs operations on the objects
+internal data. Operations in Smalltalk are performed as the result of a
+messages being sent to an object to execute a specific portion of its code,
+usually called <nobr>a 'method'</nobr>.</p>
+
+<p>Polymorphism is the way that the Smalltalk language allows methods of the
+same name to have predictable and meaningful results in related instances,
+yet perform the operations differently to achieve the results.</p>
+
+<p>Polymorphism is typically implemented in Smalltalk through the
+abstraction of the common properties of a group of objects into classes and
+hierarchically subclassing shared properties using inheritance, along with
+specialization of the subclass to define the differences.</p>
+
+<p>Classes serve as templates because they define the instance variables for
+all the class instance variables and methods. <nobr>The instance</nobr> of a
+class is created by sending a
+<a href="../reference/keyword-new.htm">:new</a> message to the class which
+uniquely identifies the object instance and allocates space for its
+variables.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2&nbsp; Objects</h2>
+
+<hr>
+
+<p>An object is an encapsulated software component made up of memory and
+operations that creates a coherent programming entity. All objects are an
+instance of a class. Objects have public and private properties. An object's
+implementation details are private and are hidden from other objects.
+
+<ul>
+
+<li><p>An object's public properties are its messages that make up its
+interface.</p></li>
+
+<li><p>The object's private properties are its variables.</p></li>
+
+</ul>
+
+<p>Interaction with an object only occurs via these messages to its
+interface. <nobr>All object</nobr> instances of a given class have a common
+message interface.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2.1&nbsp; Operations</h2>
+
+<hr>
+
+<p>An operation is the action taken by an object instance as result of a
+message being received through the object's interface. Messages requesting
+operations are addressed to specific recipient object instances, thus
+Smalltalk uses the 'classical' object model and the method to execute in
+response to a message is determined by searching the object's class
+hierarchy.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2.2&nbsp; Requests</h2>
+
+<hr>
+
+<p>A request is act of sending a message to an object's interface with the
+expectation that the object will perform a known operation that is
+associated with the message.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2.3&nbsp; Messages</h2>
+
+<hr>
+
+<p>A message is a request to an object instance to perform an operation. A
+message expression consists of a receiver, selector [message name], and
+potentially some arguments. <nobr>The selector</nobr> must be mapped to a
+method of the same name, encapsulated in the receiver object's class
+hierarchy. <nobr>The arguments</nobr>, if any, are used by the method to
+perform its operation.</p>
+
+<pre class="example">
+(send <font color="#0000CC">receiver :selector</font> [<font color="#0000CC">arguments</font>])
+</pre>
+
+<p>In Smalltalk there exist several message types, like unary, binary, and
+keyword messages. <nobr>In XLISP</nobr> there is only one message type, so
+the description of the Smalltalk message types has been omitted from this
+document.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2.4&nbsp; Specification of Behavioral Semantics</h2>
+
+<hr>
+
+<p>Behavior is defined by methods specified in classes which are implemented
+as class instances and execution is triggered in those instances by message
+requests.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2.5&nbsp; Methods</h2>
+
+<hr>
+
+<p>A method is the executable code rendered in the class and executed in the
+context of an object instance. It defines how to perform an operation in the
+object instance. It is made up of a message pattern that is used to match
+against incoming messages, temporary variables, and a sequence of
+instructions. A method execution is triggered when message is received that
+matches the methods' message pattern.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2.6&nbsp; State</h2>
+
+<hr>
+
+<p>The state of an instance is represented by the values of its instance
+variables.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2.7&nbsp; Object Lifetime</h2>
+
+<hr>
+
+<p>Object instances are created with the
+<a href="../reference/keyword-new.htm">:new</a> method. Each object
+instance is given a unique identifier called an object pointer or object
+reference.</p>
+
+<p><div class="box">
+
+<p>New classes are created by using the "subclass" method. The "new" and
+"subclass" methods are inheritedby almost all classes. Every instance object
+pointer is also associated with an object pointer of a class. Unlike the
+"new" and "subclass" methods, there are no specific methods that remove an
+object that is no longer useful. Smalltalk objects are deleted when they are
+no longer reachable (garbage collected).</p>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2.8&nbsp; Behavior/State Grouping</h2>
+
+<hr>
+
+<p>Smalltalk uses the 'classical' object model.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2.9&nbsp; Communication Model</h2>
+
+<hr>
+
+<p>All communications within Smalltalk occur through messages between
+objects and most Smalltalk implementations support a form of concurrency.
+For example, Smalltalk-80 provides for multiple independent processes, and
+semaphores provide the common mechanism for synchronizing the independent
+processes.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>2.10&nbsp; Events</h2>
+
+<hr>
+
+<p>No specific mechanisms for handling events are built into the
+Smalltalk language, but "event handling" logic is commonly implemented in
+Smalltalk applications through its normal messaging techniques.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>4&nbsp; Polymorphism</h2>
+
+<hr>
+
+<p>Polymorphism is the way that the Smalltalk language allows methods of
+same name to have predictable and meaningful results in related instances,
+yet perform the operations differently to achieve similar results.</p>
+
+<p>Smalltalk supports polymorphism by allowing methods defined in classes to
+be overridden with methods of the same name, but different logic, in a
+subsequent subclass. In addition, methods of the same name can be defined in
+a total different subclass hierarchy.</p>
+
+<p>In the class hierarchy below, all of the lowest level classes are defined
+to accept the message <nobr>'moveForward' (mFabstract)</nobr>, but several
+different versions are implemented as indicated by (MFn) in the diagram.
+<nobr>The message</nobr> sent to the instances of 'Bus' or 'Auto' uses the
+method defined in the 'Motorized' class. <nobr>The same</nobr> method is
+inherited by 'Train' and 'Motorcycle', but both have overridden the
+inherited method by defining a method with different logic using the same
+message pattern. <nobr>All the</nobr> others instances in the diagram have
+the 'moveForward' message pattern in their interface, but are not in the
+'Motorized' inheritance chain. <nobr>All of</nobr> the <nobr>'moveForward'
+(mFabstract)</nobr> methods function as you intuitively expect.</p>
+
+<pre class="example">
+ Transport Mechanism (mFabstract)
+ /--------------- | -------------------\
+Animal Powered Human Powered Motorized
+ / (mF1) \ / \ / (mF5) \
+Buggy Wagon Land-based Water-based Public Private
+ / \ / (mF4) \ / \ / \
+ Bike Skates Row Boat Canoe Bus Train Auto Motorcycle
+ (mF2) (mF3) (mF6) (mF7)
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>5&nbsp; Encapsulation</h2>
+
+<hr>
+
+<p>The approach used in Smalltalk is to encapsulate all objects, whether a
+complex as a sorted list or as simple as a string, into a single programming
+entity that includes data and logic. Further, other objects can not invoke
+the encapsulated data or logic. In order to interact, other objects must
+send messages to an object's interface that will cause the object to perform
+a function that will have a known effect. See also entry under
+<nobr><a href="#2-3">2.3 Messages</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>6&nbsp; Identity, Equality, Copy</h2>
+
+<hr>
+
+<p><div class="box">
+
+<p>Smalltalk provides unique identity for all objects. Objects can be tested
+for equivalence (Are the objects being compared the same object?) and
+equality (every object may implement its own definition of equality).</p>
+
+<p>Copying of objects can be performed as a deep copy (object's structure
+and the objects pointed to by its variables are copied) or shallow copy
+(objects pointed to by variables, their variables are not copied, but are
+shared with the original object).</p>
+
+</div></p>
+
+<p>XLISP does not provide <nobr>build-in</nobr> functions or methods to
+compare or to copy objects.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>7&nbsp; Types and Classes</h2>
+
+<hr>
+
+<p>Smalltalk does not have a separate notion of 'type' [message protocol
+shared by a group of objects] apart from 'class'.</p>
+
+<p>A class is a group of objects that represent the same type of entity and
+share the same methods. A class describes the implementation of a set of
+similar objects. Classes are themselves objects. All objects belong to some
+class and an object is an instance of the class of which it belongs.</p>
+
+<p><b>XLISP:</b> If an object is a member of a class can be tested by
+sending an <a href="../reference/keyword-isa.htm">:isa</a> message.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name=""></a>
+
+<hr>
+
+<h2>8&nbsp; Inheritance and Delegation</h2>
+
+<hr>
+
+<p>Smalltalk class relationships are defined in terms of inheritance. The
+properties of one class are be inherited from another class in a
+hierarchical structure beginning with the <nobr>upper-most</nobr>
+<nobr>class <a href="../reference/object.htm">object</a></nobr>. <nobr>In
+inheritance</nobr>, the inheriting class is called the 'subclass' and the
+class being inherited from is call the 'superclass'. <nobr>A subclass</nobr>
+inherits all of its superclass' variables and methods.</p>
+
+<p>Abstract classes are classes from which other classes are inherited
+(subclassed) only. Instances can be implemented any non-abstract class.</p>
+
+<p>Subclasses are specialization of their superclasses. A subclass may add
+variables, but it cannot delete those inherited from the superclass. A
+subclass may accept an inherited method or it may override the method by
+providing an new method with the same name (or message selector).</p>
+
+<p>Object instances are instances of a class. Smalltalk does not provide for
+delegation (defined as object instances being created from other object
+instances and not a class).</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/reference/abs.htm b/docsrc/xlisp/xlisp-doc/reference/abs.htm
new file mode 100644
index 0000000..3069cb2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/abs.htm
@@ -0,0 +1,78 @@
+<html><head><title>XLISP abs</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>abs</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlisp/xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>abs</b> <i>number</i>)</nobr></dt>
+<dd><i>number</i> - an integer or floating point expression<br>
+returns - the absolute value of the number</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'abs' function computes the absolute value of a number and returns
+the result. <nobr>A 'bad argument</nobr> type' error is signalled if the
+argument is not a numebr.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(abs 1) =&gt; 1
+(abs -99) =&gt; 99
+(abs -99.9) =&gt; 99.9
+(abs -32768) =&gt; 32768
+(abs "123") =&gt; <font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/acos.htm b/docsrc/xlisp/xlisp-doc/reference/acos.htm
new file mode 100644
index 0000000..8351556
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/acos.htm
@@ -0,0 +1,93 @@
+<html><head><title>XLISP acos</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>acos</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr></nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>acos</b> <i>flonum</i>)</nobr></dt>
+<dd><i>flonum</i> - an integer or floating point expression<br>
+returns - the <nobr>arc-cosine</nobr> of the number</dd>
+</dl>
+
+</div></p>
+
+<p><b>Note:</b> the 'acos' function is not implemented in Nyquist. Here
+is a Lisp implementation of 'acos', using the <a href="atan.htm">atan</a>
+function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">acos</font> (x)
+ (cond ((not (numberp x)) (error <font color="#880000">"bad argument type"</font> x))
+ ((= x 1) 0.0)
+ ((= x -1) pi)
+ ((&lt; -1 x 1) (+ (atan (/ (- x) (sqrt (1+ (* x (- (float x))))))) (/ pi 2.0)))
+ (t (error <font color="#880000">"argument out of range"</font> x))))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'acos' function returns the <nobr>arc-cosine</nobr> of an integer or
+floating point expression. <nobr>The result</nobr> is a floating point
+number in radians. <nobr>If the</nobr> argument is less <nobr>than -1</nobr>
+or greater <nobr>than +1</nobr>, the <nobr>arc-cosine</nobr> is a complex
+number. Complex numbers are not available <nobr>in XLISP</nobr>. <nobr>In
+this</nobr> case the 'acos' function signals an 'argument out of range'
+error.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(acos 0.0) =&gt; 1.5708
+(acos 1.0) =&gt; 0.0
+(acos -1.0) =&gt; 3.14159
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/addition.htm b/docsrc/xlisp/xlisp-doc/reference/addition.htm
new file mode 100644
index 0000000..13e925d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/addition.htm
@@ -0,0 +1,87 @@
+<html><head><title>XLISP +</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>+</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(+ <i>expr1</i> ...)</nobr></dt>
+<dd><i>exprN</i> - integer or floating point number/expression<br>
+returns - the result of adding the expressions</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '+' function adds a list of numbers together and returns the
+result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(+ 1) =&gt; 1
+(+ 1 2) =&gt; 3
+(+ 1 2 3) =&gt; 6
+(+ 1 2 3 4) =&gt; 10
+</pre>
+
+<pre class="example">
+&gt; (print (+ 1 2 (* 3.5 (/ 3.9 1.45))))
+12.4138 <font color="#008844">; screen output of PRINT</font>
+12.4138 <font color="#008844">; return value</font>
+</pre>
+
+<p>See <a href="multiplication.htm">&nbsp;*&nbsp;</a>,
+<a href="division.htm">&nbsp;/&nbsp;</a>, <a href="print.htm">print</a>.
+XLISP first prints the value on the screen, the second number is the
+return value.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/address-of.htm b/docsrc/xlisp/xlisp-doc/reference/address-of.htm
new file mode 100644
index 0000000..07190d2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/address-of.htm
@@ -0,0 +1,99 @@
+<html><head><title>XLISP address-of</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>address-of</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>address-of</b> <i>expr</i>)</dt>
+<dd>expr - an expression<br>
+returns - the memory address of the expression as an integer</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'address-of' function returns the internal memory address of the
+XLISP node that corresponds to 'expr'. The value returned is an integer.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq var 0) =&gt; 0 <font color="#008844">; set up VAR with 0</font>
+(address-of var) =&gt; 123224
+(address-of 'var) =&gt; 182638
+(peek (address-of var)) =&gt; 83951616
+(peek (1+ (address-of var))) =&gt; 16777216
+(peek (+ 2 (address-of var))) =&gt; 0 <font color="#008844">; value of VAR</font>
+(setq var 14) =&gt; 14 <font color="#008844">; change the value to 14</font>
+(peek (+ 2 (address-of var))) =&gt; 14
+(setq var 99) =&gt; 99 <font color="#008844">; change the value to 99</font>
+(peek (+ 2 (address-of var))) =&gt; 99
+</pre>
+
+<p>See <a href="addition.htm">&nbsp;+&nbsp;</a>,
+<a href="increment.htm">1+</a>, <a href="peek.htm">peek</a>,
+<a href="setq.htm">setq</a>.</p>
+
+<p><div class="box">
+
+<p><b>Nyquist:</b> The '<nobr>address-of</nobr>' function is internally
+disabled, but the code still exists. Look out for PEEK_AND_POKE in the
+Nyquist source code.</p>
+
+<p><b>Caution:</b> Be careful when modifying the internal state of XLISP.
+<nobr>If you</nobr> have modified it, it would be a good idea to exit XLISP
+and <nobr>re-enter</nobr> before doing any work you really want to
+retain.</p>
+
+</div></p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#system-functions">System Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/alloc.htm b/docsrc/xlisp/xlisp-doc/reference/alloc.htm
new file mode 100644
index 0000000..22feb53
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/alloc.htm
@@ -0,0 +1,98 @@
+<html><head><title>XLISP alloc</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>alloc</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xldmem.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>alloc</b> <i>size</i>)</nobr></dt>
+<dd><i>size</i> - the number of nodes to allocate as an integer<br>
+returns - the old number of nodes to allocate</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'alloc' function changes the number of memory nodes allocated per
+segment whenever memory is expanded. <nobr>The previous</nobr> number of
+nodes allocated per segment is the value returned as the result. <nobr>The
+power-up</nobr> default is 1000 nodes per segment. <nobr>Note that</nobr>
+'alloc' does not, itself, expand memory. You need to call the
+<a href="expand.htm">expand</a> function to do the expand operation.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+&gt; (room)
+Nodes: 4000
+Free nodes: 1669
+Segments: 4
+Allocate: 1000 <font color="#008844">; default ALLOC value</font>
+Total: 52570
+Collections: 8
+NIL
+
+&gt; (alloc 2000) <font color="#008844">; new ALLOC value</font>
+1000 <font color="#008844">; old ALLOC value</font>
+
+&gt; (room)
+Nodes: 4000
+Free nodes: 1655
+Segments: 4
+Allocate: 2000 <font color="#008844">; new ALLOC value</font>
+Total: 52570
+Collections: 8
+NIL
+</pre>
+
+<p>See <a href="room.htm">room</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#system-functions">System Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/alphanumericp.htm b/docsrc/xlisp/xlisp-doc/reference/alphanumericp.htm
new file mode 100644
index 0000000..9067193
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/alphanumericp.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP alphanumericp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>alphanumericp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>alphanumericp</b> <i>char</i>)</dt>
+<dd>char - a character expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the character
+is alphabetic or a digit, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p> The 'alphanumericp' function checks if the 'char' expression is an
+alphabetic or a digit character. <nobr>If 'char'</nobr> is an alphabetic
+[either an upper or lower case] or a digit character,
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned, otherwise
+<a href="nil.htm">NIL</a> is returned. Note that XLISP is limited to
+<a href="../misc/ascii-table.htm">ASCII</a> characters, so there is no way
+to find out if an Unicode character with a
+<nobr><a href="char-code.htm">char-code</a></nobr> greater than
+<nobr>ASCII 127</nobr> is alphanumeric <nobr>or not</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(alphanumericp #\A) =&gt; T
+(alphanumericp #\a) =&gt; T
+(alphanumericp #\1) =&gt; T
+(alphanumericp #\[) =&gt; NIL
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/and.htm b/docsrc/xlisp/xlisp-doc/reference/and.htm
new file mode 100644
index 0000000..1a2c3d9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/and.htm
@@ -0,0 +1,118 @@
+<html><head><title>XLISP and</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>and</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>and</b> [<i>expr1</i> ... ])</nobr></dt>
+<dd><i>exprN</i> - an expression<br>
+returns - <a href="nil.htm">NIL</a> if any expression evaluates
+to <nobr><a href="nil.htm">NIL</a> ,</nobr> otherwise the value
+of the last expression<br>
+<b>Note:</b> evaluation of expressions stops after the first
+expression that evaluates to <a href="nil.htm">NIL</a></dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'and' special form evaluates a sequence of expressions and returns
+the effect of a logical AND on the expressions. <nobr>If, at</nobr> any
+point, an expression is <a href="nil.htm">NIL</a>, then
+<a href="nil.htm">NIL</a> is returned as the result of the 'and'
+function. <nobr>If all</nobr> of the expressions have a
+<nobr>non-<a href="nil.htm">NIL</a></nobr> value, the value of the last
+expression is returned as the result. Evaluation of the expressions will
+stop when an expression evaluates <nobr>to <a href="nil.htm">NIL</a></nobr>,
+none of the subsequent expressions will be evaluated. <nobr>If there</nobr>
+are no expressions, then 'and' returns <a href="t.htm">&nbsp;T&nbsp;</a>
+as its result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(and t t t) =&gt; T</font>
+(and nil t) =&gt; NIL</font>
+(and t nil) =&gt; NIL</font>
+(and) =&gt; T</font>
+</pre>
+
+<p>Some more practical examples:</p>
+
+<pre class="example">
+&gt; (and T "boo" "hiss" T "rah")
+"rah" <font color="#008844">; return value of AND</font>
+
+&gt; (and (princ "hi") NIL (princ "ho"))
+hi <font color="#008844">; prints "hi"</font>
+NIL <font color="#008844">; return value of AND</font>
+</pre>
+
+See <a href="princ.htm">princ</a>.
+
+<pre class="example">
+> (setq a 5 b 6) <font color="#008844">; set up A and B</font>
+6 <font color="#008844">; return value of SETQ</font>
+
+> (if (and (numberp a) <font color="#008844">; if A is a number</font>
+ (numberp b) <font color="#008844">; and B is a number</font>
+ (&lt; a b)) <font color="#008844">; and A &lt; B</font>
+ (print "A is less than B") <font color="#008844">; then do this</font>
+ (print "error")) <font color="#008844">; else do this</font>
+"A is less than B" <font color="#008844">; screen output of PRINT</font>
+"A is less than B" <font color="#008844">; return value of IF</font>
+</pre>
+
+<p>See <a href="number-lessp.htm">&nbsp;&lt;&nbsp;</a>,
+<a href="if.htm">&nbsp;if&nbsp;</a>, <a href="print.htm">print</a>,
+<a href="setq.htm">setq</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#control-constructs">Control Constructs</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">XLISP</a> &gt;
+<a href="../manual/xlisp-man-index.htm">XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a>&nbsp; -&nbsp;
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/append.htm b/docsrc/xlisp/xlisp-doc/reference/append.htm
new file mode 100644
index 0000000..4d7b54a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/append.htm
@@ -0,0 +1,90 @@
+<html><head><title>XLISP append</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+
+<h1>append</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>append</b> [<i>expr</i> ... ])</dt>
+<dd><i>expr</i> - a list or list expression<br>
+returns - the new list</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'append' function takes an arbitrary number of lists and splices them
+together into a single list. This single list is returned. <nobr>If
+an</nobr> empty list <a href="nil.htm">NIL</a> is appended, it has no
+effect, it does not appear in the final list. Remember that '(nil) is not an
+empty list. <nobr>If a</nobr> list is appended to an atom, it also has no
+effect and the atom will not appear in the final list.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(append) =&gt; NIL
+(append 'a 'b) =&gt; B
+(append '(a) '(b)) =&gt; (A B)
+(append 'a '(b)) =&gt; (B)
+(append '(a) 'b) =&gt; (A . B)
+(append '(a) nil) =&gt; (A)
+(append (list 'a 'b) (list 'c 'd)) =&gt; (A B C D)
+(append '(a (b)) '(c (d))) =&gt; (A (B) C (D))
+(append '(a) nil nil nil '(b)) =&gt; (A B)
+(append '(a) '(nil) '(b)) =&gt; (A NIL B)
+</pre>
+
+<p><b>Note:</b> If a list is appended to an atom, XLISP signals no error,
+the atom just disappears!</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#list-functions">List Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/apply.htm b/docsrc/xlisp/xlisp-doc/reference/apply.htm
new file mode 100644
index 0000000..acc5f05
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/apply.htm
@@ -0,0 +1,89 @@
+<html><head><title>XLISP apply</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>apply</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>apply</b> <i>function args</i>)</dt>
+<dd><i>function</i> - the function or symbol to be applied to 'args'<br>
+<i>args</i> - a list that contains the arguments to be passed to 'function'<br>
+returns - the result of applying the function to the arguments</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'apply' function causes 'function' to be evaluated with 'args' as the
+parameters, returning the result of 'function'. The 'args' argument must be
+a list.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+&gt; (defun my-add (x y) <font color="#008844">; define MY-ADD function</font>
+ (+ x y))
+MY-ADD
+
+&gt; (my-add 1 2) <font color="#008844">; ordinary function call</font>
+3 <font color="#008844">; returns 3</font>
+
+&gt; (apply #'my-add '(2 4)) <font color="#008844">; symbol-function applied to argument-list</font>
+6 <font color="#008844">; returns 6</font>
+</pre>
+
+<p><b>Note:</b> When using 'apply' to cause the evaluation of a function,
+you can use the <nobr>sharp-quoted</nobr> name of the function like
+#'my-add in the example, or <nobr>(function my-add)</nobr>. <nobr>In
+XLISP</nobr> also <nobr>'my-add</nobr> and <nobr>(quote my-add)</nobr> work,
+but this is no good Lisp style.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#evaluation-functions">Evaluation Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/aref.htm b/docsrc/xlisp/xlisp-doc/reference/aref.htm
new file mode 100644
index 0000000..68ad742
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/aref.htm
@@ -0,0 +1,105 @@
+<html><head><title>XLISP aref</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>aref</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>aref</b> <i>array element</i>)</dt>
+<dd><i>array</i> - an array expression<br>
+<i>element</i> - an integer expression<br>
+returns - the value of the array element</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'aref' function returns the specified element out of a previously
+created array. Array elements may be any valid lisp data type, including
+lists or arrays. Arrays made by <a href="make-array.htm">make-array</a> and
+accessed by 'aref' are <nobr>base 0</nobr>. This means the first element is
+accessed by element <nobr>number '0'</nobr> and the last element is accessed
+by element <nobr>number 'n-1'</nobr> [where 'n' is the array size]. Array
+elements are initialized to <a href="nil.htm">NIL</a>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq my-array '#(0 1 2 3 4)) =&gt; #(0 1 2 3 4)
+(aref my-array 0) =&gt; 0
+(aref my-array 4) =&gt; 4
+(aref my-array 5) =&gt; <font color="#AA0000">error: array index out of bounds - 5</font>
+my-array =&gt; #(0 1 2 3 4)
+
+(setq new (make-array 4)) =&gt; #(NIL NIL NIL NIL)
+(setf (aref new 0) (make-array 4)) =&gt; #(NIL NIL NIL NIL)
+new =&gt; #(#(NIL NIL NIL NIL) NIL NIL NIL)
+(setf (aref (aref new 0) 1) 'a) =&gt; A
+new =&gt; #(#(NIL A NIL NIL) NIL NIL NIL)
+(setf (aref new 2) '(a b c)) =&gt; (A B C)
+new =&gt; #(#(NIL A NIL NIL) NIL (A B C) NIL)
+</pre>
+
+<p><b>Read macro:</b> There is a built-in read-macro for arrays,
+<nobr>'#(...)'</nobr> <nobr>[the hash</nobr> symbol with the array elements
+in parentheses]. This allows you to create arbitrary arrays with initial
+values without going through a <a href="make-array.htm">make-array</a>
+function. See the <a href="../manual/xlisp.htm#the-readtable">Readtable</a>
+section in the <nobr>XLISP 2.0</nobr> Manual.</p>
+
+<p><b>Note:</b> This function returns the value of an array element.
+However, there is no equivalent direct function to set the value of an array
+element to some value. <nobr>To set</nobr> an element value, you must use
+the <a href="setf.htm">setf</a> function.
+<nobr>The <a href="setf.htm">setf</a></nobr> function is a generalized
+function that allows you to set the value of arbitrary lisp entities.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#array-functions">Array Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/arrayp.htm b/docsrc/xlisp/xlisp-doc/reference/arrayp.htm
new file mode 100644
index 0000000..139fc4d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/arrayp.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP arrayp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>arrayp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>arrayp</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - an arbitrary Lisp expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the value is an
+array, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'arrayp' function checks if 'expr' evaluates to an array.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr' evaluates to an
+array, <a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(arrayp #(0 1 2)) =&gt; T <font color="#008844">; array</font>
+(setq a #(a b c)) =&gt; #(A B C))
+(arrayp a) =&gt; T <font color="#008844">; evaluates to an array</font>
+(arrayp '(a b c)) =&gt; NIL <font color="#008844">; list</font>
+(arrayp 1) =&gt; NIL <font color="#008844">; integer</font>
+(arrayp 1.2) =&gt; NIL <font color="#008844">; float</font>
+(arrayp 'a) =&gt; NIL <font color="#008844">; symbol</font>
+(arrayp #\a) =&gt; NIL <font color="#008844">; character</font>
+(arrayp NIL) =&gt; NIL <font color="#008844">; NIL</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#predicate-functions">Predicate Functions</a></nobr></li>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#array-functions">Array Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/asin.htm b/docsrc/xlisp/xlisp-doc/reference/asin.htm
new file mode 100644
index 0000000..cd7d7fa
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/asin.htm
@@ -0,0 +1,93 @@
+<html><head><title>XLISP asin</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>asin</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr></nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>asin</b> <i>expr</i>)</nobr></dt>
+<dd><i>expr</i> - floating point number/expression<br>
+returns - the arcsine of the number</dd>
+</dl>
+
+</div></p>
+
+<p><b>Note:</b> The 'asin' function is not imlemented in Nyquist. Here is a
+Lisp implementation of 'asin', using the <a href="atan.htm">atan</a>
+function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">asin</font> (x)
+ (cond ((not (numberp x)) (error <font color="#880000">"bad argument type"</font> x))
+ ((= x 1) (/ pi 2.0))
+ ((= x -1) (/ pi -2.0))
+ ((&lt; -1 x 1) (atan (/ x (sqrt (1+ (* x (- x)))))))
+ (t (error <font color="#880000">"argument out of range"</font> x))))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'asin' function returns the <nobr>arc sine</nobr> of a floating point
+expression. <nobr>The result</nobr> is a floating point number in radians.
+<nobr>If the</nobr> argument is less <nobr>than -1</nobr> or greater
+<nobr>than +1</nobr>, the <nobr>arc sine</nobr> is a complex number. Complex
+numbers are not available <nobr>in XLISP</nobr>. <nobr>In this</nobr> case
+the 'asin' function signals an 'argument out of range' error.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(asin 0.0) =&gt; 0.0
+(asin 1.0) =&gt; 1.5708
+(asin -1.0) =&gt; -1.5708
+(asin 0) =&gt; <font color="#AA0000">error: bad integer operation</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/assoc.htm b/docsrc/xlisp/xlisp-doc/reference/assoc.htm
new file mode 100644
index 0000000..ab1344a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/assoc.htm
@@ -0,0 +1,121 @@
+<html><head><title>XLISP assoc</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>assoc</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>assoc</b> <i>expr a-list</i> [{:test | :test-not} <i>test</i>])</dt>
+<dd><i>expr</i> - the expression to find as an atom or list<br>
+<i>a-list</i> - the association list to search<br>
+<i>test</i> - optional test function (default is <a href="eql.htm">eql</a>)<br>
+returns - the alist entry or <a href="nil.htm">NIL</a></dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>An association list is a collection of list pairs of the form:</p>
+
+<pre class="example">
+((<font color="#0000CC">key1 item1</font>) (<font color="#0000CC">key2 item2</font>) ... (<font color="#0000CC">keyN itemN</font>))
+</pre>
+
+<p>The 'assoc' function searches through an association list
+'<nobr>a-list</nobr>' looking for the key
+<nobr>[a <a href="car.htm">car</a></nobr> in an association pair] that
+matches the search 'expr'. <nobr>If a</nobr> match is found, that
+association pair is returned as the result. <nobr>If no</nobr> match is
+found, <nobr><a href="nil.htm">NIL</a> is</nobr> returned. <nobr>You
+may</nobr> specify your own test with the ':test' and
+'<nobr>:test-not</nobr>' keywords followed by the 'test' you wish to
+perform.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mylist '((a . my-a)
+ (b . his-b)
+ (c . her-c)
+ (d . end)))
+
+(assoc 'a mylist) =&gt; (A . MY-A)
+(assoc 'b mylist) =&gt; (B . HIS-B)
+(assoc 1 mylist) =&gt; NIL
+</pre>
+
+<pre class="example">
+(setq agelist '((1 (bill bob))
+ (2 (jane jill))
+ (3 (tim tom))
+ (5 (larry daryl daryl))))
+
+(assoc 1 agelist) =&gt; (1 (BILL BOB))
+(assoc 3 agelist :test #'&gt;=) =&gt; (1 (BILL BOB))
+(assoc 3 agelist :test #'&lt;) =&gt; (5 (LARRY DARYL DARYL))
+(assoc 3 agelist :test #'&lt;=) =&gt; (3 (TIM TOM))
+(assoc 3 agelist :test-not #'&gt;=) =&gt; (5 (LARRY DARYL DARYL))
+</pre>
+
+<p>Using a list as key, tested with <a href="equal.htm">equal</a>:</p>
+
+<pre class="example">
+&gt; (assoc '(a b) '(((c d) e) ((a b) x)) :test #'equal)
+((A B) X)
+</pre>
+
+<p><b>Note:</b> The 'assoc' function can work with a list or string as the
+'expr'. However, the default <a href="eql.htm">eql</a> test does
+not work with lists or strings, only symbols and numbers.
+<nobr>To make</nobr> this work, you need to use the ':test' keyword along
+with <a href="equal.htm">equal</a> <nobr>for 'test'</nobr>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#list-functions">List Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/atan.htm b/docsrc/xlisp/xlisp-doc/reference/atan.htm
new file mode 100644
index 0000000..27d67b5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/atan.htm
@@ -0,0 +1,77 @@
+<html><head><title>XLISP atan</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>atan</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>atan</b> <i>expr</i> [<i>expr2</i>])</dt>
+<dd><i>expr</i> - an integer or floating point expression<br>
+<i>expr2</i> - an optional divisor [default value <nobr>is 1.0]</nobr><br>
+returns - the arctangent of the division of <i>expr</i> and <i>expr2</i></dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'atan' function returns the arc tangent of the division of 'expr' and
+'expr2'. <nobr>The result</nobr> is in radians.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(atan 0.0) =&gt; 0
+(atan 1.0) =&gt; 0.785398
+(atan -1.0) =&gt; -0.785398
+(atan 0) =&gt; 0
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/atom.htm b/docsrc/xlisp/xlisp-doc/reference/atom.htm
new file mode 100644
index 0000000..fed7af5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/atom.htm
@@ -0,0 +1,90 @@
+<html><head><title>XLISP atom</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>atom</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>atom</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - an arbitrary Lisp expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the value is
+an atom, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'atom' predicate function tests if the 'expr' is an atom.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr' is an
+atom, <a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(atom 'a) =&gt; T <font color="#008844">; symbol</font>
+(atom #'atom) =&gt; T <font color="#008844">; subr - function</font>
+(atom "string") =&gt; T <font color="#008844">; string</font>
+(atom 4) =&gt; T <font color="#008844">; integer</font>
+(atom 4.5) =&gt; T <font color="#008844">; float</font>
+(atom object) =&gt; T <font color="#008844">; object</font>
+(atom #(1 2 3)) =&gt; T <font color="#008844">; array</font>
+(atom #'quote) =&gt; T <font color="#008844">; fsubr</font>
+(atom *standard-output*) =&gt; T <font color="#008844">; stream</font>
+(atom '()) =&gt; T <font color="#008844">; NIL is an atom</font>
+(atom (lambda (x) (print x))) =&gt; T <font color="#008844">; closure</font>
+(atom '(a b c)) =&gt; NIL <font color="#008844">; list</font>
+(setq a '(a b)) =&gt; (A B)
+(atom a) =&gt; NIL <font color="#008844">; value of A is not an atom</font>
+</pre>
+
+<p><b>Note:</b> <a href="nil.htm">NIL</a> or '() is used in many places as a
+list or atom expression. Both 'atom' and <a href="listp.htm">listp</a>, when
+applied to <a href="nil.htm">NIL</a>, return
+<a href="t.htm">&nbsp;T&nbsp;</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#predicate-functions">Predicate Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">XLISP</a> &gt;
+<a href="../manual/xlisp-man-index.htm">XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a>&nbsp; -&nbsp;
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/backquote.htm b/docsrc/xlisp/xlisp-doc/reference/backquote.htm
new file mode 100644
index 0000000..8cb8b59
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/backquote.htm
@@ -0,0 +1,170 @@
+<html><head><title>XLISP backquote</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>backquote</h1>
+
+<hr>
+
+<p>backquote:</p>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c, xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>comma, comma-at:</p>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>reader expansion</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c, xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>backquote</b> expr)</dt>
+<dd><i>expr</i> - an expression which is not evaluated except for 'comma' and 'comma-at' portions<br>
+<i>returns</i> - a copy of the template with 'comma' and 'comma-at' expressions expanded</dd>
+</dl>
+
+<dl>
+<dt>(<b>comma</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - an expression which is evaluated within a backquoted expression</dd>
+</dl>
+
+<dl>
+<dt>(<b>comma-at</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - an expression which is evaluated within a backquoted expression</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'backquote' special form returns 'expr' unevaluated, like
+<a href="quote.htm">quote</a>. The difference is that portions of the
+expression may be evaluated when they are preceeded by a 'comma' or
+'<nobr>comma-at</nobr>'.</p>
+
+<ul>
+
+<li><p><b>comma</b> will evaluate the portion of the expression the comma
+preceeds. <nobr>If the</nobr> portion is an atom or a list, it is placed as
+is within the expression.</p></li>
+
+<li><p><nobr><b>comma-at</b></nobr> will evaluate the portion of the
+expression that the <nobr>'comma-at</nobr>' preceeds. <nobr>The
+portion</nobr> needs to be a list. <nobr>The list</nobr> is spliced into the
+expression. <nobr>If the</nobr> portion is not a list,
+'<nobr>comma-at</nobr>' will splice in nothing.</p></li>
+
+</ul>
+
+<p>XLISP supports the following read macros:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button" align="right"><nobr><code>`<font color="#0000CC">expression</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;&rarr;&nbsp;&nbsp;</nobr></td>
+ <td class="button" align="right"><nobr><code>(backquote <font color="#0000CC">expression</font>)</code></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button" align="right"><nobr><code>,<font color="#0000CC">expression</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;&rarr;&nbsp;&nbsp;</nobr></td>
+ <td class="button" align="right"><nobr><code>(comma <font color="#0000CC">expression</font>)</code></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button" align="right"><nobr><code>,@<font color="#0000CC">expression</font></code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;&rarr;&nbsp;&nbsp;</nobr></td>
+ <td class="button" align="right"><nobr><code>(comma-at <font color="#0000CC">expression</font>)</code></nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq box 'stuff-inside) =&gt; STUFF-INSIDE <font color="#008844">; BOX contains STUFF-INSIDE</font>
+(print box) =&gt; STUFF-INSIDE
+
+'(i have the box) &equiv; (quote (i have the box)) =&gt; (I HAVE THE BOX)
+`(i have the box) &equiv; (backquote (i have the box)) =&gt; (I HAVE THE BOX)
+`(i have the ,box) &equiv; (backquote (i have the (comma box))) =&gt; (I HAVE THE STUFF-INSIDE)
+`(i have the ,@box) &equiv; (backquote (I have the (comma-at box))) =&gt; (I HAVE THE) <font color="#008844">; STUFF-INSIDE is not a list</font>
+
+(setq automobile '(a van)) =&gt; (A VAN) <font color="#008844">; AUTOMOBILE is a VAN</font>
+(print automobile) =&gt; (A VAN)
+
+'(I have automobile) &equiv; (quote (I have automobile)) =&gt; (I HAVE AUTOMOBILE)
+`(I have automobile) &equiv; (backquote (I have automobile)) =&gt; (I HAVE AUTOMOBILE)
+`(I have ,automobile) &equiv; (backquote (I have (comma automobile))) =&gt; (I HAVE (A VAN))
+`(I have ,@automobile) &equiv; (backquote (I have (comma-at automobile))) =&gt; (I HAVE A VAN)
+</pre>
+
+<p>Common errors:</p>
+
+<pre class="example">
+`(,@(i am a list)) =&gt; <font color="#AA0000">error: bad function - I</font>
+`(,@'(i am a list)) =&gt; (I AM A LIST)
+</pre>
+
+<p><b>Note:</b> 'backquote', 'comma', and 'comma-at' are very useful in
+defining macros via <a href="defmacro.htm">defmacro</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#evaluation-functions">Evaluation Functions</a></nobr></li>
+<li><nobr>XLISP 2.0 Manual &rarr; <a href="../manual/xlisp.htm#the-readtable">Readtable</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/baktrace.htm b/docsrc/xlisp/xlisp-doc/reference/baktrace.htm
new file mode 100644
index 0000000..1128206
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/baktrace.htm
@@ -0,0 +1,117 @@
+<html><head><title>XLISP baktrace</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>baktrace</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xldbug.c, xlsys.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>baktrace</b> [<i>level</i>])</dt>
+<dd><i>level</i> - an optional integer expression<br>
+returns - <a href="nil.htm">NIL</a></dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p> The 'baktrace' function is used to examine the system execution stack
+from within the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a>.</nobr> It
+shows the nested forms that got the system to the current state. The
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr> can be
+entered by a system error, or by the Nyquist/XLISP
+<a href="error.htm">error</a>, <a href="cerror.htm">cerror</a>, or
+<a href="break.htm">break</a> functions. <nobr>If the</nobr> 'levels'
+parameter is not specified, all the nested forms will be shown back to the
+main loop form that started the execution. <nobr>If 'level'</nobr> is
+specified the most recent 'level' nested forms will be shown.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun out (x)
+ (print x)
+ (mid 99))
+
+(defun mid (x)
+ (print x)
+ (in 999))
+
+(defun in (x)
+ (print x)
+ (break "in" x)) <font color="#008844">; break</font>
+
+&gt; (out 9)
+9
+99
+999
+<font color="#AA0000">break: in - 999</font>
+<font color="#AA0000">if continued: return from BREAK</font>
+
+1&gt; (baktrace) <font color="#008844">; the 1 before the &gt; indicates a break loop</font>
+Function: #&lt;Subr-BAKTRACE: #9af6688&gt;
+Function: #&lt;Subr-BREAK: #9af6778&gt;
+Arguments:
+ "in"
+ 999
+Function: #&lt;Closure-IN: #9b99574&gt;
+Arguments:
+ 999
+Function: #&lt;Closure-MID: #9b99670&gt;
+Arguments:
+ 99
+Function: #&lt;Closure-OUT: #9b99778&gt;
+Arguments:
+ 9
+NIL
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#debugging-and-error-handling">Debugging and Error Handling</a></nobr></li>
+<li><nobr>XLISP 2.0 Manual &rarr; <a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/bigendianp.htm b/docsrc/xlisp/xlisp-doc/reference/bigendianp.htm
new file mode 100644
index 0000000..38037cb
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/bigendianp.htm
@@ -0,0 +1,69 @@
+<html><head><title>XLISP bigendianp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>bigendianp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>bigendiap</b>)</dt>
+<dd>returns - <a href="t.htm">&nbsp;T&nbsp;</a> with a <nobr>big-endian</nobr>
+architecture, <nobr>otherwise <a href="nil.htm">NIL</a>.</nobr></dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '<nobr>bigendianp</nobr>' function tests if Nyquist/XLISP runs on a
+bigendian machine, storing the <nobr>high-order</nobr> byte of an integer at
+the lowest byte address of the integer.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#predicate-functions">Predicate Functions</a></nobr></li>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#file-io-functions">File I/O Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/block.htm b/docsrc/xlisp/xlisp-doc/reference/block.htm
new file mode 100644
index 0000000..7d3e21d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/block.htm
@@ -0,0 +1,94 @@
+<html><head><title>XLISP block</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>block</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><b>(block</b> <i>name</i> [<i>body</i> ... ])</dt>
+<dd><i>name</i> - an unevaluated symbol for the block name<br>
+<i>body</i> - an arbitrary number of Lisp expressions<br>
+returns - the value of the last expression</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'block' special form specifies a '<nobr>named block</nobr>'
+construct. <nobr>The last</nobr> expression in 'body' will be returned by
+the 'block' construct as its result unless a <a href="return.htm">return</a>
+or <a href="return-from.htm">return-from</a> is executed within 'block'.
+<nobr>The <a href="return.htm">return</a></nobr> exit will exit the nearest
+<nobr>[inner-most]</nobr> 'block'.
+<nobr>The <a href="return-from.htm">return-from</a></nobr> exit will exit
+the specified 'block'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun test ()
+ (block outer <font color="#008844">; outer BLOCK</font>
+ (print "outer")
+ (block inner <font color="#008844">; inner BLOCK</font>
+ (print "inner")
+ (return-from outer "all done")
+ (print "won't get here"))))
+
+&gt; (test)
+"outer" <font color="#008844">; screen output of PRINT</font>
+"inner" <font color="#008844">; screen output of PRINT</font>
+"all done" <font color="#008844">; return value</font>
+</pre>
+
+<p>See <a href="defun.htm">defun</a>, <a href="print.htm">print</a>,
+<nobr><a href="return-from.htm">return-from</a></nobr>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#control-constructs">Control Constructs</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/both-case-p.htm b/docsrc/xlisp/xlisp-doc/reference/both-case-p.htm
new file mode 100644
index 0000000..7d3a691
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/both-case-p.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP both-case-p</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>both-case-p</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>both-case-p</b> <i>char</i>)</dt>
+<dd><i>char</i> - a character expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the character
+is alphabetic, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '<nobr>both-case-p</nobr>' predicate function checks if the 'char'
+expression evaluates to an alphabetic character. <nobr>If 'char'</nobr>
+evaluates to an alphabetic [either an upper or lower case] character
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned, otherwise
+<a href="nil.htm">NIL</a> is returned. Note that XLISP is limited to <a
+href="../misc/ascii-table.htm">ASCII</a> characters, so there is no way to
+find out if an Unicode character is '<nobr>both-case-p</nobr>' if the
+<nobr><a href="char-code.htm">char-code</a></nobr> is greater <nobr>than
+127</nobr>.</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(both-case-p #\A) =&gt; T
+(both-case-p #\a) =&gt; T
+(both-case-p #\1) =&gt; NIL
+(both-case-p #\[) =&gt; NIL
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/boundp.htm b/docsrc/xlisp/xlisp-doc/reference/boundp.htm
new file mode 100644
index 0000000..22bad23
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/boundp.htm
@@ -0,0 +1,104 @@
+<html><head><title>XLISP boundp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>boundp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>boundp</b> <i>symbol</i>)</dt>
+<dd><i>symbol</i> - a symbol expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if a value is
+bound to the symbol, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'boundp' predicate function tests if 'symbol' evaluates to a symbol
+in <nobr>the <a href="global-obarray.htm">*obarray*</a></nobr> with a value
+bound to it. <nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr> returned if
+'symbol' has a value, <a href="nil.htm">NIL</a> is returned otherwise. Note
+that 'boundp' does not test if local <a href="let.htm">let</a> variables, or
+class or instance variables exist.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq a 1) =&gt; 1 <font color="#008844">; create a variable A in the *OBARRAY*</font>
+(boundp 'a) =&gt; T <font color="#008844">; variable A has a value 1</font>
+
+(let ((b 'value))
+ (boundp b)) =&gt; NIL <font color="#008844">; BOUNDP does NOT test LET bindings</font>
+
+(defun foo (x) <font color="#008844">; create a function FOO in the *OBARRAY*</font>
+ (print x)) =&gt; FOO
+
+(boundp 'foo) =&gt; NIL <font color="#008844">; FOO is not a variable</font>
+
+(print myvar) =&gt; <font color="#AA0000">error: unbound variable - MYVAR</font>
+(boundp 'myvar) =&gt; NIL
+
+(setq myvar 'abc) <font color="#008844">; give MYVAR a value</font>
+(boundp 'myvar) =&gt; T
+</pre>
+
+<p>Note that 'symbol' is a symbol expression. This means that 'symbol' is
+evaluated and the return value is tested:</p>
+
+<pre class="example">
+(setq myvar 'qq) <font color="#008844">; MYVAR evaluates to QQ</font>
+(boundp myvar) =&gt; NIL <font color="#008844">; but QQ has no value yet</font>
+
+(setq qq 'new-value) <font color="#008844">; give QQ a value</font>
+(boundp myvar) =&gt; T
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#predicate-functions">Predicate Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/break.htm b/docsrc/xlisp/xlisp-doc/reference/break.htm
new file mode 100644
index 0000000..a8a6c58
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/break.htm
@@ -0,0 +1,107 @@
+<html><head><title>XLISP break</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>break</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c, xldbug.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>break</b> [<i>err-msg</i> [<i>arg</i>]])</dt>
+<dd><i>err-msg</i> - a string expression for the error message<br>
+<i>arg</i> - an optional argument expression<br>
+returns - <a href="nil.htm">NIL</a> when continued from the
+break loop</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'break' function allows the entry into the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr> with a
+continuable error. The continuable error generated by 'break' does not
+require any corrective action. The form of the message generated is:</p>
+
+<pre class="example">
+break: <font color="#0000CC">err-msg</font> - <font color="#0000CC">arg</font>
+if continued: return from BREAK
+</pre>
+
+<p> The default for 'err-msg' is:</p>
+
+<pre class="example">
+**BREAK**
+</pre>
+
+<p>From within the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>, if a
+<a href="continue.htm">continue</a> form is evaluated then
+<a href="nil.htm">NIL</a> is returned from 'break'. <nobr>If desired</nobr>,
+the <a href="clean-up.htm">clean-up</a> or
+<a href="top-level.htm">top-level</a> functions may be evaluated to abort
+the <nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+&gt; (break)
+break: **BREAK**
+if continued: return from BREAK
+
+&gt; (break "out")
+break: out
+if continued: return from BREAK
+
+&gt; (break "it" "up")
+break: it - "up"
+if continued: return from BREAK
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#debugging-and-error-handling">Debugging and Error Handling</a></nobr></li>
+<li><nobr>XLISP 2.0 Manual &rarr; <a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/caaaar.htm b/docsrc/xlisp/xlisp-doc/reference/caaaar.htm
new file mode 100644
index 0000000..69ccda4
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/caaaar.htm
@@ -0,0 +1,134 @@
+<html><head><title>XLISP caaaar ... cadddr</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>caaaar ... cadddr</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>caaaar</b> <i>expr</i>)<br>
+(<b>caaadr</b> <i>expr</i>)<br>
+(<b>caadar</b> <i>expr</i>)<br>
+(<b>caaddr</b> <i>expr</i>)<br>
+(<b>cadaar</b> <i>expr</i>)<br>
+(<b>cadadr</b> <i>expr</i>)<br>
+(<b>caddar</b> <i>expr</i>)<br>
+(<b>cadddr</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - a list or list expression<br>
+returns - the result of the last <a href="car.htm">car</a>
+function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p> The 'caaaar' ... 'cadddr' functions go through the list expression and
+perform a sequence of <a href="car.htm">car</a> or <a href="cdr.htm">cdr</a>
+operations. <nobr>The sequence</nobr> of operations is performed from right
+to left. <nobr>So 'caaddr'</nobr> does a <a href="cdr.htm">cdr</a> on the
+expression, followed by a <a href="cdr.htm">cdr</a>, followed by a
+<a href="car.htm">car</a>, followed by
+<nobr>another <a href="car.htm">car</a></nobr>. <nobr>If at</nobr> any point
+the list is <a href="nil.htm">NIL</a>, then <a href="nil.htm">NIL</a> is
+returned. <nobr>If at</nobr> any point a <a href="car.htm">car</a> operation
+is performed on an atom <nobr>[as opposed</nobr> to <nobr>a list]</nobr> an
+error is signalled:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument</font>
+</pre>
+
+<p>The 'cadddr' function returns the same result as the
+<a href="fourth.htm">fourth</a> function.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mylist '((((111A 111B) (112A 112B) (113A 113B)) <font color="#008844">; 1st set</font>
+ ((121A 121B) (122A 122B) (123A 123B))
+ ((131A 131B) (132A 132B) (133A 133B))
+ ((141A 141B) (142A 142B) (143A 143B)))
+ (((211A 211B) (212A 212B) (213A 213B)) <font color="#008844">; 2nd set</font>
+ ((221A 221B) (222A 222B) (223A 223B))
+ ((231A 231B) (232A 232B) (233A 233B))
+ ((241A 241B) (242A 242B) (243A 243B)))
+ (((311A 311B) (312A 312B) (313A 313B)) <font color="#008844">; 3rd set</font>
+ ((321A 321B) (322A 322B) (323A 323B))
+ ((331A 331B) (332A 332B) (333A 333B))
+ ((341A 341B) (342A 342B) (343A 343B)))
+ (((411A 411B) (412A 412B) (413A 413B)) <font color="#008844">; 4th set</font>
+ ((421A 421B) (422A 422B) (423A 423B))
+ ((431A 431B) (432A 432B) (433A 433B))
+ ((441A 441B) (442A 442B) (443A 443B)))
+ (((511A 511B) (512A 512B) (513A 513B)) <font color="#008844">; 5th set</font>
+ ((521A 521B) (522A 522B) (523A 523B))
+ ((531A 531B) (532A 532B) (533A 533B))
+ ((541A 541B) (542A 542B) (543A 543B)))))
+
+(caaaar mylist) =&gt; 111A
+(caaadr mylist) =&gt; (211A 211B)
+(caadar mylist) =&gt; (121A 121B)
+(caaddr mylist) =&gt; ((311A 311B) (312A 312B) (313A 313B))
+(cadaar mylist) =&gt; (112A 112B)
+(cadadr mylist) =&gt; ((221A 221B) (222A 222B) (223A 223B))
+(caddar mylist) =&gt; ((131A 131B) (132A 132B) (133A 133B))
+(cadddr mylist) =&gt; (((411A 411B) (412A 412B) (413A 413B))
+ ((421A 421B) (422A 422B) (423A 423B))
+ ((431A 431B) (432A 432B) (433A 433B))
+ ((441A 441B) (442A 442B) (443A 443B)))
+</pre>
+
+<p><b>Note:</b> The '<nobr>c...r</nobr>' functions are part of the
+historical Lisp functions. You may find it easier to work with the modern
+lisp functions like <a href="nth.htm">nth</a> and
+<a href="nthcdr.htm">nthcdr</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#list-functions">List Functions</a></nobr></li>
+<li><nobr>Tutorials &rarr; Lisp Hints &rarr; <a href="../tutorials/lisp-hints.htm#list-accessors">List Accessors</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/caaar.htm b/docsrc/xlisp/xlisp-doc/reference/caaar.htm
new file mode 100644
index 0000000..a4b210e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/caaar.htm
@@ -0,0 +1,106 @@
+<html><head><title>XLISP caaar ... caddr</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>caaar ... caddr</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>caaar</b> <i>expr</i>)<br>
+(<b>caadr</b> <i>expr</i>)<br>
+(<b>cadar</b> <i>expr</i>)<br>
+(<b>caddr</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - a list expression<br>
+returns - the result of the last <a href="car.htm">car</a> function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p> The 'caaar', 'caadr', 'cadar' and 'caddr' functions go through the list
+expression and perform a sequence of <nobr><a href="car.htm">car</a> or
+<a href="cdr.htm">cdr</a></nobr> operations. <nobr>The sequence</nobr> of
+operations is performed from right to left. <nobr>So 'caddr'</nobr> does a
+<a href="cdr.htm">cdr</a> on the expression, followed by
+a <a href="cdr.htm">cdr</a>, followed by
+<nobr>a <a href="car.htm">car</a></nobr>. <nobr>If at</nobr> any point the
+list is <a href="nil.htm">NIL</a>, then <a href="nil.htm">NIL</a> is
+returned. <nobr>If at</nobr> any point a <a href="car.htm">car</a> operation
+is performed on an atom <nobr>[as opposed</nobr> to <nobr>a list]</nobr> an
+error is signalled:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument</font>
+</pre>
+
+<p>The 'caddr' function returns the same result as the
+<a href="third.htm">third</a> function.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mylist '(((11A 11B) (12A 12B) (13A 13B))
+ ((21A 21B) (22A 22B) (23A 23B))
+ ((31A 31B) (32A 32B) (33A 33B))
+ ((41A 41B) (42A 42B) (43A 43B))))
+
+(caaar mylist) =&gt; 11A
+(caadr mylist) =&gt; (21A 21B)
+(cadar mylist) =&gt; (12A 12B)
+(caddr mylist) =&gt; ((31A 31B) (32A 32B) (33A 33B))
+</pre>
+
+<p><b>Note:</b> The '<nobr>c...r</nobr>' functions are part of the
+historical Lisp functions. You may find it easier to work with the modern
+lisp functions like <a href="nth.htm">nth</a> and
+<a href="nthcdr.htm">nthcdr</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#list-functions">List Functions</a></nobr></li>
+<li><nobr>Tutorials &rarr; Lisp Hints &rarr; <a href="../tutorials/lisp-hints.htm#list-accessors">List Accessors</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/caar.htm b/docsrc/xlisp/xlisp-doc/reference/caar.htm
new file mode 100644
index 0000000..03cee4a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/caar.htm
@@ -0,0 +1,101 @@
+<html><head><title>XLISP caar, cadr</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>caar, cadr</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>caar</b> <i>expr</i>)<br>
+(<b>cadr</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - a list expression<br>
+returns - the result of the last <a href="car.htm">car</a> function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'caar' and 'cadr' functions go through the list expression and
+perform a sequence of <a href="car.htm">car</a> or
+<a href="cdr.htm">cdr</a> operations. The sequence of operations is
+performed from right to left. <nobr>So 'cadr'</nobr> does a
+<a href="cdr.htm">cdr</a> on the expression, followed by a
+<a href="car.htm">car</a>. <nobr>If at</nobr> any point the list is
+<a href="nil.htm">NIL</a>, then
+<a href="nil.htm">NIL</a> is returned. <nobr>If at</nobr> any point a
+<a href="car.htm">car</a> operation is performed on an atom
+<nobr>[as opposed</nobr> to <nobr>a list]</nobr> an error is signalled:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument</font>
+</pre>
+
+<p>The 'cadr' function returns the same result as the
+<a href="second.htm">second</a> function.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mylist '((1A 1B) (2A 2B) (3A 3B)))
+
+(caar mylist) =&gt; 1A
+(cadr mylist) =&gt; (2A 2B)
+
+(caar 'a) =&gt; <font color="#AA0000">error: bad argument</font>
+(caar nil) =&gt; NIL
+</pre>
+
+<p><b>Note:</b> The '<nobr>c...r</nobr>' functions are part of the
+historical Lisp functions. You may find it easier to work with the modern
+lisp functions like <a href="nth.htm">nth</a> and
+<a href="nthcdr.htm">nthcdr</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#list-functions">List Functions</a></nobr></li>
+<li><nobr>Tutorials &rarr; Lisp Hints &rarr; <a href="../tutorials/lisp-hints.htm#list-accessors">List Accessors</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/car.htm b/docsrc/xlisp/xlisp-doc/reference/car.htm
new file mode 100644
index 0000000..035d240
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/car.htm
@@ -0,0 +1,85 @@
+<html><head><title>XLISP car</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>car</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>car</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - a list or list expression<br>
+returns - the first element of the list</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'car' function returns the <a href="first.htm">first</a> element of
+the expression. <nobr>If the</nobr> <a href="first.htm">first</a> expression
+is itself a list, then the sublist is returned. <nobr>If the</nobr> list is
+<nobr><a href="nil.htm">NIL</a> ,</nobr> <a href="nil.htm">NIL</a> is
+returned.</p>
+
+<p>The 'car' function returns the same result as the
+<a href="first.htm">first</a> function.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(car '(a b c)) =&gt; A
+(car '((a b) c d)) =&gt; (A B)
+(car NIL) =&gt; NIL
+(car 'a) =&gt; <font color="#AA0000">error: bad argument type</font>
+(setq bob '(1 2 3)) =&gt; (1 2 3)
+(car bob) =&gt; 1
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#list-functions">List Functions</a></nobr></li>
+<li><nobr>Tutorials &rarr; Lisp Hints &rarr; <a href="../tutorials/lisp-hints.htm#list-accessors">List Accessors</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/case.htm b/docsrc/xlisp/xlisp-doc/reference/case.htm
new file mode 100644
index 0000000..8cac054
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/case.htm
@@ -0,0 +1,171 @@
+<html><head><title>XLISP case</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>case</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>case</b> <i>expr</i> [(<i>value action</i>) ... ])</dt>
+<dd><i>expr</i> - an expression that can be compared via <a href="eql.htm">eql</a><br>
+<i>value</i> - an unevaluated expression or list of unevaluated expressions<br>
+<i>action</i> - one or more expressions<br>
+returns - the value of the last expression of the matching case</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'case' special form first evaluates 'expr', the return value of this
+evaluation is then compared against all the 'value' entries:</p>
+
+<pre class="example">
+(case <font color="#0000CC">expr</font>
+ (<font color="#0000CC">value-</font><font color="#AA0000">1</font> <font color="#0000CC">action-</font><font color="#AA0000">1</font>)
+ (<font color="#0000CC">value-</font><font color="#AA0000">2</font> <font color="#0000CC">action-</font><font color="#AA0000">2</font>)
+ <font color="#008844">...</font>
+ (<font color="#0000CC">value-</font><font color="#AA0000">n</font> <font color="#0000CC">action-</font><font color="#AA0000">n</font>))
+</pre>
+
+<p>If 'value' is a single atom, the atom is compared against 'expr':</p>
+
+<pre class="example">
+&gt; (case 'a
+ ('a "a")
+ ('b "b"))
+"a"
+</pre>
+
+<p>If 'value' is a list, each of the elements of the list are compared
+against 'expr':</p>
+
+<pre class="example">
+&gt; (case 'a
+ ((1 2 3 4) "number")
+ ((a b c d) "alpha"))
+"alpha"
+</pre>
+
+<p>The 'action' associated with the first 'value' that matches 'expr' is
+evaluated and returned as the result of the 'case' special form.</p>
+
+<p>If no 'value' matches, <a href="nil.htm">NIL</a> is returned:</p>
+
+<pre class="example">
+&gt; (case 'c
+ ('a "a")
+ ('b "b"))
+NIL
+</pre>
+
+<p>If the last 'value' is the symbol <a href="t.htm">&nbsp;T&nbsp;</a> and
+no other 'value' has matched 'expr', then 'case' will evaluate the 'action'
+associated <nobr>with <a href="t.htm">&nbsp;T&nbsp;</a></nobr>:</p>
+
+<pre class="example">
+&gt; (case 3
+ (1 "one")
+ (2 "two")
+ (t "no match"))
+"no match"
+</pre>
+
+<p>If there are multiple <a href="t.htm">&nbsp;T&nbsp;</a> entries, the
+first is considered to be the end of the 'case':</p>
+
+<pre class="example">
+&gt; (case 9
+ (1 "one")
+ (t "first t")
+ (t "second t"))
+"first t"
+</pre>
+
+<p><b>Note:</b> The 'case' special form does not work with a list or string
+as the 'expr' because 'case' uses <a href="eql.htm">eql</a> which cannot
+compare lists or strings:</p>
+
+<pre class="example">
+&gt; (case "a" <font color="#AA0000">; doesn't work!</font>
+ ("a" 'a)
+ ("b" 'b))
+NIL
+</pre>
+
+<p>The <a href="cond.htm">cond</a> special form can be used to test Lisp
+expressions that cannot be handled by 'case'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(case) =&gt; NIL
+(case 'a) =&gt; NIL
+
+(defun c-type (expr)
+ (case (type-of expr)
+ (flonum "float")
+ (fixnum "integer")
+ (string "string")
+ (cons "non-empty list")
+ (nil "empty list")
+ (t "other")))
+
+(c-type 1.2) =&gt; "float"
+(c-type 3) =&gt; "integer"
+(c-type "ab") =&gt; "string"
+(c-type '(a b)) =&gt; "non-empty list"
+(c-type '()) =&gt; "empty list"
+(c-type 'a) =&gt; "other"
+</pre>
+
+<p>See <a href="defun.htm">defun</a>,
+<nobr><a href="type-of.htm">type-of</a></nobr>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#control-constructs">Control Constructs</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/catch.htm b/docsrc/xlisp/xlisp-doc/reference/catch.htm
new file mode 100644
index 0000000..28b682a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/catch.htm
@@ -0,0 +1,197 @@
+<html><head><title>XLISP catch, throw</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>catch, throw</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c, xljump.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>catch</b> <i>tag-symbol</i> [<i>expr</i> ... ])</dt>
+<dd><i>tag-symbol</i> - an expression that evaluates to a symbol<br>
+<i>expr</i> - an optional series of expressions to be evaluated<br>
+returns - the value of the last expression the
+<a href="throw.htm">throw</a> expression</dd>
+</dl>
+
+<dl>
+<dt>(<b>throw</b> <i>tag-symbol</i> [<i>expr</i>])</dt>
+<dd><i>tag-symbol</i> - an expression that evaluates to a symbol<br>
+<i>expr</i> - an optional expression to be returned<br>
+returns - never returns</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'catch' and 'throw' special forms allow for non-local exits and traps
+without going through the intermediate evaluations and function returns:</p>
+
+<pre class="example">
+(catch <font color="#0000CC">tag-symbol</font>
+ [<font color="#0000CC">expr</font> <font color="#008844">...</font>]
+ (throw <font color="#0000CC">tag-symbol</font> [<font color="#0000CC">expr</font>]))
+</pre>
+
+<p>If there is a 'catch' for a '<nobr>tag-symbol</nobr>' that has no 'throw'
+performed to it, 'catch' returns the value returned from 'expr':</p>
+
+<pre class="example">
+&gt; (catch 'mytag
+ (+ 1 (+ 2 3)))
+6
+</pre>
+
+<p>If there is no 'expr', <nobr><a href="nil.htm">NIL</a> is</nobr>
+returned:</p>
+
+<pre class="example">
+&gt; (catch 'mytag)
+NIL
+</pre>
+
+<p>The 'expr' in 'throw' specifies what value is to be returned by the
+corresponding 'catch':</p>
+
+<pre class="example">
+&gt; (catch 'mytag
+ (+ 1 (throw 'mytag 55)))
+55
+</pre>
+
+<p>If there is no 'expr' in 'throw', <a href="nil.htm">NIL</a> is returned
+to the corresponding 'catch':</p>
+
+<pre class="example">
+&gt; (catch 'mytag
+ (throw 'mytag))
+NIL
+</pre>
+
+<p>If more than one 'catch' is set up for the same
+'<nobr>tag-symbol</nobr>', the most recently evaluated
+'<nobr>tag-symbol</nobr>' will be the one that does the actual catching:</p>
+
+<pre class="example">
+&gt; (catch 'mytag
+ (catch 'mytag
+ (throw 'mytag))
+ (print 'hello))
+HELLO
+</pre>
+
+<p>If a 'throw' is evaluated with no corresponding 'catch', an error is
+signalled:</p>
+
+<pre class="example">
+&gt; (catch 'mytag
+ (throw 'foo))
+<font color="#AA0000">error: no target for THROW</font>
+</pre>
+
+<p></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun in (x)
+ (if (numberp x) <font color="#008844">; if X is a number</font>
+ (+ x x) <font color="#008844">; then double X</font>
+ (throw 'math 42))) <font color="#008844">; else throw 42</font>
+
+(defun out (x)
+ (princ "&lt;")
+ (princ (* (in x) 2)) <font color="#008844">; double via multiply</font>
+ (princ "&gt;")
+ "there")
+
+(defun main (x)
+ (catch 'math (out x))) <font color="#008844">; catch the throw from IN</font>
+
+&gt; (in 5)
+10 <font color="#008844">; return value</font>
+
+&gt; (out 5)
+&lt;20&gt; <font color="#008844">; screen output of PRINC</font>
+"there" <font color="#008844">; return value</font>
+
+&gt; (main 5)
+&lt;20&gt; <font color="#008844">; screen output of PRINC</font>
+"there" <font color="#008844">; return value</font>
+
+&gt; (main 'a)
+&lt; <font color="#008844">; screen output of PRINC</font>
+42 <font color="#008844">; return value</font>
+</pre>
+
+<p>See <nobr><a href="addition.htm">&nbsp;+&nbsp;</a></nobr>,
+<nobr><a href="multiplication.htm">&nbsp;*&nbsp;</a></nobr>,
+<a href="defun.htm">defun</a>,
+<nobr><a href="if.htm">&nbsp;if&nbsp;</a></nobr>,
+<a href="numberp.htm">numberp</a>,
+<a href="princ.htm">princ</a>.</p>
+
+<p><div class="box">
+
+<p><b>Note:</b> 'catch' and 'throw' accept not only symbols as
+'<nobr>tag-symbol</nobr>', but if a '<nobr>tag-symbol</nobr>' cannot be
+compared via <a href="eql.htm">eql</a>, an error is signalled:</p>
+
+<pre class="example">
+&gt; (catch "mytag"
+ (throw "mytag"))
+<font color="#AA0000">error: no target for THROW</font>
+</pre>
+
+<p>This was reproduced with <nobr>Nyquist 3.03</nobr> in <nobr>December
+2010</nobr>.</p>
+
+</div></p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#control-constructs">Control Constructs</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/cddddr.htm b/docsrc/xlisp/xlisp-doc/reference/cddddr.htm
new file mode 100644
index 0000000..68b688a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/cddddr.htm
@@ -0,0 +1,135 @@
+<html><head><title>XLISP cdaaar ... cddddr</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cdaaar ... cddddr</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>cdaaar</b> <i>expr</i>)<br>
+(<b>cdaadr</b> <i>expr</i>)<br>
+(<b>cdadar</b> <i>expr</i>)<br>
+(<b>cdaddr</b> <i>expr</i>)<br>
+(<b>cddaar</b> <i>expr</i>)<br>
+(<b>cddadr</b> <i>expr</i>)<br>
+(<b>cdddar</b> <i>expr</i>)<br>
+(<b>cddddr</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - a list or list expression<br>
+returns - the result of the last <a href="cdr.htm">cdr</a>
+function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p> The 'cdaaar' ... 'cddddr' functions go through the list expression and
+perform a sequence of <a href="car.htm">car</a> or
+<a href="cdr.htm">cdr</a> operations. <nobr>The sequence</nobr> of
+operations is performed from right to left. <nobr>So 'cddaar'</nobr> does a
+<a href="car.htm">car</a> on the expression, followed by
+<nobr>a <a href="car.htm">car</a></nobr>, followed by
+<nobr>a <a href="cdr.htm">cdr</a></nobr>, followed by <nobr>another
+<a href="cdr.htm">cdr</a></nobr>. <nobr>If at</nobr> any point the list
+<nobr>is <a href="nil.htm">NIL</a></nobr>, then
+<a href="nil.htm">NIL</a> is returned. <nobr>If at</nobr> anypoint a
+<a href="car.htm">car</a> operation is performed on an atom [as
+opposed to a list] an error is signalled:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mylist '((((111A 111B) (112A 112B) (113A 113B)) <font color="#008844">; 1st set</font>
+ ((121A 121B) (122A 122B) (123A 123B))
+ ((131A 131B) (132A 132B) (133A 133B))
+ ((141A 141B) (142A 142B) (143A 143B)))
+ (((211A 211B) (212A 212B) (213A 213B)) <font color="#008844">; 2nd set</font>
+ ((221A 221B) (222A 222B) (223A 223B))
+ ((231A 231B) (232A 232B) (233A 233B))
+ ((241A 241B) (242A 242B) (243A 243B)))
+ (((311A 311B) (312A 312B) (313A 313B)) <font color="#008844">; 3rd set</font>
+ ((321A 321B) (322A 322B) (323A 323B))
+ ((331A 331B) (332A 332B) (333A 333B))
+ ((341A 341B) (342A 342B) (343A 343B)))
+ (((411A 411B) (412A 412B) (413A 413B)) <font color="#008844">; 4th set</font>
+ ((421A 421B) (422A 422B) (423A 423B))
+ ((431A 431B) (432A 432B) (433A 433B))
+ ((441A 441B) (442A 442B) (443A 443B)))
+ (((511A 511B) (512A 512B) (513A 513B)) <font color="#008844">; 5th set</font>
+ ((521A 521B) (522A 522B) (523A 523B))
+ ((531A 531B) (532A 532B) (533A 533B))
+ ((541A 541B) (542A 542B) (543A 543B)))))
+
+(cdaaar mylist) =&gt; (111B)
+(cdaadr mylist) =&gt; ((212A 212B) (213A 213B))
+(cdadar mylist) =&gt; ((122A 122B) (123A 123B))
+(cdaddr mylist) =&gt; (((321A 321B) (322A 322B) (323A 323B))
+ ((331A 331B) (332A 332B) (333A 333B))
+ ((341A 341B) (342A 342B) (343A 343B)))
+(cddaar mylist) =&gt; ((113A 113B))
+(cddadr mylist) (((231A 231B) (232A 232B) (233A 233B))
+ ((241A 241B) (242A 242B) (243A 243B)))
+(cdddar mylist) =&gt; (((141A 141B) (142A 142B) (143A 143B)))
+(cddddr mylist) =&gt; ((((511A 511B) (512A 512B) (513A 513B))
+ ((521A 521B) (522A 522B) (523A 523B))
+ ((531A 531B) (532A 532B) (533A 533B))
+ ((541A 541B) (542A 542B) (543A 543B))))
+</pre>
+
+<p><b>Note:</b> The '<nobr>c...r</nobr>' functions are part of the
+historical Lisp functions. You may find it easier to work with the modern
+lisp functions like <a href="nth.htm">nth</a> and
+<a href="nthcdr.htm">nthcdr</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#list-functions">List Functions</a></nobr></li>
+<li><nobr>Tutorials &rarr; Lisp Hints &rarr; <a href="../tutorials/lisp-hints.htm#list-accessors">List Accessors</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/cdddr.htm b/docsrc/xlisp/xlisp-doc/reference/cdddr.htm
new file mode 100644
index 0000000..ce35fa5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/cdddr.htm
@@ -0,0 +1,104 @@
+<html><head><title>XLISP cdaar ... cdddr</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cdaar ... cdddr</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>cdaar</b> <i>expr</i>)<br>
+(<b>cdadr</b> <i>expr</i>)<br>
+(<b>cddar</b> <i>expr</i>)<br>
+(<b>cdddr</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - a list or list expression<br>
+returns - the result of the last <a href="cdr.htm">cdr</a>
+function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'cdaar', 'cdadr', 'cddar' and 'cdddr' functions go through the list
+expression and perform a sequence of <nobr><a href="car.htm">car</a> or
+<a href="cdr.htm">cdr</a></nobr> operations. <nobr>The sequence</nobr> of
+operations is performed from right to left. So 'cddar' does a
+<a href="car.htm">car</a> on the expression, followed by a
+<nobr> a<a href="cdr.htm">cdr</a></nobr>, followed by <nobr>another
+<a href="cdr.htm">cdr</a></nobr>. <nobr>If at</nobr> any point the list
+<nobr>is <a href="nil.htm">NIL</a></nobr>, then
+<a href="nil.htm">NIL</a> is returned. <nobr>If at</nobr> any point a
+<a href="car.htm">car</a> operation is performed on an atom [as
+opposed to a list] an error is signalled:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mylist '(((11A 11B) (12A 12B) (13A 13B))
+ ((21A 21B) (22A 22B) (23A 23B))
+ ((31A 31B) (32A 32B) (33A 33B))
+ ((41A 41B) (42A 42B) (43A 43B))))
+
+(cdaar mylist) =&gt; (11B)
+(cdadr mylist) =&gt; ((22A 22B) (23A 23B))
+(cddar mylist) =&gt; ((13A 13B))
+(cdddr mylist) =&gt; (((41A 41B) (42A 42B) (43A 43B)))
+</pre>
+
+<p><b>Note:</b> The '<nobr>c...r</nobr>' functions are part of the
+historical Lisp functions. You may find it easier to work with the modern
+lisp functions like <a href="nth.htm">nth</a> and
+<a href="nthcdr.htm">nthcdr</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#list-functions">List Functions</a></nobr></li>
+<li><nobr>Tutorials &rarr; Lisp Hints &rarr; <a href="../tutorials/lisp-hints.htm#list-accessors">List Accessors</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/cddr.htm b/docsrc/xlisp/xlisp-doc/reference/cddr.htm
new file mode 100644
index 0000000..a69d2f3
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/cddr.htm
@@ -0,0 +1,101 @@
+<html><head><title>XLISP cdar, cddr</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cdar, cddr</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>cdar</b> <i>expr</i>)<br>
+(<b>cddr</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - a list or list expression<br>
+returns - the result of the last <a href="cdr.htm">cdr</a>
+function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'cdar' and 'cddr' functions go through the list expression and perform a
+sequence of <a href="car.htm">car</a> or
+<a href="cdr.htm">cdr</a> operations. <nobr>The sequence</nobr> of
+operations is performed from right to left. So 'cdar' does a
+<a href="car.htm">car</a> on the expression, followed by <nobr>a
+<a href="cdr.htm">cdr</a></nobr>. <nobr>If at</nobr> any point the list is
+<a href="nil.htm">NIL</a>, then <a href="nil.htm">NIL</a> is returned.
+<nobr>If at</nobr> any point a <a href="car.htm">car</a> operation is
+performed on an atom [as opposed to a list] an error is signalled:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mylist '((1A 1B) (2A 2B) (3A 3B)))
+
+(caar mylist) =&gt; 1A
+(cadr mylist) =&gt; (2A 2B)
+
+(cdar mylist) =&gt; (1B)
+(cddr mylist) =&gt; ((3A 3B))
+
+(cdar 'a) =&gt; <font color="#AA0000">error: bad argument</font>
+(cdar nil) =&gt; NIL
+</pre>
+
+<p><b>Note:</b> The '<nobr>c...r</nobr>' functions are part of the
+historical Lisp functions. You may find it easier to work with the modern
+lisp functions like <a href="nth.htm">nth</a> and
+<a href="nthcdr.htm">nthcdr</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#list-functions">List Functions</a></nobr></li>
+<li><nobr>Tutorials &rarr; Lisp Hints &rarr; <a href="../tutorials/lisp-hints.htm#list-accessors">List Accessors</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/cdr.htm b/docsrc/xlisp/xlisp-doc/reference/cdr.htm
new file mode 100644
index 0000000..d9845f5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/cdr.htm
@@ -0,0 +1,85 @@
+<html><head><title>XLISP cdr</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cdr</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>cdr</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - a list expression<br>
+returns - <i>expr</i> with the first element removed</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'cdr' function returns the <a href="rest.htm">rest</a> of a
+list expression after the first element of the list is removed. <nobr>If
+the</nobr> list <nobr>is <a href="nil.htm">NIL</a></nobr>, then
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<p>The 'cdr' function returns the same result as the
+<a href="rest.htm">rest</a> function.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(cdr '(a b c)) =&gt; (B C)
+(cdr '((a b) c d)) =&gt; (C D)
+(cdr nil) =&gt; NIL
+(cdr 'a) =&gt; <font color="#AA0000">error: bad argument type</font>
+(cdr '(a)) =&gt; NIL
+(setq ben '(a b c)) =&gt;
+(cdr ben) =&gt; (B C)
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#list-functions">List Functions</a></nobr></li>
+<li><nobr>Tutorials &rarr; Lisp Hints &rarr; <a href="../tutorials/lisp-hints.htm#list-accessors">List Accessors</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/cerror.htm b/docsrc/xlisp/xlisp-doc/reference/cerror.htm
new file mode 100644
index 0000000..116f9f3
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/cerror.htm
@@ -0,0 +1,23 @@
+<html><head><title>XLISP cerror</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cerror</h1>
+
+<hr>
+
+<p>See <a href="error.htm">error</a>.</p>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-code.htm b/docsrc/xlisp/xlisp-doc/reference/char-code.htm
new file mode 100644
index 0000000..eafd74b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-code.htm
@@ -0,0 +1,86 @@
+<html><head><title>XLISP char-code</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char-code</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char-code</b> <i>char</i>)</dt>
+<dd><i>char</i> - a character expression<br>
+returns - the decimal <a href="../misc/ascii-table.htm">ASCII</a>
+value as an integer</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'char-code' function returns the decimal
+<a href="../misc/ascii-table.htm">ASCII</a> value of the 'char'
+expression.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char-code #\0) =&gt; 48
+(char-code #\A) =&gt; 65
+(char-code #\a) =&gt; 97
+(char-code #\[) =&gt; 91
+(char-code #\newline) =&gt; 10
+(char-code (code-char 127)) =&gt; 127
+(char-code (int-char 255)) =&gt; 255
+</pre>
+
+<p><b>Note:</b> In <nobr>Nyquist/XLISP</nobr>, '<nobr>char-code</nobr>' and
+<a href="char-int.htm">char-int</a> are two different functions, but behave
+exactly the same <nobr>[Nyquist 3.03</nobr>, <nobr>December
+2010</nobr>].</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-downcase.htm b/docsrc/xlisp/xlisp-doc/reference/char-downcase.htm
new file mode 100644
index 0000000..bcf5829
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-downcase.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP char-downcase</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char-downcase</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char-downcase</b> <i>char</i>)</dt>
+<dd><i>char</i> - a character expression<br>
+returns - the lower case character</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '<nobr>char-downcase</nobr>' function converts the 'char' expression
+to lower case. The lower case equivalent of 'char' is returned. <nobr>If
+'char'</nobr> is not alphabetic <nobr>[a-z or A-Z],</nobr> then the
+character is returned unchanged.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char-downcase #\0) =&gt; #\0
+(char-downcase #\A) =&gt; #\a
+(char-downcase #\a) =&gt; #\a
+(char-downcase #\[) =&gt; #\[
+(char-downcase #\+) =&gt; #\+
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-equal-i.htm b/docsrc/xlisp/xlisp-doc/reference/char-equal-i.htm
new file mode 100644
index 0000000..a4a53b4
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-equal-i.htm
@@ -0,0 +1,89 @@
+<html><head><title>XLISP char-equal</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char-equal</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char-equal</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression[s] to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if all characters
+are equal, <a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'char-equal' function tests if all the character arguments are
+equivalent. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if the arguments
+are of the same <a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise. <nobr>In the</nobr> case of two
+arguments, this has the effect of testing if 'char1' is equal to 'char2'.
+This test is case insensitive, the character '#\a' is considered to be the
+same <a href="../misc/ascii-table.htm">ASCII</a> value as the
+<nobr>character '#\A'.</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char-equal #\a #\b) =&gt; NIL
+(char-equal #\b #\a) =&gt; NIL
+(char-equal #\a #\b #\c) =&gt; NIL
+(char-equal #\a #\a) =&gt; T
+(char-equal #\a #\a #\a) =&gt; T
+(char-equal #\a #\a #\b) =&gt; NIL
+(char-equal #\A #\a) =&gt; T
+(char-equal #\a #\A) =&gt; T
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-equal-s.htm b/docsrc/xlisp/xlisp-doc/reference/char-equal-s.htm
new file mode 100644
index 0000000..04e268f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-equal-s.htm
@@ -0,0 +1,91 @@
+<html><head><title>XLISP char=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char=</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression[s] to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are of the same
+<a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'char=' function tests if all the character arguments are equivalent.
+<nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr> returned if the arguments
+are of the same <a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise. <nobr>In the</nobr> case of two
+arguments, this has the effect of testing if 'char1' is equal to 'char2'.
+This test is case sensitive, the character '#\a' is different and of greater
+<a href="../misc/ascii-table.htm">ASCII</a> value than the <nobr>character
+'#\A'</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char= #\a #\b) =&gt; NIL
+(char= #\b #\a) =&gt; NIL
+(char= #\a #\b #\c) =&gt; NIL
+(char= #\a #\a) =&gt; T
+(char= #\a #\a #\a) =&gt; T
+(char= #\a #\a #\b) =&gt; NIL
+(char= #\A #\a) =&gt; NIL
+(char= #\a #\A) =&gt; NIL
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-greaterp-i.htm b/docsrc/xlisp/xlisp-doc/reference/char-greaterp-i.htm
new file mode 100644
index 0000000..7188588
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-greaterp-i.htm
@@ -0,0 +1,91 @@
+<html><head><title>XLISP char-greaterp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char-greaterp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char-greaterp</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression(s) to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are of monotonically decreasing
+<a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '<nobr>char-greaterp</nobr>' function tests if all the character
+arguments are monotonically decreasing.
+<nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr> returned if the arguments
+are of monotonically decreasing <a href="../misc/ascii-table.htm">ASCII</a>
+value, <a href="nil.htm">NIL</a> otherwise. <nobr>In the</nobr> case of two
+arguments, this has the effect of testing if 'char1' is greater than
+'char2'. This test is case insensitive, the character '#\a' is considered to
+be the same <a href="../misc/ascii-table.htm">ASCII</a> value as the
+<nobr>character '#\A'.</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char-greaterp #\a #\b) =&gt; NIL
+(char-greaterp #\b #\a) =&gt; T
+(char-greaterp #\c #\b #\a) =&gt; T
+(char-greaterp #\a #\a) =&gt; NIL
+(char-greaterp #\c #\a #\b) =&gt; NIL
+(char-greaterp #\A #\a) =&gt; NIL
+(char-greaterp #\a #\A) =&gt; NIL
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-greaterp-s.htm b/docsrc/xlisp/xlisp-doc/reference/char-greaterp-s.htm
new file mode 100644
index 0000000..95c3258
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-greaterp-s.htm
@@ -0,0 +1,91 @@
+<html><head><title>XLISP char&gt;</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char&gt;</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char&gt;</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression[s] to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are of monotonically decreasing
+<a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'char&gt;' function tests if all the character arguments are
+monotonically decreasing. <nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr>
+returned if the arguments are of monotonically decreasing
+<a href="../misc/ascii-table.htm">ASCII</a> value, <a href="nil.htm">NIL</a>
+otherwise. <nobr>In the</nobr> case of two arguments, this has the effect of
+testing if 'char1' is greater than 'char2'. This test is case sensitive, the
+character '#\a' is different and of greater <a
+href="../misc/ascii-table.htm">ASCII</a> value than the
+<nobr>character '#\A'</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char&gt; #\a #\b) =&gt; NIL
+(char&gt; #\b #\a) =&gt; T
+(char&gt; #\c #\b #\a) =&gt; T
+(char&gt; #\a #\a) =&gt; NIL
+(char&gt; #\c #\a #\b) =&gt; NIL
+(char&gt; #\A #\a) =&gt; NIL
+(char&gt; #\a #\A) =&gt; T
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-int.htm b/docsrc/xlisp/xlisp-doc/reference/char-int.htm
new file mode 100644
index 0000000..dbb279c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-int.htm
@@ -0,0 +1,86 @@
+<html><head><title>XLISP char-int</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char-int</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char-int</b> <i>char</i>)</dt>
+<dd><i>char</i> - a character expression<br>
+returns - the decimal <a href="../misc/ascii-table.htm">ASCII</a>
+value as an integer</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '<nobr>char-int</nobr>' function returns the decimal
+<a href="../misc/ascii-table.htm">ASCII</a> value of the 'char'
+expression.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char-int #\0) =&gt; 48</font>
+(char-int #\A) =&gt; 65</font>
+(char-int #\a) =&gt; 97</font>
+(char-int #\[) =&gt; 91</font>
+(char-int #\newline) =&gt; 10</font>
+(char-int (code-char 127)) =&gt; 127</font>
+(char-int (int-char 255)) =&gt; 255</font>
+</pre>
+
+<p><b>Note:</b> In <nobr>Nyquist/XLISP</nobr>,
+<a href="char-code.htm">char-code</a> and '<nobr>char-int</nobr>' are two
+different functions, but behave exactly the same <nobr>[Nyquist 3.03</nobr>,
+<nobr>December 2010</nobr>].</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-lessp-i.htm b/docsrc/xlisp/xlisp-doc/reference/char-lessp-i.htm
new file mode 100644
index 0000000..6b662ab
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-lessp-i.htm
@@ -0,0 +1,91 @@
+<html><head><title>XLISP char-lessp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char-lessp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char-lessp</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression[s] to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are of monotonically increasing
+<a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '<nobr>char-lessp</nobr>' function tests if all the character
+arguments are monotonically increasing.
+<nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr> returned if the arguments
+are of increasing <a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise. <nobr>In the</nobr> case of two
+arguments, this has the effect of testing if 'char1' is less than 'char2'.
+This test is case insensitive, the <nobr>character '#\a'</nobr> is
+considered to be the same <a href="../misc/ascii-table.htm">ASCII</a> value
+as the <nobr>character '#\A'.</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char-lessp #\a #\b) =&gt; T
+(char-lessp #\b #\a) =&gt; NIL
+(char-lessp #\a #\b #\c) =&gt; T
+(char-lessp #\a #\a) =&gt; NIL
+(char-lessp #\a #\b #\b) =&gt; NIL
+(char-lessp #\A #\a) =&gt; NIL
+(char-lessp #\a #\A) =&gt; NIL
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-lessp-s.htm b/docsrc/xlisp/xlisp-doc/reference/char-lessp-s.htm
new file mode 100644
index 0000000..5bee3dd
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-lessp-s.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP char&lt;</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+
+<h1>char&lt;</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char&lt;</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression[s] to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are of monotonically increasing
+<a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p> The 'char&lt;' function tests if all the character arguments are
+monotonically increasing. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if
+the arguments are of monotonically increasing
+<a href="../misc/ascii-table.htm">ASCII</a> value, <a href="nil.htm">NIL</a>
+otherwise. <nobr>In the</nobr> case of two arguments, this has the effect of
+testing if 'char1' is less than 'char2'. This test is case sensitive, the
+character '#\a' is different and of greater
+<a href="../misc/ascii-table.htm">ASCII</a> value than the <nobr>character
+'#\A'</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char&lt; #\a #\b) =&gt; T
+(char&lt; #\b #\a) =&gt; NIL
+(char&lt; #\a #\b #\c) =&gt; T
+(char&lt; #\a #\a) =&gt; NIL
+(char&lt; #\a #\b #\b) =&gt; NIL
+(char&lt; #\A #\a) =&gt; T
+(char&lt; #\a #\A) =&gt; NIL
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-not-equal-i.htm b/docsrc/xlisp/xlisp-doc/reference/char-not-equal-i.htm
new file mode 100644
index 0000000..5d649b5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-not-equal-i.htm
@@ -0,0 +1,90 @@
+<html><head><title>XLISP char-not-equal</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char-not-equal</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char-not-equal</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression(s) to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are of different
+<a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '<nobr>char-not-equal</nobr>' function tests if all the character
+arguments are different values. <nobr><a href="t.htm">&nbsp;T&nbsp;</a>
+is</nobr> returned if the arguments are of different
+<a href="../misc/ascii-table.htm">ASCII</a> value, <a href="nil.htm">NIL</a>
+otherwise. <nobr>In the</nobr> case of two arguments, this has the effect of
+testing if 'char1' is not equal to 'char2'. This test is case insensitive,
+the <nobr>character '#\a'</nobr> is considered to be the same
+<a href="../misc/ascii-table.htm">ASCII</a> value as the <nobr>character
+'#\A'.</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char-not-equal #\a #\b) =&gt; T
+(char-not-equal #\a #\b #\c) =&gt; T
+(char-not-equal #\a #\a) =&gt; NIL
+(char-not-equal #\a #\b #\b) =&gt; NIL
+(char-not-equal #\A #\a) =&gt; NIL
+(char-not-equal #\a #\A) =&gt; NIL
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-not-equal-s.htm b/docsrc/xlisp/xlisp-doc/reference/char-not-equal-s.htm
new file mode 100644
index 0000000..d8876ff
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-not-equal-s.htm
@@ -0,0 +1,98 @@
+<html><head><title>XLISP char/=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char/=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char/=</b> <i>char1 charN</i> ... )</dt>
+<dd>char1 - a character expression<br>
+charN - character expression[s] to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are not equal,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'char/=' function tests if all character arguments are different
+values. <nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr> returned if the
+arguments are of different <a href="../misc/ascii-table.htm">ASCII</a>
+value, <a href="nil.htm">NIL</a> otherwise. <nobr>In the</nobr> case of two
+arguments, this has the effect of testing if 'char1' is not equal to
+'char2'. This test is case sensitive, the character '#\a' is different and
+of greater <a href="../misc/ascii-table.htm">ASCII</a> value than the
+<nobr>character '#\A'</nobr>.</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char/= #\a #\b) =&gt; T
+(char/= #\a #\b #\c) =&gt; T
+(char/= #\a #\a) =&gt; NIL
+(char/= #\a #\b #\b) =&gt; NIL
+(char/= #\A #\a) =&gt; T
+(char/= #\a #\A) =&gt; T
+</pre>
+
+<p><div class="box">
+
+<p><b>Caution:</b> If you type 'char\=' [with a backslash] instead of
+'string/=' by mistake, no error will be signalled because backslash is the
+single escape character and the XLISP reader will evaluate 'char\=' as
+<a href="char-equal-s.htm">char=</a>, but the meaning of the test is
+exactly reversed.</p>
+
+</div></p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-not-greaterp-i.htm b/docsrc/xlisp/xlisp-doc/reference/char-not-greaterp-i.htm
new file mode 100644
index 0000000..010bad1
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-not-greaterp-i.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP char-not-greaterp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char-not-greaterp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char-not-greaterp</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression[s] to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are of monotonically <nobr>non-decreasing</nobr>
+<a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '<nobr>char-not-greaterp</nobr>' function tests if all character
+arguments are monotonically <nobr>non-decreasing</nobr>.
+<nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr> returned if the arguments
+are of monotonically non-decreasing
+<a href="../misc/ascii-table.htm">ASCII</a> value, <a href="nil.htm">NIL</a>
+otherwise. <nobr>In the</nobr> case of two arguments, this has the effect of
+testing if 'char1' is less than or equal to 'char2'. This test is case
+insensitive, the <nobr>character '#\a'</nobr> is considered to be the same
+<a href="../misc/ascii-table.htm">ASCII</a> value as the <nobr>character
+'#\A'.</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char-not-greaterp #\a #\b) =&gt; T
+(char-not-greaterp #\b #\a) =&gt; NIL
+(char-not-greaterp #\a #\b #\c) =&gt; T
+(char-not-greaterp #\a #\a) =&gt; T
+(char-not-greaterp #\a #\b #\b) =&gt; T
+(char-not-greaterp #\A #\a) =&gt; T
+(char-not-greaterp #\a #\A) =&gt; T
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-not-greaterp-s.htm b/docsrc/xlisp/xlisp-doc/reference/char-not-greaterp-s.htm
new file mode 100644
index 0000000..ba1d599
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-not-greaterp-s.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP char&lt;=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char&lt;=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char&lt;=</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression[s] to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are of monotonically <nobr>non-decreasing</nobr>
+<a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p> The 'char&lt;=' function tests if all character arguments are
+monotonically <nobr>non-decreasing</nobr>.
+<nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr> returned if the arguments
+are of monotonically <nobr>non-decreasing</nobr>
+<a href="../misc/ascii-table.htm">ASCII</a> value, <a href="nil.htm">NIL</a>
+otherwise. <nobr>In the</nobr> case of two arguments, this has the effect of
+testing if 'char1' is less than or equal to 'char2'. This test is case
+sensitive, the character '#\a' is different and of greater
+<a href="../misc/ascii-table.htm">ASCII</a> value than the <nobr>character
+'#\A'</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char&lt;= #\a #\b) =&gt; T
+(char&lt;= #\b #\a) =&gt; NIL
+(char&lt;= #\a #\b #\c) =&gt; T
+(char&lt;= #\a #\a) =&gt; T
+(char&lt;= #\a #\b #\b) =&gt; T
+(char&lt;= #\A #\a) =&gt; T
+(char&lt;= #\a #\A) =&gt; NIL
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-not-lessp-i.htm b/docsrc/xlisp/xlisp-doc/reference/char-not-lessp-i.htm
new file mode 100644
index 0000000..c991f04
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-not-lessp-i.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP char-not-lessp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char-not-lessp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char-not-lessp</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression[s] to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are of monotonically non-increasing
+<a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '<nobr>char-not-lessp</nobr>' function tests if all character
+arguments are monotonically <nobr>non-increasing</nobr>.
+<nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr> returned if the arguments
+are of monotonically <nobr>non-increasing</nobr>
+<a href="../misc/ascii-table.htm">ASCII</a> value, <a href="nil.htm">NIL</a>
+otherwise. <nobr>In the</nobr> case of two arguments, this has the effect of
+testing if 'char1' is greater than or equal to 'char2'. This test is case
+insensitive, the <nobr>character '#\a'</nobr> is considered to be the same
+<a href="../misc/ascii-table.htm">ASCII</a> value as the <nobr>character
+'#\A'.</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char-not-lessp #\a #\b) =&gt; NIL
+(char-not-lessp #\b #\a) =&gt; T
+(char-not-lessp #\c #\b #\a) =&gt; T
+(char-not-lessp #\a #\a) =&gt; T
+(char-not-lessp #\c #\a #\b) =&gt; NIL
+(char-not-lessp #\A #\a) =&gt; T
+(char-not-lessp #\a #\A) =&gt; T
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-not-lessp-s.htm b/docsrc/xlisp/xlisp-doc/reference/char-not-lessp-s.htm
new file mode 100644
index 0000000..3f85269
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-not-lessp-s.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP char&gt;=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char&gt;=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char&gt;=</b> <i>char1 charN</i> ... )</dt>
+<dd><i>char1</i> - a character expression<br>
+<i>charN</i> - character expression[s] to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the characters are of monotonically non-increasing
+<a href="../misc/ascii-table.htm">ASCII</a> value,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'char&gt;=' function tests if all character arguments are
+monotonically <nobr>non-increasing</nobr>.
+<nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr> returned if the arguments
+are of monotonically <nobr>non-increasing</nobr>
+<a href="../misc/ascii-table.htm">ASCII</a> value, <a href="nil.htm">NIL</a>
+otherwise. <nobr>In the</nobr> case of two arguments, this has the effect of
+testing if 'char1' is greater than or equal to 'char2'. This test is case
+sensitive, the character '#\a' is different and of greater
+<a href="../misc/ascii-table.htm">ASCII</a> value than the <nobr>characrer
+'#\A'</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char&gt;= #\a #\b) =&gt; NIL
+(char&gt;= #\b #\a) =&gt; T
+(char&gt;= #\c #\b #\a) =&gt; T
+(char&gt;= #\a #\a) =&gt; T
+(char&gt;= #\c #\a #\b) =&gt; NIL
+(char&gt;= #\A #\a) =&gt; NIL
+(char&gt;= #\a #\A) =&gt; T
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char-upcase.htm b/docsrc/xlisp/xlisp-doc/reference/char-upcase.htm
new file mode 100644
index 0000000..6d13de0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char-upcase.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP char-upcase</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char-upcase</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char-upcase</b> <i>char</i>)</dt>
+<dd><i>char</i> - a character expression<br>
+returns - the upper case character</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '<nobr>char-upcase</nobr>' function converts the 'char' expression to
+upper case. The upper case equivalent of 'char' is returned. <nobr>If
+the</nobr> 'char' is not alphabetic <nobr>[a-z or A-Z],</nobr> the
+character is returned unchanged.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char-upcase #\0) =&gt; #\0
+(char-upcase #\A) =&gt; #\A
+(char-upcase #\a) =&gt; #\A
+(char-upcase #\[) =&gt; #\[
+(char-upcase #\+) =&gt; #\+
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/char.htm b/docsrc/xlisp/xlisp-doc/reference/char.htm
new file mode 100644
index 0000000..39d0a88
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/char.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP char</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>char</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>char</b> <i>string position</i>)</dt>
+<dd><i>string</i> - a string expression<br>
+<i>position</i> - an integer expression<br>
+returns - the <a href="../misc/ascii-table.htm">ASCII</a> code of
+the character</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'char' function returns the
+<a href="../misc/ascii-table.htm">ASCII</a> numeric value of the character
+at the specified 'position' in the 'string'. <nobr>A position</nobr> of '0'
+is the first character in the string.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(char "12345" 0) =&gt; #\1
+(char "12 45" 2) =&gt; #\Space
+(string (char "1234" 3)) =&gt; "4"
+(char "1234" 9) =&gt; <font color="#AA0000">error: index out of range</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/characterp.htm b/docsrc/xlisp/xlisp-doc/reference/characterp.htm
new file mode 100644
index 0000000..d5f1d4d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/characterp.htm
@@ -0,0 +1,86 @@
+<html><head><title>XLISP characterp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>characterp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>characterp</b> <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the value is a
+character, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'characterp' predicate function tests if 'expr' evaluates to a
+character. <nobr><a href="t.htm">&nbsp;T&nbsp;</a> is</nobr> returned if
+'expr' evaluates to a character, <a href="nil.htm">NIL</a> is returned
+otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(characterp #\a) =&gt; T <font color="#008844">; character</font>
+(setq a #\b) =&gt; #\b
+(characterp a) =&gt; T <font color="#008844">; evaluates to a character</font>
+(characterp "a") =&gt; NIL <font color="#008844">; string</font>
+(characterp '(a b c)) =&gt; NIL <font color="#008844">; list</font>
+(characterp 1) =&gt; NIL <font color="#008844">; integer</font>
+(characterp 1.2) =&gt; NIL <font color="#008844">; float</font>
+(characterp 'a) =&gt; NIL <font color="#008844">; symbol</font>
+(characterp #(0 1 2)) =&gt; NIL <font color="#008844">; array</font>
+(characterp nil) =&gt; NIL <font color="#008844">; NIL</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#predicate-functions">Predicate Functions</a></nobr></li>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#character-functions">Character Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/class.htm b/docsrc/xlisp/xlisp-doc/reference/class.htm
new file mode 100644
index 0000000..af76573
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/class.htm
@@ -0,0 +1,113 @@
+<html><head><title>XLISP class</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>class</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>object</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;class</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>'class' is the built-in object class that is used to build other classes.
+Classes are, essentially, the template for defining
+<a href="object.htm">object</a> instances.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq myclass (send class :new '(var))) <font color="#008844">; create MYCLASS with VAR</font>
+
+(send myclass :answer :isnew '() <font color="#008844">; set up initialization</font>
+ '((setq var nil) self))
+
+(send myclass :answer :set-it '(value) <font color="#008844">; create :SET-IT message</font>
+ '((setq var value)))
+
+(setq my-obj (send myclass :new)) <font color="#008844">; create MY-OBJ of MYCLASS</font>
+(send my-obj :set-it 5) <font color="#008844">; VAR is set to 5</font>
+</pre>
+
+<p><b>Class definition:</b> The internal definition of the 'class' object
+instance looks like:</p>
+
+<pre class="example">
+Object is #&lt;Object: #23fe2&gt;, Class is #&lt;Object: #23fe2&gt;
+ MESSAGES = ((:ANSWER . #&lt;Subr-: #23e48&gt;)
+ (:ISNEW . #&lt;Subr-: #23e84&gt;)
+ (:NEW . #&lt;Subr-: #23ea2&gt;))
+ IVARS = (MESSAGES IVARS CVARS CVALS SUPERCLASS IVARCNT IVARTOTAL)
+ CVARS = NIL
+ CVALS = NIL
+ SUPERCLASS = #&lt;Object: #23fd8&gt;
+ IVARCNT = 7
+ IVARTOTAL = 7
+#&lt;Object: #23fe2&gt;
+</pre>
+
+<p>The class of 'class' is 'class', itself. The superclass of 'class' is
+<a href="object.htm">object</a>. Remember that the location
+information [like #23fe2] varies from system to system, yours will probably
+look different.</p>
+
+<p><b>Built-in methods:</b> The built in methods in XLISP include:</p>
+
+<ul>
+<li><nobr><a href="keyword-answer.htm">:answer</a> - add a method to an <a href="object.htm">object</a></nobr></li>
+<li><nobr><a href="keyword-class.htm">:class</a> - return the <a href="object.htm">object</a>'s class</nobr></li>
+<li><nobr><a href="keyword-isnew.htm">:isnew</a> - run initialization code on <a href="object.htm">object</a></nobr></li>
+<li><nobr><a href="keyword-new.htm">:new</a> - create a new <a href="object.htm">object</a> [instance or class]</nobr></li>
+<li><nobr><a href="keyword-show.htm">:show</a> - show the internal state of the <a href="object.htm">object</a></nobr></li>
+</ul>
+
+<p><b>Message Structure:</b> The normal XLISP convention for a 'message' is
+to have a valid symbol preceeded by a colon like
+<a href="keyword-isnew.htm">:isnew</a> or ':my-message'. However, it
+is possible to define a 'message' that is a symbol without a colon, but
+this makes the code less readable.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-010.htm#class">class</a>
+object in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/clean-up.htm b/docsrc/xlisp/xlisp-doc/reference/clean-up.htm
new file mode 100644
index 0000000..98faa09
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/clean-up.htm
@@ -0,0 +1,90 @@
+<html><head><title>XLISP clean-up</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>clean-up</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c, xldbug.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(clean-up)</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'clean-up' function aborts one level of the
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a>.</nobr> This
+is valid for <nobr><a href="break.htm">break</a>s ,</nobr>
+<a href="error.htm">error</a>s and
+<a href="cerror.htm">cerror</a>s [continuable errors].
+If 'clean-up' is evaluated while not in a
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a> ,</nobr>
+an error is generated:
+
+<pre class="example">
+<font color="#AA0000">error: not in a break loop</font>
+</pre>
+
+<p>This error does not cause XLISP to go into a
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a>.</nobr>
+'clean-up' never actually returns a value.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(clean-up) <font color="#008844">; [back to previous break level]</font>
+(break "out") <font color="#008844">; break: out</font>
+(clean-up) <font color="#008844">; to exit out of break loop</font>
+</pre>
+
+<p><b>Note:</b> With Nyquist, no error is generated if 'clean-up' is
+invoked when not in a
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a>.</nobr></p>
+
+<p><b>Keystroke equivalent:</b> In the IBM PC and MS-DOS versions of XLISP,
+a 'Ctrl-g' key sequence has the same effect as doing a (clean-up). On a
+Macintosh, this can be accomplished by a pull-down menu or a
+'Command-g'. <nobr>[I haven't</nobr> tested this with Nyquist].</p>
+
+<p>See the
+<a href="../manual/xlisp-man-022.htm#clean-up">clean-up</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/close.htm b/docsrc/xlisp/xlisp-doc/reference/close.htm
new file mode 100644
index 0000000..1efb3cd
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/close.htm
@@ -0,0 +1,85 @@
+<html><head><title>XLISP close</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>close</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(close <i>file-ptr</i>)</dt>
+<dd><i>file-ptr</i> - a file pointer expression<br>
+returns - <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'close' function closes the file specified through 'file-ptr'. If
+the file close was successful, then a
+<a href="nil.htm">NIL</a> is returned as the result. For the
+file close to be successful, the 'file-ptr' has to point to a valid file.
+If the file close was not successful, an error is generated:</p>
+
+<pre class="example">
+<font color="#AA0000">error: file not open</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(close (open 'f :direction :output)) <font color="#008844">; returns NIL</font>
+(setq myfile (open 'mine :direction :output)) <font color="#008844">; create MYFILE</font>
+(print "hi" myfile) <font color="#008844">; returns "hi"</font>
+(close myfile) <font color="#008844">; returns NIL</font>
+ <font color="#008844">; file contains &lt;hi&gt; &lt;NEWLINE&gt;</font>
+(setq myfile (open 'mine :direction :input)) <font color="#008844">; open MYFILE for input</font>
+(read myfile) <font color="#008844">; returns "hi"</font>
+(close myfile) <font color="#008844">; returns NIL</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common LISP has an XLISP compatible 'close' function.
+Common LISP does support an ':abort' keyword, which is not supported in
+XLISP.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-029.htm#close">close</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/code-char.htm b/docsrc/xlisp/xlisp-doc/reference/code-char.htm
new file mode 100644
index 0000000..6497114
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/code-char.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP code-char</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>code-char</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(code-char <i>code</i>)</dt>
+<dd><i>code</i> - a numeric expression representing the
+<a href="../misc/ascii-table.htm">ASCII</a> code as an integer<br>
+returns - the character with that code or <a href="nil.htm">NIL</a> </dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'code-char' function returns a character which is the result of
+turning 'code' expression into a character. If a 'code' cannot be made into
+a character, <a href="nil.htm">NIL</a> is returned. The range
+that 'code' produces a valid character is <nobr>0 through 127.</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(code-char 48) <font color="#008844">; returns #\0</font>
+(code-char 65) <font color="#008844">; returns #\A</font>
+(code-char 97) <font color="#008844">; returns #\a</font>
+(code-char 91) <font color="#008844">; returns #\[</font>
+(code-char 10) <font color="#008844">; returns #\Newline</font>
+(code-char 128) <font color="#008844">; returns NIL</font>
+(code-char 999) <font color="#008844">; returns NIL</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp allows for some optional arguments in
+'code-char' because it supports the concept of a complex character that
+includes not only the ASCII code value, but also fonts and bits. The bits
+allow for more than <nobr>8 bits</nobr> per character <nobr>[16 bits</nobr>
+is especially useful in oriental languages]. The fonts allow for up to 128
+different fonts. XLISP does not support fonts and bits or the optional
+parameters associated with them.</p>
+
+<p><b>Note:</b> Unlike the <a href="char-code.htm">char-code</a> and
+<a href="char-int.htm">char-int</a> functions, 'code-char' and
+<a href="int-char.htm">int-char</a> are not identical in use.
+'code-char' accepts 0..127 for its range and then produces
+<a href="nil.htm">NIL</a> results.
+<a href="int-char.htm">int-char</a> accepts 0..255 for its range and
+then produces errors.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-026.htm#code-char">code-char</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/cond.htm b/docsrc/xlisp/xlisp-doc/reference/cond.htm
new file mode 100644
index 0000000..a86d487
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/cond.htm
@@ -0,0 +1,95 @@
+<html><head><title>XLISP cond</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cond</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(cond [(<i>pred1 expr1</i>) [(<i>pred2 expr2</i>) ... ]])</dt>
+<dd><i>predN</i> - a predicate <nobr>(<a href="nil.htm">NIL</a> /
+non-<a href="nil.htm">NIL</a>)</nobr> expression<br>
+<i>exprN</i> - an expression<br>
+returns - the value of the first expression whose predicate is
+non-<a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'cond' special form evaluates a series of <nobr>predicate /</nobr>
+expression pairs. 'cond' will evaluate each predicate in sequential order
+until it finds one that returns a non-<a href="nil.htm">NIL</a>
+value. The expression that is associated with the
+non-<a href="nil.htm">NIL</a> value is evaluated. The resulting
+value of the evaluated expression is returned by 'cond'. If there are no
+predicates that return a non-<a href="nil.htm">NIL</a> value,
+<a href="nil.htm">NIL</a> is returned by 'cond'. Only one
+expression is evaluated, the first one with a
+non-<a href="nil.htm">NIL</a> predicate. Note that the predicate
+can be a symbol or expression.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(cond <font color="#008844">; sample CONDitional</font>
+ ((not T) (print "this won't print"))
+ ( NIL (print "neither will this"))
+ ( T (print "this will print"))
+ ( T (print "won't get here"))) <font color="#008844">; prints "this will print"</font>
+
+(defun print-what (parm)
+ (cond <font color="#008844">; start of COND</font>
+ ((numberp parm) (print "numeric")) <font color="#008844">; check for number</font>
+ ((consp parm) (print "list")) <font color="#008844">; check for list</font>
+ ((null parm) (print "nil")) <font color="#008844">; check for NIL</font>
+ (T (print "something")))) <font color="#008844">; catch-all</font>
+
+(print-what 'a) <font color="#008844">; prints "something"</font>
+(print-what 12) <font color="#008844">; prints "numeric"</font>
+(print-what NIL) <font color="#008844">; prints "nil"</font>
+(print-what '(a b)) <font color="#008844">; prints "list"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-019.htm#cond">cond</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/cons.htm b/docsrc/xlisp/xlisp-doc/reference/cons.htm
new file mode 100644
index 0000000..08edf55
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/cons.htm
@@ -0,0 +1,74 @@
+<html><head><title>XLISP cons</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cons</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(cons <i>expr-car expr-cdr</i>)</dt>
+<dd><i>expr-car</i> - an expression<br>
+<i>expr-cdr</i> - an expression<br>
+returns - the new list</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'cons' function takes two expressions and constructs a new list from
+them. If the 'expr-cdr' is not a list, then the result will be a
+'dotted-pair'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(cons 'a 'b) <font color="#008844">; returns (A . B)</font>
+(cons 'a nil) <font color="#008844">; returns (A)</font>
+(cons 'a '(b)) <font color="#008844">; returns (A B)</font>
+(cons '(a b) '(c d)) <font color="#008844">; returns ((A B) C D)</font>
+(cons '(a b) 'c) <font color="#008844">; returns ((A B) . C)</font>
+(cons (- 4 3) '(2 3)) <font color="#008844">; returns (1 2 3)</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#cons">cons</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/consp.htm b/docsrc/xlisp/xlisp-doc/reference/consp.htm
new file mode 100644
index 0000000..9c2a8ef
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/consp.htm
@@ -0,0 +1,95 @@
+<html><head><title>XLISP consp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>consp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(consp <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the value is a
+cons, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p> The 'consp' predicate checks if the 'expr' is a non-empty list.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr' is a
+list, <a href="nil.htm">NIL</a> is returned otherwise. Note that
+if the 'expr' is <nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(consp '(a b)) <font color="#008844">; returns T - list</font>
+(consp '(a . b)) <font color="#008844">; returns T - dotted pair list</font>
+(consp #'defvar) <font color="#008844">; returns NIL - closure - macro</font>
+(consp (lambda (x) (print x))) <font color="#008844">; returns NIL - closure - lambda</font>
+(consp NIL) <font color="#008844">; returns NIL - NIL</font>
+(consp #(1 2 3)) <font color="#008844">; returns NIL - array</font>
+(consp *standard-output*) <font color="#008844">; returns NIL - stream</font>
+(consp 1.2) <font color="#008844">; returns NIL - float</font>
+(consp #'quote) <font color="#008844">; returns NIL - fsubr</font>
+(consp 1) <font color="#008844">; returns NIL - integer</font>
+(consp object) <font color="#008844">; returns NIL - object</font>
+(consp "str") <font color="#008844">; returns NIL - string</font>
+(consp #'car) <font color="#008844">; returns NIL - subr</font>
+(consp 'a) <font color="#008844">; returns NIL - symbol</font>
+</pre>
+
+<p><b>Note:</b> When applied to 'consp',
+<nobr><a href="nil.htm">NIL</a> ,</nobr> the empty list, returns
+a <a href="nil.htm">NIL</a>. <a href="global-obarray.html">NIL</a>
+or '() is used in many places as a list-class or atom-class expression. Both
+<a href="atom.htm">atom</a>
+and <nobr><a href="listp.htm">listp</a> ,</nobr> when applied to
+<nobr><a href="nil.htm">NIL</a> ,</nobr> return
+<a href="t.htm">&nbsp;T&nbsp;</a>. If you wish to check for a
+list where an empty list is still considered a valid list, use the
+<a href="listp.htm">listp</a> predicate.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#consp">consp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/continue.htm b/docsrc/xlisp/xlisp-doc/reference/continue.htm
new file mode 100644
index 0000000..44c620e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/continue.htm
@@ -0,0 +1,90 @@
+<html><head><title>XLISP continue</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>continue</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c, xldbug.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(continue)</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p> The 'continue' function attempts to continue from the
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a>.</nobr>
+This is valid only for <a href="cerror.htm">cerror</a>s [continuable
+errors]. If 'continue' is evaluated while not in a
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a> ,</nobr> an
+error is generated:</p>
+
+<pre class="example">
+<font color="#AA0000">error: not in a break loop</font>
+</pre>
+
+<p>In Nyquist, the error is:</p>
+
+<pre class="example">
+<font color="#AA0000">error: this error can't be continued</font>
+</pre>
+
+<p>This error does not cause XLISP to go into a break loop. 'continue' never
+actually returns a value.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(continue) <font color="#008844">; error: not in a break loop</font>
+(break "out") <font color="#008844">; break: out</font>
+(continue) <font color="#008844">; to continue from break loop</font>
+ <font color="#008844">; BREAK returns NIL</font>
+</pre>
+
+<p><b>Keystroke equivalent:</b> In the IBM PC and MS-DOS versions of XLISP,
+a 'Ctrl-p' key sequence has the same effect as doing a (continue). On a
+Macintosh, this can be accomplished by a pull-down menu or a 'Command-p'.
+<nobr>[I haven't</nobr> tested this with Nyquist.]</p>
+
+<p>See the
+<a href="../manual/xlisp-man-022.htm#continue">continue</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/cos.htm b/docsrc/xlisp/xlisp-doc/reference/cos.htm
new file mode 100644
index 0000000..26bd1f3
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/cos.htm
@@ -0,0 +1,71 @@
+<html><head><title>XLISP cos</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>cos</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(cos <i>expr</i>)</dt>
+<dd><i>expr</i> - floating point number/expression<br>
+returns - the cosine of the number</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'cos' function returns the cosine of the 'expr'. The 'expr' is
+in radians.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(cos 0.0) <font color="#008844">; returns 1</font>
+(cos (/ 3.14159 2)) <font color="#008844">; returns 1.32679e-06 (almost 0)</font>
+(cos .5) <font color="#008844">; returns 0.877583</font>
+(cos 0) <font color="#008844">; error: bad integer operation</font>
+(cos 1.) <font color="#008844">; error: bad integer operation</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#cos">cos</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/decf.htm b/docsrc/xlisp/xlisp-doc/reference/decf.htm
new file mode 100644
index 0000000..1714e3f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/decf.htm
@@ -0,0 +1,88 @@
+<html><head><title>XLISP decf</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>decf</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp macro (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>misc.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>decf</b> <i>symbol</i>)</nobr></dt>
+<dd><i>symbol</i> - a symbol with numerical value bound to it<br>
+returns - the new value of the symbol</dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, 'decf' is implemented as a Lisp macro:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">decf</font> (symbol)
+ `(setf ,symbol (1- ,symbol)))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'decf' macro is used for decrementing a numerical value of a variable.
+<nobr>1 is</nobr> substracted to the number and the result is stored in the
+variable. <nobr>An error</nobr> is signalled if the variable doesn't hold a
+number.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq n 3) =&gt; 3
+(decf n) =&gt; 2
+n =&gt; 2
+(decf n) =&gt; 1
+
+(setq n 1.8) =&gt; 1.8
+(decf n) =&gt; 0.8
+(decf n) =&gt; -0.2
+(decf n) =&gt; -1.2
+n =&gt; -1.2
+
+(setq n #\a) =&gt; #\a
+(decf a) =&gt; <font color="#AA0000">error: bad argument type - #\a</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/decrement.htm b/docsrc/xlisp/xlisp-doc/reference/decrement.htm
new file mode 100644
index 0000000..e41a3bd
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/decrement.htm
@@ -0,0 +1,75 @@
+<html><head><title>XLISP 1-</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>1&minus;</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(1- <i>expr</i>)</nobr></dt>
+<dd><i>expr</i> - integer or floating point number/expression<br>
+returns - the number minus one</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The <nobr>'1-' [decrement]</nobr> function subtracts one from a number
+and returns the result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(1- 1) =&gt; 0
+(1- 99.6) =&gt; 98.6
+(1- 1 2) =&gt; <font color="#AA0000">error: too many arguments</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/defmacro.htm b/docsrc/xlisp/xlisp-doc/reference/defmacro.htm
new file mode 100644
index 0000000..c1dc67d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/defmacro.htm
@@ -0,0 +1,142 @@
+<html><head><title>XLISP defmacro</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>defmacro</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(defmacro <i>symbol arg-list body</i>)</dt>
+<dd><i>symbol</i> - the name of the macro being defined<br>
+<i>arg-list</i> - a list of the formal arguments to the macro of the form:<br>
+<dl>
+<dd>([<i>arg1</i> ... ]<br>
+&nbsp;[<a href="lambda-keyword-optional.htm">&amp;optional</a> <i>oarg1</i> ... ]<br>
+&nbsp;[<a href="lambda-keyword-rest.htm">&amp;rest</a> <i>rarg</i>]<br>
+&nbsp;[<a href="lambda-keyword-key.htm">&amp;key</a> ... ]<br>
+&nbsp;[<a href="lambda-keyword-aux.htm">&amp;aux</a> <i>aux1</i> ... ])<br></dd>
+</dl>
+<i>body</i> - a series of LISP forms (expressions) that are executed in order.<br>
+returns - the macro <i>symbol</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>'defmacro' defines a macro expansion. When the 'symbol' name of the macro
+expansion is encountered [similar to a function invocation], the 'body' of
+code that was defined in the 'defmacro' is expanded and replaces the macro
+invocation.</p>
+
+<p>All of the 'argN' formal arguments that are defined are required to
+appear in the invocation of the macro expansion.</p>
+
+<p>If there are any
+<a href="lambda-keyword-optional.htm">&amp;optional</a> arguments defined, they will
+be filled in order.</p>
+
+<p>If there is a <a href="lambda-keyword-rest.htm">&amp;rest</a>
+argument defined, and all the required formal arguments and
+<a href="lambda-keyword-optional.htm">&amp;optional</a> arguments are filled, any and
+all further parameters will be passed into the function via the 'rarg'
+argument. <b>Note</b> that there can be only one 'rarg' argument for
+<a href="lambda-keyword-rest.htm">&amp;rest</a>.</p>
+
+<p>If there are insufficient parameters for any of the
+<a href="lambda-keyword-optional.htm">&amp;optional</a> or
+<a href="lambda-keyword-rest.htm">&amp;rest</a> arguments, they will contain
+<a href="nil.htm">NIL</a>.</p>
+
+<p>The <a href="lambda-keyword-aux.htm">&amp;aux</a> variables are a mechanism
+for you to define variables local to the 'defmacro' execution. At the end of
+the function execution, these local symbols and their values are are
+removed.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defmacro plus (num1 num2) <font color="#008844">; define PLUS macro</font>
+ `(+ ,num1 ,num2)) <font color="#008844">; which is a 2 number add</font>
+
+(plus 1 2) <font color="#008844">; returns 3</font>
+(setq x 10) <font color="#008844">; set x to 10</font>
+(setq y 20) <font color="#008844">; set y to 20</font>
+(plus x y) <font color="#008844">; returns 30</font>
+
+(defmacro betterplus (num &amp;rest nlist) <font color="#008844">; define a BETTERPLUS macro</font>
+ `(+ ,num ,@nlist)) <font color="#008844">; which can take many numbers</font>
+
+(betterplus 1) <font color="#008844">; returns 1</font>
+(betterplus 1 2 3) <font color="#008844">; returns 6</font>
+(betterplus 1 2 3 4 5) <font color="#008844">; returns 15</font>
+
+(defmacro atest (x &amp;optional y &amp;rest z) <font color="#008844">; define ATEST macro</font>
+ (princ " x: ") (princ x) <font color="#008844">; \</font>
+ (princ " y: ") (princ y) <font color="#008844">; print out the parameters</font>
+ (princ " z: ") (princ z) (terpri) <font color="#008844">; / (un-evaluated)</font>
+ `(print (+ ,x ,y ,@z))) <font color="#008844">; add them together (eval'ed)</font>
+
+(atest 1) <font color="#008844">; prints - x: 1 y: NIL z: NIL</font>
+ <font color="#008844">; error: bad argument type</font>
+ <font color="#008844">; because (+ 1 NIL) isn't valid</font>
+(atest 1 2) <font color="#008844">; prints - x: 1 y: 2 z: NIL</font>
+ <font color="#008844">; returns 3</font>
+(atest 1 2 3) <font color="#008844">; prints - x: 1 y: 2 z: (3)</font>
+ <font color="#008844">; returns 6</font>
+(atest 1 2 3 4 5) <font color="#008844">; prints - x: 1 y: 2 z: (3 4 5)</font>
+ <font color="#008844">; returns 15</font>
+(setq a 99) <font color="#008844">; set A to 99</font>
+(setq b 101) <font color="#008844">; set B to 101</font>
+(atest a b) <font color="#008844">; prints - x: A y: B z: NIL</font>
+ <font color="#008844">; returns 200</font>
+(atest a b 9 10 11) <font color="#008844">; prints - x: A y: B z: (9 10 11)</font>
+ <font color="#008844">; returns 230</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp supports an optional documentation
+string as the first form in the 'body' of a 'defmacro' or
+<a href="defun.htm">defun</a>. XLISP will accept this string
+as a valid form, but it will not do anything special with it.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#defmacro">defmacro</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/defun.htm b/docsrc/xlisp/xlisp-doc/reference/defun.htm
new file mode 100644
index 0000000..aaa97c1
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/defun.htm
@@ -0,0 +1,134 @@
+<html><head><title>XLISP defun</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>defun</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(defun <i>symbol arg-list body</i>)</dt>
+<dd><i>symbol</i> - the name of the function being defined<br>
+<i>arg-list</i> - a list of the formal arguments to the function of the form:<br>
+<dl>
+<dd>([<i>arg1</i> ... ]<br>
+&nbsp;[<a href="lambda-keyword-optional.htm">&amp;optional</a> <i>oarg1</i> ... ]<br>
+&nbsp;[<a href="lambda-keyword-rest.htm">&amp;rest</a> <i>rarg</i>]<br>
+&nbsp;[<a href="lambda-keyword-key.htm">&amp;key</a> ... ]<br>
+&nbsp;[<a href="lambda-keyword-aux.htm">&amp;aux</a> <i>aux1</i> ... ])<br></dd>
+</dl>
+<i>body</i> - a series of LISP forms (expressions) that are executed in order.<br>
+returns - the function <i>symbol</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'defun' special form defines a new function or re-defines an
+exisiting function. The last form in 'body' that is evaluated is the value
+that is returned when the function is executed.</p>
+
+<p>All of the 'argN' formal arguments that are defined are required to
+appear in a call to the defined function.</p>
+
+<p>If there are any <a href="lambda-keyword-optional.htm">&amp;optional</a>
+arguments defined, they will be filled in order.</p>
+
+<p>If there is a <a href="lambda-keyword-rest.htm">&amp;rest</a> argument
+defined, and all the required formal arguments and
+<a href="lambda-keyword-optional.htm">&amp;optional</a> arguments are filled, any
+and all further parameters will be passed into the function via the 'rarg'
+argument. <b>Note</b> that there can be only one 'rarg' argument for
+<a href="lambda-keyword-rest.htm">&amp;rest</a>.</p>
+
+<p>If there are insufficient parameters for any of the
+<a href="lambda-keyword-optional.htm">&amp;optional</a> or
+<a href="lambda-keyword-rest.htm">&amp;rest</a> arguments, they will contain
+<a href="nil.htm">NIL</a>.</p>
+
+<p>The <a href="lambda-keyword-aux.htm">&amp;aux</a> variables are a mechanism
+for you to define variables local to the function definition. At the end of
+the function execution, these local symbols and their values are are
+removed.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun my-add <font color="#008844">; define function MY-ADD</font>
+ (num1 num2) <font color="#008844">; with 2 formal parameters</font>
+ (+ num1 num2)) <font color="#008844">; that adds the two paramters</font>
+
+(my-add 1 2) <font color="#008844">; returns 3</font>
+
+(defun foo <font color="#008844">; define function FOO</font>
+ (a b &amp;optional c d &amp;rest e) <font color="#008844">; with some of each argument</font>
+ (print a) (print b)
+ (print c) (print d) <font color="#008844">; print out each</font>
+ (print e))
+
+(foo) <font color="#008844">; error: too few arguments</font>
+(foo 1) <font color="#008844">; error: too few arguments</font>
+(foo 1 2) <font color="#008844">; prints 1 2 NIL NIL NIL</font>
+(foo 1 2 3) <font color="#008844">; prints 1 2 3 NIL NIL</font>
+(foo 1 2 3 4) <font color="#008844">; prints 1 2 3 4 NIL</font>
+(foo 1 2 3 4 5) <font color="#008844">; prints 1 2 3 4 (5)</font>
+(foo 1 2 3 4 5 6 7 8 9) <font color="#008844">; prints 1 2 3 4 (5 6 7 8 9)</font>
+
+(defun my-add <font color="#008844">; define function MY-ADD</font>
+ (num1 &amp;rest num-list &amp;aux sum) <font color="#008844">; with 1 arg, rest, 1 aux var</font>
+ (setq sum num1) <font color="#008844">; clear SUM</font>
+ (dotimes (i (length num-list) ) <font color="#008844">; loop through rest list</font>
+ (setq sum (+ sum (car num-list))) <font color="#008844">; add the number to sum</font>
+ (setq num-list (cdr num-list))) <font color="#008844">; and remove num from list</font>
+ sum) <font color="#008844">; return sum when finished</font>
+
+(my-add 1 2 3 4) <font color="#008844">; returns 10</font>
+(my-add 5 5 5 5 5) <font color="#008844">; returns 25</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp supports an optional documentation
+string as the first form in the 'body' of a
+<a href="defmacro.htm">defmacro</a> or 'defun'. XLISP will accept this
+string as a valid form, but it will not do anything special with it.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#defun">defun</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/delete-if-not.htm b/docsrc/xlisp/xlisp-doc/reference/delete-if-not.htm
new file mode 100644
index 0000000..7aed3a8
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/delete-if-not.htm
@@ -0,0 +1,107 @@
+<html><head><title>XLISP delete-if-not</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>delete-if-not</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(delete-if-not <i>test list</i>)</dt>
+<dd><i>test</i> - the test function to be performed<br>
+<i>list</i> - the list to delete from<br>
+returns - the list with non-matching elements deleted</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'delete-if-not' function destructively modifies the 'list' by
+removing the elements of the list that fail the 'test'. The destructive
+aspect of this operation means that the actual symbol value is used in the
+list-modifying operations, not a copy.</p>
+
+<p>'list' must evaluate to a valid list. An atom for 'list' will result in
+an error:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<p>Having <a href="nil.htm">NIL</a> for 'list' will return a
+<a href="nil.htm">NIL</a> as the result.</p>
+
+<h2>Examples</h2>
+
+<p><b>Caution:</b> there's a bug:</p>
+
+<pre class="example">
+(setq mylist '(1 2 3 4 5 6 7 8)) <font color="#008844">; set up a list of numbers</font>
+(delete-if-not 'evenp mylist) <font color="#008844">; returns (2 4 6 8)</font>
+(print mylist) <font color="#008844">; prints (1 2 4 6 8)</font> <font color="#AA0000">&lt;-BUG!</font>
+
+(setq mylist '(1 2 3 4 5 6 7 8)) <font color="#008844">; set up the same list again</font>
+(setq mylist (delete-if-not 'evenp mylist)) <font color="#008844">; returns (3 5 7)</font>
+(print mylist) <font color="#008844">; prints (3 5 7)</font> <font color="#009900">&lt;-OK</font>
+
+(setq mylist '(1 2 3 4 5 6 7 8)) <font color="#008844">; ... again ...</font>
+(delete-if-not 'oddp mylist) <font color="#008844">; returns (1 3 5 7)</font>
+(print mylist) <font color="#008844">; prints (1 3 5 7)</font> <font color="#009900">&lt;-OK</font>
+
+(setq mylist '(1 2 3 4 5 6 7 8)) <font color="#008844">; ... and again ...</font>
+(setq mylist (delete-if-not 'oddp mylist)) <font color="#008844">; returns (1 3 5 7)</font>
+(print mylist) <font color="#008844">; prints (1 3 5 7)</font> <font color="#009900">&lt;-OK</font>
+</pre>
+
+<p><b>Bug:</b> 'delete-if-not' will return the proper value, but it does not
+always properly modify the symbol containing the value. This seems to be
+true if the first element of the 'list' fails the test [and should be
+deleted]. It's always better to use 'delete-if-not' together with
+<a href="setq.htm">setq</a> or
+<a href="setf.htm">setf</a> as shown in <nobr>example 2</nobr>
+<nobr>and 4.</nobr></p>
+
+<p><b>Common Lisp:</b> XLISP does not support the ':from-end', ':start',
+':end', ':count' and ':key' keywords which Common Lisp does.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-017.htm#delete-if-not">delete-if-not</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/delete-if.htm b/docsrc/xlisp/xlisp-doc/reference/delete-if.htm
new file mode 100644
index 0000000..f0d0a1d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/delete-if.htm
@@ -0,0 +1,110 @@
+<html><head><title>XLISP delete-if</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>delete-if</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(delete-if <i>test list</i>)</dt>
+<dd><i>test</i> - the test function to be performed<br>
+<i>list</i> - the list to delete from<br>
+returns - the list with matching elements deleted</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'delete-if' function destructively modifies the 'list' by removing
+the elements of the list that pass the 'test'. The destructive aspect of
+this operation means that the actual symbol value is used in the
+list-modifying operations, not a copy.</p>
+
+<p>'list' must evaluate to a valid list. An atom for 'list' will result in
+an error:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<p>Having <a href="nil.htm">NIL</a> for 'list' will return a
+<a href="nil.htm">NIL</a> as the result.</p>
+
+<h2>Examples</h2>
+
+<p><b>Caution:</b> there's a bug:</p>
+
+<pre class="example">
+(setq mylist '(1 2 3 4 5 6 7 8)) <font color="#008844">; set up a list starting of numbers</font>
+(delete-if 'oddp mylist) <font color="#008844">; returns (2 4 6)</font>
+(print mylist) <font color="#008844">; prints (1 2 4 6)</font> <font color="#AA0000">&lt;-BUG!</font>
+
+(setq mylist '(1 2 3 4 5 6 7 8)) <font color="#008844">; set up the same list again</font>
+(setq mylist (delete-if 'oddp mylist)) <font color="#008844">; returns (2 4 6)</font>
+(print mylist) <font color="#008844">; prints (2 4 6)</font> <font color="#009900">&lt;-OK</font>
+
+(setq mylist '(1 2 3 4 5 6 7 8)) <font color="#008844">; ... again ...</font>
+(delete-if 'evenp mylist) <font color="#008844">; returns (1 3 5 7)</font>
+(print mylist) <font color="#008844">; prints (1 3 5 7)</font> <font color="#009900">&lt;-OK</font>
+
+(setq mylist '(1 2 3 4 5 6 7 8)) <font color="#008844">; ... and again ...</font>
+(setq mylist (delete-if 'evenp mylist)) <font color="#008844">; returns (1 3 5 7)</font>
+(print mylist) <font color="#008844">; prints (1 3 5 7)</font> <font color="#009900">&lt;-OK</font>
+</pre>
+
+<p><b>Bug:</b> 'delete-if' will return the proper value, but it does not
+always properly modify the symbol containing the value. This seems to be
+true if the first element of the 'list' passes the test [and should be
+deleted]. It's always better to use 'delete-if' together with
+<a href="setq.htm">setq</a> or
+<a href="setf.htm">setf</a> as shown in <nobr>example 2</nobr>
+<nobr>and 4.</nobr></p>
+
+<p><b>Note:</b> This bug can be reproduced with Nyquist 2.36 [in June 2007],
+so please take care.</p>
+
+<p><b>Common Lisp:</b> XLISP does not support the ':from-end', ':start',
+':end', ':count' and ':key' keywords which Common LISP does.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-017.htm#delete-if">delete-if</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/delete.htm b/docsrc/xlisp/xlisp-doc/reference/delete.htm
new file mode 100644
index 0000000..71baf5d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/delete.htm
@@ -0,0 +1,99 @@
+<html><head><title>XLISP delete</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>delete</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(delete <i>expr list</i> [{:test | :test-not} <i>test</i>])</dt>
+<dd><i>expr</i> - the expression to delete from <i>list</i><br>
+<i>list</i> - the list to destructively modify<br>
+<i>test</i> - optional test function (default is <a href="eql.htm">eql</a>)<br>
+returns - the list with the matching expressions deleted</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'delete' function destructively modifies the 'list' by removing the
+'expr'. The destructive aspect of this operation means that the actual
+symbol value is used in the list-modifying operations, not a copy. If 'expr'
+appears multiple times in the 'list', all occurances will be removed.</p>
+
+<p>'list' must evaluate to a valid list. An atom for 'list' will result in
+an error:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<p>Having <a href="nil.htm">NIL</a> for 'list' will return a
+<a href="nil.htm">NIL</a> as the result. You may specify your own
+test with the ':test' and ':test-not' keywords.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(delete 'b NIL) <font color="#008844">; returns NIL</font>
+(delete 'b '(a b b c b)) <font color="#008844">; returns (A C)</font>
+(setq a '(1 2 3)) (setq b a) <font color="#008844">; set up A and B</font>
+(delete '2 a) <font color="#008844">; returns (1 3)</font>
+(print a) <font color="#008844">; prints (1 3) A IS MODIFIED!</font>
+(print b) <font color="#008844">; prints (1 3) B IS MODIFIED!</font>
+(delete '(b) '((a)(b)(c))) <font color="#008844">; returns ((A) (B) (C))</font>
+ <font color="#008844">; EQL doesn't work on lists</font>
+(delete '(b) '((a)(b)(c)) :test 'equal) <font color="#008844">; returns ((A) (C))</font>
+</pre>
+
+<p><b>Note:</b> The 'delete' function can work with a list or string as the
+'expr'. However, the default <a href="eql.htm">eql</a> test does
+not work with lists or strings, only symbols and numbers. To make this work,
+you need to use the ':test' keyword along with
+<a href="equal.htm">equal</a> for 'test'.</p>
+
+<p><b>Common Lisp:</b> XLISP does not support the ':from-end', ':start',
+':end', ':count' and ':key' keywords which Common Lisp does.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-017.htm#delete">delete</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/digit-char-p.htm b/docsrc/xlisp/xlisp-doc/reference/digit-char-p.htm
new file mode 100644
index 0000000..99930d2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/digit-char-p.htm
@@ -0,0 +1,87 @@
+<html><head><title>XLISP digit-char-p</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>digit-char-p</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(digit-char-p <i>char</i>)</dt>
+<dd><i>char</i> - a character expression<br>
+returns - the digit weight if character is a digit,
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'digit-char-p' predicate function checks if the 'char' expression is
+a numeric digit. If 'char' is numeric digit, the equivalent integer value
+is returned, otherwise a <a href="nil.htm">NIL</a> is
+returned. Decimal digits are '0' [ASCII decimal <nobr>value 48]</nobr>
+through '9' [ASCII decimal <nobr>value 57].</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(digit-char-p #\0) <font color="#008844">; returns 0</font>
+(digit-char-p #\9) <font color="#008844">; returns 9</font>
+(digit-char-p #\A) <font color="#008844">; returns NIL</font>
+(digit-char-p #\a) <font color="#008844">; returns NIL</font>
+(digit-char-p #\.) <font color="#008844">; returns NIL</font>
+(digit-char-p #\-) <font color="#008844">; returns NIL</font>
+(digit-char-p #\+) <font color="#008844">; returns NIL</font>
+</pre>
+
+<p><b>Note:</b> Other non-digit characters used in numbers are NOT included:
+plus [+], minus [-], exponent <nobr>[e or E]</nobr> and decimal point
+[.].</p>
+
+<p><b>Common Lisp:</b> Common Lisp supports the use of an optional radix
+parameter. This option specifies numeric base. This allows the
+'digit-char-p' to function properly for hexadecimal digits [for example].
+Common LISP supports up to base 36 radix systems. XLISP does not support
+this radix parameter.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-026.htm#digit-char-p">digit-char-p</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/digit-char.htm b/docsrc/xlisp/xlisp-doc/reference/digit-char.htm
new file mode 100644
index 0000000..5d40c74
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/digit-char.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP digit-char</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>digit-char</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(digit-char <i>int</i>)</dt>
+<dd><i>int</i> - an integer expression<br>
+returns - the digit character or <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'digit-char' function takes an integer expression 'int' and converts
+it into a decimal digit character. So, an integer value of '0' produces the
+character '#\0'. An integer value of '1' produces the character '#\1' and so
+on. If a valid character can be produce it is returned, otherwise a
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(digit-char 0) <font color="#008844">; returns #\0</font>
+(digit-char 9) <font color="#008844">; returns #\9</font>
+(digit-char 10) <font color="#008844">; returns NIL</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp supports the use of an optional radix
+parameter. This option specifies numeric base. This allows the 'digit-char'
+to function properly for hexadecimal digits [for example]. Common Lisp
+supports up to <nobr>base 36</nobr> radix systems. XLISP does not support
+this radix parameter. Common Lisp also supports a font parameter which XLISP
+does not.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-026.htm#digit-char">digit-char</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/division.htm b/docsrc/xlisp/xlisp-doc/reference/division.htm
new file mode 100644
index 0000000..2fae40c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/division.htm
@@ -0,0 +1,101 @@
+<html><head><title>XLISP /</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>/</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(/ <i>expr1</i> ...)</nobr></dt>
+<dd><i>exprN</i> - integer or floating point number/expression<br>
+returns - the result of the division</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '/' function divides the first number given by the rest of the
+numbers and returns the result. If all the expressions are integers, the
+division is integer division. If any expression is a floating point number,
+then the division will be floating point division.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(/ 1) =&gt; 1
+(/ 1 2) =&gt; 0 <font color="#008844">; integer division</font>
+(float (/ 1 2)) =&gt; 0 <font color="#008844">; integer division</font>
+(/ (float 1) 2) =&gt; 0.5 <font color="#008844">; type contagion</font>
+(/ 1 1.0 2) =&gt; 0.5 <font color="#008844">; type contagion</font>
+(/ (float 1) 2 3) =&gt; 0.166667 <font color="#008844">; type contagion</font>
+(/ 1 1.0 2 3 4) =&gt; 0.0416667 <font color="#008844">; type contagion</font>
+</pre>
+
+<pre class="example">
+&gt; (print (+ 1 2 (* 3.5 (/ 3.9 1.45))))
+12.4138
+12.4138
+</pre>
+
+<p>See <a href="addition.htm">&nbsp;+&nbsp;</a>,
+<a href="multiplication.htm">&nbsp;*&nbsp;</a>,
+<a href="float.htm">float</a>, <a href="print.htm">print</a>.
+XLISP first prints the value on the screen, the second number is the
+return value.</p>
+
+<p>In XLISP, the type contagion depends on the order of
+occurrence:</p>
+
+<pre class="example">
+(/ 1 2 1.0) =&gt; 0 <font color="#008844">; because (/ 1 2) =&gt; 0 and (/ 0 1.0) =&gt; 0.0</font>
+(/ 1.0 2 1) =&gt; 0.5 <font color="#008844">; because (/ 1.0 2) =&gt; 0.5 and (/ 0.5 1) =&gt; 0.5</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/do-star.htm b/docsrc/xlisp/xlisp-doc/reference/do-star.htm
new file mode 100644
index 0000000..7ff4415
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/do-star.htm
@@ -0,0 +1,144 @@
+<html><head><title>XLISP do*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>do*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(do* ([<i>binding</i> ... ]) (<i>test-expr</i> [<i>result</i>]) [<i>expr</i> ... ])</dt>
+<dd><i>binding</i> - a variable binding which is can take one of the following forms:<br>
+<dl><dd><i>symbol</i><br>
+(<i>symbol init-expr</i> [<i>step-expr</i>])
+<dl><dd><i>symbol</i> - a symbol<br>
+<i>init-expr</i> - an initialization expression for <i>symbol</i><br>
+<i>step-expr</i> - an expression with that <i>symbol</i> is updated
+at the end of each loop</dd></dl></dd></dl>
+<i>test-expr</i> - iteration ends when this expression returns a
+non-<a href="nil.htm">NIL</a> value<br>
+<i>result</i> - an optional expression for the returned result<br>
+<i>expr</i> - expressions comprising the body of the loop which may
+contain <a href="return.htm">return</a>s,
+<a href="go.htm">go</a>s or tags for
+<a href="go.htm">go</a><br>
+returns - the value of the last result expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p> The 'do*' special form is basically a 'while' looping construct that
+contains symbols [with optional initializations and updates], a loop test
+[with an optional return value] and a block of code [expressions] to
+evaluate. The 'do*' form evaluates its initializations and updates in
+sequential order [as opposed to <a href="do.htm">do</a> which
+doesn't]. The sequence of these events is:</p>
+
+<pre>
+ <i>init-expr</i> execution
+ while <i>test-expr</i> do
+ loop code execution
+ <i>step-expr</i> execution
+ end-while
+ return <i>result</i>
+</pre>
+
+<p>The first form after the 'do*' is the 'binding' form. It contains a
+series of 'symbols' or 'bindings'. The 'binding' is a 'symbol' followed by
+an initialization expression 'init-expr' and an optional 'step-expr'. If
+there is no 'init-expr', the 'symbol' will be initialized to
+<a href="nil.htm">NIL</a>. There is no specification as to the
+order of execution of the bindings or the step expressions, except that they
+happen all together.</p>
+
+<p> The 'do*' form will go through and create and initialize the symbols.
+This is followed by evaluating the 'test-expr'. If 'test-expr' returns a
+non-<a href="nil.htm">NIL</a> value, the loop will terminate. If
+'test-expr' returns a <a href="nil.htm">NIL</a> value then the
+'do*' will sequentially execute the 'exprs'. After execution of the loop
+'exprs', the 'symbols' are set to the step-exprs' [if the 'step-exprs'
+exist]. Then, the 'test-expr' is re-evaluated, and so on. The value of the
+'result' expression is evaluated and returned. If no 'result' is specified,
+<a href="nil.htm">NIL</a> is returned. When the 'do*' is finished
+execution, the 'symbols' that were defined will no longer exist or retain
+their values.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(do <font color="#008844">; DO example - won't work</font>
+ ((i 0) <font color="#008844">; var I=0</font>
+ (j i)) <font color="#008844">; var J=I (won't work)</font>
+ ((eql i j) "done") <font color="#008844">; test and result</font>
+ (print "looping")) <font color="#008844">; error: unbound variable - I</font>
+
+(do* <font color="#008844">; DO* example - will work</font>
+ ((i 0) <font color="#008844">; var I=0</font>
+ (j i)) <font color="#008844">; var J=I (proper exec. order)</font>
+ ((eql i j) "done") <font color="#008844">; test and result</font>
+ (print "looping")) <font color="#008844">; returns "done"</font>
+
+(do* (i) <font color="#008844">; DO* loop with var I</font>
+ ((eql i 0) "done") <font color="#008844">; test and result</font>
+ (print i) (setq i 0) (print i)) <font color="#008844">; prints NIL 0</font>
+ <font color="#008844">; returns "done"</font>
+
+(do* (i) <font color="#008844">; DO* loop with var I</font>
+ ((eql i 0)) <font color="#008844">; test but no result</font>
+ (print i) (setq i 0) (print i)) <font color="#008844">; prints NIL 0</font>
+ <font color="#008844">; returns NIL</font>
+
+(do* <font color="#008844">; DO* loop</font>
+ ((i 0 (setq i (1+ i))) <font color="#008844">; var I=0 increment by 1</font>
+ (j 10 (setq j (1- j)))) <font color="#008844">; var J=10 decrement by 1</font>
+ ((eql i j) "met in the middle") <font color="#008844">; test and result</font>
+ (princ i) (princ " ") <font color="#008844">; prints 0 10</font>
+ (princ j) (terpri)) <font color="#008844">; 1 9</font>
+ <font color="#008844">; 2 8</font>
+ <font color="#008844">; 3 7</font>
+ <font color="#008844">; 4 6</font>
+ <font color="#008844">; returns "met in the middle"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-020.htm#do*">do*</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/do.htm b/docsrc/xlisp/xlisp-doc/reference/do.htm
new file mode 100644
index 0000000..7b1258b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/do.htm
@@ -0,0 +1,133 @@
+<html><head><title>XLISP do</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>do</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(do ([<i>binding</i> ... ]) (<i>test-expr</i> [<i>result</i>]) [<i>expr</i> ... ])</dt>
+<dd><i>binding</i> - a variable binding which is can take one of the following forms:<br>
+<dl><dd><i>symbol</i><br>
+(<i>symbol init-expr</i> [<i>step-expr</i>])
+<dl><dd><i>symbol</i> - a symbol<br>
+<i>init-expr</i> - an initialization expression for <i>symbol</i><br>
+<i>step-expr</i> - an expression with that <i>symbol</i> is updated
+at the end of each loop</dd></dl></dd></dl>
+<i>test-expr</i> - iteration ends when this expression returns a
+non-<a href="nil.htm">NIL</a> value<br>
+<i>result</i> - an optional expression for the returned result<br>
+<i>expr</i> - expressions comprising the body of the loop which may
+contain <a href="return.htm">return</a>s,
+<a href="go.htm">go</a>s or tags for
+<a href="go.htm">go</a><br>
+returns - the value of the last result expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'do' special form is basically a 'while' looping construct that
+contains symbols [with optional initializations and updates], a loop test
+[with an optional return value] and a block of code [expressions] to
+evaluate. The 'do' form evaluates its initializations and updates in no
+specified order [as opposed to <a href="do-star.htm">do*</a> which
+does it in sequential order]. The sequence of these events is:</p>
+
+<pre>
+ <i>init-expr</i> execution
+ while not <i>test-expr</i> do
+ loop code execution
+ <i>step-expr</i> execution
+ end-while
+ return <i>result</i>
+</pre>
+
+
+<p> The first form after the 'do' is the 'binding' form. It contains a
+series of 'symbols' or 'bindings'. The 'binding' is a 'symbol' followed by
+an initialization expression 'init-expr' and an optional 'step-expr'. If
+there is no 'init-expr', the 'symbol' will be initialized to
+<a href="nil.htm">NIL</a>. There is no specification as to the
+order of execution of the bindings or the step expressions, except that
+they happen all together.</p>
+
+<p>The 'do' form will go through and create and initialize the symbols.
+This is followed by evaluating the 'test-expr'. If 'test-expr' returns a
+non-<a href="nil.htm">NIL</a> value, the loop will terminate.
+If 'test-expr' returns a <a href="nil.htm">NIL</a> value then
+the 'do' will sequentially execute the 'exprs'. After execution of the loop
+'exprs', the 'symbols' are set to the 'step-exprs' [if the 'step-exprs'
+exist]. Then, the 'test-expr' is re-evaluated, and so on. The value of the
+'result' expression is evaluated and returned. If no 'result' is specified,
+<a href="nil.htm">NIL</a> is returned. When the 'do' is finished
+execution, the 'symbol's that were defined will no longer exist or retain
+their values.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(do (i) <font color="#008844">; DO loop with var I</font>
+ ((eql i 0) "done") <font color="#008844">; test and result</font>
+ (print i) (setq i 0) (print i)) <font color="#008844">; prints NIL 0</font>
+ <font color="#008844">; returns "done"</font>
+
+(do (i) <font color="#008844">; DO loop with var I</font>
+ ((eql i 0)) <font color="#008844">; test but no result</font>
+ (print i) (setq i 0) (print i)) <font color="#008844">; prints NIL 0</font>
+ <font color="#008844">; returns NIL</font>
+
+(do <font color="#008844">; DO loop</font>
+ ((i 0 (setq i (1+ i))) <font color="#008844">; var I=0 increment by 1</font>
+ (j 10 (setq j (1- j)))) <font color="#008844">; var J=10 decrement by 1</font>
+ ((eql i j) "met in the middle") <font color="#008844">; test and result</font>
+ (princ i) (princ " ") <font color="#008844">; prints 0 10</font>
+ (princ j) (terpri)) <font color="#008844">; 1 9</font>
+ <font color="#008844">; 2 8</font>
+ <font color="#008844">; 3 7</font>
+ <font color="#008844">; 4 6</font>
+ <font color="#008844">; returns "met in the middle"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-020.htm#do">do</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/dolist.htm b/docsrc/xlisp/xlisp-doc/reference/dolist.htm
new file mode 100644
index 0000000..ab6c637
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/dolist.htm
@@ -0,0 +1,111 @@
+<html><head><title>XLISP dolist</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>dolist</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(dolist (<i>symbol list-expr</i> [<i>result</i>]) [<i>expr</i> ... ])</dt>
+<dd><i>symbol</i> - a symbol<br>
+<i>list-expr</i> - a list expression<br>
+<i>result</i> - an optional expression for the returned result<br>
+<i>expr</i> - expressions comprising the body of the loop which may
+contain <a href="return.htm">return</a>s,
+<a href="go.htm">go</a>s or tags for
+<a href="go.htm">go</a><br>
+returns - the return value of the result expression or
+<a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p> The 'dolist' special form is basically a list-oriented 'for' looping
+construct that contains a loop 'symbol', a 'list-expr' to draw values from,
+an optional 'return' value and a block of code [expressions] to evaluate.
+The sequence of execution is:</p>
+
+<pre>
+ <i>symbol</i> := CAR of <i>list-expr</i>
+ temp-list := CDR of <i>list-expr</i>
+ while temp-list is not empty
+ loop code execution
+ <i>symbol</i> := CAR of temp-list
+ temp-list := CDR of temp-list
+ end-while
+ return <i>result</i>
+</pre>
+
+<p>The main loop 'symbol' will take on successive values from 'list-expr'.
+The 'dolist' form will go through and create and initialize the 'symbol'.
+After execution of the loop 'exprs', the 'symbol' is set to the next value
+in the 'list-expr'. This continues until the 'list-expr' has been exhausted.
+The value of the 'result' expression is evaluated and returned. If no
+'result' is specified, <a href="nil.htm">NIL</a> is returned.
+When the 'dolist' is finished execution, the 'symbol' that was defined will
+no longer exist or retain its value. If the 'list-expr' is an empty list,
+then no loop execution takes place and the 'result' is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+ (dolist (i () "done") <font color="#008844">; DOLIST with I loop variable</font>
+ (print "here")) <font color="#008844">; an empty list</font>
+ <font color="#008844">; and a return value</font>
+ <font color="#008844">; returns "done"</font>
+
+ (dolist (x '(a b c) "fini") <font color="#008844">; DOLIST with X loop variable</font>
+ (princ x)) <font color="#008844">; a list with (A B C)</font>
+ <font color="#008844">; and a return value</font>
+ <font color="#008844">; prints ABC returns "fini"</font>
+
+ (dolist (y '(1 2 3)) <font color="#008844">; DOLIST with Y loop variable</font>
+ (princ (* y y))) <font color="#008844">; a list with (1 2 3)</font>
+ <font color="#008844">; and no return value</font>
+ <font color="#008844">; prints 149 returns NIL</font>
+ <font color="#008844">; returns "met in the middle"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-020.htm#dolist">dolist</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/dotimes.htm b/docsrc/xlisp/xlisp-doc/reference/dotimes.htm
new file mode 100644
index 0000000..bcbaf82
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/dotimes.htm
@@ -0,0 +1,101 @@
+<html><head><title>XLISP dotimes</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>dotimes</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(dotimes (<i>symbol end-expr</i> [<i>result</i>]) [<i>expr</i> ... ])</dt>
+<dd><i>symbol</i> - a symbol<br>
+<i>end-expr</i> - an integer expression<br>
+<i>result</i> - an optional expression for the returned result<br>
+<i>expr</i> - expressions comprising the body of the loop which may
+contain <a href="return.htm">return</a>s,
+<a href="go.htm">go</a>s or tags for
+<a href="go.htm">go</a><br>
+returns - the return value of the result expression or
+<a href="nil.htm">NIL</a> </dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'dotimes' special form is basically a 'for' looping construct that
+contains a loop 'symbol', an 'end-expr' to specify the final value for
+'symbol', an optional 'return' value and a block of code [expressions] to
+evaluate. The sequence of execution is:</p>
+
+
+<pre>
+ <i>symbol</i> := 0
+ while <i>symbol</i> value is not equal to <i>end-expr</i> value
+ loop code execution
+ <i>symbol</i> := <i>symbol</i> + 1
+ end-while
+ return <i>result</i>
+</pre>
+
+<p>The main loop 'symbol' will take on successive values from zero to
+<nobr>('end-expr' - 1).</nobr> The 'dotimes' form will go through and create
+and initialize the 'symbol' to zero. After execution of the loop 'exprs',
+the 'symbol' value is incremented. This continues until the 'symbol' value
+is equal to 'end-expr'. The value of the 'result' expression is evaluated
+and returned. If no 'result' is specified,
+<a href="nil.htm">NIL</a> is returned. When the 'dotimes' is
+finished execution, the 'symbol' that was defined will no longer exist or
+retain its value. If the 'end-expr' is zero or less, then there will be no
+execution of the loop body's code.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(dotimes (i 4 "done") (princ i)) <font color="#008844">; prints 0123 returns "done"</font>
+(dotimes (i 4) (princ i)) <font color="#008844">; prints 0123 returns NIL</font>
+(dotimes (i 1) (princ i)) <font color="#008844">; prints 0 returns NIL</font>
+(dotimes (i 0) (princ i)) <font color="#008844">; returns NIL</font>
+(dotimes (i -9) (princ i)) <font color="#008844">; returns NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-020.htm#dotimes">dotimes</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/dribble.htm b/docsrc/xlisp/xlisp-doc/reference/dribble.htm
new file mode 100644
index 0000000..4fd0252
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/dribble.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP dribble</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>dribble</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlisp.c, xlsys.c, msstuff.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(dribble [<i>file-str</i>])</dt>
+<dd><i>file-str</i> - a string expression for a file name<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the transcript
+is opened, <a href="nil.htm">NIL</a> if it is closed</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'dribble' function, when called with a 'file-str' argument, opens the
+specified file and records a transcript of the XLISP session. When 'dribble'
+is called with no 'file-str' argument, it closes the current transcript file
+[if any]. 'dribble' will return
+<a href="t.htm">&nbsp;T&nbsp;</a> if the specified 'file-str'
+was successfully opened. It will return a
+<a href="nil.htm">NIL</a> if the 'file-str' was not opened
+successfully or if 'dribble' was evaluated to close a transcript.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(dribble "my-trans-file") <font color="#008844">; open file "my-trans-file"</font>
+ <font color="#008844">; for a session transcript</font>
+(+ 2 2)
+(dribble) <font color="#008844">; close the transcript</font>
+</pre>
+
+<p><b>Note:</b> It is also possible to start a transcript when invoking
+XLISP. To start XLISP with a transcript file of 'myfile' type in
+<nobr>'xlisp -tmyfile'.</nobr> <nobr>[I haven't</nobr> tested this with
+Nyquist.]</p>
+
+<p>See the
+<a href="../manual/xlisp-man-031.htm#dribble">dribble</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/echoenabled.htm b/docsrc/xlisp/xlisp-doc/reference/echoenabled.htm
new file mode 100644
index 0000000..08fa47e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/echoenabled.htm
@@ -0,0 +1,68 @@
+<html><head><title>XLISP echoenabled</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>echoenabled</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>sys/unix/osstuff.c, sys/win/wingui/winguistuff.c, sys/win/msvc/winstuff.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(echoenabled <i>flag</i>)</dt>
+<dd><i>flag</i> - <a href="t.htm">&nbsp;T&nbsp;</a> to enable echo, <a href="nil.htm">NIL</a> to disable<br>
+returns - <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'echoenabled' function turns console input echoing on or off.</p>
+
+<p><b>Note:</b> The 'echoenabled' function is only implemented under Linux
+and <nobr>Mac OS X.</nobr> <nobr>If Nyquist</nobr> I/O is redirected through
+pipes, the Windows version does not echo the input, but the Linux and Mac
+<nobr>versions do</nobr>. <nobr>You can</nobr> turn off echoing with this
+function. Under windows it is defined to do nothing.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/endp.htm b/docsrc/xlisp/xlisp-doc/reference/endp.htm
new file mode 100644
index 0000000..dd7587f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/endp.htm
@@ -0,0 +1,86 @@
+<html><head><title>XLISP endp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>endp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(endp <i>list</i>)</dt>
+<dd><i>list</i> - the list to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the list is
+empty, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'endp' predicate function checks to see if 'list' is an empty list.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if the list is
+empty, <a href="nil.htm">NIL</a> is returned if the list is
+not empty. The 'list' has to be a valid list. An error is returned if it
+is not a list:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(endp '()) <font color="#008844">; returns T - empty list</font>
+(endp ()) <font color="#008844">; returns T - still empty</font>
+(endp '(a b c)) <font color="#008844">; returns NIL</font>
+(setq a NIL) <font color="#008844">; set up a variable</font>
+(endp a) <font color="#008844">; returns T - value = empty list</font>
+(endp "a") <font color="#008844">; error: bad argument type - "a"</font>
+(endp 'a) <font color="#008844">; error: bad argument type - A</font>
+</pre>
+
+<p><b>Note:</b> The 'endp' predicate is different from the
+<a href="null.htm">null</a> and
+<a href="not.htm">not</a> predicates in that it requires a
+valid list.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#endp">endp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/eq.htm b/docsrc/xlisp/xlisp-doc/reference/eq.htm
new file mode 100644
index 0000000..48253ea
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/eq.htm
@@ -0,0 +1,93 @@
+<html><head><title>XLISP eq</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>eq</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c, xlsubr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>eq</b> <i>expr1 expr2</i>)</dt>
+<dd><i>exprN</i> - arbitrary Lisp expressions<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the expressions
+eveluate to the same internal value, <a href="nil.htm">NIL</a>
+otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>Two expressions are 'eq' if the expressions are identical. <nobr>The 'eq'
+function</nobr> tests if the results of the evaluated expressions point to
+the same memory location. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if
+both expressions evaluate to exactly the same internal value,
+<a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<p>Integer numbers being <a href="number-equal.htm">&nbsp;=&nbsp;</a> are
+'eq' as long as not stored in a CPU register, so the
+<a href="eql.htm">eql</a> function is recommended for testing integers. Also
+note that arrays, <nobr>floating-point</nobr> numbers, lists, and strings
+are only 'eq' if they are bound as variable values to the same symbol.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(eq 'a 'a) =&gt; T
+(eq 1 1) =&gt; T or NIL
+(eq 1 1.0) =&gt; NIL
+(eq 1.0 1.0) =&gt; NIL
+(eq "a" "a") =&gt; NIL
+(eq '(a b) '(a b)) =&gt; NIL
+(eq 'a 34) =&gt; NIL
+
+(setq a '(a b)) <font color="#008844">; set value of A to (A B)</font>
+(setq b a) <font color="#008844">; set B to point to A's value</font>
+(setq c '(a b)) <font color="#008844">; set value of C to different (A B)</font>
+(eq a b) =&gt; T
+(eq a c) =&gt; NIL
+</pre>
+
+<p>See also <a href="eql.htm">eql</a>, <a href="equal.htm">equal</a>,
+<nobr><a href="../examples/common-lisp/equalp.htm">cl:equalp</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/eql.htm b/docsrc/xlisp/xlisp-doc/reference/eql.htm
new file mode 100644
index 0000000..8be4067
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/eql.htm
@@ -0,0 +1,99 @@
+<html><head><title>XLISP eql</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>eql</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c, xlsubr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(eql expr1 expr2)</dt>
+<dd><i>expr1</i> - the first expression to compare<br>
+<i>expr2</i> - the second expression to compare<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the expressions have the
+same symbolic or numerical value, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>Two expressions are 'eql':</p>
+
+<ul>
+
+<li><p>If the expressions <nobr>are <a href="eq.htm">eq</a></nobr>.</p></li>
+
+<li><p>If two numbers of the same type
+<nobr>are <a href="number-equal.htm">&nbsp;=&nbsp;</a></nobr>.</p></li>
+
+<li><p>If two characters
+<nobr>are <a href="char-equal-s.htm">char=</a></nobr>.</p></li>
+
+</ul>
+
+<p>In all other cases 'eql' <nobr>returns <a href="nil.htm">NIL</a></nobr>.
+Note that arrays, lists, and strings are only 'eql' if they
+<nobr>are <a href="eq.htm">eq</a></nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(eql 'a 'a) =&gt; T
+(eql 1 1) =&gt; T
+(eql 1 1.0) =&gt; NIL
+(eql 1.0 1.0) =&gt; T
+(eql "a" "a") =&gt; NIL
+(eql '(a b) '(a b)) =&gt; NIL
+(eql 'a 34) =&gt; NIL
+
+(setq a '(a b)) <font color="#008844">; set value of A to (A B)</font>
+(setq b a) <font color="#008844">; set B to point to A's value</font>
+(setq c '(a b)) <font color="#008844">; set value of C to different (A B)</font>
+(eql a b) =&gt; T
+(eql a c) =&gt; NIL
+</pre>
+
+<p>See also <a href="eq.htm">eq</a>, <a href="equal.htm">equal</a>,
+<nobr><a href="../examples/common-lisp/equalp.htm">cl:equalp</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/equal.htm b/docsrc/xlisp/xlisp-doc/reference/equal.htm
new file mode 100644
index 0000000..8eceaad
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/equal.htm
@@ -0,0 +1,111 @@
+<html><head><title>XLISP equal</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>equal</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c, xlsubr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>equal</b> <i>expr1 expr2</i>)</dt>
+<dd><i>exprN</i> - arbitrary Lisp expressions<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the expressions
+are structurally equivalent, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>Two expressions <nobr>are 'equal'</nobr>:</p>
+
+<ul>
+
+<li><p>If the expressions
+<nobr>are <a href="eql.htm">eql</a></nobr>.</p></li>
+
+<li><p>If two strings
+<nobr>are <a href="string-equal-s.htm.htm">string=</a></nobr>.</p></li>
+
+<li><p>If the two <a href="../reference/car.htm">car</a>s in conses are
+'equal' and the two <a href="../reference/cdr.htm">cdr</a>s in
+conses <nobr>are 'equal'</nobr>.</p></li>
+
+</ul>
+
+<p>In all other cases 'equal'
+<nobr>returns <a href="nil.htm">NIL</a></nobr>. Note that arrays are only
+'equal' if they <nobr>are <a href="eq.htm">eq</a></nobr>.</p>
+
+<p>A way to view 'equal' is that if 'expr1' and 'expr2' were printed
+<nobr>[via <a href="print.htm">print</a></nobr> <nobr>or
+<a href="princ.htm">princ</a>]</nobr> <nobr>and they</nobr> look the same,
+then 'equal' will <nobr>return <a href="t.htm">&nbsp;T&nbsp;</a></nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(equal 'a 'a) =&gt; T
+(equal 1 1) =&gt; T
+(equal 1 1.0) =&gt; NIL <font color="#008844">; different number types</font>
+(equal 1.0 1.0) =&gt; T
+(equal "a" "a") =&gt; T
+(equal '(a b) '(a b)) =&gt; T
+(equal 'a 34) =&gt; NIL
+
+(setq a '(a b)) <font color="#008844">; set value of A to (A B)</font>
+(setq b a) <font color="#008844">; set B to point to A's value</font>
+(setq c '(a b)) <font color="#008844">; set value of C to different (A B)</font>
+(equal a b) =&gt; T
+(equal a c) =&gt; T
+
+(equal '(a b) '(A B)) =&gt; T
+(equal '(a b) '(c d)) =&gt; NIL
+
+(equal "a" "A") =&gt; NIL
+(equal "abc" "abcD") =&gt; NIL
+</pre>
+
+<p>See also <a href="eq.htm">eq</a>, <a href="eql.htm">eql</a>,
+<nobr><a href="../examples/common-lisp/equalp.htm">cl:equalp</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/error.htm b/docsrc/xlisp/xlisp-doc/reference/error.htm
new file mode 100644
index 0000000..c96b663
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/error.htm
@@ -0,0 +1,161 @@
+<html><head><title>XLISP error</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>error, cerror</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c, xldbug.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>error</b> <i>err-msg</i> [<i>arg</i>])</dt>
+<dd><i>err-msg</i> - a string expression for the error message<br>
+<i>arg</i> - an optional argument expression, printed after the error message<br>
+returns - never returns</dd>
+</dl>
+
+<dl>
+<dt>(<b>cerror</b> <i>cont-msg err-msg</i> [<i>arg</i>])</dt>
+<dd><i>cont-msg</i> - a string expression for the <a href="continue.htm">continue</a> message<br>
+<i>err-msg</i> - a string expression for the error message<br>
+<i>arg</i> - an optional argument expression, printed after the error message<br>
+returns - <a href="nil.htm">NIL</a> when continued from the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr></dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'error' function allows the generation of a
+<nobr>non-correctable</nobr> error. <nobr>A non-correctable</nobr> error
+requires evaluation of a <nobr><a href="clean-up.htm">clean-up</a></nobr> or
+<nobr><a href="top-level.htm">top-level</a></nobr> function from within the
+XLISP <nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>
+to return to normal execution. <nobr>The form</nobr> of the message
+generated is:</p>
+
+<pre class="example">
+<font color="#AA0000">error:</font> <font color="#0000CC">err-msg</font> <font color="#AA0000">-</font> <font color="#0000CC">arg</font>
+</pre>
+
+<p>If a <a href="continue.htm">continue</a> function is evaluated within the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>, then a
+an error message is generated:</p>
+
+<pre class="example">
+<font color="#AA0000">error: this error can't be continued</font>
+</pre>
+
+<p>There is no return from the 'error' function.</p>
+
+<p>The 'cerror' function allows the generation of a correctable error.
+<nobr>A correctable</nobr> error can be corrected by some action
+within the XLISP <nobr><a href="../manual/xlisp.htm#break-loop">Break
+Loop</a></nobr>. <nobr>The form</nobr> of the message generated is:</p>
+
+<pre class="example">
+<font color="#AA0000">error:</font> <font color="#0000CC">err-msg</font> <font color="#AA0000">-</font> <font color="#0000CC">arg</font>
+<font color="#AA0000">if continued:</font> <font color="#0000CC">cont-msg</font>
+</pre>
+
+<p>In the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>,
+forms can be evaluated to correct the error. <nobr>If a</nobr>
+<a href="continue.htm">continue</a> function is evaluated within the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>, then
+<a href="nil.htm">NIL</a> is returned from 'cerror'. <nobr>If desired</nobr>, the
+<nobr><a href="clean-up.htm">clean-up</a></nobr> and
+<nobr><a href="top-level.htm">top-level</a></nobr> forms may be evaluated
+to abort out of the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>.</p>
+
+<p><div class="box">
+
+<p><b>Note:</b> The <a href="global-breakenable.htm">*breakenable*</a>
+variable needs to be <nobr>non-<a href="nil.htm">NIL</a></nobr> for 'error',
+'cerror' and system errors to be caught by the Nyquist/XLISP
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>.</p>
+
+</div></p>
+
+<h2>Examples</h2>
+
+<p>Example of a <nobr>non-correctable</nobr> error:</p>
+
+<pre class="example">
+&gt; (error "invalid argument" "arg")
+<font color="#AA0000">error: invalid argument - "arg"</font>
+
+1&gt; (continue) <font color="#008844">; the 1 before the &gt; indicates a break loop</font>
+<font color="#AA0000">error: this error can't be continued</font>
+
+1&gt; (clean-up)
+[ back to previous break level ]
+
+&gt; <font color="#008844">; no break loop any longer</font>
+</pre>
+
+<p>Example of system generated correctable error:</p>
+
+<pre class="example">
+&gt; (symbol-value 'f)
+<font color="#AA0000">error: unbound variable - F</font>
+<font color="#AA0000">if continued: try evaluating symbol again</font>
+
+1&gt; (setq f 123) <font color="#008844">; the 1 before the &gt; indicates a break loop</font>
+123 <font color="#008844">; return value of (setq f 123)</font>
+
+1&gt; (continue)
+123 <font color="#008844">; return value of (symbol-value 'f)</font>
+
+&gt; <font color="#008844">; no break loop any longer</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#debugging-and-error-handling">Debugging and Error Handling</a></nobr></li>
+<li><nobr>XLISP 2.0 Manual &rarr; <a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr></li>
+<li><nobr>Tutorials &rarr; Nyquist &rarr; <a href="../tutorials/nyquist.htm#debugger-shortcuts">Debugger Shortcuts</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/errset.htm b/docsrc/xlisp/xlisp-doc/reference/errset.htm
new file mode 100644
index 0000000..b2094c8
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/errset.htm
@@ -0,0 +1,117 @@
+<html><head><title>XLISP errset</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>errset</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(errset <i>expr</i> [<i>print-flag</i>])</dt>
+<dd><i>expr</i> - an expression to be evaluated<br>
+<i>print-flag</i> - an optional expression
+[<a href="nil.htm">NIL</a> or
+non-<a href="nil.htm">NIL</a>]<br>
+returns - the value of the last expression
+<a href="cons.htm">cons</a>ed with
+<nobr><a href="nil.htm">NIL</a> ,</nobr> or
+<a href="nil.htm">NIL</a> on error</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'errset' special form is a mechanism that allows the trapping of
+errors within the execution of 'expr'.
+<a href="global-breakenable.htm">*breakenable*</a> must be set to
+<a href="nil.htm">NIL</a> for the 'errset' form to function. If
+<a href="global-breakenable.htm">*breakenable*</a> is
+<nobr>non-<a href="nil.htm">NIL</a> ,</nobr> the normal break
+loop will handle the error. For 'errset', if no error occurs within 'expr',
+the value of the last expression is <a href="cons.htm">cons</a>ed
+with <a href="nil.htm">NIL</a>. If an error occurs within 'expr',
+the error is caught by 'errset' and a <a href="nil.htm">NIL</a>
+is returned from 'errset'. If 'print-flag' is
+<nobr><a href="nil.htm">NIL</a> ,</nobr> the error message
+normally generated by 'expr' will not be printed. If 'print-flag' is
+non-<a href="nil.htm">NIL</a> or not present in the 'errset'
+form, the error message will be printed.</p>
+
+<p>Errors from <a href="error.htm">error</a> and
+<a href="cerror.htm">cerror</a> and system errors
+will be handled by 'errset'. Note that the
+<a href="cerror.htm">cerror</a> message will only include
+the error message portion, not the
+<a href="continue.htm">continue</a> message portion.
+<a href="break.htm">break</a> is not intercepted by 'errset'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq *breakenable* nil) <font color="#008844">; do not enter the break-loop on errors</font>
+(errset (error "hi" "ho")) <font color="#008844">; prints error: hi - "ho" returns NIL</font>
+(errset (cerror "hi" "ho" "he")) <font color="#008844">; prints error: ho - "he" returns NIL</font>
+(errset (error "hey" "ho") NIL) <font color="#008844">; returns NIL</font>
+(errset (break "hey")) <font color="#008844">; break: hey - if continued: return from BREAK</font>
+(continue) <font color="#008844">; [ continue from break loop ]</font>
+(errset (+ 1 5)) <font color="#008844">; returns (6)</font>
+(errset (+ 1 "a") NIL) <font color="#008844">; returns NIL</font>
+(setq *breakenable* t) <font color="#008844">; re-enable the break-loop on errors</font>
+</pre>
+
+<p>How to keep XLISP from signalling an error:</p>
+
+<pre class="example">
+(setq *breakenable* nil)
+(errset <font color="#0000CC">expression-causing-an-error</font> t) <font color="#008844">; print the error message</font>
+(errset <font color="#0000CC">expression-causing-an-error</font>) <font color="#008844">; do NOT print the error message</font>
+</pre>
+
+<p><b>Note:</b> Be sure to set
+<a href="global-breakenable.htm">*breakenable*</a> to
+<a href="nil.htm">NIL</a> before using 'errset' and to
+non-<a href="nil.htm">NIL</a> after using 'errset'. <nobr>If you</nobr> don't
+reset <nobr><a href="global-breakenable.htm">*breakenable*</a> ,</nobr> no
+errors will be reported.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-022.htm#errset">errset</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/eval.htm b/docsrc/xlisp/xlisp-doc/reference/eval.htm
new file mode 100644
index 0000000..9a5c69f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/eval.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP eval</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>eval</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c, xleval.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(eval <i>expression</i>)</dt>
+<dd><i>expression</i> - an arbitrary expression<br>
+returns - the result of evaluating the expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'eval' function evaluates the 'expression' and returns the resulting
+value.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(eval '(+ 2 2)) <font color="#008844">; returns 4</font>
+(eval (cons '+ '(2 2 2))) <font color="#008844">; returns 6</font>
+(eval (list '+ '2 '3 )) <font color="#008844">; returns 5</font>
+
+(setq a 10) <font color="#008844">; set up A with value 10</font>
+(setq b 220) <font color="#008844">; set up B with value 220</font>
+
+(eval (list '+ a b )) <font color="#008844">; returns 230 because</font>
+ <font color="#008844">; (list '+ a b) =&gt; '(+ 10 220)</font>
+
+(eval (list '+ 'a b)) <font color="#008844">; returns 230 because</font>
+ <font color="#008844">; (list '+ 'a b) =&gt; '(+ A 220)</font>
+ <font color="#008844">; and A has the value 10</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-012.htm#eval">eval</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/evalhook.htm b/docsrc/xlisp/xlisp-doc/reference/evalhook.htm
new file mode 100644
index 0000000..86588d0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/evalhook.htm
@@ -0,0 +1,142 @@
+<html><head><title>XLISP evalhook</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>evalhook</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c, xleval.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(evalhook<i> expr eval-expr apply-expr</i> [<i>env</i>])</dt>
+<dd><i>expr</i> - an expression to evaluate<br>
+<i>eval-expr</i> - an expression for the evaluation routine<br>
+<i>apply-expr</i> - an expression for
+<a href="apply.htm">apply</a> [not used]<br>
+<i>env</i> - an environment expression, default is
+<a href="nil.htm">NIL</a><br>
+returns - the result of evaluating the expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'evalhook' function is a function that performs evaluation.
+The routine specified by 'eval-expr' is called with the 'expr' and 'env'
+parameters. If 'eval-expr' is
+<nobr><a href="nil.htm">NIL</a> ,</nobr> then the normal system
+evaluator is called. The 'apply-hook' is a dummy parameter that is not used
+in the current XLISP system. The 'expr' contains the expression to be
+evaluated. If the 'env' argument to 'evalhook' is not specified,
+<a href="nil.htm">NIL</a> is used, which specifies to use the
+current global environment. The 'env', if specified, is a structure composed
+of dotted pairs constructed of the symbol and its value which have the
+form:</p>
+
+<pre class="example">
+(((<font color="#008844"><i>sym1</i></font> . <font color="#008844"><i>val1</i></font>) (<font color="#008844"><i>sym2</i></font> . <font color="#008844"><i>val2</i></font>) ... )))
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq a 100) <font color="#008844">; set up global values</font>
+(setq b 200)
+
+(evalhook '(+ a b) NIL NIL) <font color="#008844">; returns 300 - no 'env' was given</font>
+
+(evalhook '(+ a b) NIL NIL <font color="#008844">; eval with a=1 and b=2</font>
+ '((((a . 1)(b . 2))))) <font color="#008844">; returns 3</font>
+
+(defun myeval (exp env) <font color="#008844">; define MYEVAL routine</font>
+ (princ "exp: ") (print exp)
+ (princ "env: ") (print env)
+ (evalhook exp #'myeval NIL env))
+
+(defun foo (a) (+ a a)) <font color="#008844">; create simple function</font>
+(setq *evalhook* #'myeval) <font color="#008844">; and install MYEVAL as hook</font>
+
+(foo 1) <font color="#008844">; prints exp: (FOO 1) env:NIL</font>
+ <font color="#008844">; exp: 1 env:NIL</font>
+ <font color="#008844">; exp: (+ A A) env:((((A . 1))))</font>
+ <font color="#008844">; exp: A env:((((A . 1))))</font>
+ <font color="#008844">; exp: A env:((((A . 1))))</font>
+ <font color="#008844">; returns 2</font>
+
+(top-level) <font color="#008844">; to clean up *evalhook*</font>
+</pre>
+
+<p><b>Note:</b> The 'evalhook' function and
+<a href="global-evalhook.htm">*evalhook*</a> system variable are very useful
+in the construction of debugging facilities within XLISP. The
+<a href="trace.htm">trace</a> and
+<a href="untrace.htm">untrace</a> functions use 'evalhook' and
+<a href="global-evalhook.htm">*evalhook*</a> to implement their
+functionality. The other useful aspect of 'evalhook' and
+<a href="global-evalhook.htm">*evalhook*</a> is to help in understanding
+how XLISP works to see the expressions, their environment and how they
+are evaluated.</p>
+
+<p><b>Caution:</b> Be careful when using
+<a href="global-evalhook.htm">*evalhook*</a> and 'evalhook'.
+If you put in a bad definition into
+<nobr><a href="global-evalhook.htm">*evalhook*</a> ,</nobr> you might not
+be able to do anything and will need to exit XLISP.</p>
+
+<p><b>Unusual behaviour:</b> The 'evalhook' function and
+<a href="global-evalhook.htm">*evalhook*</a> system variable, by their
+nature, cause some unusual things to happen. After you have set
+<a href="global-evalhook.htm">*evalhook*</a> to some
+non-<a href="nil.htm">NIL</a> value, your function will be
+called. However, when you are all done and set
+<a href="global-evalhook.htm">*evalhook*</a> to
+<a href="nil.htm">NIL</a> or some other new routine, it will
+never be set. This is because the 'xevalhook' function [in the 'xlbfun.c'
+source file] saves the old value of
+<a href="global-evalhook.htm">*evalhook*</a> before calling your routine,
+and then restores it after the evaluation. The mechanism to reset
+<a href="global-evalhook.htm">*evalhook*</a> is to execute the
+<a href="top-level.htm">top-level</a> function, which sets
+<a href="global-evalhook.htm">*evalhook*</a> to
+<a href="nil.htm">NIL</a>.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-022.htm#evalhook">evalhook</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/evenp.htm b/docsrc/xlisp/xlisp-doc/reference/evenp.htm
new file mode 100644
index 0000000..3f85fd7
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/evenp.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP evenp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>evenp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(evenp <i>expr</i>)</dt>
+<dd><i>expr</i> - the integer numeric expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the integer
+is even, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'evenp' predicate function checks to see if the number 'expr' is
+even. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if the
+number is even, <a href="nil.htm">NIL</a> is returned
+otherwise.</p>
+
+<p>An error is generated if the 'expr' is not a numeric expression:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<p>An error is generated if the 'expr' is a floating point number:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad floating point operation</font>
+</pre>
+
+<p>Zero is an even number.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(evenp 0) <font color="#008844">; returns T</font>
+(evenp 1) <font color="#008844">; returns NIL</font>
+(evenp 2) <font color="#008844">; returns T</font>
+(evenp -1) <font color="#008844">; returns NIL</font>
+(evenp -2) <font color="#008844">; returns T</font>
+(evenp 14.0) <font color="#008844">; error: bad floating point operation</font>
+(evenp 'a) <font color="#008844">; error: bad argument type</font>
+(setq a 2) <font color="#008844">; set value of A to 2</font>
+(evenp a) <font color="#008844">; returns T</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#evenp">evenp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/exit.htm b/docsrc/xlisp/xlisp-doc/reference/exit.htm
new file mode 100644
index 0000000..a6a4124
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/exit.htm
@@ -0,0 +1,69 @@
+<html><head><title>XLISP exit</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>exit</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsys.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(exit)</dt>
+<dd>returns - never returns</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'exit' function causes the current XLISP session to be terminated.
+<nobr>It never</nobr> returns.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(exit) <font color="#008844">; never returns</font>
+</pre>
+
+<p><b>Note:</b> When XLISP is exited, any
+<a href="dribble.htm">dribble</a> transcript file is automatically
+closed. However, other open files are not closed, and so may lose some
+information.</p>
+
+<p>See also <a href="quit.htm">quit</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/exp.htm b/docsrc/xlisp/xlisp-doc/reference/exp.htm
new file mode 100644
index 0000000..8a56f40
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/exp.htm
@@ -0,0 +1,76 @@
+<html><head><title>XLISP exp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>exp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(exp <i>power</i>)</dt>
+<dd><i>power</i> - floating point number/expression<br>
+returns - e to the x power</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p> The 'exp' function calculates e [2.7128] raised to the specified
+'power' and returns the result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(exp 0.0) <font color="#008844">; returns 1</font>
+(exp 1.0) <font color="#008844">; returns 2.71828 - e</font>
+(exp 2.0) <font color="#008844">; returns 7.38906</font>
+(exp 10.0) <font color="#008844">; returns 22026.5</font>
+(exp 0) <font color="#008844">; error: bad integer operation</font>
+</pre>
+
+<p><b>Note:</b> 'exp' with a large 'power' like 1000.0 causes an incorrect
+value to be generated, with no error. The returned value will be a very
+large floating point number near the computer's limit [something like
+1.79000e+308].</p>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#exp">exp</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/expand.htm b/docsrc/xlisp/xlisp-doc/reference/expand.htm
new file mode 100644
index 0000000..5ed5a28
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/expand.htm
@@ -0,0 +1,91 @@
+<html><head><title>XLISP expand</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>expand</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsys.c, xldmem.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(expand <i>segments</i>)</dt>
+<dd><i>segments</i> - the number of segments to add as an integer expression<br>
+returns - the number of segments added</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'expand' function expands memory by the specified number of
+'segments'. The number of 'segments' added is returned as the result. The
+power up default is 1000 nodes per segment. Note that
+<a href="alloc.htm">alloc</a> allows you to change the number of
+nodes per segment.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(room) <font color="#008844">; prints Nodes: 8000</font>
+ <font color="#008844">; Free nodes: 5622</font>
+ <font color="#008844">; Segments: 6</font>
+ <font color="#008844">; Allocate: 1000</font>
+ <font color="#008844">; Total: 92586</font>
+ <font color="#008844">; Collections: 8</font>
+ <font color="#008844">; returns NIL</font>
+
+(expand 2) <font color="#008844">; add more nodes</font>
+
+(room) <font color="#008844">; prints Nodes: 10000</font>
+ <font color="#008844">; Free nodes: 7608</font>
+ <font color="#008844">; Segments: 8</font>
+ <font color="#008844">; Allocate: 1000</font>
+ <font color="#008844">; Total: 112602</font>
+ <font color="#008844">; Collections: 8</font>
+ <font color="#008844">; returns NIL</font>
+</pre>
+
+<p><b>Note:</b> When <a href="gc.htm">gc</a> is called or an
+automatic garbage collection occurs, if the amount of free memory is still
+low after the garbage collection, the system attempts to add more segments
+[an automatic 'expand'].</p>
+
+<p>See the
+<a href="../manual/xlisp-man-031.htm#expand">expand</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/expt.htm b/docsrc/xlisp/xlisp-doc/reference/expt.htm
new file mode 100644
index 0000000..7b9a4f6
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/expt.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP expt</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>expt</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(expt <i>expr</i> [<i>power</i> ... ])</dt>
+<dd><i>expr</i> - floating point number/expression<br>
+<i>power</i> - integer or floating point number/expression<br>
+returns - x to the y power</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'expt' function raises the 'expr' to the specified 'power' and
+returns the result. If there is no 'power' specified, the 'expr' is
+returned. If there are multiple 'powers', they will be applied sequentially
+to 'expr'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(expt 2.0 2) <font color="#008844">; returns 4</font>
+(expt 2.0 10) <font color="#008844">; returns 1024</font>
+(expt 2 2) <font color="#008844">; error: bad integer operation</font>
+(expt 99.9) <font color="#008844">; returns 99.9</font>
+(expt 2.0 2.0 2.0) <font color="#008844">; returns 16</font>
+</pre>
+
+<p><b>Note:</b> 'expt' with a large values like (expt 999.9 999.9) causes an
+incorrect value to be generated, with no error. The returned value will be a
+very large floating point number near the computer's limit [something like
+1.79000e+308].</p>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#expt">expt</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/fboundp.htm b/docsrc/xlisp/xlisp-doc/reference/fboundp.htm
new file mode 100644
index 0000000..cc014f8
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/fboundp.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP fboundp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>fboundp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(fboundp <i>symbol</i>)</dt>
+<dd><i>symbol</i> - the symbol expression to check for a value<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if a functional
+value is bound to the symbol, <a href="nil.htm">NIL</a>
+otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'fboundp' predicate function checks to see if 'symbol' is a symbol
+with a function definition bound to it.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'symbol' has a
+function value, <a href="nil.htm">NIL</a> is returned otherwise.
+Note that 'symbol' is a symbol expression, it is evaluated and the resulting
+expression is the one that is checked.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun foo (x) (print x)) <font color="#008844">; set up function FOO</font>
+(fboundp 'foo) <font color="#008844">; returns T - FOO is closure</font>
+(fboundp 'car) <font color="#008844">; returns T - CAR is subr</font>
+
+(setq myvar 'goo) <font color="#008844">; set up MYVAR to have value GOO</font>
+(fboundp myvar) <font color="#008844">; returns NIL - because GOO has no value yet</font>
+(defmacro goo () (print "hi")) <font color="#008844">; define GOO macro</font>
+(fboundp myvar) <font color="#008844">; returns T</font>
+
+(fboundp 'a) <font color="#008844">; returns NIL</font>
+(fboundp '1) <font color="#008844">; error: bad argument type - 1</font>
+(fboundp "hi") <font color="#008844">; error: bad argument type - "hi"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#fboundp">fboundp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/filep.htm b/docsrc/xlisp/xlisp-doc/reference/filep.htm
new file mode 100644
index 0000000..6db78bf
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/filep.htm
@@ -0,0 +1,75 @@
+<html><head><title>XLISP filep</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>filep</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>filep</b> <i>expr</i>)</nobr></dt>
+<dd><i>expr</i> - an Lisp expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if <i>expr</i> is of type FPTR,
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, 'filep' is implemented as a Lisp function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">filep</font> (x)
+ (eq (type-of x) 'FPTR))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'filep' function returns <a href="t.htm">&nbsp;T&nbsp;</a> if
+'expr' is of type FPTR, <a href="nil.htm">NIL</a> otherwise</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/find-in-xlisp-path.htm b/docsrc/xlisp/xlisp-doc/reference/find-in-xlisp-path.htm
new file mode 100644
index 0000000..ee671d1
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/find-in-xlisp-path.htm
@@ -0,0 +1,66 @@
+<html><head><title>XLISP find-in-xlisp-path</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>find-in-xlisp-path</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>path.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(find-in-xlisp-path <i>filename</i>)</dt>
+<dd><i>filename</i> - the name of the file to search for as string<br>
+returns - a full path name to the first occurrence found</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>find-in-xlisp-path</nobr>' function searches the XLISP search
+path <nobr>[e.g. XLISPPATH</nobr> from the environment] for 'filename'.
+<nobr>If 'filename'</nobr> is not found as is, and there is no file
+extension, '.lsp' is appended to filename and searched again. <nobr>The
+current</nobr> directory is not searched.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/first.htm b/docsrc/xlisp/xlisp-doc/reference/first.htm
new file mode 100644
index 0000000..054167a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/first.htm
@@ -0,0 +1,74 @@
+<html><head><title>XLISP first</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>first</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(first <i>expr</i>)</dt>
+<dd><i>expr</i> - a list or list expression<br>
+returns - the first element of the expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'first' function returns the first element of the expression.
+If the first expression is itself a list, then the sublist is returned.
+If the list is <nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(first '(a b c)) <font color="#008844">; returns A</font>
+(first '((a b) c d)) <font color="#008844">; returns (A B)</font>
+(first NIL) <font color="#008844">; returns NIL</font>
+(first 'a) <font color="#008844">; error: bad argument type</font>
+(setq children '(amanda ben)) <font color="#008844">; set up variable CHILDREN</font>
+(first children) <font color="#008844">; returns AMANDA</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#first">first</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/flatc.htm b/docsrc/xlisp/xlisp-doc/reference/flatc.htm
new file mode 100644
index 0000000..0bf8f87
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/flatc.htm
@@ -0,0 +1,74 @@
+<html><head><title>XLISP flatc</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>flatc</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c, xlprin.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(flatc <i>expr</i>)</dt>
+<dd><i>expr</i> - an expression<br>
+returns - the length</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'flatc' function determines the character length that would be
+printed if the 'expr' were printed using
+<a href="princ.htm">princ</a>. This means that the 'expr' would be
+printed without a new-line. If 'expr' is a string, it would not be printed
+with quotes around the string. The print character length is returned as the
+result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(flatc 1234) <font color="#008844">; returns 4</font>
+(flatc '(a b c)) <font color="#008844">; returns 7</font>
+(flatc "abcd") <font color="#008844">; returns 4</font>
+(flatc 'mybigsymbol) <font color="#008844">; returns 11</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-027.htm#flatc">flatc</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/flatsize.htm b/docsrc/xlisp/xlisp-doc/reference/flatsize.htm
new file mode 100644
index 0000000..57da49c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/flatsize.htm
@@ -0,0 +1,74 @@
+<html><head><title>XLISP flatsize</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>flatsize</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c, xlprin.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(flatsize <i>expr</i>)</dt>
+<dd><i>expr</i> - an expression<br>
+returns - the length</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'flatsize' function determines the character length that would be
+printed if the 'expr' were printed using <a
+href="prin1.htm">prin1</a>. This means that the 'expr' would be
+printed without a new-line. If 'expr' is a string, it would be printed with
+quotes around the string. The print character length is returned as the
+result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(flatsize 1234) <font color="#008844">; returns 4</font>
+(flatsize '(a b c)) <font color="#008844">; returns 7</font>
+(flatsize "abcd") <font color="#008844">; returns 6</font>
+(flatsize 'mybigsymbol) <font color="#008844">; returns 11</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-027.htm#flatsize">flatsize</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/flet.htm b/docsrc/xlisp/xlisp-doc/reference/flet.htm
new file mode 100644
index 0000000..aa5cc5d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/flet.htm
@@ -0,0 +1,87 @@
+<html><head><title>XLISP flet</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>flet</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(flet ([<i>function</i> ... ]) <i>expr</i> ... )</dt>
+<dd><i>function</i> - a function definition binding which is of the form:
+<dl><dd>(<i>symbol arg-list body</i>)
+<dl><dd><i>symbol</i> - the symbol specifying the function name<br>
+<i>arg-list</i> - the argument list for the function <br>
+<i>body</i> - the body of the function</dd></dl></dd></dl>
+<i>expr</i> - an expression<br>
+returns - the value of the last expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'flet' special form is basically a local block construct that allows
+local 'function' definitions followed by a block of code to evaluate. The
+first form after the 'flet' is the 'binding' form. It contains a series of
+'functions'. The 'flet' form will go through and define the 'symbols' of the
+'functions' and then sequentially execute the 'exprs'. The value of the last
+'expr' evaluated is returned. When the 'flet' is finished execution, the
+'symbols' that were defined will no longer exist.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(flet ((fuzz (x) (+ x x))) <font color="#008844">; an FLET with FUZZ local function</font>
+ (fuzz 2)) <font color="#008844">; returns 4</font>
+ <font color="#008844">; FUZZ no longer exists</font>
+
+(fuzz 2) <font color="#008844">; error: unbound function - FUZZ</font>
+
+ <font color="#008844">; an empty flet</font>
+(flet () (print 'a)) <font color="#008844">; prints A</font>
+</pre>
+
+<p><b>Note:</b> 'flet' does not allow recursive definitions of functions.
+The <a href="labels.htm">labels</a> special form does allow this.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-019.htm#flet">flet</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/float.htm b/docsrc/xlisp/xlisp-doc/reference/float.htm
new file mode 100644
index 0000000..b20c35d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/float.htm
@@ -0,0 +1,71 @@
+<html><head><title>XLISP float</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>float</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(float <i>expr</i>)</dt>
+<dd><i>expr</i> - integer or floating point number/expression<br>
+returns - the result as a floating point number</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'float' function takes a numeric expression and returns the result
+as a floating point number.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(/ 1 2) <font color="#008844">; returns 0 (integer division)</font>
+(/ (float 1) 2) <font color="#008844">; returns 0.5</font>
+(float (/ 1 2)) <font color="#008844">; returns 0 (integer division)</font>
+(/ 1 2 3) <font color="#008844">; returns 0 (integer division)</font>
+(/ (float 1) 2 3) <font color="#008844">; returns 0.166667</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#float">float</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/floatp.htm b/docsrc/xlisp/xlisp-doc/reference/floatp.htm
new file mode 100644
index 0000000..ea4c1b8
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/floatp.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP floatp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>floatp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(floatp <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the value is a
+floating point number, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'floatp' predicate function checks if an 'expr' is a floating point
+number. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr'
+is a floating point number, <a href="nil.htm">NIL</a> is returned
+otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(floatp 1.2) <font color="#008844">; returns T - float</font>
+(floatp '1.2) <font color="#008844">; returns T - still a float</font>
+(setq a 1.234)
+(floatp a) <font color="#008844">; returns T - evaluates to float</font>
+(floatp 0.0) <font color="#008844">; returns T - float zero</font>
+(floatp 0) <font color="#008844">; returns NIL - integer zero</font>
+(floatp 1) <font color="#008844">; returns NIL - integer</font>
+(floatp #x034) <font color="#008844">; returns NIL - integer readmacro</font>
+(floatp 'a) <font color="#008844">; returns NIL - symbol</font>
+(floatp #\a) <font color="#008844">; returns NIL - character</font>
+(floatp NIL) <font color="#008844">; returns NIL - NIL</font>
+(floatp #(0 1 2)) <font color="#008844">; returns NIL - array</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#floatp">floatp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/format.htm b/docsrc/xlisp/xlisp-doc/reference/format.htm
new file mode 100644
index 0000000..8a8bdca
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/format.htm
@@ -0,0 +1,161 @@
+<html><head><title>XLISP format</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>format</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(format destination format [expr1 ... ])</dt>
+<dd><i>destination</i> - a required destination [see below]<br>
+<i>format</i> - a format string<br>
+<i>exprN</i> - an expression<br>
+returns - output string if stream is
+<nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<p>The 'destination' must be a file pointer, a stream,
+<a href="nil.htm">NIL</a> [to create a string] or
+<a href="t.htm">&nbsp;T&nbsp;</a> [to print to
+<a href="global-standard-output.htm">*standard-output*</a>].</p>
+
+<h2>Description</h2>
+
+<p>The 'format' function prints the specified expressions [if any] to the
+specified 'destination' using the 'format' string to control the print
+format. If the 'destination' is
+<nobr><a href="nil.htm">NIL</a> ,</nobr> a string is created and
+returned with the contents of the 'format'. If the 'destination' is
+<nobr><a href="t.htm">&nbsp;T&nbsp;</a> ,</nobr> the printing
+occurs to <a href="global-standard-output.htm">*standard-output*</a>. The 'format'
+function returns <nobr><a href="nil.htm">NIL</a> ,</nobr> if
+the 'destination' was non-<a href="nil.htm">NIL</a>. The 'format'
+string is a string [surrounded by double-quote characters]. This string
+contains ASCII text to be printed along with formatting directives
+[identified by a preceeding tilde '~' character]. The character following
+the tilde character is not case sensitive ['~a' and '~A' will function
+equivalently].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(format T "Now is the time for") <font color="#008844">; prints Now is the time for</font>
+(format T "all ~A ~S to" 'good 'men) <font color="#008844">; prints all GOOD MEN to</font>
+(format T "come to the") <font color="#008844">; prints come to the</font>
+(format T "~A of their ~S" <font color="#008844">; prints aid of their "party"</font>
+ "aid" "party")
+(format *standard-ouput* "Hello there") <font color="#008844">; prints Hello there</font>
+(format nil "ho ho ~S" 'ho) <font color="#008844">; returns "ho ho HO"</font>
+(format T "this is ~%a break") <font color="#008844">; prints this is</font>
+ <font color="#008844">; a break</font>
+(format T "this is a long ~
+ string") <font color="#008844">; prints this is a long string</font>
+</pre>
+
+<p><b>Supported format directives:</b> The 'format' string in XLISP supports
+the following format directives:</p>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr><code>~A</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%">ASCII, prints the 'expr'. If it is a string print it
+ without quotes. This is like the <a href="princ.htm">princ</a>
+ function.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>~S</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%">s-expr, prints the 'expr'. If it is a string print it
+ with quotes. This is like the <a href="prin1.htm">prin1</a>
+ function.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>~%</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%">prints a 'newline' control character.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>~~</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%">prints a single tilde '~' character.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>~&lt;newline&gt;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%">continue the 'format' string on the next line. This
+ signals a line break in the format. The 'format' function will ignore
+ all white-space [blanks, tabs, newlines]. This is useful when the
+ 'format' string is longer than a program line. Note that the 'newline'
+ character must immediately follow the tilde character.</td>
+</tr>
+</tbody></table></p>
+
+<p><b>Common Lisp:</b> The 'format' function in Common Lisp is quite
+impressive. It includes 26 different formatting directives. XLISP, as shown
+above, does not include most of these. The more difficult ones that you
+might encounter are the decimal, octal, hexidecimal, fixed-format
+floating-point and exponential floating-point. It is possible to print in
+octal and hexadecimal notation by setting
+<a href="global-integer-format.htm">*integer-format*</a>. It is possible to print
+in fixed format and exponential by setting
+<a href="global-float-format.htm">*float-format*</a>. However, neither of these
+system variables are supported in Common Lisp and neither gives control over
+field size.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-028.htm#format">format</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/fourth.htm b/docsrc/xlisp/xlisp-doc/reference/fourth.htm
new file mode 100644
index 0000000..9cf0fbb
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/fourth.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP fourth</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>fourth</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(fourth <i>expr</i>)</dt>
+<dd><i>expr</i> - a list or list expression<br>
+returns - the fourth element of the list</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'fourth' function returns the fourth element of a list or list
+expression. If the list is
+<nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(fourth '(1 2 3 4 5)) <font color="#008844">; returns 4</font>
+(fourth NIL) <font color="#008844">; returns NIL</font>
+(setq kids '(junie vickie cindy chris)) <font color="#008844">; set up variable KIDS</font>
+(first kids) <font color="#008844">; returns JUNIE</font>
+(second kids) <font color="#008844">; returns VICKIE</font>
+(third kids) <font color="#008844">; returns CINDY</font>
+(fourth kids) <font color="#008844">; returns CHRIS</font>
+(rest kids) <font color="#008844">; returns (VICKIE CINDY CHRIS)</font>
+</pre>
+
+<p><b>Note:</b> This function is set to the same code as
+<a href="caaaar.htm">cadddr</a>.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#fourth">fourth</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/funcall.htm b/docsrc/xlisp/xlisp-doc/reference/funcall.htm
new file mode 100644
index 0000000..6deefa3
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/funcall.htm
@@ -0,0 +1,102 @@
+<html><head><title>XLISP funcall</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>funcall</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(funcall <i>function</i> [<i>arg1</i> ... ])</dt>
+<dd><i>function</i> - the function or symbol to be called<br>
+<i>argN</i> - an argument to be passed to <i>function</i><br>
+returns - the result of calling the function with the arguments</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'funcall' function calls a function with a series of arguments.
+It returns the result from calling the function with the arguments.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(funcall '+ 1 2 3 4) <font color="#008844">; returns 10</font>
+(funcall #'+ 1 2 3 4) <font color="#008844">; returns 10</font>
+(funcall '+ '1 '2 '3) <font color="#008844">; returns 6</font>
+
+(setq sys-add (function +)) <font color="#008844">; returns #&lt;Subr-+: #22c32&gt;</font>
+(setq a 99)
+(funcall sys-add 1 a) <font color="#008844">; 100</font>
+(funcall sys-add 1 'a) <font color="#008844">; error: bad argument type</font>
+ <font color="#008844">; you can't add a symbol, only it's value</font>
+
+(setq a 2) <font color="#008844">; set A</font>
+(setq b 3) <font color="#008844">; and B values</font>
+(funcall (if (&lt; a b) (function +) <font color="#008844">; 'function' can be computed</font>
+ (function -))
+ a b) <font color="#008844">; returns 5</font>
+
+(defun add-to-list (arg list) <font color="#008844">; add a list or an atom</font>
+ (funcall (if (atom arg) 'cons <font color="#008844">; to the front of a list</font>
+ 'append)
+ arg list))
+(add-to-list 'a '(b c)) <font color="#008844">; returns (A B C)</font>
+(add-to-list '(a b) '(b c)) <font color="#008844">; returns (A B B C)</font>
+</pre>
+
+<h2>Notes</h2>
+
+<p>In XLISP, a '<nobr>special form</nobr>' of type FSUBR is not a function.
+This means that 'funcall' only works with functions of type SUBR
+<nobr>[built-in</nobr> function] or CLOSURE [function defined by
+<a href="defun.htm">defun</a>, <a href="flet.htm">flet</a>,
+<a href="labels.htm">labels</a>, or <a href="lambda.htm">lambda</a>], but
+with special forms of <nobr>type FSUBR</nobr> a 'bad function' error is
+signalled. Here is an example how to work around this behaviour:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">funcall*</font> (function &amp;rest args)
+ (if (eq (type-of function) 'fsubr)
+ (eval (cons function args))
+ (apply function args)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/function.htm b/docsrc/xlisp/xlisp-doc/reference/function.htm
new file mode 100644
index 0000000..4e173fc
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/function.htm
@@ -0,0 +1,87 @@
+<html><head><title>XLISP function</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>function</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(function <i>expr</i>)</dt>
+<dd><i>expr</i> - an expression that evaluates to a function<br>
+returns - the functional interpretation</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'function' special form returns the function definition of the
+'expr'. Execution of the 'expr' form does not occur. 'function' will operate
+on functions, special forms, lambda-expressions and macros.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(function car) <font color="#008844">; returns #&lt;Subr-CAR: #23ac4&gt;</font>
+(function quote) <font color="#008844">; returns #&lt;FSubr-QUOTE: #23d1c&gt;</font>
+#'quote <font color="#008844">; returns #&lt;FSubr-QUOTE: #23d1c&gt;</font>
+(function 'cdr) <font color="#008844">; error: not a function</font>
+
+(defun foo (x) (+ x x)) <font color="#008844">; define FOO function</font>
+(function foo) <font color="#008844">; returns #&lt;Closure-FOO: #2cfb6&gt;</font>
+
+(defmacro bar (x) (+ x x)) <font color="#008844">; define FOOMAC macro</font>
+(function bar) <font color="#008844">; returns #&lt;Closure-BAR: #2ceee&gt;</font>
+
+(setq my 99) <font color="#008844">; define a variable MY</font>
+(function my) <font color="#008844">; error: unbound function</font>
+
+(defun my (x) (print x)) <font color="#008844">; define a function MY</font>
+(function my) <font color="#008844">; returns #&lt;Closure-MY: #2cdd6&gt;</font>
+</pre>
+
+<p><b>Read macro:</b> XLISP supports the normal Lisp read macro of a hash
+and quote [#'] as a short-hand method of writing the 'function' special
+form.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-012.htm#function">function</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/gc.htm b/docsrc/xlisp/xlisp-doc/reference/gc.htm
new file mode 100644
index 0000000..1761b81
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/gc.htm
@@ -0,0 +1,74 @@
+<html><head><title>XLISP gc</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>gc</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xldmem.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(gc)</dt>
+<dd>returns - always returns <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'gc' function starts a garbage collection of the unused memory of
+XLISP. <a href="nil.htm">NIL</a> is always returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(gc) <font color="#008844">; start a garbage collection right now</font>
+</pre>
+
+<p><b>Note:</b> The system will cause an automatic garbage collection if it
+runs out of free memory.</p>
+
+<p><b>Note:</b> When 'gc' is called or an automatic garbage collection
+occurs, if the amount of free memory is still low after the garbage
+collection, the system attempts to add more segments [an automatic
+<a href="expand.htm">expand</a>].</p>
+
+<p>See the
+<a href="../manual/xlisp-man-031.htm#gc">gc</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/gcd.htm b/docsrc/xlisp/xlisp-doc/reference/gcd.htm
new file mode 100644
index 0000000..2dc7570
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/gcd.htm
@@ -0,0 +1,75 @@
+<html><head><title>XLISP gcd</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>gcd</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(gcd [<i>int</i> ... ])</dt>
+<dd><i>int</i> - an integer expression<br>
+returns - the greatest common divisor</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'gcd' function returns the greatest common divisor of a series of
+integers. If no arguments are given, a zero is returned. If only one
+argument is given, the absolute value of the argument is returned. The
+successful result is always a positive integer.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(gcd 51 34) <font color="#008844">; returns 17</font>
+(gcd 99 66 22) <font color="#008844">; returns 11</font>
+(gcd -99 66 -33) <font color="#008844">; returns 33</font>
+(gcd -14) <font color="#008844">; returns 14</font>
+(gcd 0) <font color="#008844">; returns 0</font>
+(gcd) <font color="#008844">; returns 0</font>
+(gcd .2) <font color="#008844">; error: bad argument type - 0.2</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#gcd">gcd</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/gensym.htm b/docsrc/xlisp/xlisp-doc/reference/gensym.htm
new file mode 100644
index 0000000..93b05d2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/gensym.htm
@@ -0,0 +1,89 @@
+<html><head><title>XLISP gensym</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>gensym</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(gensym [<i>tag</i>])</dt>
+<dd><i>tag</i> - an optional integer or string<br>
+returns - the new symbol</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'gensym' function generates and returns a symbol. The default symbol
+form is as a character 'G' followed by a number, 'Gn'. The default numbering
+starts at '1'. You can change what the generated symbol looks like. By
+calling 'gensym' with a string 'tag', the default string is set to the
+string parameter. If 'tag' is an integer number, the current number is
+set to the integer parameter.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(gensym) <font color="#008844">; first time =&gt; G1</font>
+(gensym 100) <font color="#008844">; returns G100</font>
+(gensym "MYGENSYM") <font color="#008844">; returns MYGENSYM101</font>
+(gensym 0) <font color="#008844">; returns MYGENSYM0</font>
+(gensym) <font color="#008844">; returns MYGENSYM1</font>
+(gensym "G") <font color="#008844">; \</font>
+(gensym 0) <font color="#008844">; / put it back to 'normal'</font>
+(gensym) <font color="#008844">; just like first time =&gt; G1</font>
+</pre>
+
+<p><b>Note:</b> It takes 2 calls to 'gensym' to set both portions of the
+'gensym' symbol.</p>
+
+<p><b>Note:</b> Although it is possible to call 'gensym' with numbers in the string
+like &quot;AB1&quot;, this does generate an odd sequence. What will happen is you will
+get a sequence of symbols like:</p>
+
+<pre class="example">
+... AB18 AB19 AB110 AB111 ...
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#gensym">gensym</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/get-env.htm b/docsrc/xlisp/xlisp-doc/reference/get-env.htm
new file mode 100644
index 0000000..4511afa
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/get-env.htm
@@ -0,0 +1,64 @@
+<html><head><title>XLISP get-env</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>get-env</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsys.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(get-env <i>string</i>)</dt>
+<dd><i>string</i> - environment variable name as string<br>
+returns - the value of the environment variable as string,
+<nobr>or <a href="nil.htm">NIL</a></nobr></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>get-user</nobr>' function returns the value of an environment
+variable, or <a href="nil.htm">NIL</a> if no variable had been found.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/get-key.htm b/docsrc/xlisp/xlisp-doc/reference/get-key.htm
new file mode 100644
index 0000000..b890899
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/get-key.htm
@@ -0,0 +1,66 @@
+<html><head><title>XLISP get-key</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>get-key</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>sys/unix/osstuff.c, sys/mac/macfun.c, sys/win/msvc/winfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(get-key)</dt>
+<dd>returns - the decimal ASCII value of the key pressed</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'get-key' function gets a single key stroke from the keyboard [as
+opposed to an entire line, as <a href="">read</a> does].</p>
+
+<p><b>Note:</b> In Nyquist, this function is only defined to work on Unix
+systems [including Linux and <nobr>Mac OS X]</nobr>. <nobr>On
+Windows</nobr> systems, <a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mychar (get-key)) <font color="#008844"> ; get a character</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/get-lambda-expression.htm b/docsrc/xlisp/xlisp-doc/reference/get-lambda-expression.htm
new file mode 100644
index 0000000..a3bc5bb
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/get-lambda-expression.htm
@@ -0,0 +1,78 @@
+<html><head><title>XLISP get-lambda-expression</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>get-lambda-expression</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(get-lambda-expression <i>closure</i>)</dt>
+<dd><i>closure</i> - a closure object from a previously defined
+<a href="defun.htm">function</a> or
+<a href="defmacro.htm">macro</a><br>
+returns - the original lambda expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'get-lambda-expression' function takes the 'closure' object and
+returns a reconstruction of a
+<a href="lambda.htm">lambda</a> or
+<a href="defmacro.htm">macro</a> expression that defines the
+'closure'. The parameter must be a 'closure' expression.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun mine (a b) (print (+ a b))) <font color="#008844">; define MINE defun</font>
+(get-lambda-expression (function mine)) <font color="#008844">; returns (LAMBDA (A B) (PRINT (+ A B)))</font>
+
+(get-lambda-expression (lambda (a) (print a)) <font color="#008844">; returns (LAMBDA (A) (PRINT A))</font>
+
+(defmacro plus (n1 n2) `(+ ,n1 ,n2)) <font color="#008844">; define PLUS macro</font>
+(get-lambda-expression (function plus)) <font color="#008844">; returns (MACRO (N1 N2) (BACKQUOTE (+ (COMMA N1) (COMMA N2))))</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-012.htm#get-lambda-expression">get-lambda-expression</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/get-output-stream-list.htm b/docsrc/xlisp/xlisp-doc/reference/get-output-stream-list.htm
new file mode 100644
index 0000000..94c0c6d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/get-output-stream-list.htm
@@ -0,0 +1,75 @@
+<html><head><title>XLISP get-output-stream-list</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>get-output-stream-list</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(get-output-stream-list <i>stream</i>)</dt>
+<dd><i>stream</i> - an output stream expression<br>
+returns - the output so far as a list</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'get-output-stream-list' function empties the specified 'stream' and
+returns this data as a list. The output stream is emptied by this
+operation.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq out (make-string-output-stream)) <font color="#008844">; returns #&lt;Unnamed-Stream: #...&gt;</font>
+
+(format out "123") <font color="#008844">; add some data to output stream</font>
+(get-output-stream-list out) <font color="#008844">; returns (#\1 #\2 #\3)</font>
+
+(format out "123") <font color="#008844">; add some data to output stream</font>
+(read out) <font color="#008844">; returns 123</font>
+(get-output-stream-list out) <font color="#008844">; returns NIL, the string was emptied by 'read'</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-030.htm#get-output-stream-list">get-output-stream-list</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/get-output-stream-string.htm b/docsrc/xlisp/xlisp-doc/reference/get-output-stream-string.htm
new file mode 100644
index 0000000..4dbc02a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/get-output-stream-string.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP get-output-stream-string</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>get-output-stream-string</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(get-output-stream-string <i>stream</i>)</dt>
+<dd><i>stream</i> - an output stream expression<br>
+returns - the output so far as a string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'get-output-stream-string' function empties the specified 'stream'
+and returns this data as a single string. The output stream is emptied by
+this operation.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq out (make-string-output-stream)) <font color="#008844">; returns #&lt;Unnamed-Stream: #...&gt;</font>
+
+(format out "fee fi fo fum ") <font color="#008844">; \</font>
+(format out "I smell the blood of ") <font color="#008844">; fill up output stream</font>
+(format out "Elmer Fudd") <font color="#008844">; /</font>
+(get-output-stream-string out) <font color="#008844">; returns "fee fi fo fum I smell the blood of Elmer Fudd"</font>
+
+(format out "~%now what") <font color="#008844">; add more to output stream</font>
+(get-output-stream-string out) <font color="#008844">; returns "\nnow what"</font>
+(get-output-stream-string out) <font color="#008844">; returns ""</font>
+
+(format out "hello") <font color="#008844">; add more to output stream</font>
+(read out) <font color="#008844">; returns HELLO</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-030.htm#get-output-stream-string">get-output-stream-string</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/get-temp-path.htm b/docsrc/xlisp/xlisp-doc/reference/get-temp-path.htm
new file mode 100644
index 0000000..eb015f9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/get-temp-path.htm
@@ -0,0 +1,68 @@
+<html><head><title>XLISP get-temp-path</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>get-temp-path</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>sys/unix/osstuff.c, sys/win/msvc/winfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(<b>get-temp-path</b>)</dt>
+<dd>returns - the resulting full path as a string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>get-temp-path</nobr>' function tries to get a path where a
+temporary file can be created.</p>
+
+<p><b>Note:</b> Under Windows, the '<nobr>get-temp-path</nobr>' function is
+based on environment variables. <nobr>If XLISP</nobr> is running as a
+<nobr>sub-process</nobr> to Java, the environment may not exist, in which
+case the default result is the unfortunate choice
+'<nobr>c:\windows\</nobr>'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/get-user.htm b/docsrc/xlisp/xlisp-doc/reference/get-user.htm
new file mode 100644
index 0000000..735a8e2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/get-user.htm
@@ -0,0 +1,67 @@
+<html><head><title>XLISP get-user</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>get-user</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>sys/unix/osstuff.c, sys/win/msvc/winstuff.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(get-user)</dt>
+<dd>returns - a string naming the user, or &quot;nyquist&quot;</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>get-user</nobr>' function returns the current user name.
+<nobr>In Unix</nobr> systems [including <nobr>OS X</nobr> and Linux], this
+is the value of the USER environment variable. <nobr>In Windows</nobr>, this
+is currently just &quot;nyquist&quot;, which is also returned if the
+environment variable cannot be accessed. This function is used to avoid the
+case of two users creating files of the same name in the same temp
+directory. </p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/get.htm b/docsrc/xlisp/xlisp-doc/reference/get.htm
new file mode 100644
index 0000000..e8cc487
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/get.htm
@@ -0,0 +1,97 @@
+<html><head><title>XLISP get</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>get</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(get <i>symbol property</i>)</dt>
+<dd><i>symbol</i> - the symbol with a property list<br>
+<i>property</i> - he property name being retrieved<br>
+returns - the property value or <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'get' function returns the value of the'property' from the 'symbol'.
+If the 'property' does not exist, a <a href="nil.htm">NIL</a> is
+returned. The 'symbol' must be an existing symbol. The returned value may be
+a single value or a list.</p>
+
+<p>Property lists are lists attached to any user defined variables. The
+lists are in the form of:</p>
+
+<pre class="example">
+(<font color="#008844"><i>name1 value1 name2 value2</i></font> ... )
+</pre>
+
+<p>Any number of properties may be attached to a single variable.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq person 'bobby) <font color="#008844">; create a variable with a value</font>
+(putprop person 'boogie 'last-name) <font color="#008844">; add a LAST-NAME property</font>
+(putprop person 'disc-jockey 'job) <font color="#008844">; add a JOB property</font>
+
+(get person 'last-name) <font color="#008844">; retrieve LAST-NAME - boogie</font>
+(get person 'job) <font color="#008844">; retrieve JOB - disc-jockey</font>
+(get person 'height) <font color="#008844">; non-existant - returns NIL</font>
+
+(putprop person '(10 20 30) 'stats) <font color="#008844">; add STATS - a list</font>
+(get person 'stats) <font color="#008844">; retrieve STATS - (10 20 30)</font>
+</pre>
+
+<p><b>Note:</b> You can set a property to the value
+<a href="nil.htm">NIL</a>. However, this
+<a href="nil.htm">NIL</a> value is indistinguishable from the
+<a href="nil.htm">NIL</a> returned when a property does not
+exist.</p>
+
+<p><b>Common Lisp:</b> Common Lisp allows for an optional default value,
+which XLISP does not support.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-014.htm#get">get</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-applyhook.htm b/docsrc/xlisp/xlisp-doc/reference/global-applyhook.htm
new file mode 100644
index 0000000..4bc2bbd
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-applyhook.htm
@@ -0,0 +1,78 @@
+<html><head><title>XLISP *applyhook*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*applyhook*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlglob.c (not implemented)</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>&nbsp;*applyhook*</dt>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p> *applyhook* is a system variable that exists and is initialized to
+<a href="nil.htm">NIL</a>. It is a hook that is intended to
+contain a user function that is to be called whenever a function is applied
+to a list of arguments. It is not, however, implemented in XLISP 2.0, it
+only exists as a dummy hook.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*applyhook* =&gt; NIL
+</pre>
+
+<p>*applyhook* is often used to implement function stepping functionality in
+a debugger.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr><a href="../manual/contents.htm#symbols">Symbols</a></nobr></li>
+<li><nobr><a href="../manual/contents.htm#evaluation-functions">Evaluation Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-breakenable.htm b/docsrc/xlisp/xlisp-doc/reference/global-breakenable.htm
new file mode 100644
index 0000000..9a22cf9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-breakenable.htm
@@ -0,0 +1,106 @@
+<html><head><title>XLISP *breakenable*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*breakenable*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xldbug.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<a href="setq.htm">setq</a> <b>*breakenable*</b> <i>boolean</i>)</dt>
+<dd><i>boolean</i> - a generalized boolean value<br>
+returns - <nobr>non-<a href="nil.htm">NIL</a></nobr> if errors shall be handled by the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>, or <a href="nil.htm">NIL</a> if not</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The *breakenable* system variable controls entry to the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr> and
+the trapping of errors. <nobr>If *breakenable*</nobr> is set to
+<nobr><a href="nil.htm">NIL</a> ,</nobr> then no errors from the
+system or from the <a href="error.htm">error</a> or
+<a href="cerror.htm">cerror</a> functions will be trapped.
+<nobr>If *breakenable*</nobr> is <nobr>non-<a href="nil.htm">NIL</a></nobr>,
+the <nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>
+will handle these errors. <nobr>The <a href="break.htm">break</a></nobr>
+function is not affected by *breakenable* and will always force entry to the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>.
+<nobr>If the</nobr> '<nobr>init.lsp</nobr>' initialization file sets
+*breakenable* to <nobr><a href="t.htm">&nbsp;T&nbsp;</a></nobr>,
+errors will be trapped by the
+<nobr><a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+&gt; (defun foo (x) <font color="#008844">; define function FOO</font>
+ (+ x x))
+FOO
+
+&gt; (setq *breakenable* NIL) <font color="#008844">; disable break loop</font>
+NIL
+
+&gt; (foo "a")
+error: bad argument type <font color="#008844">; does NOT enter a break loop</font>
+
+&gt; (setq *breakenable* T) <font color="#008844">; enable break loop</font>
+T
+
+&gt; (foo "a")
+error: bad argument type
+
+1&gt; <font color="#008844">; entered a break loop</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#symbols">Symbols</a></nobr></li>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#debugging-and-error-handling">Debugging and Error Handling</a></nobr></li>
+<li><nobr>XLISP 2.0 Manual &rarr; <a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr></li>
+<li><nobr>Tutorials &rarr; Nyquist &rarr; <a href="../tutorials/nyquist.htm#debugger-shortcuts">Debugger Shortcuts</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-debug-io.htm b/docsrc/xlisp/xlisp-doc/reference/global-debug-io.htm
new file mode 100644
index 0000000..97edafd
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-debug-io.htm
@@ -0,0 +1,72 @@
+<html><head><title>XLISP *debug-io*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*debug-io*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c, xlio.c, xldbug.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dd>
+<dt>*debug-io*</dt>
+</dd>
+
+<h2>Description</h2>
+
+<p>*debug-io* is a system variable that contains a file pointer pointing to
+the stream where all debug input and output goes to and from. The default
+file for *debug-io* is the system standard error device, normally the
+keyboard and screen.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*debug-io* <font color="#008844">; returns #&lt;File-Stream...&gt;</font>
+</pre>
+
+<p><b>Note:</b>
+<nobr><a href="global-trace-output.htm">*trace-output*</a> ,</nobr>
+*debug-io* and <a href="global-error-output.htm">*error-output*</a> are normally
+all set to the same file stream 'stderr'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#debug-io">*debug-io*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-error-output.htm b/docsrc/xlisp/xlisp-doc/reference/global-error-output.htm
new file mode 100644
index 0000000..604e60d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-error-output.htm
@@ -0,0 +1,71 @@
+<html><head><title>XLISP *error-output*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*error-output*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c, xlio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*error-output*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>*error-output* is a system variable that contains a file pointer that
+points to the file where all error output goes to. The default file for
+*error-output* is the system standard error device, normally the screen.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*error-output* <font color="#008844">; returns #&lt;File-Stream...&gt;</font>
+</pre>
+
+<p><b>Note:</b>
+<nobr><a href="global-trace-output.htm">*trace-output*</a> ,</nobr>
+<a href="global-debug-io.htm">*debug-io*</a> and *error-output* are normally
+all set to the same file stream 'stderr'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#error-output">*error-output*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-evalhook.htm b/docsrc/xlisp/xlisp-doc/reference/global-evalhook.htm
new file mode 100644
index 0000000..ad219d5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-evalhook.htm
@@ -0,0 +1,123 @@
+<html><head><title>XLISP *evalhook*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*evalhook*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xleval.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*evalhook*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>*evalhook* is a system variable whose value is user code that will
+intercept evaluations either through normal system evaluation or through
+calls to <a href="evalhook.htm">evalhook</a>. The default value for
+*evalhook* is <nobr><a href="nil.htm">NIL</a> ,</nobr> which
+specifies to use the built in system evaluator. If *evalhook* is
+<nobr>non-<a href="nil.htm">NIL</a> ,</nobr> the routine is
+called with expression and environment parameters. If the environment
+argument is <nobr><a href="nil.htm">NIL</a> ,</nobr> then the the
+current global environment is used. The environment, if
+<nobr>non-<a href="nil.htm">NIL</a> ,</nobr> is a structure
+composed of dotted pairs constructed of the symbol and its value which have
+the form:</p>
+
+<pre class="example">
+(((<font color="#008844"><i>sym1</i></font> . <font color="#008844"><i>val1</i></font>) (<font color="#008844"><i>sym2</i></font> . <font color="#008844"><i>val2</i></font>) ... )))
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun myeval (exp env) <font color="#008844">; define MYEVAL routine</font>
+ (princ "exp: ") (print exp)
+ (princ "env: ") (print env)
+ (evalhook exp #'myeval NIL env))
+
+(defun foo (a) (+ a a)) <font color="#008844">; create simple function</font>
+(setq *evalhook* #'myeval) <font color="#008844">; and install MYEVAL as hook</font>
+
+(foo 1) <font color="#008844">; prints exp: (FOO 1) env:NIL</font>
+ <font color="#008844">; exp: 1 env:NIL</font>
+ <font color="#008844">; exp: (+ A A) env:((((A . 1))))</font>
+ <font color="#008844">; exp: A env:((((A . 1))))</font>
+ <font color="#008844">; exp: A env:((((A . 1))))</font>
+ <font color="#008844">; returns 2</font>
+
+(top-level) <font color="#008844">; to clean up *evalhook*</font>
+</pre>
+
+<p><b>Note:</b> The <a href="evalhook.htm">evalhook</a> function and
+*evalhook* system variable are very useful in the construction of debugging
+facilities within XLISP. The <a href="trace.htm">trace</a> and
+<a href="untrace.htm">untrace</a> functions use
+<a href="evalhook.htm">evalhook</a> and *evalhook* to implement
+their functionality. The other useful aspect of
+<a href="evalhook.htm">evalhook</a> and *evalhook* is to help in
+understanding how XLISP works to see the expressions, their environment
+and how they are evaluated.</p>
+
+<p><b>Caution:</b> Be careful when using *evalhook* and
+<a href="evalhook.htm">evalhook</a>. If you put in a bad definition
+into *evalhook*, you might not be able to do anything and will need to
+exit XLISP.</p>
+
+<p><b>Unusual behaviour:</b> The <a href="evalhook.htm">evalhook</a>
+function and *evalhook* system variable, by their nature, cause some unusual
+things to happen. After you have set *evalhook* to some
+non-<a href="nil.htm">NIL</a> value, your function will be
+called. However, when you are all done and set *evalhook* to
+<a href="nil.htm">NIL</a> or some other new routine, it will
+never be set. This is because the
+<a href="evalhook.htm">evalhook</a> function [in the 'xlbfun.c'
+source file] saves the old value of *evalhook* before calling your routine,
+and then restores it after the evaluation. The mechanism to reset
+*evalhook* is to execute the
+<a href="top-level.htm">top-level</a> function, which sets
+*evalhook* to <a href="nil.htm">NIL</a>.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#evalhook">*evalhook*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-file-separator.htm b/docsrc/xlisp/xlisp-doc/reference/global-file-separator.htm
new file mode 100644
index 0000000..f30bb3b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-file-separator.htm
@@ -0,0 +1,68 @@
+<html><head><title>XLISP *file-separator*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*file-separator*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>&nbsp;*file-separator*</dt>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The Nyquist *file-separator* variable is initialized to the operation
+system's file separator character. <nobr>It has</nobr> a value of #\\ on
+Windows and a value of #\/ on Unix [including Linux and <nobr>Mac OS
+X]</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*file-separator* =&gt; #\/ <font color="#008844">; on Unix, Linux, and Mac OS X</font>
+*file-separator* =&gt; #\\ <font color="#008844">; on Windows</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-float-format.htm b/docsrc/xlisp/xlisp-doc/reference/global-float-format.htm
new file mode 100644
index 0000000..3665b7b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-float-format.htm
@@ -0,0 +1,179 @@
+<html><head><title>XLISP *float-format*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*float-format*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlprin.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*float-format*</dt>
+<dd>returns - the print format for <nobr>floating-point</nobr> numbers</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p> *float-format* is a system variable that allows a user to specify how
+floating point numbers are to be printed by XLISP. The value of
+*float-format* should be set to one of the string expressions
+&quot;%e&quot;, &quot;%f&quot; or &quot;%g&quot;. These format strings are
+similar to C-language floating point specifications:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;&quot;%e&quot;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-<code>&nbsp;</code></nobr></td>
+ <td width="100%">exponential. The number is converted to decimal notation
+ of the form:
+
+<pre class="example">
+[-]<font color="#0000CC"><i>m</i></font>.<font color="#0000CC"><i>nnnnnn</i></font>E[+-]<font color="#0000CC"><i>xx</i></font>
+</pre>
+
+ There is one leading digit. There are 6 digits after the decimal
+ point.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;&quot;%f&quot;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-<code>&nbsp;</code></nobr></td>
+ <td width="100%">decimal. The number is converted to decimal notation of
+ the form:
+
+<pre class="example">
+[-]<font color="#0000CC"><i>mmmmmm</i></font>.<font color="#0000CC"><i>nnnnnn</i></font>
+</pre>
+
+ There are as many digits before the decimal point as necessary. There
+ are 6 digits after the decimal point.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;&quot;%g&quot;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-<code>&nbsp;</code></nobr></td>
+ <td width="100%">shortest. The number is converted to either the form of
+ &quot;%e&quot; or &quot;%f&quot;, whichever produces the shortest output
+ string. Non-significant zeroes are not printed.</td>
+</tr>
+</tbody></table></p>
+
+<p> The default value for *float-format* is the string "%g".</p>
+
+<p>There are several additional flags and options available:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;+</code></nobr></td>
+ <td><nobr>&nbsp;<code>&nbsp;</code>-<code>&nbsp;</code></nobr></td>
+ <td width="100%"><nobr>always print the sign</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr><code><i>space</i></code></nobr></td>
+ <td><nobr>&nbsp;<code>&nbsp;</code>-<code>&nbsp;</code></nobr></td>
+ <td width="100%"><nobr>print a space instead of a + sign</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;#</code></nobr></td>
+ <td><nobr>&nbsp;<code>&nbsp;</code>-<code>&nbsp;</code></nobr></td>
+ <td width="100%"><nobr>always print the dot, do not remove zeros after the dot</nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td><nobr><code>&nbsp;.<i>n</i></code></nobr></td>
+ <td><nobr>&nbsp;<code>&nbsp;</code>-<code>&nbsp;</code></nobr></td>
+ <td width="100%"><nobr>number of digits after the dot</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>The flags and options must be written between the &quot;%&quot; and the
+formatting letter, as shown in the examples below.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq *float-format* "%e") <font color="#008844">; exponential notation</font>
+(print 1.0) =&gt; 1.000000e+00
+(print -9e99) =&gt; -9.000000e+99
+
+(setq *float-format* "%f") <font color="#008844">; decimal notation</font>
+(print 1.0) =&gt; 1.000000
+(print 1.0e4) =&gt; 10000.000000
+(print -999.99e-99) =&gt; -0.000000</font>
+
+(setq *float-format* "%g") <font color="#008844">; shortest notation</font>
+(print 1.0) =&gt; 1
+(print 1.0e7) =&gt; 1e+07
+(print -999.999e99) =&gt; -9.99999e+101
+
+(setq *float-format* "%+g") <font color="#008844">; always print the sign</font>
+(print 1.1) =&gt; +1.1
+(print -1.1) =&gt; -1.1
+
+(setq *float-format* "% g") <font color="#008844">; print a space instead of the + sign</font>
+(print 1.1) =&gt; 1.1
+(print -1.1) =&gt; -1.1
+
+(setq *float-format* "%#.10g") <font color="#008844">; ten digits after the dot</font>
+(print 1.0) =&gt; 1.000000000
+(print 1.0e7) =&gt; 10000000.00
+(print -999.9999999e99) =&gt; -9.999999999e+101
+
+(setq *float-format* "%+#.10g") <font color="#008844">; ten digits after the dot plus sign</font>
+(print 1.2345) =&gt; +1.234500000
+(print -1.2345) =&gt; -1.234500000
+
+(setq *float-format* "%%") <font color="#008844">; bad format</font>
+(print 1.0) =&gt; %%
+
+(setq *float-format* "%g") <font color="#008844">; reset to shortest notation</font>
+</pre>
+
+<p><b>Note:</b> The string in the <nobr>*float-format*</nobr> variable is
+the format specifier for the the underlying 'sprintf'
+<nobr>C-function</nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-gc-flag.htm b/docsrc/xlisp/xlisp-doc/reference/global-gc-flag.htm
new file mode 100644
index 0000000..33e3834
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-gc-flag.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP *gc-flag*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*gc-flag*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xldmem.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*gc-flag*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>*gc-flag* is a system variable that controls the printing of a garbage
+collection message. If *gc-flag* is
+<nobr><a href="nil.htm">NIL</a> ,</nobr>
+no garbage collection messages will be printed. If *gc-flag* is
+non-<nobr><a href="nil.htm">NIL</a> ,</nobr> a garbage collection
+message will be printed whenever a <a href="gc.htm">gc</a> takes
+place. The default value for *gc-flag* is
+<a href="nil.htm">NIL</a>. The message will be of the form:</p>
+
+<pre class="example">
+[ gc: total 4000, 2497 free ]
+</pre>
+
+
+<h2>Examples</h2>
+
+<pre class="example">
+*gc-flag* <font color="#008844">; returns NIL</font>
+(gc) <font color="#008844">; returns NIL</font>
+(setq *gc-flag* T) <font color="#008844">; set up for message</font>
+(gc) <font color="#008844">; prints a gc message</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#gc-flag">*gc-flag*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-gc-hook.htm b/docsrc/xlisp/xlisp-doc/reference/global-gc-hook.htm
new file mode 100644
index 0000000..df39b55
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-gc-hook.htm
@@ -0,0 +1,125 @@
+<html><head><title>XLISP *gc-hook*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*gc-hook*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xldmem.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*gc-hook*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>*gc-hook* is a system variable that allows a user function to be
+performed everytime garbage is collected [either explicitly with
+<a href="gc.htm">gc</a> or automatically]. The default value for
+*gc-hook* is <a href="nil.htm">NIL</a>. When *gc-hook* is set to
+a non-<a href="nil.htm">NIL</a> symbol, it is enabled to execute
+the specified user routine. The user routine can be a quoted symbol or a
+closure. There are two parameters to the user routine, the total number of
+nodes and current free nodes after the garbage collection.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*gc-hook* <font color="#008844">; returns NIL</font>
+(gc) <font color="#008844">; returns NIL</font>
+
+(defun mygchook (&amp;rest stuff) <font color="#008844">; define the hook</font>
+ (print stuff)
+ (print "my hook"))
+
+(setq *gc-hook* 'mygchook) <font color="#008844">; set up *GC-HOOK*</font>
+
+(gc) <font color="#008844">; prints (2640 232)</font>
+ <font color="#008844">; "my hook"</font>
+ <font color="#008844">; returns NIL</font>
+
+(setq *gc-flag* T) <font color="#008844">; turn on the system GC message</font>
+
+(gc) <font color="#008844">; prints</font>
+ <font color="#008844">; [ gc: total 2640, (2640 241)</font>
+ <font color="#008844">; "my hook"</font>
+ <font color="#008844">; 236 free ]</font>
+ <font color="#008844">; returns NIL</font>
+
+(setq *gc-flag* NIL) <font color="#008844">; turn off GC message</font>
+
+(setq *gc-hook* (lambda (x y) <font color="#008844">; enable user routine</font>
+ (princ "\007"))) <font color="#008844">; that beeps at every GC</font>
+
+(gc) <font color="#008844">; beeps</font>
+
+(defun expand-on-gc (total free) <font color="#008844">; define EXPAND-ON-GC</font>
+ (if (&lt; (/ free 1.0 total) .1) <font color="#008844">; IF free/total &lt; .10</font>
+ (progn (expand 2) <font color="#008844">; THEN expand memory</font>
+ (princ "\007")))) <font color="#008844">; and beep</font>
+
+ <font color="#008844">; NOTE: XLISP already gets more nodes</font>
+ <font color="#008844">; automatically, this is just an example.</font>
+
+(setq *gc-hook* 'expand-on-gc) <font color="#008844">; enable EXPAND-ON-GC</font>
+(gc) <font color="#008844">; beeps when low on nodes</font>
+</pre>
+
+<p><b>Note:</b> The *gc-hook* and <a href="global-gc-flag.htm">*gc-flag*</a>
+facilities can interact. If you do printing in the *gc-hook* user form and
+enable <nobr><a href="global-gc-flag.htm">*gc-flag*</a> ,</nobr> the
+*gc-hook* printing will come out in the middle of the
+<a href="global-gc-flag.htm">*gc-flag*</a> message.</p>
+
+<p><b>Note:</b> The *gc-hook* user form is evaluated after the execution of
+the actual garbage collection code. This means that if the user form causes
+an error, it does not prevent a garbage collection.</p>
+
+<p><b>Note:</b> Since *gc-hook* is set to a symbol, the user defined form
+can be changed by doing another <a href="defun.htm">defun</a> [or
+whatever] to the symbol in *gc-hook*. Note also that you should define the
+symbol first and then set *gc-hook* to the symbol. If you don't, an
+automatic garbage collection might occur before you set *gc-hook*,
+generating an error and stopping your program.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#gc-hook">*gc-hook*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-integer-format.htm b/docsrc/xlisp/xlisp-doc/reference/global-integer-format.htm
new file mode 100644
index 0000000..40cb06f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-integer-format.htm
@@ -0,0 +1,129 @@
+<html><head><title>XLISP *integer-format*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*integer-format*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlprin.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*integer-format*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>*integer-format* is a system variable that allows a user to specify how
+integer numbers are to be printed by XLISP. The value of *integer-format*
+should be set to one of the string expressions &quot;%ld&quot;,
+&quot;%lo&quot; or &quot;%lx&quot; [the character after the percent
+character is the lower-case 'L' character]. These format strings are similar
+to C-language floating point specifications:</p>
+
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr><code>&quot;%ld&quot;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>decimal</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&quot;%lu&quot;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>unsigned decimal</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&quot;%lo&quot;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>unsigned octal</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&quot;%lx&quot;</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>unsigned hexadecimal</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>The default value for *integer-format* is the string "%ld".</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*integer-format* <font color="#008844">; returns "%ld"</font>
+
+(setq *integer-format* "%ld") <font color="#008844">; signed decimal</font>
+(print 1) <font color="#008844">; prints 1</font>
+(print 1234) <font color="#008844">; prints 1234</font>
+(print -1) <font color="#008844">; prints -1</font>
+(print -1234) <font color="#008844">; prints -1234</font>
+
+(setq *integer-format* "%lo") <font color="#008844">; octal notation</font>
+(print 1) <font color="#008844">; prints 1</font>
+(print 1234) <font color="#008844">; prints 2322</font>
+(print -1) <font color="#008844">; prints 37777777777</font>
+(print -1234) <font color="#008844">; prints 37777775456</font>
+
+(setq *integer-format* "%lx") <font color="#008844">; hexadecimal notation</font>
+(print 1) <font color="#008844">; prints 1</font>
+(print -1) <font color="#008844">; prints ffffffff</font>
+(print 1234) <font color="#008844">; prints 4d2</font>
+(print -1234) <font color="#008844">; prints fffffb2e</font>
+
+(setq *integer-format* "%u") <font color="#008844">; unsigned decimal</font>
+(print 1) <font color="#008844">; prints 1</font>
+(print 1234) <font color="#008844">; prints 1234</font>
+(print -1) <font color="#008844">; prints 4294967295</font>
+(print -1234) <font color="#008844">; prints 4294966062</font>
+
+(setq *integer-format* "hi") <font color="#008844">; a bad notation</font>
+(print 1) <font color="#008844">; prints hi</font>
+(print 9999) <font color="#008844">; prints hi</font>
+
+(setq *integer-format* "%ld") <font color="#008844">; reset to original "%ld"</font>
+</pre>
+
+<p><b>Note:</b> There can be other characters put in the string, but in
+general, this will not produce particularly desirable behaviour. There is no
+error checking performed on the format string.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#integer-format">*integer-format*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-obarray.htm b/docsrc/xlisp/xlisp-doc/reference/global-obarray.htm
new file mode 100644
index 0000000..5014f40
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-obarray.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP *obarray*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*obarray*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsym.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*obarray*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The *obarray* system variable contains the system symbol table.
+This symbol table is an XLISP array that is constructed out of lists.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun lookin (sym) <font color="#008844">; create a function to</font>
+ (aref *obarray* <font color="#008844">; look inside *OBARRAY*</font>
+ (hash sym (length *obarray*)))) <font color="#008844">; and look for a specific</font>
+ <font color="#008844">; symbol - returns a list</font>
+
+(lookin "CAR") <font color="#008844">; returns (TEST PEEK CAR)</font>
+(lookin "car") <font color="#008844">; returns NIL</font>
+</pre>
+
+<p><b>Note:</b> When looking into *obarray* or
+<a href="intern.htm">intern</a>ing symbols, remember that
+&quot;car&quot; and &quot;CAR&quot; written as strings [with quotation marks
+in front and behind] are two different symbols in *obarray*. Remember also
+that normal symbols created by XLISP are upper case names. So, if you type
+in 'car as a normal symbol [with a single quote in front of it], it will be
+the symbol CAR after this normal upper-casing operation.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#obarray">*obarray*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-print-case.htm b/docsrc/xlisp/xlisp-doc/reference/global-print-case.htm
new file mode 100644
index 0000000..34b84a2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-print-case.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP *print-case*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*print-case*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlprin.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*print-case*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>*print-case* is a system variable that allows a user to specify how
+symbols are to be printed by XLISP. If *print-case* is set to ':downcase',
+all symbols will be printed in lower case characters. If *print-case* is set
+to ':upcase', all symbols will be printed in upper case characters. If
+*print-case* is set to anything other than ':upcase' or ':downcase', all
+symbols will be printed in upper case characters. The default value for
+*print-case* is ':upcase'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq *print-case* :downcase) <font color="#008844">; returns :downcase</font>
+(setq a 'b) <font color="#008844">; returns b</font>
+
+(setq *print-case* 'foo) <font color="#008844">; returns FOO</font>
+(setq a 'b) <font color="#008844">; returns B</font>
+
+(setq *print-case* :upcase) <font color="#008844">; returns :UPCASE</font>
+(setq a 'b) <font color="#008844">; returns B</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common LISP supports a third keyword ':capitalize' to
+print the first character of symbol names in upper-case. XLISP does not
+support this. In XLISP, if *print-case* is set to ':capitalize', all
+characters in symbols names will be printed in upper-case characters.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#print-case">*print-case*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-readtable.htm b/docsrc/xlisp/xlisp-doc/reference/global-readtable.htm
new file mode 100644
index 0000000..caa3d70
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-readtable.htm
@@ -0,0 +1,166 @@
+<html><head><title>XLISP *readtable*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*readtable*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*readtable*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p> The *readtable* is a system variable that contains XLISP's data
+structures relating to the processing of characters from the user (or files)
+and read-macro expansions. The table is 128 entries [0..127] for each of the
+7-bit <a href="../misc/ascii-table.htm">ASCII</a> characters that
+XLISP can read. Each entry in the *readtable* array must be one of
+<nobr><a href="nil.htm">NIL</a> ,</nobr>
+<nobr><a href="keyword-constituent.htm">:constituent</a> ,</nobr>
+<nobr><a href="keyword-white-space.htm">:white-space</a> ,</nobr>
+<nobr><a href="keyword-sescape.htm">:sescape</a> ,</nobr>
+<nobr><a href="keyword-mescape.htm">:mescape</a> ,</nobr> a
+<a href="keyword-tmacro.htm">:tmacro</a> dotted pair or a
+<a href="keyword-nmacro.htm">:nmacro</a> dotted pair with the meaning
+of:</p>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr><code>&nbsp;NIL</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>the character is invalid</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="nil.htm">nil</a>]</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>:CONSTITUENT</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>the character is valid, as is</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="keyword-constituent.htm">:constituent</a>]</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>:WHITE-SPACE</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>the character may be skipped over</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="keyword-white-space.htm">:white-space</a>]</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>:SESCAPE</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>the single escape character '\'</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="keyword-sescape.htm">:sescape</a>]</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>:MESCAPE</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>the multiple escape character '|'</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="keyword-mescape.htm">:mescape</a>]</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>(:TMACRO . <i>fun</i>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>a terminating readmacro</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="keyword-tmacro.htm">:tmacro</a>]</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>(:NMACRO . <i>fun</i>)</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td><nobr>a non-terminating readmacro</nobr></td>
+ <td width="100%"><nobr>&nbsp;&nbsp; [see
+ <a href="keyword-nmacro.htm">:nmacro</a>]</nobr></td>
+</tr>
+</tbody></table></p>
+
+
+<p>In the case of <a href="keyword-nmacro.htm">:nmacro</a> and
+<nobr><a href="keyword-tmacro.htm">:tmacro</a> ,</nobr> the form of the
+*readtable* entry is a list like:</p>
+
+<pre class="example">
+(:tmacro . <font color="#008844"><i>function</i></font>)
+(:nmacro . <font color="#008844"><i>function</i></font>)
+</pre>
+
+<p>The 'function' can be a built-in read-macro function or a user defined
+<a href="lambda.htm">lambda</a> expression. The 'function' takes two
+parameters, an input stream specification, and an integer that is the
+character value. The 'function' should return
+<a href="nil.htm">NIL</a> if the character is 'white-space' or a
+value <a href="cons.htm">cons</a>ed with
+<a href="nil.htm">NIL</a> to return the value.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*readtable* <font color="#008844">; returns the current table</font>
+
+<font color="#008844">;; define a function to look in a table and</font>
+<font color="#008844">;; print out any entries with a function</font>
+
+(defun look-at (table)
+ (dotimes (ch 127)
+ (prog ((entry (aref table ch)))
+ (case entry
+ (nil nil)
+ (:constituent nil)
+ (:white-space nil)
+ (:sescape nil)
+ (:mescape nil)
+ (t (princ (int-char ch))))))
+ (terpri))
+
+(look-at *readtable*) <font color="#008844">; prints "#'(),;`</font>
+</pre>
+
+<p><b>Caution:</b> If you experiment with *readtable*, it is useful to save
+the old value in a variable, so that you can restore the system state.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#readtable">*readtable*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-rslt.htm b/docsrc/xlisp/xlisp-doc/reference/global-rslt.htm
new file mode 100644
index 0000000..84e2254
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-rslt.htm
@@ -0,0 +1,83 @@
+<html><head><title>XLISP *rslt*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*rslt*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>not explicitely defined</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>*rslt*</dt>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>When a function returns more than one value, the global Nyquist *rslt*
+variable is set to a list of the 'extra' values. This provides a
+<nobr>make-shift</nobr> version of the '<nobr>multiple-value-return</nobr>'
+facility in <nobr>Common Lisp</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun cl:values (&amp;rest args)
+ (setq *rslt* args)
+ (first args))
+
+(values 1 2 3) =&gt; 1
+*rslt* =&gt; (1 2 3)
+</pre>
+
+<p>See <a href="defun.htm">defun</a>, <a href="first.htm">first</a>,
+<a href="rest.htm">rest</a>,
+<a href="lambda-keyword-rest.htm">&amp;rest</a>,
+<a href="setq.htm">setq</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr><a href="../examples/values.htm">Multiple Values</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-standard-input.htm b/docsrc/xlisp/xlisp-doc/reference/global-standard-input.htm
new file mode 100644
index 0000000..37cdcbc
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-standard-input.htm
@@ -0,0 +1,73 @@
+<html><head><title>XLISP *standard-input*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*standard-input*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*standard-input*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The *standard-input* system variable contains a file pointer that points
+to the file where all normal input from the programmer or user comes from.
+The default file for *standard-input* is the system standard input device,
+normally the system keyboard.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*standard-input* <font color="#008844">; returns #&lt;File-Stream: #2442e&gt;</font>
+</pre>
+
+<p><b>Note:</b> Be careful when modifying the *standard-input*. If you do
+not save the old file pointer, you will not be able to return to normal
+operation and will need to exit XLISP. If the file or source that you have
+set *standard-input* to does not reset *standard-input* to its previous
+value, you will never get control back to the keyboard.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#standard-input">*standard-input*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-standard-output.htm b/docsrc/xlisp/xlisp-doc/reference/global-standard-output.htm
new file mode 100644
index 0000000..65c0d73
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-standard-output.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP *standard-output*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*standard-output*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*standard-output*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The *standard-output* system variable contains a file pointer that points
+to the file where all normal printing and messages from XLISP will go. The
+default file for *standard-output* is the system standard output device,
+normally the screen display.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*standard-output* <font color="#008844">; returns #&lt;File-Stream: #24406&gt;</font>
+(setq old-so *standard-output*) <font color="#008844">; save the file pointer</font>
+(setq fp (open "f" :direction :output)) <font color="#008844">; open a new output file</font>
+(setq *standard-output* fp) <font color="#008844">; change where output goes</font>
+
+(+ 2 2) <font color="#008844">; you won't see any messages</font>
+ <font color="#008844">; just the echo of input line</font>
+
+(setq *standard-output* old-so) <font color="#008844">; restore standard output</font>
+(close fp) <font color="#008844">; close file</font>
+</pre>
+
+<p><b>Note:</b> Be careful when modifying the *standard-output*, you will
+not be able to see what you are doing. If you do not save the old file
+pointer, you will not be able to return to normal operation and will need to
+exit XLISP.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#standard-output">*standard-output*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-trace-output.htm b/docsrc/xlisp/xlisp-doc/reference/global-trace-output.htm
new file mode 100644
index 0000000..697a70f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-trace-output.htm
@@ -0,0 +1,71 @@
+<html><head><title>XLISP *trace-output*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*trace-output*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c, xlio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*trace-output*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The *trace-output* system variable contains a file pointer that points to
+the file where all trace output goes to. The default file for *trace-output*
+is the system standard error device, normally the screen.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*trace-output* <font color="#008844">; returns #&lt;File-Stream...&gt;</font>
+</pre>
+
+<p><b>Note:</b> *trace-output*,
+<a href="global-debug-io.htm">*debug-io*</a> and
+<a href="global-error-output.htm">*error-output*</a> are normally all set to
+the same file stream 'stderr'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#trace-output">*trace-output*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-tracelimit.htm b/docsrc/xlisp/xlisp-doc/reference/global-tracelimit.htm
new file mode 100644
index 0000000..7af1f15
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-tracelimit.htm
@@ -0,0 +1,103 @@
+<html><head><title>XLISP *tracelimit*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*tracelimit*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c, xldbug.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*tracelimit*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The *tracelimit* system variable controls the number of forms printed on
+entry to the <nobr><a href="../manual/xlisp-man-004.htm">break
+loop</a></nobr>. If *tracelimit* is an integer, then the integer is the
+maximum number of forms that will be printed. If *tracelimit* is <a
+href="nil.htm">NIL</a> or a non-integer, then all of the forms
+will be printed. Note that <a href="global-tracenable.htm">*tracenable*</a>
+needs to be set to a non-<a href="nil.htm">NIL</a> value to
+enable the printing of back-trace information on entry to the <nobr><a
+href="../manual/xlisp-man-004.htm">break loop</a></nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun foo (x) (fee x)) <font color="#008844">; define FOO</font>
+(defun fee (y) (break)) <font color="#008844">; define FEE</font>
+(setq *tracenable* T) <font color="#008844">; enable the back trace</font>
+(setq *tracelimit* NIL) <font color="#008844">; show all the entries</font>
+
+(foo 5) <font color="#008844">; break: **BREAK**</font>
+ <font color="#008844">; prints Function:#&lt;Subr-BREAK...&gt;</font>
+ <font color="#008844">; Function:#&lt;Closure-FEE...&gt;</font>
+ <font color="#008844">; Arguments:</font>
+ <font color="#008844">; 5</font>
+ <font color="#008844">; Function:#&lt;Closure-FOO...&gt;</font>
+ <font color="#008844">; Arguments:</font>
+ <font color="#008844">; 5</font>
+
+(clean-up) <font color="#008844">; from break loop</font>
+(setq *tracelimit* 2) <font color="#008844">; show only 2 entries</font>
+
+(foo 5) <font color="#008844">; break: **BREAK**</font>
+ <font color="#008844">; prints Function:#&lt;Subr-BREAK...&gt;</font>
+ <font color="#008844">; Function:#&lt;Closure-FEE...&gt;</font>
+ <font color="#008844">; Arguments:</font>
+ <font color="#008844">; 5</font>
+
+(clean-up) <font color="#008844">; from break loop</font>
+</pre>
+
+<p><b>Note:</b> <a href="global-tracenable.htm">*tracenable*</a> and
+*tracelimit* system variables have to do with back trace information at
+entry to a
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a></nobr>
+and are not related to the
+<a href="trace.htm">trace</a> and
+<a href="untrace.htm">untrace</a> functions.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#tracelimit">*tracelimit*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-tracelist.htm b/docsrc/xlisp/xlisp-doc/reference/global-tracelist.htm
new file mode 100644
index 0000000..3c84faa
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-tracelist.htm
@@ -0,0 +1,74 @@
+<html><head><title>XLISP *tracelist*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*tracelist*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c, xleval.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*tracelist*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The *tracelist* system variable contains a list of the current
+functions being <a href="trace.htm">trace</a>d.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun foo (x) (print (car x))) <font color="#008844">; define FOO</font>
+(trace foo) <font color="#008844">; returns (FOO)</font>
+(trace car) <font color="#008844">; returns (CAR FOO)</font>
+
+(print *tracelist*) <font color="#008844">; prints (CAR FOO)</font>
+
+(untrace foo) <font color="#008844">; returns (CAR)</font>
+(untrace car) <font color="#008844">; returns NIL</font>
+
+(print *tracelist*) <font color="#008844">; prints NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#tracelist">*tracelist*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-tracenable.htm b/docsrc/xlisp/xlisp-doc/reference/global-tracenable.htm
new file mode 100644
index 0000000..8863e96
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-tracenable.htm
@@ -0,0 +1,105 @@
+<html><head><title>XLISP *tracenable*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*tracenable*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c, xldbug.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*tracenable*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The *tracenable* system variable controls whether or not the
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a></nobr>
+prints any back trace information on entry to the
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a></nobr>. If
+*tracenable* is <nobr><a href="nil.htm">NIL</a> ,</nobr> then
+there will be no information printed on entry to the
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a>.</nobr>
+If *tracenable* is <nobr>non-<a href="nil.htm">NIL</a> ,</nobr>
+then information will be printed. The 'init.lsp' initialization file sets
+*tracenable* usually to <nobr><a href="nil.htm">NIL</a> ,</nobr>
+which suppresses the printing.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun foo (x) (fee x)) <font color="#008844">; define FOO</font>
+(defun fee (y) (break)) <font color="#008844">; define FEE</font>
+(setq *tracenable* T) <font color="#008844">; enable the back trace</font>
+(setq *tracelimit* NIL) <font color="#008844">; show all the entries</font>
+
+(foo 5) <font color="#008844">; break: **BREAK**</font>
+ <font color="#008844">; prints Function:#&lt;Subr-BREAK...&gt;</font>
+ <font color="#008844">; Function:#&lt;Closure-FEE...&gt;</font>
+ <font color="#008844">; Arguments:</font>
+ <font color="#008844">; 5</font>
+ <font color="#008844">; Function:#&lt;Closure-FOO...&gt;</font>
+ <font color="#008844">; Arguments:</font>
+ <font color="#008844">; 5</font>
+
+(clean-up) <font color="#008844">; from break loop</font>
+(setq *tracelimit* 2) <font color="#008844">; show only 2 entries</font>
+
+(foo 5) <font color="#008844">; break: **BREAK**</font>
+ <font color="#008844">; prints Function:#&lt;Subr-BREAK...&gt;</font>
+ <font color="#008844">; Function:#&lt;Closure-FEE...&gt;</font>
+ <font color="#008844">; Arguments:</font>
+ <font color="#008844">; 5</font>
+
+(clean-up) <font color="#008844">; from break loop</font>
+</pre>
+
+<p><b>Note:</b> *tracenable* and
+<a href="global-tracelimit.htm">*tracelimit*</a> system variables have to do
+with back trace information at entry to a
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a></nobr>
+and are not related to the
+<a href="trace.htm">trace</a> and
+<a href="untrace.htm">untrace</a> functions.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#tracenable">*tracenable*</a>
+system variable in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/global-unbound.htm b/docsrc/xlisp/xlisp-doc/reference/global-unbound.htm
new file mode 100644
index 0000000..424b603
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/global-unbound.htm
@@ -0,0 +1,70 @@
+<html><head><title>XLISP *unbound*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*unbound*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system constant</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c, xlsym.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;*unbound*</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The *unbound* system constant is used to indicate when a symbol has no
+value. *unbound* is set to the value *unbound*. This means that the system
+thinks the symbol *unbound* has no value.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+*unbound* <font color="#008844">; error: unbound variable</font>
+(setq a 5) <font color="#008844">; returns 5</font>
+a <font color="#008844">; returns 5</font>
+(setq a '*unbound*) <font color="#008844">; returns *UNBOUND*</font>
+a <font color="#008844">; error: unbound variable</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-011.htm#unbound">*unbound*</a>
+system constant in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/go.htm b/docsrc/xlisp/xlisp-doc/reference/go.htm
new file mode 100644
index 0000000..3c3715f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/go.htm
@@ -0,0 +1,106 @@
+<html><head><title>XLISP go</title></head>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>go</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(go <i>tag-symbol</i>)</dt>
+<dd><i>tag-symbol</i> - a symbol<br>
+returns - never returns a value</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'go' special form allows 'goto' style branching within 'block' constructs
+<nobr>[<a href="do.htm">do</a> ,</nobr>
+<nobr><a href="do-star.htm">do*</a> ,</nobr>
+<nobr><a href="dolist.htm">dolist</a> ,</nobr>
+<nobr><a href="dotimes.htm">dotimes</a> ,</nobr>
+<nobr><a href="tagbody.htm">tagbody</a> ,</nobr>
+<nobr><a href="loop.htm">loop</a> ,</nobr>
+<a href="prog.htm">prog</a> and
+<a href="prog-star.htm">prog*</a>]. The
+'tag-symbol' is the 'label' and must exist somewhere within the 'block'
+that the 'go' occurs within. Otherwise an error will be generated:</p>
+
+<pre class="example">
+<font color="#AA0000">error: no target for GO</font>
+</pre>
+
+<p>'go' never returns a value. If the 'tag-symbol' exists, then
+the execution will continue immediately after the'tag-symbol'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun foo (i j) <font color="#008844">; define FOO</font>
+ (prog () <font color="#008844">; with a PROG</font>
+ (print "begin")
+ start (print j) <font color="#008844">; tag - START</font>
+ (setq j (1- j))
+ (if (eql i j) (GO start) <font color="#008844">; 2-way branch</font>
+ (GO end))
+ (print "hello") <font color="#008844">; won't ever be reached</font>
+ end (print "done") <font color="#008844">; tag - END</font>
+ (return 42)))
+
+(foo 1 2) <font color="#008844">; prints "begin" 2 1 "done"</font>
+ <font color="#008844">; returns 42</font>
+
+(foo 2 1) <font color="#008844">; prints "begin" 1 "done"</font>
+ <font color="#008844">; returns 42</font>
+</pre>
+
+<p><b>Note:</b> Although 'go' will accept a 'tag-symbol' that is not a
+symbol, it will not find this improper 'tag-symbol'. An error will be
+generated:</p>
+
+<pre class="example">
+<font color="#AA0000">error: no target for GO</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-021.htm#go">go</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/hash.htm b/docsrc/xlisp/xlisp-doc/reference/hash.htm
new file mode 100644
index 0000000..03abbe7
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/hash.htm
@@ -0,0 +1,90 @@
+<html><head><title>XLISP hash</title></head>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>hash</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c, xlsym.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(hash <i>name table-size</i>)</dt>
+<dd><i>name</i> - a symbol or string expression<br>
+<i>table-size</i> - an integer expression<br>
+returns - the hash index as an integer value</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'hash' function computes and returns an integer index for a given
+symbol 'name' and a given size of hash table 'table-size'. The intention is
+for 'hash' to be used with tables made by
+<a href="make-array.htm">make-array</a> and accessed by
+<a href="aref.htm">aref</a>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(hash "zzzz" 1000) <font color="#008844">; returns index 322</font>
+(hash "ZZZZ" 1000) <font color="#008844">; returns index 626</font>
+(hash 'ZZZZ 1000) <font color="#008844">; returns index 626</font>
+(hash "hiho" 1000) <font color="#008844">; returns index 519</font>
+(hash 'hiho 1000) <font color="#008844">; returns index 143</font>
+(hash "abcd" 1000) <font color="#008844">; returns index 72</font>
+
+<font color="#008844">;; create a function to look inside *OBARRAY* and</font>
+<font color="#008844">;; look for a specific symbol - returns a list</font>
+
+(defun lookin (sym)
+ (aref *obarray*
+ (hash sym (length *obarray*))))
+
+(lookin 'caar) <font color="#008844">; returns the hash table entry</font>
+ <font color="#008844">; (ZEROP CDDDDR CAAR HASH)</font>
+</pre>
+
+<p><b>Note:</b> This is a useful function for creating and accessing tables.
+It is also useful for looking inside of XLISP's own symbol table
+<a href="global-obarray.htm">*obarray*</a>.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#hash">hash</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/if.htm b/docsrc/xlisp/xlisp-doc/reference/if.htm
new file mode 100644
index 0000000..423e5bf
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/if.htm
@@ -0,0 +1,83 @@
+<html><head><title>XLISP if</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>if</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(if <i>test-expr then-expr</i> [<i>else-expr</i>])</dt>
+<dd><i>test-expr</i> - an expression<br>
+<i>then-expr</i> - the THEN clause, an expression<br>
+<i>else-expr</i> - the ELSE clause, an optional expression<br>
+returns - the value of the selected expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'if' special form evaluates the 'test-expr'. If 'test-expr' evaluates
+to a non-<a href="nil.htm">NIL</a> value, then 'then-expr' is
+evaluated and returned as the result. If 'test-expr' evaluates to
+<a href="nil.htm">NIL</a> and there is an 'else-expr', then the
+'else-expr' is evaluated and its result is returned. If there is no
+'else-expr' and 'test-expr' evaluates to
+<nobr><a href="nil.htm">NIL</a> ,</nobr> then
+<a href="nil.htm">NIL</a> is returned as a result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(if T (print "will print") <font color="#008844">; prints "will print"</font>
+ (print "won't print"))
+
+(if NIL (print "won't print")
+ (print "will print")) <font color="#008844">; prints "will print"</font>
+
+(if 'a T NIL) <font color="#008844">; returns T</font>
+
+(if NIL 'nope 'yep) <font color="#008844">; returns YEP</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-019.htm#if">&nbsp;if&nbsp;</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/incf.htm b/docsrc/xlisp/xlisp-doc/reference/incf.htm
new file mode 100644
index 0000000..bcf70f2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/incf.htm
@@ -0,0 +1,88 @@
+<html><head><title>XLISP incf</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>incf</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp macro (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>misc.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>incf</b> <i>symbol</i>)</nobr></dt>
+<dd><i>symbol</i> - a symbol with numerical value bound to it<br>
+returns - the new value of the symbol</dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, 'incf' is implemented as a Lisp macro:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">incf</font> (symbol)
+ `(setf ,symbol (1+ ,symbol)))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'incf' macro is used for incrementing a numerical value of a variable.
+<nobr>1 is</nobr> added to the number and the result is stored in the
+variable. <nobr>An error</nobr> is signalled if the variable doesn't hold a
+number.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq n 1) =&gt; 1
+(incf n) =&gt; 2
+n =&gt; 2
+(incf n) =&gt; 3
+
+(setq n -1.8) =&gt; -1.8
+(incf n) =&gt; -0.8
+(incf n) =&gt; 0.2
+(incf n) =&gt; 1.2
+n =&gt; 1.2
+
+(setq n #\a) =&gt; #\a
+(incf a) =&gt; <font color="#AA0000">error: bad argument type - #\a</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/increment.htm b/docsrc/xlisp/xlisp-doc/reference/increment.htm
new file mode 100644
index 0000000..06f3c57
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/increment.htm
@@ -0,0 +1,75 @@
+<html><head><title>XLISP 1+</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>1+</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(1+ <i>expr</i>)</nobr></dt>
+<dd><i>expr</i> - integer or floating point number/expression<br>
+returns - the number plus one</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The <nobr>'1+' [increment]</nobr> function adds one to a number and
+returns the result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(1+ 1) =&gt; 2
+(1+ 99.1) =&gt; 100.1
+(1+ 1 2) =&gt; <font color="#AA0000">error: too many arguments</font>
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/info.htm b/docsrc/xlisp/xlisp-doc/reference/info.htm
new file mode 100644
index 0000000..d76b33c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/info.htm
@@ -0,0 +1,63 @@
+<html><head><title>XLISP info</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>info</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xldmem.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(info)</dt>
+<dd>returns - <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>info</nobr>' function shows information about memory usage.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+&gt; (info)
+[ Free: 5689, GC calls: 17, Total: 675111; samples 1KB, 0KB free]
+NIL
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/int-char.htm b/docsrc/xlisp/xlisp-doc/reference/int-char.htm
new file mode 100644
index 0000000..8bdd97e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/int-char.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP int-char</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>int-char</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(int-char <i>int</i>)</dt>
+<dd><i>int</i> - an integer numeric expression<br>
+returns - the character with that code</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'int-char' function returns a character which is the result of turning the
+'int' expression into a character. If a 'int' cannot be made into a
+character, an error is signalled:</p>
+
+<pre class="example">
+<font color="#AA0000">error: character code out of range</font>
+</pre>
+
+<p>The range that 'int' produces a valid character is 0 through 255.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(int-char 48) <font color="#008844">; returns #\0</font>
+(int-char 65) <font color="#008844">; returns #\A</font>
+(int-char 97) <font color="#008844">; returns #\a</font>
+(int-char 91) <font color="#008844">; returns #\[</font>
+(int-char 10) <font color="#008844">; returns #\Newline</font>
+(int-char 999) <font color="#008844">; error - character code out of range</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that 'int-char' should return a
+<a href="nil.htm">NIL</a> when there is no valid character for
+the integer value being passed in while XLISP generates an error in these cases.
+In some cases it is possible to substitue the
+<a href="code-char.htm">code-char</a> function for 'int-char'.</p>
+
+<p><b>Note:</b> Unlike the <a href="char-code.htm">char-code</a> and
+<a href="char-int.htm">char-int</a> functions,
+<a href="code-char.htm">code-char</a> and 'int-char' are not identical
+in use. <a href="code-char.htm">code-char</a> accepts 0..127 for its
+range and then produces <a href="nil.htm">NIL</a> results while
+'int-char' accepts 0..255 for its range and then produces errors.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-026.htm#int-char">int-char</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/integerp.htm b/docsrc/xlisp/xlisp-doc/reference/integerp.htm
new file mode 100644
index 0000000..9bce615
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/integerp.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP integerp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>integerp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(integerp <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the value is an
+integer, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'integerp' predicate function checks if an 'expr' is a integer
+number. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if
+'expr' is a integer number,
+<a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(integerp 1) <font color="#008844">; returns T - integer</font>
+(integerp #x034) <font color="#008844">; returns T - integer readmacro</font>
+(integerp '1) <font color="#008844">; returns T - still an integer</font>
+(setq a 14)
+(integerp a) <font color="#008844">; returns T - evaluates to int.</font>
+(integerp 0) <font color="#008844">; returns T - integer zero</font>
+
+(integerp 1.2) <font color="#008844">; returns NIL - float</font>
+(integerp 0.0) <font color="#008844">; returns NIL - float zero</font>
+(integerp 'a) <font color="#008844">; returns NIL - symbol</font>
+(integerp #\a) <font color="#008844">; returns NIL - character</font>
+(integerp NIL) <font color="#008844">; returns NIL - NIL</font>
+(integerp #(0 1 2)) <font color="#008844">; returns NIL - array</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#integerp">integerp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/intern.htm b/docsrc/xlisp/xlisp-doc/reference/intern.htm
new file mode 100644
index 0000000..3b23ac5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/intern.htm
@@ -0,0 +1,117 @@
+<html><head><title>XLISP intern</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>intern</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(intern <i>name-str</i>)</dt>
+<dd><i>name-str</i> - a string expression<br>
+returns - the new symbol</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'intern' function takes a string name 'name-str' and creates a new
+interned symbol. What this means is that the symbol 'name-str' will be
+placed into the symbol hash table
+<a href="global-obarray.htm">*obarray*</a>. It's value will be unbound. It's
+property list will be <a href="nil.htm">NIL</a> [empty]. If the
+symbol already exists, no error or action is taken and the old values and
+property lists remain intact. The 'intern' function returns the symbol as
+its result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun lookin (sym) <font color="#008844">; create a function to</font>
+ (aref *obarray* <font color="#008844">; look inside *OBARRAY* and</font>
+ (hash sym (length *obarray*)))) <font color="#008844">; look for a specific symbol</font>
+ <font color="#008844">; returns a list</font>
+
+(lookin "FINGERS") <font color="#008844">; see if "FINGERS" is a symbol</font>
+ <font color="#008844">; returns (:START1) - it isn't</font>
+
+(intern "FINGERS") <font color="#008844">; intern "FINGERS" as a symbol</font>
+ <font color="#008844">; returns FINGERS</font>
+
+(lookin "FINGERS") <font color="#008844">; returns (FINGERS :START1)</font>
+
+(print fingers) <font color="#008844">; error: unbound variable</font>
+ <font color="#008844">; it exists, but has no value</font>
+
+(lookin "TOES") <font color="#008844">; returns NIL - doesn't exist</font>
+toes <font color="#008844">; error: unbound variable</font>
+
+(lookin "TOES") <font color="#008844">; returns (TOES)</font>
+ <font color="#008844">; the act of looking for a</font>
+ <font color="#008844">; value or using a symbol</font>
+ <font color="#008844">; causes it to be INTERNed</font>
+
+(lookin "KNEECAPS") <font color="#008844">; returns (MAX MAPLIST)</font>
+ <font color="#008844">; KNEECAPS doesn't exist</font>
+
+(setq kneecaps 'a-bone) <font color="#008844">; create symbol with a value</font>
+(lookin "KNEECAPS") <font color="#008844">; returns (KNEECAPS MAX MAPLIST)</font>
+</pre>
+
+<p><b>Note:</b> When you 'intern' a string symbol like &quot;fingers&quot;
+in lower case letters, this gets placed in the
+<a href="global-obarray.htm">*obarray*</a> symbol table as a lower case
+symbol. Note that this is different from doing an 'intern' on a string
+symbol &quot;FINGERS&quot; in upper case letters which will get placed in
+the <a href="global-obarray.htm">*obarray*</a> as a upper case symbol.
+&quot;fingers&quot; and &quot;FINGERS&quot; then are two different symbols
+in <a href="global-obarray.htm">*obarray*</a>. Remember also that normal
+symbols created by XLISP are automatically converted to upper case names.
+So, an intern of the lower case symbol name 'fingers and the upper case
+symbol name 'FINGERS will result in the effect that both symbol names get
+interned as the same upper-case symbol FINGERS.</p>
+
+<p><b>Common Lisp:</b> Common LISP allows an optional package
+specification, which XLISP does not support.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#intern">intern</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/interpolate.htm b/docsrc/xlisp/xlisp-doc/reference/interpolate.htm
new file mode 100644
index 0000000..72cee34
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/interpolate.htm
@@ -0,0 +1,76 @@
+<html><head><title>XLISP interpolate</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>interpolate</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xm.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(interpolate <i>x x1 y1 x2 y2</i>)</nobr></dt>
+<dd><i>x</i>, <i>x1</i>, <i>y1</i>, <i>x2</i>, <i>y2</i> - integer or floating point numbers<br>
+returns - the 'y' value corresponding to 'x'</dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, 'interpolate' is implemented as a Lisp function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">interpolate</font> (x x1 y1 x2 y2)
+ (cond ((= x1 x2) x1)
+ (t (+ y1 (* (- x x1) (/ (- y2 y1) (- x2 (float x1))))))))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'interpolate' function linearly interpolates [or extrapolates]
+between points <nobr>(x1, y1)</nobr> and <nobr>(x2, y2)</nobr> to compute
+the <nobr>'y' value</nobr> corresponding <nobr>to 'x'</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/intersection.htm b/docsrc/xlisp/xlisp-doc/reference/intersection.htm
new file mode 100644
index 0000000..80af5f7
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/intersection.htm
@@ -0,0 +1,76 @@
+<html><head><title>XLISP intersection</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>intersection</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xm.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(intersection <i>list1 list2</i>)</nobr></dt>
+<dd><i>listN</i> - a list of symbols or numbers<br>
+returns - the intersection of <i>list1</i> and <i>list2</i></dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, 'intersection' is implemented as a Lisp function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">intersection</font> (a b)
+ (let (result)
+ (dolist (elem a)
+ (if (member elem b) (push elem result)))
+ result))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'intersection' function computes the intersection of two lists.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-answer.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-answer.htm
new file mode 100644
index 0000000..d17b39b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-answer.htm
@@ -0,0 +1,107 @@
+<html><head><title>XLISP :answer</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:answer</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>message selector</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<a href="send.htm">send</a> <i>class</i> <b>:answer</b> <i>selector fargs body</i>)</nobr></dt>
+<dd><i>class</i> - an existing <a href="class.htm">class</a><br>
+<i>selector</i> - the message selector symbol<br>
+<i>fargs</i> - formal argument list of the same form as a <a href="lambda.htm">lambda</a> argument list<br>
+<i>body</i> - a list containing the method code<br>
+returns - the <a href="class.htm">class</a> object</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The ':answer' message selector adds or changes a method in the specified
+<a href="class.htm">class</a>. <nobr>This method</nobr> consists of the
+message selector symbol, the formal argument list and the executable code
+associated with the message.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq myclass (send class :new '(var))) <font color="#008844">; create MYCLASS with VAR</font>
+
+(send myclass :answer :isnew '() <font color="#008844">; set up initialization</font>
+ '((setq var nil) self))
+
+(send myclass :answer :set-it '(value) <font color="#008844">; create :SET-IT message</font>
+ '((setq var value)))
+
+(send myclass :answer :mine '() <font color="#008844">; create :MINE message</font>
+ '((print "hi there")))
+
+(setq my-obj (send myclass :new)) <font color="#008844">; create MY-OBJ of MYCLASS</font>
+(send my-obj :set-it 5) <font color="#008844">; VAR is set to 5</font>
+(send my-obj :mine) <font color="#008844">; prints "hi there"</font>
+</pre>
+
+<p><b>Note:</b> When you define a message in a
+
+<a href="class.htm">class</a>, the message is only valid for
+<b>instances</b> of the <a href="class.htm">class</a> or its
+<nobr>sub-classes</nobr>. <nobr>You will</nobr> get an error if you try to
+send the message to the <a href="class.htm">class</a> where it was first
+defined. <nobr>If you</nobr> want to add a message to a
+<a href="class.htm">class</a>, you need to define it in the
+<nobr>super-class</nobr> of the class.</p>
+
+<p><b>Message structure:</b> The normal XLISP convention for a message is to
+have a valid symbol preceeded by a colon like
+<a href="keyword-isnew.htm">:isnew</a> or ':my-message'. However, it is
+possible to define a message that is a symbol without a colon, but this
+pollutes the global namespace and also makes the code less readable.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr><a href="../manual/objects.htm">XLISP Object System</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-class.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-class.htm
new file mode 100644
index 0000000..75b1ef5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-class.htm
@@ -0,0 +1,83 @@
+<html><head><title>XLISP :class</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:class</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>message selector</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(send <i>object</i> :class)</dt>
+<dd><i>object</i> - an existing <a href="object.htm">object</a><br>
+returns the <a href="class.htm">class</a> object</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The ':class' message selector will cause a method to run that will return the
+object which is the class of the specified 'object'. Note that the
+returned value is an object which will look like:</p>
+
+<pre class="example">
+#&lt;Object: #18d8c&gt;
+</pre>
+
+<p>The 'object' must exist or an error will be generated:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(send object :class) <font color="#008844">; returns the CLASS object</font>
+(send class :class) <font color="#008844">; returns the CLASS object</font>
+(setq new-cls (send class :new '(var))) <font color="#008844">; create NEW-CLS</font>
+(setq new-obj (send new-cls :new)) <font color="#008844">; create NEW-OBJ of NEW-CLS</font>
+(send new-obj :class) <font color="#008844">; returns the NEW-CLS object</font>
+(send new-cls :class) <font color="#008844">; returns the CLASS object</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-010.htm#object-class">:class</a>
+message selector in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-constituent.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-constituent.htm
new file mode 100644
index 0000000..f9eca40
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-constituent.htm
@@ -0,0 +1,95 @@
+<html><head><title>XLISP :constituent</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:constituent</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>keyword</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;:constituent</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>':constituent' is an entry that is used in the
+<a href="global-readtable.htm">*readtable*</a> system variable that
+contains XLISP's data structures relating to the processing of characters
+from the user [or files] and read-macro expansions. The existance of the
+':constituent' keyword means that the specified character is to be used, as
+is, with no further processing. The system defines that the following
+characters are ':constituent' characters:</p>
+
+<pre class="example">
+0123456789
+!$%&amp;*+-./:&lt;=&gt;?@[]^_{}~
+ABCDEFGHIJKLMNOPQRSTUVWXYZ
+abcdefghijklmnopqrstuvwxyz
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun look-at (table) <font color="#008844">; define a function to</font>
+ (dotimes (ch 127) <font color="#008844">; look in a table</font>
+ (prog ((entry (aref table ch))) <font color="#008844">; and print out any</font>
+ (case entry <font color="#008844">; entries with a function</font>
+ (:CONSTITUENT
+ (princ (int-char ch)))
+ (T NIL))))
+ (terpri))
+
+(look-at *readtable*) <font color="#008844">; prints !$%&amp;*+-./0123456789</font>
+ <font color="#008844">; :&lt;=&gt;?@ABCDEFGHIJKLM</font>
+ <font color="#008844">; NOPQRSTUVWXYZ[]^_ab</font>
+ <font color="#008844">; cdefghijklmnopqrstu</font>
+ <font color="#008844">; vwxyz{}~</font>
+</pre>
+
+<p><b>Caution:</b> If you experiment with
+<nobr><a href="global-readtable.htm">*readtable*</a> ,</nobr> it is useful to
+save the old value in a variable, so that you can restore the system
+state.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-008.htm#constituent">:constituent</a>
+keyword in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-isa.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-isa.htm
new file mode 100644
index 0000000..e1b3e5c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-isa.htm
@@ -0,0 +1,83 @@
+<html><head><title>XLISP :isnew</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:isa</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>message selector</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<a href="send.htm">send</a> <i>object</i> :isa <i>class</i>) - test if object inherits from class</dt>
+<dd>returns - <a href="../reference/t.htm">&nbsp;T&nbsp;</a> if object
+is an instance of class or a subclass of class, otherwise
+<a href="../reference/nil.htm">NIL</a><br><br></dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The ':isa' message selector tests if an object inherits from a class.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq a-class (send class :new '(state))) <font color="#008844">; create a new class A-CLASS with STATE</font>
+
+(send a-class :answer :isnew '() <font color="#008844">; set up initialization</font>
+ '((setq state nil) self))
+
+(send a-class :answer :set-it '(value) <font color="#008844">; create :SET-IT message</font>
+ '((setq state value)))
+
+(setq an-obj (send a-class :new)) <font color="#008844">; create AN-OBJ out of A-CLASS</font>
+
+(send an-obj :show) <font color="#008844">; returns object - STATE = NIL</font>
+
+(send an-obj :set-it 5) <font color="#008844">; STATE is set to 5</font>
+(send an-obj :show) <font color="#008844">; returns object - STATE = 5</font>
+
+(SEND an-obj :ISNEW) <font color="#008844">; re-initialize AN-OBJ</font>
+(send an-obj :show) <font color="#008844">; returns object - STATE = NIL</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-isnew.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-isnew.htm
new file mode 100644
index 0000000..eb595bc
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-isnew.htm
@@ -0,0 +1,96 @@
+<html><head><title>XLISP :isnew</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:isnew</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>message selector</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(send <i>object</i> :isnew <i>args</i>)</dt>
+<dd><i>object</i> - an existing object<br>
+<i>args</i> - the arguments to be passed to the init code<br>
+returns - the object</dd>
+</dl>
+
+<dl>
+<dt>(send <i>class</i> :isnew <i>ivars</i> [<i>cvars</i> [<i>superclass</i>]])</dt>
+<dd><i>class</i> - an existing XLISP class<br>
+<i>ivars</i> - list of instance variables for the new class<br>
+<i>cvars</i> - list of class variable symbols for the new class<br>
+<i>superclass</i> - superclass for the new object, default is
+<a href="object.htm">object</a><br>
+returns - the new class object</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The ':isnew' message selector causes an instance to run its
+initialization method. If an ':isnew' message is sent to a class, the class
+definition and state will be reset as specified in the arguments of the
+message.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq a-class (send class :new '(state))) <font color="#008844">; create a new class A-CLASS with STATE</font>
+
+(send a-class :answer :isnew '() <font color="#008844">; set up initialization</font>
+ '((setq state nil) self))
+
+(send a-class :answer :set-it '(value) <font color="#008844">; create :SET-IT message</font>
+ '((setq state value)))
+
+(setq an-obj (send a-class :new)) <font color="#008844">; create AN-OBJ out of A-CLASS</font>
+
+(send an-obj :show) <font color="#008844">; returns object - STATE = NIL</font>
+
+(send an-obj :set-it 5) <font color="#008844">; STATE is set to 5</font>
+(send an-obj :show) <font color="#008844">; returns object - STATE = 5</font>
+
+(SEND an-obj :ISNEW) <font color="#008844">; re-initialize AN-OBJ</font>
+(send an-obj :show) <font color="#008844">; returns object - STATE = NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-010.htm#object-isnew">:isnew</a>
+message selector in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-mescape.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-mescape.htm
new file mode 100644
index 0000000..a0210f5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-mescape.htm
@@ -0,0 +1,86 @@
+<html><head><title>XLISP :mescape</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:mescape</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>keyword</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;:mescape</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The ':mescape' keyword is an entry used in the
+<a href="global-readtable.htm">*readtable*</a> system variable that
+contains XLISP's data structures relating to the processing of characters
+from the user (or files) and read-macro expansions. The existance of the
+':mescape' keyword means that the specified character is to be used as a
+multiple escape character. The system defines that the the vertical bar
+character '|' is the only ':mescape' character.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+<font color="#008844">;; define a function to look in a table</font>
+<font color="#008844">;; and print out any :mescape character</font>
+
+(defun look-at (table)
+ (dotimes (ch 127)
+ (prog ((entry (aref table ch)))
+ (case entry
+ (:mescape (princ (int-char ch)))
+ (t nil))))
+ (terpri))
+
+(look-at *readtable*) <font color="#008844">; prints |</font>
+</pre>
+
+<p><b>Caution:</b> If you experiment with
+<nobr><a href="global-readtable.htm">*readtable*</a> ,</nobr> it is useful
+to save the old value in a variable, so that you can restore the system
+state.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-008.htm#mescape">:mescape</a>
+keyword in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-new.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-new.htm
new file mode 100644
index 0000000..deee953
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-new.htm
@@ -0,0 +1,86 @@
+<html><head><title>XLISP :new</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:new</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>message selector</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(send <i>class</i> :new <i>args</i>)</dt>
+<dd><i>class</i> - an existing XLISP class except for <a href="class.htm">class</a><br>
+<i>args</i> - the initializing arguments for the new instance<br>
+returns - the new class object</dd>
+</dl>
+
+<dl>
+<dt>(send class :new <i>ivars</i> [<i>cvars</i> [<i>superclass</i>]])</dt>
+<dd><i>ivars</i> - list of instance variables for new class<br>
+<i>cvars</i> - list of class variable symbols for new class<br>
+<i>superclass</i> - superclass for new object, the default is <a href="object.htm">object</a><br>
+returns - the new class object</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The ':new' message selector exhibits two different behaviors. When you
+are creating an instance of a <a href="class.htm">class</a> you
+only need the ':new' message [consisting of the message selector and any
+data]. When you are creating a new <a href="class.htm">class</a>
+with ':new', you need to specify instance variables and optionally the
+<a href="class.htm">class</a> variables and superclass.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq new-class (send class :new '(state))) <font color="#008844">; create NEW-CLASS with STATE</font>
+(setq new-obj (send new-class :new)) <font color="#008844">; create NEW-OBJ of NEW-CLASS</font>
+(send new-obj :show) <font color="#008844">; shows the object</font>
+
+(setq sub-class (send class :new '(sub-state) <font color="#008844">; create SUB-CLASS of NEW-CLASS</font>
+ '() new-class))
+(send sub-class :show) <font color="#008844">; show the SUB-CLASS</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-010.htm#class-new">:new</a>
+message selector in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-nmacro.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-nmacro.htm
new file mode 100644
index 0000000..17732a2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-nmacro.htm
@@ -0,0 +1,103 @@
+<html><head><title>XLISP :nmacro</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:nmacro</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>keyword</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(:nmacro . <i>function</i>)</dt>
+<dd><i>function</i> - a function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>':nmacro' is an entry that is used in the
+<a href="global-readtable.htm">*readtable*</a> system variable that contains
+XLISP's data structures relating to the processing of characters from the
+user [or files] and read-macro expansions. The existance of the ':nmacro'
+keyword means that the specified character is the start of a non-terminal
+read macro. For ':nmacro', the form of the
+<a href="global-readtable.htm">*readtable*</a> entry is a dotted pair
+like:</p>
+
+<pre class="example">
+(:nmacro . <font color="#008844"><i>function</i></font>)
+</pre>
+
+<p>The 'function' can be a built-in read-macro function or a user defined
+lambda expression. The 'function' takes two parameters, an input stream
+specification, and an integer that is the character value. The 'function'
+should return <a href="nil.htm">NIL</a> if the character is
+'white-space' or a value <a href="cons.htm">cons</a>ed with
+<a href="nil.htm">NIL</a> to return the value. The 'function'
+will probably read additional characters from the input stream.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun look-at (table) <font color="#008844">; define a function to</font>
+ (dotimes (ch 127) <font color="#008844">; look in a table</font>
+ (prog ((entry (aref table ch))) <font color="#008844">; and print out any</font>
+ (if (and (consp entry) <font color="#008844">; :NMACRO entries</font>
+ (equal (car entry)
+ ':nmacro))
+ (princ (int-char ch)))))
+ (terpri))
+(look-at *readtable*) <font color="#008844">; prints #</font>
+</pre>
+
+<p><b>Note:</b> The system defines that the hash [#] character is a
+non-terminal. This is because the hash is used for a variety of 'read macro
+expansions' including <a href="function.htm">function</a>, an
+<a href="../misc/ascii-table.htm">ASCII</a> code, and hexadecimal
+numbers.</p>
+
+<p><b>Caution:</b> If you experiment with
+<nobr><a href="global-readtable.htm">*readtable*</a> ,</nobr> it is useful
+to save the old value in a variable, so that you can restore the system
+state.</p>
+
+<p>See the
+<a href="../manual/manual/xlisp-man-008.htm#nmacro">:nmacro</a>
+keyword in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-sescape.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-sescape.htm
new file mode 100644
index 0000000..44d98f9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-sescape.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP :sescape</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:sescape</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>keyword</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;:sescape</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The ':sescape' keyword is an entry used in the
+<a href="global-readtable.htm">*readtable*</a> system variable that contains
+XLISP's data structures relating to the processing of characters from the
+user [or files] and read-macro expansions. The existance of the ':sescape'
+keyword means that the specified character is to be used as a single escape
+character. The system defines that the the backslash character '\' is the
+only defined ':sescape' character.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+<font color="#008844">;; define a function to look in a table</font>
+<font color="#008844">;; and print out any :SESCAPE character</font>
+
+(defun look-at (table)
+ (dotimes (ch 127)
+ (prog ((entry (aref table ch)))
+ (case entry
+ (:SESCAPE (princ (int-char ch)))
+ (t nil))))
+ (terpri))
+
+(look-at *readtable*) <font color="#008844">; prints \</font>
+</pre>
+
+<p><b>Caution:</b> If you experiment with *readtable*, it is useful to save
+the old value in a variable, so that you can restore the system state.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-008.htm#sescape">:sescape</a>
+keyword in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-show.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-show.htm
new file mode 100644
index 0000000..0700e31
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-show.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP :show</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:show</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>message selector</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(send <i>object</i> :show)</dt>
+<dd><i>object</i> - an existing <a href="object.htm">object</a><br>
+returns - the <i>object</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The ':show' message selector attempts to find the 'show' method in the
+specified <a href="object.htm">object</a>s class. Since the ':show'
+message selector is built-in in the root
+<a href="class.htm">class</a>, this is always a valid message
+selector. The <a href="object.htm">object</a> must already
+exist.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq my-class (send class :new '(state))) <font color="#008844">; create MY-CLASS with STATE</font>
+
+(send my-class :answer :isnew '() <font color="#008844">; set up initialization</font>
+ '((setq state nil) self))
+
+(send my-class :answer :set-it '(value) <font color="#008844">; create :SET-IT message</font>
+ '((setq state value)))
+
+(setq my-obj (send my-class :new)) <font color="#008844">; create MY-OBJ of MY-CLASS</font>
+(send my-obj :show) <font color="#008844">; returns object state including STATE = NIL</font>
+(send my-obj :set-it 5) <font color="#008844">; STATE is set to 5</font>
+(send new-obj :show) <font color="#008844">; error: unbound variable</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-010.htm#object-show">:show</a>
+message selector in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-tmacro.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-tmacro.htm
new file mode 100644
index 0000000..d290d9d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-tmacro.htm
@@ -0,0 +1,107 @@
+<html><head><title>XLISP :tmacro</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:tmacro</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>keyword</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(:tmacro . <i>function</i>)</dt>
+<dd><i>function</i> - a function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>':tmacro' is an entry that is used in the
+<a href="global-readtable.htm">*readtable*</a> system variable that contains
+XLISP's data structures relating to the processing of characters from the
+user [or files] and read-macro expansions. The existance of the ':tmacro'
+keyword means that the specified character is the start of a terminal read
+macro. For ':tmacro', the form of the
+<a href="global-readtable.htm">*readtable*</a> entry is a dotted pair
+like:</p>
+
+<pre class="example">
+(:tmacro . <font color="#008844"><i>function</i></font>)
+</pre>
+
+<p>The 'function' can be a built-in read-macro function or a user defined
+lambda expression. The 'function' takes two parameters, an input stream
+specification, and an integer that is the character value. The 'function'
+should return <a href="nil.htm">NIL</a> if the character is
+'white-space' or a value <a href="cons.htm">cons</a>ed with
+<a href="nil.htm">NIL</a> to return the value. The 'function'
+will probably read additional characters from the input stream.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun look-at (table) <font color="#008844">; define a function to look in a table</font>
+ (dotimes (ch 127) <font color="#008844">; and print out any :TMACRO entries</font>
+ (prog ((entry (aref table ch)))
+ (if (and (consp entry)
+ (equal (car entry) ':TMACRO))
+ (princ (int-char ch)))))
+ (terpri))
+
+(look-at *readtable*) <font color="#008844">; prints "'(),;`</font>
+</pre>
+
+<p><b>Note:</b> The system defines that the following are ':tmacro'
+characters:</p>
+
+<pre>
+ \ " ` , ( ) ;
+</pre>
+
+<p>[backslash, double quote, backquote, comma, opening parenthesis, closing
+parenthesis, semicolon.]</p>
+
+<p><b>Caution:</b> If you experiment with
+<nobr><a href="global-readtable.htm">*readtable*</a> ,</nobr> it is useful
+to save the old value in a variable, so that you can restore the system
+state.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-008.htm#tmacro">:tmacro</a>
+keyword in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keyword-white-space.htm b/docsrc/xlisp/xlisp-doc/reference/keyword-white-space.htm
new file mode 100644
index 0000000..be3fed0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keyword-white-space.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP :white-space</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>:white-space</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>keyword</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;:white-space</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The ':white-space' keyword is an entry that is used in the <a
+href="global-readtable.htm">*readtable*</a> system variable that contains
+XLISP's data structures relating to the processing of characters from the
+user [or files] and read-macro expansions. The existance of the
+':white-space' keyword means that the specified character may be skipped
+over. The system defines that 'tab', 'space', 'return' and 'line-feed' are
+':white-space' characters.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+<font color="#008844">;; define a function to look in a table</font>
+<font color="#008844">;; and print out any white-space characters</font>
+
+(defun look-at (table)
+ (dotimes (ch 127)
+ (prog ((entry (aref table ch)))
+ (case entry
+ (nil nil)
+ (:constituent nil)
+ (:white-space (print ch))
+ (t nil))))
+ (terpri))
+
+(look-at *readtable*) <font color="#008844">; prints 9 - tab</font>
+ <font color="#008844">; 10 - newline</font>
+ <font color="#008844">; 12 - formfeed</font>
+ <font color="#008844">; 13 - return</font>
+ <font color="#008844">; 32 - space</font>
+</pre>
+
+<p><b>Caution:</b> If you experiment with
+<nobr><a href="global-readtable.htm">*readtable*</a> ,</nobr> it is useful
+to save the old value in a variable, so that you can restore the system
+state.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-008.htm#white-space">:white-space</a>
+keyword in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/keywordp.htm b/docsrc/xlisp/xlisp-doc/reference/keywordp.htm
new file mode 100644
index 0000000..dc49926
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/keywordp.htm
@@ -0,0 +1,78 @@
+<html><head><title>XLISP keywordp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>keywordp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>sal-parse.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(keywordp <i>expr</i>)</nobr></dt>
+<dd><i>expr</i> - an arbitrary Lisp expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the expression is a keyword symbol, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<pre class="example">
+(defun <font color="#0000CC">keywordp</font> (s)
+ (and (symbolp s)
+ (eq (type-of (symbol-name s)) 'string)
+ (equal (char (symbol-name s) 0) #\:)))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'keywordp' function tests if a lisp expression is a keyword symbol.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(keywordp :a) =&gt; T
+(keywordp :B) =&gt; T
+(keywordp 'c) =&gt; NIL
+(keywordp "d") =&gt; NIL
+(keywordp #\e) =&gt; NIL
+(keywordp 123) =&gt; NIL
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/labels.htm b/docsrc/xlisp/xlisp-doc/reference/labels.htm
new file mode 100644
index 0000000..16fbc3c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/labels.htm
@@ -0,0 +1,101 @@
+<html><head><title>XLISP labels</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>labels</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(labels ([<i>function</i> ... ]) <i>expr</i> ... )</dt>
+<dd><i>function</i> - a function definition binding which is of the form:<br>
+<dl><dd>(<i>symbol arg-list body</i>)</dd>
+<dl><dd><i>symbol</i> - the symbol specifying the function name<br>
+<i>arg-list</i> - the argument list for the function<br>
+<i>body</i> - the body of the function</dd></dl></dl>
+<i>expr</i> - an expression<br>
+returns - the value of the last expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'labels' special form is basically a local block construct that
+allows local 'function' definitions followed by a block of code to evaluate.
+The first form after the labels is the 'binding' form. It contains a series
+of 'functions'. 'labels' allows the'functions' to be defined in a mutually
+recursive manner. [The similar <a href="flet.htm">flet</a> form
+does not allow this.] The 'labels' form will go through and define the
+'symbols' of the 'functions' and then sequentially execute the 'exprs'. The
+value of the last 'expr' evaluated is returned. When the 'labels' is
+finished execution, the 'symbols' that were defined will no longer
+exist.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(labels ((fuzz (x) (+ x x))) <font color="#008844">; a LABELS with a local function FUZZ</font>
+ (fuzz 2)) <font color="#008844">; returns 4</font>
+
+ <font color="#008844">; FUZZ no longer exists</font>
+(fuzz 2) <font color="#008844">; error: unbound function - FUZZ</font>
+
+ <font color="#008844">; an empty LABELS</font>
+(labels () (print 'a)) <font color="#008844">; prints A</font>
+
+ <font color="#008844">; LABELS form including</font>
+(labels ((inc (arg) (est arg)) <font color="#008844">; INC definition using EST</font>
+ (est (var) (* .1 var))) <font color="#008844">; EST definition</font>
+ (inc 99) ) <font color="#008844">; returns 9.9</font>
+
+ <font color="#008844">; FLET form including</font>
+(flet ((inc (arg) (est arg)) <font color="#008844">; INC definition using EST</font>
+ (est (var) (* .1 var))) <font color="#008844">; EST definition</font>
+ (inc 99) <font color="#008844">; error: unbound function - EST</font>
+</pre>
+
+<p><b>Note:</b> <a href="flet.htm">flet</a> does not allow
+recursive definitions of functions. The 'label' special form does allow
+this.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-019.htm#labels">labels</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-aux.htm b/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-aux.htm
new file mode 100644
index 0000000..b3c5324
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-aux.htm
@@ -0,0 +1,116 @@
+<html><head><title>XLISP &amp;aux</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>&amp;aux</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>keyword</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xleval.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><b>&amp;aux</b> [<i>aux-var</i> | (<i>aux-var aux-value</i>)] ...</dt>
+<dd><i>aux-var</i> - auxiliary variable<br>
+<i>aux-value</i> - auxiliary variable initialization</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p> In XLISP, there are several times that you define a formal argument list
+for a body of code [like <a href="defun.htm">defun</a>,
+<a href="defmacro.htm">defmacro</a>,
+<a href="keyword-answer.htm">:answer</a> and <a
+href="lambda.htm">lambda</a>]. <nobr>The 'aux-var'</nobr> variables are a
+mechanism for you to define variables local to the function or operation
+definition. <nobr>If there</nobr> is an optional <nobr>'aux-value'</nobr>,
+they will be set to that value on entry to the body of code. Otherwise, they
+are initialized <nobr>to <a href="nil.htm">NIL</a></nobr>. <nobr>At
+the</nobr> end of the function or operation execution, these local symbols
+and their values are removed.</p>
+
+<h2>Examples</h2>
+
+<p>A function '<nobr>my-add</nobr>' with <nobr>one required</nobr> argument
+'num1', <nobr>one <a href="lambda-keyword-rest.htm">&amp;rest</a></nobr>
+argument <nobr>'num-list'</nobr>, and <nobr>one &amp;aux</nobr>
+<nobr>variable 'sum'</nobr>:</p>
+
+<pre class="example">
+(defun my-add (num1 &amp;rest num-list &amp;aux sum)
+ (setq sum num1) <font color="#008844">; initialize SUM</font>
+ (dolist (i num-list) <font color="#008844">; loop through the num-list</font>
+ (setq sum (+ sum i))) <font color="#008844">; add each number to SUM</font>
+ sum) <font color="#008844">; return SUM when finished</font>
+
+(my-add 1 2 3 4) =&gt; 10
+(my-add 5 5 5 5 5) =&gt; 25
+</pre>
+
+<p>See <nobr><a href="addition.htm">&nbsp;+&nbsp;</a></nobr>,
+<a href="defun.htm">defun</a>, <a href="dolist.htm">dolist</a>,
+<a href="lambda-keyword-rest.htm">&amp;rest</a>,
+<a href="setq.htm">setq</a>.</p>
+
+<p>A function '<nobr>more-keys</nobr>' with <nobr>one required</nobr>
+<nobr>argument 'a'</nobr> and <nobr>three &amp;aux</nobr> variables <nobr>'b'
+[initialized</nobr> <nobr>to <a href="nil.htm">NIL</a>]</nobr>, <nobr>'c'
+[initialized</nobr> <nobr>to 99]</nobr>, and <nobr>'d' [initialized</nobr>
+<nobr>to <a href="t.htm">&nbsp;T&nbsp;</a>]</nobr>:</p>
+
+<pre class="example">
+(defun more-keys (a &amp;aux b (c 99) (d t))
+ (format t "a=~a b=~a c=~a d=~a~%" a b c d))
+
+&gt; (more-keys "hi")
+a=hi b=NIL c=99 d=T
+NIL
+</pre>
+
+<p>See <a href="defun.htm">defun</a>, <a href="format.htm">format</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr><a href="../manual/xlisp.htm#auxiliary-variables">Auxiliary Variables</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-key.htm b/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-key.htm
new file mode 100644
index 0000000..b9062d2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-key.htm
@@ -0,0 +1,132 @@
+<html><head><title>XLISP &amp;key</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>&amp;key</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>keyword</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xleval.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&amp;key <i>key-arg</i> ...<br>
+&amp;key (<i>key-arg</i> [<i>key-value</i> [<i>supplied-p-var</i>]]) ...<br>
+&amp;key ((<i>key-symbol key-arg</i>) [<i>key-value</i> [<i>supplied-p-var</i>]]) ...</dt>
+<dd><i>key-arg</i> - keyword argument<br>
+<i>key-symbol</i> - keyword argument symbol<br>
+<i>key-value</i> - keyword argument initialization<br>
+<i>supplied-p-var</i> - argument existence variable</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>In XLISP, there are several times that you define a formal argument list
+for a body of code [like
+<nobr><a href="defun.htm">defun</a> ,</nobr>
+<nobr><a href="defmacro.htm">defmacro</a> ,</nobr>
+<a href="keyword-answer.htm">:answer</a> and
+<a href="lambda.htm">lambda</a>].
+All of the formal arguments that are defined are required to appear in the
+invocation of the defined function or operation. If there are any
+<a href="lambda-keyword-optional.htm">&amp;optional</a> arguments defined, they will
+be filled in order.</p>
+
+<p>There are other optional arguments called 'keyword' arguments. These
+arguments are not position dependent but can be specified in any order by a
+preceding keyword [a symbol with a leading colon ':']. If there is no
+'key-symbol' specified in the argument list, the keyword will be constructed
+from the 'key-arg' name by adding a leading colon ':'. For example a
+'key-arg' of 'furter' will generate a keyword symbol of ':furter'.</p>
+
+<p>Like the <a href="lambda-keyword-optional.htm">&amp;optional</a> arguments, there
+can be initialization values provided via the 'key-value' argument. If there
+is no 'key-value' argument and no value is provided by the function call,
+the 'key-arg' value will be <a href="nil.htm">NIL</a>.</p>
+
+<p>The 'supplied-p-var', if it is specified, will contain a
+<a href="t.htm">&nbsp;T&nbsp;</a> if the 'key-arg' value was
+supplied by the function call and a <a href="nil.htm">NIL</a> if
+it was not supplied by the function call. This 'supplied-p-var' allows the
+programmer to test for an argument's existence. At the end of the function
+or operation execution, these local symbols and their values are are
+removed.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun foo (a &amp;key b c)
+ (print a) (print b) (print c))
+
+(foo) <font color="#008844">; error: too few arguments</font>
+(foo 1) <font color="#008844">; prints 1 NIL NIL</font>
+(foo 1 2) <font color="#008844">; prints 1 NIL NIL</font>
+(foo 1 :b 2 :c 3) <font color="#008844">; prints 1 2 3</font>
+(foo 1 :c 3 :b 2) <font color="#008844">; prints 1 2 3</font>
+(foo 1 :b 3 :b 2) <font color="#008844">; prints 1 3 NIL</font>
+
+(defun fee (a &amp;key (b 9 b-passed))
+ (print a) (print b)
+ (if b-passed (print "b was passed")
+ (print "b not passed")))
+
+(fee) <font color="#008844">; error: too few arguments</font>
+(fee 1) <font color="#008844">; prints 1 9 "b not passed"</font>
+(fee 1 2) <font color="#008844">; prints 1 9 "b not passed"</font>
+(fee 1 :b 2) <font color="#008844">; prints 1 2 "b was passed"</font>
+
+(defun fi (a &amp;key ((:mykey b) 9 b-passed))
+ (print a) (print b)
+ (if b-passed (print "b was passed")
+ (print "b not passed")))
+
+(fi) <font color="#008844">; error: too few arguments</font>
+(fi 1) <font color="#008844">; prints 1 9 "b not passed"</font>
+(fi 1 2) <font color="#008844">; prints 1 9 "b not passed"</font>
+(fi 1 :b 2) <font color="#008844">; prints 1 9 "b not passed"</font>
+(fi 1 :mykey 2) <font color="#008844">; prints 1 2 "b was passed"</font>
+</pre>
+
+<p><b>Note:</b> There is a '&amp;allow-other-keys' keyword in XLISP and
+Common Lisp. In the case of XLISP, this keyword is extraneous since the
+default for keyword arguments is to allow other keys (without errors).</p>
+
+<p>See the
+<a href="../manual/xlisp-man-009.htm#9-1-4">&amp;key</a>
+keyword in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-optional.htm b/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-optional.htm
new file mode 100644
index 0000000..1b746d0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-optional.htm
@@ -0,0 +1,98 @@
+<html><head><title>XLISP &amp;optional</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>&amp;optional</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>keyword</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xleval.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&amp;optional [<i>opt-arg</i> | (<i>opt-arg</i> [<i>opt-value</i> [<i>supplied-p</i>]])] ...</dt>
+<dd><i>opt-arg</i> - optional argument<br>
+<i>opt-value</i> - optional argument initialization value<br>
+<i>supplied-p</i> - optional argument existence variable</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>In XLISP, there are several times that you define a formal argument list
+for a body of code like
+<nobr><a href="defun.htm">defun</a> ,</nobr>
+<nobr><a href="defmacro.htm">defmacro</a> ,</nobr>
+<a href="keyword-answer.htm">:answer</a> and
+<a href="lambda.htm">lambda</a>. All of the formal arguments
+that are defined are required to appear in the invocation of the defined
+function or operation. If there are any '&amp;optional' arguments defined,
+they will be filled in order. If there are insufficient parameters for the
+'&amp;optional' arguments, they will contain
+<nobr><a href="nil.htm">NIL</a> ,</nobr> unless the arguments
+have an 'opt-value' initial value specified. The 'supplied-p' variable, if
+specified, will contain <a href="t.htm">&nbsp;T&nbsp;</a> if
+the 'opt-arg' was supplied by the function call and
+<a href="nil.htm">NIL</a> if it was not supplied by the function
+call. This 'supplied-p' variable allows the programmer to test for an
+arguments existence. At the end of the function or operation execution,
+these local symbols and their values are are removed.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun foo <font color="#008844">; define function FOO</font>
+ (a &amp;optional b (c 1) ) <font color="#008844">; with some optional args</font>
+ (print a) (print b) (print c))
+(foo) <font color="#008844">; error: too few arguments</font>
+(foo 1) <font color="#008844">; prints 1 NIL 1</font>
+(foo 1 2) <font color="#008844">; prints 1 2 1</font>
+(foo 1 2 3) <font color="#008844">; prints 1 2 3</font>
+
+(defun fee <font color="#008844">; define function FEE</font>
+ (a &amp;optional (b 9 b-passed) ) <font color="#008844">; with some optional args</font>
+ (print a) (print b)
+ (if b-passed (print "b was passed")
+ (print "b not passed")))
+(fee 1) <font color="#008844">; prints 1 9 "b not passed"</font>
+(fee 1 2) <font color="#008844">; prints 1 2 "b was passed"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-009.htm#9-1-2">&amp;optional</a>
+keyword in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-rest.htm b/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-rest.htm
new file mode 100644
index 0000000..639465d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/lambda-keyword-rest.htm
@@ -0,0 +1,104 @@
+<html><head><title>XLISP &amp;rest</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>&amp;rest</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>keyword</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xleval.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&amp;rest [<i>rest-arg</i>]</dt>
+<dd><i>rest-arg</i> - rest argument symbol</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>In XLISP, there are several times that you define a formal argument list
+for a body of code like
+<nobr><a href="defun.htm">defun</a> ,</nobr>
+<nobr><a href="defmacro.htm">defmacro</a> ,</nobr>
+<a href="keyword-answer.htm">:answer</a> and
+<a href="lambda.htm">lambda</a>. All of the formal arguments that
+are defined are required to appear in the invocation of the defined function
+or operation. If there are any
+<a href="lambda-keyword-optional.htm">&amp;optional</a> arguments defined, they will
+be filled in order. If there is a '&amp;rest' argument defined, and all
+the required formal arguments and
+<a href="lambda-keyword-optional.htm">&amp;optional</a> arguments are filled, any and
+all further parameters will be passed into the function via the 'rarg'
+argument. There can be only one 'rest-arg' argument for '&amp;rest'. If
+there are insufficient parameters for any of the
+<a href="lambda-keyword-optional.htm">&amp;optional</a> or '&amp;rest' arguments,
+they will contain <a href="nil.htm">NIL</a>. At the end of the
+function or operation execution, these local symbols and their values are
+removed.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun foo <font color="#008844">; define function FOO</font>
+ (a b &amp;optional c d &amp;rest e) <font color="#008844">; with some of each argument</font>
+ (print a) (print b)
+ (print c) (print d) <font color="#008844">; print out each</font>
+ (print e))
+(foo) <font color="#008844">; error: too few arguments</font>
+(foo 1) <font color="#008844">; error: too few arguments</font>
+(foo 1 2) <font color="#008844">; prints 1 2 NIL NIL NIL</font>
+(foo 1 2 3) <font color="#008844">; prints 1 2 3 NIL NIL</font>
+(foo 1 2 3 4) <font color="#008844">; prints 1 2 3 4 NIL</font>
+(foo 1 2 3 4 5) <font color="#008844">; prints 1 2 3 4 (5)</font>
+(foo 1 2 3 4 5 6 7 8 9) <font color="#008844">; prints 1 2 3 4 (5 6 7 8 9)</font>
+
+(defun my-add <font color="#008844">; define function MY-ADD</font>
+ (num1 &amp;rest num-list &amp;aux sum) <font color="#008844">; with 1 arg, rest, 1 aux var</font>
+ (setq sum num1) <font color="#008844">; clear SUM</font>
+ (dotimes (i (length num-list) ) <font color="#008844">; loop through rest list</font>
+ (setq sum (+ sum (car num-list))) <font color="#008844">; add the number to sum</font>
+ (setq num-list (cdr num-list))) <font color="#008844">; and remove num from list</font>
+ sum) <font color="#008844">; return sum when finished</font>
+(my-add 1 2 3 4) <font color="#008844">; returns 10</font>
+(my-add 5 5 5 5 5) <font color="#008844">; returns 25</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-009.htm#9-1-3">&amp;rest</a>
+keyword in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/lambda.htm b/docsrc/xlisp/xlisp-doc/reference/lambda.htm
new file mode 100644
index 0000000..6f656a2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/lambda.htm
@@ -0,0 +1,109 @@
+<html><head><title>XLISP lambda</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>lambda</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(lambda <i>arg-list</i> [<i>body</i>])</dt>
+<dd><i>arg-list</i> - a list of the formal arguments to the function of the form:<br>
+<dl>
+<dd>([<i>arg1</i> ... ]<br>
+&nbsp;[<a href="lambda-keyword-optional.htm">&amp;optional</a> <i>oarg1</i> ... ]<br>
+&nbsp;[<a href="lambda-keyword-rest.htm">&amp;rest</a> <i>rarg</i>]<br>
+&nbsp;[<a href="lambda-keyword-key.htm">&amp;key</a> ... ]<br>
+&nbsp;[<a href="lambda-keyword-aux.htm">&amp;aux</a> <i>aux1</i> ... ])</dd>
+</dl>
+<i>body</i> - a series of LISP forms (expressions) that are executed in order<br>
+returns - the function closure</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The LAMBDA special form returns a function definition [an executable
+function] that has no name. All of the 'argN' formal arguments that are
+defined are required to appear in a call to the defined function. If there
+are any <a href="lambda-keyword-optional.htm">&amp;optional</a> arguments defined,
+they will be filled in order. If there is a
+<a href="lambda-keyword-rest.htm">&amp;rest</a> argument defined, and all the
+required formal arguments and <a href="lambda-keyword-optional.htm">&amp;optional</a>
+arguments are filled, any and all further parameters will be passed into the
+function via the 'rarg' argument. Note that there can be only one 'rarg'
+argument for <a href="lambda-keyword-rest.htm">&amp;rest</a>. If there are
+insufficient parameters for any of the
+<a href="lambda-keyword-optional.htm">&amp;optional</a> or
+<a href="lambda-keyword-rest.htm">&amp;rest</a> arguments, they will contain
+<a href="nil.htm">NIL</a>. The
+<a href="lambda-keyword-aux.htm">&amp;aux</a> variables are a mechanism for you
+to define variables local to the function definition. At the end of the
+function execution, these local symbols and their values are are
+removed.</p>
+
+<p>Read also the chapter about
+<nobr><a href="../manual/xlisp-man-009.htm">lambda lists</a></nobr>
+in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(funcall (lambda (a b) (* a b)) 4 8 ) <font color="#008844">; evaluate a lambda function</font>
+ <font color="#008844">; returns 32</font>
+
+(funcall (lambda '(a b) (+ a b)) 1 2) <font color="#008844">; evaluate another function</font>
+ <font color="#008844">; returns 3</font>
+
+(funcall (lambda (a b) <font color="#008844">; evaluate a more complex function</font>
+ (print "a no-name fnc") <font color="#008844">; prints "a no-name fnc"</font>
+ (* a b)) 3 8) <font color="#008844">; and returns 24</font>
+</pre>
+
+<p><b>Note:</b> Using a <a href="setq.htm">setq</a> on a 'lambda'
+expression is not the same as a <a href="defun.htm">defun</a>. A
+<a href="setq.htm">setq</a> on a 'lambda' will give the
+variable the value of the 'lambda' closure. This does not mean that the
+variable name can be used as a function.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-012.htm#lambda">lambda</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/last.htm b/docsrc/xlisp/xlisp-doc/reference/last.htm
new file mode 100644
index 0000000..6abb312
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/last.htm
@@ -0,0 +1,75 @@
+<html><head><title>XLISP last</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>last</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(last <i>list-expr</i>)</dt>
+<dd><i>list-expr</i> - a list or list expression<br>
+returns - the last list node in the list</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'last' function returns a list containing the last node or element of
+a list. If the last node is a sub-list, this is returned unaffected.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(last NIL) <font color="#008844">; returns NIL</font>
+(last 'a) <font color="#008844">; error: bad argument type</font>
+(last '(A)) <font color="#008844">; returns (A)</font>
+(last '(A B C D E)) <font color="#008844">; returns (E)</font>
+(last '( A (B C) (D E (F)))) <font color="#008844">; returns ((D E (F)))</font>
+
+(setq children '(junie vicki cindy chris))
+
+(last children) <font color="#008844">; returns (CHRIS)</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#last">last</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/length.htm b/docsrc/xlisp/xlisp-doc/reference/length.htm
new file mode 100644
index 0000000..119d838
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/length.htm
@@ -0,0 +1,74 @@
+<html><head><title>XLISP length</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>length</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(length <i>expr</i>)</dt>
+<dd><i>expr</i> - a list expression or string expression<br>
+returns - the length of the list, array or string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'length' function returns the length of the 'expr'. If the 'expr' is
+a string, the number of characters is returned. If the 'expr' is a list, the
+number of top level elements [atoms or sublists] is returned. If the list is
+<nobr><a href="nil.htm">NIL</a> ,</nobr> a '0' is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(length NIL) <font color="#008844">; returns 0</font>
+(length 'a) <font color="#008844">; error: bad argument type</font>
+(length '(a)) <font color="#008844">; returns 1</font>
+(length '(1 2 3 4 5 6)) <font color="#008844">; returns 6</font>
+(length '(a (b c) (d (e) f) g)) <font color="#008844">; returns 4</font>
+(length "12345") <font color="#008844">; returns 5</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#length">length</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/let-star.htm b/docsrc/xlisp/xlisp-doc/reference/let-star.htm
new file mode 100644
index 0000000..f6ac98a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/let-star.htm
@@ -0,0 +1,106 @@
+<html><head><title>XLISP let*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>let*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(let* ([<i>binding</i> ... ]) <i>expr</i> ... )</dt>
+<dd><i>binding</i> - a variable binding which is one of the forms:
+<dl>
+<dd><i>symbol</i><br>
+(<i>symbol init-expr</i>)
+<dl>
+<dd><i>symbol</i> - a symbol<br>
+<i>init-expr</i> - an initialization expression for <i>symbol</i></dd>
+</dl></dd></dl>
+<i>expr</i> - an expression<br>
+returns - the value of the last expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'let*' special form is basically a local block construct that
+contains symbols [with optional initializations] and a block of code
+[expressions] to evaluate. The first form after the 'let*' is the 'binding'
+form. It contains a series of 'symbols' or 'bindings'. The 'binding' is a
+'symbol' followed by an initialization expression 'init-expr'. If there is
+no 'init-expr', the 'symbol' will be initialized to
+<a href="nil.htm">NIL</a>. The execution of the bindings will
+occur from the first to the last binding. The 'let*' form will go through
+and create and initialize the symbols and then sequentially execute the
+'exprs'. The value of the last 'expr' evaluated is returned. When the 'let*'
+is finished execution, the 'symbols' that were defined will no longer exist
+or retain their values.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(let* (x y z) <font color="#008844">; LET* with local vars</font>
+ (print x) (print y) (print z)) <font color="#008844">; prints NIL NIL NIL</font>
+
+(let* ((a 1) (b 2) (c 3)) <font color="#008844">; LET* with local vars &amp; init</font>
+ (print (+ a b c))) <font color="#008844">; prints and returns 6</font>
+
+(let* ((a 1) (b 2) (c (+ a b))) <font color="#008844">; LET* with local vars &amp; init</font>
+ (print (+ a b c))) <font color="#008844">; prints and returns 6</font>
+</pre>
+
+<p><b>Note:</b></p>
+
+<pre class="example">
+(let* (a b) ... )
+</pre>
+
+<p>can be understood as:</p>
+
+<pre class="example">
+(let (a)
+ (let (b)
+ ... ))
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-019.htm#let*">let*</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/let.htm b/docsrc/xlisp/xlisp-doc/reference/let.htm
new file mode 100644
index 0000000..442fecf
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/let.htm
@@ -0,0 +1,94 @@
+<html><head><title>XLISP let</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>let</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(let ([<i>binding</i> ... ]) <i>expr</i> ... )</dt>
+<dd><i>binding</i> - a variable binding which is one of the forms:
+<dl>
+<dd><i>symbol</i><br>
+(<i>symbol init-expr</i>)
+<dl>
+<dd><i>symbol</i> - a symbol<br>
+<i>init-expr</i> - an initialization expression for <i>symbol</i></dd>
+</dl></dd></dl>
+<i>expr</i> - an expression<br>
+returns - the value of the last expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'let' special form is basically a local block construct that contains
+symbols [with optional initializations] and a block of code [expressions] to
+evaluate. The first form after the 'let' is the 'binding' form. It contains
+a series of 'symbols' or 'bindings'. The 'binding' is a 'symbol' followed by
+an initialization expression 'init-expr'. If there is no 'init-expr', the
+'symbol' will be initialized to <a href="nil.htm">NIL</a>. There
+is no specification as to the order of execution of the bindings. The 'let'
+form will go through and create and initialize the symbols and then
+sequentially execute the 'exprs'. The value of the last 'expr' evaluated is
+returned. When the 'let' is finished execution, the 'symbols' that were
+defined will no longer exist or retain their values.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(let (x y z) <font color="#008844">; LET with local vars</font>
+ (print x) (print y) (print z)) <font color="#008844">; prints NIL NIL NIL</font>
+
+(let ((a 1) (b 2) (c 3)) <font color="#008844">; LET with local vars &amp; init</font>
+ (print (+ a b c))) <font color="#008844">; prints and returns 6</font>
+
+(let ((a 1) (b 2) (c (+ a b))) <font color="#008844">; LET with local vars &amp; init</font>
+ (print (+ a b c))) <font color="#008844">; error: unbound variable - A</font>
+</pre>
+
+<p><b>Note:</b> to make the last example work you need the
+<a href="let-star.htm">let*</a> special form.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-019.htm#let">let</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/list.htm b/docsrc/xlisp/xlisp-doc/reference/list.htm
new file mode 100644
index 0000000..c62588d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/list.htm
@@ -0,0 +1,74 @@
+<html><head><title>XLISP list</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>list</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(list [<i>expr1</i> ... ])</dt>
+<dd><i>exprN</i> - an expression<br>
+returns - the new list</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'list' function takes the expressions and constructs a list out of
+them. This constructed list is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(list) <font color="#008844">; returns NIL</font>
+(list nil) <font color="#008844">; returns (NIL)</font>
+(list 'a) <font color="#008844">; returns (A)</font>
+(list 'a 'b) <font color="#008844">; returns (A B)</font>
+(list 'a 'b 'c) <font color="#008844">; returns (A B C)</font>
+(list 'a 'b nil) <font color="#008844">; returns (A B NIL)</font>
+(list '(a b) '(c d) '( (e f) )) <font color="#008844">; returns ((A B) (C D) ((E F)))</font>
+(list (+ 1 2) (+ 3 4)) <font color="#008844">; returns (3 7)</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#list">list</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/listdir.htm b/docsrc/xlisp/xlisp-doc/reference/listdir.htm
new file mode 100644
index 0000000..c155abe
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/listdir.htm
@@ -0,0 +1,67 @@
+<html><head><title>XLISP listdir</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>listdir</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(<b>listdir</b> <i>path</i>)</dt>
+<dd><i>path</i> - the path of the directory to be listed<br>
+returns - list of filenames in the directory</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'listdir' function returns a list with all filenames in the directory
+or <a href="nil.htm">NIL</a> if the directory could not be found.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(let ((filenames (sort (listdir ".") #'string-lessp)))
+ (dolist (filename filenames)
+ (print filename)))
+</pre>
+
+<p>See also <a href="setdir.htm">setdir</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/listp.htm b/docsrc/xlisp/xlisp-doc/reference/listp.htm
new file mode 100644
index 0000000..21fd92c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/listp.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP listp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>listp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(listp <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the value is a
+list or <nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'listp' predicate function checks if the 'expr' is a list.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr' is a
+list or an empty list [the <a href="nil.htm">NIL</a> value],
+<a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(listp '(a b)) <font color="#008844">; returns T - list</font>
+(listp nil) <font color="#008844">; returns T - NIL</font>
+(listp '(a . b)) <font color="#008844">; returns T - dotted pair list</font>
+
+(listp (lambda (x) (print x))) <font color="#008844">; returns NIL - closure - lambda</font>
+(listp #(1 2 3)) <font color="#008844">; returns NIL - array</font>
+(listp *standard-output*) <font color="#008844">; returns NIL - stream</font>
+(listp 1.2) <font color="#008844">; returns NIL - float</font>
+(listp #'quote) <font color="#008844">; returns NIL - fsubr</font>
+(listp 1) <font color="#008844">; returns NIL - integer</font>
+(listp object) <font color="#008844">; returns NIL - object</font>
+(listp "str") <font color="#008844">; returns NIL - string</font>
+(listp #'car) <font color="#008844">; returns NIL - subr</font>
+(listp 'a) <font color="#008844">; returns NIL - symbol</font>
+</pre>
+
+<p><b>Note:</b> <a href="nil.htm">NIL</a> or '() is used in many
+places as a list-class or atom-class expression. Both
+<a href="atom.htm">atom</a> and 'listp', when applied to
+<nobr><a href="nil.htm">NIL</a> ,</nobr> return
+<a href="t.htm">&nbsp;T&nbsp;</a>. If you wish to check
+for a non-empty list, use the <a href="consp.htm">consp</a>
+predicate function.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#listp">listp</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/load.htm b/docsrc/xlisp/xlisp-doc/reference/load.htm
new file mode 100644
index 0000000..627dccd
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/load.htm
@@ -0,0 +1,162 @@
+<html><head><title>XLISP load</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>load</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsys.c, xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(load <i>file</i> [:verbose <i>v-flag</i>] [:print <i>p-flag</i>]))</dt>
+<dd><i>file</i> - a string expression or symbol<br>
+<i>v-flag</i> - an optional key-word expression, default is
+<a href="t.htm">&nbsp;T&nbsp;</a><br>
+<i>p-flag</i> - an optional key-word expression, default is
+<a href="nil.htm">NIL</a><br>
+returns - the filename</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'load' function opens the 'file', reads and evaluates all the forms
+within the 'file'. 'file' may be a string expression or a symbol. When
+'file' is a string, you may specify a complete file location or extensions
+like &quot;/usr/local/bin/myfile.lsp&quot; or &quot;A:\LISP\TIM.LSP&quot;.
+If 'file' is a string and includes a file type or an extension [like
+&quot;.lsp&quot;], then 'load' accesses the specified file. If there is no
+extension on 'file', it will add &quot;.lsp&quot;. If the ':verbose' keyword
+is present and 'v-flag' is
+<nobr>non-<a href="nil.htm">NIL</a> ,</nobr> a load message of
+the form:</p>
+
+<pre class="example">
+; loading "xxxx.lsp"
+</pre>
+
+<p>will be printed to <a href="global-standard-output.htm">*standard-output*</a>.
+If the ':print' keyword is present and 'p-flag' is
+<nobr>non-<a href="nil.htm">NIL</a> ,</nobr> the resulting value
+of each top-level form in 'file' will be printed to
+<a href="global-standard-output.htm">*standard-output*</a>. If the file load was
+successful, then <a href="t.htm">&nbsp;T&nbsp;</a> is returned
+as the result. If the file load was not successful, a
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<p><b>Note:</b> in Nyquist, the XLISP 'load' function first tries to load a
+file from the current directory. <nobr>A '.lsp'</nobr> extension is added if
+there is not already an alphanumeric extension following a period. <nobr>If
+that</nobr> fails, XLISP searches the path, which is obtained from the
+XLISPPATH environment variable in Unix and
+HKEY_LOCAL_MACHINE\SOFTWARE\CMU\Nyquist\XLISPPATH under Win32.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(load 'gloop) <font color="#008844">; prints ; loading "GLOOP.lsp"</font>
+ <font color="#008844">; returns NIL there is no file</font>
+
+(defun foo (x) (print x)) <font color="#008844">; create a function</font>
+(savefun foo) <font color="#008844">; create a file FOO.lsp</font>
+
+(load 'foo) <font color="#008844">; prints ; loading "FOO.lsp"</font>
+ <font color="#008844">; returns T</font>
+
+(load 'foo :verbose NIL) <font color="#008844">; no printing returns T</font>
+
+(load 'foo :print T) <font color="#008844">; prints FOO returns T</font>
+
+(load 'save :verbose T :print T) <font color="#008844">; prints ; loading "FOO.lsp"</font>
+ <font color="#008844">; prints FOO returns T</font>
+
+(load "foo") <font color="#008844">; prints ; loading "foo.lsp"</font>
+ <font color="#008844">; returns NIL - didn't work</font>
+ <font color="#008844">; because the file is "FOO.lsp"</font>
+
+(load "FOO") <font color="#008844">; prints ; loading "FOO.lsp"</font>
+ <font color="#008844">; returns T - did work</font>
+
+(load "FOO.lsp") <font color="#008844">; prints ; loading "FOO.lsp"</font>
+ <font color="#008844">; returns T - did work</font>
+</pre>
+
+<p><b>File names:</b> In the PC and DOS world, all file names and extensions
+[&quot;foo.bat&quot;] are automatically made uppercase. In using XLISP, this
+means you don't have to worry about whether the name is &quot;foo.bat&quot;,
+&quot;FOO.BAT&quot; or even &quot;FoO.bAt&quot;, they will all work.
+However, in other file systems [UNIX in particular], uppercase and lowercase
+do make a difference:</p>
+
+<p>This will create a file named FOO-FILE in UNIX, because XLISP uppercases
+its symbols:</p>
+
+<pre class="example">
+(open 'foo-file :direction :output)
+</pre>
+
+<p>This will create a file named 'foo-file' because UNIX doesn't
+uppercase its file names:</p>
+
+<pre class="example">
+(open "foo-file" :direction :output)
+</pre>
+
+<p>So, if you are having trouble with opening and accessing files, check to
+make sure the file name is in the proper case.</p>
+
+<p><b>Common Lisp:</b> Common Lisp has a 'load' function that is similar
+to XLISP's 'load'. The only difference is that Common Lisp uses an optional
+keyword parameter ':if-does-not-exist' which XLISP does not support.</p>
+
+<p><b>Nyquist:</b> in Nyquist, the XLISP 'load' function first tries to load
+a file from the current directory. A '.lsp' extension is added if there is
+not already an alphanumeric extension following a period. If that fails,
+XLISP searches the path, which is obtained from the XLISPPATH environment
+variable in Unix and HKEY_LOCAL_MACHINE\SOFTWARE\CMU\Nyquist\XLISPPATH under
+Win32. [The Macintosh version has no search path.]</p>
+
+<p><b>Note:</b> In XLISP, the keyword parameters are order sensitive. If
+both ':verbose' and ':print' keywords are used, ':verbose' must come
+first.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-031.htm#load">load</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/log.htm b/docsrc/xlisp/xlisp-doc/reference/log.htm
new file mode 100644
index 0000000..98bfe25
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/log.htm
@@ -0,0 +1,67 @@
+<html><head><title>XLISP log</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>log</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>sndfnint.c, sound.h</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>log</b> <i>number</i>)</dt>
+<dd><i>number</i> - a floating-point number<br>
+returns - the natural logarithm of <i>number</i></dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'log' function computes the natural logarithm of a
+<nobr>floating-point</nobr> number and returns the result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/logand.htm b/docsrc/xlisp/xlisp-doc/reference/logand.htm
new file mode 100644
index 0000000..959f918
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/logand.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP logand</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>logand</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(logand <i>expr1</i> ... )</dt>
+<dd><i>expr</i> - an integer expression<br>
+returns - the result of the AND operation</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'logand' function returns the logical bitwise 'and' of the list of
+expressions. If there is only one argument, it is returned unaltered. If
+there are two or more arguments, the 'logand' function performs the logical
+and operation successively applying the bitwise operation.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(logand 0 0) <font color="#008844">; returns 0</font>
+(logand 0 1) <font color="#008844">; returns 0</font>
+(logand 1 0) <font color="#008844">; returns 0</font>
+(logand 1 1) <font color="#008844">; returns 1</font>
+(logand 55 #x0F) <font color="#008844">; returns 7</font>
+(logand 7 #b0011) <font color="#008844">; returns 3</font>
+(logand 1 2 4 8 16) <font color="#008844">; returns 0</font>
+(logand 15 7 3) <font color="#008844">; returns 3</font>
+</pre>
+
+<p><b>Note:</b> XLISP does not check when read-macro expansions like '#x0FF'
+are out of bounds. It gives no error message and will just truncate the
+number to the low-order bits that it can deal with [usually 32 bits or 8 hex
+digits].</p>
+
+<p>See the
+<a href="../manual/xlisp-man-024.htm#logand">logand</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/logior.htm b/docsrc/xlisp/xlisp-doc/reference/logior.htm
new file mode 100644
index 0000000..d0e004a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/logior.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP logior</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>logior</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(logior <i>expr1</i> ... )</dt>
+<dd><i>exprN</i> - an integer expression<br>
+returns - the result of the Inclusive OR operation</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'logior' function returns the logical bitwise 'inclusive-or' of the
+list of expressions. If there is only one argument, it is returned
+unaltered. If there are two or more arguments, the 'logior' function
+performs the 'inclusive-or' successively applying the bitwise operation.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(logior 0 0) <font color="#008844">; returns 0</font>
+(logior 0 1) <font color="#008844">; returns 1</font>
+(logior 1 0) <font color="#008844">; returns 1</font>
+(logior 1 1) <font color="#008844">; returns 1</font>
+
+(logior 1 2 4 8 16 32 64) <font color="#008844">; returns 127</font>
+(logior 5 #b010) <font color="#008844">; returns 7</font>
+(logior 99 #x1FF) <font color="#008844">; returns 511</font>
+(logior 99 #x400) <font color="#008844">; returns 1123</font>
+</pre>
+
+<p><b>Note:</b> XLISP does not check when read-macro expansions like '#x0FF'
+are out of bounds. It gives no error message and will just truncate the
+number to the low-order bits that it can deal with [usually 32 bits or 8 hex
+digits].</p>
+
+<p>See the
+<a href="../manual/xlisp-man-024.htm#logior">logior</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/lognot.htm b/docsrc/xlisp/xlisp-doc/reference/lognot.htm
new file mode 100644
index 0000000..3ca21b4
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/lognot.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP lognot</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>lognot</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(lognot <i>expr</i>)</dt>
+<dd><i>expr</i> - an integer expression<br>
+returns - the bitwise inversion of number</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p> The 'lognot' function returns the logical bitwise inversion of the
+expression.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(lognot 255) <font color="#008844">; returns -256</font>
+(lognot #xffff0000) <font color="#008844">; returns 65535</font>
+(lognot #x00000000) <font color="#008844">; returns -1</font>
+(lognot 1) <font color="#008844">; returns -2</font>
+
+(logand (lognot 256) 65535) <font color="#008844">; returns 65279</font>
+(lognot #xFFFFFFFE) <font color="#008844">; returns 1</font>
+(lognot #xFFFFFFFC) <font color="#008844">; returns 3</font>
+</pre>
+
+<p><b>Note:</b> XLISP does not check when read-macro expansions like '#x0FF'
+are out of bounds. It gives no error message and will just truncate the
+number to the low-order bits that it can deal with [usually 32 bits or 8 hex
+digits].</p>
+
+<p>See the
+<a href="../manual/xlisp-man-024.htm#lognot">lognot</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/logxor.htm b/docsrc/xlisp/xlisp-doc/reference/logxor.htm
new file mode 100644
index 0000000..2cf8b11
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/logxor.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP logxor</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>logxor</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(logxor <i>expr1</i> ... )</dt>
+<dd>exprN - an integer expression<br>
+returns - the result of the eXclusive OR operation</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'logxor' function returns the logical bitwise 'exclusive-or' of the
+list of expressions. If there is only one argument, it is returned
+unaltered. If there are two or more arguments, the 'logxor' function
+performs the 'exclusive-or' successively applying the bitwise operation.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(logxor 0 0) <font color="#008844">; returns 0</font>
+(logxor 0 1) <font color="#008844">; returns 1</font>
+(logxor 1 0) <font color="#008844">; returns 1</font>
+(logxor 1 1) <font color="#008844">; returns 0</font>
+
+(logxor #b0011 #b0101) <font color="#008844">; returns 6</font>
+(logxor 255 #xF0) <font color="#008844">; returns 15</font>
+(logxor 255 #x0F) <font color="#008844">; returns 240</font>
+(logxor 255 (logxor 255 99)) <font color="#008844">; returns 99</font>
+</pre>
+
+<p><b>Note:</b> XLISP does not check when read-macro expansions like '#x0FF'
+are out of bounds. It gives no error message and will just truncate the
+number to the low-order bits that it can deal with [usually 32 bits or 8 hex
+digits].</p>
+
+<p>See the
+<a href="../manual/xlisp-man-024.htm#logxor">logxor</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/loop.htm b/docsrc/xlisp/xlisp-doc/reference/loop.htm
new file mode 100644
index 0000000..85c3170
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/loop.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP loop</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>loop</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(loop <i>body</i> ... )</dt>
+<dd><i>body</i> - a series of expressions<br>
+returns - never returns [must use non-local exit]</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'loop' special form specifies a 'repeat-forever' construct. The
+expressions in'body' will be evaluated. When the last expression is
+evaluated in 'body', 'loop' will then repeat the 'body'. When a
+<a href="return.htm">return</a> is evaluated within a 'loop', the
+specified value will be returned. 'loop' itself does not generate a return
+value. Other exit mechanisms include
+<nobr><a href="go.htm">go</a> ,</nobr>
+<nobr><a href="throw.htm">throw</a> ,</nobr>
+<nobr><a href="return-from.htm">return-from</a> and errors.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq i 65) <font color="#008844">; initial value</font>
+
+(loop <font color="#008844">; LOOP</font>
+ (princ (int-char i)) <font color="#008844">; print the character</font>
+ (if (= i 90) (return "done")) <font color="#008844">; test for limit</font>
+ (setq i (1+ i))) <font color="#008844">; increment and repeat</font>
+ <font color="#008844">; prints ABCDEFGHIJKLMNOPQRSTUVWXYZ</font>
+ <font color="#008844">; returns "done"</font>
+</pre>
+
+<p><b>Note:</b> If you create a 'loop' with no exit mechanism, you will
+probably have to abort your XLISP session.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-020.htm#loop">loop</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/lower-case-p.htm b/docsrc/xlisp/xlisp-doc/reference/lower-case-p.htm
new file mode 100644
index 0000000..e683614
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/lower-case-p.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP lower-case-p</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>lower-case-p</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(lower-case-p <i>char</i>)</dt>
+<dd><i>char</i> - a character expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a>
+if the character is lower case,
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'lower-case-p' predicate function checks if the 'char' expression
+is a lower case character. If 'char' is lower case a
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned,
+otherwise a
+<a href="nil.htm">NIL</a> is returned.
+Lower case characters are 'a'
+[<a href="../misc/ascii-table.htm">ASCII</a> decimal value 97]
+through 'z'
+[<a href="../misc/ascii-table.htm">ASCII</a> decimal value 122].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(lower-case-p #\a) <font color="#008844">; returns T</font>
+(lower-case-p #\A) <font color="#008844">; returns NIL</font>
+(lower-case-p #\1) <font color="#008844">; returns NIL</font>
+(lower-case-p #\[) <font color="#008844">; returns NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-026.htm#lower-case-p">lower-case-p</a>
+predicate function form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/macroexpand-1.htm b/docsrc/xlisp/xlisp-doc/reference/macroexpand-1.htm
new file mode 100644
index 0000000..5c43a44
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/macroexpand-1.htm
@@ -0,0 +1,85 @@
+<html><head><title>XLISP macroexpand-1</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>macroexpand-1</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(macroexpand-1 <i>form</i>)</dt>
+<dd><i>form</i> - a macro form<br>
+returns - the macro expansion</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'macroexpand-1' function takes a 'form' and expands the first level
+of the macro definition used in the 'form'. The function returns the
+expansion. If the 'form' does not contain a macro, the form is returned
+unaltered.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defmacro plus (n1 n2) `(+ ,n1 ,n2)) <font color="#008844">; define PLUS macro</font>
+(plus 1 2) <font color="#008844">; returns 3</font>
+(macroexpand '(plus 3 4)) <font color="#008844">; returns (+ 3 4)</font>
+(macroexpand-1 '(plus 3 4)) <font color="#008844">; returns (+ 3 4)</font>
+
+(defmacro pl (p1 p2) `(plus ,p1 ,p2)) <font color="#008844">; define PL macro using PLUS</font>
+(pl 3 4) <font color="#008844">; returns 7</font>
+(macroexpand '(pl 3 4)) <font color="#008844">; returns (+ 3 4)</font>
+(macroexpand-1 '(pl 3 4)) <font color="#008844">; returns (PLUS 3 4)</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp returns 2 values for its result of
+'macroexpand-1', the expanded form and a
+<a href="t.htm">&nbsp;T&nbsp;</a> or
+<a href="nil.htm">NIL</a> value that indicates if the form was a
+macro. XLISP returns only the expanded form. Common Lisp also supports an
+optional argument in 'macroexpand-1' for the environment of the expansion.
+XLISP does not support this optional argument.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-012.htm#macroexpand-1">macroexpand-1</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/macroexpand.htm b/docsrc/xlisp/xlisp-doc/reference/macroexpand.htm
new file mode 100644
index 0000000..771f752
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/macroexpand.htm
@@ -0,0 +1,83 @@
+<html><head><title>XLISP macroexpand</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>macroexpand</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(macroexpand <i>form</i>)</dt>
+<dd><i>form</i> - a macro form<br>
+returns - the macro expansion</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'macroexpand' function takes a 'form' and recursively expands the
+macro definitions used in the 'form'. The function returns the expansion. If
+the 'form' does not contain a macro, the form is returned unaltered.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defmacro plus (n1 n2) `(+ ,n1 ,n2)) <font color="#008844">; define PLUS macro</font>
+(plus 1 2) <font color="#008844">; returns 3</font>
+(macroexpand '(plus 3 4)) <font color="#008844">; returns (+ 3 4)</font>
+
+(defmacro pl (p1 p2) `(plus ,p1 ,p2)) <font color="#008844">; define PL macro using PLUS</font>
+(pl 3 4) <font color="#008844">; returns 7</font>
+(macroexpand '(pl 3 4)) <font color="#008844">; returns (+ 3 4)</font>
+(macroexpand-1 '(pl 3 4)) <font color="#008844">; returns (PLUS 3 4)</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp returns 2 values for its result of
+'macroexpand', the expanded form and a
+<a href="t.htm">&nbsp;T&nbsp;</a> or
+<a href="nil.htm">NIL</a> value that indicates if the form was a
+macro. XLISP returns only the expanded form. Common Lisp also supports an
+optional argument in 'macroexpand' for the environment of the expansion.
+XLISP does not support this optional argument.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-012.htm#macroexpand">macroexpand</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/macrolet.htm b/docsrc/xlisp/xlisp-doc/reference/macrolet.htm
new file mode 100644
index 0000000..39de0f2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/macrolet.htm
@@ -0,0 +1,146 @@
+<html><head><title>XLISP macrolet</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>macrolet</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>macrolet</b> ([<i>macro</i> ... ]) <i>expr</i> ... )</dt>
+<dd><i>macro</i> - a macro definition binding which is of the form:<br>
+<dl><dd>(<i>symbol arg-list body</i>)</dd>
+<dl><dd><i>symbol</i> - the symbol specifying the macro name<br>
+<i>arg-list</i> - the argument list for the macro<br>
+<i>body</i> - the body of the macro</dd></dl></dl>
+<i>expr</i> - an expression<br>
+returns - the value of the last expression</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'macrolet' special form is basically a local <a
+href="block.htm">block</a> construct that allows local 'macro' definitions
+followed by a block of code to evaluate. <nobr>The first</nobr> form after
+the macrolet is the 'binding' form. <nobr>It contains</nobr> a series of
+'macros'. <nobr>The 'macrolet'</nobr> form will sequentially execute the
+'exprs' after defining the 'macros'. <nobr>The value</nobr> of the last
+'expr' evaluated is returned. When the 'macrolet' is finished execution, the
+'symbols' that were defined will no longer exist.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+&gt; (macrolet ((pls (n1 n2) <font color="#008844">; MACROLET defining a PLS macro</font>
+ `(+ ,n1 ,n2)))
+ (pls 4 5))
+9
+
+&gt; (pls 4 5) <font color="#008844">; the PLS macro no longer exists</font>
+<font color="#AA0000">error: unbound function - PLS</font>
+
+&gt; (macrolet () <font color="#008844">; an empty MACROLET</font>
+ (print 'a))
+A <font color="#008844">; screen output of PRINT</font>
+A <font color="#008844">; return value</font>
+</pre>
+
+<h2>Known Problems</h2>
+
+<p><b>1.</b> In XLISP, only macros defined by
+
+<a href="defmacro.htm">defmacro</a> [interned in the
+<a href="global-obarray.htm">*obarray*</a>] can be used with
+<a href="setf.htm">setf</a>:</p>
+
+<pre class="example">
+(setq a #(1 2 3))
+
+(defmacro second-array-element (array)
+ `(aref ,array 1))
+
+(second-array-element a) =&gt; 2
+(setf (second-array-element a) 'x) =&gt; X
+a =&gt; #(1 X 3)
+</pre>
+
+<p>With macros defined by 'macrolet' [stored in the lexical environment],
+<a href="setf.htm">setf</a> signals a '<nobr>bad place form</nobr>' error:</p>
+
+<pre class="example">
+(macrolet ((second-element (array)
+ `(aref ,array 1)))
+ (second-element a)) =&gt; X
+
+(macrolet ((second-element (array)
+ `(aref ,array 1)))
+ (setf (second-element a) 'y)) =&gt; <font color="#AA0000">error: bad place form</font>
+</pre>
+
+<p><b>2.</b> In XLISP, the <a href="macroexpand.htm">macroexpand</a> and
+<nobr><a href="macroexpand-1.htm">macroexpand-1</a></nobr> functions can
+only expand macros defined
+<nobr>by <a href="defmacro.htm">defmacro</a>:</nobr></p>
+
+<pre class="example">
+&gt; (macroexpand-1 '(second-array-element a))
+(AREF A 1)
+</pre>
+
+<p>With macros defined by 'macrolet', the macro form is returned
+unexpanded:</p>
+
+<pre class="example">
+&gt; (macrolet ((second-element (array)
+ `(aref ,array 1)))
+ (macroexpand-1 '(second-element a)))
+(SECOND-ELEMENT A)
+</pre>
+
+<p>In XLISP, the <a href="macroexpand.htm">macroexpand</a> and
+<nobr><a href="macroexpand-1.htm">macroexpand-1</a></nobr> functions only
+search in the <a href="global-obarray.htm">*obarray*</a> for defined macros,
+but not in the lexical environment.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/make-array.htm b/docsrc/xlisp/xlisp-doc/reference/make-array.htm
new file mode 100644
index 0000000..47b576e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/make-array.htm
@@ -0,0 +1,95 @@
+<html><head><title>XLISP make-array</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>make-array</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(make-array <i>size</i>)</dt>
+<dd><i>size</i> - the size [integer] of the array to be created<br>
+returns - the new array</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'make-array' function creates an array of the specified size and
+returns the array. Array elements may be any valid lisp data type, including
+lists or arrays. Arrays made by 'make-array' and accessed by
+<a href="aref.htm">aref</a> are <nobr>base 0.</nobr> This means
+the first element is accessed by element number '0' and the last element is
+accessed by element number 'n-1', where 'n' is the array size. Array
+elements are initialized to <a href="nil.htm">NIL</a>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq my-array (make-array 16)) <font color="#008844">; make the array</font>
+(aref my-array 0) <font color="#008844">; return 0th (first) element</font>
+(aref my-array 15) <font color="#008844">; return 15th (last) element</font>
+(aref my-array 16) <font color="#008844">; error: non existant element</font>
+
+(dotimes (i 16) <font color="#008844">; set each element to its index</font>
+ (setf (aref my-array i) i)) <font color="#008844">; by the setf function</font>
+
+(setq new (make-array 4)) <font color="#008844">; make another array</font>
+(setf (aref new 0) (make-array 4)) <font color="#008844">; make new[0] an array of 4</font>
+(setf (aref (aref new 0) 1) 'a) <font color="#008844">; set new[0,1] = 'a</font>
+(setf (aref new 2) '(a b c)) <font color="#008844">; set new[2] = '(a b c)</font>
+my-array <font color="#008844">; look at array</font>
+</pre>
+
+<p><b>Read macro:</b> There is a built-in read-macro for arrays, '#(...)'
+[the hash symbol with an opening and a closing parenthesis]. This allows you
+to create arbitrary arrays with initial values without going through a
+'make-array' function. There is also the XLISP <a
+href="vector.htm">vector</a> function to create initialized arrays.</p>
+
+<p><b>Common Lisp:</b> Common Lisp supports multi-dimensional arrays, XLISP
+only supports one-dimensional arrays. In XLISP, multi-dimenstional arrays
+can be created by using 'arrays within arrays'. Common Lisp supports various
+keyword parameters that are not supported in XLISP.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-015.htm#make-array">make-array</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/make-string-input-stream.htm b/docsrc/xlisp/xlisp-doc/reference/make-string-input-stream.htm
new file mode 100644
index 0000000..0dd3fe9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/make-string-input-stream.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP make-string-input-stream</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>make-string-input-stream</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(make-string-input-stream <i>string</i> [<i>start-pos</i> [<i>end-pos</i>]])</dt>
+<dd><i>string</i> - a string expression<br>
+<i>start-pos</i> - an optional numeric expression, default value is '0' [the first character of the string]<br>
+<i>end-pos</i> - an optional numeric expression, default value is the length of the string<br>
+returns - an unnamed stream that reads from the string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'make-string-input-stream' function creates an unnamed stream from
+the 'string' expression. The stream can then be used as any other stream
+object. The optional 'start-pos' expression specifies the starting offset of
+the 'string' expression. A 'start-pos' of '0' will start with the beginning
+of the 'string'. The optional 'end-pos' expression specifies the ending
+offset of the 'string' expression. A 'end-pos' of 4 will make the fourth
+character the last in the stream. If the function is successful, it returns
+the unnamed stream object. If the string is empty, an unnamed stream is
+still returned. Error conditions include 'start-pos' and 'end-pos' being out
+of bounds.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(make-string-input-stream "abcdefgh") <font color="#008844">; returns #&lt;Unnamed-Stream: #277e2&gt;</font>
+(read (make-string-input-stream "123456")) <font color="#008844">; returns 123456</font>
+(read (make-string-input-stream "123456" 1)) <font color="#008844">; returns 23456</font>
+(read (make-string-input-stream "123456" 1 3)) <font color="#008844">; returns 23</font>
+(read (make-string-input-stream "123" 0)) <font color="#008844">; returns 123</font>
+(read (make-string-input-stream "123" 0 3)) <font color="#008844">; returns 123</font>
+(read (make-string-input-stream "123" 2 1)) <font color="#008844">; returns NIL</font>
+(read (make-string-input-stream "123" 0 4)) <font color="#008844">; error: string index out of bounds - 4</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-030.htm#make-string-input-stream">make-string-input-stream</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/make-string-output-stream.htm b/docsrc/xlisp/xlisp-doc/reference/make-string-output-stream.htm
new file mode 100644
index 0000000..ae2cfe2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/make-string-output-stream.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP make-string-output-stream</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>make-string-output-stream</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(make-string-output-stream)</dt>
+<dd>returns - an unnamed output stream</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'make-string-output-stream' function creates and returns an unnamed
+output stream. The stream can then be used as any other stream object.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(make-string-output-stream) <font color="#008844">; returns #&lt;Unnamed-Stream: #2d9c0&gt;</font>
+
+(setq out (make-string-output-stream)) <font color="#008844">; returns #&lt;Unnamed-Stream: #2d95c&gt;</font>
+
+(format out "fee fi fo fum ") <font color="#008844">; \</font>
+(format out "I smell the blood of ") <font color="#008844">; fill up output stream</font>
+(format out "Elmer Fudd") <font color="#008844">; /</font>
+(get-output-stream-string out) <font color="#008844">; returns "fee fi fo fum I smell the blood of Elmer Fudd"</font>
+
+(format out "~%now what") <font color="#008844">; add more to output stream</font>
+(get-output-stream-string out) <font color="#008844">; returns "\nnow what"</font>
+
+(format out "hello") <font color="#008844">; add more to output stream</font>
+(read out) <font color="#008844">; returns HELLO</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-030.htm#make-string-output-stream">make-string-output-stream</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/make-symbol.htm b/docsrc/xlisp/xlisp-doc/reference/make-symbol.htm
new file mode 100644
index 0000000..f0d0a7b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/make-symbol.htm
@@ -0,0 +1,93 @@
+<html><head><title>XLISP make-symbol</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>make-symbol</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(make-symbol <i>symbol-str</i>)</dt>
+<dd><i>symbol-str</i> - a string expression<br>
+returns - the new symbol</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'make-symbol' function takes a string name 'symbol-str' and creates a
+new symbol. This symbol is temporary and is not
+<a href="intern.htm">intern</a>ed [placed] into the symbol hash
+table <a href="global-obarray.htm">*obarray*</a>. If the symbol already
+exists, no error or action is taken and the old values and property lists
+remain intact. The 'make-symbol' function returns the symbol as its
+result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun lookin (sym) <font color="#008844">; create a function to</font>
+ (aref *obarray* <font color="#008844">; look inside *OBARRAY*</font>
+ (hash sym (length *obarray*)))) <font color="#008844">; and look for a specific</font>
+ <font color="#008844">; symbol - returns a list</font>
+
+(lookin "FEE") <font color="#008844">; returns (CHAR-INT NTH ++)</font>
+ <font color="#008844">; FEE symbol doesn't exist</font>
+
+(make-symbol "FEE") <font color="#008844">; returns FEE symbol</font>
+(lookin "FEE") <font color="#008844">; returns (CHAR-INT NTH ++)</font>
+ <font color="#008844">; FEE still doesn't exist</font>
+
+(intern "FEE") <font color="#008844">; intern FEE symbol</font>
+(lookin "FEE") <font color="#008844">; returns (FEE CHAR-INT NTH ++)</font>
+ <font color="#008844">; FEE does now exist</font>
+</pre>
+
+<p><b>Note:</b> When you 'make-symbol' a string type symbol like
+&quot;fingers&quot;, this is a lower case symbol. This is different from
+doing a 'make-symbol' on a string type symbol &quot;FINGERS&quot;, which is
+an upper case symbol. With string type symbols, &quot;fingers&quot; and
+&quot;FINGERS&quot; are two different symbols. Remember also that normal
+symbols created by XLISP are automatically converted to upper case.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#make-symbol">make-symbol</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/mapc.htm b/docsrc/xlisp/xlisp-doc/reference/mapc.htm
new file mode 100644
index 0000000..83fe3fc
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/mapc.htm
@@ -0,0 +1,87 @@
+<html><head><title>XLISP mapc</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>mapc</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(mapc <i>function list1</i> [<i>list2</i> ... ])</dt>
+<dd><i>function</i> - a function definition like a
+<a href="lambda.htm">lambda</a> form or a function name<br>
+<i>listN</i> - a list or list expression<br>
+returns - the first list of arguments</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'mapc' function applies the 'function' to the succesive
+<a href="car.htm">car</a>s of each of the lists 'listN'. Each of
+the lists supplies one of the arguments to 'function'. The 'mapc' function
+returns a list that is equivalent to the first list 'list1'. It's purpose is
+to perform operations that have side-effects. If the lists are of different
+lengths, the shortest list will determine the number of applications of
+'function'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(mapc 'princ '(hi there bob)) <font color="#008844">; prints HITHEREBOB</font>
+ <font color="#008844">; returns (HI THERE BOB)</font>
+
+(mapc '+ '(1 2 3) '(1 2 3)) <font color="#008844">; returns (1 2 3)</font>
+ <font color="#008844">; there were no side effects</font>
+
+(mapc (lambda (x y) (print (+ x y))) <font color="#008844">; define a function with side effects</font>
+ '(1 2 3) '(1 2 3)) <font color="#008844">; prints 2 4 6 </font>
+ <font color="#008844">; returns (1 2 3)</font>
+</pre>
+
+<p><b>Note:</b> The use of the 'function' will work properly when it is a
+quoted symbol [the name of the function], an unquoted symbol, whose value is
+a function, or a closure object like a
+<a href="lambda.htm">lambda</a> form.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#mapc">mapc</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/mapcar.htm b/docsrc/xlisp/xlisp-doc/reference/mapcar.htm
new file mode 100644
index 0000000..8112cba
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/mapcar.htm
@@ -0,0 +1,151 @@
+<html><head><title>XLISP mapcar</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>mapcar</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(mapcar <i>function list1</i> [<i>list2</i> ... ])</dt>
+<dd><i>function</i> - a function definition like a
+<a href="lambda.htm">lambda</a> or a function name<br>
+<i>listN</i> - a list or list expression<br>
+returns - a list that is constructed from the results of the <i>function</i> applications</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The mapcan function 'mapcar' applies the 'function' to the succesive
+<a href="car.htm">car</a>s of each of the lists 'listN'. Each of
+the lists supplies one of the arguments to 'function'. The 'mapcar' function
+returns a list that is constructed from the results of the 'function'
+applications. If the lists are of different lengths, the shortest list will
+determine the number of applications of 'function'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+&gt; (mapcar #'+ '(1 2 3) '(1 2 3))
+(2 4 6)
+
+&gt; (mapcar #'princ '(1 2 3))
+123 <font color="#008844">; screen output</font>
+(1 2 3) <font color="#008844">; return value</font>
+
+&gt; (mapcar #'+ '(1 2 3) '(1 2 3 4 5 6) <font color="#008844">; different length lists</font>
+(2 4 6)
+</pre>
+
+<p><b>Note:</b> The use of the 'function' will work properly when it is a
+<nobr>sharp-quoted</nobr> symbol, <nobr>a quoted</nobr> symbol [must be the
+name of a function], <nobr>an unquoted</nobr> symbol whose value is a
+function, or a closure object like a <a href="lambda.htm">lambda</a>
+form.</p>
+
+<p><div class="box">
+
+<p><b>Bug:</b> The proper syntax for 'function' when 'function' is a
+<a href="lambda.htm">lambda</a> expression is, for example:</p>
+
+<pre class="example">
+(mapcar #'(lambda (arg1 arg2) (+ arg1 arg2)) '(1 2))
+</pre>
+
+<p>and not:</p>
+
+<pre class="example">
+(mapcar '(lambda (arg1 arg2) (+ arg1 arg2)) '(1 2))
+</pre>
+
+<p>That is, the #' [<a href="function.htm">function</a>] read macro must be
+present. This error should be caught by the XLISP interpreter, but it is
+not, with the result that very obscure garbage collection bugs occur.
+<nobr>[I still</nobr> haven't tested Nyquist for possible garbage collection
+bugs caused by this.]</p>
+
+</div></p>
+
+<h2>Notes</h2>
+
+<p>In XLISP, a '<nobr>special form</nobr>' of type FSUBR is not a function.
+This means that 'mapcar' only works with functions of type SUBR
+<nobr>[built-in</nobr> function] or CLOSURE [function defined by
+<a href="defun.htm">defun</a>, <a href="flet.htm">flet</a>,
+<a href="labels.htm">labels</a>, or <a href="lambda.htm">lambda</a>], but
+with special forms of <nobr>type FSUBR</nobr> a 'bad function' error is
+signalled. Here is an example how to work around this behaviour:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">mapcar*</font> (function &amp;rest args)
+ (if (eq (type-of (symbol-function (second function))) 'fsubr)
+ (let ((rest (gensym)))
+ `(mapcar #'(lambda (&rest ,rest)
+ (eval (cons ,function ,rest)))
+ ,@args))
+ `(mapcar ,function ,@args)))
+</pre>
+
+<p>Examples:</p>
+
+<pre class="example">
+(type-of #'eql) =&gt; SUBR <font color="#008844">; built-in function</font>
+(type-of #'and) =&gt; FSUBR <font color="#008844">; built-in special form</font>
+
+&gt; (macroexpand-1 '(mapcar* #'eql '(1 2 3) '(t nil 3)))
+(MAPCAR (FUNCTION EQL)
+ (QUOTE (1 2 3))
+ (QUOTE (T NIL 3)))
+
+&gt; (macroexpand-1 '(mapcar* #'and '(1 2 3) '(t nil 3)))
+(MAPCAR (FUNCTION (LAMBDA (&amp;REST G7)
+ (EVAL (CONS (FUNCTION AND) G7))))
+ (QUOTE (1 2 3))
+ (QUOTE (T NIL 3)))
+
+(mapcar #'eql '(1 2 3) '(t nil 3))) =&gt; (NIL NIL T)
+(mapcar* #'eql '(1 2 3) '(t nil 3))) =&gt; (NIL NIL T)
+
+(mapcar #'and '(1 2 3) '(t nil 3))) =&gt; <font color="#AA0000">error: bad function</font>
+(mapcar* #'and '(1 2 3) '(t nil 3))) =&gt; (T NIL 3)
+</pre>
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/mapl.htm b/docsrc/xlisp/xlisp-doc/reference/mapl.htm
new file mode 100644
index 0000000..fb65045
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/mapl.htm
@@ -0,0 +1,89 @@
+<html><head><title>XLISP mapl</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>mapl</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(mapl <i>function list1</i> [<i>list2</i> ... ])</dt>
+<dd><i>function</i> - a function definition like a
+<a href="lambda.htm">lambda</a> form or a function name<br>
+<i>listN</i> - a list or list expression<br>
+returns - a list that is equivalent to <i>list1</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>Tha 'mapl' function applies the 'function' to the successive
+<a href="cdr.htm">cdr</a>s of each of the lists 'listN'. Each of
+the lists supplies one of the arguments to 'function'. The 'mapl' function
+returns a list that is equivalent to the first list 'list1'. It's purpose is
+to perform operations that have side-effects. If the lists are of different
+lengths, the shortest list will determine the number of applications of
+'function'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(mapl 'print '(a b c)) <font color="#008844">; prints (A B C)</font>
+ <font color="#008844">; (B C)</font>
+ <font color="#008844">; (C)</font>
+ <font color="#008844">; returns (A B C)</font>
+
+<font color="#008844">;; apply a lambda function to a list</font>
+(mapl (lambda (x y) (princ x) (princ y) (terpri))
+ '(a b c) '(1 2 3)) <font color="#008844">; prints (A B C)(1 2 3)</font>
+ <font color="#008844">; (B C)(2 3)</font>
+ <font color="#008844">; (C)(3)</font>
+ <font color="#008844">; returns (A B C)</font>
+</pre>
+
+<p><b>Note:</b> The use of the 'function' will work properly when it is a
+quoted symbol [the name of the function], an unquoted symbol whose value is
+a function or a closure object like a
+<a href="lambda.htm">lambda</a> form.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#mapl">mapl</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/maplist.htm b/docsrc/xlisp/xlisp-doc/reference/maplist.htm
new file mode 100644
index 0000000..a0abe69
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/maplist.htm
@@ -0,0 +1,86 @@
+<html><head><title>XLISP maplist</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>maplist</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(maplist <i>function list1</i> [<i>list2</i> ... ])</dt>
+<dd><i>function</i> - a function definition like a
+<a href="lambda.htm">lambda</a> or a function name<br>
+<i>listN</i> - a list or list expression<br>
+returns - a list that is constructed from the results of the
+<i>function</i> applications</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'maplist' function applies the 'function' to the successive
+<a href="cdr.htm">cdr</a>s of each of the lists 'listN'. Each of
+the lists supplies one of the arguments to 'function'. The 'maplist'
+function returns a list that is constructed from the results of the
+'function' applications. If the lists are of different lengths, the shortest
+list will determine the number of applications of 'function'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(maplist 'print '(a b c)) <font color="#008844">; prints (A B C)</font>
+ <font color="#008844">; (B C)</font>
+ <font color="#008844">; (C)</font>
+ <font color="#008844">; returns ((A B C) (B C) (C))</font>
+
+<font color="#008844">;; append the lists into one list and find it's length</font>
+(maplist (lambda (x y) (length (append x y)))
+ '(a b c d) '(1 2 3 4)) <font color="#008844">; returns (8 6 4 2)</font>
+</pre>
+
+<p><b>Note:</b> The use of the 'function' will work properly when it is a
+quoted symbol [the name of the function], an unquoted symbol whose value is
+a function or a closure object like a
+<a href="lambda.htm">lambda</a> form.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#maplist">maplist</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/max.htm b/docsrc/xlisp/xlisp-doc/reference/max.htm
new file mode 100644
index 0000000..bdac974
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/max.htm
@@ -0,0 +1,73 @@
+<html><head><title>XLISP max</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>max</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(max <i>expr1</i> ... )</dt>
+<dd><i>exprN</i> - integer or floating point number/expression<br>
+returns - the largest number in the list of numbers/expressions</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'max' function returns the largest numeric expression from the list
+of arguments.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(max 1) <font color="#008844">; returns 1</font>
+(max 1 -5 9) <font color="#008844">; returns 9</font>
+
+(setq a '( 9 3 5 2)) <font color="#008844">; set up a list - (9 3 5 2)</font>
+(apply 'max a) <font color="#008844">; returns 9</font>
+(apply #'max a) <font color="#008844">; returns 9</font>
+(apply 'min a) <font color="#008844">; returns 2</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#max">max</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/member.htm b/docsrc/xlisp/xlisp-doc/reference/member.htm
new file mode 100644
index 0000000..3dfbebf
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/member.htm
@@ -0,0 +1,93 @@
+<html><head><title>XLISP member</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>member</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(member <i>expr list-expr</i> [{:test | :test-not} <i>test</i>])</dt>
+<dd><i>expr</i> - the expression to find [an atom or a list]<br>
+<i>list-expr</i> - the list to search<br>
+<i>test</i> - optional test function, default is
+<a href="eql.htm">eql</a><br>
+returns - the remainder of the list starting with <i>expr</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'member' function searches through 'list-expr' for 'expr'. If found,
+'member' returns the remainder of the 'list-expr' starting with 'expr'. If
+'expr' is not found, a <a href="nil.htm">NIL</a> is returned. You
+may specify your own test with the ':test' and ':test-not' keywords followed
+by the test you which to perform.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(member 'a '(1 2 3 4)) <font color="#008844">; returns NIL</font>
+(member '2 '(1 2 3 4)) <font color="#008844">; returns (2 3 4)</font>
+
+(setq mylist '(2 4 8 16 32 64 128 256)) <font color="#008844">; make a numeric list</font>
+(member 6 mylist :test '&lt;) <font color="#008844">; returns (8 16 32 64 128 256)</font>
+(member 6 (reverse mylist) :test-not '&lt;) <font color="#008844">; returns (4 2)</font>
+(member '20 '(60 40 20 10) :test '&gt; ) <font color="#008844">; returns (10)</font>
+
+(member '(a) '((see) (a) (cat)) :test 'equal) <font color="#008844">; returns ((A) (CAT)) with EQUAL as test</font>
+(member "hi" '("a" "hi" "c") :test 'string= ) <font color="#008844">; returns ("hi" "c") with STRING= as test</font>
+
+</pre>
+
+<p><b>Note:</b> The 'member' function can work with a list or string as the
+'expr'. However, the default <a href="eql.htm">eql</a> test does
+not work with lists or strings, only symbols and numbers. To make this work,
+you need to use the ':test' keyword along with
+<a href="equal.htm">equal</a> for 'test'.</p>
+
+<p><b>Common Lisp:</b> Common Lisp supports the use of the ':key' keyword
+which specifies a function that is applied to each element of 'list-expr'
+before it is tested. XLISP does not support this.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#member">member</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/min.htm b/docsrc/xlisp/xlisp-doc/reference/min.htm
new file mode 100644
index 0000000..287c85a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/min.htm
@@ -0,0 +1,73 @@
+<html><head><title>XLISP min</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>min</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(min <i>expr1</i> ... )</dt>
+<dd><i>exprN</i> - integer or floating point number/expression<br>
+returns - the smallest number in the list of numbers/expressions</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'min' function returns the minimum [most negative or most nearly
+negative] numeric expression from the list of arguments.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(min 1) <font color="#008844">; returns 1</font>
+(min 8 7 4 2) <font color="#008844">; returns 2</font>
+(min 2 3 -1 -99) <font color="#008844">; returns -99</font>
+(setq a '( 9 3 5 2)) <font color="#008844">; make a numeric list - (9 3 5 2)</font>
+(apply 'min a) <font color="#008844">; returns 2</font>
+(apply #'min a) <font color="#008844">; returns 2</font>
+(apply 'max a) <font color="#008844">; returns 9</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#min">min</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/minusp.htm b/docsrc/xlisp/xlisp-doc/reference/minusp.htm
new file mode 100644
index 0000000..e01376e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/minusp.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP minusp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>minusp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+(minusp <i>expr</i>)
+<dd><i>expr</i> - the numeric expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the number is
+negative, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'minusp' predicate function checks to see if the number 'expr' is
+negative. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if the
+number is negative [less than zero], <a href="nil.htm">NIL</a> is
+returned otherwise. An error is generated if the
+'expr' is not a numeric expression:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(minusp 1) <font color="#008844">; returns NIL</font>
+(minusp 0) <font color="#008844">; returns NIL</font>
+(minusp -1) <font color="#008844">; returns T</font>
+(minusp -.000000005) <font color="#008844">; returns T</font>
+(minusp #xFFFFFFFF) <font color="#008844">; returns T</font>
+(minusp #x01) <font color="#008844">; returns NIL</font>
+
+(minusp 'a) <font color="#008844">; error: bad argument type</font>
+(setq a -3.5) <font color="#008844">; set A to -3.5</font>
+(minusp a) <font color="#008844">; returns T</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#minusp">minusp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/multiplication.htm b/docsrc/xlisp/xlisp-doc/reference/multiplication.htm
new file mode 100644
index 0000000..07b6b6e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/multiplication.htm
@@ -0,0 +1,87 @@
+<html><head><title>XLISP *</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(* <i>expr1</i> ...)</nobr></dt>
+<dd><i>exprN</i> - integer or floating point number/expression<br>
+returns - the result of the multiplication</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '*' function multiplies one or more numbers together and
+returns the result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(* 1) =&gt; 1
+(* 1 2) =&gt; 2
+(* 1 2 3) =&gt; 6
+(* 1 2 3 4) =&gt; 24
+</pre>
+
+<pre class="example">
+&gt; (print (+ 1 2 (* 3.5 (/ 3.9 1.45))))
+12.4138
+12.4138
+</pre>
+
+<p>See <a href="addition.htm">&nbsp;+&nbsp;</a>,
+<a href="division.htm">&nbsp;/&nbsp;</a>, <a href="print.htm">print</a>.
+XLISP first prints the value on the screen, the second number is the
+return value.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/nconc.htm b/docsrc/xlisp/xlisp-doc/reference/nconc.htm
new file mode 100644
index 0000000..20e3b91
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/nconc.htm
@@ -0,0 +1,89 @@
+<html><head><title>XLISP nconc</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>nconc</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(nconc [<i>list1</i> ... ])</dt>
+<dd><i>listN</i> - a list to destructively concatenate<br>
+returns - the result of concatenating the lists</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'nconc' function destructively concatenates a sequence of lists and
+returns the result of this concatentation. The destructive aspect of this
+operation means that the actual symbol values are used in the list-modifying
+operations, not copies. This means, for 'nconc', that the lists are spliced
+together. 'listN' must evaluate to a valid list. An atom for 'listN' will
+result in an error. <a href="nil.htm">NIL</a> is a valid
+'listN'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq a '(1 2 3)) <font color="#008844">; set up A with (1 2 3)</font>
+(setq b '(4 5 6)) <font color="#008844">; set up B with (4 5 6)</font>
+(setq c '(7 8 9)) <font color="#008844">; set up C with (7 8 9)</font>
+(NCONC a b c) <font color="#008844">; returns (1 2 3 4 5 6 7 8 9)</font>
+(setf (nth 8 a) 'end) <font color="#008844">; change last element of A</font>
+(print a) <font color="#008844">; prints (1 2 3 4 5 6 7 8 END)</font>
+(print b) <font color="#008844">; prints (4 5 6 7 8 END)</font>
+(print c) <font color="#008844">; prints (7 8 END)</font>
+</pre>
+
+<p><b>Note:</b> with Nyquist, no error is raised if 'listN' is an atom.
+Instead, all atoms given to the 'nconc' function, if not given as the last
+argument, just disappear:</p>
+
+<pre class="example">
+(nconc 'a 'b 'c 'd) <font color="#008844">; returns D</font>
+(nconc 'a '(b) 'c '(d)) <font color="#008844">; returns (B D)</font>
+(nconc '(a) 'b '(c) 'd) <font color="#008844">; returns (A C . D)</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-017.htm#nconc">nconc</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/nil.htm b/docsrc/xlisp/xlisp-doc/reference/nil.htm
new file mode 100644
index 0000000..b8265e9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/nil.htm
@@ -0,0 +1,70 @@
+<html><head><title>XLISP nil</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>nil</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system constant</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsym.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;nil</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'nil' constant represents the empty list or the false value, as
+oppossed to the true value [the symbol
+<a href="t.htm">&nbsp;T&nbsp;</a>]. 'nil' can be written as
+the three character symbol 'nil' or as the empty list ().</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq myvar nil) <font color="#008844">; set MYVAR to False</font>
+(setq myvar 'nil) <font color="#008844">; NIL and 'NIL evaluate to NIL</font>
+(setq myvar ()) <font color="#008844">; () is the empty list = NIL</font>
+(setq myvar '()) <font color="#008844">; () and '() evaluate to NIL</font>
+(if nil (print "this won't print") <font color="#008844">; if/then/else</font>
+ (print "this will print"))
+</pre>
+
+<p><b>Note:</b> You can not change the value of NIL.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/not.htm b/docsrc/xlisp/xlisp-doc/reference/not.htm
new file mode 100644
index 0000000..a6ba8d0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/not.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP not</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>not</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(not <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+return - <a href="t.htm">&nbsp;T&nbsp;</a> if the value is
+<nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'not' predicate function checks to see if the 'expr' is false.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if the
+expression is <nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(not '()) <font color="#008844">; returns T - empty list</font>
+(not ()) <font color="#008844">; returns T - still empty</font>
+(setq a NIL) <font color="#008844">; set up a variable</font>
+(not a) <font color="#008844">; returns T - value = empty list</font>
+
+(not "a") <font color="#008844">; returns NIL - not a list</font>
+(not 'a) <font color="#008844">; returns NIL - not a list</font>
+</pre>
+
+<p><b>Note:</b> The 'not' predicate is the same function as the
+<a href="null.htm">null</a> predicate.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#not">not</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/nstring-downcase.htm b/docsrc/xlisp/xlisp-doc/reference/nstring-downcase.htm
new file mode 100644
index 0000000..4d30642
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/nstring-downcase.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP nstring-downcase</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>nstring-downcase</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(nstring-downcase <i>string</i> [{:start | :end} <i>offset</i>] ... )</dt>
+<dd><i>string</i> - a string expression<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - the converted string, not a copy</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'nstring-downcase' function takes a string argument and makes it
+lower case. This function modifies the string or string variable itself, it
+does not just make a copy. The lower case string is returned.</p>
+
+<p> The keyword arguments allow for accessing substrings within 'string'.
+The keyword arguments require a keyword [':start' or ':end'] first and a
+single integer expression second. The ':start' keyword specifies the
+starting offset for the 'nstring-downcase' operation on 'string'. A value of
+0 starts the string at the beginning [no offset]. The ':end' keyword
+specifies the end offset for the operation on 'string'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(nstring-downcase "ABcd+-12&amp;[") <font color="#008844">; returns "abcd+-&amp;["</font>
+(nstring-downcase "ABCDEFGH" :start 2 :end 4) <font color="#008844">; returns "ABcdEFGH"</font>
+
+(setq mystr "ABcdEFgh") <font color="#008844">; set up variable</font>
+(nstring-downcase mystr) <font color="#008844">; returns "abcdefgh"</font>
+(print mystr) <font color="#008844">; prints "abcdefgh"</font>
+ <font color="#008844">; note that MYSTR is modified</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#nstring-downcase">nstring-downcase</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/nstring-upcase.htm b/docsrc/xlisp/xlisp-doc/reference/nstring-upcase.htm
new file mode 100644
index 0000000..98b2b33
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/nstring-upcase.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP nstring-upcase</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>nstring-upcase</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(nstring-upcase <i>string</i> [{:start | :end} <i>offset</i>] ... )</dt>
+<dd><i>string</i> - a string expression<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - the converted string, not a copy</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'nstring-upcase' function takes a string argument and makes it upper
+case. This function modifies the string or string variable itself, it does
+not just make a copy. The upper case string is returned.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string'. The
+keyword arguments require a keyword (':start' or ':end') first and a single
+integer expression second. The ':start' keyword specifies the starting
+offset for the 'nstring-upcase' operation on 'string'. A value of 0 starts
+the string at the beginning [no offset]. The ':end' keyword specifies the
+end offset for the operation on 'string'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(nstring-upcase "ABcd+-12&amp;[") <font color="#008844">; returns "ABCD+-&amp;["</font>
+(nstring-upcase "abcdefgh" :start 2 :end 4) <font color="#008844">; returns "abCDefgh"</font>
+
+(setq mystr "ABcdEFgh") <font color="#008844">; set up variable</font>
+(nstring-upcase mystr) <font color="#008844">; returns "ABCDEFGH"</font>
+(print mystr) <font color="#008844">; prints "ABCDEFGH"</font>
+ <font color="#008844">; note that MYSTR is modified</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#nstring-upcase">nstring-upcase</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/nth.htm b/docsrc/xlisp/xlisp-doc/reference/nth.htm
new file mode 100644
index 0000000..fee31f5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/nth.htm
@@ -0,0 +1,74 @@
+<html><head><title>XLISP nth</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>nth</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(nth <i>expr list-expr</i>)</dt>
+<dd><i>expr</i> - an integer expression<br>
+<i>list-expr</i> - a list or list expression<br>
+returns - the nth element or <a href="nil.htm">NIL</a> if the
+list isn't that long</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>'nth' returns the 'expr'-th element of 'list-expr'. If the 'list-expr' is
+shorter than 'expr', a <a href="nil.htm">NIL</a> is returned. The
+counting sequence is base zero, the first element is the 0th element.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(nth 4 '(0 1 2 3 4 5 6)) <font color="#008844">; returns 4</font>
+(nth 3 '(a b)) <font color="#008844">; returns NIL</font>
+
+(nth 4 'a) <font color="#008844">; error: bad argument type</font>
+(nth 3 "abcdefg") <font color="#008844">; error: bad argument type</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#nth">nth</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/nthcdr.htm b/docsrc/xlisp/xlisp-doc/reference/nthcdr.htm
new file mode 100644
index 0000000..fa41dac
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/nthcdr.htm
@@ -0,0 +1,75 @@
+<html><head><title>XLISP nthcdr</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>nthcdr</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(nthcdr <i>expr list-expr</i>)</dt>
+<dd><i>expr</i> - an integer expression<br>
+<i>list-expr</i> - a list or list expression<br>
+returns - the <a href="nth.htm">nth</a>
+<a href="cdr.htm">cdr</a> or
+<a href="nil.htm">NIL</a> if the list isn't that long</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>'nthcdr' returns the 'expr'-th <a href="cdr.htm">cdr</a>
+of 'list-expr'. If the 'list-expr' is shorter than 'exp',
+a <a href="nil.htm">NIL</a> is returned. The counting sequence
+is base zero, the first element is the 0th element.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(nthcdr 4 '(0 1 2 3 4 5 6)) <font color="#008844">; returns (4 5 6)</font>
+(nthcdr 3 '(a b)) <font color="#008844">; returns NIL</font>
+
+(nthcdr 4 'a) <font color="#008844">; error: bad argument type</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#nthcdr">nthcdr</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/null.htm b/docsrc/xlisp/xlisp-doc/reference/null.htm
new file mode 100644
index 0000000..e683053
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/null.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP null</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>null</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(null <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the list is
+empty, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'null' predicate function checks 'expr' for an empty list.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if the list is
+empty, <a href="nil.htm">NIL</a> is returned otherwise. The
+'expr' does not have to be a valid list, but if it is not a list then
+<a href="nil.htm">NIL</a> is returned as the result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(null '()) <font color="#008844">; returns T - empty list</font>
+(null ()) <font color="#008844">; returns T - still empty</font>
+(setq a NIL) <font color="#008844">; set up a variable</font>
+(null a) <font color="#008844">; returns T - value = empty list</font>
+
+(null "a") <font color="#008844">; returns NIL - not a list</font>
+(null 'a) <font color="#008844">; returns NIL - not a list</font>
+</pre>
+
+<p><b>Note:</b> The 'null' predicate function is the same function as the
+<a href="not.htm">not</a> predicate function.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#null">null</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/number-equal.htm b/docsrc/xlisp/xlisp-doc/reference/number-equal.htm
new file mode 100644
index 0000000..7316d17
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/number-equal.htm
@@ -0,0 +1,87 @@
+<html><head><title>XLISP =</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(= <i>expr1 expr2</i> ...)</nobr></dt>
+<dd><i>exprN</i> - a numeric expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the results of
+comparing the expressions are all true,
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The <nobr>'=' [equality]</nobr> function takes an arbitrary number of
+numeric arguments. <nobr>It checks</nobr> to see if all the numbers are
+equal. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if all of the arguments
+are numerically equal to each other, <a href="nil.htm">NIL</a> is returned
+otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(= 1 1) =&gt; T
+(= 1 2) =&gt; NIL
+(= 1 1.0) =&gt; T
+(= 1 1.0 1 (+ 0 1)) =&gt; T
+(= 1 1.0 1.00001) =&gt; NIL
+(= "a" "b") =&gt; <font color="#AA0000">error: bad argument type</font>
+(setq a 1 b 1.0) =&gt; 1.0 <font color="#008844">; set up A and B with values</font>
+(= a b) =&gt; T
+</pre>
+
+<p>See <a href="setq.htm">setq</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/number-greaterp.htm b/docsrc/xlisp/xlisp-doc/reference/number-greaterp.htm
new file mode 100644
index 0000000..a4cfe28
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/number-greaterp.htm
@@ -0,0 +1,90 @@
+<html><head><title>XLISP &gt;</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>&gt;</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(&gt; <i>expr1 expr2</i> ...)</nobr></dt>
+<dd><i>exprN</i> - a numeric expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the results of
+comparing the expressions are all true,
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The <nobr>'&gt;' [greater-than]</nobr> function takes an arbitrary number
+of numeric arguments. <nobr>It checks</nobr> to see if all the numbers are
+monotonically decreasing. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if
+the arguments are numerically, and monotonically decreasing,
+<a href="nil.htm">NIL</a> is returned otherwise. <nobr>For two</nobr>
+arguments, this has the effect of testing if 'expr1' is greater than
+'expr2'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(&gt; 1 1) =&gt; NIL
+(&gt; 1 2) =&gt; NIL
+(&gt; 2.0 1.99) =&gt; T
+(&gt; 3 2 1) =&gt; T
+(&gt; 3 2 2) =&gt; NIL
+(&gt; "aa" "aa") =&gt; <font color="#AA0000">error: bad argument type</font>
+(setq a 12 b 99.9) =&gt; 99.9 <font color="#008844">; set up A and B with values</font>
+(&gt; a b) =&gt; NIL
+(&gt; b a) =&gt; T
+</pre>
+
+<p>See <a href="setq.htm">setq</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/number-lessp.htm b/docsrc/xlisp/xlisp-doc/reference/number-lessp.htm
new file mode 100644
index 0000000..d1ba84a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/number-lessp.htm
@@ -0,0 +1,90 @@
+<html><head><title>XLISP &lt;</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>&lt;</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(&lt; <i>expr1 expr2</i> ...)</nobr></dt>
+<dd><i>exprN</i> - a numeric expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the results of
+comparing the expressions are all true,
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The <nobr>'&lt;' [less-than]</nobr> function takes an arbitrary number
+of numeric arguments. It checks to see if all the numbers are monotonically
+increasing. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if
+the arguments are numerically, and monotonically increasing,
+<a href="nil.htm">NIL</a> is returned otherwise. In the case of
+two arguments, this has the effect of testing if 'expr1' is less than
+'expr2'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(&lt; 1 2) =&gt; T
+(&lt; 1 1) =&gt; NIL
+(&lt; -1.5 -1.4) =&gt; T
+(&lt; 1 2 3 4) =&gt; T
+(&lt; 1 2 3 2) =&gt; NIL
+(&lt; "a" "b") =&gt; <font color="#AA0000">error: bad argument type</font>
+(setq a 12 b 13.99) =&gt; 13.99 <font color="#008844">; set up A and B with values</font>
+(&lt; a b) =&gt; T
+(&lt; b a) =&gt; NIL
+</pre>
+
+<p>See <a href="setq.htm">setq</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/number-not-equal.htm b/docsrc/xlisp/xlisp-doc/reference/number-not-equal.htm
new file mode 100644
index 0000000..595836b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/number-not-equal.htm
@@ -0,0 +1,101 @@
+<html><head><title>XLISP /=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>/=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(/= <i>expr1</i> <i>expr2</i> ...)</nobr></dt>
+<dd><i>exprN </i> - a numeric expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the results of
+comparing the expressions are all true,
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The <nobr>'/=' [not-equal]</nobr> function takes an arbitrary number of
+numeric arguments. It checks to see if all the numeric arguments are
+different. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if
+the arguments are numerically not equivalent,
+<a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(/= 1 1) =&gt; NIL
+(/= 1 2) =&gt; T
+(/= 1 1.0) =&gt; NIL
+(/= 1 2 3) =&gt; T
+(/= 1 2 2) =&gt; NIL
+(/= "a" "b") =&gt; <font color="#AA0000">error: bad argument type</font>
+(setq a 1 b 12.4) =&gt; 12.4 <font color="#008844">; set up A and B with values</font>
+(/= a b) =&gt; NIL
+</pre>
+
+<p>See <a href="setq.htm">setq</a>.</p>
+
+<p><div class="box">
+
+<p><b>XLISP Bug</b></p>
+
+<pre class="example">
+(/= 1 2 3) =&gt; T <font color="#008844">; OK</font>
+(/= 1 2 3 2 1) =&gt; T <font color="#AA0000">; wrong</font>
+</pre>
+
+<p>This is only a problem for the '/=' function. <nobr>The bug</nobr> can be
+reproduced with <nobr>Nyquist 3.03</nobr> <nobr>in November 2010</nobr>.</p>
+
+</div></p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/number-not-greaterp.htm b/docsrc/xlisp/xlisp-doc/reference/number-not-greaterp.htm
new file mode 100644
index 0000000..c9401a4
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/number-not-greaterp.htm
@@ -0,0 +1,91 @@
+<html><head><title>XLISP &lt;=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>&lt;=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(&lt;= <i>expr1 expr2</i> ...)</nobr></dt>
+<dd><i>exprN</i> - a numeric expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the results of
+comparing the expressions are all true,
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The <nobr>'&lt;=' [less-than-or-equal]</nobr> function takes an arbitrary
+number of numeric arguments. <nobr>It checks</nobr> to see if all the
+numbers are monotonically <nobr>non-decreasing</nobr>.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if the arguments
+are numerically, and monotonically <nobr>non-decreasing</nobr>,
+<a href="nil.htm">NIL</a> is returned otherwise. <nobr>For two</nobr>
+arguments, this has the effect of testing if 'expr1' is less than or equal
+<nobr>to 'expr2'</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(&lt;= 1 1) =&gt; T
+(&lt;= 1 2) =&gt; T
+(&lt;= 2.0 1.99) =&gt; NIL
+(&lt;= 1 2 3 3) =&gt; T
+(&lt;= 1 2 3 3 2) =&gt; NIL
+(&lt;= "aa" "aa") =&gt; <font color="#AA0000">error: bad argument type</font>
+(setq a 12 b 99.9) =&gt; 99.9 <font color="#008844">; set up A and B with values</font>
+(&lt;= a b) =&gt; T
+(&lt;= b a) =&gt; NIL
+</pre>
+
+<p>See <a href="setq.htm">setq</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/number-not-lessp.htm b/docsrc/xlisp/xlisp-doc/reference/number-not-lessp.htm
new file mode 100644
index 0000000..c9626d8
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/number-not-lessp.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP &gt;=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>&gt;=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(&gt;= <i>expr1 expr2</i> ...)</nobr></dt>
+<dd><i>exprN</i> - a numeric expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the results of
+comparing the expressions are all true,
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The <nobr>'&gt;=' [greater-than-or-equal]</nobr> function takes an
+arbitrary number of numeric arguments. <nobr>It checks</nobr> to see if all
+the numbers are monotonically <nobr>non-increasing</nobr>.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr1' is the arguments
+are numerically, and monotonically <nobr>non-increasing</nobr>,
+<a href="nil.htm">NIL</a> is returned otherwise. <nobr>For two</nobr>
+arguments, this has the effect of testing if 'expr1' is greater than or
+equal <nobr>to 'expr2'</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(&gt;= 1 2) =&gt; NIL
+(&gt;= 1 1) =&gt; T
+(&gt;= -1.5 -1.4) =&gt; NIL
+(&gt;= 3 2 1) =&gt; T
+(&gt;= 3 2 2) =&gt; T
+(&gt;= 3 2 3) =&gt; NIL
+(&gt;= "aa" "abc") =&gt; <font color="#AA0000">error: bad argument type</font>
+(setq a 12 b 13.9) =&gt; 13.9 <font color="#008844">; set up A and B with values</font>
+(&gt;= a b) =&gt; NIL
+(&gt;= b a) =&gt; T
+</pre>
+
+<p>See <a href="setq.htm">setq</a>.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/numberp.htm b/docsrc/xlisp/xlisp-doc/reference/numberp.htm
new file mode 100644
index 0000000..37e994f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/numberp.htm
@@ -0,0 +1,78 @@
+<html><head><title>XLISP numberp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>numberp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(numberp <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the expression
+is a number, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'numberp' predicate function checks if an 'expr' is a number.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr' is an
+integer or floating point number, <a href="nil.htm">NIL</a> is
+returned otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(numberp 1) <font color="#008844">; returns T - integer</font>
+(numberp 1.2) <font color="#008844">; returns T - float</font>
+(numberp '1) <font color="#008844">; returns T - still an integer</font>
+(numberp #x034) <font color="#008844">; returns T - the readmacro produces an integer</font>
+
+(numberp 'a) <font color="#008844">; returns NIL - symbol</font>
+(numberp #\a) <font color="#008844">; returns NIL - character</font>
+(numberp NIL) <font color="#008844">; returns NIL - NIL</font>
+(numberp #(0 1 2)) <font color="#008844">; returns NIL - array</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#numberp">numberp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/object.htm b/docsrc/xlisp/xlisp-doc/reference/object.htm
new file mode 100644
index 0000000..5c6ede3
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/object.htm
@@ -0,0 +1,120 @@
+<html><head><title>XLISP object</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>object</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>object</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;object</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>'object' is an object <a href="class.htm">class</a>. An object
+is a composite structure that contains internal state information, methods
+[which respond to messages], a pointer to the object's
+<a href="class.htm">class</a> and a pointer to the object's
+super-class. XLISP contains two built in objects: 'object' and
+<a href="class.htm">class</a>. 'object' is the superclass for the
+<a href="class.htm">class</a> object.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(send object :show) <font color="#008844">; look at the object definition</font>
+
+ <font color="#008844">; example use of objects</font>
+(setq my-class (send class :new '(state))) <font color="#008844">; new class MY-CLASS with STATE</font>
+
+(send my-class :answer :isnew '() <font color="#008844">; set up initialization</font>
+ '((setq state nil) self))
+
+(send my-class :answer :set-it '(value) <font color="#008844">; create :SET-IT message</font>
+ '((setq state value)))
+
+(setq my-obj (send my-class :new)) <font color="#008844">; create MY-OBJ out of MY-CLASS</font>
+(send my-obj :set-it 5) <font color="#008844">; STATE is set to 5</font>
+</pre>
+
+<p><b>Object definition:</b> The internal definition of the 'object' object
+instance is:</p>
+
+<pre class="example">
+Object is #&lt;Object: #23fd8&gt;, Class is #&lt;Object: #23fe2&gt;
+ MESSAGES = ((:SHOW . #&lt;Subr-: #23db2&gt;)
+ (:CLASS . #&lt;Subr-: #23dee&gt;)
+ (:ISNEW . #&lt;Subr-: #23e2a&gt;))
+ IVARS = NIL
+ CVARS = NIL
+ CVALS = NIL
+ SUPERCLASS = NIL
+ IVARCNT = 0
+ IVARTOTAL = 0
+#&lt;Object: #23fd8&gt;
+</pre>
+
+<p>The <a href="class.htm">class</a> of 'object' is
+<a href="class.htm">class</a>. There is no superclass of 'object'.
+Remember that the location information [like #23fd8] varies from system to
+system, yours will probably look different.</p>
+
+<p><b>Built-in methods:</b> The built in methods in XLISP include:</p>
+
+<ul>
+<li><nobr><a href="keyword-answer.htm">:answer</a> - add a method to an object</nobr></li>
+<li><nobr><a href="keyword-class.htm">:class</a> - return the object's <a href="class.htm">class</a></nobr></li>
+<li><nobr><a href="keyword-isnew.htm">:isnew</a> - run initialization code on object</nobr></li>
+<li><nobr><a href="keyword-new.htm">:new</a> - create a new object [instance or <a href="class.htm">class</a>]</nobr></li>
+<li><nobr><a href="keyword-show.htm">:show</a> - show the internal state of the object</nobr></li>
+</ul>
+
+<p><b>Message structure:</b> The normal XLISP convention for a 'message' is
+to have a valid symbol preceeded by a colon like
+<a href="keyword-isnew.htm">:isnew</a> or ':my-message'. However, it is
+possible to define a 'message' that is a symbol without a colon, but this
+makes the code less readable.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-010.htm#object">object</a>
+class in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/objectp.htm b/docsrc/xlisp/xlisp-doc/reference/objectp.htm
new file mode 100644
index 0000000..22ea9b9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/objectp.htm
@@ -0,0 +1,72 @@
+<html><head><title>XLISP objectp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>objectp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(objectp expr)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the expression
+is an object, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'objectp' predicate function checks if the 'expr' is an object.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr' is
+an object, <a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(objectp object) <font color="#008844">; returns T</font>
+(objectp class) <font color="#008844">; returns T</font>
+(objectp NIL) <font color="#008844">; returns NIL</font>
+(objectp '(a b)) <font color="#008844">; returns NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#objectp">objectp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/oddp.htm b/docsrc/xlisp/xlisp-doc/reference/oddp.htm
new file mode 100644
index 0000000..fa71431
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/oddp.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP oddp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>oddp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(oddp <i>expr</i>)</dt>
+<dd><i>expr</i> - the integer numeric expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the integer is
+odd, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'oddp' predicate function checks to see if the number 'expr' is odd.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if the number is
+odd, <a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<p>An error is generated if the 'expr' is not a numeric expression:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<p>An error is generated if the 'expr' is a floating point number:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad floating point operation</font>
+</pre>
+
+<p>Zero is an even number.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(oddp 0) <font color="#008844">; returns NIL</font>
+(oddp 1) <font color="#008844">; returns T</font>
+(oddp 2) <font color="#008844">; returns NIL</font>
+(oddp -1) <font color="#008844">; returns T</font>
+(oddp -2) <font color="#008844">; returns NIL</font>
+
+(oddp 13.0) <font color="#008844">; error: bad floating point operation</font>
+(oddp 'a) <font color="#008844">; error: bad argument type</font>
+(setq a 3) <font color="#008844">; set value of A to 3</font>
+(oddp a) <font color="#008844">; returns T</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#oddp">oddp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/open-binary.htm b/docsrc/xlisp/xlisp-doc/reference/open-binary.htm
new file mode 100644
index 0000000..1707407
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/open-binary.htm
@@ -0,0 +1,103 @@
+<html><head><title>XLISP open-binary</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>open-binary</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(open-binary <i>file</i> [:direction <i>in-out</i>])</dt>
+<dd><i>file</i> - a string expression or symbol<br>
+<i>in-out</i> - an optional keyword symbol that must be either ':input' or
+':output'. The default is ':input'.<br>
+returns - a stream</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>open-binary</nobr>' function opens the 'file' for binary input
+or output. The 'file' may be a string expression or a symbol. Following the
+'file', there is an optional keyword, ':direction'. The argument following
+this is either ':input' or ':output' which specifies the direction of the
+file. <nobr>If no</nobr> ':direction' is specified, the default is ':input'.
+When 'file' is a string, you may specify a complete file location or
+extensions like &quot;/usr/local/bin/myfile.lsp&quot; or
+&quot;A:\LISP\TIM.BAT&quot;. <nobr>If the</nobr> file open was successful,
+then a file pointer of the following form is returned as the result:</p>
+
+<pre class="example">
+#&lt;File: #99999&gt;
+</pre>
+
+<p>If the file open was not successful, a <a href="nil.htm">NIL</a> is
+returned. <nobr>For an</nobr> input file, the file has to exist, or an error
+will be signaled.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p>This will create a file named FOO-FILE, because XLISP uppercases its
+symbols:</p>
+
+<pre class="example">
+(open-binary 'foo-file :direction :output)
+</pre>
+
+<p>This will create a file named 'foo-file' because UNIX doesn't
+uppercase its file names:</p>
+
+<pre class="example">
+(open-binary "foo-file" :direction :output)
+</pre>
+
+<p>So, if you are having trouble with opening and accessing files, check to
+make sure the file name is in the proper case.</p>
+
+<p>See also <a href="bigendianp.htm">bigendianp</a>,
+<nobr><a href="read-int.htm">read-int</a></nobr>,
+<nobr><a href="write-int.htm">write-int</a></nobr>,
+<nobr><a href="read-float.htm">read-float</a></nobr>,
+<nobr><a href="write-float.htm">write-float</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/open.htm b/docsrc/xlisp/xlisp-doc/reference/open.htm
new file mode 100644
index 0000000..fe2a925
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/open.htm
@@ -0,0 +1,117 @@
+<html><head><title>XLISP open</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>open</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(open <i>file</i> [:direction <i>in-out</i>])</dt>
+<dd><i>file</i> - a string expression or symbol<br>
+<i>in-out</i> - an optional keyword symbol that must be either ':input' or
+':output'. The default is ':input'.<br>
+returns - a stream</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'open' function opens the 'file' for input or output. The 'file' may
+be a string expression or a symbol. Following the 'file', there is an
+optional keyword, ':direction'. The argument following this is either
+':input' or ':output' which specifies the direction of the file. If no
+':direction' is specified, the default is ':input'. When 'file' is a string,
+you may specify a complete file location or extensions like
+&quot;/usr/local/bin/myfile.lsp&quot; or &quot;A:\LISP\TIM.BAT&quot;. If
+the file open was successful, then a file pointer of the following form is
+returned as the result:</p>
+
+<pre class="example">
+#&lt;File: #99999&gt;
+</pre>
+
+<p>If the file open was not successful, a
+<a href="nil.htm">NIL</a> is returned. For an input file, the
+file has to exist, or an error will be signaled.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq f (open 'mine :direction :output)) <font color="#008844">; create file named MINE</font>
+(print "hi" f) <font color="#008844">; returns "hi"</font>
+(close f) <font color="#008844">; file contains "hi" &lt;newline&gt;</font>
+(setq f (open 'mine :direction :input)) <font color="#008844">; open MYFILE for input</font>
+(read f) <font color="#008844">; returns "hi"</font>
+(close f) <font color="#008844">; close it</font>
+</pre>
+
+<p><b>File names:</b> In the PC and DOS world, all file names and extensions
+[&quot;foo.bat&quot;] are automatically made uppercase. In using XLISP, this
+means you don't have to worry about whether the name is &quot;foo.bat&quot;,
+&quot;FOO.BAT&quot; or even &quot;FoO.bAt&quot;, they will all work.
+However, in other file systems [UNIX in particular], uppercase and lowercase
+do make a difference:</p>
+
+<p>This will create a file named FOO-FILE in UNIX, because XLISP uppercases
+its symbols:</p>
+
+<pre class="example">
+(open 'foo-file :direction :output)
+</pre>
+
+<p>This will create a file named 'foo-file' because UNIX doesn't
+uppercase its file names:</p>
+
+<pre class="example">
+(open "foo-file" :direction :output)
+</pre>
+
+<p>So, if you are having trouble with opening and accessing files, check to
+make sure the file name is in the proper case.</p>
+
+<p><b>Common Lisp:</b> Common Lisp supports bidirectional files. So, porting
+Common Lisp code may be difficult to port if it uses these other file
+types.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-029.htm#open">open</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/or.htm b/docsrc/xlisp/xlisp-doc/reference/or.htm
new file mode 100644
index 0000000..9900bdd
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/or.htm
@@ -0,0 +1,87 @@
+<html><head><title>XLISP or</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>or</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(or [<i>expr1</i> ... ])</dt>
+<dd><i>exprN</i> - an expression<br>
+returns - <a href="nil.htm">NIL</a> if all expressions evaluate
+to <nobr><a href="nil.htm">NIL</a> ,</nobr> otherwise the value
+of the first non-<a href="nil.htm">NIL</a> expression<br>
+<b>Note:</b> evaluation of expressions stops after the first expression
+that does not evaluate to <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'or' special form evaluates a sequence of expressions and returns the
+effect of a logical 'inclusive-or' operation on the expressions. If all of
+the expressions are <nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> is returned as the result. Evaluation
+of the expressions will stop when an expression evaluates to something other
+than <nobr><a href="nil.htm">NIL</a> ,</nobr> none of the
+subsequent expressions will be evaluated. If there are no expressions, 'or'
+returns <a href="nil.htm">NIL</a> as its result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(or NIL NIL NIL) <font color="#008844">; returns NIL</font>
+(or NIL T NIL) <font color="#008844">; returns T</font>
+(or NIL (princ "hi") (princ "ho")) <font color="#008844">; prints hi and returns "hi"</font>
+(or T T T) <font color="#008844">; returns T</font>
+(or) <font color="#008844">; returns NIL</font>
+
+(setq a 5) (setq b 6) <font color="#008844">; set up A and B</font>
+(if (or (&lt; a b) (&lt; b a)) <font color="#008844">; if</font>
+ (print "not equal") <font color="#008844">; then</font>
+ (print "equal")) <font color="#008844">; else</font>
+ <font color="#008844">; prints "not equal"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-019.htm#or">or</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/peek-char.htm b/docsrc/xlisp/xlisp-doc/reference/peek-char.htm
new file mode 100644
index 0000000..8111cf4
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/peek-char.htm
@@ -0,0 +1,105 @@
+<html><head><title>XLISP peek-char</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>peek-char</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(peek-char [<i>skip-flag</i> [<i>source</i>]])</dt>
+<dd><i>skip-flag</i> - an optional expression, default is
+<a href="nil.htm">NIL</a><br>
+<i>source</i> - an optional source, must be a file pointer or stream, default
+is <a href="global-standard-input.htm">*standard-input*</a><br>
+returns - the character</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'peek-char' function looks at a single character from the specified
+'source'. The character looked-at is returned as an integer value for the
+result. If the 'skip-flag' expression is
+<nobr><a href="nil.htm">NIL</a> ,</nobr> then the next character
+will be looked-at, without advancing the position within the file. If the
+'skip-flag' expression is <nobr>non-<a href="nil.htm">NIL</a>
+,</nobr> then the next non-white-space character will be looked-at. This
+skipping does advance the position within the file. White-space characters
+include 'blank', 'tab' and 'new-line' characters. If 'skip-flag' is not
+used, no skipping will occur. The 'source' may be a file pointer or a
+stream. If there is no 'source',
+<a href="global-standard-input.htm">*standard-input*</a> is the default. If an
+end-of-file is encountered in the 'source', then
+<a href="nil.htm">NIL</a> will be returned as the result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq fp (open "f" :direction :output)) <font color="#008844">; create file "f"</font>
+(print 12 fp)
+(princ " 34" fp)
+(terpri fp)
+(close fp)
+
+(setq fp (open "f" :direction :input)) <font color="#008844">; open "f" for reading</font>
+(peek-char NIL fp) <font color="#008844">; returns #\1</font>
+(peek-char NIL fp) <font color="#008844">; returns #\1 - didn't advance</font>
+(read-char fp) <font color="#008844">; returns #\1 - force advance</font>
+(peek-char NIL fp) <font color="#008844">; returns #\2</font>
+(read-char fp) <font color="#008844">; returns #\2 - force advance</font>
+(peek-char NIL fp) <font color="#008844">; returns #\Newline</font>
+(peek-char T fp) <font color="#008844">; returns #\3 - skipped blanks</font>
+(read-line fp) <font color="#008844">; returns "34"</font>
+(close fp)
+</pre>
+
+<p><b>Common Lisp:</b> The XLISP and Common Lisp 'peek-char' functions are
+compatible for simple cases. They both allow for the optional 'skip-flag'
+and 'source'. However, in Common Lisp, there are additional parameters which
+occur right after 'source' that support various end-of-file operations and
+recursive calls. So, when porting from Common Lisp to XLISP, remember there
+are additional arguments in Common Lisp's 'peek-char' that are not supported
+in XLISP.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-029.htm#peek-char">peek-char</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/peek.htm b/docsrc/xlisp/xlisp-doc/reference/peek.htm
new file mode 100644
index 0000000..58e2cec
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/peek.htm
@@ -0,0 +1,86 @@
+<html><head><title>XLISP peek</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>peek</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsys.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(peek <i>address</i>)</dt>
+<dd><i>address</i> - an integer expression<br>
+returns - the value at the specified address as an integer</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'peek' function returns the internal memory value at the 'address'.
+The returned value is an integer.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq var 0) <font color="#008844">; set up VAR with 0</font>
+(address-of var) <font color="#008844">; returns 123224</font>
+(address-of 'var) <font color="#008844">; returns 161922</font>
+(peek (address-of var)) <font color="#008844">; returns 83951616</font>
+(peek (1+ (address-of var))) <font color="#008844">; returns 16777216</font>
+(peek (+ 2 (address-of var))) <font color="#008844">; returns 0 &lt;-- value of VAR</font>
+(setq var 14) <font color="#008844">; change the value to 14</font>
+(peek (+ 2 (address-of var))) <font color="#008844">; returns 14</font>
+(setq var 99) <font color="#008844">; change the value to 99</font>
+(peek (+ 2 (address-of var))) <font color="#008844">; returns 99</font>
+</pre>
+
+<p><b>Caution:</b> Be careful when modifying the internal state of XLISP. If
+you have modified it, it would be a good idea to exit XLISP and re-enter
+before doing any work you really want to retain.</p>
+
+<p><b>Caution:</b> It is possible to 'peek' and
+<a href="poke.htm">poke</a> not just XLISP's memory put other
+parts of your computer's memory. Be very careful when doing this. Also, in
+some computers, just looking at a memory location can cause things to
+happen, I/O locations fall in this category.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-031.htm#peek">peek</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/pi.htm b/docsrc/xlisp/xlisp-doc/reference/pi.htm
new file mode 100644
index 0000000..9be3a2a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/pi.htm
@@ -0,0 +1,66 @@
+<html><head><title>XLISP rrandom</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>rrandom</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>dspprims.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><b>pi</b></dt>
+<dd>returns - a floating point value of 3.14159265358979</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'pi' variable returns a floating point approximation of the
+<nobr>number 'pi'</nobr>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+pi =&gt; 3.14159265358979
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/plus.htm b/docsrc/xlisp/xlisp-doc/reference/plus.htm
new file mode 100644
index 0000000..b5e3984
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/plus.htm
@@ -0,0 +1,75 @@
+<html><head><title>XLISP + (variable)</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>+&nbsp; <font color="#444444">(variable)</font></h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>variable</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c, xlisp.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>&nbsp;+</dt>
+<dd>returns - the most recent input expression</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '+' variable is set to the most recent input expression.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq hi 'there) =&gt; THERE
++ =&gt; (SETQ HI (QUOTE THERE))
++ =&gt; +
+</pre>
+
+<p>See <a href="setq.htm">setq</a>.</p>
+
+<p><b>Note:</b> The '+' variable is for interactive programming. <nobr>It
+is</nobr> not recommended to use the '+' variable in program code.</p>
+
+<p>See also the
+<nobr><a href="../manual/xlisp.htm#command-loop">XLISP Command Loop</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/poke.htm b/docsrc/xlisp/xlisp-doc/reference/poke.htm
new file mode 100644
index 0000000..336ca39
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/poke.htm
@@ -0,0 +1,88 @@
+<html><head><title>XLISP poke</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>poke</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsys.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(poke <i>address expr</i>)</dt>
+<dd><i>address</i> - an integer expression<br>
+<i>expr</i> - an integer expression<br>
+returns - the value</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'poke' function writes the 'expr' at the internal memory value at the
+specified 'address'. The returned value is 'expr'. Be very careful with this
+function.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq var 0) <font color="#008844">; set up VAR with 0</font>
+(address-of var) <font color="#008844">; returns 123224</font>
+(address-of 'var) <font color="#008844">; returns 161922</font>
+(peek (address-of var)) <font color="#008844">; returns 83951616</font>
+(peek (1+ (address-of var))) <font color="#008844">; returns 16777216</font>
+(peek (+ 2 (address-of var))) <font color="#008844">; returns 0 &lt;-- value of VAR</font>
+(setq var 14) <font color="#008844">; change the value to 14</font>
+(peek (+ 2 (address-of var))) <font color="#008844">; returns 14</font>
+(poke (+ 2 (address-of var)) 1023) <font color="#008844">; POKE the value to 1023</font>
+(print var) <font color="#008844">; prints 1023</font>
+</pre>
+
+<p><b>Caution:</b> Be careful when modifying the internal state of XLISP. If
+you have modified it, it would be a good idea to exit XLISP and re-enter
+before doing any work you really want to retain.</p>
+
+<p><b>Caution:</b> It is possible to <a href="peek.htm">peek</a>
+and 'poke' not just XLISP's memory put other parts of your computer's
+memory. Be very careful when doing this. Also, in some computers, just
+looking at a memory location can cause things to happen, I/O locations fall
+in this category.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-031.htm#poke">poke</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/pop.htm b/docsrc/xlisp/xlisp-doc/reference/pop.htm
new file mode 100644
index 0000000..73165ca
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/pop.htm
@@ -0,0 +1,85 @@
+<html><head><title>XLISP pop</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>pop</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp macro</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>misc.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>pop</b> <i>list</i>)</dt>
+<dd><i>list</i> - a list<br>
+returns - the first element from the list</dd>
+</dl>
+
+</div></p>
+
+<p>'pop' is implemented as a Lisp macro:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">pop</font> (lis)
+ `(prog1 (car ,lis)
+ (setf ,lis (cdr ,lis))))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'pop' macro reads, removes and returns the first element from the
+list.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq stack '(a b c)) =&gt; (A B C)
+(pop stack) =&gt; A
+stack =&gt; (B C)
+(pop stack) =&gt; B
+stack =&gt; (C)
+(pop stack) =&gt; C
+stack =&gt; NIL
+(pop stack) =&gt; NIL
+stack =&gt; NIL
+</pre>
+
+<p>See <a href="setq.htm">setq</a>. See also the <a href="push.htm">push</a> macro.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/power.htm b/docsrc/xlisp/xlisp-doc/reference/power.htm
new file mode 100644
index 0000000..6df1216
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/power.htm
@@ -0,0 +1,77 @@
+<html><head><title>XLISP power</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>power</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>misc.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>power</b> <i>x y</i>)</nobr></dt>
+<dd><i>x</i>, <i>y</i> - two integer or floating point numbers<br>
+returns - <i>x</i> raised to the <i>y</i> power as a floating point number</dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, 'power' is implemented as a Lisp function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">power</font> (x y)
+ (exp (* (log (float x)) y)))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'power' function returns 'x' raised to the 'y' power as a floating
+point number.</nobr>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(power 2 8) =&gt; 256
+(power 4 .5) =&gt; 2.0
+</pre>
+
+<p>See also <a href="expt.htm">expt</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/pprint.htm b/docsrc/xlisp/xlisp-doc/reference/pprint.htm
new file mode 100644
index 0000000..7ab7021
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/pprint.htm
@@ -0,0 +1,94 @@
+<html><head><title>XLISP pprint</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>pprint</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlpp.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(pprint <i>expr</i> [<i>dest</i>])</dt>
+<dd><i>expr</i> - an expression to be pretty printed<br>
+<i>dest</i> - an optional destination, must be a file pointer or
+stream, default is <a href="global-standard-output.htm">*standard-output*</a><br>
+returns - always returns <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'pprint' function produces a pretty looking version of the 'expr' and
+prints it to the specified 'destination'. If 'expr' is an atom like a
+string, a symbol, a number, etc., 'pprint' will print it like
+<a href="print.htm">print</a>. If 'expr' is a list, it will perform
+indenting, as necessary. <a href="nil.htm">NIL</a> is always
+returned as the result of 'pprint'. The 'destination' may be a file pointer
+or a stream. If there is no 'destination' or it is
+<nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="global-standard-output.htm">*standard-output*</a> is the default.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(pprint 'a) <font color="#008844">; prints A returns NIL</font>
+(pprint "abcd") <font color="#008844">; prints "abcd" returns NIL</font>
+
+(pprint '(a-very-long-name (first list) (second list)))
+
+ <font color="#008844">; prints (A-VERY-LONG-NAME (FIRST LIST)</font>
+ <font color="#008844">; (SECOND LIST))</font>
+ <font color="#008844">; returns NIL</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that 'pprint' with a
+'destination' of <a href="nil.htm">NIL</a> will go to
+<a href="global-standard-output.htm">*standard-output*</a>. XLISP does not send the
+output to <a href="global-standard-output.htm">*standard-output*</a> with a
+'destination' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'destination' of
+<a href="t.htm">&nbsp;T&nbsp;</a> will be sent to
+*terminal-io*, which is not defined in XLISP by default. XLISP does not
+allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid argument
+for 'destination'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-027.htm#pprint">pprint</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/prin1.htm b/docsrc/xlisp/xlisp-doc/reference/prin1.htm
new file mode 100644
index 0000000..c0b8a7c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/prin1.htm
@@ -0,0 +1,94 @@
+<html><head><title>XLISP prin1</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>prin1</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c, xlprin.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(prin1 <i>expr</i> [<i>dest</i>])</dt>
+<dd><i>expr</i> - an expression<br>
+<i>dest</i> - an optional destination, must be a file pointer or
+stream, default is <a href="global-standard-output.htm">*standard-output*</a><br>
+returns - the expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'prin1' function prints the 'expr' to the specified 'destination'.
+The 'expr' is printed without a 'newline' character. If 'expr' is a string,
+it will be printed with quotes around the string. The 'expr' is returned as
+the result. The 'destination' may be a file pointer or a stream. If there is
+no 'destination', <a href="global-standard-output.htm">*standard-output*</a> is the
+default. The <a href="terpri.htm">terpri</a> function is used to
+terminate the print lines produced.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(prin1 'a) <font color="#008844">; prints A without #\Newline</font>
+(prin1 '(a b)) <font color="#008844">; prints (A B) without #\Newline</font>
+(prin1 2.5) <font color="#008844">; prints 2.5 without #\Newline</font>
+(prin1 "hi") <font color="#008844">; prints "hi" without #\Newline</font>
+
+(setq f (open "f" :direction :output)) <font color="#008844">; create file</font>
+(prin1 "hi" f) <font color="#008844">; returns "hi"</font>
+(prin1 1234 f) <font color="#008844">; returns 1234</font>
+(prin1 "he" f) <font color="#008844">; returns "he"</font>
+(close f) <font color="#008844">; file contains "hi"1234"he"</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that 'pprint' with a
+'destination' of <a href="nil.htm">NIL</a> will go to
+<a href="global-standard-output.htm">*standard-output*</a>. XLISP does not send the
+output to <a href="global-standard-output.htm">*standard-output*</a> with a
+'destination' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'destination' of
+<a href="t.htm">&nbsp;T&nbsp;</a> will be sent to
+*terminal-io*, which is not defined in XLISP by default. XLISP does not
+allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid argument
+for 'destination'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-027.htm#prin1">prin1</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/princ.htm b/docsrc/xlisp/xlisp-doc/reference/princ.htm
new file mode 100644
index 0000000..a3a095f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/princ.htm
@@ -0,0 +1,94 @@
+<html><head><title>XLISP princ</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>princ</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c, xlprin.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(princ <i>expr</i> [<i>dest</i>])</dt>
+<dd><i>expr</i> - an expression<br>
+<i>dest</i> - an optional destination, must be a file pointer or
+stream, default is <a href="global-standard-output.htm">*standard-output*</a><br>
+returns - the expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'princ' function prints the 'expr' to the specified 'destination'.
+The 'expr' is printed without a 'newline' character. If 'expr' is a string,
+it will not be printed with quotes around the string. The 'expr' is returned
+as the result. The 'destination' may be a file pointer or a stream. If there
+is no 'destination', <a href="global-standard-output.htm">*standard-output*</a> is
+the default. The <a href="terpri.htm">terpri</a> function is used to
+terminate the print lines produced.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(princ 'a) <font color="#008844">; prints A without #\Newline</font>
+(princ '(a b)) <font color="#008844">; prints (A B) without #\Newline</font>
+(princ 99) <font color="#008844">; prints 99 without #\Newline</font>
+(princ "hi") <font color="#008844">; prints hi without #\Newline</font>
+
+(setq f (open "f" :direction :output)) <font color="#008844">; create file</font>
+(princ "hi" f) <font color="#008844">; returns "hi"</font>
+(princ 727 f) <font color="#008844">; returns 727</font>
+(princ "ho" f) <font color="#008844">; returns "ho"</font>
+(close f) <font color="#008844">; file contains hi727ho</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that 'pprint' with a
+'destination' of <a href="nil.htm">NIL</a> will go to
+<a href="global-standard-output.htm">*standard-output*</a>. XLISP does not send the
+output to <a href="global-standard-output.htm">*standard-output*</a> with a
+'destination' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'destination' of
+<a href="t.htm">&nbsp;T&nbsp;</a> will be sent to
+*terminal-io*, which is not defined in XLISP by default. XLISP does not
+allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid argument
+for 'destination'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-027.htm#princ">princ</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/print.htm b/docsrc/xlisp/xlisp-doc/reference/print.htm
new file mode 100644
index 0000000..d714844
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/print.htm
@@ -0,0 +1,95 @@
+<html><head><title>XLISP print</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>print</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c, xlprin.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(print <i>expr</i> [<i>dest</i>])</dt>
+<dd><i>expr</i> - an expression<br>
+<i>dest</i> - an optional destination, must be a file pointer or
+stream, default is <a href="global-standard-output.htm">*standard-output*</a><br>
+returns - the expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'print' function prints the 'expr' to the specified 'destination'.
+The 'expr' is printed followed by a 'newline' character. If 'expr' is a
+string, it will be printed with quotes around the string. The 'expr' is
+returned as the result. The 'destination' may be a file pointer or a stream.
+If there is no 'destination',
+<a href="global-standard-output.htm">*standard-output*</a> is the default.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(print 'a) <font color="#008844">; prints A with #\Newline</font>
+(print '(a b)) <font color="#008844">; prints (A B) with #\Newline</font>
+(print 99) <font color="#008844">; prints 99 with #\Newline</font>
+(print "hi") <font color="#008844">; prints "hi" with #\Newline</font>
+
+(setq f (open "f" :direction :output)) <font color="#008844">; create file</font>
+(print "hi" f) <font color="#008844">; returns "hi"</font>
+(print 727 f) <font color="#008844">; returns 727</font>
+(print "ho" f) <font color="#008844">; returns "ho"</font>
+(close f) <font color="#008844">; file contains "hi"#\Newline</font>
+ <font color="#008844">; 727#\Newline</font>
+ <font color="#008844">; "ho"#\Newline</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that 'pprint' with a
+'destination' of <a href="nil.htm">NIL</a> will go to
+<a href="global-standard-output.htm">*standard-output*</a>. XLISP does not send the
+output to <a href="global-standard-output.htm">*standard-output*</a> with a
+'destination' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'destination' of
+<a href="t.htm">&nbsp;T&nbsp;</a> will be sent to
+*terminal-io*, which is not defined in XLISP by default. XLISP does not
+allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid argument
+for 'destination'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-027.htm#print">print</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/profile.htm b/docsrc/xlisp/xlisp-doc/reference/profile.htm
new file mode 100644
index 0000000..0c3cf6a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/profile.htm
@@ -0,0 +1,85 @@
+<html><head>
+
+<title>Profiling</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>profile</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsys.c, xleval.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<a name="profile"></a>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>profile</b> <i>flag</i>) - turn profiling on or off</dt>
+<dd><i>flag</i> - NIL turns profiling off, otherwise on<br>
+returns - the previous state of profiling</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The <nobr>Xlisp 2.0</nobr> release has been extended with a profiling
+facility, which counts how many times and where <a href="eval.htm">eval</a>
+is executed. <nobr>A separate</nobr> count is maintained for each named
+function, closure, or macro, and a count indicates an
+<a href="eval.htm">eval</a> in the immediately [lexically] enclosing named
+function, closure, or macro. Thus, the count gives an indication of the
+amount of time spent in a function, not counting nested function calls.</p>
+
+<p>The list of all functions executed is maintained on the global *profile*
+variable. These functions in turn have *profile* properties, which maintain
+the counts. The profile system merely increments counters and puts symbols
+on the *profile* list. <nobr>It is</nobr> up to the user to initialize data
+and gather results. Profiling is turned on or off with the 'profile'
+function.</p>
+
+<p>Unfortunately, methods cannot be profiled with this facility.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/reference/prog-star.htm b/docsrc/xlisp/xlisp-doc/reference/prog-star.htm
new file mode 100644
index 0000000..98ba7b1
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/prog-star.htm
@@ -0,0 +1,101 @@
+<html><head><title>XLISP prog*</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>prog*</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(prog* ([<i>binding</i> ... ]) [<i>expr</i> ... ])</dt>
+<dd><i>binding</i> - a variable binding which is can take one of
+<dl><dd><i>symbol</i><br>
+(<i>symbol init-expr</i>)</dd>
+<dl><dd><i>symbol</i> - a symbol<br>
+<i>init-expr</i> - an initialization expression for <i>symbol</i></dd></dl></dl>
+<i>expr</i> - expressions comprising the body of the loop which may contain
+<a href="return.htm">return</a>s,
+<a href="go.htm">go</a>s or tags for
+<a href="go.htm">go</a><br>
+returns - <a href="nil.htm">NIL</a> or the argument passed to
+the <a href="return.htm">return</a> function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'prog*' special form is basically a 'block' construct that contains
+symbols with optional initializations and a block of code [expressions] to
+evaluate. The 'prog*' special form evaluates its initializations in
+sequential order as opposed to <a href="">prog</a> which does it in no
+specified order. The first form after the 'prog*' is the 'binding' form. It
+contains a series of 'symbols' or 'bindings'. The 'binding' is a 'symbol'
+followed by an initialization expression 'init-expr'. If there is no
+'init-expr', the 'symbol' will be initialized to
+<a href="nil.htm">NIL</a>. The order of execution of the bindings
+is sequential. If a <a href="return.htm">return</a> form is
+evaluated, its value will be returned. Otherwise,
+<a href="nil.htm">NIL</a> is returned. When the 'prog*' is
+finished execution, the 'symbols' that were defined will no longer exist or
+retain their values.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(prog* (i j) <font color="#008844">; PROG* with vars I and J</font>
+ (print i) (print j)) <font color="#008844">; prints NIL NIL returns NIL</font>
+
+(prog* ((i 1) (j 2)) <font color="#008844">; PROG* with vars I and J</font>
+ (print i) (print j)
+ (return (+ i j))) <font color="#008844">; prints 1 2 returns 3</font>
+
+(prog* () (print "hello")) <font color="#008844">; prints "hello" returns NIL</font>
+
+(prog ((i 1) (j (+ i 1))) <font color="#008844">; PROG won't work due to order</font>
+ (print (+ i j)) ) <font color="#008844">; error: unbound variable - I</font>
+
+(prog* ((i 1) (j (+ i 1))) <font color="#008844">; PROG* will work due to order</font>
+ (print (+ i j)) ) <font color="#008844">; prints 3 returns NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-021.htm#prog*">prog*</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/prog.htm b/docsrc/xlisp/xlisp-doc/reference/prog.htm
new file mode 100644
index 0000000..ea1d29c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/prog.htm
@@ -0,0 +1,96 @@
+<html><head><title>XLISP prog</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>prog</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(prog ([<i>binding</i> ... ]) [<i>expr</i> ... ])</dt>
+<dd><i>binding</i> - a variable binding which is can take one of
+<dl><dd><i>symbol</i><br>
+(<i>symbol init-expr</i>)</dd>
+<dl><dd><i>symbol</i> - a symbol<br>
+<i>init-expr</i> - an initialization expression for <i>symbol</i></dd></dl></dl>
+<i>expr</i> - expressions comprising the body of the loop which may contain
+<a href="return.htm">return</a>s,
+<a href="go.htm">go</a>s or tags for
+<a href="go.htm">go</a><br>
+returns - <a href="nil.htm">NIL</a> or the argument passed to
+the <a href="return.htm">return</a> function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'prog' special form is basically a 'block' construct that contains
+symbols with optional initializations and a block of code [expressions] to
+evaluate. The 'prog' special form evaluates its initializations in no
+specified order, as opposed to <a href="prog-star.htm">prog*</a> which
+does it sequential order. The first form after the 'prog' is the 'binding'
+form. It contains a series of 'symbols' or 'bindings'. The 'binding' is a
+'symbol' followed by an initialization expression 'init-expr'. If there is
+no 'init-expr', the 'symbol' will be initialized to
+<a href="nil.htm">NIL</a>. There is no specification as to the
+order of execution of the bindings or the step expressions, except that they
+happen all together. If a <a href="return.htm">return</a> form is
+evaluated, its value will be returned. Otherwise,
+<a href="nil.htm">NIL</a> is returned. When 'prog' is finished
+execution, the 'symbols' that were defined will no longer exist or retain
+their values.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(prog () (print "hello")) <font color="#008844">; prints "hello" returns NIL</font>
+
+(prog (i j) <font color="#008844">; PROG with vars I and J</font>
+ (print i) (print j)) <font color="#008844">; prints NIL NIL returns NIL</font>
+
+(prog ((i 1) (j 2)) <font color="#008844">; PROG with vars I and J</font>
+ (print i) (print j)
+ (return (+ i j))) <font color="#008844">; prints 1 2 returns 3</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-021.htm#prog">prog</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/prog1.htm b/docsrc/xlisp/xlisp-doc/reference/prog1.htm
new file mode 100644
index 0000000..d56a1f0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/prog1.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP prog1</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>prog1</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(<i>prog1</i> [<i>expr1 expr2</i> ... ])</dt>
+<dd><i>exprN</i> - expressions comprising the body of the loop<br>
+returns - the value of the first expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'prog1' special form is basically a 'block' construct that contains a
+block of code [expressions] to evaluate. The value of the first expression
+'expr1' will be returned as the result of 'prog1'. If there is no 'expr1',
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(prog1 (print "hi") (print "ho")) <font color="#008844">; prints "hi" "ho" returns "hi"</font>
+(prog1) <font color="#008844">; returns NIL</font>
+(prog1 'a) <font color="#008844">; returns A</font>
+(prog1 "hey" (print "ho")) <font color="#008844">; prints "ho" returns "hey"</font>
+</pre>
+
+<p><b>Note:</b> 'prog1',
+<nobr><a href="prog2.htm">prog2</a> ,</nobr>
+<a href="progn.htm">progn</a> and
+<a href="progv.htm">progv</a> do not allow the use of
+<a href="return.htm">return</a> or
+<a href="go.htm">go</a> or tags for
+<a href="go.htm">go</a>.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-021.htm#prog1">prog1</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/prog2.htm b/docsrc/xlisp/xlisp-doc/reference/prog2.htm
new file mode 100644
index 0000000..8ed5592
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/prog2.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP prog2</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>prog2</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(<i>prog2</i> [<i>expr1 expr2</i> ... ])</dt>
+<dd><i>exprN</i> - expressions comprising the body of the loop<br>
+returns - the value of the second expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'prog2' special form is basically a 'block' construct that contains a
+block of code [expressions] to evaluate. The value of the second expression
+'expr2' will be returned as the result of 'prog2'. If there is no 'expr2',
+'expr1' is returned. If there is no 'expr1',
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(prog2 (print "hi") (print "ho")) <font color="#008844">; prints "hi" "ho" returns "ho"</font>
+(prog2) <font color="#008844">; returns NIL</font>
+(prog2 (print "hi")) <font color="#008844">; prints "hi" returns "hi"</font>
+(prog2 (print "ho") "hey") <font color="#008844">; prints "ho" returns "hey"</font>
+(prog2 'a 'b 'c) <font color="#008844">; returns B</font>
+</pre>
+
+<p><b>Note:</b> <nobr><a href="prog1.htm">prog1</a> ,</nobr>
+'prog2',
+<a href="progn.htm">progn</a> and
+<a href="progv.htm">progv</a> do not allow the use of
+<a href="return.htm">return</a> or
+<a href="go.htm">go</a> or tags for
+<a href="go.htm">go</a>.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-021.htm#prog2">prog2</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/progn.htm b/docsrc/xlisp/xlisp-doc/reference/progn.htm
new file mode 100644
index 0000000..9cb28a3
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/progn.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP progn</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>progn</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c, xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(progn [expr1 expr2 ... ])</dt>
+<dd><i>exprN</i> - expressions comprising the body of the loop<br>
+returns - the value of the last expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'progn' special form is basically a 'block' construct that contains a
+block of code [expressions] to evaluate. The value of the last expression
+'exprN' will be returned as the result of 'progn'. If there are no 'exprs',
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(progn (print "hi") (print "ho")) <font color="#008844">; prints "hi" "ho" returns "ho"</font>
+(progn) <font color="#008844">; returns NIL</font>
+(progn "hey" (print "ho")) <font color="#008844">; prints "ho" returns "ho"</font>
+(progn 'a) <font color="#008844">; returns A</font>
+(progn 'a 'b 'c) <font color="#008844">; returns C</font>
+</pre>
+
+<p><b>Note:</b> <nobr><a href="prog1.htm">prog1</a> ,</nobr>
+<nobr><a href="prog2.htm">prog2</a> ,</nobr>
+'progn' and
+<a href="progv.htm">progv</a> do not allow the use of
+<a href="return.htm">return</a> or
+<a href="go.htm">go</a> or tags for
+<a href="go.htm">go</a>.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-021.htm#progn">progn</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/progv.htm b/docsrc/xlisp/xlisp-doc/reference/progv.htm
new file mode 100644
index 0000000..47ccd84
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/progv.htm
@@ -0,0 +1,133 @@
+<html><head><title>XLISP progv</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>progv</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>progv</b> <i>symbols values</i> [<i>expr1 expr2</i> ... ])</dt>
+<dd><i>symbols</i> - a list of symbols to be bound<br>
+<i>values</i> - a list of values to be bound to symbols<br>
+<i>exprN</i> - expressions for the body of the loop<br>
+returns - the value of the last expression</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'progv' special form is basically a 'block' construct that contains a
+block of code [expressions] to evaluate. 'progv' is different from
+<nobr><a href="prog1.htm">prog1</a></nobr>, <a href="prog2.htm">prog2</a>
+and <a href="progn.htm">progn</a> in that it contains a pair of lists,
+'symbols' and 'values'. Before evaluating the expressions, 'progv'
+will dynamically bind the 'values' to the corresponding 'symbols'.
+<nobr>If there</nobr> are too many 'symbols' for the 'values', the 'symbols'
+with no corresponding 'values' will be bound to <a href="nil.htm">NIL</a>.
+<nobr>The variables</nobr> will be unbound after the execution of 'progv'.
+<nobr>The value</nobr> of the last 'expr' will be returned as the result of
+'progv'. <nobr>If there</nobr> are no 'exprs',
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+&gt; (progv '(var) '(2)
+ (print var)
+ (print "two"))
+2 <font color="#008844">; output of PRINT</font>
+"two" <font color="#008844">; output of PRINT</font>
+"two" <font color="#008844">; return value</font>
+
+&gt; (setq a "beginning") <font color="#008844">; initialize A</font>
+"beginning"
+
+&gt; (progv '(a) '(during) <font color="#008844">; bind A to a new value</font>
+ (print a))
+DURING <font color="#008844">; output of PRINT</font>
+DURING <font color="#008844">; return value restore A the original value</font>
+
+&gt; (print a)
+"beginning" <font color="#008844">; prints the original value</font>
+"beginning"
+
+&gt; (progv '(no-way) '(no-how))
+NIL
+
+&gt; (progv)
+<font color="#AA0000">error: too few arguments</font>
+</pre>
+
+<p><b>Note:</b> 'progv' is different from
+<nobr><a href="prog.htm">prog</a></nobr>, which allows symbols and
+initialization forms, in that 'progv' allows its 'symbols' and 'values' to
+be evaluated. This allows you to pass in forms that generate the 'symbols'
+and their 'values'.</p>
+
+<p><b>Note:</b> <nobr><a href="prog1.htm">prog1</a></nobr>,
+<nobr><a href="prog2.htm">prog2</a></nobr>, <a href="progn.htm">progn</a>
+and 'progv' do not allow the use of <a href="return.htm">return</a> or
+<a href="go.htm">go</a> or tags for <a href="go.htm">go</a>.</p>
+
+<p><b>Important:</b> In contrast to all other binding constructs, 'progv'
+binds global variables and not lexical variables, so 'progv' behaves
+like:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">progv</font> (symbols values &amp;rest body) <font color="#008844">; this function does</font>
+ (push symbol-values <font color="#AA5500">*internal-stack*</font>) <font color="#008844">; not really work,</font>
+ (setq symbols values) <font color="#008844">; it only demonstates</font>
+ (prog1 <font color="#008844">; the principle</font>
+ (eval body)
+ (setq symbol-values (pop <font color="#AA5500">*internal-stack*</font>))))
+</pre>
+
+<p>Variables bound by 'progv' can be manipulated by global functions
+including <nobr><a href="symbol-value.htm">symbol-value</a></nobr>.
+<nobr>All changes</nobr> to the 'progv' variables by other functions, called
+in the 'progv' body, will be lost after 'progv' is finished, because the
+original value from the beginning of 'progv' will be restored. This can be
+good or bad, depending on the situation.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/psetq.htm b/docsrc/xlisp/xlisp-doc/reference/psetq.htm
new file mode 100644
index 0000000..dea8f74
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/psetq.htm
@@ -0,0 +1,78 @@
+<html><head><title>XLISP psetq</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>psetq</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(psetq [symbol expr] ... )</dt>
+<dd><i>symbol</i> - un-evaluated symbol<br>
+<i>expr</i> - value for <i>symbol</i><br>
+returns - the value from the last <i>expr</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>'psetq' sets 'expr' as the value of 'symbol'. There can be several pairs
+of assignment. 'psetq' performs these assignments in parallel, the 'symbols'
+are not assigned new values until all the 'exprs' have been evaluated.
+'psetq' returns the value from the last 'expr' as it's result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(psetq a 1) <font color="#008844">; symbol A gets value 1</font>
+(psetq b '(a b c)) <font color="#008844">; symbol B gets value (A B C)</font>
+(psetq mynum (+ 3 4)) <font color="#008844">; symbol MYNUM gets value 7</font>
+
+(setq goo 'ber) <font color="#008844">; returns BER</font>
+(setq num 1) <font color="#008844">; returns 1</font>
+(psetq goo num num goo) <font color="#008844">; returns BER</font>
+(print goo) <font color="#008844">; returns 1</font>
+(print num) <font color="#008844">; returns BER</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#psetq">psetq</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/push.htm b/docsrc/xlisp/xlisp-doc/reference/push.htm
new file mode 100644
index 0000000..d649432
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/push.htm
@@ -0,0 +1,83 @@
+<html><head><title>XLISP push</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>push</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp macro</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>misc.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>push</b> <i>expr list</i>)</dt>
+<dd><i>expr</i> - an expression<br>
+<i>list</i> - a list<br>
+returns - the new value of <i>list</i></dd>
+</dl>
+
+</div></p>
+
+<p>'push' is implemented as a Lisp macro:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">push</font> (val lis)
+ `(setf ,lis (cons ,val ,lis)))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'push' macro stores the value of the expression to the front of the
+list and returns the list.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq lst nil) =&gt; NIL
+(push 1 lst) =&gt; (1)
+lst =&gt; (1)
+(push 2 lst) =&gt; (2 1)
+lst =&gt; (2 1)
+(push 3 lst) =&gt; (3 2 1)
+lst =&gt; (3 2 1)
+</pre>
+
+<p>See <a href="setq.htm">setq</a>. See also the <a href="pop.htm">pop</a> macro.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/putprop.htm b/docsrc/xlisp/xlisp-doc/reference/putprop.htm
new file mode 100644
index 0000000..7711bf2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/putprop.htm
@@ -0,0 +1,108 @@
+<html><head><title>XLISP putprop</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>putprop</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(putprop <i>symbol value property</i>)</dt>
+<dd><i>symbol</i> - the symbol with a property list<br>
+<i>value</i> - the value to be assigned to the property<br>
+<i>property</i> - the property name being changed or added<br>
+returns - the property value</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'putprop' function sets the value of the 'property' in the 'symbol'.
+If the 'property' does not exist, the 'property' is added to the property
+list. The 'symbol' must be an existing symbol. The 'value' may be a single
+value or a list.</p>
+
+<p>Property lists are lists attached to any user defined variables. The
+lists are in the form of:</p>
+
+<pre class="example">
+(<font color="#008844"><i>name1 val1 name2 val2</i></font> ... )
+</pre>
+
+<p>Any number of properties may be attached to a single variable.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq person 'bobby) <font color="#008844">; create a var with a value</font>
+(putprop person 'boogie 'last-name) <font color="#008844">; add a LAST-NAME property</font>
+(putprop person 'disc-jockey 'job) <font color="#008844">; add a JOB property</font>
+
+(get person 'last-name) <font color="#008844">; retrieve LAST-NAME - boogie</font>
+(get person 'job) <font color="#008844">; retrieve JOB - disc-jockey</font>
+(get person 'height) <font color="#008844">; non-existant - returns NIL</font>
+
+(putprop person '(10 20 30) 'stats) <font color="#008844">; add STATS - a list</font>
+(get person 'stats) <font color="#008844">; retrieve STATS - (10 20 30)</font>
+</pre>
+
+<p><b>Note:</b> You can set a property to the value
+<a href="nil.htm">NIL</a>. However, this
+<a href="nil.htm">NIL</a> value is indistinguishable from the
+<a href="nil.htm">NIL</a> returned when a property does not
+exist.</p>
+
+<p><b>Common Lisp:</b> Common LISP does not have a 'putprop' function. It
+uses <a href="setf.htm">setf</a> to achieve this functionality.
+Porting from Common Lisp to XLISP will work fine since XLISP supports the <a
+href="setf.htm">setf</a> modifications of property lists as well
+as the <a href="get.htm">get</a> function to retrieve property
+values from symbol names. Porting from XLISP to Common Lisp will require
+translating 'putprop' into <a href="setf.htm">setf</a> forms.</p>
+
+<p><b>Caution:</b> In XLISP, the order of 'putprop' arguments is 'symbol',
+'value', 'property'. This is different from many other Lisps which normally
+use 'symbol', 'property', 'value'. Be careful when porting existing Lisp
+code.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-014.htm#putprop">putprop</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/quit.htm b/docsrc/xlisp/xlisp-doc/reference/quit.htm
new file mode 100644
index 0000000..1710d92
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/quit.htm
@@ -0,0 +1,69 @@
+<html><head><title>XLISP quit</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>quit</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsys.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(quit)</dt>
+<dd>returns - never returns</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'quit' function causes the current XLISP session to be terminated.
+<nobr>It never</nobr> returns.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(quit) <font color="#008844">; never returns</font>
+</pre>
+
+<p><b>Note:</b> When XLISP is exited, any
+<a href="dribble.htm">dribble</a> transcript file is automatically
+closed. However, other open files are not closed, and so may lose some
+information.</p>
+
+<p>See also <a href="quit.htm">exit</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/quote.htm b/docsrc/xlisp/xlisp-doc/reference/quote.htm
new file mode 100644
index 0000000..8a84180
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/quote.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP quote</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>quote</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(quote <i>expr</i>)</dt>
+<dl><i>expr</i> - an expression<br>
+returns - the unevaluated expression</dl>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'quote' function returns the 'expr' unevaluated.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+my-var <font color="#008844">; error: unbound variable</font>
+(quote my-var) <font color="#008844">; returns MY-VAR</font>
+my-var <font color="#008844">; still error: unbound variable</font>
+(set (quote my-var) 111) <font color="#008844">; give MY-VAR a value, make it exist</font>
+my-var <font color="#008844">; returns 111</font>
+(quote my-var) <font color="#008844">; returns MY-VAR</font>
+
+<font color="#008844">;; Same as above but using the ' read macro for quote</font>
+
+new-var <font color="#008844">; error: unbound variable</font>
+'new-var <font color="#008844">; returns NEW-VAR</font>
+new-var <font color="#008844">; still error: unbound variable</font>
+(setq new-var 222) <font color="#008844">; give NEW-VAR a value, make it exist</font>
+new-var <font color="#008844">; returns 222</font>
+'new-var <font color="#008844">; returns NEW-VAR</font>
+</pre>
+
+<p><b>Read macro:</b> XLISP supports the
+<nobr><a href="../manual/xlisp-man-008.htm#quote">read macro</a></nobr>
+of a single quote as a short-hand method of writing the 'quote' function.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-012.htm#quote">quote</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/random.htm b/docsrc/xlisp/xlisp-doc/reference/random.htm
new file mode 100644
index 0000000..d697135
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/random.htm
@@ -0,0 +1,86 @@
+<html><head><title>XLISP random</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>random</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(random <i>expr</i>)</dt>
+<dd><i>expr</i> - integer number or expression<br>
+returns - a random number between 0 and <nobr><i>expr</i> - 1.</nobr></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'random' function generates and returns a random number between 0 and
+<nobr>'expr' - 1.</nobr> If 'expr' is negative, the number range is forced
+to be positive.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(random 100) <font color="#008844">; returns 7</font>
+(random 100) <font color="#008844">; returns 49</font>
+(random 100) <font color="#008844">; returns 73</font>
+(random -100) <font color="#008844">; returns 58</font>
+(random 100.01) <font color="#008844">; error: bad floating point operation</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp allows an optional 'state' parameter,
+which is not supported in XLISP. Also, Common LISP allows floating point
+numbers, which XLISP does not support.</p>
+
+<p><b>Note:</b> This function is an extension of the XLISP system. It is
+provided in the 'msstuff.c' source code file. If your XLISP system is built
+for an IBM PC and compatibles, this function will work. If your system is
+built on UNIX or some other operating system, it will need the code in the
+corresponding 'stuff.c' file.</p>
+
+<p><b>Nyquist:</b> As far as I know the Nyquist 'random' function works on
+all systems. See also the Nyquist
+<a href="xlisp-man-033.htm#rrandom">rrandom</a> function.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#random">random</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/read-byte.htm b/docsrc/xlisp/xlisp-doc/reference/read-byte.htm
new file mode 100644
index 0000000..4047ae6
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/read-byte.htm
@@ -0,0 +1,100 @@
+<html><head><title>XLISP read-byte</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>read-byte</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(read-byte [<i>source</i>])</dt>
+<dd><i>source</i> - an optional source, must be a file pointer or stream,
+default is <a href="global-standard-input.htm">*standard-input*</a><br>
+returns - the byte as an integer</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'read-byte' function reads a single character from the specified
+'source'. The character read is returned as an integer value for the result.
+The 'source' may be a file pointer or a stream. If there is no 'source',
+<a href="global-standard-input.htm">*standard-input*</a> is the default. If an
+end-of-file is encountered in the 'source', then
+<a href="nil.htm">NIL</a> will be returned as the result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq fp (open "f" :direction :output)) <font color="#008844">; set up file</font>
+(print 12.34 fp)
+(close fp)
+
+(setq fp (open "f" :direction :input)) <font color="#008844">; now read the file</font>
+(read-byte fp) <font color="#008844">; returns 49 - equals "1"</font>
+(read-byte fp) <font color="#008844">; returns 50 - equals "2"</font>
+(read-byte fp) <font color="#008844">; returns 46 - equals "."</font>
+(read-byte fp) <font color="#008844">; returns 51 - equals "3"</font>
+(read-byte fp) <font color="#008844">; returns 52 - equals "4"</font>
+(read-byte fp) <font color="#008844">; returns 10 - equals "\n"</font>
+(read-byte fp) <font color="#008844">; returns NIL - empty</font>
+(close fp)
+</pre>
+
+<p><b>Common Lisp:</b> The XLISP and Common Lisp 'read-byte' functions are
+compatible for simple cases. They both allow for the optional 'source'.
+However, in Common Lisp, there are additional parameters which occur right
+after 'source'. So, when porting from Common Lisp to XLISP, remember there
+are additional arguments in Common Lisp's 'read-byte' function.</p>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that 'read' operations with a
+'source' of <a href="nil.htm">NIL</a> will come from
+<a href="global-standard-input.htm">*standard-input*</a>. XLISP does not read the
+input from <a href="global-standard-input.htm">*standard-input*</a> with a
+'source' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'source' of <a href="t.htm">&nbsp;T&nbsp;</a>
+will read from *terminal-io* which is not defined in XLISP by default. XLISP
+does not allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid
+argument for 'source'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-029.htm#read-byte">read-byte</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/read-char.htm b/docsrc/xlisp/xlisp-doc/reference/read-char.htm
new file mode 100644
index 0000000..476763b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/read-char.htm
@@ -0,0 +1,100 @@
+<html><head><title>XLISP read-char</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>read-char</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(read-char [<i>source</i>])</dt>
+<dd><i>source</i> - an optional source, must be a file pointer or stream,
+default is <a href="global-standard-input.htm">*standard-input*</a><br>
+returns - the character</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'read-char' function reads a single character from the specified
+'source'. The character read is returned as a single character value for
+the result. The 'source' may be a file pointer or a stream. If there is no
+'source', <a href="global-standard-input.htm">*standard-input*</a> is the default.
+If an end-of-file is encountered in the 'source', then
+<a href="nil.htm">NIL</a> will be returned as the result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq fp (open "f" :direction :output)) <font color="#008844">; set up file</font>
+(print 12.34 fp)
+(close fp)
+
+(setq fp (open "f" :direction :input)) <font color="#008844">; now read the file</font>
+(read-char fp) <font color="#008844">; returns #\1</font>
+(read-char fp) <font color="#008844">; returns #\2</font>
+(read-char fp) <font color="#008844">; returns #\.</font>
+(read-char fp) <font color="#008844">; returns #\3</font>
+(read-char fp) <font color="#008844">; returns #\4</font>
+(read-char fp) <font color="#008844">; returns #\Newline</font>
+(read-char fp) <font color="#008844">; returns NIL - empty</font>
+(close fp)
+</pre>
+
+<p><b>Common Lisp:</b> The XLISP and Common Lisp 'read-char' functions are
+compatible for simple cases. They both allow for the optional 'source'.
+However, in Common Lisp, there are addition parameters which occur right
+after 'source'. So, when porting from Common Lisp to XLISP, remember there
+are additional arguments in Common Lisp's 'read-char' function.</p>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that 'read' operations with a
+'source' of <a href="nil.htm">NIL</a> will come from
+<a href="global-standard-input.htm">*standard-input*</a>. XLISP does not read the
+input from <a href="global-standard-input.htm">*standard-input*</a> with a
+'source' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'source' of <a href="t.htm">&nbsp;T&nbsp;</a>
+will read from *terminal-io* which is not defined in XLISP by default. XLISP
+does not allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid
+argument for 'source'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-029.htm#read-char">read-char</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/read-float.htm b/docsrc/xlisp/xlisp-doc/reference/read-float.htm
new file mode 100644
index 0000000..44b52e7
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/read-float.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP read-float</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>read-float</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(read-float [<i>stream</i> [<i>length</i>]])</dt>
+<dd><i>stream</i> - the input stream (default is standard input)<br>
+<i>length</i> - the length of the float in bytes [default is 4,
+legal values are -4, -8, 4, and 8]<br>
+returns - the float</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>read-float</nobr>' function reads a binary floating point
+number from an input stream, created by the
+<nobr><a href="open-binary.htm">open-binary</a></nobr> function.</p>
+
+<p><b>Note:</b> Integers and floats are assumed to be
+<nobr>big-endian</nobr> [<nobr>high-order</nobr> byte first] and signed,
+regardless of the platform. <nobr>To read</nobr> <nobr>little-endian</nobr>
+format, use a negative number for the length, e.g. '-4' indicates a
+<nobr>4-bytes</nobr>, <nobr>low-order</nobr> byte first. The file should be
+opened in binary mode.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p>See also <nobr><a href="read-int.htm">read-int</a></nobr>,
+<nobr><a href="write-int.htm">write-int</a></nobr>,
+<nobr><a href="write-float.htm">write-float</a></nobr>,
+<nobr><a href="bigendianp.htm">bigendianp</a></nobr>,
+<nobr><a href="open-binary.htm">open-binary</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/read-int.htm b/docsrc/xlisp/xlisp-doc/reference/read-int.htm
new file mode 100644
index 0000000..15aa9d5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/read-int.htm
@@ -0,0 +1,78 @@
+<html><head><title>XLISP read-int</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>read-int</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(<b>read-int</b> [<i>stream</i> [<i>length</i>]])</dt>
+<dd><i>stream</i> - the input stream [default is standard input]<br>
+<i>length</i> - the length of the integer in bytes [default is 4]<br>
+returns - the integer</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>read-int</nobr>' function reads an integer from a binary input
+stream, created by the
+<nobr><a href="open-binary.htm">open-binary</a></nobr> function.</p>
+
+<p><b>Note:</b> Integers and floats are assumed to be
+<nobr>big-endian</nobr> [<nobr>high-order</nobr> byte first] and signed,
+regardless of the platform. <nobr>To read</nobr> <nobr>little-endian</nobr>
+format, use a negative number for the length, e.g. '-4' indicates a
+<nobr>4-bytes</nobr>, <nobr>low-order</nobr> byte first. The file should be
+opened in binary mode.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p>See also <nobr><a href="write-int.htm">write-int</a></nobr>,
+<nobr><a href="read-float.htm">read-float</a></nobr>,
+<nobr><a href="write-float.htm">write-float</a></nobr>,
+<nobr><a href="bigendianp.htm">bigendianp</a></nobr>,
+<nobr><a href="open-binary.htm">open-binary</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/read-line.htm b/docsrc/xlisp/xlisp-doc/reference/read-line.htm
new file mode 100644
index 0000000..e6860d4
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/read-line.htm
@@ -0,0 +1,97 @@
+<html><head><title>XLISP read-line</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>read-line</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(read-line [<i>source</i>])</dt>
+<dd><i>source</i> - an optional source, must be a file pointer or stream,
+default is <a href="global-standard-input.htm">*standard-input*</a><br>
+returns - the line as a string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'read-line' function reads a single line from the specified 'source'.
+The line read is returned as a string value for the result. The 'source' may
+be a file pointer or a stream. If there is no 'source',
+<a href="global-standard-input.htm">*standard-input*</a> is the default. If an
+end-of-file is encountered in the 'source', then
+<a href="nil.htm">NIL</a> will be returned as the result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq fp (open "f" :direction :output)) <font color="#008844">; set up file</font>
+(print "fe fi" fp)
+(print 12.34 fp)
+(close fp)
+
+(setq fp (open "f" :direction :input)) <font color="#008844">; now read the file</font>
+(read-line fp) <font color="#008844">; returns ""fe fi""</font>
+(read-line fp) <font color="#008844">; returns "12.34"</font>
+(read-line fp) <font color="#008844">; returns NIL</font>
+(close fp)
+</pre>
+
+<p><b>Common Lisp:</b> The XLISP and Common Lisp 'read-line' functions are
+compatible for simple cases. They both allow for the optional 'source'.
+However, in Common Lisp, there are additional parameters which occur right
+after 'source'. So, when porting from Common Lisp to XLISP, remember there
+are additional arguments in Common Lisp's 'read-line' function.</p>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that 'read' operations with a
+'source' of <a href="nil.htm">NIL</a> will come from
+<a href="global-standard-input.htm">*standard-input*</a>. XLISP does not read the
+input from <a href="global-standard-input.htm">*standard-input*</a> with a
+'source' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'source' of <a href="t.htm">&nbsp;T&nbsp;</a>
+will read from *terminal-io* which is not defined in XLISP by default. XLISP
+does not allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid
+argument for 'source'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-029.htm#read-line">read-line</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/read.htm b/docsrc/xlisp/xlisp-doc/reference/read.htm
new file mode 100644
index 0000000..7e7e339
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/read.htm
@@ -0,0 +1,125 @@
+<html><head><title>XLISP read</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>read</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c, xlread.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(<i>read</i> [<i>source</i> [<i>eof-result</i> [<i>recursive-flag</i>]]])</dt>
+<dd><i>source</i> - an optional source, must be a file pointer or stream, the
+default is <a href="global-standard-input.htm">*standard-input*</a><br>
+<i>eof-result</i> - an optional expression, default is
+<a href="nil.htm">NIL</a><br>
+<i>recursive-flag</i> - an optional expression,
+<a href="nil.htm">NIL</a> or
+non-<a href="nil.htm">NIL</a><br>
+returns - the expression read</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'read' function reads an expression from the specified 'source'. The
+expression read is a normal XLISP expression, not necessarily a line. This
+means that white space is removed, where 'white space' is blanks, empty
+lines and comment lines. Read-macro expansions will occur. The expression
+needs to be an atom [numeric, string or symbol] or a valid list. It can span
+several lines. The expression read is returned as the result. The 'source'
+may be a file pointer or a stream. If there is no 'source',
+<a href="global-standard-input.htm">*standard-input*</a> is the default. If an
+end-of-file is encountered in the 'source', then the 'eof-result' value will
+be returned as the result.</p>
+
+<p>If you wish to read just lines or characters, refer to the
+<a href="read-line.htm">read-line</a> or
+<a href="read-char.htm">read-char</a> functions.</p>
+
+<p>The 'recursive-flag' is intended for use with embedded calls to 'read'.
+This is useful in read-macro and read-table uses. If 'recursive-flag' is
+<nobr>non-<a href="nil.htm">NIL</a> ,</nobr> 'read' does not
+expect itself to be at a 'top-level', but recursively executing within
+another 'read' that is in progress.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq fp (open "f" :direction :output)) <font color="#008844">; set up file</font>
+(print "hello" fp) <font color="#008844">; and fill it with stuff</font>
+(print 12.34 fp)
+(princ "'(a b" fp) (terpri fp)
+(princ "; comment" fp) (terpri fp)
+(princ " c d)" fp )
+(close fp)
+
+(setq fp (open "f" :direction :input)) <font color="#008844">; now read the file</font>
+(read fp "done") <font color="#008844">; returns "hello"</font>
+(read fp "done") <font color="#008844">; returns 12.34</font>
+(read fp "done") <font color="#008844">; returns (QUOTE (A B C D))</font>
+ <font color="#008844">; note the macro expansion of QUOTE</font>
+ <font color="#008844">; note that "; comment" is gone</font>
+(read fp "done") <font color="#008844">; returns "done"</font>
+(close fp)
+</pre>
+
+<p><b>Common Lisp:</b> The XLISP and Common Lisp 'read' functions are
+similar. They both allow for 'source', 'eof-result' and 'recursive-flag'.
+However, in Common LISP, there is an additional end-of-file error parameter.
+This parameter occurs right after 'source' and specifies whether or not to
+flag an error on end-of-file. So, when porting, remember there is one
+additional argument in Common Lisp's 'read' function. You need to be
+concerned about this if you use more than just a 'source' argument, going
+either from XLISP to Common LISP or vice versa.</p>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that 'read' operations with a
+'source' of <a href="nil.htm">NIL</a> will come from
+<a href="global-standard-input.htm">*standard-input*</a>. XLISP does not read the
+input from <a href="global-standard-input.htm">*standard-input*</a> with a
+'source' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'source' of <a href="t.htm">&nbsp;T&nbsp;</a>
+will read from *terminal-io* which is not defined in XLISP by default. XLISP
+does not allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid
+argument for 'source'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-027.htm#read">read</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/real-random.htm b/docsrc/xlisp/xlisp-doc/reference/real-random.htm
new file mode 100644
index 0000000..d3438a8
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/real-random.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP real-random</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>real-random</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>misc.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>real-random</b> <i>from to</i>)</nobr></dt>
+<dd><i>from</i>, <i>to</i> - the limits as integer or floating point numbers<br>
+returns - a random floating point number between <i>from</i> and <i>to</i></dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, '<nobr>real-random</nobr>' is implemented as a Lisp
+function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">real-random</font> (from to)
+ (+ (* (rrandom) (- to from)) from))
+</pre>
+
+<h2>Description</h2>
+
+<p>The '<nobr>real-random</nobr>' function returns a random floating point
+number between 'from' and 'to'. <nobr>See also</nobr> <a
+href="rrandom.htm">rrandom</a>, which is <nobr>equivalent to:</nobr>
+
+<pre class="example">
+(real-random 0 1))
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p>See also <a href="rrandom.htm">rrandom</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/reference-copyright.htm b/docsrc/xlisp/xlisp-doc/reference/reference-copyright.htm
new file mode 100644
index 0000000..854f384
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/reference-copyright.htm
@@ -0,0 +1,50 @@
+<html><head><title>Copyright</title></head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Copyright</h1>
+
+<hr>
+
+<p>This XLISP language reference is a re-work of a 'XLISPREF.DOC' document
+with the following copyright:</p>
+
+<p>XLISP 2.0 Language Reference by Tim I Mikkelsen - December 11, 1989</p>
+
+<blockquote>
+<p>Copyright (c) 1989 by Tim I. Mikkelsen. All Rights Reserved. No part of this
+document may be copied, reproduced or translated for commercial use without
+prior written consent of the author. Permission is granted for non-commercial
+use as long as this notice is left intact.</p>
+
+<p>This document is intended to serve as a reference for the XLISP 2.0 dialect
+of LISP. It includes a description of each symbol, function, special form and
+keyword available in XLISP. This reference is not a complete and extensive
+introduction to LISP programming.</p>
+
+<p>If you find problems with the reference or find that I have left something
+out, drop me a line. If you find this useful, I would be interested in hearing
+that as well. If you are into 'pretty' looking documents (as opposed to plain
+ASCII text), I have a TeX version of the reference.</p>
+</blockquote>
+
+<p>Tim Mikkelsen, 4316 Picadilly Drive, Fort Collins, Colorado 80526</p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html>
+
diff --git a/docsrc/xlisp/xlisp-doc/reference/reference-format.htm b/docsrc/xlisp/xlisp-doc/reference/reference-format.htm
new file mode 100644
index 0000000..140d2c0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/reference-format.htm
@@ -0,0 +1,83 @@
+<html><head><title>Entry Format</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Entry Format</h1>
+
+<hr>
+
+<p>Each entry is a symbol of some variety that the XLISP system will
+recognize. The parts of each reference entry include:</p>
+
+<ol>
+
+<li><p>The <b>Headline</b> of the page gives the name or symbol of the
+entry.</p></li>
+
+<li><p>The <b>Reference</b> section below the headline gives infomations in
+the following order:</p></li>
+
+<ul>
+
+<li><p><b>Type</b> may be one of the following:</p></li>
+
+<ul>
+<li><nobr>function (subr)</nobr></li>
+<li><nobr>predicate function (subr)</nobr></li>
+<li><nobr>special form (fsubr)</nobr></li>
+<li><nobr>reader expansion</nobr></li>
+<li><nobr>system variable</nobr></li>
+<li><nobr>system constant</nobr></li>
+<li><nobr>keyword</nobr></li>
+<li><nobr>object</nobr></li>
+<li><nobr>message selector</nobr></li>
+</ul>
+
+<li><p><b>Source</b> specifies the source file where the routine or code
+associated with the entry resides. [Please not that I have copied the
+source file locations out of the Tim I Mikkelsen manual without checking,
+so some of them may be wrong.]</p></li>
+
+</ul>
+
+<li><p><b>Syntax</b> defines the syntax or usage of the entry. It is also
+used to specify the arguments. Items written in <i>italics</i> are
+arguments. Items enclosed between square brackets like '[' and ']' are
+optional entries. Items that have '...' [ellipses] indicate that there can
+be one or many of the item. Items enclosed between '{' and '}' which are
+separated by '|' indicate that one of the items should be included.</p></li>
+
+<li><p><b>Description</b> defines the entry, necessary conditions, results,
+defaults, etc.</p></li>
+
+<li><p><b>Examples</b> shows example uses of the entry.</p></li>
+
+<li><p>The <b>Comments</b> section after the examples includes additional
+information such as compatibility notes, bugs, usage notes, potential
+problems, keystroke equivalences, etc.</p></li>
+
+</ol>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/reference-index.htm b/docsrc/xlisp/xlisp-doc/reference/reference-index.htm
new file mode 100644
index 0000000..a50ea90
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/reference-index.htm
@@ -0,0 +1,2468 @@
+<html><head><title>Language Reference</title></head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+Reference
+
+<hr>
+
+<h1>Nyquist / XLISP 2.0 Language Reference</h1>
+
+<hr>
+
+<p><nobr>&nbsp;
+<a href="#num">&nbsp;<i>#</i>&nbsp;</a> |
+<a href="#a">&nbsp;<i>a</i>&nbsp;</a> |
+<a href="#b">&nbsp;<i>b</i>&nbsp;</a> |
+<a href="#c">&nbsp;<i>c</i>&nbsp;</a> |
+<a href="#d">&nbsp;<i>d</i>&nbsp;</a> |
+<a href="#e">&nbsp;<i>e</i>&nbsp;</a> |
+<a href="#f">&nbsp;<i>f</i>&nbsp;</a> |
+<a href="#g">&nbsp;<i>g</i>&nbsp;</a> |
+<a href="#h">&nbsp;<i>h</i>&nbsp;</a> |
+<a href="#i">&nbsp;<i>i</i>&nbsp;</a> |
+<a href="#k">&nbsp;<i>k</i>&nbsp;</a> |
+<a href="#l">&nbsp;<i>l</i>&nbsp;</a> |
+<a href="#m">&nbsp;<i>m</i>&nbsp;</a> |
+<a href="#n">&nbsp;<i>n</i>&nbsp;</a> |
+<a href="#o">&nbsp;<i>o</i>&nbsp;</a> |
+<a href="#p">&nbsp;<i>p</i>&nbsp;</a> |
+<a href="#q">&nbsp;<i>q</i>&nbsp;</a> |
+<a href="#r">&nbsp;<i>r</i>&nbsp;</a> |
+<a href="#s">&nbsp;<i>s</i>&nbsp;</a> |
+<a href="#t">&nbsp;<i>t</i>&nbsp;</a> |
+<a href="#u">&nbsp;<i>u</i>&nbsp;</a> |
+<a href="#v">&nbsp;<i>v</i>&nbsp;</a> |
+<a href="#w">&nbsp;<i>w</i>&nbsp;</a> |
+<a href="#z">&nbsp;<i>z</i>&nbsp;</a>
+</nobr></p>
+
+<ul>
+<li><nobr><a href="reference-copyright.htm">Copyright</a></nobr></li>
+<li><nobr><a href="reference-format.htm">Entry Format</a></nobr></li>
+</ul>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;*&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">variable</font>
+ - most recent result</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;**&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">variable</font>
+ - second recent result</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;***&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">variable</font>
+ - third recent result</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;+&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">variable</font>
+ - most recent input expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;++&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">variable</font>
+ - second recent input expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;+++&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">variable</font>
+ - third recent input expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="../manual/xlisp.htm#command-loop">&nbsp;&minus;&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">variable</font>
+ - the expression currently being evaluated</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="num"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="addition.htm">&nbsp;+&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - add one or several numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="subtraction.htm">&nbsp;&minus;&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - negate one number or subtract several numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="multiplication.htm">&nbsp;*&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - multiply one or several numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="division.htm">&nbsp;/&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - divide one or several numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="number-lessp.htm">&nbsp;&lt;&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if numbers are monotonically increasing</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="number-not-greaterp.htm">&nbsp;&lt;=&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if numbers are monotonically non-decreasing</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="number-equal.htm">&nbsp;=&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test numbers for equality</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="number-not-equal.htm">&nbsp;/=&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test numbers for non-equality</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="number-greaterp.htm">&nbsp;&gt;&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if numbers are monotonically decreasing</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="number-not-lessp.htm">&nbsp;&gt;=&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if numbers are monotonically non-increasing</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="increment.htm">&nbsp;1+&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - increment a number by one</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="decrement.htm">&nbsp;1&minus;&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - decrement a number by one</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="a"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="abs.htm">abs</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the absolute value of a number</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="acos.htm">acos</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the arccosine of a floating point number</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="address-of.htm">address-of</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get the address of an xlisp node</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="alloc.htm">alloc</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - change the number of nodes to allocate in each segment</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="alphanumericp.htm">alphanumericp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - is this an alphabetic or a digit character?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="and.htm">and</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - the logical 'and' of an arbitrary number of expressions</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-answer.htm">:answer</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">message selector</font>
+ - add a message to a class</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="append.htm">append</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - append lists</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="apply.htm">apply</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - apply a function to a list of arguments</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-applyhook.htm">*applyhook*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - returns <a href="nil.htm">NIL</a> [hook not implemented]</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="aref.htm">aref</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - array accessor for the nth element of an array</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="arrayp.htm">arrayp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this an array?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="asin.htm">asin</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the arcsine of a floating point number</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="assoc.htm">assoc</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - find an expression in an association list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="atan.htm">atan</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the arctangent of a floating point number</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="atom.htm">atom</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this an atom?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="lambda-keyword-aux.htm">&amp;aux</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">keyword</font>
+ - define auxiliary variables</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="b"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="backquote.htm">backquote</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - fill in a template</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="baktrace.htm">baktrace</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - print n levels of trace back information</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="bigendianp.htm">bigendianp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - is this a bigendian machine?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="block.htm">block</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - define a named block</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="both-case-p.htm">both-case-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this an uppercase or lowercase alphabetic character?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="boundp.htm">boundp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is a variable value bound to this symbol in the <a href="global-obarray.htm">*obarray*</a>?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="break.htm">break</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - enter a <a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-breakenable.htm">*breakenable*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - define if the <a href="../manual/xlisp.htm#break-loop">Break Loop</a> shall be entered on errors</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="c"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="car.htm">car</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for the <a href="first.htm">first</a> element of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="caar.htm">caar cadr</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessors for a sequence of <a href="car.htm">car</a> and
+ <a href="cdr.htm">cdr</a> operations</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="caaar.htm">caaar...caddr</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessors for a sequence of <a href="car.htm">car</a> and
+ <a href="cdr.htm">cdr</a> operations</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="caaaar.htm">caaaar...cadddr</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessors for a sequence of <a href="car.htm">car</a> and
+ <a href="cdr.htm">cdr</a> operations</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="case.htm">case</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - select by case</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="catch.htm">catch</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - evaluate expressions and catch <a href="throw.htm">throw</a>s</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="cdr.htm">cdr</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for the tail of a list with the
+ <a href="first.htm">first</a> element removed</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="cddr.htm">cdar cddr</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessors for a sequence of <a href="car.htm">car</a> and
+ <a href="cdr.htm">cdr</a> operations</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="cdddr.htm">cdaar...cdddr</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessors for a sequence of <a href="car.htm">car</a> and
+ <a href="cdr.htm">cdr</a> operations</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="cddddr.htm">cdaaar...cddddr</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessors for a sequence of <a href="car.htm">car</a> and
+ <a href="cdr.htm">cdr</a> operations</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="cerror.htm">cerror</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - signal a correctable error</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char.htm">char</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - extract a character from a string</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-not-equal-s.htm">char/=</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if characters are not equal, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-lessp-s.htm">char&lt;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if characters are monotonically increasing, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-not-greaterp-s.htm">char&lt;=</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if characters are monotonically non-decreasing, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-equal-s.htm">char=</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if characters are equivalent, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-greaterp-s.htm">char&gt;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if characters are monotonically decreasing, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-not-lessp-s.htm">char&gt;=</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if characters are monotonically non-increasing, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="characterp.htm">characterp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this a character?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-code.htm">char-code</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get the ASCII code of a character</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-downcase.htm">char-downcase</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - convert a character to lower case</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-equal-i.htm">char-equal</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if characters are equivalent, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-greaterp-i.htm">char-greaterp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - test if characters are monotonically decreasing, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-int.htm">char-int</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - convert a character to an integer</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-lessp-i.htm">char-lessp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - test if characters are monotonically increasing, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-not-equal-i.htm">char-not-equal</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if characters are different values, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-not-greaterp-i.htm">char-not-greaterp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - test if characters are monotonically non-decreasing, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-not-lessp-i.htm">char-not-lessp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - test if characters are monotonically non-increasing, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="char-upcase.htm">char-upcase</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - convert a character to upper case</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="class.htm">class</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">object</font>
+ - the built-in object class</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-class.htm">:class</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">message selector</font>
+ - return the class of an object</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="clean-up.htm">clean-up</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - clean-up after an error</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="close.htm">close</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - close a file stream</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="code-char.htm">code-char</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get the character with a specified ASCII code</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="backquote.htm">comma</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">reader expansion</font>
+ - comma evaluates expressions in a <a href="backquote.htm">backquote</a> form</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="backquote.htm">comma-at</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">reader expansion</font>
+ - splices a list into a expression in a <a href="backquote.htm">backquote</a> form</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="cond.htm">cond</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - evaluate conditionally</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="cons.htm">cons</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - construct a new list node</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="consp.htm">consp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this a non-empty list?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-constituent.htm">:constituent</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">keyword</font>
+ - readtable entry to specify a character to be used as is</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="continue.htm">continue</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - continue from a correctable error</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="cos.htm">cos</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the cosine of a floating point number</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="d"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-debug-io.htm">*debug-io*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - file pointer for debug input and output</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="decf.htm">decf</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">macro</font>
+ - decrement a variable</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="defmacro.htm">defmacro</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - define a Lisp macro</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="defun.htm">defun</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - define a Lisp function</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="delete.htm">delete</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - delete elements from a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="delete-if.htm">delete-if</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - delete elements from a list that pass a test</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="delete-if-not.htm">delete-if-not</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - delete elements from a list that fail a test</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="digit-char.htm">digit-char</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - convert a decimal digit to a character</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="digit-char-p.htm">digit-char-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - convert a character to a decimal digit, if possible</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="do.htm">do</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - loop with local 'let' bindings</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="do-star.htm">do*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - loop with local 'let*' bindings</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="dolist.htm">dolist</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - loop through a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="dotimes.htm">dotimes</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - loop a given number of times</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="dribble.htm">dribble</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - create a file with a transcript of a Nyquist/ XLISP session</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="e"></a></td>
+</tr>
+</tr>
+<tr>
+ <td><nobr><a href="echoenabled.htm">echoenabled</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - turn the console input echo on or off</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="endp.htm">endp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this the end of a list?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="eq.htm">eq</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - equality test comparing memory pointers, may fail on numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="eql.htm">eql</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - same as 'eq', but works with all symbols and numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="equal.htm">equal</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - equality test by comparing printed values</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="error.htm">error</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - signal a non-correctable error</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-error-output.htm">*error-output*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - file pointer for error input and output</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="errset.htm">errset</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - trapping errors</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="eval.htm">eval</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - evaluate a Lisp expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="evalhook.htm">evalhook</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - evaluate with hooks</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-evalhook.htm">*evalhook*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - user substitute for the evaluator function</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="evenp.htm">evenp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this integer even?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="exit.htm">exit</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - exit XLISP</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="exp.htm">exp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute 'e' to the 'x' power</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="expand.htm">expand</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - expand memory by adding segments</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="expt.htm">expt</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute 'x' to the 'y' power</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="f"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="fboundp.htm">fboundp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is a function value bound to this symbol in the <a href="global-obarray.htm">*obarray*</a>??</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="filep.htm">filep</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - is this a file?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="find-in-xlisp-path.htm">find-in-xlisp-path</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - searches the XLISP path for a filename</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-file-separator.htm">*file-separator*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">variable</font>
+ - the operating system's file separator character</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="first.htm">first</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for the first element of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="flatc.htm">flatc</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - length of printed representation using <a href="princ.htm">princ</a></nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="flatsize.htm">flatsize</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - length of printed representation using <a href="prin1.htm">prin1</a></nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="flet.htm">flet</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - define local Lisp functions</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="float.htm">float</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - convert an integer to a floating point number</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-float-format.htm">*float-format*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - format for printing floating point numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="floatp.htm">floatp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this number a floating point number?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="format.htm">format</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - do formatted output</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="fourth.htm">fourth</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for the fourth element of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="funcall.htm">funcall</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - call a function with arguments</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="function.htm">function</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - get the functional value of a symbol or lambda expression</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="g"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="gc.htm">gc</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - call the garbage collector</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="gcd.htm">gcd</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the greatest common divisor</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-gc-flag.htm">*gc-flag*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - controls the printing of 'gc' messages</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-gc-hook.htm">*gc-hook*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - function to call after garbage collection</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="gensym.htm">gensym</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - generate an unique Lisp symbol</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="get.htm">get</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for property lists</nobr></td>
+</tr>
+ <tr>
+ <td><nobr><a href="get-env.htm">get-env</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get the value of an environment variable</nobr></td>
+ </tr>
+<tr>
+ <td colspan="4" width="100%">
+ <table cellpadding="0" cellspacing="0"><tbody>
+ <tr>
+ <td><nobr><a href="get-lambda-keyword-key.htm">get-key</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get a single key stroke from the keyboard</nobr></td>
+ </tr>
+ <tr>
+ <td><nobr><a href="get-lambda-expression.htm">get-lambda-expression</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get the Lisp code of a lambda or macro expression as a list</nobr></td>
+ </tr>
+ <tr>
+ <td><nobr><a href="get-output-stream-list.htm">get-output-stream-list</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - empty a stream and return it's data as a list</nobr></td>
+ </tr>
+ <tr>
+ <td><nobr><a href="get-output-stream-string.htm">get-output-stream-string</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - empty a stream and return it's data as a single string</nobr></td>
+ </tr>
+ <tr>
+ <td><nobr><a href="get-temp-path.htm">get-temp-path</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get a path where a temporary file can be created</nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+</tr>
+<tr>
+ <td><nobr><a href="get-user.htm">get-user</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get the current user name</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="go.htm">go</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - go to a tag within a 'tagbody' or 'prog'</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="h"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="hash.htm">hash</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the hash index for a symbol</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="i"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="if.htm">&nbsp;if&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - evaluate expressions conditionally</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="incf.htm">incf</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">macro</font>
+ - increment a variable</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="info.htm">info</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - show information about memory usage</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="int-char.htm">int-char</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - convert an integer to a character</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-integer-format.htm">*integer-format*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - format for printing integer numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="integerp.htm">integerp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this number an integer?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="intern.htm">intern</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - create a new interned symbol</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="interpolate.htm">interpolate</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the 'y' coordinate value corresponding to 'x'</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="intersection.htm">intersection</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the intersection of two lists</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-isa.htm">:isa</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">message selector</font>
+ - test if object inherits from class</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-isnew.htm">:isnew</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">message selector</font>
+ - cause an instance to run its initialization method</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="k"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="keywordp.htm">keywordp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - is this a keyword?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="lambda-keyword-key.htm">&amp;key</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">lambda list keyword</font>
+ - define keyword arguments</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="l"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="labels.htm">labels</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - define local Lisp functions in a mutually recursive manner</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="lambda.htm">lambda</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - define a unnamed function</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="last.htm">last</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for the last element of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="length.htm">length</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - returns the length of a list, vector or string</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="let.htm">let</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - define local bindings, evaluated in no specific order</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="let-star.htm">let*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - define local bindings, evaluated in sequencial order</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="list.htm">list</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - create a list of values</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="listdir.htm">listdir</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get a list of all filenames in a directory</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="listp.htm">listp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this a list?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="load.htm">load</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - load a source file</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="log.htm">log</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - the natural logarithm of a floating-point number</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="logand.htm">logand</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - the bitwise 'and' of one or several numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="logior.htm">logior</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - the bitwise 'inclusive or' of one or several numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="lognot.htm">lognot</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - the bitwise 'exclusive or' of one or several numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="logxor.htm">logxor</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - the bitwise 'not' of a number</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="loop.htm">loop</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - basic looping form</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="lower-case-p.htm">lower-case-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this a lowercase character?</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="m"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="macroexpand.htm">macroexpand</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - expand macro definitions recursively</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="macroexpand-1.htm">macroexpand-1</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - expand the first level of a macro definition</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="macrolet.htm">macrolet</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - define a local macro</nobr></td>
+</tr>
+<tr>
+ <td colspan="4" width="100%">
+ <table cellpadding="0" cellspacing="0"><tbody>
+ <tr>
+ <td><nobr><a href="make-array.htm">make-array</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - create an array of specified size</nobr></td>
+ </tr>
+ <tr>
+ <td><nobr><a href="make-string-input-stream.htm">make-string-input-stream</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - create an unnamed stream from a string expression</nobr></td>
+ </tr>
+ <tr>
+ <td><nobr><a href="make-string-output-stream.htm">make-string-output-stream</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - create and return an unnamed output stream</nobr></td>
+ </tr>
+ <tr>
+ <td><nobr><a href="make-symbol.htm">make-symbol</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - create a temporary, uninterned symbol</nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+</tr>
+<tr>
+ <td><nobr><a href="mapc.htm">mapc</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - apply a function to successive 'car's, return the first list of arguments</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="mapcar.htm">mapcar</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - apply a function to successive 'car's, return a list of the values</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="mapl.htm">mapl</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - apply a function to successive 'cdr's, return the first list of arguments</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="maplist.htm">maplist</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - apply a function to successive 'cdr's, return a list of the values</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="max.htm">max</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - return the largest of one or several numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="member.htm">member</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if an expression is contained in a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-mescape.htm">:mescape</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">keyword</font>
+ - readtable entry specifying a character to be used as a multiple escape character</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="min.htm">min</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - return the smallest of one or several numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="minusp.htm">minusp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this number negative?</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="n"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="nconc.htm">nconc</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - destructively concatenate lists</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-new.htm">:new</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">message selector</font>
+ - create a new instance of a class</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="nil.htm">nil</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system constant</font>
+ - representing the empty list as well as the false value</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-nmacro.htm">:nmacro</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">keyword</font>
+ - readtable entry to specify a character to be used as the start of a non-terminating read macro</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="not.htm">not</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this expression false?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="nstring-downcase.htm">nstring-downcase</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - destructively convert a string or a part of it to lower case</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="nstring-upcase.htm">nstring-upcase</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - destructively convert a string or a part of it to upper case</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="nth.htm">nth</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for the nth element of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="nthcdr.htm">nthcdr</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for the nth tail of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="null.htm">null</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this an empty list?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="numberp.htm">numberp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this a number?</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="o"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-obarray.htm">*obarray*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - the system symbol table</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="object.htm">object</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">object</font>
+ - the build-in object class</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="objectp.htm">objectp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this an object?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="oddp.htm">oddp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this integer number odd?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="open.htm">open</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - open a file for character or byte i/o</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="open-binary.htm">open-binary</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - open a file for multi-byte i/o</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="lambda-keyword-optional.htm">&amp;optional</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">lambda list keyword</font>
+ - define optional arguments</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="or.htm">or</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - the logical 'or' of an arbitrary number of expressions</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="p"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="peek.htm">peek</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - accessor for an internal computer memory value</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="peek-char.htm">peek-char</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - look at a single character from a specified source</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="pi.htm">pi</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">variable</font>
+ - floating point approximation of the number 'pi'</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="plusp.htm">plusp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this number positive?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="poke.htm">poke</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - write a value to the internal computer memory</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="pop.htm">pop</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">macro</font>
+ - pop a value from a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="power.htm">power</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute 'x' raised to the 'y' power</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="pprint.htm">pprint</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - print a pretty looking version of an expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="prin1.htm">prin1</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - print an expression without a newline</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="princ.htm">princ</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - print an expression without quoting and without a newline</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="print.htm">print</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - print an expression on a new line</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-print-case.htm">*print-case*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - specifies how symbols are printed</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="profile.htm">profile</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - turn profiling on or off</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="prog.htm">prog</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - a 'block' with local 'let' bindings</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="prog-star.htm">prog*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - a 'block' with local 'let*' bindings</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="prog1.htm">prog1</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - a 'block' returning the value of the first expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="prog2.htm">prog2</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - a 'block' returning the value of the second expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="progn.htm">progn</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - a 'block' returning the value of the last expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="progv.htm">progv</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - a 'block' with local bindings, created out of two lists</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="psetq.htm">psetq</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - perform 'setq' assignments in parallel</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="push.htm">push</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">macro</font>
+ - push a value to the front of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="putprop.htm">putprop</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - put a property onto a symbol's property list</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="q"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="quit.htm">quit</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - quit XLISP</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="quote.htm">quote</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - return an expression unevaluated</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="r"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="random.htm">random</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute an integer random number between 0 and n-1 inclusive</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="read.htm">read</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - read a Lisp expression</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="read-byte.htm">read-byte</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - read a byte from a stream</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="read-char.htm">read-char</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - read a character from a stream</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="read-float.htm">read-float</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - read a binary floating point number from a stream</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="read-int.htm">read-int</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - read a binary integer number from a stream</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="read-line.htm">read-line</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - read a line from a stream, returned as a string</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-readtable.htm">*readtable*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - contains data structures relating to the processing of characters</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="real-random.htm">real-random</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute a floating point random number in an arbitrary range</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="rem.htm">rem</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the remainder of one or several numbers</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="remove.htm">remove</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - remove elements from a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="remove-if.htm">remove-if</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - remove elements from a list that pass a test</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="remove-if-not.htm">remove-if-not</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - remove elements from a list that fail a test</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="remprop.htm">remprop</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - remove a property from a symbol's property list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="rest.htm">rest</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for the tail of a list, identical to 'cdr'</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="lambda-keyword-rest.htm">&amp;rest</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">lambda list keyword</font>
+ - define 'rest' arguments, to be collected in a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="restore.htm">restore</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - restore a XLISP workspace from a file</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="return.htm">return</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - return from a 'block' construct</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="return-from.htm">return-from</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - return from a named block</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="reverse.htm">reverse</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - reverse a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="room.htm">room</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - show memory allocation statistics</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="round.htm">round</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - round a number to the next integer value</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="rplaca.htm">rplaca</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - replace the first element of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="rplacd.htm">rplacd</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - replace the tail of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="rrandom.htm">rrandom</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute a random floating point number between 0 and 1 inclusive</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-rslt.htm">*rslt*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - used to store multiple return values</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="s"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="save.htm">save</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - save a XLISP workspace to a file</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="second.htm">second</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for the second element of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="self.htm">self</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">symbol</font>
+ - evaluates to the current object when used within a message context</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="send.htm">send</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - send a message to an object</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="send-super.htm">send-super</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - send a message to the superclass of an object</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-sescape.htm">:sescape</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">keyword</font>
+ - readtable entry specifying a character to be used as a single escape character</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="set.htm">set</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - set the value of a symbol</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="set-difference.htm">set-difference</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the set-difference of two lists</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="setdir.htm">setdir</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - set a new working directory</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="setf.htm">setf</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - set the value of a place</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="setq.htm">setq</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - set the value of a quoted symbol</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="setup-console.htm">setup-console</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - set default console attributes</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-show.htm">:show</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">message selector</font>
+ - show an object's instance variables</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="sin.htm">sin</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the sine of a floating point number</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="sort.htm">sort</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - destructively sort a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="soundp.htm">soundp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - is this a sound?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="sqrt.htm">sqrt</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the square root of a floating point number</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-standard-input.htm">*standard-input*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - file pointer for standard input</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-standard-output.htm">*standard-output*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - file pointer for standard output</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="strcat.htm">strcat</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - concatenate strings</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="streamp.htm">streamp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this a stream?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string.htm">string</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - make a string from a symbol, character or string</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-not-equal-s.htm">string/=</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if string1 is not equal to string2, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-lessp-s.htm">string&lt;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if string1 is less than string2, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-not-greaterp-s.htm">string&lt;=</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if string1 is less than or equal to string2, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-equal-s.htm">string=</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if the string arguments have the same values, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-greaterp-s.htm">string&gt;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if string1 is greater than string2, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-not-lessp-s.htm">string&gt;=</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if string1 is greater than or equal to string2, case is significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="stringp.htm">stringp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this a string?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-downcase.htm">string-downcase</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - convert a string to lower case</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-equal-i.htm">string-equal</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if string1 equal to string2, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-greaterp-i.htm">string-greaterp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - test if string1 is greater than string2, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-left-trim.htm">string-left-trim</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - trim the left end of a string</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-lessp-i.htm">string-lessp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - test if string1 is less than string2, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-not-equal-i.htm">string-not-equal</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if string1 is not equal to string2, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-not-greaterp-i.htm">string-not-greaterp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - test if string1 is less than or equal to string2, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-not-lessp-i.htm">string-not-lessp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - test if string1 is greater than or equal to string2, case is not significant</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-right-trim.htm">string-right-trim</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - trim the right end of a string</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-search.htm">string-search</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - search for a pattern in a string</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-trim.htm">string-trim</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - trim both ends of a string</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="string-upcase.htm">string-upcase</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - convert a string to upper case</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="sublis.htm">sublis</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - substitute expressions by using an association list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="subseq.htm">subseq</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - extract a substring</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="subsetp.htm">subsetp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - test if a list is a subset of another list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="subst.htm">subst</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - substitute expressions</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="symbol-function.htm">symbol-function</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get the functional value of a symbol</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="symbol-name.htm">symbol-name</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get the print name of a symbol</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="symbol-plist.htm">symbol-plist</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get the property list of a symbol</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="symbol-value.htm">symbol-value</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - get the value of a symbol</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="symbolp.htm">symbolp</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this a symbol?</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="system.htm">system</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - execute a command of the operating system</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="t"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="t.htm">&nbsp;t&nbsp;</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system constant</font>
+ - represents 'true'</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="tagbody.htm">tagbody</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - a 'block' form with labels</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="tan.htm">tan</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the tangent of a floating point number</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="terpri.htm">terpri</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - terminate printing, prints a newline character</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="third.htm">third</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - list accessor for the third element of a list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="throw.htm">throw</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - throw to a 'catch', allows non-local exits and traps</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-tmacro.htm">:tmacro</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">keyword</font>
+ - readtable entry to specify a character to be used as the start of a terminating read macro</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="top-level.htm">top-level</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - clean-up after an error and return to the top level</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="trace.htm">trace</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - add a function to the trace list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-tracelimit.htm">*tracelimit*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - the number of forms printed on entry to the <a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-tracelist.htm">*tracelist*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - a list of the current functions being traced</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-tracenable.htm">*tracenable*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - controls whether or not the <a href="../manual/xlisp.htm#break-loop">Break Loop</a> prints any back trace information on entry</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-trace-output.htm">*trace-output*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system variable</font>
+ - file pointer for trace output</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="truncate.htm">truncate</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - truncates a number to an integer</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="type-of.htm">type-of</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the type of a Lisp expression</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="u"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="global-unbound.htm">*unbound*</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">system constant</font>
+ - used to indicate when a symbol has no value</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="union.htm">union</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - compute the union of two lists</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="unless.htm">unless</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - evaluate only when a condition is false</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="untrace.htm">untrace</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - remove a function from the trace list</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="unwind-protect.htm">unwind-protect</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - allows the trapping of all forms of exit from a protected form</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="upper-case-p.htm">upper-case-p</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this an uppercase character?</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="v"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="vector.htm">vector</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - create an initialized vector [one-dimensional array]</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+</tbody></table>
+
+<table cellpadding="0" cellspacing="0" style="margin-left:5px"><tbody>
+<tr>
+ <td style="height:10px"><a name="w"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="when.htm">when</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">special form</font>
+ - evaluate only when a condition is true</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="while.htm">while</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">macro</font>
+ - loop while a condition is met</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="keyword-white-space.htm">:white-space</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">keyword</font>
+ - readtable entry to specifying a character that may be skipped over</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="write-byte.htm">write-byte</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - write a byte to a stream</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="write-char.htm">write-char</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - write a character to a stream</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="write-float.htm">write-float</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - write a binary floating point number to a stream</nobr></td>
+</tr>
+<tr>
+ <td><nobr><a href="write-int.htm">write-int</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">function</font>
+ - write a binary integer number to a stream</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td><nobr>&nbsp;[
+ <a href="#top"><font color="#444444">Back to Top</font></a> ]
+ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"><a name="z"></a></td>
+</tr>
+<tr>
+ <td><nobr><a href="zerop.htm">zerop</a></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><font color="#444444">predicate function</font>
+ - is this number zero?</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+</tbody></table>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+Reference
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/reference.css b/docsrc/xlisp/xlisp-doc/reference/reference.css
new file mode 100644
index 0000000..964dca2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/reference.css
@@ -0,0 +1,34 @@
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+
diff --git a/docsrc/xlisp/xlisp-doc/reference/rem.htm b/docsrc/xlisp/xlisp-doc/reference/rem.htm
new file mode 100644
index 0000000..e17717c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/rem.htm
@@ -0,0 +1,88 @@
+<html><head><title>XLISP rem</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>rem</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(rem <i>expr1</i> ... )</dt>
+<dd><i>exprN</i> - integer number or expression<br>
+returns - the result of the remainder operation</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'rem' function takes the first pair of expressions and determines
+what is the remainder from dividing the first by the second expression. If
+there are no other arguments, this value is returned. If there are
+additional arguments, the remainder of the first pair is applied to the next
+and then the next and so on. In other words:</p>
+
+<pre class="example">
+(REM A B C D)
+</pre>
+
+<p>is equivalent to:</p>
+
+<pre class="example">
+(REM (REM (REM A B) C) D)
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(rem 1) <font color="#008844">; returns 1</font>
+(rem 1 2) <font color="#008844">; returns 1</font>
+(rem 13 8) <font color="#008844">; returns 5</font>
+(rem 13 8 3) <font color="#008844">; returns 2</font>
+(rem 13.5 8) <font color="#008844">; error: bad floating point operation</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp only allows two arguments. XLISP supports
+an arbitrary number of arguments. Also, Common Lisp allows for floating
+point expressions where XLISP does not support this.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#rem">rem</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/remove-if-not.htm b/docsrc/xlisp/xlisp-doc/reference/remove-if-not.htm
new file mode 100644
index 0000000..cffc53e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/remove-if-not.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP remove-if-not</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>remove-if-not</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(remove-if-not test list-expr)</dt>
+<dd><i>test</i> - the test function to be performed<br>
+<i>list-expr</i> - the list to remove from<br>
+returns - a copy of <i>list-expr</i> with non-matching elements removed</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'remove-if-not' function searches through 'list-expr' and removes any
+elements that fail the 'test'. Note that this operation is non-destructive,
+it does not modify or affect 'list-expr' directly, it creates a modified
+copy.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mylist '(1 2 3 4 5 6 7 8)) <font color="#008844">; set up a list</font>
+(remove-if-not 'oddp mylist) <font color="#008844">; returns (1 3 5 7)</font>
+(remove-if-not 'evenp mylist) <font color="#008844">; returns (2 4 6 8)</font>
+(print mylist) <font color="#008844">; prints (1 2 3 4 5 6 7 8)</font>
+ <font color="#008844">; note that MYLIST is not affected</font>
+
+(setq mylist '(a nil b nil c)) <font color="#008844">; set up a list</font>
+(remove-if-not 'null mylist) <font color="#008844">; returns (NIL NIL)</font>
+</pre>
+
+<p><b>Common Lisp:</b> XLISP does not support the ':from-end', ':start',
+':end', ':count' and ':key' keywords which Common Lisp does.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#remove-if-not">remove-if-not</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/remove-if.htm b/docsrc/xlisp/xlisp-doc/reference/remove-if.htm
new file mode 100644
index 0000000..0bcbfdb
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/remove-if.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP remove-if</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>remove-if</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(remove-if <i>test list-expr</i>)</dt>
+<dd><i>test</i> - the test function to be performed<br>
+<i>list-expr</i> - the list to remove from<br>
+returns - copy of list with matching elements removed</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'remove-if' function searches through 'list-expr' and removes any
+elements that pass the 'test'. Note that this operation is non-destructive,
+it does not modify or affect 'list-expr' directly, it creates a modified
+copy.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mylist '(1 2 3 4 5 6 7 8)) <font color="#008844">; set up a list</font>
+(remove-if 'oddp mylist) <font color="#008844">; returns (2 4 6 8)</font>
+(remove-if 'evenp mylist) <font color="#008844">; returns (1 3 5 7)</font>
+(print mylist) <font color="#008844">; prints (1 2 3 4 5 6 7 8)</font>
+ <font color="#008844">; note that MYLIST is not affected</font>
+
+(setq mylist '(a nil b nil c)) <font color="#008844">; set up a list</font>
+(remove-if 'null mylist) <font color="#008844">; returns (A B C)</font>
+</pre>
+
+<p><b>Common Lisp:</b> XLISP does not support the ':from-end', ':start',
+':end', ':count' and ':key' keywords which Common Lisp does.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#remove-if">remove-if</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/remove.htm b/docsrc/xlisp/xlisp-doc/reference/remove.htm
new file mode 100644
index 0000000..e9108e5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/remove.htm
@@ -0,0 +1,100 @@
+<html><head><title>XLISP remove</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>remove</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(remove <i>expr list-expr</i> [{:test | :test-not} <i>test</i>])</dt>
+<dd><i>expr</i> - the expression to remove, an atom or list<br>
+<i>list-expr</i> - the list to remove from<br>
+<i>test</i> - optional test function, default is
+<a href="eql.htm">eql</a><br>
+returns - a copy of <i>list-expr</i> with matching expressions removed</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'remove' function searches through 'list-expr' for 'expr'. If 'expr'
+is found, 'remove' returns the list with the 'expr' deleted. All occurances
+of 'expr' are deleted. If 'expr' is not found, then the 'list-expr' is
+returned unaltered. You may specify your own test with the ':test' and
+':test-not' keywords followed by the test you which to perform. Note that
+this operation is non-destructive, it does not modify or affect 'list-expr'
+directly, it creates a modified copy.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq mylist '(a b c d it e f)) <font color="#008844">; set up a list</font>
+(remove 'it mylist) <font color="#008844">; returns (A B C D E F)</font>
+(print mylist) <font color="#008844">; prints (A B C D IT E F)</font>
+ <font color="#008844">; note that MYLIST is not affected</font>
+
+(setq mylist '(a b c b d b)) <font color="#008844">; change list to include duplicates</font>
+(remove 'b mylist) <font color="#008844">; returns (A C D)</font>
+
+(setq alist '( (a) (b) (it) (c))) <font color="#008844">; set up another list</font>
+(remove '(it) alist) <font color="#008844">; returns ((A) (B) (IT) (C))</font>
+ <font color="#008844">; the EQ test doesn't work for lists</font>
+(remove '(it) alist :test 'equal) <font color="#008844">; returns ((A) (B) (C))</font>
+
+(setq slist '( "a" "b" "it" "c")) <font color="#008844">; set up yet another list</font>
+(remove "it" slist) <font color="#008844">; returns ("a" "b" "c")</font>
+(remove "it" slist :test-not 'equal) <font color="#008844">; returns ("it")</font>
+ <font color="#008844">; REMOVE takes away everything but IT</font>
+</pre>
+
+<p><b>Note:</b> The 'remove' function can work with a list or string as the
+'expr'. However, the default <a href="eql.htm">eql</a> test does
+not work with lists or strings, only symbols and numbers. To make this work,
+you need to use the ':test' keyword along with
+<a href="equal.htm">equal</a> for 'test'.</p>
+
+<p><b>Common Lisp:</b> XLISP does not support the ':from-end', ':start',
+':end', ':count' and ':key' keywords which Common Lisp does.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#remove">remove</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/remprop.htm b/docsrc/xlisp/xlisp-doc/reference/remprop.htm
new file mode 100644
index 0000000..8b98b92
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/remprop.htm
@@ -0,0 +1,94 @@
+<html><head><title>XLISP remprop</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>remprop</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(remprop <i>symbol property</i>)</dt>
+<dd><i>symbol</i> - the symbol with a property list<br>
+<i>property</i> - the property name being removed<br>
+returns - the property value</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'remprop' function removes the 'property' from the 'symbol'. The
+function returns a <a href="nil.htm">NIL</a>. If the 'property'
+does not exist, there is no error generated. The 'symbol' must be an
+existing symbol. Property lists are lists attached to any user defined
+variables. The lists are in the form of:</p>
+
+<pre class="example">
+(<font color="#008844"><i>name1 val1 name2 val2</i></font> ... )
+</pre>
+
+<p>Any number of properties may be attached to a single variable.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq person 'bobby) <font color="#008844">; create a var with a value</font>
+(putprop person 'boogie 'last-name) <font color="#008844">; add a LAST-NAME property</font>
+(putprop person 'disc-jockey 'job) <font color="#008844">; add a JOB property</font>
+
+(get person 'last-name) <font color="#008844">; retrieve LAST-NAME - boogie</font>
+(get person 'job) <font color="#008844">; retrieve JOB - disc-jockey</font>
+(get person 'height) <font color="#008844">; non-existant - returns NIL</font>
+
+(remprop person 'job) <font color="#008844">; remove JOB</font>
+(remprop person 'height) <font color="#008844">; remove non-existant</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp does not have a 'remprop' function. It
+uses <a href="setf.htm">setf</a> to achieve this functionality.
+Porting from Common Lisp to XLISP will work fine since XLISP supports the
+<a href="setf.htm">setf</a> modifications of property lists and
+the <a href="get.htm">get</a> function to retrieve property
+values from symbol names. Porting from XLISP to Common LISP will require
+translating 'remprop' into <a href="setf.htm">setf</a> forms.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-014.htm#remprop">remprop</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/rest.htm b/docsrc/xlisp/xlisp-doc/reference/rest.htm
new file mode 100644
index 0000000..1937471
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/rest.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP rest</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>rest</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(rest <i>expr</i>)</dt>
+<dd><i>expr</i> - a list or list expression<br>
+returns - <i>expr</i> with the first element removed</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'rest' function returns the remainder of a list or list expression
+after first element of the list is removed. If the list is
+<nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(rest '(a b c)) <font color="#008844">; returns (B C)</font>
+(rest '((a b) c d)) <font color="#008844">; returns (C D)</font>
+(rest NIL) <font color="#008844">; returns NIL</font>
+(rest 'a) <font color="#008844">; error: bad argument type</font>
+(rest '(a)) <font color="#008844">; returns NIL</font>
+
+(setq sisters '(virginia vicki cindy)) <font color="#008844">; set up variable SISTERS</font>
+(first sisters) <font color="#008844">; returns VIRGINIA</font>
+(rest sisters) <font color="#008844">; returns (VICKI CINDY)</font>
+</pre>
+
+<p><b>Note:</b> The 'rest' function is set to the same code as the
+<a href="cdr.htm">cdr</a> function.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#rest">rest</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/restore.htm b/docsrc/xlisp/xlisp-doc/reference/restore.htm
new file mode 100644
index 0000000..577cfc1
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/restore.htm
@@ -0,0 +1,112 @@
+<html><head><title>XLISP restore</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>restore</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xldmem.c, xlimage.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(restore <i>file</i>)</dt>
+<dd><i>file</i> - a string or symbol for the name of the file<br>
+returns - <a href="nil.htm">NIL</a> on failure, otherwise never
+returns</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'restore' function restores the previously
+<a href="save.htm">save</a>d XLISP workspace [system state] from
+the specified file. The 'file' may be a string or a symbol. If the 'file'
+does not include a '.wks' suffix, it will be extended to be called
+'file.wks'. If successful, 'restore' will print a message saying:</p>
+
+<pre class="example">
+[ returning to the top level ]
+</pre>
+
+<p>and will not return any value. If 'restore' fails, it will return
+<a href="nil.htm">NIL</a>. There can be several saved workspaces.
+These workspaces can be restored as often as desired.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq myvar 5) <font color="#008844">; set MYVAR to value 5</font>
+myvar <font color="#008844">; returns 5</font>
+
+(save 'farp) <font color="#008844">; save workspace in FARP.wks</font>
+
+(setq myvar "garp") <font color="#008844">; change MYVAR to "garp"</font>
+myvar <font color="#008844">; returns "garp"</font>
+
+(restore 'farp) <font color="#008844">; restore workspace</font>
+myvar <font color="#008844">; returns 5</font>
+</pre>
+
+<p><b>File names:</b> In the PC and DOS world, all file names and extensions
+[&quot;foo.bat&quot;] are automatically made uppercase. In using XLISP, this
+means you don't have to worry about whether the name is &quot;foo.bat&quot;,
+&quot;FOO.BAT&quot; or even &quot;FoO.bAt&quot;, they will all work.
+However, in other file systems [UNIX in particular], uppercase and lowercase
+do make a difference:</p>
+
+<p>This will create a file named FOO-FILE in UNIX, because XLISP uppercases
+its symbols:</p>
+
+<pre class="example">
+(open 'foo-file :direction :output)
+</pre>
+
+<p>This will create a file named 'foo-file' because UNIX doesn't
+uppercase its file names:</p>
+
+<pre class="example">
+(open "foo-file" :direction :output)
+</pre>
+
+<p>So, if you are having trouble with opening and accessing files, check to
+make sure the file name is in the proper case.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-031.htm#restore">restore</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/return-from.htm b/docsrc/xlisp/xlisp-doc/reference/return-from.htm
new file mode 100644
index 0000000..ea00206
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/return-from.htm
@@ -0,0 +1,89 @@
+<html><head><title>XLISP return-from</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>return-from</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(return-from <i>name</i> [<i>expr</i>])</dt>
+<dd><i>name</i> - an unevaluated symbol for the block name<br>
+<i>expr</i> - an expression<br>
+returns - never returns</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'return-from' special form allows the return of an arbitrary value at
+arbitrary times within a 'named-<a href="block.htm">block</a>'
+construct of the specified 'name'. The 'expr' will be returned by the
+<a href="block.htm">block</a> construct. A
+<a href="nil.htm">NIL</a> will be returned by the <a
+href="block.htm">block</a> construct if there is no 'expr'
+specified.</p>
+
+<p>If 'return-from' is used without being within a valid
+<a href="block.htm">block</a> construct, an error is generated:</p>
+
+<pre class="example">
+<font color="#AA0000">error: no target for RETURN</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(block out <font color="#008844">; outer BLOCK</font>
+ (print "outer")
+ (block in <font color="#008844">; inner BLOCK</font>
+ (print "inner")
+ (return-from out "all done")
+ (print "won't get here"))) <font color="#008844">; prints "outer"</font>
+ <font color="#008844">; prints "inner"</font>
+ <font color="#008844">; returns "all done"</font>
+
+(return-from nobody 9) <font color="#008844">; error: no target for RETURN</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-021.htm#return-from">return-from</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/return.htm b/docsrc/xlisp/xlisp-doc/reference/return.htm
new file mode 100644
index 0000000..9e52426
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/return.htm
@@ -0,0 +1,93 @@
+<html><head><title>XLISP return</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>return</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(return [<i>expr</i>])</dt>
+<dd><i>expr</i> - an expression<br>
+returns - never returns</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'return' special form allows the return of an arbitrary value at
+arbitrary times within 'block' constructs like
+<nobr><a href="do.htm">do</a> ,</nobr>
+<nobr><a href="do-star.htm">do*</a> ,</nobr>
+<nobr><a href="dolist.htm">dolist</a> ,</nobr>
+<nobr><a href="dotimes.htm">dotimes</a> ,</nobr>
+<nobr><a href="loop.htm">loop</a> ,</nobr>
+<a href="prog.htm">prog</a> and
+<a href="prog-star.htm">prog*</a>. The 'expr' will be returned by the
+outer 'block' construct. A <a href="nil.htm">NIL</a> will be
+returned by the outer 'block' construct if there is no 'expr' specified.</p>
+
+<p>If 'return' is used without being within a valid 'block' construct, an
+error is generated:</p>
+
+<pre class="example">
+<font color="#AA0000">error: no target for RETURN</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(prog (i) <font color="#008844">; PROG form</font>
+ (print i) (RETURN "foo") (print j)) <font color="#008844">; prints NIL returns "foo"</font>
+
+(dotimes (i 10)
+ (if (eql i 5) (RETURN 20)
+ (princ i))) <font color="#008844">; prints 01234 returns 20</font>
+
+(prog1 (print "hi") (RETURN "foo")) <font color="#008844">; prints "hi"</font>
+ <font color="#008844">; error: no target for RETURN</font>
+
+(return 9) <font color="#008844">; error: no target for RETURN</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-021.htm#return">return</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/reverse.htm b/docsrc/xlisp/xlisp-doc/reference/reverse.htm
new file mode 100644
index 0000000..f7132cc
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/reverse.htm
@@ -0,0 +1,73 @@
+<html><head><title>XLISP reverse</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>reverse</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(reverse list-expr)</dt>
+<dd><i>list-expr</i> - a list or list expression<br>
+returns - a new list in the reverse order</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'reverse' function reverses the 'list-expr'. The reversed list is the
+returned value. The reversal process only occurs on the 'top-level' of the
+'list-expr'. If there are nested sub-lists, these are left intact.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(reverse NIL) <font color="#008844">; returns NIL</font>
+(reverse 'a) <font color="#008844">; error: bad argument type</font>
+(reverse '(a)) <font color="#008844">; returns (A)</font>
+(reverse '(a b c)) <font color="#008844">; returns (C B A)</font>
+(reverse '((a b) (c d) (e f))) <font color="#008844">; returns ((E F) (C D) (A B))</font>
+(reverse (list (+ 1 2) (+ 3 4))) <font color="#008844">; returns (7 3)</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#reverse">reverse</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/room.htm b/docsrc/xlisp/xlisp-doc/reference/room.htm
new file mode 100644
index 0000000..79c5d78
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/room.htm
@@ -0,0 +1,90 @@
+<html><head><title>XLISP room</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>room</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xldmem.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(room [<i>info</i>])</dt>
+<dd><i>info</i> - an optional, unused expression<br>
+returns - <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'room' function prints the current memory statistics to
+<a href="global-standard-output.htm">*standard-output*</a>.
+<a href="nil.htm">NIL</a> is always returned. The message shows
+the statistics for:</p>
+
+<ul>
+<li><nobr>total nodes</nobr></li>
+<li><nobr>current free nodes</nobr></li>
+<li><nobr>current number of allocated memory segments</nobr></li>
+<li><nobr>node size of the allocated memory segments</nobr></li>
+<li><nobr>total memory in bytes</nobr></li>
+<li>total number of garbage collections that have occured
+since this session of XLISP started</li>
+</ul>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(room) <font color="#008844">; prints Nodes: 4000</font>
+ <font color="#008844">; Free nodes: 1723</font>
+ <font color="#008844">; Segments: 4</font>
+ <font color="#008844">; Allocate: 1000</font>
+ <font color="#008844">; Total: 52566</font>
+ <font color="#008844">; Collections: 8</font>
+ <font color="#008844">; returns NIL</font>
+</pre>
+
+<p><b>Common Lisp:</b> In Common LISP, the 'info' argument controls the
+amount of information that is printed. In Common Lisp, the form of and
+information provided by the 'room' output is implementation dependent. For
+portability, you should not count on this information or form.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-031.htm#room">room</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/round.htm b/docsrc/xlisp/xlisp-doc/reference/round.htm
new file mode 100644
index 0000000..11c84b1
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/round.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP round</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>round</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>fileio.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>round</b> <i>number</i>)</nobr></dt>
+<dd><i>number</i> - an integer or floating point numbers<br>
+returns - the number, rounded to the next integer value</dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, 'round' is implemented as a Lisp function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">round</font> (x)
+ (cond ((> x 0) (truncate (+ x 0.5)))
+ ((= (- x 0.5) (truncate (- x 0.5))) (truncate x))
+ (t (truncate (- x 0.5)))))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'round' function rounds a number to the next integer value. This is
+tricky because <a href="truncate.htm">truncate</a> rounds toward zero as
+<nobr>does C</nobr> in other words, rounding is down for positive numbers
+and up for negative numbers. <nobr>You can</nobr> convert rounding up to
+rounding down by subtracting one, but this fails on the integers, so we need
+a special test if <nobr>(- x 0.5)</nobr> is an integer.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(round .5) =&gt; 1
+(round -.5) =&gt; 0
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/rplaca.htm b/docsrc/xlisp/xlisp-doc/reference/rplaca.htm
new file mode 100644
index 0000000..3b6ca54
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/rplaca.htm
@@ -0,0 +1,99 @@
+<html><head><title>XLISP rplaca</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>rplaca</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(rplaca <i>list expr</i>)</dt>
+<dd><i>list</i> - the list to destructively modify<br>
+<i>expr</i> - the expression to replace <a href="car.htm">car</a>
+of <i>list</i><br>
+returns - the list node after updating the
+<a href="car.htm">car</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'rplaca' function destructively modifies the
+<a href="car.htm">car</a> of 'list' and replaces it with the
+'expr'. The destructive aspect of this operation means that the actual
+symbol value is used in the list-modifying operations, not a copy. 'list'
+must evaluate to a valid list.</p>
+
+<p>An atom or <a href="nil.htm">NIL</a> for 'list' will result in
+an error:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq a '(1 2 3)) <font color="#008844">; make A with value (1 2 3)</font>
+(setq b '(1 2 3)) <font color="#008844">; make B with value (1 2 3)</font>
+(setq c a) <font color="#008844">; make C point to A's value</font>
+(rplaca a 'new) <font color="#008844">; returns (NEW 2 3)</font>
+
+(print a) <font color="#008844">; prints (NEW 2 3)</font>
+ <font color="#008844">; note that A is modified</font>
+
+(print b) <font color="#008844">; prints (1 2 3)</font>
+ <font color="#008844">; note that B is not modified</font>
+
+(print c) <font color="#008844">; prints (NEW 2 3)</font>
+ <font color="#008844">; note that C is modified too</font>
+
+(setq a '(1 2 3)) <font color="#008844">; reset A to value (1 2 3)</font>
+(rplaca a '(the sub list)) <font color="#008844">; returns ((THE SUB LIST) 2 3)</font>
+(rplaca '(1 2 3) 'more) <font color="#008844">; returns (MORE 2 3)</font>
+
+(rplaca 'a 'b) <font color="#008844">; error: bad argument type</font>
+(rplaca NIL 'b) <font color="#008844">; error: bad argument type</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-017.htm#rplaca">rplaca</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/rplacd.htm b/docsrc/xlisp/xlisp-doc/reference/rplacd.htm
new file mode 100644
index 0000000..11b80c5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/rplacd.htm
@@ -0,0 +1,89 @@
+<html><head><title>XLISP rplacd</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>rplacd</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(rplacd list expr)</dt>
+<dd><i>list</i> - the list to destructively modify<br>
+<i>expr</i> - the expression to replace the
+<a href="cdr.htm">cdr</a> of <i>list</i><br>
+returns - the list node after updating the
+<a href="cdr.htm">cdr</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'rplacd' function destructively modifies the
+<a href="cdr.htm">cdr</a> of 'list' and replaces it with the
+'expr'. The destructive aspect of this operation means that the actual
+symbol value is used in the list-modifying operations, not a copy. 'list'
+must evaluate to a valid list.</p>
+
+<p>An atom or <a href="nil.htm">NIL</a> for 'list' will result in
+an error:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq a '(1 2 3)) <font color="#008844">; set up A with (1 2 3)</font>
+(rplacd a 'new) <font color="#008844">; returns (1 . NEW)</font>
+
+(print a) <font color="#008844">; prints (1 . NEW)</font>
+ <font color="#008844">; note that A is modified</font>
+
+(rplacd a '(a new list)) <font color="#008844">; returns (1 A NEW LIST)</font>
+(rplacd '(1 2 3) '(more)) <font color="#008844">; returns (1 MORE)</font>
+
+(rplacd 'a 'b) <font color="#008844">; error: bad argument type</font>
+(rplacd NIL 'b) <font color="#008844">; error: bad argument type</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-017.htm#rplacd">rplacd</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">XLISP</a> &gt;
+<a href="../manual/xlisp-man-index.htm">XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a>&nbsp; -&nbsp;
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/rrandom.htm b/docsrc/xlisp/xlisp-doc/reference/rrandom.htm
new file mode 100644
index 0000000..5735287
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/rrandom.htm
@@ -0,0 +1,66 @@
+<html><head><title>XLISP rrandom</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>rrandom</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c, xlisp.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>rrandom</b>)</nobr></dt>
+<dd>returns - a random floating point number between 0 and 1 inclusive</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'random' function returns a random floating point number between 0
+and 1 inclusive.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/save.htm b/docsrc/xlisp/xlisp-doc/reference/save.htm
new file mode 100644
index 0000000..8b7aba3
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/save.htm
@@ -0,0 +1,124 @@
+<html><head><title>XLISP save</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>save</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr> xldmem.c, xlimage.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(save <i>file</i>)</dt>
+<dd><i>file</i> - a string or symbol for the name of the file<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if workspace was
+written, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'save' function saves the current XLISP workspace [system state] to
+the specified file. The 'file' may be a string or a symbol. If the 'file'
+does not include a '.wks' suffix, it will be extended to be called
+'file.wks'. The function returns
+<a href="t.htm">&nbsp;T&nbsp;</a> if the workspace was properly
+created and saved, <a href="nil.htm">NIL</a> is returned
+otherwise. There can be several saved workspaces. These workspaces can be
+restored as often as desired.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq myvar 5) <font color="#008844">; set MYVAR to value 5</font>
+myvar <font color="#008844">; returns 5</font>
+
+(save 'farp) <font color="#008844">; save workspace in FARP.wks</font>
+
+(setq myvar "garp") <font color="#008844">; change MYVAR to "garp"</font>
+myvar <font color="#008844">; returns "garp"</font>
+
+(restore 'farp) <font color="#008844">; restore workspace</font>
+myvar <font color="#008844">; returns 5</font>
+</pre>
+
+<p><b>Bug:</b> The 'save' function generates a system error if the 'file'
+being created already exists. This 'file' will be modified and will not be
+restorable after restarting XLISP. [I still haven't tested this with
+Nyquist.]</p>
+
+<p><b>Note:</b> The saved workspace size is implementation dependent, but
+can be fairly large.</p>
+
+<p><b>File names:</b> In the PC and DOS world, all file names and extensions
+[&quot;foo.bat&quot;] are automatically made uppercase. In using XLISP, this
+means you don't have to worry about whether the name is &quot;foo.bat&quot;,
+&quot;FOO.BAT&quot; or even &quot;FoO.bAt&quot;, they will all work.
+However, in other file systems [UNIX in particular], uppercase and lowercase
+do make a difference:</p>
+
+<p>This will create a file named FOO-FILE in UNIX, because XLISP uppercases
+its symbols:</p>
+
+<pre class="example">
+(open 'foo-file :direction :output)
+</pre>
+
+<p>This will create a file named 'foo-file' because UNIX doesn't
+uppercase its file names:</p>
+
+<pre class="example">
+(open "foo-file" :direction :output)
+</pre>
+
+<p>So, if you are having trouble with opening and accessing files, check to
+make sure the file name is in the proper case.</p>
+
+<p><b>Common Lisp:</b> The XLISP 'save' function is similar in use to the
+'save-world' function in Common Lisp. The primarily difference is that
+'save-world' allows you to restart everything since it creates an executable
+file. The 'save' function requires you to start XLISP up first and then do a
+<a href="restore.htm">restore</a>. Depending on the operating system
+that you are using, it is possible to write a 'save-world' equivalent using
+'save', <a href="restore.htm">restore</a> and system.htm
+functions.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-031.htm#save">save</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/second.htm b/docsrc/xlisp/xlisp-doc/reference/second.htm
new file mode 100644
index 0000000..1b1c3e0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/second.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP second</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>second</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(second <i>expr</i>)</dt>
+<dd><i>expr</i> - a list or list expression<br>
+returns - the second element of <i>expr</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'second' function returns the second element of a list or list
+expression. If the list is
+<nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(second '(1 2 3)) <font color="#008844">; returns 2</font>
+(second NIL) <font color="#008844">; returns NIL</font>
+
+(setq carol '(a b c)) <font color="#008844">; set up variable CAROL</font>
+(first carol) <font color="#008844">; returns A</font>
+(second carol) <font color="#008844">; returns B</font>
+(rest carol) <font color="#008844">; returns (B C)</font>
+
+(setq children '(amanda ben)) <font color="#008844">; set up variable CHILDREN</font>
+(second children) <font color="#008844">; returns BEN</font>
+</pre>
+
+<p><b>Note:</b> This function is set to the same code as the
+<a href="caar.htm">cadr</a> function.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#second">second</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/self.htm b/docsrc/xlisp/xlisp-doc/reference/self.htm
new file mode 100644
index 0000000..83ca806
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/self.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP self</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>self</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>symbol</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;self</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'self' symbol evaluates to the current object when used within a
+message context.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq my-class (send class :new '(state))) <font color="#008844">; create MY-CLASS with STATE</font>
+
+(send my-class :answer :isnew '() <font color="#008844">; set up initialization</font>
+ '((setq state nil) SELF)) <font color="#008844">; returning SELF</font>
+
+(send my-class :answer :set-it '(value) <font color="#008844">; create :SET-IT message</font>
+ '((setq state value)))
+
+(setq my-obj (send my-class :new)) <font color="#008844">; create MY-OBJ of MY-CLASS</font>
+(send my-obj :set-it 5) <font color="#008844">; STATE is set to 5</font>
+</pre>
+
+<p><b>Context:</b> 'self' does not exist except within the context of a
+method and it's execution.</p>
+
+<p><b>Note:</b> In the previous example, there is a 'self' in the line that
+creates the ':set-it' message. What this does is to return the object as the
+last operation when you do an <a href="keyword-isnew.htm">:isnew</a>.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-010.htm#10-3">self</a>
+symbol in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/send-super.htm b/docsrc/xlisp/xlisp-doc/reference/send-super.htm
new file mode 100644
index 0000000..c29d01f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/send-super.htm
@@ -0,0 +1,87 @@
+<html><head><title>XLISP send-super</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>send-super</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(send-super <i>message</i> [<i>args</i>])</dt>
+<dd><i>message</i> - the message selector<br>
+<i>args</i> - the optional message arguments<br>
+returns - the result of sending the message</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'send-super' function sends the specified arguments 'args' to the
+'message' specified method of the superclass. It is necessary for
+'send-super' to be executed from within a method being performed on an
+<a href="object.htm">object</a>. It will return the result of
+sending the message. If 'send-super' is performed outside of a method an
+error will result.</p>
+
+<pre class="example">
+<font color="#AA0000">error: not in a method</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq a-class (send class :new '())) <font color="#008844">; create A-CLASS</font>
+
+(send a-class :answer :show '() <font color="#008844">; set up special SHOW method</font>
+ '((print "nobody here") self))
+
+(setq an-obj (send a-class :new)) <font color="#008844">; create AN-OBJ of A-CLASS</font>
+(send an-obj :show) <font color="#008844">; prints "nobody here"</font>
+
+(send a-class :answer :myshow '() <font color="#008844">; set up MYSHOW method which</font>
+ '((send-super :show ))) <font color="#008844">; calls :SHOW in superclass</font>
+
+(send an-obj :myshow) <font color="#008844">; prints Object is ...</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-010.htm#10-4">send-super</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/send.htm b/docsrc/xlisp/xlisp-doc/reference/send.htm
new file mode 100644
index 0000000..8874399
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/send.htm
@@ -0,0 +1,96 @@
+<html><head><title>XLISP send</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>send</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlobj.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(send object message [args])</dt>
+<dd><i>object</i> - an <a href="object.htm">object</a><br>
+<i>message</i> - message selector for <i>object</i><br>
+<i>arg</i> - parameter sent to <i>object</i> method<br>
+returns - the <i>object</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'send' function is the mechanism used to send a 'message' to an
+<a href="object.htm">object</a>. The 'message' is the message
+selector symbol that is used to select a particular action [method] from
+the <a href="object.htm">object</a>.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq myclass (send class :new '(var))) <font color="#008844">; create MYCLASS with VAR</font>
+
+(send myclass :answer :isnew '() <font color="#008844">; set up initialization</font>
+ '((setq var nil) self))
+
+(send myclass :answer :set-it '(value) <font color="#008844">; create :SET-IT message</font>
+ '((setq var value)))
+
+(setq my-obj (send myclass :new)) <font color="#008844">; create MY-OBJ of MYCLASS</font>
+(send my-obj :set-it 5) <font color="#008844">; VAR is set to 5</font>
+</pre>
+
+<p><b>Built-in methods:</b> The built in methods in XLISP include:</p>
+
+<ul>
+<li><nobr><a href="keyword-answer.htm">:answer</a> - add a method to an object</nobr></li>
+<li><nobr><a href="keyword-class.htm">:class</a> - return the object's <a href="class.htm">class</a></nobr></li>
+<li><nobr><a href="keyword-isnew.htm">:isnew</a> - run initialization code on object</nobr></li>
+<li><nobr><a href="keyword-new.htm">:new</a> - create a new object [instance or <a href="class.htm">class</a>]</nobr></li>
+<li><nobr><a href="keyword-show.htm">:show</a> - show the internal state of the object</nobr></li>
+</ul>
+
+<p><b>Message structure:</b> The normal XLISP convention for a 'message' is
+to have a valid symbol preceeded by a colon like
+<a href="keyword-isnew.htm">:isnew</a> or ':my-message'. However, it is
+possible to define a 'message' that is a symbol without a colon, but this
+makes the code less readable.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-010.htm#10-2">send</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/set-difference.htm b/docsrc/xlisp/xlisp-doc/reference/set-difference.htm
new file mode 100644
index 0000000..731ecb7
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/set-difference.htm
@@ -0,0 +1,75 @@
+<html><head><title>XLISP set-difference</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>set-difference</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xm.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>set-difference</b> <i>list1 list2</i>)</nobr></dt>
+<dd><i>listN</i> - a list of symbols or numbers<br>
+returns - the set-difference of <i>list1</i> and <i>list2</i></dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, '<nobr>set-difference</nobr>' is implemented as a Lisp function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">set-difference</font> (a b)
+ (remove-if (lambda (elem) (member elem b)) a))
+</pre>
+
+<h2>Description</h2>
+
+<p>The '<nobr>set-difference</nobr>' function computes the
+<nobr>set-difference</nobr> of two lists. <nobr>The result</nobr> is a list
+containing all elements that appear in only one of both lists.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/set.htm b/docsrc/xlisp/xlisp-doc/reference/set.htm
new file mode 100644
index 0000000..e67abb0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/set.htm
@@ -0,0 +1,83 @@
+<html><head><title>XLISP set</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>set</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(set <i>symbol expr</i>)</dt>
+<dd><i>symbol</i> - expression that evaluates to a symbol name [if the
+expression is quoted, no evaluation occurs]<br>
+<i>expr</i> - an expression, which will be the new value<br>
+returns - the new value</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'set' function evaluates 'symbol' and sets 'expr' as it's value. If
+the 'symbol' value is quoted via the <a href="quote.htm">quote</a>
+special form or read-macro expansion, the 'symbol' is not evaluated. 'set'
+returns the value from 'expr' as it's result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(set 'a 2) <font color="#008844">; sets symbol A to value 2</font>
+(set 'value a) <font color="#008844">; sets symbol VALUE to value 2</font>
+(print value) <font color="#008844">; show the value - prints 2</font>
+
+(set 'name 'myvar) <font color="#008844">; set symbol NAME to value MYVAR</font>
+(set name 12345) <font color="#008844">; set symbol which is the value</font>
+ <font color="#008844">; of NAME (MYVAR) to 12345</font>
+
+(print name) <font color="#008844">; prints MYVAR</font>
+(print myvar) <font color="#008844">; prints 12345</font>
+
+(set notsymbol 1) <font color="#008844">; error: unbound variable</font>
+(set name notvalue) <font color="#008844">; error: unbound variable</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#set">set</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/setdir.htm b/docsrc/xlisp/xlisp-doc/reference/setdir.htm
new file mode 100644
index 0000000..8e820ec
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/setdir.htm
@@ -0,0 +1,65 @@
+<html><head><title>XLISP setdir</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>setdir</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>sys/unix/osstuff.c, sys/win/msvc/winfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(setdir <i>path</i>) - set current directory</dt>
+<dd><i>path</i> - the path of the new directory<br>
+returns - the resulting full path or NIL if an error occurs</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'setdir' function sets current directory, e.g. <nobr>(setdir
+".")</nobr> gets the current working directory.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p>See also <a href="listdir.htm">listdir</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/setf.htm b/docsrc/xlisp/xlisp-doc/reference/setf.htm
new file mode 100644
index 0000000..72845bf
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/setf.htm
@@ -0,0 +1,273 @@
+<html><head><title>XLISP setf</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>setf</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(setf [<i>place1 expr1</i> ... ])</dt>
+<dd><i>placeN</i> - a field specifier which may be one of:<br>
+<dl><dd><i>symbol</i> - set value of a symbol<br>
+(<a href="car.htm">car</a> <i>expr</i>) - set <a href="caar.html">car</a> of a cons node<br>
+(<a href="cdr.htm">cdr</a> <i>expr</i>) - set <a href="cddr.html">cdr</a> of a cons node<br>
+(<a href="nth.htm">nth</a> <i>n expr</i>) - set <a href="or.html">nth</a> car of a list<br>
+(<a href="aref.htm">aref</a> <i>expr n</i>) - set nth element of an array<br>
+(<a href="get.htm">get</a> <i>symbol property</i>) - set value of a property<br>
+(<a href="symbol-value.htm">symbol-value</a> <i>symbol</i>) - set value of a symbol<br>
+(symbol-function <i>symbol</i>) - set functional value of a symbol<br>
+(<a href="symbol-plist.htm">symbol-plist</a> <i>symbol</i>) - set property list of a symbol</dd></dl>
+<i>exprN</i> - an expression, which will be the new value<br>
+returns - the new value</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'setf' special form evaluates the field 'placeN' and sets 'exprN' as
+it's value. This is a generalized tool that allows you to set the value of
+the various data types of the system. 'setf' returns the value from 'exprN'
+as it's result. The specific action of 'setf' depends on the 'placeN' field.
+A more detailed explanation follows below the examples.</p>
+
+<h2>Examples</h2>
+
+
+<pre class="example">
+<font color="#008844">:; setf symbols</font>
+
+(setf a 123) <font color="#008844">; set a symbol A to value 123</font>
+</pre>
+
+<pre class="example">
+<font color="#008844">;; setf symbol-values</font>
+
+(setq x 'y) <font color="#008844">; make symbol X with value Y</font>
+(setf (symbol-value x) 'z) <font color="#008844">; set symbol that X contains (Y) to value Z</font>
+</pre>
+
+<pre class="example">
+<font color="#008844">;; setf list elements</font>
+
+(setq mylist '(a b c d)) <font color="#008844">; MYLIST with value (A B C D)</font>
+
+(setf (car mylist) 'x) <font color="#008844">; change CAR of MYLIST to X</font>
+ <font color="#008844">; MYLIST now is (X B C D)</font>
+
+(setf (cdr mylist) '(y z da-end)) <font color="#008844">; change CDR of MYLIST to (Y Z DA-END)</font>
+ <font color="#008844">; MYLIST now is (X Y Z DA-END)</font>
+
+(setf (nth 3 mylist) 'here-i-am) <font color="#008844">; change 3rd of MYLIST to HERE-I-AM</font>
+ <font color="#008844">; MYLIST now is (X Y Z HERE-I-AM)</font>
+</pre>
+
+<pre class="example">
+<font color="#008844">;; setf arrays</font>
+
+(setq myarray (make-array 5)) <font color="#008844">; make MYARRAY</font>
+(aref myarray 2) <font color="#008844">; get value of element 2 = NIL</font>
+(setf (aref myarray 2) 'new-value) <font color="#008844">; set value of element 2 to value NEW-VALUE</font>
+(print myarray) <font color="#008844">; prints #(NIL NIL NEW-VALUE NIL NIL)</font>
+</pre>
+
+<pre class="example">
+<font color="#008844">;; setf properties</font>
+
+(setq person 'joe-bob) <font color="#008844">; make PERSON with value JOE-BOB</font>
+(putprop person 'critic 'profession) <font color="#008844">; set PROFESSION property to value CRITIC</font>
+(setf (get person 'profession) <font color="#008844">; change PROFESSION to value TEXAS-CRITIC</font>
+(setf (get person 'home) 'texas) <font color="#008844">; add property HOME with value TEXAS</font>
+
+(symbol-plist person) <font color="#008844">; returns property list:</font>
+ <font color="#008844">; (HOME TEXAS</font>
+ <font color="#008844">; PROFESSION TEXAS-CRITIC)</font>
+
+(setf (symbol-plist person) <font color="#008844">; change the property list</font>
+ '(home on-the-range
+ profession movie-critic))
+
+(get person 'profession) <font color="#008844">; now returns MOVIE-CRITIC</font>
+(get person 'home) <font color="#008844">; now returns ON-THE-RANGE</font>
+</pre>
+
+<h2>Operations</h2>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(setf <i>sym exprN</i>)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">Sets the value of 'symbol' to the value of 'exprN'.
+ This is equivalent to <nobr>(<a href="setq.htm">setq</a>
+ <i>sym exprN</i>)</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(setf (<a href="car.htm">car</a> <i>expr</i>) <i>exprN</i>)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">Sets the first element of the 'expr' list to 'exprN'.
+ 'expr' must be a list. This is equivalent to
+ <nobr>(<a href="rplaca.htm">rplaca</a> <i>expr exprN</i>)</nobr>
+ except that 'setf' will return 'exprN' as the value.</td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(setf (<a href="cdr.htm">cdr</a> <i>expr</i>) <i>exprN</i>)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">Sets the tail of the 'expr' list to 'exprN'. 'expr' must
+ be a list. This is equivalent to
+ <nobr>(<a href="rplacd.htm">rplacd</a> <i>expr exprN</i>)</nobr>
+ except that 'setf' will return 'exprN' as the value.</td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(setf (<a href="nth.htm">nth</a> <i>n expr</i>) <i>exprN</i>)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">Sets the <a href="nth.htm">nth</a> element of
+ the 'expr' list to 'exprN'. 'expr' must be a list. This allows you to
+ set an arbitrary element of a list to an arbitrary value. Note that the
+ list is numbered from the 0th element <nobr>(0, 1, 2, 3,
+ ...).</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(setf (<a href="aref.htm">aref</a> <i>expr n</i>) <i>exprN</i>)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">Sets the nth element of the 'expr' array to 'exprN'.
+ 'expr' must be an array. This allows you to set an arbitrary element of
+ an array to an arbitrary value. Note that the list is numbered from the
+ 0th element <nobr>(0, 1, 2, 3, ...).</nobr> Note also that this is the
+ intended way to set the value of an array element.</td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(setf (<a href="get.htm">get</a> <i>sym prop</i>) <i>exprN</i>)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">Sets the 'property' of 'symbol' to the value 'exprN'.
+ If 'symbol' does not have the 'property', one will be created. This is
+ equivalent to <nobr>(<a href="putprop.htm">putprop</a> <i>sym
+ exprN prop</i>)</nobr>.</td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(setf (<a href="symbol-value.htm">symbol-value</a> <i>sym</i>) <i>exprN</i>)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">Sets the symbol's value to contain 'exprN'. 'symbol' is
+ an expression that must evaluate to a valid symbol, it doesn't have to
+ exist before the 'setf' function is applied, it just has to be a valid
+ symbol. This is equivalent to <nobr>(<a
+ href="set.htm">set</a> <i>symbol exprN</i>).</nobr></td>
+</tr>
+<tr>
+ <td style="height:10px"></td>
+</tr>
+<tr>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(setf (<a href="symbol-plist.htm">symbol-plist</a> <i>sym</i>) <i>exprN</i>)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">Sets the property list of 'symbol' to 'exprN'. This
+ allows you to change or destroy the entire property list of a 'symbol'
+ at one time.</td>
+</tr>
+</tbody></table></p>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#setf">setf</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/setq.htm b/docsrc/xlisp/xlisp-doc/reference/setq.htm
new file mode 100644
index 0000000..83fee7a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/setq.htm
@@ -0,0 +1,70 @@
+<html><head><title>XLISP setq</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>setq</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(setq [<i>symbol1 expr1</i>] ... )</dt>
+<dd><i>symbolN</i> - un-evaluated symbol<br>
+<i>exprN</i> - value for <i>symbolN</i><br>
+returns - the new value</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'setq' special form sets 'expr' as the value of 'symbol'. 'setq'
+returns the value from 'expr' as it's result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq a 1) <font color="#008844">; symbol A gets value 1</font>
+(setq b '(a b c)) <font color="#008844">; symbol B gets value (A B C)</font>
+(setq mynum (+ 3 4)) <font color="#008844">; symbol MYNUM gets value 7</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#setq">setq</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/setup-console.htm b/docsrc/xlisp/xlisp-doc/reference/setup-console.htm
new file mode 100644
index 0000000..ff21c53
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/setup-console.htm
@@ -0,0 +1,72 @@
+<html><head><title>XLISP setup-console</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>setup-console</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>sys/unix/osstuff.c, sys/mac/macstuff.c, sys/win/msvc/winfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(setup-console)</dt>
+<dd>returns - <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>setup-console</nobr>' function sets the default console
+attributes.</p>
+
+<p><b>Note:</b> Under Windows, Nyquist normally starts up in a
+<nobr>medium-sized</nobr> console window with black text and a white
+background, with a window title of 'Nyquist'. This is normally accomplished
+by calling '<nobr>setup-console</nobr>' <nobr>in 'system.lsp'</nobr>.
+<nobr>In Nyquist</nobr>, you can avoid this behavior by setting
+<nobr>*setup-console*</nobr> to <a href="nil.htm">NIL</a> in your
+'<nobr>init.lsp</nobr>' file. <nobr>If 'setup-console'</nobr> is not called,
+Nyquist uses standard input and output <nobr>as is</nobr>. This is what you
+want if you are running Nyquist inside of emacs, for example.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/sin.htm b/docsrc/xlisp/xlisp-doc/reference/sin.htm
new file mode 100644
index 0000000..6ca07b6
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/sin.htm
@@ -0,0 +1,76 @@
+<html><head><title>XLISP sin</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>sin</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(sin <i>expr</i>)</dt>
+<dd><i>expr</i> - floating point number or expression<br>
+returns - the sine of the number</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'sin' function returns the sine of the 'expr'. The 'expr' is in
+radians.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(sin 0.0) <font color="#008844">; returns 0</font>
+(sin .5) <font color="#008844">; returns 0.479426</font>
+(sin 1.0) <font color="#008844">; returns 0.841471</font>
+(sin (/ 3.14159 2)) <font color="#008844">; returns 1</font>
+(sin 3.14159) <font color="#008844">; returns 2.65359e-06</font>
+(sin 0) <font color="#008844">; error: bad integer operation</font>
+(sin 1.) <font color="#008844">; error: bad integer operation</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common LISP allows for integer numbers, which
+XLISP does not support for 'sin'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#sin">sin</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/sort.htm b/docsrc/xlisp/xlisp-doc/reference/sort.htm
new file mode 100644
index 0000000..ac874e1
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/sort.htm
@@ -0,0 +1,104 @@
+<html><head><title>XLISP sort</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>sort</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(sort <i>list test</i>)</dt>
+<dd><i>list</i> - a list containing elements to be sorted<br>
+<i>test</i> - the test to use for the sort<br>
+returns - the sorted list</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'sort' function sorts the 'list' using the 'test' to order the
+list. The 'sort' function is destructive and modifies the 'list'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq a '(3 1 4 1 5 9 6 7)) <font color="#008844">; returns (3 1 4 1 5 9 6 7)</font>
+
+(sort a '&lt;) <font color="#008844">; returns (1 1 3 4 5 6 7 9)</font>
+
+(print a) <font color="#008844">; returns (1 1 3 4 5 6 7 9)</font>
+ <font color="#008844">; notice that A is modified</font>
+
+(sort a '&gt;) <font color="#008844">; returns (9 7 6 5 4 3 1 1)</font>
+
+(sort '("a" "bar" "foo") 'string&gt;) <font color="#008844">; returns ("foo" "bar" "a")</font>
+</pre>
+
+<p><div class="box">
+
+<p><b>XLISP Bug</b></p>
+
+<p>Nyquist 'sort' returns the proper value, but improperly modifies the
+symbol or the actual 'list', for example:</p>
+
+<pre class="example">
+(setq a '(3 1 4 1 5 9 6 7)) =&gt; (3 1 4 1 5 9 6 7)
+(sort a '&lt;) =&gt; (1 1 3 4 5 6 7 9) <font color="#008844">; OK</font>
+a =&gt; (3 4 5 6 7 9) <font color="#AA0000">; BUG</font>
+</pre>
+
+<p>But this way it works:</p>
+
+<pre class="example">
+(setq a '(3 1 4 1 5 9 6 7)) =&gt; (3 1 4 1 5 9 6 7)
+(setq a (sort a '&lt;)) =&gt; (1 1 3 4 5 6 7 9)
+a =&gt; (1 1 3 4 5 6 7 9)
+</pre>
+
+</div></p>
+
+<p><b>Common Lisp:</b> Common Lisp allows for a ':key' keyword, which
+allows a specified function to be run before the ordering takes place, which
+XLISP does not support.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-017.htm#sort">sort</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/soundp.htm b/docsrc/xlisp/xlisp-doc/reference/soundp.htm
new file mode 100644
index 0000000..3e72247
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/soundp.htm
@@ -0,0 +1,70 @@
+<html><head><title>XLISP soundp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>soundp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>sndfnint.c, sound.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>soundp</b> <i>expr</i>)</nobr></dt>
+<dd><i>expr</i> - an arbitrary Lisp expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if <i>expr</i> is a sound,
+<a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'soundp' function returns <a href="t.htm">&nbsp;T&nbsp;</a> if
+'expr' is a Nyquist sound, <a href="nil.htm">NIL</a> otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p>Please see the Nyquist manual for Nyquist/XLISP audio functions.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/sqrt.htm b/docsrc/xlisp/xlisp-doc/reference/sqrt.htm
new file mode 100644
index 0000000..c563933
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/sqrt.htm
@@ -0,0 +1,76 @@
+<html><head><title>XLISP sqrt</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>sqrt</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(sqrt <i>expr</i>)</dt>
+<dd><i>expr</i> - floating point number or expression<br>
+returns - the square root of the number</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'sqrt' function calculates the square root of 'expr' and returns
+this result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(sqrt 1.0) <font color="#008844">; returns 1</font>
+(sqrt 2.0) <font color="#008844">; returns 1.41421</font>
+(sqrt 3.0) <font color="#008844">; returns 1.73205</font>
+(sqrt 4.0) <font color="#008844">; returns 2</font>
+(sqrt 5.0) <font color="#008844">; returns 2.23607</font>
+(sqrt -1.0) <font color="#008844">; error: square root of a negative number</font>
+(sqrt 2) <font color="#008844">; error: bad integer operation</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp allows for integer numbers, which
+XLISP does not support for 'sqrt'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#sqrt">sqrt</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/strcat.htm b/docsrc/xlisp/xlisp-doc/reference/strcat.htm
new file mode 100644
index 0000000..f0437b9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/strcat.htm
@@ -0,0 +1,72 @@
+<html><head><title>XLISP strcat</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>strcat</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(strcat [<i>string1</i> ... ])</dt>
+<dd><i>stringN</i> - a string expression<br>
+returns - the result of concatenating the strings</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'strcat' function returns the concatenation of a sequence of string
+expressions. If there are no strings, an empty string is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(strcat) <font color="#008844">; returns ""</font>
+(strcat "a") <font color="#008844">; returns "a"</font>
+(strcat "a" "b") <font color="#008844">; returns "ab"</font>
+(strcat "ab" "cd" "ef") <font color="#008844">; returns "abcdef"</font>
+(strcat "f" "ire tr" "uck") <font color="#008844">; returns "fire truck"</font>
+(strcat 1 2) <font color="#008844">; error: bad argument type</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#strcat">strcat</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/streamp.htm b/docsrc/xlisp/xlisp-doc/reference/streamp.htm
new file mode 100644
index 0000000..848998b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/streamp.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP streamp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>streamp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(streamp <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the value is a
+stream, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'streamp' predicate function checks if an 'expr' is a stream.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr' is a
+stream, <a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<p>EXAMPLES</p>
+
+<pre class="example">
+(streamp *standard-input*) <font color="#008844">; returns T - stream</font>
+(streamp *debug-io*) <font color="#008844">; returns T - stream</font>
+(streamp (make-string-output-stream)) <font color="#008844">; returns T - stream</font>
+
+(setq a *standard-output*)
+(streamp a) <font color="#008844">; returns T - evaluates to stream</font>
+
+(streamp "a") <font color="#008844">; returns NIL - string</font>
+(streamp #\a) <font color="#008844">; returns NIL - character</font>
+(streamp '(a b c)) <font color="#008844">; returns NIL - list</font>
+(streamp 1) <font color="#008844">; returns NIL - integer</font>
+(streamp 1.2) <font color="#008844">; returns NIL - float</font>
+(streamp '*debug-io*) <font color="#008844">; returns NIL - symbol</font>
+(streamp 'a) <font color="#008844">; returns NIL - symbol</font>
+(streamp #(0 1 2)) <font color="#008844">; returns NIL - array</font>
+(streamp NIL) <font color="#008844">; returns NIL - NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#streamp">streamp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-downcase.htm b/docsrc/xlisp/xlisp-doc/reference/string-downcase.htm
new file mode 100644
index 0000000..f67c211
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-downcase.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP string-downcase</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-downcase</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-downcase <i>string</i> [{:start | :end} <i>offset</i>] ... )</dt>
+<dd><i>string</i> - a string expression<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a converted copy of the string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-downcase' function takes a string argument and returns a new
+string that has been made lower case.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string'. The
+keyword arguments require a keyword ':start' or ':end' first and a single
+integer expression second. The ':start' keyword specifies the starting
+offset for the 'string-downcase' operation on 'string'. A value of 0 starts
+the string at the beginning [no offset]. The ':end' keyword specifies the
+end offset for the operation on 'string'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-downcase "ABcd+-12&amp;[") <font color="#008844">; returns "abcd+-&amp;["</font>
+(string-downcase "ABCDEFGH" :start 2 :end 4) <font color="#008844">; returns "ABcdEFGH"</font>
+
+(setq mystr "ABcdEFgh") <font color="#008844">; set up variable</font>
+(string-downcase mystr) <font color="#008844">; returns "abcdefgh"</font>
+(print mystr) <font color="#008844">; prints "ABcdEFgh"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-downcase">string-downcase</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-equal-i.htm b/docsrc/xlisp/xlisp-doc/reference/string-equal-i.htm
new file mode 100644
index 0000000..f83b91c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-equal-i.htm
@@ -0,0 +1,111 @@
+<html><head><title>XLISP tring-equal</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-equal</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-equal <i>string1 string2</i> [<i>key offset</i>] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if <i>string1</i>
+equal to <i>string2</i>,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-equal' function takes two string arguments. It checks to see
+if the string arguments have the same values.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'string1' is
+equal to 'string2', <a href="nil.htm">NIL</a> is returned
+otherwise. This test is not case sensitive, the character '#\a' is
+considered to be the same as '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-equal "a" "b") <font color="#008844">; returns NIL</font>
+(string-equal "a" "a") <font color="#008844">; returns T</font>
+(string-equal "a" "A") <font color="#008844">; returns T</font>
+(string-equal "A" "a") <font color="#008844">; returns T</font>
+(string-equal "abc" "abc ") <font color="#008844">; returns NIL</font>
+
+(string-equal "J Smith" "K Smith" :start1 1 :start2 1) <font color="#008844">; strip off the first chars</font>
+ <font color="#008844">; returns T</font>
+
+(string-equal "abc" "123456789" :end2 3 :end1 3) <font color="#008844">; leave just the first 3 chars</font>
+ <font color="#008844">; returns NIL</font>
+</pre>
+
+<p><b>Bug:</b> The 'string-equal' function is listed in the original XLISP
+documentation as 'string-equalp'. In the XLISP interpreter a call to
+'string-equalp' causes an error:</p>
+
+<pre class="example">
+<font color="#AA0000">error: unbound function - STRING-EQUALP</font>
+</pre>
+
+<p>The 'string-equal' function works exactly as the 'string-equalp' function
+described in the XLISP manual. This bug had obviously been corrected in
+the manual only but never in the interpreter. As the bug still exists with
+<nobr>Nyquist 2.36</nobr> in <nobr>July 2007</nobr> as well as all other
+<nobr>XLISP 2.x</nobr> implementations I know, I have changed both manuals
+to 'string-equal' even if I myself whould consider 'string-equalp' as the
+better name.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-equalp">string-equal</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-equal-s.htm b/docsrc/xlisp/xlisp-doc/reference/string-equal-s.htm
new file mode 100644
index 0000000..a50ad74
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-equal-s.htm
@@ -0,0 +1,96 @@
+<html><head><title>XLISP string=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string= <i>string1 string2</i> [<i>key offset</i>] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the string
+arguments have the same values,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string=' [string-equal] function takes two string arguments. It
+checks to see if the string arguments have the same values.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'string1' is
+equal to 'string2', <a href="nil.htm">NIL</a> is returned
+otherwise. This test is case sensitive, the character '#\a' is different and
+of greater <a href="../misc/ascii-table.htm">ASCII</a> value than
+'#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string= "a" "b") <font color="#008844">; returns NIL</font>
+(string= "a" "a") <font color="#008844">; returns T</font>
+(string= "a" "A") <font color="#008844">; returns NIL</font>
+(string= "A" "a") <font color="#008844">; returns NIL</font>
+(string= "abc" "abc ") <font color="#008844">; returns NIL</font>
+
+(string= "J Smith" "K Smith" :start1 1 :start2 1) <font color="#008844">; strip off the first chars </font>
+ <font color="#008844">; returns T</font>
+
+(string= "abc" "123456789" :end2 3 :end1 3) <font color="#008844">; leave just the first 3 chars </font>
+ <font color="#008844">; returns NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-equal">string=</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-greaterp-i.htm b/docsrc/xlisp/xlisp-doc/reference/string-greaterp-i.htm
new file mode 100644
index 0000000..71b18db
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-greaterp-i.htm
@@ -0,0 +1,98 @@
+<html><head><title>XLISP string-greaterp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-greaterp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-greaterp <i>string1 string2</i> [<i>key offset</i>] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a non-<a href="nil.htm">NIL</a> value if <i>string1</i>
+is greater than <i>string2</i> in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-greaterp' [string-greater-than] predicate function takes two
+string arguments. A non-<a href="nil.htm">NIL</a> value is
+returned if 'string1' is greater than 'string2' in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering, otherwise
+<a href="nil.htm">NIL</a> is returned. The
+non-<a href="nil.htm">NIL</a> value returned is the integer index
+of the first character of 'string1' which is
+<a href="char-greaterp-i.htm">char-greaterp</a> [char-greater-than] the
+corresponding character of 'string2'. This test is not case sensitive, the
+character '#\a' is considered to be the same as '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-greaterp "a" "b") <font color="#008844">; returns NIL</font>
+(string-greaterp "a" "a") <font color="#008844">; returns NIL</font>
+(string-greaterp "a" "A") <font color="#008844">; returns NIL</font>
+(string-greaterp "A" "a") <font color="#008844">; returns NIL</font>
+(string-greaterp "abc" "abc ") <font color="#008844">; returns NIL</font>
+(string-greaterp "1234qrst" "12345678") <font color="#008844">; returns 4</font>
+
+(string-greaterp "J Smith" "K Jones" :start1 1 :start2 1) <font color="#008844">; strip off the first chars </font>
+ <font color="#008844">; returns 2</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-greaterp">string-greaterp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-greaterp-s.htm b/docsrc/xlisp/xlisp-doc/reference/string-greaterp-s.htm
new file mode 100644
index 0000000..c5f5fa4
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-greaterp-s.htm
@@ -0,0 +1,99 @@
+<html><head><title>XLISP string&gt;</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string&gt;</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string&gt; string1 string2 [key offset] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a non-<a href="nil.htm">NIL</a> value if <i>string1</i>
+is greater than <i>string2</i> in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string&gt;' [string-greater-than] function takes two string
+arguments. A non-<a href="nil.htm">NIL</a> value is returned if
+'string1' is greater than 'string2' in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering, otherwise
+<a href="nil.htm">NIL</a> is returned. The
+non-<a href="nil.htm">NIL</a> value returned is the integer index
+of the first character of 'string1' which is
+<a href="char-greaterp-s.htm">char&gt;</a> [char-greater-than] the
+corresponding character of 'string2'. This test is case sensitive, the
+character '#\a' is different and of greater
+<a href="../misc/ascii-table.htm">ASCII</a> value than '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string&gt; "a" "b") <font color="#008844">; returns NIL</font>
+(string&gt; "a" "a") <font color="#008844">; returns NIL</font>
+(string&gt; "a" "A") <font color="#008844">; returns 0</font>
+(string&gt; "A" "a") <font color="#008844">; returns NIL</font>
+(string&gt; "abc" "abc ") <font color="#008844">; returns NIL</font>
+(string&gt; "1234qrst" "12345678") <font color="#008844">; returns 4</font>
+
+(string&gt; "J Smith" "K Jones" :start1 1 :start2 1) <font color="#008844">; strip off the first chars</font>
+ <font color="#008844">; returns 2</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-greater-than">string&gt;</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-left-trim.htm b/docsrc/xlisp/xlisp-doc/reference/string-left-trim.htm
new file mode 100644
index 0000000..bf88c2c
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-left-trim.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP string-left-trim</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-left-trim</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-left-trim <i>trim-stuff string</i>)</dt>
+<dd><i>trim-stuff</i> - a string expression<br>
+<i>string</i> - a string expression<br>
+returns - a trimed copy of the string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-left-trim' function takes the 'trim-stuff' characters and
+removes them from the left end of the 'string'. The 'trim-stuff' characters
+are an un-ordered set of characters to be removed, so any character that
+occurs in 'trim-stuff' is removed if it appears in left portion of 'string'.
+A new string is created and returned as the result of this function.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-left-trim "." "....foo....") <font color="#008844">; returns "foo...."</font>
+(string-left-trim "&lt;&gt;" "&lt;&lt;&lt;&lt;bar&gt;&gt;&gt;&gt;") <font color="#008844">; returns "bar&gt;&gt;&gt;&gt;"</font>
+(string-left-trim "(.)" "..(12.34)..") <font color="#008844">; returns "12.34).."</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp also supports a list of characters as
+a valid 'trim-stuff' argument. An example:</p>
+
+<pre class="example">
+(string-trim '(#\Tab #\Newline) mystring)
+</pre>
+
+<p>XLISP does not support non-string parameters. Porting from XLISP will
+be no problem, but modifications will be necessary if porting from Common
+Lisp code which uses a list of characters.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-left-trim">string-left-trim</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-lessp-i.htm b/docsrc/xlisp/xlisp-doc/reference/string-lessp-i.htm
new file mode 100644
index 0000000..14d40f7
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-lessp-i.htm
@@ -0,0 +1,98 @@
+<html><head><title>XLISP string-lessp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-lessp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-lessp <i>string1 string2</i> [<i>key offset</i>] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a non-<a href="nil.htm">NIL</a> value if <i>string1</i>
+is less than <i>string2</i> in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-lessp' [string-less-than] predicate function takes two string
+arguments. A non-<a href="nil.htm">NIL</a> value is returned if
+'string1' is less than 'string2' in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering, otherwise
+<a href="nil.htm">NIL</a> is returned. The
+non-<a href="nil.htm">NIL</a> value returned is the integer index
+of the first character of 'string1' which is
+<a href="char-lessp-i.htm">char-lessp</a> [char-less-than] the
+corresponding character of 'string2'. This test is not case sensitive, the
+character '#\a' is considered to be the same as '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-lessp "a" "b") <font color="#008844">; returns 0</font>
+(string-lessp "a" "a") <font color="#008844">; returns NIL</font>
+(string-lessp "a" "A") <font color="#008844">; returns NIL</font>
+(string-lessp "A" "a") <font color="#008844">; returns NIL</font>
+(string-lessp "abc" "abc ") <font color="#008844">; returns 3</font>
+(string-lessp "1234567" "1234qrst") <font color="#008844">; returns 4</font>
+
+(string-lessp "J Smith" "K Smith" :start1 1 :start2 1) <font color="#008844">; strip off the first chars</font>
+ <font color="#008844">; returns NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-lessp">string-lessp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-lessp-s.htm b/docsrc/xlisp/xlisp-doc/reference/string-lessp-s.htm
new file mode 100644
index 0000000..393ef49
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-lessp-s.htm
@@ -0,0 +1,98 @@
+<html><head><title>XLISP string&lt;</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string&lt;</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string&lt; <i>string1 string2</i> [<i>key offset</i>] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a non-<a href="nil.htm">NIL</a> value if <i>string1</i>
+is less than <i>string2</i> in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string&lt;' [string-less-than] function takes two string arguments.
+A non-<a href="nil.htm">NIL</a> value is returned if 'string1'
+is less than 'string2' in <a href="../misc/ascii-table.htm">ASCII</a>
+ordering, otherwise <a href="nil.htm">NIL</a> is returned. The
+non-<a href="nil.htm">NIL</a> value returned is the integer index
+of the first character of 'string1' which is
+<a href="char-lessp-s.htm">char&lt;</a> [char-less-than] the corresponding
+character of 'string2'. This test is case sensitive, the character '#\a' is
+different and of greater <a href="../misc/ascii-table.htm">ASCII</a>
+value than '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string&lt; "a" "b") <font color="#008844">; returns 0</font>
+(string&lt; "a" "a") <font color="#008844">; returns NIL</font>
+(string&lt; "a" "A") <font color="#008844">; returns NIL</font>
+(string&lt; "A" "a") <font color="#008844">; returns 0</font>
+(string&lt; "abc" "abc ") <font color="#008844">; returns 3</font>
+(string&lt; "1234567" "1234qrst") <font color="#008844">; returns 4</font>
+
+(string&lt; "J Smith" "K Smith" :start1 1 :start2 1) <font color="#008844">; strip off the first chars</font>
+ <font color="#008844">; returns NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-less-than">string&lt;</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-not-equal-i.htm b/docsrc/xlisp/xlisp-doc/reference/string-not-equal-i.htm
new file mode 100644
index 0000000..4360306
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-not-equal-i.htm
@@ -0,0 +1,112 @@
+<html><head><title>XLISP string-not-equal</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-not-equal</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-not-equal string1 string2 [key offset] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a non-<a href="nil.htm">NIL</a> value if <i>string1</i>
+is not equal to <i>string2</i>,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-not-equal' function takes two string arguments. A
+non-<a href="nil.htm">NIL</a> value is returned if 'string1' is
+not equal to 'string2', otherwise <a href="nil.htm">NIL</a> is
+returned. The non-<a href="nil.htm">NIL</a> value returned is the
+integer index of the first character of 'string1' which is
+<a href="char-not-equal-i.htm">char-not-equal</a> to the corresponding
+character of 'string2'. This test is not case sensitive, the character
+'#\a' is considered to be the same as '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-not-equal "a" "b") <font color="#008844">; returns 0</font>
+(string-not-equal "a" "a") <font color="#008844">; returns NIL</font>
+(string-not-equal "a" "A") <font color="#008844">; returns NIL</font>
+(string-not-equal "A" "a") <font color="#008844">; returns NIL</font>
+(string-not-equal "abc" "abc ") <font color="#008844">; returns 3</font>
+
+(string-not-equal "J Smith" "K Smith" :start1 1 :start2 1) <font color="#008844">; strip off the first chars</font>
+ <font color="#008844">; returns NIL</font>
+(string-not-equal "abc" "123456789" :end2 3 :end1 3) <font color="#008844">; leave just the first 3 chars</font>
+ <font color="#008844">; returns 0</font>
+</pre>
+
+<p><b>Bug:</b> The 'string-not-equal' function is listed in the original
+XLISP documentation as 'string-not-equalp'. In the XLISP interpreter a call
+to 'string-not-equalp' causes an error:</p>
+
+<pre class="example">
+<font color="#AA0000">error: unbound function - STRING-NOT-EQUALP</font>
+</pre>
+
+<p>The 'string-not-equal' function works exactly as the 'string-not-equalp'
+function described in the XLISP manual. This bug had obviously been
+corrected in the manual only but never in the interpreter. As the bug still
+exists with <nobr>Nyquist 2.36</nobr> in <nobr>July 2007</nobr> as well as
+all other <nobr>XLISP 2.x</nobr> implementations I know, I have changed both
+manuals to 'string-not-equal' even if I myself whould consider
+'string-not-equalp' as the better name.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-not-equalp">string-not-equal</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-not-equal-s.htm b/docsrc/xlisp/xlisp-doc/reference/string-not-equal-s.htm
new file mode 100644
index 0000000..ef515c6
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-not-equal-s.htm
@@ -0,0 +1,104 @@
+<html><head><title>XLISP string/=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string/=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string/= <i>string1 string2</i> [<i>key offset</i>] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a non-<a href="nil.htm">NIL</a> value if <i>string1</i>
+is not equal to <i>string2</i>,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string/=' [string-not-equal] function takes two string arguments. A
+non-<a href="nil.htm">NIL</a> value is returned if 'string1' is
+not equal to 'string2', otherwise
+<a href="nil.htm">NIL</a> is returned. The
+non-<a href="nil.htm">NIL</a> value returned is the integer index
+of the first character of 'string1' which is
+<a href="char-not-equal-s.htm">char/=</a> [char-not-equal] to the
+corresponding character of 'string2'.
+This test is case sensitive, the character '#\a' is different and of greater
+<a href="../misc/ascii-table.htm">ASCII</a> value than '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string/= "a" "b") <font color="#008844">; returns 0</font>
+(string/= "a" "a") <font color="#008844">; returns NIL</font>
+(string/= "a" "A") <font color="#008844">; returns 0</font>
+(string/= "A" "a") <font color="#008844">; returns 0</font>
+(string/= "abc" "abc ") <font color="#008844">; returns 3</font>
+
+(string/= "J Smith" "K Smith" :start1 1 :start2 1) <font color="#008844">; returns NIL</font>
+(string/= "abc" "123456789" :end2 3 :end1 3) <font color="#008844">; returns 0</font>
+</pre>
+
+<p><b>Note:</b> Be sure that the 'string/=' function is properly typed in.
+The '/' is a forward slash. It is possible to mistakenly type a '\'
+backslash. This is especially easy because the character mechanism is '#\a'.
+If you do use the backslash, no error will be reported because backslash is
+the single escape character and the XLISP reader will evaluate 'string\=' as
+'string='. No error will be reported, but the sense of the test is
+reversed.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-not-equal">string/=</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-not-greaterp-i.htm b/docsrc/xlisp/xlisp-doc/reference/string-not-greaterp-i.htm
new file mode 100644
index 0000000..a5cafa8
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-not-greaterp-i.htm
@@ -0,0 +1,99 @@
+<html><head><title>XLISP string-not-greaterp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-not-greaterp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-not-greaterp <i>string1 string2</i> [<i>key offset</i>] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a non-<a href="nil.htm">NIL</a> value if <i>string1</i>
+is less than or equal to <i>string2</i> in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-not-greaterp' [string-not-greater-than] predicate function
+takes two string arguments. A non-<a href="nil.htm">NIL</a> value
+is returned if 'string1' is less than or equal to 'string2' in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering, otherwise
+<a href="nil.htm">NIL</a> is returned. The
+non-<a href="nil.htm">NIL</a> value returned is the integer index
+of the first character of 'string1' which is
+<a href="">char-not-greaterp</a> [char-not-greater-than] the corresponding
+character of 'string2'. This test is not case sensitive, the character
+'#\a' is considered to be the same as '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-not-greaterp "a" "b") <font color="#008844">; returns 0</font>
+(string-not-greaterp "b" "a") <font color="#008844">; returns NIL</font>
+(string-not-greaterp "a" "a") <font color="#008844">; returns 1</font>
+(string-not-greaterp "a" "A") <font color="#008844">; returns 1</font>
+(string-not-greaterp "A" "a") <font color="#008844">; returns 1</font>
+(string-not-greaterp "abc" "abc ") <font color="#008844">; returns 3</font>
+(string-not-greaterp "12345" "1234qr") <font color="#008844">; returns 4</font>
+
+(string-not-greaterp "J Smith" "K Smith" :start1 1 :start2 1) <font color="#008844">; strip off the first chars</font>
+ <font color="#008844">; returns 7</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-not-greaterp">string-not-greaterp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-not-greaterp-s.htm b/docsrc/xlisp/xlisp-doc/reference/string-not-greaterp-s.htm
new file mode 100644
index 0000000..8710fdf
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-not-greaterp-s.htm
@@ -0,0 +1,99 @@
+<html><head><title>XLISP string&lt;=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string&lt;=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string&lt;= <i>string1 string2</i> [<i>key offset</i>] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a non-<a href="nil.htm">NIL</a> value if <i>string1</i>
+is less than or equal to <i>string2</i> in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string&lt;=' [string-less-than-or-equal] function takes two string
+arguments. A non-<a href="nil.htm">NIL</a> value is returned if
+'string1' is less than or equal to 'string2' in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering, otherwise
+<a href="nil.htm">NIL</a> is returned. The
+non-<a href="nil.htm">NIL</a> value returned is the integer index
+of the first character of 'string1' which is
+<a href="char-not-greaterp-s.htm">char&lt;=</a> [char-less-than-or-equal] to the
+corresponding character of 'string2'. This test is case sensitive, the
+character '#\a' is different and of greater
+<a href="../misc/ascii-table.htm">ASCII</a> value than '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string&lt;= "a" "b") <font color="#008844">; returns 0</font>
+(string&lt;= "a" "a") <font color="#008844">; returns 1</font>
+(string&lt;= "a" "A") <font color="#008844">; returns NIL</font>
+(string&lt;= "A" "a") <font color="#008844">; returns 0</font>
+(string&lt;= "abc" "abc ") <font color="#008844">; returns 3</font>
+(string&lt;= "1234567" "1234qrst") <font color="#008844">; returns 4</font>
+
+(string&lt;= "J Smith" "K Smith" :start1 1 :start2 1) <font color="#008844">; strip off the first chars</font>
+ <font color="#008844">; returns 7</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-less-than-or-equal">string&lt;=</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-not-lessp-i.htm b/docsrc/xlisp/xlisp-doc/reference/string-not-lessp-i.htm
new file mode 100644
index 0000000..e70c391
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-not-lessp-i.htm
@@ -0,0 +1,98 @@
+<html><head><title>XLISP string-not-lessp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-not-lessp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-not-lessp <i>string1 string2</i> [<i>key offset</i>] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a non-<a href="nil.htm">NIL</a> value if <i>string1</i>
+is greater than or equal to <i>string2</i> in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is not significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-not-lessp' [string-not-less-than] predicate function
+takes two string arguments. A non-<a href="nil.htm">NIL</a> value
+is returned if 'string1' is greater than or equal to 'string2' in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering, otherwise
+<a href="nil.htm">NIL</a> is returned. The
+non-<a href="nil.htm">NIL</a> value returned is the integer index
+of the first character of 'string1' which is
+<a href="char-lessp-i.htm">char-not-lessp</a> [char-not-less-than] the
+corresponding character of 'string2'. This test is not case sensitive, the
+character '#\a' is considered to be the same as '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-not-lessp "a" "b") <font color="#008844">; returns NIL</font>
+(string-not-lessp "a" "a") <font color="#008844">; returns 1</font>
+(string-not-lessp "a" "A") <font color="#008844">; returns 1</font>
+(string-not-lessp "A" "a") <font color="#008844">; returns 1</font>
+(string-not-lessp "abc" "abc ") <font color="#008844">; returns NIL</font>
+(string-not-lessp "1234qr" "123456") <font color="#008844">; returns 4</font>
+
+(string-not-lessp "J Smith" "K Jones" :start1 1 :start2 1) <font color="#008844">; strip off the first chars </font>
+ <font color="#008844">; returns 2</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-not-lessp">string-not-lessp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-not-lessp-s.htm b/docsrc/xlisp/xlisp-doc/reference/string-not-lessp-s.htm
new file mode 100644
index 0000000..527c116
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-not-lessp-s.htm
@@ -0,0 +1,99 @@
+<html><head><title>XLISP string&gt;=</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string&gt;=</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string&gt;= <i>string1 string2</i> [<i>key offset</i>] ... )</dt>
+<dd><i>stringN</i> - a string expression<br>
+<i>key</i> - a keyword [one of :start1 :start2 :end1 :end2]<br>
+<i>offset</i> - an optional integer expression for a keyword<br>
+returns - a non-<a href="nil.htm">NIL</a> value if <i>string1</i>
+is greater than or equal to <i>string2</i> in
+<a href="../misc/ascii-table.htm">ASCII</a> ordering,
+<a href="nil.htm">NIL</a> otherwise<br>
+<b>Note:</b> case is significant with this function</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string&gt;=' [string-greater-than-or-equal] function takes two
+string arguments. A non-<a href="nil.htm">NIL</a> value is
+returned if 'string1' is greater than or equal to 'string2' in an
+<a href="../misc/ascii-table.htm">ASCII</a> ordering, otherwise
+<a href="nil.htm">NIL</a> is returned. The
+non-<a href="nil.htm">NIL</a> value returned is the integer index
+of the first character of 'string1' which is
+<a href="char-not-lessp-s.htm">char&gt;=</a> [char-greater-than-or-equal] to
+the corresponding character of 'string2'. This test is case sensitive, the
+character '#\a' is different and of greater
+<a href="../misc/ascii-table.htm">ASCII</a> value than '#\A'.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string1' and
+'string2'. The keyword arguments each require a keyword ':start1', ':end1',
+':start2' or ':end2' and a single integer expression as a pair with the
+keyword first and the integer second. The pairs may be in any order. The
+':startN' keywords specify the starting offset of the substring. A value of
+0 starts the string at the beginning [no offset]. The ':endN' keywords
+specify the ending offset of the substring. A value of 3 ends the string
+after the 3rd character [an offset of 3 characters].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string&gt;= "a" "b") <font color="#008844">; returns NIL</font>
+(string&gt;= "a" "a") <font color="#008844">; returns 1</font>
+(string&gt;= "a" "A") <font color="#008844">; returns 0</font>
+(string&gt;= "A" "a") <font color="#008844">; returns NIL</font>
+(string&gt;= "abc" "abc ") <font color="#008844">; returns NIL</font>
+(string&gt;= "1234qrst" "12345678") <font color="#008844">; returns 4</font>
+
+(string&gt;= "J Smith" "K Jones" :start1 1 :start2 1) <font color="#008844">; strip off the first chars</font>
+ <font color="#008844">; returns 2</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-greater-than-or-equal">string&gt;=</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-right-trim.htm b/docsrc/xlisp/xlisp-doc/reference/string-right-trim.htm
new file mode 100644
index 0000000..56cb58d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-right-trim.htm
@@ -0,0 +1,85 @@
+<html><head><title>XLISP string-right-trim</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-right-trim</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-right-trim <i>trim-stuff string</i>)</dt>
+<dd><i>trim-stuff</i> - a string expression<br>
+<i>string</i> - a string expression<br>
+returns - a trimed copy of the string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-right-trim' function takes the 'trim-stuff' characters and
+removes them from the right end of the 'string'. The 'trim-stuff' characters
+are an un-ordered set of characters to be removed, so any character that
+occurs in 'trim-stuff' is removed if it appears in right portion of
+'string'. A new string is created and returned as the result of this
+function.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-right-trim "." "....foo....") <font color="#008844">; returns "....foo"</font>
+(string-right-trim "&lt;&gt;" "&lt;&lt;&lt;&lt;bar&gt;&gt;&gt;&gt;") <font color="#008844">; returns "&lt;&lt;&lt;&lt;bar"</font>
+(string-right-trim "(.)" "..(12.34)..") <font color="#008844">; returns "..(12.34"</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common LISP also supports a list of characters as
+a valid 'trim-stuff' argument. An example:
+
+<pre class="example">
+(string-trim '(#\Tab #\Newline) mystring)
+</pre>
+
+<p>XLISP does not support non-string parameters. Porting from XLISP will be
+no problem, but modifications will be necessary if porting from Common LISP
+code which uses a list of characters.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-right-trim">string-right-trim</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-search.htm b/docsrc/xlisp/xlisp-doc/reference/string-search.htm
new file mode 100644
index 0000000..ebf5e8a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-search.htm
@@ -0,0 +1,68 @@
+<html><head><title>XLISP string-search</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-search</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(<b>string-search</b> <i>pattern</i> <i>string</i> &amp;key :start :end)</dt><dd>
+<i>pattern</i> - a string to search for<br>
+<i>string</i> - the string to be searched<br>
+:start <i>integer</i> - the starting offset in <i>string</i><br>
+:end <i>integer</i> - the ending offset + 1<br>
+returns - index of <i>pattern</i> in <i>string</i> or <a href="nil.htm">NIL</a> if not found</dd>
+</dl>
+
+
+<h2>Description</h2>
+
+<p> The '<nobr>string-search</nobr>' function searches for 'pattern' in
+'string' and returns the index of the first 'pattern' found in 'string' or
+NIL if no pattern was found.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-trim.htm b/docsrc/xlisp/xlisp-doc/reference/string-trim.htm
new file mode 100644
index 0000000..7e26375
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-trim.htm
@@ -0,0 +1,84 @@
+<html><head><title>XLISP string-trim</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-trim</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-trim <i>trim-stuff string</i>)</dt>
+<dd><i>trim-stuff</i> - a string expression<br>
+<i>string</i> - a string expression<br>
+returns - a trimed copy of the string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-trim' function takes the 'trim-stuff' characters and removes
+them from both ends of the 'string'. The 'trim-stuff' characters are an
+un-ordered set of characters to be removed, so any character that occurs in
+'trim-stuff' is removed if it appears in 'string'. A new string is created
+and returned as the result of this function.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-trim "." "....foo....") <font color="#008844">; returns "foo"</font>
+(string-trim "&lt;&gt;" "&lt;&lt;&lt;&lt;bar&gt;&gt;&gt;&gt;") <font color="#008844">; returns "bar"</font>
+(string-trim "(.)" "..(12.34)..") <font color="#008844">; returns "12.34"</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common LISP also supports a list of characters as
+a valid 'trim-stuff' argument. An example:
+
+<pre class="example">
+(string-trim '(#\Tab #\Newline) mystring)
+</pre>
+
+<p>XLISP does not support non-string parameters. Porting from XLISP will be
+no problem, but modifications will be necessary if porting from Common LISP
+code which uses a list of characters.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-trim">string-trim</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string-upcase.htm b/docsrc/xlisp/xlisp-doc/reference/string-upcase.htm
new file mode 100644
index 0000000..cd2e54f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string-upcase.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP string-upcase</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string-upcase</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string-upcase <i>string</i> [{:start | :end} <i>offset</i>] ... )</dt>
+<dd><i>string</i> - a string expression<br>
+<i>offse</i>t - an optional integer expression for a keyword<br>
+returns - a converted copy of the string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string-upcase' function takes a string argument and returns a new
+string that has been made upper case.</p>
+
+<p>The keyword arguments allow for accessing substrings within 'string'. The
+keyword arguments require a keyword ':start' or ':end' first and a single
+integer expression second. The ':start' keyword specifies the starting
+offset for the 'string-upcase' operation on 'string'. A value of 0 starts
+the string at the beginning [no offset]. The ':end' keyword specifies the
+end offset for the operation on 'string'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string-upcase "ABcd+-12&amp;[") <font color="#008844">; returns "ABCD+-&amp;["</font>
+(string-upcase "abcdefgh" :start 2 :end 4) <font color="#008844">; returns "abCDefgh"</font>
+
+(setq mystr "ABcdEFgh") <font color="#008844">; set up variable</font>
+(string-upcase mystr) <font color="#008844">; returns "ABCDEFGH"</font>
+(print mystr) <font color="#008844">; prints "ABcdEFgh"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string-upcase">string-upcase</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/string.htm b/docsrc/xlisp/xlisp-doc/reference/string.htm
new file mode 100644
index 0000000..90224fa
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/string.htm
@@ -0,0 +1,88 @@
+<html><head><title>XLISP string</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>string</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(string <i>expr</i>)</dt>
+<dd><i>expr</i> - a symbol, character, integer or string expression<br>
+returns - a string</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'string' function makes the 'expr' to be a string. <nobr>If
+the</nobr> 'expr' is a string, it is returned, as is. <nobr>If the</nobr>
+'expr' is a character, a <nobr>one-character</nobr> string is returned.
+<nobr>If the</nobr> 'expr' is a symbol, the symbol is turned into a string.
+<nobr>If the</nobr> 'expr' is an integer, a string representing the
+character with an ASCII code of the lowest 8-bit of the intger will be
+returned:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>(string <font color="#0000CC">integer</font>)</code></nobr></td>
+ <td><nobr>&nbsp; &rarr; &nbsp;</nobr></td>
+ <td class="button"><nobr><code>(code-char (rem <font color="#0000CC">integer</font> 256))</code></nobr></td>
+ <td><nobr>&nbsp; &rarr; &nbsp;</nobr></td>
+ <td class="button"><nobr><code><font color="#0000CC">string</font></code></nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(string 'foo) <font color="#008844">; returns "FOO"</font>
+(string 'x) <font color="#008844">; returns "X"</font>
+(string "abcdef") <font color="#008844">; returns "abcdef"</font>
+(string #\a) <font color="#008844">; returns "a"</font>
+(string #\A) <font color="#008844">; returns "A"</font>
+(string #\Newline) <font color="#008844">; returns "\n"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#string">string</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/stringp.htm b/docsrc/xlisp/xlisp-doc/reference/stringp.htm
new file mode 100644
index 0000000..a9fa3da
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/stringp.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP tringp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>stringp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(stringp <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the value is a
+string, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'stringp' predicate function checks if 'expr' is a string.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr' is a
+string, <a href="nil.htm">NIL</a> is returned otherwise.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(stringp "a") <font color="#008844">; returns T - string</font>
+
+(setq a "hi there"
+(stringp a) <font color="#008844">; returns T - evaluates to string</font>
+
+(stringp #\a) <font color="#008844">; returns NIL - character</font>
+(stringp '(a b c)) <font color="#008844">; returns NIL - list</font>
+(stringp 1) <font color="#008844">; returns NIL - integer</font>
+(stringp 1.2) <font color="#008844">; returns NIL - float</font>
+(stringp 'a) <font color="#008844">; returns NIL - symbol</font>
+(stringp #(0 1 2)) <font color="#008844">; returns NIL - array</font>
+(stringp nil) <font color="#008844">; returns NIL - nil</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#stringp">stringp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/sublis.htm b/docsrc/xlisp/xlisp-doc/reference/sublis.htm
new file mode 100644
index 0000000..2724892
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/sublis.htm
@@ -0,0 +1,129 @@
+<html><head><title>XLISP sublis</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>sublis</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(sublis <i>a-list expr</i> [{:test | :test-not} <i>test</i>])</dt>
+<dd><i>expr</i> - the expression to substitute within, an atom<br>
+<i>a-list</i> - the association list to search<br>
+test - optional test function, default is <a href="eql.htm">eql</a><br>
+returns - the expression with substitutions</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'sublis' function searches through an 'expr' and replaces each of the
+elements in the 'expr' that match the <a href="car.htm">car</a>
+of the elements of the association list 'a-list' with the
+
+<a href="cdr.htm">cdr</a> of elements of the 'a-list'. The 'expr'
+with the substitutions, if any, is returned. You may specify your own test
+with the ':test' and ':test-not' keywords followed by the 'test' you wish to
+perform. The 'sublis' function is normally used with a dotted pair <nobr>(A
+. B)</nobr> association list. It is possible to use a normal list pair
+<nobr>(A B)</nobr> or a list of the form <nobr>(A (B C)).</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(sublis '((a . b)) '(a a)) <font color="#008844">; returns (B B)</font>
+(sublis '((a b)) '(a a)) <font color="#008844">; returns ((B) (B))</font>
+(sublis '((a (b c))) '(a a)) <font color="#008844">; returns (((B C)) ((B C)))</font>
+
+(setq newlist '((a . 1) <font color="#008844">; set up an association list</font>
+ (b . 2)
+ (c . 3)))
+
+(sublis newlist '(a b c d e f b a c)) <font color="#008844">; returns (1 2 3 D E F 2 1 3)</font>
+
+(sublis newlist 'a) <font color="#008844">; returns 1</font>
+
+(setq mylist '((a my-a) (b his-b) <font color="#008844">; set up a non-dotted pair assoc list</font>
+ (c her-c) (d end)))
+
+(sublis mylist '(a b c d e f g)) <font color="#008844">; returns ((MY-A) (HIS-B)</font>
+ <font color="#008844">; (HER-C) (END) E F G)</font>
+
+(sublis mylist 'a) <font color="#008844">; returns (MY-A)</font>
+
+(setq numlist '((1 . a) (2 . b)) ) <font color="#008844">; set up a new assoc list</font>
+
+(defun mytest (x y) (princ ": ") <font color="#008844">; set up my own test function with 2 parameters</font>
+ (princ x) <font color="#008844">; to see what SUBLIS does</font>
+ (princ " ")
+ (princ y) (terpri)
+ t) <font color="#008844">; always return T</font>
+
+(sublis numlist '(3 1) :test mytest) <font color="#008844">; prints : (3 1) 1</font>
+ <font color="#008844">; returns A - because the entire list succeeds</font>
+ <font color="#008844">; with the test and so (1 . A) produces the</font>
+ <font color="#008844">; returned value</font>
+
+(sublis numlist '(1) :test-not mytest) <font color="#008844">; prints : (1) 1</font>
+ <font color="#008844">; : (1) 2</font>
+ <font color="#008844">; : 1 1</font>
+ <font color="#008844">; : 1 2</font>
+ <font color="#008844">; : NIL 1</font>
+ <font color="#008844">; : NIL 2</font>
+ <font color="#008844">; returns (1) - because SUBLIS tried to match</font>
+ <font color="#008844">; every list/sublist against each entry in the</font>
+ <font color="#008844">; assoc list and failed because of the :TEST-NOT</font>
+ <font color="#008844">; and so returned the original list unaltered</font>
+</pre>
+
+<p><b>Note:</b> The SUBLIS function can work with a list or string as the
+'expr'. However, the default <a href="eql.htm">eql</a> test does
+not work with lists or strings, only symbols and numbers. To make this work,
+you need to use the ':test' keyword along with
+<a href="equal.htm">equal</a> for 'test'.</p>
+
+<p><b>Common Lisp:</b> Common LISP supports the use of the ':key' keyword
+which specifies a function that is applied to each element of 'a-list'
+before it is tested. XLISP does not support this.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#sublis">sublis</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/subseq.htm b/docsrc/xlisp/xlisp-doc/reference/subseq.htm
new file mode 100644
index 0000000..ebc0fb4
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/subseq.htm
@@ -0,0 +1,83 @@
+<html><head><title>XLISP subseq</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>subseq</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(subseq <i>string start</i> [<i>end</i>])</dt>
+<dd><i>string</i> - a string expression<br>
+<i>start</i> - an integer expression<br>
+<i>end</i> - an integer expression<br>
+returns - the substring between <i>start</i> and <i>end</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p> The 'subseq' function extracts a substring from 'string' starting with
+the 'start' offset and ending with the 'end' offset. The 'start' offset has
+a origin or 0. The substring is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(subseq "12345678" 0) <font color="#008844">; returns "12345678"</font>
+(subseq "12345678" 2) <font color="#008844">; returns "345678"</font>
+(subseq "12345678" 2 4) <font color="#008844">; returns "34"</font>
+(subseq "1234" 3) <font color="#008844">; returns "4"</font>
+
+(subseq "1234" 4) <font color="#008844">; returns ""</font>
+(subseq "1234" 4 2) <font color="#008844">; returns ""</font>
+(subseq "1234" 5) <font color="#008844">; error: string index out of bounds - 5</font>
+</pre>
+
+<p><b>Common Lisp:</b> The 'subseq' function in Common Lisp is intended to
+return a portion of a sequence, a sub-sequence. This function operates on
+lists and vectors [one-dimensional arrays of data], basically ordered data.
+Strings are just one of the valid types operated on by 'subseq' in Common
+Lisp. The XLISP 'subseq' function only operates on strings.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-025.htm#subseq">subseq</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/subsetp.htm b/docsrc/xlisp/xlisp-doc/reference/subsetp.htm
new file mode 100644
index 0000000..dff9b98
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/subsetp.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP subsetp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>subsetp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xm.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>subsetp</b> <i>list1 list2</i>)</nobr></dt>
+<dd><i>listN</i> - a list of symbols or numbers<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if <i>list1</i> is a subset of <i>list2</i>, NIL otherwise</dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, 'subsetp' is implemented as a Lisp function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">subsetp</font> (a b)
+ (let ((result t))
+ (dolist (elem a)
+ (cond ((not (member elem b))
+ (setf result nil)
+ (return nil))))
+ result))
+</pre>
+
+<h2>Description</h2>
+
+<p>The '<nobr>subsetp</nobr>' function tests if all elements of 'list1' are
+contained in 'list2'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/subst.htm b/docsrc/xlisp/xlisp-doc/reference/subst.htm
new file mode 100644
index 0000000..9fc00f0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/subst.htm
@@ -0,0 +1,96 @@
+<html><head><title>XLISP subst</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>subst</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(subst <i>new-expr old-expr expr</i> [{:test | :test-not} <i>test</i>])</dt>
+<dd><i>old-expr</i> - the expression to search for<br>
+<i>new-expr</i> - the expression to replace <i>old-expr</i> with<br>
+<i>expr</i> - the expression to substitute within, an atom or list<br>
+<i>test</i> - optional test function, default is <a href="eql.htm">eql</a><br>
+returns - the expression with substitutions</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'subst' function searches through an 'expr' and replaces each of the
+'old-expr' elements with the 'new-expr'. The 'expr' with the substitutions,
+if any, is returned. You may specify your own test with the ':test' and
+':test-not' keywords followed by the 'test' you wish to perform.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(subst 'new 'old '(old mid dif)) <font color="#008844">; returns (NEW MID DIF)</font>
+(subst '(a) 'old '(old mid dif)) <font color="#008844">; returns ((A) MID DIF)</font>
+(subst "a" 'old '(old mid dif)) <font color="#008844">; returns ("a" MID DIF)</font>
+
+(defun mytest (x y) (princ x) (princ " ") <font color="#008844">; define a test function</font>
+ (princ y) (terpri) <font color="#008844">; that prints the arguments</font>
+ T ) <font color="#008844">; and always returns T</font>
+
+(subst 'a 'b '(a b c d) :test 'mytest) <font color="#008844">; prints (A B C D) B returns A</font>
+
+(subst 'a 'b '(a b) :test-not 'mytest) <font color="#008844">; prints (A B) B</font>
+ <font color="#008844">; A B</font>
+ <font color="#008844">; (B) B</font>
+ <font color="#008844">; B B</font>
+ <font color="#008844">; NIL B returns (A B)</font>
+</pre>
+
+<p><b>Note:</b> The 'subst' function can work with a list or string as the
+'expr' However, the default <a href="eql.htm">eql</a> test does
+not work with lists or strings, only symbols and numbers. To make this work,
+you need to use the ':test' keyword along with
+<a href="equal.htm">equal</a> for 'test'.</p>
+
+<p><b>Common Lisp:</b> Common Lisp supports the use of the ':key' keyword
+which specifies a function that is applied to each element of 'expr' before
+it is tested. XLISP does not support this.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#subst">subst</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/subtraction.htm b/docsrc/xlisp/xlisp-doc/reference/subtraction.htm
new file mode 100644
index 0000000..96ca6a9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/subtraction.htm
@@ -0,0 +1,88 @@
+<html><head><title>XLISP &minus;</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>&minus;</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(- <i>expr1</i> ...)</nobr></dt>
+<dd><i>exprN</i> - integer or floating point number/expression<br>
+returns - the result of the subtraction</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The '-' function subtracts one or more numbers from the first number
+given and returns the result. If there is only one number as an argument, it
+is negated.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(- 1) =&gt; -1
+(- 1 2) =&gt; -1
+(- 1 2 3) =&gt; -4
+(- 1 2 3 4) =&gt; -8
+</pre>
+
+<pre class="example">
+&gt; (print (- 1 2 (* 3.5 (/ 3.9 1.45))))
+-10.4138
+-10.4138
+</pre>
+
+<p>See <a href="multiplication.htm">&nbsp;*&nbsp;</a>,
+<a href="division.htm">&nbsp;/&nbsp;</a>, <a href="print.htm">print</a>.
+XLISP first prints the value on the screen, the second number is the
+return value.</p>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>Contents &rarr; <a href="../manual/contents.htm#arithmetic-functions">Arithmetic Functions</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/symbol-function.htm b/docsrc/xlisp/xlisp-doc/reference/symbol-function.htm
new file mode 100644
index 0000000..e63dc8a
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/symbol-function.htm
@@ -0,0 +1,67 @@
+<html><head><title>XLISP symbol-name</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>symbol-function</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(symbol-function <i>symbol</i>)</dt>
+<dd><i>symbol</i> - an expression that evaluates to a symbol name<br>
+returns - the symbol's functional value</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'symbol-function' function ... [this page was missing in the
+original reference and still needs to be written].</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#symbol-function">symbol-function</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/symbol-name.htm b/docsrc/xlisp/xlisp-doc/reference/symbol-name.htm
new file mode 100644
index 0000000..8ab1ac2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/symbol-name.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP symbol-name</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>symbol-name</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt>(<b>symbol-name</b> <i>symbol</i>)</dt>
+<dd><i>symbol</i> - an expression that evaluates to a symbol name<br>
+returns - the symbol's print name</dd>
+</dl>
+
+</div></p>
+
+<h2>Description</h2>
+
+<p>The 'symbol-name' function takes the 'symbol' expression and returns the
+printable string of the 'symbol'. If the 'symbol' had not existed, then it
+will be created and <a href="intern.htm">intern</a>ed into the
+system symbol table
+<nobr><a href="global-obarray.htm">*obarray*</a> ,</nobr> but with it's
+value unbound and an empty property list.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(symbol-name 'foo) <font color="#008844">; returns "FOO"</font>
+(symbol-name 'gleep) <font color="#008844">; returns "GLEEP"</font>
+
+(setq my-symbol 'flop) <font color="#008844">; define MY-SYMBOL</font>
+(symbol-name my-symbol) <font color="#008844">; returns "FLOP"</font>
+</pre>
+
+<p><b>XLISP Bug:</b> The 'symbol-name' function signals a 'bad
+argument type' error with the <nobr>symbol
+<a href="nil.htm">NIL</a></nobr> <nobr>[Nyquist 3.03</nobr> in
+<nobr>December 2010]</nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/symbol-plist.htm b/docsrc/xlisp/xlisp-doc/reference/symbol-plist.htm
new file mode 100644
index 0000000..3260cd1
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/symbol-plist.htm
@@ -0,0 +1,85 @@
+<html><head><title>XLISP symbol-plist</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>symbol-plist</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr> xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(symbol-plist <i>symbol</i>)</dt>
+<dd><i>symbol</i> - the symbol name with a property list<br>
+returns - the symbol's property list </dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'symbol-plist' function returns the actual property list from the
+'symbol'. The 'symbol' must be an existing, bound variable, but it does not
+need to have anything in it's property list.</p>
+
+<p>Property lists are lists attached to any user defined variables. The lists
+are in the form of:</p>
+
+<pre class="example">
+(<font color="#008844"><i>name1 val1 name2 val2</i></font> ....)
+</pre>
+
+<p>Any number of properties may be attached to a single variable.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq person 'bobby) <font color="#008844">; create a var with a value</font>
+(putprop person 'boogie 'last-name) <font color="#008844">; add a LAST-NAME property</font>
+(putprop person 'disc-jockey 'job) <font color="#008844">; add a JOB property</font>
+(putprop person '(10 20 30) 'stats) <font color="#008844">; add a STATS list</font>
+
+(symbol-plist person) <font color="#008844">; returns the property list:</font>
+ <font color="#008844">; (STATS (10 20 30)</font>
+ <font color="#008844">; JOB DISC-JOCKEY</font>
+ <font color="#008844">; LAST-NAME BOOGIE)</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#symbol-plist">symbol-plist</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/symbol-value.htm b/docsrc/xlisp/xlisp-doc/reference/symbol-value.htm
new file mode 100644
index 0000000..7097d22
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/symbol-value.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP symbol-value</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>symbol-value</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(symbol-value <i>symbol</i>)</dt>
+<dd><i>symbol</i> - an expression that evaluates to a symbol name<br>
+returns - the symbol's value</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'symbol-value' function takes the 'symbol' expression and returns
+the current value of the 'symbol'.</p>
+
+<p>If the 'symbol' had not existed, then it will be created and
+<a href="intern.htm">intern</a>ed into the system symbol table
+<nobr><a href="global-obarray.htm">*obarray*</a> ,</nobr> but with it's
+value unbound and an empty property list. In this case of a previously
+non-existant 'symbol', since it has no bound value, the 'symbol-value'
+function will still report an error due to an unbound variable.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq myvar 55) <font color="#008844">; set MYVAR to value 55</font>
+(symbol-value 'myvar) <font color="#008844">; returns 55</font>
+(symbol-value 'floop) <font color="#008844">; error: unbound variable</font>
+
+(setq my-symbol 'a) <font color="#008844">; set MY-SYMBOL to A</font>
+
+(setq a '(contents of symbol a)) <font color="#008844">; set A to value (CONTENTS OF SYMBOL A)</font>
+
+(symbol-value my-symbol) <font color="#008844">; returns (CONTENTS OF SYMBOL A)</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-013.htm#symbol-value">symbol-value</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/symbolp.htm b/docsrc/xlisp/xlisp-doc/reference/symbolp.htm
new file mode 100644
index 0000000..c27fd71
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/symbolp.htm
@@ -0,0 +1,85 @@
+<html><head><title>XLISP symbolp</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>symbolp</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xllist.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(symbolp <i>expr</i>)</dt>
+<dd><i>expr</i> - the expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the expression
+is a symbol, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'symbolp' predicate function checks if an 'expr' is a valid symbol.
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned if 'expr' is a
+symbol, <a href="nil.htm">NIL</a> is returned otherwise. An
+'expr' that evaluates to an integer, function [subr or otherwise], and so
+on is not a symbol. However, the quoted [un-evaluated] name of these
+objects [like 'myarray] is a valid symbol.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(symbolp (make-symbol "a")) <font color="#008844">; returns T - symbol</font>
+(symbolp 'a) <font color="#008844">; returns T - symbol</font>
+
+(symbolp #(1 2 3)) <font color="#008844">; returns NIL - array</font>
+(symbolp (lambda (x) (print x))) <font color="#008844">; returns NIL - closure</font>
+(symbolp *standard-output*) <font color="#008844">; returns NIL - stream</font>
+(symbolp 1.2) <font color="#008844">; returns NIL - float</font>
+(symbolp 2) <font color="#008844">; returns NIL - integer</font>
+(symbolp object) <font color="#008844">; returns NIL - object</font>
+(symbolp "hi") <font color="#008844">; returns NIL - string</font>
+
+(symbolp #'car) <font color="#008844">; returns NIL - subr</font>
+(symbolp 'car) <font color="#008844">; returns T - it is a symbol now</font>
+(symbolp '2) <font color="#008844">; returns NIL - not a symbol</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#symbolp">symbolp</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/system.htm b/docsrc/xlisp/xlisp-doc/reference/system.htm
new file mode 100644
index 0000000..e2f5888
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/system.htm
@@ -0,0 +1,73 @@
+<html><head><title>XLISP system</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>system</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>sys/unix/osstuff.c, sys/mac/macfun.c, sys/win/msvc/winfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(system <i>command</i>)</dt>
+<dd><i>command</i> - the OS command string to be executed<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the command
+was successful, the error code otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'system' function will send the 'command' string to the underlying
+operating system for execution. After execution of the 'command', the
+'system' function will return a
+<a href="t.htm">&nbsp;T&nbsp;</a> result if the 'command' was
+successful. If the 'command' was not successful, the numeric error code will
+be returned. Any output from the 'command' execution will not be put in the
+transcript file.</p>
+
+<p><b>Note:</b> In Nyquist, this function is only defined to work on Unix
+systems [including Linux and <nobr>Mac OS X]</nobr>. <nobr>On
+Windows</nobr> systems, <a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(system "ls") <font color="#008844">; do a directory listing</font>
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/t.htm b/docsrc/xlisp/xlisp-doc/reference/t.htm
new file mode 100644
index 0000000..99e3e63
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/t.htm
@@ -0,0 +1,71 @@
+<html><head><title>XLISP t</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>t</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>system constant</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>&nbsp;t</dt>
+</dl>
+
+<h2>Description</h2>
+
+<p>The T system constant is built into XLISP. T represents 'true',
+as oppossed to <nobr><a href="nil.htm">NIL</a> ,</nobr>
+representing 'false'.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(setq myvar T) <font color="#008844">; set MYVAR to True</font>
+(setq myvar 'T) <font color="#008844">; T and 'T both evaluate to T</font>
+(if t (print "this will print") <font color="#008844">; if, then, else</font>
+ (print "this won't print"))
+</pre>
+
+<p><b>Note:</b> Be careful with the T value. It is possible to do a
+<a href="setq.htm">setq</a> on T and set it to other values like
+<a href="nil.htm">NIL</a>. Some operations will still return
+proper T or <a href="nil.htm">NIL</a> values, but the system
+will be in a bad state.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/tagbody.htm b/docsrc/xlisp/xlisp-doc/reference/tagbody.htm
new file mode 100644
index 0000000..123167d
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/tagbody.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP tagbody</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>tagbody</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(tagbody [<i>expr</i> ... ])</dt>
+<dd><i>expr</i> - expressions comprising the body of the block which may
+contain <a href="go.htm">go</a>s or tags for
+<a href="go.htm">go</a><br>
+returns - <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'tagbody' special form is basically a 'block' construct that contains
+a block of code [expressions] to evaluate. After the execution of the
+'tagbody' 'exprs', <a href="nil.htm">NIL</a> is returned. The
+'tagbody' special form allows 'go-to' style branching within the 'block'
+construct via the <a href="go.htm">go</a> special form. To allow
+this, each 'expr' may be a tag or a form. The tag-symbol is the 'label' and
+must exist somewhere within the 'block' that the <a
+href="go.htm">go</a> occurs within.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(tagbody <font color="#008844">; build the 'block'</font>
+ start (print "begin") <font color="#008844">; tag - start</font>
+ (GO end)
+ (print "hello") <font color="#008844">; won't ever be reached</font>
+ end (print "done")) <font color="#008844">; tag - END</font>
+ <font color="#008844">; prints "begin" "done"</font>
+ <font color="#008844">; returns NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-021.htm#tagbody">tagbody</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/tan.htm b/docsrc/xlisp/xlisp-doc/reference/tan.htm
new file mode 100644
index 0000000..81fd0de
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/tan.htm
@@ -0,0 +1,76 @@
+<html><head><title>XLISP tan</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>tan</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(tan <i>expr</i>)</dt>
+<dd><i>expr</i> - floating point number or expression<br>
+returns - the tangent of the number</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'tan' function calculates the tangent of the 'expr' and returns the
+result. The 'expr' is in radians.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(tan 0.0) <font color="#008844">; returns 0</font>
+(tan 1.0) <font color="#008844">; returns 1.55741</font>
+(tan (/ 3.14159 2)) <font color="#008844">; returns 753696</font>
+(tan 2.0) <font color="#008844">; returns -2.18504</font>
+(tan 3.0) <font color="#008844">; returns -0.142547</font>
+(tan 3.14159) <font color="#008844">; returns -2.65359e-06</font>
+(tan 4.5) <font color="#008844">; returns 4.63733</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp allows for integer numbers, which
+XLISP does not support for 'tan'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#tan">tan</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/terpri.htm b/docsrc/xlisp/xlisp-doc/reference/terpri.htm
new file mode 100644
index 0000000..2b5cdf2
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/terpri.htm
@@ -0,0 +1,90 @@
+<html><head><title>XLISP terpri</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>terpri</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c, xlprin.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(terpri [<i>dest</i>])</dt>
+<dd><i>dest</i> - an optional destination, must be a file pointer or
+stream, default is <a href="global-standard-output.htm">*standard-output*</a><br>
+returns - <a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'terpri' function prints a new-line to the specified 'destination'
+This will terminate the current print line for 'destination'.
+<a href="nil.htm">NIL</a> is always returned as the result. The
+'destination' may be a file pointer or a stream. If there is no
+'destination', <a href="global-standard-output.htm">*standard-output*</a> is the
+default.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(terpri) <font color="#008844">; prints #\Newline</font>
+
+(setq f (open "pr" :direction :output)) <font color="#008844">; create a file</font>
+(princ "hi" f) <font color="#008844">; returns "hi"</font>
+(princ 727 f) <font color="#008844">; returns 727</font>
+(princ "ho" f) <font color="#008844">; returns "ho"</font>
+(terpri f) <font color="#008844">; returns NIL</font>
+(close f) <font color="#008844">; file contains hi727ho#\Newline</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that print operations with a
+'destination' of <a href="nil.htm">NIL</a> will go to
+<a href="global-standard-output.htm">*standard-output*</a>. XLISP does not send the
+output to <a href="global-standard-output.htm">*standard-output*</a> with a
+'destination' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'destination' of
+<a href="t.htm">&nbsp;T&nbsp;</a> will be sent to
+*terminal-io*, which is not defined in XLISP by default. XLISP does not
+allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid argument
+for 'destination'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-027.htm#terpri">terpri</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/third.htm b/docsrc/xlisp/xlisp-doc/reference/third.htm
new file mode 100644
index 0000000..78fab50
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/third.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP third</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>third</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlinit.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(third <i>expr</i>)</dt>
+<dl><i>expr</i> - a list or list expression<br>
+returns - the third element of <i>expr</i> or
+<a href="nil.htm">NIL</a></dl>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'third' function returns the third element of a list or list
+expression. If the list is
+<nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(third '(1 2 3 4)) <font color="#008844">; returns 3</font>
+(third NIL) <font color="#008844">; returns NIL</font>
+
+(setq kids '(junie vickie cindy chris)) <font color="#008844">; set up variable KIDS</font>
+(first kids) <font color="#008844">; returns JUNIE</font>
+(second kids) <font color="#008844">; returns VICKIE</font>
+(third kids) <font color="#008844">; returns CINDY</font>
+(fourth kids) <font color="#008844">; returns CHRIS</font>
+(rest kids) <font color="#008844">; returns (VICKIE CINDY CHRIS)</font>
+</pre>
+
+<p><b>Note:</b> This function is set to the same code as
+<a href="caaar.htm">caddr</a>.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-016.htm#third">third</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/throw.htm b/docsrc/xlisp/xlisp-doc/reference/throw.htm
new file mode 100644
index 0000000..4b12de6
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/throw.htm
@@ -0,0 +1,23 @@
+<html><head><title>XLISP throw</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>throw</h1>
+
+<hr>
+
+<p>See <a href="catch.htm">catch</a>.</p>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/top-level.htm b/docsrc/xlisp/xlisp-doc/reference/top-level.htm
new file mode 100644
index 0000000..6a0a8e3
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/top-level.htm
@@ -0,0 +1,91 @@
+<html><head><title>XLISP top-level</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>top-level</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c, xldbug.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(top-level)</dt>
+<dd>returns - never returns</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'top-level' function aborts to the top level of XLISP. This may be
+from within several levels of the
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a></nobr>.
+This is valid for
+<a href="break.htm">break</a>s,
+<a href="error.htm">error</a>s and
+<a href="cerror.htm">cerror</a>s [continuable errors]. If 'top-level'
+is evaluated while not in a
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a> ,</nobr>
+a message is printed:
+
+<pre class="example">
+<font color="#008844">[ back to top level ]</font>
+</pre>
+
+<p>This message does not cause XLISP to go into a
+<nobr><a href="../manual/xlisp-man-004.htm">break loop</a></nobr>.
+The 'top-level' function never actually returns a value.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(top-level) <font color="#008844">; [ back to top level ]</font>
+
+(break "out") <font color="#008844">; break: out (1st)</font>
+(break "twice") <font color="#008844">; break: twice (2nd)</font>
+(top-level) <font color="#008844">; to exit out of the break loop</font>
+</pre>
+
+<p><b>Keyboard:</b> In the IBM PC and MS-DOS versions of XLISP, a 'Ctrl+c'
+key sequence has the same effect as doing a (top-level). On a Macintosh,
+this can be accomplished by a pull-down menu or a 'Command+t'. [I haven't
+tested this with Nyquist.]</p>
+
+<p>See the
+<a href="../manual/xlisp-man-022.htm#top-level">top-level</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/trace.htm b/docsrc/xlisp/xlisp-doc/reference/trace.htm
new file mode 100644
index 0000000..f81f621
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/trace.htm
@@ -0,0 +1,93 @@
+<html><head><title>XLISP trace</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>trace</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(trace <i>function</i> ... )</dt>
+<dd><i>function</i> - an unquoted function<br>
+returns - the trace list</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'trace' special form allows the tracing of user or system functions.
+'trace' returns a list containing the current set of functions that are
+being traced. The 'function' does not have to be currently defined, it can
+be created as part of the execution. The trace output consists of entry and
+exit information.</p>
+
+<p>At entry and exit of a traced 'function', lines will be printed of the
+form:</p>
+
+<pre class="example">
+Entering: <font color="#008844"><i>function</i></font>, Argument list: <font color="#008844"><i>arg-list</i></font>
+Exiting: <font color="#008844"><i>function</i></font>, Value: <font color="#008844"><i>return-value</i></font>
+</pre>
+
+<p>A list of all currently traced functions can be found in the
+<a href="global-tracelist.htm">*tracelist*</a> system variable.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun foo (x) (print (car x))) <font color="#008844">; define FOO</font>
+(trace 'foo) <font color="#008844">; returns (FOO)</font>
+(trace 'car) <font color="#008844">; returns (CAR FOO)</font>
+
+(foo '(a)) <font color="#008844">; Entering: FOO, Argument list: ((A))</font>
+ <font color="#008844">; Entering: CAR, Argument list: ((A))</font>
+ <font color="#008844">; Exiting: CAR, Value: A</font>
+ <font color="#008844">; A</font>
+ <font color="#008844">; Exiting: FOO, Value: A</font>
+ <font color="#008844">; returns A</font>
+</pre>
+
+<p><b>Common Lisp:</b> The XLISP 'trace' function does not support any
+keyword options, which Common Lisp allows.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-022.htm#trace">trace</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/truncate.htm b/docsrc/xlisp/xlisp-doc/reference/truncate.htm
new file mode 100644
index 0000000..421ca7f
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/truncate.htm
@@ -0,0 +1,74 @@
+<html><head><title>XLISP truncate</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>truncate</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(truncate <i>expr</i>)</dt>
+<dd><i>expr</i> - integer or floating point number or expression<br>
+returns - the result of truncating <i>expr</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'truncate' function takes the 'expr' and truncates it to an integer
+value and returns this result.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(truncate 123.456) <font color="#008844">; returns 123</font>
+(truncate -1.49) <font color="#008844">; returns -1</font>
+(truncate -1.59) <font color="#008844">; returns -1</font>
+(truncate 123) <font color="#008844">; returns 123</font>
+(truncate 123.999) <font color="#008844">; returns 123</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common LISP allows an optional division parameter,
+which XLISP does not support.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-023.htm#truncate">truncate</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/type-of.htm b/docsrc/xlisp/xlisp-doc/reference/type-of.htm
new file mode 100644
index 0000000..1e01c24
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/type-of.htm
@@ -0,0 +1,103 @@
+<html><head><title>XLISP type-of</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>type-of</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlsys.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(type-of <i>expr</i>)</dt>
+<dd><i>expr</i> - an expression to check<br>
+returns - the type of the expression</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'type-of' function returns the type of the expression.</p>
+
+<ul>
+<li><nobr>SYMBOL - for symbols</nobr></li>
+<li><nobr>OBJECT - for objects</nobr></li>
+<li><nobr>CONS - for conses</nobr></li>
+<li><nobr>SUBR - for built-in functions</nobr></li>
+<li><nobr>FSUBR - for special forms</nobr></li>
+<li><nobr>CLOSURE - for defined functions</nobr></li>
+<li><nobr>STRING - for strings</nobr></li>
+<li><nobr>FIXNUM - for integers</nobr></li>
+<li><nobr>FLONUM - for floating point numbers</nobr></li>
+<li><nobr>CHARACTER - for characters</nobr></li>
+<li><nobr>FILE-STREAM - for file pointers</nobr></li>
+<li><nobr>UNNAMED-STREAM - for unnamed streams</nobr></li>
+<li><nobr>ARRAY - for arrays</nobr></li>
+</ul>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(type-of NIL) <font color="#008844">; returns NIL</font>
+(type-of '#(1 2 3)) <font color="#008844">; returns ARRAY</font>
+(type-of (lambda (x) (print x))) <font color="#008844">; returns CLOSURE</font>
+(type-of '(a b)) <font color="#008844">; returns CONS</font>
+(type-of #'savefun) <font color="#008844">; returns CLOSURE</font>
+(type-of '(a . b)) <font color="#008844">; returns CONS</font>
+(type-of *standard-output*) <font color="#008844">; returns FILE-STREAM</font>
+(type-of 1.2) <font color="#008844">; returns FLONUM</font>
+(type-of #'do) <font color="#008844">; returns FSUBR</font>
+(type-of 1) <font color="#008844">; returns FIXNUM</font>
+(type-of object) <font color="#008844">; returns OBJECT</font>
+(type-of "str") <font color="#008844">; returns STRING</font>
+(type-of #'car) <font color="#008844">; returns SUBR</font>
+(type-of 'a) <font color="#008844">; returns SYMBOL</font>
+(type-of #\a) <font color="#008844">; returns CHARACTER</font>
+(type-of (make-string-input-stream "a")) <font color="#008844">; returns UNNAMED-STREAM</font>
+</pre>
+
+<p><b>Common Lisp:</b> The XLISP and Common Lisp 'type-of' functions are
+basically the same. Differences between the two can occur in what the types
+are called [like CHARACTER in XLISP and STANDARD-CHAR in Common Lisp]. Also,
+Common Lisp can give additional information. For strings, it returns a list
+of the form (SIMPLE-STRING 32) where the number 32 is the string size.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-031.htm#type-of">type-of</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/union.htm b/docsrc/xlisp/xlisp-doc/reference/union.htm
new file mode 100644
index 0000000..d728399
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/union.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP union</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>union</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp function (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xm.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>union</b> <i>list1 list2</i>)</nobr></dt>
+<dd><i>listN</i> - a list of symbols or numbers<br>
+returns - the union of <i>list1</i> and <i>list2</i></dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, 'union' is implemented as a Lisp function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">union</font> (a b)
+ (let (result)
+ (dolist (elem a)
+ (if (not (member elem result)) (push elem result)))
+ (dolist (elem b)
+ (if (not (member elem result)) (push elem result)))
+ result))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'union' function computes the union of two lists. <nobr>The
+result</nobr> is a list containing all elements of both lists, where every
+element appears exactly once.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/unless.htm b/docsrc/xlisp/xlisp-doc/reference/unless.htm
new file mode 100644
index 0000000..d54cbd0
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/unless.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP unless</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>unless</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(unless <i>test</i> [<i>expr</i> ... ])</dt>
+<dd><i>test</i> - an expression, <a href="nil.htm">NIL</a> or
+non-<a href="nil.htm">NIL</a><br>
+<i>expr</i> - expressions comprising a body of code<br>
+returns - the value of the last expression or
+<a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'unless' special form executes the 'expr' forms if 'test' evaluates
+to a <a href="nil.htm">NIL</a> value. If 'test' is
+<nobr><a href="nil.htm">NIL</a> ,</nobr> the value of the last
+'expr' is returned as the result. If 'test' is
+<nobr>non-<a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> is returned with none of 'expr'
+evaluated.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(unless NIL) <font color="#008844">; returns NIL</font>
+(unless T) <font color="#008844">; returns NIL</font>
+
+(unless NIL (print "hi") 'foo) <font color="#008844">; prints "hi" returns FOO</font>
+
+(unless (listp "a")
+ (print "not a list")) <font color="#008844">; prints "not a list"</font>
+ <font color="#008844">; returns "not a list"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-019.htm#unless">unless</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/untrace.htm b/docsrc/xlisp/xlisp-doc/reference/untrace.htm
new file mode 100644
index 0000000..5576b8e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/untrace.htm
@@ -0,0 +1,86 @@
+<html><head><title>XLISP untrace</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>untrace</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(untrace function ... )</dt>
+<dd><i>function</i> - a function name<br>
+returns - the trace list</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'untrace' function removes 'function' from the current list of traced
+functions. 'untrace' returns a list containing the current set of functions
+that are being traced. If the 'function' does currently exist or is
+currently be traced, there will be no error reported. If there are no
+functions being traced, a <a href="nil.htm">NIL</a> is
+returned. A list of all currently traced functions can be found in the
+<a href="global-tracelist.htm">*tracelist*</a> system variable.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(defun foo (x) (print (car x))) <font color="#008844">; define FOO</font>
+(trace 'foo) <font color="#008844">; returns (FOO)</font>
+
+(foo '(a)) <font color="#008844">; Entering: FOO, Argument list: ((A))</font>
+ <font color="#008844">; A</font>
+ <font color="#008844">; Exiting: FOO, Value: A</font>
+ <font color="#008844">; returns A</font>
+
+(untrace 'foo) <font color="#008844">; returns NIL</font>
+(untrace 'glip) <font color="#008844">; returns NIL</font>
+
+(foo '(a)) <font color="#008844">; prints A returns A</font>
+</pre>
+
+<p><b>Common Lisp:</b> The XLISP 'untrace' function does not support any
+options, which Common Lisp allows.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-022.htm#untrace">untrace</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/unwind-protect.htm b/docsrc/xlisp/xlisp-doc/reference/unwind-protect.htm
new file mode 100644
index 0000000..1f40d74
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/unwind-protect.htm
@@ -0,0 +1,137 @@
+<html><head><title>XLISP unwind-protect</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>unwind-protect</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(unwind-protect <i>protect-form clean-up-form</i> ... )</dt>
+<dd><i>protect-form</i> - a form that is to be protected<br>
+<i>clean-up-form</i> - a sequence forms to execute after <i>protect-form</i><br>
+returns - the value of <i>protect-form</i></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p> The 'unwind-protect' special form allows the protecting [trapping] of
+all forms of exit from the 'protect-form'. The exits that are trapped
+include errors, <nobr><a href="throw.htm">throw</a> ,</nobr> <a
+href="return.htm">return</a> and <a
+href="go.htm">go</a>. The 'clean-up-form' will be executed in
+all cases, when there is an exit from 'protect-form' and when the form does
+not have exit. 'unwind-protect' will return the result from the
+'protect-form', not from the 'clean-up-forms'. Errors or exits that occur in
+the 'clean-up-form' are not protected. It is possible to trap these with
+another 'unwind-protect'.</p>
+
+<p><div class="box">
+
+<p><b>Note:</b> 'unwind-protext' will not protect against errors signalled
+by <nobr>built-in</nobr> functions if
+<a href="global-breakenable.htm">*breakenable*</a> is <nobr>not
+<a href="nil.htm">NIL</a></nobr></nobr>.</p>
+
+</div></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(unwind-protect
+ (+ 2 2) <font color="#008844">; protected form</font>
+ (print "an exit")) <font color="#008844">; clean up form</font>
+ <font color="#008844">; prints "an exit"</font>
+ <font color="#008844">; returns 4</font>
+</pre>
+
+<pre class="example">
+(setq *breakenable* nil) <font color="#008844">; to turn off break loop traps</font>
+
+(unwind-protect
+ (+ 1 "2") <font color="#008844">; protected form</font>
+ (print "something happened")) <font color="#008844">; clean up form</font>
+ <font color="#008844">; error: bad argument type - "2"</font>
+ <font color="#008844">; prints "something happened"</font>
+</pre>
+
+<pre class="example">
+(catch 'mytag
+ (unwind-protect
+ (throw 'mytag) <font color="#008844">; protected form</font>
+ (print "an exit"))) <font color="#008844">; clean up form</font>
+ <font color="#008844">; prints "an exit"</font>
+</pre>
+
+<pre class="example">
+(setq *breakenable* nil) <font color="#008844">; to turn off break loop traps</font>
+
+(unwind-protect
+ (throw 'notag) <font color="#008844">; protected form</font>
+ (print "an exit")) <font color="#008844">; clean up form</font>
+ <font color="#008844">; error: no target for THROW</font>
+ <font color="#008844">; prints "an exit"</font>
+</pre>
+
+<pre class="example">
+(prog () (print "start")
+ (unwind-protect
+ (go end) <font color="#008844">; protected form</font>
+ (print "an exit")) <font color="#008844">; clean-up form</font>
+ end (print "end")) <font color="#008844">; prints "start"</font>
+ <font color="#008844">; prints "an exit"</font>
+ <font color="#008844">; prints "end"</font>
+</pre>
+
+<pre class="example">
+(prog () (print "start")
+ (unwind-protect
+ (return "I'm done") <font color="#008844">; protected form</font>
+ (print "but first")) <font color="#008844">; clean-up form</font>
+ (print "won't get here")) <font color="#008844">; prints "start"</font>
+ <font color="#008844">; prints "but first"</font>
+ <font color="#008844">; returns "I'm done"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-019.htm#unwind-protect">unwind-protect</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/upper-case-p.htm b/docsrc/xlisp/xlisp-doc/reference/upper-case-p.htm
new file mode 100644
index 0000000..406f546
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/upper-case-p.htm
@@ -0,0 +1,76 @@
+<html><head><title>XLISP upper-case-p</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>upper-case-p</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlstr.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(upper-case-p <i>char</i>)</dt>
+<dd><i>char</i> - a character expression<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the character
+is upper case, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'upper-case-p' predicate function checks if the 'char' expression is
+an upper case character. If 'char' is upper case a
+<a href="t.htm">&nbsp;T&nbsp;</a> is returned, otherwise a
+<a href="nil.htm">NIL</a> is returned. Upper case characters are
+'A' [<a href="../misc/ascii-table.htm">ASCII</a> decimal <nobr>value
+65]</nobr> through 'Z' [<a href="../misc/ascii-table.htm">ASCII</a>
+decimal <nobr>value 90].</nobr></p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(upper-case-p #\A) <font color="#008844">; returns T</font>
+(upper-case-p #\a) <font color="#008844">; returns NIL</font>
+(upper-case-p #\1) <font color="#008844">; returns NIL</font>
+(upper-case-p #\[) <font color="#008844">; returns NIL</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-026.htm#upper-case-p">upper-case-p</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/vector.htm b/docsrc/xlisp/xlisp-doc/reference/vector.htm
new file mode 100644
index 0000000..4ef325e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/vector.htm
@@ -0,0 +1,73 @@
+<html><head><title>XLISP vector</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>vector</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlbfun.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(vector [<i>expr</i> ... ])</dt>
+<dd><i>expr</i> - an expression<br>
+returns - the new vector</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'vector' function creates an initialized vector and returns it as the
+result. 'vector' is essentially a fast method to do a one-dimensional <a
+href="make-array.htm">make-array</a> with initial data in the
+vector.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(vector 'a 'b 'c) <font color="#008844">; returns #(A B C)</font>
+(vector '(a b) '(c d)) <font color="#008844">; returns #((A B) (C D))</font>
+(vector) <font color="#008844">; returns #()</font>
+(vector NIL) <font color="#008844">; returns #(NIL)</font>
+(vector 'a () 4 "s") <font color="#008844">; returns #(A NIL 4 "s")</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-015.htm#vector">vector</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/when.htm b/docsrc/xlisp/xlisp-doc/reference/when.htm
new file mode 100644
index 0000000..5129f6e
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/when.htm
@@ -0,0 +1,82 @@
+<html><head><title>XLISP when</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>when</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>special form (fsubr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlcont.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(when <i>test</i> [<i>expr</i> ... ])</dt>
+<dd><i>test</i> - an expression, <a href="nil.htm">NIL</a>
+or non-<a href="nil.htm">NIL</a><br>
+<i>expr</i> - expressions comprising a body of code<br>
+returns - the value of the last expression or
+<a href="nil.htm">NIL</a></dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'when' macro executes the 'expr' forms if 'test' evaluates to a
+non-<a href="nil.htm">NIL</a> value. If 'test' is
+<nobr>non-<a href="nil.htm">NIL</a> ,</nobr> the value of the
+last 'expr' is returned as the result. If 'test' is
+<nobr><a href="nil.htm">NIL</a> ,</nobr>
+<a href="nil.htm">NIL</a> is returned with none of 'expr'
+evaluated.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(when NIL) <font color="#008844">; returns NIL</font>
+(when T) <font color="#008844">; returns T</font>
+
+(when T (print "hi") 'foo) <font color="#008844">; prints "hi" returns FOO</font>
+
+(when (listp '(a))
+ (print "a list")) <font color="#008844">; prints "a list"</font>
+ <font color="#008844">; returns "a list"</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-019.htm#when">when</a>
+special form in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/while.htm b/docsrc/xlisp/xlisp-doc/reference/while.htm
new file mode 100644
index 0000000..2a2f8da
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/while.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP while</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>while</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>Lisp macro (closure)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>misc.lsp</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<p><div class="box">
+
+<dl>
+<dt><nobr>(<b>while</b> <i>condition body</i>)</nobr></dt>
+<dd><i>condition</i> - test expression for terminating the 'while' loop<br>
+<dd><i>body</i> - Lisp expressions to be executed inside the loop<br>
+returns - returns <a href="nil.htm">NIL</a> or a value defined by
+(<a href="return.htm">return</a> <i>expr</i>) inside <i>body</i></dd>
+</dl>
+
+</div></p>
+
+<p>In Nyquist, 'while' is implemented as a Lisp macro:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">while</font> (condition &rest body)
+ `(prog () loop (if ,condition () (return)) ,@body (go loop)))
+</pre>
+
+<h2>Description</h2>
+
+<p>The 'while' macro implements a conventional 'while' loop. <nobr>If
+the</nobr> 'condition' evaluates to true, the expressions in the in the
+'body' are evaluated, then the 'condition' is tested again. <nobr>If
+the</nobr> 'condition' evaluates to false, the 'while' loop terminates. The
+'while' macro returns <a href="nil.htm">NIL</a> unless a <nobr>(<a
+href="return.htm">return</a> <i>expr</i>)</nobr> is evaluated in the 'body',
+in which case the value of 'expr' is returned.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/write-byte.htm b/docsrc/xlisp/xlisp-doc/reference/write-byte.htm
new file mode 100644
index 0000000..6ceab26
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/write-byte.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP write-byte</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>write-byte</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(write-byte <i>expr</i> [<i>dest</i>])</dt>
+<dd><i>expr</i> - an integer expression<br>
+<i>dest</i> - an optional destination, must be a file pointer or stream,
+default is <a href="global-standard-output.htm">*standard-output*</a><br>
+returns - the byte as an integer</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'write-byte' function writes the 'expr' as a single byte to the
+specified 'destination'. Only the 'expr' byte is written. The 'expr' must be
+an integer expression. The 'expr' is returned as the result. The
+'destination' may be a file pointer or a stream. If there is no
+'destination', <a href="global-standard-output.htm">*standard-output*</a> is the
+default.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(write-byte 67) <font color="#008844">; prints C returns 67</font>
+
+(setq fp (open "t" :direction :output)) <font color="#008844">; create file</font>
+(write-byte 65 fp) <font color="#008844">; returns 65</font>
+(write-byte 66 fp) <font color="#008844">; returns 66</font>
+(write-byte 10 fp) <font color="#008844">; returns 10</font>
+(close fp) <font color="#008844">; returns NIL</font>
+
+(read (open "t" :direction :input)) <font color="#008844">; returns AB</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that print operations with a
+'destination' of <a href="nil.htm">NIL</a> will go to
+<a href="global-standard-output.htm">*standard-output*</a>. XLISP does not send the
+output to <a href="global-standard-output.htm">*standard-output*</a> with a
+'destination' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'destination' of
+<a href="t.htm">&nbsp;T&nbsp;</a> will be sent to
+*terminal-io*, which is not defined in XLISP by default. XLISP does not
+allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid argument
+for 'destination'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-029.htm#write-byte">write-byte</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/write-char.htm b/docsrc/xlisp/xlisp-doc/reference/write-char.htm
new file mode 100644
index 0000000..d4075cd
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/write-char.htm
@@ -0,0 +1,92 @@
+<html><head><title>XLISP write-char</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>write-char</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(write-char <i>char-expr</i> [<i>dest</i>])</dt>
+<dd><i>char-expr</i> - a character expression<br>
+<i>dest</i> - an optional destination, must be a file pointer or stream,
+default is <a href="global-standard-output.htm">*standard-output*</a><br>
+returns - the character</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'write-char' function writes the 'char-expr' to the specified
+'destination'. Only the 'char-expr' is written. The 'char-expr' must be a
+character expression. The 'char-expr' is returned as the result. The
+'destination' may be a file pointer or a stream. If there is no
+'destination', <a href="global-standard-output.htm">*standard-output*</a> is the
+default.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(write-char #\C) <font color="#008844">; prints C</font>
+
+(setq fp (open "t" :direction :output)) <font color="#008844">; create file</font>
+(write-char #\A fp) <font color="#008844">; returns #\A</font>
+(write-char #\B fp) <font color="#008844">; returns #\B</font>
+(write-char #\Newline fp) <font color="#008844">; returns #\Newline</font>
+(close fp) <font color="#008844">; returns NIL</font>
+
+(read (open "t" :direction :input)) <font color="#008844">; returns AB</font>
+</pre>
+
+<p><b>Common Lisp:</b> Common Lisp specifies that print operations with a
+'destination' of <a href="nil.htm">NIL</a> will go to
+<a href="global-standard-output.htm">*standard-output*</a>. XLISP does not send the
+output to <a href="global-standard-output.htm">*standard-output*</a> with a
+'destination' of <a href="nil.htm">NIL</a>. Common Lisp also
+specifies that a 'destination' of
+<a href="t.htm">&nbsp;T&nbsp;</a> will be sent to
+*terminal-io*, which is not defined in XLISP by default. XLISP does not
+allow <a href="t.htm">&nbsp;T&nbsp;</a> as a valid argument
+for 'destination'.</p>
+
+<p>See the
+<a href="../manual/xlisp-man-029.htm#write-char">write-char</a>
+function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/write-float.htm b/docsrc/xlisp/xlisp-doc/reference/write-float.htm
new file mode 100644
index 0000000..f5bce92
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/write-float.htm
@@ -0,0 +1,80 @@
+<html><head><title>XLISP write-float</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>write-float</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(write-float <i>float</i> [<i>stream</i> [<i>length</i>]])</dt>
+<dd><i>float</i> - the floating point number to write<br>
+<i>stream</i> - the output stream [default is standard output]<br>
+<i>length</i> - the length of the float in bytes [default is 4,
+legal values are -4, -8, 4, and 8]<br>
+returns - the float</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>write-float</nobr>' function writes a binary floating point
+number to an output stream, created by the
+<nobr><a href="open-binary.htm">open-binary</a></nobr> function.</p>
+
+<p><b>Note:</b> Integers and floats are assumed to be
+<nobr>big-endian</nobr> [<nobr>high-order</nobr> byte first] and signed,
+regardless of the platform. <nobr>To read</nobr> <nobr>little-endian</nobr>
+format, use a negative number for the length, e.g. '-4' indicates a
+<nobr>4-bytes</nobr>, <nobr>low-order</nobr> byte first. The file should be
+opened in binary mode.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p>See also <nobr><a href="read-int.htm">read-int</a></nobr>,
+<nobr><a href="write-int.htm">write-int</a></nobr>,
+<nobr><a href="read-float.htm">read-float</a></nobr>,
+<nobr><a href="bigendianp.htm">bigendianp</a></nobr>,
+<nobr><a href="open-binary.htm">open-binary</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/write-int.htm b/docsrc/xlisp/xlisp-doc/reference/write-int.htm
new file mode 100644
index 0000000..131f9ae
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/write-int.htm
@@ -0,0 +1,79 @@
+<html><head><title>XLISP write-int</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>write-int</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlfio.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(write-int <i>integer</i> [<i>stream</i> [<i>length</i>]])</dt>
+<dd><i>integer</i> - the integer to write<br>
+<i>stream</i> - the output stream [default is standard output]<br>
+<i>length</i> - the length of the integer in bytes [default is 4]<br>
+returns - the integer</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The '<nobr>write-int</nobr>' function writes an integer to a binary output
+stream, created by the
+<nobr><a href="open-binary.htm">open-binary</a></nobr> function.</p>
+
+<p><b>Note:</b> Integers and floats are assumed to be
+<nobr>big-endian</nobr> [<nobr>high-order</nobr> byte first] and signed,
+regardless of the platform. <nobr>To read</nobr> <nobr>little-endian</nobr>
+format, use a negative number for the length, e.g. '-4' indicates a
+<nobr>4-bytes</nobr>, <nobr>low-order</nobr> byte first. The file should be
+opened in binary mode.</p>
+
+<h2>Examples</h2>
+
+<pre class="example">
+
+</pre>
+
+<p>See also <nobr><a href="read-int.htm">read-int</a></nobr>,
+<nobr><a href="read-float.htm">read-float</a></nobr>,
+<nobr><a href="write-float.htm">write-float</a></nobr>,
+<nobr><a href="bigendianp.htm">bigendianp</a></nobr>,
+<nobr><a href="open-binary.htm">open-binary</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/reference/zerop.htm b/docsrc/xlisp/xlisp-doc/reference/zerop.htm
new file mode 100644
index 0000000..014101b
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/reference/zerop.htm
@@ -0,0 +1,81 @@
+<html><head><title>XLISP zerop</title>
+
+<link rel="stylesheet" type="text/css" href="reference.css">
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>zerop</h1>
+
+<hr>
+
+<p><table cellpadding="0" cellspacing="0" style="margin-left:10px"><tbody>
+<tr valign="top">
+ <td><nobr>Type:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>predicate function (subr)</nobr></td>
+</tr>
+<tr valign="top">
+ <td><nobr>Source:</nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;&nbsp;</nobr></td>
+ <td width="100%"><nobr>xlmath.c</nobr></td>
+</tr>
+</tbody></table></p>
+
+<h2>Syntax</h2>
+
+<dl>
+<dt>(zerop <i>expr</i>)</dt>
+<dd><i>expr</i> - the numeric expression to check<br>
+returns - <a href="t.htm">&nbsp;T&nbsp;</a> if the number is
+zero, <a href="nil.htm">NIL</a> otherwise</dd>
+</dl>
+
+<h2>Description</h2>
+
+<p>The 'zerop' predicate function checks to see if the number 'expr' is
+zero. <a href="t.htm">&nbsp;T&nbsp;</a> is returned if the
+number is zero, <a href="nil.htm">NIL</a> is returned otherwise.
+An error is generated if the 'expr' is not a numeric expression:</p>
+
+<pre class="example">
+<font color="#AA0000">error: bad argument type</font>
+</pre>
+
+<h2>Examples</h2>
+
+<pre class="example">
+(zerop 0) <font color="#008844">; returns T</font>
+(zerop 0.0) <font color="#008844">; returns T</font>
+(zerop 99999.9) <font color="#008844">; returns NIL</font>
+(zerop -0.000000000002) <font color="#008844">; returns NIL</font>
+
+(zerop 'a) <font color="#008844">; error: bad argument type</font>
+(setq a 0) <font color="#008844">; set value of A to 0</font>
+(zerop a) <font color="#008844">; returns T</font>
+</pre>
+
+<p>See the
+<a href="../manual/xlisp-man-018.htm#zerop">zerop</a>
+predicate function in the <nobr>XLISP 2.0</nobr> manual.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</nobr></a></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="../tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/start.htm b/docsrc/xlisp/xlisp-doc/start.htm
new file mode 100644
index 0000000..c8154c9
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/start.htm
@@ -0,0 +1,86 @@
+<html><head>
+
+<title>XLisp</title></head>
+
+<body>
+
+Nyquist / XLISP 2.0&nbsp; -&nbsp;
+<a href="manual/contents.htm">Contents</a> |
+<a href="tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples/examples.htm">Examples</a> |
+<a href="reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Nyquist / XLISP 2.0</h1>
+
+<hr>
+
+<ul>
+<li><nobr><a href="misc/preface.htm">Preface</a> - what's this all about</nobr></li>
+</ul>
+
+<ul>
+<li><nobr><a href="manual/contents.htm">Contents</a></nobr></li>
+<ul>
+<li><nobr><a href="manual/xlisp.htm">XLISP 2.0 Manual</a> - by David Betz</nobr></li>
+<li><nobr><a href="manual/objects.htm">XLISP Object System</a> - by David Betz</nobr></li>
+<li><nobr><a href="reference/reference-index.htm">Language Reference</a> - based on documents by David Betz and Tim I Mikkelsen</nobr></li>
+<br>
+<li><nobr><a href="manual/xlisp-man-033.htm">Nyquist Functions</a> - added by Nyquist to the XLISP interpreter</nobr></li>
+<li><nobr><a href="xlisp-plus/xlisp-plus-index.htm">XLISP Plus Functions</a> - written in XLISP code</nobr></li>
+</ul>
+</ul>
+
+<ul>
+<li><nobr><a href="tutorials/tutorials.htm">Tutorials</a></nobr></li>
+<ul>
+<li><nobr><a href="tutorials/lisp-hints.htm">Lisp Hints</a> - XLISP basics</nobr></li>
+<li><nobr><a href="tutorials/xlisp-objects.htm">XLISP Objects Primer</a> - by Tim I Mikkelsen</nobr></li>
+</ul>
+</ul>
+
+<ul>
+<li><nobr><a href="examples/examples.htm">Examples</a> - XLISP examples</nobr></li>
+</ul>
+
+<ul>
+<li><nobr>Miscellaneous</nobr></li>
+<ul>
+<li><nobr><a href="misc/ascii-table.htm">ASCII Table</a> - XLISP characters</nobr></li>
+<li><nobr><a href="misc/c-printf.htm">ANSI C 'printf' Format</a> - for
+<a href="reference/global-float-format.htm">*float-format*</a> and
+<a href="reference/global-integer-format.htm">*integer-format*</a></nobr></li>
+<li><nobr><a href="misc/links.htm">Lisp Links</a> - books and documents available for free in the internet</nobr></li>
+</ul>
+</ul>
+
+<ul>
+<li><nobr>Internals</nobr></li>
+<ul>
+<li><nobr><a href="internals/xlisp-internals.html">XLISP Internals</a></nobr></li>
+</ul>
+</ul>
+
+<hr>
+
+<p>If you find bugs in these documents please write to:</p>
+
+<ul>
+<li><a href="mailto:edgar-rft@web.de">edgar-rft@web.de</a></li>
+</ul>
+
+<p>If you send me email please write the words XLISP or NYQUIST as big as
+possible into the subject line in case you get catched by the spam filter.
+I usually sort out my emails by hand but often do not have the time to
+open them all during sorting.</p>
+
+<hr>
+
+Nyquist / XLISP 2.0&nbsp; -&nbsp;
+<a href="manual/contents.htm">Contents</a> |
+<a href="tutorials/tutorials.htm">Tutorials</a> |
+<a href="examples/examples.htm">Examples</a> |
+<a href="reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/tutorials/binary-io.htm b/docsrc/xlisp/xlisp-doc/tutorials/binary-io.htm
new file mode 100644
index 0000000..73fce58
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/tutorials/binary-io.htm
@@ -0,0 +1,79 @@
+<html><head>
+
+<title>Binary File I/O</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Binary File I/O</h1>
+
+<hr>
+
+
+
+<pre class="example">
+(defun hexdump (filename &amp;key (start 0) end)
+ (if (and (integerp start) (not (minusp start)))
+ (error "not a non-negative integer" start))
+ (or (null end)
+ (and (integerp end) (not (minusp end)))
+ (error "not a non-negative integer" end))
+ (let ((file (open-binary filename)))
+</pre>
+
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials/tutorials.htm">Tutorials</a> |
+<a href="../examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/tutorials/environment.htm b/docsrc/xlisp/xlisp-doc/tutorials/environment.htm
new file mode 100644
index 0000000..2ce9a99
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/tutorials/environment.htm
@@ -0,0 +1,530 @@
+<html><head>
+
+<title>Environment</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Environment</h1>
+
+<hr>
+
+<a name="global-and-lexical-binding"></a>
+
+<hr>
+
+<h2>Global and Lexical Binding</h2>
+
+<hr>
+
+<p>From the XLISP perspective, there are two kinds of bindings:</p>
+
+<ol>
+
+<li><p>Global bindings are bindings to symbols in the *obarray*.</p></li>
+
+<li><p>Lexical bindings are bindings in a local association list</p></li>
+
+</ol>
+
+<p>There is a third kind of binding, 'dynamical binding', used by progv.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lexical-scope"></a>
+
+<hr>
+
+<h2>Lexical Scope</h2>
+
+<hr>
+
+<p>Have you ever wondered why this doesn't work:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">print-x</font> ()
+ (print x)) <font color="#008844">; unbound variable X</font>
+
+(let ((x 'hello))
+ (print-x))
+<font color="#AA0000">error: unbound variable - X</font>
+</pre>
+
+<p>The answer is twofold:</p>
+
+<ol>
+
+<li><p>The '<nobr>print-x</nobr>' function is defined at the global
+<nobr>top-level</nobr>, where no lexical environment exists.</p></li>
+
+<li><p>The '<nobr>print-x</nobr>' function is called inside a
+<a href="../reference/let.htm">let</a> form, where a lexical variable
+binding for 'x' exists, but '<nobr>print-x</nobr>' is evaluated at the
+global <nobr>top-level</nobr>, where it was defined, so
+'<nobr>print-x</nobr>' cannot see the lexical
+<a href="../reference/let.htm">let</a> binding <nobr>of 'x'</nobr> and
+signals an '<nobr>unbound variable</nobr>' error.</p></li>
+
+</ol>
+
+<p>Here is a version that seems to work:</p>
+
+<pre class="example">
+(let ((x 'hello))
+
+ (defun <font color="#0000CC">print-x</font> ()
+ (print x))
+
+ (print-x))
+HELLO
+</pre>
+
+<ol>
+
+<li><p>The '<nobr>print-x</nobr>' function is defined inside a
+<a href="../reference/let.htm">let</a> form.</p></li>
+
+<li><p>The '<nobr>print-x</nobr>' function is called inside the same
+<a href="../reference/let.htm">let</a> form as where it was defined, so
+'<nobr>print-x</nobr>' prints the lexical
+<a href="../reference/let.htm">let</a> binding
+<nobr>of 'x'</nobr>.</p></li>
+
+</ol>
+
+<p>But here again a version that does not behave as wanted:</p>
+
+<pre class="example">
+(let ((x 'lexical))
+ (defun <font color="#0000CC">print-x</font> ()
+ (print x)))
+
+(let ((x 'hello))
+ (print-x))
+LEXICAL
+</pre>
+
+<ol>
+
+<li><p>The '<nobr>print-x</nobr>' function is defined inside a
+<a href="../reference/let.htm">let</a> form.</p></li>
+
+<li><p>The '<nobr>print-x</nobr>' function is called inside a different
+<a href="../reference/let.htm">let</a> form as where it was defined, so
+'<nobr>print-x</nobr>' prints the lexical
+<a href="../reference/let.htm">let</a> binding <nobr>of 'x'</nobr> from
+the place where it was defined.</p></li>
+
+</ol>
+
+<p>Somehow it seems to be important where a function was defined.</p>
+
+<a name="closures"></a>
+
+<hr>
+
+<h2>Closures</h2>
+
+<hr>
+
+<p>Here a Lisp function, defined inside a
+<a href="../reference/let.htm">let</a> form:</p>
+
+<pre class="example">
+(let ((a 'A) (b 'B) (c 'C))
+
+ (defun <font color="#0000CC">print-abc</font> ()
+ (format t <font color="#880000">";; a = ~s, b = ~s, c = ~s~%"</font> a b c))
+
+ ) <font color="#008844">; end of LET</font>
+</pre>
+
+<p>Now '<nobr>print-abc</nobr>' is called outside the
+<a href="../reference/let.htm">let</a> form:</p>
+
+<pre class="example">
+&gt; (print-abc)
+;; a = A, b = B, c = C
+NIL
+</pre>
+
+<p>The lexical <a href="../reference/let.htm">let</a> variables 'a', 'b',
+and 'c' have become a permanent part of the '<nobr>print-abc</nobr>'
+function.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="lisp-objects"></a>
+
+<hr>
+
+<h2>Lisp Objects</h2>
+
+<hr>
+
+<p>The following examples are based on <nobr>Chapter 13</nobr> of 'Paradigms
+of Artificial Intelligence Programming' by Peter Norvig. <nobr>The
+code</nobr> has been ported from <nobr>Common Lisp</nobr> to XLISP, all
+examples have been tested with <nobr>Nyquist 3.03</nobr> in <nobr>December
+2010</nobr>.</p>
+
+<p>The function '<nobr>new-account</nobr>' creates account objects, which
+are implemented as closures encapsulating three variables 'name', 'balance',
+and '<nobr>interest-rate</nobr>'. <nobr> An account</nobr> object also
+encapsulates functions to handle five messages ':withdraw', ':deposit',
+':balance', ':name', and ':interest', to which the object can respond:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">new-account</font> (name &amp;optional (balance 0.0) (interest-rate 0.06))
+ #'(lambda (message)
+ (case message
+ (:withdraw #'(lambda (amount)
+ (if (&lt;= amount balance)
+ (setq balance (- balance amount))
+ 'insufficient-funds)))
+ (:deposit #'(lambda (amount)
+ (setq balance (+ balance amount))))
+ (:balance #'(lambda () balance))
+ (:name #'(lambda () name))
+ (:interest #'(lambda ()
+ (setq balance (+ balance (* interest-rate balance))))))))
+</pre>
+
+<p>An account object can only do one thing, receive a message and return the
+appropriate function to execute that message. This function is called the
+'method' that implements the message.</p>
+
+<p>The function '<nobr>get-method</nobr>' finds the method that implements a
+message for a given object:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">get-method</font> (object message)
+ (funcall object message))
+</pre>
+
+<p>The function '<nobr>send-message</nobr>' gets the method and applies it
+to a list of arguments:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">send-message</font> (object message &amp;rest args)
+ (apply (get-method object message) args))
+</pre>
+
+<p>Here are some examples how it works:</p>
+
+<pre class="example">
+&gt; (setq a1 (new-account "My Name" 1000.0))
+#&lt;Closure...&gt;
+
+&gt; (send-message a1 :name)
+"My Name"
+
+&gt; (send-message a1 :balance)
+1000.0
+
+&gt; (send-message a1 :withdraw 500.0)
+500
+
+&gt; (send-message a1 :deposit 123.45)
+623.45
+
+&gt; (send-message a1 :balance)
+623.45
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="generic-functions"></a>
+
+<hr>
+
+<h2>Generic Functions</h2>
+
+<hr>
+
+<p>The '<nobr>send-message</nobr>' syntax is awkward, as it is different
+from normal Lisp function calling syntax, and it doesn't fit in with the
+other Lisp tools.</p>
+
+<p>For example if we want <nobr>to say</nobr>:</p>
+
+<pre class="example">
+(mapcar :balance accounts)
+</pre>
+
+<p>with '<nobr>send-message</nobr>' we would have to write:</p>
+
+<pre class="example">
+(mapcar #'(lambda (acc)
+ (send-message acc :balance))
+ accounts)
+</pre>
+
+<p>We could fix this problem by defining a generic function 'withdraw' like
+this:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">withdraw</font> (object &amp;rest args)
+ (apply (get-method object :withdraw) args))
+</pre>
+
+<p>Now we can write:</p>
+
+<pre class="example">
+(withdraw account x)
+</pre>
+
+<p>instead of:</p>
+
+<pre class="example">
+(send-message account :withdraw x)
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="classes"></a>
+
+<hr>
+
+<h2>Classes</h2>
+
+<hr>
+
+<p>The macro '<nobr>define-class</nobr>' defines a class with its associated
+message handling methods. <nobr>It also</nobr> defines a generic function
+for each message. Finally, it allows the programmer to make a distinction
+between instance variables, associated with each object, and class
+variables, associated with a class and shared by all members of the
+class.</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">define-class</font> (class ivars cvars &amp;rest methods)
+ `(let ,cvars
+ (mapcar #'ensure-generic-function ',(mapcar #'first methods))
+ (defun ,class ,ivars
+ #'(lambda (message)
+ (case message
+ ,@(mapcar #'make-clause methods))))))
+</pre>
+
+<p>The '<nobr>make-clause</nobr>' function translates a message from
+'<nobr>define-class</nobr>' into a
+<a href="../reference/case.htm">case</a> clause.</p>
+
+<pre class="example">
+(defun <font color="#0000CC">make-clause</font> (clause)
+ `(,(car clause) #'(lambda ,(cadr clause) ,@(cddr clause))))
+</pre>
+
+<p>The '<nobr>ensure-generic-function</nobr>' function defines a dispatch
+function for a message, unless it already has been defined <nobr>as
+one</nobr>:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">ensure-generic-function</font> (message)
+ (unless (generic-function-p message)
+ (let ((fn #'(lambda (object &amp;rest args)
+ (apply (get-method object message) args))))
+ (setf (symbol-function message) fn)
+ (putprop message fn 'generic-function))))
+</pre>
+
+<p>The '<nobr>generic-function-p</nobr>' function tests if a function has
+been defined as a generic function:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">generic-function-p</font> (name)
+ (and (fboundp name)
+ (eq (get name 'generic-function) (symbol-function name))))
+</pre>
+
+<p>Now we can define the 'account' class with '<nobr>define-class</nobr>'.
+We make '<nobr>interest-rate</nobr>' a class variable, shared by all
+accounts:</p>
+
+<pre class="example">
+(define-class <font color="#0066CC">account</font> (name &amp;optional (balance 0.0)) ((interest-rate 0.06))
+ (withdraw (amount)
+ (if (&lt;= amount balance)
+ (setq balance (- balance amount))
+ 'insufficient-funds))
+ (deposit (amount)
+ (setq balance (+ balance amount)))
+ (balance ()
+ balance)
+ (name ()
+ name)
+ (interest ()
+ (setq balance (+ balance (* interest-rate balance)))))
+</pre>
+
+<p>Macroexpansion:</p>
+
+<pre class="example">
+(let ((interest-rate 0.06))
+ (mapcar (function ensure-generic-function)
+ (quote (withdraw deposit balance name interest)))
+ (defun account (name &amp;optional (balance 0))
+ (function (lambda (message)
+ (case message
+ (withdraw (function (lambda (amount)
+ (if (&lt;= amount balance)
+ (setq balance (- balance amount))
+ (quote insufficient-funds)))))
+ (deposit (function (lambda (amount)
+ (setq balance (+ balance amount)))))
+ (balance (function (lambda nil balance)))
+ (name (function (lambda nil name)))
+ (interest (function (lambda nil
+ (setq balance (+ balance (* interest-rate balance)))))))))))
+</pre>
+
+<p>Here is how it works:</p>
+
+<pre class="example">
+&gt; (setq a2 (account "my-name" 2000.0)
+#&lt;Closure...&gt;
+
+&gt; (balance a2)
+2000
+
+&gt; (deposit a2 42.0)
+2042
+
+&gt; (interest a2)
+2164.52
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="delegation"></a>
+
+<hr>
+
+<h2>Delegation</h2>
+
+<hr>
+
+<p>Here is a '<nobr>password-account</nobr>' class with two
+message clauses:</p>
+
+<pre class="example">
+(define-class <font color="#0066CC">password-account</font> (password acc) ()
+ (change-password (pass new-pass)
+ (if (equal pass password)
+ (setq password new-pass)
+ 'wrong-password))
+ (t (pass &amp;rest args)
+ (if (equal pass password)
+ (if args
+ (apply message (cons acc args))
+ (funcall message acc))
+ 'wrong-password)))
+</pre>
+
+<p>The definition of '<nobr>password-account</nobr>' depends on some
+internal details of '<nobr>define-class</nobr>'. <nobr>It uses</nobr> 't' as
+a <nobr>catch-all</nobr> clause to <a href="../reference/case.htm">case</a>
+and uses the dispatch variable 'message'. Usually it is not a good idea to
+rely on details of other code, so this will be changed below.</p>
+
+<p>Here is how '<nobr>password-account</nobr>' works:</p>
+
+<pre class="example">
+&gt; (setq a3 (password-account "secret" a2))
+#&lt;Closure...&gt;
+
+&gt; (balance a3 "secret")
+2164.52
+
+&gt; (withdraw a3 "guess" 2000.0)
+WRONG-PASSWORD
+
+&gt; (withdraw a3 "secret" 2000.0)
+164.52
+</pre>
+
+<p>Here is a '<nobr>limited-account</nobr>' class, where only a limited
+amount of money can be withdrawn at any time:</p>
+
+<pre class="example">
+(define-class <font color="#0066CC">limited-account</font> (limit acc) ()
+ (withdraw (amount)
+ (if (&lt;= amount limit)
+ (withdraw acc amount)
+ 'over-limit))
+ (t (&amp;rest args)
+ (if args
+ (apply message (cons acc args))
+ (funcall message acc))))
+</pre>
+
+<p>The 'withdraw' message is redefined to check if the account limit is
+exceeded, while the 't' clause passes all other messages unchanged:</p>
+
+<pre class="example">
+&gt; (setq a4 (password-account "pass"
+ (limited-account 100.0
+ (account "limited" 500.0)))
+#&lt;Closure...&gt;
+
+
+
+
+
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/tutorials/file-io.htm b/docsrc/xlisp/xlisp-doc/tutorials/file-io.htm
new file mode 100644
index 0000000..19f6862
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/tutorials/file-io.htm
@@ -0,0 +1,349 @@
+<html><head><title>XLISP: An Object-oriented Lisp</title></head>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>File I/O</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#1">File I/O Examples</a> - from the XLISP 2.0 manual, by David Betz</nobr></li>
+<ul>
+<li><nobr><a href="#1-1">Input from a File</a></nobr></li>
+<li><nobr><a href="#1-2">Output to a File</a></nobr></li>
+<li><nobr><a href="#1-3">A Slightly More Complicated File Example</a></nobr></li>
+<li><nobr><a href="#1-4">Closing Files via 'unwind-protect'</a></nobr></li>
+</ul>
+<li><nobr><a href="#2">Files and Directories</a></nobr></li>
+<ul>
+<li><nobr><a href="#2-1">setdir</a></nobr></li>
+<li><nobr><a href="#2-2">listdir</a></nobr></li>
+</ul>
+<li><nobr><a href="#3">Testing Existence</a></nobr></li>
+<ul>
+<li><nobr><a href="#directory-exists-p">directory-exists-p</a></nobr></li>
+<li><nobr><a href="#file-exists-p">file-exists-p</a></nobr></li>
+<li><nobr><a href="#file-or-directory-exists-p">file-or-directory-exists-p</a></nobr></li>
+</ul>
+<li><nobr><a href="#4">Text File I/O</a></nobr></li>
+<ul>
+<li><nobr><a href="#">Reading from a Text File</a></nobr></li>
+<li><nobr><a href="#">Writing to a Text File</a></nobr></li>
+<li><nobr><a href="#">Appending to a Text File</a></nobr></li>
+</ul>
+<li><nobr><a href="#5">Binary File I/O</a></nobr></li>
+</ol>
+
+<a name="1"></a>
+
+<hr>
+
+<h2>1&nbsp; File I/O Examples</h2>
+
+<a name="1-1"></a>
+
+<hr>
+
+<h2>1.1&nbsp; Input from a File</h2>
+
+<hr>
+
+<p>The basics of file i/o with XLISP:</p>
+
+<ul>
+
+<li><p>To open a file for input, use the
+<a href="../reference/open.htm">open</a> function with the keyword argument
+:direction set to :input.</p></li>
+
+<li><p>To open a file for
+output, use the <a href="../reference/open.htm">open</a> function with the
+keyword argument :direction set to :output.</p></li>
+
+<li><p>To close a file, use the <a href="../reference/close.htm">close</a>
+function.</p></li>
+
+</ul>
+
+<p>The <a href="../reference/open.htm">open</a> function takes a single
+required argument which is the name of the file to be opened. This name can
+be in the form of a string or a symbol. <nobr>The
+<a href="../reference/open.htm">open</a></nobr> function returns an object
+of type '<nobr>file-stream</nobr>' if it succeeds in opening the specified
+file. <nobr>It returns</nobr> the value
+<a href="../reference/nil.htm">NIL</a> if it fails.</p>
+
+<p>In order to manipulate the file, it is necessary to save the value
+returned by the <a href="../reference/open.htm">open</a> function.
+This is usually done by assigning it to a variable with the
+<a href="../reference/setq.htm">setq</a> special form or by binding it using
+<a href="../reference/let.htm">let</a> or
+<a href="../reference/let-star.htm">let*</a>. Here is an example:</a>
+
+<pre class="example">
+(setq file-stream (open "init.lsp" :direction :input))
+</pre>
+
+<p>Evaluating this expression will result in the file 'init.lsp' being
+opened. The file object that will be returned by the
+<a href="../reference/open.htm">open</a> function will be
+assigned to the variable '<nobr>file-stream</nobr>'.</p>
+
+<p>It is now possible to use the file for input. <nobr>To read</nobr> an
+expression from the file, just supply the value of the
+'<nobr>file-stream</nobr>' variable as the optional 'stream' argument to the
+<a href="../reference/read.htm">read</a> function:</p>
+
+<pre class="example">
+(read file-stream)
+</pre>
+
+<p>Evaluating this expression will result in reading the first expression
+from the file 'init.lsp'. The expression will be returned as the
+result of the <a href="../reference/read.htm">read</a> function.
+More expressions can be read from the file using further calls to the
+<a href="../reference/read.htm">read</a> function. When there
+are no more expressions to read, the
+<a href="../reference/read.htm">read</a> function will return
+<a href="../reference/nil.htm">NIL</a> [or whatever value was
+supplied as the second argument to
+<a href="../reference/read.htm">read</a>].</p>
+
+<p>Once you are done reading from the file, you should close it. To close
+the file, use the <a href="../reference/close.htm">close</a>
+function:</p>
+
+<pre class="example">
+(close file-stream)
+</pre>
+
+<p>Evaluating this expression will cause the file to be closed.</p>
+
+<p>&nbsp;&nbsp;<a href="#top">Back to Top</a></p>
+
+<a name="1-2"></a>
+
+<hr>
+
+<h2>1.2&nbsp; Output to a File</h2>
+
+<hr>
+
+<p>Writing to a file is pretty much the same as reading from one. You need
+to open the file first. This time you should use the
+<a href="../reference/open.htm">open</a> function to indicate
+that you will do output to the file:</p>
+
+<pre class="example">
+(setq file-stream (open "test.dat" :direction :output))
+</pre>
+
+<p>Evaluating this expression will open the file 'test.dat' for output.
+<nobr>If the</nobr> file already exists, its current contents will be
+discarded. <nobr>If it</nobr> doesn't already exist, it will be created.
+<nobr>In any</nobr> case, a '<nobr>file-stream</nobr>' object will be
+returned by the <a href="../reference/open.htm">open</a> function. This file
+object will be assigned to the '<nobr>file-stream</nobr>' variable.</p>
+
+<p>It is now possible to write to this file by supplying the value of the
+'<nobr>file-stream</nobr>' variable as the optional 'stream' parameter in
+the <a href="../reference/print.htm">print</a> function.</p>
+
+<pre class="example">
+(print "Hello there" file-stream)
+</pre>
+
+<p>Evaluating this expression will result in the string <nobr>&quot;Hello
+there&quot;</nobr> being written to the <nobr>file
+&quot;test.dat&quot;</nobr>. More data can be written to the file using the
+same technique.</p>
+
+<p>Once you are done writing to the file, you should
+<nobr><a href="../reference/close.htm">close</a> it</nobr>. Closing an
+output file is just like closing an input file:</p>
+
+<pre class="example">
+(close file-stream)
+</pre>
+
+<p>Evaluating this expression will
+<a href="../reference/close.htm">close</a> the output file and
+make it permanent.</p>
+
+<p>&nbsp;&nbsp;<a href="#top">Back to Top</a></p>
+
+<a name="1-3"></a>
+
+<hr>
+
+<h2>1.3&nbsp; A Slightly More Complicated File Example</h2>
+
+<hr>
+
+<p>This example shows how to
+<a href="../reference/open.htm">open</a> a file,
+<a href="../reference/read.htm">read</a> each Lisp expression
+from the file and <a href="../reference/print.htm">print</a> it.
+It demonstrates the use of files and the use of the optional 'stream'
+argument to the <a href="../reference/read.htm">read</a>
+function.</p>
+
+<pre class="example">
+(do* ((file-stream (open "test.dat" :direction :input))
+ (expression (read file-stream) (read file-stream)))
+ ((null expression) nil)
+ (print expression))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="1-4"></a>
+
+<hr>
+
+<h2>1.4&nbsp; Closing Files via 'unwind-protect'</h2>
+
+<hr>
+
+<p>To make sure that the file gets closed in the end, the
+<nobr>file i/o</nobr> functions can be wrapped by an <nobr><a
+href="../reference/unwind-protect.htm">unwind-protect</a> form:</nobr></p>
+
+<pre class="example">
+(let ((file-stream (open "test.dat" :direction :input)))
+ (unwind-protect
+ <font color="#008844">;; protect-form</font>
+ (do ((expression (read file-stream) (read file-stream)))
+ ((null expression) nil)
+ (print expression))
+ <font color="#008844">;; clean-up form</font>
+ (when file-stream (close file-stream))))
+</pre>
+
+<p>This pattern can be found in many <nobr>file i/o</nobr> functions:</p>
+
+<pre class="example">
+(let ((<font color="#AA0000">file-stream</font> (open <font color="#0000CC">filename</font> :direction <font color="#0000CC">direction</font>)))
+ (unwind-protect
+ (progn
+ <font color="#008844">;; do something with the file-stream</font>
+ )
+ (when <font color="#AA0000">file-stream</font> (close <font color="#AA0000">file-stream</font>))))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="3"></a>
+
+<hr>
+
+<h2>3&nbsp; Testing Existence</h2>
+
+<hr>
+
+<p><div class="box">
+
+<p>Note that these function are meant to prevent accidents during basic
+<nobr>file i/o</nobr>, they may not be able to test if a file or directory
+physically exists or is a link to a different place.</p>
+
+</div></p>
+
+<a name="directory-exists-p"></a>
+
+<p>The Nyquist <a href="../reference/listdir.htm">listdir</a> function can
+be used to test if a directory exists:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">directory-exists-p</font> (string)
+ (and (listdir string) t))
+</pre>
+
+<a name="file-exists-p"></a>
+
+<p>Testing if a file exists is a bit more tricky because on Unix [including
+Linux and <nobr>Mac OS X]</nobr> a directory is a special kind of file, so
+the XLISP <a href="../reference/open.htm">open</a> function also can open
+directories. That's why we first must make sure that the filename string is
+not the name of an existing directory:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">file-exists-p</font> (string)
+ (or (stringp string) (error <font color="#880000">"not a string"</font> string))
+ (unless (listdir string)
+ (let ((file-stream (open string)))
+ (when file-stream
+ (close file-stream)
+ string))))
+</pre>
+
+<a name="file-or-directory-exists-p"></a>
+
+<p>Before creating a new file it's always a good idea to check
+if a file or directory with the same name already exists:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">file-or-directory-exists-p</font> (string)
+ (or (stringp string) (error <font color="#880000">"not a string"</font> string))
+ (when (or (listdir string)
+ (let ((file-stream (open string)))
+ (when file-stream
+ (close file-stream)
+ t)))
+ string))
+</pre>
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to Top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/tutorials/lisp-faq.htm b/docsrc/xlisp/xlisp-doc/tutorials/lisp-faq.htm
new file mode 100644
index 0000000..a00e621
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/tutorials/lisp-faq.htm
@@ -0,0 +1,199 @@
+<html><head>
+
+<title>Lisp FAQ</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Lisp FAQ</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#and-or-with-apply-funcall">Why do #'and and #'or not work with apply and funcall?</a></nobr></li>
+<li><nobr><a href="#more-faqs">Where can I find more Lisp FAQs in the Internet?</a></nobr></li>
+</ol>
+
+<a name="and-or-with-apply-funcall"></a>
+
+<hr>
+
+<h2>Why do #'and and #'or not work with apply and funcall?</h2>
+
+<hr>
+
+<p><nobr>From
+<a href="http://www.cs.cmu.edu/Groups/AI/html/faqs/lang/lisp/part3/faq-doc-3.html"
+>http://www.cs.cmu.edu/Groups/AI/html/faqs/lang/lisp/part3/faq-doc-3.html</a></nobr></p>
+
+<p>The short answer is that <a href="../reference/and.htm">and</a> and
+<a href="../reference/or.htm">or</a> are special operators, not functions,
+while <a href="../reference/apply.htm">apply</a> and
+<a href="../reference/funcall.htm">funcall</a> can only be used to invoke
+functions, not macros and special operators.</p>
+
+<p>The reason why <a href="../reference/and.htm">and</a> and <a
+href="../reference/or.htm">or</a> are special operators is because they
+implement control structure in addition to computing a boolean value. They
+evaluate their subforms sequentially from left to right, and stop evaluating
+subforms as soon as the result can be determined. This is referred to as
+'<nobr>short circuiting</nobr>'. <a href="../reference/apply.htm">apply</a>
+and <a href="../reference/funcall.htm">funcall</a>, however, are ordinary
+functions. Therefore, their arguments are evaluated before they are called.
+Thus, were <a href="../reference/apply.htm">apply</a> able to be used with
+#'<a href="../reference/and.htm">and</a> and
+<a href="../reference/or.htm">or</a>, the <nobr>short-circuiting</nobr>
+would be defeated.</p>
+
+<p>Perhaps you don't really care about the <nobr>short-circuiting</nobr>,
+and simply want the functional, boolean interpretation. While this may be a
+reasonable interpretation of trying to
+<a href="../reference/apply.htm">apply</a>
+<a href="../reference/and.htm">and</a>
+<nobr>or <a href="../reference/or.htm">or</a></nobr>, it doesn't generalize
+to other macros well, so there's no obvious way to have the Lisp system 'do
+the right thing' when trying to apply macros. <nobr>The only</nobr> function
+associated with a macro is its expander function. This function accepts and
+returns and form, so it cannot be used to compute the value.</p>
+
+<p>The <nobr>Common Lisp</nobr> functions EVERY, SOME and IDENTITY can be
+used to get the functionality you intend when trying to
+<a href="../reference/apply.htm">apply</a>
+#'<a href="../reference/and.htm">and</a>
+<nobr>and #'<a href="../reference/or.htm">or</a></nobr>:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>(apply #'and <font color="#0000CC">list</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>(every #'identity <font color="#0000CC">list</font>)</code></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>(apply #'or&nbsp; <font color="#0000CC">list</font>)</code></nobr></td>
+ <td><nobr>&nbsp;&rarr;&nbsp;</nobr></td>
+ <td class="button"><nobr><code>(some&nbsp; #'identity <font color="#0000CC">list</font>)</code></nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>Defining <a href="../reference/and.htm">and</a> and
+<a href="../reference/or.htm">or</a> as functions using
+<a href="../reference/cons.htm">cons</a> and
+<a href="../reference/eval.htm">eval</a>:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">and-fn</font> (&amp;rest args)
+ (eval (cons 'and args)))
+
+(defun <font color="#0000CC">or-fn</font> (&amp;rest args)
+ (eval (cons 'or args)))
+</pre>
+
+<p>Defining <a href="../reference/and.htm">and</a> and
+<a href="../reference/or.htm">or</a> as functions using
+<a href="../reference/dolist.htm">dolist</a>:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">and-fn</font> (&amp;rest args)
+ (dolist (x args t)
+ (and (not x) (return nil))))
+
+(defun <font color="#0000CC">or-fn</font> (&amp;rest args)
+ (dolist (x args nil)
+ (and x (return t))))
+</pre>
+
+
+<pre class="example">
+(defun <font color="#0000CC">apply*</font> (function args)
+ (if (eq (type-of function) 'fsubr)
+ (eval (cons function args))
+ (apply function args)))
+
+
+</pre>
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="more-faqs"></a>
+
+<hr>
+
+<h2>Where can I find more Lisp FAQs in the Internet?</h2>
+
+<hr>
+
+<ul>
+<li><nobr><a href="http://www.cs.cmu.edu/Groups/AI/html/faqs/lang/lisp/top.html"
+>http://www.cs.cmu.edu/Groups/AI/html/faqs/lang/lisp/top.html</a>
+- comp.lang.lisp FAQ from the CMU AI Repository</nobr></li>
+</ul>
+
+
+
+
+
+
+
+
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/tutorials/lisp-hints.htm b/docsrc/xlisp/xlisp-doc/tutorials/lisp-hints.htm
new file mode 100644
index 0000000..13e0e84
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/tutorials/lisp-hints.htm
@@ -0,0 +1,2055 @@
+<html><head>
+
+<title>Lisp Hints</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Lisp Hints</h1>
+
+<hr>
+
+<p>The original document was written by <nobr>Geoffrey J. Gordon</nobr>
+[<nobr>ggordon@cs.cmu.edu</nobr>], <nobr>Friday, February 5, 1993</nobr>,
+<nobr>for <a href="http://www.cons.org/cmucl/">CMUCL</a></nobr>.</p>
+
+<p>Modified by:</p>
+
+<ul>
+
+<li><nobr>Bruno Haible for <a href="http://www.gnu.org/software/clisp/">CLISP</a>.</nobr></li>
+
+<li><nobr>Tom Almy in 1995 for <a href="http://almy.us/xlisp.html">XLISP Plus</a></nobr>.</li>
+
+<li><nobr>Edgar M. Franke [edgar-rft@web.de] in 2010 for
+<a href="http://www.cs.cmu.edu/~music/music.software.html">Nyquist</a></nobr>.</li>
+
+</ul>
+
+<p>All examples tested with <nobr>Nyquist 3.03</nobr> in <nobr>November
+2010</nobr>.</p>
+
+<hr>
+
+<h2>Table of Contents</h2>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#1">Symbols</a></nobr></li>
+<li><nobr><a href="#2">Numbers</a></nobr></li>
+<li><nobr><a href="#3">Conses</a></nobr></li>
+<li><nobr><a href="#4">Lists</a></nobr></li>
+<li><nobr><a href="#5">Functions</a></nobr></li>
+<li><nobr><a href="#6">Printing</a></nobr></li>
+<li><nobr><a href="#7">Forms and the Top-Level Loop</a></nobr></li>
+<li><nobr><a href="#8">Special Forms</a></nobr></li>
+<li><nobr><a href="#9">Binding</a></nobr></li>
+<li><nobr><a href="#10">Dynamic Scoping</a></nobr></li>
+<li><nobr><a href="#11">Arrays</a></nobr></li>
+<li><nobr><a href="#12">Strings</a></nobr></li>
+<li><nobr><a href="#13">Setf</a></nobr></li>
+<li><nobr><a href="#14">Booleans and Conditionals</a></nobr></li>
+<li><nobr><a href="#15">Iteration</a></nobr></li>
+<li><nobr><a href="#16">Non-local Exits</a></nobr></li>
+<li><nobr><a href="#17">Funcall, Apply, and Mapcar</a></nobr></li>
+<li><nobr><a href="#18">Lambda</a></nobr></li>
+<li><nobr><a href="#19">Sorting</a></nobr></li>
+<li><nobr><a href="#20">Equality</a></nobr></li>
+<li><nobr><a href="#21">Some Useful List Functions</a></nobr></li>
+</ol>
+
+<a name="1"></a>
+
+<hr>
+
+<h2>1&nbsp; Symbols</h2>
+
+<hr>
+
+<p>A symbol is just a sequence of characters. There are restrictions on what
+you can include in a symbol and what the first character can be, but as long
+as you stick to letters, digits, and hyphens, you'll be safe. [Except that
+if you use only digits and possibly an initial hyphen, Lisp will think you
+typed an integer rather than a symbol.] Some examples of symbols:</p>
+
+<pre class="example">
+a
+b
+c1
+foo
+bar
+baaz-quux-garply
+</pre>
+
+<p>Some things you can do with symbols follow. Things after a <nobr>'>'
+prompt</nobr> are what you type to the Lisp interpreter, while other things
+are what the Lisp interpreter prints back to you. The <nobr>semicolon
+';'</nobr> is Lisp's comment character. Everything from a ';' to the end of
+line is ignored.</p>
+
+<pre class="example">
+&gt; (setq a 5) <font color="#008844">; store a number as the value of a symbol</font>
+5
+
+&gt; a <font color="#008844">; take the value of a symbol</font>
+5
+
+&gt; (let ((a 6)) <font color="#008844">; bind the value of a symbol temporarily to 6</font>
+ a)
+6
+
+&gt; a <font color="#008844">; the value returns to 5 once the let is finished</font>
+5
+
+&gt; (+ a 6) <font color="#008844">; use the value of a symbol as an argument to a function</font>
+11
+
+&gt; b <font color="#008844">; try to take the value of a symbol which has no value</font>
+<font color="#AA0000">error: unbound variable - b</font>
+</pre>
+
+<p>There are two special symbols,
+<a href="../reference/t.htm">&nbsp;T&nbsp;</a>
+<nobr>and <a href="../reference/nil.htm">NIL</a></nobr>. <nobr>The
+value</nobr> of <a href="../reference/t.htm">&nbsp;T&nbsp;</a> is defined
+always to <nobr>be <a href="../reference/t.htm">&nbsp;T&nbsp;</a></nobr>,
+and the value of <a href="../reference/nil.htm">NIL</a></nobr> is defined
+always to <nobr>be <a href="../reference/nil.htm">NIL</a></nobr></nobr>.
+Lisp uses <a href="../reference/t.htm">&nbsp;T&nbsp;</a> and
+<a href="../reference/nil.htm">NIL</a></nobr> to represent true and false.
+<nobr>An example</nobr> of this use is in the if statement, described more
+fully later:</p>
+
+<pre class="example">
+&gt; (if t 5 6)
+5
+
+&gt; (if nil 5 6)
+6
+
+&gt; (if 4 5 6)
+5
+</pre>
+
+<p>The last example is odd but correct.
+<nobr><a href="../reference/nil.htm">NIL</a> means</nobr> false, and
+anything else means true. Unless we have a reason to do otherwise, we use
+<a href="../reference/t.htm">&nbsp;T&nbsp;</a> to mean true, just for the
+sake of clarity.</p>
+
+<p>Symbols like <a href="../reference/t.htm">&nbsp;T&nbsp;</a> and
+<a href="../reference/nil.htm">NIL</a> are called
+'<nobr>self-evaluating</nobr>' symbols, because they evaluate to themselves.
+There is a whole class of <nobr>self-evaluating</nobr> symbols called
+'keywords'. Any symbol whose name starts with a colon is a keyword. [See
+below for some uses for keywords.] Some examples:</p>
+
+<pre class="example">
+&gt; :this-is-a-keyword
+:THIS-IS-A-KEYWORD
+
+&gt; :so-is-this
+:SO-IS-THIS
+
+&gt; :me-too
+:ME-TOO
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="2"></a>
+
+<hr>
+
+<h2>2&nbsp; Numbers</h2>
+
+<hr>
+
+<p>An integer number [FIXNUM] is a sequence of digits optionally preceded by
+a plus <nobr>sign '+'</nobr> or a minus <nobr>sign '-'</nobr>. <nobr>A
+floating</nobr> point number [FLONUM] looks like an integer, except that it
+has a decimal point and optionally can be written in scientific notation.
+Here are some numbers:</p>
+
+<pre class="example">
+5
+17
+-34
++6
+3.1415
+1.722e-15
+</pre>
+
+<p>The standard arithmetic functions are all available:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>+</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><a href="../reference/addition.htm">addition</a></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>-</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><a href="../reference/subtraction.htm">subtraction</a></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>*</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><a href="../reference/multiplication.htm">multiplication</a></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>/</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><a href="../reference/division.htm">division</a></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>truncate</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><a href="../reference/truncate.htm">truncate</a> a float to an integer</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>rem</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><a href="../reference/rem.htm">remainder</a> of a division</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>sin</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><a href="../reference/sin.htm">sine</a></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>cos</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><a href="../reference/cos.htm">cosine</a></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>tan</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><a href="../reference/tan.htm">tangent</a></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>sqrt</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr><a href="../reference/sqrt.htm">square root</a></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>exp</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>natural <a href="../reference/exp.htm">exponent</a></nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>expt</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>math <a href="../reference/expt.htm">exponent</a></nobr></td>
+</tr>
+</tbody></table></p>
+
+
+<p><nobr><a href="../reference/addition.htm">&nbsp;+&nbsp;</a> [addition]</nobr>,
+<nobr><a href="../reference/subtraction.htm">&nbsp;-&nbsp;</a> [subtraction]</nobr>,
+<nobr><a href="../reference/multiplication.htm">&nbsp;*&nbsp;</a> [multiplication]</nobr>,
+and <nobr><a href="../reference/division.htm">&nbsp;/&nbsp;</a> [division]</nobr>
+accept any number of arguments and return a number according to type
+contagion. This means that as long as only integer numbers are given as
+arguments the result will always be an integer number, but as soon as at
+least one of the arguments is a floating number then the result will be a
+floating point number. Here are some examples:</p>
+
+<pre class="example">
+&gt; (/ 3 2) <font color="#008844">; integer division causes rounding error</font>
+1
+
+&gt; (/ 3 2.0) <font color="#008844">; the 2.0 forces floating point computation</font>
+1.5
+
+&gt; (exp 1) <font color="#008844">; e</font>
+2.71828
+
+&gt; (exp 3) <font color="#008844">; e * e * e</font>
+20.0855
+
+&gt; (expt 3 4.2) <font color="#008844">; exponent with a base other than e</font>
+100.904
+
+&gt; (+ 5 6 7 (* 8 9 10)) <font color="#008844">; the functions + - * / accept multiple arguments</font>
+738
+</pre>
+
+<p>In Nyquist the valid range of integer numbers is limited by the size of a
+C 'long' value on the machine on which Nyquist is running.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="3"></a>
+
+<hr>
+
+<h2>3&nbsp; Conses</h2>
+
+<hr>
+
+<p>A <a href="../reference/cons.htm">cons</a> is just a
+<nobr>two-field</nobr> record. <nobr>The fields</nobr> are called
+<a href="../reference/car.htm">car</a> and
+<a href="../reference/cdr.htm">cdr</a>, for historical reasons.
+<nobr>On the</nobr> first machine where Lisp was implemented, there
+were two assembly language instructions CAR and CDR which stood for
+'contents of address register' and 'contents of decrement register'.
+Conses were implemented using these two registers.</p>
+
+<p>Conses are created by the <a href="../reference/cons.htm">cons</a>
+function:</p>
+
+<pre class="example">
+&gt; (cons 4 5) <font color="#008844">; Allocate a cons. Set the car to 4 and the cdr to 5</font>
+(4 . 5)
+
+&gt; (cons (cons 4 5) 6)
+((4 . 5) . 6)
+
+&gt; (car (cons 4 5))
+4
+
+&gt; (cdr (cons 4 5))
+5
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="4"></a>
+
+<hr>
+
+<h2>4&nbsp; Lists</h2>
+
+<hr>
+
+<p>You can build many structures out of conses. Perhaps the simplest is a
+linked list. <nobr>The <a href="../reference/car.htm">car</a></nobr>
+<nobr>[the <a href="../reference/first.htm">first</a></nobr> element] of
+each cons points to one of the elements of the list, and the
+<a href="../reference/cdr.htm">cdr</a> <nobr>[the
+<a href="../reference/rest.htm">rest</a></nobr> of the elements] points
+either to another cons or to <a href="../reference/nil.htm">NIL</a>.
+<nobr>You can</nobr> create such a linked list with the
+<a href="../reference/list.htm">list</a> function:</p>
+
+<pre class="example">
+&gt; (list 4 5 6)
+(4 5 6)
+</pre>
+
+<p>Notice that Lisp prints linked lists a special way. <nobr>It omits</nobr>
+some of the periods and parentheses. The rule is that if the
+<a href="../reference/cdr.htm">cdr</a> of a
+<a href="../reference/cons.htm">cons</a> is
+<a href="../reference/nil.htm">NIL</a>, Lisp doesn't bother to print the
+period or the <a href="../reference/nil.htm">NIL</a>, and if the
+<a href="../reference/cdr.htm">cdr</a> of
+<nobr><a href="../reference/cons.htm">cons</a> A</nobr> is
+<nobr><a href="../reference/cons.htm">cons</a> B</nobr>, then Lisp doesn't
+bother to print the period for
+<nobr><a href="../reference/cons.htm">cons</a> A</nobr> or the parentheses
+for <nobr><a href="../reference/cons.htm">cons</a> B. So:</nobr></p>
+
+<pre class="example">
+&gt; (cons 4 nil)
+(4) <font color="#008844">; (4 . nil)</font>
+
+&gt; (cons 4 (cons 5 6))
+(4 5 . 6) <font color="#008844">; (4 . (5 . 6))</font>
+
+&gt; (cons 4 (cons 5 (cons 6 nil)))
+(4 5 6) <font color="#008844">; (4 . (5 . (6 . nil)))</font>
+</pre>
+
+<p>The last example is exactly equivalent to the call:</p>
+
+<pre class="example">
+(list 4 5 6)
+</pre>
+
+<p>Note that <a href="../reference/nil.htm">NIL</a> now means the list with
+no elements. <nobr>The <a href="../reference/cdr.htm">cdr</a></nobr> of
+<nobr>(a b)</nobr>, a list with <nobr>2 elements</nobr>, <nobr>is
+(b)</nobr>, a list with 1 element, and the
+<a href="../reference/cdr.htm">cdr</a> of (b), a list with <nobr>1
+element</nobr>, <nobr>is <a href="../reference/nil.htm">NIL</a></nobr>,
+which therefore must be a list with no elements.</p>
+
+<p><div class="box">
+
+<p>The <a href="../reference/car.htm">car</a> and
+<a href="../reference/cdr.htm">cdr</a> of
+<a href="../reference/nil.htm">NIL</a> are defined to
+<nobr>be <a href="../reference/nil.htm">NIL</a></nobr>.</p>
+
+</div></p>
+
+<p>If you store your list in a variable, you can make it act like a
+stack:</p>
+
+<pre class="example">
+&gt; (setq a nil)
+NIL <font color="#008844">; A = ()</font>
+
+&gt; (push 4 a)
+(4) <font color="#008844">; A = (4)</font>
+
+&gt; (push 5 a)
+(5 4) <font color="#008844">; A = (5 4)</font>
+
+&gt; (pop a)
+5 <font color="#008844">; A = (4)</font>
+
+&gt; (pop a)
+4 <font color="#008844">; A = ()</font>
+
+&gt; (pop a)
+NIL <font color="#008844">; A = ()</font>
+</pre>
+
+<p>See <a href="../reference/pop.htm">pop</a>,
+<a href="../reference/push.htm">push</a>,
+<a href="../reference/setq.htm">setq</a>.</p>
+
+<a name="list-accessors"></a>
+
+<p><b>List Accessors</b></p>
+
+<p>There are several different approaches to name the accessor
+functions for elements of conses and lists. <nobr>The 'traditional'</nobr>
+Lisp still uses function names like
+<a href="../reference/car.htm">car</a> and
+<a href="../reference/cdr.htm">cdr</a> while the 'modern' Lisp uses more
+descriptive names like <a href="../reference/first.htm">first</a> and <a
+href="../reference/rest.htm">rest</a>. This leads to the situation that in
+most Lisps today the list accessor functions are available under different
+names for the same functions:</p>
+
+<p><div class="box">
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td align="right"><nobr>modern</nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td align="left"><nobr>traditional</nobr></td>
+ <td></td>
+ <td>equivalent to</td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>(1 2 3 4 5 6 7 8)</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td align="right"><nobr><a href="../reference/first.htm">first</a></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td align="left"><nobr><a href="../reference/car.htm">car</a></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>(<a href="../reference/nth.htm">nth</a> 0 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>1</td>
+</tr>
+<tr>
+ <td align="right"><nobr><a href="../reference/second.htm">second</a></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td align="left"><nobr><a href="../reference/caar.htm">cadr</a></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>(<a href="../reference/nth.htm">nth</a> 1 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>2</td>
+</tr>
+<tr>
+ <td align="right"><nobr><a href="../reference/third.htm">third</a></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td align="left"><nobr><a href="../reference/caaar.htm">caddr</a></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>(<a href="../reference/nth.htm">nth</a> 2 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>3</td>
+</tr>
+<tr>
+ <td align="right"><nobr><a href="../reference/fourth.htm">fourth</a></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td align="left"><nobr><a href="../reference/caaaar.htm">cadddr</a></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>(<a href="../reference/nth.htm">nth</a> 3 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>4</td>
+</tr>
+<tr>
+ <td colspan="3"></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>(<a href="../reference/nth.htm">nth</a> 4 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>5</td>
+</tr>
+<tr>
+ <td colspan="3"></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>&nbsp;&nbsp;...</td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td colspan="4"></td>
+ <td>(<a href="../reference/nthcdr.htm">nthcdr</a> 0 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>(1 2 3 4 5 6 7 8)</td>
+</tr>
+<tr>
+ <td align="right"><nobr><a href="../reference/rest.htm">rest</a></nobr></td>
+ <td><nobr>&nbsp;&mdash;&nbsp;</nobr></td>
+ <td align="left"><nobr><a href="../reference/cdr.htm">cdr</a></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>(<a href="../reference/nthcdr.htm">nthcdr</a> 1 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>(2 3 4 5 6 7 8)</td>
+</tr>
+<tr>
+ <td colspan="2"></td>
+ <td align="left"><nobr><a href="../reference/caar.htm">cddr</a></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>(<a href="../reference/nthcdr.htm">nthcdr</a> 2 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>(3 4 5 6 7 8)</td>
+</tr>
+<tr>
+ <td colspan="2"></td>
+ <td align="left"><nobr><a href="../reference/cdddr.htm">cdddr</a></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>(<a href="../reference/nthcdr.htm">nthcdr</a> 3 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>(4 5 6 7 8)</td>
+</tr>
+<tr>
+ <td colspan="2"></td>
+ <td align="left"><nobr><a href="../reference/cddddr.htm">cddddr</a></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>(<a href="../reference/nthcdr.htm">nthcdr</a> 4 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>(5 6 7 8)</td>
+</tr>
+<tr>
+ <td colspan="4"></td>
+ <td>(<a href="../reference/nthcdr.htm">nthcdr</a> 5 ... )</td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>(6 7 8)</td>
+</tr>
+<tr>
+ <td colspan="3"></nobr></td>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td>&nbsp;&nbsp;...</td>
+</tr>
+<tr>
+ <td align="right"><nobr><a href="../reference/last.htm">last</a></nobr></td>
+ <td colspan="4"></td>
+ <td><nobr><code>&nbsp;&nbsp;</code>&rarr;&nbsp;&nbsp;</nobr></td>
+ <td>(8)</td>
+</tr>
+</tbody></table></p>
+
+</div></p>
+
+<p>The traditional <nobr>c..r-functions</nobr> are available in even more
+variations, see <a href="../reference/car.htm">car</a>,
+<a href="../reference/cdr.htm">cdr</a>,
+<nobr><a href="../reference/cddr.htm">cadr, cddr</a></nobr>,
+<nobr><a href="../reference/caaar.htm">caaar...caddr</a></nobr>,
+<nobr><a href="../reference/cdddr.htm">cdaar...cdddr</a></nobr>,
+<nobr><a href="../reference/caaaar.htm">caaaar...cadddr</a></nobr>,
+<nobr>and <a href="../reference/cddddr.htm">cdaaar...cddddr</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="5"></a>
+
+<hr>
+
+<h2>5&nbsp; Functions</h2>
+
+<hr>
+
+<p>You saw one example of a function above. Here are some more:</p>
+
+<pre class="example">
+&gt; (+ 3 4 5 6) <font color="#008844">; this function takes any number of arguments</font>
+18
+
+&gt; (+ (+ 3 4) (+ (+ 4 5) 6)) <font color="#008844">; isn't prefix notation fun?</font>
+22
+
+&gt; (defun foo (x y) <font color="#008844">; defining a function</font>
+ (+ x y 5))
+FOO
+
+&gt; (foo 5 0) <font color="#008844">; calling a function</font>
+10
+
+&gt; (defun fact (x) <font color="#008844">; a recursive function</font>
+ (if (&gt; x 0)
+ (* x (fact (- x 1)))
+ 1))
+FACT
+
+&gt; (fact 5)
+120
+
+&gt; (defun a (x)
+ (if (= x 0)
+ t
+ (b (- x)))) <font color="#008844">; mutually recursive functions</font>
+A
+
+&gt; (defun b (x)
+ (if (&gt; x 0)
+ (a (- x 1))
+ (a (+ x 1))))
+B
+
+&gt; (a 5)
+T
+
+&gt; (defun bar (x) <font color="#008844">; A function with multiple statements</font>
+ (setq x (* x 3)) <font color="#008844">; in its body. It will return the value</font>
+ (setq x (/ x 2)) <font color="#008844">; returned by its final statement</font>
+ (+ x 4))
+BAR
+
+&gt; (bar 6)
+13
+</pre>
+
+<p>See <a href="../reference/addition.htm">&nbsp;+&nbsp;</a>,
+<a href="../reference/subtraction.htm">&nbsp;&minus;&nbsp;</a>,
+<a href="../reference/multiplication.htm">&nbsp;*&nbsp;</a>,
+<a href="../reference/division.htm">&nbsp;/&nbsp;</a>,
+<a href="../reference/number-equal.htm">&nbsp;=&nbsp;</a>,
+<a href="../reference/number-greaterp.htm">&nbsp;&gt;&nbsp;</a>,
+<a href="../reference/defun.htm">defun</a>,
+<a href="../reference/if.htm">&nbsp;if&nbsp;</a>,
+<a href="../reference/setq.htm">setq</a>. When we defined 'foo', we
+gave it two arguments, 'x' <nobr>and 'y'</nobr>. Now when we call 'foo', we
+are required to provide exactly two arguments. The first will become the
+value of 'x' for the duration of the call to 'foo', and the second will
+become the value of 'y' for the duration of the call. <nobr>In Lisp</nobr>,
+most variables are lexically scoped. <nobr>That is</nobr>, if 'foo' calls
+'bar' and 'bar' tries to reference 'x', then 'bar' will not get 'foo's value
+<nobr>for x</nobr>.</p>
+
+<p><div class="box">
+
+<p>The process of assigning a symbol a value for the duration of some
+lexical scope is called 'binding'.</p>
+
+</div></p>
+
+<p>You can specify optional arguments for your functions. Any argument
+after the symbol
+<a href="../reference/lambda-keyword-optional.htm">&amp;optional</a> is
+optional:</p>
+
+<pre class="example">
+&gt; (defun bar (x &amp;optional y)
+ (if y
+ x
+ 0))
+BAR
+
+&gt; (defun baaz (&amp;optional (x 3) (z 10))
+ (+ x z))
+BAAZ
+
+&gt; (bar 5)
+0
+
+&gt; (bar 5 t)
+5
+
+&gt; (baaz 5)
+15
+
+&gt; (baaz 5 6)
+11
+
+&gt; (baaz)
+13
+</pre>
+
+<p>See <a href="../reference/addition.htm">&nbsp;+&nbsp;</a>,
+<a href="../reference/defun.htm">defun</a>,
+<a href="../reference/if.htm">&nbsp;if&nbsp;</a>.
+<nobr>It is</nobr> legal to call the function 'bar' with either one or two
+arguments. <nobr>If it</nobr> is called with one argument, 'x' will be bound
+to the value of that argument and 'y' will be bound <nobr>to
+<a href="../reference/nil.htm">NIL</a></nobr>. <nobr>If it</nobr> is called
+with two arguments, 'x' and 'y' will be bound to the values of the first and
+second argument, respectively.</p>
+
+<p>The function 'baaz' has two optional arguments. <nobr>It specifies</nobr> a
+default value for each of them. <nobr>If the</nobr> caller specifies only
+one argument, 'z' will be bound <nobr>to 10</nobr> instead of <nobr>to
+<a href="../reference/nil.htm">NIL</a></nobr>, and if the caller
+specifies no arguments, 'x' will be bound <nobr>to 3</nobr> and <nobr>'z' to
+10</nobr>.</p>
+
+<p>You can make your function accept any number of arguments by ending its
+argument list with an
+<a href="../reference/lambda-keyword-rest.htm">&amp;rest</a> parameter.
+Lisp will collect all arguments not otherwise accounted for into a list and
+bind the <a href="../reference/lambda-keyword-rest.htm">&amp;rest</a>
+parameter to that <nobr>list. So:</nobr></p>
+
+<pre class="example">
+&gt; (defun foo (x &rest y)
+ y)
+FOO
+
+&gt; (foo 3)
+NIL
+
+&gt; (foo 4 5 6)
+(5 6)
+</pre>
+
+<p>See <a href="../reference/defun.htm">defun</a>. Finally, you can give
+your function another kind of optional argument called a
+<a href="../reference/lambda-keyword-key.htm">&amp;key</a> 'keyword'
+argument. <nobr>The caller</nobr> can give these arguments in any order,
+because they're labelled with keywords:</p>
+
+<pre class="example">
+&gt; (defun foo (&key x y)
+ (cons x y))
+FOO
+
+&gt; (foo :x 5 :y 3)
+(5 . 3)
+
+&gt; (foo :y 3 :x 5)
+(5 . 3)
+
+&gt; (foo :y 3)
+(NIL . 3)
+
+&gt; (foo)
+(NIL)
+</pre>
+
+<p>See <a href="../reference/defun.htm">defun</a>.
+<nobr>An <a href="../reference/lambda-keyword-key.htm">&amp;key</a></nobr>
+parameter can have a default <nobr>value too:</nobr></p>
+
+<pre class="example">
+&gt; (defun foo (&key (x 5))
+ x)
+FOO
+
+&gt; (foo :x 7)
+7
+
+&gt; (foo)
+5
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="6"></a>
+
+<hr>
+
+<h2>6&nbsp; Printing</h2>
+
+<hr>
+
+<p>Some functions can cause output. The simplest one is
+<a href="../reference/print.htm">print</a>, which
+prints its argument and then <nobr>returns it:</nobr></p>
+
+<pre class="example">
+&gt; (print 3)
+3 <font color="#008844">; screen output</font>
+3 <font color="#008844">; return value</font>
+</pre>
+
+<p>The first 3 above was <a href="../reference/print.htm">print</a>ed, the
+second was returned.</p>
+
+<p>If you want more complicated output, you will need to use
+<a href="../reference/format.htm">format</a>.
+Here's an example:</p>
+
+<pre class="example">
+&gt; (format t "An atom: ~S~%and a list: ~S~%and an integer: ~A~%"
+ nil (list 5) 6)
+An atom: NIL <font color="#008844">; screen output</font>
+and a list: (5) <font color="#008844">; screen output</font>
+and an integer: 6 <font color="#008844">; screen output</font>
+NIL <font color="#008844">; return value</font>
+</pre>
+
+<p>See <a href="../reference/list.htm">list</a>. <nobr>The first</nobr>
+argument to <a href="../reference/format.htm">format</a> is either
+<a href="../reference/t.htm">&nbsp;T&nbsp;</a>,
+<a href="../reference/nil.htm">NIL</a>, or a stream.
+<nobr><a href="../reference/t.htm">&nbsp;T&nbsp;</a> specifies</nobr> output
+to the terminal. <nobr><a href="../reference/nil.htm">NIL</a> means</nobr>
+not to print anything but to return a string containing the output instead.
+Streams are general places for output <nobr>to go</nobr>. They can specify a
+file, or the terminal, or a printer device. This tutorial will not describe
+streams in any further detail.</p>
+
+<p>The second argument is a formatting template, which is a string
+optionally containing formatting directives. <nobr>All remaining</nobr>
+arguments may be referred to by the formatting directives. Lisp will replace
+the directives with some appropriate characters based on the arguments to
+which they refer and then print the resulting string.</p>
+
+<p>The format function always returns <a href="../reference/nil.htm">NIL</a>
+unless its first argument is <a href="../reference/nil.htm">NIL</a>, in
+which case it prints nothing and returns a string.</p>
+
+<p>There are several different directives available:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>~S</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">[standard] - accepts any Lisp object and replaces it by
+ the same printed representation which is produced by the
+ <a href="../reference/print.htm">print</a> function.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>~A</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">[aestethic] - tries to '<nobr>pretty-print</nobr>'
+ its argument.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>~%</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">[linebreak] - is always replaced by a linebreak character
+ or character sequence of the underlying operation system.</td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>~~</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td valign="top"><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%">[tilde] - is replaced by a single '~' character.</td>
+</tr>
+</tbody></table></p>
+
+<p>If the last character in a line in a
+<a href="../reference/format.htm">format</a> template is a tilde, then
+the linebreak is ignored and the template continues with the next
+<nobr>non-whitespace</nobr> character in the next line.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="7"></a>
+
+<hr>
+
+<h2>7&nbsp; Forms and the Top-Level Loop</h2>
+
+<hr>
+
+<p>The things which you type to the Lisp interpreter are called 'forms'.
+<nobr>The Lisp</nobr> interpreter repeatedly
+<a href="../reference/read.htm">read</a>s a form,
+<a href="../reference/eval.htm">eval</a>uates it, and
+<a href="../reference/print.htm">print</a>s the result. This procedure
+is therefore called the '<nobr>read-eval-print' loop</nobr>, or REPL for
+short.</p>
+
+<p>Some forms will cause errors. After an error, Lisp will put you into the
+debugger so you can try to figure out what caused the error.</p>
+
+<p>In general, a form is either an <a href="../reference/atom.htm">atom</a>,
+<nobr>[for example</nobr> a symbol, an integer, or a string] or <nobr>a
+<a href="../reference/list.htm">list</a></nobr>. <nobr>If the</nobr> form is
+an <a href="../reference/atom.htm">atom</a>, Lisp evaluates it immediately.
+Symbols evaluate to their value, integers and strings evaluate to
+themselves. <nobr>If the</nobr> form is a
+<a href="../reference/list.htm">list</a></nobr>, Lisp treats its first
+element as the name of a function. <nobr>It evaluates</nobr> the remaining
+elements recursively, and then calls the function with the values of the
+remaining elements as arguments. </p>
+
+<p>For example, if Lisp sees the form:</p>
+
+<pre class="example">
+(+ 3 4)
+</pre>
+
+<p>then it treats <a href="../reference/addition.htm">&nbsp;+&nbsp;</a> as
+the name of a function. <nobr>It then</nobr> evaluates 3 to <nobr>get
+3</nobr> and 4 to <nobr>get 4</nobr>, finally it calls <a
+href="../reference/addition.htm">&nbsp;+&nbsp;</a> with 3 and 4 as the
+arguments. <nobr>The <a href="../reference/addition.htm">&nbsp;+&nbsp;</a>
+function</nobr> <nobr>returns 7</nobr>, which Lisp prints.</p>
+
+<p><div class="box">
+
+<p><b>Nyquist:</b> <nobr>A description</nobr> of the debugger can be found
+in the <nobr><a href="../manual/xlisp.htm#break-loop">Break Command Loop</a></nobr>
+section and a detailed description of the evaluation process can be found in
+the <a href="../manual/xlisp.htm#the-evaluator">Evaluator</a> section of the XLISP
+manual.</p>
+
+</div></p>
+
+<p>The <nobr>top-level</nobr> loop provides some other conveniences.
+<nobr>One particularly</nobr> convenient convenience is the ability to talk
+about the results of previously typed forms. Lisp always saves its most
+recent three results, it stores them as the values of the symbols
+<a href="../manual/xlisp.htm#command-loop">&nbsp;*&nbsp;</a>,
+<a href="../manual/xlisp.htm#command-loop">&nbsp;**&nbsp;</a>,
+<nobr>and <a href="../manual/xlisp.htm#command-loop">&nbsp;***&nbsp;</a></nobr>.
+<nobr>For example:</nobr></p>
+
+<pre class="example">
+&gt; 3
+3
+
+&gt; 4
+4
+
+&gt; 5
+5
+
+&gt; ***
+3
+
+&gt; ***
+4
+
+&gt; ***
+5
+
+&gt; **
+4
+
+&gt; *
+4
+</pre>
+
+<p>See <a href="../manual/xlisp.htm#command-loop">&nbsp;*&nbsp;</a>,
+<a href="../manual/xlisp.htm#command-loop">&nbsp;**&nbsp;</a>,
+<a href="../manual/xlisp.htm#command-loop">&nbsp;***&nbsp;</a>,
+<a href="../manual/xlisp.htm#command-loop">&nbsp;+&nbsp;</a>,
+<a href="../manual/xlisp.htm#command-loop">&nbsp;++&nbsp;</a>,
+<a href="../manual/xlisp.htm#command-loop">&nbsp;+++&nbsp;</a>,
+<a href="../manual/xlisp.htm#command-loop">&nbsp;&minus;&nbsp;</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="8"></a>
+
+<hr>
+
+<h2>8&nbsp; Special Forms</h2>
+
+<hr>
+
+<p>There are a number of special forms which look like function calls but
+aren't. These include control constructs such as
+<a href="../reference/if.htm">&nbsp;if&nbsp;</a> statements and
+<a href="../reference/do.htm">do</a> loops, assignments like
+<a href="../reference/setq.htm">setq</a>,
+<a href="../reference/setf.htm">setf</a>,
+<a href="../reference/push.htm">push</a>, and
+<a href="../reference/pop.htm">pop</a>, definitions such as
+<a href="../reference/defun.htm">defun</a>, and binding constructs such
+<nobr>as <a href="../reference/let.htm">let</a></nobr>. <nobr>Not all</nobr>
+of these special forms have been mentioned yet, see below for examples.</p>
+
+<p>One useful special form is the <a href="../reference/quote.htm">quote</a>
+form. <nobr>The <a href="../reference/quote.htm">quote</a></nobr> function
+prevents its argument from being evaluated. <nobr>For example:</nobr></p>
+
+<pre class="example">
+&gt; (setq a 3)
+3
+
+&gt; a
+3
+
+&gt; (quote a)
+A
+
+&gt; 'a <font color="#008844">; 'a is an abbreviation for (quote a)</font>
+A
+</pre>
+
+<p>Another similar special form is the
+<a href="../reference/function.htm">function</a> form, it causes its
+argument to be interpreted as a function rather than being evaluated.
+<nobr>For example:</nobr></p>
+
+<pre class="example">
+&gt; (setq + 3)
+3
+
+&gt; +
+3
+
+&gt; '+
++
+
+&gt; (function +)
+#&lt;Subr-+: #88b44d5e&gt;
+
+&gt; #'+ <font color="#008844">; #'+ is an abbreviation for (function +)</font>
+#&lt;Subr-+: #88b44d5e&gt;
+</pre>
+
+<p>The <a href="../reference/function.htm">function</a> special form is
+useful when you want to pass a function as an argument to another function.
+<nobr>See below</nobr> for some examples of functions which take functions
+as arguments.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="9"></a>
+
+<hr>
+
+<h2>9&nbsp; Binding</h2>
+
+<hr>
+
+<p>Binding is lexically scoped assignment. <nobr>It happens</nobr> to the
+variables in a function's parameter list whenever the function is called.
+<nobr>The formal</nobr> parameters are bound to the actual parameters for
+the duration of the function call. <nobr>You can</nobr> bind variables
+anywhere in a program with the <a href="../reference/let.htm">let</a>
+special form, which looks <nobr>like this:</nobr></p>
+
+<pre class="example">
+(let ((<font color="#0000CC">variable-1 value-1</font>)
+ (<font color="#0000CC">variable-2 value-2</font>)
+ <font color="#008844">...</font> )
+ <font color="#0000CC">body</font>)
+</pre>
+
+<p>The <a href="../reference/let.htm">let</a> function binds
+'<nobr>variable-1</nobr>' to '<nobr>value-1</nobr>',
+'<nobr>variable-2</nobr>' to '<nobr>value-2</nobr>', and so forth.
+<nobr>Then it</nobr> executes the statements in its body. The body of a
+<a href="../reference/let.htm">let</a> follows exactly the same rules that
+a function body does. Some examples:</p>
+
+<pre class="example">
+&gt; (let ((a 3)) (+ a 1))
+4
+
+&gt; (let ((a 2)
+ (b 3)
+ (c 0))
+ (setq c (+ a b))
+ c)
+5
+
+&gt; (setq c 4)
+4
+
+&gt; (let ((c 5))
+ c)
+5
+
+&gt; c
+4
+</pre>
+
+<p>See <a href="../reference/addition.htm">&nbsp;+&nbsp;</a>,
+<a href="../reference/let.htm">let</a>,
+<a href="../reference/setq.htm">setq</a>. <nobr>Instead of:</nobr></p>
+
+<pre class="example">
+(let ((a nil)
+ (b nil))
+ <font color="#008844">...</font> )
+</pre>
+
+<p>you can write:</p>
+
+<pre class="example">
+(let (a b)
+ <font color="#008844">...</font> )
+</pre>
+
+<p>The '<nobr>value-1</nobr>', '<nobr>value-2</nobr>', etc. inside a
+<a href="../reference/let.htm">let</a> form cannot reference the variables
+'<nobr>variable-1</nobr>', '<nobr>variable-2</nobr>', etc. that the
+<a href="../reference/let.htm">let</a> form is binding. <nobr>For
+example:</nobr></p>
+
+<pre class="example">
+&gt; (let ((x 1)
+ (y (+ <font color="#AA0000">x</font> 1))) <font color="#008844">; x is still unbound here</font>
+ y)
+<font color="#AA0000">error: unbound variable - x</font>
+</pre>
+
+<p>If the symbol 'x' already has a global value, stranger happenings will
+result:</p>
+
+<pre class="example">
+&gt; (setq x 7)
+7
+
+&gt; (let ((x 1)
+ (y (+ <font color="#AA0000">x</font> 1))) <font color="#008844">; references to the global x</font>
+ y)
+8
+</pre>
+
+<p>The <a href="../reference/let-star.htm">let*</a> special form is just
+like <a href="../reference/let.htm">let</a> except that it allows values to
+reference variables defined earlier in the
+<a href="../reference/let-star.htm">let*</a> form.
+<nobr>For example:</nobr></p>
+
+<pre class="example">
+&gt; (setq x 7)
+7
+
+&gt; (let* ((x 1)
+ (y (+ x 1))) <font color="#008844">; references to x in the line before</font>
+ y)
+2
+</pre>
+
+<p>The <a href="../reference/let-star.htm">let*</a> form:</p>
+
+<pre class="example">
+(let* ((x a)
+ (y b))
+ <font color="#008844">...</font> )
+</pre>
+
+<p>is equivalent to the following <a href="../reference/let.htm">let</a>
+construct:</p>
+
+<pre class="example">
+(let ((x a))
+ (let ((y b))
+ <font color="#008844">...</font> ))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="10"></a>
+
+<hr>
+
+<h2>10&nbsp; Dynamic Scoping</h2>
+
+<hr>
+
+<p>The <a href="../reference/let.htm">let</a> and
+<a href="../reference/let-star.htm">let*</a> forms provide lexical scoping,
+which is what you expect if you're used to programming in C or Pascal.
+Dynamic scoping is what you get in BASIC. <nobr>If you</nobr> assign a value
+to a dynamically scoped variable, every mention of that variable returns
+that value until you assign another value to the same variable.</p>
+
+<p>In Lisp, dynamically scoped variables are called 'special' variables.
+<nobr>In Common Lisp</nobr> special variables are declared with the 'defvar'
+special form. <nobr>In Nyquist</nobr> there is no 'defvar' form.</p>
+
+<p><div class="box">
+
+<p>Nyquist has no 'dynamic' scoping in the <nobr>Common Lisp</nobr> sense.</p>
+
+</div></p>
+
+<p>In Nyquist every variable assigned with
+<a href="../reference/setq.htm">setq</a> or
+<a href="../reference/setf.htm">setf</a> at the <nobr>top-level</nobr>,
+outside of a function or a <a href="../reference/let.htm">let</a>
+binding, is a lexical scoped variable. Here is an example what this means:</p>
+
+<pre class="example">
+&gt; (setq *variable* 5) <font color="#008844">; define a global variable</font>
+5
+
+&gt; (defun check-variable () <font color="#008844">; define a function in global scope,</font>
+ *variable*) <font color="#008844">; returning the value of the variable</font>
+CHECK-VARIABLE
+
+&gt; (check-variable) <font color="#008844">; the CHECK-VARIABLE function returns</font>
+5 <font color="#008844">; the global value of the variable</font>
+
+&gt; (let ((*variable* 10)) <font color="#008844">; create a local binding for the variable</font>
+ (print (check-variable)) <font color="#008844">; call CHECK-VARIABLE and print the return value</font>
+ (print *variable*)) <font color="#008844">; print the local value of the variable</font>
+5 <font color="#008844">; return value of CHECK-VARIABLE</font>
+10 <font color="#008844">; variable value inside of LET</font>
+10
+</pre>
+
+<p>See <a href="../reference/defun.htm">defun</a>,
+<a href="../reference/let.htm">let</a>,
+<a href="../reference/print.htm">print</a>,
+<a href="../reference/setq.htm">setq</a>. Because the
+'<nobr>check-variable</nobr>' function was defined in global
+scope and therefore is lexically outside of the
+<a href="../reference/let.htm">let</a> form, the
+'<nobr>check-variable</nobr>' function returns the variable's global value
+<nobr>of 5</nobr>, even if called from inside the
+<a href="../reference/let.htm">let</a> form, where the variable has a
+<nobr>value of 10</nobr>.</p>
+
+<p><div class="box">
+
+<p><b>Important:</b> In Nyquist there is no way to change the scoping
+behaviour of variables, so you must be careful where you define your
+variables. With Nyquist it's generally a good idea to prefer local
+<a href="../reference/let.htm">let</a> bindings over global variables.</p>
+
+</div></p>
+
+<p>By convention, the name of a global Nyquist variable begins and ends with
+a <nobr>star *</nobr> to signal that the variable might behave differently
+than the programmer expects.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="11"></a>
+
+<hr>
+
+<h2>11&nbsp; Arrays</h2>
+
+<hr>
+
+<p>The function
+<nobr><a href="../reference/make-array.htm">make-array</a></nobr> makes a
+<nobr>1-dimensional</nobr> array.
+<nobr>The <a href="../reference/aref.htm">aref</a></nobr> function accesses
+its elements. <nobr>All elements</nobr> of an array are initially set
+<nobr>to <a href="../reference/nil.htm">NIL</a></nobr>.
+<nobr>For example:</nobr></p>
+
+<pre class="example">
+&gt; (make-array 4) <font color="#008844">; 1-D array with 4 elements</font>
+#(NIL NIL NIL NIL)
+</pre>
+
+<p>Array indices always <nobr>start at 0</nobr>. <nobr>See
+<a href="#13">below</a></nobr> for how to set the elements of an array.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="12"></a>
+
+<hr>
+
+<h2>12&nbsp; Strings</h2>
+
+<hr>
+
+<p>A string is a sequence of characters between double quotes. Nyquist
+represents a string internally as a <nobr>variable-length</nobr> array of
+characters. <nobr>You can</nobr> write a string containing a double quote by
+preceding the quote with a backslash. <nobr>A double</nobr> backslash stands
+for a single backslash. <nobr>For example:</nobr></p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>"abcd"</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>has 4 characters</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>"\""</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>has 1 character, a quote</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr valign="top">
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td class="button"><nobr><code>"\\"</code></nobr></td>
+ <td><nobr>&nbsp;&nbsp;-&nbsp;</nobr></td>
+ <td width="100%"><nobr>has 1 character, a backslash</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>Here are some functions for dealing with strings:</p>
+
+<pre class="example">
+&gt; (strcat "abcd" "efg")
+"abcdefg" <font color="#008844">; STRCAT concatenates strings</font>
+
+&gt; (char "abc" 1)
+#\b <font color="#008844">; Lisp writes characters preceded by #\</font>
+
+&gt; (subseq "abc" 0 2)
+"ab" <font color="#008844">; SUBSEQ extracts substrings</font>
+</pre>
+
+<p>See <a href="../reference/char.htm">char</a>,
+<a href="../reference/strcat.htm">strcat</a>,
+<a href="../reference/subseq.htm">subseq</a>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="13"></a>
+
+<hr>
+
+<h2>13&nbsp; Setf</h2>
+
+<hr>
+
+<p>Certain forms in Lisp naturally define a memory location. For example, if
+the value of 'x' is a <a href="../reference/list.htm">list</a>, then
+<nobr>(<a href="../reference/nth.htm">nth</a> 4 x)</nobr> defines the fifth
+element of the <a href="../reference/list.htm">list</a>. <nobr>Or, if</nobr>
+the value of 'y' is a <nobr>one-dimensional</nobr>
+<a href="../reference/make-array.htm">array</a>,
+<nobr>(<a href="../reference/aref.htm">aref</a> y 2)</nobr> defines the
+third element of the <a href="../reference/make-array.htm">array</a>.</p>
+
+<p>The <a href="../reference/setf.htm">setf</a> special form uses its first
+argument to define a place in memory, evaluates its second argument, and
+stores the resulting value in the resulting memory location. <nobr>For
+example:</nobr></p>
+
+<pre class="example">
+&gt; (setq a (make-array 3))
+#(NIL NIL NIL)
+
+&gt; (aref a 1)
+NIL
+
+&gt; (setf (aref a 1) 3) <font color="#008844">; store 3 in the second element of a</font>
+3
+
+&gt; a
+#(NIL 3 NIL)
+
+&gt; (aref a 1) <font color="#008844">; read the second element of a</font>
+3
+
+&gt; (setq b (list 1 2 3 4 5))
+(1 2 3 4 5)
+
+&gt; (nth 4 b)
+5
+
+&gt; (setf (nth 4 b) "five") <font color="#008844">; store "five" in the fifth element of b</font>
+"five"
+
+&gt; b
+(1 2 3 4 "five")
+
+&gt; (nth 4 b)
+"five"
+</pre>
+
+<p>The <a href="../reference/setf.htm">setf</a> function is the only way to
+set the elements of a list or an array.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="14"></a>
+
+<hr>
+
+<h2>14&nbsp; Booleans and Conditionals</h2>
+
+<hr>
+
+<p>Lisp uses the <nobr>self-evaluating</nobr> symbol
+<a href="../reference/nil.htm">NIL</a> to mean false. Anything other than
+<nobr>self-evaluating</nobr> means true. Unless we have a reason not to,
+we usually use the <nobr>self-evaluating</nobr> symbol
+<a href="../reference/t.htm">&nbsp;T&nbsp;</a> to stand
+<nobr>for true</nobr>.</p>
+
+<p>Lisp provides a standard set of logical functions, for example
+<a href="../reference/and.htm">and</a>,
+<a href="../reference/or.htm">or</a>, and
+<a href="../reference/not.htm">not</a>.
+<nobr>The <a href="../reference/and.htm">and</a></nobr> and
+<a href="../reference/or.htm">or</a> connectives are
+<nobr>short-circuiting</nobr>, <a href="../reference/and.htm">and</a>
+will not evaluate any arguments to the right of the first one which
+evaluates <nobr>to <a href="../reference/nil.htm">NIL</a></nobr>, while
+<a href="../reference/or.htm">or</a> will not evaluate any arguments to the
+right of the first one which evaluates
+<nobr>to <a href="../reference/t.htm">&nbsp;T&nbsp;</a></nobr>.</p>
+
+<p>Lisp also provides several special forms for conditional execution. The
+simplest of these <nobr>is
+<a href="../reference/if.htm">&nbsp;if&nbsp;</a></nobr>. The first argument
+of <a href="../reference/if.htm">&nbsp;if&nbsp;</a> determines whether the
+second or third argument will be executed:</p>
+
+<pre class="example">
+&gt; (if t 5 6)
+5
+
+&gt; (if nil 5 6)
+6
+
+&gt; (if 4 5 6)
+5
+</pre>
+
+<p>If you need to put more than one statement in the 'then' or 'else' clause
+of an <a href="../reference/if.htm">&nbsp;if&nbsp;</a></nobr> statement,
+you can use the <a href="../reference/progn.htm">progn</a> special form.
+<a href="../reference/progn.htm">progn</a> executes each statement in its
+body, then returns the value of the <nobr>final one</nobr>:</p>
+
+<pre class="example">
+&gt; (setq a 7)
+7
+
+&gt; (setq b 0)
+0
+
+&gt; (setq c 5)
+5
+
+&gt; (if (&gt; a 5)
+ (progn
+ (setq a (+ b 7))
+ (setq b (+ c 8)))
+ (setq b 4))
+13
+</pre>
+
+<p>An <a href="../reference/if.htm">&nbsp;if&nbsp;</a> statement which lacks
+either a 'then' or an 'else' clause can be written using the
+<a href="../reference/when.htm">when</a> or
+<a href="../reference/unless.htm">unless</a> special form:</p>
+
+<pre class="example">
+&gt; (when t 3)
+3
+
+&gt; (when nil 3)
+NIL
+
+&gt; (unless t 3)
+NIL
+
+&gt; (unless nil 3)
+3
+</pre>
+
+<p><a href="../reference/when.htm">when</a> and
+<a href="../reference/unless.htm">unless</a>, unlike
+<a href="../reference/if.htm">&nbsp;if&nbsp;</a>, allow any number of
+statements in their bodies:</p>
+
+<pre class="example">
+(when x
+ a
+ b
+ c)
+</pre>
+
+<p>is equivalent to:</p>
+
+<pre class="example">
+(if x
+ (progn
+ a
+ b
+ c))
+</pre>
+
+<p>For example:</p>
+
+<pre class="example">
+&gt; (when t
+ (setq a 5)
+ (+ a 6))
+11
+</pre>
+
+<p>More complicated conditionals can be defined using the
+<a href="../reference/cond.htm">cond</a> special form.
+<nobr>A <a href="../reference/cond.htm">cond</a></nobr> form consists of
+the symbol cond followed by a number of
+<a href="../reference/cond.htm">cond</a> clauses, each of which is a list.
+<nobr>The first</nobr> element of a <a href="../reference/cond.htm">cond</a>
+clause is the condition, the remaining elements <nobr>[if any]</nobr> are
+the actions:</p>
+
+<pre class="example">
+(cond (<font color="#0000CC">condition-1 action-1</font>)
+ (<font color="#0000CC">condition-2 action-2</font>)
+ ...
+ (t <font color="#0000CC">default-action</font>))
+</pre>
+
+<p>The <a href="../reference/cond.htm">cond</a> form finds the first clause
+whose condition evaluates to true [does not evaluate <nobr>to
+<a href="../reference/nil.htm">NIL</a>]</nobr>. <nobr>It then</nobr>
+executes the corresponding action and returns the resulting value. None of
+the remaining conditions are evaluated, nor are any actions except the one
+corresponding to the selected condition. <nobr>For example</nobr>:</p>
+
+<pre class="example">
+&gt; (setq a 3)
+3
+
+&gt; (cond
+ ((evenp a) a) <font color="#008844">; if a is even return a</font>
+ ((&gt; a 7) (/ a 2)) <font color="#008844">; else if a is bigger than 7 return a/2</font>
+ ((&lt; a 5) (- a 1)) <font color="#008844">; else if a is smaller than 5 return a-1</font>
+ (t 17)) <font color="#008844">; else return 17</font>
+2
+</pre>
+
+<p>If the action in the selected <a href="../reference/cond.htm">cond</a>
+clause is missing, then <a href="../reference/cond.htm">cond</a> returns
+what the condition <nobr>evaluated to:</nobr></p>
+
+<pre class="example">
+&gt; (cond ((+ 3 4)))
+7
+</pre>
+
+<p>The Lisp <a href="../reference/case.htm">case</a> form is like a C
+'switch' statement:</p>
+
+<pre class="example">
+&gt; (setq x 'b)
+B
+
+&gt; (case x
+ (a 5)
+ ((d e) 7)
+ ((b f) 3)
+ (t 9))
+3
+</pre>
+
+<p>The <a href="../reference/t.htm">&nbsp;T&nbsp;</a> clause at the end
+means that if 'x' is not 'a', '<nobr>d or e</nobr>', or
+'<nobr>b or f</nobr>', then the <a href="../reference/case.htm">case</a>
+form will <nobr>return 9</nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="15"></a>
+
+<hr>
+
+<h2>15&nbsp; Iteration</h2>
+
+<hr>
+
+<p>The simplest iteration construct in Lisp is
+<a href="../reference/loop.htm">loop</a>.
+<nobr>A <a href="../reference/loop.htm">loop</a></nobr> construct repeatedly
+executes its body until it hits a
+<a href="../reference/return.htm">return</a> special form.
+<nobr>For example</nobr>:</p>
+
+<pre class="example">
+&gt; (setq a 4)
+4
+
+&gt; (loop
+ (setq a (+ a 1))
+ (when (&gt; a 7) (return a)))
+8
+
+&gt; (loop
+ (setq a (- a 1))
+ (when (&lt; a 3) (return)))
+NIL
+</pre>
+
+<p>The next simplest is <a href="../reference/dolist.htm">dolist</a>.
+<nobr>It binds</nobr> a variable to the elements of a list in order and
+stops when it hits the end of <nobr>the list</nobr>:</p>
+
+<pre class="example">
+&gt; (dolist (x '(a b c))
+ (print x))
+A
+B
+C
+NIL
+</pre>
+
+<p><a href="../reference/dolist.htm">dolist</a> always
+<nobr>returns <a href="../reference/nil.htm">NIL</a></nobr>. Note that the
+value of 'x' in the above example was
+<nobr>never <a href="../reference/nil.htm">NIL</a></nobr>.
+<nobr>The <a href="../reference/nil.htm">NIL</a></nobr> below the C was the
+value that <a href="../reference/dolist.htm">dolist</a> returned, printed
+by the <nobr>read-eval-print</nobr> loop.</p>
+
+<p>The most flexible, but also most complicated iteration form is
+<nobr>called <a href="../reference/do.htm">do</a></nobr>.
+<nobr>A <a href="../reference/do.htm">do</a></nobr> form looks
+<nobr>like this</nobr>:</p>
+
+<pre class="example">
+&gt; (do ((x 1 (+ x 1)) <font color="#008844">; variable x, initial value 1, update with (+ x 1)</font>
+ (y 1 (* y 2))) <font color="#008844">; variable y, initial value 1, update with (* y 2)</font>
+ ((&gt; x 5) y) <font color="#008844">; terminate if (&gt; x 5), return the value of y</font>
+ (print y)
+ (print 'working))
+1
+WORKING
+2
+WORKING
+4
+WORKING
+8
+WORKING
+16
+WORKING
+32
+</pre>
+
+<p>The first part of a <a href="../reference/do.htm">do</a> form specifies
+what variables to bind, what their initial values are, and how to update
+them. <nobr>The second</nobr> part specifies a termination condition and a
+return value. The last part is the body. <nobr>A
+<a href="../reference/do.htm">do</a></nobr> form binds its variables to
+their initial values like
+<nobr>a <a href="../reference/let.htm">let</a></nobr>, then checks the
+termination condition. <nobr>As long</nobr> as the condition is false, it
+executes the body repeatedly. When the condition becomes true, it
+returns the value of the <nobr>return-value</nobr> form.</p>
+
+<p>The <a href="../reference/do-star.htm">do*</a> form is to
+<a href="../reference/do.htm">do</a> as
+<a href="../reference/let-star.htm">let*</a> is
+<nobr>to <a href="../reference/let.htm">let</a></nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="16"></a>
+
+<hr>
+
+<h2>16&nbsp; Non-local Exits</h2>
+
+<hr>
+
+<p>The <a href="../reference/return.htm">return</a> special form is an
+example of a nonlocal return. Another example is
+<nobr><a href="../reference/return-from.htm">return-from</a></nobr>, which
+returns a value from the surrounding function:</p>
+
+<pre class="example">
+&gt; (defun foo (x)
+ (return-from foo 3)
+ x)
+FOO
+
+&gt; (foo 17)
+3
+</pre>
+
+<p>Actually, the <nobr><a
+href="../reference/return-from.htm">return-from</a></nobr> form can return
+from any named block, it's just that functions are the only blocks which are
+named by default. <nobr>You can</nobr> create a named block with the
+<a href="../reference/block.htm">block</a> special form:</p>
+
+<pre class="example">
+&gt; (block foo
+ (return-from foo 7)
+ 3)
+7
+</pre>
+
+<p>The <a href="../reference/return.htm">return</a> special form can return
+from any block <nobr>named <a href="../reference/nil.htm">NIL</a></nobr>.
+Loops are by default
+<nobr>named <a href="../reference/nil.htm">NIL</a></nobr>, but you can
+make your own
+<nobr><a href="../reference/nil.htm">NIL</a>-named blocks</nobr>:</p>
+
+<pre class="example">
+&gt; (block nil
+ (return 7)
+ 3)
+7
+</pre>
+
+<p>Another form which causes a nonlocal exit is the
+<nobr><a href="../reference/error.htm">error</a> form</nobr>:</p>
+
+<pre class="example">
+&gt; (error "This is an error")
+<font color="#AA0000">error: This is an error</font>
+</pre>
+
+<p>The <a href="../reference/error.htm">error</a> form applies format to its
+arguments, then places you in the debugger.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="17"></a>
+
+<hr>
+
+<h2>17&nbsp; Funcall, Apply, and Mapcar</h2>
+
+<hr>
+
+<p>Earlier I promised to give some functions which take functions as
+arguments. Here they are:</p>
+
+<pre class="example">
+&gt; (funcall #'+ 3 4)
+7
+
+&gt; (apply #'+ 3 4 '(3 4))
+14
+
+&gt; (mapcar #'not '(t nil t nil t nil))
+(NIL T NIL T NIL T)
+</pre>
+
+<p><a href="../reference/funcall.htm">funcall</a> calls its first argument
+on its remaining arguments.</p>
+
+<p><a href="../reference/apply.htm">apply</a> is just like
+<a href="../reference/funcall.htm">funcall</a>, except that its final
+argument should be a list. <nobr>The elements</nobr> of that list are
+treated as if they were additional arguments to
+<nobr>a <a href="../reference/funcall.htm">funcall</a></nobr>.</p>
+
+<p>The first argument to <a href="../reference/mapcar.htm">mapcar</a> must
+be a function of one argument, <a href="../reference/mapcar.htm">mapcar</a>
+applies this function to each element of a list and collects the results in
+another list.</p>
+
+<p><a href="../reference/funcall.htm">funcall</a> and
+<a href="../reference/apply.htm">apply</a> are chiefly useful when their
+first argument is a variable. <nobr>For instance</nobr>, a search engine
+could take a heuristic function as a parameter and use
+<a href="../reference/funcall.htm">funcall</a> or
+<a href="../reference/apply.htm">apply</a> to call that function on a
+state description. <nobr>The sorting</nobr> functions described later use
+<a href="../reference/funcall.htm">funcall</a> to call their comparison
+functions.</p>
+
+<p><a href="../reference/mapcar.htm">mapcar</a>, along with nameless
+<a href="#18">lambda</a> functions, can replace many loops.</p>
+
+<p><div class="box">
+
+<p><b>Nyquist/XLISP:</b> <nobr>In XLISP</nobr>, a '<nobr>special
+form</nobr>' of type FSUBR is not a function. This means that
+<a href="../reference/apply.htm">apply</a>,
+<a href="../reference/funcall.htm">funcall</a> and
+<a href="../reference/mapcar.htm">mapcar</a> only work with functions
+of type SUBR [built-in function] or CLOSURE [function defined by
+<a href="../reference/defun.htm">defun</a>,
+<a href="../reference/flet.htm">flet</a>,
+<a href="../reference/labels.htm">labels</a>, or
+<a href="../reference/lambda.htm">lambda</a>], but with special forms
+of <nobr>type FSUBR</nobr> a 'bad argument type' error is signalled.</p>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="18"></a>
+
+<hr>
+
+<h2>18&nbsp; Lambda</h2>
+
+<hr>
+
+<p>If you just want to create a temporary function and don't want to
+bother giving it a name, <a href="../reference/lambda.htm">lambda</a> is
+what you need.</p>
+
+<pre class="example">
+&gt; #'(lambda (x)
+ (+ x 3))
+#&lt;Closure: #88b71ece&gt;
+
+&gt; (funcall * 5)
+8
+</pre>
+
+<p>The combination of <a href="../reference/lambda.htm">lambda</a> and
+<a href="../reference/mapcar.htm">mapcar</a> can replace many loops.
+<nobr>For example</nobr>, the following two forms are equivalent:</p>
+
+<pre class="example">
+&gt; (do ((x '(1 2 3 4 5) (cdr x))
+ (y nil))
+ ((null x) (reverse y))
+ (push (+ (car x) 2) y))
+(3 4 5 6 7)
+
+&gt; (mapcar #'(lambda (x) (+ x 2)) '(1 2 3 4 5))
+(3 4 5 6 7)
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="19"></a>
+
+<hr>
+
+<h2>19&nbsp; Sorting</h2>
+
+<hr>
+
+<p>Lisp provides a primitive for
+<nobr>sorting, <a href="../reference/sort.htm">sort</a></nobr>:</p>
+
+<pre class="example">
+&gt; (sort '(2 1 5 4 6) #'&lt;)
+(1 2 4 5 6)
+
+&gt; (sort '(2 1 5 4 6) #'&gt;)
+(6 5 4 2 1)
+</pre>
+
+<p>The first argument to <a href="../reference/sort.htm">sort</a> is a list,
+the second is a comparison function. <nobr>Be careful</nobr>, because
+<a href="../reference/sort.htm">sort</a> is allowed to destroy its argument,
+so if the original sequence is important to you, make a copy before sorting
+<nobr>the list</nobr>.</p>
+
+<p><div class="box">
+
+<p><b>Bug:</b> In Nyquist 3.03 [November 2010] the XLISP
+<a href="../reference/sort.htm">sort</a> function has a bug, so it's better
+to store the return value of sort in the original variable <nobr>like
+this</nobr>:</p>
+
+<pre class="example">
+(setq a '(3 1 4 1 5 9 6 7)) =&gt; (3 1 4 1 5 9 6 7)
+(setq a (sort a '&lt;)) =&gt; (1 1 3 4 5 6 7 9)
+a =&gt; (1 1 3 4 5 6 7 9)
+</pre>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="20"></a>
+
+<hr>
+
+<h2>20&nbsp; Equality</h2>
+
+<hr>
+
+<p>Lisp has many different ideas of equality. Numerical equality is
+denoted by =. Two symbols are eq if and only if they are identical. Two
+copies of the same list are not eq, but they are equal.</p>
+
+<pre class="example">
+&gt; (eq 'a 'a)
+T
+
+&gt; (eq 'a 'b)
+NIL
+
+&gt; (= 3 4)
+T
+
+&gt; (eq '(a b c) '(a b c))
+NIL
+
+&gt; (equal '(a b c) '(a b c))
+T
+
+&gt; (eql 'a 'a)
+T
+
+&gt; (eql 3 3)
+T
+</pre>
+
+<p>The eql predicate is equivalent to eq for symbols and to = for numbers.</p>
+
+<p>The equal predicate is equivalent to eql for symbols and numbers. It is
+true for two conses if and only if their cars are equal and their cdrs are
+equal.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="21"></a>
+
+<hr>
+
+<h2>21&nbsp; Some Useful List Functions</h2>
+
+<hr>
+
+<p>These functions all manipulate lists:</p>
+
+<pre class="example">
+&gt; (append '(1 2 3) '(4 5 6)) ;concatenate lists
+(1 2 3 4 5 6)
+
+&gt; (reverse '(1 2 3)) ;reverse the elements of a list
+(3 2 1)
+
+&gt; (member 'a '(b d a c)) ;set membership -- returns the first tail
+(A C) ;whose car is the desired element
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/tutorials/nyquist.htm b/docsrc/xlisp/xlisp-doc/tutorials/nyquist.htm
new file mode 100644
index 0000000..19364ea
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/tutorials/nyquist.htm
@@ -0,0 +1,383 @@
+<html><head>
+
+<title>Nyquist</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Nyquist</h1>
+
+<hr>
+
+<ul>
+<li><nobr><a href="#debugger-shortcuts">Debugger Shortcuts</a></nobr></li>
+<li><nobr><a href="#grindef">grindef</a> - print the function definition of a closure</nobr></li>
+<li><nobr><a href="#args">args</a> - print the argument list of a closure</nobr></li>
+<li><nobr><a href="#setfn">setfn</a> - define 'alias' names for functions</nobr></li>
+<li><nobr><a href="#display">display</a> - framework for debug messages</nobr></li>
+</ul>
+
+<p>This page will not save you from reading the Nyquist manual, it's a list
+of things I find useful but frequently have to look them up in the manuals
+when I haven't worked with Nyquist for a while. Many more useful tricks can
+be found in the 'Developing and Debugging in Nyquist' chapter in the Nyquist
+manual.</p>
+
+<a name="debugger-shortcuts"></a>
+
+<hr>
+
+<h2>Debugger Shortcuts</h2>
+
+<hr>
+
+<p>Some Nyquist/XLISP debugger shortcuts, defined in 'xlinit.lsp' and
+'misc.lsp':</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(bt)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td><nobr>&nbsp;&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><a href="../reference/baktrace.htm">baktrace</a></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(co)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td><nobr>&nbsp;&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><a href="../reference/continue.htm">continue</a></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(top)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td><nobr>&nbsp;&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><a href="../reference/top-level.htm">top-level</a></td>
+</tr>
+<tr>
+ <td><nobr><font size="-2">&nbsp;</font></nobr></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(res)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td><nobr>&nbsp;&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><a href="../reference/clean-up.htm">clean-up</a></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(up)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td><nobr>&nbsp;&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><a href="../reference/clean-up.htm">clean-up</a></td>
+</tr>
+</tbody></table></p>
+
+<p>The debugger commands only work if
+<a href="../reference/global-breakenable.htm">*breakenable*</a>
+is <nobr>non-<a href="../reference/nil.htm">NIL</a></nobr>:</p>
+
+<p><table cellpadding="0" cellspacing="0"><tbody>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(bkon)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td><nobr>&nbsp;&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><nobr>(setq
+ <a href="../reference/global-breakenable.htm">*breakenable*</a>
+ t)</nobr></td>
+</tr>
+<tr>
+ <td height="2px"></td>
+</tr>
+<tr>
+ <td><nobr><code>&nbsp;&nbsp;</code></nobr></td>
+ <td valign="top">
+ <table cellpadding="0" cellspacing="0" width="100%"><tbody>
+ <tr valign="top">
+ <td class="button"><nobr><code>(bkoff)</code></nobr></td>
+ </tr>
+ </tbody></table>
+ </td>
+ <td><nobr>&nbsp;&nbsp;&rarr;&nbsp;</nobr></td>
+ <td width="100%"><nobr>(setq
+ <a href="../reference/global-breakenable.htm">*breakenable*</a>
+ nil)</nobr></td>
+</tr>
+</tbody></table></p>
+
+<p>You can make your own
+<a href="../reference/global-tracenable.htm">*tracenable*</a>
+shortcuts like shown here:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">tron</font> ()
+ (setq <font color="#AA5500">*tracenable*</font> t))
+
+(defun <font color="#0000CC">troff</font> ()
+ (setq <font color="#AA5500">*tracenable*</font> nil))
+</pre>
+
+<p>See also:</p>
+
+<ul>
+<li><nobr>XLISP 2.0 Manual &rarr; <a href="../manual/xlisp.htm#break-loop">Break Loop</a></nobr></li>
+</ul>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="grindef"></a>
+
+<hr>
+
+<h2>grindef</h2>
+
+<hr>
+
+<p>The 'grindef' function prints the Lisp code of a
+<a href="../manual/xlisp.htm#data-types">closure</a> <nobr>[user-defined</nobr>
+function or macro]:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">grindef</font> (e)
+ (pprint (get-lambda-expression (symbol-function e))))
+</pre>
+
+<p>Example:</p>
+
+<pre class="example">
+&gt; (grindef 'grindef)
+(LAMBDA (E)
+ (PPRINT (GET-LAMBDA-EXPRESSION (SYMBOL-FUNCTION E))))
+NIL
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="args"></a>
+
+<hr>
+
+<h2>args</h2>
+
+<hr>
+
+<p>The 'args' function prints the name and the argument variables of a
+<a href="../manual/xlisp.htm#data-types">closure</a> <nobr>[user-defined</nobr>
+function or macro]:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">args</font> (e)
+ (pprint (cons e (second (get-lambda-expression (symbol-function e))))))
+</pre>
+
+<p>Example:</p>
+
+<pre class="example">
+&gt; (args 'args)
+(ARGS E)
+NIL
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="setfn"></a>
+
+<hr>
+
+<h2>setfn</h2>
+
+<hr>
+
+<p>The 'setfn' macro defines 'alias' names for functions:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">setfn</font> (a b)
+ `(setf (symbol-function ',a) (symbol-function ',b)))
+</pre>
+
+<p>Examples from 'xlinit.lsp':</p>
+
+<pre class="example">
+(setfn co continue)
+(setfn top top-level)
+(setfn res clean-up)
+(setfn up clean-up)
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="display"></a>
+
+<hr>
+
+<h2>display</h2>
+
+<hr>
+
+<p>'display' is a debugging macro, defined in 'xlinit.lsp'.</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">display-macro</font> (label &amp;rest items)
+ (let ($res$)
+ (dolist ($item$ items)
+ (setq $res$ (cons
+ `(format t <font color="#880000">"~A = ~A "</font> ',$item$ ,$item$)
+ $res$)))
+ (append (list 'let nil `(format t <font color="#880000">"~A : "</font> ,label))
+ (reverse $res$)
+ '((terpri)))))
+
+(defun <font color="#0000CC">display-on</font> ()
+ (setfn display display-macro) t)
+
+(defun <font color="#0000CC">display-off</font> ()
+ (setfn display or) nil)
+</pre>
+
+<p>Usage:</p>
+
+<pre class="example">
+(display <font color="#880000">"heading"</font> <font color="#0000CC">var1 var2</font> ...)
+</pre>
+
+<p>expands into:</p>
+
+<pre class="example">
+(let ()
+ (format t "~A: " <font color="#880000">"heading"</font>)
+ (format t "~A = ~A " ',<font color="#0000CC">var1</font> ,<font color="#0000CC">var1</font>)
+ (format t "~A = ~A " ',<font color="#0000CC">var2</font> ,<font color="#0000CC">var2</font>)
+ ... )
+</pre>
+
+<p>and then prints:</p>
+
+<pre class="example">
+<font color="#0000CC">heading</font> : <font color="#0000CC">VAR1</font> = <font color="#0000CC">value1 VAR2</font> = <font color="#0000CC">value2</font> ...
+</pre>
+
+<p>Using the 'display' macro in a function like shown here:</p>
+
+<pre class="example">
+(defun <font color="#0000CC">hello</font> ()
+ (let ((local-var 'hello))
+ (display <font color="#880000">"debug message"</font> local-var)
+ local-var)) <font color="#008844">; return value</font>
+</pre>
+
+<p>Now the '<nobr>debug message</nobr>' can be switched on and off without
+changing the code:</p>
+
+<pre class="example">
+&gt; (display-on)
+T
+
+&gt; (hello)
+debug message : LOCAL-VAR = HELLO
+HELLO
+
+&gt; (display-off)
+NIL
+
+&gt; (hello)
+HELLO
+</pre>
+
+
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/tutorials/shell-utilities.htm b/docsrc/xlisp/xlisp-doc/tutorials/shell-utilities.htm
new file mode 100644
index 0000000..4c0a075
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/tutorials/shell-utilities.htm
@@ -0,0 +1,539 @@
+<html><head>
+
+<title>Shell Utilities</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Shell Utilities</h1>
+
+<hr>
+
+<ul>
+<li><nobr><a href="#cd">cd</a> - display and change directories</nobr></li>
+<li><nobr><a href="#ls">ls</a> - display files and sub-directories</nobr></li>
+<li><nobr><a href="#hd">hd</a> - hexdump a file</nobr></li>
+</ul>
+
+<p>Nyquist is not a system programming language, so Nyquist/XLISP cannot
+create or remove files and directories, and the <a
+href="../reference/system.htm">system</a> function does not work on Windows.
+<nobr>But sometimes</nobr> it helps to know the name of the current working
+directory, the name of the directory where the soundfiles are stored, or the
+names of files and <nobr>sub-directories</nobr>.</p>
+
+<a name="cd"></a>
+
+<hr>
+
+<h2>cd</h2>
+
+<hr>
+
+<p>The 'cd' function displays or changes the current working directory, it
+also displays the name of the *<nobr>default-sf-dir</nobr>* directory, where
+Nyquist stores its sound files:</p>
+
+<pre class="example">
+&gt; (cd)
+;; *default-sf-dir* = /tmp/
+;; working directory = /home/edgar
+NIL
+
+&gt; (cd "test")
+;; directory changed to "test"
+;; *default-sf-dir* = /tmp/
+;; working directory = /home/edgar/test
+T
+
+&gt; (cd "..")
+;; directory changed to "edgar"
+;; *default-sf-dir* = /tmp/
+;; working directory = /home/edgar
+T
+
+&gt; (cd "foo")
+;; directory not changed, "foo" not found
+;; *default-sf-dir* = /tmp/
+;; working directory = /home/edgar
+NIL
+
+&gt; (cd 123)
+;; directory not changed, 123 is not a string
+;; *default-sf-dir* = /tmp/
+;; working directory = /home/edgar
+NIL
+</pre>
+
+<p>The 'cd' function is intended for interactive use, in program code it's
+better to use the Nyquist <a href="../reference/setdir.htm">setdir</a>
+function.</p>
+
+<pre class="example">
+(defun <font color="#0000CC">cd</font> (&amp;optional dirname)
+ (let ((old-dir (setdir <font color="#880000">"."</font>))
+ (new-dir (when (stringp dirname) (setdir dirname))))
+ (when dirname
+ (if new-dir
+ (when (string/= old-dir new-dir)
+ (let ((string-end (length new-dir))
+ (subseq-start 0))
+ (dotimes (index string-end)
+ (when (char= (char new-dir index) <font color="#AA5500">*file-separator*</font>)
+ (setq subseq-start index)))
+ (incf subseq-start)
+ (format t <font color="#880000">";; directory changed to ~s~%"</font>
+ (if (&lt; subseq-start string-end)
+ (subseq new-dir subseq-start)
+ (string <font color="#AA5500">*file-separator*</font>)))))
+ (format t <font color="#880000">";; directory not changed, ~s ~a~%"</font> dirname
+ (if (stringp dirname) <font color="#880000">"not found" "is not a string"</font>))))
+ (format t <font color="#880000">";; *default-sf-dir* = ~a~%"</font> <font color="#AA5500">*default-sf-dir*</font>)
+ (format t <font color="#880000">";; working directory = ~a~%"</font> (setdir <font color="#880000">"."</font>))
+ (when new-dir t)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="ls"></a>
+
+<hr>
+
+<h2>ls</h2>
+
+<hr>
+
+<p>The 'ls' function lists files and directories:</p>
+
+<pre class="example">
+&gt; (ls)
+;;; /home/edgar/Downloads/nyquist/svn/nyquist
+;; advantages.txt cmt/ comp-ide.bat convert.dsp
+;; convert.dsw demos/ doc/ docsrc/
+;; fft/ ffts/ files.txt howtorelease.txt
+;; jny jnyqide.bat jnyqide/ lib/
+;; liblo/ license.txt lpc/ macosxproject/
+;; macproject/ Makefile misc/ nylsf/
+;; nyqide/ nyqsrc/ nyqstk/ nyquist.dsp
+;; nyquist.dsw nyquist.sln nyquist.vcproj nyqwin.dsp
+;; nyqwin.vcproj portaudio-oldv19/ portaudio/ portaudio_test/
+;; Readme.txt release.bat releasenyqide.bat releasenyqwin.bat
+;; runtime/ snd/ sys/ test/
+;; todo.txt tran/ xlisp/
+47
+</pre>
+
+<p>The algorithm to find the number of colums is
+<nobr>trial-and-error</nobr>, for example it starts with one column:</p>
+
+<pre class="example">
+<font color="#008844">&lt;- maximum-width -&gt;|</font>
+item-1
+item-2
+item-3
+item-4
+item-5
+</pre>
+
+<p>When no line was longer than the <nobr>maximum-width</nobr> the
+layout is saved and a new test is started with two columns:</p>
+
+<pre class="example">
+<font color="#008844">&lt;- maximum-width -&gt;|</font>
+item-1 item-2
+item-3 item-4
+item-5
+</pre>
+
+<p>When no line was longer than the <nobr>maximum-width</nobr> the
+layout is saved and a new test is started with three columns:</p>
+
+<pre class="example">
+<font color="#008844">&lt;- maximum-width -&gt;|</font>
+item-1 item-2 item-3
+</pre>
+
+<p>As soon as a line becomes longer than the <nobr>maximum-width</nobr>, the
+test is aborted and the saved layout from the previous run is used.</p>
+
+<p>The main reason why arrays are used instead of lists is that we need
+access to predefined numbers. With lists we always first need to test if an
+element exists because <nobr>non-existent</nobr> list elements are NIL and
+not numbers:</p>
+
+<pre class="example">
+(&lt; (nth 3 '(1 2)) 0) =&gt; <font color="#AA0000">error: bad argument type - NIL</font>
+</pre>
+
+<p>It's also no good idea to use <a href="../reference/setf.htm">setf</a>
+with <nobr>non-existent</nobr> list elements:</p>
+
+<pre class="example">
+(setf (nth 2 nil) 'value) =&gt; VALUE
+(nth 2 nil) =&gt; <font color="#AA0000">error: bad argument type - NIL</font>
+</pre>
+
+<p><b>Caution:</b> The XLISP <a href="../reference/setf.htm">setf</a>
+special form does not signal an error if values are assigned to
+<nobr>non-existent</nobr> places.</p>
+
+<p>We use the Common Lisp 'incf' macro because the Nyquist
+<a href="../reference/incf.htm">incf</a> macro has no 'increment'
+argument:</p>
+
+<pre class="example">
+(defmacro <font color="#0000CC">cl:incf</font> (place &amp;optional (increment 1))
+ `(setf ,place (+ ,place ,increment)))
+</pre>
+
+<pre class="example">
+(defun <font color="#0000CC">ls</font> (&amp;rest args)
+ (let* ((dirname (if (stringp (car args))
+ (prog1 (car args) (setq args (cdr args)))
+ (setdir ".")))
+ (show-all (car args))
+ (raw-list (listdir dirname)))
+ (cond ((null raw-list)
+ (format t <font color="#880000">";; directory ~s not found~%"</font> dirname))
+ ((&lt;= (length raw-list) 2)
+ (format t <font color="#880000">";;; ~a~%"</font> dirname)
+ (format t <font color="#880000">";; [directory is empty]~%"</font>) 0)
+ (t
+ (format t <font color="#880000">";;; ~a~%"</font> dirname)
+ (let ((file-separator (string <font color="#AA5500">*file-separator*</font>))
+ (dir-list nil))
+ (dolist (item raw-list)
+ (when (or show-all (not (ls:hidden-p item)))
+ (if (listdir (strcat dirname file-separator item))
+ (push (strcat item <font color="#880000">"/"</font>) dir-list)
+ (push item dir-list))))
+ (ls:list-items (sort dir-list #'string-lessp)))))))
+
+(setq <font color="#AA5500">*ls-hidden-start*</font> (list <font color="#880000">"." "#"</font>))
+(setq <font color="#AA5500">*ls-hidden-end*</font> (list <font color="#880000">"~" "#"</font>))
+
+(defun <font color="#0000CC">ls:hidden-p</font> (string)
+ (let ((string-length (length string)))
+ (or (dolist (item <font color="#AA5500">*ls-hidden-start*</font> nil)
+ (let ((subseq-end (length item)))
+ (when (and (&gt;= string-length subseq-end)
+ (string= item (subseq string 0 subseq-end)))
+ (return t))))
+ (dolist (item <font color="#AA5500">*ls-hidden-end*</font> nil)
+ (let ((subseq-start (- string-length (length item))))
+ (when (and (&lt;= 0 subseq-start)
+ (string= item (subseq string subseq-start)))
+ (return t)))))))
+
+(defmacro <font color="#0000CC">ls:reset-array</font> (array)
+ (let ((index (gensym)))
+ `(dotimes (,index (length ,array))
+ (setf (aref ,array ,index) 0))))
+
+(defmacro <font color="#0000CC">ls:copy-array</font> (from-array to-array end)
+ (let ((index (gensym)))
+ `(dotimes (,index ,end)
+ (setf (aref ,to-array ,index)
+ (aref ,from-array ,index)))))
+
+(defun <font color="#0000CC">ls:fill-string</font> (length)
+ (let ((string <font color="#880000">""</font>))
+ (dotimes (i length)
+ (setq string (strcat string <font color="#880000">" "</font>)))
+ string))
+
+(defun <font color="#0000CC">ls:list-items</font> (item-list &amp;optional (terminal-width 80))
+ (let* ((separator 2)
+ (width (- terminal-width 4))
+ (width-max (+ width separator))
+ (num-items (length item-list))
+ (num-columns 1) <font color="#008844">; number of columns</font>
+ (item-array (make-array num-items))
+ (length-array (make-array num-items))
+ (length-min width) <font color="#008844">; shortest item</font>
+ (length-max 0) <font color="#008844">; longest item</font>
+ (length-all 0) <font color="#008844">; all items + separators</font>
+ <font color="#008844">;; the maximum possible number of columns is</font>
+ <font color="#008844">;; width-max / (1 char + separator)</font>
+ (max-columns (/ width-max (1+ separator)))
+ (column-array (make-array max-columns)))
+
+ <font color="#008844">;; initialize the column-array</font>
+ (ls:reset-array column-array)
+
+ <font color="#008844">;; copy the items from the list into the item-array</font>
+ (let ((item-index 0))
+ (dolist (item item-list)
+ (setf (aref item-array item-index) item)
+ (incf item-index)))
+
+ <font color="#008844">;; find the length of all items and store them in the length-array</font>
+ (dotimes (item-index num-items)
+ (let ((length-item (length (aref item-array item-index))))
+ (setf (aref length-array item-index) length-item
+ length-all (+ length-all length-item separator)
+ length-min (min length-min length-item)
+ length-max (max length-max length-item))))
+
+ <font color="#008844">;; find the number and widths of the columns</font>
+ (cond ((&lt;= length-all width-max)
+ <font color="#008844">;; if all items together fit into a single line</font>
+ (setq num-columns num-items)
+ (ls:copy-array length-array column-array num-items))
+ ((and (&gt; num-items 1)
+ (&lt;= (+ length-min length-max separator) width))
+ <font color="#008844">;; if there is more than one item and the</font>
+ <font color="#008844">;; longest + shortest item + separator fit into one line</font>
+ <font color="#008844">;; we start with two columns, one column is the fallback</font>
+ (incf num-columns)
+ <font color="#008844">;; the test-array must be 1+ because we need 1 failure-run</font>
+ (do ((test-array (make-array (1+ max-columns)))
+ (item-index 0 0))
+ ((progn
+ (ls:reset-array test-array)
+ <font color="#008844">;; loop until there are no more items in the list</font>
+ (do ((line-length 0 0))
+ ((&gt;= item-index num-items))
+ <font color="#008844">;; compute a complete line</font>
+ (dotimes (column-index num-columns)
+ <font color="#008844">;; loop through all columns in the test-array</font>
+ (when (and (&lt; item-index num-items)
+ (&lt; (aref test-array column-index)
+ (aref length-array item-index)))
+ <font color="#008844">;; if there are still items in the list and the</font>
+ <font color="#008844">;; item is wider than the column, update the array</font>
+ (setf (aref test-array column-index)
+ (aref length-array item-index)))
+ <font color="#008844">;; compute the line-length from the value in the array</font>
+ (cl:incf line-length
+ (+ (aref test-array column-index) separator))
+ (incf item-index))
+ <font color="#008844">;; analyze the result from computing the line</font>
+ (cond ((&gt; line-length width-max)
+ <font color="#008844">;; if the line is too long, abort completely, use</font>
+ <font color="#008844">;; the column-array values from the previous run</font>
+ (decf num-columns)
+ (return t)) <font color="#008844">; abort both 'do' loops</font>
+ ((&gt;= item-index num-items)
+ <font color="#008844">;; if no items is left and no line was too long</font>
+ <font color="#008844">;; first save the test-array in the column-array</font>
+ (ls:copy-array test-array column-array num-columns)
+ <font color="#008844">;; then try again with one more column</font>
+ (incf num-columns)))))))))
+
+ <font color="#008844">;; print the items on the screen</font>
+ (do ((item-index 0)
+ (last-item (1- num-items))
+ (last-column (1- num-columns))
+ (line <font color="#880000">";; " ";; "</font>))
+ ((&gt;= item-index num-items))
+ (dotimes (column-index num-columns)
+ <font color="#008844">;; loop through all columns</font>
+ (when (&lt; item-index num-items)
+ <font color="#008844">;; if there are still items in the list</font>
+ (setq line
+ (if (and (&lt; column-index last-column)
+ (&lt; item-index last-item))
+ <font color="#008844">;; if not the last column and not the last item</font>
+ (strcat line (aref item-array item-index)
+ <font color="#008844">;; add a fill-string</font>
+ (let ((column (aref column-array column-index))
+ (item (aref length-array item-index)))
+ (ls:fill-string (+ (- column item) separator))))
+ <font color="#008844">;; if the last column or the last item</font>
+ (strcat line (aref item-array item-index))))
+ (incf item-index)))
+ <font color="#008844">;; display the line on the screen</font>
+ (format t <font color="#880000">"~a~%"</font> line))
+
+ <font color="#008844">;; return the number of items listed on the screen</font>
+ num-items))
+</pre>
+
+<p><b>Note:</b> The code works, but this section is still too much mess.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="hd"></a>
+
+<hr>
+
+<h2>hd</h2>
+
+<hr>
+
+<p>The 'hd' function prints the hexdump of a file on the screen:</p>
+
+<pre class="example">
+&gt; (hd "/tmp/edgar-temp.wav")
+0000000000 52 49 46 46 ac 58 01 00 57 41 56 45 66 6d 74 20 RIFF.X..WAVEfmt
+0000000016 10 00 00 00 01 00 01 00 44 ac 00 00 88 58 01 00 ........D....X..
+0000000032 02 00 10 00 64 61 74 61 88 58 01 00 00 00 4a 04 ....data.X....J.
+0000000048 93 08 da 0c 1b 11 57 15 8b 19 b7 1d d7 21 ec 25 ......W......!.%
+0000000064 f3 29 eb 2d d3 31 a9 35 6c 39 1a 3d b3 40 35 44 .).-.1.5l9.=.@5D
+0000000080 9e 47 ee 4a 24 4e 3d 51 3a 54 19 57 d9 59 78 5c .G.J$N=Q:T.W.Yx\
+0000000096 f7 5e 54 61 8f 63 a6 65 99 67 67 69 10 6b 92 6c .^Ta.c.e.ggi.k.l
+0000000112 ee 6d 23 6f 31 70 16 71 d3 71 68 72 d4 72 17 73 .m#o1p.q.qhr.r.s
+0000000128 31 73 23 73 eb 72 8a 72 01 72 4f 71 75 70 73 6f 1s#s.r.r.rOqupso
+0000000144 49 6e f8 6c 80 6b e2 69 1f 68 36 66 29 64 f8 61 In.l.k.i.h6f)d.a
+0000000160 a5 5f 2f 5d 98 5a e2 57 0b 55 17 52 05 4f d8 4b ._/].Z.W.U.R.O.K
+0000000176 8f 48 2c 45 b1 41 1f 3e 76 3a b9 36 e8 32 05 2f .H,E.A.>v:.6.2./
+0000000192 11 2b 0e 27 fe 22 e0 1e b8 1a 86 16 4c 12 0c 0e .+.'."......L...
+0000000208 c7 09 7e 05 33 01 e9 fc 9f f8 57 f4 14 f0 d6 eb ..~.3.....W.....
+0000000224 a0 e7 72 e3 4e df 36 db 2b d7 2f d3 42 cf 67 cb ..r.N.6.+./.B.g.
+0000000240 9f c7 ea c3 4b c0 c3 bc 53 b9 fb b5 be b2 9d af ....K...S.......
+;; type "q" to quit or press Return to continue...
+</pre>
+
+<pre class="example">
+(defun <font color="#0000CC">hd</font> (filename &amp;key (start 0) end)
+ (cond
+ ((not (stringp filename))
+ (format t <font color="#880000">";; not a string ~s~%"</font> filename))
+ ((listdir filename)
+ (format t <font color="#880000">";; not a file ~s~%"</font> string))
+ ((or (not (integerp start)) (minusp start))
+ (format t <font color="#880000">";; not a non-negative integer ~s~%"</font> start))
+ ((and end (or (not (integerp end)) (minusp end)))
+ (format t <font color="#880000">";; not a non-negative integer ~s~%"</font> end))
+ ((and end (&gt;= start end))
+ (format t <font color="#880000">";; :start ~s is greater then :end ~s~%"</font> start end))
+ (t (let ((file-stream (open-binary filename)))
+ (if (null file-stream)
+ (format t <font color="#880000">";; file not found ~s~%"</font> filename)
+ (unwind-protect
+ (hd:dump file-stream start end)
+ (when file-stream (close file-stream))))))))
+
+(defun <font color="#0000CC">hd:dump</font> (file-stream start end)
+ (let ((file-position (hd:skip file-stream start))
+ (break (+ start 255))
+ (end-of-file nil)
+ (end-of-dump nil))
+ (if (&lt; file-position start)
+ (setq end-of-file t)
+ (flet ((read-eight-bytes (start-position)
+ (let (byte-list)
+ (dotimes (offset 8)
+ (let* ((position (+ start-position offset))
+ (read-p (and (&lt;= start position)
+ (or (null end)
+ (&gt;= end position))))
+ (byte (when read-p
+ (read-byte file-stream))))
+ (push byte byte-list)
+ (when byte (incf file-position))
+ (when (and read-p (null byte))
+ (setq end-of-file t))))
+ (reverse byte-list))))
+ (read-line)
+ (do ((line-start (* (/ start 16) 16) (+ line-start 16)))
+ ((or end-of-file end-of-dump))
+ (let* ((number (hd:line-number line-start))
+ (list-1 (read-eight-bytes line-start))
+ (list-2 (read-eight-bytes (+ line-start 8)))
+ (bytes-1 (hd:byte-string list-1))
+ (bytes-2 (hd:byte-string list-2))
+ (chars (hd:char-string (append list-1 list-2))))
+ (format t <font color="#880000">"~a ~a ~a ~a~%"</font> number bytes-1 bytes-2 chars)
+ (when (and end (&gt; file-position end))
+ (setq end-of-dump t))
+ (when (&gt; file-position break)
+ (format t <font color="#880000">";; type \"q\" to quit or press Return to continue... "</font>)
+ (if (string-equal "q" (read-line))
+ (setq end-of-dump t)
+ (setq break (+ break 256))))))))
+ (when (and end (&gt;= file-position end))
+ (format t <font color="#880000">";; reached specified :end at byte number ~a~%"</font> end))
+ (when end-of-file
+ (format t <font color="#880000">";; end of file at byte number ~a~%"</font> file-position))))
+
+(defun <font color="#0000CC">hd:line-number</font> (integer)
+ (progv '(<font color="#AA5500">*integer-format*</font>) '(<font color="#880000">"%.10d"</font>)
+ (format nil <font color="#880000">"~s"</font> integer)))
+
+(defun <font color="#0000CC">hd:byte-string</font> (byte-list)
+ (let ((string <font color="#880000">""</font>))
+ (dolist (byte byte-list)
+ (setq string (strcat string (if byte
+ (progv '(<font color="#AA5500">*integer-format*</font>) '(<font color="#880000">"%.2x"</font>)
+ (format nil <font color="#880000">"~s "</font> byte))
+ <font color="#880000">" "</font>))))
+ (subseq string 0 (1- (length string)))))
+
+(defun <font color="#0000CC">hd:char-string</font> (byte-list)
+ (let ((string <font color="#880000">""</font>))
+ (dolist (byte byte-list)
+ (setq string (strcat string (if byte
+ (if (&lt;= 32 byte 126)
+ (string byte)
+ <font color="#880000">"."</font>)
+ <font color="#880000">" "</font>))))
+ string))
+
+(defun <font color="#0000CC">hd:skip</font> (file-stream offset)
+ (if (= offset 0)
+ offset
+ (let ((count 0))
+ (format t <font color="#880000">";; skipping ~a bytes...~%"</font> offset)
+ (dotimes (ignore offset)
+ (if (read-byte file-stream)
+ (incf count)
+ (return)))
+ count)))
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/tutorials/tutorials.htm b/docsrc/xlisp/xlisp-doc/tutorials/tutorials.htm
new file mode 100644
index 0000000..0e7ecf5
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/tutorials/tutorials.htm
@@ -0,0 +1,28 @@
+<html><head><title>Tutorials</title></head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+Tutorials |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>Tutorials</h1>
+
+<hr>
+
+<ul>
+<li><nobr><a href="nyquist.htm">Nyquist</a> - things that may help in practical work</nobr></li>
+<li><nobr><a href="lisp-hints.htm">Lisp Hints</a> - Lisp and XLISP basics</nobr></li>
+<li><nobr><a href="xlisp-objects.htm">XLISP Object Primer</a> - by Tim I Mikkelsen</nobr></li>
+<li><nobr><a href="file-io.htm">File I/O Examples</a> - by David Betz</nobr></li>
+<li><nobr><a href="binary-io.htm">Binary File I/O</a></nobr></li>
+<li><nobr><a href="shell-utilities.htm">Shell Utilities</a></nobr></li>
+<li><nobr><a href="environment.htm">Environment</a></nobr></li>
+<li><nobr><a href="lisp-faq.htm">Lisp FAQ</a></nobr></li>
+</ul>
+
+</body></html>
diff --git a/docsrc/xlisp/xlisp-doc/tutorials/xlisp-objects.htm b/docsrc/xlisp/xlisp-doc/tutorials/xlisp-objects.htm
new file mode 100644
index 0000000..1b02a86
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/tutorials/xlisp-objects.htm
@@ -0,0 +1,839 @@
+<html><head><title>XLISP Objects Primer</title>
+
+<style type="text/css">
+.example {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ width:auto;
+}
+.button {
+ color: #000000;
+ background-color: #F5F5F5;
+ padding-top: 1px;
+ padding-bottom: 1px;
+ padding-left: 4px;
+ padding-right: 8px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+ white-space: pre;
+}
+.box {
+ color: #000000;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ padding-left: 16px;
+ padding-right: 16px;
+ border: #808080;
+ border-style: solid;
+ border-width: 1px;
+}
+</style>
+
+</head>
+
+<body>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+<hr>
+
+<h1>XLISP Objects Primer</h1>
+
+<hr>
+
+<ol>
+<li><nobr><a href="#1">Programming Styles</a></nobr></li>
+<li><nobr><a href="#2">Object Oriented Programming</a></nobr></li>
+<li><nobr><a href="#3">Xlisp Object Terminology</a></nobr></li>
+<li><nobr><a href="#4">Sending Messages</a></nobr></li>
+<li><nobr><a href="#5">Classes</a></nobr></li>
+<li><nobr><a href="#6">A Better Class Example</a></nobr></li>
+<li><nobr><a href="#7">Instances</a></nobr></li>
+<li><nobr><a href="#8">Methods</a></nobr></li>
+<li><nobr><a href="#9">Sending Messages To A Superclass</a></nobr></li>
+<li><nobr><a href="#10">Object And Class</a></nobr></li>
+<li><nobr><a href="#11">Objects Example</a></nobr></li>
+</ol>
+
+<p>This tutorial is adapted from a '<nobr>XLISPOOP.DOC</nobr>' document with
+the following copyright:</p>
+
+<p><div class="box">
+
+<p>XLisp 2.0 Objects Primer by Tim I Mikkelsen - February 3, 1990</p>
+
+<blockquote>
+
+<p> Copyright (c) 1990 by Tim I. Mikkelsen. All Rights Reserved. No part of this
+document may be copied, reproduced or translated for commercial use without
+prior written consent of the author. Permission is granted for non-commercial
+use as long as this notice is left intact.
+
+<p> One of the features in the design of XLISP is object-oriented programming.
+This primer is intended to serve as a very brief introduction to the object
+facilities of the XLISP 2.0 dialect of LISP. Note that the object features of
+XLISP are not based on other existing object definitions in other LISP dialects.
+If you find problems in the primer, I'd appreciate hearing. </p>
+
+</blockquote>
+
+<p>Tim Mikkelsen, (tim@hpfcbig.SDE.HP.COM), 4316 Picadilly Drive, Fort Collins,
+Colorado 80526</p>
+
+</div></p>
+
+<a name="1"></a>
+
+<hr>
+
+<h2>1&nbsp; Programming Styles</h2>
+
+<hr>
+
+<p>There are many programming models, some of <nobr>them are:</nobr></p>
+
+<ul>
+<li>procedural</li>
+<li>functional</li>
+<li><nobr>rule-based</nobr></li>
+<li>declarative</li>
+<li><nobr>object-oriented</nobr></li>
+</ul>
+
+<p>A language can have aspects of one or many of these programming
+models.</p>
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><b>Procedure-Oriented</b></p></dt>
+
+<dd><p>The programming paradigm most people are familiar with is the
+procedural style. The primitives in procedural programming are subroutines
+and data structures. Through these primitives, programmers have some limited
+abilities to share programs and program fragments. <nobr>C and</nobr> Pascal
+are examples of procedural languages. Some procedural languages <nobr>[such
+as</nobr> Modula <nobr>and ADA]</nobr> have extensions that provide for
+better sharing <nobr>of code</nobr>.</p></dd>
+
+<dt><p><b>Object-Oriented</b></p></dt>
+
+<dd><p><nobr>Object-oriented</nobr> programming is based on the primitives
+of objects, classes and messages. Objects are defined in terms of classes.
+Actions occur by sending a message to an object. <nobr>An object's</nobr>
+definition can be inherited from more general classes.
+<nobr>Objective-C</nobr> and C++ both are <nobr>object-oriented</nobr>
+dialects of the <nobr>C language</nobr>. <nobr>Many dialects</nobr> of Lisp
+have some <nobr>object-oriented</nobr> extension [Flavors, <nobr>Common
+LOOPS</nobr>, CLOS and others]. There currently is standards work proceeding
+to add <nobr>object-oriented</nobr> programming to <nobr>Common
+Lisp</nobr>.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="2"></a>
+
+<hr>
+
+<h2>2&nbsp; Object Oriented Programming</h2>
+
+<hr>
+
+<p>The <nobr>object-oriented</nobr> programming model is based around the
+concepts of objects, classes and messages. <nobr>An object</nobr> is
+essentially a black box that contains internal state information. <nobr>You
+send</nobr> an object a message which causes the object to perform some
+operation. Objects are defined and described through classes.</p>
+
+<p>One aspect of an object is that you do not have to know what is inside or
+how it works to be able to <nobr>use it</nobr>. From a programming point of
+view, this is very handy. <nobr>You can</nobr> develop a series of objects
+for someone to use. <nobr>If you</nobr> need to change what goes on inside,
+the users of the objects should be unaware.</p>
+
+<p>Another aspect of objects is that of inheritance. <nobr>You can</nobr>
+build up new classes from existing classes by inheriting the existing
+class's functionality and then extending the new definition. For example,
+you can define a 'tool' class with various attributes and then go about
+creating object instances like '<nobr>tool-1</nobr>', '<nobr>tool-2</nobr>',
+and <nobr>so on</nobr>. <nobr>You can</nobr> also create new
+<nobr>sub-classes</nobr> of the 'tool' class like '<nobr>power-tool</nobr>'.
+<nobr>This is</nobr> also very handy because you don't have to
+<nobr>re-implement</nobr> something if you can build it up from
+<nobr>existing code</nobr>.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="3"></a>
+
+<hr>
+
+<h2>3&nbsp; Xlisp Object Terminology</h2>
+
+<hr>
+
+<p>There are many different languages with <nobr>object-oriented</nobr>
+extensions and facilities. <nobr>The terminology</nobr>, operations and
+styles of these are very different. Some of the main definitions for XLISP's
+<nobr>object-oriented</nobr> extensions are:</p>
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><nobr><b>object data type</b></nobr></p></dt>
+
+<dd><p>The <a href="../reference/object.htm">object</a> data type is a
+<nobr>built-in</nobr> data type of XLISP. Members of the object data type
+are object instances and classes.</p></dd>
+
+<dt><p><nobr><b>object instances</b></nobr></p></dt>
+
+<dd><p>An 'object instance' is a composite structure that contains internal
+state information, methods [the code which respond to messages], <nobr>a
+pointer</nobr> to the object instance's defining class and a pointer to the
+object's <nobr>super-class</nobr>. XLISP contains no <nobr>built-in</nobr>
+object instances.</p></dd>
+
+<dt><p><nobr><b>class objects</b></nobr></p></dt>
+
+<dd><p>A <a href="../reference/class.htm">class</a> object is, essentially,
+the template for defining the derived object instances. <nobr>A class
+object</nobr>, although used differently from a simple object instance, is
+structurally a member of the object data type. <nobr>It also</nobr> contains
+the linking mechanism that allows you to build class hierarchies
+<nobr>[sub-classes</nobr> and <nobr>super-classes]</nobr>. XLISP contains
+two <nobr>built-in</nobr> class objects, 'object' and 'class'.</p></dd>
+
+<dt><p><nobr><b>message selector</b></nobr></p></dt>
+
+<dd><p>The 'message selector' is the symbol that is used to select a
+particular action [method] from the object.</p></dd>
+
+<dt><p><b>message</b></p></dt>
+
+<dd><p>The 'message' is the combination of the message selector and the data
+<nobr>[if any]</nobr> to be sent to the object.</p></dd>
+
+<dt><p><b>method</b></p></dt>
+
+<dd><p>The 'method' is the actual code that gets executed when the object
+receives the message.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="4"></a>
+
+<hr>
+
+<h2>4&nbsp; Sending Messages</h2>
+
+<hr>
+
+<p>The mechanism for sending messages to XLISP objects is via the
+<a href="../reference/send.htm">send</a> function. <nobr>It takes</nobr>
+an object, a message selector and various optional arguments [depending on
+the message selector].</p>
+
+<p>The way that a user creates a new object is to
+<a href="../reference/send.htm">send</a> a
+<a href="../reference/keyword-new.htm">:new</a> message to a previously
+defined class. <nobr>The result</nobr> of this
+<a href="../reference/send.htm">send</a> will return an object, so this is
+normally preceded by <nobr>a
+<a href="../reference/setq.htm">setq</a></nobr>.</p>
+
+<pre class="example">
+&gt; (setq my-object (send object :new))
+#&lt;Object: #2e100&gt;
+</pre>
+
+<p><div class="box">
+
+<p><nobr>The examples</nobr> are similar to what you should see on your
+computer screen. <nobr>The '&gt;'</nobr> is the normal XLISP prompt, the
+characters that follow the prompt is what you type in to try the examples.
+Note that XLISP prints objects together with their internal pointer, like
+#2e100 in the example above. These <nobr>#ID numbers</nobr> may not match
+with the numbers you see on the screen if you try the examples, but this is
+not an error.</nobr></p>
+
+</div></p>
+
+<p> The object created above is of limited value. Most often, you create a
+'class' object and then you create instances of that class. <nobr>So
+in</nobr> the following example, a class called '<nobr>my-class</nobr>' is
+created that inherits its definition from the a <nobr>built-in</nobr> <a
+href="../reference/class.htm">class</a> definition. Then two instances are
+created of the new class:</p>
+
+<pre class="example">
+&gt; (setq my-class (send class :new '()))
+#&lt;Object: #27756&gt;
+
+&gt; (setq my-instance (send my-class :new))
+#&lt;Object: #27652&gt;
+
+&gt; (setq another-instance (send my-class :new))
+#&lt;Object: #275da&gt;
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="5"></a>
+
+<hr>
+
+<h2>5&nbsp; Classes</h2>
+
+<hr>
+
+<p> In the examples above, a <a href="../reference/keyword-new.htm">:new</a>
+message was used to create an object. <nobr>The message</nobr> used to see
+what is in an object is the
+<a href="../reference/keyword-show.htm">:show</a> message:</p>
+
+<pre class="example">
+&gt; (send my-class :show)
+Object is #&lt;Object: #27756&gt;, Class is #&lt;Object: #23fe2&gt;
+ MESSAGES = NIL
+ IVARS = NIL
+ CVARS = NIL
+ CVALS = NIL
+ SUPERCLASS = #&lt;Object: #23fd8&gt;
+ IVARCNT = 0
+ IVARTOTAL = 0
+#&lt;Object: #27756&gt;
+</pre>
+
+<p> From the display of the 'my-class' object you can see there are a
+variety of components. The components of a class are:</p>
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><nobr><b>class pointer</b></nobr></p></dt>
+
+<dd><p>This pointer shows to what class the object [instance or class]
+belongs. For a class, this always points to the <nobr>built-in</nobr> object
+<a href="../reference/class.htm">class</a>. This is also true of the
+<a href="../reference/class.htm">class</a> object, its class pointer points
+to itself.</p></dd>
+
+<dt><p><nobr><b>superclass pointer</b></nobr></p></dt>
+
+<dd><p>This pointer shows what the next class up the class <nobr>hierarchy
+is</nobr>. <nobr>If the</nobr> user does not specify what class is the
+superclass, it will point to the built-in <nobr>class
+<a href="../reference/object.htm">object</a></nobr>.</p></dd>
+
+<dt><p><b>messages</b></p></dt>
+
+<dd><p>This component shows what messages are allowed for the class, and the
+description of the method that will be used. <nobr>If the</nobr> method is
+<nobr>system-defined</nobr>, it will show up in the <nobr>form
+of:</nobr></p>
+
+<pre class="example">
+#&lt;Subr-: #18b98&gt;
+</pre>
+
+<p>Remember that the class hierarchy [through the superclass pointer] is
+searched if the requested message is not found in the class.</p></dd>
+
+<dt><p><nobr><b>instance variables</b></nobr></p></dt>
+
+<dd><p>The IVARS component lists what instance variables will be created
+when an object instance is created. <nobr>If no</nobr> instances of the
+class exist, there are no instance variables. <nobr>If there</nobr> are
+<nobr>5 instances</nobr> of a class, there are <nobr>5 complete</nobr> and
+different groups of the instance variables.</p></dd>
+
+<dt><p><nobr><b>class variables and values</b></nobr></p></dt>
+
+<dd><p>The CVARS component lists what class variables exist within the
+class. The CVALS component shows what the current values of the variables
+are. Class variables are used to hold state information about a class. There
+will be one of each of the class variables, independent of the number of
+instances of the class created.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="6"></a>
+
+<hr>
+
+<h2>6&nbsp; A Better Class Example</h2>
+
+<hr>
+
+<p> The example shown in the previous section does work, but the class and
+instances created don't really do anything of interest. The following
+example sets up a tool class and creates some tool instances:</p>
+
+<pre class="example">
+&gt; (setq my-tools (send class :new '(power moveable operation)))
+#&lt;Object: #277a6&gt;
+
+&gt; (send my-tools :answer :isnew '(pow mov op)
+ '((setq power pow moveable mov operation op))
+#&lt;Object: #277a6&gt;
+
+&gt; (setq drill (send my-tools :new 'AC t 'holes))
+#&lt;Object: #2ddbc&gt;
+
+&gt; (setq hand-saw (send my-tools :new 'none t 'cuts))
+#&lt;Object: #2dc40&gt;
+
+&gt; (setq table-saw (send my-tools :new 'AC nil 'cuts))
+#&lt;Object: #2db00&gt;
+</pre>
+
+<p>A class of objects called '<nobr>my-tools</nobr>' and three instances
+were created:</p>
+
+<p><nobr>&nbsp; <img alt="[Figure 1]" src="xobj-1.png"></nobr></p>
+
+<p>First the class '<nobr>my-tools</nobr>' was created by sending the
+<a href="../reference/keyword-new.htm">:new</a> message to the
+<nobr>built-in</nobr> <a href="../reference/class.htm">class</a> object.
+Then, within the '<nobr>my-tool</nobr>' class, three instances called
+'drill', '<nobr>hand-saw</nobr>' and '<nobr>table-saw</nobr>' were
+created by sending the <a href="../reference/keyword-new.htm">:new</a>
+message to the '<nobr>my-tools</nobr>' class. Notice the three parameters
+following the message selector. The instance variables are initialized
+from these parameters by the :isnew method, inherited from the
+'<nobr>my-tools</nobr>' class at the time when the instances were created.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="7"></a>
+
+<hr>
+
+<h2>7&nbsp; Instances</h2>
+
+<hr>
+
+<p>The following is a display of the contents of some of the instances
+created above, where the XLISP object #ID numbers had been replaced by the
+respective class and instance names:</p>
+
+<pre class="example">
+&gt; (send drill :show)
+Object is #&lt;Object: #[<font color="#0066CC">drill</font>]&gt;, Class is #&lt;Object: #[<font color="#0066CC">my-tools</font>]&gt;
+ POWER = AC
+ MOVEABLE = T
+ OPERATION = HOLES
+#&lt;Object: #[<font color="#0066CC">drill</font>]&gt;
+
+&gt; (send hand-saw :show)
+Object is #&lt;Object: #[<font color="#0066CC">hand-saw</font>]&gt;, Class is #&lt;Object: #[<font color="#0066CC">my-tools</font>]&gt;
+ POWER = NONE
+ MOVEABLE = T
+ OPERATION = CUTS
+#&lt;Object: #[<font color="#0066CC">hand-saw</font>]&gt;
+</pre>
+
+<p>From the display of these instances you can see there are some
+components and values. The components of an instance are:</p>
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><nobr><b>class pointer</b></nobr></p></dt>
+
+<dd><p>This pointer shows to which class the current object instance
+belongs. It is through this link that the system finds the methods to
+execute for the received messages.</p></dd>
+
+<dt><p><nobr><b>instance variables and values</b></nobr></p></dt>
+
+<dd><p>The variables existing within the instance are shown together with
+their values. Instance Variables are used to hold state information for each
+instance. There will be a group of instance variables for each
+instance.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="8"></a>
+
+<hr>
+
+<h2>8&nbsp; Methods</h2>
+
+<hr>
+
+<p>There have been a few of the messages and methods in XLISP shown to this
+point like <a href="../reference/keyword-new.htm">:new</a> and
+<a href="../reference/keyword-show.htm">:show</a>. The following are the
+methods built into XLISP:</p>
+
+<p><div class="box">
+
+<dl>
+
+<dt><p><b>:answer</b></p></dt>
+
+<dd><p>The <a href="../reference/keyword-answer.htm">:answer</a> method
+allows you to define or change methods within a class.</p></dd>
+
+<dt><p><b>:class</b></p></dt>
+
+<dd><p>The <a href="../reference/keyword-class.htm">:class</a> method
+returns the class of an object.</p></dd>
+
+<dt><p><b>:isnew</b></p></dt>
+
+<dd><p>The <a href="../reference/keyword-.htm">:isnew</a> method causes an
+instance to run its initialization code. When the
+<a href="../reference/keyword-.htm">:isnew</a> method is run on a class, it
+resets the class state. This allows you to <nobr>re-define</nobr> instance
+variables, class <nobr>variables, etc.</nobr></p></dd>
+
+<dt><p><b>:new</b></p></dt>
+
+<dd><p>The <a href="../reference/keyword-new.htm">:new</a> method allows you
+to create an instance when the
+<a href="../reference/keyword-new.htm">:new</a> message is sent to a
+<nobr>user-defined</nobr> class. The
+<a href="../reference/keyword-new.htm">:new</a> method allows you to create
+a new class when the <a href="../reference/keyword-new.htm">:new</a> message
+is sent to the
+<nobr>built-in <a href="../reference/class.htm">class</a></nobr>.</p></dd>
+
+<dt><p><b>:show</b></p></dt>
+
+<dd><p>The <a href="../reference/keyword-show.htm">:show</a> method displays the instance or class.</p></dd>
+
+<dt><p><b>:isa</b></p></dt>
+
+<dd><p>The <a href="../reference/keyword-isa.htm">:isa</a> method tests if
+an object inherits from a class.</p></dd>
+
+</dl>
+
+</div></p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="9"></a>
+
+<hr>
+
+<h2>9&nbsp; Sending Messages To A Superclass</h2>
+
+<hr>
+
+<p> In addition to the <a href="../reference/send.htm">send</a> function,
+there is another function called
+<nobr><a href="../reference/send-super.htm">send-super</a></nobr>. The
+<nobr><a href="../reference/send-super.htm">send-super</a></nobr>
+function causes the specified message to be performed by the superclass
+method. This is a mechanism to allow chaining of methods in a class
+hierarchy. This chaining behavior can be achieved by creating a method for a
+class with the <a href="../reference/keyword-answer.htm">:answer</a>
+message. Within the body of the method, you include a
+<nobr><a href="../reference/send-super.htm">send-super</a></nobr> form. This
+function is allowed only inside the execution of a method of an object.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="10"></a>
+
+<hr>
+
+<h2>10&nbsp; Object And Class</h2>
+
+<hr>
+
+<p>The definition of the built-in class 'object' is:</p>
+
+<pre class="example">
+&gt; (send object :show)
+Object is #&lt;Object: #[<font color="#0066CC">built-in-object</font>]&gt;, Class is #&lt;Object: #[<font color="#0066CC">built-in-class</font>]&gt;
+ MESSAGES = ((:ISA . #&lt;Subr-: #[<font color="#0000CC">built-in-isa-method</font>]&gt;)
+ (:SHOW . #&lt;Subr-: #[<font color="#0000CC">built-in-show-method</font>]&gt;)
+ (:CLASS . #&lt;Subr-: #[<font color="#0000CC">built-in-class-method</font>]&gt;)
+ (:ISNEW . #&lt;Subr-: #[<font color="#0000CC">built-in-isnew-method</font>]&gt;))
+ IVARS = NIL
+ CVARS = NIL
+ CVALS = NIL
+ SUPERCLASS = NIL <font color="#008844">; no superclass</font>
+ IVARCNT = 0
+ IVARTOTAL = 0
+#&lt;Object: #[<font color="#0066CC">built-in-object</font>]&gt;
+</pre>
+
+<p> Note that 'object' is a class, as opposed to an 'instance-style' object.
+'object' has no superclass, it is the top or root of the class hierarchy.
+'object's class is 'class'. </p>
+
+<pre class="example">
+&gt; (send class :show)
+Object is #&lt;Object: #[<font color="#0066CC">built-in-class</font>]&gt;, Class is #&lt;Object: #[<font color="#0066CC">built-in-class</font>]&gt;
+ MESSAGES = ((:ANSWER . #&lt;Subr-: #[<font color="#0000CC">built-in-answer-method</font>]&gt;)
+ (:ISNEW . #&lt;Subr-: #[<font color="#0000CC">built-in-isnew-method</font>]&gt;)
+ (:NEW . #&lt;Subr-: #[<font color="#0000CC">built-in-new-method</font>]&gt;))
+ IVARS = (MESSAGES IVARS CVARS CVALS SUPERCLASS IVARCNT IVARTOTAL)
+ CVARS = NIL
+ CVALS = NIL
+ SUPERCLASS = #&lt;Object: #[<font color="#0066CC">built-in-object</font>]&gt;
+ IVARCNT = 7
+ IVARTOTAL = 7
+#&lt;Object: #[<font color="#0066CC">built-in-class</font>]&gt;
+</pre>
+
+<p>'class' has a superclass of 'object'. It's class is itself, 'class'.</p>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<a name="11"></a>
+
+<hr>
+
+<h2>11&nbsp; Objects Example</h2>
+
+<hr>
+
+<p> The following is an example, using the idea of tools again. <nobr>It
+contains</nobr> a hierarchy of tool classes. <nobr>The top</nobr> of the
+class hierarchy is 'tools'. '<nobr>hand-tools</nobr>' and
+'<nobr>shop-tools</nobr>' are <nobr>sub-classes</nobr> of 'tools'. The
+example creates instances of these <nobr>sub-classes</nobr>. <nobr>It
+is</nobr> possible to extend this example in various ways. One obvious
+extension would be to create a third tier of classes under
+'<nobr>hand-tools</nobr>' that could contain classes like drills,
+screwdrivers, pliers and <nobr>so on</nobr>. </p>
+
+<pre class="example">
+<font color="#008844">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</font>
+<font color="#008844">;;</font>
+<font color="#008844">;; Define the superclasses and classes</font>
+<font color="#008844">;;</font>
+<font color="#008844">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</font>
+<font color="#008844">;;</font>
+<font color="#008844">;; make TOOLS superclass</font>
+<font color="#008844">;;</font>
+<font color="#008844">;; with a different :ISNEW method</font>
+<font color="#008844">;; added methods are :BORROW and :RETURN</font>
+<font color="#008844">;;</font>
+<font color="#008844">;; class variables NUMBER contains # of tool instances</font>
+<font color="#008844">;; ACTIVE-LIST contains list of current objects</font>
+<font color="#008844">;;</font>
+<font color="#008844">;; instance variables POWER list - (AC BATTERY HAND)</font>
+<font color="#008844">;; MOVEABLE CAN-CARRY or CAN-ROLL or FIXED</font>
+<font color="#008844">;; OPERATIONS list</font>
+<font color="#008844">;; MATERIAL list - (WOOD METAL PLASTIC ...)</font>
+<font color="#008844">;; PIECES list</font>
+<font color="#008844">;; LOCATION HOME or person's name</font>
+<font color="#008844">;;</font>
+
+(setq tools (send class :new '(power moveable operations
+ material pieces location)
+ '(number active-list)))
+
+(send tools :answer :isnew '()
+ '((setq number (if (null number) 1 (1+ number))
+ active-list (cons self active-list)
+ location 'home)))
+
+(send tools :answer :borrow '(by-who)
+ '((if (eq location 'home)
+ (setq location by-who)
+ (print <font color="#880000">"you can't"</font>))))
+
+(send tools :answer :return '()
+ '((if (eq location 'home)
+ (print <font color="#880000">"got it already"</font>)
+ (setq location 'home))))
+
+<font color="#008844">;; make HAND-TOOLS class</font>
+<font color="#008844">;; - with a different :ISNEW method</font>
+<font color="#008844">;; - new instance variable WEIGHT = &lt;number&gt; of pounds</font>
+<font color="#008844">;; - the rest is inherited from TOOLS</font>
+
+(setq hand-tools (send class :new '(weight) '() tools))
+
+(send hand-tools :answer :isnew '(pow op mat parts w-in)
+ '((setq power pow
+ moveable 'can-carry
+ operations op
+ material mat
+ pieces parts
+ weight w-in)
+ (send-super :isnew)))
+
+<font color="#008844">;; make SHOP-TOOLS class</font>
+<font color="#008844">;; - with a different :ISNEW method</font>
+<font color="#008844">;; - no new instance variables</font>
+<font color="#008844">;; - the rest is inherited from TOOLS</font>
+
+(setq shop-tools (send class :new '() '() tools))
+
+(send shop-tools :answer :isnew '(pow mov op mat parts)
+ '((setq power pow
+ moveable mov
+ operations op
+ material mat
+ pieces parts)
+ (send-super :isnew)))
+
+<font color="#008844">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</font>
+<font color="#008844">;;</font>
+<font color="#008844">;; Create instances of various tool classes</font>
+<font color="#008844">;;</font>
+<font color="#008844">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</font>
+
+(setq hand-drill (send hand-tools :new <font color="#008844">; make an instance - HAND-DRILL</font>
+ '(ac)
+ '(drill polish grind screw)
+ '(wood metal plastic)
+ '(drill drill-bits screw-bits buffer)
+ '2.5))
+
+(setq table-saw (send shop-tools :new <font color="#008844">; make an instance - TABLE-SAW</font>
+ '(ac)
+ 'fixed
+ '(rip cross-cut)
+ '(wood plastic)
+ '(saw blades fence)))
+
+(setq radial-arm (send shop-tools :new <font color="#008844">; make an instance = RADIAL-ARM</font>
+ '(ac)
+ 'can-roll
+ '(rip cross-cut)
+ '(wood plastic)
+ '(saw blades dust-bag)))
+</pre>
+
+<p>The following session shows how to use the tool definitions from the
+code above:</p>
+
+<pre class="example">
+&gt; (send hand-drill :borrow 'fred)
+FRED
+
+&gt; (send table-saw :return)
+"got it already"
+"got it already"
+
+&gt; (send hand-drill :borrow 'joe)
+"you can't"
+"you can't"
+
+&gt; (send hand-drill :return)
+HOME
+</pre>
+
+<p>Fred was able to borrow the '<nobr>hand-drill</nobr>'. When an attempt
+was made to return the '<nobr>table-saw</nobr>', it was already at home.
+<nobr>A second</nobr> attempt to borrow the '<nobr>hand-drill</nobr>'
+indicated that <nobr>&quot;you can't&quot;</nobr> because it was already
+<nobr>lent out</nobr>. Lastly, the '<nobr>hand-drill</nobr>' was returned
+successfully. <nobr>[Note that</nobr> the <nobr>&quot;got it
+already&quot;</nobr> and <nobr>&quot;you can't&quot;</nobr> strings show up
+twice in the display because the methods both print and return the
+string.)</p>
+
+<p>The following example shows the structure of the 'tools' object with the
+XLISP #ID numbers replaced by the related class and method names:</p>
+
+<pre class="example">
+&gt; (send tools :show)
+Object is #&lt;Object: #[<font color="#0066CC">tools</font>]&gt;, Class is #&lt;Object: #[<font color="#0066CC">class</font>]&gt;
+ MESSAGES = ((:RETURN . #&lt;Closure-:RETURN: #[<font color="#0000CC">tools-return-method</font>]&gt;)
+ (:BORROW . #&lt;Closure-:BORROW: #[<font color="#0000CC">tools-borrow-method</font>]&gt;)
+ (:ISNEW . #&lt;Closure-:ISNEW: #[<font color="#0000CC">tools-isnew-method</font>]&gt;))
+ IVARS = (POWER MOVEABLE OPERATIONS MATERIAL PIECES LOCATION)
+ CVARS = (NUMBER ACTIVE-LIST)
+ CVALS = #(3 (#&lt;Object: #[<font color="#0066CC">radial-arm</font>]&gt;
+ #&lt;Object: #[<font color="#0066CC">table-saw</font>]&gt;
+ #&lt;Object: #[<font color="#0066CC">hand-drill</font>]&gt;))
+ SUPERCLASS = #&lt;Object: #[<font color="#0066CC">object</font>]&gt;
+ IVARCNT = 6
+ IVARTOTAL = 6
+#&lt;Object: #[<font color="#0066CC">tools</font>]&gt;
+</pre>
+
+<p>The two 'tools' sub-classes 'hand-tools' and 'shop-tools' structure looks
+like:</p>
+
+<pre class="example">
+&gt; (send hand-tools :show)
+Object is #&lt;Object: #[<font color="#0066CC">hand-tools</font>]&gt;, Class is #&lt;Object: #[<font color="#0066CC">class</font>]&gt;
+ MESSAGES = ((:ISNEW . #&lt;Closure-:ISNEW: #[<font color="#0000CC">hand-tools-isnew-method</font>]&gt;))
+ IVARS = (WEIGHT)
+ CVARS = NIL
+ CVALS = NIL
+ SUPERCLASS = #&lt;Object: #[<font color="#0066CC">tools</font>]&gt;
+ IVARCNT = 1
+ IVARTOTAL = 7
+#&lt;Object: #[<font color="#0066CC">hand-tools</font>]&gt;
+
+&gt; (send shop-tools :show)
+Object is #&lt;Object: #[<font color="#0066CC">shop-tools</font>]&gt;, Class is #&lt;Object: #[<font color="#0066CC">class</font>]&gt;
+ MESSAGES = ((:ISNEW . #&lt;Closure-:ISNEW: #[<font color="#0000CC">shop-tools-isnew-method</font>]&gt;))
+ IVARS = NIL
+ CVARS = NIL
+ CVALS = NIL
+ SUPERCLASS = #&lt;Object: #[<font color="#0066CC">tools</font>]&gt;
+ IVARCNT = 0
+ IVARTOTAL = 6
+#&lt;Object: #[<font color="#0066CC">shop-tools</font>]&gt;
+</pre>
+
+<p>The class 'hand-tools' has an instance 'hand-drill' which looks like:</p>
+
+<pre class="example">
+&gt; (send hand-drill :show)
+Object is #&lt;Object: #[<font color="#0066CC">hand-drill</font>]&gt;, Class is #&lt;Object: #[<font color="#0066CC">hand-tools</font>]&gt;
+ WEIGHT = 2.5
+ POWER = (AC)
+ MOVEABLE = CAN-CARRY
+ OPERATIONS = (DRILL POLISH GRIND SCREW)
+ MATERIAL = (WOOD METAL PLASTIC)
+ PIECES = (DRILL DRILL-BITS SCREW-BITS BUFFER)
+ LOCATION = HOME
+#&lt;Object: #[<font color="#0066CC">hand-drill</font>]&gt;
+</pre>
+
+<p><nobr>&nbsp;&nbsp;<a href="#top">Back to top</a></nobr></p>
+
+<hr>
+
+<a href="../start.htm">Nyquist / XLISP 2.0</a>&nbsp; -&nbsp;
+<a href="../manual/contents.htm">Contents</a> |
+<a href="tutorials.htm">Tutorials</a> |
+<a href="../examples/examples.htm">Examples</a> |
+<a href="../reference/reference-index.htm">Reference</a>
+
+</body></html> \ No newline at end of file
diff --git a/docsrc/xlisp/xlisp-doc/tutorials/xobj-1.png b/docsrc/xlisp/xlisp-doc/tutorials/xobj-1.png
new file mode 100644
index 0000000..b22d557
--- /dev/null
+++ b/docsrc/xlisp/xlisp-doc/tutorials/xobj-1.png
Binary files differ
diff --git a/docsrc/xlisp/xlisp-no-sal.mss b/docsrc/xlisp/xlisp-no-sal.mss
new file mode 100644
index 0000000..ee48721
--- /dev/null
+++ b/docsrc/xlisp/xlisp-no-sal.mss
@@ -0,0 +1,3339 @@
+@define(codef, FaceCode T, size 11)
+@comment{In my original scribe conversion of the ascii xlisp documentation, I used
+ times roman fonts for xlisp function names and code text in general. To be
+ consistent with Nyquist documentation, I have changed the code font to xlcode
+ which is defined here. If this turns out to be a problem, redefine xlcode to
+ use the regular FaceCode. -RBD}
+@define(xlcode, FaceCode T, size 11)
+@textform(pragma=[])
+@section(Introduction)
+ XLISP is an experimental programming language combining some of
+ the features of Common Lisp with an object-oriented extension
+ capability. It was implemented to allow experimentation with
+ object-oriented programming on small computers.
+
+ Implementations of XLISP run on virtually every operating system.
+ XLISP is completely written in the programming language
+ C and is easily extended with user written built-in functions
+ and classes. It is available in source form to non-commercial
+ users.
+
+ Many Common Lisp functions are built into XLISP. In addition,
+ XLISP defines the objects Object and Class as primitives.
+ Object is the only class that has no superclass and hence is
+ the root of the class hierarchy tree. Class is the class of
+ which all classes are instances (it is the only object that is
+ an instance of itself).
+
+ This document is a brief description of XLISP. It assumes some
+ knowledge of LISP and some understanding of the concepts of
+ object-oriented programming.
+
+ I recommend the book @i(Lisp) by Winston and Horn and published by
+ Addison Wesley for learning Lisp. The first edition of this
+ book is based on MacLisp and the second edition is based on
+ Common Lisp.
+
+ You will probably also need a copy of @i(Common Lisp: The
+ Language) by Guy L. Steele, Jr., published by Digital Press to
+ use as a reference for some of the Common Lisp functions that
+ are described only briefly in this document.
+
+ @section(A Note From The Author)
+
+ If you have any problems with XLISP, feel free to contact me [me being David Betz - RBD] for
+ help or advice. Please remember that since XLISP is available
+ in source form in a high level language, many users [e.g. that Dannenberg fellow - RBD] have been
+ making versions available on a variety of machines. If you call
+ to report a problem with a specific version, I may not be able
+ to help you if that version runs on a machine to which I don't
+ have access. Please have the version number of the version that
+ you are running readily accessible before calling me.
+
+ If you find a bug in XLISP, first try to fix the bug yourself
+ using the source code provided. If you are successful in fixing
+ the bug, send the bug report along with the fix to me. If you
+ don't have access to a C compiler or are unable to fix a bug,
+ please send the bug report to me and I'll try to fix it.
+
+ Any suggestions for improvements will be welcomed. Feel free to
+ extend the language in whatever way suits your needs. However,
+ PLEASE DO NOT RELEASE ENHANCED VERSIONS WITHOUT CHECKING WITH ME
+ FIRST!! I would like to be the clearing house for new features
+ added to XLISP. If you want to add features for your own
+ personal use, go ahead. But, if you want to distribute your
+ enhanced version, contact me first. Please remember that the
+ goal of XLISP is to provide a language to learn and experiment
+ with LISP and object-oriented programming on small computers. I
+ don't want it to get so big that it requires megabytes of memory
+ to run.
+
+
+ @section(XLISP Command Loop)@index(XLISP Command Loop)@index(Command Loop)
+
+ When XLISP is started, it first tries to load the workspace
+ @code(xlisp.wks) from the current directory. If that file doesn't
+ exist, XLISP builds an initial workspace, empty except for the
+ built-in functions and symbols.
+
+ Then XLISP attempts to load @code(init.lsp) from the current
+ directory. It then loads any files named as parameters on the
+ command line (after appending @code(.lsp) to their names).
+
+ XLISP then issues the following prompt:
+@begin(example)
+ >
+@end(example)
+ This indicates that XLISP is waiting for an expression to be
+ typed.
+
+ When a complete expression has been entered, XLISP attempts to
+ evaluate that expression. If the expression evaluates
+ successfully, XLISP prints the result and then returns to the
+ initial prompt waiting for another expression to be typed.
+
+ @section(Special Characters)@index(control characters, XLISP)
+
+ When XLISP is running from a console, some control characters invoke operations:
+@begin(itemize)
+Backspace and Delete characters erase the previous character on the input line (if any).
+
+Control-U erases the entire input line.
+
+Control-C executes the TOP-LEVEL function.
+
+Control-G executes the CLEAN-UP function.
+
+Control-P executes the CONTINUE function.
+
+Control-B stops execution and enters the break command loop. Execution can be continued by typing Control-P or (CONTINUE).
+
+Control-E turns on character echoing (Linux and Mac OS X only).
+
+Control-F turns off character echoing (Linux and Mac OS X only).
+
+Control-T evaluates the INFO function.
+@end(itemize)
+
+ @section(Break Command Loop)@index(break)
+
+ When XLISP encounters an error while evaluating an expression,
+ it attempts to handle the error in the following way:
+
+ If the symbol @xlcode(*breakenable*@index(*breakenable*)) is
+ true, the message corresponding to the error is printed. If
+ the error is correctable, the correction message is printed.
+
+ If the symbol @xlcode(*tracenable*@index(*tracenable*)) is true, a trace back is printed.
+ The number of entries printed depends on the value of the symbol
+ @xlcode(*tracelimit*@index(*tracelimit*)). If this symbol is set to something other than a
+ number, the entire trace back stack is printed.
+
+ XLISP then enters a read/eval/print loop to allow the user to
+ examine the state of the interpreter in the context of the
+ error. This loop differs from the normal top-level
+ read/eval/print loop in that if the user invokes the function
+ @xlcode(continue), XLISP will continue from a correctable error. If
+ the user invokes the function @xlcode(clean-up), XLISP will abort the
+ break loop and return to the top level or the next lower
+ numbered break loop. When in a break loop, XLISP prefixes the
+ break level to the normal prompt.
+
+ If the symbol @xlcode(*breakenable*@index(*breakenable*)) is @xlcode(nil), XLISP looks for a
+ surrounding errset function. If one is found, XLISP examines
+ the value of the print flag. If this flag is true, the error
+ message is printed. In any case, XLISP causes the errset
+ function call to return @xlcode(nil).
+
+ If there is no surrounding errset function, XLISP prints the
+ error message and returns to the top level.
+
+ @section(Data Types)@index(XLISP Data Types)@index(Data Types)
+
+ There are several different data types available to XLISP
+ programmers.
+
+@begin(itemize)
+lists
+
+symbols
+
+strings
+
+integers
+
+characters
+
+floats
+
+objects
+
+arrays
+
+streams
+
+subrs (built-in functions)
+
+fsubrs (special forms)
+
+closures (user defined functions)
+@end(itemize)
+
+
+
+
+@section(The Evaluator)@index(evaluator)@index(XLISP evaluator)
+
+ The process of evaluation in XLISP:
+@begin(itemize)
+ Strings, integers, characters, floats, objects, arrays, streams,
+ subrs, fsubrs and closures evaluate to themselves.
+
+ Symbols act as variables and are evaluated by retrieving the
+ value associated with their current binding.
+
+ Lists are evaluated by examining the first element of the list
+ and then taking one of the following actions:
+@begin(itemize)
+ If it is a symbol, the functional binding of the symbol is
+ retrieved.
+
+ If it is a lambda expression, a closure is constructed for
+ the function described by the lambda expression.
+
+ If it is a subr, fsubr or closure, it stands for itself.
+
+ Any other value is an error.
+@end(itemize)
+ Then, the value produced by the previous step is examined:
+@begin(itemize)
+ If it is a subr or closure, the remaining list elements are
+ evaluated and the subr or closure is called with these
+ evaluated expressions as arguments.
+
+ If it is an fsubr, the fsubr is called using the remaining
+ list elements as arguments (unevaluated).
+
+ If it is a macro, the macro is expanded using the remaining
+ list elements as arguments (unevaluated). The macro
+ expansion is then evaluated in place of the original macro
+ call.
+@end(itemize)
+@end(itemize)
+
+@section(Lexical Conventions)@index(Lexical conventions)@index(XLISP Lexical Conventions)
+
+ The following conventions must be followed when entering XLISP
+ programs:
+
+ Comments in XLISP code begin with a semi-colon character and
+ continue to the end of the line.
+
+ Symbol names in XLISP can consist of any sequence of non-blank
+ printable characters except the following:
+@begin(example)
+ ( ) ' ` , " ;
+@end(example)
+ Uppercase and lowercase characters are not distinguished within
+ symbol names. All lowercase characters are mapped to uppercase
+ on input.
+
+ Integer literals consist of a sequence of digits optionally
+ beginning with a @code(+) or @code(-). The range of values an integer can
+ represent is limited by the size of a C @code(long) on the machine on
+ which XLISP is running.
+
+ Floating point literals consist of a sequence of digits
+ optionally beginning with a @code(+) or @code(-) and including an embedded
+ decimal point. The range of values a floating point number can
+ represent is limited by the size of a C @code(float) (@code(double) on
+ machines with 32 bit addresses) on the machine on which XLISP is
+ running.
+
+ Literal strings are sequences of characters surrounded by double
+ quotes. Within quoted strings the ``@code(\)'' character is used to
+ allow non-printable characters to be included. The codes
+ recognized are:
+@begin(itemize)
+@code(\\) means the character ``@code(\)''
+
+@code(\n) means newline
+
+@code(\t) means tab
+
+@code(\r) means return
+
+@code(\f) means form feed
+
+@code(\nnn) means the character whose octal code is nnn
+@end(itemize)
+
+@section(Readtables)@index(Readtables)
+
+ The behavior of the reader is controlled by a data structure
+ called a @i(readtable). The reader uses the symbol @xlcode(*readtable*@index(*readtable*)) to
+ locate the current readtable. This table controls the
+ interpretation of input characters. It is an array with 128
+ entries, one for each of the ASCII character codes. Each entry
+ contains one of the following things:
+@begin(itemize)
+ @xlcode(NIL) @itemsep Indicating an invalid character
+
+ @xlcode(:CONSTITUENT) @itemsep Indicating a symbol constituent
+
+ @xlcode(:WHITE-SPACE) @itemsep Indicating a whitespace character
+
+ @xlcode[(:TMACRO . @i(fun))] @itemsep Terminating readmacro
+
+ @xlcode[(:NMACRO . @i(fun))] @itemsep Non-terminating readmacro
+
+ @xlcode(:SESCAPE) @itemsep Single escape character ('\')
+
+ @xlcode(:MESCAPE) @itemsep Multiple escape character ('|')
+@end(itemize)
+
+ In the case of @xlcode(:TMACRO) and @xlcode(:NMACRO), the @i(fun) component is a
+ function. This can either be a built-in readmacro function or a
+ lambda expression. The function should take two parameters.
+ The first is the input stream and the second is the character
+ that caused the invocation of the readmacro. The readmacro
+ function should return @xlcode(NIL) to indicate that the character should
+ be treated as white space or a value consed with @xlcode(NIL) to indicate
+ that the readmacro should be treated as an occurence of the
+ specified value. Of course, the readmacro code is free to read
+ additional characters from the input stream.
+
+ XLISP defines several useful read macros@index(read macros):
+@begin(itemize)
+ @xlcode(')@i[<expr>] == @xlcode{(quote} @i[<expr>]@xlcode{)}
+
+ @xlcode(#')@i[<expr>] == @xlcode{(function} @i[<expr>]@xlcode{)}
+
+ @xlcode{#(}@i[<expr>]...@xlcode{)} == an array of the specified expressions
+
+ @xlcode(#x)@i[<hdigits>] == a hexadecimal number (0-9,A-F)
+
+ @xlcode(#o)@i[<odigits>] == an octal number (0-7)
+
+ @xlcode(#b)@i[<bdigits>] == a binary number (0-1)
+
+ @xlcode(#\)@i[<char>] == the ASCII code of the character
+
+ @xlcode(#|) ... @xlcode(|#) == a comment
+
+ @xlcode(#:)@i[<symbol>] == an uninterned symbol
+
+ @xlcode(`)@i[<expr>] == @xlcode{(backquote} @i[<expr>]@xlcode{)}
+
+ @xlcode(,)@i[<expr>] == @xlcode{(comma} @i[<expr>]@xlcode{)}
+
+ @xlcode(,@@)@i[<expr>] == @xlcode{(comma-at} @i[<expr>]@xlcode{)}
+
+@end(itemize)
+@section(Lambda Lists)@index(Lambda Lists)
+
+ There are several forms in XLISP that require that a ``lambda
+ list'' be specified. A lambda list is a definition of the
+ arguments accepted by a function. There are four different
+ types of arguments.
+
+ The lambda list starts with required arguments. Required
+ arguments must be specified in every call to the function.
+
+ The required arguments are followed by the @xlcode(&optional) arguments.
+ Optional arguments may be provided or omitted in a call. An
+ initialization expression may be specified to provide a default
+ value for an @xlcode(&optional) argument if it is omitted from a call.
+ If no initialization expression is specified, an omitted
+ argument is initialized to @xlcode(NIL). It is also possible to provide
+ the name of a @xlcode(supplied-p) variable that can be used to
+ determine if a call provided a value for the argument or if the
+ initialization expression was used. If specified, the supplied-
+ p variable will be bound to T if a value was specified in the
+ call and @xlcode(NIL) if the default value was used.
+
+ The @xlcode(&optional) arguments are followed by the @xlcode(&rest) argument. The
+ @xlcode(&rest) argument gets bound to the remainder of the argument list
+ after the required and @xlcode(&optional) arguments have been removed.
+
+ The @xlcode(&rest) argument is followed by the @xlcode(&key) arguments. When a
+ keyword argument is passed to a function, a pair of values
+ appears in the argument list. The first expression in the pair
+ should evaluate to a keyword symbol (a symbol that begins with a
+ ``@code(:)''). The value of the second expression is the value of the
+ keyword argument. Like @xlcode(&optional) arguments, @xlcode(&key) arguments can
+ have initialization expressions and supplied-p variables. In
+ addition, it is possible to specify the keyword to be used in a
+ function call. If no keyword is specified, the keyword obtained
+ by adding a ``@code(:)'' to the beginning of the keyword argument symbol
+ is used. In other words, if the keyword argument symbol is
+ @xlcode(foo), the keyword will be @xlcode(:foo).
+
+ The @xlcode(&key) arguments are followed by the @xlcode(&aux) variables. These
+ are local variables that are bound during the evaluation of the
+ function body. It is possible to have initialization
+ expressions for the @xlcode(&aux) variables.
+
+ Here is the complete syntax for lambda lists:
+@begin(display)
+ (@i<rarg>...
+ [@xlcode(&optional) [@i<oarg> | (@i<oarg> [@i<init> [@i<svar>]])]...]
+ [@xlcode(&rest) @i<rarg>]
+ [@xlcode(&key)
+ [@i<karg> | ([@i<karg> | (@i<key> @i<karg>)] [@i<init> [@i<svar>]])]...
+ @xlcode(&allow)-other-keys]
+ [@xlcode(&aux)
+ [@i<aux> | (@i<aux> [@i<init>])]...])
+
+ where:
+
+ @i<rarg> is a required argument symbol
+ @i<oarg> is an @xlcode(&optional) argument symbol
+ @i<rarg> is the @xlcode(&rest) argument symbol
+ @i<karg> is a @xlcode(&key) argument symbol
+ @i<key> is a keyword symbol
+ @i<aux> is an auxiliary variable symbol
+ @i<init> is an initialization expression
+ @i<svar> is a supplied-p variable symbol
+@end(display)
+
+
+@section(Objects)@index(Objects)@label(objects-sec)
+
+ Definitions:
+@begin(itemize)
+selector @itemsep a symbol used to select an appropriate method
+
+message @itemsep a selector and a list of actual arguments
+
+method @itemsep the code that implements a message
+@end(itemize)
+ Since XLISP was created to provide a simple basis for
+ experimenting with object-oriented programming, one of the
+ primitive data types included is @i(object). In XLISP, an object
+ consists of a data structure containing a pointer to the
+ object's class as well as an array containing the values of the
+ object's instance variables.
+
+ Officially, there is no way to see inside an object (look at the
+ values of its instance variables). The only way to communicate
+ with an object is by sending it a message.
+
+ You can send a message to an object using the @xlcode(send) function.
+ This function takes the object as its first argument, the
+ message selector as its second argument (which must be a symbol)
+ and the message arguments as its remaining arguments.
+
+ The @xlcode(send) function determines the class of the receiving object
+ and attempts to find a method corresponding to the message
+ selector in the set of messages defined for that class. If the
+ message is not found in the object's class and the class has a
+ super-class, the search continues by looking at the messages
+ defined for the super-class. This process continues from one
+ super-class to the next until a method for the message is found.
+ If no method is found, an error occurs.
+
+@begin(comment)
+THIS IS WRONG -- I DON'T KNOW IF IT WAS CORRECT IN THE ORIGINAL XLISP. -RBD
+ A message can also be sent from the body of a method by using
+ the current object, but the method lookup starts with the
+ object's superclass rather than its class. This allows a
+ subclass to invoke a standard method in its parent class even
+ though it overrides that method with its own specialized
+ version.
+@end(comment)
+
+ When a method is found, the evaluator binds the receiving object
+ to the symbol @xlcode(self) and evaluates the method using the
+ remaining elements of the original list as arguments to the
+ method. These arguments are always evaluated prior to being
+ bound to their corresponding formal arguments. The result of
+ evaluating the method becomes the result of the expression.
+
+ Within the body of a method, a message can be sent to the current
+ object by calling the @xlcode[(send self ...)]. The method lookup
+ starts with the object's class regardless of the class containing
+ the current method.
+
+ Sometimes it is desirable to invoke a general method in a superclass
+ even when it is overridden by a more specific method in a subclass.
+ This can be accomplished by calling @xlcode(send-super), which begins
+ the method lookup in the superclass of the class defining the current
+ method rather than in the class of the current object.
+
+ The @xlcode(send-super) function takes a selector as its first argument
+ (which must be a symbol) and the message arguments as its remaining
+ arguments. Notice that @xlcode(send-super) can only be sent from within
+ a method, and the target of the message is always the current object
+ (@xlcode(self)). @xlcode[(send-super ...)] is similar to
+ @xlcode[(send self ...)] except that method lookup begins in the
+ superclass of the class containing the current method
+ rather than the class of the current object.
+
+@section(The ``Object'' Class)@index(Object Class)
+
+@xlcode(Object)@index(Object) @itemsep the top of the class hierarchy.
+
+Messages:
+@begin(fdescription)
+@xlcode(:show@index(:show)) @itemsep show an object's instance variables.
+@begin(pdescription)
+returns @itemsep the object
+@end(pdescription)
+@blankspace(1)
+
+@xlcode{:class@index(:class)} @itemsep return the class of an object
+@begin(pdescription)
+returns @itemsep the class of the object
+@end(pdescription)
+@blankspace(1)
+
+@xlcode{:isa@index(:isa)} @i(class) @itemsep test if object inherits from class
+@begin(pdescription)
+returns @itemsep @xlcode(t) if object is an instance of @i(class) or a subclass of @i(class), otherwise @xlcode(nil)
+@end(pdescription)
+@blankspace(1)
+
+@xlcode(:isnew@index(:isnew)) @itemsep the default object initialization routine
+@begin(pdescription)
+returns @itemsep the object
+@end(pdescription)
+@end(fdescription)
+
+@section(The ``Class'' Class)@index(Class class)
+
+@xlcode(Class@index(Class)) @itemsep class of all object classes (including itself)
+
+ Messages:
+
+@begin(fdescription)
+ @xlcode(:new@index(:new)) @itemsep create a new instance of a class
+@begin(pdescription)
+ returns @itemsep the new class object
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode(:isnew@index(:isnew)) @i<ivars> [@i<cvars> [@i<super>]] @itemsep initialize a new class
+@begin(pdescription)
+ @i<ivars> @itemsep the list of instance variable symbols
+
+ @i<cvars> @itemsep the list of class variable symbols
+
+ @i<super> @itemsep the superclass (default is object)
+
+ returns @itemsep the new class object
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode(:answer@index(:answer)) @i<msg> @i<fargs> @i<code> @itemsep add a message to a class
+@begin(pdescription)
+ @i<msg> @itemsep the message symbol
+
+ @i<fargs> @itemsep the formal argument list (lambda list)
+
+ @i<code> @itemsep a list of executable expressions
+
+ returns @itemsep the object
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+ When a new instance of a class is created by sending the message
+ @xlcode(:new) to an existing class, the message @xlcode(:isnew) followed by
+ whatever parameters were passed to the @xlcode(:new) message is sent to
+ the newly created object.
+
+ When a new class is created by sending the @xlcode(:new) message to the
+ object @xlcode(Class), an optional parameter may be specified
+ indicating the superclass of the new class. If this parameter
+ is omitted, the new class will be a subclass of @xlcode(Object). A
+ class inherits all instance variables, class variables, and
+ methods from its super-class.
+
+@section(Profiling)@index(profiling)
+The Xlisp 2.0 release has been extended with a profiling facility, which counts how many times and where @xlcode(eval) is executed. A separate count is maintained for each named function, closure, or macro, and a count indicates an @xlcode(eval) in the immediately (lexically) enclosing named function, closure, or macro. Thus, the count gives an indication of the amount of time spent in a function, not counting nested function calls. The list of all functions executed is maintained on the global @xlcode(*profile*) variable. These functions in turn have @xlcode(*profile*) properties, which maintain the counts. The profile system merely increments counters and puts symbols on the @xlcode(*profile*) list. It is up to the user to initialize data and gather results. Profiling is turned on or off with the @xlcode(profile) function. Unfortunately, methods cannot be profiled with this facility.
+
+@label(symbols-sec)
+@section(Symbols)@index(symbols)
+@begin(itemize)
+@codef(self)@pragma(defn)@index(self) @dash the current object (within a method context)
+
+@codef(*obarray*@pragma(defn)@index(*obarray*)) @dash the object hash table
+
+@codef(*standard-input*@pragma(defn)@index(*standard-input*)) @dash the standard input stream
+
+@codef(*standard-output*@pragma(defn)@index(*standard-output*)) @dash the standard output stream
+
+@codef(*error-output*@pragma(defn)@index(*error-output*)) @dash the error output stream
+
+@codef(*trace-output*@pragma(defn)@index(*trace-output*)) @dash the trace output stream
+
+@codef(*debug-io*@pragma(defn)@index(*debug-io*)) @dash the debug i/o stream
+
+@codef(*breakenable*@pragma(defn)@index(*breakenable*)) @dash flag controlling entering break loop on errors
+
+@codef(*tracelist*@pragma(defn)@index(*tracelist*)) @dash list of names of functions to trace
+
+@codef(*tracenable*@pragma(defn)@index(*tracenable*)) @dash enable trace back printout on errors
+
+@codef(*tracelimit*@pragma(defn)@index(*tracelimit*)) @dash number of levels of trace back information
+
+@codef(*evalhook*@pragma(defn)@index(*evalhook*)) @dash user substitute for the evaluator function
+
+@codef(*applyhook*@pragma(defn)@index(*applyhook*)) @dash (not yet implemented)
+
+@codef(*readtable*@pragma(defn)@index(*readtable*)) @dash the current readtable
+
+@codef(*unbound*@pragma(defn)@index(*unbound*)) @dash indicator for unbound symbols
+
+@codef(*gc-flag*@pragma(defn)@index(*gc-flag*)) @dash controls the printing of gc messages
+
+@codef(*gc-hook*@pragma(defn)@index(*gc-hook*)) @dash function to call after garbage collection
+
+@codef(*integer-format*@pragma(defn)@index(*integer-format*)) @dash format for printing integers (``%d'' or ``%ld'')
+
+@codef(*float-format*@pragma(defn)@index(*float-format*)) @dash format for printing floats (``%g'')
+
+@codef(*print-case*@pragma(defn)@index(*print-case*)) @dash symbol output case (:upcase or :downcase)
+@end(itemize)
+
+ There are several symbols maintained by the read/eval/print
+ loop. The symbols @code(+), @code(++), and @code(+++) are bound to the most
+ recent three input expressions. The symbols @code(*), @code(**) and @code(***)
+ are bound to the most recent three results. The symbol @code(-) is
+ bound to the expression currently being evaluated. It becomes
+ the value of @code(+) at the end of the evaluation.
+@section(Evaluation Functions)@index(evaluation functions)
+@begin(fdescription)
+ (eval@pragma(defn)@index(eval) @i<expr>) @itemsep evaluate an xlisp expression
+@begin(pdescription)
+ @i<expr> @itemsep the expression to be evaluated
+
+ returns @itemsep the result of evaluating the expression
+@end(pdescription)
+@blankspace(1)
+
+ (apply@pragma(defn)@index(apply) @i<fun> @i<args>) @itemsep apply a function to a list of arguments
+@begin(pdescription)
+ @i<fun> @itemsep the function to apply (or function symbol)
+
+ @i<args> @itemsep the argument list
+
+ returns @itemsep the result of applying the function to the arguments
+@end(pdescription)
+@blankspace(1)
+
+ (funcall@pragma(defn)@index(funcall) @i<fun> @i<arg>...) @itemsep call a function with arguments
+@begin(pdescription)
+ @i<fun> @itemsep the function to call (or function symbol)
+
+ @i<arg> @itemsep arguments to pass to the function
+
+ returns @itemsep the result of calling the function with the arguments
+@end(pdescription)
+@blankspace(1)
+
+ (quote@pragma(defn)@index(quote) @i<expr>) @itemsep return an expression unevaluated
+@begin(pdescription)
+ @i<expr> @itemsep the expression to be quoted (quoted)
+
+ returns @itemsep @i<expr> unevaluated
+@end(pdescription)
+@blankspace(1)
+
+ (function@pragma(defn)@index(function) @i<expr>) @itemsep get the functional interpretation
+
+@begin(pdescription)
+ @i<expr> @itemsep the symbol or lambda expression (quoted)
+
+ returns @itemsep the functional interpretation
+
+@end(pdescription)
+@blankspace(1)
+
+ (backquote@pragma(defn)@index(backquote) @i<expr>) @itemsep fill in a template
+
+@begin(pdescription)
+ @i<expr> @itemsep the template
+
+ returns @itemsep a copy of the template with comma and comma-at
+
+ expressions expanded
+@end(pdescription)
+@blankspace(1)
+
+ (lambda@pragma(defn)@index(lambda) @i<args> @i<expr>...) @itemsep make a function closure
+
+@begin(pdescription)
+ @i<args> @itemsep formal argument list (lambda list) (quoted)
+
+ @i<expr> @itemsep expressions of the function body
+
+ returns @itemsep the function closure
+
+@end(pdescription)
+@blankspace(1)
+
+ (get-lambda-expression@pragma(defn)@index(get-lambda-expression) @i<closure>) @itemsep get the lambda expression
+
+@begin(pdescription)
+ @i<closure> @itemsep the closure
+
+ returns @itemsep the original lambda expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (macroexpand@pragma(defn)@index(macroexpand) @i<form>) @itemsep recursively expand macro calls
+
+@begin(pdescription)
+ @i<form> @itemsep the form to expand
+
+ returns @itemsep the macro expansion
+
+@end(pdescription)
+@blankspace(1)
+
+ (macroexpand-1@pragma(defn)@index(macroexpand-1) @i<form>) @itemsep expand a macro call
+
+@begin(pdescription)
+ @i<form> @itemsep the macro call form
+
+ returns @itemsep the macro expansion
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+
+@section(Symbol Functions)@index(Symbol Functions)
+@begin(fdescription)
+ (set@pragma(defn)@index(set) @i<sym> @i<expr>) @itemsep set the value of a symbol
+@begin(pdescription)
+ @i<sym> @itemsep the symbol being set
+
+ @i<expr> @itemsep the new value
+
+ returns @itemsep the new value
+
+@end(pdescription)
+@blankspace(1)
+
+ (setq@pragma(defn)@index(setq) [@i<sym> @i<expr>]...) @itemsep set the value of a symbol
+@begin(pdescription)
+ @i<sym> @itemsep the symbol being set (quoted)
+
+ @i<expr> @itemsep the new value
+
+ returns @itemsep the new value
+
+@end(pdescription)
+@blankspace(1)
+
+ (psetq@pragma(defn)@index(psetq) [@i<sym> @i<expr>]...) @itemsep parallel version of setq
+@begin(pdescription)
+ @i<sym> @itemsep the symbol being set (quoted)
+
+ @i<expr> @itemsep the new value
+
+ returns @itemsep the new value
+
+@end(pdescription)
+@blankspace(1)
+
+ (setf@pragma(defn)@index(setf) [@i<place> @i<expr>]...) @itemsep set the value of a field
+@begin(pdescription)
+ @i<place> @itemsep the field specifier (quoted):
+
+@begin(pdescription)
+ @i<sym> @itemsep set value of a symbol
+
+ (car @i<expr>) @itemsep set car of a cons node
+
+ (cdr @i<expr>) @itemsep set cdr of a cons node
+
+ (nth @i<n> @i<expr>) @itemsep set nth car of a list
+
+ (aref @i<expr> @i<n>) @itemsep set nth element of an array
+
+ (get @i<sym> @i<prop>) @itemsep set value of a property
+
+ (symbol-value @i<sym>) @itemsep set value of a symbol
+
+ (symbol-function @i<sym>) @itemsep set functional value of a symbol
+
+ (symbol-plist @i<sym>) @itemsep set property list of a symbol
+
+@end(pdescription)@pragma(stopcodef)
+ @i<expr> @itemsep the new value
+
+ returns @itemsep the new value
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ (defun@pragma(defn)@index(defun) @i<sym> @i<fargs> @i<expr>...) @itemsep define a function
+
+@pragma(startcodef)
+ (defmacro@pragma(defn)@index(defmacro) @i<sym> @i<fargs> @i<expr>...) @itemsep define a macro
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep symbol being defined (quoted)
+
+ @i<fargs> @itemsep formal argument list (lambda list) (quoted)
+
+ @i<expr> @itemsep expressions constituting the body of the
+
+ function (quoted)
+ returns @itemsep the function symbol
+
+@end(pdescription)
+@blankspace(1)
+
+ (gensym@pragma(defn)@index(gensym) [@i<tag>]) @itemsep generate a symbol
+@begin(pdescription)
+ @i<tag> @itemsep string or number
+
+ returns @itemsep the new symbol
+
+@end(pdescription)
+@blankspace(1)
+
+(intern@pragma(defn)@index(intern) @i<pname>) @itemsep make an interned symbol
+@begin(pdescription)
+ @i<pname> @itemsep the symbol's print name string
+
+ returns @itemsep the new symbol
+
+@end(pdescription)
+@blankspace(1)
+
+ (make-symbol@pragma(defn)@index(make-symbol) @i<pname>) @itemsep make an uninterned symbol
+@begin(pdescription)
+ @i<pname> @itemsep the symbol's print name string
+
+ returns @itemsep the new symbol
+
+@end(pdescription)
+@blankspace(1)
+
+ (symbol-name@pragma(defn)@index(symbol-name) @i<sym>) @itemsep get the print name of a symbol
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep the symbol's print name
+
+@end(pdescription)
+@blankspace(1)
+
+ (symbol-value@pragma(defn)@index(symbol-value) @i<sym>) @itemsep get the value of a symbol
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep the symbol's value
+
+@end(pdescription)
+@blankspace(1)
+
+ (symbol-function@pragma(defn)@index(symbol-function) @i<sym>) @itemsep get the functional value of a symbol
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep the symbol's functional value
+
+@end(pdescription)
+@blankspace(1)
+
+ (symbol-plist@pragma(defn)@index(symbol-plist) @i<sym>) @itemsep get the property list of a symbol
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep the symbol's property list
+
+@end(pdescription)
+@blankspace(1)
+
+ (hash@pragma(defn)@index(hash) @i<sym> @i<n>) @itemsep compute the hash index for a symbol
+@begin(pdescription)
+ @i<sym> @itemsep the symbol or string
+
+ @i<n> @itemsep the table size (integer)
+
+ returns @itemsep the hash index (integer)
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Property List Functions)@index(Property List Functions)
+@begin(fdescription)
+ (get@pragma(defn)@index(get) @i<sym> @i<prop>) @itemsep get the value of a property
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ @i<prop> @itemsep the property symbol
+
+ returns @itemsep the property value or @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (putprop@pragma(defn)@index(putprop) @i<sym> @i<val> @i<prop>) @itemsep put a property onto a property list
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ @i<val> @itemsep the property value
+
+ @i<prop> @itemsep the property symbol
+
+ returns @itemsep the property value
+
+@end(pdescription)
+@blankspace(1)
+
+ (remprop@pragma(defn)@index(remprop) @i<sym> @i<prop>) @itemsep remove a property
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ @i<prop> @itemsep the property symbol
+
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Array Functions)@index(Array Functions)
+@begin(fdescription)
+ (aref@pragma(defn)@index(aref) @i<array> @i<n>) @itemsep get the nth element of an array
+@begin(pdescription)
+ @i<array> @itemsep the array
+
+ @i<n> @itemsep the array index (integer)
+
+ returns @itemsep the value of the array element
+
+@end(pdescription)
+@blankspace(1)
+
+ (make-array@pragma(defn)@index(make-array) @i<size>) @itemsep make a new array
+@begin(pdescription)
+ @i<size> @itemsep the size of the new array (integer)
+
+ returns @itemsep the new array
+
+@end(pdescription)
+@blankspace(1)
+
+ (vector@pragma(defn)@index(vector) @i<expr>...) @itemsep make an initialized vector
+@begin(pdescription)
+ @i<expr> @itemsep the vector elements
+
+ returns @itemsep the new vector
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(List Functions)@index(List Functions)
+@begin(fdescription)
+ (car@pragma(defn)@index(car) @i<expr>) @itemsep return the car of a list node
+@begin(pdescription)
+ @i<expr> @itemsep the list node
+
+ returns @itemsep the car of the list node
+
+@end(pdescription)
+@blankspace(1)
+
+ (cdr@pragma(defn)@index(cdr) @i<expr>) @itemsep return the cdr of a list node
+@begin(pdescription)
+ @i<expr> @itemsep the list node
+
+ returns @itemsep the cdr of the list node
+
+@end(pdescription)
+@blankspace(1)
+
+ (c@i(xx)r@index(cxxr) @i<expr>) @itemsep all c@i(xx)r combinations
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ (c@i(xxx)r@index(cxxxr) @i<expr>) @itemsep all c@i(xxx)r combinations
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ (c@i(xxxx)r@index(cxxxxr) @i<expr>) @itemsep all c@i(xxxx)r combinations
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ (first@pragma(defn)@index(first) @i<expr>) @itemsep a synonym for car
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ (second@pragma(defn)@index(second) @i<expr>) @itemsep a synonym for cadr
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ (third@pragma(defn)@index(third) @i<expr>) @itemsep a synonym for caddr
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ (fourth@pragma(defn)@index(fourth) @i<expr>) @itemsep a synonym for cadddr
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ (rest@pragma(defn)@index(rest) @i<expr>) @itemsep a synonym for cdr
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ (cons@pragma(defn)@index(cons) @i<expr1> @i<expr2>) @itemsep construct a new list node
+@begin(pdescription)
+ @i<expr1> @itemsep the car of the new list node
+
+ @i<expr2> @itemsep the cdr of the new list node
+
+ returns @itemsep the new list node
+
+@end(pdescription)
+@blankspace(1)
+
+ (list@pragma(defn)@index(list) @i<expr>...) @itemsep create a list of values
+@begin(pdescription)
+ @i<expr> @itemsep expressions to be combined into a list
+
+ returns @itemsep the new list
+
+@end(pdescription)
+@blankspace(1)
+
+ (append@pragma(defn)@index(append) @i<expr>...) @itemsep append lists
+@begin(pdescription)
+ @i<expr> @itemsep lists whose elements are to be appended
+
+ returns @itemsep the new list
+
+@end(pdescription)
+@blankspace(1)
+
+ (reverse@pragma(defn)@index(reverse) @i<expr>) @itemsep reverse a list
+@begin(pdescription)
+ @i<expr> @itemsep the list to reverse
+
+ returns @itemsep a new list in the reverse order
+
+@end(pdescription)
+@blankspace(1)
+
+ (last@pragma(defn)@index(last) @i<list>) @itemsep return the last list node of a list
+@begin(pdescription)
+ @i<list> @itemsep the list
+
+ returns @itemsep the last list node in the list
+
+@end(pdescription)
+@blankspace(1)
+
+ (member@pragma(defn)@index(member) @i<expr> @i<list> &key :test :test-not) @itemsep find an expression in a list
+@begin(pdescription)
+ @i<expr> @itemsep the expression to find
+
+ @i<list> @itemsep the list to search
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep the remainder of the list starting with the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (assoc@pragma(defn)@index(assoc) @i<expr> @i<alist> &key :test :test-not) @itemsep find an expression in an a-list
+@begin(pdescription)
+ @i<expr> @itemsep the expression to find
+
+ @i<alist> @itemsep the association list
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep the alist entry or @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (remove@pragma(defn)@index(remove) @i<expr> @i<list> &key :test :test-not) @itemsep remove elements from a list
+@begin(pdescription)
+ @i<expr> @itemsep the element to remove
+
+ @i<list> @itemsep the list
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep copy of list with matching expressions removed
+
+@end(pdescription)
+@blankspace(1)
+
+ (remove-if@pragma(defn)@index(remove-if) @i<test> @i<list>) @itemsep remove elements that pass test
+@begin(pdescription)
+ @i<test> @itemsep the test predicate
+
+ @i<list> @itemsep the list
+
+ returns @itemsep copy of list with matching elements removed
+
+@end(pdescription)
+@blankspace(1)
+
+ (remove-if-not@pragma(defn)@index(remove-if-not) @i<test> @i<list>) @itemsep remove elements that fail test
+@begin(pdescription)
+ @i<test> @itemsep the test predicate
+
+ @i<list> @itemsep the list
+
+ returns @itemsep copy of list with non-matching elements removed
+
+@end(pdescription)
+@blankspace(1)
+
+ (length@pragma(defn)@index(length) @i<expr>) @itemsep find the length of a list, vector or string
+@begin(pdescription)
+ @i<expr> @itemsep the list, vector or string
+
+ returns @itemsep the length of the list, vector or string
+
+@end(pdescription)
+@blankspace(1)
+
+ (nth@pragma(defn)@index(nth) @i<n> @i<list>) @itemsep return the nth element of a list
+@begin(pdescription)
+ @i<n> @itemsep the number of the element to return (zero origin)
+
+ @i<list> @itemsep the list
+
+ returns @itemsep the nth element or @xlcode(nil) if the list isn't that long
+
+@end(pdescription)
+@blankspace(1)
+
+ (nthcdr@pragma(defn)@index(nthcdr) @i<n> @i<list>) @itemsep return the nth cdr of a list
+@begin(pdescription)
+ @i<n> @itemsep the number of the element to return (zero origin)
+
+ @i<list> @itemsep the list
+
+ returns @itemsep the nth cdr or @xlcode(nil) if the list isn't that long
+
+@end(pdescription)
+@blankspace(1)
+
+ (mapc@pragma(defn)@index(mapc) @i<fcn> @i<list1> @i<list>...) @itemsep apply function to successive cars
+@begin(pdescription)
+ @i<fcn> @itemsep the function or function name
+
+ @i<listn> @itemsep a list for each argument of the function
+
+ returns @itemsep the first list of arguments
+
+@end(pdescription)
+@blankspace(1)
+
+ (mapcar@pragma(defn)@index(mapcar) @i<fcn> @i<list1> @i<list>...) @itemsep apply function to successive cars
+@begin(pdescription)
+ @i<fcn> @itemsep the function or function name
+
+ @i<listn> @itemsep a list for each argument of the function
+
+ returns @itemsep a list of the values returned
+
+@end(pdescription)
+@blankspace(1)
+
+ (mapl@pragma(defn)@index(mapl) @i<fcn> @i<list1> @i<list>...) @itemsep apply function to successive cdrs
+@begin(pdescription)
+ @i<fcn> @itemsep the function or function name
+
+ @i<listn> @itemsep a list for each argument of the function
+
+ returns @itemsep the first list of arguments
+
+@end(pdescription)
+@blankspace(1)
+
+ (maplist@pragma(defn)@index(maplist) @i<fcn> @i<list1> @i<list>...) @itemsep apply function to successive cdrs
+@begin(pdescription)
+ @i<fcn> @itemsep the function or function name
+
+ @i<listn> @itemsep a list for each argument of the function
+
+ returns @itemsep a list of the values returned
+
+@end(pdescription)
+@blankspace(1)
+
+ (subst@pragma(defn)@index(subst) @i<to> @i<from> @i<expr> &key :test :test-not) @itemsep substitute expressions
+@begin(pdescription)
+ @i<to> @itemsep the new expression
+
+ @i<from> @itemsep the old expression
+
+ @i<expr> @itemsep the expression in which to do the substitutions
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep the expression with substitutions
+
+@end(pdescription)
+@blankspace(1)
+
+ (sublis@pragma(defn)@index(sublis) @i<alist> @i<expr> &key :test :test-not) @itemsep substitute with an a-list
+@begin(pdescription)
+ @i<alist> @itemsep the association list
+
+ @i<expr> @itemsep the expression in which to do the substitutions
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep the expression with substitutions
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Destructive List Functions)@index(Destructive List Functions)
+@begin(fdescription)
+ (rplaca@pragma(defn)@index(rplaca) @i<list> @i<expr>) @itemsep replace the car of a list node
+@begin(pdescription)
+ @i<list> @itemsep the list node
+
+ @i<expr> @itemsep the new value for the car of the list node
+
+ returns @itemsep the list node after updating the car
+
+@end(pdescription)
+@blankspace(1)
+
+ (rplacd@pragma(defn)@index(rplacd) @i<list> @i<expr>) @itemsep replace the cdr of a list node
+@begin(pdescription)
+ @i<list> @itemsep the list node
+
+ @i<expr> @itemsep the new value for the cdr of the list node
+
+ returns @itemsep the list node after updating the cdr
+
+@end(pdescription)
+@blankspace(1)
+
+ (nconc@pragma(defn)@index(nconc) @i<list>...) @itemsep destructively concatenate lists
+@begin(pdescription)
+ @i<list> @itemsep lists to concatenate
+
+ returns @itemsep the result of concatenating the lists
+
+@end(pdescription)
+@blankspace(1)
+
+ (delete@pragma(defn)@index(delete) @i<expr> &key :test :test-not) @itemsep delete elements from a list
+@begin(pdescription)
+ @i<expr> @itemsep the element to delete
+
+ @i<list> @itemsep the list
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep the list with the matching expressions deleted
+
+@end(pdescription)
+@blankspace(1)
+
+ (delete-if@pragma(defn)@index(delete-if) @i<test> @i<list>) @itemsep delete elements that pass test
+@begin(pdescription)
+ @i<test> @itemsep the test predicate
+
+ @i<list> @itemsep the list
+
+ returns @itemsep the list with matching elements deleted
+
+@end(pdescription)
+@blankspace(1)
+
+ (delete-if-not@pragma(defn)@index(delete-if-not) @i<test> @i<list>) @itemsep delete elements that fail test
+@begin(pdescription)
+ @i<test> @itemsep the test predicate
+
+ @i<list> @itemsep the list
+
+ returns @itemsep the list with non-matching elements deleted
+
+@end(pdescription)
+@blankspace(1)
+
+ (sort@pragma(defn)@index(sort) @i<list> @i<test>) @itemsep sort a list
+@begin(pdescription)
+ @i<list> @itemsep the list to sort
+
+ @i<test> @itemsep the comparison function
+
+ returns @itemsep the sorted list
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Predicate Functions)@index(Predicate Functions)
+@begin(fdescription)
+ (atom@pragma(defn)@index(atom) @i<expr>) @itemsep is this an atom?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is an atom, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (symbolp@pragma(defn)@index(symbolp) @i<expr>) @itemsep is this a symbol?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the expression is a symbol, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (numberp@pragma(defn)@index(numberp) @i<expr>) @itemsep is this a number?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the expression is a number, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (null@pragma(defn)@index(null) @i<expr>) @itemsep is this an empty list?
+@begin(pdescription)
+ @i<expr> @itemsep the list to check
+
+ returns @itemsep @xlcode(t) if the list is empty, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (not@pragma(defn)@index(not) @i<expr>) @itemsep is this false?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ return @itemsep @xlcode(t) if the value is @xlcode(nil), @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (listp@pragma(defn)@index(listp) @i<expr>) @itemsep is this a list?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a cons or @xlcode(nil), @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (endp@pragma(defn)@index(endp) @i<list>) @itemsep is this the end of a list
+@begin(pdescription)
+ @i<list> @itemsep the list
+
+ returns @itemsep @xlcode(t) if the value is @xlcode(nil), @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (consp@pragma(defn)@index(consp) @i<expr>) @itemsep is this a non-empty list?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a cons, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (integerp@pragma(defn)@index(integerp) @i<expr>) @itemsep is this an integer?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is an integer, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (floatp@pragma(defn)@index(floatp) @i<expr>) @itemsep is this a float?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a float, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (stringp@pragma(defn)@index(stringp) @i<expr>) @itemsep is this a string?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a string, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (characterp@pragma(defn)@index(characterp) @i<expr>) @itemsep is this a character?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a character, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (arrayp@pragma(defn)@index(arrayp) @i<expr>) @itemsep is this an array?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is an array, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (streamp@pragma(defn)@index(streamp) @i<expr>) @itemsep is this a stream?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a stream, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (objectp@pragma(defn)@index(objectp) @i<expr>) @itemsep is this an object?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is an object, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (filep@pragma(defn)@index(filep) @i<expr>)@foot(This is not part of standard XLISP nor is it built-in. Nyquist defines it though.) @itemsep is this a file?
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is an object, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (boundp@pragma(defn)@index(boundp) @i<sym>) @itemsep is a value bound to this symbol?
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep @xlcode(t) if a value is bound to the symbol, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (fboundp@pragma(defn)@index(fboundp) @i<sym>) @itemsep is a functional value bound to this symbol?
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep @xlcode(t) if a functional value is bound to the symbol,
+
+ @xlcode(nil) otherwise
+@end(pdescription)
+@blankspace(1)
+
+ (minusp@pragma(defn)@index(minusp) @i<expr>) @itemsep is this number negative?
+@begin(pdescription)
+ @i<expr> @itemsep the number to test
+
+ returns @itemsep @xlcode(t) if the number is negative, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (zerop@pragma(defn)@index(zerop) @i<expr>) @itemsep is this number zero?
+@begin(pdescription)
+ @i<expr> @itemsep the number to test
+
+ returns @itemsep @xlcode(t) if the number is zero, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (plusp@pragma(defn)@index(plusp) @i<expr>) @itemsep is this number positive?
+@begin(pdescription)
+ @i<expr> @itemsep the number to test
+
+ returns @itemsep @xlcode(t) if the number is positive, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (evenp@pragma(defn)@index(evenp) @i<expr>) @itemsep is this integer even?
+@begin(pdescription)
+ @i<expr> @itemsep the integer to test
+
+ returns @itemsep @xlcode(t) if the integer is even, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (oddp@pragma(defn)@index(oddp) @i<expr>) @itemsep is this integer odd?
+@begin(pdescription)
+ @i<expr> @itemsep the integer to test
+
+ returns @itemsep @xlcode(t) if the integer is odd, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (eq@pragma(defn)@index(eq) @i<expr1> @i<expr2>) @itemsep are the expressions identical?
+@begin(pdescription)
+ @i<expr1> @itemsep the first expression
+
+ @i<expr2> @itemsep the second expression
+
+ returns @itemsep @xlcode(t) if they are equal, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+(eql@pragma(defn)@index(eql) @i<expr1> @i<expr2>) @itemsep are the expressions identical? (works with all numbers)
+@begin(pdescription)
+ @i<expr1> @itemsep the first expression
+
+ @i<expr2> @itemsep the second expression
+
+ returns @itemsep @xlcode(t) if they are equal, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (equal@pragma(defn)@index(equal) @i<expr1> @i<expr2>) @itemsep are the expressions equal?
+@begin(pdescription)
+ @i<expr1> @itemsep the first expression
+
+ @i<expr2> @itemsep the second expression
+
+ returns @itemsep @xlcode(t) if they are equal, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Control Constructs)@index(Control Constructs)
+@begin(fdescription)
+ (cond@pragma(defn)@index(cond) @i<pair>...) @itemsep evaluate conditionally
+@begin(pdescription)
+ @i<pair> @itemsep pair consisting of:
+
+@begin(pdescription)
+ (@i<pred> @i<expr>...)
+@end(pdescription)@pragma(stopcodef)
+ where:
+@begin(pdescription)
+ @i<pred> @itemsep is a predicate expression
+
+ @i<expr> @itemsep evaluated if the predicate
+ is not @xlcode(nil)
+@end(pdescription)@pragma(stopcodef)
+returns @itemsep the value of the first expression whose predicate is not
+@xlcode(nil)
+@end(pdescription)
+@blankspace(1)
+
+ (and@pragma(defn)@index(and) @i<expr>...) @itemsep the logical and of a list of expressions
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be anded
+
+ returns @itemsep @xlcode(nil) if any expression evaluates to @xlcode(nil),
+ otherwise the value of the last expression
+ (evaluation of expressions stops after the first
+ expression that evaluates to @xlcode(nil))
+@end(pdescription)
+@blankspace(1)
+
+ (or@pragma(defn)@index(or) @i<expr>...) @itemsep the logical or of a list of expressions
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be ored
+
+ returns @itemsep @xlcode(nil) if all expressions evaluate to @xlcode(nil),
+ otherwise the value of the first non-@xlcode(nil) expression
+ (evaluation of expressions stops after the first
+ expression that does not evaluate to @xlcode(nil))
+@end(pdescription)
+@blankspace(1)
+
+ (if@pragma(defn)@index(if) @i<texpr> @i<expr1> [@i<expr2>]) @itemsep evaluate expressions conditionally
+@begin(pdescription)
+ @i<texpr> @itemsep the test expression
+
+ @i<expr1> @itemsep the expression to be evaluated if texpr is non-@xlcode(nil)
+
+ @i<expr2> @itemsep the expression to be evaluated if texpr is @xlcode(nil)
+
+ returns @itemsep the value of the selected expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (when@pragma(defn)@index(when) @i<texpr> @i<expr>...) @itemsep evaluate only when a condition is true
+@begin(pdescription)
+ @i<texpr> @itemsep the test expression
+
+ @i<expr> @itemsep the expression(s) to be evaluated if texpr is non-@xlcode(nil)
+
+ returns @itemsep the value of the last expression or @xlcode(nil)
+@end(pdescription)
+@blankspace(1)
+
+ (unless@pragma(defn)@index(unless) @i<texpr> @i<expr>...) @itemsep evaluate only when a condition is false
+@begin(pdescription)
+ @i<texpr> @itemsep the test expression
+
+ @i<expr> @itemsep the expression(s) to be evaluated if texpr is @xlcode(nil)
+
+ returns @itemsep the value of the last expression or @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (case@pragma(defn)@index(case) @i<expr> @i<case>...) @itemsep select by case
+@begin(pdescription)
+ @i<expr> @itemsep the selection expression
+
+ @i<case> @itemsep pair consisting of:
+
+@begin(pdescription)
+ (@i<value> @i<expr>...)
+@end(pdescription)@pragma(stopcodef)
+ where:
+@begin(pdescription)
+ @i<value> @itemsep is a single expression or a list of
+ expressions (unevaluated)
+
+ @i<expr> @itemsep are expressions to execute if the
+ case matches
+@end(pdescription)@pragma(stopcodef)
+ returns @itemsep the value of the last expression of the matching case
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ (let@pragma(defn)@index(let) (@i<binding>...) @i<expr>...) @itemsep create local bindings
+
+@pragma(startcodef)
+ (let*@pragma(defn)@index(let*) (@i<binding>...) @i<expr>...) @itemsep let with sequential binding
+@end(fgroup)
+@begin(pdescription)
+ @i<binding> @itemsep the variable bindings each of which is either:
+
+@begin(pdescription)
+ 1) a symbol (which is initialized to @xlcode(nil))
+
+ 2) a list whose car is a symbol and whose cadr
+ is an initialization expression
+@end(pdescription)@pragma(stopcodef)
+ @i<expr> @itemsep the expressions to be evaluated
+
+ returns @itemsep the value of the last expression
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ (flet@pragma(defn)@index(flet) (@i<binding>...) @i<expr>...) @itemsep create local functions
+
+@pragma(startcodef)
+ (labels@pragma(defn)@index(labels) (@i<binding>...) @i<expr>...) @itemsep flet with recursive functions
+
+@pragma(startcodef)
+ (macrolet@pragma(defn)@index(macrolet) (@i<binding>...) @i<expr>...) @itemsep create local macros
+@end(fgroup)
+@begin(pdescription)
+ @i<binding> @itemsep the function bindings each of which is:
+
+@begin(pdescription)
+ (@i<sym> @i<fargs> @i<expr>...)
+@end(pdescription)@pragma(stopcodef)
+ where:
+@begin(pdescription)
+ @i<sym> @itemsep the function/macro name
+
+ @i<fargs> @itemsep formal argument list (lambda list)
+
+ @i<expr> @itemsep expressions constituting the body of
+ the function/macro
+@end(pdescription)@pragma(stopcodef)
+ @i<expr> @itemsep the expressions to be evaluated
+
+ returns @itemsep the value of the last expression
+@end(pdescription)
+@blankspace(1)
+
+ (catch@pragma(defn)@index(catch) @i<sym> @i<expr>...) @itemsep evaluate expressions and catch throws
+@begin(pdescription)
+ @i<sym> @itemsep the catch tag
+
+ @i<expr> @itemsep expressions to evaluate
+
+ returns @itemsep the value of the last expression the throw expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (throw@pragma(defn)@index(throw) @i<sym> [@i<expr>]) @itemsep throw to a catch
+@begin(pdescription)
+ @i<sym> @itemsep the catch tag
+
+ @i<expr> @itemsep the value for the catch to return (defaults to @xlcode(nil))
+
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ (unwind-protect@pragma(defn)@index(unwind-protect) @i<expr> @i<cexpr>...) @itemsep protect evaluation of an expression
+@begin(pdescription)
+ @i<expr> @itemsep the expression to protect
+
+ @i<cexpr> @itemsep the cleanup expressions
+
+ returns @itemsep the value of the expression@*
+
+ Note: unwind-protect guarantees to execute the cleanup expressions
+ even if a non-local exit terminates the evaluation of the
+ protected expression
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Looping Constructs)@index(Looping Constructs)
+@begin(fdescription)
+ (loop@pragma(defn)@index(loop) @i<expr>...) @itemsep basic looping form
+@begin(pdescription)
+ @i<expr> @itemsep the body of the loop
+
+ returns @itemsep never returns (must use non-local exit)
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ (do@pragma(defn)@index(do) (@i<binding>...) (@i<texpr> @i<rexpr>...) @i<expr>...)
+@pragma(endcodef)
+ (do*@pragma(defn)@index(do*) (@i<binding>...) (@i<texpr> @i<rexpr>...) @i<expr>...)
+@end(fgroup)
+@begin(pdescription)
+ @i<binding> @itemsep the variable bindings each of which is either:
+
+@begin(pdescription)
+ 1) a symbol (which is initialized to @xlcode(nil))
+
+ 2) a list of the form: (@i<sym> @i<init> [@i<step>])
+ where:
+@begin(pdescription)
+ @i<sym> @itemsep is the symbol to bind
+
+ @i<init> @itemsep is the initial value of the symbol
+
+ @i<step> @itemsep is a step expression
+
+@end(pdescription)
+@end(pdescription)@pragma(stopcodef)
+ @i<texpr> @itemsep the termination test expression
+
+ @i<rexpr> @itemsep result expressions (the default is @xlcode(nil))
+
+ @i<expr> @itemsep the body of the loop (treated like an implicit prog)
+
+ returns @itemsep the value of the last result expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (dolist@pragma(defn)@index(dolist) (@i<sym> @i<expr> [@i<rexpr>]) @i<expr>...) @itemsep loop through a list
+@begin(pdescription)
+ @i<sym> @itemsep the symbol to bind to each list element
+
+ @i<expr> @itemsep the list expression
+
+ @i<rexpr> @itemsep the result expression (the default is @xlcode(nil))
+
+ @i<expr> @itemsep the body of the loop (treated like an implicit prog)
+
+@end(pdescription)
+@blankspace(1)
+
+ (dotimes@pragma(defn)@index(dotimes) (@i<sym> @i<expr> [@i<rexpr>]) @i<expr>...) @itemsep loop from zero to n-1
+@begin(pdescription)
+ @i<sym> @itemsep the symbol to bind to each value from 0 to n-1
+
+ @i<expr> @itemsep the number of times to loop
+
+ @i<rexpr> @itemsep the result expression (the default is @xlcode(nil))
+
+ @i<expr> @itemsep the body of the loop (treated like an implicit prog)
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(The Program Feature)@index(The Program Feature)
+@begin(fdescription)
+@begin(fgroup)
+(prog@pragma(defn)@index(prog) (@i<binding>...) @i<expr>...) @itemsep the program feature
+
+@pragma(startcodef)
+(prog*@pragma(defn)@index(prog*) (@i<binding>...) @i<expr>...) @itemsep prog with sequential binding
+@end(fgroup)
+@begin(pdescription)
+ @i<binding> @itemsep the variable bindings each of which is either:
+
+@begin(pdescription)
+ 1) a symbol (which is initialized to @xlcode(nil))
+
+ 2) a list whose car is a symbol and whose cadr
+ is an initialization expression
+@end(pdescription)@pragma(stopcodef)
+ @i<expr> @itemsep expressions to evaluate or tags (symbols)
+
+ returns @itemsep @xlcode(nil) or the argument passed to the return function
+
+@end(pdescription)
+@blankspace(1)
+
+ (block@pragma(defn)@index(block) @i<name> @i<expr>...) @itemsep named block
+@begin(pdescription)
+ @i<name> @itemsep the block name (symbol)
+
+ @i<expr> @itemsep the block body
+
+ returns @itemsep the value of the last expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (return@pragma(defn)@index(return) [@i<expr>]) @itemsep cause a prog construct to return a value
+@begin(pdescription)
+ @i<expr> @itemsep the value (defaults to @xlcode(nil))
+
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ (return-from@pragma(defn)@index(return-from) @i<name> [@i<value>]) @itemsep return from a named block
+@begin(pdescription)
+ @i<name> @itemsep the block name (symbol)
+
+ @i<value> @itemsep the value to return (defaults to @xlcode(nil))
+
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ (tagbody@pragma(defn)@index(tagbody) @i<expr>...) @itemsep block with labels
+@begin(pdescription)
+ @i<expr> @itemsep expression(s) to evaluate or tags (symbols)
+
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (go@pragma(defn)@index(go) @i<sym>) @itemsep go to a tag within a tagbody or prog
+@begin(pdescription)
+ @i<sym> @itemsep the tag (quoted)
+
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ (progv@pragma(defn)@index(progv) @i<slist> @i<vlist> @i<expr>...) @itemsep dynamically bind symbols
+@begin(pdescription)
+ @i<slist> @itemsep list of symbols
+
+ @i<vlist> @itemsep list of values to bind to the symbols
+
+ @i<expr> @itemsep expression(s) to evaluate
+
+ returns @itemsep the value of the last expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (prog1@pragma(defn)@index(prog1) @i<expr1> @i<expr>...) @itemsep execute expressions sequentially
+@begin(pdescription)
+ @i<expr1> @itemsep the first expression to evaluate
+
+ @i<expr> @itemsep the remaining expressions to evaluate
+
+ returns @itemsep the value of the first expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (prog2@pragma(defn)@index(prog2) @i<expr1> @i<expr2> @i<expr>...) @itemsep execute expressions sequentially
+@begin(pdescription)
+ @i<expr1> @itemsep the first expression to evaluate
+
+ @i<expr2> @itemsep the second expression to evaluate
+
+ @i<expr> @itemsep the remaining expressions to evaluate
+
+ returns @itemsep the value of the second expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (progn@pragma(defn)@index(progn) @i<expr>...) @itemsep execute expressions sequentially
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to evaluate
+
+ returns @itemsep the value of the last expression (or @xlcode(nil))
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Debugging and Error Handling)@index(Debugging)@index(Error Handling)
+@begin(fdescription)
+ (trace@pragma(defn)@index(trace) @i<sym>) @itemsep add a function to the trace list
+@begin(pdescription)
+ @i<sym> @itemsep the function to add (quoted)
+
+ returns @itemsep the trace list
+
+@end(pdescription)
+@blankspace(1)
+
+ (untrace@pragma(defn)@index(untrace) @i<sym>) @itemsep remove a function from the trace list
+@begin(pdescription)
+ @i<sym> @itemsep the function to remove (quoted)
+
+ returns @itemsep the trace list
+
+@end(pdescription)
+@blankspace(1)
+
+ (error@pragma(defn)@index(error) @i<emsg> [@i<arg>]) @itemsep signal a non-correctable error
+@begin(pdescription)
+ @i<emsg> @itemsep the error message string
+
+ @i<arg> @itemsep the argument expression (printed after the message)
+
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ (cerror@pragma(defn)@index(cerror) @i<cmsg> @i<emsg> [@i<arg>]) @itemsep signal a correctable error
+@begin(pdescription)
+ @i<cmsg> @itemsep the continue message string
+
+ @i<emsg> @itemsep the error message string
+
+ @i<arg> @itemsep the argument expression (printed after the message)
+
+ returns @itemsep @xlcode(nil) when continued from the break loop
+
+@end(pdescription)
+@blankspace(1)
+
+ (break@pragma(defn)@index(break) [@i<bmsg> [@i<arg>]]) @itemsep enter a break loop
+@begin(pdescription)
+ @i<bmsg> @itemsep the break message string (defaults to @xlcode(**break**))
+
+ @i<arg> @itemsep the argument expression (printed after the message)
+
+ returns @itemsep @xlcode(nil) when continued from the break loop
+
+@end(pdescription)
+@blankspace(1)
+
+ (clean-up@pragma(defn)@index(clean-up)) @itemsep clean-up after an error
+@begin(pdescription)
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ (top-level@pragma(defn)@index(top-level)) @itemsep clean-up after an error and return to the top level
+@begin(pdescription)
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ (continue@pragma(defn)@index(continue)) @itemsep continue from a correctable error
+@begin(pdescription)
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ (errset@pragma(defn)@index(errset) @i<expr> [@i<pflag>]) @itemsep trap errors
+@begin(pdescription)
+ @i<expr> @itemsep the expression to execute
+
+ @i<pflag> @itemsep flag to control printing of the error message
+
+ returns @itemsep the value of the last expression consed with @xlcode(nil)
+
+ or @xlcode(nil) on error
+@end(pdescription)
+@blankspace(1)
+
+ (baktrace@pragma(defn)@index(baktrace)@index(debugging)@index(stack trace) [@i<n>]) @itemsep print n levels of trace back information
+@begin(pdescription)
+ @i<n> @itemsep the number of levels (defaults to all levels)
+
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (evalhook@pragma(defn)@index(evalhook) @i<expr> @i<ehook> @i<ahook> [@i<env>]) @itemsep evaluate with hooks
+@begin(pdescription)
+ @i<expr> @itemsep the expression to evaluate
+
+ @i<ehook> @itemsep the value for @xlcode(*evalhook*)
+
+ @i<ahook> @itemsep the value for @xlcode(*applyhook*)
+
+ @i<env> @itemsep the environment (default is @xlcode(nil))
+
+ returns @itemsep the result of evaluating the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (profile@pragma(defn)@index(profile) @i(flag))@foot(This is not a standard XLISP 2.0 function.) @itemsep turn profiling on or off.
+@begin(pdescription)
+ @i<flag> @itemsep @xlcode(nil) turns profiling off, otherwise on
+
+ returns @itemsep the previous state of profiling.
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Arithmetic Functions)@index(Arithmetic Functions)
+@begin(fdescription)
+ (truncate@pragma(defn)@index(truncate) @i<expr>) @itemsep truncates a floating point number to an integer
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the result of truncating the number
+
+@end(pdescription)
+@blankspace(1)
+
+ (float@pragma(defn)@index(float) @i<expr>) @itemsep converts an integer to a floating point number
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the result of floating the integer
+
+@end(pdescription)
+@blankspace(1)
+
+ (+@pragma(defn)@index(+) @i<expr>...) @itemsep add a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the addition
+
+@end(pdescription)
+@blankspace(1)
+
+ (-@pragma(defn)@index(-) @i<expr>...) @itemsep subtract a list of numbers or negate a single number
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the subtraction
+
+@end(pdescription)
+@blankspace(1)
+
+ (*@pragma(defn)@index(*) @i<expr>...) @itemsep multiply a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the multiplication
+
+@end(pdescription)
+@blankspace(1)
+
+ (/@pragma(defn)@index(/) @i<expr>...) @itemsep divide a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the division
+
+@end(pdescription)
+@blankspace(1)
+
+ (1+@pragma(defn)@index(1+) @i<expr>) @itemsep add one to a number
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the number plus one
+
+@end(pdescription)
+@blankspace(1)
+
+ (1-@pragma(defn)@index(1-) @i<expr>) @itemsep subtract one from a number
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the number minus one
+
+@end(pdescription)
+@blankspace(1)
+
+ (rem@pragma(defn)@index(rem)@index(remainder)@index(modulo (rem) function) @i<expr>...) @itemsep remainder of a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the remainder operation
+
+@end(pdescription)
+@blankspace(1)
+
+ (min@pragma(defn)@index(min)@index(minimum) @i<expr>...) @itemsep the smallest of a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be checked
+
+ returns @itemsep the smallest number in the list
+
+@end(pdescription)
+@blankspace(1)
+
+ (max@pragma(defn)@index(max)@index(maximum) @i<expr>...) @itemsep the largest of a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be checked
+
+ returns @itemsep the largest number in the list
+
+@end(pdescription)
+@blankspace(1)
+
+ (abs@pragma(defn)@index(abs) @i<expr>) @itemsep the absolute value of a number
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the absolute value of the number
+
+@end(pdescription)
+@blankspace(1)
+
+ (gcd@pragma(defn)@index(gcd) @i<n1> @i<n2>...) @itemsep compute the greatest common divisor
+@begin(pdescription)
+ @i<n1> @itemsep the first number (integer)
+
+ @i<n2> @itemsep the second number(s) (integer)
+
+ returns @itemsep the greatest common divisor
+
+@end(pdescription)
+@blankspace(1)
+
+ (random@pragma(defn)@index(random) @i<n>) @itemsep compute a random number between 0 and n-1 inclusive
+@begin(pdescription)
+ @i<n> @itemsep the upper bound (integer)
+
+ returns @itemsep a random number
+
+@end(pdescription)
+@blankspace(1)
+
+ (rrandom@pragma(defn)@index(rrandom)@index(uniform random)) @itemsep compute a random real number between 0 and 1 inclusive
+@begin(pdescription)
+ returns @itemsep a random floating point number
+
+@end(pdescription)
+@blankspace(1)
+
+ (sin@pragma(defn)@index(sin) @i<expr>) @itemsep compute the sine of a number
+@begin(pdescription)
+ @i<expr> @itemsep the floating point number
+
+ returns @itemsep the sine of the number
+
+@end(pdescription)
+@blankspace(1)
+
+ (cos@pragma(defn)@index(cos) @i<expr>) @itemsep compute the cosine of a number
+@begin(pdescription)
+ @i<expr> @itemsep the floating point number
+
+ returns @itemsep the cosine of the number
+
+@end(pdescription)
+@blankspace(1)
+
+ (tan@pragma(defn)@index(tan) @i<expr>) @itemsep compute the tangent of a number
+@begin(pdescription)
+ @i<expr> @itemsep the floating point number
+
+ returns @itemsep the tangent of the number
+
+@end(pdescription)
+@blankspace(1)
+
+ (atan@pragma(defn)@index(atan) @i<expr> [@i<expr2>])@foot(This is not a standard XLISP 2.0 function.) @itemsep compute the arctangent
+@begin(pdescription)
+ @i<expr> @itemsep the value of @i(x)
+
+ @i<expr2> @itemsep the value of @i(y) (default value is 1.0)
+
+ returns @itemsep the arctangent of @i(x)/@i(y)
+
+@end(pdescription)
+@blankspace(1)
+
+ (expt@pragma(defn)@index(expt) @i<x-expr> @i<y-expr>) @itemsep compute x to the y power
+@begin(pdescription)
+ @i<x-expr> @itemsep the floating point number
+
+ @i<y-expr> @itemsep the floating point exponent
+
+ returns @itemsep x to the y power
+
+@end(pdescription)
+@blankspace(1)
+
+ (exp@pragma(defn)@index(exp) @i<x-expr>) @itemsep compute e to the x power
+@begin(pdescription)
+ @i<x-expr> @itemsep the floating point number
+
+ returns @itemsep e to the x power
+
+@end(pdescription)
+@blankspace(1)
+
+ (sqrt@pragma(defn)@index(sqrt) @i<expr>) @itemsep compute the square root of a number
+@begin(pdescription)
+ @i<expr> @itemsep the floating point number
+
+ returns @itemsep the square root of the number
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+(<@pragma(defn)@index(<) @i<n1> @i<n2>...) @itemsep test for less than
+
+(<=@pragma(defn)@index(<=) @i<n1> @i<n2>...) @itemsep test for less than or equal to
+
+(=@pragma(defn)@index(=) @i<n1> @i<n2>...) @itemsep test for equal to
+
+(/=@pragma(defn)@index(/=) @i<n1> @i<n2>...) @itemsep test for not equal to
+
+(>=@pragma(defn)@index(>=) @i<n1> @i<n2>...) @itemsep test for greater than or equal to
+
+(>@pragma(defn)@index(>) @i<n1> @i<n2>...) @itemsep test for greater than
+@end(fgroup)
+@begin(pdescription)
+ @i<n1> @itemsep the first number to compare
+
+ @i<n2> @itemsep the second number to compare
+
+returns @itemsep @xlcode(t) if the results of comparing @i<n1> with @i<n2>,
+@i<n2> with @i<n3>, etc., are all true.
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Bitwise Logical Functions)@index(Bitwise Logical Functions)
+@begin(fdescription)
+ (logand@pragma(defn)@index(logand) @i<expr>...) @itemsep the bitwise and of a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the and operation
+
+@end(pdescription)
+@blankspace(1)
+
+ (logior@pragma(defn)@index(logior) @i<expr>...) @itemsep the bitwise inclusive or of a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the inclusive or operation
+
+@end(pdescription)
+@blankspace(1)
+
+ (logxor@pragma(defn)@index(logxor) @i<expr>...) @itemsep the bitwise exclusive or of a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the exclusive or operation
+
+@end(pdescription)
+@blankspace(1)
+
+ (lognot@pragma(defn)@index(lognot) @i<expr>) @itemsep the bitwise not of a number
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the bitwise inversion of number
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(String Functions)@index(String Functions)
+@begin(fdescription)
+ (string@pragma(defn)@index(string) @i<expr>) @itemsep make a string from a value
+@begin(pdescription)
+ @i<expr> @itemsep an integer (which is first converted into its ASCII character value), string, character, or symbol
+
+ returns @itemsep the string representation of the argument
+
+@end(pdescription)
+@blankspace(1)
+
+ (string-search@pragma(defn)@index(string-search)@index(find string) @i<pat> @i<str> &key :start :end)@foot(This is not a standard XLISP 2.0 function.) @itemsep search for pattern in string
+@begin(pdescription)
+ @i<pat> @itemsep a string to search for
+
+ @i<str> @itemsep the string to be searched
+
+ :start @itemsep the starting offset in str
+
+ :end @itemsep the ending offset + 1
+
+ returns @itemsep index of pat in str or NIL if not found
+
+@end(pdescription)
+@blankspace(1)
+
+ (string-trim@pragma(defn)@index(string-trim) @i<bag> @i<str>) @itemsep trim both ends of a string
+@begin(pdescription)
+ @i<bag> @itemsep a string containing characters to trim
+
+ @i<str> @itemsep the string to trim
+
+ returns @itemsep a trimed copy of the string
+
+@end(pdescription)
+@blankspace(1)
+
+ (string-left-trim@pragma(defn)@index(string-left-trim) @i<bag> @i<str>) @itemsep trim the left end of a string
+@begin(pdescription)
+ @i<bag> @itemsep a string containing characters to trim
+
+ @i<str> @itemsep the string to trim
+
+ returns @itemsep a trimed copy of the string
+
+@end(pdescription)
+@blankspace(1)
+
+ (string-right-trim@pragma(defn)@index(string-right-trim) @i<bag> @i<str>) @itemsep trim the right end of a string
+@begin(pdescription)
+ @i<bag> @itemsep a string containing characters to trim
+
+ @i<str> @itemsep the string to trim
+
+ returns @itemsep a trimed copy of the string
+
+@end(pdescription)
+@blankspace(1)
+
+ (string-upcase@pragma(defn)@index(string-upcase) @i<str> &key :start :end) @itemsep convert to uppercase
+@begin(pdescription)
+ @i<str> @itemsep the string
+
+ :start @itemsep the starting offset
+
+ :end @itemsep the ending offset + 1
+
+ returns @itemsep a converted copy of the string
+
+@end(pdescription)
+@blankspace(1)
+
+ (string-downcase@pragma(defn)@index(string-downcase) @i<str> &key :start :end) @itemsep convert to lowercase
+@begin(pdescription)
+ @i<str> @itemsep the string
+
+ :start @itemsep the starting offset
+
+ :end @itemsep the ending offset + 1
+
+ returns @itemsep a converted copy of the string
+
+@end(pdescription)
+@blankspace(1)
+
+ (nstring-upcase@pragma(defn)@index(nstring-upcase) @i<str> &key :start :end) @itemsep convert to uppercase
+@begin(pdescription)
+ @i<str> @itemsep the string
+
+ :start @itemsep the starting offset
+
+ :end @itemsep the ending offset + 1
+
+ returns @itemsep the converted string (not a copy)
+
+@end(pdescription)
+@blankspace(1)
+
+ (nstring-downcase@pragma(defn)@index(nstring-downcase) @i<str> &key :start :end) @itemsep convert to lowercase
+@begin(pdescription)
+ @i<str> @itemsep the string
+
+ :start @itemsep the starting offset
+
+ :end @itemsep the ending offset + 1
+
+ returns @itemsep the converted string (not a copy)
+
+@end(pdescription)
+@blankspace(1)
+
+ (strcat@pragma(defn)@index(strcat)@index(concatenate strings) @i<expr>...) @itemsep concatenate strings
+@begin(pdescription)
+ @i<expr> @itemsep the strings to concatenate
+
+ returns @itemsep the result of concatenating the strings
+
+@end(pdescription)
+@blankspace(1)
+
+ (subseq@pragma(defn)@index(subseq) @i<string> @i<start> [@i<end>]) @itemsep extract a substring
+@begin(pdescription)
+ @i<string> @itemsep the string
+
+ @i<start> @itemsep the starting position (zero origin)
+
+ @i<end> @itemsep the ending position + 1 (defaults to end)
+
+ returns @itemsep substring between @i<start> and @i<end>
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ (string<@pragma(defn)@index(string<) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@pragma(endcodef)
+ (string<=@pragma(defn)@index(string<=) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@pragma(endcodef)
+
+ (string=@pragma(defn)@index(string=) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@pragma(endcodef)
+
+ (string/=@pragma(defn)@index(string/=) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@pragma(endcodef)
+
+ (string>=@pragma(defn)@index(string>=) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@pragma(endcodef)
+
+ (string>@pragma(defn)@index(string>) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@end(fgroup)
+@begin(pdescription)
+ @i<str1> @itemsep the first string to compare
+
+ @i<str2> @itemsep the second string to compare
+
+ :start1 @itemsep first substring starting offset
+
+ :end1 @itemsep first substring ending offset + 1
+
+ :start2 @itemsep second substring starting offset
+
+ :end2 @itemsep second substring ending offset + 1
+
+ returns @itemsep @xlcode(t) if predicate is true, @xlcode(nil) otherwise
+
+ Note: case is significant with these comparison functions.
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+(string-lessp@pragma(defn)@index(string-lessp) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@pragma(endcodef)
+
+(string-not-greaterp@pragma(defn)@index(string-not-greaterp) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@pragma(endcodef)
+
+(string-equalp@pragma(defn)@index(string-equalp) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@pragma(endcodef)
+
+(string-not-equalp@pragma(defn)@index(string-not-equalp) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@pragma(endcodef)
+
+(string-not-lessp@pragma(defn)@index(string-not-lessp) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@pragma(endcodef)
+
+(string-greaterp@pragma(defn)@index(string-greaterp) @i<str1> @i<str2> &key :start1 :end1 :start2 :end2)
+@end(fgroup)
+@begin(pdescription)
+ @i<str1> @itemsep the first string to compare
+
+ @i<str2> @itemsep the second string to compare
+
+ :start1 @itemsep first substring starting offset
+
+ :end1 @itemsep first substring ending offset + 1
+
+ :start2 @itemsep second substring starting offset
+
+ :end2 @itemsep second substring ending offset + 1
+
+ returns @itemsep @xlcode(t) if predicate is true, @xlcode(nil) otherwise
+
+ Note: case is not significant with these comparison functions.
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Character Functions)@index(Character Functions)
+@begin(fdescription)
+ (char@pragma(defn)@index(char) @i<string> @i<index>) @itemsep extract a character from a string
+@begin(pdescription)
+ @i<string> @itemsep the string
+
+ @i<index> @itemsep the string index (zero relative)
+
+ returns @itemsep the ascii code of the character
+
+@end(pdescription)
+@blankspace(1)
+
+ (upper-case-p@pragma(defn)@index(upper-case-p) @i<chr>) @itemsep is this an upper case character?
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep @xlcode(t) if the character is upper case, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (lower-case-p@pragma(defn)@index(lower-case-p) @i<chr>) @itemsep is this a lower case character?
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep @xlcode(t) if the character is lower case, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (both-case-p@pragma(defn)@index(both-case-p) @i<chr>) @itemsep is this an alphabetic (either case) character?
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep @xlcode(t) if the character is alphabetic, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (digit-char-p@pragma(defn)@index(digit-char-p) @i<chr>) @itemsep is this a digit character?
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep the digit weight if character is a digit, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (char-code@pragma(defn)@index(char-code) @i<chr>) @itemsep get the ascii code of a character
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep the ascii character code (integer)
+
+@end(pdescription)
+@blankspace(1)
+
+ (code-char@pragma(defn)@index(code-char) @i<code>) @itemsep get the character with a specified ascii code
+@begin(pdescription)
+ @i<code> @itemsep the ascii code (integer)
+
+ returns @itemsep the character with that code or @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (char-upcase@pragma(defn)@index(char-upcase) @i<chr>) @itemsep convert a character to upper case
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep the upper case character
+
+@end(pdescription)
+@blankspace(1)
+
+ (char-downcase@pragma(defn)@index(char-downcase) @i<chr>) @itemsep convert a character to lower case
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep the lower case character
+
+@end(pdescription)
+@blankspace(1)
+
+ (digit-char@pragma(defn)@index(digit-char) @i<n>) @itemsep convert a digit weight to a digit
+@begin(pdescription)
+ @i<n> @itemsep the digit weight (integer)
+
+ returns @itemsep the digit character or @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (char-int@pragma(defn)@index(char-int) @i<chr>) @itemsep convert a character to an integer
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep the ascii character code
+
+@end(pdescription)
+@blankspace(1)
+
+ (int-char@pragma(defn)@index(int-char) @i<int>) @itemsep convert an integer to a character
+@begin(pdescription)
+ @i<int> @itemsep the ascii character code
+
+ returns @itemsep the character with that code
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ (char<@pragma(defn)@index(char<) @i<chr1> @i<chr2>...)
+@pragma(endcodef)
+
+ (char<=@pragma(defn)@index(char<=) @i<chr1> @i<chr2>...)
+@pragma(endcodef)
+
+ (char=@pragma(defn)@index(char=) @i<chr1> @i<chr2>...)
+@pragma(endcodef)
+
+ (char/=@pragma(defn)@index(char/=) @i<chr1> @i<chr2>...)
+@pragma(endcodef)
+
+ (char>=@pragma(defn)@index(char>=) @i<chr1> @i<chr2>...)
+@pragma(endcodef)
+
+ (char>@pragma(defn)@index(char>) @i<chr1> @i<chr2>...)
+@end(fgroup)
+@begin(pdescription)
+ @i<chr1> @itemsep the first character to compare
+
+ @i<chr2> @itemsep the second character(s) to compare
+
+ returns @itemsep @xlcode(t) if predicate is true, @xlcode(nil) otherwise
+
+ Note: case is significant with these comparison functions.
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+(char-lessp@pragma(defn)@index(char-lessp) @i<chr1> @i<chr2>...)
+@pragma(endcodef)
+
+(char-not-greaterp@pragma(defn)@index(char-not-greaterp) @i<chr1> @i<chr2>...)
+@pragma(endcodef)
+
+(char-equalp@pragma(defn)@index(char-equalp) @i<chr1> @i<chr2>...)
+@pragma(endcodef)
+
+(char-not-equalp@pragma(defn)@index(char-not-equalp) @i<chr1> @i<chr2>...)
+@pragma(endcodef)
+
+(char-not-lessp@pragma(defn)@index(char-not-lessp) @i<chr1> @i<chr2>...)
+@pragma(endcodef)
+
+(char-greaterp@pragma(defn)@index(char-greaterp) @i<chr1> @i<chr2>...)
+@end(fgroup)
+@begin(pdescription)
+@i<chr1> @itemsep the first string to compare
+
+@i<chr2> @itemsep the second string(s) to compare
+
+returns @itemsep @xlcode(t) if predicate is true, @xlcode(nil) otherwise
+
+ Note: case is not significant with these comparison functions.
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Input/Output Functions)@index(Input/Output Functions)
+@begin(fdescription)
+ (read@pragma(defn)@index(read) [@i<stream> [@i<eof> [@i<rflag>]]]) @itemsep read an expression
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ @i<eof> @itemsep the value to return on end of file (default is @xlcode(nil))
+
+ @i<rflag> @itemsep recursive read flag (default is @xlcode(nil))
+
+ returns @itemsep the expression read
+
+@end(pdescription)
+@blankspace(1)
+
+ (print@pragma(defn)@index(print) @i<expr> [@i<stream>]) @itemsep print an expression on a new line
+@begin(pdescription)
+ @i<expr> @itemsep the expression to be printed
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (prin1@pragma(defn)@index(prin1) @i<expr> [@i<stream>]) @itemsep print an expression
+@begin(pdescription)
+ @i<expr> @itemsep the expression to be printed
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (princ@pragma(defn)@index(princ) @i<expr> [@i<stream>]) @itemsep print an expression without quoting
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be printed
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (pprint@pragma(defn)@index(pprint) @i<expr> [@i<stream>]) @itemsep pretty print an expression
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be printed
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ (terpri@pragma(defn)@index(terpri) [@i<stream>]) @itemsep terminate the current print line
+@begin(pdescription)
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (flatsize@pragma(defn)@index(flatsize) @i<expr>) @itemsep length of printed representation using prin1
+@begin(pdescription)
+ @i<expr> @itemsep the expression
+
+ returns @itemsep the length
+
+@end(pdescription)
+@blankspace(1)
+
+ (flatc@pragma(defn)@index(flatc) @i<expr>) @itemsep length of printed representation using princ
+@begin(pdescription)
+ @i<expr> @itemsep the expression
+
+ returns @itemsep the length
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(The Format Function)@index(The Format Function)
+@begin(fdescription)
+(format@pragma(defn)@index(format) @i<stream> @i<fmt> @i<arg>...) @itemsep do formated
+output
+@begin(pdescription)
+ @i<stream> @itemsep the output stream
+
+ @i<fmt> @itemsep the format string
+
+ @i<arg> @itemsep the format arguments
+
+ returns @itemsep output string if @i<stream> is @xlcode(nil), @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+ The format string can contain characters that should be copied
+ directly to the output and formatting directives. The
+ formatting directives are:
+@begin(display)
+@xlcode(~A) @itemsep print next argument using princ
+@xlcode(~S) @itemsep print next argument using prin1
+@xlcode(~%) @itemsep start a new line
+@xlcode(~~) @itemsep print a tilde character
+@xlcode(~)<newline> @itemsep ignore this one newline and white space on the
+next line up to the first non-white-space character or newline. This
+allows strings to continue across multiple lines
+@end(display)
+
+@section(File I/O Functions)@index(File I/O Functions)
+Note that files are ordinarily opened as text. Binary files (such as standard midi files) must be opened with @xlcode(open-binary) on non-unix systems.
+@begin(fdescription)
+ (open@pragma(defn)@index(open) @i<fname> &key :direction) @itemsep open a file stream
+@begin(pdescription)
+ @i<fname> @itemsep the file name string or symbol
+
+ :direction @itemsep :input or :output (default is :input)
+
+ returns @itemsep a stream
+
+@end(pdescription)
+@blankspace(1)
+ (open-binary@pragma(defn)@index(open-binary)@index(open)@index(binary files) @i<fname> &key :direction) @itemsep open a binary file stream
+@begin(pdescription)
+ @i<fname> @itemsep the file name string or symbol
+
+ :direction @itemsep :input or :output (default is :input)
+
+ returns @itemsep a stream
+
+@end(pdescription)
+@blankspace(1)
+
+ (close@pragma(defn)@index(close) @i<stream>) @itemsep close a file stream
+@begin(pdescription)
+ @i<stream> @itemsep the stream
+
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (setdir@pragma(defn)@index(setdir)@index(change directory) @i<path>)@foot(This is not a standard XLISP 2.0 function.) @itemsep set current directory
+@begin(pdescription)
+ @i<path> @itemsep the path of the new directory
+
+ returns @itemsep the resulting full path, e.g. (setdir ".") gets the current working directory, or @xlcode(nil) if an error occurs
+
+@end(pdescription)
+@blankspace(1)
+
+ (listdir@pragma(defn)@index(listdir)@index(directory listing)@index(scan directory)@index(read directory)@index(list directory) @i<path>)@foot(This is not a standard XLISP 2.0 function.) @itemsep get a directory listing
+@begin(pdescription)
+ @i<path> @itemsep the path of the directory to be listed
+
+ returns @itemsep list of filenames in the directory
+
+@end(pdescription)
+@blankspace(1)
+
+ (get-temp-path@pragma(defn)@index(get-temp-path)@index(temporary files)@index(temp file))@foot(This is not a standard XLISP 2.0 function.) @itemsep get a path where a temporary file can be created. Under Windows, this is based on environment variables. If XLISP is running as a sub-process to Java, the environment may not exist, in which case the default result is the unfortunate choice @xlcode(c:\windows\).
+@begin(pdescription)
+ returns @itemsep the resulting full path as a string
+
+@end(pdescription)
+@blankspace(1)
+
+ (get-user@pragma(defn)@index(get-user)@index(user name)@index(temp file))@foot(This is not a standard XLISP 2.0 function.) @itemsep get the user ID. In Unix systems (including OS X and Linux), this is the value of the USER environment variable. In Windows, this is currently just ``nyquist'', which is also returned if the environment variable cannot be accessed. This function is used to avoid the case of two users creating files of the same name in the same temp directory.
+@begin(pdescription)
+ returns @itemsep the string naming the user
+
+@end(pdescription)
+@blankspace(1)
+ (find-in-xlisp-path@pragma(defn)@index(find-in-xlisp-path) @i<filename>)@foot(This is not a standard XLISP 2.0 function.) @itemsep search the XLISP search path (e.g. @xlcode(XLISPPATH) from the environment) for @i(filename). If @i(filename) is not found as is, and there is no file extension, append "@code(.lsp)" to @i(filename) and search again. The current directory is not searched.
+@begin(pdescription)
+ @i<filename> @itemsep the name of the file to search for
+
+ returns @itemsep a full path name to the first occurrence found
+
+@end(pdescription)
+@blankspace(1)
+
+ (read-char@pragma(defn)@index(read-char)@index(get char) [@i<stream>]) @itemsep read a character from a stream
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ returns @itemsep the character
+
+@end(pdescription)
+@blankspace(1)
+
+ (peek-char@pragma(defn)@index(peek-char) [@i<flag> [@i<stream>]]) @itemsep peek at the next character
+@begin(pdescription)
+ @i<flag> @itemsep flag for skipping white space (default is @xlcode(nil))
+
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ returns @itemsep the character (integer)
+
+@end(pdescription)
+@blankspace(1)
+
+ (write-char@pragma(defn)@index(write-char) @i<ch> [@i<stream>]) @itemsep write a character to a stream
+@begin(pdescription)
+ @i<ch> @itemsep the character to write
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the character
+
+@end(pdescription)
+@blankspace(1)
+
+ (read-int@pragma(defn)@index(read-int) [@i<stream> [@i<length>]]) @itemsep read a binary integer from a stream
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ @i<length> @itemsep the length of the integer in bytes (default is 4)
+
+ returns @itemsep the integer
+
+Note: Integers are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To read little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.
+
+@end(pdescription)
+@blankspace(1)
+
+ (write-int@pragma(defn)@index(write-int) @i<ch> [@i<stream> [@i<length>]]) @itemsep write a binary integer to a stream
+@begin(pdescription)
+ @i<ch> @itemsep the character to write
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ @i<length> @itemsep the length of the integer in bytes (default is 4)
+
+ returns @itemsep the integer
+
+Note: Integers are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To write in little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.
+
+@end(pdescription)
+@blankspace(1)
+
+ (read-float@pragma(defn)@index(read-float) [@i<stream> [@i<length>]]) @itemsep read a binary floating-point number from a stream
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ @i<length> @itemsep the length of the float in bytes (default is 4, legal values are -4, -8, 4, and 8)
+
+ returns @itemsep the integer
+
+Note: Floats are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To read little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.
+
+@end(pdescription)
+@blankspace(1)
+
+ (write-float@pragma(defn)@index(write-float) @i<ch> [@i<stream> [@i<length>]]) @itemsep write a binary floating-point number to a stream
+@begin(pdescription)
+ @i<ch> @itemsep the character to write
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ @i<length> @itemsep the length of the float in bytes (default is 4, legal values are -4, -8, 4, and 8)
+
+ returns @itemsep the integer
+
+Note: Floats are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To write in little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.
+
+@end(pdescription)
+@blankspace(1)
+
+ (read-line@pragma(defn)@index(read-line) [@i<stream>]) @itemsep read a line from a stream
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ returns @itemsep the string
+
+@end(pdescription)
+@blankspace(1)
+
+ (read-byte@pragma(defn)@index(read-byte) [@i<stream>]) @itemsep read a byte from a stream
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ returns @itemsep the byte (integer)
+
+@end(pdescription)
+@blankspace(1)
+
+ (write-byte@pragma(defn)@index(write-byte) @i<byte> [@i<stream>]) @itemsep write a byte to a stream
+@begin(pdescription)
+ @i<byte> @itemsep the byte to write (integer)
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the byte (integer)
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(String Stream Functions)@index(String Stream Functions)
+ These functions operate on unnamed streams. An unnamed output
+ stream collects characters sent to it when it is used as the
+ destination of any output function. The functions
+@xlcode(get-output-stream-string) and @xlcode(get-output-stream-list) return a string or a list of characters.
+
+An unnamed input stream is setup with the
+ @xlcode(make-string-input-stream) function and returns each character of the string when
+ it is used as the source of any input function.
+
+@begin(fdescription)
+@blankspace(1)
+ (make-string-input-stream@pragma(defn)@index(make-string-input-stream) @i<str> [@i<start> [@i<end>]])
+@begin(pdescription)
+ @i<str> @itemsep the string
+
+ @i<start> @itemsep the starting offset
+
+ @i<end> @itemsep the ending offset + 1
+
+ returns @itemsep an unnamed stream that reads from the string
+
+@end(pdescription)
+@blankspace(1)
+
+ (make-string-output-stream)@pragma(defn)@index(make-string-output-stream)
+@begin(pdescription)
+ returns @itemsep an unnamed output stream
+
+@end(pdescription)
+@blankspace(1)
+
+ (get-output-stream-string@pragma(defn)@index(get-output-stream-string) @i<stream>)
+@begin(pdescription)
+ @i<stream> @itemsep the output stream
+
+ returns @itemsep the output so far as a string
+
+ Note: the output stream is emptied by this function
+@end(pdescription)
+@blankspace(1)
+
+ (get-output-stream-list@pragma(defn)@index(get-output-stream-list) @i<stream>)
+@begin(pdescription)
+ @i<stream> @itemsep the output stream
+
+ returns @itemsep the output so far as a list
+
+ Note: the output stream is emptied by this function
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(System Functions)@index(System Functions)
+Note: the @xlcode(load) function first tries to load a file from the current directory. A @code(.lsp) extension is added if there is not already an alphanumeric extension following a period. If that fails, XLISP searches the path, which is obtained from the XLISPPATH environment variable in Unix and HKEY_LOCAL_MACHINE\SOFTWARE\CMU\Nyquist\XLISPPATH under Win32. (The Macintosh version has no search path.)
+
+@begin(fdescription)
+ (get-env@pragma(defn)@index(get-env)@index(getenv)@index(environment variables) @i<name>) @itemsep get from an environment variable
+@begin(pdescription)
+ @i<name> @itemsep the name of the environment variable
+
+ returns @itemsep string value of the environment variable, @xlcode(nil) if variable does not exist
+
+@end(pdescription)
+@blankspace(1)
+
+ (load@pragma(defn)@index(load) @i<fname> &key :verbose :print) @itemsep load a source file
+@begin(pdescription)
+ @i<fname> @itemsep the filename string or symbol
+
+ :verbose @itemsep the verbose flag (default is t)
+
+ :print @itemsep the print flag (default is @xlcode(nil))
+
+ returns @itemsep the filename
+
+@end(pdescription)
+@blankspace(1)
+
+ (save@pragma(defn)@index(save) @i<fname>) @itemsep save workspace to a file
+@begin(pdescription)
+ @i<fname> @itemsep the filename string or symbol
+
+ returns @itemsep @xlcode(t) if workspace was written, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ (restore@pragma(defn)@index(restore) @i<fname>) @itemsep restore workspace from a file
+@begin(pdescription)
+ @i<fname> @itemsep the filename string or symbol
+
+ returns @itemsep @xlcode(nil) on failure, otherwise never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ (dribble@pragma(defn)@index(dribble) [@i<fname>]) @itemsep create a file with a transcript of a session
+@begin(pdescription)
+ @i<fname> @itemsep file name string or symbol
+ (if missing, close current transcript)
+
+ returns @itemsep @xlcode(t) if the transcript is opened, @xlcode(nil) if it is closed
+
+@end(pdescription)
+@blankspace(1)
+
+ (gc@pragma(defn)@index(gc)) @itemsep force garbage collection
+@begin(pdescription)
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (expand@pragma(defn)@index(expand) @i<num>) @itemsep expand memory by adding segments
+@begin(pdescription)
+ @i<num> @itemsep the number of segments to add
+
+ returns @itemsep the number of segments added
+
+@end(pdescription)
+@blankspace(1)
+
+ (alloc@pragma(defn)@index(alloc) @i<num>) @itemsep change number of nodes to allocate in each segment
+@begin(pdescription)
+ @i<num> @itemsep the number of nodes to allocate
+
+ returns @itemsep the old number of nodes to allocate
+
+@end(pdescription)
+@blankspace(1)
+
+ (info@pragma(defn)@index(info)) @itemsep show information about memory usage.
+@begin(pdescription)
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (room@pragma(defn)@index(room)) @itemsep show memory allocation statistics
+@begin(pdescription)
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ (type-of@pragma(defn)@index(type-of) @i<expr>) @itemsep returns the type of the expression
+@begin(pdescription)
+ @i<expr> @itemsep the expression to return the type of
+
+ returns @itemsep @xlcode(nil) if the value is @xlcode(nil) otherwise one of the symbols:
+
+@begin(pdescription)
+ SYMBOL @itemsep for symbols
+
+ OBJECT @itemsep for objects
+
+ CONS @itemsep for conses
+
+ SUBR @itemsep for built-in functions
+
+ FSUBR @itemsep for special forms
+
+ CLOSURE @itemsep for defined functions
+
+ STRING @itemsep for strings
+
+ FIXNUM @itemsep for integers
+
+ FLONUM @itemsep for floating point numbers
+
+ CHARACTER @itemsep for characters
+
+ FILE-STREAM @itemsep for file pointers
+
+ UNNAMED-STREAM @itemsep for unnamed streams
+
+ ARRAY @itemsep for arrays
+
+@end(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ (peek@pragma(defn)@index(peek) @i<addrs>) @itemsep peek at a location in memory
+@begin(pdescription)
+ @i<addrs> @itemsep the address to peek at (integer)
+
+ returns @itemsep the value at the specified address (integer)
+
+@end(pdescription)
+@blankspace(1)
+
+ (poke@pragma(defn)@index(poke) @i<addrs> @i<value>) @itemsep poke a value into memory
+@begin(pdescription)
+ @i<addrs> @itemsep the address to poke (integer)
+
+ @i<value> @itemsep the value to poke into the address (integer)
+
+ returns @itemsep the value
+
+@end(pdescription)
+@blankspace(1)
+
+ (bigendianp@pragma(defn)@index(bigendianp)@index(endian)@index(big endian)@index(little endian)) @itemsep is this a big-endian machine?
+@begin(pdescription)
+ returns @itemsep T if this a big-endian architecture, storing the high-order byte of an integer at the lowest byte address of the integer; otherwise, NIL.
+@foot(This is not a standard XLISP 2.0 function.)
+
+@end(pdescription)
+@blankspace(1)
+
+ (address-of@pragma(defn)@index(address-of) @i<expr>) @itemsep get the address of an xlisp node
+@begin(pdescription)
+ @i<expr> @itemsep the node
+
+ returns @itemsep the address of the node (integer)
+
+@end(pdescription)
+@blankspace(1)
+
+ (exit@pragma(defn)@index(exit)) @itemsep exit xlisp
+@begin(pdescription)
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ (setup-console@pragma(defn)@index(setup-console)@index(window initialization)) @itemsep set default console attributes
+@begin(pdescription)
+ returns @itemsep NIL
+
+Note: Under Windows, Nyquist normally starts up in a medium-sized console window with black text and a white background, with a window title of ``Nyquist.'' This is normally accomplished by calling @xlcode(setup-console) in @code(system.lsp). In Nyquist, you can avoid this behavior by setting @xlcode(*setup-console*) to NIL in your @code(init.lsp) file. If @xlcode(setup-console) is not called, Nyquist uses standard input and output as is. This is what you want if you are running Nyquist inside of emacs, for example.@index(emacs, using Nyquist with)
+
+@end(pdescription)
+@blankspace(1)
+
+ (echoenabled@pragma(defn)@index(echoenabled)@index(console, XLISP) @i<flag>) @itemsep turn console input echoing on or off
+@begin(pdescription)
+ @i<flag> @itemsep T to enable echo, NIL to disable
+
+ returns @itemsep NIL
+
+Note: This function is only implemented under Linux and Mac OS X. If Nyquist I/O is redirected through pipes,
+the Windows version does not echo the input, but the Linux and Mac versions do. You can turn off echoing with
+this function. Under windows it is defined to do nothing.
+
+@end(pdescription)
+@end(fdescription)
+
+@section(File I/O Functions)@index(File I/O Functions)
+
+@subsection(Input from a File)@index(Input from a File)
+
+To open a file for input, use the @xlcode(open) function with the keyword
+argument @xlcode(:direction) set to @xlcode(:input). To open a file for output,
+use the @xlcode(open) function with the keyword argument @xlcode(:direction) set
+to @xlcode(:output). The @xlcode(open) function takes a single required argument which
+is the name of the file to be opened. This name can be in the form of a
+string or a symbol. The @xlcode(open) function returns an object of type
+@xlcode(FILE-STREAM) if it succeeds in opening the specified file. It returns the
+value @xlcode(nil) if it fails. In order to manipulate the file, it is
+necessary to save the value returned by the @xlcode(open) function. This is
+usually done by assigning it to a variable with the @xlcode(setq) special form or by
+binding it using @xlcode(let) or @xlcode(let*). Here is an example:
+@begin(example)
+(setq fp (open "init.lsp" :direction :input))
+@end(example)
+ Evaluating this expression will result in the file @code(init.lsp)
+ being opened. The file object that will be returned by the @xlcode(open)
+ function will be assigned to the variable @xlcode(fp).
+
+ It is now possible to use the file for input. To read an
+ expression from the file, just supply the value of the @xlcode(fp)
+ variable as the optional @i(stream) argument to @xlcode(read).
+@begin(example)
+(read fp)
+@end(example)
+ Evaluating this expression will result in reading the first
+ expression from the file @code(init.lsp). The expression will be
+ returned as the result of the @xlcode(read) function. More expressions
+ can be read from the file using further calls to the @xlcode(read)
+ function. When there are no more expressions to read, the @xlcode(read)
+ function will return @xlcode(nil) (or whatever value was supplied as the
+ second argument to @xlcode(read)).
+
+ Once you are done reading from the file, you should close it.
+ To close the file, use the following expression:
+@begin(example)
+(close fp)
+@end(example)
+ Evaluating this expression will cause the file to be closed.
+
+@subsection(Output to a File)@index(Output to a File)
+
+ Writing to a file is pretty much the same as reading from one.
+ You need to open the file first. This time you should use the
+ @xlcode(open) function to indicate that you will do output to the file.
+ For example:
+@begin(example)
+(setq fp (open "test.dat" :direction :output))
+@end(example)
+ Evaluating this expression will open the file @code(test.dat) for
+ output. If the file already exists, its current contents will
+ be discarded. If it doesn't already exist, it will be created.
+ In any case, a @xlcode(FILE-STREAM) object will be returned by the @xlcode(OPEN)
+ function. This file object will be assigned to the @xlcode(fp)
+ variable.
+
+ It is now possible to write to this file by supplying the value
+ of the @xlcode(fp) variable as the optional @i(stream) parameter in the @xlcode(print) function.
+@begin(example)
+(print "Hello there" fp)
+@end(example)
+ Evaluating this expression will result in the string ``Hello
+ there'' being written to the file @code(test.dat). More data can be
+ written to the file using the same technique.
+
+ Once you are done writing to the file, you should close it.
+ Closing an output file is just like closing an input file.
+@begin(example)
+(close fp)
+@end(example)
+ Evaluating this expression will close the output file and make
+ it permanent.
+
+@subsection(A Slightly More Complicated File Example)
+
+ This example shows how to open a file, read each Lisp expression
+ from the file and print it. It demonstrates the use of files
+ and the use of the optional @i(stream) argument to the @xlcode(read)
+ function.
+@begin(programexample)
+(do* ((fp (open "test.dat" :direction :input))
+ (ex (read fp) (read fp)))
+ ((null ex) nil)
+ (print ex))
+@end(programexample)
+
diff --git a/docsrc/xlisp/xlisp.mss b/docsrc/xlisp/xlisp.mss
new file mode 100644
index 0000000..cc00251
--- /dev/null
+++ b/docsrc/xlisp/xlisp.mss
@@ -0,0 +1,4016 @@
+@define(codef, FaceCode T, size 11)
+@comment{In my original scribe conversion of the ascii xlisp documentation, I used
+ times roman fonts for xlisp function names and code text in general. To be
+ consistent with Nyquist documentation, I have changed the code font to xlcode
+ which is defined here. If this turns out to be a problem, redefine xlcode to
+ use the regular FaceCode. -RBD}
+@define(xlcode, FaceCode T, size 11)
+@textform(pragma=[])
+@section(Introduction)
+ XLISP is an experimental programming language combining some of
+ the features of Common Lisp with an object-oriented extension
+ capability. It was implemented to allow experimentation with
+ object-oriented programming on small computers.
+
+ Implementations of XLISP run on virtually every operating system.
+ XLISP is completely written in the programming language
+ C and is easily extended with user written built-in functions
+ and classes. It is available in source form to non-commercial
+ users.
+
+ Many Common Lisp functions are built into XLISP. In addition,
+ XLISP defines the objects Object and Class as primitives.
+ Object is the only class that has no superclass and hence is
+ the root of the class hierarchy tree. Class is the class of
+ which all classes are instances (it is the only object that is
+ an instance of itself).
+
+ This document is a brief description of XLISP. It assumes some
+ knowledge of LISP and some understanding of the concepts of
+ object-oriented programming.
+
+ I recommend the book @i(Lisp) by Winston and Horn and published by
+ Addison Wesley for learning Lisp. The first edition of this
+ book is based on MacLisp and the second edition is based on
+ Common Lisp.
+
+ You will probably also need a copy of @i(Common Lisp: The
+ Language) by Guy L. Steele, Jr., published by Digital Press to
+ use as a reference for some of the Common Lisp functions that
+ are described only briefly in this document.
+
+ @section(A Note From The Author)
+
+ If you have any problems with XLISP, feel free to contact me [me being David Betz - RBD] for
+ help or advice. Please remember that since XLISP is available
+ in source form in a high level language, many users [e.g. that Dannenberg fellow - RBD] have been
+ making versions available on a variety of machines. If you call
+ to report a problem with a specific version, I may not be able
+ to help you if that version runs on a machine to which I don't
+ have access. Please have the version number of the version that
+ you are running readily accessible before calling me.
+
+ If you find a bug in XLISP, first try to fix the bug yourself
+ using the source code provided. If you are successful in fixing
+ the bug, send the bug report along with the fix to me. If you
+ don't have access to a C compiler or are unable to fix a bug,
+ please send the bug report to me and I'll try to fix it.
+
+ Any suggestions for improvements will be welcomed. Feel free to
+ extend the language in whatever way suits your needs. However,
+ PLEASE DO NOT RELEASE ENHANCED VERSIONS WITHOUT CHECKING WITH ME
+ FIRST!! I would like to be the clearing house for new features
+ added to XLISP. If you want to add features for your own
+ personal use, go ahead. But, if you want to distribute your
+ enhanced version, contact me first. Please remember that the
+ goal of XLISP is to provide a language to learn and experiment
+ with LISP and object-oriented programming on small computers. I
+ don't want it to get so big that it requires megabytes of memory
+ to run.
+
+
+ @section(XLISP Command Loop)@index(XLISP Command Loop)@index(Command Loop)
+
+ When XLISP is started, it first tries to load the workspace
+ @code(xlisp.wks) from the current directory. If that file doesn't
+ exist, XLISP builds an initial workspace, empty except for the
+ built-in functions and symbols.
+
+ Then XLISP attempts to load @code(init.lsp) from the current
+ directory. It then loads any files named as parameters on the
+ command line (after appending @code(.lsp) to their names).
+
+ XLISP then issues the following prompt:
+@begin(example)
+ >
+@end(example)
+ This indicates that XLISP is waiting for an expression to be
+ typed.
+
+ When a complete expression has been entered, XLISP attempts to
+ evaluate that expression. If the expression evaluates
+ successfully, XLISP prints the result and then returns to the
+ initial prompt waiting for another expression to be typed.
+
+ @section(Special Characters)@index(control characters, XLISP)
+
+ When XLISP is running from a console, some control characters invoke operations:
+@begin(itemize)
+Backspace and Delete characters erase the previous character on the input line (if any).
+
+Control-U erases the entire input line.
+
+Control-C executes the TOP-LEVEL function.
+
+Control-G executes the CLEAN-UP function.
+
+Control-P executes the CONTINUE function.
+
+Control-B stops execution and enters the break command loop. Execution can be continued by typing Control-P or (CONTINUE).
+
+Control-E turns on character echoing (Linux and Mac OS X only).
+
+Control-F turns off character echoing (Linux and Mac OS X only).
+
+Control-T evaluates the INFO function.
+@end(itemize)
+
+ @section(Break Command Loop)@index(break)
+
+ When XLISP encounters an error while evaluating an expression,
+ it attempts to handle the error in the following way:
+
+ If the symbol @xlcode(*breakenable*@index(*breakenable*)) is
+ true, the message corresponding to the error is printed. If
+ the error is correctable, the correction message is printed.
+
+ If the symbol @xlcode(*tracenable*@index(*tracenable*)) is true, a trace back is printed.
+ The number of entries printed depends on the value of the symbol
+ @xlcode(*tracelimit*@index(*tracelimit*)). If this symbol is set to something other than a
+ number, the entire trace back stack is printed.
+
+ XLISP then enters a read/eval/print loop to allow the user to
+ examine the state of the interpreter in the context of the
+ error. This loop differs from the normal top-level
+ read/eval/print loop in that if the user invokes the function
+ @xlcode(continue), XLISP will continue from a correctable error. If
+ the user invokes the function @xlcode(clean-up), XLISP will abort the
+ break loop and return to the top level or the next lower
+ numbered break loop. When in a break loop, XLISP prefixes the
+ break level to the normal prompt.
+
+ If the symbol @xlcode(*breakenable*@index(*breakenable*)) is @xlcode(nil), XLISP looks for a
+ surrounding errset function. If one is found, XLISP examines
+ the value of the print flag. If this flag is true, the error
+ message is printed. In any case, XLISP causes the errset
+ function call to return @xlcode(nil).
+
+ If there is no surrounding errset function, XLISP prints the
+ error message and returns to the top level.
+
+ @section(Data Types)@index(XLISP Data Types)@index(Data Types)
+
+ There are several different data types available to XLISP
+ programmers.
+
+@begin(itemize)
+lists
+
+symbols
+
+strings
+
+integers
+
+characters
+
+floats
+
+objects
+
+arrays
+
+streams
+
+subrs (built-in functions)
+
+fsubrs (special forms)
+
+closures (user defined functions)
+@end(itemize)
+
+
+
+
+@section(The Evaluator)@index(evaluator)@index(XLISP evaluator)
+
+ The process of evaluation in XLISP:
+@begin(itemize)
+ Strings, integers, characters, floats, objects, arrays, streams,
+ subrs, fsubrs and closures evaluate to themselves.
+
+ Symbols act as variables and are evaluated by retrieving the
+ value associated with their current binding.
+
+ Lists are evaluated by examining the first element of the list
+ and then taking one of the following actions:
+@begin(itemize)
+ If it is a symbol, the functional binding of the symbol is
+ retrieved.
+
+ If it is a lambda expression, a closure is constructed for
+ the function described by the lambda expression.
+
+ If it is a subr, fsubr or closure, it stands for itself.
+
+ Any other value is an error.
+@end(itemize)
+ Then, the value produced by the previous step is examined:
+@begin(itemize)
+ If it is a subr or closure, the remaining list elements are
+ evaluated and the subr or closure is called with these
+ evaluated expressions as arguments.
+
+ If it is an fsubr, the fsubr is called using the remaining
+ list elements as arguments (unevaluated).
+
+ If it is a macro, the macro is expanded using the remaining
+ list elements as arguments (unevaluated). The macro
+ expansion is then evaluated in place of the original macro
+ call.
+@end(itemize)
+@end(itemize)
+
+@section(Lexical Conventions)@index(Lexical conventions)@index(XLISP Lexical Conventions)
+
+ The following conventions must be followed when entering XLISP
+ programs:
+
+ Comments in XLISP code begin with a semi-colon character and
+ continue to the end of the line.
+
+ Symbol names in XLISP can consist of any sequence of non-blank
+ printable characters except the following:
+@begin(example)
+ ( ) ' ` , " ;
+@end(example)
+ Uppercase and lowercase characters are not distinguished within
+ symbol names. All lowercase characters are mapped to uppercase
+ on input.
+
+ Integer literals consist of a sequence of digits optionally
+ beginning with a @code(+) or @code(-). The range of values an integer can
+ represent is limited by the size of a C @code(long) on the machine on
+ which XLISP is running.
+
+ Floating point literals consist of a sequence of digits
+ optionally beginning with a @code(+) or @code(-) and including an embedded
+ decimal point. The range of values a floating point number can
+ represent is limited by the size of a C @code(float) (@code(double) on
+ machines with 32 bit addresses) on the machine on which XLISP is
+ running.
+
+ Literal strings are sequences of characters surrounded by double
+ quotes. Within quoted strings the ``@code(\)'' character is used to
+ allow non-printable characters to be included. The codes
+ recognized are:
+@begin(itemize)
+@code(\\) means the character ``@code(\)''
+
+@code(\n) means newline
+
+@code(\t) means tab
+
+@code(\r) means return
+
+@code(\f) means form feed
+
+@code(\nnn) means the character whose octal code is nnn
+@end(itemize)
+
+@section(Readtables)@index(Readtables)
+
+ The behavior of the reader is controlled by a data structure
+ called a @i(readtable). The reader uses the symbol @xlcode(*readtable*@index(*readtable*)) to
+ locate the current readtable. This table controls the
+ interpretation of input characters. It is an array with 128
+ entries, one for each of the ASCII character codes. Each entry
+ contains one of the following things:
+@begin(itemize)
+ @xlcode(NIL) @itemsep Indicating an invalid character
+
+ @xlcode(:CONSTITUENT) @itemsep Indicating a symbol constituent
+
+ @xlcode(:WHITE-SPACE) @itemsep Indicating a whitespace character
+
+ @xlcode[(:TMACRO . @i(fun))] @itemsep Terminating readmacro
+
+ @xlcode[(:NMACRO . @i(fun))] @itemsep Non-terminating readmacro
+
+ @xlcode(:SESCAPE) @itemsep Single escape character ('\')
+
+ @xlcode(:MESCAPE) @itemsep Multiple escape character ('|')
+@end(itemize)
+
+ In the case of @xlcode(:TMACRO) and @xlcode(:NMACRO), the @i(fun) component is a
+ function. This can either be a built-in readmacro function or a
+ lambda expression. The function should take two parameters.
+ The first is the input stream and the second is the character
+ that caused the invocation of the readmacro. The readmacro
+ function should return @xlcode(NIL) to indicate that the character should
+ be treated as white space or a value consed with @xlcode(NIL) to indicate
+ that the readmacro should be treated as an occurence of the
+ specified value. Of course, the readmacro code is free to read
+ additional characters from the input stream.
+
+ XLISP defines several useful read macros@index(read macros):
+@begin(itemize)
+ @xlcode(')@i[<expr>] == @xlcode{(quote} @i[<expr>]@xlcode{)}
+
+ @xlcode(#')@i[<expr>] == @xlcode{(function} @i[<expr>]@xlcode{)}
+
+ @xlcode{#(}@i[<expr>]...@xlcode{)} == an array of the specified expressions
+
+ @xlcode(#x)@i[<hdigits>] == a hexadecimal number (0-9,A-F)
+
+ @xlcode(#o)@i[<odigits>] == an octal number (0-7)
+
+ @xlcode(#b)@i[<bdigits>] == a binary number (0-1)
+
+ @xlcode(#\)@i[<char>] == the ASCII code of the character
+
+ @xlcode(#|) ... @xlcode(|#) == a comment
+
+ @xlcode(#:)@i[<symbol>] == an uninterned symbol
+
+ @xlcode(`)@i[<expr>] == @xlcode{(backquote} @i[<expr>]@xlcode{)}
+
+ @xlcode(,)@i[<expr>] == @xlcode{(comma} @i[<expr>]@xlcode{)}
+
+ @xlcode(,@@)@i[<expr>] == @xlcode{(comma-at} @i[<expr>]@xlcode{)}
+
+@end(itemize)
+@section(Lambda Lists)@index(Lambda Lists)
+
+ There are several forms in XLISP that require that a ``lambda
+ list'' be specified. A lambda list is a definition of the
+ arguments accepted by a function. There are four different
+ types of arguments.
+
+ The lambda list starts with required arguments. Required
+ arguments must be specified in every call to the function.
+
+ The required arguments are followed by the @xlcode(&optional) arguments.
+ Optional arguments may be provided or omitted in a call. An
+ initialization expression may be specified to provide a default
+ value for an @xlcode(&optional) argument if it is omitted from a call.
+ If no initialization expression is specified, an omitted
+ argument is initialized to @xlcode(NIL). It is also possible to provide
+ the name of a @xlcode(supplied-p) variable that can be used to
+ determine if a call provided a value for the argument or if the
+ initialization expression was used. If specified, the supplied-
+ p variable will be bound to T if a value was specified in the
+ call and @xlcode(NIL) if the default value was used.
+
+ The @xlcode(&optional) arguments are followed by the @xlcode(&rest) argument. The
+ @xlcode(&rest) argument gets bound to the remainder of the argument list
+ after the required and @xlcode(&optional) arguments have been removed.
+
+ The @xlcode(&rest) argument is followed by the @xlcode(&key) arguments. When a
+ keyword argument is passed to a function, a pair of values
+ appears in the argument list. The first expression in the pair
+ should evaluate to a keyword symbol (a symbol that begins with a
+ ``@code(:)''). The value of the second expression is the value of the
+ keyword argument. Like @xlcode(&optional) arguments, @xlcode(&key) arguments can
+ have initialization expressions and supplied-p variables. In
+ addition, it is possible to specify the keyword to be used in a
+ function call. If no keyword is specified, the keyword obtained
+ by adding a ``@code(:)'' to the beginning of the keyword argument symbol
+ is used. In other words, if the keyword argument symbol is
+ @xlcode(foo), the keyword will be @xlcode(:foo).
+
+ The @xlcode(&key) arguments are followed by the @xlcode(&aux) variables. These
+ are local variables that are bound during the evaluation of the
+ function body. It is possible to have initialization
+ expressions for the @xlcode(&aux) variables.
+
+ Here is the complete syntax for lambda lists:
+@begin(display)
+ (@i<rarg>...
+ [@xlcode(&optional) [@i<oarg> | (@i<oarg> [@i<init> [@i<svar>]])]...]
+ [@xlcode(&rest) @i<rarg>]
+ [@xlcode(&key)
+ [@i<karg> | ([@i<karg> | (@i<key> @i<karg>)] [@i<init> [@i<svar>]])]...
+ @xlcode(&allow)-other-keys]
+ [@xlcode(&aux)
+ [@i<aux> | (@i<aux> [@i<init>])]...])
+
+ where:
+
+ @i<rarg> is a required argument symbol
+ @i<oarg> is an @xlcode(&optional) argument symbol
+ @i<rarg> is the @xlcode(&rest) argument symbol
+ @i<karg> is a @xlcode(&key) argument symbol
+ @i<key> is a keyword symbol
+ @i<aux> is an auxiliary variable symbol
+ @i<init> is an initialization expression
+ @i<svar> is a supplied-p variable symbol
+@end(display)
+
+
+@section(Objects)@index(Objects)@label(objects-sec)
+
+ Definitions:
+@begin(itemize)
+selector @itemsep a symbol used to select an appropriate method
+
+message @itemsep a selector and a list of actual arguments
+
+method @itemsep the code that implements a message
+@end(itemize)
+ Since XLISP was created to provide a simple basis for
+ experimenting with object-oriented programming, one of the
+ primitive data types included is @i(object). In XLISP, an object
+ consists of a data structure containing a pointer to the
+ object's class as well as an array containing the values of the
+ object's instance variables.
+
+ Officially, there is no way to see inside an object (look at the
+ values of its instance variables). The only way to communicate
+ with an object is by sending it a message.
+
+ You can send a message to an object using the @xlcode(send) function.
+ This function takes the object as its first argument, the
+ message selector as its second argument (which must be a symbol)
+ and the message arguments as its remaining arguments.
+
+ The @xlcode(send) function determines the class of the receiving object
+ and attempts to find a method corresponding to the message
+ selector in the set of messages defined for that class. If the
+ message is not found in the object's class and the class has a
+ super-class, the search continues by looking at the messages
+ defined for the super-class. This process continues from one
+ super-class to the next until a method for the message is found.
+ If no method is found, an error occurs.
+
+@begin(comment)
+THIS IS WRONG -- I DON'T KNOW IF IT WAS CORRECT IN THE ORIGINAL XLISP. -RBD
+ A message can also be sent from the body of a method by using
+ the current object, but the method lookup starts with the
+ object's superclass rather than its class. This allows a
+ subclass to invoke a standard method in its parent class even
+ though it overrides that method with its own specialized
+ version.
+@end(comment)
+
+ When a method is found, the evaluator binds the receiving object
+ to the symbol @xlcode(self) and evaluates the method using the
+ remaining elements of the original list as arguments to the
+ method. These arguments are always evaluated prior to being
+ bound to their corresponding formal arguments. The result of
+ evaluating the method becomes the result of the expression.
+
+ Within the body of a method, a message can be sent to the current
+ object by calling the @xlcode[(send self ...)]. The method lookup
+ starts with the object's class regardless of the class containing
+ the current method.
+
+ Sometimes it is desirable to invoke a general method in a superclass
+ even when it is overridden by a more specific method in a subclass.
+ This can be accomplished by calling @xlcode(send-super), which begins
+ the method lookup in the superclass of the class defining the current
+ method rather than in the class of the current object.
+
+ The @xlcode(send-super) function takes a selector as its first argument
+ (which must be a symbol) and the message arguments as its remaining
+ arguments. Notice that @xlcode(send-super) can only be sent from within
+ a method, and the target of the message is always the current object
+ (@xlcode(self)). @xlcode[(send-super ...)] is similar to
+ @xlcode[(send self ...)] except that method lookup begins in the
+ superclass of the class containing the current method
+ rather than the class of the current object.
+
+@section(The ``Object'' Class)@index(Object Class)
+
+@xlcode(Object)@index(Object) @itemsep the top of the class hierarchy.
+
+Messages:
+@begin(fdescription)
+@xlcode(:show@index(:show)) @itemsep show an object's instance variables.
+@begin(pdescription)
+returns @itemsep the object
+@end(pdescription)
+@blankspace(1)
+
+@xlcode{:class@index(:class)} @itemsep return the class of an object
+@begin(pdescription)
+returns @itemsep the class of the object
+@end(pdescription)
+@blankspace(1)
+
+@xlcode{:isa@index(:isa)} @i(class) @itemsep test if object inherits from class
+@begin(pdescription)
+returns @itemsep @xlcode(t) if object is an instance of @i(class) or a subclass of @i(class), otherwise @xlcode(nil)
+@end(pdescription)
+@blankspace(1)
+
+@xlcode(:isnew@index(:isnew)) @itemsep the default object initialization routine
+@begin(pdescription)
+returns @itemsep the object
+@end(pdescription)
+@end(fdescription)
+
+@section(The ``Class'' Class)@index(Class class)
+
+@xlcode(Class@index(Class)) @itemsep class of all object classes (including itself)
+
+ Messages:
+
+@begin(fdescription)
+ @xlcode(:new@index(:new)) @itemsep create a new instance of a class
+@begin(pdescription)
+ returns @itemsep the new class object
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode(:isnew@index(:isnew)) @i<ivars> [@i<cvars> [@i<super>]] @itemsep initialize a new class
+@begin(pdescription)
+ @i<ivars> @itemsep the list of instance variable symbols
+
+ @i<cvars> @itemsep the list of class variable symbols
+
+ @i<super> @itemsep the superclass (default is object)
+
+ returns @itemsep the new class object
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode(:answer@index(:answer)) @i<msg> @i<fargs> @i<code> @itemsep add a message to a class
+@begin(pdescription)
+ @i<msg> @itemsep the message symbol
+
+ @i<fargs> @itemsep the formal argument list (lambda list)
+
+ @i<code> @itemsep a list of executable expressions
+
+ returns @itemsep the object
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+ When a new instance of a class is created by sending the message
+ @xlcode(:new) to an existing class, the message @xlcode(:isnew) followed by
+ whatever parameters were passed to the @xlcode(:new) message is sent to
+ the newly created object.
+
+ When a new class is created by sending the @xlcode(:new) message to the
+ object @xlcode(Class), an optional parameter may be specified
+ indicating the superclass of the new class. If this parameter
+ is omitted, the new class will be a subclass of @xlcode(Object). A
+ class inherits all instance variables, class variables, and
+ methods from its super-class.
+
+@section(Profiling)@index(profiling)
+The Xlisp 2.0 release has been extended with a profiling facility, which counts how many times and where @xlcode(eval) is executed. A separate count is maintained for each named function, closure, or macro, and a count indicates an @xlcode(eval) in the immediately (lexically) enclosing named function, closure, or macro. Thus, the count gives an indication of the amount of time spent in a function, not counting nested function calls. The list of all functions executed is maintained on the global @xlcode(*profile*) variable. These functions in turn have @xlcode(*profile*) properties, which maintain the counts. The profile system merely increments counters and puts symbols on the @xlcode(*profile*) list. It is up to the user to initialize data and gather results. Profiling is turned on or off with the @xlcode(profile) function. Unfortunately, methods cannot be profiled with this facility.
+
+@label(symbols-sec)
+@section(Symbols)@index(symbols)
+@begin(itemize)
+@codef(self)@pragma(defn)@index(self) @dash the current object (within a method context)
+
+@codef(*obarray*@pragma(defn)@index(*obarray*)) @dash the object hash table
+
+@codef(*standard-input*@pragma(defn)@index(*standard-input*)) @dash the standard input stream
+
+@codef(*standard-output*@pragma(defn)@index(*standard-output*)) @dash the standard output stream
+
+@codef(*error-output*@pragma(defn)@index(*error-output*)) @dash the error output stream
+
+@codef(*trace-output*@pragma(defn)@index(*trace-output*)) @dash the trace output stream
+
+@codef(*debug-io*@pragma(defn)@index(*debug-io*)) @dash the debug i/o stream
+
+@codef(*breakenable*@pragma(defn)@index(*breakenable*)) @dash flag controlling entering break loop on errors
+
+@codef(*tracelist*@pragma(defn)@index(*tracelist*)) @dash list of names of functions to trace
+
+@codef(*tracenable*@pragma(defn)@index(*tracenable*)) @dash enable trace back printout on errors
+
+@codef(*tracelimit*@pragma(defn)@index(*tracelimit*)) @dash number of levels of trace back information
+
+@codef(*evalhook*@pragma(defn)@index(*evalhook*)) @dash user substitute for the evaluator function
+
+@codef(*applyhook*@pragma(defn)@index(*applyhook*)) @dash (not yet implemented)
+
+@codef(*readtable*@pragma(defn)@index(*readtable*)) @dash the current readtable
+
+@codef(*unbound*@pragma(defn)@index(*unbound*)) @dash indicator for unbound symbols
+
+@codef(*gc-flag*@pragma(defn)@index(*gc-flag*)) @dash controls the printing of gc messages
+
+@codef(*gc-hook*@pragma(defn)@index(*gc-hook*)) @dash function to call after garbage collection
+
+@codef(*integer-format*@pragma(defn)@index(*integer-format*)) @dash format for printing integers (``%d'' or ``%ld'')
+
+@codef(*float-format*@pragma(defn)@index(*float-format*)) @dash format for printing floats (``%g'')
+
+@codef(*print-case*@pragma(defn)@index(*print-case*)) @dash symbol output case (:upcase or :downcase)
+@end(itemize)
+
+ There are several symbols maintained by the read/eval/print
+ loop. The symbols @code(+), @code(++), and @code(+++) are bound to the most
+ recent three input expressions. The symbols @code(*), @code(**) and @code(***)
+ are bound to the most recent three results. The symbol @code(-) is
+ bound to the expression currently being evaluated. It becomes
+ the value of @code(+) at the end of the evaluation.
+@section(Evaluation Functions)@index(evaluation functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{eval(@i(expr))} @c{[sal]}
+
+ @xlcode{(eval@pragma(defn)@index(eval) @t(@i(expr)))} @c{[lisp]} @itemsep evaluate an xlisp expression
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to be evaluated
+
+ returns @itemsep the result of evaluating the expression
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{apply(@i(fun), @i(args))} @c{[sal]}
+
+ @xlcode{(apply@pragma(defn)@index(apply) @t(@i(fun)) @t(@i(args)))} @c{[lisp]} @itemsep apply a function to a list of arguments
+@end(fgroup)
+@begin(pdescription)
+ @i<fun> @itemsep the function to apply (or function symbol)
+
+ @i<args> @itemsep the argument list
+
+ returns @itemsep the result of applying the function to the arguments
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{funcall(@i(fun), @i(arg)@r(...))} @c{[sal]}
+
+ @xlcode{(funcall@pragma(defn)@index(funcall) @t(@i(fun)) @t(@i(arg))@r(...))} @c{[lisp]} @itemsep call a function with arguments
+@end(fgroup)
+@begin(pdescription)
+ @i<fun> @itemsep the function to call (or function symbol)
+
+ @i<arg> @itemsep arguments to pass to the function
+
+ returns @itemsep the result of calling the function with the arguments
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{quote(@i(expr))} @c{[sal]}
+
+ @xlcode{(quote@pragma(defn)@index(quote) @t(@i(expr)))} @c{[lisp]} @itemsep return an expression unevaluated
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to be quoted (quoted)
+
+ returns @itemsep @i<expr> unevaluated
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{function(@i(expr))} @c{[sal]}
+
+ @xlcode{(function@pragma(defn)@index(function) @t(@i(expr)))} @c{[lisp]} @itemsep get the functional interpretation
+@end(fgroup)
+
+@begin(pdescription)
+ @i<expr> @itemsep the symbol or lambda expression (quoted)
+
+ returns @itemsep the functional interpretation
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{backquote(@i(expr))} @c{[sal]}
+
+ @xlcode{(backquote@pragma(defn)@index(backquote) @t(@i(expr)))} @c{[lisp]} @itemsep fill in a template
+@end(fgroup)
+
+@begin(pdescription)
+ @i<expr> @itemsep the template
+
+ returns @itemsep a copy of the template with comma and comma-at
+
+ expressions expanded
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{lambda(@i(args), @i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(lambda@pragma(defn)@index(lambda) @t(@i(args)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep make a function closure
+@end(fgroup)
+
+@begin(pdescription)
+ @i<args> @itemsep formal argument list (lambda list) (quoted)
+
+ @i<expr> @itemsep expressions of the function body
+
+ returns @itemsep the function closure
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{get-lambda-expression(@i(closure))} @c{[sal]}
+
+ @xlcode{(get-lambda-expression@pragma(defn)@index(get-lambda-expression) @t(@i(closure)))} @c{[lisp]} @itemsep get the lambda expression
+@end(fgroup)
+
+@begin(pdescription)
+ @i<closure> @itemsep the closure
+
+ returns @itemsep the original lambda expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{macroexpand(@i(form))} @c{[sal]}
+
+ @xlcode{(macroexpand@pragma(defn)@index(macroexpand) @t(@i(form)))} @c{[lisp]} @itemsep recursively expand macro calls
+@end(fgroup)
+
+@begin(pdescription)
+ @i<form> @itemsep the form to expand
+
+ returns @itemsep the macro expansion
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{macroexpand-1(@i(form))} @c{[sal]}
+
+ @xlcode{(macroexpand-1@pragma(defn)@index(macroexpand-1) @t(@i(form)))} @c{[lisp]} @itemsep expand a macro call
+@end(fgroup)
+
+@begin(pdescription)
+ @i<form> @itemsep the macro call form
+
+ returns @itemsep the macro expansion
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+
+@section(Symbol Functions)@index(Symbol Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{set(@i(sym), @i(expr))} @c{[sal]}
+
+ @xlcode{(set@pragma(defn)@index(set) @t(@i(sym)) @t(@i(expr)))} @c{[lisp]} @itemsep set the value of a symbol
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol being set
+
+ @i<expr> @itemsep the new value
+
+ returns @itemsep the new value
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{setq([@i(sym), @i(expr)]@r(...))} @c{[sal]}
+
+ @xlcode{(setq@pragma(defn)@index(setq) [@t(@i(sym)) @t(@i(expr))]@r(...))} @c{[lisp]} @itemsep set the value of a symbol
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol being set (quoted)
+
+ @i<expr> @itemsep the new value
+
+ returns @itemsep the new value
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{psetq([@i(sym), @i(expr)]@r(...))} @c{[sal]}
+
+ @xlcode{(psetq@pragma(defn)@index(psetq) [@t(@i(sym)) @t(@i(expr))]@r(...))} @c{[lisp]} @itemsep parallel version of setq
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol being set (quoted)
+
+ @i<expr> @itemsep the new value
+
+ returns @itemsep the new value
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{setf([@i(place), @i(expr)]@r(...))} @c{[sal]}
+
+ @xlcode{(setf@pragma(defn)@index(setf) [@t(@i(place)) @t(@i(expr))]@r(...))} @c{[lisp]} @itemsep set the value of a field
+@end(fgroup)
+@begin(pdescription)
+ @i<place> @itemsep the field specifier (quoted):
+
+@begin(pdescription)
+ @i<sym> @itemsep set value of a symbol
+
+ (car @i<expr>) @itemsep set car of a cons node
+
+ (cdr @i<expr>) @itemsep set cdr of a cons node
+
+ (nth @i<n> @i<expr>) @itemsep set nth car of a list
+
+ (aref @i<expr> @i<n>) @itemsep set nth element of an array
+
+ (get @i<sym> @i<prop>) @itemsep set value of a property
+
+ (symbol-value @i<sym>) @itemsep set value of a symbol
+
+ (symbol-function @i<sym>) @itemsep set functional value of a symbol
+
+ (symbol-plist @i<sym>) @itemsep set property list of a symbol
+
+@end(pdescription)@pragma(stopcodef)
+ @i<expr> @itemsep the new value
+
+ returns @itemsep the new value
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ @xlcode{(defun@pragma(defn)@index(defun) @t(@i(sym)) @t(@i(fargs)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep define a function
+
+@pragma(startcodef)
+ @xlcode{(defmacro@pragma(defn)@index(defmacro) @t(@i(sym)) @t(@i(fargs)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep define a macro
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep symbol being defined (quoted)
+
+ @i<fargs> @itemsep formal argument list (lambda list) (quoted)
+
+ @i<expr> @itemsep expressions constituting the body of the
+
+ function (quoted)
+ returns @itemsep the function symbol
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{gensym([@i(tag)])} @c{[sal]}
+
+ @xlcode{(gensym@pragma(defn)@index(gensym) [@t(@i(tag))])} @c{[lisp]} @itemsep generate a symbol
+@end(fgroup)
+@begin(pdescription)
+ @i<tag> @itemsep string or number
+
+ returns @itemsep the new symbol
+
+@end(pdescription)
+@blankspace(1)
+
+@begin(fgroup)@xlcode{intern(@i(pname))} @c{[sal]}
+
+ @xlcode{(intern@pragma(defn)@index(intern) @t(@i(pname)))} @c{[lisp]} @itemsep make an interned symbol
+@end(fgroup)
+@begin(pdescription)
+ @i<pname> @itemsep the symbol's print name string
+
+ returns @itemsep the new symbol
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{make-symbol(@i(pname))} @c{[sal]}
+
+ @xlcode{(make-symbol@pragma(defn)@index(make-symbol) @t(@i(pname)))} @c{[lisp]} @itemsep make an uninterned symbol
+@end(fgroup)
+@begin(pdescription)
+ @i<pname> @itemsep the symbol's print name string
+
+ returns @itemsep the new symbol
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{symbol-name(@i(sym))} @c{[sal]}
+
+ @xlcode{(symbol-name@pragma(defn)@index(symbol-name) @t(@i(sym)))} @c{[lisp]} @itemsep get the print name of a symbol
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep the symbol's print name
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{symbol-value(@i(sym))} @c{[sal]}
+
+ @xlcode{(symbol-value@pragma(defn)@index(symbol-value) @t(@i(sym)))} @c{[lisp]} @itemsep get the value of a symbol
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep the symbol's value
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{symbol-function(@i(sym))} @c{[sal]}
+
+ @xlcode{(symbol-function@pragma(defn)@index(symbol-function) @t(@i(sym)))} @c{[lisp]} @itemsep get the functional value of a symbol
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep the symbol's functional value
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{symbol-plist(@i(sym))} @c{[sal]}
+
+ @xlcode{(symbol-plist@pragma(defn)@index(symbol-plist) @t(@i(sym)))} @c{[lisp]} @itemsep get the property list of a symbol
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep the symbol's property list
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{hash(@i(sym), @i(n))} @c{[sal]}
+
+ @xlcode{(hash@pragma(defn)@index(hash) @t(@i(sym)) @t(@i(n)))} @c{[lisp]} @itemsep compute the hash index for a symbol
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol or string
+
+ @i<n> @itemsep the table size (integer)
+
+ returns @itemsep the hash index (integer)
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Property List Functions)@index(Property List Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{get(@i(sym), @i(prop))} @c{[sal]}
+
+ @xlcode{(get@pragma(defn)@index(get) @t(@i(sym)) @t(@i(prop)))} @c{[lisp]} @itemsep get the value of a property
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ @i<prop> @itemsep the property symbol
+
+ returns @itemsep the property value or @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{putprop(@i(sym), @i(val), @i(prop))} @c{[sal]}
+
+ @xlcode{(putprop@pragma(defn)@index(putprop) @t(@i(sym)) @t(@i(val)) @t(@i(prop)))} @c{[lisp]} @itemsep put a property onto a property list
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ @i<val> @itemsep the property value
+
+ @i<prop> @itemsep the property symbol
+
+ returns @itemsep the property value
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{remprop(@i(sym), @i(prop))} @c{[sal]}
+
+ @xlcode{(remprop@pragma(defn)@index(remprop) @t(@i(sym)) @t(@i(prop)))} @c{[lisp]} @itemsep remove a property
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ @i<prop> @itemsep the property symbol
+
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Array Functions)@index(Array Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{aref(@i(array), @i(n))} @c{[sal]}
+
+ @xlcode{(aref@pragma(defn)@index(aref) @t(@i(array)) @t(@i(n)))} @c{[lisp]} @itemsep get the nth element of an array
+@end(fgroup)
+@begin(pdescription)
+ @i<array> @itemsep the array
+
+ @i<n> @itemsep the array index (integer)
+
+ returns @itemsep the value of the array element
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{make-array(@i(size))} @c{[sal]}
+
+ @xlcode{(make-array@pragma(defn)@index(make-array) @t(@i(size)))} @c{[lisp]} @itemsep make a new array
+@end(fgroup)
+@begin(pdescription)
+ @i<size> @itemsep the size of the new array (integer)
+
+ returns @itemsep the new array
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{vector(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(vector@pragma(defn)@index(vector) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep make an initialized vector
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the vector elements
+
+ returns @itemsep the new vector
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(List Functions)@index(List Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{car(@i(expr))} @c{[sal]}
+
+ @xlcode{(car@pragma(defn)@index(car) @t(@i(expr)))} @c{[lisp]} @itemsep return the car of a list node
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the list node
+
+ returns @itemsep the car of the list node
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{cdr(@i(expr))} @c{[sal]}
+
+ @xlcode{(cdr@pragma(defn)@index(cdr) @t(@i(expr)))} @c{[lisp]} @itemsep return the cdr of a list node
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the list node
+
+ returns @itemsep the cdr of the list node
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{c@i(xx)r(@i(expr))} @c{[sal]}
+
+ @xlcode{(c@i(xx)r@index(cxxr) @t(@i(expr)))} @c{[lisp]} @itemsep all c@i(xx)r combinations
+@end(fgroup)
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{c@i(xxx)r(@i(expr))} @c{[sal]}
+
+ @xlcode{(c@i(xxx)r@index(cxxxr) @t(@i(expr)))} @c{[lisp]} @itemsep all c@i(xxx)r combinations
+@end(fgroup)
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{c@i(xxxx)r(@i(expr))} @c{[sal]}
+
+ @xlcode{(c@i(xxxx)r@index(cxxxxr) @t(@i(expr)))} @c{[lisp]} @itemsep all c@i(xxxx)r combinations
+@end(fgroup)
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{first(@i(expr))} @c{[sal]}
+
+ @xlcode{(first@pragma(defn)@index(first) @t(@i(expr)))} @c{[lisp]} @itemsep a synonym for car
+@end(fgroup)
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{second(@i(expr))} @c{[sal]}
+
+ @xlcode{(second@pragma(defn)@index(second) @t(@i(expr)))} @c{[lisp]} @itemsep a synonym for cadr
+@end(fgroup)
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{third(@i(expr))} @c{[sal]}
+
+ @xlcode{(third@pragma(defn)@index(third) @t(@i(expr)))} @c{[lisp]} @itemsep a synonym for caddr
+@end(fgroup)
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{fourth(@i(expr))} @c{[sal]}
+
+ @xlcode{(fourth@pragma(defn)@index(fourth) @t(@i(expr)))} @c{[lisp]} @itemsep a synonym for cadddr
+@end(fgroup)
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{rest(@i(expr))} @c{[sal]}
+
+ @xlcode{(rest@pragma(defn)@index(rest) @t(@i(expr)))} @c{[lisp]} @itemsep a synonym for cdr
+@end(fgroup)
+@begin(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{cons(@i(expr1), @i(expr2))} @c{[sal]}
+
+ @xlcode{(cons@pragma(defn)@index(cons) @t(@i(expr1)) @t(@i(expr2)))} @c{[lisp]} @itemsep construct a new list node
+@end(fgroup)
+@begin(pdescription)
+ @i<expr1> @itemsep the car of the new list node
+
+ @i<expr2> @itemsep the cdr of the new list node
+
+ returns @itemsep the new list node
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{list(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(list@pragma(defn)@index(list) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep create a list of values
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep expressions to be combined into a list
+
+ returns @itemsep the new list
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{append(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(append@pragma(defn)@index(append) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep append lists
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep lists whose elements are to be appended
+
+ returns @itemsep the new list
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{reverse(@i(expr))} @c{[sal]}
+
+ @xlcode{(reverse@pragma(defn)@index(reverse) @t(@i(expr)))} @c{[lisp]} @itemsep reverse a list
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the list to reverse
+
+ returns @itemsep a new list in the reverse order
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{last(@i(list))} @c{[sal]}
+
+ @xlcode{(last@pragma(defn)@index(last) @t(@i(list)))} @c{[lisp]} @itemsep return the last list node of a list
+@end(fgroup)
+@begin(pdescription)
+ @i<list> @itemsep the list
+
+ returns @itemsep the last list node in the list
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{member(@i(expr), @i(list), test: @i(test), test-not: @i(test-not))} @c{[sal]}
+
+ @xlcode{(member@pragma(defn)@index(member) @t(@i(expr)) @t(@i(list)) @t(&key )@t(:test) @t(:test-not))} @c{[lisp]} @itemsep find an expression in a list
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to find
+
+ @i<list> @itemsep the list to search
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep the remainder of the list starting with the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{assoc(@i(expr), @i(alist), test: @i(test), test-not: @i(test-not))} @c{[sal]}
+
+ @xlcode{(assoc@pragma(defn)@index(assoc) @t(@i(expr)) @t(@i(alist)) @t(&key )@t(:test) @t(:test-not))} @c{[lisp]} @itemsep find an expression in an a-list
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to find
+
+ @i<alist> @itemsep the association list
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep the alist entry or @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{remove(@i(expr), @i(list), test: @i(test), test-not: @i(test-not))} @c{[sal]}
+
+ @xlcode{(remove@pragma(defn)@index(remove) @t(@i(expr)) @t(@i(list)) @t(&key )@t(:test) @t(:test-not))} @c{[lisp]} @itemsep remove elements from a list
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the element to remove
+
+ @i<list> @itemsep the list
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep copy of list with matching expressions removed
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{remove-if(@i(test), @i(list))} @c{[sal]}
+
+ @xlcode{(remove-if@pragma(defn)@index(remove-if) @t(@i(test)) @t(@i(list)))} @c{[lisp]} @itemsep remove elements that pass test
+@end(fgroup)
+@begin(pdescription)
+ @i<test> @itemsep the test predicate
+
+ @i<list> @itemsep the list
+
+ returns @itemsep copy of list with matching elements removed
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{remove-if-not(@i(test), @i(list))} @c{[sal]}
+
+ @xlcode{(remove-if-not@pragma(defn)@index(remove-if-not) @t(@i(test)) @t(@i(list)))} @c{[lisp]} @itemsep remove elements that fail test
+@end(fgroup)
+@begin(pdescription)
+ @i<test> @itemsep the test predicate
+
+ @i<list> @itemsep the list
+
+ returns @itemsep copy of list with non-matching elements removed
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{length(@i(expr))} @c{[sal]}
+
+ @xlcode{(length@pragma(defn)@index(length) @t(@i(expr)))} @c{[lisp]} @itemsep find the length of a list, vector or string
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the list, vector or string
+
+ returns @itemsep the length of the list, vector or string
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{nth(@i(n), @i(list))} @c{[sal]}
+
+ @xlcode{(nth@pragma(defn)@index(nth) @t(@i(n)) @t(@i(list)))} @c{[lisp]} @itemsep return the nth element of a list
+@end(fgroup)
+@begin(pdescription)
+ @i<n> @itemsep the number of the element to return (zero origin)
+
+ @i<list> @itemsep the list
+
+ returns @itemsep the nth element or @xlcode(nil) if the list isn't that long
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{nthcdr(@i(n), @i(list))} @c{[sal]}
+
+ @xlcode{(nthcdr@pragma(defn)@index(nthcdr) @t(@i(n)) @t(@i(list)))} @c{[lisp]} @itemsep return the nth cdr of a list
+@end(fgroup)
+@begin(pdescription)
+ @i<n> @itemsep the number of the element to return (zero origin)
+
+ @i<list> @itemsep the list
+
+ returns @itemsep the nth cdr or @xlcode(nil) if the list isn't that long
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{mapc(@i(fcn), @i(list1), @i(list)@r(...))} @c{[sal]}
+
+ @xlcode{(mapc@pragma(defn)@index(mapc) @t(@i(fcn)) @t(@i(list1)) @t(@i(list))@r(...))} @c{[lisp]} @itemsep apply function to successive cars
+@end(fgroup)
+@begin(pdescription)
+ @i<fcn> @itemsep the function or function name
+
+ @i<listn> @itemsep a list for each argument of the function
+
+ returns @itemsep the first list of arguments
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{mapcar(@i(fcn), @i(list1), @i(list)@r(...))} @c{[sal]}
+
+ @xlcode{(mapcar@pragma(defn)@index(mapcar) @t(@i(fcn)) @t(@i(list1)) @t(@i(list))@r(...))} @c{[lisp]} @itemsep apply function to successive cars
+@end(fgroup)
+@begin(pdescription)
+ @i<fcn> @itemsep the function or function name
+
+ @i<listn> @itemsep a list for each argument of the function
+
+ returns @itemsep a list of the values returned
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{mapl(@i(fcn), @i(list1), @i(list)@r(...))} @c{[sal]}
+
+ @xlcode{(mapl@pragma(defn)@index(mapl) @t(@i(fcn)) @t(@i(list1)) @t(@i(list))@r(...))} @c{[lisp]} @itemsep apply function to successive cdrs
+@end(fgroup)
+@begin(pdescription)
+ @i<fcn> @itemsep the function or function name
+
+ @i<listn> @itemsep a list for each argument of the function
+
+ returns @itemsep the first list of arguments
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{maplist(@i(fcn), @i(list1), @i(list)@r(...))} @c{[sal]}
+
+ @xlcode{(maplist@pragma(defn)@index(maplist) @t(@i(fcn)) @t(@i(list1)) @t(@i(list))@r(...))} @c{[lisp]} @itemsep apply function to successive cdrs
+@end(fgroup)
+@begin(pdescription)
+ @i<fcn> @itemsep the function or function name
+
+ @i<listn> @itemsep a list for each argument of the function
+
+ returns @itemsep a list of the values returned
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{subst(@i(to), @i(from), @i(expr), test: @i(test), test-not: @i(test-not))} @c{[sal]}
+
+ @xlcode{(subst@pragma(defn)@index(subst) @t(@i(to)) @t(@i(from)) @t(@i(expr)) @t(&key )@t(:test) @t(:test-not))} @c{[lisp]} @itemsep substitute expressions
+@end(fgroup)
+@begin(pdescription)
+ @i<to> @itemsep the new expression
+
+ @i<from> @itemsep the old expression
+
+ @i<expr> @itemsep the expression in which to do the substitutions
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep the expression with substitutions
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{sublis(@i(alist), @i(expr), test: @i(test), test-not: @i(test-not))} @c{[sal]}
+
+ @xlcode{(sublis@pragma(defn)@index(sublis) @t(@i(alist)) @t(@i(expr)) @t(&key )@t(:test) @t(:test-not))} @c{[lisp]} @itemsep substitute with an a-list
+@end(fgroup)
+@begin(pdescription)
+ @i<alist> @itemsep the association list
+
+ @i<expr> @itemsep the expression in which to do the substitutions
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep the expression with substitutions
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Destructive List Functions)@index(Destructive List Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{rplaca(@i(list), @i(expr))} @c{[sal]}
+
+ @xlcode{(rplaca@pragma(defn)@index(rplaca) @t(@i(list)) @t(@i(expr)))} @c{[lisp]} @itemsep replace the car of a list node
+@end(fgroup)
+@begin(pdescription)
+ @i<list> @itemsep the list node
+
+ @i<expr> @itemsep the new value for the car of the list node
+
+ returns @itemsep the list node after updating the car
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{rplacd(@i(list), @i(expr))} @c{[sal]}
+
+ @xlcode{(rplacd@pragma(defn)@index(rplacd) @t(@i(list)) @t(@i(expr)))} @c{[lisp]} @itemsep replace the cdr of a list node
+@end(fgroup)
+@begin(pdescription)
+ @i<list> @itemsep the list node
+
+ @i<expr> @itemsep the new value for the cdr of the list node
+
+ returns @itemsep the list node after updating the cdr
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{nconc(@i(list)@r(...))} @c{[sal]}
+
+ @xlcode{(nconc@pragma(defn)@index(nconc) @t(@i(list))@r(...))} @c{[lisp]} @itemsep destructively concatenate lists
+@end(fgroup)
+@begin(pdescription)
+ @i<list> @itemsep lists to concatenate
+
+ returns @itemsep the result of concatenating the lists
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{delete(@i(expr), test: @i(test), test-not: @i(test-not))} @c{[sal]}
+
+ @xlcode{(delete@pragma(defn)@index(delete) @t(@i(expr)) @t(&key )@t(:test) @t(:test-not))} @c{[lisp]} @itemsep delete elements from a list
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the element to delete
+
+ @i<list> @itemsep the list
+
+ :test @itemsep the test function (defaults to eql)
+
+ :test-not @itemsep the test function (sense inverted)
+
+ returns @itemsep the list with the matching expressions deleted
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{delete-if(@i(test), @i(list))} @c{[sal]}
+
+ @xlcode{(delete-if@pragma(defn)@index(delete-if) @t(@i(test)) @t(@i(list)))} @c{[lisp]} @itemsep delete elements that pass test
+@end(fgroup)
+@begin(pdescription)
+ @i<test> @itemsep the test predicate
+
+ @i<list> @itemsep the list
+
+ returns @itemsep the list with matching elements deleted
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{delete-if-not(@i(test), @i(list))} @c{[sal]}
+
+ @xlcode{(delete-if-not@pragma(defn)@index(delete-if-not) @t(@i(test)) @t(@i(list)))} @c{[lisp]} @itemsep delete elements that fail test
+@end(fgroup)
+@begin(pdescription)
+ @i<test> @itemsep the test predicate
+
+ @i<list> @itemsep the list
+
+ returns @itemsep the list with non-matching elements deleted
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{sort(@i(list), @i(test))} @c{[sal]}
+
+ @xlcode{(sort@pragma(defn)@index(sort) @t(@i(list)) @t(@i(test)))} @c{[lisp]} @itemsep sort a list
+@end(fgroup)
+@begin(pdescription)
+ @i<list> @itemsep the list to sort
+
+ @i<test> @itemsep the comparison function
+
+ returns @itemsep the sorted list
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Predicate Functions)@index(Predicate Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{atom(@i(expr))} @c{[sal]}
+
+ @xlcode{(atom@pragma(defn)@index(atom) @t(@i(expr)))} @c{[lisp]} @itemsep is this an atom?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is an atom, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{symbolp(@i(expr))} @c{[sal]}
+
+ @xlcode{(symbolp@pragma(defn)@index(symbolp) @t(@i(expr)))} @c{[lisp]} @itemsep is this a symbol?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the expression is a symbol, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{numberp(@i(expr))} @c{[sal]}
+
+ @xlcode{(numberp@pragma(defn)@index(numberp) @t(@i(expr)))} @c{[lisp]} @itemsep is this a number?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the expression is a number, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{null(@i(expr))} @c{[sal]}
+
+ @xlcode{(null@pragma(defn)@index(null) @t(@i(expr)))} @c{[lisp]} @itemsep is this an empty list?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the list to check
+
+ returns @itemsep @xlcode(t) if the list is empty, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{not(@i(expr))} @c{[sal]}
+
+ @xlcode{(not@pragma(defn)@index(not) @t(@i(expr)))} @c{[lisp]} @itemsep is this false?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ return @itemsep @xlcode(t) if the value is @xlcode(nil), @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{listp(@i(expr))} @c{[sal]}
+
+ @xlcode{(listp@pragma(defn)@index(listp) @t(@i(expr)))} @c{[lisp]} @itemsep is this a list?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a cons or @xlcode(nil), @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{endp(@i(list))} @c{[sal]}
+
+ @xlcode{(endp@pragma(defn)@index(endp) @t(@i(list)))} @c{[lisp]} @itemsep is this the end of a list
+@end(fgroup)
+@begin(pdescription)
+ @i<list> @itemsep the list
+
+ returns @itemsep @xlcode(t) if the value is @xlcode(nil), @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{consp(@i(expr))} @c{[sal]}
+
+ @xlcode{(consp@pragma(defn)@index(consp) @t(@i(expr)))} @c{[lisp]} @itemsep is this a non-empty list?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a cons, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{integerp(@i(expr))} @c{[sal]}
+
+ @xlcode{(integerp@pragma(defn)@index(integerp) @t(@i(expr)))} @c{[lisp]} @itemsep is this an integer?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is an integer, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{floatp(@i(expr))} @c{[sal]}
+
+ @xlcode{(floatp@pragma(defn)@index(floatp) @t(@i(expr)))} @c{[lisp]} @itemsep is this a float?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a float, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{stringp(@i(expr))} @c{[sal]}
+
+ @xlcode{(stringp@pragma(defn)@index(stringp) @t(@i(expr)))} @c{[lisp]} @itemsep is this a string?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a string, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{characterp(@i(expr))} @c{[sal]}
+
+ @xlcode{(characterp@pragma(defn)@index(characterp) @t(@i(expr)))} @c{[lisp]} @itemsep is this a character?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a character, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{arrayp(@i(expr))} @c{[sal]}
+
+ @xlcode{(arrayp@pragma(defn)@index(arrayp) @t(@i(expr)))} @c{[lisp]} @itemsep is this an array?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is an array, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{streamp(@i(expr))} @c{[sal]}
+
+ @xlcode{(streamp@pragma(defn)@index(streamp) @t(@i(expr)))} @c{[lisp]} @itemsep is this a stream?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is a stream, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{objectp(@i(expr))} @c{[sal]}
+
+ @xlcode{(objectp@pragma(defn)@index(objectp) @t(@i(expr)))} @c{[lisp]} @itemsep is this an object?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is an object, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{filep(@i(expr))} @c{[sal]}
+
+ @xlcode{(filep@pragma(defn)@index(filep) @t(@i(expr)))} @c{[lisp]}@foot(This is not part of standard XLISP nor is it built-in. Nyquist defines it though.) @itemsep is this a file?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to check
+
+ returns @itemsep @xlcode(t) if the value is an object, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{boundp(@i(sym))} @c{[sal]}
+
+ @xlcode{(boundp@pragma(defn)@index(boundp) @t(@i(sym)))} @c{[lisp]} @itemsep is a value bound to this symbol?
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep @xlcode(t) if a value is bound to the symbol, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{fboundp(@i(sym))} @c{[sal]}
+
+ @xlcode{(fboundp@pragma(defn)@index(fboundp) @t(@i(sym)))} @c{[lisp]} @itemsep is a functional value bound to this symbol?
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the symbol
+
+ returns @itemsep @xlcode(t) if a functional value is bound to the symbol,
+
+ @xlcode(nil) otherwise
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{minusp(@i(expr))} @c{[sal]}
+
+ @xlcode{(minusp@pragma(defn)@index(minusp) @t(@i(expr)))} @c{[lisp]} @itemsep is this number negative?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the number to test
+
+ returns @itemsep @xlcode(t) if the number is negative, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{zerop(@i(expr))} @c{[sal]}
+
+ @xlcode{(zerop@pragma(defn)@index(zerop) @t(@i(expr)))} @c{[lisp]} @itemsep is this number zero?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the number to test
+
+ returns @itemsep @xlcode(t) if the number is zero, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{plusp(@i(expr))} @c{[sal]}
+
+ @xlcode{(plusp@pragma(defn)@index(plusp) @t(@i(expr)))} @c{[lisp]} @itemsep is this number positive?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the number to test
+
+ returns @itemsep @xlcode(t) if the number is positive, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{evenp(@i(expr))} @c{[sal]}
+
+ @xlcode{(evenp@pragma(defn)@index(evenp) @t(@i(expr)))} @c{[lisp]} @itemsep is this integer even?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the integer to test
+
+ returns @itemsep @xlcode(t) if the integer is even, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{oddp(@i(expr))} @c{[sal]}
+
+ @xlcode{(oddp@pragma(defn)@index(oddp) @t(@i(expr)))} @c{[lisp]} @itemsep is this integer odd?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the integer to test
+
+ returns @itemsep @xlcode(t) if the integer is odd, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{eq(@i(expr1), @i(expr2))} @c{[sal]}
+
+ @xlcode{(eq@pragma(defn)@index(eq) @t(@i(expr1)) @t(@i(expr2)))} @c{[lisp]} @itemsep are the expressions identical?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr1> @itemsep the first expression
+
+ @i<expr2> @itemsep the second expression
+
+ returns @itemsep @xlcode(t) if they are equal, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+@begin(fgroup)@xlcode{eql(@i(expr1), @i(expr2))} @c{[sal]}
+
+ @xlcode{(eql@pragma(defn)@index(eql) @t(@i(expr1)) @t(@i(expr2)))} @c{[lisp]} @itemsep are the expressions identical? (works with all numbers)
+@end(fgroup)
+@begin(pdescription)
+ @i<expr1> @itemsep the first expression
+
+ @i<expr2> @itemsep the second expression
+
+ returns @itemsep @xlcode(t) if they are equal, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{equal(@i(expr1), @i(expr2))} @c{[sal]}
+
+ @xlcode{(equal@pragma(defn)@index(equal) @t(@i(expr1)) @t(@i(expr2)))} @c{[lisp]} @itemsep are the expressions equal?
+@end(fgroup)
+@begin(pdescription)
+ @i<expr1> @itemsep the first expression
+
+ @i<expr2> @itemsep the second expression
+
+ returns @itemsep @xlcode(t) if they are equal, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Control Constructs)@index(Control Constructs)
+@begin(fdescription)
+ @xlcode{(cond@pragma(defn)@index(cond) @t(@i(pair))@r(...))} @c{[lisp]} @itemsep evaluate conditionally
+@begin(pdescription)
+ @i<pair> @itemsep pair consisting of:
+
+@begin(pdescription)
+ (@i<pred> @i<expr>...)
+@end(pdescription)@pragma(stopcodef)
+ where:
+@begin(pdescription)
+ @i<pred> @itemsep is a predicate expression
+
+ @i<expr> @itemsep evaluated if the predicate
+ is not @xlcode(nil)
+@end(pdescription)@pragma(stopcodef)
+returns @itemsep the value of the first expression whose predicate is not
+@xlcode(nil)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{and(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(and@pragma(defn)@index(and) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep the logical and of a list of expressions
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be anded
+
+ returns @itemsep @xlcode(nil) if any expression evaluates to @xlcode(nil),
+ otherwise the value of the last expression
+ (evaluation of expressions stops after the first
+ expression that evaluates to @xlcode(nil))
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{or(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(or@pragma(defn)@index(or) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep the logical or of a list of expressions
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be ored
+
+ returns @itemsep @xlcode(nil) if all expressions evaluate to @xlcode(nil),
+ otherwise the value of the first non-@xlcode(nil) expression
+ (evaluation of expressions stops after the first
+ expression that does not evaluate to @xlcode(nil))
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{if(@i(texpr), @i(expr1)[, @i(expr2)])} @c{[sal]}
+
+ @xlcode{(if@pragma(defn)@index(if) @t(@i(texpr)) @t(@i(expr1)) [@t(@i(expr2))])} @c{[lisp]} @itemsep evaluate expressions conditionally
+@end(fgroup)
+@begin(pdescription)
+ @i<texpr> @itemsep the test expression
+
+ @i<expr1> @itemsep the expression to be evaluated if texpr is non-@xlcode(nil)
+
+ @i<expr2> @itemsep the expression to be evaluated if texpr is @xlcode(nil)
+
+ returns @itemsep the value of the selected expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{when(@i(texpr), @i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(when@pragma(defn)@index(when) @t(@i(texpr)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep evaluate only when a condition is true
+@end(fgroup)
+@begin(pdescription)
+ @i<texpr> @itemsep the test expression
+
+ @i<expr> @itemsep the expression(s) to be evaluated if texpr is non-@xlcode(nil)
+
+ returns @itemsep the value of the last expression or @xlcode(nil)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{unless(@i(texpr), @i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(unless@pragma(defn)@index(unless) @t(@i(texpr)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep evaluate only when a condition is false
+@end(fgroup)
+@begin(pdescription)
+ @i<texpr> @itemsep the test expression
+
+ @i<expr> @itemsep the expression(s) to be evaluated if texpr is @xlcode(nil)
+
+ returns @itemsep the value of the last expression or @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(case@pragma(defn)@index(case) @t(@i(expr)) @t(@i(case))@r(...))} @c{[lisp]} @itemsep select by case
+@begin(pdescription)
+ @i<expr> @itemsep the selection expression
+
+ @i<case> @itemsep pair consisting of:
+
+@begin(pdescription)
+ (@i<value> @i<expr>...)
+@end(pdescription)@pragma(stopcodef)
+ where:
+@begin(pdescription)
+ @i<value> @itemsep is a single expression or a list of
+ expressions (unevaluated)
+
+ @i<expr> @itemsep are expressions to execute if the
+ case matches
+@end(pdescription)@pragma(stopcodef)
+ returns @itemsep the value of the last expression of the matching case
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ @xlcode{(let@pragma(defn)@index(let) (@t(@i(binding))@r(...)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep create local bindings
+
+@pragma(startcodef)
+ @xlcode{(let*@pragma(defn)@index(let*) (@t(@i(binding))@r(...)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep let with sequential binding
+@end(fgroup)
+@begin(pdescription)
+ @i<binding> @itemsep the variable bindings each of which is either:
+
+@begin(pdescription)
+ 1) a symbol (which is initialized to @xlcode(nil))
+
+ 2) a list whose car is a symbol and whose cadr
+ is an initialization expression
+@end(pdescription)@pragma(stopcodef)
+ @i<expr> @itemsep the expressions to be evaluated
+
+ returns @itemsep the value of the last expression
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ @xlcode{(flet@pragma(defn)@index(flet) (@t(@i(binding))@r(...)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep create local functions
+
+@pragma(startcodef)
+ @xlcode{(labels@pragma(defn)@index(labels) (@t(@i(binding))@r(...)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep flet with recursive functions
+
+@pragma(startcodef)
+ @xlcode{(macrolet@pragma(defn)@index(macrolet) (@t(@i(binding))@r(...)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep create local macros
+@end(fgroup)
+@begin(pdescription)
+ @i<binding> @itemsep the function bindings each of which is:
+
+@begin(pdescription)
+ (@i<sym> @i<fargs> @i<expr>...)
+@end(pdescription)@pragma(stopcodef)
+ where:
+@begin(pdescription)
+ @i<sym> @itemsep the function/macro name
+
+ @i<fargs> @itemsep formal argument list (lambda list)
+
+ @i<expr> @itemsep expressions constituting the body of
+ the function/macro
+@end(pdescription)@pragma(stopcodef)
+ @i<expr> @itemsep the expressions to be evaluated
+
+ returns @itemsep the value of the last expression
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{catch(@i(sym), @i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(catch@pragma(defn)@index(catch) @t(@i(sym)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep evaluate expressions and catch throws
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the catch tag
+
+ @i<expr> @itemsep expressions to evaluate
+
+ returns @itemsep the value of the last expression the throw expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{throw(@i(sym)[, @i(expr)])} @c{[sal]}
+
+ @xlcode{(throw@pragma(defn)@index(throw) @t(@i(sym)) [@t(@i(expr))])} @c{[lisp]} @itemsep throw to a catch
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the catch tag
+
+ @i<expr> @itemsep the value for the catch to return (defaults to @xlcode(nil))
+
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{unwind-protect(@i(expr), @i(cexpr)@r(...))} @c{[sal]}
+
+ @xlcode{(unwind-protect@pragma(defn)@index(unwind-protect) @t(@i(expr)) @t(@i(cexpr))@r(...))} @c{[lisp]} @itemsep protect evaluation of an expression
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to protect
+
+ @i<cexpr> @itemsep the cleanup expressions
+
+ returns @itemsep the value of the expression@*
+
+ Note: unwind-protect guarantees to execute the cleanup expressions
+ even if a non-local exit terminates the evaluation of the
+ protected expression
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Looping Constructs)@index(Looping Constructs)
+@begin(fdescription)
+ @xlcode{(loop@pragma(defn)@index(loop) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep basic looping form
+@begin(pdescription)
+ @i<expr> @itemsep the body of the loop
+
+ returns @itemsep never returns (must use non-local exit)
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ @xlcode{(do@pragma(defn)@index(do) (@t(@i(binding))@r(...)) (@t(@i(texpr)) @t(@i(rexpr))@r(...)) @t(@i(expr))@r(...))} @c{[lisp]}
+@pragma(endcodef)
+ @xlcode{(do*@pragma(defn)@index(do*) (@t(@i(binding))@r(...)) (@t(@i(texpr)) @t(@i(rexpr))@r(...)) @t(@i(expr))@r(...))} @c{[lisp]}
+@end(fgroup)
+@begin(pdescription)
+ @i<binding> @itemsep the variable bindings each of which is either:
+
+@begin(pdescription)
+ 1) a symbol (which is initialized to @xlcode(nil))
+
+ 2) a list of the form: (@i<sym> @i<init> [@i<step>])
+ where:
+@begin(pdescription)
+ @i<sym> @itemsep is the symbol to bind
+
+ @i<init> @itemsep is the initial value of the symbol
+
+ @i<step> @itemsep is a step expression
+
+@end(pdescription)
+@end(pdescription)@pragma(stopcodef)
+ @i<texpr> @itemsep the termination test expression
+
+ @i<rexpr> @itemsep result expressions (the default is @xlcode(nil))
+
+ @i<expr> @itemsep the body of the loop (treated like an implicit prog)
+
+ returns @itemsep the value of the last result expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(dolist@pragma(defn)@index(dolist) (@t(@i(sym)) @t(@i(expr)) [@t(@i(rexpr))]) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep loop through a list
+@begin(pdescription)
+ @i<sym> @itemsep the symbol to bind to each list element
+
+ @i<expr> @itemsep the list expression
+
+ @i<rexpr> @itemsep the result expression (the default is @xlcode(nil))
+
+ @i<expr> @itemsep the body of the loop (treated like an implicit prog)
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(dotimes@pragma(defn)@index(dotimes) (@t(@i(sym)) @t(@i(expr)) [@t(@i(rexpr))]) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep loop from zero to n-1
+@begin(pdescription)
+ @i<sym> @itemsep the symbol to bind to each value from 0 to n-1
+
+ @i<expr> @itemsep the number of times to loop
+
+ @i<rexpr> @itemsep the result expression (the default is @xlcode(nil))
+
+ @i<expr> @itemsep the body of the loop (treated like an implicit prog)
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(The Program Feature)@index(The Program Feature)
+@begin(fdescription)
+@begin(fgroup)
+@xlcode{(prog@pragma(defn)@index(prog) (@t(@i(binding))@r(...)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep the program feature
+
+@pragma(startcodef)
+@xlcode{(prog*@pragma(defn)@index(prog*) (@t(@i(binding))@r(...)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep prog with sequential binding
+@end(fgroup)
+@begin(pdescription)
+ @i<binding> @itemsep the variable bindings each of which is either:
+
+@begin(pdescription)
+ 1) a symbol (which is initialized to @xlcode(nil))
+
+ 2) a list whose car is a symbol and whose cadr
+ is an initialization expression
+@end(pdescription)@pragma(stopcodef)
+ @i<expr> @itemsep expressions to evaluate or tags (symbols)
+
+ returns @itemsep @xlcode(nil) or the argument passed to the return function
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{block(@i(name), @i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(block@pragma(defn)@index(block) @t(@i(name)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep named block
+@end(fgroup)
+@begin(pdescription)
+ @i<name> @itemsep the block name (symbol)
+
+ @i<expr> @itemsep the block body
+
+ returns @itemsep the value of the last expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(return@pragma(defn)@index(return) [@t(@i(expr))])} @c{[lisp]} @itemsep cause a prog construct to return a value
+@begin(pdescription)
+ @i<expr> @itemsep the value (defaults to @xlcode(nil))
+
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{return-from(@i(name)[, @i(value)])} @c{[sal]}
+
+ @xlcode{(return-from@pragma(defn)@index(return-from) @t(@i(name)) [@t(@i(value))])} @c{[lisp]} @itemsep return from a named block
+@end(fgroup)
+@begin(pdescription)
+ @i<name> @itemsep the block name (symbol)
+
+ @i<value> @itemsep the value to return (defaults to @xlcode(nil))
+
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{tagbody(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(tagbody@pragma(defn)@index(tagbody) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep block with labels
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep expression(s) to evaluate or tags (symbols)
+
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{go(@i(sym))} @c{[sal]}
+
+ @xlcode{(go@pragma(defn)@index(go) @t(@i(sym)))} @c{[lisp]} @itemsep go to a tag within a tagbody or prog
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the tag (quoted)
+
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(progv@pragma(defn)@index(progv) @t(@i(slist)) @t(@i(vlist)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep dynamically bind symbols
+@begin(pdescription)
+ @i<slist> @itemsep list of symbols
+
+ @i<vlist> @itemsep list of values to bind to the symbols
+
+ @i<expr> @itemsep expression(s) to evaluate
+
+ returns @itemsep the value of the last expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{prog1(@i(expr1), @i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(prog1@pragma(defn)@index(prog1) @t(@i(expr1)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep execute expressions sequentially
+@end(fgroup)
+@begin(pdescription)
+ @i<expr1> @itemsep the first expression to evaluate
+
+ @i<expr> @itemsep the remaining expressions to evaluate
+
+ returns @itemsep the value of the first expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{prog2(@i(expr1), @i(expr2), @i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(prog2@pragma(defn)@index(prog2) @t(@i(expr1)) @t(@i(expr2)) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep execute expressions sequentially
+@end(fgroup)
+@begin(pdescription)
+ @i<expr1> @itemsep the first expression to evaluate
+
+ @i<expr2> @itemsep the second expression to evaluate
+
+ @i<expr> @itemsep the remaining expressions to evaluate
+
+ returns @itemsep the value of the second expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{progn(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(progn@pragma(defn)@index(progn) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep execute expressions sequentially
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to evaluate
+
+ returns @itemsep the value of the last expression (or @xlcode(nil))
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Debugging and Error Handling)@index(Debugging)@index(Error Handling)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{trace(@i(sym))} @c{[sal]}
+
+ @xlcode{(trace@pragma(defn)@index(trace) @t(@i(sym)))} @c{[lisp]} @itemsep add a function to the trace list
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the function to add (quoted)
+
+ returns @itemsep the trace list
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{untrace(@i(sym))} @c{[sal]}
+
+ @xlcode{(untrace@pragma(defn)@index(untrace) @t(@i(sym)))} @c{[lisp]} @itemsep remove a function from the trace list
+@end(fgroup)
+@begin(pdescription)
+ @i<sym> @itemsep the function to remove (quoted)
+
+ returns @itemsep the trace list
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{error(@i(emsg)[, @i(arg)])} @c{[sal]}
+
+ @xlcode{(error@pragma(defn)@index(error) @t(@i(emsg)) [@t(@i(arg))])} @c{[lisp]} @itemsep signal a non-correctable error
+@end(fgroup)
+@begin(pdescription)
+ @i<emsg> @itemsep the error message string
+
+ @i<arg> @itemsep the argument expression (printed after the message)
+
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{cerror(@i(cmsg), @i(emsg)[, @i(arg)])} @c{[sal]}
+
+ @xlcode{(cerror@pragma(defn)@index(cerror) @t(@i(cmsg)) @t(@i(emsg)) [@t(@i(arg))])} @c{[lisp]} @itemsep signal a correctable error
+@end(fgroup)
+@begin(pdescription)
+ @i<cmsg> @itemsep the continue message string
+
+ @i<emsg> @itemsep the error message string
+
+ @i<arg> @itemsep the argument expression (printed after the message)
+
+ returns @itemsep @xlcode(nil) when continued from the break loop
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{break([@i(bmsg)[, @i(arg)]])} @c{[sal]}
+
+ @xlcode{(break@pragma(defn)@index(break) [@t(@i(bmsg)) [@t(@i(arg))]])} @c{[lisp]} @itemsep enter a break loop
+@end(fgroup)
+@begin(pdescription)
+ @i<bmsg> @itemsep the break message string (defaults to @xlcode(**break**))
+
+ @i<arg> @itemsep the argument expression (printed after the message)
+
+ returns @itemsep @xlcode(nil) when continued from the break loop
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(clean-up@pragma(defn)@index(clean-up))} @c{[lisp]} @itemsep clean-up after an error
+@begin(pdescription)
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(top-level@pragma(defn)@index(top-level))} @c{[lisp]} @itemsep clean-up after an error and return to the top level
+@begin(pdescription)
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(continue@pragma(defn)@index(continue))} @c{[lisp]} @itemsep continue from a correctable error
+@begin(pdescription)
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(errset@pragma(defn)@index(errset) @t(@i(expr)) [@t(@i(pflag))])} @c{[lisp]} @itemsep trap errors
+@begin(pdescription)
+ @i<expr> @itemsep the expression to execute
+
+ @i<pflag> @itemsep flag to control printing of the error message
+
+ returns @itemsep the value of the last expression consed with @xlcode(nil)
+
+ or @xlcode(nil) on error
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(baktrace@pragma(defn)@index(baktrace)@index(debugging)@index(stack trace) [@t(@i(n))])} @c{[lisp]} @itemsep print n levels of trace back information
+@begin(pdescription)
+ @i<n> @itemsep the number of levels (defaults to all levels)
+
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(evalhook@pragma(defn)@index(evalhook) @t(@i(expr)) @t(@i(ehook)) @t(@i(ahook)) [@t(@i(env))])} @c{[lisp]} @itemsep evaluate with hooks
+@begin(pdescription)
+ @i<expr> @itemsep the expression to evaluate
+
+ @i<ehook> @itemsep the value for @xlcode(*evalhook*)
+
+ @i<ahook> @itemsep the value for @xlcode(*applyhook*)
+
+ @i<env> @itemsep the environment (default is @xlcode(nil))
+
+ returns @itemsep the result of evaluating the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{profile(@i(flag))} @c{[sal]}
+
+ @xlcode{(profile@pragma(defn)@index(profile) @t(@i(flag)))} @c{[lisp]}@foot(This is not a standard XLISP 2.0 function.) @itemsep turn profiling on or off.
+@end(fgroup)
+@begin(pdescription)
+ @i<flag> @itemsep @xlcode(nil) turns profiling off, otherwise on
+
+ returns @itemsep the previous state of profiling.
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Arithmetic Functions)@index(Arithmetic Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{truncate(@i(expr))} @c{[sal]}
+
+ @xlcode{(truncate@pragma(defn)@index(truncate) @t(@i(expr)))} @c{[lisp]} @itemsep truncates a floating point number to an integer
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the result of truncating the number
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{float(@i(expr))} @c{[sal]}
+
+ @xlcode{(float@pragma(defn)@index(float) @t(@i(expr)))} @c{[lisp]} @itemsep converts an integer to a floating point number
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the result of floating the integer
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(+@pragma(defn)@index(+) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep add a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the addition
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(-@pragma(defn)@index(-) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep subtract a list of numbers or negate a single number
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the subtraction
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(*@pragma(defn)@index(*) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep multiply a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the multiplication
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(/@pragma(defn)@index(/) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep divide a list of numbers
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the division
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(1+@pragma(defn)@index(1+) @t(@i(expr)))} @c{[lisp]} @itemsep add one to a number
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the number plus one
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(1-@pragma(defn)@index(1-) @t(@i(expr)))} @c{[lisp]} @itemsep subtract one from a number
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the number minus one
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{rem(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(rem@pragma(defn)@index(rem)@index(remainder)@index(modulo (rem) function) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep remainder of a list of numbers
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the remainder operation
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{min(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(min@pragma(defn)@index(min)@index(minimum) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep the smallest of a list of numbers
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be checked
+
+ returns @itemsep the smallest number in the list
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{max(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(max@pragma(defn)@index(max)@index(maximum) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep the largest of a list of numbers
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be checked
+
+ returns @itemsep the largest number in the list
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{abs(@i(expr))} @c{[sal]}
+
+ @xlcode{(abs@pragma(defn)@index(abs) @t(@i(expr)))} @c{[lisp]} @itemsep the absolute value of a number
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the absolute value of the number
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{gcd(@i(n1), @i(n2)@r(...))} @c{[sal]}
+
+ @xlcode{(gcd@pragma(defn)@index(gcd) @t(@i(n1)) @t(@i(n2))@r(...))} @c{[lisp]} @itemsep compute the greatest common divisor
+@end(fgroup)
+@begin(pdescription)
+ @i<n1> @itemsep the first number (integer)
+
+ @i<n2> @itemsep the second number(s) (integer)
+
+ returns @itemsep the greatest common divisor
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{random(@i(n))} @c{[sal]}
+
+ @xlcode{(random@pragma(defn)@index(random) @t(@i(n)))} @c{[lisp]} @itemsep compute a random number between 0 and n-1 inclusive
+@end(fgroup)
+@begin(pdescription)
+ @i<n> @itemsep the upper bound (integer)
+
+ returns @itemsep a random number
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{rrandom()} @c{[sal]}
+
+ @xlcode{(rrandom@pragma(defn)@index(rrandom)@index(uniform random))} @c{[lisp]} @itemsep compute a random real number between 0 and 1 inclusive
+@end(fgroup)
+@begin(pdescription)
+ returns @itemsep a random floating point number
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{sin(@i(expr))} @c{[sal]}
+
+ @xlcode{(sin@pragma(defn)@index(sin) @t(@i(expr)))} @c{[lisp]} @itemsep compute the sine of a number
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the floating point number
+
+ returns @itemsep the sine of the number
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{cos(@i(expr))} @c{[sal]}
+
+ @xlcode{(cos@pragma(defn)@index(cos) @t(@i(expr)))} @c{[lisp]} @itemsep compute the cosine of a number
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the floating point number
+
+ returns @itemsep the cosine of the number
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{tan(@i(expr))} @c{[sal]}
+
+ @xlcode{(tan@pragma(defn)@index(tan) @t(@i(expr)))} @c{[lisp]} @itemsep compute the tangent of a number
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the floating point number
+
+ returns @itemsep the tangent of the number
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{atan(@i(expr)[, @i(expr2)])} @c{[sal]}
+
+ @xlcode{(atan@pragma(defn)@index(atan) @t(@i(expr)) [@t(@i(expr2))])} @c{[lisp]}@foot(This is not a standard XLISP 2.0 function.) @itemsep compute the arctangent
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the value of @i(x)
+
+ @i<expr2> @itemsep the value of @i(y) (default value is 1.0)
+
+ returns @itemsep the arctangent of @i(x)/@i(y)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{expt(@i(x-expr), @i(y-expr))} @c{[sal]}
+
+ @xlcode{(expt@pragma(defn)@index(expt) @t(@i(x-expr)) @t(@i(y-expr)))} @c{[lisp]} @itemsep compute x to the y power
+@end(fgroup)
+@begin(pdescription)
+ @i<x-expr> @itemsep the floating point number
+
+ @i<y-expr> @itemsep the floating point exponent
+
+ returns @itemsep x to the y power
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{exp(@i(x-expr))} @c{[sal]}
+
+ @xlcode{(exp@pragma(defn)@index(exp) @t(@i(x-expr)))} @c{[lisp]} @itemsep compute e to the x power
+@end(fgroup)
+@begin(pdescription)
+ @i<x-expr> @itemsep the floating point number
+
+ returns @itemsep e to the x power
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{sqrt(@i(expr))} @c{[sal]}
+
+ @xlcode{(sqrt@pragma(defn)@index(sqrt) @t(@i(expr)))} @c{[lisp]} @itemsep compute the square root of a number
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the floating point number
+
+ returns @itemsep the square root of the number
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+@xlcode{(<@pragma(defn)@index(<) @t(@i(n1)) @t(@i(n2))@r(...))} @c{[lisp]} @itemsep test for less than
+
+@xlcode{(<=@pragma(defn)@index(<=) @t(@i(n1)) @t(@i(n2))@r(...))} @c{[lisp]} @itemsep test for less than or equal to
+
+@xlcode{(=@pragma(defn)@index(=) @t(@i(n1)) @t(@i(n2))@r(...))} @c{[lisp]} @itemsep test for equal to
+
+@xlcode{(/=@pragma(defn)@index(/=) @t(@i(n1)) @t(@i(n2))@r(...))} @c{[lisp]} @itemsep test for not equal to
+
+@xlcode{(>=@pragma(defn)@index(>=) @t(@i(n1)) @t(@i(n2))@r(...))} @c{[lisp]} @itemsep test for greater than or equal to
+
+@xlcode{(>@pragma(defn)@index(>) @t(@i(n1)) @t(@i(n2))@r(...))} @c{[lisp]} @itemsep test for greater than
+@end(fgroup)
+@begin(pdescription)
+ @i<n1> @itemsep the first number to compare
+
+ @i<n2> @itemsep the second number to compare
+
+returns @itemsep @xlcode(t) if the results of comparing @i<n1> with @i<n2>,
+@i<n2> with @i<n3>, etc., are all true.
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Bitwise Logical Functions)@index(Bitwise Logical Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{logand(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(logand@pragma(defn)@index(logand) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep the bitwise and of a list of numbers
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the and operation
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{logior(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(logior@pragma(defn)@index(logior) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep the bitwise inclusive or of a list of numbers
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the inclusive or operation
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{logxor(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(logxor@pragma(defn)@index(logxor) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep the bitwise exclusive or of a list of numbers
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the numbers
+
+ returns @itemsep the result of the exclusive or operation
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{lognot(@i(expr))} @c{[sal]}
+
+ @xlcode{(lognot@pragma(defn)@index(lognot) @t(@i(expr)))} @c{[lisp]} @itemsep the bitwise not of a number
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the number
+
+ returns @itemsep the bitwise inversion of number
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(String Functions)@index(String Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{string(@i(expr))} @c{[sal]}
+
+ @xlcode{(string@pragma(defn)@index(string) @t(@i(expr)))} @c{[lisp]} @itemsep make a string from a value
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep an integer (which is first converted into its ASCII character value), string, character, or symbol
+
+ returns @itemsep the string representation of the argument
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{string-search(@i(pat), @i(str), start: @i(start), end: @i(end))} @c{[sal]}
+
+ @xlcode{(string-search@pragma(defn)@index(string-search)@index(find string) @t(@i(pat)) @t(@i(str)) @t(&key )@t(:start) @t(:end))} @c{[lisp]}@foot(This is not a standard XLISP 2.0 function.) @itemsep search for pattern in string
+@end(fgroup)
+@begin(pdescription)
+ @i<pat> @itemsep a string to search for
+
+ @i<str> @itemsep the string to be searched
+
+ :start @itemsep the starting offset in str
+
+ :end @itemsep the ending offset + 1
+
+ returns @itemsep index of pat in str or NIL if not found
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{string-trim(@i(bag), @i(str))} @c{[sal]}
+
+ @xlcode{(string-trim@pragma(defn)@index(string-trim) @t(@i(bag)) @t(@i(str)))} @c{[lisp]} @itemsep trim both ends of a string
+@end(fgroup)
+@begin(pdescription)
+ @i<bag> @itemsep a string containing characters to trim
+
+ @i<str> @itemsep the string to trim
+
+ returns @itemsep a trimed copy of the string
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{string-left-trim(@i(bag), @i(str))} @c{[sal]}
+
+ @xlcode{(string-left-trim@pragma(defn)@index(string-left-trim) @t(@i(bag)) @t(@i(str)))} @c{[lisp]} @itemsep trim the left end of a string
+@end(fgroup)
+@begin(pdescription)
+ @i<bag> @itemsep a string containing characters to trim
+
+ @i<str> @itemsep the string to trim
+
+ returns @itemsep a trimed copy of the string
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{string-right-trim(@i(bag), @i(str))} @c{[sal]}
+
+ @xlcode{(string-right-trim@pragma(defn)@index(string-right-trim) @t(@i(bag)) @t(@i(str)))} @c{[lisp]} @itemsep trim the right end of a string
+@end(fgroup)
+@begin(pdescription)
+ @i<bag> @itemsep a string containing characters to trim
+
+ @i<str> @itemsep the string to trim
+
+ returns @itemsep a trimed copy of the string
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{string-upcase(@i(str), start: @i(start), end: @i(end))} @c{[sal]}
+
+ @xlcode{(string-upcase@pragma(defn)@index(string-upcase) @t(@i(str)) @t(&key )@t(:start) @t(:end))} @c{[lisp]} @itemsep convert to uppercase
+@end(fgroup)
+@begin(pdescription)
+ @i<str> @itemsep the string
+
+ :start @itemsep the starting offset
+
+ :end @itemsep the ending offset + 1
+
+ returns @itemsep a converted copy of the string
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{string-downcase(@i(str), start: @i(start), end: @i(end))} @c{[sal]}
+
+ @xlcode{(string-downcase@pragma(defn)@index(string-downcase) @t(@i(str)) @t(&key )@t(:start) @t(:end))} @c{[lisp]} @itemsep convert to lowercase
+@end(fgroup)
+@begin(pdescription)
+ @i<str> @itemsep the string
+
+ :start @itemsep the starting offset
+
+ :end @itemsep the ending offset + 1
+
+ returns @itemsep a converted copy of the string
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{nstring-upcase(@i(str), start: @i(start), end: @i(end))} @c{[sal]}
+
+ @xlcode{(nstring-upcase@pragma(defn)@index(nstring-upcase) @t(@i(str)) @t(&key )@t(:start) @t(:end))} @c{[lisp]} @itemsep convert to uppercase
+@end(fgroup)
+@begin(pdescription)
+ @i<str> @itemsep the string
+
+ :start @itemsep the starting offset
+
+ :end @itemsep the ending offset + 1
+
+ returns @itemsep the converted string (not a copy)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{nstring-downcase(@i(str), start: @i(start), end: @i(end))} @c{[sal]}
+
+ @xlcode{(nstring-downcase@pragma(defn)@index(nstring-downcase) @t(@i(str)) @t(&key )@t(:start) @t(:end))} @c{[lisp]} @itemsep convert to lowercase
+@end(fgroup)
+@begin(pdescription)
+ @i<str> @itemsep the string
+
+ :start @itemsep the starting offset
+
+ :end @itemsep the ending offset + 1
+
+ returns @itemsep the converted string (not a copy)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{strcat(@i(expr)@r(...))} @c{[sal]}
+
+ @xlcode{(strcat@pragma(defn)@index(strcat)@index(concatenate strings) @t(@i(expr))@r(...))} @c{[lisp]} @itemsep concatenate strings
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the strings to concatenate
+
+ returns @itemsep the result of concatenating the strings
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{subseq(@i(string), @i(start)[, @i(end)])} @c{[sal]}
+
+ @xlcode{(subseq@pragma(defn)@index(subseq) @t(@i(string)) @t(@i(start)) [@t(@i(end))])} @c{[lisp]} @itemsep extract a substring
+@end(fgroup)
+@begin(pdescription)
+ @i<string> @itemsep the string
+
+ @i<start> @itemsep the starting position (zero origin)
+
+ @i<end> @itemsep the ending position + 1 (defaults to end)
+
+ returns @itemsep substring between @i<start> and @i<end>
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ @begin(fgroup)@xlcode{string<(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string<@pragma(defn)@index(string<) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+ @begin(fgroup)@xlcode{string<=(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string<=@pragma(defn)@index(string<=) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+ @begin(fgroup)@xlcode{string=(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string=@pragma(defn)@index(string=) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+ @begin(fgroup)@xlcode{string/=(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string/=@pragma(defn)@index(string/=) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+ @begin(fgroup)@xlcode{string>=(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string>=@pragma(defn)@index(string>=) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+ @begin(fgroup)@xlcode{string>(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string>@pragma(defn)@index(string>) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@end(fgroup)
+@begin(pdescription)
+ @i<str1> @itemsep the first string to compare
+
+ @i<str2> @itemsep the second string to compare
+
+ :start1 @itemsep first substring starting offset
+
+ :end1 @itemsep first substring ending offset + 1
+
+ :start2 @itemsep second substring starting offset
+
+ :end2 @itemsep second substring ending offset + 1
+
+ returns @itemsep @xlcode(t) if predicate is true, @xlcode(nil) otherwise
+
+ Note: case is significant with these comparison functions.
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+@begin(fgroup)@xlcode{string-lessp(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string-lessp@pragma(defn)@index(string-lessp) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+@begin(fgroup)@xlcode{string-not-greaterp(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string-not-greaterp@pragma(defn)@index(string-not-greaterp) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+@begin(fgroup)@xlcode{string-equalp(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string-equalp@pragma(defn)@index(string-equalp) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+@begin(fgroup)@xlcode{string-not-equalp(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string-not-equalp@pragma(defn)@index(string-not-equalp) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+@begin(fgroup)@xlcode{string-not-lessp(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string-not-lessp@pragma(defn)@index(string-not-lessp) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+@begin(fgroup)@xlcode{string-greaterp(@i(str1), @i(str2), start1: @i(start1), end1: @i(end1), start2: @i(start2), end2: @i(end2))} @c{[sal]}
+
+ @xlcode{(string-greaterp@pragma(defn)@index(string-greaterp) @t(@i(str1)) @t(@i(str2)) @t(&key )@t(:start1) @t(:end1) @t(:start2) @t(:end2))} @c{[lisp]}
+@end(fgroup)
+@end(fgroup)
+@begin(pdescription)
+ @i<str1> @itemsep the first string to compare
+
+ @i<str2> @itemsep the second string to compare
+
+ :start1 @itemsep first substring starting offset
+
+ :end1 @itemsep first substring ending offset + 1
+
+ :start2 @itemsep second substring starting offset
+
+ :end2 @itemsep second substring ending offset + 1
+
+ returns @itemsep @xlcode(t) if predicate is true, @xlcode(nil) otherwise
+
+ Note: case is not significant with these comparison functions.
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Character Functions)@index(Character Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{char(@i(string), @i(index))} @c{[sal]}
+
+ @xlcode{(char@pragma(defn)@index(char) @t(@i(string)) @t(@i(index)))} @c{[lisp]} @itemsep extract a character from a string
+@end(fgroup)
+@begin(pdescription)
+ @i<string> @itemsep the string
+
+ @i<index> @itemsep the string index (zero relative)
+
+ returns @itemsep the ascii code of the character
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{upper-case-p(@i(chr))} @c{[sal]}
+
+ @xlcode{(upper-case-p@pragma(defn)@index(upper-case-p) @t(@i(chr)))} @c{[lisp]} @itemsep is this an upper case character?
+@end(fgroup)
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep @xlcode(t) if the character is upper case, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{lower-case-p(@i(chr))} @c{[sal]}
+
+ @xlcode{(lower-case-p@pragma(defn)@index(lower-case-p) @t(@i(chr)))} @c{[lisp]} @itemsep is this a lower case character?
+@end(fgroup)
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep @xlcode(t) if the character is lower case, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{both-case-p(@i(chr))} @c{[sal]}
+
+ @xlcode{(both-case-p@pragma(defn)@index(both-case-p) @t(@i(chr)))} @c{[lisp]} @itemsep is this an alphabetic (either case) character?
+@end(fgroup)
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep @xlcode(t) if the character is alphabetic, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{digit-char-p(@i(chr))} @c{[sal]}
+
+ @xlcode{(digit-char-p@pragma(defn)@index(digit-char-p) @t(@i(chr)))} @c{[lisp]} @itemsep is this a digit character?
+@end(fgroup)
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep the digit weight if character is a digit, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{char-code(@i(chr))} @c{[sal]}
+
+ @xlcode{(char-code@pragma(defn)@index(char-code) @t(@i(chr)))} @c{[lisp]} @itemsep get the ascii code of a character
+@end(fgroup)
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep the ascii character code (integer)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{code-char(@i(code))} @c{[sal]}
+
+ @xlcode{(code-char@pragma(defn)@index(code-char) @t(@i(code)))} @c{[lisp]} @itemsep get the character with a specified ascii code
+@end(fgroup)
+@begin(pdescription)
+ @i<code> @itemsep the ascii code (integer)
+
+ returns @itemsep the character with that code or @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{char-upcase(@i(chr))} @c{[sal]}
+
+ @xlcode{(char-upcase@pragma(defn)@index(char-upcase) @t(@i(chr)))} @c{[lisp]} @itemsep convert a character to upper case
+@end(fgroup)
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep the upper case character
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{char-downcase(@i(chr))} @c{[sal]}
+
+ @xlcode{(char-downcase@pragma(defn)@index(char-downcase) @t(@i(chr)))} @c{[lisp]} @itemsep convert a character to lower case
+@end(fgroup)
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep the lower case character
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{digit-char(@i(n))} @c{[sal]}
+
+ @xlcode{(digit-char@pragma(defn)@index(digit-char) @t(@i(n)))} @c{[lisp]} @itemsep convert a digit weight to a digit
+@end(fgroup)
+@begin(pdescription)
+ @i<n> @itemsep the digit weight (integer)
+
+ returns @itemsep the digit character or @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{char-int(@i(chr))} @c{[sal]}
+
+ @xlcode{(char-int@pragma(defn)@index(char-int) @t(@i(chr)))} @c{[lisp]} @itemsep convert a character to an integer
+@end(fgroup)
+@begin(pdescription)
+ @i<chr> @itemsep the character
+
+ returns @itemsep the ascii character code
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{int-char(@i(int))} @c{[sal]}
+
+ @xlcode{(int-char@pragma(defn)@index(int-char) @t(@i(int)))} @c{[lisp]} @itemsep convert an integer to a character
+@end(fgroup)
+@begin(pdescription)
+ @i<int> @itemsep the ascii character code
+
+ returns @itemsep the character with that code
+
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+ @begin(fgroup)@xlcode{char<(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char<@pragma(defn)@index(char<) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+ @begin(fgroup)@xlcode{char<=(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char<=@pragma(defn)@index(char<=) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+ @begin(fgroup)@xlcode{char=(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char=@pragma(defn)@index(char=) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+ @begin(fgroup)@xlcode{char/=(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char/=@pragma(defn)@index(char/=) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+ @begin(fgroup)@xlcode{char>=(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char>=@pragma(defn)@index(char>=) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+ @begin(fgroup)@xlcode{char>(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char>@pragma(defn)@index(char>) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@end(fgroup)
+@begin(pdescription)
+ @i<chr1> @itemsep the first character to compare
+
+ @i<chr2> @itemsep the second character(s) to compare
+
+ returns @itemsep @xlcode(t) if predicate is true, @xlcode(nil) otherwise
+
+ Note: case is significant with these comparison functions.
+@end(pdescription)
+@blankspace(1)
+@begin(fgroup)
+@begin(fgroup)@xlcode{char-lessp(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char-lessp@pragma(defn)@index(char-lessp) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+@begin(fgroup)@xlcode{char-not-greaterp(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char-not-greaterp@pragma(defn)@index(char-not-greaterp) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+@begin(fgroup)@xlcode{char-equalp(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char-equalp@pragma(defn)@index(char-equalp) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+@begin(fgroup)@xlcode{char-not-equalp(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char-not-equalp@pragma(defn)@index(char-not-equalp) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+@begin(fgroup)@xlcode{char-not-lessp(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char-not-lessp@pragma(defn)@index(char-not-lessp) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@pragma(endcodef)
+
+@begin(fgroup)@xlcode{char-greaterp(@i(chr1), @i(chr2)@r(...))} @c{[sal]}
+
+ @xlcode{(char-greaterp@pragma(defn)@index(char-greaterp) @t(@i(chr1)) @t(@i(chr2))@r(...))} @c{[lisp]}
+@end(fgroup)
+@end(fgroup)
+@begin(pdescription)
+@i<chr1> @itemsep the first string to compare
+
+@i<chr2> @itemsep the second string(s) to compare
+
+returns @itemsep @xlcode(t) if predicate is true, @xlcode(nil) otherwise
+
+ Note: case is not significant with these comparison functions.
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(Input/Output Functions)@index(Input/Output Functions)
+@begin(fdescription)
+ @begin(fgroup)@xlcode{read([@i(stream)[, @i(eof)[, @i(rflag)]]])} @c{[sal]}
+
+ @xlcode{(read@pragma(defn)@index(read) [@t(@i(stream)) [@t(@i(eof)) [@t(@i(rflag))]]])} @c{[lisp]} @itemsep read an expression
+@end(fgroup)
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ @i<eof> @itemsep the value to return on end of file (default is @xlcode(nil))
+
+ @i<rflag> @itemsep recursive read flag (default is @xlcode(nil))
+
+ returns @itemsep the expression read
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(print@pragma(defn)@index(print) @t(@i(expr)) [@t(@i(stream))])} @c{[lisp]} @itemsep print an expression on a new line
+@begin(pdescription)
+ @i<expr> @itemsep the expression to be printed
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{prin1(@i(expr)[, @i(stream)])} @c{[sal]}
+
+ @xlcode{(prin1@pragma(defn)@index(prin1) @t(@i(expr)) [@t(@i(stream))])} @c{[lisp]} @itemsep print an expression
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to be printed
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{princ(@i(expr)[, @i(stream)])} @c{[sal]}
+
+ @xlcode{(princ@pragma(defn)@index(princ) @t(@i(expr)) [@t(@i(stream))])} @c{[lisp]} @itemsep print an expression without quoting
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be printed
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{pprint(@i(expr)[, @i(stream)])} @c{[sal]}
+
+ @xlcode{(pprint@pragma(defn)@index(pprint) @t(@i(expr)) [@t(@i(stream))])} @c{[lisp]} @itemsep pretty print an expression
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expressions to be printed
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the expression
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{terpri([@i(stream)])} @c{[sal]}
+
+ @xlcode{(terpri@pragma(defn)@index(terpri) [@t(@i(stream))])} @c{[lisp]} @itemsep terminate the current print line
+@end(fgroup)
+@begin(pdescription)
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{flatsize(@i(expr))} @c{[sal]}
+
+ @xlcode{(flatsize@pragma(defn)@index(flatsize) @t(@i(expr)))} @c{[lisp]} @itemsep length of printed representation using prin1
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression
+
+ returns @itemsep the length
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{flatc(@i(expr))} @c{[sal]}
+
+ @xlcode{(flatc@pragma(defn)@index(flatc) @t(@i(expr)))} @c{[lisp]} @itemsep length of printed representation using princ
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression
+
+ returns @itemsep the length
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(The Format Function)@index(The Format Function)
+@begin(fdescription)
+@begin(fgroup)@xlcode{format(@i(stream), @i(fmt), @i(arg)@r(...))} @c{[sal]}
+
+ @xlcode{(format@pragma(defn)@index(format) @t(@i(stream)) @t(@i(fmt)) @t(@i(arg))@r(...))} @c{[lisp]} @itemsep do formated
+@end(fgroup)
+output
+@begin(pdescription)
+ @i<stream> @itemsep the output stream
+
+ @i<fmt> @itemsep the format string
+
+ @i<arg> @itemsep the format arguments
+
+ returns @itemsep output string if @i<stream> is @xlcode(nil), @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+ The format string can contain characters that should be copied
+ directly to the output and formatting directives. The
+ formatting directives are:
+@begin(display)
+@xlcode(~A) @itemsep print next argument using princ
+@xlcode(~S) @itemsep print next argument using prin1
+@xlcode(~%) @itemsep start a new line
+@xlcode(~~) @itemsep print a tilde character
+@xlcode(~)<newline> @itemsep ignore this one newline and white space on the
+next line up to the first non-white-space character or newline. This
+allows strings to continue across multiple lines
+@end(display)
+
+@section(File I/O Functions)@index(File I/O Functions)
+Note that files are ordinarily opened as text. Binary files (such as standard midi files) must be opened with @xlcode(open-binary) on non-unix systems.
+@begin(fdescription)
+ @begin(fgroup)@xlcode{open(@i(fname), direction: @i(direction))} @c{[sal]}
+
+ @xlcode{(open@pragma(defn)@index(open) @t(@i(fname)) @t(&key )@t(:direction))} @c{[lisp]} @itemsep open a file stream
+@end(fgroup)
+@begin(pdescription)
+ @i<fname> @itemsep the file name string or symbol
+
+ :direction @itemsep :input or :output (default is :input)
+
+ returns @itemsep a stream
+
+@end(pdescription)
+@blankspace(1)
+ @begin(fgroup)@xlcode{open-binary(@i(fname), direction: @i(direction))} @c{[sal]}
+
+ @xlcode{(open-binary@pragma(defn)@index(open-binary)@index(open)@index(binary files) @t(@i(fname)) @t(&key )@t(:direction))} @c{[lisp]} @itemsep open a binary file stream
+@end(fgroup)
+@begin(pdescription)
+ @i<fname> @itemsep the file name string or symbol
+
+ :direction @itemsep :input or :output (default is :input)
+
+ returns @itemsep a stream
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{close(@i(stream))} @c{[sal]}
+
+ @xlcode{(close@pragma(defn)@index(close) @t(@i(stream)))} @c{[lisp]} @itemsep close a file stream
+@end(fgroup)
+@begin(pdescription)
+ @i<stream> @itemsep the stream
+
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{setdir(@i(path)[, @i(verbose)])} @c{[sal]}
+
+ @xlcode{(setdir@pragma(defn)@index(setdir)@index(change directory) @t(@i(path)) [@t(@i(verbose))])} @c{[lisp]}@foot(This is not a standard XLISP 2.0 function.) @itemsep set current directory
+@end(fgroup)
+@begin(pdescription)
+ @i<path> @itemsep the path of the new directory
+
+ @i<verbose> @itemsep print error message if current directory cannot be changed to @i(path)
+
+ returns @itemsep the resulting full path, e.g. (setdir ".") gets the current working directory, or @xlcode(nil) if an error occurs
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{listdir(@i(path))} @c{[sal]}
+
+ @xlcode{(listdir@pragma(defn)@index(listdir)@index(directory listing)@index(scan directory)@index(read directory)@index(list directory) @t(@i(path)))} @c{[lisp]}@foot(This is not a standard XLISP 2.0 function.) @itemsep get a directory listing
+@end(fgroup)
+@begin(pdescription)
+ @i<path> @itemsep the path of the directory to be listed
+
+ returns @itemsep list of filenames in the directory
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{get-temp-path()} @c{[sal]}
+
+ @xlcode{(get-temp-path@pragma(defn)@index(get-temp-path)@index(temporary files)@index(temp file))} @c{[lisp]}@foot(This is not a standard XLISP 2.0 function.) @itemsep get a path where a temporary file can be created. Under Windows, this is based on environment variables. If XLISP is running as a sub-process to Java, the environment may not exist, in which case the default result is the unfortunate choice @xlcode(c:\windows\).
+@end(fgroup)
+@begin(pdescription)
+ returns @itemsep the resulting full path as a string
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{get-user()} @c{[sal]}
+
+ @xlcode{(get-user@pragma(defn)@index(get-user)@index(user name)@index(temp file))} @c{[lisp]}@foot(This is not a standard XLISP 2.0 function.) @itemsep get the user ID. In Unix systems (including OS X and Linux), this is the value of the USER environment variable. In Windows, this is currently just ``nyquist'', which is also returned if the environment variable cannot be accessed. This function is used to avoid the case of two users creating files of the same name in the same temp directory.
+@end(fgroup)
+@begin(pdescription)
+ returns @itemsep the string naming the user
+
+@end(pdescription)
+@blankspace(1)
+ @begin(fgroup)@xlcode{find-in-xlisp-path(@i(filename))} @c{[sal]}
+
+ @xlcode{(find-in-xlisp-path@pragma(defn)@index(find-in-xlisp-path) @t(@i(filename)))} @c{[lisp]}@foot(This is not a standard XLISP 2.0 function.) @itemsep search the XLISP search path (e.g. @xlcode(XLISPPATH) from the environment) for @i(filename). If @i(filename) is not found as is, and there is no file extension, append "@code(.lsp)" to @i(filename) and search again. The current directory is not searched.
+@end(fgroup)
+@begin(pdescription)
+ @i<filename> @itemsep the name of the file to search for
+
+ returns @itemsep a full path name to the first occurrence found
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{read-char([@i(stream)])} @c{[sal]}
+
+ @xlcode{(read-char@pragma(defn)@index(read-char)@index(get char) [@t(@i(stream))])} @c{[lisp]} @itemsep read a character from a stream
+@end(fgroup)
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ returns @itemsep the character
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{peek-char([@i(flag)[, @i(stream)]])} @c{[sal]}
+
+ @xlcode{(peek-char@pragma(defn)@index(peek-char) [@t(@i(flag)) [@t(@i(stream))]])} @c{[lisp]} @itemsep peek at the next character
+@end(fgroup)
+@begin(pdescription)
+ @i<flag> @itemsep flag for skipping white space (default is @xlcode(nil))
+
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ returns @itemsep the character (integer)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{write-char(@i(ch)[, @i(stream)])} @c{[sal]}
+
+ @xlcode{(write-char@pragma(defn)@index(write-char) @t(@i(ch)) [@t(@i(stream))])} @c{[lisp]} @itemsep write a character to a stream
+@end(fgroup)
+@begin(pdescription)
+ @i<ch> @itemsep the character to write
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the character
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{read-int([@i(stream)[, @i(length)]])} @c{[sal]}
+
+ @xlcode{(read-int@pragma(defn)@index(read-int) [@t(@i(stream)) [@t(@i(length))]])} @c{[lisp]} @itemsep read a binary integer from a stream
+@end(fgroup)
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ @i<length> @itemsep the length of the integer in bytes (default is 4)
+
+ returns @itemsep the integer
+
+Note: Integers are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To read little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{write-int(@i(ch)[, @i(stream)[, @i(length)]])} @c{[sal]}
+
+ @xlcode{(write-int@pragma(defn)@index(write-int) @t(@i(ch)) [@t(@i(stream)) [@t(@i(length))]])} @c{[lisp]} @itemsep write a binary integer to a stream
+@end(fgroup)
+@begin(pdescription)
+ @i<ch> @itemsep the character to write
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ @i<length> @itemsep the length of the integer in bytes (default is 4)
+
+ returns @itemsep the integer
+
+Note: Integers are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To write in little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{read-float([@i(stream)[, @i(length)]])} @c{[sal]}
+
+ @xlcode{(read-float@pragma(defn)@index(read-float) [@t(@i(stream)) [@t(@i(length))]])} @c{[lisp]} @itemsep read a binary floating-point number from a stream
+@end(fgroup)
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ @i<length> @itemsep the length of the float in bytes (default is 4, legal values are -4, -8, 4, and 8)
+
+ returns @itemsep the integer
+
+Note: Floats are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To read little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{write-float(@i(ch)[, @i(stream)[, @i(length)]])} @c{[sal]}
+
+ @xlcode{(write-float@pragma(defn)@index(write-float) @t(@i(ch)) [@t(@i(stream)) [@t(@i(length))]])} @c{[lisp]} @itemsep write a binary floating-point number to a stream
+@end(fgroup)
+@begin(pdescription)
+ @i<ch> @itemsep the character to write
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ @i<length> @itemsep the length of the float in bytes (default is 4, legal values are -4, -8, 4, and 8)
+
+ returns @itemsep the integer
+
+Note: Floats are assumed to be big-endian (high-order byte first) and
+signed, regardless of the platform. To write in little-endian format, use a
+negative number for the length, e.g. -4 indicates a 4-bytes, low-order
+byte first. The file should be opened in binary mode.
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{read-line([@i(stream)])} @c{[sal]}
+
+ @xlcode{(read-line@pragma(defn)@index(read-line) [@t(@i(stream))])} @c{[lisp]} @itemsep read a line from a stream
+@end(fgroup)
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ returns @itemsep the string
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{read-byte([@i(stream)])} @c{[sal]}
+
+ @xlcode{(read-byte@pragma(defn)@index(read-byte) [@t(@i(stream))])} @c{[lisp]} @itemsep read a byte from a stream
+@end(fgroup)
+@begin(pdescription)
+ @i<stream> @itemsep the input stream (default is standard input)
+
+ returns @itemsep the byte (integer)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{write-byte(@i(byte)[, @i(stream)])} @c{[sal]}
+
+ @xlcode{(write-byte@pragma(defn)@index(write-byte) @t(@i(byte)) [@t(@i(stream))])} @c{[lisp]} @itemsep write a byte to a stream
+@end(fgroup)
+@begin(pdescription)
+ @i<byte> @itemsep the byte to write (integer)
+
+ @i<stream> @itemsep the output stream (default is standard output)
+
+ returns @itemsep the byte (integer)
+
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(String Stream Functions)@index(String Stream Functions)
+ These functions operate on unnamed streams. An unnamed output
+ stream collects characters sent to it when it is used as the
+ destination of any output function. The functions
+@xlcode(get-output-stream-string) and @xlcode(get-output-stream-list) return a string or a list of characters.
+
+An unnamed input stream is setup with the
+ @xlcode(make-string-input-stream) function and returns each character of the string when
+ it is used as the source of any input function.
+
+@begin(fdescription)
+@blankspace(1)
+ @begin(fgroup)@xlcode{make-string-input-stream(@i(str)[, @i(start)[, @i(end)]])} @c{[sal]}
+
+ @xlcode{(make-string-input-stream@pragma(defn)@index(make-string-input-stream) @t(@i(str)) [@t(@i(start)) [@t(@i(end))]])} @c{[lisp]}
+@end(fgroup)
+@begin(pdescription)
+ @i<str> @itemsep the string
+
+ @i<start> @itemsep the starting offset
+
+ @i<end> @itemsep the ending offset + 1
+
+ returns @itemsep an unnamed stream that reads from the string
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{make-string-output-stream)()} @c{[sal]}
+
+ @xlcode{(make-string-output-stream)} @c{[lisp]}@pragma(defn)@index(make-string-output-stream)
+@end(fgroup)
+@begin(pdescription)
+ returns @itemsep an unnamed output stream
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{get-output-stream-string(@i(stream))} @c{[sal]}
+
+ @xlcode{(get-output-stream-string@pragma(defn)@index(get-output-stream-string) @t(@i(stream)))} @c{[lisp]}
+@end(fgroup)
+@begin(pdescription)
+ @i<stream> @itemsep the output stream
+
+ returns @itemsep the output so far as a string
+
+ Note: the output stream is emptied by this function
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{get-output-stream-list(@i(stream))} @c{[sal]}
+
+ @xlcode{(get-output-stream-list@pragma(defn)@index(get-output-stream-list) @t(@i(stream)))} @c{[lisp]}
+@end(fgroup)
+@begin(pdescription)
+ @i<stream> @itemsep the output stream
+
+ returns @itemsep the output so far as a list
+
+ Note: the output stream is emptied by this function
+@end(pdescription)
+@blankspace(1)
+@end(fdescription)
+
+@section(System Functions)@index(System Functions)
+Note: the @xlcode(load) function first tries to load a file from the current directory. A @code(.lsp) extension is added if there is not already an alphanumeric extension following a period. If that fails, XLISP searches the path, which is obtained from the XLISPPATH environment variable in Unix and HKEY_LOCAL_MACHINE\SOFTWARE\CMU\Nyquist\XLISPPATH under Win32. (The Macintosh version has no search path.)
+
+@begin(fdescription)
+ @begin(fgroup)@xlcode{get-env(@i(name))} @c{[sal]}
+
+ @xlcode{(get-env@pragma(defn)@index(get-env)@index(getenv)@index(environment variables) @t(@i(name)))} @c{[lisp]} @itemsep get from an environment variable
+@end(fgroup)
+@begin(pdescription)
+ @i<name> @itemsep the name of the environment variable
+
+ returns @itemsep string value of the environment variable, @xlcode(nil) if variable does not exist
+
+@end(pdescription)
+@blankspace(1)
+
+ @xlcode{(load@pragma(defn)@index(load) @t(@i(fname)) @t(&key )@t(:verbose) @t(:print))} @c{[lisp]} @itemsep load a source file
+@begin(pdescription)
+ @i<fname> @itemsep the filename string or symbol
+
+ :verbose @itemsep the verbose flag (default is t)
+
+ :print @itemsep the print flag (default is @xlcode(nil))
+
+ returns @itemsep the filename
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{save(@i(fname))} @c{[sal]}
+
+ @xlcode{(save@pragma(defn)@index(save) @t(@i(fname)))} @c{[lisp]} @itemsep save workspace to a file
+@end(fgroup)
+@begin(pdescription)
+ @i<fname> @itemsep the filename string or symbol
+
+ returns @itemsep @xlcode(t) if workspace was written, @xlcode(nil) otherwise
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{restore(@i(fname))} @c{[sal]}
+
+ @xlcode{(restore@pragma(defn)@index(restore) @t(@i(fname)))} @c{[lisp]} @itemsep restore workspace from a file
+@end(fgroup)
+@begin(pdescription)
+ @i<fname> @itemsep the filename string or symbol
+
+ returns @itemsep @xlcode(nil) on failure, otherwise never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{dribble([@i(fname)])} @c{[sal]}
+
+ @xlcode{(dribble@pragma(defn)@index(dribble) [@t(@i(fname))])} @c{[lisp]} @itemsep create a file with a transcript of a session
+@end(fgroup)
+@begin(pdescription)
+ @i<fname> @itemsep file name string or symbol
+ (if missing, close current transcript)
+
+ returns @itemsep @xlcode(t) if the transcript is opened, @xlcode(nil) if it is closed
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{gc()} @c{[sal]}
+
+ @xlcode{(gc@pragma(defn)@index(gc))} @c{[lisp]} @itemsep force garbage collection
+@end(fgroup)
+@begin(pdescription)
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{expand(@i(num))} @c{[sal]}
+
+ @xlcode{(expand@pragma(defn)@index(expand) @t(@i(num)))} @c{[lisp]} @itemsep expand memory by adding segments
+@end(fgroup)
+@begin(pdescription)
+ @i<num> @itemsep the number of segments to add
+
+ returns @itemsep the number of segments added
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{alloc(@i(num))} @c{[sal]}
+
+ @xlcode{(alloc@pragma(defn)@index(alloc) @t(@i(num)))} @c{[lisp]} @itemsep change number of nodes to allocate in each segment
+@end(fgroup)
+@begin(pdescription)
+ @i<num> @itemsep the number of nodes to allocate
+
+ returns @itemsep the old number of nodes to allocate
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{info()} @c{[sal]}
+
+ @xlcode{(info@pragma(defn)@index(info))} @c{[lisp]} @itemsep show information about memory usage.
+@end(fgroup)
+@begin(pdescription)
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{room()} @c{[sal]}
+
+ @xlcode{(room@pragma(defn)@index(room))} @c{[lisp]} @itemsep show memory allocation statistics
+@end(fgroup)
+@begin(pdescription)
+ returns @itemsep @xlcode(nil)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{type-of(@i(expr))} @c{[sal]}
+
+ @xlcode{(type-of@pragma(defn)@index(type-of) @t(@i(expr)))} @c{[lisp]} @itemsep returns the type of the expression
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the expression to return the type of
+
+ returns @itemsep @xlcode(nil) if the value is @xlcode(nil) otherwise one of the symbols:
+
+@begin(pdescription)
+ SYMBOL @itemsep for symbols
+
+ OBJECT @itemsep for objects
+
+ CONS @itemsep for conses
+
+ SUBR @itemsep for built-in functions
+
+ FSUBR @itemsep for special forms
+
+ CLOSURE @itemsep for defined functions
+
+ STRING @itemsep for strings
+
+ FIXNUM @itemsep for integers
+
+ FLONUM @itemsep for floating point numbers
+
+ CHARACTER @itemsep for characters
+
+ FILE-STREAM @itemsep for file pointers
+
+ UNNAMED-STREAM @itemsep for unnamed streams
+
+ ARRAY @itemsep for arrays
+
+@end(pdescription)
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{peek(@i(addrs))} @c{[sal]}
+
+ @xlcode{(peek@pragma(defn)@index(peek) @t(@i(addrs)))} @c{[lisp]} @itemsep peek at a location in memory
+@end(fgroup)
+@begin(pdescription)
+ @i<addrs> @itemsep the address to peek at (integer)
+
+ returns @itemsep the value at the specified address (integer)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{poke(@i(addrs), @i(value))} @c{[sal]}
+
+ @xlcode{(poke@pragma(defn)@index(poke) @t(@i(addrs)) @t(@i(value)))} @c{[lisp]} @itemsep poke a value into memory
+@end(fgroup)
+@begin(pdescription)
+ @i<addrs> @itemsep the address to poke (integer)
+
+ @i<value> @itemsep the value to poke into the address (integer)
+
+ returns @itemsep the value
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{bigendianp()} @c{[sal]}
+
+ @xlcode{(bigendianp@pragma(defn)@index(bigendianp)@index(endian)@index(big endian)@index(little endian))} @c{[lisp]} @itemsep is this a big-endian machine?
+@end(fgroup)
+@begin(pdescription)
+ returns @itemsep T if this a big-endian architecture, storing the high-order byte of an integer at the lowest byte address of the integer; otherwise, NIL.
+@foot(This is not a standard XLISP 2.0 function.)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{address-of(@i(expr))} @c{[sal]}
+
+ @xlcode{(address-of@pragma(defn)@index(address-of) @t(@i(expr)))} @c{[lisp]} @itemsep get the address of an xlisp node
+@end(fgroup)
+@begin(pdescription)
+ @i<expr> @itemsep the node
+
+ returns @itemsep the address of the node (integer)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{exit()} @c{[sal]}
+
+ @xlcode{(exit@pragma(defn)@index(exit))} @c{[lisp]} @itemsep exit xlisp
+@end(fgroup)
+@begin(pdescription)
+ returns @itemsep never returns
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{setup-console()} @c{[sal]}
+
+ @xlcode{(setup-console@pragma(defn)@index(setup-console)@index(window initialization))} @c{[lisp]} @itemsep set default console attributes
+@end(fgroup)
+@begin(pdescription)
+ returns @itemsep NIL
+
+Note: Under Windows, Nyquist normally starts up in a medium-sized console window with black text and a white background, with a window title of ``Nyquist.'' This is normally accomplished by calling @xlcode(setup-console) in @code(system.lsp). In Nyquist, you can avoid this behavior by setting @xlcode(*setup-console*) to NIL in your @code(init.lsp) file. If @xlcode(setup-console) is not called, Nyquist uses standard input and output as is. This is what you want if you are running Nyquist inside of emacs, for example.@index(emacs, using Nyquist with)
+
+@end(pdescription)
+@blankspace(1)
+
+ @begin(fgroup)@xlcode{echoenabled(@i(flag))} @c{[sal]}
+
+ @xlcode{(echoenabled@pragma(defn)@index(echoenabled)@index(console, XLISP) @t(@i(flag)))} @c{[lisp]} @itemsep turn console input echoing on or off
+@end(fgroup)
+@begin(pdescription)
+ @i<flag> @itemsep T to enable echo, NIL to disable
+
+ returns @itemsep NIL
+
+Note: This function is only implemented under Linux and Mac OS X. If Nyquist I/O is redirected through pipes,
+the Windows version does not echo the input, but the Linux and Mac versions do. You can turn off echoing with
+this function. Under windows it is defined to do nothing.
+
+@end(pdescription)
+@end(fdescription)
+
+@section(File I/O Functions)@index(File I/O Functions)
+
+@subsection(Input from a File)@index(Input from a File)
+
+To open a file for input, use the @xlcode(open) function with the keyword
+argument @xlcode(:direction) set to @xlcode(:input). To open a file for output,
+use the @xlcode(open) function with the keyword argument @xlcode(:direction) set
+to @xlcode(:output). The @xlcode(open) function takes a single required argument which
+is the name of the file to be opened. This name can be in the form of a
+string or a symbol. The @xlcode(open) function returns an object of type
+@xlcode(FILE-STREAM) if it succeeds in opening the specified file. It returns the
+value @xlcode(nil) if it fails. In order to manipulate the file, it is
+necessary to save the value returned by the @xlcode(open) function. This is
+usually done by assigning it to a variable with the @xlcode(setq) special form or by
+binding it using @xlcode(let) or @xlcode(let*). Here is an example:
+@begin(example)
+(setq fp (open "init.lsp" :direction :input))
+@end(example)
+ Evaluating this expression will result in the file @code(init.lsp)
+ being opened. The file object that will be returned by the @xlcode(open)
+ function will be assigned to the variable @xlcode(fp).
+
+ It is now possible to use the file for input. To read an
+ expression from the file, just supply the value of the @xlcode(fp)
+ variable as the optional @i(stream) argument to @xlcode(read).
+@begin(example)
+(read fp)
+@end(example)
+ Evaluating this expression will result in reading the first
+ expression from the file @code(init.lsp). The expression will be
+ returned as the result of the @xlcode(read) function. More expressions
+ can be read from the file using further calls to the @xlcode(read)
+ function. When there are no more expressions to read, the @xlcode(read)
+ function will return @xlcode(nil) (or whatever value was supplied as the
+ second argument to @xlcode(read)).
+
+ Once you are done reading from the file, you should close it.
+ To close the file, use the following expression:
+@begin(example)
+(close fp)
+@end(example)
+ Evaluating this expression will cause the file to be closed.
+
+@subsection(Output to a File)@index(Output to a File)
+
+ Writing to a file is pretty much the same as reading from one.
+ You need to open the file first. This time you should use the
+ @xlcode(open) function to indicate that you will do output to the file.
+ For example:
+@begin(example)
+(setq fp (open "test.dat" :direction :output))
+@end(example)
+ Evaluating this expression will open the file @code(test.dat) for
+ output. If the file already exists, its current contents will
+ be discarded. If it doesn't already exist, it will be created.
+ In any case, a @xlcode(FILE-STREAM) object will be returned by the @xlcode(OPEN)
+ function. This file object will be assigned to the @xlcode(fp)
+ variable.
+
+ It is now possible to write to this file by supplying the value
+ of the @xlcode(fp) variable as the optional @i(stream) parameter in the @xlcode(print) function.
+@begin(example)
+(print "Hello there" fp)
+@end(example)
+ Evaluating this expression will result in the string ``Hello
+ there'' being written to the file @code(test.dat). More data can be
+ written to the file using the same technique.
+
+ Once you are done writing to the file, you should close it.
+ Closing an output file is just like closing an input file.
+@begin(example)
+(close fp)
+@end(example)
+ Evaluating this expression will close the output file and make
+ it permanent.
+
+@subsection(A Slightly More Complicated File Example)
+
+ This example shows how to open a file, read each Lisp expression
+ from the file and print it. It demonstrates the use of files
+ and the use of the optional @i(stream) argument to the @xlcode(read)
+ function.
+@begin(programexample)
+(do* ((fp (open "test.dat" :direction :input))
+ (ex (read fp) (read fp)))
+ ((null ex) nil)
+ (print ex))
+@end(programexample)
+