写点什么

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

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

关注

评论

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

中东APP支付需要注意的问题

北京木奇移动技术有限公司

APP支付 软件外包公司 中东APP

数造科技入选全国数标委首批成员单位,引领数据标准化新方向!

数造万象

行业资讯 数据治理 科技 数据标准 数据流通

速度超越DeepSeek!Le Chat 1100tok/s闪电回答,ChatGPT 4o和DeepSeek R1被秒杀?

智领云科技

网易元宵节能提前下班,你慕了吗?

王中阳Go

Go 网易

RUM实践-最大内容绘制(LCP)优化

乘云数字DataBuff

前端监控 用户体验 运维监控 RUM

DeepSeek 如何 “逆袭” 打破巨头垄断?

Apache IoTDB

DGL(0.8.x) 技术点分析

Splendid2025

人工智能

如何制定好绩效管理体系

易成研发中心

人工智能丨DeepSeek、文心一言、Kimi、豆包、可灵……谁才是你的最佳AI助手?

测试人

软件测试

深度解读「摩根士丹利」人形机器人最新研报:100家人形机器人价值链(附报告)

机器人头条

科技 大模型 人形机器人 具身智能

淘宝店铺商品数据一网打尽:详解Taobao.item_search_shop接口

代码忍者

淘宝API接口

AIP智能体平台:利用DeepSeek大模型实现智能化和自动化

大东(AIP智能体运营专员)

人工智能

人工智能丨如何通过DeepSeek优化软件测试工作,提升效率与准确度

测试人

RUM实践-累计布局偏移(CLS)的探索

乘云数字DataBuff

前端监控 用户体验 运维监控 RUM

谷云科技RestCloud全面接入DeepSeek 开启智能新时代

谷云科技RestCloud

AI ETL 数据集成工具 AIAgent DeepSeek

从图像到信息,AI识图开启智能识别新时代

HarmonyOS SDK

harmoyos

告警事件如何与 CMDB 打通附加更多元信息

巴辉特

告警管理 告警信息丰富 告警OnCall 告警响应

NineData云原生智能数据管理平台新功能发布|2025年1月版

NineData

数据库 工具 数据管理 NineData

音乐NFT的钱包对接流程

北京木奇移动技术有限公司

区块链技术 软件外包公司 音乐NFT

DeepSeek 快速体验,魔搭+函数计算一键部署模型上云

阿里巴巴云原生

阿里云 云原生

人工智能是否会发展出“自我意识”?科学与科幻的交汇

天津汇柏科技有限公司

人工智能

【重磅】歌力思携手7thonline第七在线 开启智能商品管理新篇章

第七在线

图解系列|DeepSeek-R1的出众推理能力从何而来?

Baihai IDP

程序员 AI 推理模型 LLMs GenAI

浏览量超 10w 的热图,描述 RAG 的主流架构

阿里巴巴云原生

阿里云 云原生

【DeepSeek版】JeecgBoot低代码 3.7.3 发布,集成DeepSeek实现AI编程

JEECG低代码

低代码平台 代码生成 JeecgBoot DeepSeek

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