Changeset 6037


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

Work in progress.

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

Legend:

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

    r5114 r6037  
    22 * logorc1.java
    33 *
    4  * Copyright (C) 2003 Peter Graves
    5  * $Id: logorc1.java,v 1.5 2003-12-13 00:58:51 piso Exp $
     4 * Copyright (C) 2003-2004 Peter Graves
     5 * $Id: logorc1.java,v 1.6 2004-02-28 17:51:55 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2929public final class logorc1 extends Primitive2
    3030{
    31     private logorc1(String name, String arglist)
     31    private logorc1()
    3232    {
    33         super(name,arglist);
     33        super("logorc1", "integer-1 integer-2");
    3434    }
    3535
     
    3939        if (first instanceof Fixnum) {
    4040            if (second instanceof Fixnum)
    41                 return new Fixnum(~((Fixnum)first).getValue() |
    42                                   ((Fixnum)second).getValue());
     41                return new Fixnum(~((Fixnum)first).value |
     42                                  ((Fixnum)second).value);
    4343            if (second instanceof Bignum) {
    4444                BigInteger n1 = ((Fixnum)first).getBigInteger();
    45                 BigInteger n2 = ((Bignum)second).getValue();
     45                BigInteger n2 = ((Bignum)second).value;
    4646                return number(n1.not().or(n2));
    4747            }
    48             return signal(new TypeError(second, "integer"));
     48            return signal(new TypeError(second, Symbol.INTEGER));
    4949        }
    5050        if (first instanceof Bignum) {
    51             BigInteger n1 = ((Bignum)first).getValue();
     51            BigInteger n1 = ((Bignum)first).value;
    5252            if (second instanceof Fixnum) {
    5353                BigInteger n2 = ((Fixnum)second).getBigInteger();
     
    5555            }
    5656            if (second instanceof Bignum) {
    57                 BigInteger n2 = ((Bignum)second).getValue();
     57                BigInteger n2 = ((Bignum)second).value;
    5858                return number(n1.not().or(n2));
    5959            }
    60             return signal(new TypeError(second, "integer"));
     60            return signal(new TypeError(second, Symbol.INTEGER));
    6161        }
    62         return signal(new TypeError(first, "integer"));
     62        return signal(new TypeError(first, Symbol.INTEGER));
    6363    }
    6464
    65     private static final logorc1 LOGORC1 = new logorc1("logorc1","integer-1 integer-2");
     65    private static final Primitive2 LOGORC1 = new logorc1();
    6666}
  • trunk/j/src/org/armedbear/lisp/logorc2.java

    r5114 r6037  
    22 * logorc2.java
    33 *
    4  * Copyright (C) 2003 Peter Graves
    5  * $Id: logorc2.java,v 1.5 2003-12-13 00:58:51 piso Exp $
     4 * Copyright (C) 2003-2004 Peter Graves
     5 * $Id: logorc2.java,v 1.6 2004-02-28 17:48:16 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2929public final class logorc2 extends Primitive2
    3030{
    31     private logorc2(String name, String arglist)
     31    private logorc2()
    3232    {
    33         super(name,arglist);
     33        super("logorc2", "integer-1 integer-2");
    3434    }
    3535
     
    3939        if (first instanceof Fixnum) {
    4040            if (second instanceof Fixnum)
    41                 return new Fixnum(((Fixnum)first).getValue() |
    42                                   ~((Fixnum)second).getValue());
     41                return new Fixnum(((Fixnum)first).value |
     42                                  ~((Fixnum)second).value);
    4343            if (second instanceof Bignum) {
    4444                BigInteger n1 = ((Fixnum)first).getBigInteger();
    45                 BigInteger n2 = ((Bignum)second).getValue();
     45                BigInteger n2 = ((Bignum)second).value;
    4646                return number(n1.or(n2.not()));
    4747            }
    48             return signal(new TypeError(second, "integer"));
     48            return signal(new TypeError(second, Symbol.INTEGER));
    4949        }
    5050        if (first instanceof Bignum) {
    51             BigInteger n1 = ((Bignum)first).getValue();
     51            BigInteger n1 = ((Bignum)first).value;
    5252            if (second instanceof Fixnum) {
    5353                BigInteger n2 = ((Fixnum)second).getBigInteger();
     
    5555            }
    5656            if (second instanceof Bignum) {
    57                 BigInteger n2 = ((Bignum)second).getValue();
     57                BigInteger n2 = ((Bignum)second).value;
    5858                return number(n1.or(n2.not()));
    5959            }
    60             return signal(new TypeError(second, "integer"));
     60            return signal(new TypeError(second, Symbol.INTEGER));
    6161        }
    62         return signal(new TypeError(first, "integer"));
     62        return signal(new TypeError(first, Symbol.INTEGER));
    6363    }
    6464
    65     private static final logorc2 LOGORC2 = new logorc2("logorc2","integer-1 integer-2");
     65    private static final Primitive2 LOGORC2 = new logorc2();
    6666}
  • trunk/j/src/org/armedbear/lisp/logxor.java

    r5114 r6037  
    22 * logxor.java
    33 *
    4  * Copyright (C) 2003 Peter Graves
    5  * $Id: logxor.java,v 1.4 2003-12-13 00:58:51 piso Exp $
     4 * Copyright (C) 2003-2004 Peter Graves
     5 * $Id: logxor.java,v 1.5 2004-02-28 17:44:46 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    2929public final class logxor extends Primitive
    3030{
    31     private logxor(String name, String arglist)
     31    private logxor()
    3232    {
    33         super(name,arglist);
     33        super("logxor", "&rest integers");
    3434    }
    3535
     
    4141    public LispObject execute(LispObject arg) throws ConditionThrowable
    4242    {
    43         if (arg instanceof Fixnum)
     43        if (arg instanceof Fixnum || arg instanceof Bignum)
    4444            return arg;
    45         if (arg instanceof Bignum)
    46             return arg;
    47         return signal(new TypeError(arg, "integer"));
     45        return signal(new TypeError(arg, Symbol.INTEGER));
     46    }
     47
     48    public LispObject execute(LispObject first, LispObject second)
     49        throws ConditionThrowable
     50    {
     51        if (first instanceof Fixnum && second instanceof Fixnum)
     52            return new Fixnum(((Fixnum)first).value ^ ((Fixnum)second).value);
     53        BigInteger n1, n2;
     54        if (first instanceof Fixnum)
     55            n1 = ((Fixnum)first).getBigInteger();
     56        else if (first instanceof Bignum)
     57            n1 = ((Bignum)first).value;
     58        else
     59            return signal(new TypeError(first, Symbol.INTEGER));
     60        if (second instanceof Fixnum)
     61            n2 = ((Fixnum)second).getBigInteger();
     62        else if (second instanceof Bignum)
     63            n2 = ((Bignum)second).value;
     64        else
     65            return signal(new TypeError(second, Symbol.INTEGER));
     66        return number(n1.xor(n2));
    4867    }
    4968
    5069    public LispObject execute(LispObject[] args) throws ConditionThrowable
    5170    {
    52         BigInteger result = null;
    53         for (int i = 0; i < args.length; i++) {
    54             LispObject arg = args[i];
     71        final int limit = args.length;
     72        int i = 0;
     73        // Maybe all the arguments are fixnums.
     74        int r = 0;
     75        do {
     76            if (args[i] instanceof Fixnum) {
     77                r ^= ((Fixnum)args[i]).value;
     78                ++i;
     79            } else
     80                break;
     81        } while (i < limit);
     82        if (i == limit)
     83            return number(r);
     84        // Not all fixnums.
     85        BigInteger result = BigInteger.valueOf(r);
     86        while (i < limit) {
    5587            BigInteger n;
    56             if (arg instanceof Fixnum)
    57                 n = ((Fixnum)arg).getBigInteger();
    58             else if (arg instanceof Bignum)
    59                 n = ((Bignum)arg).getValue();
     88            if (args[i] instanceof Fixnum)
     89                n = ((Fixnum)args[i]).getBigInteger();
     90            else if (args[i] instanceof Bignum)
     91                n = ((Bignum)args[i]).value;
    6092            else
    61                 return signal(new TypeError(arg, "integer"));
    62             if (result == null)
    63                 result = n;
    64             else
    65                 result = result.xor(n);
     93                return signal(new TypeError(args[i], Symbol.INTEGER));
     94            result = result.xor(n);
     95            ++i;
    6696        }
    6797        return number(result);
    6898    }
    6999
    70     private static final logxor LOGXOR = new logxor("logxor","&rest integers");
     100    private static final Primitive LOGXOR = new logxor();
    71101}
Note: See TracChangeset for help on using the changeset viewer.