Racket 入门
学习 Racket 的基本规则并动手使用 Racket 解释器
引言
你可能注意到了,上一节几乎没有提到编程语言。这是因为,从宏大的视角来看,编程语言本身并不重要。它们之所以还有一点重要性,只是因为对于同一个问题,某种语言可能让你用更少的代码行数解决,或者让解决方案更高效,仅此而已。
那么,教计算机科学该用什么语言呢?我们选择了 Racket——一种 Lisp 方言。今天我们会展示这门语言的基础知识,之后你就可以开始思考计算机科学本身了。随着你学到更多计算机科学知识,我们会循序渐进地带你认识这门语言的更多特性。
让我们开始吧。
基本规则
- 在 Racket 中,圆括号(parentheses,也称作 parens)至关重要。
- 当你要求一个过程(procedure)执行它的动作时,你就是在调用(call)它,也称为调用(invoke)一个过程。无论何时调用过程,都必须把这次过程调用(即对过程的调用)包在一对圆括号里。
- 每次调用过程时,都必须遵循前缀表示法(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 解释器。