产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

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

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

关注

评论

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

翻译:《实用的Python编程》01_05_Lists

codists

人工智能 后端 python 爬虫 列表 数据结构与算法

1.开篇(听说你还在艰难的啃react源码)

全栈潇晨

React React Hooks react源码

【STM32】PWM 输出 (标准库)

AXYZdong

硬件 stm32 2月春节不断更

第一次异地过年有感

石君

思考 情感

微信红包封面,2021年为啥突然火了?

架构精进之路

春节 微信红包封面 商业洞察

13. 如果自己写的 Python 程序出错了,怎么办?

梦想橡皮擦

python 爬虫 2月春节不断更

ElasticSearch.03 - 基本原理

insight

elasticsearch 2月春节不断更

揭秘登上2021春晚舞台的黑科技-XR技术

架构精进之路

黑科技 vr 春晚 XR MR

给hugo博客添加评论功能

远鹏

Hugo 静态博客 utterances

春节快过腻了?不妨关心下太空探索

脑极体

EternalWallet为您提供快速、便捷、低价的国际汇款服务

Geek_c610c0

诊所数字化:诊所老板为什么拒绝预约制?

boshi

数字化转型 医院 七日更

【LeetCode】数组拆分Java题解

Albert

算法 LeetCode 2月春节不断更

写公号大半年,看看我都收获了些啥

架构精进之路

技术 总结 微信公众号 成长笔记

2.react心智模型(来来来,让大脑有react思维吧)

全栈潇晨

React React Hooks react源码

IDEA插件:快速删除Java代码中的注释

xiaoxi666

Java 代码注释 JavaParser

深度讲解背包问题:面试中每五道动态规划就有一道是背包模型 ...

宫水三叶的刷题日记

深度思考 面试 LeetCode 动态规划 数据结构与算法

【活动回顾】4步2小时,搭建爆火的语音聊天室

ZEGO即构

开发利器——C语言必备实用第三方库

码哥比特

c c++ Linux 后端 框架

C语言实用第三方库Melon开箱即用之多线程模型

码哥比特

c c++ Linux 后端 框架

日记 2021年2月17日(周三)

Changing Lin

2月春节不断更

gradle中的增量构建

程序那些事

maven Gradle 程序那些事 构建工具

第四章作业-编写一个用例文档

秦挺

3.Fiber(我是在内存中的dom)

全栈潇晨

React React Hooks react源码

数据量大读写缓慢如何优化(5)【读缓存】

我爱娃哈哈😍

redis 缓存 架构设计实战 缓存设计

1480. 一维数组的动态和

小马哥

算法 七日更

C语言第三方库Melon开箱即用之词法分析器使用

码哥比特

c c++ Linux 后端 框架

消息队列Kafka:入门基础

正向成长

kafka

程序员成长第五篇:如何选择城市工作?

石云升

程序员 2月春节不断更 选择城市

今日笔记

Nydia

这是我的第一次JavaScript初级技巧

我是哪吒

JavaScript 学习 程序员 大前端 2月春节不断更

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