写点什么

Mozilla Sweet.js:用宏扩展 JavaScript

  • 2012-10-23
  • 本文字数:821 字

    阅读完需:约 3 分钟

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:172794
用户头像

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

关注

评论

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

Postman如何做接口测试1:如何导入 swagger 接口文档

和牛

测试

跟一段工作说告别了

wood

300天创作

模块五作业

Geek_e6f7f6

架构训练营

在 Flutter 中发出 HTTP 请求的最佳库(2022 年)

坚果

flutter 1月月更

18款口碑爆棚手机浏览器,被一网打尽了

Jackpop

拆分电商系统为微服务

ren

某反序列化漏洞分析与复现工作

网络安全学海

黑客 网络安全 信息安全 渗透测试 安全漏洞

跟着动画学习GO数据结构之Go链表

宇宙之一粟

数据结构 链表 Go 语言 1月月更

LabVIEW彩色图像分割(基础篇—14)

不脱发的程序猿

机器视觉 图像处理 LabVIEW 图像分割 阈值处理

办公专用!又一款开源免费”摸鱼“神器....

Jackpop

Python

我最终选择VS Code

Jackpop

被忽视的问题:测试环境稳定性治理

老张

测试环境 稳定性治理

log4j bug

你?

架构实战营模块四课后作业

Jude

架构实战营

试论架构师必备的基础能力

陈俊

架构 技术认知

工作方式发生了动荡?

Jackpop

Rust 元宇宙 18 —— 多场所共存的世界

Miracle

rust 元宇宙

LabVIEW色彩匹配实现颜色识别、颜色检验(基础篇—13)

不脱发的程序猿

机器视觉 LabVIEW 颜色识别 颜色检验 色彩匹配

一个cpp协程库的前世今生(十三)互斥量

SkyFire

c++ cocpp

数据库设计三范式

Ayue、

MySQL 1月月更

C#使用原生方法将文字朗读出来

喵叔

1月月更

【网络安全】浅析跨域原理及如何实现跨域

H

网络安全 网络安全信息安全、

模块四作业

Geek_59dec2

全链路压测系列(四):全链路压测的价值是什么?

老张

性能测试 生产环境全链路压测

Go编译原理系列4(语法分析)

书旅

Go 编译 计算机基础 编译原理

【Spring专场】「IOC容器」不看源码就带你认识核心流程以及运作原理

码界西柚

Spring Framework spring ioc 1月月更 框架原理

个人成长中,关于规划设计的思考

程序人生

Failed to load module "canberra-gtk-module"

Ayosh

【日拱一卒进击大厂系列】为什么单线程的Redis可以实现高并发访问

慕枫技术笔记

后端 1月月更

Uber系统架构设计

俞凡

架构 大厂实践 uber

ReactNative进阶(八):connect

No Silver Bullet

React Native Redux 1月月更 connect

Mozilla Sweet.js:用宏扩展JavaScript_JavaScript_Abel Avram_InfoQ精选文章