Skip to main content

advanced syntax&semantics extension system for Python

Project description

Moshmosh

Build Support codecov

An advanced syntax extension system implemented in pure python.

pip install moshmosh-base

Preview

Working with IPython

You should copy moshmosh_ipy.py to $USER/.ipython/profile_default/startup/.

If this directory does not exist, use command ipython profile create to instantiate.

Some examples about pattern matching, pipelines and quick lambdas:

IPython example 1

Some examples about the scoped operators:

IPython example 2

Working with regular Python files

Import moshmosh in your main module:

Main.py

Then, in mypackage.py, start coding with a pragma comment # moshmosh?, then you can use moshmosh extension system.

Upack.py

Case Study : Pattern Matching

The matching protocol which stems from Python-ideas mailing list is introduced in, which means you can define your own patterns conveniently. The link is here.

# moshmosh?
# +pattern-matching

class GreaterThan:
    def __init__(self, v):
        self.v = v

    def __match__(self, cnt: int, to_match):
        if isinstance(to_match, int) and cnt is 0 and to_match > self.v:
            return () # matched
        # 'return None' indicates 'unmatched'

with match(114, 514):
    if (GreaterThan(42)() and a, b):
        print(b, a)
# 514 114

Note that the matching clauses should be exhaustive, otherwise, a moshmosh.extensions.pattern_matching.runtime.NotExhaustive might get raised.

The supported Patterns are listed here, which is of course much more powerful than most programming languages.

  • And pattern: pat1 and pat2 and pat3 ...
  • Or pattern: pat1 or pat2 or pat3...
  • Pin pattern: pin(value), this is quite useful. See Elixir Pin Operator
  • Literal pattern: 1, "str", 1+2j, (1, 2)
  • As pattern: a, var
  • Wildcard: _
  • Nested patterns:
    • Tuple: (pat1, pat2, pat3), (pat1, *pat2, pat3)
    • List: [pat1, pat2, pat3], [pat1, *pat2, pat3]
    • Recogniser: Cons(pat1, pat2, pat3), note that, the function Cons.__match__(<n arg>, value_to_match) is exact the protocol.

The pattern matching should be more efficient than those hand-written codes without ugly optimizations.

Besides, Moshmosh's pattern matching is orders of magnitude faster than any other alternatives.

Case Study : Template-Python

This is relatively a simple quasiquote implementation, inspired by MetaOCaml. It does not support manual splices or nested quotations, but the function arguments are automatically spliced.

# moshmosh?
# +template-python

@quote
def f(x):
    x + 1
    x = y + 1

from moshmosh.ast_compat import ast
from astpretty import pprint

stmts = f(ast.Name("a"))
pprint(ast.fix_missing_locations(stmts[0]))
pprint(ast.fix_missing_locations(stmts[1]))

# =>
Expr(
    lineno=7,
    col_offset=4,
    value=BinOp(
        lineno=7,
        col_offset=4,
        left=Name(lineno=7, col_offset=4, id='a', ctx=Load()),
        op=Add(),
        right=Num(lineno=7, col_offset=8, n=1),
    ),
)
Assign(
    lineno=8,
    col_offset=4,
    targets=[Name(lineno=8, col_offset=4, id='a', ctx=Store())],
    value=BinOp(
        lineno=8,
        col_offset=8,
        left=Name(lineno=8, col_offset=8, id='y', ctx=Load()),
        op=Add(),
        right=Num(lineno=8, col_offset=12, n=1),
    ),
)

Acknowledgements

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

moshmosh-base-0.3.1.tar.gz (24.4 kB view details)

Uploaded Source

File details

Details for the file moshmosh-base-0.3.1.tar.gz.

File metadata

  • Download URL: moshmosh-base-0.3.1.tar.gz
  • Upload date:
  • Size: 24.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.2.0 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3

File hashes

Hashes for moshmosh-base-0.3.1.tar.gz
Algorithm Hash digest
SHA256 f5792432468a916d3839bf4de9026506df8e8ddfde6f7ef3a714f3e49616c64c
MD5 a0270e9d414dbd58a2352cbd07147e98
BLAKE2b-256 489388d168128894f460de93076315191508cafea406e470b6e71e2f4f7e9fb9

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