recursively evaluate