package com.babel17.interpreter.values;
import com.babel17.interpreter.runtime.Evaluator;
import com.babel17.interpreter.runtime.Continuation;
import com.babel17.interpreter.runtime.EvalResult;
public abstract class Value {
public final static String SYNTACTIC_PLUS = "syntactic_plus";
public final static String SYNTACTIC_MINUS = "syntactic_minus";
public final static String SYNTACTIC_UMINUS = "syntactic_uminus";
public final static String SYNTACTIC_TIMES = "syntactic_times";
public final static String SYNTACTIC_DIV = "syntactic_div";
public final static String SYNTACTIC_MOD = "syntactic_mod";
public final static String SYNTACTIC_POW = "syntactic_pow";
public final static String SYNTACTIC_PLUSPLUS = "syntactic_plusplus";
public final static String SYNTACTIC_MINUSMINUS = "syntactic_minusminus";
public final static String SYNTACTIC_TIMESTIMES = "syntactic_timestimes";
public final static String SYNTACTIC_TO = "syntactic_to";
public final static String SYNTACTIC_DOWNTO = "syntactic_downto";
public final static String APPLY = "apply";
public final static String DECONSTRUCT = "deconstruct";
public final static String REPRESENTATIVE = "representative";
public final static String COLLECTOR_ADD = "collector_add";
public final static String COLLECTOR_CLOSE = "collector_close";
public final static String ITERATE = "iterate";
// split implies a forcing
// a return of null means that this value cannot be split
public Value split(Evaluator e, String message, int num_pieces) {
return null;
}
// sendMessage implies a forcing
public Value sendMessage(String message) {
return DynamicException.unknownMessage(message);
}
// implies forcing
public EvalResult apply(Evaluator e, Continuation c, Value v) {
return EvalResult.createFinalResult(DynamicException.invalidOperator(this));
}
// implies forcing
// a return of null means that this value cannot be destructed by c
public Value deconstruct(Evaluator e, ConstructorValue c) {
return null;
}
public Value force() { return this; }
// first bit of result: 1 => this <= x, 0 => not (this <= x)
// second bit of result: 1 => x <= this, 0 => not (x <= this)
// if there was some kind of dynamic exception, throw CompareException
public int compareWithOtherValue(Evaluator e, Value x) throws CompareException {
int result = lessThanOrEqualOtherValue(e, x) ? 1 : 0;
if (x.lessThanOrEqualOtherValue(e, this)) result |= 2;
return result;
}
public boolean lessThanOrEqualOtherValue(Evaluator e, Value x) throws CompareException {
throw new RuntimeException("no <= comparison implemented");
}
}