Macros for CoffeeScript. Try online: http://f.github.io/macaron/
npm install macaronMacaron has a Grunt plugin written by Ahmet Aygün.
npm install grunt-macaron --save-devPlease read the README file of grunt-macaron for installation instructions.
Create a Macro library:
# macros.coffee
macro.swap = (x, y)->
$tmp = y
y = x
x = $tmpWrite your Coffee using macros like functions:
# main.coffee
x = 1
y = 2
console.log "before: x is #{x}, y is #{y}"
swap x, y
console.log "after: x is #{x}, y is #{y}"Compile them on Terminal ..:
$ macaron macros.coffee main.coffee
before: x is 1, y is 2
after: x is 2, y is 1.. Or in your CoffeeScript Code:
# mycoffee.coffee
Macaron = require 'macaron'
macros = new Macaron
compiledJS = macros.compileFile 'macros.coffee', 'main.coffee', bare: no
console.log compiledJScoffee mycoffee.coffeemacaron [MACROS FILE] [SOURCE FILES...] [COFFEE OPTIONS]It basically replaces the code with the macro code.
// $ macaron examples/macros.coffee examples/source.coffee
var x, y, _tmp$1;
x = 1;
y = 2;
console.log("before swap, x is " + x + ", y is " + y);
// swap x, y macro starts here
_tmp$1 = y;
y = x;
x = _tmp$1;
// ends here
console.log("after swap, x is " + x + ", y is " + y);You can also use code blocks to use efficiently. To do this, just use splats
of CoffeeScript (...)
# Create a macro named do_something which accepts a code block
macro.do_something = (block...)->
hello = "world"
do ->
blockThen you can simply call like a callback
# Call the macro with a code block
do_something ->
console.log helloIt will generate that code:
var hello;
hello = "world";
(function() {
return console.log(hello);
})();You can compose macros.
macro.sayHello = (world)->
hello = "world"
world = "hello"
swap hello, world # Calling Scope Macro
console.log hello, worldReplace macros are so stupid ones, you can just pass the code to replace.
The code won't be parsed by Macaron. To define replace macros, use do keyword.
This macro type doesn't take any parameters since there are no parse process.
macro.strict = do ->
"use strict"You can use do keyword to call these macros:
do strictIt will generate the output:
"use strict";You can keep your variables safe using $ prefix on your variables.
# macros.coffee
macro.swap = (x, y)->
$tmp = y
y = x
x = $tmp# main.coffee
x = 2
y = 3
swap x, y
console.log $tmpWhen you run it, it will generate an error:
ReferenceError: $tmp is not defined
You can always disable hygiene using fat-arrow (=>) or just don't use $ prefix.
macro.swap = (x, y)=> # disabling hygienic variables
$tmp = y
y = x
x = $tmpYou can use Literal macros using literal definition keyword. It takes two arguments,
one is a regular expression, another is the function.
literal /(\w+) is (\w+) plus (\w+)/, (variable, first, second)->
variable = first + second
literal /tell (.*) the (\w+)/, (channel, parameter)->
channel parametersWith these literal macros you can now write some talkative declarations:
"a is 3 plus 4"
"tell console.log the a"It will generate the output:
var a;
a = 3 + 4;
console.log(a);You can wrap matches into quotes using @ (this) prefix on parameters.
literal /tell my (\w+) is (.*)/, (@key, @value)->
user[key] = valueYou can now use the macros easily:
"tell my name is fka" #=> It will be compiled to `user["name"] = "fka"`# macros.coffee
macro.each = (variable, name, eachBlock...)->
value = variable
value.forEach ->
$item = arguments[0]
name = $item
eachBlockUsing this macro:
each [1, 2, 3], item, ->
console.log itemAnd it'll generate that code:
value = [1, 2];
value.forEach(function() {
var item, _item$2;
_item$2 = arguments[0];
item = _item$2;
return console.log(item);
});You can simply use standard input to run macaron:
echo "x = 1; y = 2; swap x, y; console.log x, y" | macaron -scb examples/macros.coffee | nodeUsage: coffee ./bin/macaron [MACRO FILE] [SOURCE FILES...] [OPTIONS]
Options:
-b, --bare [default: true]
-c, --compile [default: false]
--concat [string] [default: true]
- Browserify Transform
MIT: f.mit-license.org
A fork of davidpadbury/stirred-coffee, based on the blog post about it.