2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

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

关注

评论

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

大数据培训机构怎么选?

小谷哥

启新聚势 云谱新篇|海泰方圆与四川联通达成生态战略合作

电子信息发烧客

MySync——企点通用MySQL数据同步解决方案

腾讯企点技术团队

MySQL 数据库 日志 Binlog 同步

JAVA编程规范之注释规约

源字节1号

后端开发

火爆各平台的拼团功能,宝子们在多商户系统中玩过吗?

CRMEB

巧用RoaringBitMap处理海量数据内存diff问题

得物技术

Java HBase BitMap

云原生、Intel Arch及云原生机密计算 3 大 SIG 在线分享!今天见 | 第 32-34 期

OpenAnolis小助手

开源 云原生 虚拟化 龙蜥大讲堂 SIG双周会

【深度】新派LaaS协议Elephant:重振DeFi赛道发展的关键

西柚子

【深度】新派LaaS协议Elephant:重振DeFi赛道发展的关键

小哈区块

LeetCode-101. 对称二叉树(java)

bug菌

Leet Code 7月月更

2022可信区块链生态大会落幕——旺链科技参与《区块链供应链金融系统评测方法》制定

旺链科技

区块链 产业区块链 供应链金融

软件研发效能度量的成功要素

思码逸研发效能

研发管理 研发效能 软件研发

云原生(七) | Docker篇之深入Docker Compose

Lansonli

云原生 7月月更

OneFlow v0.8.0正式发布

OneFlow

版本更新

聚焦数据|海泰方圆直击证券行业数据安全治理建设思路

电子信息发烧客

学习web前端开发有哪些好的方法

小谷哥

庖丁解牛,复盘 HiveServer2 连接频繁卡顿问题

移动云大数据

大数据 hive

性能领域:你知道的越多,不知道的也就越多

博文视点Broadview

嵌入式操作系统多任务调度原理分析与RUST参考实现

Geek_0185b7

CSS动画篇之404动画

南城FE

CSS 前端 7月月更

SAP 实施项目中涉及到编程方式操作 Excel 的几种场景介绍

汪子熙

Excel automation SAP abap 7月月更

国际顶会OSDI首度收录淘宝系统论文,端云协同智能获大会主旨演讲推荐

阿里巴巴大淘宝技术

人工智能 #开源

百问百答第47期:极客有约——中信建投当前的监控体系建设情况

博睿数据

智能运维 博睿数据 中信建投 监控体系 系统监测

好书推荐|《产业数字化转型精要:方法与实践》

李洋

职业 数字化转型 数字经济 书籍 CIO的秘密武器

DevOps 实践多年,最痛的居然是?

飞算JavaAI开发助手

【LeetCode】数组能形成多少数对Java题解

Albert

LeetCode 7月月更

面对复杂问题时,系统思考助你理解问题本质

阿里技术

系统性思考 复杂事件处理 业务逻辑

如何使用 SAP Intelligent Robotic Process Automation 自动操作 Excel

汪子熙

机器学习 RPA 机器人流程自动化 SAP 7月月更

浅析 Apache Kafka 分区重分配的实现原理

移动云大数据

kafka 开源

h5实现一个刮刮卡的动画效果

南极一块修炼千年的大冰块

7月月更

Linux下玩转nginx系列(七)---nginx如何实现限流功能

anyRTC开发者

nginx Linux 音视频 服务器 限流

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