com.github.dakusui.lisj.Basic Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jcunit Show documentation
Show all versions of jcunit Show documentation
Automated combinatorial testing framework on top of JUnit
package com.github.dakusui.lisj;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
import org.apache.commons.lang3.ArrayUtils;
import com.github.dakusui.jcunit.core.Utils;
import com.github.dakusui.jcunit.exceptions.JCUnitException;
import com.github.dakusui.jcunit.exceptions.ObjectUnderFrameworkException;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
public class Basic {
public static final Object NIL = new Object[0];
public static boolean eq(Object a, Object b) {
if (a == b) return true;
if (a == null || b == null) return false;
if (a.equals(b)) return true;
if (a instanceof Object[] && b instanceof Object[]) return Arrays.deepEquals( ((Object[])a), ((Object[]) b) );
if (a instanceof Number && b instanceof Number) return Utils.bigDecimal((Number)a).equals(Utils.bigDecimal((Number)b));
return a.equals(b);
}
public static Object cons(Object car, Object cdr) {
if (eq(cdr, NIL)) return new Object[]{car};
return new Object[]{car, cdr};
}
public static Object car(Object var) {
if (var == null) throw new NullPointerException();
if (atom(var)) throw new IllegalArgumentException();
Object[] vars = (Object[])var;
if (vars.length == 0) return NIL;
if (normalizeNIL(vars[0]) == NIL) return NIL;
return vars[0];
}
public static Object cdr(Object var) {
if (var == null) throw new NullPointerException();
if (eq(NIL, var)) return NIL;
if (atom(var)) throw new IllegalArgumentException();
Object[] vars = (Object[])var;
if (vars.length == 1) return NIL;
if (vars.length == 2) {
if (atom(vars[1])) {
if (eq(vars[1], NIL)) return new Object[]{NIL};
return new Object[]{vars[1]};
} else return vars[1];
}
return ArrayUtils.subarray(vars, 1, vars.length);
}
/**
* Returns the length of a given obj
as an S-expression.
* If obj
is an atom and not NIL, IllegalArgumentException
* will be thrown.
*/
public static int length(Object obj) {
if (obj == null) throw new NullPointerException();
if (!(obj instanceof Object[])) throw new IllegalArgumentException();
Object[] arr = ((Object[])obj);
int len;
if ((len = arr.length) <= 1) return len;
return length(arr[len - 1], len);
}
private static int length(Object obj, int len) {
if (atom(obj)) return len;
Object[] arr = (Object[]) obj;
if (arr.length <= 1) return len;
return length(arr[arr.length - 1], len + arr.length - 1);
}
public static Object eval(Context context, Object var) throws JCUnitException, CUT {
if (atom(var)) {
if (var instanceof Symbol) {
return context.lookup((Symbol)var);
} else {
return Utils.normalize(var);
}
}
Object car = car(var);
Object cdr = cdr(var);
Form f = null;
if (car instanceof Form) {
f = (Form) car;
} else if (car instanceof Symbol) {
Object o = context.lookup((Symbol)car);
if (!(o instanceof Form))
throw new RuntimeException();
f = (Form) o;
} else {
String msg = String.format("car(%s) of var(%s) must be a form or a symbol.", tostr(car), tostr(var));
throw new IllegalArgumentException(msg);
}
if (eq(NIL, cdr)) {
return f.evaluate(context, NIL);
}
return f.evaluate(context, cdr);
}
private static Object normalizeNIL(Object var) {
if (var instanceof Object[] && ((Object[])var).length == 0) return NIL;
return var;
}
public static Object quote(Object o) {
return o;
}
public static Object[] quote(Object... o) {
return o;
}
public static Object[] toarr(Object o) {
if (eq(o, NIL)) return (Object[])NIL;
if (atom(o)) return new Object[]{o};
Object[] arr = (Object[])o;
Object last = arr[arr.length - 1];
if (atom(last)) return arr;
Object[] ret = new Object[length(arr)];
for (int cur = 0; ; arr = (Object[]) last, last = arr[arr.length - 1]) {
System.arraycopy(arr, 0, ret, cur, arr.length - 1);
cur += arr.length - 1;
if (atom(last)) break;
}
ret[ret.length - 1] = arr[arr.length - 1];
return ret;
}
public static boolean atom(Object var) {
if (var == null) return true;
if (var instanceof Object[]) {
return ((Object[])var).length == 0;
}
return true;
}
public static Object arr(Object funcName, Object... args) {
return new Object[]{new Symbol(funcName.toString()), args};
}
public static boolean evalp(Context context, Object predicate) throws JCUnitException, CUT {
Object value = eval(context, predicate);
if (value instanceof Boolean) {
return ((Boolean)value);
}
String message = String.format("'%s' returned non-boolean value or it is not a predicate", predicate);
throw new ObjectUnderFrameworkException(message, null);
}
public static abstract class SexpIterator implements Iterator
© 2015 - 2025 Weber Informatics LLC | Privacy Policy