AICon 上海站|90%日程已就绪,解锁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:332991
用户头像

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

关注

评论

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

业界良心啊!第五次更新的Spring Cloud Alibaba升级太多内容

Java架构追梦

Java 阿里巴巴 架构 SpringCloud Java技术提升

Express Flutter SDK 全面支持空安全

ZEGO即构

flutter 大前端 音视频 空安全

Android技术分享| 实现视频连麦直播

anyRTC开发者

android 音视频 移动开发 视频直播 视频连麦

应届生如何拿到高薪和职业方向

hanaper

编程 程序员 音视频 软件工程师 应届生

大数据训练营hive作业

Clarke

Vue进阶(一):Vue 学习资料汇总

No Silver Bullet

Vue 8月日更

阿里高工从入门,基础,进阶到项目实战,全面讲解spring boot

Java 程序员 架构 面试 spring Boot Starter

FastApi-03-查询参数

Python研究所

FastApi 8月日更

FIL挖矿分币系统搭建(现有源码)

Geek_23f0c3

Filecoin fil FIL分币系统

补齐AI人才短板!百度飞桨师资培训高校行走进天津大学

百度大脑

人工智能 飞桨

ClickHouse存储原理初窥

循环智能

性能优化 OLAP Clickhouse

Java程序员面试需要准备的一些东西

北游学Java

Java 面试

下午4点半,浪潮云说直播间精彩继续

云计算

Kali Linux --《网络安全》-- 使用 WireShark 对常用协议抓包并分析原理

学神来啦

安全攻防 网络安全 信息安全 Wireshark

如何用Camtasia进行内容补充?

淋雨

Camtasia

用好这两个小工具,制作乐谱更高效!

懒得勤快

格物致知,零代码训练营第三期顺利结业

明道云

FIL分币平台系统源码/FIL分币平台搭建

Geek_23f0c3

Filecoin fil挖矿

详解Guitar Pro的自动化编辑器之节拍自动化

懒得勤快

他是如何被公司辞退,再到1000个小时后拿到阿里巴巴offer的?

Java架构师迁哥

ApacheCon Asia 2021: Apache APISIX 技术议题一览

API7.ai 技术团队

Apache 开源 网关 APISIX

工作中如何使用GULP构建项目?

加百利

JavaScript 大前端 8月日更 gulp

赋能后疫情时代的商业创新,用友BIP的力量

海比研究院

Linux进程调度-CFS调度器原理分析及实现,懂了

Linux服务器开发

Linux服务器开发 Linux内核 Linux后台开发 CFS调度器 Linux进程调度

NLP随笔(二)

毛显新

人工智能 自然语言处理 深度学习

拼拼有礼模式系统开发详解APP

開發15347427695

拼拼有礼系统软件开发案例介绍

開發15347427695

客户选型零代码软件到底在对比哪些方面?

明道云

【IT运维】快速解决IT疑难故障就用行云管家!

行云管家

系统运维 堡垒机 IT运维

AI系统中的偏差与偏见

百度开发者中心

AI 最佳实践 方法论 系统开发 语言 & 开发

请珍惜每一次被 Code Review 的机会

escray

学习 极客时间 朱赟的技术管理课 8月日更

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