Java "bitlib"

Admin User, created Apr 11. 2024
         
package liblet.util;
import nova.envir.LibraryCompat;
import nova.Eval;
import nova.Machine;
import nova.Special;
import nova.Store;
public final class bitlib {
private static boolean test_random(Object[] args) {
Object alpha = Double.valueOf(Math.random());
return Machine.exec_unify(args[0], alpha);
}
private static Number arit_msb(Object[] args) {
Number alpha = Machine.exec_eval(args[0]);
Special.check_integer(alpha);
return Integer.valueOf(LibraryCompat.msb(alpha));
}
private static Number arit_lsb(Object[] args) {
Number alpha = Machine.exec_eval(args[0]);
Special.check_integer(alpha);
return Integer.valueOf(LibraryCompat.lsb(alpha));
}
private static boolean test_testbit(Object[] args) {
try {
Object alpha = Machine.deref(Machine.exec_build(args[0]));
Special.check_integer(alpha);
Object beta = Machine.deref(Machine.exec_build(args[1]));
Special.check_integer(beta);
return LibraryCompat.testBit((Number) alpha, (Number) beta);
} catch (RuntimeException x) {
throw Eval.mapRuntime(x);
}
}
private static boolean test_divmod(Object[] args) {
try {
Object alpha = Machine.deref(Machine.exec_build(args[0]));
Special.check_integer(alpha);
Object beta = Machine.deref(Machine.exec_build(args[1]));
Special.check_integer(beta);
Number[] res = LibraryCompat.divMod((Number) alpha, (Number) beta);
if (!Machine.exec_unify(args[2], res[0]))
return false;
return Machine.exec_unify(args[3], res[1]);
} catch (RuntimeException x) {
throw Eval.mapRuntime(x);
}
}
public static void main() {
Store.add("random", 1, Special.make_check(bitlib::test_random));
Store.add("msb", 2, Special.make_arithmetic(bitlib::arit_msb));
Store.add("lsb", 2, Special.make_arithmetic(bitlib::arit_lsb));
Store.add("testbit", 2, Special.make_check(bitlib::test_testbit));
Store.add("divmod", 4, Special.make_check(bitlib::test_divmod));
}
}