coffee-subscript
Version:
Integration between CoffeeScript and arbitrary DSL-s that compile to JavaScript
75 lines (46 loc) • 2.09 kB
Markdown
CoffeeSubscript is like
[CoffeeScript](http://jashkenas.github.com/coffee-script/) but enabling you to
embed DSL fragments in your source code. For instance
console.info «(2=+⌿0=A∘.∣A)/A←⍳100»
computes the first few primes using an APL one-liner. Guillemets (`«»`) mark
an embedded piece of a DSL.
Alternatively, you can use the squiggly arrow (`~>`) to create a function whose
body consists of DSL code:
countDown = ~>
a ← ⍳ 10
1 + ⌽ a
console.info countDown() # prints [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
# Installation and usage
npm install coffee-subscript -g
This will provide the `coffee-subscript` command which mimics the same options
as the `coffee` command. For instance:
coffee-subscript -c path/to/script.coffee
would compile a script peppered with DSL chunks.
To specify a custom DSL handler use the -d or --dsl command line option:
coffee-subscript -d jsedn -c path/to/script.coffee
would compile a script using jsedn as the DSL compiler.
# How it works
CoffeeSubscript is a preprocessor. Actual compilation of CoffeeScript code is
handled by the CoffeeScript compiler itself. DSL fragments are, of course,
compiled by their respective compilers.
# For DSL developers
We need your module to be usable like this:
var jsCode = require('yourModule').compile(dslCode, opts);
The `jsCode` you return will be wrapped in
* `(function () {...})()` in the case of `«»` syntax
* `(function () {...})` in the case of `~>` syntax
The `opts` we supply are:
* `embedded`: always `true`
* `kind`: either `"expression"` (for `«»` syntax) or `"function"` (for `~>`
syntax). Note that in both cases you should have a `return` statement in
your output.
* `line`, `column`: the position in the original source where DSL code
begins
* `vars`: a list of dictionaries describing variables in enclosing scopes,
e.g. for this piece of code
a = 123
b = (c) ->
d = 'bar'
«...»
you will get
[{"name": "a"}, {"name": "b"}, {"name": "c"}, {"name": "d"}]