builtup4/bu4/linking/evaluation/ellambda.py

29 lines
975 B
Python

# 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}'