Changeset 3643


Ignore:
Timestamp:
09/10/03 00:58:14 (19 years ago)
Author:
piso
Message:

LOGNOT, LOGBITP

File:
1 edited

Legend:

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

    r3636 r3643  
    33 *
    44 * Copyright (C) 2002-2003 Peter Graves
    5  * $Id: Primitives.java,v 1.380 2003-09-09 13:34:13 piso Exp $
     5 * $Id: Primitives.java,v 1.381 2003-09-10 00:58:14 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    44514451    };
    44524452
    4453     static {
    4454         new Primitives();
    4455     }
     4453    // ### lognot
     4454    private static final Primitive1 LOGNOT = new Primitive1("lognot") {
     4455        public LispObject execute(LispObject arg) throws LispError
     4456        {
     4457            if (arg instanceof Fixnum)
     4458                return number(~((Fixnum)arg).getValue());
     4459            if (arg instanceof Bignum)
     4460                return number(((Bignum)arg).getValue().not());
     4461            throw new TypeError(arg, "integer");
     4462        }
     4463    };
     4464
     4465    // ### logbitp
     4466    // logbitp index integer => generalized-boolean
     4467    private static final Primitive2 LOGBITP = new Primitive2("logbitp") {
     4468        public LispObject execute(LispObject first, LispObject second)
     4469            throws LispError
     4470        {
     4471            int index = -1;
     4472            if (first instanceof Fixnum) {
     4473                index = ((Fixnum)first).getValue();
     4474            } else if (first instanceof Bignum) {
     4475                // FIXME If the number is really that big, we're not checking
     4476                // the right bit...
     4477                if (((Bignum)first).getValue().signum() > 0)
     4478                    index = Integer.MAX_VALUE;
     4479            }
     4480            if (index < 0)
     4481                throw new TypeError(first, "non-negative integer");
     4482            BigInteger n;
     4483            if (second instanceof Fixnum)
     4484                n = ((Fixnum)second).getBigInteger();
     4485            else if (second instanceof Bignum)
     4486                n = ((Bignum)second).getValue();
     4487            else
     4488                throw new TypeError(second, "integer");
     4489            // FIXME See above.
     4490            if (index == Integer.MAX_VALUE)
     4491                return n.signum() < 0 ? T : NIL;
     4492            return n.testBit(index) ? T : NIL;
     4493        }
     4494    };
    44564495
    44574496    // ### list
     
    49835022        }
    49845023    };
     5024
     5025    static {
     5026        new Primitives();
     5027    }
    49855028}
Note: See TracChangeset for help on using the changeset viewer.