xx2b, bitwise, b_halve

This commit is contained in:
AF 2021-07-24 14:54:25 +03:00
parent ecdda4f059
commit efc87e30f4
59 changed files with 548 additions and 260 deletions

View File

@ -1,6 +1,8 @@
from bu4.evaluation.proxy import eproxy from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.aftervalue import EValue from bu4.evaluation.constructs.proxy import eproxy
from bu4.toolchain.sync import sync from bu4.evaluation.sync import sync
__all__ = ('to_bool', 'with_common_interface',)
def to_bool(_01): def to_bool(_01):

View File

@ -1,19 +1,8 @@
import abc from bu4.evaluation.targets.avtarget import AVTarget
from typing import Mapping from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.evaluable import Evaluable __all__ = ('AfterValue',)
try:
from typing import TypeAlias
except ImportError:
TypeAlias = type
envtype: TypeAlias = Mapping[bytes, 'AfterValue']
class AVTarget:
def given(self, value: 'EValue') -> Evaluable:
raise NotImplementedError
class AfterValue(Evaluable): class AfterValue(Evaluable):
@ -21,30 +10,22 @@ class AfterValue(Evaluable):
self.evaluable = evaluable self.evaluable = evaluable
self.target = target self.target = target
def next(self) -> 'Evaluable': def next(self) -> Evaluable:
if isinstance(self.evaluable, EValue): if isinstance(self.evaluable, EValue):
if isinstance(self.target, AVAV): if isinstance(self.target, AVChain):
self.evaluable, self.target = self.target.target.given(self.evaluable), self.target.aftertarget self.evaluable, self.target = self.target.target.given(self.evaluable), self.target.aftertarget
return self return self
return self.target.given(self.evaluable) return self.target.given(self.evaluable)
if isinstance(self.evaluable, AfterValue): if isinstance(self.evaluable, AfterValue):
self.evaluable, self.target = self.evaluable.evaluable, AVAV(self.evaluable.target, self.target) self.evaluable, self.target = self.evaluable.evaluable, AVChain(self.evaluable.target, self.target)
self.evaluable = self.evaluable.next() self.evaluable = self.evaluable.next()
return self return self
class AVAV(AVTarget): class AVChain(AVTarget):
def __init__(self, target: AVTarget, aftertarget: AVTarget): def __init__(self, target: AVTarget, aftertarget: AVTarget):
self.target = target self.target = target
self.aftertarget = aftertarget self.aftertarget = aftertarget
def given(self, value: 'EValue') -> Evaluable: def given(self, value: EValue) -> Evaluable:
return AfterValue(self.target.given(value), self.aftertarget) return AfterValue(self.target.given(value), self.aftertarget)
class EValue(Evaluable, abc.ABC):
def next(self) -> 'EValue':
return self
def call(self, argument: Evaluable) -> Evaluable:
raise NotImplementedError

View File

@ -0,0 +1,12 @@
from typing import Mapping
from bu4.evaluation.av.aftervalue import AfterValue
__all__ = ('envtype',)
try:
from typing import TypeAlias
except ImportError:
TypeAlias = type
envtype: TypeAlias = Mapping[bytes, AfterValue]

View File

@ -1,7 +1,11 @@
from typing import Mapping, Iterator from typing import Mapping, Iterator
from bu4.evaluation.avcontainer import AVContainer from bu4.evaluation.av.aftervalue import AfterValue
from bu4.evaluation.aftervalue import AfterValue, envtype, Evaluable from bu4.evaluation.targets.avcontainer import AVContainer
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable
__all__ = ('LambdaEnv',)
class LambdaEnv(Mapping): class LambdaEnv(Mapping):

View File

@ -1,14 +0,0 @@
from bu4.evaluation.elinked import ELinked
from bu4.parsing.linked import Linked
from bu4.evaluation.aftervalue import Evaluable, EValue, AVTarget, envtype
__all__ = ('AVCall',)
class AVCall(AVTarget):
def __init__(self, env: envtype, argument: Linked):
self.env = env
self.argument = argument
def given(self, value: EValue) -> Evaluable:
return value.call(ELinked(self.env, self.argument))

View File

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

View File

@ -1,5 +1,8 @@
from bu4.parsing.linked import Linked from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.aftervalue import Evaluable, envtype from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.parsing.constructs.linked import Linked
__all__ = ('ELinked',)
class ELinked(Evaluable): class ELinked(Evaluable):

View File

@ -1,4 +1,5 @@
from bu4.evaluation.aftervalue import EValue, Evaluable from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
__all__ = ('ENull',) __all__ = ('ENull',)

View File

@ -1,3 +1,6 @@
__all__ = ('Evaluable',)
class Evaluable: class Evaluable:
def next(self) -> 'Evaluable': def next(self) -> 'Evaluable':
raise NotImplementedError raise NotImplementedError

View File

@ -0,0 +1,13 @@
import abc
from bu4.evaluation.constructs.evaluable import Evaluable
__all__ = ('EValue',)
class EValue(Evaluable, abc.ABC):
def next(self) -> 'EValue':
return self
def call(self, argument: Evaluable) -> Evaluable:
raise NotImplementedError

View File

@ -1,7 +1,12 @@
from typing import Any from typing import Any
from bu4.evaluation.aftervalue import AVTarget, EValue, Evaluable, AfterValue from bu4.evaluation.av.aftervalue import AfterValue
from bu4.toolchain.sync import sync from bu4.evaluation.targets.avtarget import AVTarget
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
from bu4.evaluation.sync import sync
__all__ = ('eproxy', 'antiproxy')
class AVProxyCall(AVTarget): class AVProxyCall(AVTarget):

View File

@ -1,4 +1,7 @@
from bu4.evaluation.aftervalue import Evaluable, EValue from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
__all__ = ('sync',)
def sync(evaluable: Evaluable) -> EValue: def sync(evaluable: Evaluable) -> EValue:

14
bu4/evaluation/synced.py Normal file
View File

@ -0,0 +1,14 @@
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.parsing.toolchain.parse import parse
from bu4.parsing.toolchain.transply import transply
__all__ = ('synced',)
def synced(source: str) -> EValue:
bsource = transply(source)
parsed = parse(bsource)
evaluable = evaluable_from_parsed({}, parsed)
return sync(evaluable)

View File

@ -0,0 +1,17 @@
from bu4.evaluation.targets.avtarget import AVTarget
from bu4.evaluation.constructs.elinked import ELinked
from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
from bu4.parsing.constructs.linked import Linked
__all__ = ('AVCall',)
class AVCall(AVTarget):
def __init__(self, env: envtype, argument: Linked):
self.env = env
self.argument = argument
def given(self, value: EValue) -> Evaluable:
return value.call(ELinked(self.env, self.argument))

View File

@ -1,4 +1,9 @@
from bu4.evaluation.aftervalue import EValue, AfterValue, Evaluable, AVTarget from bu4.evaluation.av.aftervalue import AfterValue
from bu4.evaluation.targets.avtarget import AVTarget
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
__all__ = ('AVContainer',)
class AVContainer(AVTarget): class AVContainer(AVTarget):

View File

@ -0,0 +1,9 @@
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.evaluation.constructs.evalue import EValue
__all__ = ('AVTarget',)
class AVTarget:
def given(self, value: EValue) -> Evaluable:
raise NotImplementedError

View File

@ -1,6 +0,0 @@
from bu4.parsing.linked import Linked, LinkingState
class ALTarget:
def given(self, linked: Linked) -> LinkingState:
raise NotImplementedError

View File

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

View File

@ -1,6 +0,0 @@
from bu4.parsing.linked import LinkingState, Linked
class LinkingFinished(LinkingState):
def __init__(self, linked: Linked):
self.linked = linked

View File

@ -1,15 +1,18 @@
from bu4.linking.afterlinking import AfterLinking from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.alal import ALAL from bu4.linking.targets.alchain import ALChain
from bu4.parsing.linked import LinkingState, Linked from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.linkingfinished import LinkingFinished from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.linking.linkingparsed import LinkingParsed from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.linked import Linked
__all__ = ('prepare',)
def _afterlinking_iteration(state: AfterLinking) -> LinkingState: def _afterlinking_iteration(state: AfterLinking) -> LinkingState:
if isinstance(state.state, LinkingFinished): if isinstance(state.state, LinkingFinished):
state = state.target.given(state.state.linked) state = state.target.given(state.state.linked)
elif isinstance(state.state, AfterLinking): elif isinstance(state.state, AfterLinking):
state.state, state.target = state.state.state, ALAL(state.state.target, state.target) state.state, state.target = state.state.state, ALChain(state.state.target, state.target)
elif isinstance(state.state, LinkingParsed): elif isinstance(state.state, LinkingParsed):
state.state = state.state.parsed.link(state.state.promise).link() state.state = state.state.parsed.link(state.state.promise).link()
else: else:

View File

@ -1,5 +1,8 @@
from bu4.linking.altarget import ALTarget from bu4.linking.targets.altarget import ALTarget
from bu4.parsing.linked import LinkingState
__all__ = ('AfterLinking',)
from bu4.linking.states.linkingstate import LinkingState
class AfterLinking(LinkingState): class AfterLinking(LinkingState):

View File

@ -0,0 +1,9 @@
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.linked import Linked
__all__ = ('LinkingFinished',)
class LinkingFinished(LinkingState):
def __init__(self, linked: Linked):
self.linked = linked

View File

@ -1,4 +1,7 @@
from bu4.parsing.linked import LinkingState, Parsed from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.linked import Parsed
__all__ = ('LinkingParsed',)
class LinkingParsed(LinkingState): class LinkingParsed(LinkingState):

View File

@ -0,0 +1,5 @@
__all__ = ('LinkingState',)
class LinkingState:
pass

View File

@ -1,9 +1,12 @@
from bu4.linking.afterlinking import AfterLinking from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.altarget import ALTarget from bu4.linking.targets.altarget import ALTarget
from bu4.parsing.linked import Linked, LinkingState from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.linked import Linked
__all__ = ('ALChain',)
class ALAL(ALTarget): class ALChain(ALTarget):
def __init__(self, target: ALTarget, aftertarget: ALTarget): def __init__(self, target: ALTarget, aftertarget: ALTarget):
self.target = target self.target = target
self.aftertarget = aftertarget self.aftertarget = aftertarget

View File

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

View File

@ -0,0 +1,9 @@
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.constructs.linked import Linked
__all__ = ('ALTarget',)
class ALTarget:
def given(self, linked: Linked) -> LinkingState:
raise NotImplementedError

View File

@ -0,0 +1,6 @@
__all__ = ('AbstractParser',)
class AbstractParser:
def read(self) -> int:
raise NotImplementedError

View File

@ -1,14 +1,17 @@
from bu4.codes import CODE_CALL from bu4.evaluation.av.aftervalue import AfterValue
from bu4.evaluation.avcall import AVCall from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.elinked import ELinked from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.afterlinking import AfterLinking from bu4.parsing.codes import CODE_CALL
from bu4.linking.allambda import ALLambda from bu4.evaluation.targets.avcall import AVCall
from bu4.parsing.linked import Linked, Parsed, LinkingState from bu4.evaluation.constructs.elinked import ELinked
from bu4.linking.linkingfinished import LinkingFinished from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.linkingparsed import LinkingParsed from bu4.linking.targets.allambda import ALLambda
from bu4.evaluation.aftervalue import envtype, Evaluable, AfterValue from bu4.parsing.constructs.linked import Linked, Parsed
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.evaluation.constructs.evaluable import Evaluable
__all__ = ('LCall', 'PCall',) __all__ = ('PCall',)
class LCall(Linked): class LCall(Linked):

View File

@ -1,8 +1,9 @@
from bu4.evaluation.aftervalue import envtype, Evaluable from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.constructs.evaluable import Evaluable
__all__ = ('Linked', 'Parsed',)
class LinkingState: from bu4.linking.states.linkingstate import LinkingState
pass
class Linked: class Linked:

View File

@ -1,13 +1,15 @@
from bu4.codes import CODE_MAKE, CODE_NULL from bu4.evaluation.av.envtype import envtype
from bu4.evaluation.elambda import ELambda from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.afterlinking import AfterLinking from bu4.parsing.codes import CODE_MAKE, CODE_NULL
from bu4.linking.allambda import ALLambda from bu4.evaluation.constructs.elambda import ELambda
from bu4.parsing.linked import Linked, Parsed, LinkingState from bu4.linking.states.afterlinking import AfterLinking
from bu4.linking.linkingfinished import LinkingFinished from bu4.linking.targets.allambda import ALLambda
from bu4.linking.linkingparsed import LinkingParsed from bu4.parsing.constructs.linked import Linked, Parsed
from bu4.evaluation.aftervalue import envtype, Evaluable from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.linking.states.linkingparsed import LinkingParsed
from bu4.evaluation.constructs.evaluable import Evaluable
__all__ = ('LLambda', 'PLambda',) __all__ = ('PLambda',)
class LLambda(Linked): class LLambda(Linked):

View File

@ -1,10 +1,12 @@
from bu4.codes import CODE_NAME, CODE_NULL from bu4.evaluation.av.envtype import envtype
from bu4.parsing.linked import Linked, LinkingState, Parsed from bu4.linking.states.linkingstate import LinkingState
from bu4.linking.linkingfinished import LinkingFinished from bu4.parsing.codes import CODE_NAME, CODE_NULL
from bu4.evaluation.aftervalue import envtype, Evaluable from bu4.parsing.constructs.linked import Linked, Parsed
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.evaluation.constructs.evaluable import Evaluable
__all__ = ('LName', 'PName',) __all__ = ('PName',)
class LName(Linked): class LName(Linked):

View File

@ -0,0 +1,35 @@
from bu4.evaluation.constructs.enull import ENull
from bu4.evaluation.av.envtype import envtype
from bu4.linking.states.linkingstate import LinkingState
from bu4.parsing.codes import CODE_NULL
from bu4.parsing.constructs.linked import Linked, Parsed
from bu4.linking.states.linkingfinished import LinkingFinished
from bu4.evaluation.constructs.evaluable import Evaluable
__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()
def __bytes__(self):
return bytes([CODE_NULL])

View File

@ -1,33 +0,0 @@
from bu4.evaluation.enull import ENull
from bu4.codes import CODE_NULL
from bu4.parsing.linked import Linked, LinkingState, Parsed
from bu4.linking.linkingfinished import LinkingFinished
from bu4.evaluation.aftervalue import envtype, Evaluable
__all__ = ('LNull', '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()
def __bytes__(self):
return bytes([CODE_NULL])

View File

@ -1,86 +1,23 @@
from io import BytesIO from io import BytesIO
from typing import Callable
from bu4.parsing.linked import Parsed from bu4.parsing.abstractparser import AbstractParser
from bu4.parsing.lname import PName from bu4.parsing.codes import *
from bu4.codes import CODE_NULL, CODE_CALL, CODE_MAKE, CODE_NAME, CODE_SKIP, CODE_QUOT, CODE_QOPN, CODE_QCLS from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.lcall import PCall from bu4.parsing.constructs.llambda import PLambda
from bu4.parsing.lnull import PNull from bu4.parsing.constructs.lname import PName
from bu4.parsing.constructs.lnull import PNull
from bu4.parsing.states.psafter import PSAfter
from bu4.parsing.states.pscall import pscall
from bu4.parsing.states.psfinal import PSFinal
from bu4.parsing.states.psread import PSRead
from bu4.parsing.targets.pschain import PSChain
from bu4.parsing.targets.psendswith import PSEndsWith
from bu4.parsing.targets.pslambda import PSLambda
from bu4.parsing.llambda import PLambda __all__ = ('Parser',)
class ParseState: class Parser(AbstractParser):
pass
class PSRead(ParseState):
pass
class PSFinal(ParseState):
def __init__(self, parsed: Parsed):
self.parsed = parsed
class PSATarget:
def given(self, parsed: Parsed) -> ParseState:
raise NotImplementedError
class PSAfter(ParseState):
def __init__(self, state, target: PSATarget):
self.state = state
self.target = target
class PSAA(PSATarget):
def __init__(self, target: PSATarget, aftertarget: PSATarget):
self.target = target
self.aftertarget = aftertarget
def given(self, parsed: Parsed) -> ParseState:
return PSAfter(self.target.given(parsed), self.aftertarget)
class PSALambda(PSATarget):
def __init__(self, lambda_: Callable[[Parsed], ParseState]):
self.lambda_ = lambda_
def given(self, parsed: Parsed) -> ParseState:
return self.lambda_(parsed)
class PSAEndsWith(PSATarget):
def __init__(self, parser: 'Parser', c: int, msg: str):
self.parser = parser
self.c = c
self.msg = msg
def given(self, parsed: Parsed) -> ParseState:
assert self.parser.read() == self.c, self.msg
return PSFinal(parsed)
_apacall = PSAfter(
PSRead(),
PSALambda(
lambda argument: PSAfter(
PSRead(),
PSALambda(
lambda lambda_: PSFinal(
PCall(
argument,
lambda_
)
)
)
)
)
)
class Parser:
def __init__(self, s: bytes): def __init__(self, s: bytes):
self.__s = BytesIO(s) self.__s = BytesIO(s)
@ -101,11 +38,11 @@ class Parser:
if c == CODE_NULL: if c == CODE_NULL:
state.state = PSFinal(PNull()) state.state = PSFinal(PNull())
elif c == CODE_CALL: elif c == CODE_CALL:
state.state = _apacall state.state = pscall
elif c == CODE_MAKE: elif c == CODE_MAKE:
state.state = (lambda name: PSAfter( state.state = (lambda name: PSAfter(
PSRead(), PSRead(),
PSALambda( PSLambda(
lambda value: PSFinal(PLambda(name, value)) lambda value: PSFinal(PLambda(name, value))
) )
))(self.parse_name()) ))(self.parse_name())
@ -114,16 +51,16 @@ class Parser:
elif c == CODE_SKIP: elif c == CODE_SKIP:
pass pass
elif c == CODE_QUOT: elif c == CODE_QUOT:
state.target = PSAA(PSAEndsWith(self, CODE_QUOT, "quot expected"), state.target) state.target = PSChain(PSEndsWith(self, CODE_QUOT, "quot expected"), state.target)
elif c == CODE_QOPN: elif c == CODE_QOPN:
state.target = PSAA(PSAEndsWith(self, CODE_QCLS, "qcls expected"), state.target) state.target = PSChain(PSEndsWith(self, CODE_QCLS, "qcls expected"), state.target)
else: else:
raise ValueError(f"unknown control: {hex(c)}") raise ValueError(f"unknown control: {hex(c)}")
return state return state
def _state_next(self, state: PSAfter): def _state_next(self, state: PSAfter):
if isinstance(state.state, PSAfter): if isinstance(state.state, PSAfter):
state.state, state.target = state.state.state, PSAA(state.state.target, state.target) state.state, state.target = state.state.state, PSChain(state.state.target, state.target)
elif isinstance(state.state, PSFinal): elif isinstance(state.state, PSFinal):
state = state.target.given(state.state.parsed) state = state.target.given(state.state.parsed)
elif isinstance(state.state, PSRead): elif isinstance(state.state, PSRead):
@ -131,7 +68,7 @@ class Parser:
return state return state
def parse(self) -> Parsed: def parse(self) -> Parsed:
state = PSAfter(PSRead(), PSALambda(lambda parsed: PSFinal(parsed))) state = PSAfter(PSRead(), PSLambda(lambda parsed: PSFinal(parsed)))
while True: while True:
if isinstance(state, PSFinal): if isinstance(state, PSFinal):
return state.parsed return state.parsed

View File

@ -0,0 +1,5 @@
__all__ = ('ParseState',)
class ParseState:
pass

View File

@ -0,0 +1,10 @@
from bu4.parsing.states.parsestate import ParseState
from bu4.parsing.targets.pstarget import PSTarget
__all__ = ('PSAfter',)
class PSAfter(ParseState):
def __init__(self, state: ParseState, target: PSTarget):
self.state = state
self.target = target

View File

@ -0,0 +1,24 @@
from bu4.parsing.constructs.lcall import PCall
from bu4.parsing.states.psafter import PSAfter
from bu4.parsing.states.psfinal import PSFinal
from bu4.parsing.targets.pslambda import PSLambda
from bu4.parsing.states.psread import PSRead
__all__ = ('pscall',)
pscall = PSAfter(
PSRead(),
PSLambda(
lambda argument: PSAfter(
PSRead(),
PSLambda(
lambda lambda_: PSFinal(
PCall(
argument,
lambda_
)
)
)
)
)
)

View File

@ -0,0 +1,9 @@
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.states.parsestate import ParseState
__all__ = ('PSFinal',)
class PSFinal(ParseState):
def __init__(self, parsed: Parsed):
self.parsed = parsed

View File

@ -0,0 +1,7 @@
from bu4.parsing.states.parsestate import ParseState
__all__ = ('PSRead',)
class PSRead(ParseState):
pass

View File

@ -0,0 +1,15 @@
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.states.parsestate import ParseState
from bu4.parsing.states.psafter import PSAfter
from bu4.parsing.targets.pstarget import PSTarget
__all__ = ('PSChain',)
class PSChain(PSTarget):
def __init__(self, target: PSTarget, aftertarget: PSTarget):
self.target = target
self.aftertarget = aftertarget
def given(self, parsed: Parsed) -> ParseState:
return PSAfter(self.target.given(parsed), self.aftertarget)

View File

@ -0,0 +1,18 @@
from bu4.parsing.abstractparser import AbstractParser
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.states.parsestate import ParseState
from bu4.parsing.states.psfinal import PSFinal
from bu4.parsing.targets.pstarget import PSTarget
__all__ = ('PSEndsWith',)
class PSEndsWith(PSTarget):
def __init__(self, parser: AbstractParser, c: int, msg: str):
self.parser = parser
self.c = c
self.msg = msg
def given(self, parsed: Parsed) -> ParseState:
assert self.parser.read() == self.c, self.msg
return PSFinal(parsed)

View File

@ -0,0 +1,15 @@
from typing import Callable
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.states.parsestate import ParseState
from bu4.parsing.targets.pstarget import PSTarget
__all__ = ('PSLambda',)
class PSLambda(PSTarget):
def __init__(self, lambda_: Callable[[Parsed], ParseState]):
self.lambda_ = lambda_
def given(self, parsed: Parsed) -> ParseState:
return self.lambda_(parsed)

View File

@ -0,0 +1,9 @@
from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.states.parsestate import ParseState
__all__ = ('PSTarget',)
class PSTarget:
def given(self, parsed: Parsed) -> ParseState:
raise NotImplementedError

View File

@ -1,6 +1,9 @@
from bu4.parsing.linked import Parsed from bu4.parsing.constructs.linked import Parsed
from bu4.parsing.parser import Parser from bu4.parsing.parser import Parser
__all__ = ('parse',)
def parse(source: bytes) -> Parsed: def parse(source: bytes) -> Parsed:
return Parser(source).parse() return Parser(source).parse()

View File

@ -1,13 +1,15 @@
import os import os
from io import StringIO from io import StringIO
__all__ = ('readfile',)
def readfile(path: str) -> str: def readfile(path: str) -> str:
srcio = StringIO() srcio = StringIO()
with open(path + '.bu4') as file: with open(path + '.bu4') as file:
for line in file: for line in file:
if line.startswith('@'): if line.startswith('@'):
srcio.write(readfile(os.path.join(path, '..', line.removeprefix('@').strip()))) srcio.write(readfile(os.path.join(path, os.path.pardir, line.removeprefix('@').strip())))
else: else:
srcio.write(line) srcio.write(line)
return srcio.getvalue() return srcio.getvalue()

View File

@ -1,6 +1,8 @@
from io import BytesIO from io import BytesIO
from bu4.codes import CODE_CALL, CODE_QOPN, CODE_MAKE, CODE_QCLS, CODE_NULL, CODE_SKIP, CODE_NAME, CODE_QUOT from bu4.parsing.codes import *
__all__ = ('transply',)
def transply(source: str) -> bytes: def transply(source: str) -> bytes:

View File

@ -1,10 +0,0 @@
from bu4.evaluation.elinked import ELinked
from bu4.parsing.linked import Parsed
from bu4.evaluation.aftervalue import envtype
from bu4.toolchain.prepare import prepare
def elinked(env: envtype, parsed: Parsed):
linked = parsed.link(set(env))
prepare(linked)
return ELinked(env, linked)

View File

@ -1,12 +0,0 @@
from bu4.evaluation.aftervalue import EValue
from bu4.toolchain.elinked import elinked
from bu4.toolchain.parse import parse
from bu4.toolchain.sync import sync
from bu4.toolchain.transply import transply
def synced(source: str) -> EValue:
bsource = transply(source)
parsed = parse(bsource)
evaluable = elinked({}, parsed)
return sync(evaluable)

15
main.py
View File

@ -1,8 +1,8 @@
from bu4.evaluation.proxy import antiproxy, eproxy from bu4.common_interface import with_common_interface
from bu4.toolchain.readfile import readfile from bu4.evaluation.constructs.proxy import antiproxy, eproxy
from bu4.toolchain.sync import sync from bu4.evaluation.sync import sync
from bu4.toolchain.synced import synced from bu4.evaluation.synced import synced
from bu4.utils import with_common_interface from bu4.parsing.toolchain.readfile import readfile
from timesample import TimeSample from timesample import TimeSample
with TimeSample(' compilation'): with TimeSample(' compilation'):
@ -49,3 +49,8 @@ with TimeSample(' full'):
sys3 = with_common_interface(synced(readfile('src/sys3'))) sys3 = with_common_interface(synced(readfile('src/sys3')))
sys3 = sync(sys3.call(eproxy(5))) sys3 = sync(sys3.call(eproxy(5)))
print(sys3) print(sys3)
with TimeSample(' full'):
sys1 = with_common_interface(synced(readfile('src/sys1')))
sys1 = sync(sys1.call(eproxy(77)))
sys1 = sync(sys1.call(eproxy(194)))
print(sys1)

View File

@ -3,4 +3,5 @@
@binary/@ @binary/@
@convert/@ @convert/@
@io/@ @io/@
@serialization/@
@numbers @numbers

View File

@ -3,3 +3,4 @@
@add @add
@mul @mul
@sub @sub
@bitwise

View File

@ -1,4 +1,5 @@
{ (b) </[b]/[0][b!]> | b_double } { (b) </[b]/[0][b!]> | b_double }
{ (b) </ <(zq)(lb)(hb!) [hb!]> [b]> | b_halve }
{ {
/(b_add) /(b_add)

99
src/binary/bitwise.bu4 Normal file
View File

@ -0,0 +1,99 @@
{
/(b_and)
(bA)(bB)
/(zqA)(lbA)(hb!A)
/
/(zqB)(lbB)(hb!B)
/
/
/[hb!B]/[hb!A][b_and]
/
/[lbB]/[lbA][and]
[b!]
/
[b0]
[zqB]
[bB]
/
[b0]
[zqA]
[bA]
[YC]
|
b_and
}
{
/(b_or)
(bA)(bB)
/(zqA)(lbA)(hb!A)
/
/(zqB)(lbB)(hb!B)
/
/
/[hb!B]/[hb!A][b_or]
/
/[lbB]/[lbA][or]
[b!]
/
[bA]
[zqB]
[bB]
/
[bB]
[zqA]
[bA]
[YC]
|
b_or
}
{
/(b_xor)
(bA)(bB)
/(zqA)(lbA)(hb!A)
/
/(zqB)(lbB)(hb!B)
/
/
/[hb!B]/[hb!A][b_xor]
/
/[lbB]/[lbA][xor]
[b!]
/
[bA]
[zqB]
[bB]
/
[bB]
[zqA]
[bA]
[YC]
|
b_xor
}
{
/(b_exclude)
(bA)(bB)
/(zqA)(lbA)(hb!A)
/
/(zqB)(lbB)(hb!B)
/
/
/[hb!B]/[hb!A][b_exclude]
/
/</[lbB][not]>/[lbA][and]
[b!]
/
[bA]
[zqB]
[bB]
/
[b0]
[zqA]
[bA]
[YC]
|
b_exclude
}

1
src/serialization/@.bu4 Normal file
View File

@ -0,0 +1 @@
@hex

15
src/serialization/hex.bu4 Normal file
View File

@ -0,0 +1,15 @@
{
(b) ////[b][b_double][b_double][b_double][b_double]
|
x16
}
{
{ (higher) (zq)(lb)(hb) / [higher] /[lb][b!] | 2x2b }
{ (higher) (zq)(lb)(hb) ///[higher][2x2b][hb ]/[lb][b!] | 4x2b }
{ (higher) (zq)(lb)(hb) ///[higher][4x2b][hb ]/[lb][b!] | 8x2b }
{ (higher) (zq)(lb)(hb) ///[higher][8x2b][hb ]/[lb][b!] | xx2b }
(lower) (higher) ////[b0][xx2b][higher][xx2b][lower]
|
xx2b
}

15
src/sys1.bu4 Normal file
View File

@ -0,0 +1,15 @@
@@
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
@ci
(a)(b)
/
/
/[b][n_to_bx]
/
/[a][n_to_bx]
[xx2b]
[b_to_nx]
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

View File

@ -1,5 +1,7 @@
import time import time
__all__ = ('TimeSample',)
class TimeSample: class TimeSample:
level = 0 level = 0