50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

LispyScript:让 JavaScript 支持宏!

  • 2015-06-11
  • 本文字数:1215 字

    阅读完需:约 4 分钟

与其它类 Lisp 语言不同,不支持宏是 JavaScript 与生俱来的一个问题,这是因为宏会在编译时操作语法树,而这在像 JavaScript 这样的语言中几乎是不可能的。 LispyScript 是一种采用 Lispy 语法、支持宏的 JavaScript 实现。

在 LispyScript 中,开发者以树形结构编写 JavaScript 代码。只要了解 JavaScript 和类 Lisp 语言,就可以轻松使用 LispyScript。即使不了解类 Lisp 语言,也只需要学习如何以树形结构编写代码。

下面是 LispyScript 中 Hello World 的示例代码:

复制代码
(console.log "Hello LispyScript!")

如上所示,LispyScript 由括号中的表达式组成。表达式的第一个元素是一个函数或者 LispyScript 关键字。由空格分割的其它元素为函数的参数。可以看出,LispyScript 可以直接使用 JavaScript 函数。所有的 JavaScript 函数、对象和常量都可以用在 LispyScript 中。

Lispy 宏语法如下:

复制代码
(macro name (arguments expression) (template expression))

开发者可以通过往代码中增加宏来扩展 LispyScript。比如,下面的代码可以为 LispyScript 增加类似 JavaScript console.log 函数的 print 表达式:

复制代码
(macro print (str rest...) (console.log ~str ~rest...))

下面是该宏的其中两种调用方式:

复制代码
(print "Hello print macro!")
(print "2 + 2 = %d" (+ 2 2))

这就是宏的强大之处。开发者可以对语言本身进行扩展,或者创建自己的领域专属语言。

除了支持宏外,LispyScript 还支持如下特性:

  • 尾调用优化;
  • 回调序列:避免嵌套回调;
  • Monads:允许开发者分步处理数据;
  • 服务器端和浏览器端 REPL;
  • 内置测试特性:允许开发者在开发过程中测试代码。

LispyScript 0.3.0 及更高版本仅支持 IE9 及更高版本。但编译生成的 JavaScript 代码兼容所有的现代浏览器。LispyScript 可以直接在浏览器中运行。不过,其运行速度要逊于加载服务器预编译生成的 JavaScript。

有关 LispyScript 的更多信息,请查看项目文档 GitHub 页面

下面是 Hacker News 上的一些观点

网友 grayrest 指出,JavaScript 不是没有宏支持,而只是没有原生宏支持, sweet.js 就是证明。但 sweet.js 出现的时间要晚一些。aidenn0 提到了 Parenscript 。该项目通过 Common Lisp 为 JavaScript 提供宏功能。breuleux 提到了 Earl Grey 项目。他指出,该项目的宏系统是模块化的,宏库的编写和发布非常方便。同时,他认为,类 Lisp 语法并不是宏系统必须的。evmar 则自己维护着一个非常相似的项目。讨论还提到了其它项目,如 spock Sibilant 等。

另外,lispm 认为,LispyScript 的函数、宏和语法都不像 Lisp,而更像 Clojure 。gjm11 也有类似观点,认为 LispyScript 与 Lisp 的关系正如 JavaScript 与 Java 的关系,它们是完全不同的语言。


感谢魏星对本文的审校。

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

2015-06-11 04:333290
用户头像

发布了 1008 篇内容, 共 441.5 次阅读, 收获喜欢 346 次。

关注

评论

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

如何设计企业特色的数字化转型架构?

博文视点Broadview

深入分析3种线程池执行任务的逻辑方法

华为云开发者联盟

Java 线程 线程池 ThreadPoolExecutor类

如何采购ARM六核RK3399安卓工控开发主板?

双赞工控

安卓主板 工控主板 rk3399主板

携手伙伴,共赴星海-百度飞桨应急行业AI私享会成功举办

百度大脑

人工智能 飞桨

一周信创舆情观察(8.23~8.29)

统小信uos

❤️用武侠小说的形式来阅读LinkedList的源码,绝了!

沉默王二

Java

华为云IoT如何连接边缘和云,实现海量IoT数据就地处理的技术实践

华为云开发者联盟

IoT 边缘 IoT边缘 实时数据 IoT Edge

企业级即时通信市场能否告别“孤岛时代”?

BeeWorks

移动数字化底座 企业即时通讯平台 移动数字化平台 即时通讯IM 移动办公

拥抱开源,云智慧发布AIOps社区

BeeWorks

阅读

华为云PB级数据库GaussDB(for Redis)揭秘:如何搞定推荐系统存储难题

华为云开发者联盟

数据库 推荐系统 存储 华为云 GaussDB(for Redis)

柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户

北京好雨科技有限公司

云原生 需求落地 离线部署 可持续交付

浪潮云说丨上云迁移——快,准,稳!

云计算

国资云横空出世,云上安全监管再加码

行云管家

云计算 数据安全 企业上云 国资云

服务器运维是什么意思?日常工作包含哪些?

行云管家

运维 服务器 IT运维 服务器运维

再启动!零代码第四期训练营报名开放中

明道云

netty系列之:搭建自己的下载文件服务器

程序那些事

Java Netty io nio 程序那些事

IDC:2021年全球大数据和分析支出预计达2157亿美元

BeeWorks

阅读

全球教育行业机构遭受的攻击增长了 29%

BeeWorks

阅读

架构学习模块一

George

就靠这一篇文章,我就弄懂了 Python Django 的 django-admin 命令行工具集

梦想橡皮擦

9月日更

波场链DAPP智能合约系统搭建|波场链DAPP开发

Geek_23f0c3

DAPP智能合约交易系统开发 波场DAPP 波场链DAPP开发

API与ESB 、ServiceMesh、微服务究竟关系如何?

BoCloud博云

云管理

第一波场DAPP系统搭建,DAPP介绍

合肥艾数199四②43⑧797

敏捷团队的最佳测试实践:自动化金字塔

禅道项目管理

测试 自动化测试

Dogfooding-爱奇艺移动端后台灰度环境优化实践

爱奇艺技术产品团队

测试 开发 灰度发布

祝贺 StreamNative 工程师张勇成功跻身 Apache BookKeeper Committer

Apache Pulsar

bookKeeper Apache Pulsar StreamNative

国产接口管理工具APIPOST中的常见设置项

Proud lion

大前端 后端 Postman 开发工具 接口文档

聊聊什么样的代码是可读性强的代码?

卢卡多多

代码质量 代码 9月日更

电信运营商基于 MQTT 协议构建千万级 IoT 设备管理平台

EMQ映云科技

物联网 IoT mqtt 通信运营商 emq

云小课|细数那些VMware虚拟机的恢复招式

华为云开发者联盟

vmware 云小课 云备份 VMware恢复 恢复数据

值钱的数据放在云上安全吗?怎样才能保障其安全性?

行云管家

网络安全 信息安全 数据安全 企业上云

LispyScript:让JavaScript支持宏!_JavaScript_谢丽_InfoQ精选文章