better linking

This commit is contained in:
AF 2021-08-01 01:17:46 +03:00
parent e06606ed1e
commit 03d46253c5
37 changed files with 239 additions and 240 deletions

View File

@ -5,7 +5,7 @@ from bu4.evaluation.av.lambdaenv import LambdaEnv
from bu4.evaluation.constructs.elinked import ELinked
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
from bu4.parsing.constructs.linked import Linked
from bu4.linking.constructs.linked import Linked
__all__ = ('ELambda',)

View File

@ -2,7 +2,7 @@
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.parsing.constructs.linked import Linked
from bu4.linking.constructs.linked import Linked
__all__ = ('ELinked',)

View File

@ -5,7 +5,7 @@ from bu4.evaluation.constructs.elinked import ELinked
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.targets.avtarget import AVTarget
from bu4.parsing.constructs.linked import Linked
from bu4.linking.constructs.linked import Linked
__all__ = ('AVCall',)

View File

@ -0,0 +1,26 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.aftervalue import AfterValue
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.elinked import ELinked
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.targets.avcall import AVCall
from bu4.linking.constructs.linked import Linked
__all__ = ('LCall',)
class LCall(Linked):
argument: Linked
lambda_: Linked
def __init__(self, argument: Linked, lambda_: Linked):
self.argument = argument
self.lambda_ = lambda_
self.future = self.argument.future | self.lambda_.future
def evaluable(self, env: envtype) -> Evaluable:
return AfterValue(ELinked(env, self.lambda_), AVCall(env, self.argument))
def __str__(self):
return f'/{self.argument}{self.lambda_}'

View File

@ -0,0 +1,13 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable
__all__ = ('Linked',)
class Linked:
future: set[bytes]
def evaluable(self, env: envtype) -> Evaluable:
raise NotImplementedError

View File

@ -0,0 +1,27 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.elambda import ELambda
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.linking.constructs.linked import Linked
__all__ = ('LLambda',)
class LLambda(Linked):
value: Linked
def __init__(self, name: bytes, value: Linked):
self.name = name
self.value = value
self.future = self.value.future - {self.name}
def evaluable(self, env: envtype) -> Evaluable:
return ELambda(
{name: container for name, container in env.items() if name in self.future},
self.name,
self.value
)
def __str__(self):
return f'({self.name.decode()}){self.value}'

View File

@ -0,0 +1,19 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.linking.constructs.linked import Linked
__all__ = ('LName',)
class LName(Linked):
def __init__(self, name: bytes):
self.name = name
self.future = {name}
def evaluable(self, env: envtype) -> Evaluable:
return env[self.name]
def __str__(self):
return f'[{self.name.decode()}]'

View File

@ -0,0 +1,19 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.enull import ENull
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.linking.constructs.linked import Linked
__all__ = ('LNull',)
class LNull(Linked):
def __init__(self):
self.future = set()
def evaluable(self, env: envtype) -> Evaluable:
return ENull()
def __str__(self):
return '?'

View File

@ -3,12 +3,12 @@
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.elinked import ELinked
from bu4.linking.prepare import prepare
from bu4.parsing.constructs.linked import Parsed
__all__ = ('evaluable_from_parsed',)
from bu4.parsing.constructs.parsed import Parsed
def evaluable_from_parsed(env: envtype, parsed: Parsed):
linked = parsed.link(set(env))
prepare(linked)
linked = prepare(parsed.link(set(env)))
return ELinked(env, linked)

View File

@ -5,7 +5,7 @@ from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.alchain import ALChain
from bu4.parsing.constructs.linked import Linked
from bu4.linking.constructs.linked import Linked
__all__ = ('prepare',)
@ -16,14 +16,13 @@ def _afterlinking_iteration(state: AfterLinking) -> LinkingState:
elif isinstance(state.state, AfterLinking):
state.state, state.target = state.state.state, ALChain(state.state.target, state.target)
elif isinstance(state.state, LinkingParsed):
state.state = state.state.parsed.link(state.state.promise).link()
state.state = state.state.parsed.link(state.state.promise)
else:
raise TypeError
return state
def prepare(linked: Linked) -> Linked:
state = linked.link()
def prepare(state: LinkingState) -> Linked:
while True:
if isinstance(state, LinkingFinished):
return state.linked

View File

@ -1,7 +1,7 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.linked import Linked
from bu4.linking.constructs.linked import Linked
__all__ = ('LinkingFinished',)

View File

@ -1,10 +1,11 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.linked import Parsed
__all__ = ('LinkingParsed',)
from bu4.parsing.constructs.parsed import Parsed
class LinkingParsed(LinkingState):
def __init__(self, promise: set[bytes], parsed: Parsed):

View File

@ -1,7 +1,7 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('LinkingState',)
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
class LinkingState:
pass

View File

@ -3,7 +3,7 @@
from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.altarget import ALTarget
from bu4.parsing.constructs.linked import Linked
from bu4.linking.constructs.linked import Linked
__all__ = ('ALChain',)

View File

@ -4,7 +4,7 @@ from typing import Callable
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.altarget import ALTarget
from bu4.parsing.constructs.linked import Linked
from bu4.linking.constructs.linked import Linked
__all__ = ('ALLambda',)

View File

@ -1,7 +1,7 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.linked import Linked
from bu4.linking.constructs.linked import Linked
__all__ = ('ALTarget',)

View File

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

View File

@ -1,61 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.aftervalue import AfterValue
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.elinked import ELinked
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.targets.avcall import AVCall
from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.allambda import ALLambda
from bu4.parsing.constructs.linked import Linked, Parsed
__all__ = ('PCall',)
class LCall(Linked):
argument: Linked
lambda_: Linked
def __init__(self, promise: set[bytes], argument: Parsed, lambda_: Parsed):
self.promise = promise
self._argument = argument
self._lambda = lambda_
def link(self) -> LinkingState:
return AfterLinking(
LinkingParsed(self.promise, self._argument),
ALLambda(self._given_argument)
)
def _given_argument(self, argument: Linked) -> LinkingState:
self.argument = argument
return AfterLinking(
LinkingParsed(self.promise, self._lambda),
ALLambda(self._given_lambda)
)
def _given_lambda(self, lambda_) -> LinkingState:
self.lambda_ = lambda_
self.future = self.argument.future | self.lambda_.future
return LinkingFinished(self)
def evaluable(self, env: envtype) -> Evaluable:
return AfterValue(ELinked(env, self.lambda_), AVCall(env, self.argument))
def __str__(self):
return f'/{self.argument}{self.lambda_}'
def unlink(self) -> Parsed:
return PCall(self._argument, self._lambda)
class PCall(Parsed):
def __init__(self, argument: Parsed, lambda_: Parsed):
self.argument = argument
self.lambda_ = lambda_
def link(self, promise: set[bytes]) -> Linked:
return LCall(promise, self.argument, self.lambda_)

View File

@ -1,26 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable
__all__ = ('Linked', 'Parsed',)
from bu4.linking.states.linkingstate import LinkingState
class Linked:
future: set[bytes]
def link(self) -> LinkingState:
raise NotImplementedError
def evaluable(self, env: envtype) -> Evaluable:
raise NotImplementedError
def unlink(self) -> 'Parsed':
raise NotImplementedError
class Parsed:
def link(self, promise: set[bytes]) -> Linked:
raise NotImplementedError

View File

@ -1,53 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.elambda import ELambda
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.allambda import ALLambda
from bu4.parsing.constructs.linked import Linked, Parsed
__all__ = ('PLambda',)
class LLambda(Linked):
value: Linked
def __init__(self, promise: set[bytes], name: bytes, value: Parsed):
assert name not in promise, f'overloaded: {name}'
self.promise = promise
self.name = name
self._value = value
def link(self) -> LinkingState:
return AfterLinking(LinkingParsed(self.promise | {self.name}, self._value), ALLambda(self._given_value))
def _given_value(self, value: Linked) -> LinkingState:
self.value = value
self.future = self.value.future - {self.name}
return LinkingFinished(self)
def evaluable(self, env: envtype) -> Evaluable:
return ELambda(
{name: container for name, container in env.items() if name in self.future},
self.name,
self.value
)
def __str__(self):
return f'({self.name.decode()}){self.value}'
def unlink(self) -> Parsed:
return PLambda(self.name, self._value)
class PLambda(Parsed):
def __init__(self, name: bytes, value: Parsed):
self.name = name
self.value = value
def link(self, promise: set[bytes]) -> Linked:
return LLambda(promise, self.name, self.value)

View File

@ -1,36 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.linked import Linked, Parsed
__all__ = ('PName',)
class LName(Linked):
def __init__(self, promise: set[bytes], name: bytes):
assert name in promise, f'undefined: {name}'
self.name = name
self.future = {name}
def link(self) -> LinkingState:
return LinkingFinished(self)
def evaluable(self, env: envtype) -> Evaluable:
return env[self.name]
def __str__(self):
return f'[{self.name.decode()}]'
def unlink(self) -> Parsed:
return PName(self.name)
class PName(Parsed):
def __init__(self, name: bytes):
self.name = name
def link(self, promise: set[bytes]) -> Linked:
return LName(promise, self.name)

View File

@ -1,32 +0,0 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.enull import ENull
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.linked import Linked, Parsed
__all__ = ('PNull',)
class LNull(Linked):
def __init__(self):
self.future = set()
def link(self) -> LinkingState:
return LinkingFinished(self)
def evaluable(self, env: envtype) -> Evaluable:
return ENull()
def __str__(self):
return '?'
def unlink(self) -> Parsed:
return PNull()
class PNull(Parsed):
def link(self, promise: set[bytes]) -> Linked:
return LNull()

View File

@ -0,0 +1,10 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('Parsed',)
from bu4.linking.states.linkingstate import LinkingState
class Parsed:
def link(self, promise: set[bytes]) -> LinkingState:
raise NotImplementedError

View File

@ -0,0 +1,30 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('PCall',)
from bu4.linking.constructs.lcall import LCall
from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.allambda import ALLambda
from bu4.parsing.constructs.parsed import Parsed
class PCall(Parsed):
def __init__(self, argument: Parsed, lambda_: Parsed):
self.argument = argument
self.lambda_ = lambda_
def link(self, promise: set[bytes]) -> LinkingState:
return AfterLinking(
LinkingParsed(promise, self.argument),
ALLambda(
lambda argument: AfterLinking(
LinkingParsed(promise, self.lambda_),
ALLambda(
lambda lambda_: LinkingFinished(LCall(argument, lambda_))
)
)
)
)

View File

@ -0,0 +1,32 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('PLambda',)
from bu4.linking.constructs.llambda import LLambda
from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.targets.allambda import ALLambda
from bu4.parsing.constructs.parsed import Parsed
class PLambda(Parsed):
def __init__(self, name: bytes, value: Parsed):
self.name = name
self.value = value
def link(self, promise: set[bytes]) -> LinkingState:
assert self.name not in promise, f'overloaded: {self.name}'
return AfterLinking(
LinkingParsed(
promise | {self.name},
self.value
),
ALLambda(
lambda value: LinkingFinished(LLambda(
self.name,
value
))
)
)

View File

@ -0,0 +1,17 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('PName',)
from bu4.linking.constructs.lname import LName
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.parsed import Parsed
class PName(Parsed):
def __init__(self, name: bytes):
self.name = name
def link(self, promise: set[bytes]) -> LinkingState:
assert self.name in promise, f'undefined: {self.name}'
return LinkingFinished(LName(self.name))

View File

@ -0,0 +1,13 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('PNull',)
from bu4.linking.constructs.lnull import LNull
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.parsed import Parsed
class PNull(Parsed):
def link(self, promise: set[bytes]) -> LinkingState:
return LinkingFinished(LNull())

View File

@ -4,10 +4,10 @@ from io import BytesIO
from bu4.parsing.abstractparser import AbstractParser
from bu4.parsing.codes import *
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.constructs.llambda import PLambda
from bu4.parsing.constructs.lname import PName
from bu4.parsing.constructs.lnull import PNull
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.constructs.plambda import PLambda
from bu4.parsing.constructs.pname import PName
from bu4.parsing.constructs.pnull import PNull
from bu4.parsing.states.parsestate import ParseState
from bu4.parsing.states.psafter import PSAfter
from bu4.parsing.states.pscall import pscall

View File

@ -1,7 +1,7 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
__all__ = ('ParseState',)
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
class ParseState:
pass

View File

@ -1,6 +1,6 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.constructs.lcall import PCall
from bu4.parsing.constructs.pcall import PCall
from bu4.parsing.states.psafter import PSAfter
from bu4.parsing.states.psfinal import PSFinal
from bu4.parsing.states.psread import PSRead

View File

@ -1,6 +1,6 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.states.parsestate import ParseState
__all__ = ('PSFinal',)

View File

@ -1,6 +1,6 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.states.parsestate import ParseState
from bu4.parsing.states.psafter import PSAfter
from bu4.parsing.targets.pstarget import PSTarget

View File

@ -1,7 +1,7 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.abstractparser import AbstractParser
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.states.parsestate import ParseState
from bu4.parsing.states.psfinal import PSFinal
from bu4.parsing.targets.pstarget import PSTarget

View File

@ -2,7 +2,7 @@
from typing import Callable
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.states.parsestate import ParseState
from bu4.parsing.targets.pstarget import PSTarget

View File

@ -1,6 +1,6 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.states.parsestate import ParseState
__all__ = ('PSTarget',)

View File

@ -1,6 +1,6 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.constructs.parsed import Parsed
from bu4.parsing.parser import Parser
__all__ = ('parse',)

View File

@ -1,4 +1,5 @@
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
import random
from bu4.common_interface import with_common_interface