写点什么

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

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

关注

评论

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

“智慧工厂”上线,破局传统工厂数字化转型

AIRIOT

低代码 物联网 低代码,项目开发

在创建生成WIFI二维码手机扫码链接

入门小站

工具

Allure测试报告怎么设置

和牛

测试

深入理解 Linux 的 TCP 三次握手

C++后台开发

Linux TCP 后端开发 C++后台开发 C++开发

英特尔发布开源AI参考套件

科技之家

Allure测试报告怎么设置

和牛

测试

使用Java客户端发送消息和消费的应用

hum建应用专家

云计算

如何在企业工作中应用知识管理,解决企业的问题?

Baklib

知识管理

华为云Stack南向开放框架,帮助生态伙伴高效入云

华为云开发者联盟

云计算 后端

SQL也能做AI ?没错!MLOps Meetup V3 回顾|OpenMLBD+SQLFlow+Byzer

星策开源社区

人工智能 机器学习 sql 特征平台

24小时自助共享洗车有人洗吗

共享电单车厂家

24小时无人自助洗车 自助洗车加盟 车白兔自助洗车 自助洗车店

C 语言入门(六)

逝缘~

7月月更

国内外知名的待办事项app有哪些

爱吃小舅的鱼

待办事项 todolist

要想不踩SaaS那些坑,得先了解“SaaS架构”

华为云开发者联盟

云计算 开发 SaaS DTT

渲染与云渲染:一部电影的制作25%的时间是在“等”

Finovy Cloud

GPU服务器

自动化生成Javascript调用后台代码v0.5.3版本

百家饭隐私计算平台创业者

JavaScript API

九联科技开发板正式合入OpenHarmony主干

科技汇

JSON 和JavaScript 介绍与区别

devpoint

JavaScript json 7月月更

Grafana Labs携手阿里云,将提供国内首款Grafana托管服务

Lily

牛逼!这份24W字的SpringBoot从入门到实战让你彻底玩明白

了不起的程序猿

Java springboot java程序员

区块链合约安全系列(三):如何认识及预防公链合约中的自毁攻击

BSN研习社

区块链、

行业首个「视频直播技术最佳实践图」发布!

阿里云视频云

阿里云 音视频 直播

【森城市】GIS数据漫谈(四)— 坐标系统

ThingJS数字孪生引擎

企业在创建产品帮助中心时需要注意的问题!

Baklib

企业 客户服务 帮助中心

linux之拖拽上传文件

入门小站

Linux

加盟自助洗车真的不用招人吗

共享电单车厂家

自助洗车加盟 车白兔自助洗车 无人自助洗车

在线SQL转YAML工具

入门小站

工具

鸿湖万联致远开发板正式合入OpenHarmony主干

科技汇

洗车店洗车贵试试自助洗车吧

共享电单车厂家

自助洗车加盟 车白兔自助洗车 什么是自助洗车 自助洗车价格

HDFS、纱线、蜂巢MRS中使用Ranger实现权限管理全栈式实践

华为云开发者联盟

大数据 后端 MRS

使用 SSH 方式拉取代码

攻城狮杰森

git GitHub SSH gitee 7月月更

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