From ehuelsmann at common-lisp.net Tue Mar 2 22:35:39 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Tue, 02 Mar 2010 17:35:39 -0500 Subject: [armedbear-cvs] r12513 - in trunk/abcl/src/org/armedbear/lisp: . java java/awt java/swing scripting util Message-ID: Author: ehuelsmann Date: Tue Mar 2 17:35:36 2010 New Revision: 12513 Log: Remove 'private' keyword to eliminate the Java requirement for the compiler to generate synthetic accessors: functions that don't appear in the source but do appear in the class file. Patch by: Douglas Miles Modified: trunk/abcl/src/org/armedbear/lisp/ArithmeticError.java trunk/abcl/src/org/armedbear/lisp/AutoloadMacro.java trunk/abcl/src/org/armedbear/lisp/AutoloadedFunctionProxy.java trunk/abcl/src/org/armedbear/lisp/BroadcastStream.java trunk/abcl/src/org/armedbear/lisp/ByteArrayOutputStream.java trunk/abcl/src/org/armedbear/lisp/Closure.java trunk/abcl/src/org/armedbear/lisp/ConcatenatedStream.java trunk/abcl/src/org/armedbear/lisp/Do.java trunk/abcl/src/org/armedbear/lisp/Environment.java trunk/abcl/src/org/armedbear/lisp/FillPointerOutputStream.java trunk/abcl/src/org/armedbear/lisp/FloatFunctions.java trunk/abcl/src/org/armedbear/lisp/HashTableFunctions.java trunk/abcl/src/org/armedbear/lisp/JHandler.java trunk/abcl/src/org/armedbear/lisp/JProxy.java trunk/abcl/src/org/armedbear/lisp/Java.java trunk/abcl/src/org/armedbear/lisp/JavaObject.java trunk/abcl/src/org/armedbear/lisp/Layout.java trunk/abcl/src/org/armedbear/lisp/Lisp.java trunk/abcl/src/org/armedbear/lisp/LispCharacter.java trunk/abcl/src/org/armedbear/lisp/LispThread.java trunk/abcl/src/org/armedbear/lisp/Load.java trunk/abcl/src/org/armedbear/lisp/MathFunctions.java trunk/abcl/src/org/armedbear/lisp/Pathname.java trunk/abcl/src/org/armedbear/lisp/Primitives.java trunk/abcl/src/org/armedbear/lisp/Profiler.java trunk/abcl/src/org/armedbear/lisp/Readtable.java trunk/abcl/src/org/armedbear/lisp/RuntimeClass.java trunk/abcl/src/org/armedbear/lisp/ShellCommand.java trunk/abcl/src/org/armedbear/lisp/SimpleBitVector.java trunk/abcl/src/org/armedbear/lisp/SimpleVector.java trunk/abcl/src/org/armedbear/lisp/SiteName.java trunk/abcl/src/org/armedbear/lisp/SlimeOutputStream.java trunk/abcl/src/org/armedbear/lisp/SlotClass.java trunk/abcl/src/org/armedbear/lisp/SpecialOperators.java trunk/abcl/src/org/armedbear/lisp/StandardGenericFunction.java trunk/abcl/src/org/armedbear/lisp/StandardObject.java trunk/abcl/src/org/armedbear/lisp/Stream.java trunk/abcl/src/org/armedbear/lisp/StringFunctions.java trunk/abcl/src/org/armedbear/lisp/StringOutputStream.java trunk/abcl/src/org/armedbear/lisp/StructureClass.java trunk/abcl/src/org/armedbear/lisp/StructureObject.java trunk/abcl/src/org/armedbear/lisp/SynonymStream.java trunk/abcl/src/org/armedbear/lisp/arglist.java trunk/abcl/src/org/armedbear/lisp/function_info.java trunk/abcl/src/org/armedbear/lisp/java/DialogPromptStream.java trunk/abcl/src/org/armedbear/lisp/java/awt/AwtDialogPromptStream.java trunk/abcl/src/org/armedbear/lisp/java/swing/SwingDialogPromptStream.java trunk/abcl/src/org/armedbear/lisp/scripting/AbclScriptEngine.java trunk/abcl/src/org/armedbear/lisp/util/RandomAccessCharacterFile.java Modified: trunk/abcl/src/org/armedbear/lisp/ArithmeticError.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/ArithmeticError.java (original) +++ trunk/abcl/src/org/armedbear/lisp/ArithmeticError.java Tue Mar 2 17:35:36 2010 @@ -100,7 +100,7 @@ return super.typep(type); } - private final LispObject getOperation() + final LispObject getOperation() { return getInstanceSlotValue(Symbol.OPERATION); } @@ -111,7 +111,7 @@ setInstanceSlotValue(Symbol.OPERATION, operation); } - private final LispObject getOperands() + final LispObject getOperands() { return getInstanceSlotValue(Symbol.OPERANDS); } Modified: trunk/abcl/src/org/armedbear/lisp/AutoloadMacro.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/AutoloadMacro.java (original) +++ trunk/abcl/src/org/armedbear/lisp/AutoloadMacro.java Tue Mar 2 17:35:36 2010 @@ -47,7 +47,7 @@ super(symbol, fileName, null); } - private static void installAutoloadMacro(Symbol symbol, String fileName) + static void installAutoloadMacro(Symbol symbol, String fileName) { AutoloadMacro am = new AutoloadMacro(symbol, fileName); Modified: trunk/abcl/src/org/armedbear/lisp/AutoloadedFunctionProxy.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/AutoloadedFunctionProxy.java (original) +++ trunk/abcl/src/org/armedbear/lisp/AutoloadedFunctionProxy.java Tue Mar 2 17:35:36 2010 @@ -46,7 +46,7 @@ /** List of symbols that need to be saved upon instantiation of a * proxy and restored while loading the actual function. */ - final static private Symbol[] symsToSave = + final static Symbol[] symsToSave = new Symbol[] { AUTOLOADING_CACHE, // allow loading local preloaded functions Modified: trunk/abcl/src/org/armedbear/lisp/BroadcastStream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/BroadcastStream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/BroadcastStream.java Tue Mar 2 17:35:36 2010 @@ -37,9 +37,9 @@ public final class BroadcastStream extends Stream { - private final Stream[] streams; + final Stream[] streams; - private BroadcastStream(Stream[] streams) + BroadcastStream(Stream[] streams) { super(Symbol.BROADCAST_STREAM); this.streams = streams; Modified: trunk/abcl/src/org/armedbear/lisp/ByteArrayOutputStream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/ByteArrayOutputStream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/ByteArrayOutputStream.java Tue Mar 2 17:35:36 2010 @@ -44,7 +44,7 @@ this(UNSIGNED_BYTE_8); //Declared in Stream.java } - private ByteArrayOutputStream(LispObject elementType) + ByteArrayOutputStream(LispObject elementType) { super(Symbol.SYSTEM_STREAM); this.elementType = elementType; Modified: trunk/abcl/src/org/armedbear/lisp/Closure.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Closure.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Closure.java Tue Mar 2 17:35:36 2010 @@ -1026,12 +1026,12 @@ public static class Parameter { - private final Symbol var; - private final LispObject initForm; - private final LispObject initVal; - private final LispObject svar; + final Symbol var; + final LispObject initForm; + final LispObject initVal; + final LispObject svar; private final int type; - private final Symbol keyword; + final Symbol keyword; public Parameter(Symbol var) { Modified: trunk/abcl/src/org/armedbear/lisp/ConcatenatedStream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/ConcatenatedStream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/ConcatenatedStream.java Tue Mar 2 17:35:36 2010 @@ -37,9 +37,9 @@ public final class ConcatenatedStream extends Stream { - private LispObject streams; + LispObject streams; - private ConcatenatedStream(LispObject streams) + ConcatenatedStream(LispObject streams) { super(Symbol.CONCATENATED_STREAM); this.streams = streams; Modified: trunk/abcl/src/org/armedbear/lisp/Do.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Do.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Do.java Tue Mar 2 17:35:36 2010 @@ -66,7 +66,7 @@ } }; - private static final LispObject _do(LispObject args, Environment env, + static final LispObject _do(LispObject args, Environment env, boolean sequential) { Modified: trunk/abcl/src/org/armedbear/lisp/Environment.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Environment.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Environment.java Tue Mar 2 17:35:36 2010 @@ -37,8 +37,8 @@ public final class Environment extends LispObject { - private Binding vars; - private FunctionBinding lastFunctionBinding; + Binding vars; + FunctionBinding lastFunctionBinding; private Binding blocks; private Binding tags; public boolean inactive; //default value: false == active Modified: trunk/abcl/src/org/armedbear/lisp/FillPointerOutputStream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/FillPointerOutputStream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/FillPointerOutputStream.java Tue Mar 2 17:35:36 2010 @@ -37,9 +37,9 @@ public final class FillPointerOutputStream extends Stream { - private ComplexString string; + ComplexString string; - private FillPointerOutputStream(ComplexString string) + FillPointerOutputStream(ComplexString string) { super(Symbol.SYSTEM_STREAM); elementType = Symbol.CHARACTER; @@ -69,7 +69,7 @@ } }; - private class Writer extends java.io.Writer + class Writer extends java.io.Writer { @Override public void write(char cbuf[], int off, int len) Modified: trunk/abcl/src/org/armedbear/lisp/FloatFunctions.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/FloatFunctions.java (original) +++ trunk/abcl/src/org/armedbear/lisp/FloatFunctions.java Tue Mar 2 17:35:36 2010 @@ -198,8 +198,8 @@ } }; - private static final Fixnum FIXNUM_24 = Fixnum.getInstance(24); - private static final Fixnum FIXNUM_53 = Fixnum.getInstance(53); + static final Fixnum FIXNUM_24 = Fixnum.getInstance(24); + static final Fixnum FIXNUM_53 = Fixnum.getInstance(53); // ### float-digits // float-digits float => float-digits Modified: trunk/abcl/src/org/armedbear/lisp/HashTableFunctions.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/HashTableFunctions.java (original) +++ trunk/abcl/src/org/armedbear/lisp/HashTableFunctions.java Tue Mar 2 17:35:36 2010 @@ -37,13 +37,13 @@ public final class HashTableFunctions { - private static final LispObject FUNCTION_EQ = + static final LispObject FUNCTION_EQ = Symbol.EQ.getSymbolFunction(); - private static final LispObject FUNCTION_EQL = + static final LispObject FUNCTION_EQL = Symbol.EQL.getSymbolFunction(); - private static final LispObject FUNCTION_EQUAL = + static final LispObject FUNCTION_EQUAL = Symbol.EQUAL.getSymbolFunction(); - private static final LispObject FUNCTION_EQUALP = + static final LispObject FUNCTION_EQUALP = Symbol.EQUALP.getSymbolFunction(); // ### %make-hash-table Modified: trunk/abcl/src/org/armedbear/lisp/JHandler.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/JHandler.java (original) +++ trunk/abcl/src/org/armedbear/lisp/JHandler.java Tue Mar 2 17:35:36 2010 @@ -41,7 +41,7 @@ public final class JHandler { - private static final Map> table = + static final Map> table = new WeakHashMap>(); public static void callLisp (String s, Object o) Modified: trunk/abcl/src/org/armedbear/lisp/JProxy.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/JProxy.java (original) +++ trunk/abcl/src/org/armedbear/lisp/JProxy.java Tue Mar 2 17:35:36 2010 @@ -44,7 +44,7 @@ public final class JProxy { - private static final Map table = new WeakHashMap(); + static final Map table = new WeakHashMap(); // ### %jnew-proxy interface &rest method-names-and-defs private static final Primitive _JNEW_PROXY = @@ -135,7 +135,7 @@ /** * A weak map associating each proxy instance with a "Lisp-this" object. */ - private static final Map proxyMap = new WeakHashMap(); + static final Map proxyMap = new WeakHashMap(); public static class LispInvocationHandler implements InvocationHandler { @@ -238,7 +238,7 @@ } }; - private static LispObject toLispObject(Object obj) { + static LispObject toLispObject(Object obj) { return (obj instanceof LispObject) ? (LispObject) obj : new JavaObject(obj); } Modified: trunk/abcl/src/org/armedbear/lisp/Java.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Java.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Java.java Tue Mar 2 17:35:36 2010 @@ -49,12 +49,12 @@ public final class Java { - private static final Map registeredExceptions = + static final Map registeredExceptions = new HashMap(); private static final LispClass java_exception = LispClass.findClass(Symbol.JAVA_EXCEPTION); - private static boolean isJavaException(LispClass lc) + static boolean isJavaException(LispClass lc) { return lc.subclassp(java_exception); } @@ -93,7 +93,7 @@ } }; - private static Symbol getCondition(Class cl) + static Symbol getCondition(Class cl) { Class o = classForName("java.lang.Object"); for (Class c = cl ; c != o ; c = c.getSuperclass()) { @@ -146,7 +146,7 @@ // derived from the instance. // - private static final LispObject jfield(Primitive fun, LispObject[] args, boolean translate) + static final LispObject jfield(Primitive fun, LispObject[] args, boolean translate) { if (args.length < 2 || args.length > 4) @@ -347,7 +347,7 @@ } }; - private static final LispObject jstatic(Primitive fun, LispObject[] args, boolean translate) + static final LispObject jstatic(Primitive fun, LispObject[] args, boolean translate) { if (args.length < 2) @@ -511,7 +511,7 @@ } }; - private static final LispObject jarray_ref(Primitive fun, LispObject[] args, boolean translate) + static final LispObject jarray_ref(Primitive fun, LispObject[] args, boolean translate) { if (args.length < 2) @@ -623,7 +623,7 @@ } }; - private static LispObject jcall(Primitive fun, LispObject[] args, boolean translate) + static LispObject jcall(Primitive fun, LispObject[] args, boolean translate) { if (args.length < 2) @@ -764,7 +764,7 @@ return findMethod(methods, methodName, javaArgs); } - private static Constructor findConstructor(Class c, LispObject[] args) throws NoSuchMethodException { + static Constructor findConstructor(Class c, LispObject[] args) throws NoSuchMethodException { int argCount = args.length - 1; Object[] javaArgs = translateMethodArguments(args, 1); Constructor[] ctors = c.getConstructors(); @@ -1015,7 +1015,7 @@ } }; - private static PropertyDescriptor getPropertyDescriptor(Object obj, LispObject propertyName) throws IntrospectionException { + static PropertyDescriptor getPropertyDescriptor(Object obj, LispObject propertyName) throws IntrospectionException { String prop = ((AbstractString) propertyName).getStringValue(); BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass()); for(PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) { @@ -1028,7 +1028,7 @@ return null; // not reached } - private static Class classForName(String className) + static Class classForName(String className) { try { return Class.forName(className); @@ -1046,7 +1046,7 @@ } // Supports Java primitive types too. - private static Class javaClass(LispObject obj) + static Class javaClass(LispObject obj) { if (obj instanceof AbstractString || obj instanceof Symbol) { String s = javaString(obj); @@ -1092,7 +1092,7 @@ return null; } - private static final String getMessage(Throwable t) + static final String getMessage(Throwable t) { String message = t.getMessage(); if (message == null || message.length() == 0) Modified: trunk/abcl/src/org/armedbear/lisp/JavaObject.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/JavaObject.java (original) +++ trunk/abcl/src/org/armedbear/lisp/JavaObject.java Tue Mar 2 17:35:36 2010 @@ -42,7 +42,7 @@ import java.util.*; public final class JavaObject extends LispObject { - private final Object obj; + final Object obj; private final Class intendedClass; public JavaObject(Object obj) { Modified: trunk/abcl/src/org/armedbear/lisp/Layout.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Layout.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Layout.java Tue Mar 2 17:35:36 2010 @@ -40,8 +40,8 @@ private final LispClass lispClass; public final EqHashTable slotTable; - private final LispObject[] slotNames; - private final LispObject sharedSlots; + final LispObject[] slotNames; + final LispObject sharedSlots; private boolean invalid; @@ -74,7 +74,7 @@ } // Copy constructor. - private Layout(Layout oldLayout) + Layout(Layout oldLayout) { lispClass = oldLayout.getLispClass(); slotNames = oldLayout.slotNames; Modified: trunk/abcl/src/org/armedbear/lisp/Lisp.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Lisp.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Lisp.java Tue Mar 2 17:35:36 2010 @@ -2028,7 +2028,7 @@ } // The compiler's object table. - private static final Hashtable objectTable = + static final Hashtable objectTable = new Hashtable(); public static final LispObject recall(String key) @@ -2620,7 +2620,7 @@ exportSpecial("*COMPILE-FILE-ENVIRONMENT*", PACKAGE_SYS, NIL); public static final LispObject UNBOUND_VALUE = new unboundValue(); - private static class unboundValue extends LispObject + static class unboundValue extends LispObject { @Override public String writeToString() @@ -2630,7 +2630,7 @@ } public static final LispObject NULL_VALUE = new nullValue(); - private static class nullValue extends LispObject + static class nullValue extends LispObject { @Override public String writeToString() Modified: trunk/abcl/src/org/armedbear/lisp/LispCharacter.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/LispCharacter.java (original) +++ trunk/abcl/src/org/armedbear/lisp/LispCharacter.java Tue Mar 2 17:35:36 2010 @@ -129,7 +129,7 @@ return new SimpleString(value); } - private boolean isStandardChar() + boolean isStandardChar() { if (value >= ' ' && value < 127) return true; @@ -682,7 +682,7 @@ } } - private static final char[] UPPER_CASE_CHARS = new char[128]; + static final char[] UPPER_CASE_CHARS = new char[128]; static { @@ -697,7 +697,7 @@ return Character.toLowerCase(c); } - private static final char[] LOWER_CASE_CHARS = new char[128]; + static final char[] LOWER_CASE_CHARS = new char[128]; static { Modified: trunk/abcl/src/org/armedbear/lisp/LispThread.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/LispThread.java (original) +++ trunk/abcl/src/org/armedbear/lisp/LispThread.java Tue Mar 2 17:35:36 2010 @@ -41,11 +41,11 @@ public final class LispThread extends LispObject { - private static boolean use_fast_calls = false; + static boolean use_fast_calls = false; // use a concurrent hashmap: we may want to add threads // while at the same time iterating the hash - final private static ConcurrentHashMap map = + final static ConcurrentHashMap map = new ConcurrentHashMap(); private static ThreadLocal threads = new ThreadLocal(){ @@ -66,20 +66,20 @@ return threads.get(); } - private final Thread javaThread; + final Thread javaThread; private boolean destroyed; - private final LispObject name; + final LispObject name; public LispObject[] _values; private boolean threadInterrupted; private LispObject pending = NIL; - private LispThread(Thread javaThread) + LispThread(Thread javaThread) { this.javaThread = javaThread; name = new SimpleString(javaThread.getName()); } - private LispThread(final Function fun, LispObject name) + LispThread(final Function fun, LispObject name) { Runnable r = new Runnable() { public void run() @@ -141,17 +141,17 @@ return destroyed; } - private final synchronized boolean isInterrupted() + final synchronized boolean isInterrupted() { return threadInterrupted; } - private final synchronized void setDestroyed(boolean b) + final synchronized void setDestroyed(boolean b) { destroyed = b; } - private final synchronized void interrupt(LispObject function, LispObject args) + final synchronized void interrupt(LispObject function, LispObject args) { pending = new Cons(args, pending); pending = new Cons(function, pending); @@ -159,7 +159,7 @@ javaThread.interrupt(); } - private final synchronized void processThreadInterrupts() + final synchronized void processThreadInterrupts() { while (pending != NIL) { Modified: trunk/abcl/src/org/armedbear/lisp/Load.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Load.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Load.java Tue Mar 2 17:35:36 2010 @@ -324,7 +324,7 @@ // ### *fasl-version* // internal symbol - private static final Symbol _FASL_VERSION_ = + static final Symbol _FASL_VERSION_ = exportConstant("*FASL-VERSION*", PACKAGE_SYS, Fixnum.getInstance(35)); // ### *fasl-external-format* @@ -530,7 +530,7 @@ } } - private static final LispObject faslLoadStream(LispThread thread) + static final LispObject faslLoadStream(LispThread thread) { Stream in = (Stream) _LOAD_STREAM_.symbolValue(thread); final Environment env = new Environment(); @@ -589,7 +589,7 @@ } } - private static final LispObject load(LispObject filespec, + static final LispObject load(LispObject filespec, LispObject verbose, LispObject print, LispObject ifDoesNotExist, Modified: trunk/abcl/src/org/armedbear/lisp/MathFunctions.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/MathFunctions.java (original) +++ trunk/abcl/src/org/armedbear/lisp/MathFunctions.java Tue Mar 2 17:35:36 2010 @@ -47,7 +47,7 @@ } }; - private static LispObject sin(LispObject arg) + static LispObject sin(LispObject arg) { if (arg instanceof DoubleFloat) return new DoubleFloat(Math.sin(((DoubleFloat)arg).value)); @@ -74,7 +74,7 @@ } }; - private static LispObject cos(LispObject arg) + static LispObject cos(LispObject arg) { if (arg instanceof DoubleFloat) return new DoubleFloat(Math.cos(((DoubleFloat)arg).value)); @@ -114,7 +114,7 @@ } }; - private static LispObject asin(LispObject arg) + static LispObject asin(LispObject arg) { if (arg instanceof SingleFloat) { float f = ((SingleFloat)arg).value; @@ -155,7 +155,7 @@ } }; - private static LispObject acos(LispObject arg) + static LispObject acos(LispObject arg) { if (arg instanceof DoubleFloat) { double d = ((DoubleFloat)arg).value; @@ -225,7 +225,7 @@ } }; - private static LispObject atan(LispObject arg) + static LispObject atan(LispObject arg) { if (arg instanceof Complex) { LispObject im = ((Complex)arg).imagpart; @@ -259,7 +259,7 @@ } }; - private static LispObject sinh(LispObject arg) + static LispObject sinh(LispObject arg) { if (arg instanceof Complex) { LispObject im = ((Complex)arg).getImaginaryPart(); @@ -297,7 +297,7 @@ } }; - private static LispObject cosh(LispObject arg) + static LispObject cosh(LispObject arg) { if (arg instanceof Complex) { LispObject im = ((Complex)arg).getImaginaryPart(); @@ -352,7 +352,7 @@ } }; - private static LispObject asinh(LispObject arg) + static LispObject asinh(LispObject arg) { if (arg instanceof Complex) { LispObject im = ((Complex)arg).getImaginaryPart(); @@ -385,7 +385,7 @@ } }; - private static LispObject acosh(LispObject arg) + static LispObject acosh(LispObject arg) { if (arg instanceof Complex) { LispObject im = ((Complex)arg).getImaginaryPart(); @@ -422,7 +422,7 @@ } }; - private static LispObject atanh(LispObject arg) + static LispObject atanh(LispObject arg) { if (arg instanceof Complex) { LispObject im = ((Complex)arg).getImaginaryPart(); @@ -454,7 +454,7 @@ } }; - private static LispObject cis(LispObject arg) + static LispObject cis(LispObject arg) { if (arg.realp()) return Complex.getInstance(cos(arg), sin(arg)); @@ -471,7 +471,7 @@ } }; - private static LispObject exp(LispObject arg) + static LispObject exp(LispObject arg) { if (arg.realp()) { if (arg instanceof DoubleFloat) { @@ -499,7 +499,7 @@ } }; - private static final LispObject sqrt(LispObject obj) + static final LispObject sqrt(LispObject obj) { if (obj instanceof DoubleFloat) { if (obj.minusp()) @@ -552,7 +552,7 @@ } }; - private static final LispObject log(LispObject obj) + static final LispObject log(LispObject obj) { if (obj.realp() && !obj.minusp()) { // Result is real. @@ -706,7 +706,7 @@ * @param number * @return number or signals an appropriate error */ - private final static LispObject OverUnderFlowCheck(LispObject number) + final static LispObject OverUnderFlowCheck(LispObject number) { if (number instanceof Complex) { @@ -773,7 +773,7 @@ * @param base A value of any type * @param power An integer (fixnum or bignum) value */ - private static final LispObject intexp(LispObject base, LispObject power) + static final LispObject intexp(LispObject base, LispObject power) { if (power.isEqualTo(0)) Modified: trunk/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Pathname.java Tue Mar 2 17:35:36 2010 @@ -849,7 +849,7 @@ } } - private static final void checkCaseArgument(LispObject arg) { + static final void checkCaseArgument(LispObject arg) { if (arg != Keyword.COMMON && arg != Keyword.LOCAL) { type_error(arg, list(Symbol.MEMBER, Keyword.COMMON, Keyword.LOCAL)); @@ -1029,7 +1029,7 @@ return new Pathname(namestring); } - private static final Pathname _makePathname(LispObject[] args) { + static final Pathname _makePathname(LispObject[] args) { if (args.length % 2 != 0) { error(new ProgramError("Odd number of keyword arguments.")); } Modified: trunk/abcl/src/org/armedbear/lisp/Primitives.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Primitives.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Primitives.java Tue Mar 2 17:35:36 2010 @@ -345,7 +345,7 @@ }; // ### eql - private static final Primitive EQL = new pf_eql(); + static final Primitive EQL = new pf_eql(); private static final class pf_eql extends Primitive { pf_eql() { super(Symbol.EQL, "x y"); @@ -1718,7 +1718,7 @@ private static final Symbol _SIMPLE_FORMAT_FUNCTION_ = internSpecial("*SIMPLE-FORMAT-FUNCTION*", PACKAGE_SYS, _FORMAT); - private static void checkRedefinition(LispObject arg) + static void checkRedefinition(LispObject arg) { final LispThread thread = LispThread.currentThread(); @@ -4312,7 +4312,7 @@ } }; - private static final LispObject list_subseq(LispObject list, int start, + static final LispObject list_subseq(LispObject list, int start, int end) { @@ -4521,7 +4521,7 @@ }; // ### list-delete-eq item list => result-list - private static final Primitive LIST_DELETE_EQ = new pf_list_delete_eq(); + static final Primitive LIST_DELETE_EQ = new pf_list_delete_eq(); private static final class pf_list_delete_eq extends Primitive { pf_list_delete_eq() { super("list-delete-eq", PACKAGE_SYS, true, "item list"); @@ -4565,7 +4565,7 @@ }; // ### list-delete-eql item list => result-list - private static final Primitive LIST_DELETE_EQL = new pf_list_delete_eql(); + static final Primitive LIST_DELETE_EQL = new pf_list_delete_eql(); private static final class pf_list_delete_eql extends Primitive { pf_list_delete_eql() { super("list-delete-eql", PACKAGE_SYS, true, "item list"); Modified: trunk/abcl/src/org/armedbear/lisp/Profiler.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Profiler.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Profiler.java Tue Mar 2 17:35:36 2010 @@ -37,7 +37,7 @@ public class Profiler { - private static int sleep = 1; + static int sleep = 1; // ### %start-profiler // %start-profiler type granularity Modified: trunk/abcl/src/org/armedbear/lisp/Readtable.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Readtable.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Readtable.java Tue Mar 2 17:35:36 2010 @@ -135,7 +135,7 @@ } // FIXME synchronization - private static void copyReadtable(Readtable from, Readtable to) + static void copyReadtable(Readtable from, Readtable to) { Iterator charIterator = from.syntax.getCharIterator(); while (charIterator.hasNext()) { @@ -252,7 +252,7 @@ return readerMacroFunctions.get(c); } - private LispObject getMacroCharacter(char c) + LispObject getMacroCharacter(char c) { LispObject function = getReaderMacroFunction(c); LispObject non_terminating_p; @@ -271,7 +271,7 @@ return LispThread.currentThread().setValues(function, non_terminating_p); } - private void makeDispatchMacroCharacter(char dispChar, LispObject non_terminating_p) + void makeDispatchMacroCharacter(char dispChar, LispObject non_terminating_p) { byte syntaxType; if (non_terminating_p != NIL) Modified: trunk/abcl/src/org/armedbear/lisp/RuntimeClass.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/RuntimeClass.java (original) +++ trunk/abcl/src/org/armedbear/lisp/RuntimeClass.java Tue Mar 2 17:35:36 2010 @@ -41,7 +41,7 @@ public class RuntimeClass { - private static Map classes = new HashMap(); + static Map classes = new HashMap(); private Map methods = new HashMap(); @@ -144,7 +144,7 @@ return (Function) methods.get(methodName); } - private void addLispMethod(String methodName, Function def) { + void addLispMethod(String methodName, Function def) { methods.put(methodName, def); } Modified: trunk/abcl/src/org/armedbear/lisp/ShellCommand.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/ShellCommand.java (original) +++ trunk/abcl/src/org/armedbear/lisp/ShellCommand.java Tue Mar 2 17:35:36 2010 @@ -65,12 +65,12 @@ return (output != null) ? output.toString() : ""; } - private final int exitValue() + final int exitValue() { return exitValue; } - private void processOutput(String s) + void processOutput(String s) { if (outputStream != null) outputStream._writeString(s); Modified: trunk/abcl/src/org/armedbear/lisp/SimpleBitVector.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SimpleBitVector.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SimpleBitVector.java Tue Mar 2 17:35:36 2010 @@ -247,7 +247,7 @@ return new ComplexBitVector(newCapacity, displacedTo, displacement); } - private SimpleBitVector and(SimpleBitVector v, SimpleBitVector result) + SimpleBitVector and(SimpleBitVector v, SimpleBitVector result) { if (result == null) result = new SimpleBitVector(capacity); @@ -256,7 +256,7 @@ return result; } - private SimpleBitVector ior(SimpleBitVector v, SimpleBitVector result) + SimpleBitVector ior(SimpleBitVector v, SimpleBitVector result) { if (result == null) result = new SimpleBitVector(capacity); @@ -265,7 +265,7 @@ return result; } - private SimpleBitVector xor(SimpleBitVector v, SimpleBitVector result) + SimpleBitVector xor(SimpleBitVector v, SimpleBitVector result) { if (result == null) result = new SimpleBitVector(capacity); @@ -274,7 +274,7 @@ return result; } - private SimpleBitVector eqv(SimpleBitVector v, SimpleBitVector result) + SimpleBitVector eqv(SimpleBitVector v, SimpleBitVector result) { if (result == null) result = new SimpleBitVector(capacity); @@ -283,7 +283,7 @@ return result; } - private SimpleBitVector nand(SimpleBitVector v, SimpleBitVector result) + SimpleBitVector nand(SimpleBitVector v, SimpleBitVector result) { if (result == null) result = new SimpleBitVector(capacity); @@ -292,7 +292,7 @@ return result; } - private SimpleBitVector nor(SimpleBitVector v, SimpleBitVector result) + SimpleBitVector nor(SimpleBitVector v, SimpleBitVector result) { if (result == null) result = new SimpleBitVector(capacity); @@ -301,7 +301,7 @@ return result; } - private SimpleBitVector andc1(SimpleBitVector v, SimpleBitVector result) + SimpleBitVector andc1(SimpleBitVector v, SimpleBitVector result) { if (result == null) result = new SimpleBitVector(capacity); @@ -310,7 +310,7 @@ return result; } - private SimpleBitVector andc2(SimpleBitVector v, SimpleBitVector result) + SimpleBitVector andc2(SimpleBitVector v, SimpleBitVector result) { if (result == null) result = new SimpleBitVector(capacity); @@ -319,7 +319,7 @@ return result; } - private SimpleBitVector orc1(SimpleBitVector v, SimpleBitVector result) + SimpleBitVector orc1(SimpleBitVector v, SimpleBitVector result) { if (result == null) result = new SimpleBitVector(capacity); @@ -328,7 +328,7 @@ return result; } - private SimpleBitVector orc2(SimpleBitVector v, SimpleBitVector result) + SimpleBitVector orc2(SimpleBitVector v, SimpleBitVector result) { if (result == null) result = new SimpleBitVector(capacity); Modified: trunk/abcl/src/org/armedbear/lisp/SimpleVector.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SimpleVector.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SimpleVector.java Tue Mar 2 17:35:36 2010 @@ -40,8 +40,8 @@ // type is a subtype of type SIMPLE-VECTOR." public final class SimpleVector extends AbstractVector { - private int capacity; - private LispObject[] data; + int capacity; + LispObject[] data; public SimpleVector(int capacity) { Modified: trunk/abcl/src/org/armedbear/lisp/SiteName.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SiteName.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SiteName.java Tue Mar 2 17:35:36 2010 @@ -40,7 +40,7 @@ public final class SiteName { - private static LispObject getHostName() + static LispObject getHostName() { String hostName = null; InetAddress addr; Modified: trunk/abcl/src/org/armedbear/lisp/SlimeOutputStream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SlimeOutputStream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SlimeOutputStream.java Tue Mar 2 17:35:36 2010 @@ -42,7 +42,7 @@ private final StringWriter stringWriter; final Function f; - private SlimeOutputStream(Function f) + SlimeOutputStream(Function f) { super(Symbol.SLIME_OUTPUT_STREAM); this.elementType = Symbol.CHARACTER; Modified: trunk/abcl/src/org/armedbear/lisp/SlotClass.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SlotClass.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SlotClass.java Tue Mar 2 17:35:36 2010 @@ -120,7 +120,7 @@ this.defaultInitargs = defaultInitargs; } - private LispObject computeDefaultInitargs() + LispObject computeDefaultInitargs() { LispObject result = NIL; LispObject cpl = getCPL(); Modified: trunk/abcl/src/org/armedbear/lisp/SpecialOperators.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SpecialOperators.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SpecialOperators.java Tue Mar 2 17:35:36 2010 @@ -119,7 +119,7 @@ } }; - private static final LispObject _let(LispObject args, Environment env, + static final LispObject _let(LispObject args, Environment env, boolean sequential) { @@ -306,7 +306,7 @@ } }; - private static final LispObject _flet(LispObject args, Environment env, + static final LispObject _flet(LispObject args, Environment env, boolean recursive) { Modified: trunk/abcl/src/org/armedbear/lisp/StandardGenericFunction.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StandardGenericFunction.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StandardGenericFunction.java Tue Mar 2 17:35:36 2010 @@ -39,12 +39,12 @@ public final class StandardGenericFunction extends StandardObject { - private LispObject function; + LispObject function; - private int numberOfRequiredArgs; + int numberOfRequiredArgs; - private HashMap cache; - private HashMap slotCache; + HashMap cache; + HashMap slotCache; public StandardGenericFunction() { @@ -87,7 +87,7 @@ slots[StandardGenericFunctionClass.SLOT_INDEX_DOCUMENTATION] = NIL; } - private void finalizeInternal() + void finalizeInternal() { cache = null; } @@ -663,7 +663,7 @@ * { EqlSpecialization('SYMBOL), EqlSpecialization('SYMBOL) }. * */ - private LispObject getArgSpecialization(LispObject arg) + LispObject getArgSpecialization(LispObject arg) { for (EqlSpecialization eqlSpecialization : eqlSpecializations) { @@ -766,7 +766,7 @@ } } - private EqlSpecialization eqlSpecializations[] = new EqlSpecialization[0]; + EqlSpecialization eqlSpecializations[] = new EqlSpecialization[0]; // ### %init-eql-specializations private static final Primitive _INIT_EQL_SPECIALIZATIONS Modified: trunk/abcl/src/org/armedbear/lisp/StandardObject.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StandardObject.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StandardObject.java Tue Mar 2 17:35:36 2010 @@ -179,7 +179,7 @@ return unreadableString(typeOf().writeToString()); } - private Layout updateLayout() + Layout updateLayout() { Debug.assertTrue(layout.isInvalid()); Layout oldLayout = layout; Modified: trunk/abcl/src/org/armedbear/lisp/Stream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Stream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Stream.java Tue Mar 2 17:35:36 2010 @@ -2066,7 +2066,7 @@ } }; - private static final LispObject finishOutput(LispObject arg) + static final LispObject finishOutput(LispObject arg) { final LispObject out; Modified: trunk/abcl/src/org/armedbear/lisp/StringFunctions.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StringFunctions.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StringFunctions.java Tue Mar 2 17:35:36 2010 @@ -37,7 +37,7 @@ import static org.armedbear.lisp.Lisp.*; import java.util.Arrays; public final class StringFunctions { - private final static class StringIndicesAndChars { + final static class StringIndicesAndChars { public AbstractString string1; public boolean convertCase = false; public char[] array1; @@ -85,7 +85,7 @@ return convert ? LispCharacter.toUpperCase(c) : c; } - private final static StringIndicesAndChars + final static StringIndicesAndChars stringIndicesAndChars(LispObject... params) { StringIndicesAndChars retVal = new StringIndicesAndChars(); retVal.string1 = checkString(params[0].STRING()); @@ -162,7 +162,7 @@ }; - private static final int notEqual(StringIndicesAndChars indicesAndChars) { + static final int notEqual(StringIndicesAndChars indicesAndChars) { int i = indicesAndChars.start1; int j = indicesAndChars.start2; while (true) { @@ -187,7 +187,7 @@ } // ### %string/= // Case sensitive. - private static final Primitive _STRING_NOT_EQUAL = new pf__string_not_equal(); + static final Primitive _STRING_NOT_EQUAL = new pf__string_not_equal(); private static final class pf__string_not_equal extends Primitive { pf__string_not_equal() { super("%string/=", PACKAGE_SYS, true); @@ -228,7 +228,7 @@ // ### %string-not-equal // Case insensitive. - private static final Primitive _STRING_NOT_EQUAL_IGNORE_CASE = new pf__string_not_equal_ignore_case(); + static final Primitive _STRING_NOT_EQUAL_IGNORE_CASE = new pf__string_not_equal_ignore_case(); private static final class pf__string_not_equal_ignore_case extends Primitive { pf__string_not_equal_ignore_case() { super("%string-not-equal", PACKAGE_SYS, true); @@ -247,7 +247,7 @@ } }; - private static final int lessThan(StringIndicesAndChars indicesAndChars) { + static final int lessThan(StringIndicesAndChars indicesAndChars) { int i = indicesAndChars.start1; int j = indicesAndChars.start2; while (true) { @@ -297,7 +297,7 @@ } }; - private static LispObject + static LispObject swapReturnValue(int original, StringIndicesAndChars indicesAndChars) { if (original < 0) { @@ -330,7 +330,7 @@ } }; - private static final int lessThanOrEqual(StringIndicesAndChars indicesAndChars) { + static final int lessThanOrEqual(StringIndicesAndChars indicesAndChars) { int i = indicesAndChars.start1; int j = indicesAndChars.start2; while (true) { Modified: trunk/abcl/src/org/armedbear/lisp/StringOutputStream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StringOutputStream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StringOutputStream.java Tue Mar 2 17:35:36 2010 @@ -46,7 +46,7 @@ this(Symbol.CHARACTER); } - private StringOutputStream(LispObject elementType) + StringOutputStream(LispObject elementType) { super(Symbol.STRING_OUTPUT_STREAM); this.elementType = elementType; Modified: trunk/abcl/src/org/armedbear/lisp/StructureClass.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StructureClass.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StructureClass.java Tue Mar 2 17:35:36 2010 @@ -37,7 +37,7 @@ public class StructureClass extends SlotClass { - private StructureClass(Symbol symbol) + StructureClass(Symbol symbol) { super(symbol, new Cons(BuiltInClass.STRUCTURE_OBJECT)); } Modified: trunk/abcl/src/org/armedbear/lisp/StructureObject.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StructureObject.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StructureObject.java Tue Mar 2 17:35:36 2010 @@ -38,7 +38,7 @@ public class StructureObject extends LispObject { private final StructureClass structureClass; - private final LispObject[] slots; + final LispObject[] slots; public StructureObject(Symbol symbol) Modified: trunk/abcl/src/org/armedbear/lisp/SynonymStream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SynonymStream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SynonymStream.java Tue Mar 2 17:35:36 2010 @@ -37,9 +37,9 @@ public final class SynonymStream extends Stream { - private final Symbol symbol; + final Symbol symbol; - private SynonymStream(Symbol symbol) + SynonymStream(Symbol symbol) { super(Symbol.SYNONYM_STREAM); this.symbol = symbol; Modified: trunk/abcl/src/org/armedbear/lisp/arglist.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/arglist.java (original) +++ trunk/abcl/src/org/armedbear/lisp/arglist.java Tue Mar 2 17:35:36 2010 @@ -37,7 +37,7 @@ public final class arglist { - private static final Operator getOperator(LispObject obj) + static final Operator getOperator(LispObject obj) { if (obj instanceof Operator) Modified: trunk/abcl/src/org/armedbear/lisp/function_info.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/function_info.java (original) +++ trunk/abcl/src/org/armedbear/lisp/function_info.java Tue Mar 2 17:35:36 2010 @@ -37,7 +37,7 @@ public final class function_info { - private static EqualHashTable FUNCTION_TABLE = + static EqualHashTable FUNCTION_TABLE = new EqualHashTable(64, NIL, NIL); // ### function-info name Modified: trunk/abcl/src/org/armedbear/lisp/java/DialogPromptStream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/java/DialogPromptStream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/java/DialogPromptStream.java Tue Mar 2 17:35:36 2010 @@ -17,7 +17,7 @@ */ public abstract class DialogPromptStream extends Stream { - private StringWriter writtenSoFar = new StringWriter(); + StringWriter writtenSoFar = new StringWriter(); private Reader reader = new Reader() { private StringReader stringReader = null; Modified: trunk/abcl/src/org/armedbear/lisp/java/awt/AwtDialogPromptStream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/java/awt/AwtDialogPromptStream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/java/awt/AwtDialogPromptStream.java Tue Mar 2 17:35:36 2010 @@ -16,7 +16,7 @@ public class AwtDialogPromptStream extends DialogPromptStream { - private Dialog dialog = new Dialog((Frame)null, true); + Dialog dialog = new Dialog((Frame)null, true); private Label prompt = new Label(); private TextField input = new TextField(32); Modified: trunk/abcl/src/org/armedbear/lisp/java/swing/SwingDialogPromptStream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/java/swing/SwingDialogPromptStream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/java/swing/SwingDialogPromptStream.java Tue Mar 2 17:35:36 2010 @@ -16,7 +16,7 @@ public class SwingDialogPromptStream extends DialogPromptStream { - private JDialog dialog = new JDialog((Frame)null, true); + JDialog dialog = new JDialog((Frame)null, true); private JLabel prompt = new JLabel(); private JTextField input = new JTextField(32); Modified: trunk/abcl/src/org/armedbear/lisp/scripting/AbclScriptEngine.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/scripting/AbclScriptEngine.java (original) +++ trunk/abcl/src/org/armedbear/lisp/scripting/AbclScriptEngine.java Tue Mar 2 17:35:36 2010 @@ -54,7 +54,7 @@ /** * The function used to evaluate a compiled script. */ - private Function evalCompiledScript; + Function evalCompiledScript; protected AbclScriptEngine() { interpreter = Interpreter.getInstance(); @@ -229,7 +229,7 @@ return Symbol.LIST.getSymbolFunction().execute(argList); } - private Object eval(Function evaluator, LispObject code, ScriptContext ctx) throws ScriptException { + Object eval(Function evaluator, LispObject code, ScriptContext ctx) throws ScriptException { ReaderInputStream in = null; WriterOutputStream out = null; LispObject retVal = null; Modified: trunk/abcl/src/org/armedbear/lisp/util/RandomAccessCharacterFile.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/util/RandomAccessCharacterFile.java (original) +++ trunk/abcl/src/org/armedbear/lisp/util/RandomAccessCharacterFile.java Tue Mar 2 17:35:36 2010 @@ -136,7 +136,7 @@ private class RandomAccessOutputStream extends OutputStream { - private RandomAccessOutputStream() { + RandomAccessOutputStream() { } private byte[] buf = new byte[1]; @@ -168,11 +168,11 @@ // dummy reader which we need to call the Pushback constructor // because a null value won't work - private static Reader staticReader = new StringReader(""); + static Reader staticReader = new StringReader(""); private class RandomAccessReader extends PushbackReader { - private RandomAccessReader() { + RandomAccessReader() { // because we override all methods of Pushbackreader, // staticReader will never be referenced super(staticReader); @@ -237,7 +237,7 @@ private class RandomAccessWriter extends Writer { - private RandomAccessWriter() { + RandomAccessWriter() { } public final void close() throws IOException { @@ -365,7 +365,7 @@ return bufReady; } - private final int read(char[] cb, int off, int len) throws IOException { + final int read(char[] cb, int off, int len) throws IOException { CharBuffer cbuf = CharBuffer.wrap(cb, off, len); boolean decodeWasUnderflow = false; boolean atEof = false; @@ -395,7 +395,7 @@ } } - private final void write(char[] cb, int off, int len) throws IOException { + final void write(char[] cb, int off, int len) throws IOException { CharBuffer cbuf = CharBuffer.wrap(cb, off, len); encodeAndWrite(cbuf, false, false); } @@ -544,7 +544,7 @@ position(pos); } - private final void write(byte[] b, int off, int len) throws IOException { + final void write(byte[] b, int off, int len) throws IOException { int pos = off; while (pos < off + len) { int want = len; From mevenson at common-lisp.net Wed Mar 3 15:18:44 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Wed, 03 Mar 2010 10:18:44 -0500 Subject: [armedbear-cvs] r12514 - in trunk/abcl: . src/org/armedbear/lisp Message-ID: Author: mevenson Date: Wed Mar 3 10:18:41 2010 New Revision: 12514 Log: Create logical pathnames translations for "SYS:SRC" and "SYS:JAVA". COMPILE-SYSTEM now dumps the file "system.lisp" to the output path, which gets picked up by the build process and packaged in abcl.jar. boot.lisp now has a (REQUIRE :system) form to load this, trapping any errors to be non-fatal. Modified: trunk/abcl/CHANGES trunk/abcl/build.xml trunk/abcl/src/org/armedbear/lisp/boot.lisp trunk/abcl/src/org/armedbear/lisp/compile-system.lisp Modified: trunk/abcl/CHANGES ============================================================================== --- trunk/abcl/CHANGES (original) +++ trunk/abcl/CHANGES Wed Mar 3 10:18:41 2010 @@ -6,6 +6,10 @@ Features -------- +* [svn 12513] Implement SYS:SRC and SYS:JAVA logical pathname + translations for system Lisp source and the root of the Java package + structure, respectively. + * [svn 12505] All calls to anonymous functions and local functions that have been declared inline are now converted to LET* forms, reducing stack usage and the number of generated classes. Modified: trunk/abcl/build.xml ============================================================================== --- trunk/abcl/build.xml (original) +++ trunk/abcl/build.xml Wed Mar 3 10:18:41 2010 @@ -80,6 +80,8 @@ + + Modified: trunk/abcl/src/org/armedbear/lisp/boot.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/boot.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/boot.lisp Wed Mar 3 10:18:41 2010 @@ -191,3 +191,13 @@ (unless *noinform* (%format t "Startup completed in ~A seconds.~%" (float (/ (ext:uptime) 1000))))) + +;;; "system.lisp" contains system installation specific information +;;; (currently only the logical pathname definition for "SYS;SRC") +;;; that is not currently required for ABCL to run. Since +;;; LOAD-SYSTEM-FILE exits the JVM if its argument cannot be found, we +;;; use REQUIRE trapping any error. +(handler-case + (require 'system) + (t ())) + Modified: trunk/abcl/src/org/armedbear/lisp/compile-system.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/compile-system.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/compile-system.lisp Wed Mar 3 10:18:41 2010 @@ -284,5 +284,20 @@ (%compile-system :output-path output-path)) (unless failure-p (setf status 0))))) + (create-system-logical-translations output-path) (when quit (quit :status status)))) + +(defun create-system-logical-translations (output-path) + (let* ((dir (directory-namestring (pathname output-path))) + (system (merge-pathnames "system.lisp" dir)) + (home (pathname *lisp-home*)) + (src (format nil "~A**/*.*" home)) + (java (format nil "~A../../../**/*.*" home))) + (with-open-file (s system :direction :output + :if-exists :supersede) + (write `(setf (logical-pathname-translations "sys") + '(("SYS:SRC;**;*.*" ,src) + ("SYS:JAVA;**;*.*" ,java))) + :stream s)))) + From vvoutilainen at common-lisp.net Wed Mar 3 19:14:59 2010 From: vvoutilainen at common-lisp.net (Ville Voutilainen) Date: Wed, 03 Mar 2010 14:14:59 -0500 Subject: [armedbear-cvs] r12515 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: vvoutilainen Date: Wed Mar 3 14:14:56 2010 New Revision: 12515 Log: Move a couple EXT symbols close to other EXT symbols. Modified: trunk/abcl/src/org/armedbear/lisp/Symbol.java Modified: trunk/abcl/src/org/armedbear/lisp/Symbol.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Symbol.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Symbol.java Wed Mar 3 14:14:56 2010 @@ -2887,10 +2887,14 @@ PACKAGE_EXT.addExternalSymbol("MEMQ"); public static final Symbol MEMQL = PACKAGE_EXT.addExternalSymbol("MEMQL"); + public static final Symbol NIL_VECTOR = + PACKAGE_EXT.addExternalSymbol("NIL-VECTOR"); public static final Symbol COMPILER_ERROR = PACKAGE_EXT.addExternalSymbol("COMPILER-ERROR"); public static final Symbol COMPILER_UNSUPPORTED_FEATURE_ERROR = PACKAGE_EXT.addExternalSymbol("COMPILER-UNSUPPORTED-FEATURE-ERROR"); + public static final Symbol MAILBOX = + PACKAGE_EXT.addExternalSymbol("MAILBOX"); public static final Symbol MUTEX = PACKAGE_EXT.addExternalSymbol("MUTEX"); public static final Symbol THREAD = @@ -2911,6 +2915,10 @@ PACKAGE_EXT.addExternalSymbol("MACROEXPAND-ALL"); public static final Symbol LOAD_TRUENAME_FASL = PACKAGE_EXT.addExternalSymbol("*LOAD-TRUENAME-FASL*"); + public static final Symbol SLIME_INPUT_STREAM = + PACKAGE_EXT.addExternalSymbol("SLIME-INPUT-STREAM"); + public static final Symbol SLIME_OUTPUT_STREAM = + PACKAGE_EXT.addExternalSymbol("SLIME-OUTPUT-STREAM"); // MOP. public static final Symbol STANDARD_READER_METHOD = @@ -2947,14 +2955,6 @@ PACKAGE_SYS.addExternalSymbol("ENVIRONMENT"); public static final Symbol FORWARD_REFERENCED_CLASS = PACKAGE_SYS.addExternalSymbol("FORWARD-REFERENCED-CLASS"); - public static final Symbol MAILBOX = - PACKAGE_EXT.addExternalSymbol("MAILBOX"); - public static final Symbol NIL_VECTOR = - PACKAGE_EXT.addExternalSymbol("NIL-VECTOR"); - public static final Symbol SLIME_INPUT_STREAM = - PACKAGE_EXT.addExternalSymbol("SLIME-INPUT-STREAM"); - public static final Symbol SLIME_OUTPUT_STREAM = - PACKAGE_EXT.addExternalSymbol("SLIME-OUTPUT-STREAM"); public static final Symbol CLASS_BYTES = PACKAGE_SYS.addExternalSymbol("CLASS-BYTES"); public static final Symbol _CLASS_SLOTS = From astalla at common-lisp.net Wed Mar 3 21:05:43 2010 From: astalla at common-lisp.net (Alessio Stalla) Date: Wed, 03 Mar 2010 16:05:43 -0500 Subject: [armedbear-cvs] r12516 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: astalla Date: Wed Mar 3 16:05:41 2010 New Revision: 12516 Log: Support for user-extensible sequences, adapted from SBCL. Added: trunk/abcl/src/org/armedbear/lisp/extensible-sequences-base.lisp trunk/abcl/src/org/armedbear/lisp/extensible-sequences.lisp Modified: trunk/abcl/src/org/armedbear/lisp/BuiltInClass.java trunk/abcl/src/org/armedbear/lisp/Cons.java trunk/abcl/src/org/armedbear/lisp/Lisp.java trunk/abcl/src/org/armedbear/lisp/Primitives.java trunk/abcl/src/org/armedbear/lisp/autoloads.lisp trunk/abcl/src/org/armedbear/lisp/boot.lisp trunk/abcl/src/org/armedbear/lisp/clos.lisp trunk/abcl/src/org/armedbear/lisp/compile-system.lisp trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp trunk/abcl/src/org/armedbear/lisp/concatenate.lisp trunk/abcl/src/org/armedbear/lisp/copy-seq.lisp trunk/abcl/src/org/armedbear/lisp/count.lisp trunk/abcl/src/org/armedbear/lisp/delete-duplicates.lisp trunk/abcl/src/org/armedbear/lisp/delete.lisp trunk/abcl/src/org/armedbear/lisp/fill.lisp trunk/abcl/src/org/armedbear/lisp/find.lisp trunk/abcl/src/org/armedbear/lisp/make-sequence.lisp trunk/abcl/src/org/armedbear/lisp/mismatch.lisp trunk/abcl/src/org/armedbear/lisp/reduce.lisp trunk/abcl/src/org/armedbear/lisp/remove-duplicates.lisp trunk/abcl/src/org/armedbear/lisp/remove.lisp trunk/abcl/src/org/armedbear/lisp/replace.lisp trunk/abcl/src/org/armedbear/lisp/search.lisp trunk/abcl/src/org/armedbear/lisp/sequences.lisp trunk/abcl/src/org/armedbear/lisp/setf.lisp trunk/abcl/src/org/armedbear/lisp/sort.lisp trunk/abcl/src/org/armedbear/lisp/substitute.lisp Modified: trunk/abcl/src/org/armedbear/lisp/BuiltInClass.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/BuiltInClass.java (original) +++ trunk/abcl/src/org/armedbear/lisp/BuiltInClass.java Wed Mar 3 16:05:41 2010 @@ -119,7 +119,6 @@ public static final BuiltInClass READTABLE = addClass(Symbol.READTABLE); public static final BuiltInClass REAL = addClass(Symbol.REAL); public static final BuiltInClass RESTART = addClass(Symbol.RESTART); - public static final BuiltInClass SEQUENCE = addClass(Symbol.SEQUENCE); public static final BuiltInClass SIMPLE_ARRAY = addClass(Symbol.SIMPLE_ARRAY); public static final BuiltInClass SIMPLE_BASE_STRING = addClass(Symbol.SIMPLE_BASE_STRING); public static final BuiltInClass SIMPLE_BIT_VECTOR = addClass(Symbol.SIMPLE_BIT_VECTOR); @@ -139,6 +138,10 @@ (StructureClass)addClass(Symbol.STRUCTURE_OBJECT, new StructureClass(Symbol.STRUCTURE_OBJECT, list(CLASS_T))); + public static final SlotClass SEQUENCE = + (SlotClass) addClass(Symbol.SEQUENCE, + new SlotClass(Symbol.SEQUENCE, list(CLASS_T))); + /* All the stream classes below are being defined as structure classes but won't be available as such until further action is taken: the 'defstruct' internal administration is missing. Modified: trunk/abcl/src/org/armedbear/lisp/Cons.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Cons.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Cons.java Wed Mar 3 16:05:41 2010 @@ -87,7 +87,7 @@ if (typeSpecifier == T) return T; } - else if (typeSpecifier instanceof BuiltInClass) + else if (typeSpecifier instanceof LispClass) { if (typeSpecifier == BuiltInClass.LIST) return T; Modified: trunk/abcl/src/org/armedbear/lisp/Lisp.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Lisp.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Lisp.java Wed Mar 3 16:05:41 2010 @@ -87,6 +87,8 @@ Packages.createPackage("XP"); public static final Package PACKAGE_PRECOMPILER = Packages.createPackage("PRECOMPILER"); + public static final Package PACKAGE_SEQUENCE = + Packages.createPackage("SEQUENCE"); // ### nil @@ -134,6 +136,7 @@ PACKAGE_PRECOMPILER.usePackage(PACKAGE_CL); PACKAGE_PRECOMPILER.usePackage(PACKAGE_EXT); PACKAGE_PRECOMPILER.usePackage(PACKAGE_SYS); + PACKAGE_SEQUENCE.usePackage(PACKAGE_CL); } // End-of-file marker. Modified: trunk/abcl/src/org/armedbear/lisp/Primitives.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Primitives.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Primitives.java Wed Mar 3 16:05:41 2010 @@ -462,7 +462,7 @@ private static final Primitive LENGTH = new pf_length(); private static final class pf_length extends Primitive { pf_length() { - super(Symbol.LENGTH, "sequence"); + super("%LENGTH", PACKAGE_SYS, false, "sequence"); } @Override @@ -475,7 +475,7 @@ private static final Primitive ELT = new pf_elt(); private static final class pf_elt extends Primitive { pf_elt() { - super(Symbol.ELT, "sequence index"); + super("%ELT", PACKAGE_SYS, false, "sequence index"); } @Override @@ -4159,7 +4159,7 @@ } }; - // ### call-count + // ### hot-count private static final Primitive HOT_COUNT = new pf_hot_count(); private static final class pf_hot_count extends Primitive { pf_hot_count() { @@ -4172,7 +4172,7 @@ } }; - // ### set-call-count + // ### set-hot-count private static final Primitive SET_HOT_COUNT = new pf_set_hot_count(); private static final class pf_set_hot_count extends Primitive { pf_set_hot_count() { @@ -4253,7 +4253,7 @@ private static final Primitive SUBSEQ = new pf_subseq(); private static final class pf_subseq extends Primitive { pf_subseq() { - super(Symbol.SUBSEQ, "sequence start &optional end"); + super(PACKAGE_SYS.intern("%SUBSEQ"), "sequence start &optional end"); } @Override @@ -4420,7 +4420,7 @@ public static final Primitive NREVERSE = new pf_nreverse(); private static final class pf_nreverse extends Primitive { pf_nreverse() { - super(Symbol.NREVERSE, "sequence"); + super("%NREVERSE", PACKAGE_SYS, false, "sequence"); } @Override @@ -4475,7 +4475,7 @@ private static final Primitive REVERSE = new pf_reverse(); private static final class pf_reverse extends Primitive { pf_reverse() { - super(Symbol.REVERSE, "sequence"); + super("%reverse", PACKAGE_SYS, false, "sequence"); } @Override Modified: trunk/abcl/src/org/armedbear/lisp/autoloads.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/autoloads.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/autoloads.lisp Wed Mar 3 16:05:41 2010 @@ -83,8 +83,10 @@ (autoload '(assoc assoc-if assoc-if-not rassoc rassoc-if rassoc-if-not acons pairlis copy-alist) "assoc") +(autoload-macro 'sequence::seq-dispatch "extensible-sequences-base") (autoload '(mapcan mapl maplist mapcon) "map1") (autoload 'make-sequence) +;(autoload 'sequence::fill "extensible-sequences") (autoload '(copy-seq fill replace)) (autoload '(map map-into)) (autoload 'reduce) Modified: trunk/abcl/src/org/armedbear/lisp/boot.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/boot.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/boot.lisp Wed Mar 3 16:05:41 2010 @@ -130,6 +130,22 @@ (sys::%format t "~A~%" condition) (ext:quit)) +;;Redefined in extensible-sequences.lisp +(defun length (sequence) + (%length sequence)) + +(defun elt (sequence index) + (%elt sequence index)) + +(defun subseq (sequence start &optional end) + (sys::%subseq sequence start end)) + +(defun reverse (sequence) + (sys::%reverse sequence)) + +(defun nreverse (sequence) + (sys::%nreverse sequence)) + (load-system-file "autoloads") (load-system-file "early-defuns") (load-system-file "backquote") @@ -161,11 +177,12 @@ (load-system-file "typep") (load-system-file "signal") (load-system-file "list") +(load-system-file "require") +(load-system-file "extensible-sequences-base") (load-system-file "sequences") (load-system-file "error") (load-system-file "defpackage") (load-system-file "define-modify-macro") -(load-system-file "require") (load-system-file "defstruct") ;; The actual stream and system-stream classes Modified: trunk/abcl/src/org/armedbear/lisp/clos.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/clos.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/clos.lisp Wed Mar 3 16:05:41 2010 @@ -2393,5 +2393,16 @@ ;; FIXME (defgeneric function-keywords (method)) +(defgeneric class-prototype (class)) + +(defmethod class-prototype :before (class) + (unless (class-finalized-p class) + (error "~@<~S is not finalized.~:@>" class))) + +(defmethod class-prototype ((class standard-class)) + (allocate-instance class)) + +(defmethod class-prototype ((class structure-class)) + (allocate-instance class)) (provide 'clos) Modified: trunk/abcl/src/org/armedbear/lisp/compile-system.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/compile-system.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/compile-system.lisp Wed Mar 3 16:05:41 2010 @@ -102,6 +102,8 @@ (load (do-compile "compiler-macro.lisp")) (load (do-compile "opcodes.lisp")) (load (do-compile "setf.lisp")) + (load (do-compile "extensible-sequences-base.lisp")) + (load (do-compile "require.lisp")) (load (do-compile "substitute.lisp")) (load (do-compile "clos.lisp")) ;; Order matters for these files. @@ -173,6 +175,7 @@ "enough-namestring.lisp" "ensure-directories-exist.lisp" "error.lisp" + "extensible-sequences.lisp" "featurep.lisp" "fdefinition.lisp" "fill.lisp" @@ -230,7 +233,6 @@ "remove-duplicates.lisp" "remove.lisp" "replace.lisp" - "require.lisp" "restart.lisp" "revappend.lisp" "rotatef.lisp" Modified: trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp Wed Mar 3 16:05:41 2010 @@ -2573,7 +2573,7 @@ (COMPLEXP "COMPLEXP") (DENOMINATOR "DENOMINATOR") (FIRST "car") - (LENGTH "LENGTH") + (SYS::%LENGTH "LENGTH") (NREVERSE "nreverse") (NUMERATOR "NUMERATOR") (REST "cdr") @@ -8588,7 +8588,6 @@ (with-saved-compiler-policy ;; Pass 1. (p1-compiland compiland) - ;; *all-variables* doesn't contain variables which ;; are in an enclosing lexical environment (variable-environment) ;; so we don't need to filter them out @@ -8896,7 +8895,7 @@ (install-p2-handler 'gethash1 'p2-gethash) (install-p2-handler 'go 'p2-go) (install-p2-handler 'if 'p2-if) - (install-p2-handler 'length 'p2-length) + (install-p2-handler 'sys::%length 'p2-length) (install-p2-handler 'list 'p2-list) (install-p2-handler 'sys::backq-list 'p2-list) (install-p2-handler 'list* 'p2-list*) Modified: trunk/abcl/src/org/armedbear/lisp/concatenate.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/concatenate.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/concatenate.lisp Wed Mar 3 16:05:41 2010 @@ -51,6 +51,7 @@ (setf (schar result i) (elt seq j)) (incf i))))))) +;;It uses make-sequence: it should already be user-extensible as-is (defun concatenate (result-type &rest sequences) (case result-type (LIST Modified: trunk/abcl/src/org/armedbear/lisp/copy-seq.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/copy-seq.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/copy-seq.lisp Wed Mar 3 16:05:41 2010 @@ -29,6 +29,8 @@ ;;; obligated to do so. If you do not wish to do so, delete this ;;; exception statement from your version. +(require "EXTENSIBLE-SEQUENCES-BASE") + (in-package "SYSTEM") ;; From CMUCL. @@ -51,6 +53,8 @@ result))))) (defun copy-seq (sequence) - (if (listp sequence) - (list-copy-seq sequence) - (vector-copy-seq sequence (type-of sequence)))) + "Return a copy of SEQUENCE which is EQUAL to SEQUENCE but not EQ." + (sequence::seq-dispatch sequence + (list-copy-seq sequence) + (vector-copy-seq sequence (type-of sequence)) + (sequence:copy-seq sequence))) \ No newline at end of file Modified: trunk/abcl/src/org/armedbear/lisp/count.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/count.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/count.lisp Wed Mar 3 16:05:41 2010 @@ -31,6 +31,8 @@ (in-package "COMMON-LISP") +(require "EXTENSIBLE-SEQUENCES-BASE") + ;;; From CMUCL. (defmacro vector-count-if (not-p from-end-p predicate sequence) @@ -56,7 +58,7 @@ (,(if not-p 'unless 'when) ,pred (setq count (1+ count))))))) -(defun count (item sequence &key from-end (test #'eql test-p) (test-not nil test-not-p) +(defun count (item sequence &rest args &key from-end (test #'eql test-p) (test-not nil test-not-p) (start 0) end key) (when (and test-p test-not-p) (error "test and test-not both supplied")) @@ -67,32 +69,35 @@ (not (funcall test-not item x))) (lambda (x) (funcall test item x))))) - (if (listp sequence) - (if from-end - (list-count-if nil t %test sequence) - (list-count-if nil nil %test sequence)) - (if from-end - (vector-count-if nil t %test sequence) - (vector-count-if nil nil %test sequence)))))) + (sequence::seq-dispatch sequence + (if from-end + (list-count-if nil t %test sequence) + (list-count-if nil nil %test sequence)) + (if from-end + (vector-count-if nil t %test sequence) + (vector-count-if nil nil %test sequence)) + (apply #'sequence:count item sequence args))))) -(defun count-if (test sequence &key from-end (start 0) end key) +(defun count-if (test sequence &rest args &key from-end (start 0) end key) (let* ((length (length sequence)) (end (or end length))) - (if (listp sequence) + (sequence::seq-dispatch sequence (if from-end (list-count-if nil t test sequence) (list-count-if nil nil test sequence)) (if from-end (vector-count-if nil t test sequence) - (vector-count-if nil nil test sequence))))) + (vector-count-if nil nil test sequence)) + (apply #'sequence:count-if test sequence args)))) -(defun count-if-not (test sequence &key from-end (start 0) end key) +(defun count-if-not (test sequence &rest args &key from-end (start 0) end key) (let* ((length (length sequence)) (end (or end length))) - (if (listp sequence) + (sequence::seq-dispatch sequence (if from-end (list-count-if t t test sequence) (list-count-if t nil test sequence)) (if from-end (vector-count-if t t test sequence) - (vector-count-if t nil test sequence))))) + (vector-count-if t nil test sequence)) + (apply #'sequence:count-if-not test sequence args)))) Modified: trunk/abcl/src/org/armedbear/lisp/delete-duplicates.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/delete-duplicates.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/delete-duplicates.lisp Wed Mar 3 16:05:41 2010 @@ -31,6 +31,8 @@ (in-package "SYSTEM") +(require "EXTENSIBLE-SEQUENCES-BASE") + ;;; From CMUCL. (defun list-delete-duplicates* (list test test-not key from-end start end) @@ -79,10 +81,10 @@ :end (if from-end jndex end) :test-not test-not) (setq jndex (1+ jndex))))) - -(defun delete-duplicates (sequence &key (test #'eql) test-not (start 0) from-end - end key) - (if (listp sequence) - (if sequence - (list-delete-duplicates* sequence test test-not key from-end start end)) - (vector-delete-duplicates* sequence test test-not key from-end start end))) +(defun delete-duplicates (sequence &rest args &key (test #'eql) test-not + (start 0) from-end end key) + (sequence::seq-dispatch sequence + (if sequence + (list-delete-duplicates* sequence test test-not key from-end start end)) + (vector-delete-duplicates* sequence test test-not key from-end start end) + (apply #'sequence:delete-duplicates sequence args))) Modified: trunk/abcl/src/org/armedbear/lisp/delete.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/delete.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/delete.lisp Wed Mar 3 16:05:41 2010 @@ -31,6 +31,8 @@ (in-package "SYSTEM") +(require "EXTENSIBLE-SEQUENCES-BASE") + ;;; From CMUCL. (defmacro real-count (count) @@ -133,20 +135,21 @@ (not (funcall test-not item (funcall-key key (car current)))) (funcall test item (funcall-key key (car current)))))) -(defun delete (item sequence &key from-end (test #'eql) test-not (start 0) - end count key) +(defun delete (item sequence &rest args &key from-end (test #'eql) test-not + (start 0) end count key) (when key (setq key (coerce-to-function key))) (let* ((length (length sequence)) (end (or end length)) (count (real-count count))) - (if (listp sequence) - (if from-end - (normal-list-delete-from-end) - (normal-list-delete)) - (if from-end - (normal-mumble-delete-from-end) - (normal-mumble-delete))))) + (sequence::seq-dispatch sequence + (if from-end + (normal-list-delete-from-end) + (normal-list-delete)) + (if from-end + (normal-mumble-delete-from-end) + (normal-mumble-delete)) + (apply #'sequence:delete item sequence args)))) (defmacro if-mumble-delete () `(mumble-delete @@ -164,19 +167,21 @@ '(list-delete-from-end (funcall predicate (funcall-key key (car current))))) -(defun delete-if (predicate sequence &key from-end (start 0) key end count) +(defun delete-if (predicate sequence &rest args &key from-end (start 0) + key end count) (when key (setq key (coerce-to-function key))) (let* ((length (length sequence)) (end (or end length)) (count (real-count count))) - (if (listp sequence) - (if from-end - (if-list-delete-from-end) - (if-list-delete)) - (if from-end - (if-mumble-delete-from-end) - (if-mumble-delete))))) + (sequence::seq-dispatch sequence + (if from-end + (if-list-delete-from-end) + (if-list-delete)) + (if from-end + (if-mumble-delete-from-end) + (if-mumble-delete)) + (apply #'sequence:delete-if predicate sequence args)))) (defmacro if-not-mumble-delete () `(mumble-delete @@ -194,16 +199,18 @@ '(list-delete-from-end (not (funcall predicate (funcall-key key (car current)))))) -(defun delete-if-not (predicate sequence &key from-end (start 0) end key count) +(defun delete-if-not (predicate sequence &rest args &key from-end (start 0) + end key count) (when key (setq key (coerce-to-function key))) (let* ((length (length sequence)) (end (or end length)) (count (real-count count))) - (if (listp sequence) - (if from-end - (if-not-list-delete-from-end) - (if-not-list-delete)) - (if from-end - (if-not-mumble-delete-from-end) - (if-not-mumble-delete))))) + (sequence::seq-dispatch sequence + (if from-end + (if-not-list-delete-from-end) + (if-not-list-delete)) + (if from-end + (if-not-mumble-delete-from-end) + (if-not-mumble-delete)) + (apply #'sequence:delete-if-not predicate sequence args)))) Added: trunk/abcl/src/org/armedbear/lisp/extensible-sequences-base.lisp ============================================================================== --- (empty file) +++ trunk/abcl/src/org/armedbear/lisp/extensible-sequences-base.lisp Wed Mar 3 16:05:41 2010 @@ -0,0 +1,102 @@ +;;;This file only defines the minimum set of symbols and operators +;;;that is needed to make standard CL sequence functions refer to generic +;;;functions in the SEQUENCE package, without actually definining those +;;;generic functions and supporting code, which is in extensible-sequences.lisp. +;;; +;;;The rationale for splitting the code this way is that CLOS depends on +;;;some sequence functions, and if those in turn depend on CLOS we have +;;;a circular dependency. + +(in-package :sequence) + +(shadow '(ELT LENGTH COUNT "COUNT-IF" "COUNT-IF-NOT" + "FIND" "FIND-IF" "FIND-IF-NOT" + "POSITION" "POSITION-IF" "POSITION-IF-NOT" + "SUBSEQ" "COPY-SEQ" "FILL" + "NSUBSTITUTE" "NSUBSTITUTE-IF" "NSUBSTITUTE-IF-NOT" + "SUBSTITUTE" "SUBSTITUTE-IF" "SUBSTITUTE-IF-NOT" + "REPLACE" "REVERSE" "NREVERSE" "REDUCE" + "MISMATCH" "SEARCH" + "DELETE" "DELETE-IF" "DELETE-IF-NOT" + "REMOVE" "REMOVE-IF" "REMOVE-IF-NOT" + "DELETE-DUPLICATES" "REMOVE-DUPLICATES" "SORT" "STABLE-SORT")) + +(export '(DOSEQUENCE + + MAKE-SEQUENCE-ITERATOR MAKE-SIMPLE-SEQUENCE-ITERATOR + + ITERATOR-STEP ITERATOR-ENDP ITERATOR-ELEMENT + ITERATOR-INDEX ITERATOR-COPY + + WITH-SEQUENCE-ITERATOR WITH-SEQUENCE-ITERATOR-FUNCTIONS + + CANONIZE-TEST CANONIZE-KEY + + LENGTH ELT + MAKE-SEQUENCE-LIKE ADJUST-SEQUENCE + + COUNT COUNT-IF COUNT-IF-NOT + FIND FIND-IF FIND-IF-NOT + POSITION POSITION-IF POSITION-IF-NOT + SUBSEQ COPY-SEQ FILL + NSUBSTITUTE NSUBSTITUTE-IF NSUBSTITUTE-IF-NOT + SUBSTITUTE SUBSTITUTE-IF SUBSTITUTE-IF-NOT + REPLACE REVERSE NREVERSE REDUCE + MISMATCH SEARCH + DELETE DELETE-IF DELETE-IF-NOT + REMOVE REMOVE-IF REMOVE-IF-NOT + DELETE-DUPLICATES REMOVE-DUPLICATES SORT STABLE-SORT)) + +;;; Adapted from SBCL +;;; SEQ-DISPATCH does an efficient type-dispatch on the given SEQUENCE. +;;; +;;; FIXME: It might be worth making three cases here, LIST, +;;; SIMPLE-VECTOR, and VECTOR, instead of the current LIST and VECTOR. +;;; It tends to make code run faster but be bigger; some benchmarking +;;; is needed to decide. +(defmacro seq-dispatch + (sequence list-form array-form &optional other-form) + `(if (listp ,sequence) + (let ((,sequence (ext:truly-the list ,sequence))) + (declare (ignorable ,sequence)) + ,list-form) + ,@(if other-form + `((if (arrayp ,sequence) + (let ((,sequence (ext:truly-the vector ,sequence))) + (declare (ignorable ,sequence)) + ,array-form) + (if (typep ,sequence 'sequence) + ,other-form + (error 'type-error + :datum ,sequence :expected-type 'sequence)))) + `((let ((,sequence (ext:truly-the vector ,sequence))) + (declare (ignorable ,sequence)) + ,array-form))))) + +(defun %check-generic-sequence-bounds (seq start end) + (let ((length (sequence:length seq))) + (if (<= 0 start (or end length) length) + (or end length) + (sequence-bounding-indices-bad-error seq start end)))) + +(defun sequence-bounding-indices-bad-error (sequence start end) + (let ((size (length sequence))) + (error "The bounding indices ~S and ~S are bad for a sequence of length ~S" + start end size))) + +(defun %set-elt (sequence index value) + (seq-dispatch sequence + (sys::%set-elt sequence index value) + (sys::%set-elt sequence index value) + (setf (sequence:elt sequence index) value))) + +(defsetf cl:elt %set-elt) + +#| + (error 'bounding-indices-bad-error + :datum (cons start end) + :expected-type `(cons (integer 0 ,size) + (integer ,start ,size)) + :object sequence)))|# + +(provide "EXTENSIBLE-SEQUENCES-BASE") \ No newline at end of file Added: trunk/abcl/src/org/armedbear/lisp/extensible-sequences.lisp ============================================================================== --- (empty file) +++ trunk/abcl/src/org/armedbear/lisp/extensible-sequences.lisp Wed Mar 3 16:05:41 2010 @@ -0,0 +1,982 @@ +;;;Extensible Sequences for ABCL based on the SBCL API + +(in-package :sequence) + +(require "CLOS") +(require "EXTENSIBLE-SEQUENCES-BASE") +(require "LOOP") + +#|| +We specify generic functions length, elt and (setf elt) +to correspond to the Common Lisp functions with the same +name. In each case, there are two primary methods with the +sequence argument specialized on list and on vector, pro- +viding the standard-defined behaviour for the Common Lisp +operator, and a third method with the sequence argument +specialized on sequence, which signals an error of type type- +error, for compatibility with the standard requirement of +the sequence argument to be a proper sequence. +||# + +(fmakunbound 'length) +(defgeneric length (sequence) + (:documentation "Extension point for user-defined sequences. Invoked by cl:length.")) + +(defmethod length ((sequence sequence)) + (error 'type-error :datum sequence :expected-type 'proper-sequence)) + +(defmethod length ((sequence vector)) + (sys::%length sequence)) + +(defmethod length ((sequence list)) + (sys::%length sequence)) + +(defmethod length (sequence) + (error 'type-error :datum sequence :expected-type 'sequence)) + +(defun cl:length (sequence) + (seq-dispatch sequence + (sys::%length sequence) + (sys::%length sequence) + (length sequence))) + +(defgeneric elt (sequence index)) + +(defmethod elt ((sequence vector) index) + (sys::%elt sequence index)) + +(defmethod elt ((sequence list) index) + (sys::%elt sequence index)) + +(defmethod elt ((sequence sequence) index) + (declare (ignore index)) + (error 'type-error :datum sequence :expected-type 'proper-sequence)) + +(defmethod elt (sequence index) + (declare (ignore index)) + (error 'type-error :datum sequence :expected-type 'sequence)) + +(defun cl:elt (sequence index) + (seq-dispatch sequence + (sys::%elt sequence index) + (sys::%elt sequence index) + (elt sequence index))) + +(defgeneric (setf elt) (value sequence index)) + +(defmethod (setf elt) (value (sequence vector) index) + (sys::%set-elt sequence index value)) + +(defmethod (setf elt) (value (sequence list) index) + (sys::%set-elt sequence index value)) + +(defmethod (setf elt) (value (sequence sequence) index) + (declare (ignore index value)) + (error 'type-error :datum sequence :expected-type 'proper-sequence)) + +(defmethod (setf elt) (value sequence index) + (declare (ignore index value)) + (error 'type-error :datum sequence :expected-type 'sequence)) + +(defun cl:subseq (sequence start &optional end) + "Return a copy of a subsequence of SEQUENCE starting with element number + START and continuing to the end of SEQUENCE or the optional END." + (seq-dispatch sequence + (sys::%subseq sequence start end) + (sys::%subseq sequence start end) + (sequence:subseq sequence start end))) + +(defun cl:reverse (sequence) + (seq-dispatch sequence + (sys::%reverse sequence) + (sys::%reverse sequence) + (sequence:reverse sequence))) + +(defun cl:nreverse (sequence) + (seq-dispatch sequence + (sys::%nreverse sequence) + (sys::%nreverse sequence) + (sequence:nreverse sequence))) + +;;;Adapted from SBCL +(define-condition sequence::protocol-unimplemented (type-error) + ()) + +(defun sequence::protocol-unimplemented (sequence) + (error 'sequence::protocol-unimplemented + :datum sequence :expected-type '(or list vector))) + +(defgeneric sequence:make-sequence-like + (sequence length &key initial-element initial-contents) + (:method ((s list) length &key + (initial-element nil iep) (initial-contents nil icp)) + (cond + ((and icp iep) (error "Can't specify both :initial-element and :initial-contents")) + (iep (make-list length :initial-element initial-element)) + (icp (unless (= (length initial-contents) length) + (error "initial-contents is of length ~S but should be of the same length of the input sequence (~S)" (length initial-contents) length)) + (let ((result (make-list length))) + (replace result initial-contents) + result)) + (t (make-list length)))) + (:method ((s vector) length &key + (initial-element nil iep) (initial-contents nil icp)) + (cond + ((and icp iep) (error "Can't specify both :initial-element and :initial-contents")) + (iep (make-array length :element-type (array-element-type s) + :initial-element initial-element)) + (icp (make-array length :element-type (array-element-type s) + :initial-contents initial-contents)) + (t (make-array length :element-type (array-element-type s))))) + (:method ((s sequence) length &key initial-element initial-contents) + (declare (ignore initial-element initial-contents)) + (sequence::protocol-unimplemented s))) + +(defgeneric sequence:adjust-sequence + (sequence length &key initial-element initial-contents) + (:method ((s list) length &key initial-element (initial-contents nil icp)) + (if (eql length 0) + nil + (let ((olength (length s))) + (cond + ((eql length olength) (if icp (replace s initial-contents) s)) + ((< length olength) + (rplacd (nthcdr (1- length) s) nil) + (if icp (replace s initial-contents) s)) + ((null s) + (let ((return (make-list length :initial-element initial-element))) + (if icp (replace return initial-contents) return))) + (t (rplacd (nthcdr (1- olength) s) + (make-list (- length olength) + :initial-element initial-element)) + (if icp (replace s initial-contents) s)))))) + (:method ((s vector) length &rest args &key (initial-contents nil icp) initial-element) + (declare (ignore initial-element)) + (cond + ((and (array-has-fill-pointer-p s) + (>= (array-total-size s) length)) + (setf (fill-pointer s) length) + (if icp (replace s initial-contents) s)) + ((eql (length s) length) + (if icp (replace s initial-contents) s)) + (t (apply #'adjust-array s length args)))) + (:method (new-value (s sequence) &rest args) + (declare (ignore args)) + (sequence::protocol-unimplemented s))) + +;;;; iterator protocol + +;;; The general protocol + +(defgeneric sequence:make-sequence-iterator (sequence &key from-end start end) + (:method ((s sequence) &key from-end (start 0) end) + (multiple-value-bind (iterator limit from-end) + (sequence:make-simple-sequence-iterator + s :from-end from-end :start start :end end) + (values iterator limit from-end + #'sequence:iterator-step #'sequence:iterator-endp + #'sequence:iterator-element #'(setf sequence:iterator-element) + #'sequence:iterator-index #'sequence:iterator-copy))) + (:method ((s t) &key from-end start end) + (declare (ignore from-end start end)) + (error 'type-error + :datum s + :expected-type 'sequence))) + +;;; the simple protocol: the simple iterator returns three values, +;;; STATE, LIMIT and FROM-END. + +;;; magic termination value for list :from-end t +(defvar *exhausted* (cons nil nil)) + +(defgeneric sequence:make-simple-sequence-iterator + (sequence &key from-end start end) + (:method ((s list) &key from-end (start 0) end) + (if from-end + (let* ((termination (if (= start 0) *exhausted* (nthcdr (1- start) s))) + (init (if (<= (or end (length s)) start) + termination + (if end (last s (- (length s) (1- end))) (last s))))) + (values init termination t)) + (cond + ((not end) (values (nthcdr start s) nil nil)) + (t (let ((st (nthcdr start s))) + (values st (nthcdr (- end start) st) nil)))))) + (:method ((s vector) &key from-end (start 0) end) + (let ((end (or end (length s)))) + (if from-end + (values (1- end) (1- start) t) + (values start end nil)))) + (:method ((s sequence) &key from-end (start 0) end) + (let ((end (or end (length s)))) + (if from-end + (values (1- end) (1- start) from-end) + (values start end nil))))) + +(defgeneric sequence:iterator-step (sequence iterator from-end) + (:method ((s list) iterator from-end) + (if from-end + (if (eq iterator s) + *exhausted* + (do* ((xs s (cdr xs))) + ((eq (cdr xs) iterator) xs))) + (cdr iterator))) + (:method ((s vector) iterator from-end) + (if from-end + (1- iterator) + (1+ iterator))) + (:method ((s sequence) iterator from-end) + (if from-end + (1- iterator) + (1+ iterator)))) + +(defgeneric sequence:iterator-endp (sequence iterator limit from-end) + (:method ((s list) iterator limit from-end) + (eq iterator limit)) + (:method ((s vector) iterator limit from-end) + (= iterator limit)) + (:method ((s sequence) iterator limit from-end) + (= iterator limit))) + +(defgeneric sequence:iterator-element (sequence iterator) + (:method ((s list) iterator) + (car iterator)) + (:method ((s vector) iterator) + (aref s iterator)) + (:method ((s sequence) iterator) + (elt s iterator))) + +(defgeneric (setf sequence:iterator-element) (new-value sequence iterator) + (:method (o (s list) iterator) + (setf (car iterator) o)) + (:method (o (s vector) iterator) + (setf (aref s iterator) o)) + (:method (o (s sequence) iterator) + (setf (elt s iterator) o))) + +(defgeneric sequence:iterator-index (sequence iterator) + (:method ((s list) iterator) + ;; FIXME: this sucks. (In my defence, it is the equivalent of the + ;; Apple implementation in Dylan...) + (loop for l on s for i from 0 when (eq l iterator) return i)) + (:method ((s vector) iterator) iterator) + (:method ((s sequence) iterator) iterator)) + +(defgeneric sequence:iterator-copy (sequence iterator) + (:method ((s list) iterator) iterator) + (:method ((s vector) iterator) iterator) + (:method ((s sequence) iterator) iterator)) + +(defmacro sequence:with-sequence-iterator + ((&rest vars) (s &rest args &key from-end start end) &body body) + (declare (ignore from-end start end)) + `(multiple-value-bind (, at vars) (sequence:make-sequence-iterator ,s , at args) + (declare (type function ,@(nthcdr 3 vars))) + , at body)) + +(defmacro sequence:with-sequence-iterator-functions + ((step endp elt setf index copy) + (s &rest args &key from-end start end) + &body body) + (declare (ignore from-end start end)) + (let ((nstate (gensym "STATE")) (nlimit (gensym "LIMIT")) + (nfrom-end (gensym "FROM-END-")) (nstep (gensym "STEP")) + (nendp (gensym "ENDP")) (nelt (gensym "ELT")) + (nsetf (gensym "SETF")) (nindex (gensym "INDEX")) + (ncopy (gensym "COPY"))) + `(sequence:with-sequence-iterator + (,nstate ,nlimit ,nfrom-end ,nstep ,nendp ,nelt ,nsetf ,nindex ,ncopy) + (,s , at args) + (flet ((,step () (setq ,nstate (funcall ,nstep ,s ,nstate ,nfrom-end))) + (,endp () (funcall ,nendp ,s ,nstate ,nlimit ,nfrom-end)) + (,elt () (funcall ,nelt ,s ,nstate)) + (,setf (new-value) (funcall ,nsetf new-value ,s ,nstate)) + (,index () (funcall ,nindex ,s ,nstate)) + (,copy () (funcall ,ncopy ,s ,nstate))) + (declare (truly-dynamic-extent #',step #',endp #',elt + #',setf #',index #',copy)) + , at body)))) + +(defun sequence:canonize-test (test test-not) + (cond + (test (if (functionp test) test (fdefinition test))) + (test-not (if (functionp test-not) + (complement test-not) + (complement (fdefinition test-not)))) + (t #'eql))) + +(defun sequence:canonize-key (key) + (or (and key (if (functionp key) key (fdefinition key))) #'identity)) + +;;;; generic implementations for sequence functions. + +;;; FIXME: COUNT, POSITION and FIND share an awful lot of structure. +;;; They could usefully be defined in an OAOO way. +(defgeneric sequence:count + (item sequence &key from-end start end test test-not key) + (:argument-precedence-order sequence item)) +(defmethod sequence:count + (item (sequence sequence) &key from-end (start 0) end test test-not key) + (let ((test (sequence:canonize-test test test-not)) + (key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :from-end from-end :start start :end end) + (do ((count 0)) + ((funcall endp sequence state limit from-end) count) + (let ((o (funcall elt sequence state))) + (when (funcall test item (funcall key o)) + (incf count)) + (setq state (funcall step sequence state from-end))))))) + +(defgeneric sequence:count-if (pred sequence &key from-end start end key) + (:argument-precedence-order sequence pred)) +(defmethod sequence:count-if + (pred (sequence sequence) &key from-end (start 0) end key) + (let ((key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :from-end from-end :start start :end end) + (do ((count 0)) + ((funcall endp sequence state limit from-end) count) + (let ((o (funcall elt sequence state))) + (when (funcall pred (funcall key o)) + (incf count)) + (setq state (funcall step sequence state from-end))))))) + +(defgeneric sequence:count-if-not (pred sequence &key from-end start end key) + (:argument-precedence-order sequence pred)) +(defmethod sequence:count-if-not + (pred (sequence sequence) &key from-end (start 0) end key) + (let ((key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :from-end from-end :start start :end end) + (do ((count 0)) + ((funcall endp sequence state limit from-end) count) + (let ((o (funcall elt sequence state))) + (unless (funcall pred (funcall key o)) + (incf count)) + (setq state (funcall step sequence state from-end))))))) + +(defgeneric sequence:find + (item sequence &key from-end start end test test-not key) + (:argument-precedence-order sequence item)) +(defmethod sequence:find + (item (sequence sequence) &key from-end (start 0) end test test-not key) + (let ((test (sequence:canonize-test test test-not)) + (key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :from-end from-end :start start :end end) + (do () + ((funcall endp sequence state limit from-end) nil) + (let ((o (funcall elt sequence state))) + (when (funcall test item (funcall key o)) + (return o)) + (setq state (funcall step sequence state from-end))))))) + +(defgeneric sequence:find-if (pred sequence &key from-end start end key) + (:argument-precedence-order sequence pred)) +(defmethod sequence:find-if + (pred (sequence sequence) &key from-end (start 0) end key) + (let ((key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :from-end from-end :start start :end end) + (do () + ((funcall endp sequence state limit from-end) nil) + (let ((o (funcall elt sequence state))) + (when (funcall pred (funcall key o)) + (return o)) + (setq state (funcall step sequence state from-end))))))) + +(defgeneric sequence:find-if-not (pred sequence &key from-end start end key) + (:argument-precedence-order sequence pred)) +(defmethod sequence:find-if-not + (pred (sequence sequence) &key from-end (start 0) end key) + (let ((key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :from-end from-end :start start :end end) + (do () + ((funcall endp sequence state limit from-end) nil) + (let ((o (funcall elt sequence state))) + (unless (funcall pred (funcall key o)) + (return o)) + (setq state (funcall step sequence state from-end))))))) + +(defgeneric sequence:position + (item sequence &key from-end start end test test-not key) + (:argument-precedence-order sequence item)) +(defmethod sequence:position + (item (sequence sequence) &key from-end (start 0) end test test-not key) + (let ((test (sequence:canonize-test test test-not)) + (key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :from-end from-end :start start :end end) + (do ((s (if from-end -1 1)) + (pos (if from-end (1- (or end (length sequence))) start) (+ pos s))) + ((funcall endp sequence state limit from-end) nil) + (let ((o (funcall elt sequence state))) + (when (funcall test item (funcall key o)) + (return pos)) + (setq state (funcall step sequence state from-end))))))) + +(defgeneric sequence:position-if (pred sequence &key from-end start end key) + (:argument-precedence-order sequence pred)) +(defmethod sequence:position-if + (pred (sequence sequence) &key from-end (start 0) end key) + (let ((key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :from-end from-end :start start :end end) + (do ((s (if from-end -1 1)) + (pos (if from-end (1- (or end (length sequence))) start) (+ pos s))) + ((funcall endp sequence state limit from-end) nil) + (let ((o (funcall elt sequence state))) + (when (funcall pred (funcall key o)) + (return pos)) + (setq state (funcall step sequence state from-end))))))) + +(defgeneric sequence:position-if-not + (pred sequence &key from-end start end key) + (:argument-precedence-order sequence pred)) +(defmethod sequence:position-if-not + (pred (sequence sequence) &key from-end (start 0) end key) + (let ((key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :from-end from-end :start start :end end) + (do ((s (if from-end -1 1)) + (pos (if from-end (1- (or end (length sequence))) start) (+ pos s))) + ((funcall endp sequence state limit from-end) nil) + (let ((o (funcall elt sequence state))) + (unless (funcall pred (funcall key o)) + (return pos)) + (setq state (funcall step sequence state from-end))))))) + +(defgeneric sequence:subseq (sequence start &optional end)) +(defmethod sequence:subseq ((sequence sequence) start &optional end) + (let* ((end (or end (length sequence))) + (length (- end start)) + (result (sequence:make-sequence-like sequence length))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :start start :end end) + (declare (ignore limit endp)) + (sequence:with-sequence-iterator (rstate rlimit rfrom-end rstep rendp relt rsetelt) + (result) + (declare (ignore rlimit rendp relt)) + (do ((i 0 (+ i 1))) + ((>= i length) result) + (funcall rsetelt (funcall elt sequence state) result rstate) + (setq state (funcall step sequence state from-end)) + (setq rstate (funcall rstep result rstate rfrom-end))))))) + +(defgeneric sequence:copy-seq (sequence)) +(defmethod sequence:copy-seq ((sequence sequence)) + (sequence:subseq sequence 0)) + +(fmakunbound 'sequence:fill) +(defgeneric sequence:fill (sequence item &key start end)) +(defmethod sequence:fill ((sequence sequence) item &key (start 0) end) + (sequence:with-sequence-iterator (state limit from-end step endp elt setelt) + (sequence :start start :end end) + (declare (ignore elt)) + (do () + ((funcall endp sequence state limit from-end) sequence) + (funcall setelt item sequence state) + (setq state (funcall step sequence state from-end))))) + +(defgeneric sequence:nsubstitute + (new old sequence &key start end from-end test test-not count key) + (:argument-precedence-order sequence new old)) +(defmethod sequence:nsubstitute (new old (sequence sequence) &key (start 0) + end from-end test test-not count key) + (let ((test (sequence:canonize-test test test-not)) + (key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt setelt) + (sequence :start start :end end :from-end from-end) + (do ((c 0)) + ((or (and count (>= c count)) + (funcall endp sequence state limit from-end)) + sequence) + (when (funcall test old (funcall key (funcall elt sequence state))) + (incf c) + (funcall setelt new sequence state)) + (setq state (funcall step sequence state from-end)))))) + +(defgeneric sequence:nsubstitute-if + (new predicate sequence &key start end from-end count key) + (:argument-precedence-order sequence new predicate)) +(defmethod sequence:nsubstitute-if + (new predicate (sequence sequence) &key (start 0) end from-end count key) + (let ((key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt setelt) + (sequence :start start :end end :from-end from-end) + (do ((c 0)) + ((or (and count (>= c count)) + (funcall endp sequence state limit from-end)) + sequence) + (when (funcall predicate (funcall key (funcall elt sequence state))) + (incf c) + (funcall setelt new sequence state)) + (setq state (funcall step sequence state from-end)))))) + +(defgeneric sequence:nsubstitute-if-not + (new predicate sequence &key start end from-end count key) + (:argument-precedence-order sequence new predicate)) +(defmethod sequence:nsubstitute-if-not + (new predicate (sequence sequence) &key (start 0) end from-end count key) + (let ((key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt setelt) + (sequence :start start :end end :from-end from-end) + (do ((c 0)) + ((or (and count (>= c count)) + (funcall endp sequence state limit from-end)) + sequence) + (unless (funcall predicate (funcall key (funcall elt sequence state))) + (incf c) + (funcall setelt new sequence state)) + (setq state (funcall step sequence state from-end)))))) + +(defgeneric sequence:substitute + (new old sequence &key start end from-end test test-not count key) + (:argument-precedence-order sequence new old)) +(defmethod sequence:substitute (new old (sequence sequence) &rest args &key + (start 0) end from-end test test-not count key) + (declare (truly-dynamic-extent args)) + (declare (ignore start end from-end test test-not count key)) + (let ((result (copy-seq sequence))) + (apply #'sequence:nsubstitute new old result args))) + +(defgeneric sequence:substitute-if + (new predicate sequence &key start end from-end count key) + (:argument-precedence-order sequence new predicate)) +(defmethod sequence:substitute-if (new predicate (sequence sequence) &rest args + &key (start 0) end from-end count key) + (declare (truly-dynamic-extent args)) + (declare (ignore start end from-end count key)) + (let ((result (copy-seq sequence))) + (apply #'sequence:nsubstitute-if new predicate result args))) + +(defgeneric sequence:substitute-if-not + (new predicate sequence &key start end from-end count key) + (:argument-precedence-order sequence new predicate)) +(defmethod sequence:substitute-if-not + (new predicate (sequence sequence) &rest args &key + (start 0) end from-end count key) + (declare (truly-dynamic-extent args)) + (declare (ignore start end from-end count key)) + (let ((result (copy-seq sequence))) + (apply #'sequence:nsubstitute-if-not new predicate result args))) + +(defun %sequence-replace (sequence1 sequence2 start1 end1 start2 end2) + (sequence:with-sequence-iterator (state1 limit1 from-end1 step1 endp1 elt1 setelt1) + (sequence1 :start start1 :end end1) + (declare (ignore elt1)) + (sequence:with-sequence-iterator (state2 limit2 from-end2 step2 endp2 elt2) + (sequence2 :start start2 :end end2) + (do () + ((or (funcall endp1 sequence1 state1 limit1 from-end1) + (funcall endp2 sequence2 state2 limit2 from-end2)) + sequence1) + (funcall setelt1 (funcall elt2 sequence2 state2) sequence1 state1) + (setq state1 (funcall step1 sequence1 state1 from-end1)) + (setq state2 (funcall step2 sequence2 state2 from-end2)))))) + +(defgeneric sequence:replace + (sequence1 sequence2 &key start1 end1 start2 end2) + (:argument-precedence-order sequence2 sequence1)) +(defmethod sequence:replace + ((sequence1 sequence) (sequence2 sequence) &key + (start1 0) end1 (start2 0) end2) + (print sequence1) + (print sequence2) + (cond + ((eq sequence1 sequence2) + (let ((replaces (subseq sequence2 start2 end2))) + (%sequence-replace sequence1 replaces start1 end1 0 nil))) + (t (%sequence-replace sequence1 sequence2 start1 end1 start2 end2)))) + +(defgeneric sequence:nreverse (sequence)) +(defmethod sequence:nreverse ((sequence sequence)) + ;; FIXME: this, in particular the :from-end iterator, will suck + ;; mightily if the user defines a list-like structure. + (let ((length (length sequence))) + (sequence:with-sequence-iterator (state1 limit1 from-end1 step1 endp1 elt1 setelt1) + (sequence :end (floor length 2)) + (sequence:with-sequence-iterator (state2 limit2 from-end2 step2 endp2 elt2 setelt2) + (sequence :start (ceiling length 2) :from-end t) + (declare (ignore limit2 endp2)) + (do () + ((funcall endp1 sequence state1 limit1 from-end1) sequence) + (let ((x (funcall elt1 sequence state1)) + (y (funcall elt2 sequence state2))) + (funcall setelt1 y sequence state1) + (funcall setelt2 x sequence state2)) + (setq state1 (funcall step1 sequence state1 from-end1)) + (setq state2 (funcall step2 sequence state2 from-end2))))))) + +(defgeneric sequence:reverse (sequence)) +(defmethod sequence:reverse ((sequence sequence)) + (let ((result (copy-seq sequence))) + (sequence:nreverse result))) + +(defgeneric sequence:reduce + (function sequence &key from-end start end initial-value) + (:argument-precedence-order sequence function)) +(defmethod sequence:reduce + (function (sequence sequence) &key from-end (start 0) end key + (initial-value nil ivp)) + (let ((key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence :start start :end end :from-end from-end) + (if (funcall endp sequence state limit from-end) + (if ivp initial-value (funcall function)) + (do* ((state state (funcall step sequence state from-end)) + (value (cond + (ivp initial-value) + (t (prog1 + (funcall key (funcall elt sequence state)) + (setq state (funcall step sequence state from-end))))))) + ((funcall endp sequence state limit from-end) value) + (let ((e (funcall key (funcall elt sequence state)))) + (if from-end + (setq value (funcall function e value)) + (setq value (funcall function value e))))))))) + +(defgeneric sequence:mismatch (sequence1 sequence2 &key from-end start1 end1 + start2 end2 test test-not key)) +(defmethod sequence:mismatch + ((sequence1 sequence) (sequence2 sequence) &key from-end (start1 0) end1 + (start2 0) end2 test test-not key) + (let ((test (sequence:canonize-test test test-not)) + (key (sequence:canonize-key key))) + (sequence:with-sequence-iterator (state1 limit1 from-end1 step1 endp1 elt1) + (sequence1 :start start1 :end end1 :from-end from-end) + (sequence:with-sequence-iterator (state2 limit2 from-end2 step2 endp2 elt2) + (sequence2 :start start2 :end end2 :from-end from-end) + (if from-end + (do ((result (or end1 (length sequence1)) (1- result)) + (e1 (funcall endp1 sequence1 state1 limit1 from-end1) + (funcall endp1 sequence1 state1 limit1 from-end1)) + (e2 (funcall endp2 sequence2 state2 limit2 from-end2) + (funcall endp2 sequence2 state2 limit2 from-end2))) + ((or e1 e2) (if (and e1 e2) nil result)) + (let ((o1 (funcall key (funcall elt1 sequence1 state1))) + (o2 (funcall key (funcall elt2 sequence2 state2)))) + (unless (funcall test o1 o2) + (return result)) + (setq state1 (funcall step1 sequence1 state1 from-end1)) + (setq state2 (funcall step2 sequence2 state2 from-end2)))) + (do ((result start1 (1+ result)) + (e1 (funcall endp1 sequence1 state1 limit1 from-end1) + (funcall endp1 sequence1 state1 limit1 from-end1)) + (e2 (funcall endp2 sequence2 state2 limit2 from-end2) + (funcall endp2 sequence2 state2 limit2 from-end2))) + ((or e1 e2) (if (and e1 e2) nil result)) + (let ((o1 (funcall key (funcall elt1 sequence1 state1))) + (o2 (funcall key (funcall elt2 sequence2 state2)))) + (unless (funcall test o1 o2) + (return result))) + (setq state1 (funcall step1 sequence1 state1 from-end1)) + (setq state2 (funcall step2 sequence2 state2 from-end2)))))))) + +(defgeneric sequence:search (sequence1 sequence2 &key from-end start1 end1 + start2 end2 test test-not key)) +(defmethod sequence:search + ((sequence1 sequence) (sequence2 sequence) &key from-end (start1 0) end1 + (start2 0) end2 test test-not key) + (let ((test (sequence:canonize-test test test-not)) + (key (sequence:canonize-key key)) + (mainend2 (- (or end2 (length sequence2)) + (- (or end1 (length sequence1)) start1)))) + (when (< mainend2 0) + (return-from sequence:search nil)) + (sequence:with-sequence-iterator (statem limitm from-endm stepm endpm) + (sequence2 :start start2 :end mainend2 :from-end from-end) + (do ((s2 (if from-end mainend2 0) (if from-end (1- s2) (1+ s2)))) + (nil) + (sequence:with-sequence-iterator (state1 limit1 from-end1 step1 endp1 elt1) + (sequence1 :start start1 :end end1) + (sequence:with-sequence-iterator (state2 limit2 from-end2 step2 endp2 elt2) + (sequence2 :start s2) + (declare (ignore limit2 endp2)) + (when (do () + ((funcall endp1 sequence1 state1 limit1 from-end1) t) + (let ((o1 (funcall key (funcall elt1 sequence1 state1))) + (o2 (funcall key (funcall elt2 sequence2 state2)))) + (unless (funcall test o1 o2) + (return nil))) + (setq state1 (funcall step1 sequence1 state1 from-end1)) + (setq state2 (funcall step2 sequence2 state2 from-end2))) + (return-from sequence:search s2)))) + (when (funcall endpm sequence2 statem limitm from-endm) + (return nil)) + (setq statem (funcall stepm sequence2 statem from-endm)))))) + +(defgeneric sequence:delete + (item sequence &key from-end test test-not start end count key) + (:argument-precedence-order sequence item)) +(defmethod sequence:delete (item (sequence sequence) &key + from-end test test-not (start 0) end count key) + (let ((test (sequence:canonize-test test test-not)) + (key (sequence:canonize-key key)) + (c 0)) + (sequence:with-sequence-iterator (state1 limit1 from-end1 step1 endp1 elt1 setelt1) + (sequence :start start :end end :from-end from-end) + (declare (ignore limit1 endp1 elt1)) + (sequence:with-sequence-iterator (state2 limit2 from-end2 step2 endp2 elt2) + (sequence :start start :end end :from-end from-end) + (flet ((finish () + (if from-end + (replace sequence sequence + :start1 start :end1 (- (length sequence) c) + :start2 (+ start c) :end2 (length sequence)) + (unless (or (null end) (= end (length sequence))) + (replace sequence sequence :start2 end :start1 (- end c) + :end1 (- (length sequence) c)))) + (sequence:adjust-sequence sequence (- (length sequence) c)))) + (declare (truly-dynamic-extent #'finish)) + (do () + ((funcall endp2 sequence state2 limit2 from-end2) (finish)) + (let ((e (funcall elt2 sequence state2))) + (loop + (when (and count (>= c count)) + (return)) + (if (funcall test item (funcall key e)) + (progn + (incf c) + (setq state2 (funcall step2 sequence state2 from-end2)) + (when (funcall endp2 sequence state2 limit2 from-end2) + (return-from sequence:delete (finish))) + (setq e (funcall elt2 sequence state2))) + (return))) + (funcall setelt1 e sequence state1)) + (setq state1 (funcall step1 sequence state1 from-end1)) + (setq state2 (funcall step2 sequence state2 from-end2)))))))) + +(defgeneric sequence:delete-if + (predicate sequence &key from-end start end count key) + (:argument-precedence-order sequence predicate)) +(defmethod sequence:delete-if (predicate (sequence sequence) &key + from-end (start 0) end count key) + (let ((key (sequence:canonize-key key)) + (c 0)) + (sequence:with-sequence-iterator (state1 limit1 from-end1 step1 endp1 elt1 setelt1) + (sequence :start start :end end :from-end from-end) + (declare (ignore limit1 endp1 elt1)) + (sequence:with-sequence-iterator (state2 limit2 from-end2 step2 endp2 elt2) + (sequence :start start :end end :from-end from-end) + (flet ((finish () + (if from-end + (replace sequence sequence + :start1 start :end1 (- (length sequence) c) + :start2 (+ start c) :end2 (length sequence)) + (unless (or (null end) (= end (length sequence))) + (replace sequence sequence :start2 end :start1 (- end c) + :end1 (- (length sequence) c)))) + (sequence:adjust-sequence sequence (- (length sequence) c)))) + (declare (truly-dynamic-extent #'finish)) + (do () + ((funcall endp2 sequence state2 limit2 from-end2) (finish)) + (let ((e (funcall elt2 sequence state2))) + (loop + (when (and count (>= c count)) + (return)) + (if (funcall predicate (funcall key e)) + (progn + (incf c) + (setq state2 (funcall step2 sequence state2 from-end2)) + (when (funcall endp2 sequence state2 limit2 from-end2) + (return-from sequence:delete-if (finish))) + (setq e (funcall elt2 sequence state2))) + (return))) + (funcall setelt1 e sequence state1)) + (setq state1 (funcall step1 sequence state1 from-end1)) + (setq state2 (funcall step2 sequence state2 from-end2)))))))) + +(defgeneric sequence:delete-if-not + (predicate sequence &key from-end start end count key) + (:argument-precedence-order sequence predicate)) +(defmethod sequence:delete-if-not (predicate (sequence sequence) &key + from-end (start 0) end count key) + (let ((key (sequence:canonize-key key)) + (c 0)) + (sequence:with-sequence-iterator (state1 limit1 from-end1 step1 endp1 elt1 setelt1) + (sequence :start start :end end :from-end from-end) + (declare (ignore limit1 endp1 elt1)) + (sequence:with-sequence-iterator (state2 limit2 from-end2 step2 endp2 elt2) + (sequence :start start :end end :from-end from-end) + (flet ((finish () + (if from-end + (replace sequence sequence + :start1 start :end1 (- (length sequence) c) + :start2 (+ start c) :end2 (length sequence)) + (unless (or (null end) (= end (length sequence))) + (replace sequence sequence :start2 end :start1 (- end c) + :end1 (- (length sequence) c)))) + (sequence:adjust-sequence sequence (- (length sequence) c)))) + (declare (truly-dynamic-extent #'finish)) + (do () + ((funcall endp2 sequence state2 limit2 from-end2) (finish)) + (let ((e (funcall elt2 sequence state2))) + (loop + (when (and count (>= c count)) + (return)) + (if (funcall predicate (funcall key e)) + (return) + (progn + (incf c) + (setq state2 (funcall step2 sequence state2 from-end2)) + (when (funcall endp2 sequence state2 limit2 from-end2) + (return-from sequence:delete-if-not (finish))) + (setq e (funcall elt2 sequence state2))))) + (funcall setelt1 e sequence state1)) + (setq state1 (funcall step1 sequence state1 from-end1)) + (setq state2 (funcall step2 sequence state2 from-end2)))))))) + +(defgeneric sequence:remove + (item sequence &key from-end test test-not start end count key) + (:argument-precedence-order sequence item)) +(defmethod sequence:remove (item (sequence sequence) &rest args &key + from-end test test-not (start 0) end count key) + (declare (dynamic-extent args)) + (declare (ignore from-end test test-not start end count key)) + (let ((result (copy-seq sequence))) + (apply #'sequence:delete item result args))) + +(defgeneric sequence:remove-if + (predicate sequence &key from-end start end count key) + (:argument-precedence-order sequence predicate)) +(defmethod sequence:remove-if (predicate (sequence sequence) &rest args &key + from-end (start 0) end count key) + (declare (truly-dynamic-extent args)) + (declare (ignore from-end start end count key)) + (let ((result (copy-seq sequence))) + (apply #'sequence:delete-if predicate result args))) + +(defgeneric sequence:remove-if-not + (predicate sequence &key from-end start end count key) + (:argument-precedence-order sequence predicate)) +(defmethod sequence:remove-if-not (predicate (sequence sequence) &rest args + &key from-end (start 0) end count key) + (declare (truly-dynamic-extent args)) + (declare (ignore from-end start end count key)) + (let ((result (copy-seq sequence))) + (apply #'sequence:delete-if-not predicate result args))) + +(defgeneric sequence:delete-duplicates + (sequence &key from-end test test-not start end key)) +(defmethod sequence:delete-duplicates + ((sequence sequence) &key from-end test test-not (start 0) end key) + (let ((test (sequence:canonize-test test test-not)) + (key (sequence:canonize-key key)) + (c 0)) + (sequence:with-sequence-iterator (state1 limit1 from-end1 step1 endp1 elt1 setelt1) + (sequence :start start :end end :from-end from-end) + (declare (ignore limit1 endp1 elt1)) + (sequence:with-sequence-iterator (state2 limit2 from-end2 step2 endp2 elt2) + (sequence :start start :end end :from-end from-end) + (flet ((finish () + (if from-end + (replace sequence sequence + :start1 start :end1 (- (length sequence) c) + :start2 (+ start c) :end2 (length sequence)) + (unless (or (null end) (= end (length sequence))) + (replace sequence sequence :start2 end :start1 (- end c) + :end1 (- (length sequence) c)))) + (sequence:adjust-sequence sequence (- (length sequence) c)))) + (declare (truly-dynamic-extent #'finish)) + (do ((end (or end (length sequence))) + (step 0 (1+ step))) + ((funcall endp2 sequence state2 limit2 from-end2) (finish)) + (let ((e (funcall elt2 sequence state2))) + (loop + ;; FIXME: replace with POSITION once position is + ;; working + (if (> (count (funcall key e) sequence :test test :key key + :start (if from-end start (+ start step 1)) + :end (if from-end (- end step 1) end)) + 0) + (progn + (incf c) + (incf step) + (setq state2 (funcall step2 sequence state2 from-end2)) + (when (funcall endp2 sequence state2 limit2 from-end2) + (return-from sequence:delete-duplicates (finish))) + (setq e (funcall elt2 sequence state2))) + (progn + (return)))) + (funcall setelt1 e sequence state1)) + (setq state1 (funcall step1 sequence state1 from-end1)) + (setq state2 (funcall step2 sequence state2 from-end2)))))))) + +(defgeneric sequence:remove-duplicates + (sequence &key from-end test test-not start end key)) +(defmethod sequence:remove-duplicates + ((sequence sequence) &rest args &key from-end test test-not (start 0) end key) + (declare (truly-dynamic-extent args)) + (declare (ignore from-end test test-not start end key)) + (let ((result (copy-seq sequence))) + (apply #'sequence:delete-duplicates result args))) + +(defgeneric sequence:sort (sequence predicate &key key)) +(defmethod sequence:sort ((sequence sequence) predicate &rest args &key key) + (declare (dynamic-extent args)) + (declare (ignore key)) + (let* ((length (length sequence)) + (vector (make-array length))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence) + (declare (ignore limit endp)) + (do ((i 0 (1+ i))) + ((>= i length)) + (setf (aref vector i) (funcall elt sequence state)) + (setq state (funcall step sequence state from-end)))) + (apply #'cl:sort vector predicate args) + (sequence:with-sequence-iterator (state limit from-end step endp elt setelt) + (sequence) + (declare (ignore limit endp elt)) + (do ((i 0 (1+ i))) + ((>= i length) sequence) + (funcall setelt (aref vector i) sequence state) + (setq state (funcall step sequence state from-end)))))) + +(defgeneric sequence:stable-sort (sequence predicate &key key)) +(defmethod sequence:stable-sort + ((sequence sequence) predicate &rest args &key key) + (declare (dynamic-extent args)) + (declare (ignore key)) + (let* ((length (length sequence)) + (vector (make-array length))) + (sequence:with-sequence-iterator (state limit from-end step endp elt) + (sequence) + (declare (ignore limit endp)) + (do ((i 0 (1+ i))) + ((>= i length)) + (setf (aref vector i) (funcall elt sequence state)) + (setq state (funcall step sequence state from-end)))) + (apply #'cl:stable-sort vector predicate args) + (sequence:with-sequence-iterator (state limit from-end step endp elt setelt) + (sequence) + (declare (ignore limit endp elt)) + (do ((i 0 (1+ i))) + ((>= i length) sequence) + (funcall setelt (aref vector i) sequence state) + (setq state (funcall step sequence state from-end)))))) + +;;LOOP extension +(defun loop-elements-iteration-path (variable data-type prep-phrases) + (let (of-phrase) + (loop for (prep . rest) in prep-phrases do + (ecase prep + ((:of :in) (if of-phrase + (loop::loop-error "Too many prepositions") + (setq of-phrase rest))))) + (destructuring-bind (it lim f-e step endp elt seq) + (loop repeat 7 collect (gensym)) + (push `(let ((,seq ,(car of-phrase)))) loop::*loop-wrappers*) + (push `(sequence:with-sequence-iterator (,it ,lim ,f-e ,step ,endp ,elt) (,seq)) + loop::*loop-wrappers*) + `(((,variable nil ,data-type)) () () nil (funcall ,endp ,seq ,it ,lim ,f-e) + (,variable (funcall ,elt ,seq ,it) ,it (funcall ,step ,seq ,it ,f-e)))))) + +(loop::add-loop-path + '(element elements) 'loop-elements-iteration-path loop::*loop-ansi-universe* + :preposition-groups '((:of :in)) :inclusive-permitted nil) + +(provide "EXTENSIBLE-SEQUENCES") \ No newline at end of file Modified: trunk/abcl/src/org/armedbear/lisp/fill.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/fill.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/fill.lisp Wed Mar 3 16:05:41 2010 @@ -31,6 +31,8 @@ (in-package "SYSTEM") +(require "EXTENSIBLE-SEQUENCES-BASE") + ;;; Adapted from CMUCL. (defun list-fill (sequence item start end) @@ -48,11 +50,16 @@ (setf (aref sequence index) item))) (defun fill (sequence item &key (start 0) end) - (cond ((listp sequence) - (list-fill sequence item start end)) - ((and (stringp sequence) - (zerop start) - (null end)) - (simple-string-fill sequence item)) - (t - (vector-fill sequence item start end)))) + "Replace the specified elements of SEQUENCE with ITEM." + (sequence::seq-dispatch sequence + (list-fill sequence item start end) + (cond ((and (stringp sequence) + (zerop start) + (null end)) + (simple-string-fill sequence item)) + (t + (vector-fill sequence item start end))) + (sequence:fill sequence item + :start start + :end (sequence::%check-generic-sequence-bounds + sequence start end)))) \ No newline at end of file Modified: trunk/abcl/src/org/armedbear/lisp/find.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/find.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/find.lisp Wed Mar 3 16:05:41 2010 @@ -31,6 +31,8 @@ (in-package #:system) +(require "EXTENSIBLE-SEQUENCES-BASE") + ;;; From CMUCL. (defmacro vector-locater-macro (sequence body-form return-type) @@ -142,12 +144,12 @@ `(list-locater ,item ,sequence :position)) -(defun position (item sequence &key from-end (test #'eql) test-not (start 0) - end key) - (if (listp sequence) - (list-position* item sequence from-end test test-not start end key) - (vector-position* item sequence from-end test test-not start end key))) - +(defun position (item sequence &rest args &key from-end (test #'eql) test-not + (start 0) end key) + (sequence::seq-dispatch sequence + (list-position* item sequence from-end test test-not start end key) + (vector-position* item sequence from-end test test-not start end key) + (apply #'sequence:position item sequence args))) (defun list-position* (item sequence from-end test test-not start end key) (declare (type fixnum start)) @@ -167,13 +169,14 @@ (defmacro list-position-if (test sequence) `(list-locater-if ,test ,sequence :position)) -(defun position-if (test sequence &key from-end (start 0) key end) +(defun position-if (test sequence &rest args &key from-end (start 0) key end) (declare (type fixnum start)) (let ((end (or end (length sequence)))) (declare (type fixnum end)) - (if (listp sequence) - (list-position-if test sequence) - (vector-position-if test sequence)))) + (sequence::seq-dispatch sequence + (list-position-if test sequence) + (vector-position-if test sequence) + (apply #'sequence:position-if test sequence args)))) (defmacro vector-position-if-not (test sequence) `(vector-locater-if-not ,test ,sequence :position)) @@ -181,13 +184,14 @@ (defmacro list-position-if-not (test sequence) `(list-locater-if-not ,test ,sequence :position)) -(defun position-if-not (test sequence &key from-end (start 0) key end) +(defun position-if-not (test sequence &rest args &key from-end (start 0) key end) (declare (type fixnum start)) (let ((end (or end (length sequence)))) (declare (type fixnum end)) - (if (listp sequence) - (list-position-if-not test sequence) - (vector-position-if-not test sequence)))) + (sequence::seq-dispatch sequence + (list-position-if-not test sequence) + (vector-position-if-not test sequence) + (apply #'sequence:position-if-not test sequence args)))) (defmacro vector-find (item sequence) `(vector-locater ,item ,sequence :element)) @@ -207,12 +211,13 @@ (setf test 'eql)) (vector-find item sequence)) -(defun find (item sequence &key from-end (test #'eql) test-not (start 0) - end key) +(defun find (item sequence &rest args &key from-end (test #'eql) test-not + (start 0) end key) (let ((end (check-sequence-bounds sequence start end))) - (if (listp sequence) - (list-find* item sequence from-end test test-not start end key) - (vector-find* item sequence from-end test test-not start end key)))) + (sequence::seq-dispatch sequence + (list-find* item sequence from-end test test-not start end key) + (vector-find* item sequence from-end test test-not start end key) + (apply #'sequence:find item sequence args)))) (defmacro vector-find-if (test sequence) `(vector-locater-if ,test ,sequence :element)) @@ -220,12 +225,13 @@ (defmacro list-find-if (test sequence) `(list-locater-if ,test ,sequence :element)) -(defun find-if (test sequence &key from-end (start 0) end key) +(defun find-if (test sequence &rest args &key from-end (start 0) end key) (let ((end (or end (length sequence)))) (declare (type fixnum end)) - (if (listp sequence) - (list-find-if test sequence) - (vector-find-if test sequence)))) + (sequence::seq-dispatch sequence + (list-find-if test sequence) + (vector-find-if test sequence) + (apply #'sequence:find-if test sequence args)))) (defmacro vector-find-if-not (test sequence) `(vector-locater-if-not ,test ,sequence :element)) @@ -233,9 +239,10 @@ (defmacro list-find-if-not (test sequence) `(list-locater-if-not ,test ,sequence :element)) -(defun find-if-not (test sequence &key from-end (start 0) end key) +(defun find-if-not (test sequence &rest args &key from-end (start 0) end key) (let ((end (or end (length sequence)))) (declare (type fixnum end)) - (if (listp sequence) - (list-find-if-not test sequence) - (vector-find-if-not test sequence)))) + (sequence::seq-dispatch sequence + (list-find-if-not test sequence) + (vector-find-if-not test sequence) + (apply #'sequence:find-if-not test sequence args)))) Modified: trunk/abcl/src/org/armedbear/lisp/make-sequence.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/make-sequence.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/make-sequence.lisp Wed Mar 3 16:05:41 2010 @@ -39,11 +39,18 @@ :format-arguments (list size type))) (defun make-sequence (type size &key (initial-element nil iesp)) - (let (element-type sequence) + (let (element-type sequence class) (setf type (normalize-type type)) (cond ((atom type) + (setf class (if (classp type) type (find-class type nil))) (when (classp type) - (setf type (%class-name type))) + (let ((class-name (%class-name type))) + (when (member class-name '(LIST CONS STRING SIMPLE-STRING + BASE-STRING SIMPLE-BASE-STRING NULL + BIT-VECTOR SIMPLE-BIT-VECTOR VECTOR + SIMPLE-VECTOR)) + (setf type class-name)))) + ;;Else we suppose it's a user-defined sequence and move on (cond ((memq type '(LIST CONS)) (when (zerop size) (if (eq type 'CONS) @@ -66,11 +73,11 @@ (setq element-type (cond ((memq type '(BIT-VECTOR SIMPLE-BIT-VECTOR)) 'BIT) ((memq type '(VECTOR SIMPLE-VECTOR)) t) - (t + ((null class) (error 'simple-type-error :format-control "~S is not a sequence type." :format-arguments (list type)))))))) - (t + (t (let ((name (%car type)) (args (%cdr type))) (when (eq name 'LIST) @@ -108,7 +115,15 @@ (when (/= size len) (size-mismatch-error type size))))))) (setq sequence - (if iesp - (make-array size :element-type element-type :initial-element initial-element) - (make-array size :element-type element-type))) + (cond ((or (not (atom type)) (subtypep type 'array)) + (if iesp + (make-array size :element-type element-type :initial-element initial-element) + (make-array size :element-type element-type))) + ((and class (subtypep type 'sequence)) + (if iesp + (sequence:make-sequence-like (mop::class-prototype class) size :initial-element initial-element) + (sequence:make-sequence-like (mop::class-prototype class) size))) + (t (error 'simple-type-error + :format-control "~S is not a sequence type." + :format-arguments (list type))))) sequence)) Modified: trunk/abcl/src/org/armedbear/lisp/mismatch.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/mismatch.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/mismatch.lisp Wed Mar 3 16:05:41 2010 @@ -32,6 +32,8 @@ (in-package "COMMON-LISP") +(require "EXTENSIBLE-SEQUENCES-BASE") + (export 'mismatch) ;;; From ECL. @@ -70,27 +72,28 @@ (defun test-error() (error "both test and test are supplied")) -(defun mismatch (sequence1 sequence2 &key from-end test test-not - (key #'identity) start1 start2 end1 end2) +(defun mismatch (sequence1 sequence2 &rest args &key from-end test test-not + (key #'identity) start1 start2 end1 end2) (and test test-not (test-error)) - (with-start-end - start1 end1 sequence1 - (with-start-end - start2 end2 sequence2 - (if (not from-end) - (do ((i1 start1 (1+ i1)) - (i2 start2 (1+ i2))) - ((or (>= i1 end1) (>= i2 end2)) - (if (and (>= i1 end1) (>= i2 end2)) nil i1)) - (unless (call-test test test-not - (funcall key (elt sequence1 i1)) - (funcall key (elt sequence2 i2))) - (return i1))) - (do ((i1 (1- end1) (1- i1)) - (i2 (1- end2) (1- i2))) - ((or (< i1 start1) (< i2 start2)) - (if (and (< i1 start1) (< i2 start2)) nil (1+ i1))) - (unless (call-test test test-not - (funcall key (elt sequence1 i1)) - (funcall key (elt sequence2 i2))) - (return (1+ i1)))))))) + (if (and (or (listp sequence1) (arrayp sequence1)) + (or (listp sequence2) (arrayp sequence2))) + (with-start-end start1 end1 sequence1 + (with-start-end start2 end2 sequence2 + (if (not from-end) + (do ((i1 start1 (1+ i1)) + (i2 start2 (1+ i2))) + ((or (>= i1 end1) (>= i2 end2)) + (if (and (>= i1 end1) (>= i2 end2)) nil i1)) + (unless (call-test test test-not + (funcall key (elt sequence1 i1)) + (funcall key (elt sequence2 i2))) + (return i1))) + (do ((i1 (1- end1) (1- i1)) + (i2 (1- end2) (1- i2))) + ((or (< i1 start1) (< i2 start2)) + (if (and (< i1 start1) (< i2 start2)) nil (1+ i1))) + (unless (call-test test test-not + (funcall key (elt sequence1 i1)) + (funcall key (elt sequence2 i2))) + (return (1+ i1))))))) + (apply #'sequence:mismatch sequence1 sequence2 args))) Modified: trunk/abcl/src/org/armedbear/lisp/reduce.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/reduce.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/reduce.lisp Wed Mar 3 16:05:41 2010 @@ -33,6 +33,8 @@ (in-package #:system) +(require "EXTENSIBLE-SEQUENCES-BASE") + (defmacro list-reduce (function sequence start end initial-value ivp key) (let ((what `(if ,key (funcall ,key (car sequence)) (car sequence)))) `(let ((sequence (nthcdr ,start ,sequence))) @@ -56,12 +58,12 @@ ((= count ,end) value))))) -(defun reduce (function sequence &key from-end (start 0) +(defun reduce (function sequence &rest args &key from-end (start 0) end (initial-value nil ivp) key) (unless end (setq end (length sequence))) (if (= end start) (if ivp initial-value (funcall function)) - (if (listp sequence) + (sequence::seq-dispatch sequence (if from-end (list-reduce-from-end function sequence start end initial-value ivp key) (list-reduce function sequence start end initial-value ivp key)) @@ -80,4 +82,5 @@ element (if key (funcall key element) element) value (funcall function (if from-end element value) - (if from-end value element)))))))) + (if from-end value element))))) + (apply #'sequence:reduce function sequence args)))) Modified: trunk/abcl/src/org/armedbear/lisp/remove-duplicates.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/remove-duplicates.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/remove-duplicates.lisp Wed Mar 3 16:05:41 2010 @@ -31,6 +31,8 @@ (in-package #:system) +(require "EXTENSIBLE-SEQUENCES-BASE") + ;;; Adapted from CMUCL. (defun list-remove-duplicates (list test test-not start end key from-end) @@ -97,16 +99,17 @@ (setq jndex (1+ jndex))) (shrink-vector result jndex))) -(defun remove-duplicates (sequence &key (test #'eql) test-not (start 0) from-end - end key) - (if (listp sequence) - (when sequence - (if (and (eq test #'eql) - (null test-not) - (eql start 0) - (null from-end) - (null end) - (null key)) - (simple-list-remove-duplicates sequence) - (list-remove-duplicates sequence test test-not start end key from-end))) - (vector-remove-duplicates sequence test test-not start end key from-end))) +(defun remove-duplicates (sequence &rest args &key (test #'eql) test-not + (start 0) from-end end key) + (sequence::seq-dispatch sequence + (when sequence + (if (and (eq test #'eql) + (null test-not) + (eql start 0) + (null from-end) + (null end) + (null key)) + (simple-list-remove-duplicates sequence) + (list-remove-duplicates sequence test test-not start end key from-end))) + (vector-remove-duplicates sequence test test-not start end key from-end) + (apply #'sequence:remove-duplicates sequence args))) Modified: trunk/abcl/src/org/armedbear/lisp/remove.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/remove.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/remove.lisp Wed Mar 3 16:05:41 2010 @@ -32,6 +32,7 @@ (in-package "SYSTEM") (require "DELETE") ; MUMBLE-DELETE-FROM-END +(require "EXTENSIBLE-SEQUENCES-BASE") ;;; From CMUCL. @@ -155,39 +156,44 @@ `(list-remove-from-end (not (funcall predicate (apply-key key this-element))))) -(defun remove (item sequence &key from-end (test #'eql) test-not (start 0) - end count key) +(defun remove (item sequence &rest args &key from-end (test #'eql) test-not + (start 0) end count key) (let* ((length (length sequence)) (end (or end length)) (count (real-count count))) - (if (listp sequence) - (if from-end - (normal-list-remove-from-end) - (normal-list-remove)) - (if from-end - (normal-mumble-remove-from-end) - (normal-mumble-remove))))) + (sequence::seq-dispatch sequence + (if from-end + (normal-list-remove-from-end) + (normal-list-remove)) + (if from-end + (normal-mumble-remove-from-end) + (normal-mumble-remove)) + (apply #'sequence:remove item sequence args)))) -(defun remove-if (predicate sequence &key from-end (start 0) end count key) +(defun remove-if (predicate sequence &rest args &key from-end (start 0) + end count key) (let* ((length (length sequence)) (end (or end length)) (count (real-count count))) - (if (listp sequence) - (if from-end - (if-list-remove-from-end) - (if-list-remove)) - (if from-end - (if-mumble-remove-from-end) - (if-mumble-remove))))) + (sequence::seq-dispatch sequence + (if from-end + (if-list-remove-from-end) + (if-list-remove)) + (if from-end + (if-mumble-remove-from-end) + (if-mumble-remove)) + (apply #'sequence:remove-if predicate sequence args)))) -(defun remove-if-not (predicate sequence &key from-end (start 0) end count key) +(defun remove-if-not (predicate sequence &rest args &key from-end (start 0) + end count key) (let* ((length (length sequence)) (end (or end length)) (count (real-count count))) - (if (listp sequence) - (if from-end - (if-not-list-remove-from-end) - (if-not-list-remove)) - (if from-end - (if-not-mumble-remove-from-end) - (if-not-mumble-remove))))) + (sequence::seq-dispatch sequence + (if from-end + (if-not-list-remove-from-end) + (if-not-list-remove)) + (if from-end + (if-not-mumble-remove-from-end) + (if-not-mumble-remove)) + (apply #'sequence:remove-if-not predicate sequence args)))) Modified: trunk/abcl/src/org/armedbear/lisp/replace.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/replace.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/replace.lisp Wed Mar 3 16:05:41 2010 @@ -33,11 +33,13 @@ (in-package #:system) -(eval-when (:compile-toplevel :load-toplevel :execute) +(require "EXTENSIBLE-SEQUENCES-BASE") + +#|(eval-when (:compile-toplevel :load-toplevel :execute) (defmacro seq-dispatch (sequence list-form array-form) `(if (listp ,sequence) ,list-form - ,array-form))) + ,array-form)))|# (eval-when (:compile-toplevel :execute) @@ -144,20 +146,10 @@ (when (null source-end) (setq source-end (length source-sequence))) (mumble-replace-from-mumble)) -(defun %replace (target-sequence source-sequence target-start target-end source-start source-end) - (declare (type (integer 0 #.most-positive-fixnum) target-start target-end source-start source-end)) - (seq-dispatch target-sequence - (seq-dispatch source-sequence - (list-replace-from-list) - (list-replace-from-mumble)) - (seq-dispatch source-sequence - (mumble-replace-from-list) - (mumble-replace-from-mumble)))) - ;;; REPLACE cannot default end arguments to the length of sequence since it ;;; is not an error to supply nil for their values. We must test for ends ;;; being nil in the body of the function. -(defun replace (target-sequence source-sequence &key +(defun replace (target-sequence source-sequence &rest args &key ((:start1 target-start) 0) ((:end1 target-end)) ((:start2 source-start) 0) @@ -166,4 +158,14 @@ elements into it from the source sequence." (let ((target-end (or target-end (length target-sequence))) (source-end (or source-end (length source-sequence)))) - (%replace target-sequence source-sequence target-start target-end source-start source-end))) + (declare (type (integer 0 #.most-positive-fixnum) target-start target-end source-start source-end)) + (sequence::seq-dispatch target-sequence + (sequence::seq-dispatch source-sequence + (list-replace-from-list) + (list-replace-from-mumble) + (apply #'sequence:replace target-sequence source-sequence args)) + (sequence::seq-dispatch source-sequence + (mumble-replace-from-list) + (mumble-replace-from-mumble) + (apply #'sequence:replace target-sequence source-sequence args)) + (apply #'sequence:replace target-sequence source-sequence args)))) Modified: trunk/abcl/src/org/armedbear/lisp/search.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/search.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/search.lisp Wed Mar 3 16:05:41 2010 @@ -31,6 +31,8 @@ (in-package "SYSTEM") +(require "EXTENSIBLE-SEQUENCES-BASE") + ;; From CMUCL. (eval-when (:compile-toplevel :execute) @@ -110,15 +112,16 @@ ) ; eval-when -(defun search (sequence1 sequence2 &key from-end (test #'eql) test-not - (start1 0) end1 (start2 0) end2 key) +(defun search (sequence1 sequence2 &rest args &key from-end (test #'eql) + test-not (start1 0) end1 (start2 0) end2 key) (let ((end1 (or end1 (length sequence1))) (end2 (or end2 (length sequence2)))) (when key (setq key (coerce-to-function key))) - (if (listp sequence2) - (list-search sequence2 sequence1) - (vector-search sequence2 sequence1)))) + (sequence::seq-dispatch sequence2 + (list-search sequence2 sequence1) + (vector-search sequence2 sequence1) + (apply #'sequence:search sequence1 sequence2 args)))) (defun simple-search (sequence1 sequence2) (cond ((and (stringp sequence1) (stringp sequence2)) Modified: trunk/abcl/src/org/armedbear/lisp/sequences.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/sequences.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/sequences.lisp Wed Mar 3 16:05:41 2010 @@ -29,6 +29,8 @@ ;;; obligated to do so. If you do not wish to do so, delete this ;;; exception statement from your version. +;(require "EXTENSIBLE-SEQUENCES-BASE") + (in-package #:system) (defmacro type-specifier-atom (type) @@ -56,4 +58,10 @@ (error "MAKE-SEQUENCE-OF-TYPE: unsupported case ~S" type)))) (defmacro make-sequence-like (sequence length) - `(make-sequence-of-type (type-of ,sequence) ,length)) + "Return a sequence of the same type as SEQUENCE and the given LENGTH." + ;;Can't use gensyms: stack overflow in boot.lisp + `(let ((msl-seq-tmp-var ,sequence) (msl-len-tmp-var ,length)) + (sequence::seq-dispatch msl-seq-tmp-var + (make-sequence-of-type (type-of msl-seq-tmp-var) msl-len-tmp-var) + (make-sequence-of-type (type-of msl-seq-tmp-var) msl-len-tmp-var) + (sequence::make-sequence-like msl-seq-tmp-var msl-len-tmp-var)))) \ No newline at end of file Modified: trunk/abcl/src/org/armedbear/lisp/setf.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/setf.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/setf.lisp Wed Mar 3 16:05:41 2010 @@ -222,6 +222,7 @@ (defsetf tenth %set-tenth) (defsetf rest set-cdr) +;;Redefined in extensible-sequences-base.lisp (defsetf elt %set-elt) (defsetf nth %set-nth) (defsetf svref svset) Modified: trunk/abcl/src/org/armedbear/lisp/sort.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/sort.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/sort.lisp Wed Mar 3 16:05:41 2010 @@ -31,15 +31,19 @@ (in-package #:system) -(defun sort (sequence predicate &key key) - (if (listp sequence) - (sort-list sequence predicate key) - (quick-sort sequence 0 (length sequence) predicate key))) - -(defun stable-sort (sequence predicate &key key) - (if (listp sequence) - (sort-list sequence predicate key) - (quick-sort sequence 0 (length sequence) predicate key))) +(require "EXTENSIBLE-SEQUENCES-BASE") + +(defun sort (sequence predicate &rest args &key key) + (sequence::seq-dispatch sequence + (sort-list sequence predicate key) + (quick-sort sequence 0 (length sequence) predicate key) + (apply #'sequence:sort sequence predicate args))) + +(defun stable-sort (sequence predicate &rest args &key key) + (sequence::seq-dispatch sequence + (sort-list sequence predicate key) + (quick-sort sequence 0 (length sequence) predicate key) + (apply #'sequence:stable-sort sequence predicate args))) ;; Adapted from SBCL. (declaim (ftype (function (list) cons) last-cons-of)) @@ -192,7 +196,8 @@ (quick-sort seq start j pred key) (quick-sort seq (1+ j) end pred key)))) -;;; From ECL. +;;; From ECL. Should already be user-extensible as it does no type dispatch +;;; and uses only user-extensible functions. (defun merge (result-type sequence1 sequence2 predicate &key key &aux (l1 (length sequence1)) (l2 (length sequence2))) Modified: trunk/abcl/src/org/armedbear/lisp/substitute.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/substitute.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/substitute.lisp Wed Mar 3 16:05:41 2010 @@ -29,6 +29,7 @@ ;;; obligated to do so. If you do not wish to do so, delete this ;;; exception statement from your version. +(require "EXTENSIBLE-SEQUENCES-BASE") (in-package "COMMON-LISP") @@ -109,7 +110,7 @@ result)) (defmacro subst-dispatch (pred) - `(if (listp sequence) + `(sequence::seq-dispatch sequence (if from-end (nreverse (list-substitute* ,pred new (reverse sequence) (- length end) @@ -122,10 +123,14 @@ -1 length (1- end) (1- start) count key test test-not old) (vector-substitute* ,pred new sequence 1 0 length length - start end count key test test-not old)))) + start end count key test test-not old)) + ,(ecase (cadr pred) ;;pred is (quote ) + (normal `(apply #'sequence:substitute new old sequence args)) + (if `(apply #'sequence:substitute-if new test sequence args)) + (if-not `(apply #'sequence:substitute-if-not new test sequence args))))) -(defun substitute (new old sequence &key from-end (test #'eql) test-not +(defun substitute (new old sequence &rest args &key from-end (test #'eql) test-not (start 0) count end key) (let* ((length (length sequence)) (end (or end length)) @@ -133,7 +138,7 @@ (subst-dispatch 'normal))) -(defun substitute-if (new test sequence &key from-end (start 0) end count key) +(defun substitute-if (new test sequence &rest args &key from-end (start 0) end count key) (let* ((length (length sequence)) (end (or end length)) (count (real-count count)) @@ -142,7 +147,7 @@ (subst-dispatch 'if))) -(defun substitute-if-not (new test sequence &key from-end (start 0) +(defun substitute-if-not (new test sequence &rest args &key from-end (start 0) end count key) (let* ((length (length sequence)) (end (or end length)) From astalla at common-lisp.net Wed Mar 3 22:23:55 2010 From: astalla at common-lisp.net (Alessio Stalla) Date: Wed, 03 Mar 2010 17:23:55 -0500 Subject: [armedbear-cvs] r12517 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: astalla Date: Wed Mar 3 17:23:53 2010 New Revision: 12517 Log: Preliminary support for DOSEQUENCE. Modified: trunk/abcl/src/org/armedbear/lisp/extensible-sequences.lisp Modified: trunk/abcl/src/org/armedbear/lisp/extensible-sequences.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/extensible-sequences.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/extensible-sequences.lisp Wed Mar 3 17:23:53 2010 @@ -979,4 +979,61 @@ '(element elements) 'loop-elements-iteration-path loop::*loop-ansi-universe* :preposition-groups '((:of :in)) :inclusive-permitted nil) +;;;DOSEQUENCE + +;;From SBCL +(eval-when (:compile-toplevel :load-toplevel :execute) + (defun filter-dolist-declarations (decls) + (mapcar (lambda (decl) + `(declare ,@(remove-if + (lambda (clause) + (and (consp clause) + (or (eq (car clause) 'type) + (eq (car clause) 'ignore)))) + (cdr decl)))) + decls))) + +;; just like DOLIST, but with one-dimensional arrays +(defmacro dovector ((elt vector &optional result) &body body) + (multiple-value-bind (forms decls) + (sys:parse-body body :doc-string-allowed nil) + (let ((index (gensym "INDEX")) (length (gensym "LENGTH")) (vec (gensym "VEC"))) + `(let ((,vec ,vector)) + (declare (type vector ,vec)) + (do ((,index 0 (1+ ,index)) + (,length (length ,vec))) + ((>= ,index ,length) (let ((,elt nil)) + ,@(filter-dolist-declarations decls) + ,elt + ,result)) + (let ((,elt (aref ,vec ,index))) + , at decls + (tagbody + , at forms))))))) + +(defmacro sequence:dosequence ((e sequence &optional return &rest args &key + from-end start end) &body body) + (declare (ignore from-end start end)) + (multiple-value-bind (forms decls) + (sys:parse-body body :doc-string-allowed nil) + (let ((s sequence) + (sequence (gensym "SEQUENCE"))) + `(block nil + (let ((,sequence ,s)) + (seq-dispatch ,sequence + (dolist (,e ,sequence ,return) , at body) + (dovector (,e ,sequence ,return) , at body) + (multiple-value-bind (state limit from-end step endp elt) + (sequence:make-sequence-iterator ,sequence , at args) + (do ((state state (funcall step ,sequence state from-end))) + ((funcall endp ,sequence state limit from-end) + (let ((,e nil)) + ,@(filter-dolist-declarations decls) + ,e + ,return)) + (let ((,e (funcall elt ,sequence state))) + , at decls + (tagbody + , at forms)))))))))) + (provide "EXTENSIBLE-SEQUENCES") \ No newline at end of file From mevenson at common-lisp.net Thu Mar 4 14:52:38 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Thu, 04 Mar 2010 09:52:38 -0500 Subject: [armedbear-cvs] r12518 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Thu Mar 4 09:52:35 2010 New Revision: 12518 Log: *DISASSEMBLER* may now contain a function to return the disassembler command. If *DISASSEMBLER* contains a function it specifies the command string to use for the DISASSEMBLE primitive by taking an argument for the pathname containing the class bytes and returning the string of a command that will output a representation to standard output. We also change the default suffix of the temporary file to ".class". All of this now enables "javap" to be used as the dissambler with the following assignment (in "~/.abclrc" for example): (setf *disassembler* (lambda (p) (let ((class (make-pathname :name (pathname-name p))) (path (directory-namestring p))) (format nil "javap -c -l -verbose -classpath ~A ~A" path class)))) It might be nice in the future if ABCL had a default value of *DISASSEMBLER* that would actually probe the filesystem for the existence of the various disassmemblers for fallback strategies. Modified: trunk/abcl/src/org/armedbear/lisp/disassemble_class_bytes.java Modified: trunk/abcl/src/org/armedbear/lisp/disassemble_class_bytes.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/disassemble_class_bytes.java (original) +++ trunk/abcl/src/org/armedbear/lisp/disassemble_class_bytes.java Thu Mar 4 09:52:35 2010 @@ -53,23 +53,28 @@ if (arg instanceof JavaObject) { byte[] bytes = (byte[]) ((JavaObject)arg).getObject(); try { - File file = File.createTempFile("abcl", null, null); + File file = File.createTempFile("abcl", ".class", null); FileOutputStream out = new FileOutputStream(file); out.write(bytes); out.close(); LispObject disassembler = _DISASSEMBLER_.symbolValue(); + StringBuffer command = new StringBuffer(); if (disassembler instanceof AbstractString) { - StringBuffer sb = new StringBuffer(disassembler.getStringValue()); - sb.append(' '); - sb.append(file.getPath()); - ShellCommand sc = new ShellCommand(sb.toString(), null, null); - sc.run(); - file.delete(); - return new SimpleString(sc.getOutput()); - } else + command.append(disassembler.getStringValue()); + command.append(" "); + command.append(file.getPath()); + } else if (disassembler instanceof Operator) { + Pathname p = Pathname.makePathname(file); + LispObject commandResult = disassembler.execute(p); + command.append(commandResult.getStringValue()); + } else { return new SimpleString("No disassembler is available."); - } - catch (IOException e) { + } + ShellCommand sc = new ShellCommand(command.toString(), null, null); + sc.run(); + file.delete(); + return new SimpleString(sc.getOutput()); + } catch (IOException e) { Debug.trace(e); } } From mevenson at common-lisp.net Sat Mar 6 11:53:24 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Sat, 06 Mar 2010 06:53:24 -0500 Subject: [armedbear-cvs] r12519 - trunk/abcl Message-ID: Author: mevenson Date: Sat Mar 6 06:53:21 2010 New Revision: 12519 Log: Finalize CHANGES for 0.19 branch. Modified: trunk/abcl/CHANGES Modified: trunk/abcl/CHANGES ============================================================================== --- trunk/abcl/CHANGES (original) +++ trunk/abcl/CHANGES Sat Mar 6 06:53:21 2010 @@ -6,20 +6,27 @@ Features -------- -* [svn 12513] Implement SYS:SRC and SYS:JAVA logical pathname +* [svn r12518] *DISASSEMBLER* may now contain a hook which returns the + command to disassemble compiled functions. + +* [svn r12516] An implementation of user-extensible sequences as + proposed in Christopher Rhodes, "User-extensible sequences in Common + Lisp", Proc. of the 2007 International Lisp Conference. + +* [svn r12513] Implement SYS:SRC and SYS:JAVA logical pathname translations for system Lisp source and the root of the Java package structure, respectively. -* [svn 12505] All calls to anonymous functions and local functions that have +* [svn r12505] All calls to anonymous functions and local functions that have been declared inline are now converted to LET* forms, reducing stack usage and the number of generated classes. -* [svn 12487] An initial port ASDF-INSTALL now forms the first ABCL +* [svn r12487] An initial port ASDF-INSTALL now forms the first ABCL contrib. Such contribs are optionally built by the Ant target 'abcl.contrib'. ASDF-INSTALL is not expected to work very well under Windows in its present state. -* [svn 12447] [ticket:80] REQUIRE now searches for ASDF systems. +* [svn r12447] [ticket:80] REQUIRE now searches for ASDF systems. * [svn r12422] Jar pathname support extensively re-worked and tested so that LOAD, PROBE-FILE, TRUENAME, DIRECTORY, and WRITE-FILE-DATE @@ -60,7 +67,7 @@ * [svn r12484] FASLs containing "." characters not used to indicate type (i.e. ".foo.bar.baz.abcl") can now be loaded. -* [svn 12422] Pathname.java URL contructor under Windows now properly +* [svn r12422] Pathname.java URL contructor under Windows now properly interprets the drive letter. * [svn r12449] The 'abcl.jar' produced by Netbeans now contains a valid @@ -121,7 +128,7 @@ Other ----- -* [svn 12447] SYS::*MODULE-PROVIDER-FUNCTION* now provides a mechanism +* [svn r12447] SYS::*MODULE-PROVIDER-FUNCTION* now provides a mechanism to extend the REQUIRE resolver mechanism at runtime. * [svn r12430] Ant based build no longer writes temporary files to @@ -140,13 +147,13 @@ * [svn r12461] Human readable Java representations for class cast exceptions for NULL and UNBOUND values. -* [svn 12453 et. ff.] Large numbers of the implementation of Java +* [svn r12453 et. ff.] Large numbers of the implementation of Java primitives have been declared in a way so that a stack trace provides a much more readable indication of what has been invoked. Primitives which extend Primitive are prefixed with "pf_"; those which extend SpecialOperator are prefixed with "sf_". -* [svn 12422] The internal structure of a jar pathname has changed. +* [svn r12422] The internal structure of a jar pathname has changed. Previously a pathname with a DEVICE that was itself a pathname referenced a jar. This convention was not able to simultaneously represent both jar entries that were themselves jar files (as occurs From ehuelsmann at common-lisp.net Wed Mar 10 22:01:08 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Wed, 10 Mar 2010 17:01:08 -0500 Subject: [armedbear-cvs] r12520 - branches/0.19.x Message-ID: Author: ehuelsmann Date: Wed Mar 10 17:01:05 2010 New Revision: 12520 Log: Branch for 0.19 release cycle. Added: branches/0.19.x/ - copied from r12519, /trunk/ From ehuelsmann at common-lisp.net Wed Mar 10 22:09:14 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Wed, 10 Mar 2010 17:09:14 -0500 Subject: [armedbear-cvs] r12521 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Wed Mar 10 17:09:13 2010 New Revision: 12521 Log: Correct spelling error in helper function checkSlotDefination() -> checkSlotDefinition(). Modified: trunk/abcl/src/org/armedbear/lisp/SlotDefinition.java Modified: trunk/abcl/src/org/armedbear/lisp/SlotDefinition.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SlotDefinition.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SlotDefinition.java Wed Mar 10 17:09:13 2010 @@ -70,7 +70,7 @@ slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION] = Keyword.INSTANCE; } - public static SlotDefinition checkSlotDefination(LispObject obj) { + public static SlotDefinition checkSlotDefinition(LispObject obj) { if (obj instanceof SlotDefinition) return (SlotDefinition)obj; return (SlotDefinition)type_error(obj, Symbol.SLOT_DEFINITION); } @@ -117,7 +117,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_NAME]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_NAME]; } }; @@ -130,7 +130,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_NAME] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_NAME] = second; return second; } }; @@ -142,7 +142,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITFUNCTION]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITFUNCTION]; } }; @@ -155,7 +155,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_INITFUNCTION] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_INITFUNCTION] = second; return second; } }; @@ -168,7 +168,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITFORM]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITFORM]; } }; @@ -181,7 +181,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_INITFORM] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_INITFORM] = second; return second; } }; @@ -193,7 +193,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITARGS]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITARGS]; } }; @@ -206,7 +206,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_INITARGS] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_INITARGS] = second; return second; } }; @@ -219,7 +219,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_READERS]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_READERS]; } }; @@ -232,7 +232,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_READERS] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_READERS] = second; return second; } }; @@ -245,7 +245,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_WRITERS]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_WRITERS]; } }; @@ -258,7 +258,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_WRITERS] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_WRITERS] = second; return second; } }; @@ -271,7 +271,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION]; } }; @@ -284,7 +284,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION] = second; return second; } }; @@ -297,7 +297,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION_CLASS]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION_CLASS]; } }; @@ -310,7 +310,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION_CLASS] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION_CLASS] = second; return second; } }; @@ -322,7 +322,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_LOCATION]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_LOCATION]; } }; @@ -334,7 +334,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_LOCATION] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_LOCATION] = second; return second; } }; From ehuelsmann at common-lisp.net Wed Mar 10 22:10:25 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Wed, 10 Mar 2010 17:10:25 -0500 Subject: [armedbear-cvs] r12522 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Wed Mar 10 17:10:24 2010 New Revision: 12522 Log: With 0.19 brached, increase trunk version number. Modified: trunk/abcl/src/org/armedbear/lisp/Version.java Modified: trunk/abcl/src/org/armedbear/lisp/Version.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Version.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Version.java Wed Mar 10 17:10:24 2010 @@ -41,7 +41,7 @@ public static String getVersion() { - return "0.19.0-dev"; + return "0.20.0-dev"; } public static void main(String args[]) { From mevenson at common-lisp.net Thu Mar 11 08:42:51 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Thu, 11 Mar 2010 03:42:51 -0500 Subject: [armedbear-cvs] r12523 - trunk/abcl/doc/design/pathnames Message-ID: Author: mevenson Date: Thu Mar 11 03:42:48 2010 New Revision: 12523 Log: Add informal BNF grammar description for JAR PATHNAME syntax. Modified: trunk/abcl/doc/design/pathnames/abcl-jar-url.text Modified: trunk/abcl/doc/design/pathnames/abcl-jar-url.text ============================================================================== --- trunk/abcl/doc/design/pathnames/abcl-jar-url.text (original) +++ trunk/abcl/doc/design/pathnames/abcl-jar-url.text Thu Mar 11 03:42:48 2010 @@ -89,6 +89,34 @@ * The DEVICE PATHNAME list of enclosing JARs runs from outermost to innermost. +* The DIRECTORY component of a JAR PATHNAME should be a list starting + with the :RELATIVE keyword, as hierarchial entries in jar files + are of the form "foo/bar/a.lisp" not "/foo/bar/a.lisp" + +BNF +--- + +An incomplete BNF of the syntax of JAR PATHNAME would be: + + JAR-PATHNAME ::= "jar:" URL "!/" [ ENTRY ] + + URL ::= + | JAR-FILE-PATHNAME + + JAR-FILE-PATHNAME ::= "jar:" "file:" JAR-NAMESTRING "!/" [ ENTRY ] + + JAR-NAMESTRING ::= ABSOLUTE-FILE-NAMESTRING + | RELATIVE-FILE-NAMESTRING + + ENTRY ::= [ DIRECTORY "/"] * FILE + + +### Notes + +1. ABSOLUTE-FILE-NAMESTRING and RELATIVE-FILE-NAMESTRING use the +local filesystem conventions, meaning that on Windows this could +contain '\' as the directory separator, while an ENTRY always uses '/' +to separate directories within the jar proper. Use Cases From mevenson at common-lisp.net Thu Mar 11 15:49:09 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Thu, 11 Mar 2010 10:49:09 -0500 Subject: [armedbear-cvs] r12524 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Thu Mar 11 10:49:05 2010 New Revision: 12524 Log: Enable ABCL to load in an OSGi context. OSGi abstracts the loading of resources via the "bundle:" URI schema, providing a custom URLProtocolHandler implementation. Unfortunately, since these references cannot be handled by ABCL pathnames, the newly revised logic for our FASL loading strategy breaks down. This patch kludingly addresses this issue to the point that ABCL can be loaded by reference in an OSGi bundle, but should be revised when a correct implementation strategy is decided upon. Modified: trunk/abcl/src/org/armedbear/lisp/Debug.java trunk/abcl/src/org/armedbear/lisp/Lisp.java trunk/abcl/src/org/armedbear/lisp/Load.java trunk/abcl/src/org/armedbear/lisp/Pathname.java trunk/abcl/src/org/armedbear/lisp/Site.java Modified: trunk/abcl/src/org/armedbear/lisp/Debug.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Debug.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Debug.java Thu Mar 11 10:49:05 2010 @@ -41,8 +41,9 @@ public static final void assertTrue(boolean b) { if (!b) { - System.err.println("Assertion failed!"); - Error e = new Error(); + String msg = "ABCL Debug.assertTrue() assertion failed!"; + System.err.println(msg); + Error e = new Error(msg); e.printStackTrace(); throw e; } Modified: trunk/abcl/src/org/armedbear/lisp/Lisp.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Lisp.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Lisp.java Thu Mar 11 10:49:05 2010 @@ -1226,16 +1226,32 @@ } else if (truename instanceof Pathname) { load = Pathname.mergePathnames(name, (Pathname) truename, Keyword.NEWEST); } else { - load = name; + if (!Pathname.truename(name).equals(NIL)) { + load = name; + } else { + load = null; + } + } + InputStream input = null; + if (load != null) { + input = load.getInputStream(); + } else { + // Make a last-ditch attempt to load from the boot classpath XXX OSGi hack + URL url = null; + try { + url = Lisp.class.getResource(name.getNamestring()); + input = url.openStream(); + } catch (IOException e) { + error(new LispError("Failed to read class bytes from boot class " + url)); + } } - InputStream input = load.getInputStream(); byte[] bytes = new byte[4096]; try { if (input == null) { - Debug.trace("Pathname: " + name); - Debug.trace("LOAD_TRUENAME_FASL: " + truenameFasl); - Debug.trace("LOAD_TRUENAME: " + truename); - Debug.assertTrue(input != null); + Debug.trace("Pathname: " + name); + Debug.trace("LOAD_TRUENAME_FASL: " + truenameFasl); + Debug.trace("LOAD_TRUENAME: " + truename); + Debug.assertTrue(input != null); } int n = 0; Modified: trunk/abcl/src/org/armedbear/lisp/Load.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Load.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Load.java Thu Mar 11 10:49:05 2010 @@ -252,12 +252,19 @@ Pathname pathname = null; Pathname truename = null; pathname = new Pathname(filename); - Pathname mergedPathname = Pathname.mergePathnames(pathname, Site.getLispHome()); + LispObject bootPath = Site.getLispHome(); + Pathname mergedPathname; + if (bootPath instanceof Pathname) { + mergedPathname = Pathname.mergePathnames(pathname, (Pathname)bootPath); + } else { + mergedPathname = pathname; + } + URL url = null; truename = findLoadableFile(mergedPathname); - if (truename == null || truename.equals(NIL)) { + if (truename == null || truename.equals(NIL) || bootPath.equals(NIL)) { // Make an attempt to use the boot classpath String path = pathname.asEntryPath(); - URL url = Lisp.class.getResource(path); + url = Lisp.class.getResource(path); if (url == null || url.toString().endsWith("/")) { url = Lisp.class.getResource(path + ".abcl"); if (url == null) { @@ -269,16 +276,21 @@ + "'" + path + "'" + " in boot classpath.")); } - Pathname urlPathname = new Pathname(url); - truename = findLoadableFile(urlPathname); - if (truename == null) { - return error(new LispError("Failed to find loadable system file in boot classpath " - + "'" + url + "'")); + if (!bootPath.equals(NIL)) { + Pathname urlPathname = new Pathname(url); + truename = findLoadableFile(urlPathname); + if (truename == null) { + return error(new LispError("Failed to find loadable system file in boot classpath " + + "'" + url + "'")); + } + } else { + truename = null; // We can't represent the FASL in a Pathname (q.v. OSGi) } } // Look for a init FASL inside a packed FASL - if (truename.type.writeToString().equals(COMPILE_FILE_TYPE) && Utilities.checkZipFile(truename)) { + if (truename != null + && truename.type.writeToString().equals(COMPILE_FILE_TYPE) && Utilities.checkZipFile(truename)) { Pathname init = new Pathname(truename.getNamestring()); init.type = COMPILE_FILE_INIT_FASL_TYPE; LispObject t = Pathname.truename(init); @@ -290,7 +302,19 @@ } } - in = truename.getInputStream(); + if (truename != null) { + in = truename.getInputStream(); + } else { + try { + Debug.assertTrue(url != null); + in = url.openStream(); + } catch (IOException e) { + error(new FileError("Failed to load system file: " + + "'" + filename + "'" + + " from URL: " + + "'" + url + "'")); + } + } if (in != null) { final LispThread thread = LispThread.currentThread(); @@ -373,7 +397,9 @@ boolean print, boolean auto) { - return loadFileFromStream(pathname, truename, in, verbose, print, auto, false); + return loadFileFromStream(pathname == null ? NIL : pathname, + truename == null ? NIL : truename, + in, verbose, print, auto, false); } // A nil TRUENAME signals a load from stream which has no possible path Modified: trunk/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Pathname.java Thu Mar 11 10:49:05 2010 @@ -151,8 +151,16 @@ init(s); } + public static boolean isSupportedProtocol(String protocol) { + return "jar".equals(protocol) || "file".equals(protocol); + } + public Pathname(URL url) { String protocol = url.getProtocol(); + if (!isSupportedProtocol(protocol)) { + error(new LispError("Unsupported URL: '" + url.toString() + "'")); + } + if ("jar".equals(protocol)) { init(url.toString()); return; @@ -181,7 +189,8 @@ return; } } - error(new LispError("Unsupported URL: '" + url.toString() + "'")); + error(new LispError("Failed to construct Pathname from URL: " + + "'" + url.toString() + "'")); } static final private String jarSeparator = "!/"; Modified: trunk/abcl/src/org/armedbear/lisp/Site.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Site.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Site.java Thu Mar 11 10:49:05 2010 @@ -42,31 +42,34 @@ public final class Site { - private static Pathname LISP_HOME; + private static LispObject LISP_HOME; private static void init() { String s = System.getProperty("abcl.home"); if (s != null) { String fileSeparator = System.getProperty("file.separator"); if (!s.endsWith(fileSeparator)) { - s += fileSeparator;; + s += fileSeparator; } LISP_HOME = new Pathname(s); - return; } URL url = Lisp.class.getResource("boot.lisp"); if (url != null) { - LISP_HOME = new Pathname(url); - LISP_HOME.name = NIL; - LISP_HOME.type = NIL; - LISP_HOME.invalidateNamestring(); + if (!Pathname.isSupportedProtocol(url.getProtocol())) { + LISP_HOME = NIL; + } else { + Pathname p = new Pathname(url); + p.name = NIL; + p.type = NIL; + p.invalidateNamestring(); + LISP_HOME = p; + } return; } Debug.trace("Unable to determine LISP_HOME."); } - - public static final Pathname getLispHome() + public static final LispObject getLispHome() { if (LISP_HOME == null) { init(); @@ -79,7 +82,7 @@ exportSpecial("*LISP-HOME*", PACKAGE_EXT, NIL); static { - Pathname p = Site.getLispHome(); + LispObject p = Site.getLispHome(); if (p != null) _LISP_HOME_.setSymbolValue(p); } From mevenson at common-lisp.net Fri Mar 12 06:59:02 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Fri, 12 Mar 2010 01:59:02 -0500 Subject: [armedbear-cvs] r12525 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Fri Mar 12 01:59:01 2010 New Revision: 12525 Log: Restore trunk to buildable state after OSGi patch. Modified: trunk/abcl/src/org/armedbear/lisp/Site.java Modified: trunk/abcl/src/org/armedbear/lisp/Site.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Site.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Site.java Fri Mar 12 01:59:01 2010 @@ -52,6 +52,7 @@ s += fileSeparator; } LISP_HOME = new Pathname(s); + return; } URL url = Lisp.class.getResource("boot.lisp"); if (url != null) { From ehuelsmann at common-lisp.net Fri Mar 12 22:38:33 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Fri, 12 Mar 2010 17:38:33 -0500 Subject: [armedbear-cvs] r12526 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Fri Mar 12 17:38:32 2010 New Revision: 12526 Log: Fix ticket #85: CL-JSON throws an error where SBCL doesn't. Modified: trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp Modified: trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp Fri Mar 12 17:38:32 2010 @@ -1078,9 +1078,9 @@ ;; (dolist (name (second symbols-form)) ;; (let ((variable (make-variable :name name :special-p t))) ;; (push - (setf (progv-form block) - `(progv ,symbols-form ,values-form ,@(p1-body body)) - (progv-environment-register block) t) + (setf (progv-environment-register block) t + (progv-form block) + `(progv ,symbols-form ,values-form ,@(p1-body body))) block)) (defknown rewrite-progv (t) t) From ehuelsmann at common-lisp.net Sat Mar 13 18:49:09 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sat, 13 Mar 2010 13:49:09 -0500 Subject: [armedbear-cvs] r12526 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Fri Mar 12 17:38:32 2010 New Revision: 12526 Log: Fix ticket #85: CL-JSON throws an error where SBCL doesn't. Modified: trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp Modified: trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp Fri Mar 12 17:38:32 2010 @@ -1078,9 +1078,9 @@ ;; (dolist (name (second symbols-form)) ;; (let ((variable (make-variable :name name :special-p t))) ;; (push - (setf (progv-form block) - `(progv ,symbols-form ,values-form ,@(p1-body body)) - (progv-environment-register block) t) + (setf (progv-environment-register block) t + (progv-form block) + `(progv ,symbols-form ,values-form ,@(p1-body body))) block)) (defknown rewrite-progv (t) t) From ehuelsmann at common-lisp.net Sat Mar 13 19:05:17 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sat, 13 Mar 2010 14:05:17 -0500 Subject: [armedbear-cvs] r12527 - branches/metaclass/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sat Mar 13 14:05:15 2010 New Revision: 12527 Log: Make all class accessor functions generic functions instead of normal ones, to support METACLASS. Additionally, make it possible to store general objects in Layout.lispClass. Because classes may be of a different Java type than StandardClass, fall back to the generic functions to access the required fields from Java. See #38. Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Autoload.java branches/metaclass/abcl/src/org/armedbear/lisp/Condition.java branches/metaclass/abcl/src/org/armedbear/lisp/Layout.java branches/metaclass/abcl/src/org/armedbear/lisp/LispClass.java branches/metaclass/abcl/src/org/armedbear/lisp/LispObject.java branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java branches/metaclass/abcl/src/org/armedbear/lisp/SlotClass.java branches/metaclass/abcl/src/org/armedbear/lisp/SlotDefinition.java branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java branches/metaclass/abcl/src/org/armedbear/lisp/StandardGenericFunction.java branches/metaclass/abcl/src/org/armedbear/lisp/StandardMethod.java branches/metaclass/abcl/src/org/armedbear/lisp/StandardObject.java branches/metaclass/abcl/src/org/armedbear/lisp/Symbol.java branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Autoload.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/Autoload.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/Autoload.java Sat Mar 13 14:05:15 2010 @@ -684,7 +684,7 @@ autoload(Symbol.SET_CHAR, "StringFunctions"); autoload(Symbol.SET_SCHAR, "StringFunctions"); - autoload(Symbol.SET_CLASS_SLOTS, "SlotClass"); + autoload(Symbol._SET_CLASS_SLOTS, "SlotClass"); autoload(Symbol._CLASS_SLOTS, "SlotClass"); autoload(Symbol.JAVA_EXCEPTION_CAUSE, "JavaException"); Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Condition.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/Condition.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/Condition.java Sat Mar 13 14:05:15 2010 @@ -137,16 +137,18 @@ @Override public LispObject typeOf() { - LispClass c = getLispClass(); - if (c != null) - return c.getName(); + LispObject c = getLispClass(); + if (c instanceof LispClass) + return ((LispClass)c).getName(); + else if (c != null) + return Symbol.CLASS_NAME.execute(c); return Symbol.CONDITION; } @Override public LispObject classOf() { - LispClass c = getLispClass(); + LispObject c = getLispClass(); if (c != null) return c; return StandardClass.CONDITION; Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Layout.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/Layout.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/Layout.java Sat Mar 13 14:05:15 2010 @@ -37,7 +37,7 @@ public class Layout extends LispObject { - private final LispClass lispClass; + private final LispObject lispClass; public final EqHashTable slotTable; private final LispObject[] slotNames; @@ -45,7 +45,7 @@ private boolean invalid; - public Layout(LispClass lispClass, LispObject instanceSlots, LispObject sharedSlots) + public Layout(LispObject lispClass, LispObject instanceSlots, LispObject sharedSlots) { this.lispClass = lispClass; Debug.assertTrue(instanceSlots.listp()); @@ -64,7 +64,7 @@ slotTable = initializeSlotTable(slotNames); } - public Layout(LispClass lispClass, LispObject[] instanceSlotNames, + public Layout(LispObject lispClass, LispObject[] instanceSlotNames, LispObject sharedSlots) { this.lispClass = lispClass; @@ -103,7 +103,7 @@ return result.nreverse(); } - public LispClass getLispClass() + public LispObject getLispClass() { return lispClass; } @@ -159,8 +159,7 @@ LispObject third) { - return new Layout(checkClass(first), checkList(second), - checkList(third)); + return new Layout(first, checkList(second), checkList(third)); } }; @@ -235,7 +234,7 @@ public LispObject execute(LispObject first, LispObject second) { - final Layout layOutFirst = checkLayout(first); + final Layout layOutFirst = checkLayout(first); final LispObject slotNames[] = layOutFirst.slotNames; final int limit = slotNames.length; for (int i = 0; i < limit; i++) @@ -263,11 +262,20 @@ @Override public LispObject execute(LispObject arg) { - final LispClass lispClass = checkClass(arg); - Layout oldLayout = lispClass.getClassLayout(); - Layout newLayout = new Layout(oldLayout); - lispClass.setClassLayout(newLayout); - oldLayout.invalidate(); + final LispObject lispClass = arg; + LispObject oldLayout; + if (lispClass instanceof LispClass) + oldLayout = ((LispClass)lispClass).getClassLayout(); + else + oldLayout = Symbol.CLASS_LAYOUT.execute(lispClass); + + Layout newLayout = new Layout((Layout)oldLayout); + if (lispClass instanceof LispClass) + ((LispClass)lispClass).setClassLayout(newLayout); + else + Symbol.CLASS_LAYOUT.getSymbolSetfFunction() + .execute(newLayout, lispClass); + ((Layout)oldLayout).invalidate(); return arg; } }; Modified: branches/metaclass/abcl/src/org/armedbear/lisp/LispClass.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/LispClass.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/LispClass.java Sat Mar 13 14:05:15 2010 @@ -179,9 +179,9 @@ return classLayout; } - public void setClassLayout(Layout layout) + public void setClassLayout(LispObject layout) { - classLayout = layout; + classLayout = layout == NIL ? null : (Layout)layout; } public final int getLayoutLength() @@ -201,12 +201,12 @@ this.directSuperclasses = directSuperclasses; } - public final boolean isFinalized() + public boolean isFinalized() { return finalized; } - public final void setFinalized(boolean b) + public void setFinalized(boolean b) { finalized = b; } Modified: branches/metaclass/abcl/src/org/armedbear/lisp/LispObject.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/LispObject.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/LispObject.java Sat Mar 13 14:05:15 2010 @@ -668,6 +668,16 @@ return type_error(this, Symbol.SYMBOL); } + public LispObject getSymbolSetfFunction() + { + return type_error(this, Symbol.SYMBOL); + } + + public LispObject getSymbolSetfFunctionOrDie() + { + return type_error(this, Symbol.SYMBOL); + } + public String writeToString() { return toString(); Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java Sat Mar 13 14:05:15 2010 @@ -5331,16 +5331,16 @@ public LispObject execute(LispObject first, LispObject second) { - checkClass(first).setName(checkSymbol(second)); - return second; + checkClass(second).setName(checkSymbol(first)); + return first; } }; // ### class-layout - private static final Primitive CLASS_LAYOUT = new pf_class_layout(); - private static final class pf_class_layout extends Primitive { - pf_class_layout() { - super("class-layout", PACKAGE_SYS, true, "class"); + private static final Primitive CLASS_LAYOUT = new pf__class_layout(); + private static final class pf__class_layout extends Primitive { + pf__class_layout() { + super("%class-layout", PACKAGE_SYS, true, "class"); } @Override @@ -5361,19 +5361,19 @@ public LispObject execute(LispObject first, LispObject second) { - if (second instanceof Layout) { - checkClass(first).setClassLayout((Layout)second); - return second; + if (first == NIL || first instanceof Layout) { + checkClass(second).setClassLayout(first); + return first; } - return type_error(second, Symbol.LAYOUT); + return type_error(first, Symbol.LAYOUT); } }; - // ### class-direct-superclasses - private static final Primitive CLASS_DIRECT_SUPERCLASSES = new pf_class_direct_superclasses(); - private static final class pf_class_direct_superclasses extends Primitive { - pf_class_direct_superclasses() { - super("class-direct-superclasses", PACKAGE_SYS, true); + // ### %class-direct-superclasses + private static final Primitive _CLASS_DIRECT_SUPERCLASSES = new pf__class_direct_superclasses(); + private static final class pf__class_direct_superclasses extends Primitive { + pf__class_direct_superclasses() { + super("%class-direct-superclasses", PACKAGE_SYS, true); } @Override @@ -5393,16 +5393,16 @@ public LispObject execute(LispObject first, LispObject second) { - checkClass(first).setDirectSuperclasses(second); - return second; + checkClass(second).setDirectSuperclasses(first); + return first; } }; - // ### class-direct-subclasses - private static final Primitive CLASS_DIRECT_SUBCLASSES = new pf_class_direct_subclasses(); - private static final class pf_class_direct_subclasses extends Primitive { - pf_class_direct_subclasses() { - super("class-direct-subclasses", PACKAGE_SYS, true); + // ### %class-direct-subclasses + private static final Primitive _CLASS_DIRECT_SUBCLASSES = new pf__class_direct_subclasses(); + private static final class pf__class_direct_subclasses extends Primitive { + pf__class_direct_subclasses() { + super("%class-direct-subclasses", PACKAGE_SYS, true); } @Override @@ -5423,8 +5423,8 @@ public LispObject execute(LispObject first, LispObject second) { - checkClass(first).setDirectSubclasses(second); - return second; + checkClass(second).setDirectSubclasses(first); + return first; } }; @@ -5441,27 +5441,27 @@ } }; - // ### set-class-precedence-list - private static final Primitive SET_CLASS_PRECEDENCE_LIST = new pf_set_class_precedence_list(); - private static final class pf_set_class_precedence_list extends Primitive { - pf_set_class_precedence_list() { - super("set-class-precedence-list", PACKAGE_SYS, true); + // ### %set-class-precedence-list + private static final Primitive _SET_CLASS_PRECEDENCE_LIST = new pf__set_class_precedence_list(); + private static final class pf__set_class_precedence_list extends Primitive { + pf__set_class_precedence_list() { + super("%set-class-precedence-list", PACKAGE_SYS, true); } @Override public LispObject execute(LispObject first, LispObject second) { - checkClass(first).setCPL(second); - return second; + checkClass(second).setCPL(first); + return first; } }; - // ### class-direct-methods - private static final Primitive CLASS_DIRECT_METHODS = new pf_class_direct_methods(); - private static final class pf_class_direct_methods extends Primitive { - pf_class_direct_methods() { - super("class-direct-methods", PACKAGE_SYS, true); + // ### %class-direct-methods + private static final Primitive _CLASS_DIRECT_METHODS = new pf__class_direct_methods(); + private static final class pf__class_direct_methods extends Primitive { + pf__class_direct_methods() { + super("%class-direct-methods", PACKAGE_SYS, true); } @Override @@ -5483,8 +5483,8 @@ public LispObject execute(LispObject first, LispObject second) { - checkClass(first).setDirectMethods(second); - return second; + checkClass(second).setDirectMethods(first); + return first; } }; @@ -5521,11 +5521,11 @@ } }; - // ### class-finalized-p - private static final Primitive CLASS_FINALIZED_P = new pf_class_finalized_p(); - private static final class pf_class_finalized_p extends Primitive { - pf_class_finalized_p() { - super("class-finalized-p", PACKAGE_SYS, true); + // ### %class-finalized-p + private static final Primitive _CLASS_FINALIZED_P = new pf__class_finalized_p(); + private static final class pf__class_finalized_p extends Primitive { + pf__class_finalized_p() { + super("%class-finalized-p", PACKAGE_SYS, true); } @Override @@ -5545,8 +5545,8 @@ public LispObject execute(LispObject first, LispObject second) { - checkClass(first).setFinalized(second != NIL); - return second; + checkClass(second).setFinalized(first != NIL); + return first; } }; Modified: branches/metaclass/abcl/src/org/armedbear/lisp/SlotClass.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/SlotClass.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/SlotClass.java Sat Mar 13 14:05:15 2010 @@ -178,7 +178,7 @@ // ### class-direct-slots private static final Primitive CLASS_DIRECT_SLOTS = - new Primitive("class-direct-slots", PACKAGE_SYS, true) + new Primitive("%class-direct-slots", PACKAGE_SYS, true) { @Override public LispObject execute(LispObject arg) @@ -200,12 +200,12 @@ public LispObject execute(LispObject first, LispObject second) { - if (first instanceof SlotClass) { - ((SlotClass)first).setDirectSlotDefinitions(second); - return second; + if (second instanceof SlotClass) { + ((SlotClass)second).setDirectSlotDefinitions(first); + return first; } else { - return type_error(first, Symbol.STANDARD_CLASS); + return type_error(second, Symbol.STANDARD_CLASS); } } }; @@ -227,26 +227,26 @@ }; // ### set-class-slots - private static final Primitive SET_CLASS_SLOTS = - new Primitive(Symbol.SET_CLASS_SLOTS, "class slot-definitions") + private static final Primitive _SET_CLASS_SLOTS = + new Primitive(Symbol._SET_CLASS_SLOTS, "class slot-definitions") { @Override public LispObject execute(LispObject first, LispObject second) { - if (first instanceof SlotClass) { - ((SlotClass)first).setSlotDefinitions(second); - return second; + if (second instanceof SlotClass) { + ((SlotClass)second).setSlotDefinitions(first); + return first; } else { - return type_error(first, Symbol.STANDARD_CLASS); + return type_error(second, Symbol.STANDARD_CLASS); } } }; // ### class-direct-default-initargs private static final Primitive CLASS_DIRECT_DEFAULT_INITARGS = - new Primitive("class-direct-default-initargs", PACKAGE_SYS, true) + new Primitive("%class-direct-default-initargs", PACKAGE_SYS, true) { @Override public LispObject execute(LispObject arg) @@ -268,17 +268,17 @@ public LispObject execute(LispObject first, LispObject second) { - if (first instanceof SlotClass) { - ((SlotClass)first).setDirectDefaultInitargs(second); - return second; + if (second instanceof SlotClass) { + ((SlotClass)second).setDirectDefaultInitargs(first); + return first; } - return type_error(first, Symbol.STANDARD_CLASS); + return type_error(second, Symbol.STANDARD_CLASS); } }; // ### class-default-initargs private static final Primitive CLASS_DEFAULT_INITARGS = - new Primitive("class-default-initargs", PACKAGE_SYS, true) + new Primitive("%class-default-initargs", PACKAGE_SYS, true) { @Override public LispObject execute(LispObject arg) @@ -300,11 +300,11 @@ public LispObject execute(LispObject first, LispObject second) { - if (first instanceof SlotClass) { - ((SlotClass)first).setDefaultInitargs(second); - return second; + if (second instanceof SlotClass) { + ((SlotClass)second).setDefaultInitargs(first); + return first; } - return type_error(first, Symbol.STANDARD_CLASS); + return type_error(second, Symbol.STANDARD_CLASS); } }; Modified: branches/metaclass/abcl/src/org/armedbear/lisp/SlotDefinition.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/SlotDefinition.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/SlotDefinition.java Sat Mar 13 14:05:15 2010 @@ -70,7 +70,7 @@ slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION] = Keyword.INSTANCE; } - public static SlotDefinition checkSlotDefination(LispObject obj) { + public static SlotDefinition checkSlotDefinition(LispObject obj) { if (obj instanceof SlotDefinition) return (SlotDefinition)obj; return (SlotDefinition)type_error(obj, Symbol.SLOT_DEFINITION); } @@ -117,7 +117,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_NAME]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_NAME]; } }; @@ -130,7 +130,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_NAME] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_NAME] = second; return second; } }; @@ -142,12 +142,12 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITFUNCTION]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITFUNCTION]; } }; // ### set-slot-definition-initfunction - private static final Primitive SET_SLOT_DEFINITION_INITFUNCTION = + static final Primitive SET_SLOT_DEFINITION_INITFUNCTION = new Primitive("set-slot-definition-initfunction", PACKAGE_SYS, true, "slot-definition initfunction") { @@ -155,7 +155,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_INITFUNCTION] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_INITFUNCTION] = second; return second; } }; @@ -168,12 +168,12 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITFORM]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITFORM]; } }; // ### set-slot-definition-initform - private static final Primitive SET_SLOT_DEFINITION_INITFORM = + static final Primitive SET_SLOT_DEFINITION_INITFORM = new Primitive("set-slot-definition-initform", PACKAGE_SYS, true, "slot-definition initform") { @@ -181,7 +181,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_INITFORM] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_INITFORM] = second; return second; } }; @@ -193,7 +193,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITARGS]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_INITARGS]; } }; @@ -206,7 +206,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_INITARGS] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_INITARGS] = second; return second; } }; @@ -219,7 +219,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_READERS]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_READERS]; } }; @@ -232,7 +232,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_READERS] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_READERS] = second; return second; } }; @@ -245,7 +245,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_WRITERS]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_WRITERS]; } }; @@ -258,7 +258,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_WRITERS] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_WRITERS] = second; return second; } }; @@ -271,7 +271,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION]; } }; @@ -284,7 +284,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION] = second; return second; } }; @@ -297,7 +297,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION_CLASS]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION_CLASS]; } }; @@ -310,7 +310,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION_CLASS] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION_CLASS] = second; return second; } }; @@ -322,7 +322,7 @@ @Override public LispObject execute(LispObject arg) { - return checkSlotDefination(arg).slots[SlotDefinitionClass.SLOT_INDEX_LOCATION]; + return checkSlotDefinition(arg).slots[SlotDefinitionClass.SLOT_INDEX_LOCATION]; } }; @@ -334,7 +334,7 @@ public LispObject execute(LispObject first, LispObject second) { - checkSlotDefination(first).slots[SlotDefinitionClass.SLOT_INDEX_LOCATION] = second; + checkSlotDefinition(first).slots[SlotDefinitionClass.SLOT_INDEX_LOCATION] = second; return second; } }; Modified: branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java Sat Mar 13 14:05:15 2010 @@ -58,6 +58,8 @@ = PACKAGE_MOP.intern("DIRECT-DEFAULT-INITARGS"); private static Symbol symDefaultInitargs = PACKAGE_MOP.intern("DEFAULT-INITARGS"); + private static Symbol symFinalizedP + = PACKAGE_MOP.intern("FINALIZED-P"); static Layout layoutStandardClass = new Layout(null, @@ -71,7 +73,8 @@ symDirectSlots, symSlots, symDirectDefaultInitargs, - symDefaultInitargs), + symDefaultInitargs, + symFinalizedP), NIL) { @Override @@ -86,6 +89,7 @@ super(layoutStandardClass); setDirectSuperclasses(NIL); setDirectSubclasses(NIL); + setClassLayout(layoutStandardClass); setCPL(NIL); setDirectMethods(NIL); setDocumentation(NIL); @@ -93,6 +97,7 @@ setSlotDefinitions(NIL); setDirectDefaultInitargs(NIL); setDefaultInitargs(NIL); + setFinalized(false); } public StandardClass(Symbol symbol, LispObject directSuperclasses) @@ -100,6 +105,7 @@ super(layoutStandardClass, symbol, directSuperclasses); setDirectSubclasses(NIL); + setClassLayout(layoutStandardClass); setCPL(NIL); setDirectMethods(NIL); setDocumentation(NIL); @@ -107,6 +113,7 @@ setSlotDefinitions(NIL); setDirectDefaultInitargs(NIL); setDefaultInitargs(NIL); + setFinalized(false); } @Override @@ -129,7 +136,7 @@ } @Override - public void setClassLayout(Layout newLayout) + public void setClassLayout(LispObject newLayout) { setInstanceSlotValue(symLayout, newLayout); } @@ -147,6 +154,18 @@ } @Override + public final boolean isFinalized() + { + return getInstanceSlotValue(symFinalizedP) != NIL; + } + + @Override + public final void setFinalized(boolean b) + { + setInstanceSlotValue(symFinalizedP, b ? T : NIL); + } + + @Override public LispObject getDirectSubclasses() { return getInstanceSlotValue(symDirectSubclasses); @@ -322,6 +341,20 @@ STANDARD_CLASS.setClassLayout(layoutStandardClass); STANDARD_CLASS.setDirectSlotDefinitions(STANDARD_CLASS.getClassLayout().generateSlotDefinitions()); + LispObject slots = STANDARD_CLASS.getDirectSlotDefinitions(); + while (slots != NIL) { + SlotDefinition slot = (SlotDefinition)slots.car(); + if (slot.getName() == symLayout) + SlotDefinition.SET_SLOT_DEFINITION_INITFUNCTION.execute(slot, + new Function() { + at Override + public LispObject execute() { + return NIL; +} + }); + slots = slots.cdr(); + } + } // BuiltInClass.FUNCTION is also null here (see previous comment). @@ -616,6 +649,7 @@ WARNING.setCPL(WARNING, CONDITION, STANDARD_OBJECT, BuiltInClass.CLASS_T); // Condition classes. + STANDARD_CLASS.finalizeClass(); ARITHMETIC_ERROR.finalizeClass(); CELL_ERROR.finalizeClass(); COMPILER_ERROR.finalizeClass(); Modified: branches/metaclass/abcl/src/org/armedbear/lisp/StandardGenericFunction.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/StandardGenericFunction.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/StandardGenericFunction.java Sat Mar 13 14:05:15 2010 @@ -209,7 +209,14 @@ if (name != null) { StringBuilder sb = new StringBuilder(); - sb.append(getLispClass().getName().writeToString()); + LispObject className; + LispObject lispClass = getLispClass(); + if (lispClass instanceof LispClass) + className = ((LispClass)lispClass).getName(); + else + className = Symbol.CLASS_NAME.execute(lispClass); + + sb.append(className.writeToString()); sb.append(' '); sb.append(name.writeToString()); return unreadableString(sb.toString()); Modified: branches/metaclass/abcl/src/org/armedbear/lisp/StandardMethod.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/StandardMethod.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/StandardMethod.java Sat Mar 13 14:05:15 2010 @@ -156,7 +156,14 @@ if (name != null) { StringBuilder sb = new StringBuilder(); - sb.append(getLispClass().getName().writeToString()); + LispObject className; + LispObject lispClass = getLispClass(); + if (lispClass instanceof LispClass) + className = ((LispClass)lispClass).getName(); + else + className = Symbol.CLASS_NAME.execute(lispClass); + + sb.append(className.writeToString()); sb.append(' '); sb.append(name.writeToString()); LispObject specializers = Modified: branches/metaclass/abcl/src/org/armedbear/lisp/StandardObject.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/StandardObject.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/StandardObject.java Sat Mar 13 14:05:15 2010 @@ -46,6 +46,11 @@ } + protected StandardObject(Layout layout) + { + this(layout, layout.getLength()); + } + protected StandardObject(Layout layout, int length) { this.layout = layout; @@ -98,11 +103,29 @@ return parts.nreverse(); } - public final LispClass getLispClass() + public final LispObject getLispClass() { return layout.getLispClass(); } + private LispObject helperGetClassName() + { + final LispObject c1 = layout.getLispClass(); + if (c1 instanceof LispClass) + return ((LispClass)c1).getName(); + else + return LispThread.currentThread().execute(Symbol.CLASS_NAME, c1); + } + + private LispObject helperGetCPL() + { + final LispObject c1 = layout.getLispClass(); + if (c1 instanceof LispClass) + return ((LispClass)c1).getCPL(); + else + return LispThread.currentThread().execute(Symbol.CLASS_PRECEDENCE_LIST, c1); + } + @Override public LispObject typeOf() { @@ -110,10 +133,15 @@ // conditions, TYPE-OF returns the proper name of the class returned by // CLASS-OF if it has a proper name, and otherwise returns the class // itself." - final LispClass c1 = layout.getLispClass(); + final LispObject c1 = layout.getLispClass(); + LispObject name; + if (c1 instanceof LispClass) + name = ((LispClass)c1).getName(); + else + name = LispThread.currentThread().execute(Symbol.CLASS_NAME, c1); + // The proper name of a class is "a symbol that names the class whose // name is that symbol". - final LispObject name = c1.getName(); if (name != NIL && name != UNBOUND_VALUE) { // TYPE-OF.9 @@ -137,20 +165,30 @@ return T; if (type == StandardClass.STANDARD_OBJECT) return T; - LispClass cls = layout != null ? layout.getLispClass() : null; + LispObject cls = layout != null ? layout.getLispClass() : null; if (cls != null) { if (type == cls) return T; - if (type == cls.getName()) + if (type == helperGetClassName()) return T; - LispObject cpl = cls.getCPL(); + LispObject cpl = helperGetCPL(); while (cpl != NIL) { if (type == cpl.car()) return T; - if (type == ((LispClass)cpl.car()).getName()) - return T; + + LispObject otherName; + LispObject otherClass = cpl.car(); + if (otherClass instanceof LispClass) { + if (type == ((LispClass)otherClass).getName()) + return T; + } + else + if (type == LispThread + .currentThread().execute(Symbol.CLASS_NAME, otherClass)) + return T; + cpl = cpl.cdr(); } } @@ -183,10 +221,16 @@ { Debug.assertTrue(layout.isInvalid()); Layout oldLayout = layout; - LispClass cls = oldLayout.getLispClass(); - Layout newLayout = cls.getClassLayout(); + LispObject cls = oldLayout.getLispClass(); + Layout newLayout; + + if (cls instanceof LispClass) + newLayout = ((LispClass)cls).getClassLayout(); + else + newLayout = (Layout)Symbol.CLASS_LAYOUT.execute(cls); + Debug.assertTrue(!newLayout.isInvalid()); - StandardObject newInstance = new StandardObject(cls); + StandardObject newInstance = new StandardObject(newLayout); Debug.assertTrue(newInstance.layout == newLayout); LispObject added = NIL; LispObject discarded = NIL; Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Symbol.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/Symbol.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/Symbol.java Sat Mar 13 14:05:15 2010 @@ -390,8 +390,15 @@ return function; } - public final LispObject getSymbolSetfFunctionOrDie() + @Override + public final LispObject getSymbolSetfFunction() + { + return get(this, Symbol.SETF_FUNCTION, NIL); + } + + @Override + public final LispObject getSymbolSetfFunctionOrDie() { LispObject obj = get(this, Symbol.SETF_FUNCTION, null); if (obj == null) @@ -2913,6 +2920,10 @@ PACKAGE_EXT.addExternalSymbol("*LOAD-TRUENAME-FASL*"); // MOP. + public static final Symbol CLASS_LAYOUT = + PACKAGE_MOP.addInternalSymbol("CLASS-LAYOUT"); + public static final Symbol CLASS_PRECEDENCE_LIST = + PACKAGE_MOP.addInternalSymbol("CLASS-PRECEDENCE-LIST"); public static final Symbol STANDARD_READER_METHOD = PACKAGE_MOP.addExternalSymbol("STANDARD-READER-METHOD"); @@ -2965,8 +2976,8 @@ PACKAGE_SYS.addExternalSymbol("NAMED-LAMBDA"); public static final Symbol OUTPUT_OBJECT = PACKAGE_SYS.addExternalSymbol("OUTPUT-OBJECT"); - public static final Symbol SET_CLASS_SLOTS = - PACKAGE_SYS.addExternalSymbol("SET-CLASS-SLOTS"); + public static final Symbol _SET_CLASS_SLOTS = + PACKAGE_SYS.addExternalSymbol("%SET-CLASS-SLOTS"); public static final Symbol SETF_FUNCTION = PACKAGE_SYS.addExternalSymbol("SETF-FUNCTION"); public static final Symbol SETF_INVERSE = Modified: branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp Sat Mar 13 14:05:15 2010 @@ -53,8 +53,52 @@ (export '(class-precedence-list class-slots)) -(defun class-slots (class) - (%class-slots class)) +;; Don't use DEFVAR, because that disallows loading clos.lisp +;; after compiling it: the binding won't get assigned to T anymore +(defparameter *clos-booting* t) + +(defmacro define-class->%class-forwarder (name) + (let* (($name (if (consp name) (cadr name) name)) + (%name (intern (concatenate 'string + "%" + (if (consp name) + (symbol-name 'set-) "") + (symbol-name $name)) + (symbol-package $name)))) + `(progn + (declaim (notinline ,name)) + (defun ,name (&rest args) + (apply #',%name args))))) + +(define-class->%class-forwarder class-name) +(define-class->%class-forwarder (setf class-name)) +(define-class->%class-forwarder class-slots) +(define-class->%class-forwarder (setf class-slots)) +(define-class->%class-forwarder class-direct-slots) +(define-class->%class-forwarder (setf class-direct-slots)) +(define-class->%class-forwarder class-layout) +(define-class->%class-forwarder (setf class-layout)) +(define-class->%class-forwarder class-direct-superclasses) +(define-class->%class-forwarder (setf class-direct-superclasses)) +(define-class->%class-forwarder class-direct-subclasses) +(define-class->%class-forwarder (setf class-direct-subclasses)) +(define-class->%class-forwarder class-direct-methods) +(define-class->%class-forwarder (setf class-direct-methods)) +(define-class->%class-forwarder class-precedence-list) +(define-class->%class-forwarder (setf class-precedence-list)) +(define-class->%class-forwarder class-finalized-p) +(define-class->%class-forwarder (setf class-finalized-p)) +(define-class->%class-forwarder class-default-initargs) +(define-class->%class-forwarder (setf class-default-initargs)) +(define-class->%class-forwarder class-direct-default-initargs) +(define-class->%class-forwarder (setf class-direct-default-initargs)) + +(defun no-applicable-method (generic-function &rest args) + (error "There is no applicable method for the generic function ~S when called with arguments ~S." + generic-function + args)) + + (defmacro push-on-end (value location) `(setf ,location (nconc ,location (list ,value)))) @@ -85,15 +129,6 @@ (cons (funcall fun (car x) (cadr x)) (mapplist fun (cddr x))))) -(defsetf class-layout %set-class-layout) -(defsetf class-direct-superclasses %set-class-direct-superclasses) -(defsetf class-direct-subclasses %set-class-direct-subclasses) -(defsetf class-direct-methods %set-class-direct-methods) -(defsetf class-direct-slots %set-class-direct-slots) -;; (defsetf class-slots %set-class-slots) -(defsetf class-direct-default-initargs %set-class-direct-default-initargs) -(defsetf class-default-initargs %set-class-default-initargs) -(defsetf class-finalized-p %set-class-finalized-p) (defsetf std-instance-layout %set-std-instance-layout) (defsetf standard-instance-access %set-standard-instance-access) @@ -254,25 +289,23 @@ ;;; finalize-inheritance (defun std-finalize-inheritance (class) - (set-class-precedence-list - class + (setf (class-precedence-list class) (funcall (if (eq (class-of class) (find-class 'standard-class)) #'std-compute-class-precedence-list #'compute-class-precedence-list) class)) - (dolist (class (%class-precedence-list class)) + (dolist (class (class-precedence-list class)) (when (typep class 'forward-referenced-class) (return-from std-finalize-inheritance))) - (set-class-slots class - (funcall (if (eq (class-of class) (find-class 'standard-class)) - #'std-compute-slots - #'compute-slots) - class)) + (setf (class-slots class) + (funcall (if (eq (class-of class) (find-class 'standard-class)) + #'std-compute-slots + #'compute-slots) class)) (let ((old-layout (class-layout class)) (length 0) (instance-slots '()) (shared-slots '())) - (dolist (slot (%class-slots class)) + (dolist (slot (class-slots class)) (case (%slot-definition-allocation slot) (:instance (set-slot-definition-location slot length) @@ -292,7 +325,7 @@ (let* ((slot-name (car location)) (old-location (layout-slot-location old-layout slot-name))) (unless old-location - (let* ((slot-definition (find slot-name (%class-slots class) :key #'%slot-definition-name)) + (let* ((slot-definition (find slot-name (class-slots class) :key #'%slot-definition-name)) (initfunction (%slot-definition-initfunction slot-definition))) (when initfunction (setf (cdr location) (funcall initfunction)))))))) @@ -392,7 +425,7 @@ (defun std-compute-slots (class) (let* ((all-slots (mapappend #'class-direct-slots - (%class-precedence-list class))) + (class-precedence-list class))) (all-names (remove-duplicates (mapcar #'%slot-definition-name all-slots)))) (mapcar #'(lambda (name) @@ -431,7 +464,7 @@ ;;; references. (defun find-slot-definition (class slot-name) - (dolist (slot (%class-slots class) nil) + (dolist (slot (class-slots class) nil) (when (eq slot-name (%slot-definition-name slot)) (return slot)))) @@ -481,7 +514,7 @@ (slot-makunbound-using-class (class-of object) object slot-name))) (defun std-slot-exists-p (instance slot-name) - (not (null (find slot-name (%class-slots (class-of instance)) + (not (null (find slot-name (class-slots (class-of instance)) :key #'%slot-definition-name)))) (defun slot-exists-p (object slot-name) @@ -499,9 +532,10 @@ &allow-other-keys) (declare (ignore metaclass)) (let ((class (std-allocate-instance (find-class 'standard-class)))) - (%set-class-name class name) - (setf (class-direct-subclasses class) ()) - (setf (class-direct-methods class) ()) + (%set-class-name name class) + (%set-class-layout nil class) + (%set-class-direct-subclasses () class) + (%set-class-direct-methods () class) (%set-class-documentation class documentation) (std-after-initialization-for-classes class :direct-superclasses direct-superclasses @@ -537,8 +571,9 @@ (defun canonical-slot-name (canonical-slot) (getf canonical-slot :name)) -(defun ensure-class (name &rest all-keys &allow-other-keys) +(defun ensure-class (name &rest all-keys &key metaclass &allow-other-keys) ;; Check for duplicate slots. + (remf all-keys :metaclass) (let ((slots (getf all-keys :direct-slots))) (dolist (s1 slots) (let ((name1 (canonical-slot-name s1))) @@ -563,7 +598,7 @@ (when (typep class 'built-in-class) (error "Attempt to define a subclass of a built-in-class: ~S" class)))) (let ((old-class (find-class name nil))) - (cond ((and old-class (eq name (%class-name old-class))) + (cond ((and old-class (eq name (class-name old-class))) (cond ((typep old-class 'built-in-class) (error "The symbol ~S names a built-in class." name)) ((typep old-class 'forward-referenced-class) @@ -582,8 +617,11 @@ (apply #'std-after-initialization-for-classes old-class all-keys) old-class))) (t - (let ((class (apply #'make-instance-standard-class - (find-class 'standard-class) + (let ((class (apply (if metaclass + #'make-instance + #'make-instance-standard-class) + (or metaclass + (find-class 'standard-class)) :name name all-keys))) (%set-find-class name class) class))))) @@ -831,7 +869,8 @@ (finalize-generic-function gf)) gf) (progn - (when (fboundp function-name) + (when (and (null *clos-booting*) + (fboundp function-name)) (error 'program-error :format-control "~A already names an ordinary function, macro, or special operator." :format-arguments (list function-name))) @@ -1780,26 +1819,68 @@ (autocompile fast-function)) ))) -(fmakunbound 'class-name) -(fmakunbound '(setf class-name)) - -(defgeneric class-name (class)) - -(defmethod class-name ((class class)) - (%class-name class)) - -(defgeneric (setf class-name) (new-value class)) - -(defmethod (setf class-name) (new-value (class class)) - (%set-class-name class new-value)) - -(when (autoloadp 'class-precedence-list) - (fmakunbound 'class-precedence-list)) - -(defgeneric class-precedence-list (class)) - -(defmethod class-precedence-list ((class class)) - (%class-precedence-list class)) +(defmacro redefine-class-forwarder (name slot &optional alternative-name) + (let* (($name (if (consp name) (cadr name) name)) + (%name (intern (concatenate 'string + "%" + (if (consp name) + (symbol-name 'set-) "") + (symbol-name $name)) + (find-package "SYS")))) + (unless alternative-name + (setf alternative-name name)) + (if (consp name) + `(progn ;; setter + (defgeneric ,alternative-name (new-value class)) + (defmethod ,alternative-name (new-value (class built-in-class)) + (,%name new-value class)) + (defmethod ,alternative-name (new-value (class forward-referenced-class)) + (,%name new-value class)) + (defmethod ,alternative-name (new-value (class structure-class)) + (,%name new-value class)) + (defmethod ,alternative-name (new-value (class standard-class)) + (setf (slot-value class ',slot) new-value)) + ,@(unless (eq name alternative-name) + `((setf (get ',$name 'SETF-FUNCTION) + (symbol-function ',alternative-name)))) + ) + `(progn ;; getter + (defgeneric ,alternative-name (class)) + (defmethod ,alternative-name ((class built-in-class)) + (,%name class)) + (defmethod ,alternative-name ((class forward-referenced-class)) + (,%name class)) + (defmethod ,alternative-name ((class structure-class)) + (,%name class)) + (defmethod ,alternative-name ((class standard-class)) + (slot-value class ',slot)) + ,@(unless (eq name alternative-name) + `((setf (symbol-function ',$name) + (symbol-function ',alternative-name)))) + ) ))) + +(redefine-class-forwarder class-name name) +(redefine-class-forwarder (setf class-name) name) +(redefine-class-forwarder class-slots slots) +(redefine-class-forwarder (setf class-slots) slots) +(redefine-class-forwarder class-direct-slots direct-slots) +(redefine-class-forwarder (setf class-direct-slots) direct-slots) +(redefine-class-forwarder class-layout layout) +(redefine-class-forwarder (setf class-layout) layout) +(redefine-class-forwarder class-direct-superclasses direct-superclasses) +(redefine-class-forwarder (setf class-direct-superclasses) direct-superclasses) +(redefine-class-forwarder class-direct-subclasses direct-subclasses) +(redefine-class-forwarder (setf class-direct-subclasses) direct-subclasses) +(redefine-class-forwarder class-direct-methods direct-methods !class-direct-methods) +(redefine-class-forwarder (setf class-direct-methods) direct-methods !!class-direct-methods) +(redefine-class-forwarder class-precedence-list class-precedence-list) +(redefine-class-forwarder (setf class-precedence-list) class-precedence-list) +(redefine-class-forwarder class-finalized-p finalized-p) +(redefine-class-forwarder (setf class-finalized-p) finalized-p) +(redefine-class-forwarder class-default-initargs default-initargs) +(redefine-class-forwarder (setf class-default-initargs) default-initargs) +(redefine-class-forwarder class-direct-default-initargs direct-default-initargs) +(redefine-class-forwarder (setf class-direct-default-initargs) direct-default-initargs) @@ -1950,7 +2031,7 @@ (std-slot-exists-p instance slot-name)) (defmethod slot-exists-p-using-class ((class structure-class) instance slot-name) - (dolist (dsd (%class-slots class)) + (dolist (dsd (class-slots class)) (when (eq (sys::dsd-name dsd) slot-name) (return-from slot-exists-p-using-class t))) nil) @@ -1969,6 +2050,7 @@ (defmethod slot-missing ((class t) instance slot-name operation &optional new-value) (declare (ignore new-value)) + (mapcar #'print (mapcar #'frame-to-string (sys::backtrace))) (error "The slot ~S is missing from the class ~S." slot-name class)) (defgeneric slot-unbound (class instance slot-name)) @@ -1986,8 +2068,8 @@ (defmethod allocate-instance ((class structure-class) &rest initargs) (declare (ignore initargs)) - (%make-structure (%class-name class) - (make-list (length (%class-slots class)) + (%make-structure (class-name class) + (make-list (length (class-slots class)) :initial-element +slot-unbound+))) ;; "The set of valid initialization arguments for a class is the set of valid @@ -2012,7 +2094,7 @@ (if initargs `(,instance , at initargs) (list instance))))) - (slots (%class-slots (class-of instance)))) + (slots (class-slots (class-of instance)))) (do* ((tail initargs (cddr tail)) (initarg (car tail) (car tail))) ((null tail)) @@ -2095,7 +2177,7 @@ (error 'program-error :format-control "Invalid initarg ~S." :format-arguments (list initarg)))) - (dolist (slot (%class-slots (class-of instance))) + (dolist (slot (class-slots (class-of instance))) (let ((slot-name (%slot-definition-name slot))) (multiple-value-bind (init-key init-value foundp) (get-properties all-keys (%slot-definition-initargs slot)) @@ -2120,8 +2202,8 @@ (defmethod change-class ((old-instance standard-object) (new-class standard-class) &rest initargs) - (let ((old-slots (%class-slots (class-of old-instance))) - (new-slots (%class-slots new-class)) + (let ((old-slots (class-slots (class-of old-instance))) + (new-slots (class-slots new-class)) (new-instance (allocate-instance new-class))) ;; "The values of local slots specified by both the class CTO and the class ;; CFROM are retained. If such a local slot was unbound, it remains @@ -2153,7 +2235,7 @@ (remove-if #'(lambda (slot-name) (slot-exists-p old slot-name)) (mapcar #'%slot-definition-name - (%class-slots (class-of new)))))) + (class-slots (class-of new)))))) (check-initargs new added-slots initargs) (apply #'shared-initialize new added-slots initargs))) @@ -2340,7 +2422,7 @@ (defmethod make-load-form ((class class) &optional environment) (declare (ignore environment)) - (let ((name (%class-name class))) + (let ((name (class-name class))) (unless (and name (eq (find-class name nil) class)) (error 'simple-type-error :format-control "Can't use anonymous or undefined class as a constant: ~S." @@ -2355,6 +2437,7 @@ (let ((message (apply #'format nil format-control args))) (error "Method combination error in CLOS dispatch:~% ~A" message))) +(fmakunbound 'no-applicable-method) (defgeneric no-applicable-method (generic-function &rest args)) (defmethod no-applicable-method (generic-function &rest args) @@ -2393,5 +2476,6 @@ ;; FIXME (defgeneric function-keywords (method)) +(setf *clos-booting* nil) (provide 'clos) From ehuelsmann at common-lisp.net Sat Mar 13 21:48:00 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sat, 13 Mar 2010 16:48:00 -0500 Subject: [armedbear-cvs] r12528 - branches/metaclass/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sat Mar 13 16:47:59 2010 New Revision: 12528 Log: Reference #38: make the following snippet work: (defclass g (standard-class) ()) (defclass h () () (:metaclass g)) (make-instance 'h) Modified: branches/metaclass/abcl/src/org/armedbear/lisp/LispClass.java branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java branches/metaclass/abcl/src/org/armedbear/lisp/SlotClass.java branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java branches/metaclass/abcl/src/org/armedbear/lisp/StandardObjectFunctions.java branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp Modified: branches/metaclass/abcl/src/org/armedbear/lisp/LispClass.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/LispClass.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/LispClass.java Sat Mar 13 16:47:59 2010 @@ -48,6 +48,15 @@ return c; } + public static LispObject addClass(Symbol symbol, LispObject c) + { + synchronized (map) + { + map.put(symbol, c); + } + return c; + } + public static void removeClass(Symbol symbol) { synchronized (map) @@ -68,10 +77,10 @@ { final Symbol symbol = checkSymbol(name); - final LispClass c; + final LispObject c; synchronized (map) { - c = (LispClass) map.get(symbol); + c = map.get(symbol); } if (c != null) return c; @@ -291,13 +300,29 @@ public boolean subclassp(LispObject obj) { - LispObject cpl = getCPL(); + return false; + } + + public static boolean subclassp(LispObject cls, LispObject obj) + { + LispObject cpl; + + if (cls instanceof LispClass) + cpl = ((LispClass)cls).getCPL(); + else + cpl = Symbol.CLASS_PRECEDENCE_LIST.execute(cls); + while (cpl != NIL) { if (cpl.car() == obj) return true; cpl = ((Cons)cpl).cdr; } + + if (cls instanceof LispClass) + // additional checks (currently because of JavaClass) + return ((LispClass)cls).subclassp(obj); + return false; } @@ -340,8 +365,7 @@ removeClass(name); return second; } - final LispClass c = checkClass(second); - addClass(name, c); + addClass(name, second); return second; } }; @@ -354,8 +378,7 @@ public LispObject execute(LispObject first, LispObject second) { - final LispClass c = checkClass(first); - return c.subclassp(second) ? T : NIL; + return LispClass.subclassp(first, second) ? T : NIL; } }; } Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java Sat Mar 13 16:47:59 2010 @@ -5316,7 +5316,10 @@ @Override public LispObject execute(LispObject arg) { - return checkClass(arg).getName(); + if (arg instanceof LispClass) + return ((LispClass)arg).getName(); + + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symName); } }; @@ -5331,7 +5334,11 @@ public LispObject execute(LispObject first, LispObject second) { - checkClass(second).setName(checkSymbol(first)); + if (second instanceof LispClass) + ((LispClass)second).setName(checkSymbol(first)); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symName, + checkSymbol(first)); return first; } }; @@ -5345,7 +5352,12 @@ @Override public LispObject execute(LispObject arg) { - Layout layout = checkClass(arg).getClassLayout(); + Layout layout; + if (arg instanceof LispClass) + layout = ((LispClass)arg).getClassLayout(); + else + layout = (Layout)((StandardObject)arg).getInstanceSlotValue(StandardClass.symLayout); + return layout != null ? layout : NIL; } }; @@ -5362,7 +5374,10 @@ { if (first == NIL || first instanceof Layout) { - checkClass(second).setClassLayout(first); + if (second instanceof LispClass) + ((LispClass)second).setClassLayout(first); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symLayout, first); return first; } return type_error(first, Symbol.LAYOUT); @@ -5378,7 +5393,10 @@ @Override public LispObject execute(LispObject arg) { - return checkClass(arg).getDirectSuperclasses(); + if (arg instanceof LispClass) + return ((LispClass)arg).getDirectSuperclasses(); + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symDirectSuperclasses); } }; @@ -5391,9 +5409,11 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(second).setDirectSuperclasses(first); + if (second instanceof LispClass) + ((LispClass)second).setDirectSuperclasses(first); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symDirectSuperclasses, first); return first; } }; @@ -5407,7 +5427,10 @@ @Override public LispObject execute(LispObject arg) { - return checkClass(arg).getDirectSubclasses(); + if (arg instanceof LispClass) + return ((LispClass)arg).getDirectSubclasses(); + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symDirectSubclasses); } }; @@ -5421,9 +5444,11 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(second).setDirectSubclasses(first); + if (second instanceof LispClass) + ((LispClass)second).setDirectSubclasses(first); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symDirectSubclasses, first); return first; } }; @@ -5437,7 +5462,10 @@ @Override public LispObject execute(LispObject arg) { - return checkClass(arg).getCPL(); + if (arg instanceof LispClass) + return ((LispClass)arg).getCPL(); + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symClassPrecedenceList); } }; @@ -5450,9 +5478,11 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(second).setCPL(first); + if (second instanceof LispClass) + ((LispClass)second).setCPL(first); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symClassPrecedenceList, first); return first; } }; @@ -5466,9 +5496,11 @@ @Override public LispObject execute(LispObject arg) - { - return checkClass(arg).getDirectMethods(); + if (arg instanceof LispClass) + return ((LispClass)arg).getDirectMethods(); + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symDirectMethods); } }; @@ -5481,9 +5513,11 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(second).setDirectMethods(first); + if (second instanceof LispClass) + ((LispClass)second).setDirectMethods(first); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symDirectMethods, first); return first; } }; @@ -5500,7 +5534,10 @@ public LispObject execute(LispObject arg) { - return checkClass(arg).getDocumentation(); + if (arg instanceof LispClass) + return ((LispClass)arg).getDocumentation(); + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symDocumentation); } }; @@ -5514,9 +5551,11 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(first).setDocumentation(second); + if (first instanceof LispClass) + ((LispClass)first).setDocumentation(second); + else + ((StandardObject)first).setInstanceSlotValue(StandardClass.symDocumentation, second); return second; } }; @@ -5530,7 +5569,10 @@ @Override public LispObject execute(LispObject arg) { - return checkClass(arg).isFinalized() ? T : NIL; + if (arg instanceof LispClass) + return ((LispClass)arg).isFinalized() ? T : NIL; + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symFinalizedP); } }; @@ -5543,9 +5585,11 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(second).setFinalized(first != NIL); + if (second instanceof LispClass) + ((LispClass)second).setFinalized(first != NIL); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symFinalizedP, first); return first; } }; Modified: branches/metaclass/abcl/src/org/armedbear/lisp/SlotClass.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/SlotClass.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/SlotClass.java Sat Mar 13 16:47:59 2010 @@ -308,22 +308,4 @@ } }; - // ### compute-class-default-initargs - private static final Primitive COMPUTE_CLASS_DEFAULT_INITARGS = - new Primitive("compute-class-default-initargs", PACKAGE_SYS, true) - { - @Override - public LispObject execute(LispObject arg) - - { - final SlotClass c; - if (arg instanceof SlotClass) { - c = (SlotClass) arg; - } - else { - return type_error(arg, Symbol.STANDARD_CLASS); - } - return c.computeDefaultInitargs(); - } - }; } Modified: branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java Sat Mar 13 16:47:59 2010 @@ -38,27 +38,27 @@ public class StandardClass extends SlotClass { - private static Symbol symName = PACKAGE_MOP.intern("NAME"); - private static Symbol symLayout = PACKAGE_MOP.intern("LAYOUT"); - private static Symbol symDirectSuperclasses + public static Symbol symName = PACKAGE_MOP.intern("NAME"); + public static Symbol symLayout = PACKAGE_MOP.intern("LAYOUT"); + public static Symbol symDirectSuperclasses = PACKAGE_MOP.intern("DIRECT-SUPERCLASSES"); - private static Symbol symDirectSubclasses + public static Symbol symDirectSubclasses = PACKAGE_MOP.intern("DIRECT-SUBCLASSES"); - private static Symbol symClassPrecedenceList + public static Symbol symClassPrecedenceList = PACKAGE_MOP.intern("CLASS-PRECEDENCE-LIST"); - private static Symbol symDirectMethods + public static Symbol symDirectMethods = PACKAGE_MOP.intern("DIRECT-METHODS"); - private static Symbol symDocumentation + public static Symbol symDocumentation = PACKAGE_MOP.intern("DOCUMENTATION"); - private static Symbol symDirectSlots + public static Symbol symDirectSlots = PACKAGE_MOP.intern("DIRECT-SLOTS"); - private static Symbol symSlots + public static Symbol symSlots = PACKAGE_MOP.intern("SLOTS"); - private static Symbol symDirectDefaultInitargs + public static Symbol symDirectDefaultInitargs = PACKAGE_MOP.intern("DIRECT-DEFAULT-INITARGS"); - private static Symbol symDefaultInitargs + public static Symbol symDefaultInitargs = PACKAGE_MOP.intern("DEFAULT-INITARGS"); - private static Symbol symFinalizedP + public static Symbol symFinalizedP = PACKAGE_MOP.intern("FINALIZED-P"); static Layout layoutStandardClass = Modified: branches/metaclass/abcl/src/org/armedbear/lisp/StandardObjectFunctions.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/StandardObjectFunctions.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/StandardObjectFunctions.java Sat Mar 13 16:47:59 2010 @@ -47,7 +47,11 @@ if (arg == StandardClass.STANDARD_CLASS) return new StandardClass(); if (arg instanceof StandardClass) - return ((StandardClass)arg).allocateInstance(); + return ((StandardClass)arg).allocateInstance(); + if (arg.typep(StandardClass.STANDARD_CLASS) != NIL) { + Layout layout = (Layout)Symbol.CLASS_LAYOUT.execute(arg); + return new StandardObject(layout); + } return type_error(arg, Symbol.STANDARD_CLASS); } }; Modified: branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp Sat Mar 13 16:47:59 2010 @@ -288,6 +288,12 @@ ;;; finalize-inheritance +(defun std-compute-class-default-initargs (class) + (mapcan #'(lambda (c) + (copy-list + (class-direct-default-initargs c))) + (class-precedence-list class))) + (defun std-finalize-inheritance (class) (setf (class-precedence-list class) (funcall (if (eq (class-of class) (find-class 'standard-class)) @@ -331,7 +337,8 @@ (setf (cdr location) (funcall initfunction)))))))) (setf (class-layout class) (make-layout class (nreverse instance-slots) (nreverse shared-slots)))) - (setf (class-default-initargs class) (compute-class-default-initargs class)) + (setf (class-default-initargs class) + (std-compute-class-default-initargs class)) (setf (class-finalized-p class) t)) ;;; Class precedence lists From ehuelsmann at common-lisp.net Sat Mar 13 22:51:25 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sat, 13 Mar 2010 17:51:25 -0500 Subject: [armedbear-cvs] r12529 - branches/metaclass/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sat Mar 13 17:51:23 2010 New Revision: 12529 Log: Re #38: CLASSP can't be checked with instanceof alone any longer. Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java branches/metaclass/abcl/src/org/armedbear/lisp/compiler-pass2.lisp Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java Sat Mar 13 17:51:23 2010 @@ -5603,7 +5603,7 @@ @Override public LispObject execute(LispObject arg) { - return arg instanceof LispClass ? T : NIL; + return (arg instanceof LispClass) ? T : arg.typep(Symbol.CLASS); } }; Modified: branches/metaclass/abcl/src/org/armedbear/lisp/compiler-pass2.lisp ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/compiler-pass2.lisp (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/compiler-pass2.lisp Sat Mar 13 17:51:23 2010 @@ -3402,7 +3402,6 @@ (BIT-VECTOR-P p2-test-bit-vector-p) (CHAR= p2-test-char=) (CHARACTERP p2-test-characterp) - (CLASSP p2-test-classp) (CONSP p2-test-consp) (CONSTANTP p2-test-constantp) (ENDP p2-test-endp) @@ -3543,9 +3542,6 @@ (defun p2-test-special-variable-p (form) (p2-test-predicate form "isSpecialVariable")) -(defun p2-test-classp (form) - (p2-test-instanceof-predicate form +lisp-class-class+)) - (defun p2-test-symbolp (form) (p2-test-instanceof-predicate form +lisp-symbol-class+)) @@ -4827,9 +4823,6 @@ (defun p2-characterp (form target representation) (p2-instanceof-predicate form target representation +lisp-character-class+)) -(defun p2-classp (form target representation) - (p2-instanceof-predicate form target representation +lisp-class-class+)) - (defun p2-consp (form target representation) (p2-instanceof-predicate form target representation +lisp-cons-class+)) @@ -8875,7 +8868,6 @@ (install-p2-handler 'java:jmethod 'p2-java-jmethod) (install-p2-handler 'char= 'p2-char=) (install-p2-handler 'characterp 'p2-characterp) - (install-p2-handler 'classp 'p2-classp) (install-p2-handler 'coerce-to-function 'p2-coerce-to-function) (install-p2-handler 'cons 'p2-cons) (install-p2-handler 'sys::backq-cons 'p2-cons) From ehuelsmann at common-lisp.net Sun Mar 14 13:21:00 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 14 Mar 2010 09:21:00 -0400 Subject: [armedbear-cvs] r12530 - branches/metaclass/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sun Mar 14 09:18:06 2010 New Revision: 12530 Log: Re #38: Make method creation and dispatch possible for classes with non-standard-class metaclasses. Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java branches/metaclass/abcl/src/org/armedbear/lisp/SlotDefinition.java branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/Primitives.java Sun Mar 14 09:18:06 2010 @@ -5465,7 +5465,7 @@ if (arg instanceof LispClass) return ((LispClass)arg).getCPL(); else - return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symClassPrecedenceList); + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symPrecedenceList); } }; @@ -5482,7 +5482,7 @@ if (second instanceof LispClass) ((LispClass)second).setCPL(first); else - ((StandardObject)second).setInstanceSlotValue(StandardClass.symClassPrecedenceList, first); + ((StandardObject)second).setInstanceSlotValue(StandardClass.symPrecedenceList, first); return first; } }; Modified: branches/metaclass/abcl/src/org/armedbear/lisp/SlotDefinition.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/SlotDefinition.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/SlotDefinition.java Sun Mar 14 09:18:06 2010 @@ -69,7 +69,21 @@ slots[SlotDefinitionClass.SLOT_INDEX_READERS] = readers; slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION] = Keyword.INSTANCE; } - + + public SlotDefinition(LispObject name, LispObject readers, + Function initFunction) + { + this(); + Debug.assertTrue(name instanceof Symbol); + slots[SlotDefinitionClass.SLOT_INDEX_NAME] = name; + slots[SlotDefinitionClass.SLOT_INDEX_INITFUNCTION] = initFunction; + slots[SlotDefinitionClass.SLOT_INDEX_INITFORM] = NIL; + slots[SlotDefinitionClass.SLOT_INDEX_INITARGS] = + new Cons(PACKAGE_KEYWORD.intern(((Symbol)name).getName())); + slots[SlotDefinitionClass.SLOT_INDEX_READERS] = readers; + slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION] = Keyword.INSTANCE; + } + public static SlotDefinition checkSlotDefinition(LispObject obj) { if (obj instanceof SlotDefinition) return (SlotDefinition)obj; return (SlotDefinition)type_error(obj, Symbol.SLOT_DEFINITION); Modified: branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/StandardClass.java Sun Mar 14 09:18:06 2010 @@ -44,8 +44,8 @@ = PACKAGE_MOP.intern("DIRECT-SUPERCLASSES"); public static Symbol symDirectSubclasses = PACKAGE_MOP.intern("DIRECT-SUBCLASSES"); - public static Symbol symClassPrecedenceList - = PACKAGE_MOP.intern("CLASS-PRECEDENCE-LIST"); + public static Symbol symPrecedenceList + = PACKAGE_MOP.intern("PRECEDENCE-LIST"); public static Symbol symDirectMethods = PACKAGE_MOP.intern("DIRECT-METHODS"); public static Symbol symDocumentation @@ -67,7 +67,7 @@ symLayout, symDirectSuperclasses, symDirectSubclasses, - symClassPrecedenceList, + symPrecedenceList, symDirectMethods, symDocumentation, symDirectSlots, @@ -180,7 +180,7 @@ @Override public LispObject getCPL() { - return getInstanceSlotValue(symClassPrecedenceList); + return getInstanceSlotValue(symPrecedenceList); } @Override @@ -188,14 +188,14 @@ { LispObject obj1 = cpl[0]; if (obj1.listp() && cpl.length == 1) - setInstanceSlotValue(symClassPrecedenceList, obj1); + setInstanceSlotValue(symPrecedenceList, obj1); else { Debug.assertTrue(obj1 == this); LispObject l = NIL; for (int i = cpl.length; i-- > 0;) l = new Cons(cpl[i], l); - setInstanceSlotValue(symClassPrecedenceList, l); + setInstanceSlotValue(symPrecedenceList, l); } } @@ -316,6 +316,42 @@ return unreadableString(sb.toString()); } + private static final LispObject standardClassSlotDefinitions() + { + // (CONSTANTLY NIL) + Function initFunction = new Function() { + @Override + public LispObject execute() + { + return NIL; + } + }; + + return + list(helperMakeSlotDefinition("NAME", initFunction), + helperMakeSlotDefinition("LAYOUT", initFunction), + helperMakeSlotDefinition("DIRECT-SUPERCLASSES", initFunction), + helperMakeSlotDefinition("DIRECT-SUBCLASSES", initFunction), + helperMakeSlotDefinition("PRECEDENCE-LIST", initFunction), + helperMakeSlotDefinition("DIRECT-METHODS", initFunction), + helperMakeSlotDefinition("DIRECT-SLOTS", initFunction), + helperMakeSlotDefinition("SLOTS", initFunction), + helperMakeSlotDefinition("DIRECT-DEFAULT-INITARGS", initFunction), + helperMakeSlotDefinition("DEFAULT-INITARGS", initFunction), + helperMakeSlotDefinition("FINALIZED-P", initFunction)); + } + + + + private static final SlotDefinition helperMakeSlotDefinition(String name, + Function init) + { + return + new SlotDefinition(PACKAGE_MOP.intern(name), // name + list(PACKAGE_MOP.intern("CLASS-" + name)), // readers + init); + } + private static final StandardClass addStandardClass(Symbol name, LispObject directSuperclasses) { @@ -340,21 +376,7 @@ addClass(Symbol.SLOT_DEFINITION, SLOT_DEFINITION); STANDARD_CLASS.setClassLayout(layoutStandardClass); - STANDARD_CLASS.setDirectSlotDefinitions(STANDARD_CLASS.getClassLayout().generateSlotDefinitions()); - LispObject slots = STANDARD_CLASS.getDirectSlotDefinitions(); - while (slots != NIL) { - SlotDefinition slot = (SlotDefinition)slots.car(); - if (slot.getName() == symLayout) - SlotDefinition.SET_SLOT_DEFINITION_INITFUNCTION.execute(slot, - new Function() { - at Override - public LispObject execute() { - return NIL; -} - }); - slots = slots.cdr(); - } - + STANDARD_CLASS.setDirectSlotDefinitions(standardClassSlotDefinitions()); } // BuiltInClass.FUNCTION is also null here (see previous comment). Modified: branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/clos.lisp Sun Mar 14 09:18:06 2010 @@ -1880,8 +1880,8 @@ (redefine-class-forwarder (setf class-direct-subclasses) direct-subclasses) (redefine-class-forwarder class-direct-methods direct-methods !class-direct-methods) (redefine-class-forwarder (setf class-direct-methods) direct-methods !!class-direct-methods) -(redefine-class-forwarder class-precedence-list class-precedence-list) -(redefine-class-forwarder (setf class-precedence-list) class-precedence-list) +(redefine-class-forwarder class-precedence-list precedence-list) +(redefine-class-forwarder (setf class-precedence-list) precedence-list) (redefine-class-forwarder class-finalized-p finalized-p) (redefine-class-forwarder (setf class-finalized-p) finalized-p) (redefine-class-forwarder class-default-initargs default-initargs) From mevenson at common-lisp.net Sun Mar 14 13:30:21 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Sun, 14 Mar 2010 09:30:21 -0400 Subject: [armedbear-cvs] r12531 - in trunk/abcl: doc/design/pathnames src/org/armedbear/lisp test/lisp/abcl Message-ID: Author: mevenson Date: Sun Mar 14 09:30:17 2010 New Revision: 12531 Log: Change jar pathname to have :ABSOLUTE directory entries. As pointed out by Alan Ruttenburg and Alessio Stalla, having :RELATIVE directory entries is contrary to the semantics of the CLHS and violates the convention common in Common Lisp that the TRUENAME of a pathname directory will be absolute. Modified: trunk/abcl/doc/design/pathnames/abcl-jar-url.text trunk/abcl/src/org/armedbear/lisp/Pathname.java trunk/abcl/src/org/armedbear/lisp/ZipCache.java trunk/abcl/test/lisp/abcl/jar-file.lisp Modified: trunk/abcl/doc/design/pathnames/abcl-jar-url.text ============================================================================== --- trunk/abcl/doc/design/pathnames/abcl-jar-url.text (original) +++ trunk/abcl/doc/design/pathnames/abcl-jar-url.text Sun Mar 14 09:30:17 2010 @@ -2,8 +2,8 @@ ============================ Mark Evenson -Created: 09 JAN 2010 -Modified: 22 FEB 2010 +Created: 09 JAN 2010 +Modified: 16 MAR 2010 Notes towards sketching an implementation of "jar:" references to be contained in PATHNAMEs within ABCL. @@ -90,8 +90,10 @@ innermost. * The DIRECTORY component of a JAR PATHNAME should be a list starting - with the :RELATIVE keyword, as hierarchial entries in jar files - are of the form "foo/bar/a.lisp" not "/foo/bar/a.lisp" + with the :ABSOLUTE keyword. Even though hierarchial entries in + jar files are stored in the form "foo/bar/a.lisp" not + "/foo/bar/a.lisp", the meaning of DIRECTORY component better + represented as an absolute path. BNF --- @@ -108,7 +110,7 @@ JAR-NAMESTRING ::= ABSOLUTE-FILE-NAMESTRING | RELATIVE-FILE-NAMESTRING - ENTRY ::= [ DIRECTORY "/"] * FILE + ENTRY ::= [ DIRECTORY "/"]* FILE ### Notes @@ -174,7 +176,7 @@ type: "jar" } pathname { - directory: (:RELATIVE "b") + directory: (:RELATIVE "b" "c") name: "foo" type: "abcl" } @@ -186,18 +188,20 @@ // UC5 -- JAR Entry in a JAR Entry pathname: { - namestring: "jar:jar:file:a/foo/baz.jar!/foo.abcl!/a/b/bar-1.cls" + namestring: "jar:jar:file:a/foo/baz.jar!/c/d/foo.abcl!/a/b/bar-1.cls" device: ( pathname: { - device: "jar:file:" + directory: (:RELATIVE "a" "foo") name: "baz" type: "jar" } pathname: { + directory: (:RELATIVE "c" "d") name: "foo" type: "abcl" } ) + directory: (:ABSOLUTE "a" "b") name: "bar-1" type: "cls" } @@ -208,7 +212,7 @@ device: ( "http://example.org/abcl.jar" pathname: { - directory: (:relative "org" "armedbear" "lisp") + directory: (:RELATIVE "org" "armedbear" "lisp") name: "Version" type: "class" } @@ -249,7 +253,7 @@ name: "foo" type: "jar" ) - directory: (:RELATIVE "c" "d") + directory: (:ABSOLUTE "c" "d") name: "foo" type: "lisp } Modified: trunk/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Pathname.java Sun Mar 14 09:30:17 2010 @@ -296,7 +296,7 @@ } else { device = d.device; } - s = s.substring(separatorIndex + jarSeparator.length()); + s = "/" + s.substring(separatorIndex + jarSeparator.length()); Pathname p = new Pathname(s); directory = p.directory; name = p.name; @@ -532,7 +532,14 @@ } else { Debug.assertTrue(false); } - sb.append(getDirectoryNamestring()); + String directoryNamestring = getDirectoryNamestring(); + if (isJar()) { + if (directoryNamestring.startsWith(File.separator)) { + sb.append(directoryNamestring.substring(1)); + } + } else { + sb.append(directoryNamestring); + } if (name instanceof AbstractString) { String n = name.getStringValue(); if (n.indexOf(File.separatorChar) >= 0) { @@ -635,8 +642,8 @@ p.name = name; p.type = type; String path = p.getNamestring(); + StringBuilder result = new StringBuilder(); if (Utilities.isPlatformWindows) { - StringBuilder result = new StringBuilder(); for (int i = 0; i < path.length(); i++) { char c = path.charAt(i); if (c == '\\') { @@ -646,8 +653,16 @@ } } return result.toString(); + } else { + result.append(path); } - return path; + // Entries in jar files are always relative, but Pathname + // directories are :ABSOLUTE. + if (result.length() > 1 + && result.substring(0, 1).equals("/")) { + return result.substring(1); + } + return result.toString(); } @Override @@ -1589,16 +1604,16 @@ result.directory = mergeDirectories(p.directory, d.directory); } - // A JAR always has relative directories - if (result.isJar() - && result.directory instanceof Cons - && result.directory.car().equals(Keyword.ABSOLUTE)) { - if (result.directory.cdr().equals(NIL)) { - result.directory = NIL; - } else { - ((Cons)result.directory).car = Keyword.RELATIVE; - } - } + // A JAR always has absolute directories + // if (result.isJar() + // && result.directory instanceof Cons + // && result.directory.car().equals(Keyword.ABSOLUTE)) { + // if (result.directory.cdr().equals(NIL)) { + // result.directory = NIL; + // } else { + // ((Cons)result.directory).car = Keyword.RELATIVE; + // } + // } if (pathname.name != NIL) { result.name = p.name; @@ -1707,7 +1722,7 @@ } if (pathname.isWild()) { return error(new FileError("Bad place for a wild pathname.", - pathname)); + pathname)); } if (!(pathname.device instanceof Cons)) { pathname Modified: trunk/abcl/src/org/armedbear/lisp/ZipCache.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/ZipCache.java (original) +++ trunk/abcl/src/org/armedbear/lisp/ZipCache.java Sun Mar 14 09:30:17 2010 @@ -159,6 +159,9 @@ String dateString = HttpHead.get(url, "Last-Modified"); Date date = null; try { + if (dateString == null) { + throw new ParseException("Failed to get HEAD for " + url, 0); + } date = RFC_1123.parse(dateString); long current = date.getTime(); if (current > entry.lastModified) { Modified: trunk/abcl/test/lisp/abcl/jar-file.lisp ============================================================================== --- trunk/abcl/test/lisp/abcl/jar-file.lisp (original) +++ trunk/abcl/test/lisp/abcl/jar-file.lisp Sun Mar 14 09:30:17 2010 @@ -130,6 +130,7 @@ ;;; wrapped in PROGN for easy disabling without a network connection ;;; XXX come up with a better abstraction + (progn (deftest jar-file.load.11 (load "jar:http://abcl-dynamic-install.googlecode.com/files/baz.jar!/foo") @@ -244,7 +245,7 @@ (pathname-name d) (pathname-type d) (pathname-directory p) (pathname-name p) (pathname-type p))) "baz" "jar" - nil "foo" "abcl") + (:absolute) "foo" "abcl") (deftest jar-file.pathname.3 (let* ((p #p"jar:jar:file:baz.jar!/foo.abcl!/") @@ -266,7 +267,7 @@ (pathname-directory p) (pathname-name p) (pathname-type p))) (:relative "a") "baz" "jar" (:relative "b" "c") "foo" "abcl" - (:relative "this" "that") "foo-20" "cls") + (:absolute "this" "that") "foo-20" "cls") (deftest jar-file.pathname.5 (let* ((p #p"jar:jar:file:a/foo/baz.jar!/b/c/foo.abcl!/armed/bear/bar-1.cls") @@ -278,7 +279,7 @@ (pathname-directory p) (pathname-name p) (pathname-type p))) (:relative "a" "foo" ) "baz" "jar" (:relative "b" "c") "foo" "abcl" - (:relative "armed" "bear") "bar-1" "cls") + (:absolute "armed" "bear") "bar-1" "cls") (deftest jar-file.pathname.6 (let* ((p #p"jar:http://example.org/abcl.jar!/org/armedbear/lisp/Version.class") @@ -288,7 +289,7 @@ d (pathname-directory p) (pathname-name p) (pathname-type p))) "http://example.org/abcl.jar" - (:relative "org" "armedbear" "lisp") "Version" "class") + (:absolute "org" "armedbear" "lisp") "Version" "class") (deftest jar-file.pathname.7 (let* ((p #p"jar:jar:http://example.org/abcl.jar!/foo.abcl!/foo-1.cls") @@ -316,8 +317,8 @@ (values (pathname-directory d) (pathname-name d) (pathname-type d) (pathname-directory p) (pathname-name p) (pathname-type p))) - (:RELATIVE "a" "b") "foo" "jar" - (:RELATIVE "c" "d") "foo" "lisp") + (:relative "a" "b") "foo" "jar" + (:absolute "c" "d") "foo" "lisp") From mevenson at common-lisp.net Sun Mar 14 15:50:28 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Sun, 14 Mar 2010 11:50:28 -0400 Subject: [armedbear-cvs] r12532 - trunk/abcl Message-ID: Author: mevenson Date: Sun Mar 14 11:50:26 2010 New Revision: 12532 Log: Rename 'build.properties' to 'abcl.properties'. Eclipse uses 'build.properties' for its own nefarious purposes, so for ABCL to play nice in the Eclipse RCP ecosystem we disentangle possible confusion. Added: trunk/abcl/abcl.properties.in - copied unchanged from r12531, /trunk/abcl/build.properties.in Removed: trunk/abcl/build.properties.in Modified: trunk/abcl/build.xml Modified: trunk/abcl/build.xml ============================================================================== --- trunk/abcl/build.xml (original) +++ trunk/abcl/build.xml Sun Mar 14 11:50:26 2010 @@ -27,8 +27,8 @@ - + properties in the 'abcl.properties' file. --> + From mevenson at common-lisp.net Sun Mar 14 19:09:06 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Sun, 14 Mar 2010 15:09:06 -0400 Subject: [armedbear-cvs] r12533 - in branches/0.19.x/abcl: doc/design/pathnames src/org/armedbear/lisp test/lisp/abcl Message-ID: Author: mevenson Date: Sun Mar 14 15:09:04 2010 New Revision: 12533 Log: Backport r12531 for :ABSOLUTE directory components for jar pathnames. Modified: branches/0.19.x/abcl/doc/design/pathnames/abcl-jar-url.text branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java branches/0.19.x/abcl/src/org/armedbear/lisp/ZipCache.java branches/0.19.x/abcl/test/lisp/abcl/jar-file.lisp Modified: branches/0.19.x/abcl/doc/design/pathnames/abcl-jar-url.text ============================================================================== --- branches/0.19.x/abcl/doc/design/pathnames/abcl-jar-url.text (original) +++ branches/0.19.x/abcl/doc/design/pathnames/abcl-jar-url.text Sun Mar 14 15:09:04 2010 @@ -2,8 +2,8 @@ ============================ Mark Evenson -Created: 09 JAN 2010 -Modified: 22 FEB 2010 +Created: 09 JAN 2010 +Modified: 14 MAR 2010 Notes towards sketching an implementation of "jar:" references to be contained in PATHNAMEs within ABCL. @@ -89,6 +89,36 @@ * The DEVICE PATHNAME list of enclosing JARs runs from outermost to innermost. +* The DIRECTORY component of a JAR PATHNAME should be a list starting + with the :ABSOLUTE keyword. Even though hierarchial entries in + jar files are stored in the form "foo/bar/a.lisp" not + "/foo/bar/a.lisp", the meaning of DIRECTORY component better + represented as an absolute path. + +BNF +--- + +An incomplete BNF of the syntax of JAR PATHNAME would be: + + JAR-PATHNAME ::= "jar:" URL "!/" [ ENTRY ] + + URL ::= + | JAR-FILE-PATHNAME + + JAR-FILE-PATHNAME ::= "jar:" "file:" JAR-NAMESTRING "!/" [ ENTRY ] + + JAR-NAMESTRING ::= ABSOLUTE-FILE-NAMESTRING + | RELATIVE-FILE-NAMESTRING + + ENTRY ::= [ DIRECTORY "/"]* FILE + + +### Notes + +1. ABSOLUTE-FILE-NAMESTRING and RELATIVE-FILE-NAMESTRING use the +local filesystem conventions, meaning that on Windows this could +contain '\' as the directory separator, while an ENTRY always uses '/' +to separate directories within the jar proper. Use Cases @@ -146,7 +176,7 @@ type: "jar" } pathname { - directory: (:RELATIVE "b") + directory: (:RELATIVE "b" "c") name: "foo" type: "abcl" } @@ -158,18 +188,20 @@ // UC5 -- JAR Entry in a JAR Entry pathname: { - namestring: "jar:jar:file:a/foo/baz.jar!/foo.abcl!/a/b/bar-1.cls" + namestring: "jar:jar:file:a/foo/baz.jar!/c/d/foo.abcl!/a/b/bar-1.cls" device: ( pathname: { - device: "jar:file:" + directory: (:RELATIVE "a" "foo") name: "baz" type: "jar" } pathname: { + directory: (:RELATIVE "c" "d") name: "foo" type: "abcl" } ) + directory: (:ABSOLUTE "a" "b") name: "bar-1" type: "cls" } @@ -180,7 +212,7 @@ device: ( "http://example.org/abcl.jar" pathname: { - directory: (:relative "org" "armedbear" "lisp") + directory: (:RELATIVE "org" "armedbear" "lisp") name: "Version" type: "class" } @@ -221,7 +253,7 @@ name: "foo" type: "jar" ) - directory: (:RELATIVE "c" "d") + directory: (:ABSOLUTE "c" "d") name: "foo" type: "lisp } Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java Sun Mar 14 15:09:04 2010 @@ -287,7 +287,7 @@ } else { device = d.device; } - s = s.substring(separatorIndex + jarSeparator.length()); + s = "/" + s.substring(separatorIndex + jarSeparator.length()); Pathname p = new Pathname(s); directory = p.directory; name = p.name; @@ -523,7 +523,14 @@ } else { Debug.assertTrue(false); } - sb.append(getDirectoryNamestring()); + String directoryNamestring = getDirectoryNamestring(); + if (isJar()) { + if (directoryNamestring.startsWith(File.separator)) { + sb.append(directoryNamestring.substring(1)); + } + } else { + sb.append(directoryNamestring); + } if (name instanceof AbstractString) { String n = name.getStringValue(); if (n.indexOf(File.separatorChar) >= 0) { @@ -626,8 +633,8 @@ p.name = name; p.type = type; String path = p.getNamestring(); + StringBuilder result = new StringBuilder(); if (Utilities.isPlatformWindows) { - StringBuilder result = new StringBuilder(); for (int i = 0; i < path.length(); i++) { char c = path.charAt(i); if (c == '\\') { @@ -637,8 +644,16 @@ } } return result.toString(); + } else { + result.append(path); } - return path; + // Entries in jar files are always relative, but Pathname + // directories are :ABSOLUTE. + if (result.length() > 1 + && result.substring(0, 1).equals("/")) { + return result.substring(1); + } + return result.toString(); } @Override @@ -1580,16 +1595,16 @@ result.directory = mergeDirectories(p.directory, d.directory); } - // A JAR always has relative directories - if (result.isJar() - && result.directory instanceof Cons - && result.directory.car().equals(Keyword.ABSOLUTE)) { - if (result.directory.cdr().equals(NIL)) { - result.directory = NIL; - } else { - ((Cons)result.directory).car = Keyword.RELATIVE; - } - } + // A JAR always has absolute directories + // if (result.isJar() + // && result.directory instanceof Cons + // && result.directory.car().equals(Keyword.ABSOLUTE)) { + // if (result.directory.cdr().equals(NIL)) { + // result.directory = NIL; + // } else { + // ((Cons)result.directory).car = Keyword.RELATIVE; + // } + // } if (pathname.name != NIL) { result.name = p.name; @@ -1698,7 +1713,7 @@ } if (pathname.isWild()) { return error(new FileError("Bad place for a wild pathname.", - pathname)); + pathname)); } if (!(pathname.device instanceof Cons)) { pathname Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/ZipCache.java ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/ZipCache.java (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/ZipCache.java Sun Mar 14 15:09:04 2010 @@ -159,6 +159,9 @@ String dateString = HttpHead.get(url, "Last-Modified"); Date date = null; try { + if (dateString == null) { + throw new ParseException("Failed to get HEAD for " + url, 0); + } date = RFC_1123.parse(dateString); long current = date.getTime(); if (current > entry.lastModified) { Modified: branches/0.19.x/abcl/test/lisp/abcl/jar-file.lisp ============================================================================== --- branches/0.19.x/abcl/test/lisp/abcl/jar-file.lisp (original) +++ branches/0.19.x/abcl/test/lisp/abcl/jar-file.lisp Sun Mar 14 15:09:04 2010 @@ -130,6 +130,7 @@ ;;; wrapped in PROGN for easy disabling without a network connection ;;; XXX come up with a better abstraction + (progn (deftest jar-file.load.11 (load "jar:http://abcl-dynamic-install.googlecode.com/files/baz.jar!/foo") @@ -244,7 +245,7 @@ (pathname-name d) (pathname-type d) (pathname-directory p) (pathname-name p) (pathname-type p))) "baz" "jar" - nil "foo" "abcl") + (:absolute) "foo" "abcl") (deftest jar-file.pathname.3 (let* ((p #p"jar:jar:file:baz.jar!/foo.abcl!/") @@ -266,7 +267,7 @@ (pathname-directory p) (pathname-name p) (pathname-type p))) (:relative "a") "baz" "jar" (:relative "b" "c") "foo" "abcl" - (:relative "this" "that") "foo-20" "cls") + (:absolute "this" "that") "foo-20" "cls") (deftest jar-file.pathname.5 (let* ((p #p"jar:jar:file:a/foo/baz.jar!/b/c/foo.abcl!/armed/bear/bar-1.cls") @@ -278,7 +279,7 @@ (pathname-directory p) (pathname-name p) (pathname-type p))) (:relative "a" "foo" ) "baz" "jar" (:relative "b" "c") "foo" "abcl" - (:relative "armed" "bear") "bar-1" "cls") + (:absolute "armed" "bear") "bar-1" "cls") (deftest jar-file.pathname.6 (let* ((p #p"jar:http://example.org/abcl.jar!/org/armedbear/lisp/Version.class") @@ -288,7 +289,7 @@ d (pathname-directory p) (pathname-name p) (pathname-type p))) "http://example.org/abcl.jar" - (:relative "org" "armedbear" "lisp") "Version" "class") + (:absolute "org" "armedbear" "lisp") "Version" "class") (deftest jar-file.pathname.7 (let* ((p #p"jar:jar:http://example.org/abcl.jar!/foo.abcl!/foo-1.cls") @@ -316,8 +317,8 @@ (values (pathname-directory d) (pathname-name d) (pathname-type d) (pathname-directory p) (pathname-name p) (pathname-type p))) - (:RELATIVE "a" "b") "foo" "jar" - (:RELATIVE "c" "d") "foo" "lisp") + (:relative "a" "b") "foo" "jar" + (:absolute "c" "d") "foo" "lisp") From ehuelsmann at common-lisp.net Sun Mar 14 19:15:44 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 14 Mar 2010 15:15:44 -0400 Subject: [armedbear-cvs] r12534 - branches/metaclass/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sun Mar 14 15:15:40 2010 New Revision: 12534 Log: Make sure non-standard (meta) classes aren't cast to LispClass as they are StandardObject-s. Re #38. Modified: branches/metaclass/abcl/src/org/armedbear/lisp/StandardObject.java Modified: branches/metaclass/abcl/src/org/armedbear/lisp/StandardObject.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/StandardObject.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/StandardObject.java Sun Mar 14 15:15:40 2010 @@ -145,7 +145,7 @@ if (name != NIL && name != UNBOUND_VALUE) { // TYPE-OF.9 - final LispObject c2 = LispClass.findClass(checkSymbol(name)); + final LispObject c2 = LispClass.findClass(name, false); if (c2 == c1) return name; } From ehuelsmann at common-lisp.net Sun Mar 14 19:17:39 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 14 Mar 2010 15:17:39 -0400 Subject: [armedbear-cvs] r12535 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sun Mar 14 15:17:37 2010 New Revision: 12535 Log: Fix returned values from SingleFloat.getInstance() and DoubleFloat.getInstance() for -0.0; -0.0 == 0.0. Patch by: Douglas Miles (dmiles at users dot sf dot net) Modified: trunk/abcl/src/org/armedbear/lisp/DoubleFloat.java trunk/abcl/src/org/armedbear/lisp/SingleFloat.java Modified: trunk/abcl/src/org/armedbear/lisp/DoubleFloat.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/DoubleFloat.java (original) +++ trunk/abcl/src/org/armedbear/lisp/DoubleFloat.java Sun Mar 14 15:17:37 2010 @@ -56,10 +56,13 @@ } public static DoubleFloat getInstance(double d) { - if (d == 0) - return ZERO; - else if (d == -0.0d ) - return MINUS_ZERO; + if (d == 0) { + long bits = Double.doubleToRawLongBits(d); + if (bits < 0) + return MINUS_ZERO; + else + return ZERO; + } else if (d == 1) return ONE; else if (d == -1) Modified: trunk/abcl/src/org/armedbear/lisp/SingleFloat.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SingleFloat.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SingleFloat.java Sun Mar 14 15:17:37 2010 @@ -56,10 +56,13 @@ } public static SingleFloat getInstance(float f) { - if (f == 0) - return ZERO; - else if (f == -0.0f ) - return MINUS_ZERO; + if (f == 0) { + int bits = Float.floatToRawIntBits(f); + if (bits < 0) + return MINUS_ZERO; + else + return ZERO; + } else if (f == 1) return ONE; else if (f == -1) From ehuelsmann at common-lisp.net Sun Mar 14 19:23:03 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 14 Mar 2010 15:23:03 -0400 Subject: [armedbear-cvs] r12536 - trunk/abcl Message-ID: Author: ehuelsmann Date: Sun Mar 14 15:22:59 2010 New Revision: 12536 Log: Add fix to be merged. Modified: trunk/abcl/CHANGES Modified: trunk/abcl/CHANGES ============================================================================== --- trunk/abcl/CHANGES (original) +++ trunk/abcl/CHANGES Sun Mar 14 15:22:59 2010 @@ -1,7 +1,7 @@ Version 0.19 ============ svn://common-lisp.net/project/armedbear/svn/trunk/abcl -(Unreleased) +(14 Mar, 2010) Features -------- @@ -37,10 +37,10 @@ SYS:PATHNAME-JAR-P predicate signals whether a pathname references a jar. - + NB: jar pathnames do *not* currently work as an argument to OPEN. - SYS:UNZIP implemented to unpack ZIP files. + SYS:UNZIP implemented to unpack ZIP files. SYS:ZIP now has a three argument version for creating zip files with hierarchical entries. @@ -58,6 +58,9 @@ Fixes/Optimizations ------------------- +* [svn r12526] Unbinding of PROGV bound variables on local transfer + of control (within-java-function jump targets) + * [svn r12510] The new ansi-test WITH-STANDARD-IO-SYNTAX.23 passes. Our with-standard-io-syntax implementation now correctly resets all necessary pprint variables. Patch by Douglas R. Miles, thanks for the contribution! From ehuelsmann at common-lisp.net Sun Mar 14 19:40:17 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 14 Mar 2010 15:40:17 -0400 Subject: [armedbear-cvs] r12537 - in branches/0.19.x/abcl: . src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sun Mar 14 15:40:13 2010 New Revision: 12537 Log: Backport PROGV fix (r12526) and its CHANGES description. Modified: branches/0.19.x/abcl/CHANGES branches/0.19.x/abcl/src/org/armedbear/lisp/compiler-pass1.lisp Modified: branches/0.19.x/abcl/CHANGES ============================================================================== --- branches/0.19.x/abcl/CHANGES (original) +++ branches/0.19.x/abcl/CHANGES Sun Mar 14 15:40:13 2010 @@ -1,7 +1,7 @@ Version 0.19 ============ svn://common-lisp.net/project/armedbear/svn/trunk/abcl -(Unreleased) +(14 Mar, 2010) Features -------- @@ -37,10 +37,10 @@ SYS:PATHNAME-JAR-P predicate signals whether a pathname references a jar. - + NB: jar pathnames do *not* currently work as an argument to OPEN. - SYS:UNZIP implemented to unpack ZIP files. + SYS:UNZIP implemented to unpack ZIP files. SYS:ZIP now has a three argument version for creating zip files with hierarchical entries. @@ -58,6 +58,9 @@ Fixes/Optimizations ------------------- +* [svn r12526] Unbinding of PROGV bound variables on local transfer + of control (within-java-function jump targets) + * [svn r12510] The new ansi-test WITH-STANDARD-IO-SYNTAX.23 passes. Our with-standard-io-syntax implementation now correctly resets all necessary pprint variables. Patch by Douglas R. Miles, thanks for the contribution! Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/compiler-pass1.lisp ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/compiler-pass1.lisp (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/compiler-pass1.lisp Sun Mar 14 15:40:13 2010 @@ -1078,9 +1078,9 @@ ;; (dolist (name (second symbols-form)) ;; (let ((variable (make-variable :name name :special-p t))) ;; (push - (setf (progv-form block) - `(progv ,symbols-form ,values-form ,@(p1-body body)) - (progv-environment-register block) t) + (setf (progv-environment-register block) t + (progv-form block) + `(progv ,symbols-form ,values-form ,@(p1-body body))) block)) (defknown rewrite-progv (t) t) From ehuelsmann at common-lisp.net Sun Mar 14 20:03:26 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 14 Mar 2010 16:03:26 -0400 Subject: [armedbear-cvs] r12538 - in tags/0.19.0: . abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sun Mar 14 16:03:22 2010 New Revision: 12538 Log: Tag 0.19.0. Added: tags/0.19.0/ - copied from r12537, /branches/0.19.x/ Modified: tags/0.19.0/abcl/src/org/armedbear/lisp/Version.java Modified: tags/0.19.0/abcl/src/org/armedbear/lisp/Version.java ============================================================================== --- /branches/0.19.x/abcl/src/org/armedbear/lisp/Version.java (original) +++ tags/0.19.0/abcl/src/org/armedbear/lisp/Version.java Sun Mar 14 16:03:22 2010 @@ -41,7 +41,7 @@ public static String getVersion() { - return "0.19.0-dev"; + return "0.19.0"; } public static void main(String args[]) { From ehuelsmann at common-lisp.net Sun Mar 14 20:06:27 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 14 Mar 2010 16:06:27 -0400 Subject: [armedbear-cvs] r12539 - branches/0.19.x/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sun Mar 14 16:06:25 2010 New Revision: 12539 Log: Update version number with 0.19.0 tagged. Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Version.java Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Version.java ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/Version.java (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/Version.java Sun Mar 14 16:06:25 2010 @@ -41,7 +41,7 @@ public static String getVersion() { - return "0.19.0-dev"; + return "0.19.1-dev"; } public static void main(String args[]) { From mevenson at common-lisp.net Sun Mar 14 20:27:57 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Sun, 14 Mar 2010 16:27:57 -0400 Subject: [armedbear-cvs] r12540 - trunk/abcl/test/lisp/ansi Message-ID: Author: mevenson Date: Sun Mar 14 16:27:51 2010 New Revision: 12540 Log: Update ANSI test results for 0.19.0 OSX. Modified: trunk/abcl/test/lisp/ansi/ansi-test-failures Modified: trunk/abcl/test/lisp/ansi/ansi-test-failures ============================================================================== --- trunk/abcl/test/lisp/ansi/ansi-test-failures (original) +++ trunk/abcl/test/lisp/ansi/ansi-test-failures Sun Mar 14 16:27:51 2010 @@ -175,4 +175,31 @@ PPRINT-POP.7 PPRINT-POP.8 FORMAT.LOGICAL-BLOCK.CIRCLE.1 FORMAT.LOGICAL-BLOCK.CIRCLE.2 FORMAT.LOGICAL-BLOCK.CIRCLE.3 FORMAT.JUSTIFY.30 FORMAT.JUSTIFY.32 WITH-STANDARD-IO-SYNTAX.23 - TRACE.8)) \ No newline at end of file + TRACE.8)) + +(compileit 0.19.0 :id dada + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 ENSURE-DIRECTORIES-EXIST.8 FRESH-LINE.5 + PRINT.RANDOM-STATE.1 PPRINT-FILL.14 PPRINT-FILL.15 + PPRINT-LINEAR.14 PPRINT-TABULAR.13 PPRINT-LOGICAL-BLOCK.17 + PPRINT-POP.7 PPRINT-POP.8 FORMAT.LOGICAL-BLOCK.CIRCLE.1 + FORMAT.LOGICAL-BLOCK.CIRCLE.2 FORMAT.LOGICAL-BLOCK.CIRCLE.3 + FORMAT.JUSTIFY.30 FORMAT.JUSTIFY.32 TRACE.8)) + +(doit 0.19.0 :id dada + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 DELETE-PACKAGE.6 + MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 CHAR-DOWNCASE.2 + ENSURE-DIRECTORIES-EXIST.8 FRESH-LINE.5 PRINT.RANDOM-STATE.1 + PPRINT-FILL.14 PPRINT-FILL.15 PPRINT-LINEAR.14 PPRINT-TABULAR.13 + PPRINT-LOGICAL-BLOCK.17 PPRINT-POP.7 PPRINT-POP.8 + FORMAT.LOGICAL-BLOCK.CIRCLE.1 FORMAT.LOGICAL-BLOCK.CIRCLE.2 + FORMAT.LOGICAL-BLOCK.CIRCLE.3 FORMAT.JUSTIFY.30 + FORMAT.JUSTIFY.32)) + From mevenson at common-lisp.net Mon Mar 15 10:57:45 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Mon, 15 Mar 2010 06:57:45 -0400 Subject: [armedbear-cvs] r12541 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Mon Mar 15 06:57:44 2010 New Revision: 12541 Log: Document INSPECT protocol for getParts(). Modified: trunk/abcl/src/org/armedbear/lisp/LispObject.java Modified: trunk/abcl/src/org/armedbear/lisp/LispObject.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/LispObject.java (original) +++ trunk/abcl/src/org/armedbear/lisp/LispObject.java Mon Mar 15 06:57:44 2010 @@ -71,6 +71,15 @@ return new SimpleString(sb); } + /** + * Implementing the getParts() protocol will allow INSPECT to + * return information about the substructure of a descendent of + * LispObject. + * + * The protocol is to return a List of Cons pairs, where the car of + * each pair contains a decriptive string, and the cdr returns a + * subobject for inspection. + */ public LispObject getParts() { return NIL; From mevenson at common-lisp.net Mon Mar 15 10:59:13 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Mon, 15 Mar 2010 06:59:13 -0400 Subject: [armedbear-cvs] r12542 - in trunk/abcl/doc: . design/pathnames Message-ID: Author: mevenson Date: Mon Mar 15 06:59:11 2010 New Revision: 12542 Log: Add incomplete documentation of Java FFI. Added: trunk/abcl/doc/design/pathnames/jar-pathnames.markdown - copied unchanged from r12540, /trunk/abcl/doc/design/pathnames/abcl-jar-url.text trunk/abcl/doc/misc.markdown Removed: trunk/abcl/doc/design/pathnames/abcl-jar-url.text Added: trunk/abcl/doc/misc.markdown ============================================================================== --- (empty file) +++ trunk/abcl/doc/misc.markdown Mon Mar 15 06:59:11 2010 @@ -0,0 +1,82 @@ +Misc +==== + +Miscellaneous fragments of topics on aspects of ABCL that should be +collected into a more systematic documentation someday. + +# Java FFI + +## Calling Lisp from Java + +Note: If you are wondering where the symbols are from in the following +text, the entire ABCL Lisp system resides in the org.armedbear.lisp +package, so they are in this package. + +Per JVM, there can only ever be a single Lisp interpreter. This is +started by calling the static method Interpreter.createInstance(). + + Interpreter interpreter = Interpreter.createInstance(); + +If this method has already been invoked in the lifetime of the current +Java process it will return null, so if you are writing Java whose +lifecycle is a bit out of your control (like in a Java servlet), a +safer invocation pattern might be: + + Interpreter interpreter = Interpreter.getInstance(); + if (interpreter == null) { + interpreter = Interpreter.createInstance(); + } + +The Lisp EVAL primitive may be simply passed strings for evaluation, +as follows + + String line = "(load \"file.lisp\")"; + LispObject result = interpreter.eval(line); + +Notice that all possible return values from an arbitrary Lisp +computation are collapsed into a single return value. Doing useful +further computation on the LispObject depends on knowing what the +result of the computation might be, usually involves some amount +of instanceof introspection, and forms a whole topic to itself +(c.f. "Interpreting a LispObject in Java"). + +Using EVAL involves the Lisp interpreter. Lisp functions may be +directly invoked by Java method calls as follows. One simply locates +the pacakge containing the symbol, then obtains a reference to the +symbol, and then invokes the execute() method with the desired +parameters. + + 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.prinln("The result was " + result.writeToString()); + + +If one + + +## Interpreting a LispObject in Java + +### LispObject as boolean + +If the LispObject a generalized boolean values, one can use +getBooleanValue() to convert to Java: + + + + +### LispObject is a list + +If LispObject is a list, it will have the type Cons. One can then use +the copyToArray[] to make things a bit more suitable for Java +iteration. + + LispObject result = interpreter.eval("'(1 2 4 5)"); + if (result instanceof Cons) { + LispObject array[] = ((Cons)result.copyToArray()); + ... + } From mevenson at common-lisp.net Mon Mar 15 11:04:43 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Mon, 15 Mar 2010 07:04:43 -0400 Subject: [armedbear-cvs] r12543 - trunk/abcl Message-ID: Author: mevenson Date: Mon Mar 15 07:04:42 2010 New Revision: 12543 Log: Set SVN properties. Modified: trunk/abcl/abcl.properties.in (contents, props changed) Modified: trunk/abcl/abcl.properties.in ============================================================================== --- trunk/abcl/abcl.properties.in (original) +++ trunk/abcl/abcl.properties.in Mon Mar 15 07:04:42 2010 @@ -1,5 +1,4 @@ -# build.properties -# $Id: build.properties,v 1.23 2007-03-03 19:19:11 piso Exp $ +# $Id$ # version.src contents show up in JAR Manifest in the Implementation-Source attribute #version.src=[abcl svn] From mevenson at common-lisp.net Mon Mar 15 13:55:16 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Mon, 15 Mar 2010 09:55:16 -0400 Subject: [armedbear-cvs] r12544 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Mon Mar 15 09:55:15 2010 New Revision: 12544 Log: Fix win32 bugs with :ABSOLUTE directory entries for jar pathnames. Modified: trunk/abcl/src/org/armedbear/lisp/Pathname.java Modified: trunk/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Pathname.java Mon Mar 15 09:55:15 2010 @@ -534,8 +534,10 @@ } String directoryNamestring = getDirectoryNamestring(); if (isJar()) { - if (directoryNamestring.startsWith(File.separator)) { + if (directoryNamestring.startsWith("/")) { sb.append(directoryNamestring.substring(1)); + } else { + sb.append(directoryNamestring); } } else { sb.append(directoryNamestring); @@ -652,7 +654,6 @@ result.append(c); } } - return result.toString(); } else { result.append(path); } From mevenson at common-lisp.net Mon Mar 15 13:57:06 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Mon, 15 Mar 2010 09:57:06 -0400 Subject: [armedbear-cvs] r12545 - branches/0.19.x/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Mon Mar 15 09:57:06 2010 New Revision: 12545 Log: Backport r12544: Fix win32 bugs with :ABSOLUTE directory entries for jar pathnames. Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java Mon Mar 15 09:57:06 2010 @@ -525,8 +525,10 @@ } String directoryNamestring = getDirectoryNamestring(); if (isJar()) { - if (directoryNamestring.startsWith(File.separator)) { + if (directoryNamestring.startsWith("/")) { sb.append(directoryNamestring.substring(1)); + } else { + sb.append(directoryNamestring); } } else { sb.append(directoryNamestring); @@ -643,7 +645,6 @@ result.append(c); } } - return result.toString(); } else { result.append(path); } From mevenson at common-lisp.net Mon Mar 15 16:09:51 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Mon, 15 Mar 2010 12:09:51 -0400 Subject: [armedbear-cvs] r12546 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Mon Mar 15 12:09:42 2010 New Revision: 12546 Log: nreverse() *command-line-arguments-list* to natural order. Found by Alan Ruttenburg. Modified: trunk/abcl/src/org/armedbear/lisp/Interpreter.java Modified: trunk/abcl/src/org/armedbear/lisp/Interpreter.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Interpreter.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Interpreter.java Mon Mar 15 12:09:42 2010 @@ -247,6 +247,7 @@ } } } + arglist.nreverse(); _COMMAND_LINE_ARGUMENT_LIST_.setSymbolValue(arglist); } From mevenson at common-lisp.net Mon Mar 15 16:12:19 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Mon, 15 Mar 2010 12:12:19 -0400 Subject: [armedbear-cvs] r12547 - branches/0.19.x/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Mon Mar 15 12:12:12 2010 New Revision: 12547 Log: backport r12456: nreverse() *command-line-arguments-list* to natural order. Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Interpreter.java Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Interpreter.java ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/Interpreter.java (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/Interpreter.java Mon Mar 15 12:12:12 2010 @@ -247,6 +247,7 @@ } } } + arglist.nreverse(); _COMMAND_LINE_ARGUMENT_LIST_.setSymbolValue(arglist); } From mevenson at common-lisp.net Tue Mar 16 08:32:26 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Tue, 16 Mar 2010 04:32:26 -0400 Subject: [armedbear-cvs] r12548 - trunk/abcl/doc Message-ID: Author: mevenson Date: Tue Mar 16 04:32:25 2010 New Revision: 12548 Log: Documentation for using SLIME in ABCL. Added: trunk/abcl/doc/slime.markdown Added: trunk/abcl/doc/slime.markdown ============================================================================== --- (empty file) +++ trunk/abcl/doc/slime.markdown Tue Mar 16 04:32:25 2010 @@ -0,0 +1,85 @@ +SLIME +===== + + Author: Mark Evenson + Created: 16-MAR-2010 + Modified: 16-MAR-2010 + +SLIME is divided conceptually in two parts: the "swank" server process +which runs in the native Lisp and the "slime" client process running +in Emacs Lisp. These instructions were were written to accompany +ABCL, but there is nothing ABCL specific in the instructions + +## Obtaining SLIME + +SLIME does not follow a release process in the standard, so you are +best off with obtaining the [latest version from CVS][1]. [Daily +snapshots as gzipped tarballs are also available][2]. Your local OS +packaging system (i.e. MacPorts on OSX) may have a version as well. + +[1]: http://common-lisp.net/project/slime/#downloading +[2]: http://common-lisp.net/project/slime/snapshots/slime-current.tgz + +## Starting SLIME + +One first locates the SLIME directory on the filesystem. In the code +that follows, the SLIME top level directory is assumed to be +"~/work/slime", so adjust this value to your local value as you see +fit. + +Then one configures Emacs with the proper initialization hooks by +adding code something like the following to "~/.emacs": + + (add-to-list 'load-path "~/work/slime") + (setq slime-lisp-implementations + '((abcl ("~/work/abcl/abcl")) + (abcl.svn ("~/work/abcl.svn/abcl")) + (sbcl ("/opt/local/bin/sbcl")))) + (require 'slime) + (slime-setup '(slime-fancy slime-asdf slime-banner)) + +One further need to customize the setting of +SLIME-LISP-IMPLEMENTATIONS to the location(s) of the Lisp(s) you wish to +invoke via SLIME. The value is list of lists of the form + + (SYMBOL ("/path/to/lisp")) + +where SYMBOL is a mnemonic for the Lisp implementation, and the string +"/path/to/lisp" is the absolute path of the Lisp implementation that +SLIME will associate with this symbol. In the example above, I have +defined three implementations, the main abcl implementation, a version +that corresponds to the latest version from SVN invoked by +"~/work/abcl.svn/abcl", and a version of SBCL. + +To start SLIME one simply issues M-x slime from Emacs. This will +start the first entry in the SLIME-LISP-IMPLEMENTATIONS list. If you +wish to start a subsequent Lisp, prefix the invocation via M-u +(i.e. M-u M-x slime). This will present an interactive chooser over +all symbols contained in SLIME-LISP-IMPLEMENTATIONS. + +After you invoke SLIME, you'll see a buffer open up named +*inferior-lisp* where the Lisp image is started up, the required swank +code is complied and then loaded, finally, you'll see the "flying +letters" resolving itself to a "CL-USER>" prompt with an inspiration +message in the minibuffer. Your initiation to SLIME has begun... + + +## Starting swank on its own + +In debugging, one may wish to start the swank server by itself without +connection to Emacs. The following code will both load and start the swank server +from a Lisp image. One merely needs to change *SLIME-DIRECTORY* to +point to the top directory of the server process. + + (defvar *slime-directory* #p"~/work/slime/") ;; Don't forget trailing slash + (load (merge-pathnames "swank-loader.lisp" *slime-directory*) :verbose t) + (swank-loader:init) + (swank:start-server "/tmp/swank.port") ;; remove if you don't want + ;; swank to start listening for connections. + +When this code finishes executing, an integer representing the port on +which the server starts will be written to '/tmp/swank.port' and also +returned as the result of evaluating SWANK:START-SERVER. One may +connect to this port via issuing M-x slime-connect in Emacs. + + From mevenson at common-lisp.net Tue Mar 16 10:43:55 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Tue, 16 Mar 2010 06:43:55 -0400 Subject: [armedbear-cvs] r12549 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Tue Mar 16 06:43:53 2010 New Revision: 12549 Log: Allow TYPE to be :UNSPECIFIC. Fixes bug where the following would fail: (make-pathname :directory '(:relative) :name "file" :type :unspecific :host nil :device nil) Modified: trunk/abcl/src/org/armedbear/lisp/Pathname.java Modified: trunk/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Pathname.java Tue Mar 16 06:43:53 2010 @@ -552,7 +552,7 @@ } else if (name == Keyword.WILD) { sb.append('*'); } - if (type != NIL) { + if (type != NIL && type != Keyword.UNSPECIFIC) { sb.append('.'); if (type instanceof AbstractString) { String t = type.getStringValue(); From mevenson at common-lisp.net Tue Mar 16 15:20:03 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Tue, 16 Mar 2010 11:20:03 -0400 Subject: [armedbear-cvs] r12550 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Tue Mar 16 11:20:01 2010 New Revision: 12550 Log: Fix loading of packed FASLs which have been renamed. Bug was present since at least 0.18.1. Modified: trunk/abcl/src/org/armedbear/lisp/Load.java trunk/abcl/src/org/armedbear/lisp/Pathname.java Modified: trunk/abcl/src/org/armedbear/lisp/Load.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Load.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Load.java Tue Mar 16 11:20:01 2010 @@ -163,16 +163,28 @@ mergedPathname = new Pathname(n); LispObject initTruename = Pathname.truename(mergedPathname); if (initTruename == null || initTruename.equals(NIL)) { - String errorMessage - = "Loadable FASL not found for" - + "'" + pathname + "'" - + " in " - + "'" + mergedPathname + "'"; - if (ifDoesNotExist) { - return error(new FileError(errorMessage, mergedPathname)); + // Maybe the enclosing JAR has been renamed? + Pathname p = new Pathname(mergedPathname); + p.name = Keyword.WILD; + p.invalidateNamestring(); + LispObject result = Pathname.MATCH_WILD_JAR_PATHNAME.execute(p); + + if (result instanceof Cons + && ((Cons)result).length() == 1 + && ((Cons)result).car() instanceof Pathname) { + initTruename = (Pathname)result.car(); } else { - Debug.trace(errorMessage); - return NIL; + String errorMessage + = "Loadable FASL not found for " + + "'" + pathname + "'" + + " in " + + "'" + mergedPathname + "'"; + if (ifDoesNotExist) { + return error(new FileError(errorMessage, mergedPathname)); + } else { + Debug.trace(errorMessage); + return NIL; + } } } truename = (Pathname)initTruename; Modified: trunk/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Pathname.java Tue Mar 16 11:20:01 2010 @@ -1357,7 +1357,7 @@ } // ### match-wild-jar-pathname wild-jar-pathname - private static final Primitive LIST_JAR_DIRECTORY = new pf_match_wild_jar_pathname(); + static final Primitive MATCH_WILD_JAR_PATHNAME = new pf_match_wild_jar_pathname(); private static class pf_match_wild_jar_pathname extends Primitive { pf_match_wild_jar_pathname() { super("match-wild-jar-pathname", PACKAGE_SYS, false, "wild-jar-pathname"); From mevenson at common-lisp.net Tue Mar 16 18:06:29 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Tue, 16 Mar 2010 14:06:29 -0400 Subject: [armedbear-cvs] r12551 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Tue Mar 16 14:06:28 2010 New Revision: 12551 Log: MAKE-PATHNAME does not have any merging directories semantics. Modified: trunk/abcl/src/org/armedbear/lisp/Pathname.java Modified: trunk/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Pathname.java Tue Mar 16 14:06:28 2010 @@ -1102,7 +1102,9 @@ if (host == NIL) { host = defaults.host; } - directory = mergeDirectories(directory, defaults.directory); + if (directory == NIL && defaults != null) { + directory = defaults.directory; + } if (!deviceSupplied) { device = defaults.device; } From mevenson at common-lisp.net Tue Mar 16 21:02:57 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Tue, 16 Mar 2010 17:02:57 -0400 Subject: [armedbear-cvs] r12552 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Tue Mar 16 17:02:54 2010 New Revision: 12552 Log: Refine TRANSLATE-PATHNAME to match SBCL's behavior on corner case. This patch allows (TRANSLATE-PATHNAME #P"/Users/evenson/work/bordeaux-threads/src/bordeaux-threads.abcl" #P"/**/**/*.*" #P"/Users/evenson/.cache/common-lisp/armedbear-0.20.0-dev-darwin-unknown/**/*.*") to return #P"/Users/evenson/.cache/common-lisp/armedbear-0.20.0-dev-darwin-unknown/bordeaux-threads.abcl" which matches SBCL' behavior, and seems reasonable that if there is no more of SRC or TO left to match and FROM has a :WILD-INFERIORS, one might as well return what has matched so far. Modified: trunk/abcl/src/org/armedbear/lisp/pathnames.lisp Modified: trunk/abcl/src/org/armedbear/lisp/pathnames.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/pathnames.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/pathnames.lisp Tue Mar 16 17:02:54 2010 @@ -232,6 +232,10 @@ (append (reverse match) (translate-directory-components-aux src (cdr from) (cdr to) case)))) + (when (and (null src) + (eq (car from) :wild-inferiors) + (eq (car to) :wild-inferiors)) + (return-from translate-directory-components-aux nil)) (when (null src) ;; SRC is NIL and we're still here: error exit (throw 'failed-match)))))) From mevenson at common-lisp.net Wed Mar 17 13:22:39 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Wed, 17 Mar 2010 09:22:39 -0400 Subject: [armedbear-cvs] r12553 - branches/0.19.x/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Wed Mar 17 09:22:36 2010 New Revision: 12553 Log: Backport r12550: Fix loading of packed FASLs which have been renamed. Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Load.java branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Load.java ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/Load.java (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/Load.java Wed Mar 17 09:22:36 2010 @@ -163,16 +163,28 @@ mergedPathname = new Pathname(n); LispObject initTruename = Pathname.truename(mergedPathname); if (initTruename == null || initTruename.equals(NIL)) { - String errorMessage - = "Loadable FASL not found for" - + "'" + pathname + "'" - + " in " - + "'" + mergedPathname + "'"; - if (ifDoesNotExist) { - return error(new FileError(errorMessage, mergedPathname)); + // Maybe the enclosing JAR has been renamed? + Pathname p = new Pathname(mergedPathname); + p.name = Keyword.WILD; + p.invalidateNamestring(); + LispObject result = Pathname.MATCH_WILD_JAR_PATHNAME.execute(p); + + if (result instanceof Cons + && ((Cons)result).length() == 1 + && ((Cons)result).car() instanceof Pathname) { + initTruename = (Pathname)result.car(); } else { - Debug.trace(errorMessage); - return NIL; + String errorMessage + = "Loadable FASL not found for " + + "'" + pathname + "'" + + " in " + + "'" + mergedPathname + "'"; + if (ifDoesNotExist) { + return error(new FileError(errorMessage, mergedPathname)); + } else { + Debug.trace(errorMessage); + return NIL; + } } } truename = (Pathname)initTruename; Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java Wed Mar 17 09:22:36 2010 @@ -1348,7 +1348,7 @@ } // ### match-wild-jar-pathname wild-jar-pathname - private static final Primitive LIST_JAR_DIRECTORY = new pf_match_wild_jar_pathname(); + static final Primitive MATCH_WILD_JAR_PATHNAME = new pf_match_wild_jar_pathname(); private static class pf_match_wild_jar_pathname extends Primitive { pf_match_wild_jar_pathname() { super("match-wild-jar-pathname", PACKAGE_SYS, false, "wild-jar-pathname"); From mevenson at common-lisp.net Wed Mar 17 13:24:16 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Wed, 17 Mar 2010 09:24:16 -0400 Subject: [armedbear-cvs] r12554 - branches/0.19.x/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Wed Mar 17 09:23:46 2010 New Revision: 12554 Log: Backport r12551: MAKE-PATHNAME does not have any merging directories semantics. Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java Wed Mar 17 09:23:46 2010 @@ -1093,7 +1093,9 @@ if (host == NIL) { host = defaults.host; } - directory = mergeDirectories(directory, defaults.directory); + if (directory == NIL && defaults != null) { + directory = defaults.directory; + } if (!deviceSupplied) { device = defaults.device; } From mevenson at common-lisp.net Wed Mar 17 13:25:03 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Wed, 17 Mar 2010 09:25:03 -0400 Subject: [armedbear-cvs] r12555 - branches/0.19.x/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Wed Mar 17 09:24:59 2010 New Revision: 12555 Log: Backport r12549: Allow Pathname TYPE to be :UNSPECIFIC. Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/Pathname.java Wed Mar 17 09:24:59 2010 @@ -543,7 +543,7 @@ } else if (name == Keyword.WILD) { sb.append('*'); } - if (type != NIL) { + if (type != NIL && type != Keyword.UNSPECIFIC) { sb.append('.'); if (type instanceof AbstractString) { String t = type.getStringValue(); From mevenson at common-lisp.net Wed Mar 17 15:22:48 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Wed, 17 Mar 2010 11:22:48 -0400 Subject: [armedbear-cvs] r12556 - in trunk/abcl: doc test/lisp/ansi Message-ID: Author: mevenson Date: Wed Mar 17 11:22:45 2010 New Revision: 12556 Log: Test results for 0.19.x branch as of r12555. Modified: trunk/abcl/doc/slime.markdown trunk/abcl/test/lisp/ansi/ansi-test-failures Modified: trunk/abcl/doc/slime.markdown ============================================================================== --- trunk/abcl/doc/slime.markdown (original) +++ trunk/abcl/doc/slime.markdown Wed Mar 17 11:22:45 2010 @@ -30,13 +30,13 @@ Then one configures Emacs with the proper initialization hooks by adding code something like the following to "~/.emacs": - (add-to-list 'load-path "~/work/slime") - (setq slime-lisp-implementations - '((abcl ("~/work/abcl/abcl")) - (abcl.svn ("~/work/abcl.svn/abcl")) - (sbcl ("/opt/local/bin/sbcl")))) - (require 'slime) - (slime-setup '(slime-fancy slime-asdf slime-banner)) + (add-to-list 'load-path "~/work/slime") + (setq slime-lisp-implementations + '((abcl ("~/work/abcl/abcl")) + (abcl.svn ("~/work/abcl.svn/abcl")) + (sbcl ("/opt/local/bin/sbcl")))) + (require 'slime) + (slime-setup '(slime-fancy slime-asdf slime-banner)) One further need to customize the setting of SLIME-LISP-IMPLEMENTATIONS to the location(s) of the Lisp(s) you wish to @@ -71,12 +71,13 @@ from a Lisp image. One merely needs to change *SLIME-DIRECTORY* to point to the top directory of the server process. - (defvar *slime-directory* #p"~/work/slime/") ;; Don't forget trailing slash - (load (merge-pathnames "swank-loader.lisp" *slime-directory*) :verbose t) - (swank-loader:init) - (swank:start-server "/tmp/swank.port") ;; remove if you don't want - ;; swank to start listening for connections. - +` + (defvar *slime-directory* #p"~/work/slime/") ;; Don't forget trailing slash + (load (merge-pathnames "swank-loader.lisp" *slime-directory*) :verbose t) + (swank-loader:init) + (swank:start-server "/tmp/swank.port") ;; remove if you don't want + ;; swank to start listening for connections. +` When this code finishes executing, an integer representing the port on which the server starts will be written to '/tmp/swank.port' and also returned as the result of evaluating SWANK:START-SERVER. One may Modified: trunk/abcl/test/lisp/ansi/ansi-test-failures ============================================================================== --- trunk/abcl/test/lisp/ansi/ansi-test-failures (original) +++ trunk/abcl/test/lisp/ansi/ansi-test-failures Wed Mar 17 11:22:45 2010 @@ -119,6 +119,34 @@ FORMAT.LOGICAL-BLOCK.CIRCLE.3 FORMAT.JUSTIFY.30 FORMAT.JUSTIFY.32 WITH-STANDARD-IO-SYNTAX.23 TRACE.8)) +(doit 0.18.1 :id alqaeda + :jvm "1.6.0_17-b04" :uname "ia32-winxp-5.1" + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 ENSURE-DIRECTORIES-EXIST.8 FRESH-LINE.5 + MAKE-BROADCAST-STREAM.8 PRINT.RANDOM-STATE.1 PPRINT-FILL.14 + PPRINT-FILL.15 PPRINT-LINEAR.14 PPRINT-TABULAR.13 + PPRINT-LOGICAL-BLOCK.17 PPRINT-POP.7 PPRINT-POP.8 + FORMAT.LOGICAL-BLOCK.CIRCLE.1 FORMAT.LOGICAL-BLOCK.CIRCLE.2 + FORMAT.LOGICAL-BLOCK.CIRCLE.3 FORMAT.JUSTIFY.30 + FORMAT.JUSTIFY.32 WITH-STANDARD-IO-SYNTAX.23)) + +(compileit 0.18.1 :id alqaeda + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 DELETE-PACKAGE.6 + MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 CHAR-DOWNCASE.2 + ENSURE-DIRECTORIES-EXIST.8 FRESH-LINE.5 MAKE-BROADCAST-STREAM.8 + PRINT.RANDOM-STATE.1 PPRINT-FILL.14 PPRINT-FILL.15 PPRINT-LINEAR.14 + PPRINT-TABULAR.13 PPRINT-LOGICAL-BLOCK.17 PPRINT-POP.7 PPRINT-POP.8 + FORMAT.LOGICAL-BLOCK.CIRCLE.1 FORMAT.LOGICAL-BLOCK.CIRCLE.2 + FORMAT.LOGICAL-BLOCK.CIRCLE.3 FORMAT.JUSTIFY.30 FORMAT.JUSTIFY.32 + WITH-STANDARD-IO-SYNTAX.23 TRACE.8)) + (doit 0.18.1 :id dada (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 @@ -203,3 +231,130 @@ FORMAT.LOGICAL-BLOCK.CIRCLE.3 FORMAT.JUSTIFY.30 FORMAT.JUSTIFY.32)) +(doit 0.19.x :id dada + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 ENSURE-DIRECTORIES-EXIST.8 FRESH-LINE.5 + PRINT.RANDOM-STATE.1 PPRINT-FILL.14 PPRINT-FILL.15 + PPRINT-LINEAR.14 PPRINT-TABULAR.13 PPRINT-LOGICAL-BLOCK.17 + PPRINT-POP.7 PPRINT-POP.8 FORMAT.LOGICAL-BLOCK.CIRCLE.1 + FORMAT.LOGICAL-BLOCK.CIRCLE.2 FORMAT.LOGICAL-BLOCK.CIRCLE.3 + FORMAT.JUSTIFY.30 FORMAT.JUSTIFY.32)) + +(compileit 0.19.x :id dada + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 ENSURE-DIRECTORIES-EXIST.8 FRESH-LINE.5 + PRINT.RANDOM-STATE.1 PPRINT-FILL.14 PPRINT-FILL.15 + PPRINT-LINEAR.14 PPRINT-TABULAR.13 PPRINT-LOGICAL-BLOCK.17 + PPRINT-POP.7 PPRINT-POP.8 FORMAT.LOGICAL-BLOCK.CIRCLE.1 + FORMAT.LOGICAL-BLOCK.CIRCLE.2 FORMAT.LOGICAL-BLOCK.CIRCLE.3 + FORMAT.JUSTIFY.30 FORMAT.JUSTIFY.32 TRACE.8)) + +(doit 0.19.x :id jupiter + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 ENSURE-DIRECTORIES-EXIST.8 FRESH-LINE.5 + PRINT.RANDOM-STATE.1 PPRINT-FILL.14 PPRINT-FILL.15 + PPRINT-LINEAR.14 PPRINT-TABULAR.13 PPRINT-LOGICAL-BLOCK.17 + PPRINT-POP.7 PPRINT-POP.8 FORMAT.LOGICAL-BLOCK.CIRCLE.1 + FORMAT.LOGICAL-BLOCK.CIRCLE.2 FORMAT.LOGICAL-BLOCK.CIRCLE.3 + FORMAT.JUSTIFY.30 FORMAT.JUSTIFY.32)) + +(compileit 0.19.x :id jupiter + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 ENSURE-DIRECTORIES-EXIST.8 FRESH-LINE.5 + PRINT.RANDOM-STATE.1 PPRINT-FILL.14 PPRINT-FILL.15 + PPRINT-LINEAR.14 PPRINT-TABULAR.13 PPRINT-LOGICAL-BLOCK.17 + PPRINT-POP.7 PPRINT-POP.8 FORMAT.LOGICAL-BLOCK.CIRCLE.1 + FORMAT.LOGICAL-BLOCK.CIRCLE.2 FORMAT.LOGICAL-BLOCK.CIRCLE.3 + FORMAT.JUSTIFY.30 FORMAT.JUSTIFY.32 TRACE.8)) + +(doit r12552 :id xp1 + :uname "ia32-winnt-5.1" :jvm "sun-jdk-1.6.0_18" + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 PRINT.RANDOM-STATE.1 PPRINT-FILL.14 PPRINT-FILL.15 + PPRINT-LINEAR.14 PPRINT-TABULAR.13 PPRINT-LOGICAL-BLOCK.17 + PPRINT-POP.7 PPRINT-POP.8 FORMAT.LOGICAL-BLOCK.CIRCLE.1 + FORMAT.LOGICAL-BLOCK.CIRCLE.2 FORMAT.LOGICAL-BLOCK.CIRCLE.3)) + +(compileit r12552 :id xp1 + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 DELETE-PACKAGE.6 + MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 CHAR-DOWNCASE.2 + ENSURE-DIRECTORIES-EXIST.8 PRINT.RANDOM-STATE.1 PPRINT-FILL.14 + PPRINT-FILL.15 PPRINT-LINEAR.14 PPRINT-TABULAR.13 + PPRINT-LOGICAL-BLOCK.17 PPRINT-POP.7 PPRINT-POP.8 + FORMAT.LOGICAL-BLOCK.CIRCLE.1 FORMAT.LOGICAL-BLOCK.CIRCLE.2 + FORMAT.LOGICAL-BLOCK.CIRCLE.3 TRACE.8)) + +(doit 0.19.x :id xp1 + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 ENSURE-DIRECTORIES-EXIST.8 + PRINT.BACKQUOTE.RANDOM.14 PRINT.RANDOM-STATE.1 PPRINT-FILL.14 + PPRINT-FILL.15 PPRINT-LINEAR.14 PPRINT-TABULAR.13 + PPRINT-LOGICAL-BLOCK.17 PPRINT-POP.7 PPRINT-POP.8 + FORMAT.LOGICAL-BLOCK.CIRCLE.1 FORMAT.LOGICAL-BLOCK.CIRCLE.2 + FORMAT.LOGICAL-BLOCK.CIRCLE.3)) + +(compileit 0.19.x :id xp1 + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 ENSURE-DIRECTORIES-EXIST.8 PRINT.RANDOM-STATE.1 + PPRINT-FILL.14 PPRINT-FILL.15 PPRINT-LINEAR.14 PPRINT-TABULAR.13 + PPRINT-LOGICAL-BLOCK.17 PPRINT-POP.7 PPRINT-POP.8 + FORMAT.LOGICAL-BLOCK.CIRCLE.1 FORMAT.LOGICAL-BLOCK.CIRCLE.2 + FORMAT.LOGICAL-BLOCK.CIRCLE.3 TRACE.8)) + +(doit 0.18.1 :id xp1 + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 ENSURE-DIRECTORIES-EXIST.8 + MAKE-BROADCAST-STREAM.8 PRINT.RANDOM-STATE.1 PPRINT-FILL.14 + PPRINT-FILL.15 PPRINT-LINEAR.14 PPRINT-TABULAR.13 + PPRINT-LOGICAL-BLOCK.17 PPRINT-POP.7 PPRINT-POP.8 + FORMAT.LOGICAL-BLOCK.CIRCLE.1 FORMAT.LOGICAL-BLOCK.CIRCLE.2 + FORMAT.LOGICAL-BLOCK.CIRCLE.3 WITH-STANDARD-IO-SYNTAX.23)) + +(compileit 0.18.1 :id xp1 + (REINITIALIZE-INSTANCE.ERROR.1 DEFGENERIC.ERROR.20 + DEFGENERIC.ERROR.21 DEFGENERIC.30 CALL-NEXT-METHOD.ERROR.1 + CALL-NEXT-METHOD.ERROR.2 DEFMETHOD.ERROR.14 DEFMETHOD.ERROR.15 + MAKE-CONDITION.3 MAKE-CONDITION.4 DELETE-PACKAGE.5 + DELETE-PACKAGE.6 MAP.48 TYPE-OF.1 TYPE-OF.4 CHAR-UPCASE.2 + CHAR-DOWNCASE.2 ENSURE-DIRECTORIES-EXIST.8 + MAKE-BROADCAST-STREAM.8 PRINT.RANDOM-STATE.1 PPRINT-FILL.14 + PPRINT-FILL.15 PPRINT-LINEAR.14 PPRINT-TABULAR.13 + PPRINT-LOGICAL-BLOCK.17 PPRINT-POP.7 PPRINT-POP.8 + FORMAT.LOGICAL-BLOCK.CIRCLE.1 FORMAT.LOGICAL-BLOCK.CIRCLE.2 + FORMAT.LOGICAL-BLOCK.CIRCLE.3 WITH-STANDARD-IO-SYNTAX.23 TRACE.8)) + From astalla at common-lisp.net Wed Mar 17 16:55:31 2010 From: astalla at common-lisp.net (Alessio Stalla) Date: Wed, 17 Mar 2010 12:55:31 -0400 Subject: [armedbear-cvs] r12557 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: astalla Date: Wed Mar 17 12:55:29 2010 New Revision: 12557 Log: Added sys::%make-byte-array-input-stream as a "inverse" of sys::%make-byte-array-output-stream Added: trunk/abcl/src/org/armedbear/lisp/ByteArrayInputStream.java Modified: trunk/abcl/src/org/armedbear/lisp/Autoload.java Modified: trunk/abcl/src/org/armedbear/lisp/Autoload.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Autoload.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Autoload.java Wed Mar 17 12:55:29 2010 @@ -528,6 +528,7 @@ autoload(PACKAGE_SYS, "%get-output-stream-bytes", "ByteArrayOutputStream"); //AS 20090325 autoload(PACKAGE_SYS, "%get-output-stream-array", "ByteArrayOutputStream"); autoload(PACKAGE_SYS, "%make-array", "make_array"); + autoload(PACKAGE_SYS, "%make-byte-array-input-stream", "ByteArrayInputStream"); //AS 20100317 autoload(PACKAGE_SYS, "%make-byte-array-output-stream", "ByteArrayOutputStream"); //AS 20090325 autoload(PACKAGE_SYS, "%make-condition", "make_condition", true); autoload(PACKAGE_SYS, "%make-hash-table", "HashTableFunctions"); Added: trunk/abcl/src/org/armedbear/lisp/ByteArrayInputStream.java ============================================================================== --- (empty file) +++ trunk/abcl/src/org/armedbear/lisp/ByteArrayInputStream.java Wed Mar 17 12:55:29 2010 @@ -0,0 +1,97 @@ +/* + * ByteArrayInputStream.java + * + * Copyright (C) 2010 Alessio Stalla + * $Id: ByteArrayInputStream.java 12513 2010-03-02 22:35:36Z ehuelsmann $ + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * As a special exception, the copyright holders of this library give you + * permission to link this library with independent modules to produce an + * executable, regardless of the license terms of these independent + * modules, and to copy and distribute the resulting executable under + * terms of your choice, provided that you also meet, for each linked + * independent module, the terms and conditions of the license of that + * module. An independent module is a module which is not derived from + * or based on this library. If you modify this library, you may extend + * this exception to your version of the library, but you are not + * obligated to do so. If you do not wish to do so, delete this + * exception statement from your version. + */ + +package org.armedbear.lisp; + +import static org.armedbear.lisp.Lisp.*; + +public final class ByteArrayInputStream extends Stream +{ + private final java.io.ByteArrayInputStream byteArrayInputStream; + + public ByteArrayInputStream(byte[] bytes) + { + this(bytes, UNSIGNED_BYTE_8); //Declared in Stream.java + } + + ByteArrayInputStream(byte[] bytes, LispObject elementType) + { + super(Symbol.SYSTEM_STREAM); + this.elementType = elementType; + initAsBinaryInputStream(byteArrayInputStream = new java.io.ByteArrayInputStream(bytes)); + } + + @Override + public LispObject typeOf() + { + return Symbol.STREAM; //TODO + } + + @Override + public LispObject classOf() + { + return BuiltInClass.STREAM; //TODO + } + + @Override + public LispObject typep(LispObject type) + { + return super.typep(type); //TODO + } + + @Override + public String toString() + { + return unreadableString("BYTE-ARRAY-INPUT-STREAM"); + } + + // ### %make-byte-array-input-stream + // %make-byte-array-input-stream bytes &optional element-type => byte-array-input-stream + private static final Primitive MAKE_BYTE_ARRAY_INPUT_STREAM = + new Primitive("%make-byte-array-input-stream", PACKAGE_SYS, false, + "bytes &optional element-type") + { + + @Override + public LispObject execute(LispObject bytes) { + return new ByteArrayInputStream((byte[]) bytes.javaInstance(byte[].class)); + } + + @Override + public LispObject execute(LispObject bytes, LispObject elementType) + { + return new ByteArrayInputStream((byte[]) bytes.javaInstance(byte[].class), elementType); + } + }; + +} From astalla at common-lisp.net Wed Mar 17 19:14:32 2010 From: astalla at common-lisp.net (Alessio Stalla) Date: Wed, 17 Mar 2010 15:14:32 -0400 Subject: [armedbear-cvs] r12558 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: astalla Date: Wed Mar 17 15:14:27 2010 New Revision: 12558 Log: Exposed in/out streams and reader/writers of Stream. Modified: trunk/abcl/src/org/armedbear/lisp/Stream.java Modified: trunk/abcl/src/org/armedbear/lisp/Stream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Stream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Stream.java Wed Mar 17 15:14:27 2010 @@ -122,22 +122,22 @@ } public Stream(Symbol structureClass, InputStream stream) { - super(structureClass); + this(structureClass); initAsBinaryInputStream(stream); } public Stream(Symbol structureClass, Reader r) { - super(structureClass); + this(structureClass); initAsCharacterInputStream(r); } public Stream(Symbol structureClass, OutputStream stream) { - super(structureClass); + this(structureClass); initAsBinaryOutputStream(stream); } public Stream(Symbol structureClass, Writer w) { - super(structureClass); + this(structureClass); initAsCharacterOutputStream(w); } @@ -149,7 +149,7 @@ // Input stream constructors. public Stream(Symbol structureClass, InputStream inputStream, LispObject elementType, LispObject format) { - super(structureClass); + this(structureClass); this.elementType = elementType; setExternalFormat(format); @@ -178,7 +178,7 @@ // Output stream constructors. public Stream(Symbol structureClass, OutputStream outputStream, LispObject elementType, LispObject format) { - super(structureClass); + this(structureClass); this.elementType = elementType; setExternalFormat(format); if (elementType == Symbol.CHARACTER || elementType == Symbol.BASE_CHAR) { @@ -2557,4 +2557,21 @@ return second; } }; + + public InputStream getInputStream() { + return in; + } + + public OutputStream getOutputStream() { + return out; + } + + public Writer getWriter() { + return writer; + } + + public PushbackReader getReader() { + return reader; + } + } From astalla at common-lisp.net Wed Mar 17 19:43:25 2010 From: astalla at common-lisp.net (Alessio Stalla) Date: Wed, 17 Mar 2010 15:43:25 -0400 Subject: [armedbear-cvs] r12559 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: astalla Date: Wed Mar 17 15:43:24 2010 New Revision: 12559 Log: Changed recently added method names in Stream to avoid conflicts with subclasses. Modified: trunk/abcl/src/org/armedbear/lisp/Stream.java Modified: trunk/abcl/src/org/armedbear/lisp/Stream.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Stream.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Stream.java Wed Mar 17 15:43:24 2010 @@ -2558,19 +2558,19 @@ } }; - public InputStream getInputStream() { + public InputStream getWrappedInputStream() { return in; } - public OutputStream getOutputStream() { + public OutputStream getWrappedOutputStream() { return out; } - public Writer getWriter() { + public Writer getWrappedWriter() { return writer; } - public PushbackReader getReader() { + public PushbackReader getWrappedReader() { return reader; } From mevenson at common-lisp.net Thu Mar 18 10:15:54 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Thu, 18 Mar 2010 06:15:54 -0400 Subject: [armedbear-cvs] r12560 - in trunk/abcl/doc: . design/pathnames Message-ID: Author: mevenson Date: Thu Mar 18 06:15:53 2010 New Revision: 12560 Log: More work on standalone documentation. Added: trunk/abcl/doc/debugging-internals.markdown trunk/abcl/doc/lisp-ffi.markdown Removed: trunk/abcl/doc/misc.markdown Modified: trunk/abcl/doc/design/pathnames/jar-pathnames.markdown trunk/abcl/doc/slime.markdown Added: trunk/abcl/doc/debugging-internals.markdown ============================================================================== --- (empty file) +++ trunk/abcl/doc/debugging-internals.markdown Thu Mar 18 06:15:53 2010 @@ -0,0 +1,5 @@ +Notes on debugging ABCL + +* Need to set *PRINT-CIRCLE* to T when examining the structures in + jvm.lisp. + Modified: trunk/abcl/doc/design/pathnames/jar-pathnames.markdown ============================================================================== --- trunk/abcl/doc/design/pathnames/jar-pathnames.markdown (original) +++ trunk/abcl/doc/design/pathnames/jar-pathnames.markdown Thu Mar 18 06:15:53 2010 @@ -1,45 +1,50 @@ JARs and JAR entries in ABCL ============================ -Mark Evenson -Created: 09 JAN 2010 -Modified: 16 MAR 2010 + Mark Evenson + Created: 09 JAN 2010 + Modified: 16 MAR 2010 Notes towards sketching an implementation of "jar:" references to be -contained in PATHNAMEs within ABCL. +contained in Common Lisp `PATHNAMEs` within ABCL. Goals ----- -1. Use Common Lisp pathnames to refer to entries in a JAR file. +1. Use Common Lisp pathnames to refer to entries in a jar file. -2. Use 'jar:' schema as documented in java.net.JarURLConnection for +2. Use `'jar:'` schema as documented in [`java.net.JarURLConnection`][jarURLConnection] for namestring representation. -An entry in a JAR file: - #p"jar:file:baz.jar!/foo" + An entry in a JAR file: + + #p"jar:file:baz.jar!/foo" -A JAR file: - #p"jar:file:baz.jar!/" + A JAR file: + + #p"jar:file:baz.jar!/" -A JAR file accessible via URL - #p"jar:http://example.org/abcl.jar!/" + A JAR file accessible via URL -An entry in a ABCL FASL in a URL accessible JAR file - #p"jar:jar:http://example.org/abcl.jar!/foo.abcl!/foo-1.cls" + #p"jar:http://example.org/abcl.jar!/" -3. MERGE-PATHNAMES working for JAR entries in the following use cases: + An entry in a ABCL FASL in a URL accessible JAR file - (merge-pathnames "foo-1.cls" "jar:jar:file:baz.jar!/foo.abcl!/foo._") - "jar:jar:file:baz.jar!/foo.abcl!/foo-1.cls" + #p"jar:jar:http://example.org/abcl.jar!/foo.abcl!/foo-1.cls" + +[jarUrlConnection]: http://java.sun.com/javase/6/docs/api/java/net/JarURLConnection.html - (merge-pathnames "foo-1.cls" "jar:file:foo.abcl!/") - "jar:file:foo.abcl!/foo-1.cls" +3. `MERGE-PATHNAMES` working for jar entries in the following use cases: -4. TRUENAME and PROBE-FILE working with "jar:" + (merge-pathnames "foo-1.cls" "jar:jar:file:baz.jar!/foo.abcl!/foo._") + ==> "jar:jar:file:baz.jar!/foo.abcl!/foo-1.cls" -4.1 TRUENAME cannonicalizing the JAR reference. + (merge-pathnames "foo-1.cls" "jar:file:foo.abcl!/") + ==> "jar:file:foo.abcl!/foo-1.cls" + +4. TRUENAME and PROBE-FILE working with "jar:" with TRUENAME + cannonicalizing the JAR reference. 5. DIRECTORY working within JAR files (and within JAR in JAR). @@ -100,163 +105,163 @@ An incomplete BNF of the syntax of JAR PATHNAME would be: - JAR-PATHNAME ::= "jar:" URL "!/" [ ENTRY ] + JAR-PATHNAME ::= "jar:" URL "!/" [ ENTRY ] + + URL ::= + | JAR-FILE-PATHNAME - URL ::= - | JAR-FILE-PATHNAME - - JAR-FILE-PATHNAME ::= "jar:" "file:" JAR-NAMESTRING "!/" [ ENTRY ] + JAR-FILE-PATHNAME ::= "jar:" "file:" JAR-NAMESTRING "!/" [ ENTRY ] - JAR-NAMESTRING ::= ABSOLUTE-FILE-NAMESTRING - | RELATIVE-FILE-NAMESTRING + JAR-NAMESTRING ::= ABSOLUTE-FILE-NAMESTRING + | RELATIVE-FILE-NAMESTRING - ENTRY ::= [ DIRECTORY "/"]* FILE + ENTRY ::= [ DIRECTORY "/"]* FILE ### Notes -1. ABSOLUTE-FILE-NAMESTRING and RELATIVE-FILE-NAMESTRING use the +1. `ABSOLUTE-FILE-NAMESTRING` and `RELATIVE-FILE-NAMESTRING` use the local filesystem conventions, meaning that on Windows this could -contain '\' as the directory separator, while an ENTRY always uses '/' +contain '\' as the directory separator, while an `ENTRY` always uses '/' to separate directories within the jar proper. Use Cases --------- -// UC1 -- JAR -pathname: { - namestring: "jar:file:foo/baz.jar!/" - device: ( - pathname: { - device: "jar:file:" - directory: (:RELATIVE "foo") - name: "baz" - type: "jar" + // UC1 -- JAR + pathname: { + namestring: "jar:file:foo/baz.jar!/" + device: ( + pathname: { + device: "jar:file:" + directory: (:RELATIVE "foo") + name: "baz" + type: "jar" + } + ) } - ) -} -// UC2 -- JAR entry -pathname: { - namestring: "jar:file:baz.jar!/foo.abcl" - device: ( pathname: { - device: "jar:file:" - name: "baz" - type: "jar" - }) - name: "foo" - type: "abcl" -} - - -// UC3 -- JAR file in a JAR entry -pathname: { - namestring: "jar:jar:file:baz.jar!/foo.abcl!/" - device: ( - pathname: { - name: "baz" - type: "jar" - } + // UC2 -- JAR entry pathname: { + namestring: "jar:file:baz.jar!/foo.abcl" + device: ( pathname: { + device: "jar:file:" + name: "baz" + type: "jar" + }) name: "foo" type: "abcl" - } - ) -} - -// UC4 -- JAR entry in a JAR entry with directories -pathname: { - namestring: "jar:jar:file:a/baz.jar!/b/c/foo.abcl!/this/that/foo-20.cls" - device: ( - pathname { - directory: (:RELATIVE "a") - name: "bar" - type: "jar" } - pathname { - directory: (:RELATIVE "b" "c") - name: "foo" - type: "abcl" + + + // UC3 -- JAR file in a JAR entry + pathname: { + namestring: "jar:jar:file:baz.jar!/foo.abcl!/" + device: ( + pathname: { + name: "baz" + type: "jar" + } + pathname: { + name: "foo" + type: "abcl" + } + ) } - ) - directory: (:RELATIVE "this" "that") - name: "foo-20" - type: "cls" -} - -// UC5 -- JAR Entry in a JAR Entry -pathname: { - namestring: "jar:jar:file:a/foo/baz.jar!/c/d/foo.abcl!/a/b/bar-1.cls" - device: ( + + // UC4 -- JAR entry in a JAR entry with directories pathname: { - directory: (:RELATIVE "a" "foo") - name: "baz" - type: "jar" + namestring: "jar:jar:file:a/baz.jar!/b/c/foo.abcl!/this/that/foo-20.cls" + device: ( + pathname { + directory: (:RELATIVE "a") + name: "bar" + type: "jar" + } + pathname { + directory: (:RELATIVE "b" "c") + name: "foo" + type: "abcl" + } + ) + directory: (:RELATIVE "this" "that") + name: "foo-20" + type: "cls" } + + // UC5 -- JAR Entry in a JAR Entry pathname: { - directory: (:RELATIVE "c" "d") - name: "foo" - type: "abcl" + namestring: "jar:jar:file:a/foo/baz.jar!/c/d/foo.abcl!/a/b/bar-1.cls" + device: ( + pathname: { + directory: (:RELATIVE "a" "foo") + name: "baz" + type: "jar" + } + pathname: { + directory: (:RELATIVE "c" "d") + name: "foo" + type: "abcl" + } + ) + directory: (:ABSOLUTE "a" "b") + name: "bar-1" + type: "cls" } - ) - directory: (:ABSOLUTE "a" "b") - name: "bar-1" - type: "cls" -} - -// UC6 -- JAR entry in a http: accessible JAR file -pathname: { - namestring: "jar:http://example.org/abcl.jar!/org/armedbear/lisp/Version.class", - device: ( - "http://example.org/abcl.jar" + + // UC6 -- JAR entry in a http: accessible JAR file pathname: { - directory: (:RELATIVE "org" "armedbear" "lisp") - name: "Version" - type: "class" - } -} - -// UC7 -- JAR Entry in a JAR Entry in a URL accessible JAR FILE -pathname: { - namestring "jar:jar:http://example.org/abcl.jar!/foo.abcl!/foo-1.cls" - device: ( - "http://example.org/abcl.jar" - pathname: { - name: "foo" - type: "abcl" - } - ) - name: "foo-1" - type: "cls" -} - -// UC8 -- JAR in an absolute directory - -pathame: { - namestring: "jar:file:/a/b/foo.jar!/" - device: ( - pathname: { - directory: (:ABSOLUTE "a" "b") + namestring: "jar:http://example.org/abcl.jar!/org/armedbear/lisp/Version.class", + device: ( + "http://example.org/abcl.jar" + pathname: { + directory: (:RELATIVE "org" "armedbear" "lisp") + name: "Version" + type: "class" + } + } + + // UC7 -- JAR Entry in a JAR Entry in a URL accessible JAR FILE + pathname: { + namestring "jar:jar:http://example.org/abcl.jar!/foo.abcl!/foo-1.cls" + device: ( + "http://example.org/abcl.jar" + pathname: { + name: "foo" + type: "abcl" + } + ) + name: "foo-1" + type: "cls" + } + + // UC8 -- JAR in an absolute directory + + pathame: { + namestring: "jar:file:/a/b/foo.jar!/" + device: ( + pathname: { + directory: (:ABSOLUTE "a" "b") + name: "foo" + type: "jar" + } + ) + } + + // UC9 -- JAR in an relative directory with entry + pathname: { + namestring: "jar:file:a/b/foo.jar!/c/d/foo.lisp" + device: ( + directory: (:RELATIVE "a" "b") + name: "foo" + type: "jar" + ) + directory: (:ABSOLUTE "c" "d") name: "foo" - type: "jar" - } - ) -} - -// UC9 -- JAR in an relative directory with entry -pathname: { - namestring: "jar:file:a/b/foo.jar!/c/d/foo.lisp" - device: ( - directory: (:RELATIVE "a" "b") - name: "foo" - type: "jar" - ) - directory: (:ABSOLUTE "c" "d") - name: "foo" - type: "lisp -} + type: "lisp + } History @@ -267,37 +272,37 @@ pathname, the device pathname contained the location of the jar. In the analysis of the desire to treat jar pathnames as valid -locations for LOAD, we determined that we needed a "double" pathname +locations for `LOAD`, we determined that we needed a "double" pathname so we could refer to the components of a packed FASL in jar. At first we thought we could support such a syntax by having the device pathname's device refer to the inner jar. But with in this use of -PATHNAMEs linked by the DEVICE field, we found the problem that UNC -path support uses the DEVICE field so JARs located on UNC mounts can't -be referenced. via '\\'. +`PATHNAME`s linked by the `DEVICE` field, we found the problem that UNC +path support uses the `DEVICE` field so JARs located on UNC mounts can't +be referenced. via '\\', i.e. - i.e. jar:jar:file:\\server\share\a\b\foo.jar!/this\that!/foo.java + jar:jar:file:\\server\share\a\b\foo.jar!/this\that!/foo.java would not have a valid representation. -So instead of having DEVICE point to a PATHNAME, we decided that the -DEVICE shall be a list of PATHNAMES, so we would have: +So instead of having `DEVICE` point to a `PATHNAME`, we decided that the +`DEVICE` shall be a list of `PATHNAME`, so we would have: + + pathname: { + namestring: "jar:jar:file:\\server\share\foo.jar!/foo.abcl!/" + device: ( + pathname: { + host: "server" + device: "share" + name: "foo" + type: "jar" + } + pathname: { + name: "foo" + type: "abcl" + } + } -pathname: { - namestring: "jar:jar:file:\\server\share\foo.jar!/foo.abcl!/" - device: ( - pathname: { - host: "server" - device: "share" - name: "foo" - type: "jar" - } - pathname: { - name: "foo" - type: "abcl" - } -} - -Although there is a fair amount of special logic inside Pathname.java -itself in the resulting implementation, the logic in Load.java seems -to have been considerably simplified. +Although there is a fair amount of special logic inside `Pathname.java` +itself in the resulting implementation, the logic in `Load.java` seems +to have been considerably simplified. Added: trunk/abcl/doc/lisp-ffi.markdown ============================================================================== --- (empty file) +++ trunk/abcl/doc/lisp-ffi.markdown Thu Mar 18 06:15:53 2010 @@ -0,0 +1,119 @@ +Lisp FFI +======== + + Mark Evenson + Created: 15-FEB-2010 + Modified: 18-MAR-2010 + +FFI stands for "Foreign Function Interface", which is the way the +contemporary Lisp world refers to methods of "calling out" from Lisp +into "foreign" langauges and envrionments. This document describes +the various ways that one interacts with Lisp world of Abcl from Java, +considering the hosted Lisp as the "Foreign Function" that needs to be +"Interfaced". + +# Lisp FFI + +## Calling Lisp from Java + +Note: As the entire ABCL Lisp system resides in the org.armedbear.lisp +package the following code snippets do not show the relevant import +statements in the interest of brevity. + +Per JVM, there can only ever be a single Lisp interpreter. This is +started by calling the static method `Interpreter.createInstance()`. + + Interpreter interpreter = Interpreter.createInstance(); + +If this method has already been invoked in the lifetime of the current +Java process it will return null, so if you are writing Java whose +lifecycle is a bit out of your control (like in a Java servlet), a +safer invocation pattern might be: + + Interpreter interpreter = Interpreter.getInstance(); + if (interpreter == null) { + interpreter = Interpreter.createInstance(); + } + +The Lisp `EVAL` primitive may be simply passed strings for evaluation, +as follows + + String line = "(load \"file.lisp\")"; + LispObject result = interpreter.eval(line); + +Notice that all possible return values from an arbitrary Lisp +computation are collapsed into a single return value. Doing useful +further computation on the `LispObject` depends on knowing what the +result of the computation might be, usually involves some amount +of instanceof introspection, and forms a whole topic to itself +(c.f. [Introspecting a LispObject](#introspecting)). + +Using `EVAL` involves the Lisp interpreter. Lisp functions may be +directly invoked by Java method calls as follows. One simply locates +the package containing the symbol, then obtains a reference to the +symbol, and then invokes the `execute()` method with the desired +parameters. + + 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.prinln("The result was " + result.writeToString()); + +If one is calling an primitive function in the CL package the syntax +becomes considerably simpler if we can locate the instance of +definition in the ABCL source, we can invoke the symbol directly. To +tell if a `LispObject` contains a reference to a symbol. + + boolean nullp(LispObject object) { + LispObject result = Primitives.NULL.execute(object); + if (result == NIL) { + return false; + } + return true; + } + + +## Introspecting a LispObject + +We present various patterns for introspecting an an arbitrary +`LispObject` which can represent the result of every Lisp evaluation +into semantics that Java can meaniningfully deal with. + +### LispObject as boolean + +If the LispObject a generalized boolean values, one can use +`getBooleanValue()` to convert to Java: + + LispObject object = Symbol.NIL; + boolean javaValue = object.getBooleanValue(); + +Although since in Lisp, any value other than NIL means "true", the +use of Java equality it quite a bit easier and more optimal: + + boolean javaValue = (object != Symbol.NIL); + +### LispObject is a list + +If LispObject is a list, it will have the type `Cons`. One can then use +the `copyToArray[]` to make things a bit more suitable for Java +iteration. + + LispObject result = interpreter.eval("'(1 2 4 5)"); + if (result instanceof Cons) { + LispObject array[] = ((Cons)result.copyToArray()); + ... + } + +A more Lispy way to iterated down a list is to use the `cdr()` access +function just as like one would traverse a list in Lisp:; + + LispObject result = interpreter.eval("'(1 2 4 5)"); + while (result != Symbol.NIL) { + doSomething(result.car()); + result = result.cdr(); + } + Modified: trunk/abcl/doc/slime.markdown ============================================================================== --- trunk/abcl/doc/slime.markdown (original) +++ trunk/abcl/doc/slime.markdown Thu Mar 18 06:15:53 2010 @@ -1,9 +1,9 @@ SLIME ===== - Author: Mark Evenson - Created: 16-MAR-2010 - Modified: 16-MAR-2010 + Author: Mark Evenson + Created: 16-MAR-2010 + Modified: 18-MAR-2010 SLIME is divided conceptually in two parts: the "swank" server process which runs in the native Lisp and the "slime" client process running @@ -24,12 +24,13 @@ One first locates the SLIME directory on the filesystem. In the code that follows, the SLIME top level directory is assumed to be -"~/work/slime", so adjust this value to your local value as you see +`"~/work/slime"`, so adjust this value to your local value as you see fit. Then one configures Emacs with the proper initialization hooks by adding code something like the following to "~/.emacs": + :::common-lisp (add-to-list 'load-path "~/work/slime") (setq slime-lisp-implementations '((abcl ("~/work/abcl/abcl")) @@ -39,28 +40,29 @@ (slime-setup '(slime-fancy slime-asdf slime-banner)) One further need to customize the setting of -SLIME-LISP-IMPLEMENTATIONS to the location(s) of the Lisp(s) you wish to +`SLIME-LISP-IMPLEMENTATIONS` to the location(s) of the Lisp(s) you wish to invoke via SLIME. The value is list of lists of the form (SYMBOL ("/path/to/lisp")) where SYMBOL is a mnemonic for the Lisp implementation, and the string -"/path/to/lisp" is the absolute path of the Lisp implementation that +`"/path/to/lisp"` is the absolute path of the Lisp implementation that SLIME will associate with this symbol. In the example above, I have defined three implementations, the main abcl implementation, a version that corresponds to the latest version from SVN invoked by -"~/work/abcl.svn/abcl", and a version of SBCL. +`"~/work/abcl.svn/abcl"`, and a version of SBCL. -To start SLIME one simply issues M-x slime from Emacs. This will +To start SLIME one simply issues `M-x slime` from Emacs. This will start the first entry in the SLIME-LISP-IMPLEMENTATIONS list. If you -wish to start a subsequent Lisp, prefix the invocation via M-u -(i.e. M-u M-x slime). This will present an interactive chooser over -all symbols contained in SLIME-LISP-IMPLEMENTATIONS. +wish to start a subsequent Lisp, prefix the Emacs invocation with a +negative argument (i.e. `C-- M-x slime`). This will present an +interactive chooser over all symbols contained in +`SLIME-LISP-IMPLEMENTATIONS`. After you invoke SLIME, you'll see a buffer open up named -*inferior-lisp* where the Lisp image is started up, the required swank +`*inferior-lisp*` where the Lisp image is started up, the required swank code is complied and then loaded, finally, you'll see the "flying -letters" resolving itself to a "CL-USER>" prompt with an inspiration +letters" resolving itself to a `"CL-USER>"` prompt with an inspiration message in the minibuffer. Your initiation to SLIME has begun... @@ -71,16 +73,16 @@ from a Lisp image. One merely needs to change *SLIME-DIRECTORY* to point to the top directory of the server process. -` + :::commmon-lisp (defvar *slime-directory* #p"~/work/slime/") ;; Don't forget trailing slash (load (merge-pathnames "swank-loader.lisp" *slime-directory*) :verbose t) (swank-loader:init) (swank:start-server "/tmp/swank.port") ;; remove if you don't want ;; swank to start listening for connections. -` + When this code finishes executing, an integer representing the port on -which the server starts will be written to '/tmp/swank.port' and also -returned as the result of evaluating SWANK:START-SERVER. One may -connect to this port via issuing M-x slime-connect in Emacs. +which the server starts will be written to `'/tmp/swank.port'` and also +returned as the result of evaluating `SWANK:START-SERVER`. One may +connect to this port via issuing `M-x slime-connect` in Emacs. From mevenson at common-lisp.net Thu Mar 18 12:00:11 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Thu, 18 Mar 2010 08:00:11 -0400 Subject: [armedbear-cvs] r12561 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: mevenson Date: Thu Mar 18 07:59:59 2010 New Revision: 12561 Log: Convert to stack-friendly primitives; add missing grovel tags. Modified: trunk/abcl/src/org/armedbear/lisp/Java.java Modified: trunk/abcl/src/org/armedbear/lisp/Java.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Java.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Java.java Thu Mar 18 07:59:59 2010 @@ -60,10 +60,15 @@ } // ### register-java-exception exception-name condition-symbol => T - private static final Primitive REGISTER_JAVA_EXCEPTION = - new Primitive("register-java-exception", PACKAGE_JAVA, true, - "exception-name condition-symbol") + private static final Primitive REGISTER_JAVA_EXCEPTION = new pf_register_java_exception(); + private static final class pf_register_java_exception extends Primitive { + pf_register_java_exception() + { + super("register-java-exception", PACKAGE_JAVA, true, + "exception-name condition-symbol"); + } + @Override public LispObject execute(LispObject className, LispObject symbol) @@ -80,10 +85,15 @@ }; // ### unregister-java-exception exception-name => T or NIL - private static final Primitive UNREGISTER_JAVA_EXCEPTION = - new Primitive("unregister-java-exception", PACKAGE_JAVA, true, - "exception-name") + private static final Primitive UNREGISTER_JAVA_EXCEPTION = new pf_unregister_java_exception(); + private static final class pf_unregister_java_exception extends Primitive { + pf_unregister_java_exception() + { + super("unregister-java-exception", PACKAGE_JAVA, true, + "exception-name"); + } + @Override public LispObject execute(LispObject className) @@ -106,10 +116,15 @@ } // ### jclass name-or-class-ref => class-ref - private static final Primitive JCLASS = - new Primitive(Symbol.JCLASS, "name-or-class-ref", -"Returns a reference to the Java class designated by NAME-OR-CLASS-REF.") + private static final Primitive JCLASS = new pf_jclass(); + private static final class pf_jclass extends Primitive { + pf_jclass() + { + super(Symbol.JCLASS, "name-or-class-ref", + "Returns a reference to the Java class designated by NAME-OR-CLASS-REF."); + } + @Override public LispObject execute(LispObject arg) { @@ -221,10 +236,16 @@ return NIL; } - private static final Primitive JFIELD = - new Primitive("jfield", PACKAGE_JAVA, true, - "class-ref-or-field field-or-instance &optional instance value") + // ### jfield class-ref-or-field field-or-instance &optional instance value + private static final Primitive JFIELD = new pf_jfield(); + private static final class pf_jfield extends Primitive { + pf_jfield() + { + super("jfield", PACKAGE_JAVA, true, + "class-ref-or-field field-or-instance &optional instance value"); + } + @Override public LispObject execute(LispObject[] args) { @@ -233,10 +254,15 @@ }; // ### jfield-raw - retrieve or modify a field in a Java class or instance. - private static final Primitive JFIELD_RAW = - new Primitive("jfield-raw", PACKAGE_JAVA, true, - "class-ref-or-field field-or-instance &optional instance value") + private static final Primitive JFIELD_RAW = new pf_jfield_raw(); + private static final class pf_jfield_raw extends Primitive { + pf_jfield_raw() + { + super("jfield-raw", PACKAGE_JAVA, true, + "class-ref-or-field field-or-instance &optional instance value"); + } + @Override public LispObject execute(LispObject[] args) { @@ -245,10 +271,15 @@ }; // ### jconstructor class-ref &rest parameter-class-refs - private static final Primitive JCONSTRUCTOR = - new Primitive("jconstructor", PACKAGE_JAVA, true, - "class-ref &rest parameter-class-refs") + private static final Primitive JCONSTRUCTOR = new pf_jconstructor(); + private static final class pf_jconstructor extends Primitive { + pf_jconstructor() + { + super("jconstructor", PACKAGE_JAVA, true, + "class-ref &rest parameter-class-refs"); + } + @Override public LispObject execute(LispObject[] args) { @@ -290,10 +321,15 @@ }; // ### jmethod class-ref name &rest parameter-class-refs - private static final Primitive JMETHOD = - new Primitive("jmethod", PACKAGE_JAVA, true, - "class-ref name &rest parameter-class-refs") + private static final Primitive JMETHOD = new pf_jmethod(); + private static final class pf_jmethod extends Primitive { + pf_jmethod() + { + super("jmethod", PACKAGE_JAVA, true, + "class-ref name &rest parameter-class-refs"); + } + @Override public LispObject execute(LispObject[] args) { @@ -413,9 +449,14 @@ } // ### jstatic method class &rest args - private static final Primitive JSTATIC = - new Primitive("jstatic", PACKAGE_JAVA, true, "method class &rest args") + private static final Primitive JSTATIC = new pf_jstatic(); + private static final class pf_jstatic extends Primitive { + pf_jstatic() + { + super("jstatic", PACKAGE_JAVA, true, "method class &rest args"); + } + @Override public LispObject execute(LispObject[] args) { @@ -424,10 +465,15 @@ }; // ### jstatic-raw method class &rest args - private static final Primitive JSTATIC_RAW = - new Primitive("jstatic-raw", PACKAGE_JAVA, true, - "method class &rest args") + private static final Primitive JSTATIC_RAW = new pf_jstatic_raw(); + private static final class pf_jstatic_raw extends Primitive { + pf_jstatic_raw() + { + super("jstatic-raw", PACKAGE_JAVA, true, + "method class &rest args"); + } + @Override public LispObject execute(LispObject[] args) { @@ -436,9 +482,14 @@ }; // ### jnew constructor &rest args - private static final Primitive JNEW = - new Primitive("jnew", PACKAGE_JAVA, true, "constructor &rest args") + private static final Primitive JNEW = new pf_jnew(); + private static final class pf_jnew extends Primitive { + pf_jnew() + { + super("jnew", PACKAGE_JAVA, true, "constructor &rest args"); + } + @Override public LispObject execute(LispObject[] args) { @@ -487,10 +538,15 @@ }; // ### jnew-array element-type &rest dimensions - private static final Primitive JNEW_ARRAY = - new Primitive("jnew-array", PACKAGE_JAVA, true, - "element-type &rest dimensions") + private static final Primitive JNEW_ARRAY = new pf_jnew_array(); + private static final class pf_jnew_array extends Primitive { + pf_jnew_array() + { + super("jnew-array", PACKAGE_JAVA, true, + "element-type &rest dimensions"); + } + @Override public LispObject execute(LispObject[] args) { @@ -540,10 +596,15 @@ } // ### jarray-ref java-array &rest indices - private static final Primitive JARRAY_REF = - new Primitive("jarray-ref", PACKAGE_JAVA, true, - "java-array &rest indices") + private static final Primitive JARRAY_REF = new pf_jarray_ref(); + private static final class pf_jarray_ref extends Primitive { + pf_jarray_ref() + { + super("jarray-ref", PACKAGE_JAVA, true, + "java-array &rest indices"); + } + @Override public LispObject execute(LispObject[] args) { @@ -552,10 +613,15 @@ }; // ### jarray-ref-raw java-array &rest indices - private static final Primitive JARRAY_REF_RAW = - new Primitive("jarray-ref-raw", PACKAGE_JAVA, true, - "java-array &rest indices") + private static final Primitive JARRAY_REF_RAW = new pf_jarray_ref_raw(); + private static final class pf_jarray_ref_raw extends Primitive { + pf_jarray_ref_raw() + { + super("jarray-ref-raw", PACKAGE_JAVA, true, + "java-array &rest indices"); + } + @Override public LispObject execute(LispObject[] args) { @@ -564,10 +630,15 @@ }; // ### jarray-set java-array new-value &rest indices - private static final Primitive JARRAY_SET = - new Primitive("jarray-set", PACKAGE_JAVA, true, - "java-array new-value &rest indices") + private static final Primitive JARRAY_SET = new pf_jarray_set(); + private static final class pf_jarray_set extends Primitive { + pf_jarray_set() + { + super("jarray-set", PACKAGE_JAVA, true, + "java-array new-value &rest indices"); + } + @Override public LispObject execute(LispObject[] args) { @@ -599,10 +670,15 @@ }; // ### jcall method instance &rest args - // Calls makeLispObject() to convert the result to an appropriate Lisp type. - private static final Primitive JCALL = - new Primitive(Symbol.JCALL, "method-ref instance &rest args") + /** Calls makeLispObject() to convert the result to an appropriate Lisp type. */ + private static final Primitive JCALL = new pf_jcall(); + private static final class pf_jcall extends Primitive { + pf_jcall() + { + super(Symbol.JCALL, "method-ref instance &rest args"); + } + @Override public LispObject execute(LispObject[] args) { @@ -611,11 +687,18 @@ }; // ### jcall-raw method instance &rest args - // Does no type conversion. The result of the call is simply wrapped in a - // JavaObject. - private static final Primitive JCALL_RAW = - new Primitive(Symbol.JCALL_RAW, "method-ref instance &rest args") + /** + * Does no type conversion. The result of the call is simply wrapped in a + * JavaObject. + */ + private static final Primitive JCALL_RAW = new pf_jcall_raw(); + private static final class pf_jcall_raw extends Primitive { + pf_jcall_raw() + { + super(Symbol.JCALL_RAW, "method-ref instance &rest args"); + } + @Override public LispObject execute(LispObject[] args) { @@ -872,10 +955,15 @@ } // ### make-immediate-object object &optional type - private static final Primitive MAKE_IMMEDIATE_OBJECT = - new Primitive("make-immediate-object", PACKAGE_JAVA, true, - "object &optional type") + private static final Primitive MAKE_IMMEDIATE_OBJECT = new pf_make_immediate_object(); + private static final class pf_make_immediate_object extends Primitive { + pf_make_immediate_object() + { + super("make-immediate-object", PACKAGE_JAVA, true, + "object &optional type"); + } + @Override public LispObject execute(LispObject[] args) { @@ -903,9 +991,14 @@ }; // ### java-object-p - private static final Primitive JAVA_OBJECT_P = - new Primitive("java-object-p", PACKAGE_JAVA, true, "object") + private static final Primitive JAVA_OBJECT_P = new pf_java_object_p(); + private static final class pf_java_object_p extends Primitive { + pf_java_object_p() + { + super("java-object-p", PACKAGE_JAVA, true, "object"); + } + @Override public LispObject execute(LispObject arg) { @@ -914,9 +1007,14 @@ }; // ### jobject-lisp-value java-object - private static final Primitive JOBJECT_LISP_VALUE = - new Primitive("jobject-lisp-value", PACKAGE_JAVA, true, "java-object") + private static final Primitive JOBJECT_LISP_VALUE = new pf_jobject_lisp_value(); + private static final class pf_jobject_lisp_value extends Primitive { + pf_jobject_lisp_value() + { + super("jobject-lisp-value", PACKAGE_JAVA, true, "java-object"); + } + @Override public LispObject execute(LispObject arg) { @@ -925,9 +1023,14 @@ }; // ### jcoerce java-object intended-class - private static final Primitive JCOERCE = - new Primitive("jcoerce", PACKAGE_JAVA, true, "java-object intended-class") + private static final Primitive JCOERCE = new pf_jcoerce(); + private static final class pf_jcoerce extends Primitive { + pf_jcoerce() + { + super("jcoerce", PACKAGE_JAVA, true, "java-object intended-class"); + } + @Override public LispObject execute(LispObject javaObject, LispObject intendedClass) { @@ -940,10 +1043,16 @@ } } }; - - private static final Primitive JGET_PROPERTY_VALUE = - new Primitive("%jget-property-value", PACKAGE_JAVA, true, - "java-object property-name") { + + // ### %jget-property-value java-object property-name + private static final Primitive JGET_PROPERTY_VALUE = new pf__jget_property_value(); + private static final class pf__jget_property_value extends Primitive + { + pf__jget_property_value() + { + super("%jget-property-value", PACKAGE_JAVA, true, + "java-object property-name"); + } @Override public LispObject execute(LispObject javaObject, LispObject propertyName) { @@ -964,9 +1073,15 @@ } }; - private static final Primitive JSET_PROPERTY_VALUE = - new Primitive("%jset-property-value", PACKAGE_JAVA, true, - "java-object property-name value") { + // ### %jset-property-value java-object property-name value + private static final Primitive JSET_PROPERTY_VALUE = new pf__jset_property_value(); + private static final class pf__jset_property_value extends Primitive + { + pf__jset_property_value() + { + super("%jset-property-value", PACKAGE_JAVA, true, + "java-object property-name value"); + } @Override public LispObject execute(LispObject javaObject, LispObject propertyName, LispObject value) { @@ -995,24 +1110,30 @@ }; - private static final Primitive JRUN_EXCEPTION_PROTECTED = - new Primitive("jrun-exception-protected", PACKAGE_JAVA, true, - "closure") { - - @Override - public LispObject execute(LispObject closure) { - Function fun = checkFunction(closure); - - try { - return LispThread.currentThread().execute(closure); - } - catch (OutOfMemoryError oom) { - return error(new StorageCondition("Out of memory.")); - } - catch (StackOverflowError oos) { - return error(new StorageCondition("Stack overflow.")); - } - } + // ### jrun-exception-protected closure + private static final Primitive JRUN_EXCEPTION_PROTECTED = new pf_jrun_exception_protection(); + private static final class pf_jrun_exception_protection extends Primitive + { + pf_jrun_exception_protection() + { + super("jrun-exception-protected", PACKAGE_JAVA, true, + "closure"); + } + + @Override + public LispObject execute(LispObject closure) { + Function fun = checkFunction(closure); + + try { + return LispThread.currentThread().execute(closure); + } + catch (OutOfMemoryError oom) { + return error(new StorageCondition("Out of memory.")); + } + catch (StackOverflowError oos) { + return error(new StorageCondition("Stack overflow.")); + } + } }; static PropertyDescriptor getPropertyDescriptor(Object obj, LispObject propertyName) throws IntrospectionException { From astalla at common-lisp.net Fri Mar 19 21:19:35 2010 From: astalla at common-lisp.net (Alessio Stalla) Date: Fri, 19 Mar 2010 17:19:35 -0400 Subject: [armedbear-cvs] r12562 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: astalla Date: Fri Mar 19 17:19:34 2010 New Revision: 12562 Log: Inlining of lambda calls: handled the case (funcall (lambda (...) ...) ...) Modified: trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp Modified: trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/compiler-pass1.lisp Fri Mar 19 17:19:34 2010 @@ -1243,32 +1243,37 @@ (defknown rewrite-function-call (t) t) (defun rewrite-function-call (form) - (let ((op (car form)) - (args (cdr form))) - (if (and (listp op) - (eq (car op) 'lambda)) - (expand-function-call-inline form (cadr op) (copy-tree (cddr op)) args) - (if (unsafe-p args) - (let ((arg1 (car args))) - (cond ((and (consp arg1) (eq (car arg1) 'GO)) - arg1) - (t - (let ((syms ()) - (lets ())) - ;; Preserve the order of evaluation of the arguments! - (dolist (arg args) - (cond ((constantp arg) - (push arg syms)) - ((and (consp arg) (eq (car arg) 'GO)) - (return-from rewrite-function-call - (list 'LET* (nreverse lets) arg))) - (t - (let ((sym (gensym))) - (push sym syms) - (push (list sym arg) lets))))) - (list 'LET* (nreverse lets) - (list* (car form) (nreverse syms))))))) - form)))) + (let ((op (car form)) (args (cdr form))) + (cond + ((and (eq op 'funcall) (listp (car args)) (eq (caar args) 'lambda)) + ;;(funcall (lambda (...) ...) ...) + (let ((op (car args)) (args (cdr args))) + (expand-function-call-inline form (cadr op) (copy-tree (cddr op)) + args))) + ((and (listp op) (eq (car op) 'lambda)) + ;;((lambda (...) ...) ...) + (expand-function-call-inline form (cadr op) (copy-tree (cddr op)) args)) + (t (if (unsafe-p args) + (let ((arg1 (car args))) + (cond ((and (consp arg1) (eq (car arg1) 'GO)) + arg1) + (t + (let ((syms ()) + (lets ())) + ;; Preserve the order of evaluation of the arguments! + (dolist (arg args) + (cond ((constantp arg) + (push arg syms)) + ((and (consp arg) (eq (car arg) 'GO)) + (return-from rewrite-function-call + (list 'LET* (nreverse lets) arg))) + (t + (let ((sym (gensym))) + (push sym syms) + (push (list sym arg) lets))))) + (list 'LET* (nreverse lets) + (list* (car form) (nreverse syms))))))) + form))))) (defknown p1-function-call (t) t) (defun p1-function-call (form) From ehuelsmann at common-lisp.net Sat Mar 20 19:34:23 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sat, 20 Mar 2010 15:34:23 -0400 Subject: [armedbear-cvs] r12563 - trunk/abcl Message-ID: Author: ehuelsmann Date: Sat Mar 20 15:34:22 2010 New Revision: 12563 Log: Update README for release 0.19.1. Modified: trunk/abcl/README Modified: trunk/abcl/README ============================================================================== --- trunk/abcl/README (original) +++ trunk/abcl/README Sat Mar 20 15:34:22 2010 @@ -45,7 +45,7 @@ Which should result output like the following: ---------------- -Armed Bear Common Lisp 0.17.0 +Armed Bear Common Lisp 0.19.1 Java 1.6.0_14 Sun Microsystems Inc. Java HotSpot(TM) Client VM Low-level initialization completed in 0.9 seconds. @@ -135,16 +135,16 @@ A lot of (renewed) energy has been spent to make ABCL a compliant and practically useable Common Lisp implementation. Because of this, -ABCL 0.17.0 now fails only 34 out of 21702 tests in the ANSI CL test +ABCL 0.19.1 now fails only 29 out of 21702 tests in the ANSI CL test suite. Next to that, the fail count of the Maxima test suite has been -reduced to only 3 - rounding errors. +reduced to only 5 - rounding errors. ABCL's CLOS does not handle on-the-fly redefinition of classes correctly. Quite a bit of energy has been spent in versions 0.16.0 and 0.17.0 to improve CLOS performance. There is no support for the long form of DEFINE-METHOD-COMBINATION, and certain other required CLOS features are also missing. Enough CLOS is there to run -ASDF and CL-PPCRE, if you're in no hurry. +ASDF2 and CL-PPCRE. There is no MOP worth mentioning. @@ -159,4 +159,4 @@ On behalf of all ABCL development team and contributors, Erik Huelsmann -October 31, 2009 +March 20, 2010 From ehuelsmann at common-lisp.net Sat Mar 20 19:38:07 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sat, 20 Mar 2010 15:38:07 -0400 Subject: [armedbear-cvs] r12564 - branches/0.19.x/abcl Message-ID: Author: ehuelsmann Date: Sat Mar 20 15:38:04 2010 New Revision: 12564 Log: Backport README changes. Modified: branches/0.19.x/abcl/README Modified: branches/0.19.x/abcl/README ============================================================================== --- branches/0.19.x/abcl/README (original) +++ branches/0.19.x/abcl/README Sat Mar 20 15:38:04 2010 @@ -45,7 +45,7 @@ Which should result output like the following: ---------------- -Armed Bear Common Lisp 0.17.0 +Armed Bear Common Lisp 0.19.1 Java 1.6.0_14 Sun Microsystems Inc. Java HotSpot(TM) Client VM Low-level initialization completed in 0.9 seconds. @@ -135,16 +135,16 @@ A lot of (renewed) energy has been spent to make ABCL a compliant and practically useable Common Lisp implementation. Because of this, -ABCL 0.17.0 now fails only 34 out of 21702 tests in the ANSI CL test +ABCL 0.19.1 now fails only 29 out of 21702 tests in the ANSI CL test suite. Next to that, the fail count of the Maxima test suite has been -reduced to only 3 - rounding errors. +reduced to only 5 - rounding errors. ABCL's CLOS does not handle on-the-fly redefinition of classes correctly. Quite a bit of energy has been spent in versions 0.16.0 and 0.17.0 to improve CLOS performance. There is no support for the long form of DEFINE-METHOD-COMBINATION, and certain other required CLOS features are also missing. Enough CLOS is there to run -ASDF and CL-PPCRE, if you're in no hurry. +ASDF2 and CL-PPCRE. There is no MOP worth mentioning. @@ -159,4 +159,4 @@ On behalf of all ABCL development team and contributors, Erik Huelsmann -October 31, 2009 +March 20, 2010 From ehuelsmann at common-lisp.net Sat Mar 20 19:40:16 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sat, 20 Mar 2010 15:40:16 -0400 Subject: [armedbear-cvs] r12565 - in tags/0.19.1: . abcl abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sat Mar 20 15:40:13 2010 New Revision: 12565 Log: Tag 0.19.1 release. Added: tags/0.19.1/ - copied from r12563, /branches/0.19.x/ tags/0.19.1/abcl/README - copied unchanged from r12564, /branches/0.19.x/abcl/README Modified: tags/0.19.1/abcl/src/org/armedbear/lisp/Version.java Modified: tags/0.19.1/abcl/src/org/armedbear/lisp/Version.java ============================================================================== --- /branches/0.19.x/abcl/src/org/armedbear/lisp/Version.java (original) +++ tags/0.19.1/abcl/src/org/armedbear/lisp/Version.java Sat Mar 20 15:40:13 2010 @@ -41,7 +41,7 @@ public static String getVersion() { - return "0.19.1-dev"; + return "0.19.1"; } public static void main(String args[]) { From ehuelsmann at common-lisp.net Sat Mar 20 19:43:59 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sat, 20 Mar 2010 15:43:59 -0400 Subject: [armedbear-cvs] r12566 - branches/0.19.x/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sat Mar 20 15:43:54 2010 New Revision: 12566 Log: With 0.19.1 tagged, advance the version number in the branch. Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Version.java Modified: branches/0.19.x/abcl/src/org/armedbear/lisp/Version.java ============================================================================== --- branches/0.19.x/abcl/src/org/armedbear/lisp/Version.java (original) +++ branches/0.19.x/abcl/src/org/armedbear/lisp/Version.java Sat Mar 20 15:43:54 2010 @@ -41,7 +41,7 @@ public static String getVersion() { - return "0.19.1-dev"; + return "0.19.2-dev"; } public static void main(String args[]) { From ehuelsmann at common-lisp.net Sat Mar 20 19:45:59 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sat, 20 Mar 2010 15:45:59 -0400 Subject: [armedbear-cvs] r12567 - tags/0.19.0 Message-ID: Author: ehuelsmann Date: Sat Mar 20 15:45:55 2010 New Revision: 12567 Log: Delete tag for version which was never released. Removed: tags/0.19.0/ From ehuelsmann at common-lisp.net Sun Mar 21 10:38:38 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 21 Mar 2010 06:38:38 -0400 Subject: [armedbear-cvs] r12568 - branches/metaclass/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sun Mar 21 06:38:37 2010 New Revision: 12568 Log: Remove checkClass() function no longer in use. Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Lisp.java Modified: branches/metaclass/abcl/src/org/armedbear/lisp/Lisp.java ============================================================================== --- branches/metaclass/abcl/src/org/armedbear/lisp/Lisp.java (original) +++ branches/metaclass/abcl/src/org/armedbear/lisp/Lisp.java Sun Mar 21 06:38:37 2010 @@ -1634,15 +1634,6 @@ type_error(obj, Symbol.STRING); } - public final static LispClass checkClass(LispObject obj) - - { - if (obj instanceof LispClass) - return (LispClass) obj; - return (LispClass)// Not reached. - type_error(obj, Symbol.CLASS); - } - public final static Layout checkLayout(LispObject obj) { From ehuelsmann at common-lisp.net Sun Mar 21 14:15:37 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 21 Mar 2010 10:15:37 -0400 Subject: [armedbear-cvs] r12569 - public_html/releases Message-ID: Author: ehuelsmann Date: Sun Mar 21 10:15:33 2010 New Revision: 12569 Log: Add release 0.19.1 artifacts; release notes and website update expected later. Added: public_html/releases/abcl-bin-0.19.1.tar.gz (contents, props changed) public_html/releases/abcl-bin-0.19.1.tar.gz.asc public_html/releases/abcl-bin-0.19.1.zip (contents, props changed) public_html/releases/abcl-bin-0.19.1.zip.asc public_html/releases/abcl-src-0.19.1.tar.gz (contents, props changed) public_html/releases/abcl-src-0.19.1.tar.gz.asc public_html/releases/abcl-src-0.19.1.zip (contents, props changed) public_html/releases/abcl-src-0.19.1.zip.asc Added: public_html/releases/abcl-bin-0.19.1.tar.gz ============================================================================== Binary file. No diff available. Added: public_html/releases/abcl-bin-0.19.1.tar.gz.asc ============================================================================== --- (empty file) +++ public_html/releases/abcl-bin-0.19.1.tar.gz.asc Sun Mar 21 10:15:33 2010 @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (GNU/Linux) + +iEYEABECAAYFAkumGQUACgkQi5O0Epaz9TmFlQCfS5wG7cC6NO6dJ87zgqw1ugHZ +z08An3LSVKNeCMlu8yjv8VepCUI2xs8i +=gcQJ +-----END PGP SIGNATURE----- Added: public_html/releases/abcl-bin-0.19.1.zip ============================================================================== Binary file. No diff available. Added: public_html/releases/abcl-bin-0.19.1.zip.asc ============================================================================== --- (empty file) +++ public_html/releases/abcl-bin-0.19.1.zip.asc Sun Mar 21 10:15:33 2010 @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (GNU/Linux) + +iEYEABECAAYFAkumGRQACgkQi5O0Epaz9Tno2ACbBIo2LmrE1+lTTfZusDEgfuM6 +0N0An15zXY8cDpIskmU4RMnwgjdB1N11 +=6kjx +-----END PGP SIGNATURE----- Added: public_html/releases/abcl-src-0.19.1.tar.gz ============================================================================== Binary file. No diff available. Added: public_html/releases/abcl-src-0.19.1.tar.gz.asc ============================================================================== --- (empty file) +++ public_html/releases/abcl-src-0.19.1.tar.gz.asc Sun Mar 21 10:15:33 2010 @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (GNU/Linux) + +iEYEABECAAYFAkumGSMACgkQi5O0Epaz9TmbjACeMFrcRLVG356cyFK0Y2UOkiih +AKUAnAzv0chJwzfR0CJ1a6kmEmUsa2vN +=dF2g +-----END PGP SIGNATURE----- Added: public_html/releases/abcl-src-0.19.1.zip ============================================================================== Binary file. No diff available. Added: public_html/releases/abcl-src-0.19.1.zip.asc ============================================================================== --- (empty file) +++ public_html/releases/abcl-src-0.19.1.zip.asc Sun Mar 21 10:15:33 2010 @@ -0,0 +1,7 @@ +-----BEGIN PGP SIGNATURE----- +Version: GnuPG v1.4.9 (GNU/Linux) + +iEYEABECAAYFAkumGSoACgkQi5O0Epaz9TkI3gCeLcZsoLk+axFYSdfwbG4Aazg1 +9aEAnRf6fTiIVVMxrSi7PsflNlSQYS1Z +=oD+v +-----END PGP SIGNATURE----- From mevenson at common-lisp.net Tue Mar 23 12:59:09 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Tue, 23 Mar 2010 08:59:09 -0400 Subject: [armedbear-cvs] r12570 - in trunk/abcl: src/org/armedbear/lisp test/lisp/abcl Message-ID: Author: mevenson Date: Tue Mar 23 08:59:08 2010 New Revision: 12570 Log: Fix JAVA-OBJECT whose tynot being properly coerced to array of primitive types. Fix proposed by Douglas Miles. An array of primitive types which were first stuffed into a type-erasing Java collection and then retrieved could not be used as the original type. Updated JAVA-OBJECT's getParts() protocol to return information about what type the wrapped object thinks it should be. Added test BUGS.JAVA.1 to test that this has been fixed. Modified: trunk/abcl/src/org/armedbear/lisp/JavaObject.java trunk/abcl/test/lisp/abcl/bugs.lisp Modified: trunk/abcl/src/org/armedbear/lisp/JavaObject.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/JavaObject.java (original) +++ trunk/abcl/src/org/armedbear/lisp/JavaObject.java Tue Mar 23 08:59:08 2010 @@ -35,11 +35,14 @@ import static org.armedbear.lisp.Lisp.*; -import java.lang.reflect.*; - +import java.lang.reflect.Array; +import java.lang.reflect.Field; import java.math.BigInteger; - -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.Set; public final class JavaObject extends LispObject { final Object obj; @@ -242,7 +245,16 @@ return obj; } else { c = Java.maybeBoxClass(c); - if(c.isAssignableFrom(intendedClass)) { + if (c.isAssignableFrom(intendedClass) || c.isInstance(obj)) { + // XXX In the case that c.isInstance(obj) should we then + // "fix" the intendedClass field with the (presumably) + // narrower type of 'obj'? + + // ME 20100323: I decided not to because a) we don't + // know the "proper" class to narrow to (i.e. maybe + // there's something "narrower" and b) I'm not sure how + // primitive types relate to their boxed + // representations. return obj; } else { return error(new TypeError(intendedClass.getName() + " is not assignable to " + c.getName())); @@ -328,20 +340,22 @@ public LispObject getParts() { if(obj != null) { LispObject parts = NIL; - if(obj.getClass().isArray()) { - SimpleString empty = new SimpleString(""); + parts = parts.push(new Cons("Java class", + new JavaObject(obj.getClass()))); + if (intendedClass != null) { + parts = parts.push(new Cons("intendedClass", new SimpleString(intendedClass.getCanonicalName()))); + } + if (obj.getClass().isArray()) { int length = Array.getLength(obj); - for(int i = 0; i < length; i++) { - parts = parts.push - (new Cons(empty, JavaObject.getInstance(Array.get(obj, i)))); + for (int i = 0; i < length; i++) { + parts = parts + .push(new Cons(new SimpleString(i), + JavaObject.getInstance(Array.get(obj, i)))); } - parts = parts.nreverse(); } else { - parts = parts.push(new Cons("Java class", - new JavaObject(obj.getClass()))); parts = Symbol.NCONC.execute(parts, getInspectedFields()); } - return parts; + return parts.nreverse(); } else { return NIL; } Modified: trunk/abcl/test/lisp/abcl/bugs.lisp ============================================================================== --- trunk/abcl/test/lisp/abcl/bugs.lisp (original) +++ trunk/abcl/test/lisp/abcl/bugs.lisp Tue Mar 23 08:59:08 2010 @@ -39,3 +39,36 @@ #p"/usr/lisp/abcl/native/test/foo.fasl") +(deftest bugs.pathname.1 + (namestring (make-pathname :directory '(:relative) :name "file" + :type :unspecific + :host nil :device nil)) + "./file") + +(deftest bugs.pathname.2 + (TRANSLATE-PATHNAME + #P"/Users/evenson/work/bordeaux-threads/src/bordeaux-threads.abcl" + #P"/**/**/*.*" + #P"/Users/evenson/.cache/common-lisp/armedbear-0.20.0-dev-darwin-unknown/**/*.*") + #P"/Users/evenson/.cache/common-lisp/armedbear-0.20.0-dev-darwin-unknown/bordeaux-threads.abcl") + +(deftest bugs.pathname.3 + (namestring (MAKE-PATHNAME :HOST NIL :DEVICE NIL + :DIRECTORY '(:RELATIVE :WILD-INFERIORS) + :DEFAULTS "/**/")) + "**/") + +(deftest bugs.java.1 + (let* ((a (java:jnew-array "byte" 1)) + (b (let ((array-list (java:jnew (java:jconstructor + "java.util.ArrayList")))) + (java:jcall (java:jmethod "java.util.AbstractList" "add" + "java.lang.Object") + array-list a) + (java:jcall (java:jmethod "java.util.AbstractList" "get" "int") + array-list 0)))) + (type-of (sys::%make-byte-array-input-stream b))) + stream) + + + \ No newline at end of file From mevenson at common-lisp.net Fri Mar 26 08:19:08 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Fri, 26 Mar 2010 04:19:08 -0400 Subject: [armedbear-cvs] r12571 - trunk/abcl/doc/design Message-ID: Author: mevenson Date: Fri Mar 26 04:19:07 2010 New Revision: 12571 Log: Initial proposal for URLs to be used as Pathnames. Added: trunk/abcl/doc/design/url-pathnames.markdown Added: trunk/abcl/doc/design/url-pathnames.markdown ============================================================================== --- (empty file) +++ trunk/abcl/doc/design/url-pathnames.markdown Fri Mar 26 04:19:07 2010 @@ -0,0 +1,117 @@ +URL Pathnames ABCL +================== + + Mark Evenson + Created: 25 MAR 2010 + Modified: 26 MAR 2010 + +Notes towards an implementation of URL references to be contained in +Common Lisp `PATHNAME` objects within ABCL. + + +References +---------- + +RFC3986 Uniform Resource Identifier (URI): Generic Syntax + + +URL vs URI +---------- + +We use the term URL to describe the URL Pathnames, even though RFC3986 +notes that its use should be obsolete because in the context of Common +Lisp Pathnames all need a lookup mechanism to be resolved or they +wouldn't be of much use. + +Goals +----- + +1. Use Common Lisp pathnames to refer to representations referenced +by a URL. + +2. The URL schemes supported shall include at least "http", and those +enabled by the URLStreamHandler extension mechanism. + +3. Use URL schemes that are understood by the java.net.URL object. + + A file specified by URL + + #p"http://example.org/org/armedbear/systems/pgp.asd" + +4. MERGE-PATHNAMES + + (merge-pathnames "url.asd" + "http://example/org/armedbear/systems/pgp.asd") + ==> "http://example/org/armedbear/systems/url.asd" + +5. PROBE-FILE returning the state of URL accesibility. + +6. TRUENAME "aliased" to PROBE-FILE signalling an error if the URL is +not accessible (see "Non-goal 1"). + +7. DIRECTORY for non-wildcards + +8. URL pathname work as a valid argument for OPEN with :DIRECTION :INPUT. + +9. Enable the loading of ASDF2 systems referenced by a URL pathname. + +10. The reserved URL characters (`~`, `/`, `?`, etc.) shall be +encoded in the proper manner on construction of the Pathname. + +11. The "file" scheme will continue to be represented by an +"ordinary" Pathname. + +12. The "jar" scheme will continue to be represented by a jar +Pathname. + + +Non-goals +--------- + +1. We will not implement canonicalization of URL schemas (such as following +"http" redirects). + +2. DIRECTORY working for URL pathnames containing wildcards. + + +Implementation +-------------- + +A PATHNAME refering to a resource referenced by a URL is known as a +URL PATHNAME. + +A URL PATHNAME always has a HOST component which is a proper list. +This list will be an association list (alist). The association list +values must be a string. + + :SCHEME + Scheme of URI ("http", "ftp", "bundle", etc.) + :AUTHORITY + Valid authority according to the URI scheme. For "http" this + could be "example.org:8080". + +The DIRECTORY, NAME and TYPE fields of the PATHNAME are used to form +the URI `path` according to the conventions of the UNIX filesystem +(i.e. '/' is the directory separator). If needed, `query` and `fragment` +portions of a URL are to be included in the URL pathname NAME +component. In a sense the HOST contains the base URL, to which the +`path` is a relative URL. + +For the purposes of PATHNAME-MATCH-P, two URL pathnames may be said to +match if their HOST compoments are EQUAL, and all other components are +considered to match according to the existing rules for Pathnames. + +A URL pathname must have a DEVICE whose value is NIL. + +Upon creation, the presence of ".." and "." components in the +DIRECTORY are removed. The DIRECTORY component, if present, is always +absolute. + +The namestring of a URL pathname shall be formed by the usual +conventions of a URL. + + +Status +------ + +This design is a proposal. From mevenson at common-lisp.net Fri Mar 26 08:56:39 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Fri, 26 Mar 2010 04:56:39 -0400 Subject: [armedbear-cvs] r12572 - in trunk/abcl/doc/design: . pathnames Message-ID: Author: mevenson Date: Fri Mar 26 04:56:38 2010 New Revision: 12572 Log: Move document to proper location. Added: trunk/abcl/doc/design/pathnames/url-pathnames.markdown - copied unchanged from r12571, /trunk/abcl/doc/design/url-pathnames.markdown Removed: trunk/abcl/doc/design/url-pathnames.markdown From mevenson at common-lisp.net Fri Mar 26 08:57:39 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Fri, 26 Mar 2010 04:57:39 -0400 Subject: [armedbear-cvs] r12573 - trunk/abcl/doc/design/pathnames Message-ID: Author: mevenson Date: Fri Mar 26 04:57:39 2010 New Revision: 12573 Log: plist not alist. Modified: trunk/abcl/doc/design/pathnames/url-pathnames.markdown Modified: trunk/abcl/doc/design/pathnames/url-pathnames.markdown ============================================================================== --- trunk/abcl/doc/design/pathnames/url-pathnames.markdown (original) +++ trunk/abcl/doc/design/pathnames/url-pathnames.markdown Fri Mar 26 04:57:39 2010 @@ -81,8 +81,8 @@ URL PATHNAME. A URL PATHNAME always has a HOST component which is a proper list. -This list will be an association list (alist). The association list -values must be a string. +This list will be an property list (plist). The property list +values must be character strings. :SCHEME Scheme of URI ("http", "ftp", "bundle", etc.) From ehuelsmann at common-lisp.net Sat Mar 27 19:12:41 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sat, 27 Mar 2010 15:12:41 -0400 Subject: [armedbear-cvs] r12574 - public_html Message-ID: Author: ehuelsmann Date: Sat Mar 27 15:12:38 2010 New Revision: 12574 Log: Publish 0.19 release notes and download links. Added: public_html/release-notes-0.19.shtml Modified: public_html/index.shtml Modified: public_html/index.shtml ============================================================================== --- public_html/index.shtml (original) +++ public_html/index.shtml Sat Mar 27 15:12:38 2010 @@ -32,9 +32,9 @@ using Java to Lisp integration APIs. -Download 0.18.1 +Download 0.19.1 (zip) Users Added: public_html/release-notes-0.19.shtml ============================================================================== --- (empty file) +++ public_html/release-notes-0.19.shtml Sat Mar 27 15:12:38 2010 @@ -0,0 +1,57 @@ + + + + + ABCL - Release notes v0.19 + + + + + +
+

ABCL - Release notes for version 0.19

+
+ + + +
+ +

Most notable changes in ABCL 0.19

+ + +

Release notes for older releases.

+ +

Note: Due to issues in version 0.19.0, that specific + version was never released.

+ +
+
Support for user-extensible sequences
+
Support for the functionality proposed by Christopher Rhodes + at the International Lisp Conference 2007, user-extensible + sequences; these were provided by SBCL for a while now. With this + release, ABCL adds support too.
+
Much better support for inlining anonymous and local functions
+
Before, only functions with fixed numbers of arguments were + inlined when declared inline. Now, inlining also happens to functions + with &optional and &keyword arguments or &rest parameters.
+
EXT:*COMMAND-LINE-ARGUMENT-LIST*
+
Unprocessed command line arguments are collected in this variable for + Lisp programs to use.
+
+ + + + + +
+
+

Back to Common-lisp.net.

+ + +
$Id: release-notes-0.16.shtml 12246 2009-11-04 22:00:47Z ehuelsmann $
+
+ + From astalla at common-lisp.net Sun Mar 28 19:22:20 2010 From: astalla at common-lisp.net (Alessio Stalla) Date: Sun, 28 Mar 2010 15:22:20 -0400 Subject: [armedbear-cvs] r12575 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: astalla Date: Sun Mar 28 15:22:19 2010 New Revision: 12575 Log: Made SEQUENCE be a built-in class again to avoid to cause problems with metaclass support. This temporarily makes extending SEQUENCE impossible, until we make certain built-in classes be extensible. Modified: trunk/abcl/src/org/armedbear/lisp/BuiltInClass.java Modified: trunk/abcl/src/org/armedbear/lisp/BuiltInClass.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/BuiltInClass.java (original) +++ trunk/abcl/src/org/armedbear/lisp/BuiltInClass.java Sun Mar 28 15:22:19 2010 @@ -119,6 +119,7 @@ public static final BuiltInClass READTABLE = addClass(Symbol.READTABLE); public static final BuiltInClass REAL = addClass(Symbol.REAL); public static final BuiltInClass RESTART = addClass(Symbol.RESTART); + public static final BuiltInClass SEQUENCE = addClass(Symbol.SEQUENCE); public static final BuiltInClass SIMPLE_ARRAY = addClass(Symbol.SIMPLE_ARRAY); public static final BuiltInClass SIMPLE_BASE_STRING = addClass(Symbol.SIMPLE_BASE_STRING); public static final BuiltInClass SIMPLE_BIT_VECTOR = addClass(Symbol.SIMPLE_BIT_VECTOR); @@ -138,10 +139,6 @@ (StructureClass)addClass(Symbol.STRUCTURE_OBJECT, new StructureClass(Symbol.STRUCTURE_OBJECT, list(CLASS_T))); - public static final SlotClass SEQUENCE = - (SlotClass) addClass(Symbol.SEQUENCE, - new SlotClass(Symbol.SEQUENCE, list(CLASS_T))); - /* All the stream classes below are being defined as structure classes but won't be available as such until further action is taken: the 'defstruct' internal administration is missing. From ehuelsmann at common-lisp.net Sun Mar 28 20:13:16 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 28 Mar 2010 16:13:16 -0400 Subject: [armedbear-cvs] r12576 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: ehuelsmann Date: Sun Mar 28 16:13:14 2010 New Revision: 12576 Log: Re #38: Merge the METACLASS branch to trunk. Modified: trunk/abcl/src/org/armedbear/lisp/Autoload.java trunk/abcl/src/org/armedbear/lisp/Condition.java trunk/abcl/src/org/armedbear/lisp/Layout.java trunk/abcl/src/org/armedbear/lisp/Lisp.java trunk/abcl/src/org/armedbear/lisp/LispClass.java trunk/abcl/src/org/armedbear/lisp/LispObject.java trunk/abcl/src/org/armedbear/lisp/Primitives.java trunk/abcl/src/org/armedbear/lisp/SlotClass.java trunk/abcl/src/org/armedbear/lisp/SlotDefinition.java trunk/abcl/src/org/armedbear/lisp/StandardClass.java trunk/abcl/src/org/armedbear/lisp/StandardGenericFunction.java trunk/abcl/src/org/armedbear/lisp/StandardMethod.java trunk/abcl/src/org/armedbear/lisp/StandardObject.java trunk/abcl/src/org/armedbear/lisp/StandardObjectFunctions.java trunk/abcl/src/org/armedbear/lisp/Symbol.java trunk/abcl/src/org/armedbear/lisp/clos.lisp trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp Modified: trunk/abcl/src/org/armedbear/lisp/Autoload.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Autoload.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Autoload.java Sun Mar 28 16:13:14 2010 @@ -685,7 +685,7 @@ autoload(Symbol.SET_CHAR, "StringFunctions"); autoload(Symbol.SET_SCHAR, "StringFunctions"); - autoload(Symbol.SET_CLASS_SLOTS, "SlotClass"); + autoload(Symbol._SET_CLASS_SLOTS, "SlotClass"); autoload(Symbol._CLASS_SLOTS, "SlotClass"); autoload(Symbol.JAVA_EXCEPTION_CAUSE, "JavaException"); Modified: trunk/abcl/src/org/armedbear/lisp/Condition.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Condition.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Condition.java Sun Mar 28 16:13:14 2010 @@ -141,16 +141,18 @@ @Override public LispObject typeOf() { - LispClass c = getLispClass(); - if (c != null) - return c.getName(); + LispObject c = getLispClass(); + if (c instanceof LispClass) + return ((LispClass)c).getName(); + else if (c != null) + return Symbol.CLASS_NAME.execute(c); return Symbol.CONDITION; } @Override public LispObject classOf() { - LispClass c = getLispClass(); + LispObject c = getLispClass(); if (c != null) return c; return StandardClass.CONDITION; Modified: trunk/abcl/src/org/armedbear/lisp/Layout.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Layout.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Layout.java Sun Mar 28 16:13:14 2010 @@ -37,7 +37,7 @@ public class Layout extends LispObject { - private final LispClass lispClass; + private final LispObject lispClass; public final EqHashTable slotTable; final LispObject[] slotNames; @@ -45,7 +45,7 @@ private boolean invalid; - public Layout(LispClass lispClass, LispObject instanceSlots, LispObject sharedSlots) + public Layout(LispObject lispClass, LispObject instanceSlots, LispObject sharedSlots) { this.lispClass = lispClass; Debug.assertTrue(instanceSlots.listp()); @@ -64,7 +64,7 @@ slotTable = initializeSlotTable(slotNames); } - public Layout(LispClass lispClass, LispObject[] instanceSlotNames, + public Layout(LispObject lispClass, LispObject[] instanceSlotNames, LispObject sharedSlots) { this.lispClass = lispClass; @@ -103,7 +103,7 @@ return result.nreverse(); } - public LispClass getLispClass() + public LispObject getLispClass() { return lispClass; } @@ -159,8 +159,7 @@ LispObject third) { - return new Layout(checkClass(first), checkList(second), - checkList(third)); + return new Layout(first, checkList(second), checkList(third)); } }; @@ -235,7 +234,7 @@ public LispObject execute(LispObject first, LispObject second) { - final Layout layOutFirst = checkLayout(first); + final Layout layOutFirst = checkLayout(first); final LispObject slotNames[] = layOutFirst.slotNames; final int limit = slotNames.length; for (int i = 0; i < limit; i++) @@ -263,11 +262,20 @@ @Override public LispObject execute(LispObject arg) { - final LispClass lispClass = checkClass(arg); - Layout oldLayout = lispClass.getClassLayout(); - Layout newLayout = new Layout(oldLayout); - lispClass.setClassLayout(newLayout); - oldLayout.invalidate(); + final LispObject lispClass = arg; + LispObject oldLayout; + if (lispClass instanceof LispClass) + oldLayout = ((LispClass)lispClass).getClassLayout(); + else + oldLayout = Symbol.CLASS_LAYOUT.execute(lispClass); + + Layout newLayout = new Layout((Layout)oldLayout); + if (lispClass instanceof LispClass) + ((LispClass)lispClass).setClassLayout(newLayout); + else + Symbol.CLASS_LAYOUT.getSymbolSetfFunction() + .execute(newLayout, lispClass); + ((Layout)oldLayout).invalidate(); return arg; } }; Modified: trunk/abcl/src/org/armedbear/lisp/Lisp.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Lisp.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Lisp.java Sun Mar 28 16:13:14 2010 @@ -1653,15 +1653,6 @@ type_error(obj, Symbol.STRING); } - public final static LispClass checkClass(LispObject obj) - - { - if (obj instanceof LispClass) - return (LispClass) obj; - return (LispClass)// Not reached. - type_error(obj, Symbol.CLASS); - } - public final static Layout checkLayout(LispObject obj) { Modified: trunk/abcl/src/org/armedbear/lisp/LispClass.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/LispClass.java (original) +++ trunk/abcl/src/org/armedbear/lisp/LispClass.java Sun Mar 28 16:13:14 2010 @@ -48,6 +48,15 @@ return c; } + public static LispObject addClass(Symbol symbol, LispObject c) + { + synchronized (map) + { + map.put(symbol, c); + } + return c; + } + public static void removeClass(Symbol symbol) { synchronized (map) @@ -68,10 +77,10 @@ { final Symbol symbol = checkSymbol(name); - final LispClass c; + final LispObject c; synchronized (map) { - c = (LispClass) map.get(symbol); + c = map.get(symbol); } if (c != null) return c; @@ -179,9 +188,9 @@ return classLayout; } - public void setClassLayout(Layout layout) + public void setClassLayout(LispObject layout) { - classLayout = layout; + classLayout = layout == NIL ? null : (Layout)layout; } public final int getLayoutLength() @@ -201,12 +210,12 @@ this.directSuperclasses = directSuperclasses; } - public final boolean isFinalized() + public boolean isFinalized() { return finalized; } - public final void setFinalized(boolean b) + public void setFinalized(boolean b) { finalized = b; } @@ -291,13 +300,29 @@ public boolean subclassp(LispObject obj) { - LispObject cpl = getCPL(); + return false; + } + + public static boolean subclassp(LispObject cls, LispObject obj) + { + LispObject cpl; + + if (cls instanceof LispClass) + cpl = ((LispClass)cls).getCPL(); + else + cpl = Symbol.CLASS_PRECEDENCE_LIST.execute(cls); + while (cpl != NIL) { if (cpl.car() == obj) return true; cpl = ((Cons)cpl).cdr; } + + if (cls instanceof LispClass) + // additional checks (currently because of JavaClass) + return ((LispClass)cls).subclassp(obj); + return false; } @@ -340,8 +365,7 @@ removeClass(name); return second; } - final LispClass c = checkClass(second); - addClass(name, c); + addClass(name, second); return second; } }; @@ -354,8 +378,7 @@ public LispObject execute(LispObject first, LispObject second) { - final LispClass c = checkClass(first); - return c.subclassp(second) ? T : NIL; + return LispClass.subclassp(first, second) ? T : NIL; } }; } Modified: trunk/abcl/src/org/armedbear/lisp/LispObject.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/LispObject.java (original) +++ trunk/abcl/src/org/armedbear/lisp/LispObject.java Sun Mar 28 16:13:14 2010 @@ -677,6 +677,16 @@ return type_error(this, Symbol.SYMBOL); } + public LispObject getSymbolSetfFunction() + { + return type_error(this, Symbol.SYMBOL); + } + + public LispObject getSymbolSetfFunctionOrDie() + { + return type_error(this, Symbol.SYMBOL); + } + public String writeToString() { return toString(); Modified: trunk/abcl/src/org/armedbear/lisp/Primitives.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Primitives.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Primitives.java Sun Mar 28 16:13:14 2010 @@ -5316,7 +5316,10 @@ @Override public LispObject execute(LispObject arg) { - return checkClass(arg).getName(); + if (arg instanceof LispClass) + return ((LispClass)arg).getName(); + + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symName); } }; @@ -5331,21 +5334,30 @@ public LispObject execute(LispObject first, LispObject second) { - checkClass(first).setName(checkSymbol(second)); - return second; + if (second instanceof LispClass) + ((LispClass)second).setName(checkSymbol(first)); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symName, + checkSymbol(first)); + return first; } }; // ### class-layout - private static final Primitive CLASS_LAYOUT = new pf_class_layout(); - private static final class pf_class_layout extends Primitive { - pf_class_layout() { - super("class-layout", PACKAGE_SYS, true, "class"); + private static final Primitive CLASS_LAYOUT = new pf__class_layout(); + private static final class pf__class_layout extends Primitive { + pf__class_layout() { + super("%class-layout", PACKAGE_SYS, true, "class"); } @Override public LispObject execute(LispObject arg) { - Layout layout = checkClass(arg).getClassLayout(); + Layout layout; + if (arg instanceof LispClass) + layout = ((LispClass)arg).getClassLayout(); + else + layout = (Layout)((StandardObject)arg).getInstanceSlotValue(StandardClass.symLayout); + return layout != null ? layout : NIL; } }; @@ -5361,24 +5373,30 @@ public LispObject execute(LispObject first, LispObject second) { - if (second instanceof Layout) { - checkClass(first).setClassLayout((Layout)second); - return second; + if (first == NIL || first instanceof Layout) { + if (second instanceof LispClass) + ((LispClass)second).setClassLayout(first); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symLayout, first); + return first; } - return type_error(second, Symbol.LAYOUT); + return type_error(first, Symbol.LAYOUT); } }; - // ### class-direct-superclasses - private static final Primitive CLASS_DIRECT_SUPERCLASSES = new pf_class_direct_superclasses(); - private static final class pf_class_direct_superclasses extends Primitive { - pf_class_direct_superclasses() { - super("class-direct-superclasses", PACKAGE_SYS, true); + // ### %class-direct-superclasses + private static final Primitive _CLASS_DIRECT_SUPERCLASSES = new pf__class_direct_superclasses(); + private static final class pf__class_direct_superclasses extends Primitive { + pf__class_direct_superclasses() { + super("%class-direct-superclasses", PACKAGE_SYS, true); } @Override public LispObject execute(LispObject arg) { - return checkClass(arg).getDirectSuperclasses(); + if (arg instanceof LispClass) + return ((LispClass)arg).getDirectSuperclasses(); + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symDirectSuperclasses); } }; @@ -5391,23 +5409,28 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(first).setDirectSuperclasses(second); - return second; + if (second instanceof LispClass) + ((LispClass)second).setDirectSuperclasses(first); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symDirectSuperclasses, first); + return first; } }; - // ### class-direct-subclasses - private static final Primitive CLASS_DIRECT_SUBCLASSES = new pf_class_direct_subclasses(); - private static final class pf_class_direct_subclasses extends Primitive { - pf_class_direct_subclasses() { - super("class-direct-subclasses", PACKAGE_SYS, true); + // ### %class-direct-subclasses + private static final Primitive _CLASS_DIRECT_SUBCLASSES = new pf__class_direct_subclasses(); + private static final class pf__class_direct_subclasses extends Primitive { + pf__class_direct_subclasses() { + super("%class-direct-subclasses", PACKAGE_SYS, true); } @Override public LispObject execute(LispObject arg) { - return checkClass(arg).getDirectSubclasses(); + if (arg instanceof LispClass) + return ((LispClass)arg).getDirectSubclasses(); + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symDirectSubclasses); } }; @@ -5421,10 +5444,12 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(first).setDirectSubclasses(second); - return second; + if (second instanceof LispClass) + ((LispClass)second).setDirectSubclasses(first); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symDirectSubclasses, first); + return first; } }; @@ -5437,38 +5462,45 @@ @Override public LispObject execute(LispObject arg) { - return checkClass(arg).getCPL(); + if (arg instanceof LispClass) + return ((LispClass)arg).getCPL(); + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symPrecedenceList); } }; - // ### set-class-precedence-list - private static final Primitive SET_CLASS_PRECEDENCE_LIST = new pf_set_class_precedence_list(); - private static final class pf_set_class_precedence_list extends Primitive { - pf_set_class_precedence_list() { - super("set-class-precedence-list", PACKAGE_SYS, true); + // ### %set-class-precedence-list + private static final Primitive _SET_CLASS_PRECEDENCE_LIST = new pf__set_class_precedence_list(); + private static final class pf__set_class_precedence_list extends Primitive { + pf__set_class_precedence_list() { + super("%set-class-precedence-list", PACKAGE_SYS, true); } @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(first).setCPL(second); - return second; + if (second instanceof LispClass) + ((LispClass)second).setCPL(first); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symPrecedenceList, first); + return first; } }; - // ### class-direct-methods - private static final Primitive CLASS_DIRECT_METHODS = new pf_class_direct_methods(); - private static final class pf_class_direct_methods extends Primitive { - pf_class_direct_methods() { - super("class-direct-methods", PACKAGE_SYS, true); + // ### %class-direct-methods + private static final Primitive _CLASS_DIRECT_METHODS = new pf__class_direct_methods(); + private static final class pf__class_direct_methods extends Primitive { + pf__class_direct_methods() { + super("%class-direct-methods", PACKAGE_SYS, true); } @Override public LispObject execute(LispObject arg) - { - return checkClass(arg).getDirectMethods(); + if (arg instanceof LispClass) + return ((LispClass)arg).getDirectMethods(); + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symDirectMethods); } }; @@ -5481,10 +5513,12 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(first).setDirectMethods(second); - return second; + if (second instanceof LispClass) + ((LispClass)second).setDirectMethods(first); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symDirectMethods, first); + return first; } }; @@ -5500,7 +5534,10 @@ public LispObject execute(LispObject arg) { - return checkClass(arg).getDocumentation(); + if (arg instanceof LispClass) + return ((LispClass)arg).getDocumentation(); + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symDocumentation); } }; @@ -5514,23 +5551,28 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(first).setDocumentation(second); + if (first instanceof LispClass) + ((LispClass)first).setDocumentation(second); + else + ((StandardObject)first).setInstanceSlotValue(StandardClass.symDocumentation, second); return second; } }; - // ### class-finalized-p - private static final Primitive CLASS_FINALIZED_P = new pf_class_finalized_p(); - private static final class pf_class_finalized_p extends Primitive { - pf_class_finalized_p() { - super("class-finalized-p", PACKAGE_SYS, true); + // ### %class-finalized-p + private static final Primitive _CLASS_FINALIZED_P = new pf__class_finalized_p(); + private static final class pf__class_finalized_p extends Primitive { + pf__class_finalized_p() { + super("%class-finalized-p", PACKAGE_SYS, true); } @Override public LispObject execute(LispObject arg) { - return checkClass(arg).isFinalized() ? T : NIL; + if (arg instanceof LispClass) + return ((LispClass)arg).isFinalized() ? T : NIL; + else + return ((StandardObject)arg).getInstanceSlotValue(StandardClass.symFinalizedP); } }; @@ -5543,10 +5585,12 @@ @Override public LispObject execute(LispObject first, LispObject second) - { - checkClass(first).setFinalized(second != NIL); - return second; + if (second instanceof LispClass) + ((LispClass)second).setFinalized(first != NIL); + else + ((StandardObject)second).setInstanceSlotValue(StandardClass.symFinalizedP, first); + return first; } }; @@ -5559,7 +5603,7 @@ @Override public LispObject execute(LispObject arg) { - return arg instanceof LispClass ? T : NIL; + return (arg instanceof LispClass) ? T : arg.typep(Symbol.CLASS); } }; Modified: trunk/abcl/src/org/armedbear/lisp/SlotClass.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SlotClass.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SlotClass.java Sun Mar 28 16:13:14 2010 @@ -178,7 +178,7 @@ // ### class-direct-slots private static final Primitive CLASS_DIRECT_SLOTS = - new Primitive("class-direct-slots", PACKAGE_SYS, true) + new Primitive("%class-direct-slots", PACKAGE_SYS, true) { @Override public LispObject execute(LispObject arg) @@ -200,12 +200,12 @@ public LispObject execute(LispObject first, LispObject second) { - if (first instanceof SlotClass) { - ((SlotClass)first).setDirectSlotDefinitions(second); - return second; + if (second instanceof SlotClass) { + ((SlotClass)second).setDirectSlotDefinitions(first); + return first; } else { - return type_error(first, Symbol.STANDARD_CLASS); + return type_error(second, Symbol.STANDARD_CLASS); } } }; @@ -227,26 +227,26 @@ }; // ### set-class-slots - private static final Primitive SET_CLASS_SLOTS = - new Primitive(Symbol.SET_CLASS_SLOTS, "class slot-definitions") + private static final Primitive _SET_CLASS_SLOTS = + new Primitive(Symbol._SET_CLASS_SLOTS, "class slot-definitions") { @Override public LispObject execute(LispObject first, LispObject second) { - if (first instanceof SlotClass) { - ((SlotClass)first).setSlotDefinitions(second); - return second; + if (second instanceof SlotClass) { + ((SlotClass)second).setSlotDefinitions(first); + return first; } else { - return type_error(first, Symbol.STANDARD_CLASS); + return type_error(second, Symbol.STANDARD_CLASS); } } }; // ### class-direct-default-initargs private static final Primitive CLASS_DIRECT_DEFAULT_INITARGS = - new Primitive("class-direct-default-initargs", PACKAGE_SYS, true) + new Primitive("%class-direct-default-initargs", PACKAGE_SYS, true) { @Override public LispObject execute(LispObject arg) @@ -268,17 +268,17 @@ public LispObject execute(LispObject first, LispObject second) { - if (first instanceof SlotClass) { - ((SlotClass)first).setDirectDefaultInitargs(second); - return second; + if (second instanceof SlotClass) { + ((SlotClass)second).setDirectDefaultInitargs(first); + return first; } - return type_error(first, Symbol.STANDARD_CLASS); + return type_error(second, Symbol.STANDARD_CLASS); } }; // ### class-default-initargs private static final Primitive CLASS_DEFAULT_INITARGS = - new Primitive("class-default-initargs", PACKAGE_SYS, true) + new Primitive("%class-default-initargs", PACKAGE_SYS, true) { @Override public LispObject execute(LispObject arg) @@ -300,30 +300,12 @@ public LispObject execute(LispObject first, LispObject second) { - if (first instanceof SlotClass) { - ((SlotClass)first).setDefaultInitargs(second); - return second; + if (second instanceof SlotClass) { + ((SlotClass)second).setDefaultInitargs(first); + return first; } - return type_error(first, Symbol.STANDARD_CLASS); + return type_error(second, Symbol.STANDARD_CLASS); } }; - // ### compute-class-default-initargs - private static final Primitive COMPUTE_CLASS_DEFAULT_INITARGS = - new Primitive("compute-class-default-initargs", PACKAGE_SYS, true) - { - @Override - public LispObject execute(LispObject arg) - - { - final SlotClass c; - if (arg instanceof SlotClass) { - c = (SlotClass) arg; - } - else { - return type_error(arg, Symbol.STANDARD_CLASS); - } - return c.computeDefaultInitargs(); - } - }; } Modified: trunk/abcl/src/org/armedbear/lisp/SlotDefinition.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/SlotDefinition.java (original) +++ trunk/abcl/src/org/armedbear/lisp/SlotDefinition.java Sun Mar 28 16:13:14 2010 @@ -69,7 +69,21 @@ slots[SlotDefinitionClass.SLOT_INDEX_READERS] = readers; slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION] = Keyword.INSTANCE; } - + + public SlotDefinition(LispObject name, LispObject readers, + Function initFunction) + { + this(); + Debug.assertTrue(name instanceof Symbol); + slots[SlotDefinitionClass.SLOT_INDEX_NAME] = name; + slots[SlotDefinitionClass.SLOT_INDEX_INITFUNCTION] = initFunction; + slots[SlotDefinitionClass.SLOT_INDEX_INITFORM] = NIL; + slots[SlotDefinitionClass.SLOT_INDEX_INITARGS] = + new Cons(PACKAGE_KEYWORD.intern(((Symbol)name).getName())); + slots[SlotDefinitionClass.SLOT_INDEX_READERS] = readers; + slots[SlotDefinitionClass.SLOT_INDEX_ALLOCATION] = Keyword.INSTANCE; + } + public static SlotDefinition checkSlotDefinition(LispObject obj) { if (obj instanceof SlotDefinition) return (SlotDefinition)obj; return (SlotDefinition)type_error(obj, Symbol.SLOT_DEFINITION); @@ -147,7 +161,7 @@ }; // ### set-slot-definition-initfunction - private static final Primitive SET_SLOT_DEFINITION_INITFUNCTION = + static final Primitive SET_SLOT_DEFINITION_INITFUNCTION = new Primitive("set-slot-definition-initfunction", PACKAGE_SYS, true, "slot-definition initfunction") { @@ -173,7 +187,7 @@ }; // ### set-slot-definition-initform - private static final Primitive SET_SLOT_DEFINITION_INITFORM = + static final Primitive SET_SLOT_DEFINITION_INITFORM = new Primitive("set-slot-definition-initform", PACKAGE_SYS, true, "slot-definition initform") { Modified: trunk/abcl/src/org/armedbear/lisp/StandardClass.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StandardClass.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StandardClass.java Sun Mar 28 16:13:14 2010 @@ -38,26 +38,28 @@ public class StandardClass extends SlotClass { - private static Symbol symName = PACKAGE_MOP.intern("NAME"); - private static Symbol symLayout = PACKAGE_MOP.intern("LAYOUT"); - private static Symbol symDirectSuperclasses + public static Symbol symName = PACKAGE_MOP.intern("NAME"); + public static Symbol symLayout = PACKAGE_MOP.intern("LAYOUT"); + public static Symbol symDirectSuperclasses = PACKAGE_MOP.intern("DIRECT-SUPERCLASSES"); - private static Symbol symDirectSubclasses + public static Symbol symDirectSubclasses = PACKAGE_MOP.intern("DIRECT-SUBCLASSES"); - private static Symbol symClassPrecedenceList - = PACKAGE_MOP.intern("CLASS-PRECEDENCE-LIST"); - private static Symbol symDirectMethods + public static Symbol symPrecedenceList + = PACKAGE_MOP.intern("PRECEDENCE-LIST"); + public static Symbol symDirectMethods = PACKAGE_MOP.intern("DIRECT-METHODS"); - private static Symbol symDocumentation + public static Symbol symDocumentation = PACKAGE_MOP.intern("DOCUMENTATION"); - private static Symbol symDirectSlots + public static Symbol symDirectSlots = PACKAGE_MOP.intern("DIRECT-SLOTS"); - private static Symbol symSlots + public static Symbol symSlots = PACKAGE_MOP.intern("SLOTS"); - private static Symbol symDirectDefaultInitargs + public static Symbol symDirectDefaultInitargs = PACKAGE_MOP.intern("DIRECT-DEFAULT-INITARGS"); - private static Symbol symDefaultInitargs + public static Symbol symDefaultInitargs = PACKAGE_MOP.intern("DEFAULT-INITARGS"); + public static Symbol symFinalizedP + = PACKAGE_MOP.intern("FINALIZED-P"); static Layout layoutStandardClass = new Layout(null, @@ -65,13 +67,14 @@ symLayout, symDirectSuperclasses, symDirectSubclasses, - symClassPrecedenceList, + symPrecedenceList, symDirectMethods, symDocumentation, symDirectSlots, symSlots, symDirectDefaultInitargs, - symDefaultInitargs), + symDefaultInitargs, + symFinalizedP), NIL) { @Override @@ -86,6 +89,7 @@ super(layoutStandardClass); setDirectSuperclasses(NIL); setDirectSubclasses(NIL); + setClassLayout(layoutStandardClass); setCPL(NIL); setDirectMethods(NIL); setDocumentation(NIL); @@ -93,6 +97,7 @@ setSlotDefinitions(NIL); setDirectDefaultInitargs(NIL); setDefaultInitargs(NIL); + setFinalized(false); } public StandardClass(Symbol symbol, LispObject directSuperclasses) @@ -100,6 +105,7 @@ super(layoutStandardClass, symbol, directSuperclasses); setDirectSubclasses(NIL); + setClassLayout(layoutStandardClass); setCPL(NIL); setDirectMethods(NIL); setDocumentation(NIL); @@ -107,6 +113,7 @@ setSlotDefinitions(NIL); setDirectDefaultInitargs(NIL); setDefaultInitargs(NIL); + setFinalized(false); } @Override @@ -129,7 +136,7 @@ } @Override - public void setClassLayout(Layout newLayout) + public void setClassLayout(LispObject newLayout) { setInstanceSlotValue(symLayout, newLayout); } @@ -147,6 +154,18 @@ } @Override + public final boolean isFinalized() + { + return getInstanceSlotValue(symFinalizedP) != NIL; + } + + @Override + public final void setFinalized(boolean b) + { + setInstanceSlotValue(symFinalizedP, b ? T : NIL); + } + + @Override public LispObject getDirectSubclasses() { return getInstanceSlotValue(symDirectSubclasses); @@ -161,7 +180,7 @@ @Override public LispObject getCPL() { - return getInstanceSlotValue(symClassPrecedenceList); + return getInstanceSlotValue(symPrecedenceList); } @Override @@ -169,14 +188,14 @@ { LispObject obj1 = cpl[0]; if (obj1.listp() && cpl.length == 1) - setInstanceSlotValue(symClassPrecedenceList, obj1); + setInstanceSlotValue(symPrecedenceList, obj1); else { Debug.assertTrue(obj1 == this); LispObject l = NIL; for (int i = cpl.length; i-- > 0;) l = new Cons(cpl[i], l); - setInstanceSlotValue(symClassPrecedenceList, l); + setInstanceSlotValue(symPrecedenceList, l); } } @@ -252,7 +271,11 @@ setInstanceSlotValue(symDefaultInitargs, defaultInitargs); } - + @Override + public LispObject typeOf() + { + return Symbol.STANDARD_CLASS; + } @Override public LispObject classOf() @@ -297,6 +320,42 @@ return unreadableString(sb.toString()); } + private static final LispObject standardClassSlotDefinitions() + { + // (CONSTANTLY NIL) + Function initFunction = new Function() { + @Override + public LispObject execute() + { + return NIL; + } + }; + + return + list(helperMakeSlotDefinition("NAME", initFunction), + helperMakeSlotDefinition("LAYOUT", initFunction), + helperMakeSlotDefinition("DIRECT-SUPERCLASSES", initFunction), + helperMakeSlotDefinition("DIRECT-SUBCLASSES", initFunction), + helperMakeSlotDefinition("PRECEDENCE-LIST", initFunction), + helperMakeSlotDefinition("DIRECT-METHODS", initFunction), + helperMakeSlotDefinition("DIRECT-SLOTS", initFunction), + helperMakeSlotDefinition("SLOTS", initFunction), + helperMakeSlotDefinition("DIRECT-DEFAULT-INITARGS", initFunction), + helperMakeSlotDefinition("DEFAULT-INITARGS", initFunction), + helperMakeSlotDefinition("FINALIZED-P", initFunction)); + } + + + + private static final SlotDefinition helperMakeSlotDefinition(String name, + Function init) + { + return + new SlotDefinition(PACKAGE_MOP.intern(name), // name + list(PACKAGE_MOP.intern("CLASS-" + name)), // readers + init); + } + private static final StandardClass addStandardClass(Symbol name, LispObject directSuperclasses) { @@ -321,7 +380,7 @@ addClass(Symbol.SLOT_DEFINITION, SLOT_DEFINITION); STANDARD_CLASS.setClassLayout(layoutStandardClass); - STANDARD_CLASS.setDirectSlotDefinitions(STANDARD_CLASS.getClassLayout().generateSlotDefinitions()); + STANDARD_CLASS.setDirectSlotDefinitions(standardClassSlotDefinitions()); } // BuiltInClass.FUNCTION is also null here (see previous comment). @@ -616,6 +675,7 @@ WARNING.setCPL(WARNING, CONDITION, STANDARD_OBJECT, BuiltInClass.CLASS_T); // Condition classes. + STANDARD_CLASS.finalizeClass(); ARITHMETIC_ERROR.finalizeClass(); CELL_ERROR.finalizeClass(); COMPILER_ERROR.finalizeClass(); Modified: trunk/abcl/src/org/armedbear/lisp/StandardGenericFunction.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StandardGenericFunction.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StandardGenericFunction.java Sun Mar 28 16:13:14 2010 @@ -209,7 +209,14 @@ if (name != null) { StringBuilder sb = new StringBuilder(); - sb.append(getLispClass().getName().writeToString()); + LispObject className; + LispObject lispClass = getLispClass(); + if (lispClass instanceof LispClass) + className = ((LispClass)lispClass).getName(); + else + className = Symbol.CLASS_NAME.execute(lispClass); + + sb.append(className.writeToString()); sb.append(' '); sb.append(name.writeToString()); return unreadableString(sb.toString()); Modified: trunk/abcl/src/org/armedbear/lisp/StandardMethod.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StandardMethod.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StandardMethod.java Sun Mar 28 16:13:14 2010 @@ -156,7 +156,14 @@ if (name != null) { StringBuilder sb = new StringBuilder(); - sb.append(getLispClass().getName().writeToString()); + LispObject className; + LispObject lispClass = getLispClass(); + if (lispClass instanceof LispClass) + className = ((LispClass)lispClass).getName(); + else + className = Symbol.CLASS_NAME.execute(lispClass); + + sb.append(className.writeToString()); sb.append(' '); sb.append(name.writeToString()); LispObject specializers = Modified: trunk/abcl/src/org/armedbear/lisp/StandardObject.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StandardObject.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StandardObject.java Sun Mar 28 16:13:14 2010 @@ -46,6 +46,11 @@ } + protected StandardObject(Layout layout) + { + this(layout, layout.getLength()); + } + protected StandardObject(Layout layout, int length) { this.layout = layout; @@ -98,11 +103,29 @@ return parts.nreverse(); } - public final LispClass getLispClass() + public final LispObject getLispClass() { return layout.getLispClass(); } + private LispObject helperGetClassName() + { + final LispObject c1 = layout.getLispClass(); + if (c1 instanceof LispClass) + return ((LispClass)c1).getName(); + else + return LispThread.currentThread().execute(Symbol.CLASS_NAME, c1); + } + + private LispObject helperGetCPL() + { + final LispObject c1 = layout.getLispClass(); + if (c1 instanceof LispClass) + return ((LispClass)c1).getCPL(); + else + return LispThread.currentThread().execute(Symbol.CLASS_PRECEDENCE_LIST, c1); + } + @Override public LispObject typeOf() { @@ -110,14 +133,19 @@ // conditions, TYPE-OF returns the proper name of the class returned by // CLASS-OF if it has a proper name, and otherwise returns the class // itself." - final LispClass c1 = layout.getLispClass(); + final LispObject c1 = layout.getLispClass(); + LispObject name; + if (c1 instanceof LispClass) + name = ((LispClass)c1).getName(); + else + name = LispThread.currentThread().execute(Symbol.CLASS_NAME, c1); + // The proper name of a class is "a symbol that names the class whose // name is that symbol". - final LispObject name = c1.getName(); if (name != NIL && name != UNBOUND_VALUE) { // TYPE-OF.9 - final LispObject c2 = LispClass.findClass(checkSymbol(name)); + final LispObject c2 = LispClass.findClass(name, false); if (c2 == c1) return name; } @@ -137,20 +165,30 @@ return T; if (type == StandardClass.STANDARD_OBJECT) return T; - LispClass cls = layout != null ? layout.getLispClass() : null; + LispObject cls = layout != null ? layout.getLispClass() : null; if (cls != null) { if (type == cls) return T; - if (type == cls.getName()) + if (type == helperGetClassName()) return T; - LispObject cpl = cls.getCPL(); + LispObject cpl = helperGetCPL(); while (cpl != NIL) { if (type == cpl.car()) return T; - if (type == ((LispClass)cpl.car()).getName()) - return T; + + LispObject otherName; + LispObject otherClass = cpl.car(); + if (otherClass instanceof LispClass) { + if (type == ((LispClass)otherClass).getName()) + return T; + } + else + if (type == LispThread + .currentThread().execute(Symbol.CLASS_NAME, otherClass)) + return T; + cpl = cpl.cdr(); } } @@ -183,10 +221,16 @@ { Debug.assertTrue(layout.isInvalid()); Layout oldLayout = layout; - LispClass cls = oldLayout.getLispClass(); - Layout newLayout = cls.getClassLayout(); + LispObject cls = oldLayout.getLispClass(); + Layout newLayout; + + if (cls instanceof LispClass) + newLayout = ((LispClass)cls).getClassLayout(); + else + newLayout = (Layout)Symbol.CLASS_LAYOUT.execute(cls); + Debug.assertTrue(!newLayout.isInvalid()); - StandardObject newInstance = new StandardObject(cls); + StandardObject newInstance = new StandardObject(newLayout); Debug.assertTrue(newInstance.layout == newLayout); LispObject added = NIL; LispObject discarded = NIL; Modified: trunk/abcl/src/org/armedbear/lisp/StandardObjectFunctions.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/StandardObjectFunctions.java (original) +++ trunk/abcl/src/org/armedbear/lisp/StandardObjectFunctions.java Sun Mar 28 16:13:14 2010 @@ -47,7 +47,11 @@ if (arg == StandardClass.STANDARD_CLASS) return new StandardClass(); if (arg instanceof StandardClass) - return ((StandardClass)arg).allocateInstance(); + return ((StandardClass)arg).allocateInstance(); + if (arg.typep(StandardClass.STANDARD_CLASS) != NIL) { + Layout layout = (Layout)Symbol.CLASS_LAYOUT.execute(arg); + return new StandardObject(layout); + } return type_error(arg, Symbol.STANDARD_CLASS); } }; Modified: trunk/abcl/src/org/armedbear/lisp/Symbol.java ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/Symbol.java (original) +++ trunk/abcl/src/org/armedbear/lisp/Symbol.java Sun Mar 28 16:13:14 2010 @@ -390,8 +390,15 @@ return function; } - public final LispObject getSymbolSetfFunctionOrDie() + @Override + public final LispObject getSymbolSetfFunction() + { + return get(this, Symbol.SETF_FUNCTION, NIL); + } + + @Override + public final LispObject getSymbolSetfFunctionOrDie() { LispObject obj = get(this, Symbol.SETF_FUNCTION, null); if (obj == null) @@ -2921,6 +2928,10 @@ PACKAGE_EXT.addExternalSymbol("SLIME-OUTPUT-STREAM"); // MOP. + public static final Symbol CLASS_LAYOUT = + PACKAGE_MOP.addInternalSymbol("CLASS-LAYOUT"); + public static final Symbol CLASS_PRECEDENCE_LIST = + PACKAGE_MOP.addInternalSymbol("CLASS-PRECEDENCE-LIST"); public static final Symbol STANDARD_READER_METHOD = PACKAGE_MOP.addExternalSymbol("STANDARD-READER-METHOD"); @@ -2965,8 +2976,8 @@ PACKAGE_SYS.addExternalSymbol("NAMED-LAMBDA"); public static final Symbol OUTPUT_OBJECT = PACKAGE_SYS.addExternalSymbol("OUTPUT-OBJECT"); - public static final Symbol SET_CLASS_SLOTS = - PACKAGE_SYS.addExternalSymbol("SET-CLASS-SLOTS"); + public static final Symbol _SET_CLASS_SLOTS = + PACKAGE_SYS.addExternalSymbol("%SET-CLASS-SLOTS"); public static final Symbol SETF_FUNCTION = PACKAGE_SYS.addExternalSymbol("SETF-FUNCTION"); public static final Symbol SETF_INVERSE = Modified: trunk/abcl/src/org/armedbear/lisp/clos.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/clos.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/clos.lisp Sun Mar 28 16:13:14 2010 @@ -53,8 +53,52 @@ (export '(class-precedence-list class-slots)) -(defun class-slots (class) - (%class-slots class)) +;; Don't use DEFVAR, because that disallows loading clos.lisp +;; after compiling it: the binding won't get assigned to T anymore +(defparameter *clos-booting* t) + +(defmacro define-class->%class-forwarder (name) + (let* (($name (if (consp name) (cadr name) name)) + (%name (intern (concatenate 'string + "%" + (if (consp name) + (symbol-name 'set-) "") + (symbol-name $name)) + (symbol-package $name)))) + `(progn + (declaim (notinline ,name)) + (defun ,name (&rest args) + (apply #',%name args))))) + +(define-class->%class-forwarder class-name) +(define-class->%class-forwarder (setf class-name)) +(define-class->%class-forwarder class-slots) +(define-class->%class-forwarder (setf class-slots)) +(define-class->%class-forwarder class-direct-slots) +(define-class->%class-forwarder (setf class-direct-slots)) +(define-class->%class-forwarder class-layout) +(define-class->%class-forwarder (setf class-layout)) +(define-class->%class-forwarder class-direct-superclasses) +(define-class->%class-forwarder (setf class-direct-superclasses)) +(define-class->%class-forwarder class-direct-subclasses) +(define-class->%class-forwarder (setf class-direct-subclasses)) +(define-class->%class-forwarder class-direct-methods) +(define-class->%class-forwarder (setf class-direct-methods)) +(define-class->%class-forwarder class-precedence-list) +(define-class->%class-forwarder (setf class-precedence-list)) +(define-class->%class-forwarder class-finalized-p) +(define-class->%class-forwarder (setf class-finalized-p)) +(define-class->%class-forwarder class-default-initargs) +(define-class->%class-forwarder (setf class-default-initargs)) +(define-class->%class-forwarder class-direct-default-initargs) +(define-class->%class-forwarder (setf class-direct-default-initargs)) + +(defun no-applicable-method (generic-function &rest args) + (error "There is no applicable method for the generic function ~S when called with arguments ~S." + generic-function + args)) + + (defmacro push-on-end (value location) `(setf ,location (nconc ,location (list ,value)))) @@ -85,15 +129,6 @@ (cons (funcall fun (car x) (cadr x)) (mapplist fun (cddr x))))) -(defsetf class-layout %set-class-layout) -(defsetf class-direct-superclasses %set-class-direct-superclasses) -(defsetf class-direct-subclasses %set-class-direct-subclasses) -(defsetf class-direct-methods %set-class-direct-methods) -(defsetf class-direct-slots %set-class-direct-slots) -;; (defsetf class-slots %set-class-slots) -(defsetf class-direct-default-initargs %set-class-direct-default-initargs) -(defsetf class-default-initargs %set-class-default-initargs) -(defsetf class-finalized-p %set-class-finalized-p) (defsetf std-instance-layout %set-std-instance-layout) (defsetf standard-instance-access %set-standard-instance-access) @@ -253,26 +288,30 @@ ;;; finalize-inheritance +(defun std-compute-class-default-initargs (class) + (mapcan #'(lambda (c) + (copy-list + (class-direct-default-initargs c))) + (class-precedence-list class))) + (defun std-finalize-inheritance (class) - (set-class-precedence-list - class + (setf (class-precedence-list class) (funcall (if (eq (class-of class) (find-class 'standard-class)) #'std-compute-class-precedence-list #'compute-class-precedence-list) class)) - (dolist (class (%class-precedence-list class)) + (dolist (class (class-precedence-list class)) (when (typep class 'forward-referenced-class) (return-from std-finalize-inheritance))) - (set-class-slots class + (setf (class-slots class) (funcall (if (eq (class-of class) (find-class 'standard-class)) #'std-compute-slots - #'compute-slots) - class)) + #'compute-slots) class)) (let ((old-layout (class-layout class)) (length 0) (instance-slots '()) (shared-slots '())) - (dolist (slot (%class-slots class)) + (dolist (slot (class-slots class)) (case (%slot-definition-allocation slot) (:instance (set-slot-definition-location slot length) @@ -292,13 +331,14 @@ (let* ((slot-name (car location)) (old-location (layout-slot-location old-layout slot-name))) (unless old-location - (let* ((slot-definition (find slot-name (%class-slots class) :key #'%slot-definition-name)) + (let* ((slot-definition (find slot-name (class-slots class) :key #'%slot-definition-name)) (initfunction (%slot-definition-initfunction slot-definition))) (when initfunction (setf (cdr location) (funcall initfunction)))))))) (setf (class-layout class) (make-layout class (nreverse instance-slots) (nreverse shared-slots)))) - (setf (class-default-initargs class) (compute-class-default-initargs class)) + (setf (class-default-initargs class) + (std-compute-class-default-initargs class)) (setf (class-finalized-p class) t)) ;;; Class precedence lists @@ -392,7 +432,7 @@ (defun std-compute-slots (class) (let* ((all-slots (mapappend #'class-direct-slots - (%class-precedence-list class))) + (class-precedence-list class))) (all-names (remove-duplicates (mapcar #'%slot-definition-name all-slots)))) (mapcar #'(lambda (name) @@ -431,7 +471,7 @@ ;;; references. (defun find-slot-definition (class slot-name) - (dolist (slot (%class-slots class) nil) + (dolist (slot (class-slots class) nil) (when (eq slot-name (%slot-definition-name slot)) (return slot)))) @@ -481,7 +521,7 @@ (slot-makunbound-using-class (class-of object) object slot-name))) (defun std-slot-exists-p (instance slot-name) - (not (null (find slot-name (%class-slots (class-of instance)) + (not (null (find slot-name (class-slots (class-of instance)) :key #'%slot-definition-name)))) (defun slot-exists-p (object slot-name) @@ -499,9 +539,10 @@ &allow-other-keys) (declare (ignore metaclass)) (let ((class (std-allocate-instance (find-class 'standard-class)))) - (%set-class-name class name) - (setf (class-direct-subclasses class) ()) - (setf (class-direct-methods class) ()) + (%set-class-name name class) + (%set-class-layout nil class) + (%set-class-direct-subclasses () class) + (%set-class-direct-methods () class) (%set-class-documentation class documentation) (std-after-initialization-for-classes class :direct-superclasses direct-superclasses @@ -537,8 +578,9 @@ (defun canonical-slot-name (canonical-slot) (getf canonical-slot :name)) -(defun ensure-class (name &rest all-keys &allow-other-keys) +(defun ensure-class (name &rest all-keys &key metaclass &allow-other-keys) ;; Check for duplicate slots. + (remf all-keys :metaclass) (let ((slots (getf all-keys :direct-slots))) (dolist (s1 slots) (let ((name1 (canonical-slot-name s1))) @@ -563,7 +605,7 @@ (when (typep class 'built-in-class) (error "Attempt to define a subclass of a built-in-class: ~S" class)))) (let ((old-class (find-class name nil))) - (cond ((and old-class (eq name (%class-name old-class))) + (cond ((and old-class (eq name (class-name old-class))) (cond ((typep old-class 'built-in-class) (error "The symbol ~S names a built-in class." name)) ((typep old-class 'forward-referenced-class) @@ -582,8 +624,11 @@ (apply #'std-after-initialization-for-classes old-class all-keys) old-class))) (t - (let ((class (apply #'make-instance-standard-class - (find-class 'standard-class) + (let ((class (apply (if metaclass + #'make-instance + #'make-instance-standard-class) + (or metaclass + (find-class 'standard-class)) :name name all-keys))) (%set-find-class name class) class))))) @@ -831,7 +876,8 @@ (finalize-generic-function gf)) gf) (progn - (when (fboundp function-name) + (when (and (null *clos-booting*) + (fboundp function-name)) (error 'program-error :format-control "~A already names an ordinary function, macro, or special operator." :format-arguments (list function-name))) @@ -1780,26 +1826,68 @@ (autocompile fast-function)) ))) -(fmakunbound 'class-name) -(fmakunbound '(setf class-name)) - -(defgeneric class-name (class)) - -(defmethod class-name ((class class)) - (%class-name class)) - -(defgeneric (setf class-name) (new-value class)) - -(defmethod (setf class-name) (new-value (class class)) - (%set-class-name class new-value)) - -(when (autoloadp 'class-precedence-list) - (fmakunbound 'class-precedence-list)) - -(defgeneric class-precedence-list (class)) - -(defmethod class-precedence-list ((class class)) - (%class-precedence-list class)) +(defmacro redefine-class-forwarder (name slot &optional alternative-name) + (let* (($name (if (consp name) (cadr name) name)) + (%name (intern (concatenate 'string + "%" + (if (consp name) + (symbol-name 'set-) "") + (symbol-name $name)) + (find-package "SYS")))) + (unless alternative-name + (setf alternative-name name)) + (if (consp name) + `(progn ;; setter + (defgeneric ,alternative-name (new-value class)) + (defmethod ,alternative-name (new-value (class built-in-class)) + (,%name new-value class)) + (defmethod ,alternative-name (new-value (class forward-referenced-class)) + (,%name new-value class)) + (defmethod ,alternative-name (new-value (class structure-class)) + (,%name new-value class)) + (defmethod ,alternative-name (new-value (class standard-class)) + (setf (slot-value class ',slot) new-value)) + ,@(unless (eq name alternative-name) + `((setf (get ',$name 'SETF-FUNCTION) + (symbol-function ',alternative-name)))) + ) + `(progn ;; getter + (defgeneric ,alternative-name (class)) + (defmethod ,alternative-name ((class built-in-class)) + (,%name class)) + (defmethod ,alternative-name ((class forward-referenced-class)) + (,%name class)) + (defmethod ,alternative-name ((class structure-class)) + (,%name class)) + (defmethod ,alternative-name ((class standard-class)) + (slot-value class ',slot)) + ,@(unless (eq name alternative-name) + `((setf (symbol-function ',$name) + (symbol-function ',alternative-name)))) + ) ))) + +(redefine-class-forwarder class-name name) +(redefine-class-forwarder (setf class-name) name) +(redefine-class-forwarder class-slots slots) +(redefine-class-forwarder (setf class-slots) slots) +(redefine-class-forwarder class-direct-slots direct-slots) +(redefine-class-forwarder (setf class-direct-slots) direct-slots) +(redefine-class-forwarder class-layout layout) +(redefine-class-forwarder (setf class-layout) layout) +(redefine-class-forwarder class-direct-superclasses direct-superclasses) +(redefine-class-forwarder (setf class-direct-superclasses) direct-superclasses) +(redefine-class-forwarder class-direct-subclasses direct-subclasses) +(redefine-class-forwarder (setf class-direct-subclasses) direct-subclasses) +(redefine-class-forwarder class-direct-methods direct-methods !class-direct-methods) +(redefine-class-forwarder (setf class-direct-methods) direct-methods !!class-direct-methods) +(redefine-class-forwarder class-precedence-list precedence-list) +(redefine-class-forwarder (setf class-precedence-list) precedence-list) +(redefine-class-forwarder class-finalized-p finalized-p) +(redefine-class-forwarder (setf class-finalized-p) finalized-p) +(redefine-class-forwarder class-default-initargs default-initargs) +(redefine-class-forwarder (setf class-default-initargs) default-initargs) +(redefine-class-forwarder class-direct-default-initargs direct-default-initargs) +(redefine-class-forwarder (setf class-direct-default-initargs) direct-default-initargs) @@ -1950,7 +2038,7 @@ (std-slot-exists-p instance slot-name)) (defmethod slot-exists-p-using-class ((class structure-class) instance slot-name) - (dolist (dsd (%class-slots class)) + (dolist (dsd (class-slots class)) (when (eq (sys::dsd-name dsd) slot-name) (return-from slot-exists-p-using-class t))) nil) @@ -1986,8 +2074,8 @@ (defmethod allocate-instance ((class structure-class) &rest initargs) (declare (ignore initargs)) - (%make-structure (%class-name class) - (make-list (length (%class-slots class)) + (%make-structure (class-name class) + (make-list (length (class-slots class)) :initial-element +slot-unbound+))) ;; "The set of valid initialization arguments for a class is the set of valid @@ -2012,7 +2100,7 @@ (if initargs `(,instance , at initargs) (list instance))))) - (slots (%class-slots (class-of instance)))) + (slots (class-slots (class-of instance)))) (do* ((tail initargs (cddr tail)) (initarg (car tail) (car tail))) ((null tail)) @@ -2095,7 +2183,7 @@ (error 'program-error :format-control "Invalid initarg ~S." :format-arguments (list initarg)))) - (dolist (slot (%class-slots (class-of instance))) + (dolist (slot (class-slots (class-of instance))) (let ((slot-name (%slot-definition-name slot))) (multiple-value-bind (init-key init-value foundp) (get-properties all-keys (%slot-definition-initargs slot)) @@ -2120,8 +2208,8 @@ (defmethod change-class ((old-instance standard-object) (new-class standard-class) &rest initargs) - (let ((old-slots (%class-slots (class-of old-instance))) - (new-slots (%class-slots new-class)) + (let ((old-slots (class-slots (class-of old-instance))) + (new-slots (class-slots new-class)) (new-instance (allocate-instance new-class))) ;; "The values of local slots specified by both the class CTO and the class ;; CFROM are retained. If such a local slot was unbound, it remains @@ -2153,7 +2241,7 @@ (remove-if #'(lambda (slot-name) (slot-exists-p old slot-name)) (mapcar #'%slot-definition-name - (%class-slots (class-of new)))))) + (class-slots (class-of new)))))) (check-initargs new added-slots initargs) (apply #'shared-initialize new added-slots initargs))) @@ -2340,7 +2428,7 @@ (defmethod make-load-form ((class class) &optional environment) (declare (ignore environment)) - (let ((name (%class-name class))) + (let ((name (class-name class))) (unless (and name (eq (find-class name nil) class)) (error 'simple-type-error :format-control "Can't use anonymous or undefined class as a constant: ~S." @@ -2355,6 +2443,7 @@ (let ((message (apply #'format nil format-control args))) (error "Method combination error in CLOS dispatch:~% ~A" message))) +(fmakunbound 'no-applicable-method) (defgeneric no-applicable-method (generic-function &rest args)) (defmethod no-applicable-method (generic-function &rest args) @@ -2393,6 +2482,8 @@ ;; FIXME (defgeneric function-keywords (method)) +(setf *clos-booting* nil) + (defgeneric class-prototype (class)) (defmethod class-prototype :before (class) Modified: trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/compiler-pass2.lisp Sun Mar 28 16:13:14 2010 @@ -3402,7 +3402,6 @@ (BIT-VECTOR-P p2-test-bit-vector-p) (CHAR= p2-test-char=) (CHARACTERP p2-test-characterp) - (CLASSP p2-test-classp) (CONSP p2-test-consp) (CONSTANTP p2-test-constantp) (ENDP p2-test-endp) @@ -3543,9 +3542,6 @@ (defun p2-test-special-variable-p (form) (p2-test-predicate form "isSpecialVariable")) -(defun p2-test-classp (form) - (p2-test-instanceof-predicate form +lisp-class-class+)) - (defun p2-test-symbolp (form) (p2-test-instanceof-predicate form +lisp-symbol-class+)) @@ -4827,9 +4823,6 @@ (defun p2-characterp (form target representation) (p2-instanceof-predicate form target representation +lisp-character-class+)) -(defun p2-classp (form target representation) - (p2-instanceof-predicate form target representation +lisp-class-class+)) - (defun p2-consp (form target representation) (p2-instanceof-predicate form target representation +lisp-cons-class+)) @@ -8874,7 +8867,6 @@ (install-p2-handler 'java:jmethod 'p2-java-jmethod) (install-p2-handler 'char= 'p2-char=) (install-p2-handler 'characterp 'p2-characterp) - (install-p2-handler 'classp 'p2-classp) (install-p2-handler 'coerce-to-function 'p2-coerce-to-function) (install-p2-handler 'cons 'p2-cons) (install-p2-handler 'sys::backq-cons 'p2-cons) From ehuelsmann at common-lisp.net Sun Mar 28 20:20:10 2010 From: ehuelsmann at common-lisp.net (Erik Huelsmann) Date: Sun, 28 Mar 2010 16:20:10 -0400 Subject: [armedbear-cvs] r12577 - branches/metaclass Message-ID: Author: ehuelsmann Date: Sun Mar 28 16:20:09 2010 New Revision: 12577 Log: Re #38: Delete merged metaclass branch. Removed: branches/metaclass/ From astalla at common-lisp.net Sun Mar 28 21:41:28 2010 From: astalla at common-lisp.net (Alessio Stalla) Date: Sun, 28 Mar 2010 17:41:28 -0400 Subject: [armedbear-cvs] r12578 - trunk/abcl/src/org/armedbear/lisp Message-ID: Author: astalla Date: Sun Mar 28 17:41:27 2010 New Revision: 12578 Log: Selected built-in classes can now be subclassed. Only SEQUENCE is allowed as of this revision. This makes sequences user-extensible again. Modified: trunk/abcl/src/org/armedbear/lisp/clos.lisp Modified: trunk/abcl/src/org/armedbear/lisp/clos.lisp ============================================================================== --- trunk/abcl/src/org/armedbear/lisp/clos.lisp (original) +++ trunk/abcl/src/org/armedbear/lisp/clos.lisp Sun Mar 28 17:41:27 2010 @@ -578,6 +578,8 @@ (defun canonical-slot-name (canonical-slot) (getf canonical-slot :name)) +(defvar *extensible-built-in-classes* (list (find-class 'sequence))) + (defun ensure-class (name &rest all-keys &key metaclass &allow-other-keys) ;; Check for duplicate slots. (remf all-keys :metaclass) @@ -602,7 +604,8 @@ :format-arguments (list name))))) (let ((direct-superclasses (getf all-keys :direct-superclasses))) (dolist (class direct-superclasses) - (when (typep class 'built-in-class) + (when (and (typep class 'built-in-class) + (not (member class *extensible-built-in-classes*))) (error "Attempt to define a subclass of a built-in-class: ~S" class)))) (let ((old-class (find-class name nil))) (cond ((and old-class (eq name (class-name old-class))) From mevenson at common-lisp.net Tue Mar 30 15:14:36 2010 From: mevenson at common-lisp.net (Mark Evenson) Date: Tue, 30 Mar 2010 11:14:36 -0400 Subject: [armedbear-cvs] r12579 - public_html Message-ID: Author: mevenson Date: Tue Mar 30 11:14:34 2010 New Revision: 12579 Log: Added links to binary downloads; refactored CSS somewhat. Corrected release notes link in left menu to point to the current release. Modified: public_html/index.shtml public_html/left-menu Modified: public_html/index.shtml ============================================================================== --- public_html/index.shtml (original) +++ public_html/index.shtml Tue Mar 30 11:14:34 2010 @@ -8,9 +8,25 @@ @@ -22,68 +38,109 @@
- +
+ - - + + + + + - + + + + - + + + +
Project description
ABCL is a full implementation of the Common Lisp language - featuring both an interpreter and a compiler, running in the JVM. Originally - started to be a scripting language for the J editor, it now supports JSR-233 - (Java scripting API): it can be a scripting engine in any Java application. - Additionally, it can be used to implement (parts of) the application - using Java to Lisp integration APIs. + +
+

+ ABCL is a full implementation of the Common Lisp + language featuring both an interpreter and a compiler, + running in the JVM. Originally started to be a scripting + language for the J editor, it now supports JSR-233 (Java + scripting API): it can be a scripting engine in any Java + application. Additionally, it can be used to implement (parts of) + the application using Java to Lisp integration APIs. +

-Download 0.19.1 (zip)
Downloads
+ + + + + + + + + + + + + +
Binary + abcl-bin-0.19.1.tar.gz + (pgp) + + abcl-bin-0.19.1.zip + (pgp) +
Source + abcl-src-0.19.1.tar.gz + (pgp) + + abcl-src-0.19.1.zip + (pgp) +
+
Users +Users (development with ABCL) Developers (development of ABCL)
Licensing
+ + +

ABCL is covered by the -GNU General Public License with -Classpath exception, meaning that you can -use ABCL in your application without the requirement to open the -sources to your application. +GNU General Public License with Classpath exception, +meaning that you can use ABCL in your application without the +requirement to open the sources to your application. +

+
System requirements (Users) System requirements (Developers)
    @@ -94,17 +151,20 @@ FreeBSD or Google App Engine
- +
+
Modified: public_html/left-menu ============================================================================== --- public_html/left-menu (original) +++ public_html/left-menu Tue Mar 30 11:14:34 2010 @@ -1,7 +1,7 @@