走进 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 的深入了解能够继续下去。等有了更多的心得后,在撰文表述。:)

原文发布于微信公众号 - 程序人生(programmer_life)

原文发表时间:2014-12-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏牛客网

应届渣渣前端面经(还有游戏策划以及鸡汤)

87760
来自专栏程序员八阿哥

小白Pycharm使用(1):10个最省时间的 PyCharm 技巧

这篇文章的作者名叫刘善国。他此前在工厂工作,去年10月开始Python Web的学习,前不久成功拿到上海某互联网公司的 Python 工程师 offer,顺利完...

15020
来自专栏tkokof 的技术,小趣及杂念

代码小记

  前一阵子一直在制作一款小游戏,虽说最终的成果并不完美,但也算是花了不少精力,网上批评的声音不少,但更多的则是鼓励,这也让我们颇感欣慰,自省之余,也算拾得一些...

7620
来自专栏华章科技

程序猿必须知道的一些有用的(外国)网站

原文:https://github.com/sdmg15/Best-websites-a-programmer-should-visit

1.2K20
来自专栏Jerry的SAP技术分享

你的项目刚刚启动?是时候考虑Globalization了!

关于这个很长的定语的由来,请参考这篇文章,里面有王聪的背景介绍,包括他种菜的特长:当我用UI5诊断工具时我用些什么。

12520
来自专栏月牙寂

白话面向智能体编程(Agent Oriented Programmig, AOP)之三

进入Agent世界-什么是Agent? 在前面的讨论中,说道了一下Object让俺们感觉不是很爽的地方。总结下来:OO并不是对现实世界最贴切的模拟。那么什...

36370
来自专栏企鹅号快讯

程序猿必须知道的一些有用的网站

来自:开源中国 原文:https://github.com/sdmg15/Best-websites-a-programmer-should-visit 在学习...

295100
来自专栏程序人生

golang五周岁

时间过得真是太快,一晃眼golang都五周岁了。五年,对于人生来讲也许有些漫长,但对于一门语言的发展来说,仅仅是沧海一粟。相对于它试图挑战的「系统级」语言:c,...

40260
来自专栏牛客网

阿里蚂蚁金服Java研发四面面经

【每日一语】【每日一语】在年轻的时候,在那些充满了阳光的长长的下午,我无所事事,也无所惧怕,只因为我知道,在我的生命里有一种永远的等待。挫折会来,也会过去,热泪...

13340
来自专栏程序人生

如何提高代码质量?

好的程序员从来不靠格子衫或者颜值吃饭,就像你家 C 罗明明可以靠脸,却非要用不断精进的身体和技术迷倒你。

13200

扫码关注云+社区

领取腾讯云代金券