Changeset 5230


Ignore:
Timestamp:
12/20/03 17:02:20 (17 years ago)
Author:
piso
Message:

SUBSEQ

File:
1 edited

Legend:

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

    r5180 r5230  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Primitives.java,v 1.537 2003-12-18 18:03:53 piso Exp $
     5 * $Id: Primitives.java,v 1.538 2003-12-20 17:02:20 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    36483648    };
    36493649
    3650     // ### vector-subseq
    3651     // vector-subseq vector start &optional end => subsequence
    3652     private static final Primitive3 VECTOR_SUBSEQ =
    3653         new Primitive3("vector-subseq", PACKAGE_SYS, false)
    3654     {
     3650    // ### subseq
     3651    // subseq sequence start &optional end
     3652    private static final Primitive SUBSEQ =
     3653        new Primitive("subseq", "sequence start &optional end")
     3654    {
     3655        public LispObject execute(LispObject first, LispObject second)
     3656            throws ConditionThrowable
     3657        {
     3658            final int start = Fixnum.getValue(second);
     3659            if (start < 0) {
     3660                StringBuffer sb = new StringBuffer("Bad start index (");
     3661                sb.append(start);
     3662                sb.append(") for SUBSEQ.");
     3663                signal(new TypeError(sb.toString()));
     3664            }
     3665            if (first.listp())
     3666                return list_subseq(first, start, -1);
     3667            if (first.vectorp()) {
     3668                AbstractVector v = (AbstractVector) first;
     3669                return v.subseq(start, v.length());
     3670            }
     3671            return signal(new TypeError(first, Symbol.SEQUENCE));
     3672        }
    36553673        public LispObject execute(LispObject first, LispObject second,
    36563674                                  LispObject third)
    36573675            throws ConditionThrowable
    36583676        {
    3659             AbstractVector v = checkVector(first);
    3660             int start = Fixnum.getValue(second);
    3661             int end = third != NIL ? Fixnum.getValue(third) : v.length();
    3662             if (start > end) {
    3663                 StringBuffer sb = new StringBuffer("start (");
     3677            final int start = Fixnum.getValue(second);
     3678            if (start < 0) {
     3679                StringBuffer sb = new StringBuffer("Bad start index (");
    36643680                sb.append(start);
    3665                 sb.append(") is greater than end (");
    3666                 sb.append(end);
    3667                 sb.append(')');
     3681                sb.append(").");
    36683682                signal(new TypeError(sb.toString()));
    36693683            }
    3670             return v.subseq(start, end);
    3671         }
    3672     };
     3684            int end;
     3685            if (third != NIL) {
     3686                end = Fixnum.getValue(third);
     3687                if (start > end) {
     3688                    StringBuffer sb = new StringBuffer("Start index (");
     3689                    sb.append(start);
     3690                    sb.append(") is greater than end index (");
     3691                    sb.append(end);
     3692                    sb.append(") for SUBSEQ.");
     3693                    signal(new TypeError(sb.toString()));
     3694                }
     3695            } else
     3696                end = -1;
     3697            if (first.listp())
     3698                return list_subseq(first, start, end);
     3699            if (first.vectorp()) {
     3700                AbstractVector v = (AbstractVector) first;
     3701                if (end < 0)
     3702                    end = v.length();
     3703                return v.subseq(start, end);
     3704            }
     3705            return signal(new TypeError(first, Symbol.SEQUENCE));
     3706        }
     3707    };
     3708
     3709    private static final LispObject list_subseq(LispObject list, int start,
     3710                                                int end)
     3711        throws ConditionThrowable
     3712    {
     3713        int index = 0;
     3714        LispObject result = NIL;
     3715        while (list != NIL) {
     3716            if (end >= 0 && index == end)
     3717                return result.nreverse();
     3718            if (index++ >= start)
     3719                result = new Cons(list.car(), result);
     3720            list = list.cdr();
     3721        }
     3722        return result.nreverse();
     3723    }
    36733724
    36743725    // ### random
    36753726    // random limit &optional random-state => random-number
    3676     private static final Primitive RANDOM = new Primitive("random","limit &optional random-state") {
     3727    private static final Primitive RANDOM =
     3728        new Primitive("random", "limit &optional random-state")
     3729    {
    36773730        public LispObject execute(LispObject[] args) throws ConditionThrowable
    36783731        {
Note: See TracChangeset for help on using the changeset viewer.