Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance. Project price only 1 $
You can buy this project and download/modify it how often you want.
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