Fixed memory() and RET usage
This commit is contained in:
@@ -2,7 +2,7 @@ from dataclasses import dataclass
|
||||
|
||||
from core.builtin_concepts import BuiltinConcepts
|
||||
from core.builtin_helpers import expect_one, only_successful, parse_unrecognized, evaluate
|
||||
from core.concept import Concept, DoNotResolve, ConceptParts, InfiniteRecursionResolved, NotInit
|
||||
from core.concept import Concept, DoNotResolve, ConceptParts, InfiniteRecursionResolved, NotInit, ensure_concept
|
||||
from core.sheerka.services.SheerkaExecute import ParserInput
|
||||
from core.sheerka.services.sheerka_service import BaseService
|
||||
from core.tokenizer import Tokenizer
|
||||
@@ -32,6 +32,7 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
|
||||
def initialize(self):
|
||||
self.sheerka.bind_service_method(self.evaluate_concept, True)
|
||||
self.sheerka.bind_service_method(self.set_auto_eval, True)
|
||||
|
||||
@staticmethod
|
||||
def infinite_recursion_detected(context, concept):
|
||||
@@ -229,9 +230,12 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
continue
|
||||
|
||||
source = getattr(concept.metadata, part_key.value)
|
||||
if source is None or not isinstance(source, str):
|
||||
if source is None: # or not isinstance(source, str):
|
||||
continue
|
||||
|
||||
if not isinstance(source, str):
|
||||
raise Exception("Invalid concept init. metadata must be a string")
|
||||
|
||||
if source.strip() == "":
|
||||
concept.compiled[part_key] = DoNotResolve(source)
|
||||
else:
|
||||
@@ -251,9 +255,12 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
if var_name in concept.compiled:
|
||||
continue
|
||||
|
||||
if default_value is None or not isinstance(default_value, str):
|
||||
if default_value is None:
|
||||
continue
|
||||
|
||||
if not isinstance(default_value, str):
|
||||
raise Exception("Invalid concept init. variable metadata must be a string")
|
||||
|
||||
if default_value.strip() == "":
|
||||
concept.compiled[var_name] = DoNotResolve(default_value)
|
||||
else:
|
||||
@@ -332,12 +339,13 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
# when it's a concept, evaluate it
|
||||
if isinstance(to_resolve, Concept) and \
|
||||
not context.sheerka.isinstance(to_resolve, BuiltinConcepts.RETURN_VALUE):
|
||||
|
||||
evaluated = self.evaluate_concept(sub_context, to_resolve)
|
||||
sub_context.add_values(return_values=evaluated)
|
||||
if evaluated.key == to_resolve.key: # quicker (and dirtier) than sheerka.is_success()
|
||||
return self.apply_ret(evaluated)
|
||||
else:
|
||||
if not context.sheerka.is_success(evaluated) and evaluated.key != to_resolve.key:
|
||||
error = evaluated
|
||||
else:
|
||||
return evaluated
|
||||
|
||||
# otherwise, execute all return values to find out what is the value
|
||||
else:
|
||||
@@ -449,7 +457,7 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
sub_context.protected_hints.add(BuiltinConcepts.EVAL_BODY_REQUESTED)
|
||||
|
||||
# auto evaluate commands
|
||||
if context.sheerka.isa(concept, context.sheerka.new(BuiltinConcepts.COMMAND)):
|
||||
if context.sheerka.isa(concept, context.sheerka.new(BuiltinConcepts.AUTO_EVAL)):
|
||||
sub_context.protected_hints.add(BuiltinConcepts.EVAL_BODY_REQUESTED)
|
||||
|
||||
self.initialize_concept_asts(sub_context, concept)
|
||||
@@ -531,12 +539,19 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
if "body" in all_metadata_to_eval:
|
||||
concept.metadata.is_evaluated = True
|
||||
|
||||
# # update the cache for concepts with no variables
|
||||
# Cannot use cache. See the comment at the beginning of this method
|
||||
# if len(concept.metadata.variables) == 0:
|
||||
# self.sheerka.cache_manager.put(self.sheerka.CONCEPTS_BY_ID_ENTRY, concept.id, concept)
|
||||
# # update the cache for concepts with no variables
|
||||
# Cannot use cache. See the comment at the beginning of this method
|
||||
# if len(concept.metadata.variables) == 0:
|
||||
# self.sheerka.cache_manager.put(self.sheerka.CONCEPTS_BY_ID_ENTRY, concept.id, concept)
|
||||
|
||||
return concept
|
||||
if not concept.metadata.is_builtin:
|
||||
self.sheerka.register_object(sub_context, concept.name, concept)
|
||||
|
||||
# manage RET metadata
|
||||
if sub_context.in_context(BuiltinConcepts.EVAL_BODY_REQUESTED) and ConceptParts.RET in concept.values:
|
||||
return concept.get_value(ConceptParts.RET)
|
||||
else:
|
||||
return concept
|
||||
|
||||
def compute_metadata_to_eval(self, context, concept):
|
||||
to_eval = []
|
||||
@@ -553,10 +568,11 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
body |= b
|
||||
to_eval.extend(needed)
|
||||
|
||||
needed, v, b = self.get_needed_metadata(concept, ConceptParts.RET, not variables, not body)
|
||||
variables |= v
|
||||
body |= b
|
||||
to_eval.extend(needed)
|
||||
if context.in_context(BuiltinConcepts.EVAL_BODY_REQUESTED):
|
||||
needed, v, b = self.get_needed_metadata(concept, ConceptParts.RET, not variables, not body)
|
||||
variables |= v
|
||||
body |= b
|
||||
to_eval.extend(needed)
|
||||
|
||||
needed, v, b = self.get_needed_metadata(concept, ConceptParts.POST, not variables, not body)
|
||||
variables |= v
|
||||
@@ -571,3 +587,13 @@ class SheerkaEvaluateConcept(BaseService):
|
||||
to_eval.append("body")
|
||||
|
||||
return to_eval
|
||||
|
||||
def set_auto_eval(self, context, concept):
|
||||
"""
|
||||
add AUTO_EVAL to ISA
|
||||
:param context:
|
||||
:param concept:
|
||||
:return:
|
||||
"""
|
||||
ensure_concept(concept)
|
||||
return self.sheerka.set_isa(context, concept, self.sheerka.new(BuiltinConcepts.AUTO_EVAL))
|
||||
|
||||
Reference in New Issue
Block a user