走进 racket(lisp) 的世界

时间:2022-05-06
本文章向大家介绍走进 racket(lisp) 的世界,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

上周追着看了个大牛的好几篇文章,发现一个叫racket的语言出镜率颇高 —— 这已经是我十月来第三次从各种大牛的文章中接触这个词。就如「惊天魔盗团」里那个被催眠的法国人,当生活中多次出现和赌博相关的场景,Las Vegas自然而然成为他的下一个旅游目的地。而racket,在上个周末,便成了我的Las Vegas。

我对编程语言的接触大致分成三种「境界」:

  • ✓ 浅尝辄止:了解一下语言设计的理念,基本功能,使用场景,写写一些基本的程序。如ruby,io,scala,clojure,object c,lua,haskell。
  • ✓ 爱不释手:学习了全部语法,看作者编写的书,遇到项目时会想想能不能用xxx实现,怎么实现。如golang,erlang。
  • ✓ 日常使用:只要是需要写代码的地方,下手首先想到的就是TA。如python。当然,C也是我日常使用的语言,只不过C是工作语言而已。javascript大抵也能归到此类,但也是迫于形势。

从一开始看racket的文档起,我就把它定位为一个「浅尝辄止」的周末语言,因为有clojure的前车 —— 学会了基本的语法后便无法继续深入 —— 我并未对自己深入了解racket有任何企盼。

racket是一个lisp [1] 家族的语言,祖上是common lisp [2] 对立的阵营scheme [3],起初为教学的目的而创立。

racket在osx/linux/windows下都有各自的安装包,在其官网上下载安装即可。racket自带了一个有REPL功能的简单的IDE DrRacket,方便初学者领略语言的魅力。同时,也提供了详尽的在线文档以及供初学者入门的 An Introduction to Racket with Pictures,和进阶的 How to Design Programs。

这一切都不禁让我想起十年前学习Python的场景:windows下的IDE + beginner’s guide + dive into python,何其相似!

为了进一步讨好初学者,让racket的学习寓教于乐,DrRacket可以直接和各种各样的图形图片打交道,比如说这样:

此外,racket的作者们还开发了一套htdp [4]库,用于教学。比如你可以很方便地,几行代码完成一个火箭起飞的动画,这是其它语言很难想象的。

初学racket,我自己是这么一步步读下来的:

  • ✓ 官网 An Introduction to Racket with Pictures
  • ✓ 第三方 Learn racket in Y Minutes - Learn X in Y Minutes
  • ✓ 电子书:How to design programs / Realm of Racket
  • ✓ 其它官方文档

学了一个周末下来,发现自己对它已经到了爱不释手的阶段。我对racket的喜爱,有以下几个原因:

首先,racket的文档系统非常完备,为初学者考虑了几乎一切可能。其所有文档(包括社区里介绍racket的文档)基本都是用racket撰写的语言(或者说DSL)scribble所写,统一度非常高,且代码中所有出现的语法单元都会link到官方文档的解释页面,赞不绝口啊!别看racket在程序员的渗透率非常低,其文档的质量不输于Python这样的公众情人!

其次,优秀的学习平台DrRacket。如今,一门语言如果没有REPL,学习的曲线会高很多。racket在支持REPL的基础上,还提供了一个可以调试的IDE。像lisp这样能够编写macro的语言,如果无法调试macro,简直就是一场灾难,当时玩clojure进行不下去也是稍微复杂一点的macro总写不对有关(我的功力实在有限),但DrRacket的 "Macro Stepper" 是个救星。此外,在DrRacket里,你还可以这么写代码:

满满地都是爱啊!

再次,不得不说说scribble。这是racket自带的文档系统,同时也是racket设计出来的语言。如markdown,asciidoc一样,scribble语言可以用来书写文档,并进一步被编译成html,pdf等多种格式。和markdown等不同地是,在scribble里,你可以混入racket代码,做各种各样的事情:比如说在文档中嵌入plot。由于程序君还没有写过复杂的基于scribble的文档,所以无法说得更多。但是,单单看racket本身的文档(全为scribble生成),就能感受到它的强大。

接下来是plot和slideshow。也许更深入地了解后我会写篇「plot技术哪家强」的文章。在racket里,plotting直白地不能再直白了,你只需学一下racket的基本语法,就可以上手了,比python的matplotlib容易不少(当然,功能性还没有太多比较,单看文档,应该差不太多),比如一条 y=sin(x) 的曲线:

是不是很简单?除了 sin 函数外,你只需要给出坐标系x轴的范围 (- pi) pi,一切就OK了。再来一个:

由于racket的plot太过亲民,使用它时我已经脱离了使用matplotlib那种非必要情况不去使用的「高级趣味」—— 我竟然在看plot文档的过程中把初高中的基本公式都过了一遍!这真的很有意思,墙裂建议大伙儿试试。想想 z = (x + y)^2 这样一个简单的公式,一个年过三十的「老骨头」,第一次一睹其三维图的真面目,是怎样一个泪奔的场景!

slideshow模块可以让你直接用racket写slides。虽然我一直用markdown(最近改成了asciidoc)+ reveal.js的标配来写slides,但racket的slideshow模块绝对值得一试。

racket的其它优点,都或多或少跟lisp有关,这个我觉得自己不必多讲。如果你看过「黑客与画家」,就知道Paul Graham近乎偏执地把一切溢美之词都给了lisp,说它是最有表现力的语言,说lisp是自己公司成功的"secret weapon"。对于lisp的优点,比如说一切皆为表达式,一切表达式皆可计算为一个值或一个list,语言可以在任何时候(读取,编译,执行)可用等等,可以看阮一峰的博文「为什么Lisp语言如此先进」[5],这里就不赘述。

我的racket之旅刚刚开始,希望这份热情随着自己对 define-syntax 的深入了解能够继续下去。等有了更多的心得后,在撰文表述。:)