写点什么

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

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

关注

评论

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

新一轮 Web3 游戏季,Final Glory成捕获全新市场红利的入口

加密眼界

35+IT技术同学的未来职场选择

老张

认知提升 规划 职业生涯 职场发展

京东金融APP的鸿蒙之旅:技术、挑战与实践

京东科技开发者

夜莺监控的机器支持挂载到多个业务组了

巴辉特

监控系统 运维监控 IT监控 开源监控

线上事故风险解读之技术漏洞

巧手打字通

后端 架构设计 工程能力 线上事故 构架

电商数据化运营:阿里巴巴商品详情API返回值的实际应用

技术冰糖葫芦

API 接口 API 文档 API 测试 pinduoduo API

10月才是秋招主战场!

王磊

人工智能的未来

天津汇柏科技有限公司

AI 人工智能

1688跨境代采业务用到的API接口及其使用示例

tbapi

1688代采系统 1688代采接口 1688跨境

《Programming from the Ground Up》阅读笔记:p147-p180

codists

汇编 编程人

迎接国庆旅游热潮,火山引擎数据飞轮助力景区数智化升级

字节跳动数据平台

增长 数智化转型 大数据‘’ 数据飞轮

F5携手NetApp加速并简化大语言模型AI部署

科技热闻

文盘rust--使用 Rust 构建RAG

京东科技开发者

淘宝商品详情页接口_X-ISGN和WUA算法

tbapi

淘宝商品详情数据接口 淘宝API接口

从SQL Server过渡到PostgreSQL:理解模式的差异

EquatorCoco

数据库 sql

新一轮 Web3 游戏季,Final Glory成捕获全新市场红利的入口

大瞿科技

揭秘动态化跨端框架在鸿蒙系统下的高性能解决方案

京东科技开发者

还不知道这个原则的程序员,要小心了

禅道项目管理

程序员 软件测试 代码规范 测试人员 规范优先原则

华为云技术专家分享4大举措,助力开发者开启鸿蒙原生应用开发

华为云开发者联盟

HarmonyOS 端云协同 ArkTS 开发者、

技术解读GaussDB (for MySQL)流控机制

华为云开发者联盟

GaussDB 流控 MySQL 5.7

红旗携“中国之路” 创汽车工业新篇章

编程猫

Web 性能优化|了解 HTTP 协议后才能理解的预加载

阿里技术

性能优化 Web HTTP 用户体验 网站性能

数字化智能工厂的主要功能组成

万界星空科技

数字化 智能工厂 智能制造 万界星空科技mes MES、

技术实现方案:获取淘宝商品详情API返回值

代码忍者

API 测试 pinduoduo API

火山引擎边缘智能亮相“地瓜机器人开发者大会”,推动端侧大模型应用与落地

火山引擎边缘云

物联网 边缘计算 机器人 智能IoT边缘服务

构建万物智联生态,“人才”与“资金”不能少

Geek_2d6073

传统身份安全的局限性

芯盾时代

身份安全 统一身份认证 零信任模型

第七在线7thonline荣耀加冕 斩获“最佳数据洞察平台”与“产业互联网最具发展潜力企业”两项大奖!

第七在线

万界星空科技MES系统在智能制造中的应用

万界星空科技

智能制造 mes 万界星空科技mes 制造业工厂

揭秘:一键获取京东商品详情的API之旅

代码忍者

API 测试 pinduoduo API

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