爲啥要 sweet.js

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

相關文章
相關標籤/搜索