写点什么

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

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

关注

评论

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

飞码LowCode前端技术(六)

京东科技开发者

VMware ESXi 8.0U3 HPE (慧与) 定制版更新 OEM BIOS 2.7 支持 Windows Server 2025

sysin

macos windows esxi OEM 2.7

儋州市等保测评机构有哪些?在哪里?

行云管家

等保 等保测评机构 澶州

飞码LowCode前端技术(七)

京东科技开发者

研发效能中的黄金三角与瓶颈突围

思码逸研发效能

研发效能 绩效 绩效管理 效能度量 绩效分析

商品详情数据API接口详解与数据应用参考

代码忍者

pinduoduo API API 性能测试

人工智能 | 阿里通义千问大模型

测试人

人工智能 软件测试

数字身份管理建设是传统社会向数字社会演进的核心关键

芯盾时代

数字身份 身份安全

携手并进,智驭教育!和鲸科技与智谱 AI 签署“101 数智领航计划”战略合作协议

ModelWhale

人工智能 大模型 学科建设 创新人才

情绪稳定!别再让Git合并冲突影响你工作了

禅道项目管理

程序员 代码管理 git 学习 Git Commit git push

按图搜索的智能化:拍立淘API返回值的算法解析

技术冰糖葫芦

API Explorer API 文档 API 测试 API 性能测试

人工智能 | 阿里通义千问大模型

测吧(北京)科技有限公司

测试

研发数据要不要跟绩效考核挂钩?

思码逸研发效能

DevOps 研发效能 绩效管理 研发效能度量

捷途山海 T2—— 安全堡垒,护航人生

科技热闻

计算不停歇,百度沧海数据湖存储加速方案 2.0 设计和实践

Baidu AICLOUD

大数据 hdfs 数据湖 对象存储

测试热招职位技能要求拆解公开课 —— 开启你的软件测试进阶之路

测吧(北京)科技有限公司

测试

【CST教程】如何在CST中设置自由边界

思茂信息

cst 电磁仿真 边界条件

Java 如何确保 JS 不被缓存

威哥爱编程

js Java’

开源向量数据库性能对比: Milvus, Chroma, Qdrant

Zilliz

性能测试 Milvus 向量数据库 Chroma qdrant

VMware Cloud Director 10.6 发布,新增功能概览

sysin

vmware Cloud Director

CAE教程:HyperMesh概述与有限元分析简介

智造软件

仿真 hyperworks 有限元

基智科技CEO张文战:探索火山引擎数据飞轮模式下的大模型应用新机会

字节跳动数据平台

大数据 大模型

“特斯拉式”创新,被这家科技卫浴品牌极致演绎

Alter

VMware Aria Operations 8.18 发布,新增功能概览

sysin

vmware aria Operations

VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布

sysin

macos windows esxi OEM 2.7

喜讯|麦杰科技入选首批《上海市重点产业和领域数字化产品和解决方案推荐目录》

麦杰研究院

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(3)

HarmonyOS SDK

HarmonyOS

冲击美团!已成功 OC

王中阳Go

Go 面试 后端

2025云堡垒机公司就选行云绽放!

行云管家

云计算 网络安全 云堡垒机

飞码LowCode前端技术(五)

京东科技开发者

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