Concepts bodies are now evaluated on demand
This commit is contained in:
@@ -5,7 +5,7 @@ from evaluators.BaseEvaluator import OneReturnValueEvaluator
|
||||
|
||||
class ConceptEvaluator(OneReturnValueEvaluator):
|
||||
"""
|
||||
The concept evaluatuor is the main class that know what to do with a concept
|
||||
The concept evaluator is the main class that know what to do with a concept
|
||||
It verifies the PRE
|
||||
If ok, can execute or not the BODY
|
||||
Then checks the POST conditions
|
||||
@@ -15,6 +15,19 @@ class ConceptEvaluator(OneReturnValueEvaluator):
|
||||
def __init__(self, return_body=False):
|
||||
super().__init__(self.NAME, [BuiltinConcepts.EVALUATION], 50)
|
||||
self.return_body = return_body
|
||||
self.evaluate_body = False
|
||||
self.is_initialized = False
|
||||
|
||||
def init_evaluator(self, context, return_values):
|
||||
if BuiltinConcepts.CONCEPT_EVAL_REQUESTED in context.extra_info:
|
||||
self.evaluate_body = True
|
||||
|
||||
for r in return_values:
|
||||
if r.status and context.sheerka.isinstance(r.body, BuiltinConcepts.CONCEPT_VALUE_REQUESTED):
|
||||
self.evaluate_body = True
|
||||
break
|
||||
|
||||
self.is_initialized = True
|
||||
|
||||
def matches(self, context, return_value):
|
||||
return return_value.status and \
|
||||
@@ -36,7 +49,7 @@ class ConceptEvaluator(OneReturnValueEvaluator):
|
||||
|
||||
return sheerka.ret(self.name, True, value, parents=[return_value])
|
||||
|
||||
evaluated = sheerka.evaluate_concept(context, concept)
|
||||
evaluated = sheerka.evaluate_concept(context, concept, self.evaluate_body)
|
||||
|
||||
if evaluated.key != concept.key:
|
||||
# evaluated.key != concept.key means that we have transformed the concept
|
||||
|
||||
@@ -17,7 +17,7 @@ class EvalEvaluator(AllReturnValuesEvaluator):
|
||||
def matches(self, context, return_values):
|
||||
sheerka = context.sheerka
|
||||
for ret in return_values:
|
||||
if ret.status and sheerka.isinstance(ret.body, BuiltinConcepts.CONCEPT_EVAL_REQUESTED):
|
||||
if ret.status and sheerka.isinstance(ret.body, BuiltinConcepts.CONCEPT_VALUE_REQUESTED):
|
||||
self.eval_requested = ret
|
||||
return True
|
||||
|
||||
@@ -47,5 +47,5 @@ class EvalEvaluator(AllReturnValuesEvaluator):
|
||||
return sheerka.ret(
|
||||
self.name,
|
||||
False,
|
||||
sheerka.new(BuiltinConcepts.CONCEPT_EVAL_REQUESTED),
|
||||
sheerka.new(BuiltinConcepts.CONCEPT_VALUE_REQUESTED),
|
||||
parents=[self.eval_requested])
|
||||
|
||||
@@ -49,7 +49,7 @@ class MultipleSameSuccessEvaluator(AllReturnValuesEvaluator):
|
||||
for s in self.success:
|
||||
context.log(f"{s}", who=self)
|
||||
|
||||
if not core.builtin_helpers.is_same_success(sheerka, self.success):
|
||||
if not core.builtin_helpers.is_same_success(context, self.success):
|
||||
return None
|
||||
|
||||
# ######################################
|
||||
|
||||
@@ -35,6 +35,6 @@ class PrepareEvalEvaluator(OneReturnValueEvaluator):
|
||||
|
||||
evaluation_requested = sheerka.ret(
|
||||
self.name,
|
||||
True, sheerka.new(BuiltinConcepts.CONCEPT_EVAL_REQUESTED))
|
||||
True, sheerka.new(BuiltinConcepts.CONCEPT_VALUE_REQUESTED))
|
||||
|
||||
return [new_text_to_parse, evaluation_requested]
|
||||
|
||||
@@ -112,7 +112,7 @@ class PythonEvaluator(OneReturnValueEvaluator):
|
||||
|
||||
context.log(f"Evaluating '{concept}'", self.name)
|
||||
with context.push(self.name, desc=f"Evaluating '{concept}'", obj=concept) as sub_context:
|
||||
evaluated = context.sheerka.evaluate_concept(sub_context, concept)
|
||||
evaluated = context.sheerka.evaluate_concept(sub_context, concept, True)
|
||||
sub_context.add_values(return_values=evaluated)
|
||||
|
||||
if evaluated.key == concept.key:
|
||||
|
||||
@@ -44,7 +44,7 @@ class TooManySuccessEvaluator(AllReturnValuesEvaluator):
|
||||
context.log(s, self.name)
|
||||
context.log(f"value={sheerka.value(s.value)}", self.name)
|
||||
|
||||
if not core.builtin_helpers.is_same_success(sheerka, self.success):
|
||||
if not core.builtin_helpers.is_same_success(context, self.success):
|
||||
context.log(f"Values are different. Raising {BuiltinConcepts.TOO_MANY_SUCCESS}.", self.name)
|
||||
too_many_success = sheerka.new(BuiltinConcepts.TOO_MANY_SUCCESS, body=self.success)
|
||||
return sheerka.ret(self.name, False, too_many_success, parents=self.eaten)
|
||||
|
||||
Reference in New Issue
Block a user