/** * This method is invoked when the builtin is called in a rule body. * * @param args the array of argument values for the builtin, this is an array of Nodes, some of * which may be Node_RuleVariables. * @param length the length of the argument list, may be less than the length of the args array * for some rule engines * @param context an execution context giving access to other relevant data * @return return true if the buildin predicate is deemed to have succeeded in the current * environment */ public boolean bodyCall(Node[] args, int length, RuleContext context) { checkArgs(length, context); BindingEnvironment env = context.getEnv(); Node n1 = getArg(0, args, context); Node n2 = getArg(1, args, context); if (n1.isLiteral() && n2.isLiteral()) { Object v1 = n1.getLiteralValue(); Object v2 = n2.getLiteralValue(); Node sum = null; if (v1 instanceof Number && v2 instanceof Number) { Number nv1 = (Number) v1; Number nv2 = (Number) v2; if (v1 instanceof Float || v1 instanceof Double || v2 instanceof Float || v2 instanceof Double) { sum = Util.makeDoubleNode(nv1.doubleValue() - nv2.doubleValue()); } else { sum = Util.makeLongNode(nv1.longValue() - nv2.longValue()); } return env.bind(args[2], sum); } } // Doesn't (yet) handle partially bound cases return false; }
private long getIntegralValueInRange(long min, Number n, long max) { long result = n.longValue(); if (min <= result && result <= max) return result; throw new IllegalArgumentException("byte value required: " + result); }