Racket 入门

学习 Racket 的基本规则并动手使用 Racket 解释器

引言

你可能注意到了,上一节几乎没有提到编程语言。这是因为,从宏大的视角来看,编程语言本身并不重要。它们之所以还有一点重要性,只是因为对于同一个问题,某种语言可能让你用更少的代码行数解决,或者让解决方案更高效,仅此而已。

那么,教计算机科学该用什么语言呢?我们选择了 Racket——一种 Lisp 方言。今天我们会展示这门语言的基础知识,之后你就可以开始思考计算机科学本身了。随着你学到更多计算机科学知识,我们会循序渐进地带你认识这门语言的更多特性。

让我们开始吧。

基本规则

  1. 在 Racket 中,圆括号(parentheses,也称作 parens)至关重要。
  2. 当你要求一个过程(procedure)执行它的动作时,你就是在调用(call)它,也称为调用(invoke)一个过程。无论何时调用过程,都必须把这次过程调用(即对过程的调用)包在一对圆括号里。
  3. 每次调用过程时,都必须遵循前缀表示法(prefix notation):被调用过程的名字总是位于圆括号中最左边的位置。其余各项都是这个过程的实参(argument)——也就是我们喂给过程、以便得到答案的东西。

下面这个表达式演示了上述三条规则:

(+ 1 2)

在这个例子中,我们把实参 1 和 2 喂给了过程 +,它负责数字相加。我们应当预期答案是 3。

Racket 解释器

当然,如果没人说一门语言,它也就毫无用处。对编程语言来说,“对话”通常发生在程序员和计算机之间。解释器(interpreter)是一个程序,它把某种特定的语言翻译成计算机执行的动作和计算。解释器是让计算机做事的一种方式,比如计算大的质数,或者统计莎士比亚全部戏剧中用到的所有不同单词。

现在来启动我们的 Racket 解释器:打开终端,输入 racket 并按回车。Racket 解释器就这样启动了!

接下来,你可以输入 Racket 表达式,让解释器来求值:

-> (+ 1 2)
3

Racket 会输出什么?

把下面的每个例子输入解释器试一试。在输入每个例子之前,先想一想它的输出应该是什么。其中有些例子会引发错误——这是为什么呢?(如果出错了,解释器会输出一条错误消息。)

5
(+ 2 3)
(+ 5 6 7 8)
(+ (* 3 4) 5)
(+)
+
(sqrt 16)
(/ 3 2)
(/ 3 0)

'hello
(first 'hello)
(first hello)
(butfirst 'hello)
(bf 'hello)
(first (bf 'hello))
(first 274)
(+ (first 23) (last 45))

(define pi 3.14159)
pi
'pi
(+ pi 7)
'(good morning)
'(+ 2 3)

要点小结

在本节中,我们学习了 Racket 的基础知识,也亲自上手使用了 Racket 解释器。