Changeset 6034


Ignore:
Timestamp:
02/28/04 16:55:32 (17 years ago)
Author:
piso
Message:

Work in progress.

File:
1 edited

Legend:

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

    r5114 r6034  
    22 * logior.java
    33 *
    4  * Copyright (C) 2003 Peter Graves
    5  * $Id: logior.java,v 1.5 2003-12-13 00:58:51 piso Exp $
     4 * Copyright (C) 2003-2004 Peter Graves
     5 * $Id: logior.java,v 1.6 2004-02-28 16:55:32 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2828public final class logior extends Primitive
    2929{
    30     private logior(String name, String arglist)
     30    private logior()
    3131    {
    32         super(name,arglist);
     32        super("logior", "&rest integers");
    3333    }
    3434
     
    3838    }
    3939
     40    public LispObject execute(LispObject arg) throws ConditionThrowable
     41    {
     42        if (arg instanceof Fixnum || arg instanceof Bignum)
     43            return arg;
     44        return signal(new TypeError(arg, Symbol.INTEGER));
     45    }
     46
    4047    public LispObject execute(LispObject first, LispObject second)
    4148        throws ConditionThrowable
    4249    {
    43         if (first instanceof Fixnum && second instanceof Fixnum) {
    44             return new Fixnum(((Fixnum)first).getValue() |
    45                               ((Fixnum)second).getValue());
    46         } else {
    47             BigInteger n1, n2;
    48             if (first instanceof Fixnum)
    49                 n1 = ((Fixnum)first).getBigInteger();
    50             else if (first instanceof Bignum)
    51                 n1 = ((Bignum)first).getValue();
    52             else
    53                 return signal(new TypeError(first, "integer"));
    54             if (second instanceof Fixnum)
    55                 n2 = ((Fixnum)second).getBigInteger();
    56             else if (second instanceof Bignum)
    57                 n2 = ((Bignum)second).getValue();
    58             else
    59                 return signal(new TypeError(second, "integer"));
    60             return number(n1.or(n2));
    61         }
     50        if (first instanceof Fixnum && second instanceof Fixnum)
     51            return new Fixnum(((Fixnum)first).value | ((Fixnum)second).value);
     52        BigInteger n1, n2;
     53        if (first instanceof Fixnum)
     54            n1 = ((Fixnum)first).getBigInteger();
     55        else if (first instanceof Bignum)
     56            n1 = ((Bignum)first).value;
     57        else
     58            return signal(new TypeError(first, Symbol.INTEGER));
     59        if (second instanceof Fixnum)
     60            n2 = ((Fixnum)second).getBigInteger();
     61        else if (second instanceof Bignum)
     62            n2 = ((Bignum)second).value;
     63        else
     64            return signal(new TypeError(second, Symbol.INTEGER));
     65        return number(n1.or(n2));
    6266    }
     67
    6368    public LispObject execute(LispObject[] args) throws ConditionThrowable
    6469    {
    65         BigInteger result = BigInteger.ZERO;
    66         for (int i = 0; i < args.length; i++) {
     70        final int limit = args.length;
     71        int i = 0;
     72        // Maybe all the arguments are fixnums.
     73        int r = 0;
     74        do {
     75            if (args[i] instanceof Fixnum) {
     76                r |= ((Fixnum)args[i]).value;
     77                ++i;
     78            } else
     79                break;
     80        } while (i < limit);
     81        if (i == limit)
     82            return number(r);
     83        // Not all fixnums.
     84        BigInteger result = BigInteger.valueOf(r);
     85        while (i < limit) {
    6786            BigInteger n;
    6887            if (args[i] instanceof Fixnum)
    6988                n = ((Fixnum)args[i]).getBigInteger();
    7089            else if (args[i] instanceof Bignum)
    71                 n = ((Bignum)args[i]).getValue();
     90                n = ((Bignum)args[i]).value;
    7291            else
    73                 return signal(new TypeError(args[i], "integer"));
     92                return signal(new TypeError(args[i], Symbol.INTEGER));
    7493            result = result.or(n);
     94            ++i;
    7595        }
    7696        return number(result);
    7797    }
    7898
    79     private static final logior LOGIOR = new logior("logior","&rest integers");
     99    private static final Primitive LOGIOR = new logior();
    80100}
Note: See TracChangeset for help on using the changeset viewer.