# 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.evalue import EValue from bu4.linkable.evaluation.elvtype import elvtype from bu4.linkable.evaluation.lambdaelv import LambdaElv from bu4.linking.constructs.linked import Linked __all__ = ('ELLambda',) class ELLambda(EValue): 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}'