Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
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)