Changeset 5160


Ignore:
Timestamp:
12/16/03 03:13:22 (17 years ago)
Author:
piso
Message:

READTABLEP, COPY-READTABLE

File:
1 edited

Legend:

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

    r5158 r5160  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: Readtable.java,v 1.3 2003-12-16 02:22:47 piso Exp $
     5 * $Id: Readtable.java,v 1.4 2003-12-16 03:13:22 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2626public final class Readtable extends LispObject
    2727{
    28     private ArrayList table = new ArrayList();
     28    private ArrayList table;
    2929
    3030    public Readtable()
    3131    {
     32        table = new ArrayList();
     33    }
     34
     35    private Readtable(Readtable rt)
     36    {
     37        synchronized (rt.table) {
     38            table = new ArrayList(rt.table);
     39        }
    3240    }
    3341
     
    5664    }
    5765
    58     public LispObject getDispatchMacroCharacter(char dispChar,
    59         char subChar)
     66    public LispObject getDispatchMacroCharacter(char dispChar, char subChar)
    6067    {
    6168        synchronized (table) {
     
    6976    }
    7077
    71     public LispObject setDispatchMacroCharacter(char dispChar,
    72         char subChar, LispObject function)
     78    public LispObject setDispatchMacroCharacter(char dispChar, char subChar,
     79                                                LispObject function)
    7380    {
    7481        synchronized (table) {
     
    100107    }
    101108
     109    // ### readtablep
     110    private static final Primitive1 READTABLEP = new Primitive1("readtablep", "object")
     111    {
     112        public LispObject execute(LispObject arg)
     113        {
     114            return arg instanceof Readtable ? T : NIL;
     115        }
     116    };
     117
     118    // ### copy-readtable
     119    private static final Primitive COPY_READTABLE =
     120        new Primitive("copy-readtable", "&optional from-readtable to-readtable")
     121    {
     122        public LispObject execute(LispObject[] args) throws ConditionThrowable
     123        {
     124            final Readtable from, to;
     125            switch (args.length) {
     126                case 0:
     127                    from = getCurrentReadtable();
     128                    to = null;
     129                    break;
     130                case 1:
     131                    from = checkReadtable(args[0]);
     132                    to = null;
     133                    break;
     134                case 2:
     135                    from = checkReadtable(args[0]);
     136                    if (args[1] == NIL)
     137                        to = null;
     138                    else
     139                        to = checkReadtable(args[1]);
     140                    break;
     141                default:
     142                    return signal(new WrongNumberOfArgumentsException(this));
     143            }
     144            if (to == null)
     145                return new Readtable(from);
     146            synchronized (Readtable.class) {
     147                to.table = new ArrayList(from.table);
     148            }
     149            return to;
     150        }
     151    };
     152
    102153    // ### get-dispatch-macro-character
    103154    // get-dispatch-macro-character disp-char sub-char &optional readtable
     
    109160        {
    110161            if (args.length < 2 || args.length > 3)
    111                 signal(new WrongNumberOfArgumentsException(this));
     162                return signal(new WrongNumberOfArgumentsException(this));
    112163            char dispChar = LispCharacter.getValue(args[0]);
    113164            char subChar = LispCharacter.getValue(args[1]);
     
    130181        {
    131182            if (args.length < 3 || args.length > 4)
    132                 signal(new WrongNumberOfArgumentsException(this));
     183                return signal(new WrongNumberOfArgumentsException(this));
    133184            char dispChar = LispCharacter.getValue(args[0]);
    134185            char subChar = LispCharacter.getValue(args[1]);
Note: See TracChangeset for help on using the changeset viewer.