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
File details
Details for the file craftr-dsl-0.2.0.tar.gz
.
File metadata
- Download URL: craftr-dsl-0.2.0.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1fa0e31a4ccc88027507f9096a4246e5d4cb8a83d6ce44381816b034c7678d85 |
|
MD5 | 5ee6fb276211fb1d43f0241996b2bd62 |
|
BLAKE2b-256 | bed06c173bb0037917ebfe80d58ab3b33a64f3d92cf3fdd6829af6ef235d3997 |
File details
Details for the file craftr_dsl-0.2.0-py3-none-any.whl
.
File metadata
- Download URL: craftr_dsl-0.2.0-py3-none-any.whl
- Upload date:
- Size: 13.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/3.4.2 importlib_metadata/4.6.3 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.8.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f75586ae349f17d1e6eed6fb93d95eac4debc010d3353eeaf6ae028f631bb0d7 |
|
MD5 | c5b3e9c981cc6d8113dbbe12551dc1e9 |
|
BLAKE2b-256 | 7e5817304babbad25af25abc110adb1ddb0ff7005daad97805b6c602c50fc710 |