# Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.evaluation.constructs.eattachable import EAttachable from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.etraceable import ETraceable from bu4.linking.constructs.linked import Linked from bu4.linking.evaluation.elvtype import elvtype from bu4.linking.evaluation.lambdaelv import LambdaElv __all__ = ('ELLambda',) class ELLambda(ETraceable): def __init__(self, env: elvtype, name: bytes, value: Linked): self.env = env self.name = name self.value = value self.used = name in value.future self.memoize = name in value.multifuture def call(self, argument: Evaluable) -> Evaluable: return EAttachable( LambdaElv(self.env, self.name, argument, memoize=self.memoize) if self.used else self.env, self.value ) def __str__(self): return f'({self.name.decode()}){self.value}'