[armedbear-devel] RfC: Renaming LispObject.writeToString() to LispObject.printObject()

Mark Evenson evenson at panix.com
Fri Jul 15 06:50:26 UTC 2011

On Jul 14, 2011, at 20:42 , Erik Huelsmann wrote:
> My idea would be to disambiguate the two functions by making writeToString() a java-side PRINT-OBJECT, renaming it to printObject() and documenting that's what it does. Then, probably, the lisp side function %write-to-string should be renamed to %print-object too. Probably, more adjustments are required throughout the code base, but those are probably at the 'implementation detail' level.

I think that the meaning of writeToString() was that the function
should provide an implementation of serialization to a string able
to be READ with the #S notation.  It is not really performing a
PRINT-OBJECT-alike function which is a specialization of such an

On the other hand there is some justification for not calling such
an implementation writeToString() as that will certainly confuse a
Java user used to every object either inheriting or overrriding
java.lang.Object.toString().  I might suggest then, that to clarify
that this function isn't a direct implementation of CL's PRINT-OBJECT
which actually takes an both arguments to specify the object it is
operating on and to specify the output streamthat we rename the
Java-side to writeLispObject(). The return type of this method,
java.lang.String, makes something more verbose like
writeLispObjectToString() superfluous.  I'd leave the Lisp
%write-to-string alone, as the presence of WRITE-TO-STRING in the
CL namespace makes it pretty clear that this is the primitive
implementation.  Since %write-to-string has a simple implementation,
looking up its behavior is rather easy.

In any case, I would take advantage of the architecture I started
to define in org.armedbear.lisp.protocol to create an interface
which defines this contract:

package org.armedbear.lisp.protocol;

/** The implementing object can be serialized ala WRITE. */
public interface WriteSerializable {  //  XXX not crazy about the name here
  /** Serialize the implementing object instance in a manner that may be READ via #S */
  public String writeLispObject();

and then make LispObject implement this interface.

This provides a suitable place for encapsulation and documentation,
being the natural place that a Java programmer will go to
figure out what this method should do as it implements the interface.

"A screaming comes across the sky.  It has happened before, but there is nothing to compare to it now."

More information about the armedbear-devel mailing list