Racket入门

Racket是众多Lisp方言中的一种,语法简洁优雅(可以说,对语法的“蔑视”是Lisp系语言的一大特点,也正因为这个原因,学习它们可以让我们更关注计算的本质,而非语法上的细枝末节)。国内关于Racket语言的教程不多,本篇文章仅作为入门用途,如果您想继续深入学习,不妨访问:http://racket.tchen.me/。

(1)下载DrRacket

在plt-scheme官网(plt-scheme现在改名成了racket)上下载racket。主要会用到的是DrRacket,是racket的IDE,长下面这个样子:

Racket入门_第1张图片

进去以后选择语言(Racket),然后就可以开始写代码了。您既可以在“>”的后面执行单条语句,也可以在代码编辑区书写成段的代码。

(2)语法基础

这个部分参考的是SICP的第一章。SICP是一本以lisp为基础介绍“什么是计算”的好书,您可以点击这里阅读。

1)lisp系的语言用的都是前缀表达式,而非我们熟悉的中缀,书写的时候注意要用空格隔开,例如:

Racket入门_第2张图片

2)使用define

define可以帮助我们进行最初级的抽象,即,用x来代替y,例如:

Racket入门_第3张图片

上述例子将圆周率的具体数值定义成了一个名字“pi”,这个名字也可以参与正常的运算。

使用define还可以定义复杂的过程(您可以将“过程”理解为“函数”,但严格来说这两者是不同的,过程偏向于一个问题怎么解决,而函数只是描述了这个问题的特征,不过...在意这些细节干嘛呢 :-)),例如:

Racket入门_第4张图片

您也许会关心这个过程的具体运算步骤,这就需要了解两种不同的求值顺序:一种叫“应用序”,一种叫“正则序”。Lisp采用应用序,即首先求参数的值再应用,从而避免了重复运算;正则序则把整个表达式展开,让表达式只含有基本运算符后才开始计算。对于可以用替换去模拟、并产生合法值的过程,应用序和正则序得到的结果完全一样。

在上述例子中,采用应用序或者正则序,求值的计算步骤都是:(+(* a a)(* b b))->(+(* 3 3) (* 8 8 ))->(+ 9 64)->73。两者的差异在处理递归的时候就很明显了,这里从略。

3)条件表达式

使用cond函数(rackect没有关键字这个概念,每个括号括起来的基本单元都是通过函数来构建的,cond就是一个函数)

Racket入门_第5张图片

和cond类似的还有if,这里从略。

你可能感兴趣的:(Lisp)