Changeset 8630


Ignore:
Timestamp:
02/24/05 00:36:12 (16 years ago)
Author:
piso
Message:

readStructure(): SYNTAX.SHARP-S.3, SYNTAX.SHARP-S.4, SYNTAX.SHARP-S.9, SYNTAX.SHARP-S.10

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/lisp/Stream.java

    r8617 r8630  
    33 *
    44 * Copyright (C) 2003-2005 Peter Graves
    5  * $Id: Stream.java,v 1.113 2005-02-20 19:13:03 piso Exp $
     5 * $Id: Stream.java,v 1.114 2005-02-24 00:36:12 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    321321    public LispObject readStructure() throws ConditionThrowable
    322322    {
     323        final LispThread thread = LispThread.currentThread();
    323324        LispObject obj = read(true, NIL, false);
    324         if (_READ_SUPPRESS_.symbolValueNoThrow() != NIL)
     325        if (_READ_SUPPRESS_.symbolValue(thread) != NIL)
    325326            return NIL;
    326327        if (obj.listp()) {
    327328            Symbol structure = checkSymbol(obj.car());
    328329            LispClass c = LispClass.findClass(structure);
    329             if (!(c instanceof StructureClass)) {
     330            if (!(c instanceof StructureClass))
    330331                return signal(new ReaderError(structure.getName() +
    331332                                              " is not a defined structure type."));
    332             }
    333333            LispObject args = obj.cdr();
    334334            Symbol DEFSTRUCT_DEFAULT_CONSTRUCTOR =
     
    336336            LispObject constructor =
    337337                DEFSTRUCT_DEFAULT_CONSTRUCTOR.getSymbolFunctionOrDie().execute(structure);
    338             return funcall(constructor.getSymbolFunctionOrDie(),
    339                            args.copyToArray(), LispThread.currentThread());
    340         }
    341         return signal(new ReaderError("Non-list following #S: " + obj));
     338            final int length = args.length();
     339            if ((length % 2) != 0)
     340                return signal(new ReaderError("Odd number of keyword arguments following #S: " +
     341                                              obj.writeToString()));
     342            LispObject[] array = new LispObject[length];
     343            LispObject rest = args;
     344            for (int i = 0; i < length; i += 2) {
     345                LispObject key = rest.car();
     346                if (key instanceof Symbol && ((Symbol)key).getPackage() == PACKAGE_KEYWORD) {
     347                    array[i] = key;
     348                } else {
     349                    array[i] = PACKAGE_KEYWORD.intern(javaString(key));
     350                }
     351                array[i + 1] = rest.cadr();
     352                rest = rest.cddr();
     353            }
     354            return funcall(constructor.getSymbolFunctionOrDie(), array,
     355                           thread);
     356        }
     357        return signal(new ReaderError("Non-list following #S: " +
     358                                      obj.writeToString()));
    342359    }
    343360
Note: See TracChangeset for help on using the changeset viewer.