走进 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
的深入了解能够继续下去。等有了更多的心得后,在撰文表述。:)
- Flash/Flex学习笔记(55):背面剔除与 3D 灯光
- 资源等待类型sys.dm_os_wait_stats
- NVIDIA不再允许数据中心用GeForce驱动,提供区块链服务除外
- 非常强悍并实用的双机热备+负载均衡线上方案
- Apache 压力测试工具ab
- SQL之收集SQL Server线程等待信息
- 聚合索引(clustered index) / 非聚合索引(nonclustered index)
- 域名资讯:单词域名can.com以15.5万美金成功交易
- jQuery无缝图片横向(水平)/竖向(垂直)滚动
- Centos下MooseFS(MFS)分布式存储共享环境部署记录
- MFS+Keepalived双机高可用热备方案操作记录
- Docker容器学习梳理-容器时间跟宿主机时间同步
- AS1.0(2.0)中的XML示例
- kvm虚拟机日常操作命令梳理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Angular依赖注入的一个例子和注入原理单步调试
- Angular依赖注入的一个常见错误NullInjectorError,No provider for XXX
- Redis系列(十二)scan Info Object等特殊命令集合
- 使用纯CSS给网站文章中的外链添加小图标
- iOS美团同款"ZSource"二进制调试实现
- 使用picocm来进行Linux下的串口调试
- vue-drawer-layout实现手势滑出菜单栏
- iOS面试之UI大全
- 基于Ant Design Vue封装一个表单控件
- Rust闭包的虫洞穿梭
- TS 设计模式08 - 发布订阅模式
- GrowingIO 数据采集 iOS SDK 测试实践
- Kubernetes 1.19.0——Pod(2)
- 极速40分钟写出SQLite数据展示与导出功能【技术创作101训练营】
- opencv cudacodec VideoReader 报错