Changeset 8278


Ignore:
Timestamp:
12/21/04 18:04:43 (17 years ago)
Author:
piso
Message:

NTH(int index)
NTH(LispObject arg)

Location:
trunk/j/src/org/armedbear/lisp
Files:
3 edited

Legend:

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

    r8198 r8278  
    33 *
    44 * Copyright (C) 2002-2004 Peter Graves
    5  * $Id: Cons.java,v 1.52 2004-11-28 15:43:49 piso Exp $
     5 * $Id: Cons.java,v 1.53 2004-12-21 18:04:13 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    232232        }
    233233        return length;
     234    }
     235
     236    public LispObject NTH(int index) throws ConditionThrowable
     237    {
     238        if (index < 0)
     239            signal(new TypeError(String.valueOf(index) +
     240                                 " is not of type UNSIGNED-BYTE."));
     241        int i = 0;
     242        LispObject obj = this;
     243        while (true) {
     244            if (i == index)
     245                return obj.car();
     246            obj = obj.cdr();
     247            if (obj == NIL)
     248                return NIL;
     249            ++i;
     250        }
     251    }
     252
     253    public LispObject NTH(LispObject arg) throws ConditionThrowable
     254    {
     255        int index;
     256        try {
     257            index = ((Fixnum)arg).value;
     258        }
     259        catch (ClassCastException e) {
     260            if (arg instanceof Bignum) {
     261                // FIXME (when machines have enough memory for it to matter)
     262                if (arg.minusp())
     263                    return signal(new TypeError(arg, Symbol.UNSIGNED_BYTE));
     264                return NIL;
     265            }
     266            return signal(new TypeError(arg, Symbol.UNSIGNED_BYTE));
     267        }
     268        if (index < 0)
     269            signal(new TypeError(arg, Symbol.UNSIGNED_BYTE));
     270        int i = 0;
     271        LispObject obj = this;
     272        while (true) {
     273            if (i == index)
     274                return obj.car();
     275            obj = obj.cdr();
     276            if (obj == NIL)
     277                return NIL;
     278            ++i;
     279        }
    234280    }
    235281
  • trunk/j/src/org/armedbear/lisp/LispObject.java

    r8274 r8278  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: LispObject.java,v 1.111 2004-12-20 13:20:15 piso Exp $
     5 * $Id: LispObject.java,v 1.112 2004-12-21 18:03:20 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    378378    }
    379379
     380    public LispObject NTH(int index) throws ConditionThrowable
     381    {
     382        return signal(new TypeError(this, Symbol.LIST));
     383    }
     384
     385    public LispObject NTH(LispObject arg) throws ConditionThrowable
     386    {
     387        return signal(new TypeError(this, Symbol.LIST));
     388    }
     389
    380390    public LispObject elt(int index) throws ConditionThrowable
    381391    {
  • trunk/j/src/org/armedbear/lisp/Nil.java

    r7968 r8278  
    33 *
    44 * Copyright (C) 2002-2004 Peter Graves
    5  * $Id: Nil.java,v 1.38 2004-10-13 00:22:19 piso Exp $
     5 * $Id: Nil.java,v 1.39 2004-12-21 18:04:43 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    116116    }
    117117
     118    public LispObject NTH(int index) throws ConditionThrowable
     119    {
     120        if (index < 0)
     121            signal(new TypeError(String.valueOf(index) +
     122                                 " is not of type UNSIGNED-BYTE."));
     123        return NIL;
     124    }
     125
     126    public LispObject NTH(LispObject arg) throws ConditionThrowable
     127    {
     128        int index;
     129        try {
     130            index = ((Fixnum)arg).value;
     131        }
     132        catch (ClassCastException e) {
     133            if (arg instanceof Bignum) {
     134                if (arg.minusp())
     135                    return signal(new TypeError(arg, Symbol.UNSIGNED_BYTE));
     136                return NIL;
     137            }
     138            return signal(new TypeError(arg, Symbol.UNSIGNED_BYTE));
     139        }
     140        if (index < 0)
     141            signal(new TypeError(arg, Symbol.UNSIGNED_BYTE));
     142        return NIL;
     143    }
     144
    118145    public LispObject elt(int index) throws ConditionThrowable
    119146    {
Note: See TracChangeset for help on using the changeset viewer.