рдЖрдЗрдП
Sweet.js рдХреЛ рджреЗрдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪреНрдЫрддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓рддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдЖрдк рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рдПрдХ рд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдкреЗрдбрд╝ рдХреЛ рдЦреЛрдЬрддреЗ рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдореИрдХреНрд░реЛ рдХреЛ рд▓рдХрдбрд╝реА рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдореИрдХреНрд░реЛ рдХрд╛ рд╢рд░реАрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд▓рдХрдбрд╝реА рдХрд╛ рдпрд╣ рдЯреБрдХрдбрд╝рд╛ рдХреИрд╕реЗ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдкреЗрдбрд╝ рдореЗрдВ рдПрдореНрдмреЗрдбреЗрдб рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЙрд╕реА рд╕реНрдерд╛рди рд╕реЗ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред
Sweet.js рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЯреНрд░реА рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде, рд▓рдЧрднрдЧ рдЯреЛрдХрди рд╕реНрддрд░ рдкрд░, рдиреНрдпреВрдирддрдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдПрдХ рддрд░рдл, рдпрд╣ рдЖрдкрдХреЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╡рд┐рджреЗрд╢реА рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ, рджреВрд╕рд░реА рдУрд░, рдпрд╣ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдорд╛рдирдХ рдПрдПрд╕рдЯреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рдереЗред
рдЪрд▓реЛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ Sweet.js рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
npm install --global sweet.js
рдЙрд╕рдХреЗ рдмрд╛рдж,
sjs
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЙрдкрд▓рдмреНрдз рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЖрдЗрдП рдПрдХ рдореИрдХреНрд░реЛ рд▓рд┐рдЦреЗрдВ рдЬреЛ рджреЛ рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрд╡реИрдк рдХрд░реЗрдЧрд╛, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ
swap.sjs
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ
swap.sjs
:
macro swap { rule { $x , $y } => { var tmp = $x; $x = $y; $y = tmp } } var x = 11; var y = 12; swap x, y; swap y, x;
рдЕрдм, ES5 рд╕рдВрдЧрдд рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд╕ рдЗрд╕реЗ
sjs -r ./swap.sjs
рдХреЛ "рдлреАрдб" рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
var x = 11; var y = 12; var tmp = x; x = y; y = tmp; var tmp$2 = y; y = x; x = tmp$2;
рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╕рдордп Sweet.js рдиреЗ рд╡реИрд░рд┐рдПрдмрд▓ рдирд╛рдо рдЙрддреНрдкрдиреНрди рдХрд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдирд╛рдо рд╕рдВрдШрд░реНрд╖ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ Sweet.js рд╕реНрд╡рдЪреНрдЫрддрд╛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдмреАрдбреАрдбреА рд╢реИрд▓реА рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗред рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
let describe = macro { rule { $name:lit { $body ... } } => { describe($name, function () { $body ... }); } } let it = macro { rule { $name:lit { $body ... } } => { it($name, function () { $body ... }); } } describe "My functionality" { it "works!" { } }
macro name
рдлреЙрд░реНрдо рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдордиреЗ
let name = macro
рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ - рдпрд╣ рдЕрдирдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЛ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐
describe
рдФрд░
it
рдореИрдХреНрд░реЛрдЬрд╝ рдирд╛рдо рдХреЗ рд╕рд╛рде рдЯреЛрдХрди рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, Sweet.js рддрдм рддрдХ рд╕рдВрдмрдВрдзрд┐рдд рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдЬрдм рддрдХ рдХрд┐ рд╕реНрдЯреИрдХ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓рддрд╛ред
let
рдлреЙрд░реНрдо рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рдореИрдХреНрд░реЛ рдирд╛рдо рдХреЗ рд▓рд┐рдП рдмрд╛рдЗрдВрдбрд░реНрд╕ рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛
describe('My functionality', function () { it('works!', function () { }); });
рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
swap
рдореИрдХреНрд░реЛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рд▓рд┐рдЦрд╛ рдерд╛, рдЬреЛ рд╣рдореЗрдВ рд▓реЗрдЦрди рдХреЛрдб рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рд╡рд┐рд╖рдп рдХреНрд╖реЗрддреНрд░ рдХреЗ рдХрд░реАрдм рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рдФрд░ рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдореИрдХреНрд░реЛ рдХреЗ рд╕реЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдЪреВрдВрдХрд┐ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдкрд╛рд╕ рдХреЛрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдмрдпрд╛рдиреЛрдВ рдХреА рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рддреНрдордХ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдмрдпрд╛рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ Sweet.js рдЖрдкрдХреЛ infix macros рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдпрд╣ рд╕рдм рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛? рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ:
2 + 2 should == 4 "aabbcc" should contain "bb" [1, 2] should be truthy xy() should throw
рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдПрдХ рдЕрд╕рдлрд▓ рдмрдпрд╛рди рдХреЗ рд╕рд╛рде, рдореИрдВ рдПрдХ рд╕реВрдЪрдирд╛рддреНрдордХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рди рдХреЗрд╡рд▓
undefined has no method x
рдХреА рд╢реИрд▓реА рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЪрд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛,
undefined has no method x
, рд▓реЗрдХрд┐рди рдЖрдЙрдЯрдкреБрдЯ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реБрдЖред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
2 + 2 should == 5
рдХрд╛ рдкрд░рд┐рдгрд╛рдо рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ
2 + 2 should be equal to 5
ред
рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдореИрдХреНрд░реЛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдХрд┐рд╕реА рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХреА рдПрдХ рд▓рд╛рдЗрди рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ - "рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреА рддрд░рд╣, рдмрд╕ рд╡рд┐рдкрд░реАрддред" рд╣рдореЗрдВ рд╕реВрдЪрдирд╛рддреНрдордХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
macro fmt { case { _ ( $val:expr ) } => { function fmt(v) { return v.map(function(x){ return x.token.inner ? x.token.value[0] + fmt(x.token.inner) + x.token.value[1] : x.token.value; }).join(''); } return [makeValue('`' + fmt(#{$val}) + '`', #{here})]; } }
рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрд╣ рдореИрдХреНрд░реЛ рдПрдХ рдХреЗрд╕ рдореИрдХреНрд░реЛ рд╣реИред рдирд┐рдпрдо рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╡рд┐рдкрд░реАрдд рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛, рдХреЗрд╕ рдореИрдХреНрд░реЛрдЬрд╝ рдЖрдкрдХреЛ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рд╕рднреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдореИрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдореИрдХреНрд░реЛ рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпреЛрдЬрдирд╛ рдпрд╣ рд╣реИ - рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди
fmt
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдкреЗрдбрд╝ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдХреЛрдб рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдПрдХ рдФрд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдЯреНрд░реА рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рдиреЛрдб рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдореИрдХреНрд░реЛ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╡рд╛рдкрд╕ рдХрд░ рджреЗрддрд╛ рд╣реИред
fmt(1 + 1)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдПрдХ рдзрдорд╛рдХреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИред
fmt
рдореИрдХреНрд░реЛ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрдирд╛ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рддрд╛ рд╣реИред
рдЕрдм рд╣рдо рдмрдпрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреА рдкреНрд░рддреНрдпрдХреНрд╖ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВред рд╣рдо рдмрдпрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ Node.js рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ
assert
рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рдпрдВ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдмрд╕ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред
var assert = require('assert'); macro should { rule infix { $lhs:expr | == $rhs:expr } => { assert.deepEqual( $lhs, $rhs, fmt($lhs) + " should be equal to " + fmt($rhs)); } rule infix { $lhs:expr | be truthy } => { assert.ok( $lhs, fmt($lhs) + " should be truthy"); } rule infix { $lhs:expr | contain $rhs } => { assert.ok( $lhs.indexOf($rhs) > -1, fmt($lhs) + " should contain " + fmt($rhs)); } rule infix { $lhs:expr | throw } => { assert.throws( function() { $lhs }, Error, fmt($lhs) + " should throw"); } }
рд╣рдордиреЗ infix рдирд┐рдпрдореЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
rule infix
рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ, рдкреНрд░рддреАрдХ
|
рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдореИрдХреНрд░реЛ рдирд╛рдо рдХрд╛ рдкреНрд░рддреАрдХ рдХрд╣рд╛рдБ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ
should
ред
рдЕрдм рджрд╛рд╡реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ
2 + 2 should == 4 "aabbcc" should contain "bb" [1, 2] should be truthy xy() should throw
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд ES5 рдорд╛рдиреНрдп рдХреЛрдб рдореЗрдВ рдкреНрд░рдХрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛
var assert = require('assert'); assert.deepEqual(2 + 2, 4, '`2+2`' + ' should be equal to ' + '`4`'); assert.ok('aabbcc'.indexOf('bb') > -1, '`aabbcc`' + ' should contain ' + '`bb`'); assert.ok([ 1, 2 ], '`[1,2]`' + ' should be truthy'); assert.throws(function () { xy(); }, Error, '`xy()`' + ' should throw');
рдХрд╛рд░реНрдп рдкреВрд░рд╛ рд╣реБрдЖ! рдЕрдм рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдореИрдХреНрд░реЛрдЬрд╝ рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдХреБрдЫ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдпрд╛ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╕рднреА рдореИрдХреНрд░реЛрдЬрд╝ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдерд╛ (рдФрд░ рдереЛрдбрд╝рд╛ рдФрд░ рднреА) npm рдФрд░ github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:
рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ npm рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
% npm install --global mocha sweet.js % npm install sweet-bdd sweet-assertions
рдФрд░ рдлрд┐рд░ рдХреЛрдб рдХрд╛ рд╕рдВрдХрд▓рди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ
describe "additions" { it "works" { 2 + 2 should == 4 } }
рдирд┐рдореНрди рдЖрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
% sjs -m sweet-bdd -m sweet-assertions ./specs.sjs > specs.js % mocha specs.js
рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рд╕рд╛рде
рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдп рднреА npm рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдореИрдВ
рд╕реНрдкрд╛рд░реНрдХрд▓рд░ рдкрд░ рдЙрджрд╛рд╣рд░рдг рдХреА рддрд▓рд╛рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдкреИрдЯрд░реНрди (рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди) рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ:
function myPatterns {
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдпрд╛, рдЬреЛ рд╢рд░реНрдореАрд▓реА рд╣реИ, рдореБрдЭреЗ
рдИрдореЗрд▓ рднреЗрдЬреЗрдВред
рдЕрджреНрдпрддрдиред рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ Sweet.js рдореЗрдВ рд╕реНрд░реЛрдд рдорд╛рдирдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбрд┐рдмрдЧрд┐рдВрдЧ (рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо) рдХреЗ рд╕рд╛рде рдХреЛрдИ рдХрдард┐рдирд╛рдИ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред