写点什么

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

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

关注

评论

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

YonBuilder移动开发 AVM框架 封装虚拟数字键盘组件

YonBuilder低代码开发平台

疫情放开,户外全彩LED屏发展趋势

Dylan

LED display LED显示屏 户外LED显示屏

希捷发布2023年数据市场趋势预测,指引企业数据决策

Geek_2d6073

为什么NoSQL数据库这么受欢迎?

腾讯云数据库

数据库 nosql 腾讯云数据库

培训大数据技术后的职业规划介绍

小谷哥

如何使用YonBuilder进行报表分析?

YonBuilder低代码开发平台

内存多维数据分析引擎

元年技术洞察

大数据 数据中台 数字化转型 多维数据库

一文告诉你如何选择低代码供应商?

YonBuilder低代码开发平台

华为云桌面,助你畅享高清视觉体验!

科技怪授

云原生媒体基础设施为华为云桌面护航

科技怪授

手把手教你玩转 Excel 数据透视表

葡萄城技术团队

数据分析 Excel 数据可视化 数据透视表 可视化数据

运维自动化之Kubernetes 云原生CICD部署管理系统

大V

golang DevOps CI/CD kubernetes 运维 webssh

银行如何快速落地营销数字化?

中关村科金

人工智能 大数据 AI 数字化转型 数字化

启科QuSaaS真随机数解决方案与Amazon Braket结合实践

启科量子开发者官方号

人工智能 量子计算 随机数

AI 2022:浪潮奔涌,百舸争流

Baihai IDP

人工智能 AI 年终总结 AI 2022

企业想要智慧化办公,首选华为云桌面Workspace!

科技怪授

优化器核心技术—Join Reorder

KaiwuDB

YonBuilder应用构建教程之移动端基础配置

YonBuilder低代码开发平台

超详细图文保姆级教程:App开发新手入门(三)

YonBuilder低代码开发平台

YonBuilder移动开发平台 AVM框架 封装身份证号码虚拟输入键盘组件

YonBuilder低代码开发平台

跑付活动:跑付南宁(联营)健身服务中心盛大开业

Geek_2d6073

华为儿童手表5X系列“腕上学习天地”全新升级,首月0元畅享华为教育中心精品内容

最新动态

适合前端程序员培训的人群有哪些

小谷哥

华为云桌面,如何让云上办公变得高效、安全?

i生活i科技

统信软件高级工程师:关于云原生技术在容器方面的应用介绍 | 龙蜥技术

OpenAnolis小助手

云原生 容器技术 龙蜥大讲堂 统信软件 开源领域

数据库原理及MySQL应用 | 约束

TiAmo

主键约束 数据库· 12月月更

一文读懂什么是低代码开发?

YonBuilder低代码开发平台

超详细图文保姆级教程:App开发新手入门(四)

YonBuilder低代码开发平台

无代码优缺点及发展前景

间隔

spaa 22

黄敏

一键导出Gerber文件教学实操,我设计的PCB再也没出过问题!

华秋PCB

工具 PCB PCB设计

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