柯里化的前生今世(二):括号神教
The limits of your languages are the limits of your world.
只会一种语言,会限制你的视野,很难有机会去接触那些有趣的想法。
语言是表达思想的工具,而有想法的人未必用我们熟知的语言去表达。
所以,我们就不得不多学一些。
关于
在上一篇中,我们提到了著名的逻辑学家Haskell Curry,
提到了类型和函数,以及看待多元函数的不同方式。
最后,引出了curry和uncurry两个高阶函数。
为了理解高阶函数,以及相关的,求值环境,词法作用域,闭包等概念。
我们从今天起要学习一门新的语言了,用它来描述这些概念比较方便。
过几天,当我们遇到参数化类型,代数数据类型的时候,
我们会再学一门语言。
括号神教
今天我们要学习的语言是Racket,它是Lisp家族中的一个语言。
Lisp,最初被拼为LISP,一个历史悠久的编程语言家族。最早由约翰·麦卡锡在1958年基于λ演算创造,演化至今,是历史第二悠久的高级语言,仅次于Fortran,也是第一个函数式编程语言。
约翰·麦卡锡
约翰·麦卡锡(John McCarthy,1927-2011),生于美国马萨诸塞州波士顿,计算机科学家。他因在人工智能领域的贡献而在1971年获得图灵奖。
他于1948年获得加州理工学院数学学士学位,1951年获得普林斯顿大学数学博士学位。分别短暂地为普林斯顿大学、斯坦福大学、达特茅斯学院和麻省理工学院供职后,麦卡锡于1962年-2000年底在斯坦福担任教授,退休后成为名誉教授。
最美丽的传说
在ILC 2002大会上前Lisp大神,当今的Python倡导者Peter Norvig,由于某些原因,做一个类似于马丁路德在梵蒂冈宣扬新教的主题演讲,因为他在演讲中大胆地声称Python就是一种Lisp。
讲完后进入提问环节,出乎我意料的是,Peter点了我过道另一侧,靠上面几排座位的一个老头,他衣着皱褶,在演讲刚开始的时候踱步进来,然后就靠在了那个座位上面。
这老头满头凌乱的白发,邋遢的白胡须,像是从旅行团中落下的游客,已经完全迷路了,闲逛到这里来歇歇脚,随便看看我们都在这里干什么。我的第一个念头是,他会因为我们的奇怪的话题感到相当失望;接着,我意识到这位老头的年纪,想到斯坦福就在附近,而且我想那人也在斯坦福 —— 难道他是……
“嗨,John,有什么问题?” Peter说。
虽然这只是10个字左右的问题,我不会假装自己记住了Lisp之父约翰·麦卡锡说的每一个字。他在问Python程序能不能像处理数据一样,优雅地处理Python代码。
“不行。John, Python做不到。”
Peter就回答了这一句,然后静静地等待,准备接受教授的质疑,但老人没有再说什么了。
此时,无语已胜千言。
Realm of Racket
Lisp家族
跟其他语言不同的是,Lisp语言是一个家族,它的成员被称之为“方言”。
大部分方言都鲜有人知,例如Arc语言,由《黑客与画家》的作者Paul Graham发明。
市面上流行的方言,包括以下几个,
- Elisp,是Emacs编辑器支持的脚本语言,可以用elisp扩展Emacs的功能。由于lisp方言强大的表达能力,以及Emacs优雅的架构,让Emacs获得了“神之编辑器”的称号。
- Clojure,运行在JVM上的另一种语言,Java是另一种。Clojure对并行和并发的支持,有自己的方式,在并发方面上,它没有提供线程和锁,而是提供了其他4种方式,Vars, Refs, Agents and Atoms。
- Common Lisp,是商业级的Lisp方言,规范长达1000多页。有LispWorks,Allegro CL这些强大的IDE。Common Lisp不支持hygienic macro,在编写宏的时候,容易出现意外的捕获。不过,这也增加了灵活性和表现力。除此之外,Common Lisp还支持Reader macro,和Racket的#reader有异曲同工之妙。
- Scheme,是一门力求简洁的Lisp方言,它首次提出了闭包的概念,提出了first-class continuation,提出了hygienic macro,然而它最新的R7RS规范包括最后的附录才只有88页。
DrRacket
Racket,原名PLT Scheme,在Scheme基础上增加了对象、类型、惰性求值等。
它提供了一个IDE,成为Docdor Racket,简称DrRacket,自带丰富的第三方库,如web服务器、数据库、GUI、图像处理等。
我们可以通过Racket的官网,找到DrRacket的下载地址,可以找到多个平台相应的安装包,windows和linux,osx都支持。
安装后,我们打开DrRacket,玩一下。
犹记得去年情人节,DrRacket还卖萌了一把,把图标变成了心形。
打开后,IDE的界面如下,由上下两部分构成,
上面那块称为定义区(definitions panel),下面称为交互区(interactions panel)。
以上,就是标准的Hello world实现了,当然它不仅仅是个玩具哦。
预知后事如何,且听我下回分解。
参考
LISP
约翰·麦卡锡
至今听到关于Lisp最迷人的故事
Realm of Racket
The Racket Reference