返回

文章详情

友好的 Racket 入门

Hacker News2026年8月22日 14:08

2026年8月11日 "Lisp 是值得学习的,因为当你终于理解它时,你将会经历深刻的启蒙体验。" — Eric S. Raymond 欢迎。今天你将学习一种来自编程最古老且最不寻常家族的语言。在这种语言中,代码是数据,括号是纯粹的结构,并且程序可以编写程序。在本教程结束时,你将自己写出语法。一点历史 Lisp 于 1958 年出生,由麻省理工学院的 John McCarthy 发明。作为背景:它是目前仍在使用的第二古老的高级语言(仅次于1957年的Fortran)。Python于1991年推出。JavaScript于1995年推出。Lisp 比它们早了超过30年,我们现在认为的“现代”几乎所有想法都是诞生于此:垃圾回收 — 为Lisp发明的。第一类函数 — 作为参数传递函数,现在无处不在。REPL — 交互式读取-求值-打印循环,今天 Python、Node 和 Julia 都有的功能,起源于Lisp。作为表达式的条件语句 — 返回值的 if。Homoiconicity — 代码是自身语言的数据结构。这是最重要的。我们将在最后再讨论这个。几十年来,Lisp 是人工智能的语言。在70年代和80年代,有专门设计用于直接运行Lisp的物理计算机:Symbolics 和 LMI 构建的 Lisp 机器。随后便是“人工智能寒冬”,资金枯竭,Lisp 从明星语言变成了小众语言。但有趣的想法不会消亡,它们会变异,这就是 Lisp 的美妙之处。 从 Lisp 到 Scheme 再到 Racket 1975年,Gerald Sussman 和 Guy Steele 创建了 Scheme:一种极简、优雅、几乎是数学化的 Lisp。Scheme 成为学术界教授编程的最爱(传奇书籍《SICP 计算机程序的结构与解释》就是用 Scheme 编写的)。1995年,Matthias Felleisen 的团队创建了 PLT Scheme,这是一个旨在教育和编程语言研究的 Scheme。在2010年,它被重新命名为 Racket,今天它远不止是一个 Scheme:它是一个构建语言的语言。它的非官方座右铭是面向语言的编程:如果你的问题需要自己的语言,Racket 可以让你在一个下午内构建一个。 年份 事件 1958 McCarthy 在麻省理工学院发明 Lisp 1975 Sussman 和 Steele 创建 Scheme 1984 Common Lisp 被标准化 1995 PLT Scheme(现在的 Racket)问世 2007 Clojure 出现(JVM 上的 Lisp) 2010 PLT Scheme 被重命名为 Racket 如今 你,正在阅读这篇文章,准备写括号 UwU 现在谁在使用 Lisp? 比你想象的要多的人:Clojure 在银行、航空公司和初创公司(拉丁美洲最大的数字银行 Nubank 使用 Clojure)中投入生产。Common Lisp(使用 SBCL 编译器)仍在专家系统、航班规划(ITA Software,被谷歌收购,支持谷歌航班)和科学计算中活跃。Emacs Lisp — 每天有数百万人在不知情的情况下运行 Lisp,因为他们的编辑器是 Lisp 解释器。Guile/Guix — 一个完全以 Scheme 配置的 Linux 发行版。Racket 每年都有自己的大会(RacketCon),活跃的学术和艺术社区,并被用于语言研究、形式验证(Rosette)、排版和出版(Pollen),以及全球的教育中。而且新的 Lisp 也不断涌现:Fennel(编译到 Lua 的 Lisp,在游戏中流行)、Janet、Hy(在 Python 上的 Lisp)…… TADC 粉丝的复活节彩蛋:在《了不起的数字马戏团》(第8集,“hjsakldfhl”)中,当 Kinger 打开终端尝试重置 Caine 时,你可以看到 Caine(1996年构建的创造性人工智能)是用 Lisp 编程的。该文件的名称为 Caine-core.lisp。 安装(5分钟)访问 https://racket-lang.org 下载适合你系统的安装程序(Linux、macOS、Windows)。打开 DrRacket,这个环境是随附提供的。DrRacket 有两个区域:顶部是你编写定义(你的程序),底部是用来进行实时实验的 REPL。在定义区域的第一行,写下:#lang racket 这一行告诉 Racket 你使用的是什么语言(记住:Racket 是一个语言工厂,所以你必须选择一个)。如果你更喜欢终端:racket 命令会给你一个 REPL,而 raco 是包管理器和工具命令。在 REPL 中,尝试:> ( + 1 2 ) 3 > ( * 3 ( + 2 2 )) 12 > ( string-append "hello " "world" ) "hello world" Lisp 的规则可以用一句话概括:一切都是 (操作符 参数1 参数2 ...)。总是如此。没有例外。没有运营符优先级需要记忆,任何事情都没有特殊语法。(+ 1 2)就是加法。(if ...)决定。(define ...)定义。看起来令人生畏的括号实际上是完全没有任意规则。经过一周,你将不再注意到它们。 定义和函数 #lang racket ( define pi-approx 3.14159 ) ( define ( circle-area r ) ( * pi-approx r r )) ( circle-area 2 ) ; => 12.56636 使用名称进行定义会创建一个常量。使用 (名称 参数...) 来定义则会创建一个函数。注释以 ; 开头。匿名函数 ...

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡