CodeExtension

This commit is contained in:
AF 2021-09-09 08:16:01 +03:00
parent d51d6a38e5
commit b45301194c
34 changed files with 132 additions and 180 deletions

View File

@ -1,25 +1,29 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from typing import TypeVar, Generic
from bu4.evaluation.constructs.attachable import Attachable
from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
from bu4.linking.constructs.linked import Linked
from bu4.evaluation.targets.avanonymouscontainer import AVAnonymousContainer
__all__ = ('EDelayed',)
T = TypeVar('T')
class EDelayed(EValue):
def __init__(self, env: envtype, value: Linked):
class EDelayed(EValue, Generic[T]):
def __init__(self, env: T, value: Attachable[T]):
self.env = env
self.value = value
self.evaluable = EAttachable(
self.evaluable = AVAnonymousContainer(EAttachable(
self.env,
self.value
)
)).after_value
def call(self, argument: Evaluable) -> Evaluable:
return self.evaluable
def __str__(self):
return f'(()){self.value}'
return f'&{self.value}'

View File

@ -1,25 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.evtype import evtype
from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
from bu4.indexing.constructs.indexed import Indexed
__all__ = ('EIDelayed',)
class EIDelayed(EValue):
def __init__(self, ev: evtype, value: Indexed):
self.ev = ev
self.value = value
self.evaluable = EAttachable(
self.ev,
self.value
)
def call(self, argument: Evaluable) -> Evaluable:
return self.evaluable
def __str__(self):
return f'(()){self.value}'

View File

@ -2,25 +2,26 @@
from bu4.evaluation.av.evtype import evtype
from bu4.evaluation.av.lambdaev import LambdaEv
from bu4.evaluation.constructs.attachable import Attachable
from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
from bu4.indexing.constructs.indexed import Indexed
__all__ = ('EILambda',)
class EILambda(EValue):
def __init__(self, ev: evtype, value: Indexed, *, memoize: bool):
def __init__(self, ev: evtype, value: Attachable[evtype], *, memoize: bool):
self.ev = ev
self.value = value
self.memoize = memoize
def call(self, argument: Evaluable) -> Evaluable:
ev: evtype = LambdaEv(self.ev, argument, memoize=self.memoize)
return EAttachable(
LambdaEv(self.ev, argument, memoize=self.memoize),
ev,
self.value
)
def __str__(self):
return f'(){self.value}'
return f'(0){self.value}'

View File

@ -1,8 +1,8 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('Evaluable',)
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
class Evaluable:
def next(self) -> 'Evaluable':
raise NotImplementedError

View File

@ -1,7 +1,7 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.evtype import evtype
from bu4.evaluation.constructs.eidelayed import EIDelayed
from bu4.evaluation.constructs.edelayed import EDelayed
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_DLYD
@ -14,13 +14,13 @@ class IDelayed(Indexed):
self.value = value
def attach(self, ev: evtype) -> Evaluable:
return EIDelayed(
return EDelayed(
ev,
self.value
)
def __str__(self):
return f'(){self.value}'
return f'&{self.value}'
def __bytes__(self):
return bytes([CODE_DLYD, *bytes(self.value)])

View File

@ -23,7 +23,7 @@ class ILambda(Indexed):
)
def __str__(self):
return f'(){self.value}'
return f'(0){self.value}'
def __bytes__(self):
return bytes([CODE_MAKE, self.memoize, len(self.table), *self.table, *bytes(self.value)])

View File

@ -3,31 +3,19 @@
from bu4.indexing.constructs.icall import ICall
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_CALL
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('XICall',)
class XICall(Extension[Indexed], code=CODE_CALL):
class XICall(CodeExtension[Indexed], code=CODE_CALL):
def apply(self) -> TransformState[Indexed]:
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda argument: AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda lambda_: TransformFinished(
ICall(
argument,
lambda_
)
)
)
return self.readlambda(
lambda argument: self.readlambdafinished(
lambda lambda_: ICall(
argument,
lambda_
)
)
)

View File

@ -3,21 +3,14 @@
from bu4.indexing.constructs.idelayed import IDelayed
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_DLYD
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('XIDlyd',)
class XIDlyd(Extension[Indexed], code=CODE_DLYD):
class XIDlyd(CodeExtension[Indexed], code=CODE_DLYD):
def apply(self) -> TransformState[Indexed]:
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda value: TransformFinished(IDelayed(value))
)
return self.readlambdafinished(
lambda value: IDelayed(value)
)

View File

@ -3,23 +3,16 @@
from bu4.indexing.constructs.ilambda import ILambda
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_MAKE
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('XIMake',)
class XIMake(Extension[Indexed], code=CODE_MAKE):
class XIMake(CodeExtension[Indexed], code=CODE_MAKE):
def apply(self) -> TransformState[Indexed]:
memoize = bool(self.parser.read())
table = [self.parser.read() for _ in range(self.parser.read())]
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda value: TransformFinished(ILambda(value, table, memoize=memoize))
)
return self.readlambdafinished(
lambda value: ILambda(value, table, memoize=memoize)
)

View File

@ -3,13 +3,13 @@
from bu4.indexing.constructs.iname import IName
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_NAME
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('XIName',)
class XIName(Extension[Indexed], code=CODE_NAME):
class XIName(CodeExtension[Indexed], code=CODE_NAME):
def apply(self) -> TransformState[Indexed]:
return TransformFinished(IName(self.parser.read()))

View File

@ -3,13 +3,13 @@
from bu4.indexing.constructs.indexed import Indexed
from bu4.indexing.constructs.inull import INull
from bu4.parsing.codes import CODE_NULL
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('XINull',)
class XINull(Extension[Indexed], code=CODE_NULL):
class XINull(CodeExtension[Indexed], code=CODE_NULL):
def apply(self) -> TransformState[Indexed]:
return TransformFinished(INull())

View File

@ -3,13 +3,13 @@
from bu4.indexing.constructs.iexception import IException
from bu4.indexing.constructs.indexed import Indexed
from bu4.parsing.codes import CODE_XCPT
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('XIXcpt',)
class XIXcpt(Extension[Indexed], code=CODE_XCPT):
class XIXcpt(CodeExtension[Indexed], code=CODE_XCPT):
def apply(self) -> TransformState[Indexed]:
return TransformFinished(IException(self.parser.parse_name()))

View File

@ -3,7 +3,7 @@
from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.sync import sync
from bu4.linkable.toolchain.parse import parse
from bu4.linkable.toolchain.stdext import standard_extension
from bu4.linkable.toolchain.stdext import standard_extensions
from bu4.linkable.toolchain.transply import transply
from bu4.transform.transform import transform
@ -12,7 +12,7 @@ __all__ = ('isynced',)
def isynced(source: str) -> EValue:
bsource = transply(source)
parsed = parse(bsource, standard_extension)
parsed = parse(bsource, standard_extensions)
linked = transform(parsed.link(set()))
indexed = transform(linked.index([]))
evaluable = indexed.attach([])

View File

@ -1,8 +1,8 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.constructs.parsed import Parsed
from bu4.linking.constructs.lcall import LCall
from bu4.linking.constructs.linked import Linked
from bu4.linkable.constructs.parsed import Parsed
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstart import TransformStart

View File

@ -1,8 +1,8 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.constructs.parsed import Parsed
from bu4.linking.constructs.ldelayed import LDelayed
from bu4.linking.constructs.linked import Linked
from bu4.linkable.constructs.parsed import Parsed
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstart import TransformStart

View File

@ -1,8 +1,8 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.constructs.parsed import Parsed
from bu4.linking.constructs.lexception import LException
from bu4.linking.constructs.linked import Linked
from bu4.linkable.constructs.parsed import Parsed
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState

View File

@ -1,8 +1,8 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.constructs.parsed import Parsed
from bu4.linking.constructs.linked import Linked
from bu4.linking.constructs.llambda import LLambda
from bu4.linkable.constructs.parsed import Parsed
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstart import TransformStart

View File

@ -1,8 +1,8 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.constructs.parsed import Parsed
from bu4.linking.constructs.linked import Linked
from bu4.linking.constructs.lname import LName
from bu4.linkable.constructs.parsed import Parsed
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState

View File

@ -1,8 +1,8 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linkable.constructs.parsed import Parsed
from bu4.linking.constructs.linked import Linked
from bu4.linking.constructs.lnull import LNull
from bu4.linkable.constructs.parsed import Parsed
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState

View File

@ -3,31 +3,19 @@
from bu4.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.pcall import PCall
from bu4.parsing.codes import CODE_CALL
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('XCall',)
class XCall(Extension[Parsed], code=CODE_CALL):
class XCall(CodeExtension[Parsed], code=CODE_CALL):
def apply(self) -> TransformState[Parsed]:
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda argument: AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda lambda_: TransformFinished(
PCall(
argument,
lambda_
)
)
)
return self.readlambda(
lambda argument: self.readlambdafinished(
lambda lambda_: PCall(
argument,
lambda_
)
)
)

View File

@ -3,21 +3,14 @@
from bu4.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.pdelayed import PDelayed
from bu4.parsing.codes import CODE_DLYD
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('XDlyd',)
class XDlyd(Extension[Parsed], code=CODE_DLYD):
class XDlyd(CodeExtension[Parsed], code=CODE_DLYD):
def apply(self) -> TransformState[Parsed]:
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda value: TransformFinished(PDelayed(value))
)
return self.readlambdafinished(
lambda value: PDelayed(value)
)

View File

@ -3,22 +3,15 @@
from bu4.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.plambda import PLambda
from bu4.parsing.codes import CODE_MAKE
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('XMake',)
class XMake(Extension[Parsed], code=CODE_MAKE):
class XMake(CodeExtension[Parsed], code=CODE_MAKE):
def apply(self) -> TransformState[Parsed]:
name = self.parser.parse_name()
return AfterTransform(
ParsingRead(self.parser),
ATLambda(
lambda value: TransformFinished(PLambda(name, value))
)
return self.readlambdafinished(
lambda value: PLambda(name, value)
)

View File

@ -1,15 +1,15 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_NAME
from bu4.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.pname import PName
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.codes import CODE_NAME
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('XName',)
class XName(Extension[Parsed], code=CODE_NAME):
class XName(CodeExtension[Parsed], code=CODE_NAME):
def apply(self) -> TransformState[Parsed]:
return TransformFinished(PName(self.parser.parse_name()))

View File

@ -3,13 +3,13 @@
from bu4.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.pnull import PNull
from bu4.parsing.codes import CODE_NULL
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('XNull',)
class XNull(Extension[Parsed], code=CODE_NULL):
class XNull(CodeExtension[Parsed], code=CODE_NULL):
def apply(self) -> TransformState[Parsed]:
return TransformFinished(PNull())

View File

@ -1,16 +1,13 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_QOPN, CODE_QCLS
from bu4.linkable.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.parsing.targets.apendswith import APEndsWith
from bu4.transform.states.aftertransform import AfterTransform
from bu4.parsing.codes import CODE_QOPN, CODE_QCLS
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformstate import TransformState
__all__ = ('XQopn',)
class XQopn(Extension[Parsed], code=CODE_QOPN):
class XQopn(CodeExtension[Parsed], code=CODE_QOPN):
def apply(self) -> TransformState[Parsed]:
return AfterTransform(ParsingRead(self.parser), APEndsWith(self.parser, CODE_QCLS, 'quot expected'))
return self.endswith(CODE_QCLS, 'quot expected')

View File

@ -1,16 +1,13 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_QUOT
from bu4.linkable.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.parsing.targets.apendswith import APEndsWith
from bu4.transform.states.aftertransform import AfterTransform
from bu4.parsing.codes import CODE_QUOT
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformstate import TransformState
__all__ = ('XQuot',)
class XQuot(Extension[Parsed], code=CODE_QUOT):
class XQuot(CodeExtension[Parsed], code=CODE_QUOT):
def apply(self) -> TransformState[Parsed]:
return AfterTransform(ParsingRead(self.parser), APEndsWith(self.parser, CODE_QUOT, 'quot expected'))
return self.endswith(CODE_QUOT, 'quot expected')

View File

@ -1,14 +1,14 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_SKIP
from bu4.linkable.constructs.parsed import Parsed
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.codes import CODE_SKIP
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.transform.states.transformstate import TransformState
__all__ = ('XSkip',)
class XSkip(Extension[Parsed], code=CODE_SKIP):
class XSkip(CodeExtension[Parsed], code=CODE_SKIP):
def apply(self) -> TransformState[Parsed]:
return ParsingRead(self.parser)

View File

@ -1,15 +1,15 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.codes import CODE_XCPT
from bu4.linkable.constructs.parsed import Parsed
from bu4.linkable.constructs.pexception import PException
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.codes import CODE_XCPT
from bu4.parsing.extensions.CodeExtension import CodeExtension
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
__all__ = ('XXcpt',)
class XXcpt(Extension[Parsed], code=CODE_XCPT):
class XXcpt(CodeExtension[Parsed], code=CODE_XCPT):
def apply(self) -> TransformState[Parsed]:
return TransformFinished(PException(self.parser.parse_name()))

View File

@ -10,9 +10,9 @@ from bu4.linkable.extensions.xquot import XQuot
from bu4.linkable.extensions.xskip import XSkip
from bu4.linkable.extensions.xxcpt import XXcpt
__all__ = ('standard_extension',)
__all__ = ('standard_extensions',)
standard_extension = (
standard_extensions = (
XNull,
XCall,
XMake,

View File

@ -35,4 +35,4 @@ class LDelayed(Linked):
)
def __str__(self):
return f'(){self.value}'
return f'&{self.value}'

View File

@ -0,0 +1,39 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from abc import ABC
from typing import TypeVar, Callable
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
from bu4.parsing.targets.apendswith import APEndsWith
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('CodeExtension',)
T = TypeVar('T')
class CodeExtension(Extension[T], ABC):
def __init_subclass__(cls, /, code: int = None):
super().__init_subclass__()
if code is None:
raise TypeError
cls.code = code
def readlambda(self, lambda_: Callable[[T], TransformState[T]]) -> TransformState[T]:
return AfterTransform(
ParsingRead(self.parser),
ATLambda(lambda_)
)
def readlambdafinished(self, lambda_: Callable[[T], T]) -> TransformState[T]:
return AfterTransform(
ParsingRead(self.parser),
ATLambda(lambda parsed: TransformFinished(lambda_(parsed)))
)
def endswith(self, expected: int, message: str):
return AfterTransform(ParsingRead(self.parser), APEndsWith(self.parser, expected, message))

View File

@ -12,11 +12,5 @@ T = TypeVar('T')
class Extension(AbstractExtension[T], ABC):
def __init_subclass__(cls, /, code: int = None, **kwargs):
super().__init_subclass__(**kwargs)
if code is None:
raise TypeError
cls.code = code
def __init__(self, parser: AbstractParser):
def __init__(self, parser: AbstractParser[T]):
self.parser = parser

View File

@ -7,12 +7,9 @@ from bu4.parsing.abstractparser import AbstractParser
from bu4.parsing.extensions.abstractextension import AbstractExtension
from bu4.parsing.extensions.extension import Extension
from bu4.parsing.states.parsingread import ParsingRead
__all__ = ('Parser',)
from bu4.transform.states.transformstate import TransformState
from bu4.transform.transform import transform
__all__ = ('Parser',)
T = TypeVar('T')

View File

@ -2,16 +2,16 @@
from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.sync import sync
from bu4.linking.evaluable_from_parsed import evaluable_from_parsed
from bu4.linkable.toolchain.parse import parse
from bu4.linkable.toolchain.stdext import standard_extension
from bu4.linkable.toolchain.stdext import standard_extensions
from bu4.linkable.toolchain.transply import transply
from bu4.linking.evaluable_from_parsed import evaluable_from_parsed
__all__ = ('synced',)
def synced(source: str) -> EValue:
bsource = transply(source)
parsed = parse(bsource, standard_extension)
parsed = parse(bsource, standard_extensions)
evaluable = evaluable_from_parsed({}, parsed)
return sync(evaluable)