Skip to content

Introduction

BuildDSL is a Python superset language inspired by Gradle.

It introduces additional syntactic constructs into the language, such as paren-less function calls, colon keyword arguments, paren-less line-spanning statements without newline escaping and multi-line lambdas (called "closures").

Optionally, a feature can be enabled to allow for dynamic variable name resolution which allows for a concise syntax that does not require prefixing members of the closure target with self.

Example

This might be a bit of a convoluted way to print "Hello, World", but it shows well how closures in BuildDSL work:

# hello.build
world = { self('World!') }
world {
  print('Hello,', self)
}

This transpiles to

# $ python -m builddsl hello.build -E | grep -v -e '^$'
def _closure_1(self, *arguments, **kwarguments):
    self('World!')
world = _closure_1
def _closure_2(self, *arguments, **kwarguments):
    print('Hello,', self)
world(_closure_2)
# $ python -m builddsl hello.build -E -C | grep -v -e '^$'
@__closure__.subclosure
def _closure_1(__closure__, self, *arguments, **kwarguments):
    self('World!')
__closure__['world'] = _closure_1
@__closure__.subclosure
def _closure_2(__closure__, self, *arguments, **kwarguments):
    __closure__['print']('Hello,', self)
__closure__['world'](_closure_2)

And evaluates to

# $ python -m builddsl hello.build
Hello, World!

Note

BuildDSL is not usually designed to be used for standalone scripts, but usually as a configuration language for other systems. It is therefore uncommon to run any production code through python -m builddsl. Code transpiled using dynamic name resolution requires a root closure to be supplied as well, which is not possible via the command-line.

However, the command-line interface is very useful to run quick tests and to inspect what the transpiled version of the code looks like.