写点什么

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

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

关注

评论

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

学生管理系统(SSM简易版)总结,斗鱼Java开发二面被刷

Java 程序员 后端

对Stream-API的用法鼓吹够多了,但性能到底怎么样呢?,mybatis和spring集成原理

Java 程序员 后端

小白都能看懂的简单爬虫入门案例剖析(爬虫入门看它就够了!

Java 程序员 后端

层层递进!MySQL性能优化步骤演进,一顿饭的时间我就会了

Java 程序员 后端

字节跳动,三面我败了!但是我把经验记录了下来,java编程思想第六版百度云

Java 程序员 后端

学习高并发的前置知识——Java中的线程基础,springcloud实战演练

Java 程序员 后端

少写点if-else吧,它的效率有多低你知道吗?,渣本二面阿里受挫

Java 程序员 后端

差点跳起来了!阿里首推22w字Java面试复盘宝典成功助我入职美团

Java 程序员 后端

已开源!阿里巴巴SpringCloud微服务原理与架构项目实战,请签收

Java 程序员 后端

字节首席架构师整合面试痛点,成就399页Java框架核心宝典

Java 程序员 后端

学透这份java进阶笔记,才知道为什么能一起斩获几十家大厂offer一定是有原因的

Java 程序员 后端

完美!字节3-1级别大佬把《数据结构与算法,linux翻墙教程视频

Java 程序员 后端

实习生想面阿里应该掌握掌握哪些知识点?给学弟学妹们支招

Java 程序员 后端

实现一个简单的HTTP,京东java面试问题大全及答案大全

Java 程序员 后端

就这?多线程高并发分布式性能优化技术都不懂,你拿什么跳槽

Java 程序员 后端

工商银行分布式服务 C10K 场景解决方案,java基础实战项目飞机大战

Java 程序员 后端

学IT的人太多了,现在入行还有出路吗?,linux环境高级编程

Java 程序员 后端

安利一款非常NICE的-API-敏捷开发工具,java注释快捷键视频

Java 程序员 后端

完美!字节3-1级别大佬把《数据结构与算法(1),mybatisorm原理

Java 程序员 后端

学会RabbitMQ代理的连接,是一种怎样的体验?,mongodb教程

Java 程序员 后端

Clickhouse技术分享

scalad

大数据 实时数仓 Clickhouse OLAP开源引擎

就这一次!详解操作系统底层原理的IO原理,提供高性能开发的多种实战案例

Java 程序员 后端

字节跳动Java开放岗面经:14天快速面试,已拿offer,Java全套百度云

Java 程序员 后端

字节跳动一年一更的400多页算法刷题宝典已更新,力扣官网沸腾

Java 程序员 后端

小白必看!结合实际实例,理解事务,多线程面试题java

Java 程序员 后端

完美!白嫖4份满分级“并发编程,java架构师技术栈

Java 程序员 后端

已拿offer热乎乎的蚂蚁金服面经分享,建议收藏(Java岗、附答案)(1)

Java 程序员 后端

完全没想到,他竟然靠这个拿到了40万年薪的大厂AI岗offer!

Java 程序员 后端

实现一个简单的“个人博客”项目,java基础大纲思维导图

Java 程序员 后端

华为云专家向宇:工欲善其事必先利其器,才能做数据的“管家”

华为云数据库小助手

GaussDB GaussDB(for Influx) 华为云数据库 华为云数据库创新Lab

学弟学妹们请不要错过自己的“黄金奋斗三年”,java实战项目代码

Java 程序员 后端

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