from http://jlongster.com/Why-sweet.js-Mattersjavascript
(Update Jan. 10, 2014: if you like this post, you should read my much more recent post "Stop Writing JavaScript Compilers! Make Macros Instead")java
最近人们讨论的 sweet.js ,是一个 js 中的宏系统。我纠结是否写这篇文章,由于大多数的支持或者反对的声音过去都已经讨论过啦。无论怎样,此文会覆盖一些新手,宏又是很容易弄混人的东西,因此多点解释老是不错的。git
首先,感谢 Tim Disney 以及 Mozilla 中其余帮助开发了 sweet.js 的人们。忽略长远的意义,它起码是很是有趣而又激动的玩具。es6
宏能扩展语言。宏的实现多种多样,且工做原理各不相同,可是他们都完成了一样的效果:拿一大块代码,展开它转为一种不一样的东西,再返回新的代码。宏在 lisp 系语言中,很是流行,由于它们的语法让宏就像从直觉天然出来的。而其余有不少语法糖的语言让宏的实现特别困难。github
这就是 sweet.js 的伟大之处:他为 js 在理想和现实中找到了一个合适的方法。能够在这里 http://sweetjs.org/ 看些例子。它用了很是特殊的模式匹配语言来表达宏。web
若是你从未用过宏,这和你以前用过的东西是彻底不一样的。当你关注这个项目的时候,记住这一点,给宏一次机会。浏览器
问题来了:咱们为啥要扩展语言呢?ide
在 https://thestrangeloop.com/ 的这年,Brendan Eich 说有些事儿让我认识到了 js 宏的潜能。他说“他但愿宏的成功能解脱他,省的一直操心 js 语法的不足,好去作点其余事儿”。工具
这反应出了 ECMAScript 委员会为了加强 js ,决定加入/介绍一些新语法有多难。并且不能破坏现有的 web 环境,这对 js 来讲更难了。新的改变要同十年前的 js 共同工做。不只如此,浏览器厂商们,还各有心思。改变正龟速的一点点进行着。oop
这就是说 js 和它 10 年前同样被卡在那儿。幸运的是, ES6 ,下一个 js 版原本了,带来了不少好东西。更棒的是,他看起来很快就被批准了,这竟然是真的!
可是看看 10 年来发生的事情吧, js 缓慢的演变步伐几乎停滞,咱们须要其余人的不少工做才能拥抱 es6。并且若是你不喜欢新的 es6 呢?为啥 ESMAScript 委员会不得不决定每一个 js 的细节,这但是使用最普遍的语言啊?
宏让咱们,这些天天写 js 的人,把这门语言定制成本身须要的样子。他让咱们为 js 的演化作出贡献。想象用模式匹配宏在基础的 js 社区和生态以外,扩展出新特性。
例如,一个简单的结构化变量声明功能就会颇有用,可是要等到标准实现,花儿都谢了。若是咱们有宏,咱们能够简单的发布一个库到社区,就是这个我写的宏 https://gist.github.com/3881008 能让你:
varr [x, y, z] = [0, 1, 2]; console.log(x, y, z); // 0 1 2 varr {x, y, z} = {x: 5, y: 6, z: 7}; console.log(x, y, z); // 5 6 7 varr w = 10; console.log(w); // 10
看他的实现:
macro varr { case [$var (,) ...] = $expr => { var i = 0; var arr = $expr; $(var $var = arr[i++];) ... } case {$var (,) ...} = $expr => { var obj = $expr; $(var $var = obj.$var;) ... } case $var:ident = $expr => { var $var = $expr } }
我用 varr 代替简单的 var ,由于 sweet.js 中的一个 bug;将来咱们能够彻底重写关键字。
你可能喷我,由于你能够用预编译的工具的方式来作到。无论怎样,预编译语言和简单的内置宏功能的世界是不一样的。想象能简单的 require('syntax-extensions'); 而后你就能够获取全部的新语法。原生的支持让他更接地气。
民主化语言语法,特别是一些依赖于现有的 js 实现的特性,这是很是伟大的进步。
Discuss on Hacker News https://news.ycombinator.com/item?id=4703288
[1] State of Javascript: http://www.infoq.com/presentations/State-JavaScript