最新发布《数智时代的AI人才粮仓模型解读白皮书(2024版)》,立即领取! 了解详情
写点什么

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

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

关注

评论

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

终于“打造”出了一个可以随时随地编程的工具

老表

Python Linux 服务器 跟老表学云服务器

ReactNative进阶(十五):应用 react-native-tab-navigator 实现底部导航栏

No Silver Bullet

​React Native 1月月更 底部导航

云原生+国产化,腾讯云数据库不做选择题

腾讯云数据库

tdsql 国产数据库

黑客技能:xss攻击入门

喀拉峻

黑客 网络安全 XSS 渗透测试

Go 语言快速入门指南:Go 语言解析JSON

宇宙之一粟

Go json 1月月更

类脑计算技术领域领导者灵汐科技加入龙蜥社区,共同繁荣开源生态

OpenAnolis小助手

Linux 开源 芯片 生态

测试用例八大要素

PingCode

13 Prometheus之云时代的监控目标及挑战

穿过生命散发芬芳

运维 监控 Prometheus 1月月更

Spring Boot Admin,贼好使!

王磊

springboot

再一次重构云计算底座, Amazon Graviton3!

亚马逊云科技 (Amazon Web Services)

计算

小白都能吃透Java IOl流,最骚最全笔记,没有之一!1️⃣

XiaoLin_Java

Java io 基础 1月月更

在 Flutter 中使用交错网格视图创建瀑布流布局

坚果

flutter 1月月更

怎么访问到别人的电脑?

你?

【架构实战营】模块九作业

Geek_99eefd

架构实战营 「架构实战营」

雷霆传奇H5光柱版游戏详细图文架设教程

echeverra

游戏

Hibernate 的 HHH90000022 警告

HoneyMoose

手机APP消息推送极光推送jpush-php实例

Owen Zhang

极光推送 jpush-php实例

公开啦!「2021中国技术品牌影响力企业 」OceanBase 成功上榜

OceanBase 数据库

数据库 开源 开发者 OceanBase 开源 技术品牌

技术解析 | 即构移动端超分辨率技术

ZEGO即构

计算机视觉 音视频 视频超分

深入理解MySQL的binlog

JavaEdge

1月月更

深入 MySQL 索引:从数据结构到具体使用

Ayue、

MySQL 数据库 1月月更

从技术新趋势到云原生应用开发,云计算下一个十年将走向何方

亚马逊云科技 (Amazon Web Services)

计算

“爆到天际线” - TiDB 2021 Hackathon 决赛不负责任点评

PingCAP

java开发面试之Redis高并发处理

@零度

redis JAVA开发

混沌工程之ChaosBlade-Operator 使用之模拟 POD 丢包场景

zuozewei

性能测试 混沌工程 ChaosBlade 1月月更

被赶出自己公司的40岁程序员,为Coder们写了个网站--程序员福利网

程序员福利网老骨

程序员 导航网站

KubeMeet 直播 | 现场直击大规模集群、混合环境下的云原生应用交付难题

阿里巴巴云原生

阿里云 云原生 KubeMeet 交付 直播活动

1月月更|推荐学java——MyBatis高级

逆锋起笔

mybatis SSM框架 java 编程 动态SQL

仅有0.1M可训参数,AIOps日志异常检测新范式

云智慧AIOps社区

AI 算法 异常检测 智能运维 日志解析

基于云上 Arm 架构赋能数值天气预报

亚马逊云科技 (Amazon Web Services)

计算

TDSQL 2021:致未来的年终总结

腾讯云数据库

tdsql 国产数据库

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