Mozilla Sweet.js:用宏扩展 JavaScript

阅读数:1562 2012 年 10 月 23 日

话题:JavaScriptMozilla语言 & 开发

Mozilla Sweet.js使开发人员能够通过使用宏在语言中添加新的语法以丰富 JavaScript。这有助于开发者们为自己的风格定制 JavaScript 语法,或是为他们的空白领域,创建基于 JavaScript 的领域专用语言来扩展 JavaScript。

受到 Scheme 和 Rust 的启发,Sweet.js 使我们可以使用 macro 关键字定义卫生宏。这个例子用更简短的 def 替换了 function 关键字:

macro def {
  case $name:ident $params $body => {
    function $name $params $body
  }
}

现在,能够用 def 来定义函数了:

def add (a, b) {
  return a + b;
}

另一个更为有趣的示例介绍了 class 关键字:

macro class {
  case $className:ident { 
    constructor $constParam $constBody
    $($methodName:ident $methodParam $methodBody) ... } => {

    function $className $constParam $constBody

    $($className.prototype.$methodName 
      = function $methodName $methodParam $methodBody; ) ...
  }
}

class 使用示例:

class Person {
  constructor(name) {
    this.name = name;
  }

  say(msg) {
    console.log(this.name + " says: " + msg);
  }
}
var bob = new Person("Bob");
bob.say("Macros are sweet!");

更多宏相关示例可在 GitHub 上 Mozilla/Sweet.js 项目的 wiki 中找到,那里还能下到基于 BSD 许可证的源代码

包含宏的 Sweet.js 文件将通过sjs编译成纯 JavaScript 文件,无需使用任何额外的语法。require-sweet提供了AMD 加载器SweetJS gem用于从 Ruby 编译 Sweet.js 文件。

Sweet.js 目前支持声明式的宏定义,然而据 Mozilla 研究所的 Tim Disney 所说,计划将要支持命令式的定义。这意味着宏可以包含编译时运行的任意 JavaScript 代码。

查看英文原文Mozilla Sweet.js: Extending JavaScript with Macros


感谢崔康对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。