Sweeten your JavaScript.
Syntax
you now get Term
ctx.next().value
is a Term
instead of a TermOrSyntaxWrapper
RawSyntax
instead of a Syntax
ctx.contextify()
new method instead of .inner()
method on the wrappercompile
now takes a path and loader instead of just the source to compileconsole
/process
added to syntax scope in nodeAnd lot's of bug fixes.
More details in the announcement.
Includes #566 which allows programmatic construction of syntax objects in macros:
syntax to_str = ctx => {
let argStr = ctx.next().value.val();
let dummy = #`here`.get(0);
return #`${dummy.fromString(argStr)}`;
}
let s = to_str foo
// expands to:
// let s = 'foo'
The macro context API has changed. Before you could call ctx.next('expr')
to expand until an expression was matched but now this has been separated out into the expand
method. The expand
method now also understands a lot more grammar productions:
Statement
with alias stmt
AssignmentExpression
with alias expr
Expression
BlockStatement
WhileStatement
IfStatement
ForStatement
SwitchStatement
BreakStatement
ContinueStatement
DebuggerStatement
WithStatement
TryStatement
ThrowStatement
ClassDeclaration
FunctionDeclaration
LabeledStatement
VariableDeclarationStatement
ReturnStatement
ExpressionStatement
YieldExpression
ClassExpression
ArrowExpression
NewExpression
ThisExpression
FunctionExpression
IdentifierExpression
LiteralNumericExpression
LiteralInfinityExpression
LiteralStringExpression
TemplateExpression
LiteralBooleanExpression
LiteralNullExpression
LiteralRegExpExpression
ObjectExpression
ArrayExpression
UnaryExpression
UpdateExpression
BinaryExpression
StaticMemberExpression
ComputedMemberExpression
AssignmentExpression
CompoundAssignmentExpression
ConditionalExpression
In addition, the macro context now has a reset
method that resets the iterator. The interface is now:
TransformerContext = {
name: () -> Syntax
next: () -> {
done: boolean,
value: Syntax
}
expand: (string) -> {
done: boolean,
value: Syntax
}
reset: () -> undefined
}
This is the first release with support for phases!
// log.js
#lang 'sweet.js';
export function log(msg) {
console.log(msg);
}
// main.js
import { log } from './log.js' for syntax;
syntax m = ctx => {
log('doing some Sweet things');
// ...
}
Phasing is currently only supported for modules with the #lang 'sweet.js'
pragma.
More details in the tutorial.