写点什么

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

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

关注

评论

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

Squarespace 和 WordPress 的区别

海拥(haiyong.site)

WordPress 6月月更

Django API 开发:一个 Todo 应用的后端

宇宙之一粟

6月月更

C#入门系列(五) -- 运算符

陈言必行

C# 6月月更

Web Service进阶(三)HTTP-GET, HTTP-POST and SOAP的比较

No Silver Bullet

soap 6月月更 Web Service HTTP-GET HTTP-POST

使用 TensorFlow 和 Express.js 实现AI图像识别

devpoint

tensorflow Express 6月月更

区块链mass哈希競猜dapp游戏开发源代码(多游戏)

开发微hkkf5566

修改gradle脚本,加速spring4.1源码编译构建速度

程序员欣宸

Java spring Gradle 6月月更

关于 SAP Commerce Cloud 的 Sample Setup Github 仓库

汪子熙

typescript angular SAP commerce 6月月更

【盲盒APP】开发功能版块及功能介绍

WDL22119

抖音大举进军电商领域:这步棋应该如何下

石头IT视角

java构造器(构造方法、构造函数)

写代码两年半

面试 javase 构造函数 6月月更

浅谈网络攻防中守方的准备工作

kk冲击波

6月月更 攻防演练

Fabric.js 居中元素 🎗️

德育处主任

fabric canvas FabricJS Fabric.js 6月月更

《WebRTC源码深入剖析》总结

音视频专家-李超

源码分析 音视频 WebRTC 源码剖析

以购物清单为例讲述 Redux 的状态如何在 Flutter 多个组件间共享

岛上码农

flutter 安卓开发 ios 开发 跨平台应用 6月月更

【Spring 学习笔记(四)】Spring Bean 集合注入和自动装配

倔强的牛角

spring Java EE 6月月更

700行无用 纯 CSS 祝考生 金榜高粽《1_bit 的无用 CSS 代码 》

1_bit

CSS html 前端

等你加入|建木开源社区团队成员招募

Jianmu

开源社区 自动化运维 社区运营 志愿者招募

Kubernetes社区发行版:开源容器云OpenShift Origin(OKD)认知

山河已无恙

k8s openshift

Web Service进阶(一)运行原理

No Silver Bullet

6月月更 Web Service 运行原理

Flink on yarn 远程调试源码

JasonLee实时计算

flink

Python环境搭建

芯动大师

Python编程 6月月更 Python环境

EasyRecovery15官方最新版下载功能介绍

茶色酒

EasyRecovery Easyrecovery破解 EasyRecovery15

【LeetCode】数组中第 K 个独一无二的字符串Java题解

Albert

LeetCode 6月月更

JavaScript迭代器

大熊G

JavaScript 前端 6月月更

Linux驱动开发_数码相册项目、360WIFI驱动移植介绍

DS小龙哥

6月月更

Flink 通过 State Processor API 实现状态的读取和写入

JasonLee实时计算

flink

数据库每日一题---第3天:大的国家

知心宝贝

数据库 算法 前端 后端 6月月更

Sentinel与OpenFeign 服务熔断那些事

牧小农

sentinel openfeign

【腾讯云代码分析】五月上新+新功能前瞻

腾源会

学生管理系统架构文档

爱晒太阳的大白

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