def _user_call(self, query, continuation): signature = hint(query.signature, promote=True) function = self._jit_lookup(signature) startrulechain = function.rulechain startrulechain = hint(startrulechain, promote=True) if startrulechain is None: error.throw_existence_error("procedure", query.get_prolog_signature()) unify_hash = query.unify_hash_of_children(self.heap) rulechain = startrulechain.find_applicable_rule(unify_hash) if rulechain is None: # none of the rules apply raise UnificationFailed() rule = rulechain.rule rulechain = rulechain.next oldstate = self.heap.branch() while 1: if rulechain is not None: rulechain = rulechain.find_applicable_rule(unify_hash) choice_point = rulechain is not None else: choice_point = False hint(rule, concrete=True) if rule.contains_cut: continuation = LimitedScopeContinuation(continuation) try: result = self.try_rule(rule, query, continuation) self.heap.discard(oldstate) return result except UnificationFailed: self.heap.revert(oldstate) except CutException, e: if continuation.scope_active: return self.continue_after_cut(e.continuation, continuation) raise else: inline = rule.body is None # inline facts try: # for the last rule (rulechain is None), this will always # return, because choice_point is False result = self.try_rule(rule, query, continuation, choice_point=choice_point, inline=inline) self.heap.discard(oldstate) return result except UnificationFailed: assert choice_point self.heap.revert(oldstate) rule = rulechain.rule rulechain = rulechain.next
def _user_call(self, query, continuation): signature = hint(query.signature, promote=True) function = self._jit_lookup(signature) startrulechain = function.rulechain startrulechain = hint(startrulechain, promote=True) if startrulechain is None: error.throw_existence_error( "procedure", query.get_prolog_signature()) unify_hash = query.unify_hash_of_children(self.heap) rulechain = startrulechain.find_applicable_rule(unify_hash) if rulechain is None: # none of the rules apply raise UnificationFailed() rule = rulechain.rule rulechain = rulechain.next oldstate = self.heap.branch() while 1: if rulechain is not None: rulechain = rulechain.find_applicable_rule(unify_hash) choice_point = rulechain is not None else: choice_point = False hint(rule, concrete=True) if rule.contains_cut: continuation = LimitedScopeContinuation(continuation) try: result = self.try_rule(rule, query, continuation) self.heap.discard(oldstate) return result except UnificationFailed: self.heap.revert(oldstate) except CutException, e: if continuation.scope_active: return self.continue_after_cut(e.continuation, continuation) raise else: inline = rule.body is None # inline facts try: # for the last rule (rulechain is None), this will always # return, because choice_point is False result = self.try_rule(rule, query, continuation, choice_point=choice_point, inline=inline) self.heap.discard(oldstate) return result except UnificationFailed: assert choice_point self.heap.revert(oldstate) rule = rulechain.rule rulechain = rulechain.next
def impl_consult(engine, var): import os if isinstance(var, term.Atom): try: fd = os.open(var.name, os.O_RDONLY, 0777) except OSError, e: error.throw_existence_error("source_sink", var) assert 0, "unreachable" # make the flow space happy try: content = [] while 1: s = os.read(fd, 4096) if not s: break content.append(s) file_content = "".join(content) finally: os.close(fd) engine.runstring(file_content)