[pypy-svn] r44065 - in pypy/branch/prolog-bytecode/pypy/lang/prolog: builtin interpreter
cfbolz at codespeak.net
cfbolz at codespeak.net
Thu Jun 7 01:18:42 CEST 2007
Author: cfbolz
Date: Thu Jun 7 01:18:42 2007
New Revision: 44065
Modified:
pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/__init__.py
pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/register.py
pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/type.py
pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/engine.py
pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/helper.py
pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/term.py
Log:
small changes here and there: give Rules access to the engine. introduce an
is_ground helper.
Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/__init__.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/__init__.py (original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/__init__.py Thu Jun 7 01:18:42 2007
@@ -1,6 +1,7 @@
# all builtins
builtins = {}
builtins_list = []
+builtins_index = {}
# imports to register builtins
import pypy.lang.prolog.builtin.allsolution
Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/register.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/register.py (original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/register.py Thu Jun 7 01:18:42 2007
@@ -1,7 +1,7 @@
import py
from pypy.lang.prolog.interpreter.parsing import parse_file, TermBuilder
from pypy.lang.prolog.interpreter import engine, helper, term, error
-from pypy.lang.prolog.builtin import builtins, builtins_list
+from pypy.lang.prolog.builtin import builtins, builtins_list, builtins_index
from pypy.rlib.objectmodel import we_are_translated
@@ -90,7 +90,5 @@
b = Builtin(miniglobals[funcname], funcname, len(unwrap_spec),
signature)
builtins[signature] = b
- if signature in [",/2", "is/2"]:
- builtins_list.insert(0, (signature, b))
- else:
- builtins_list.append((signature, b))
+ builtins_index[signature] = len(builtins_list)
+ builtins_list.append((signature, b))
Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/type.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/type.py (original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/builtin/type.py Thu Jun 7 01:18:42 2007
@@ -54,11 +54,8 @@
expose_builtin(impl_callable, "callable", unwrap_spec=["obj"])
def impl_ground(engine, var):
- if isinstance(var, term.Var):
+ if not helper.is_ground(var, engine):
raise error.UnificationFailed()
- if isinstance(var, term.Term):
- for arg in var.args:
- impl_ground(engine, arg)
expose_builtin(impl_ground, "ground", unwrap_spec=["concrete"])
Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/engine.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/engine.py (original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/engine.py Thu Jun 7 01:18:42 2007
@@ -61,10 +61,6 @@
def discard(self, state):
pass #XXX for now
- def maxvar(self):
- XXX
- return self.needed_vars
-
def newvar(self):
result = Var(self)
return result
@@ -109,7 +105,6 @@
return "LinkedRules(%r, %r)" % (self.rule, self.next)
-
class Function(object):
def __init__(self, firstrule=None):
if firstrule is None:
@@ -149,12 +144,12 @@
debug_print("add_rule", rule)
if isinstance(rule, Term):
if rule.name == ":-":
- rule = Rule(rule.args[0], rule.args[1])
+ rule = Rule(rule.args[0], rule.args[1], self)
else:
- rule = Rule(rule, None)
+ rule = Rule(rule, None, self)
signature = rule.signature
elif isinstance(rule, Atom):
- rule = Rule(rule, None)
+ rule = Rule(rule, None, self)
signature = rule.signature
else:
error.throw_type_error("callable", rule)
@@ -317,7 +312,10 @@
return self.main_loop(TRY_RULE, query, continuation, rule)
#if _is_early_constant(rule):
# rule = hint(rule, promote=True)
- # return self.portal_try_rule(rule, query, continuation, choice_point)
+ # #force right colors
+ # query = hint(query, variable=True)
+ # continuation = hint(continuation, variable=True)
+ # return self.portal_try_rule(rule, query, continuation, True)
return self._opaque_try_rule(rule, query, continuation, choice_point)
def _opaque_try_rule(self, rule, query, continuation, choice_point):
@@ -366,7 +364,7 @@
continuation = e.continuation
def parse(self, s):
- from pypy.lang.prolog.interpreter.parsing import parse_file, TermBuilder, lexer
+ from pypy.lang.prolog.interpreter.parsing import parse_file, TermBuilder
builder = TermBuilder()
trees = parse_file(s, self.parser)
terms = builder.build_many(trees)
@@ -378,6 +376,3 @@
return default_operations
return self.operations
-
-
-
Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/helper.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/helper.py (original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/helper.py Thu Jun 7 01:18:42 2007
@@ -27,6 +27,18 @@
return isinstance(var, term.Callable)
is_callable._look_inside_me_ = True
+def is_ground(obj, engine):
+ stack = [obj]
+ while stack:
+ obj = stack.pop().dereference(engine.heap)
+ if isinstance(obj, term.Var):
+ return False
+ if isinstance(obj, term.Term):
+ for arg in obj.args:
+ stack.append(arg)
+ return True
+
+
def ensure_callable(var):
if isinstance(var, term.Var):
error.throw_instantiation_error()
Modified: pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/term.py
==============================================================================
--- pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/term.py (original)
+++ pypy/branch/prolog-bytecode/pypy/lang/prolog/interpreter/term.py Thu Jun 7 01:18:42 2007
@@ -504,7 +504,7 @@
class Rule(object):
_immutable_ = True
unify_hash = []
- def __init__(self, head, body):
+ def __init__(self, head, body, engine):
from pypy.lang.prolog.interpreter import helper
assert isinstance(head, Callable)
self.head = head
More information about the pypy-svn
mailing list