Skip to content

Instantly share code, notes, and snippets.

@SimonRichardson
Last active December 30, 2015 04:19
Show Gist options
  • Select an option

  • Save SimonRichardson/7774853 to your computer and use it in GitHub Desktop.

Select an option

Save SimonRichardson/7774853 to your computer and use it in GitHub Desktop.
Sweet.js do notation - (semi-colons are now required)
macro $chain {
case {_ (<-, $x , $do { $block ... } ; $rest ...)} => {
return #{
var $x = function() {
return $do { $block ... }
}();
return function() {
return $do { $rest ... }
}
};
}
case {_ (<-, $x , $m:expr ; return $e:expr)} => {
return #{
return $m.map(function($x) {
return $e
})
};
}
case {_ (<-, $x , $m:expr ; $rest ...)} => {
return #{
return $m.chain(function($x) {
return $do { $rest ... }
});
};
}
case {_ (->, $m , $x:expr ; $rest ...)} => {
return #{
$m = $m.chain($x);
return $do { $rest ... };
};
}
}
macro $map {
case {_ ($x , $e:expr ; return $r:expr)} => {
return #{
var $x = $e;
return function() {
return $r
}()
};
}
case {_ ($x , $e:expr ; $rest ...)} => {
return #{
var $x = $e;
return $do { $rest ... }
};
}
}
macro $do {
case {_ {$x -> $block ...}} => {
return #{
function() {
$chain(->, $x, $block ...);
}();
};
}
case {_ {$x <- $block ...}} => {
return #{
function() {
$chain(<-, $x, $block ...);
}();
};
}
case {_ {$x = $block ...}} => {
return #{
function() {
$map($x, $block ...);
}();
};
}
case {_ {return $x:expr ;}} => {
return #{$x};
}
case {_ {}} => {}
}
var din = $do {
a = getLine();
a -> doSomething;
a -> doSomething;
return a;
}
var fin = $do {
a <- $do {
x <- getLine();
y = 1;
return x + y;
}
b <- getLine();
y = 1;
c <- $do {
x <- getLine();
return x;
}
z = 1;
return a + b + c + y + z;
}
console.log(fin);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment