Skip to main content

Python S-expression emulation using tuple-like objects.

Project description

etuples

Build Status Coverage Status PyPI

Python S-expression emulation using tuple-like objects.

Examples

etuples are like tuples:

>>> from operator import add
>>> from etuples import etuple, etuplize

>>> et = etuple(add, 1, 2)
>>> et
ExpressionTuple((<built-in function add>, 1, 2))

>>> from IPython.lib.pretty import pprint
>>> pprint(et)
e(<function _operator.add(a, b, /)>, 1, 2)

>>> et[0:2]
ExpressionTuple((<built-in function add>, 1))

etuples can also be evaluated:

>>> et.eval_obj
3

Evaluated etuples are cached:

>>> et = etuple(add, "a", "b")
>>> et.eval_obj
'ab'

>>> et.eval_obj is et.eval_obj
True

Reconstructed etuples and their evaluation results are preserved across tuple operations:

>>> et_new = (et[0],) + et[1:]
>>> et_new is et
True
>>> et_new.eval_obj is et.eval_obj
True

rator, rands, and apply will return the operator, the operands, and apply the operation to the operands:

>>> from etuples import rator, rands, apply
>>> et = etuple(add, 1, 2)

>>> rator(et)
<built-in function add>

>>> rands(et)
ExpressionTuple((1, 2))

>>> apply(rator(et), rands(et))
3

rator and rands are multipledispatch functions that can be extended to handle arbitrary objects:

from etuples.core import ExpressionTuple
from collections.abc import Sequence


class Node:
    def __init__(self, rator, rands):
        self.rator, self.rands = rator, rands

    def __eq__(self, other):
        return self.rator == other.rator and self.rands == other.rands


class Operator:
    def __init__(self, op_name):
        self.op_name = op_name

    def __call__(self, *args):
        return Node(Operator(self.op_name), args)

    def __repr__(self):
        return self.op_name

    def __eq__(self, other):
        return self.op_name == other.op_name


rands.add((Node,), lambda x: x.rands)
rator.add((Node,), lambda x: x.rator)


@apply.register(Operator, (Sequence, ExpressionTuple))
def apply_Operator(rator, rands):
    return Node(rator, rands)
>>> mul_op, add_op = Operator("*"), Operator("+")
>>> mul_node = Node(mul_op, [1, 2])
>>> add_node = Node(add_op, [mul_node, 3])

etuplize will convert non-tuple objects into their corresponding etuple form:

>>> et = etuplize(add_node)
>>> pprint(et)
e(+, e(*, 1, 2), 3)

>>> et.eval_obj is add_node
True

etuplize can also do shallow object-to-etuple conversions:

>>> et = etuplize(add_node, shallow=True)
>>> pprint(et)
e(+, <__main__.Node at 0x7f347361a080>, 3)

Installation

Using pip:

pip install etuples

To install from source:

git clone git@github.com:pythological/etuples.git
cd etuples
pip install -r requirements.txt

Tests can be run with the provided Makefile:

make check

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

etuples-0.1.3.tar.gz (22.0 kB view details)

Uploaded Source

Built Distribution

etuples-0.1.3-py3-none-any.whl (10.9 kB view details)

Uploaded Python 3

File details

Details for the file etuples-0.1.3.tar.gz.

File metadata

  • Download URL: etuples-0.1.3.tar.gz
  • Upload date:
  • Size: 22.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0.post20200127 requests-toolbelt/0.9.1 tqdm/4.42.0 CPython/3.7.6

File hashes

Hashes for etuples-0.1.3.tar.gz
Algorithm Hash digest
SHA256 52624c217f0eab84d400d0c08a20d2325c320f8956eb5267e2fd31f91e30f1ba
MD5 2cfee5d89bbfc0a157d0706ac6d984dd
BLAKE2b-256 0d96953bd9837efbac25d026eca9944648eb9dd68c4fca1e6268f947fa3b9384

See more details on using hashes here.

Provenance

File details

Details for the file etuples-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: etuples-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 10.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/45.1.0.post20200127 requests-toolbelt/0.9.1 tqdm/4.42.0 CPython/3.7.6

File hashes

Hashes for etuples-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 c96381f1dd81bb2ac55ab422ccf620556f432d40446d479fdcda0adef0035119
MD5 30c80d8eaaa0de74bb3693fd339b07ea
BLAKE2b-256 27fa2ebc03d1fe48d21f5bfbfafbd31b47f03cdb3a5a34e6a3eb290fef47d759

See more details on using hashes here.

Provenance

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page