abcl.tex 61.1 KB
Newer Older
1
% -*- mode: latex; -*-
2
% http://en.wikibooks.org/wiki/LaTeX/
3 4
\documentclass[10pt]{book}
\usepackage{abcl}
5

6 7 8
\usepackage{hyperref} % Put this one last, it redefines lots of internals


9
\begin{document}
10
\title{Armed Bear Common Lisp User Manual}
11
\date{Version 1.5.0-dev\\
12
\smallskip
13
October 2016}
14 15
\author{Mark Evenson \and Erik H\"{u}lsmann \and Rudolf Schlatte \and
  Alessio Stalla \and Ville Voutilainen}
16

17 18
\maketitle

19
\tableofcontents
20 21 22 23 24 25 26 27

%%Preface to the Fifth edition, abcl-1.4.0
\subsection{Preface to the Fifth Edition}

\textsc{ABCL} 1.4 consolidates eighteen months of production bugfixes,
and substatianally improves the support for invoking external
processes via SYS:RUN-PROGRAM.

28
%%Preface to the Fourth edition, abcl-1.3.
29
\subsection{Preface to the Fourth Edition}
30

31
\textsc{ABCL} 1.3 now implements an optimized implementation of the
32 33
LispStack abstraction thanks to Dmitry Nadezhin which runs on ORCL
JVMs from 1.[5-8] conformantly.
34 35 36 37 38 39

%%Preface to the Third edition, abcl-1.2.
\subsection{Preface to the Third Edition}
The implementation now contains a performant and conformant
implementation of (A)MOP to the point of inclusion in CLOSER-MOP's
test suite.
40

41
%%Preface to the second edition, abcl-1.1.
42

43 44
\subsection{Preface to the Second Edition}

45
\textsc{ABCL} 1.1 now contains \textsc{(A)MOP}.  We hope you enjoy!  --The Mgmt.
46

47
\chapter{Introduction}
48

49 50 51 52 53
Armed Bear Common Lisp (\textsc{ABCL}) is an implementation of Common
Lisp that runs on the Java Virtual Machine.  It compiles Common Lisp
to Java 5 bytecode \footnote{The class file version is ``49.0''.},
providing the following integration methods for interfacing with Java
code and libraries:
54 55 56 57 58 59 60 61 62 63 64
\begin{itemize}
\item Lisp code can create Java objects and call their methods (see
  Section~\ref{sec:lisp-java}, page~\pageref{sec:lisp-java}).
\item Java code can call Lisp functions and generic functions, either
  directly (Section~\ref{sec:calling-lisp-from-java},
  page~\pageref{sec:calling-lisp-from-java}) or via \texttt{JSR-223}
  (Section~\ref{sec:java-scripting-api},
  page~\pageref{sec:java-scripting-api}).
\item \code{jinterface-implementation} creates Lisp-side implementations
  of Java interfaces that can be used as listeners for Swing classes and
  similar.
65 66 67 68 69 70 71
\item \code{java:jnew-runtime-class} can inject fully synthetic Java
  classes--and their objects-- into the current JVM process whose
  behavior is specified via closures expressed in Common Lisp.. \footnote{Parts of
    the current implementation are not fully finished, so the status
    of some interfaces here should be treated with skepticism if you
    run into problems.}

72
\end{itemize}
73 74
\textsc{ABCL} is supported by the Lisp library manager
\textsc{QuickLisp}\footnote{\url{http://quicklisp.org/}} and can run many of the
75 76 77 78
programs and libraries provided therein out-of-the-box.

\section{Conformance}
\label{section:conformance}
79

80
\subsection{ANSI Common Lisp}
81
\textsc{ABCL} is currently a (non)-conforming \textsc{ANSI} Common Lisp
82
implementation due to the following known issues:
83

84
\begin{itemize}
85
\item The generic function signatures of the \code{CL:DOCUMENTATION} symbol
86
  do not match the specification.
87
\item The \code{CL:TIME} form does not return a proper \code{CL:VALUES}
88
  environment to its caller.
89
\item When merging pathnames and the defaults point to a \code{EXT:JAR-PATHNAME},
90 91 92 93 94
  we set the \code{DEVICE} of the result to \code{:UNSPECIFIC} if the pathname to be
  be merged does not contain a specified \code{DEVICE}, does not contain a
  specified \code{HOST}, does contain a relative \code{DIRECTORY}, and we are
  not running on a \textsc{MSFT} Windows platform.\footnote{The intent of this
    rather arcane sounding deviation from conformance is so that the
95
    result of a merge won't fill in a \code{DEVICE} with the wrong "default
96
    device for the host" in the sense of the fourth paragraph in the
97
    \textsc{CLHS} description of MERGE-PATHNAMES (see in \cite{CLHS} the paragraph beginning
98 99 100 101 102
    "If the PATHNAME explicitly specifies a host and not a device…").
    A future version of the implementation may return to conformance
    by using the \code{HOST} value to reflect the type explicitly.
  }

103
\end{itemize}
104

105 106 107 108 109
Somewhat confusingly, this statement of non-conformance in the
accompanying user documentation fulfills the requirements that
\textsc{ABCL} is a conforming ANSI Common Lisp implementation according
to the Common Lisp HyperSpec~\cite{CLHS}.  Clarifications to this point
are solicited.
110

111
\textsc{ABCL} aims to be be a fully conforming \textsc{ANSI} Common Lisp implementation.
112
Any other behavior should be reported as a bug.
113

114
\subsection{Contemporary Common Lisp}
115
In addition to \textsc{ANSI} conformance, \textsc{ABCL} strives to implement
116 117
features expected of a contemporary Common Lisp, i.e. a Lisp of the
post-2005 Renaissance.
118

119 120
The following known problems detract from \textsc{ABCL} being a proper
contemporary Common Lisp.
121
\begin{itemize}
122 123 124 125 126
\item An incomplete implementation of interactive debugging mechanisms,
  namely a no-op version of \code{STEP} \footnote{Somewhat surprisingly
    allowed by \textsc{ANSI}}, the inability to inspect local variables
  in a given call frame, and the inability to resume a halted
  computation at an arbitrarily selected call frame.
127 128 129 130
\item Incomplete streams abstraction, in that \textsc{ABCL} needs a
  suitable abstraction between \textsc{ANSI} and \textsc{Gray streams}
  with a runtime switch for the beyond conforming
  behavior.  \footnote{The streams could be optimized to the
131 132
    \textsc{JVM} NIO \cite{nio} abstractions at great profit for
    binary byte-level manipulations.}
133 134 135 136
\item Incomplete documentation: source code is missing docstrings from
  all exported symbols from the \code{EXTENSIONS}, \code{SYSTEM},
  \code{JAVA}, \code{MOP}, and \code{THREADS} packages.  This user
  manual is currently in draft status.
137 138 139 140 141
\end{itemize}



\section{License}
142

143 144 145
\textsc{ABCL} is licensed under the terms of the \textsc{GPL} v2 of
June 1991 with the ``classpath-exception'' (see the file
\texttt{COPYING} in the source distribution \footnote{See
146
  \url{http://abcl.org/svn/trunk/tags/1.4.0/COPYING}} for
147 148
the license, term 13 in the same file for the classpath exception).
This license broadly means that you must distribute the sources to
149 150
\textsc{ABCL}, including any changes you make, together with a program that
includes \textsc{ABCL}, but that you are not required to distribute the sources
151 152 153
of the whole program.  Submitting your changes upstream to the ABCL
development team is actively encouraged and very much appreciated, of
course.
154

155
\section{Contributors}
156

157 158 159 160 161
\begin{itemize}
\item Philipp Marek \texttt{Thanks for the markup}
\item Douglas Miles \texttt{Thanks for the whacky IKVM stuff and keeping the flame alive
  in the dark years.}
\item Alan Ruttenberg \texttt{Thanks for JSS.}
162
  \item piso
163 164 165
\item and of course
\emph{Peter Graves}
\end{itemize}
166

167

168
\chapter{Running ABCL}
169

170

171
\textsc{ABCL} is packaged as a single jar file usually named either
172
\texttt{abcl.jar} or possibly something like \texttt{abcl-1.4.0.jar} if
173 174
using a versioned package on the local filesystem from your system
vendor.  This jar file can be executed from the command line to obtain a
175 176 177
\textsc{REPL}\footnote{Read-Eval Print Loop, a Lisp command-line}, viz:

\index{REPL}
178 179

\begin{listing-shell}
180
  cmd$ java -jar abcl.jar
181
\end{listing-shell} %$ unconfuse Emacs syntax highlighting
182

183 184
\emph{N.b.} for the proceeding command to work, the \texttt{java}
executable needs to be in your path.
185

186 187 188 189 190
To facilitate the use of ABCL in tool chains such as SLIME~\cite{slime}
(the Superior Lisp Interaction Mode for Emacs), we provide both a Bourne
shell script and a \textsc{DOS} batch file.  If you or your
administrator adjusted the path properly, ABCL may be executed simply
as:
191 192

\begin{listing-shell}
193
  cmd$ abcl
194 195 196
\end{listing-shell}%$

Probably the easiest way of setting up an editing environment using the
197
\textsc{Emacs} editor is to use \textsc{Quicklisp} and follow the instructions at
198
\url{http://www.quicklisp.org/beta/#slime}.
199 200 201

\section{Options}

202
ABCL supports the following command line options:
203

204 205
\index{Command Line Options}

206
\begin{description}
207 208 209 210 211 212 213 214 215
\item[\texttt{  --help}] displays a help message.
\item[\texttt{  --noinform}] Suppresses the printing of startup information and banner.
\item[\texttt{  --noinit}] suppresses the loading of the \verb+~/.abclrc+ startup file.
\item[\texttt{  --nosystem}] suppresses loading the \texttt{system.lisp} customization file. 
\item[\texttt{  --eval FORM}] evaluates FORM before initializing the REPL.
\item[\texttt{  --load FILE}] loads the file FILE before initializing the REPL.
\item[\texttt{  --load-system-file FILE}] loads the system file FILE before initializing the REPL.
\item[\texttt{  --batch}] evaluates forms specified by arguments and in
  the initialization file \verb+~/.abclrc+, and then exits without
216
  starting a \textsc{REPL}.
217 218 219 220 221
\end{description}

All of the command line arguments following the occurrence of \verb+--+
are passed unprocessed into a list of strings accessible via the
variable \code{EXT:*COMMAND-LINE-ARGUMENT-LIST*} from within ABCL.
222 223 224

\section{Initialization}

225 226 227
If the \textsc{ABCL} process is started without the \code{--noinit}
flag, it attempts to load a file named \code{.abclrc} in the user's home
directory and then interpret its contents.
228 229

The user's home directory is determined by the value of the JVM system
230 231 232 233
property \texttt{user.home}.  This value may or may not correspond
to the value of the \texttt{HOME} system environment variable, at the
discretion of the JVM implementation that \textsc{ABCL} finds itself
hosted upon.
234

235
\chapter{Interaction with the Hosting JVM}
236

237 238
%  Plan of Attack
%
239 240 241 242 243
% describe calling Java from Lisp, and calling Lisp from Java,
% probably in two separate sections.  Presumably, we can partition our
% audience into those who are more comfortable with Java, and those
% that are more comforable with Lisp

244 245 246 247
The Armed Bear Common Lisp implementation is hosted on a Java Virtual
Machine.  This chapter describes the mechanisms by which the
implementation interacts with that hosting mechanism.

248
\section{Lisp to Java}
249
\label{sec:lisp-java}
250

251 252 253 254 255
\textsc{ABCL} offers a number of mechanisms to interact with Java from its
Lisp environment. It allows calling both instance and static methods
of Java objects, manipulation of instance and static fields on Java
objects, and construction of new Java objects.

256 257 258 259 260 261 262 263 264 265 266 267 268
When calling Java routines, some values will automatically be
converted by the FFI\footnote{Foreign Function Interface, is the term
  of art for the part of a Lisp implementation which implements
  calling code written in other languages, typically normalized to the
  local C compiler calling conventions.}  from Lisp values to Java
values. These conversions typically apply to strings, integers and
floats. Other values need to be converted to their Java equivalents by
the programmer before calling the Java object method. Java values
returned to Lisp are also generally converted back to their Lisp
counterparts. Some operators make an exception to this rule and do not
perform any conversion; those are the ``raw'' counterparts of certain
FFI functions and are recognizable by their name ending with
\code{-RAW}.
269

270
\subsection{Low-level Java API}
271

272
This subsection covers the low-level API available after evaluating
273
\code{(require :java)}.  A higher level Java API, developed by Alan
274 275 276
Ruttenberg, is available in the \code{contrib/} directory and described
later in this document, see Section~\ref{section:jss} on page
\pageref{section:jss}.
277

278
\subsubsection{Calling Java Object Methods}
279

280
There are two ways to call a Java object method in the low-level (basic) API:
281 282

\begin{itemize}
283
\item Call a specific method reference (which was previously acquired)
284 285 286
\item Dynamic dispatch using the method name and the call-specific
  arguments provided by finding the best match (see
  Section~\ref{sec:param-matching-for-ffi}).
287 288
\end{itemize}

289 290 291 292 293
\code{JAVA:JMETHOD} is used to acquire a specific method reference.  The
function takes two or more arguments. The first is a Java class
designator (a \code{JAVA:JAVA-CLASS} object returned by
\code{JAVA:JCLASS} or a string naming a Java class). The second is a
string naming the method.
294

295 296 297
Any arguments beyond the first two should be strings naming Java
classes, with one exception as listed in the next paragraph. These
classes specify the types of the arguments for the method.
298

299 300 301
When \code{JAVA:JMETHOD} is called with three parameters and the last
parameter is an integer, the first method by that name and matching
number of parameters is returned.
302

303
Once a method reference has been acquired, it can be invoked using
304 305 306 307
\code{JAVA:JCALL}, which takes the method as the first argument. The
second argument is the object instance to call the method on, or
\code{NIL} in case of a static method.  Any remaining parameters are
used as the remaining arguments for the call.
308 309 310 311 312 313 314 315 316 317

\subsubsection{Calling Java object methods: dynamic dispatch}

The second way of calling Java object methods is by using dynamic dispatch.
In this case \code{JAVA:JCALL} is used directly without acquiring a method
reference first. In this case, the first argument provided to \code{JAVA:JCALL}
is a string naming the method to be called. The second argument is the instance
on which the method should be called and any further arguments are used to
select the best matching method and dispatch the call.

318
\subsubsection{Dynamic dispatch: Caveats}
319

320 321 322 323 324 325
Dynamic dispatch is performed by using the Java reflection
API \footnote{The Java reflection API is found in the
  \code{java.lang.reflect} package}. Generally the dispatch works
fine, but there are corner cases where the API does not correctly
reflect all the details involved in calling a Java method. An example
is the following Java code:
326 327 328 329 330 331 332 333

\begin{listing-java}
ZipFile jar = new ZipFile("/path/to/some.jar");
Object els = jar.entries();
Method method = els.getClass().getMethod("hasMoreElements");
method.invoke(els);
\end{listing-java}

334 335
Even though the method \code{hasMoreElements()} is public in
\code{Enumeration}, the above code fails with
336 337 338

\begin{listing-java}
java.lang.IllegalAccessException: Class ... can
339
not access a member of class java.util.zip.ZipFile\$2 with modifiers
340 341 342 343 344 345
"public"
       at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:65)
       at java.lang.reflect.Method.invoke(Method.java:583)
       at ...
\end{listing-java}

346 347
This is because the method has been overridden by a non-public class and
the reflection API, unlike \texttt{javac}, is not able to handle such a case.
348 349 350 351 352 353 354 355 356 357 358 359

While code like that is uncommon in Java, it is typical of ABCL's FFI
calls. The code above corresponds to the following Lisp code:

\begin{listing-lisp}
(let ((jar (jnew "java.util.zip.ZipFile" "/path/to/some.jar")))
  (let ((els (jcall "entries" jar)))
    (jcall "hasMoreElements" els)))
\end{listing-lisp}

except that the dynamic dispatch part is not shown.

360
To avoid such pitfalls, all Java objects in \textsc{ABCL} carry an extra
361 362 363 364 365 366 367 368 369
field representing the ``intended class'' of the object. That class is
used first by \code{JAVA:JCALL} and similar to resolve methods; the
actual class of the object is only tried if the method is not found in
the intended class. Of course, the intended class is always a
super-class of the actual class -- in the worst case, they coincide. The
intended class is deduced by the return type of the method that
originally returned the Java object; in the case above, the intended
class of \code{ELS} is \code{java.util.Enumeration} because that is the
return type of the \code{entries} method.
370 371 372 373 374 375 376

While this strategy is generally effective, there are cases where the
intended class becomes too broad to be useful. The typical example
is the extraction of an element from a collection, since methods in
the collection API erase all types to \code{Object}. The user can
always force a more specific intended class by using the \code{JAVA:JCOERCE}
operator.
377 378 379 380 381 382 383 384 385 386 387 388 389 390 391

% \begin{itemize}
% \item Java values are accessible as objects of type JAVA:JAVA-OBJECT.
% \item The Java FFI presents a Lisp package (JAVA) with many useful
%   symbols for manipulating the artifacts of expectation on the JVM,
%   including creation of new objects \ref{JAVA:JNEW}, \ref{JAVA:JMETHOD}), the
%   introspection of values \ref{JAVA:JFIELD}, the execution of methods
%   (\ref{JAVA:JCALL}, \ref{JAVA:JCALL-RAW}, \ref{JAVA:JSTATIC})
% \item The JSS package (\ref{JSS}) in contrib introduces a convenient macro
%   syntax \ref{JSS:SHARPSIGN_DOUBLEQUOTE_MACRO} for accessing Java
%   methods, and additional convenience functions.
% \item Java classes and libraries may be dynamically added to the
%   classpath at runtime (JAVA:ADD-TO-CLASSPATH).
% \end{itemize}

392 393
\subsubsection{Calling Java class static methods}

394 395 396
Like non-static methods, references to static methods can be acquired by
using the \code{JAVA:JMETHOD} primitive. Static methods are called with
\code{JAVA:JSTATIC} instead of \code{JAVA:JCALL}.
397 398 399 400 401 402

Like \code{JAVA:JCALL}, \code{JAVA:JSTATIC} supports dynamic dispatch by
passing the name of the method as a string instead of passing a method reference.
The parameter values should be values to pass in the function call instead of
a specification of classes for each parameter.

403
\subsubsection{Parameter matching for FFI dynamic dispatch}
404
\label{sec:param-matching-for-ffi}
405

406 407
The algorithm used to resolve the best matching method given the name
and the arguments' types is the same as described in the Java Language
408
Specification. Any deviation should be reported as a bug.
409

410
% ###TODO reference to correct JLS section
411

412 413 414
\subsubsection{Instantiating Java objects}

Java objects can be instantiated (created) from Lisp by calling
415 416
a constructor from the class of the object to be created. The
\code{JAVA:JCONSTRUCTOR} primitive is used to acquire a constructor
417 418 419
reference. It's arguments specify the types of arguments of the constructor
method the same way as with \code{JAVA:JMETHOD}.

420 421 422
The obtained constructor is passed as an argument to \code{JAVA:JNEW},
together with any arguments.  \code{JAVA:JNEW} can also be invoked with
a string naming the class as its first argument.
423

424
\subsubsection{Accessing Java object and class fields}
425

426 427 428 429
Fields in Java objects can be accessed using the getter and setter
functions \code{JAVA:JFIELD} and \code{(SETF JAVA:JFIELD)}.  Static
(class) fields are accessed the same way, but with a class object or
string naming a class as first argument.
430 431

Like \code{JAVA:JCALL} and friends, values returned from these accessors carry
432
an intended class around, and values which can be converted to Lisp values will
433 434
be converted.

435
\section{Java to Lisp}
436

437 438 439
This section describes the various ways that one interacts with Lisp
from Java code.  In order to access the Lisp world from Java, one needs
to be aware of a few things, the most important ones being listed below:
440 441

\begin{itemize}
442 443 444 445
\item All Lisp values are descendants of \code{LispObject}.
\item Lisp symbols are accessible either via static members of the
  \code{Symbol} class, or by dynamically introspecting a \code{Package}
  object.
446
\item The Lisp dynamic environment may be saved via
447 448
  \code{LispThread.bindSpecial(Binding)} and restored via
  \code{LispThread.resetSpecialBindings(Mark)}.
449 450
\item Functions can be executed by invoking \code{LispObject.execute(args
    [...])}
451 452
\end{itemize}

453
\subsection{Calling Lisp from Java}
454
\label{sec:calling-lisp-from-java}
455

456 457 458 459
Note: the entire ABCL Lisp system resides in the
\texttt{org.armedbear.lisp} package, but the following code snippets do
not show the relevant import statements in the interest of brevity.  An
example of the import statement would be
460
\begin{listing-java}
461
  import org.armedbear.lisp.*;
462
\end{listing-java}
463 464
to potentially import all the JVM symbol from the `org.armedbear.lisp'
namespace.
465

466 467 468
There can only ever be a single Lisp interpreter per JVM instance.  A
reference to this interpreter is obtained by calling the static method
\code{Interpreter.createInstance()}.
469

470
\begin{listing-java}
471
  Interpreter interpreter = Interpreter.createInstance();
472
\end{listing-java}
473 474

If this method has already been invoked in the lifetime of the current
475 476 477
Java process it will return \texttt{null}, so if you are writing Java
whose life-cycle is a bit out of your control (like in a Java servlet),
a safer invocation pattern might be:
478

479
\begin{listing-java}
480 481 482 483
  Interpreter interpreter = Interpreter.getInstance();
  if (interpreter == null) {
    interpreter = Interpreter.createInstance();
  }
484 485
\end{listing-java}

486

487
The Lisp \code{eval} primitive may simply be passed strings for evaluation:
488

489
\begin{listing-java}
490 491
  String line = "(load \"file.lisp\")";
  LispObject result = interpreter.eval(line);
492
\end{listing-java}
493 494 495

Notice that all possible return values from an arbitrary Lisp
computation are collapsed into a single return value.  Doing useful
496 497
further computation on the \code{LispObject} depends on knowing what the
result of the computation might be.  This usually involves some amount
498
of \code{instanceof} introspection, and forms a whole topic to itself
499 500
(see Section~\ref{topic:Introspecting a LispObject},
page~\pageref{topic:Introspecting a LispObject}).
501

502
Using \code{eval} involves the Lisp interpreter.  Lisp functions may
503 504 505 506
also be directly invoked by Java method calls as follows.  One simply
locates the package containing the symbol, obtains a reference to the
symbol, and then invokes the \code{execute()} method with the desired
parameters.
507

508
\begin{listing-java}
509 510 511 512 513 514 515 516 517
  interpreter.eval("(defun foo (msg)" +
    "(format nil \"You told me '~A'~%\" msg))");
  Package pkg = Packages.findPackage("CL-USER");
  Symbol foo = pkg.findAccessibleSymbol("FOO"); 
  Function fooFunction = (Function)foo.getSymbolFunction();
  JavaObject parameter = new JavaObject("Lisp is fun!");
  LispObject result = fooFunction.execute(parameter);
  // How to get the "naked string value"?
  System.out.println("The result was " + result.writeToString()); 
518
\end{listing-java}
519

520 521 522 523 524
If one is calling a function in the CL package, the syntax can become
considerably simpler.  If we can locate the instance of definition in
the ABCL Java source, we can invoke the symbol directly.  For instance,
to tell if a \code{LispObject} is (Lisp) \texttt{NIL}, we can invoke the
CL function \code{NULL} in the following way:
525

526
\begin{listing-java}
527 528 529 530 531 532 533 534 535 536 537
  boolean nullp(LispObject object) {
    LispObject result = Primitives.NULL.execute(object);
    if (result == NIL) { // the symbol 'NIL' is explicitly named in the Java
                         // namespace at ``Symbol.NIL''
                         // but is always present in the
                         // local namespace in its unadorned form for
                         // the convenience of the User.
      return false;
    }
    return true;
 }
538
\end{listing-java}
539

540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563
\subsubsection{Multiple Values}

After a call to a function that returns Lisp multiple values, the
values are associated with the executing \code{LispThread} until the
next call into Lisp.  One may access the values object as a list of
\code{LispObject} instances via a call to \code{getValues()} on that
thread reference
as evidenced by the following code:

\begin{listing-java}

  org.armedbear.lisp.Package cl = Packages.findPackage("CL");
  Symbol valuesSymbol = cl.findAccessibleSymbol("VALUES");
  LispObject[] valuesArgs = {
    LispInteger.getInstance(1), LispInteger.getInstance(2)
  };
  // equivalent to ``(values 1 2)''
  LispObject result = valuesSymbol.execute(valuesArgs); 
  LispObject[] values = LispThread.currentThread().getValues();
  for (LispObject value: values) {
    System.out.println("value ==> " + value.printObject());
  }
\end{listing-java}

564
\subsubsection{Introspecting a LispObject}
565
\label{topic:Introspecting a LispObject}
566

567 568
We present various patterns for introspecting an arbitrary
\code{LispObject} which can hold the result of every Lisp evaluation
569
into semantics that Java can meaningfully deal with.
570

571
\paragraph{LispObject as \code{boolean}}
572

573 574
If the \code{LispObject} is to be interpreted as a generalized boolean
value, one can use \code{getBooleanValue()} to convert to Java:
575

576
\begin{listing-java}
577 578
   LispObject object = Symbol.NIL;
   boolean javaValue = object.getBooleanValue();
579
\end{listing-java}
580

581 582 583
Since in Lisp any value other than \code{NIL} means "true", Java
equality can also be used, which is a bit easier to type and better in
terms of information it conveys to the compiler:
584

585
\begin{listing-java}
586
    boolean javaValue = (object != Symbol.NIL);
587
\end{listing-java}
588

589
\paragraph{LispObject as a list}
590

591 592 593
If \code{LispObject} is a list, it will have the type \code{Cons}.  One
can then use the \code{copyToArray} method to make things a bit more
suitable for Java iteration.
594

595
\begin{listing-java}
596 597 598 599 600
  LispObject result = interpreter.eval("'(1 2 4 5)");
  if (result instanceof Cons) {
    LispObject array[] = ((Cons)result.copyToArray());
    ...
  }
601
\end{listing-java}
602

603
A more Lispy way to iterate down a list is to use the `cdr()` access
604 605
function just as like one would traverse a list in Lisp:;

606
\begin{listing-java}
607 608 609 610 611
  LispObject result = interpreter.eval("'(1 2 4 5)");
  while (result != Symbol.NIL) {
    doSomething(result.car());
    result = result.cdr();
  }
612
\end{listing-java}
613

614 615
\section{Java Scripting API (JSR-223)}
\label{sec:java-scripting-api}
616

617 618 619 620 621 622 623
ABCL can be built with support for JSR-223~\cite{jsr-223}, which offers
a language-agnostic API to invoke other languages from Java. The binary
distribution download-able from ABCL's homepage is built with JSR-223
support. If you're building ABCL from source on a pre-1.6 JVM, you need
to have a JSR-223 implementation in your classpath (such as Apache
Commons BSF 3.x or greater) in order to build ABCL with JSR-223 support;
otherwise, this feature will not be built.
624

625 626 627
This section describes the design decisions behind the ABCL JSR-223
support. It is not a description of what JSR-223 is or a tutorial on
how to use it. See
628
\url{http://abcl.org/trac/browser/trunk/abcl/examples/jsr-223}
629
for example usage.
630

631
\subsection{Conversions}
632

633 634 635 636 637
In general, ABCL's implementation of the JSR-223 API performs implicit
conversion from Java objects to Lisp objects when invoking Lisp from
Java, and the opposite when returning values from Java to Lisp. This
potentially reduces coupling between user code and ABCL. To avoid such
conversions, wrap the relevant objects in \code{JavaObject} instances.
638

639
\subsection{Implemented JSR-223 interfaces}
640

641 642 643 644 645 646 647 648 649
JSR-223 defines three main interfaces, of which two (\code{Invocable}
and \code{Compilable}) are optional. ABCL implements all the three
interfaces - \code{ScriptEngine} and the two optional ones - almost
completely. While the JSR-223 API is not specific to a single scripting
language, it was designed with languages with a more or less Java-like
object model in mind: languages such as Javascript, Python, Ruby, which
have a concept of "class" or "object" with "fields" and "methods". Lisp
is a bit different, so certain adaptations were made, and in one case a
method has been left unimplemented since it does not map at all to Lisp.
650 651 652

\subsubsection{The ScriptEngine}

653 654 655
The main interface defined by JSR-223, \code{javax.script.ScriptEngine},
is implemented by the class
\code{org.armedbear.lisp.scripting.AbclScriptEngine}. \code{AbclScriptEngine}
656
is a singleton, reflecting the fact that ABCL is a singleton as
657 658 659 660
well. You can obtain an instance of \code{AbclScriptEngine} using the
\code{AbclScriptEngineFactory} or by using the service provider
mechanism through \code{ScriptEngineManager} (refer to the
\texttt{javax.script} documentation).
661

662
\subsection{Start-up and configuration file}
663

664
At start-up (i.e. when its constructor is invoked, as part of the
665
static initialization phase of \code{AbclScriptEngineFactory}) the ABCL
666
script engine attempts to load an "init file" from the classpath
667
(\texttt{/abcl-script-config.lisp}). If present, this file can be used to
668
customize the behavior of the engine, by setting a number of
669
variables in the \code{ABCL-SCRIPT} package. Here is a list of the available
670
variables:
671

672 673
\begin{description}
\item[\texttt{*use-throwing-debugger*}] controls whether ABCL uses a
674 675 676
  non-standard debugging hook function to throw a Java exception
  instead of dropping into the debugger in case of unhandled error
  conditions.
677
  \begin{itemize}
678
  \item Default value: \texttt{T}
679 680 681 682 683 684
  \item Rationale: it is more convenient for Java programmers using
    Lisp as a scripting language to have it return exceptions to Java
    instead of handling them in the Lisp world.
  \item Known Issues: the non-standard debugger hook has been reported
    to misbehave in certain circumstances, so consider disabling it if
    it doesn't work for you.
685
  \end{itemize}
686 687
\item[\texttt{*launch-swank-at-startup*}] If true, Swank will be launched at
  startup. See \texttt{*swank-dir*} and \texttt{*swank-port*}.
688
  \begin{itemize}
689
  \item Default value: \texttt{NIL}
690
  \end{itemize}
691 692 693 694 695
\item[\texttt{*swank-dir*}] The directory where Swank is installed. Must be set
  if \texttt{*launch-swank-at-startup*} is true.
\item[\texttt{*swank-port*}] The port where Swank will listen for
  connections. Must be set if \texttt{*launch-swank-at-startup*} is
  true.
696 697 698
  \begin{itemize}
  \item Default value: 4005
  \end{itemize}
699
\end{description}
700

701 702
Additionally, at startup the AbclScriptEngine will \code{(require
  'asdf)} - in fact, it uses asdf to load Swank.
703

704
\subsection{Evaluation}
705

706 707 708 709 710 711 712 713
Code is read and evaluated in the package \code{ABCL-SCRIPT-USER}. This
packages \texttt{USE}s the \code{COMMON-LISP}, \code{JAVA} and
\code{ABCL-SCRIPT} packages. Future versions of the script engine might
make this default package configurable. The \code{CL:LOAD} function is
used under the hood for evaluating code, and thus the behavior of
\code{LOAD} is guaranteed. This allows, among other things,
\code{IN-PACKAGE} forms to change the package in which the loaded code
is read.
714 715

It is possible to evaluate code in what JSR-223 calls a
716
``ScriptContext'' (basically a flat environment of name$\rightarrow$value
717 718
pairs). This context is used to establish special bindings for all the
variables defined in it; since variable names are strings from Java's
719 720
point of view, they are first interned using \code{READ-FROM-STRING} with, as
usual, \code{ABCL-SCRIPT-USER} as the default package. Variables are declared
721 722 723 724 725 726 727
special because CL's \code{LOAD}, \code{EVAL} and \code{COMPILE}
functions work in a null lexical environment and would ignore
non-special bindings.

Contrary to what the function \code{LOAD} does, evaluation of a series
of forms returns the value of the last form instead of T, so the
evaluation of short scripts does the Right Thing.
728

729
\subsection{Compilation}
730

731
AbclScriptEngine implements the \code{javax.script.Compilable}
732 733
interface. Currently it only supports compilation using temporary
files. Compiled code, returned as an instance of
734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751
\texttt{javax.script.CompiledScript}, is read, compiled and executed by
default in the \texttt{ABCL-SCRIPT-USER} package, just like evaluated
code.  In contrast to evaluated code, though, due to the way the ABCL
compiler works, compiled code contains no reference to top-level
self-evaluating objects (like numbers or strings). Thus, when evaluated,
a piece of compiled code will return the value of the last
non-self-evaluating form: for example the code ``\code{(do-something)
  42}'' will return 42 when interpreted, but will return the result of
(do-something) when compiled and later evaluated. To ensure consistency
of behavior between interpreted and compiled code, make sure the last
form is always a compound form - at least \code{(identity
some-literal-object)}. Note that this issue should not matter in real
code, where it is unlikely a top-level self-evaluating form will appear
as the last form in a file (in fact, the Common Lisp load function
always returns \texttt{T} upon success; with JSR-223 this policy has been changed
to make evaluation of small code snippets work as intended).

\subsection{Invocation of functions and methods}
752

753 754 755 756 757 758 759
AbclScriptEngine implements the \code{javax.script.Invocable}
interface, which allows to directly call Lisp functions and methods,
and to obtain Lisp implementations of Java interfaces. This is only
partially possible with Lisp since it has functions, but not methods -
not in the traditional OO sense, at least, since Lisp methods are not
attached to objects but belong to generic functions. Thus, the method
\code{invokeMethod()} is not implemented and throws an
760
\texttt{UnsupportedOperationException} when called. The \code{invokeFunction()}
761
method should be used to call both regular and generic functions.
762

763
\subsection{Implementation of Java interfaces in Lisp}
764

765 766 767 768 769
ABCL can use the Java reflection-based proxy feature to implement Java
interfaces in Lisp. It has several built-in ways to implement an
interface, and supports definition of new ones. The
\code{JAVA:JMAKE-PROXY} generic function is used to make such
proxies. It has the following signature:
770 771 772

\code{jmake-proxy interface implementation \&optional lisp-this ==> proxy}

773 774 775 776 777 778 779
\code{interface} is a Java interface metaobject (e.g. obtained by
invoking \code{jclass}) or a string naming a Java
interface. \code{implementation} is the object used to implement the
interface - several built-in methods of jmake-proxy exist for various
types of implementations. \code{lisp-this} is an object passed to the
closures implementing the Lisp "methods" of the interface, and
defaults to \code{NIL}.
780

781 782
The returned proxy is an instance of the interface, with methods
implemented with Lisp functions.
783 784 785 786

Built-in interface-implementation types include:

\begin{itemize}
787 788 789 790
\item a single Lisp function which upon invocation of any method in
  the interface will be passed the method name, the Lisp-this object,
  and all the parameters. Useful for interfaces with a single method,
  or to implement custom interface-implementation strategies.
791
\item a hash-map of method-name $\rightarrow$ Lisp function mappings. Function
792 793 794 795 796 797
  signature is \code{(lisp-this \&rest args)}.
\item a Lisp package. The name of the Java method to invoke is first
  transformed in an idiomatic Lisp name (\code{javaMethodName} becomes
  \code{JAVA-METHOD-NAME}) and a symbol with that name is searched in
  the package. If it exists and is fbound, the corresponding function
  will be called. Function signature is as the hash-table case.
798 799
\end{itemize}

800 801 802 803 804 805
This functionality is exposed by the class \code{AbclScriptEngine} via
the two methods \code{getInterface(Class)} and
\code{getInterface(Object, Class)}. The former returns an interface
implemented with the current Lisp package, the latter allows the
programmer to pass an interface-implementation object which will in turn
be passed to the \code{jmake-proxy} generic function.
806

807 808 809 810 811
\subsection{Implementation of Java classes in Lisp}

See \code{JAVA:JNEW-RUNTIME-CLASS} on \ref{JAVA:JNEW-RUNTIME-CLASS}.


812
\chapter{Implementation Dependent Extensions}
813

814 815 816 817 818 819 820 821 822
As outlined by the CLHS ANSI conformance guidelines, we document the
extensions to the Armed Bear Lisp implementation made accessible to
the user by virtue of being an exported symbol in the JAVA, THREADS,
or EXTENSIONS packages.

\section{JAVA}

\subsection{Modifying the JVM CLASSPATH}

823
The \code{JAVA:ADD-TO-CLASSPATH} generic functions allows one to add the
824
specified pathname or list of pathnames to the current classpath
825
used by ABCL, allowing the dynamic loading of \textsc{JVM} objects:
826 827 828

\begin{listing-lisp}
CL-USER> (add-to-classpath "/path/to/some.jar")
829
\end{listing-lisp}
830

831
N.b \code{ADD-TO-CLASSPATH} only affects the classloader used by \textsc{ABCL}
832
(the value of the special variable \code{JAVA:*CLASSLOADER*}. It has
833
no effect on \textsc{Java} code outside \textsc{ABCL}.
834

835 836 837 838
\subsection{Creating a synthetic Java Class at Runtime}

See \code{JAVA:JNEW-RUNTIME-CLASS} on \ref{JAVA:JNEW-RUNTIME-CLASS}.

839
% include autogen docs for the JAVA package.
840
\include{java}
841

842 843
\section{THREADS}

844 845 846
The extensions for handling multithreaded execution are collected in
the \code{THREADS} package.  Most of the abstractions in Doug Lea's
excellent \code{java.util.concurrent} packages may be manipulated
847
directly via the JSS contrib to great effect \cite{lea-1998}
848

849
% include autogen docs for the THREADS package.
850
\include{threads}
851

852
\section{EXTENSIONS}
853

854
The symbols in the EXTENSIONS package (nicknamed ``EXT'') constitutes
855
extensions to the \textsc{ANSI} standard that are potentially useful to the
856 857 858
user.  They include functions for manipulating network sockets,
running external programs, registering object finalizers, constructing
reference weakly held by the garbage collector and others.
859

860
See \cite{RHODES2007} for a generic function interface to the native
861
\textsc{JVM} contract for \code{java.util.List}.
862

863
% include autogen docs for the EXTENSIONS package.
864
\include{extensions}
865

866
\chapter{Beyond ANSI}
867 868 869 870

Naturally, in striving to be a useful contemporary Common Lisp
implementation, ABCL endeavors to include extensions beyond the ANSI
specification which are either widely adopted or are especially useful
871
in working with the hosting \textsc{JVM}.
872

873 874 875 876 877 878
\section{Compiler to Java 5 Bytecode}

The \code{CL:COMPILE-FILE} interface emits a packed fasl format whose
Pathname has the type  ``abcl''.  These fasls are operating system neutral
byte archives packaged by the zip compression format which contain
artifacts whose loading \code{CL:LOAD} understands.
879 880 881

\section{Pathname}

882 883
We implement an extension to the \code{CL:PATHNAME} that allows for
the description and retrieval of resources named in a
884
\textsc{URI} \footnote{A \textsc{URI} is essentially a superset of
885
  what is commonly understood as a \textsc{URL} We sometime suse the
886 887 888
  term URL as shorthand in describing the URL Pathnames, even though
  the corresponding encoding is more akin to a URI as described in
  RFC3986 \cite{rfc3986}.}  scheme that the \textsc{JVM}
889 890 891
``understands''.  By definition, support is built-in into the JVM to
access the ``http'' and ``https'' schemes but additional protocol
handlers may be installed at runtime by having \textsc{JVM} symbols
892 893
present in the \code{sun.net.protocol.dynamic} package. See
\cite{maso2000} for more details.
894 895 896 897

\textsc{ABCL} has created specializations of the ANSI
\code{CL:PATHNAME} object to enable to use of \textsc{URI}s to address
dynamically loaded resources for the JVM.  The \code{EXT:URL-PATHNAME}
898
specialization has a corresponding \textsc{URI} whose canonical
899
representation is defined to be the \code{NAMESTRING} of the
900
\code{CL:PATHNAME}. The \code{EXT:JAR-PATHNAME} extension further
901 902
specializes the the \code{EXT:URL-PATHNAME} to provide access to
components of zip archives.  
903 904

% RDF description of type hierarchy 
905
% TODO Render via some LaTeX mode for graphviz?
906 907
\begin{verbatim}
  @prefix ext:   <http://abcl.not.org/cl-packages/extensions/> .
908
  @prefix cl:    <http://abcl.not.org/cl-packages/common-lisp/> .
909 910 911
  
  <ext:jar-pathname> a <ext:url-pathname>.
  <ext:url-pathname> a <cl:pathname>.
912
  <cl:logical-pathname> a <cl:pathname> .
913 914
\end{verbatim}

915 916 917 918 919 920
\label{EXTENSIONS:URL-PATHNAME}
\index{URL-PATHNAME}

\label{EXTENSIONS:JAR-PATHNAME}
\index{JAR-PATHNAME}

921 922 923
Both the \code{EXT:URL-PATHNAME} and \code{EXT:JAR-PATHNAME} objects
may be used anywhere a \code{CL:PATHNAME} is accepted with the
following caveats:
924

925
\begin{itemize}
926

927 928
\item A stream obtained via \code{CL:OPEN} on a \code{CL:URL-PATHNAME}
  cannot be the target of write operations.
929

930
\index{URI}
931
\item Any results of canonicalization procedures performed on the
932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947
  \textsc{URI} via local or network resolutions are discarded between
  attempts (i.e. the implementation does not attempt to cache the
  results of current name resolution of the URI for underlying
  resource unless it is requested to be resolved.)  Upon resolution,
  any canonicalization procedures followed in resolving the resource
  (e.g. following redirects) are discarded.  Users may programatically
  initiate a new, local computation of the resolution of the resource
  by applying the \code{CL:TRUENAME} function to a
  \code{EXT:URL-PATHNAME} object.  Depending on the reliability and
  properties of your local \textsc{REST} infrastructure, these results
  may not necessarily be idempotent over time\footnote {See
    \cite{uri-pathname} for the design and implementation notes for
    the technical details}.  A future implementation may attempt to
  expose an API to observer/customize the content negotiation
  initiated during retrieval of the representation of a given
  resource, which is currently handled at the application level.
948

949 950
\end{itemize}

951
The implementation of \code{EXT:URL-PATHNAME} allows the \textsc{ABCL}
952
user to dynamically load code from the network.  For example,
953 954
\textsc{Quicklisp} (\cite{quicklisp}) may be completely installed from
the \textsc{REPL} as the single form:
955 956

\begin{listing-lisp}
957
  CL-USER> (load "http://beta.quicklisp.org/quicklisp.lisp")
958 959
\end{listing-lisp}

960
will load and execute the Quicklisp setup code.
961

962
The implementation currently breaks \textsc{ANSI} conformance by allowing the
963
types able to be \code{CL:READ} for the \code{DEVICE} to return a possible \code{CONS} of
964
\code{CL:PATHNAME} objects.  %% citation from CLHS needed.
965

966 967 968 969
In order to ``smooth over'' the bit about types being \code{CL:READ}
from \code{CL:PATHNAME} components, we extend the semantics for the
usual PATHNAME merge semantics when \code{*DEFAULT-PATHNAME-DEFAULTS*}
contains a \code{EXT:JAR-PATHNAME} with the ``do what I mean''
970
algorithm described in \ref{section:conformance} on page
971
\pageref{section:conformance}.
972

973
%See \ref{_:quicklisp} on page \pageref{_:quicklisp}.
974 975 976

\subsubsection{Implementation}

977
The implementation of these extensions stores all the additional
978
information in the \code{CL:PATHNAME} object itself in ways that while strictly
979 980 981 982 983
speaking are conformant, nonetheless may trip up libraries that don't
expect the following:

\begin{itemize}
\item \code{DEVICE} can be either a string denoting a drive letter
984 985 986 987 988
  under \textsc{DOS} or a list of exactly one or two elements.  If
  \code{DEVICE} is a list, it denotes a \code{EXT:JAR-PATHNAME}, with
  the entries containing \code{CL:PATHNAME} objects which describe the
  outer and (possibly inner) locations of the jar
  archive \footnote{The case of inner and outer
989 990 991
    \code{EXT:JAR-PATHNAME} \ref{EXT:JAR-PATHNAME} arises when zip
    archives themselves contain zip archives which is the case when
    the ABCL fasl is included in the abcl.jar zip archive.}.
992 993

\item A \code{EXT:URL-PATHNAME} always has a \code{HOST} component that is a
994 995 996 997 998 999 1000 1001 1002 1003 1004
  property list.  The values of the \code{HOST} property list are
  always character strings.  The allowed keys have the following meanings:
  \begin{description}
  \item[:SCHEME] Scheme of URI ("http", "ftp", "bundle", etc.)
  \item[:AUTHORITY] Valid authority according to the URI scheme.  For
    "http" this could be "example.org:8080". 
  \item[:QUERY] The query of the \textsc{URI} 
  \item[:FRAGMENT] The fragment portion of the \textsc{URI}
  \end{description}

\item In order to encapsulate the implementation decisions for these
1005
  meanings, the following functions provide a SETF-able API for
1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028
  reading and writing such values: \code{URL-PATHNAME-QUERY},
  \code{URL-PATHNAME-FRAGMENT}, \code{URL-PATHNAME-AUTHORITY}, and
  \code{URL-PATHNAME-SCHEME}.  The specific subtype of a Pathname may
  be determined with the predicates \code{PATHNAME-URL-P} and
  \code{PATHNAME-JAR-P}.

\label{EXTENSIONS:URL-PATHNAME-SCHEME}
\index{URL-PATHNAME-SCHEME}

\label{EXTENSIONS:URL-PATHNAME-FRAGMENT}
\index{URL-PATHNAME-FRAGMENT}

\label{EXTENSIONS:URL-PATHNAME-AUTHORITY}
\index{URL-PATHNAME-AUTHORITY}

\label{EXTENSIONS:PATHNAME-URL-P}
\index{PATHNAME-URL-P}

\label{EXTENSIONS:URL-PATHNAME-QUERY}
\index{URL-PATHNAME-QUERY}

\end{itemize}

1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069
\section{Package-Local Nicknames}
\label{sec:pack-local-nickn}

ABCL allows giving packages local nicknames: they allow short and
easy-to-use names to be used without fear of name conflict associated
with normal nicknames.\footnote{Package-local nicknames were originally
developed in SBCL.}

A local nickname is valid only when inside the package for which it
has been specified. Different packages can use same local nickname for
different global names, or different local nickname for same global
name.

Symbol \code{:package-local-nicknames} in \code{*features*} denotes the
support for this feature.

\index{DEFPACKAGE}
The options to \code{defpackage} are extended with a new option
\code{:local-nicknames (local-nickname actual-package-name)*}.

The new package has the specified local nicknames for the corresponding
actual packages.

Example:
\begin{listing-lisp}
(defpackage :bar (:intern "X"))
(defpackage :foo (:intern "X"))
(defpackage :quux (:use :cl)
  (:local-nicknames (:bar :foo) (:foo :bar)))
(find-symbol "X" :foo) ; => FOO::X
(find-symbol "X" :bar) ; => BAR::X
(let ((*package* (find-package :quux)))
  (find-symbol "X" :foo))               ; => BAR::X
(let ((*package* (find-package :quux)))
  (find-symbol "X" :bar))               ; => FOO::X
\end{listing-lisp}

\index{PACKAGE-LOCAL-NICKNAMES}
--- Function: \textbf{package-local-nicknames} [\textbf{ext}] \textit{package-designator}

\begin{adjustwidth}{5em}{5em}
1070
  Returns an ALIST of \code{(local-nickname . actual-package)}
1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127
  describing the nicknames local to the designated package.

  When in the designated package, calls to \code{find-package} with any
  of the local-nicknames will return the corresponding actual-package
  instead. This also affects all implied calls to \code{find-package},
  including those performed by the reader.

  When printing a package prefix for a symbol with a package local
  nickname, the local nickname is used instead of the real name in order
  to preserve print-read consistency.
\end{adjustwidth}

\index{PACKAGE-LOCALLY-NICKNAMED-BY-LIST}
--- Function: \textbf{package-locally-nicknamed-by-list} [\textbf{ext}] \textit{package-designator}

\begin{adjustwidth}{5em}{5em}
Returns a list of packages which have a local nickname for the
designated package.
\end{adjustwidth}

\index{ADD-PACKAGE-LOCAL-NICKNAME}
--- Function: \textbf{add-package-local-nickname} [\textbf{ext}] \textit{local-nickname actual-package \&optional package-designator}

\begin{adjustwidth}{5em}{5em}
  Adds \code{local-nickname} for \code{actual-package} in the designated
  package, defaulting to current package. \code{local-nickname} must be
  a string designator, and \code{actual-package} must be a package
  designator.

  Returns the designated package.

  Signals an error if \code{local-nickname} is already a package local
  nickname for a different package, or if \code{local-nickname} is one
  of "CL", "COMMON-LISP", or, "KEYWORD", or if \code{local-nickname} is
  a global name or nickname for the package to which the nickname would
  be added.

  When in the designated package, calls to \code{find-package} with the
  \code{local-nickname} will return the package the designated
  \code{actual-package} instead. This also affects all implied calls to
  \code{find-package}, including those performed by the reader.

  When printing a package prefix for a symbol with a package local
  nickname, local nickname is used instead of the real name in order to
  preserve print-read consistency.
\end{adjustwidth}

\index{REMOVE-PACKAGE-LOCAL-NICKNAME}
--- Function: \textbf{remove-package-local-nickname} [\textbf{ext}] \textit{old-nickname \&optional package-designator}

\begin{adjustwidth}{5em}{5em}
  If the designated package had \code{old-nickname} as a local nickname
  for another package, it is removed. Returns true if the nickname
  existed and was removed, and \code{nil} otherwise.
\end{adjustwidth}


1128 1129
         
\section{Extensible Sequences}
1130

1131
The SEQUENCE package fully implements Christopher Rhodes' proposal for
1132
extensible sequences.  These user extensible sequences are used
1133 1134
directly in \code{java-collections.lisp} provide these CLOS
abstractions on the standard Java collection classes as defined by the
1135
\code{java.util.List} contract.
1136

1137

1138 1139
%% an Example of using java.util.Lisp in Lisp would be nice

1140 1141 1142
This extension is not automatically loaded by the implementation.   It
may be loaded via:

1143
\begin{listing-lisp}
1144
CL-USER> (require :java-collections)
1145 1146 1147 1148 1149
\end{listing-lisp}

if both extensible sequences and their application to Java collections
is required, or

1150
\begin{listing-lisp}
1151
CL-USER> (require :extensible-sequences)
1152
\end{listing-lisp}
1153

1154
if only the extensible sequences API as specified in \cite{RHODES2007} is
1155 1156
required.

1157
Note that \code{(require :java-collections)} must be issued before
1158
\code{java.util.List} or any subclass is used as a specializer in a \textsc{CLOS}
1159 1160
method definition (see the section below).

1161 1162 1163 1164
See Rhodes2007 \cite{RHODES2007} for the an overview of the
abstractions of the \code{java.util.collection} package afforded by
\code{JAVA-COLLECTIONS}.

1165
\section{Extensions to CLOS}
1166

1167 1168
\subsection{Metaobject Protocol}

1169 1170 1171
\textsc{ABCL} implements the metaobject protocol for \textsc{CLOS} as
specified in \textsc{(A)MOP}.  The symbols are exported from the
package \code{MOP}.
1172

1173 1174 1175 1176 1177
Contrary to the AMOP specification and following \textsc{SBCL}'s lead,
the metaclass \code{funcallable-standard-object} has
\code{funcallable-standard-class} as metaclass instead of
\code{standard-class}.

1178 1179 1180
\textsc{ABCL}'s fidelity to the AMOP specification is codified as part
of Pascal Costanza's \code{closer-mop} \ref{closer-mop} \cite{closer-mop}.

1181 1182
\subsection{Specializing on Java classes}

1183
There is an additional syntax for specializing the parameter of a
1184 1185
generic function on a java class, viz. \code{(java:jclass CLASS-STRING)}
where \code{CLASS-STRING} is a string naming a Java class in dotted package
1186 1187 1188 1189 1190 1191
form.

For instance the following specialization would perhaps allow one to
print more information about the contents of a java.util.Collection
object

1192 1193 1194 1195 1196 1197
\begin{listing-lisp}
(defmethod print-object ((coll (java:jclass "java.util.Collection"))
                         stream)
  ;;; ...
)
\end{listing-lisp}
1198 1199 1200 1201 1202

If the class had been loaded via a classloader other than the original
the class you wish to specialize on, one needs to specify the
classloader as an optional third argument.

1203
\begin{listing-lisp}
1204

1205 1206 1207
(defparameter *other-classloader*
  (jcall "getBaseLoader" cl-user::*classpath-manager*))
  
1208 1209 1210 1211
(defmethod print-object
   ((device-id (java:jclass "dto.nbi.service.hdm.alcatel.com.NBIDeviceID" 
                            *other-classloader*))
    stream)
1212 1213 1214 1215 1216
  ;;; ...
)
\end{listing-lisp}

\section{Extensions to the Reader}
1217

1218 1219 1220 1221
We implement a special hexadecimal escape sequence for specifying 32
bit characters to the Lisp reader\footnote{This represents a
  compromise with contemporary in 2011 32bit hosting architecures for
  which we wish to make text processing efficient.  Should the User
1222 1223
  require more control over \textsc{UNICODE} processing we recommend Edi Weisz'
  excellent work with \textsc|{FLEXI-STREAMS}  which we fully support}, namely we
1224
allow a sequences of the form \verb~#\U~\emph{\texttt{xxxx}} to be processed
1225
by the reader as character whose code is specified by the hexadecimal
1226
digits \emph{\texttt{xxxx}}.  The hexadecimal sequence may be one to four digits
1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242
long.

% Why doesn't ALEXANDRIA work?  Good question: Alexandria from
% Quicklisp 2010-10-07 fails a number of tests:
%% Form: (ALEXANDRIA.0.DEV:TYPE= 'LIST '(OR NULL CONS))
%% Expected values: T
%%                  T
%% Actual values: NIL
%%                T.
%% Test ALEXANDRIA-TESTS::TYPE=.3 failed
%% Form: (ALEXANDRIA.0.DEV:TYPE= 'NULL '(AND SYMBOL LIST))
%% Expected values: T
%%                  T
%% Actual values: NIL
%%                NIL.

1243 1244 1245 1246

Note that this sequence is never output by the implementation.  Instead,
the corresponding Unicode character is output for characters whose
code is greater than 0x00ff.
1247

1248
\section{Overloading of the CL:REQUIRE Mechanism}
1249

1250 1251
The \code{CL:REQUIRE} mechanism is overloaded by attaching these
semantics to the execution of \code{REQUIRE} on the following symbols:
1252 1253 1254

\begin{description}

1255 1256
  \item{\code{ASDF}} 
    Loads the \textsc{ASDF} implementation shipped
1257 1258 1259 1260 1261
    with the implementation.  After \textsc{ASDF} has been loaded in
    this manner, symbols passed to \code{CL:REQUIRE} which are
    otherwise unresolved, are passed to ASDF for a chance for
    resolution.  This means, for instance if \code{CL-PPCRE} can be
    located as a loadable \textsc{ASDF} system \code{(require
1262 1263
      :cl-ppcre)} is equivalent to \code{(asdf:load-system
      :cl-ppcre)}.
1264

1265 1266
  \item{\code{ABCL-CONTRIB}} 
    Locates and pushes the toplevel contents of
1267
    ``abcl-contrib.jar'' into the \textsc{ASDF} central registry.  
1268

1269
    \begin{enumerate}
1270 1271
      \item \code{abcl-asdf} 
        Functions for loading JVM artifacts
1272
        dynamically, hooking into ASDF 3 objects where possible.
1273 1274
      \item \code{asdf-jar} 
        Package addressable JVM artifacts via
1275 1276
        \code{abcl-asdf} descriptions as a single binary artifact
        including recursive dependencies.
1277 1278 1279