Parser and transpiler for the Craftr DSL.
Project description
craftr-dsl
The Craftr DSL is a transpiler for the Python language that introduces the concept of closures an function calls without parentheses into the language.
Getting started
Installation
From Pip:
$ pip install craftr-dsl
Latest from GitHub:
$ pip install git+https://github.com/craftr-build/craftr-dsl
Requirements: Python 3.8 or newer
Hello, World!
A convoluted Hello, World! example in Craftr DSL might look like this:
# hello.craftr
world = { self('World!') }
world { print('Hello,', self) }
This is transpiled to
# $ python -m craftr.dsl hello.craftr -E | grep -v -e '^$'
def _closure_1(self):
self('World!')
world = _closure_1
def _closure_2(self):
print('Hello,', self)
world(_closure_2)
And evaluates to
# $ python -m craftr.dsl hello.craftr
Hello, World!
Language features
Closures
Closures can define a parameter list and can also have a single expression as their body. Only closures without
a parameter list will receive self
as a default argument.
Craftr DSL | Python |
---|---|
filter({ self % 2 }, range(5))
|
def _closure_1(self):
self % 2
filter(_closure_1, range(5))
|
filter(x -> x % 2, range(5))
|
def _closure_1(x):
return x % 2
filter(_closure_1, range(5))
|
reduce((a, b) -> {
a.append(b * 2)
return a
}, [1, 2, 3], [])
|
def _closure_1(a, b):
a.append(b * 2)
return a
reduce(_closure_1, [1, 2, 3], [])
|
Function calls without parentheses
Such function calls are only supported at the statement level. A function can be called without parentheses by simply omitting them. Variadic and keyword arguments are supported as expected. Applying a closure on an object is basically the same as calling that object with the function, and arguments following the closure are still supported.
Craftr DSL | Python |
---|---|
print 'Hello, World!', file=sys.stderr
|
print('Hello, World!', file=sys.stderr)
|
map {
print('Hello,', self)
}, ['John', 'World']
|
def _closure_1(self):
print('Hello,', self)
map(_closure_1, ['John', 'World'])
|
list(map { # Not allowed inside an expression
print('Hello,', self)
}, ['John', 'World'])
|
craftr.dsl.rewrite.SyntaxError:
in <stdin> at line 1: expected ) but got TokenProxy(Token(type=<Token.Control: 8>, value='{', pos=Cursor(offset=9, line=1, column=9)))
|list(map {
|~~~~~~~~~^
|
Limitations
Craftr DSL is intended to behave as a complete syntactic superset of standard Python. However there are currently some limitations, namely:
- Literal sets cannot be expressed due to the grammar conflict with parameter-less closures
- Type annotations are not currently supported
- The walrus operator is not currently supported
Copyright © 2021 Niklas Rosenstein
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for craftr_dsl-0.2.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f75586ae349f17d1e6eed6fb93d95eac4debc010d3353eeaf6ae028f631bb0d7 |
|
MD5 | c5b3e9c981cc6d8113dbbe12551dc1e9 |
|
BLAKE2b-256 | 7e5817304babbad25af25abc110adb1ddb0ff7005daad97805b6c602c50fc710 |