硬核干货——《中小企业 AI 实战指南》免费下载! 了解详情
写点什么

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

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

关注

评论

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

Web3项目的安全性

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

区块链技术 软件外包公司 web3开发

Web3项目的分类及特点

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

区块链技术 软件外包公司 web3开发

RabbitMQ集群部署(二)——普通集群模式部署

天翼云开发者社区

RabbitMQ

智能制造:自动化焊装线的数字化设计

积木链小链

数字化 制造业 智能制造

HarmonyOS NEXT 中级开发环境搭建与实用工具类 AI 问答 APP 开发

yimapingchuan

HarmonyOS NEXT

测试框架设计的艺术

FunTester

必看!SpringAI轻松构建MCP Client-Server架构

王磊

DeepSeek Smallpond 在火山引擎 AI 数据湖的探索实践

火山引擎开发者社区

BeeWorks:为企业打造专网部署即时通讯解决方案

BeeWorks

即时通讯 IM 私有化部署 局域网视频软件

一文读懂2024!2025往“这”瞧 |《2024 IT行业项目管理调查报告》发布!

禅道项目管理

项目管理 AI IT 调查报告 科技

如何开发RWA DApp?一文搞定——从资产确权到跨链流通的完整技术指南

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

周卫林|从模型平权到“知本”复利,NoETL 打造 AI 时代的数据底座

Aloudata

数据仓库 数据分析 数据管理 大模型 指标平台

Hologres诊断与优化快速入门

阿里云大数据AI技术

数据库 sql 大数据 阿里云 hologres

国产服务器操作系统CTyunOS,技能值拉满!

天翼云开发者社区

云计算 服务器操作系统

AI低代码MES:制造业从“制造”到“智造”

万界星空科技

AI 低代码开发 低代码平台 mes 低代码云MES

华为吴辉:跨越数智鸿沟,共创AI新时代

新消费日报

BeeWorks内网聊天软件:提升团队效率的智能沟通平台

BeeWorks

即时通讯 IM 企业即时通讯平台 私有化部署 局域网视频软件

AI应用如何从 Chat 进化为 Agent?开源项目源码深度揭秘|得物技术

得物技术

agent 大模型应用

火山引擎智能数据洞察 ChatBI 适配 DeepSeek-R1 及 DeepSeek-V3

火山引擎开发者社区

模型的泛化性能度量:方法、比较与实现

秃头小帅oi

币安再度封禁违规做市商,Crypto 行业还有多少「蛀虫」

TechubNews

比特币

3FS系列(二):3FS元数据性能深度拆解:那些在技术文档中找不到的实现细节

九章云极DataCanvas

人工智能 DeepSeek 3FS

从历史数据到实时决策:AI如何提升大数据实时分析能力?

天津汇柏科技有限公司

大数据 AI 人工智能

DeepSeek 3FS 架构分析和思考(下篇)

火山引擎开发者社区

当AI遇上低代码:程序员正在咖啡馆里泡手冲?

伤感汤姆布利柏

2025浙江安博会

AIOTE智博会

安博会 浙江安博会 杭州安博会

RabbitMQ集群部署(一)——单机模式部署

天翼云开发者社区

RabbitMQ

项目过程中会出现哪些问题?

秃头小帅oi

行业分享丨如何实现快速仿真和创新设计,颠覆式加速产品研发?

Altair RapidMiner

AI 数字化转型 HPC 仿真 仿真驱动设计

DApp开发中的三大激励引擎:静态奖、动态奖与推荐奖的协同设计 ——从经济模型到行为心理学的深度解析

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

5000万考生救星!百度网盘和文库首发一站式视频AI笔记

极客天地

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