AICon 上海站|日程100%上线,解锁Al未来! 了解详情
写点什么

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

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

关注

评论

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

跟着卷卷龙一起学Camera--RGBNIR sensor 01

卷卷龙

ISP camera 10月月更

【网络安全】如何在Apache 安装开源 WAF

网络安全学海

黑客 网络安全 信息安全 渗透测试

cstdio的源码学习分析09-改变文件流文件流buffer函数setvbuf

桑榆

源码刨析 10月月更 C++

Web3雇佣兵的现状,Zebec根本上提高用户黏性

股市老人

跟着卷卷龙一起学Camera--RGBNIR sensor 02

卷卷龙

ISP camera 10月月更

【网络安全篇】php伪协议-漏洞及其原理

贤鱼很忙

php 网络安全 Web 10月月更

爬虫实例——爬取豆瓣网 top250 电影的信息

芯动大师

Python爬虫 10月月更 爬虫案例

这是两个Gopher面试必知必会的知识点,你搞懂了吗?

王中阳Go

Go golang 面试题 channel 10月月更

Vue组件入门(二)props和emit

Augus

Vue3 10月月更

数据中台4点核心建设内容

阿泽🧸

数据中台 10月月更

网络异常之后为什么MOA地址列表错乱了?

BUG侦探

TCP Jedis 乱序

【Java深入学习】Park&Unpark的深入学习讲解

Geek_65222d

10月月更

Web3雇佣兵的现状,Zebec根本上提高用户黏性

鳄鱼视界

Docker下Nacos配置应用开发

程序员欣宸

nacos spring-cloud 10月月更

Dapr简介-分布式应用运行时

久歌

架构 servicemesh 技术架构 dapr

跟着卷卷龙一起学Camera--夜景拍照01

卷卷龙

ISP camera 10月月更

sql注入--handler语句--一文详细解说其原理和方法

贤鱼很忙

Web SQL注入 10月月更

《数字经济全景白皮书》中国银行业场景金融生态建设分析2022 发布

易观分析

金融 客户 场景生态建设

Flash软件应用项目(一)

张立梵

设计师 Flash 10月月更

Redis 的快速介绍及其基本数据类型和操作

宇宙之一粟

redis 10月月更

【答读者问】把Go基础学完后,是学web方向还是区块链方向?

王中阳Go

php Go 区块链 职业规划 10月月更

MySQL高级--性能优化之索引使用

Java学术趴

10月月更

使用 Scrapy 框架来爬取数据

芯动大师

spider scrapy框架 10月月更

云服务架构设计基础模式

穿过生命散发芬芳

10月月更 云服务架构

Java文档注释 Intellij IDEA Generate JavaDoc

Yeats_Liao

后端 doc Java core 10月月更

基础算法:二分查找 搜索插入位置

芯动大师

Python 二分查找 10月月更

Spring之IOC自动装配

楠羽

笔记 SP【ring 10月月更

sql注入--通过修改数据完成注入--一文详细讲解

贤鱼很忙

Web SQL注入 10月月更

2022-10-11:一个整数区间 [a, b] ( a < b ) 代表着从 a 到 b 的所有连续整数,包括 a 和 b。 给你一组整数区间intervals,请找到一个最小的集合 S, 使得

福大大架构师每日一题

算法 rust 福大大

Go容易搞错的知识点汇总

王中阳Go

Go 面试题 #go 10月月更 go面试题

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