private int bind(Producer p, Node gNode, Exp exp, Stack stack, int n) {
if (exp.isFunctional()) {
return extBind(p, gNode, exp, stack, n);
}
int backtrack = n - 1;
Memory env = memory;
env.setGraphNode(gNode);
Node node = evaluator.eval(exp.getFilter(), env, p);
env.setGraphNode(null);
getVisitor().bind(this, getGraphNode(gNode), exp, node==null?null:node.getDatatypeValue());
if (node == null) {
backtrack = eval(p, gNode, stack, n + 1);
} else if (memory.push(exp.getNode(), node, n)) {
backtrack = eval(p, gNode, stack, n + 1);
memory.pop(exp.getNode());
}
return backtrack;
}