写点什么

Mozilla Sweet.js:用宏扩展 JavaScript

2012 年 10 月 23 日

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 )关注我们,并与我们的编辑和其他读者朋友交流。

2012 年 10 月 23 日 07:172005
用户头像

发布了 27 篇内容, 共 67751 次阅读, 收获喜欢 3 次。

关注

评论

发布
暂无评论
发现更多内容

领域驱动设计DDD

积极&丧

《爱奇艺安全应急响应中心漏洞评分标准2021》来了

爱奇艺技术产品团队

安全 安全漏洞

架构师训练营第五周课后作业

万有引力

Angel推荐算法在游戏推荐中的应用

DataFunTalk

学习

Mybatis【7】-- Mybatis如何知道增删改是否成功执行?

秦怀杂货店

Java mybatis

浅谈优秀工程师的成长因素

数据社

程序员 七日更

附PPT丨广东移动智慧中台能力运营实践

dbaplus社群

中台 中台战略

LeetCode题解:42. 接雨水,双指针,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

附PPT丨如何构建数据库容器化PaaS

dbaplus社群

数据库 容器化

explicit_defaults_for_timestamp 参数详解

Simon

MySQL 七日更

区块链发展的3个必经阶段究竟是什么

CECBC区块链专委会

去中心化

“区块链+”产业生态雏形已现 安全监管逐步完善

CECBC区块链专委会

区块链 区块链生态

架构师入门感悟之十

莫问

Android开发全套学习!不同层级的Android开发者的不同行为,学习路线+知识点梳理

欢喜学安卓

android 程序员 面试 移动开发

Mybatis【8】-- Mybatis返回List或者Map以及模糊查询怎么搞?

秦怀杂货店

Java mybatis

字节跳动自研「BVC2.0」视频编码器在 MSU 2020 中获得四项第一

字节跳动技术团队

字节跳动 视频编码

字节跳动开源云原生机器学习平台 Klever

字节跳动技术团队

学习 字节跳动

恐怖:这份Github神仙面试笔记,简直把所有Java知识面试题写出来了

Crud的程序员

Java 架构师 java程序员 java基础

安卓开发快速学习!一个小例子彻底搞懂Android的MVP模式到底是什么?面试必问

欢喜学安卓

android 程序员 面试 移动开发

毕业三年,如何达到月薪30K?我想跟你聊聊!!

冰河

程序员 程序人生 架构师 升职加薪 提升自我

记一次由Arthas引起的Metaspace OOM问题

闲鱼技术

Java 阿里巴巴

星环科技助力商业银行机器学习平台建设

星环科技

FinTech

爱奇艺用户分析平台实践:TB级数据查询秒级返回

dbaplus社群

大数据

JustSwap交易所系统APP开发|JustSwap交易所软件开发

开發I852946OIIO

系统开发

一直在云上的星空联盟,“真”上云了

亚马逊AWS官方博客

云计算 AWS

Github标星5.3K,网易云的朋友给我这份339页的Android面经,附赠课程+题库

欢喜学安卓

android 程序员 面试 移动开发

Lambda【1】-- List相关Lambda表达式使用(上篇)

秦怀杂货店

Java Lambda

如何使用数据仓库?

数据社

数据仓库 七日更

第五周作业

ty

反垄断之下 区块链迎来新生?

CECBC区块链专委会

区块链

开一个世界末日的脑洞

熊斌

我的世界 生活记录 七日更

Mozilla Sweet.js:用宏扩展JavaScript-InfoQ