Racket 入门教程

语法

Hello World

1
2
3
#lang racket

(displayln "Hello world!")

四则运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 加法
(+ 2 4 6) => 12

# 幂运算
(expt 2 3) => 8

# 乘法
(* 2 3) => 6

# 求余
(remainder 5 2) => 1

# 除法,结果非整数
(/ 4 6) => 2/3

String

字符串拼接

1
(string-append "你好" "," "世界!")

字符串格式化

1
(format "~a,~a!" "你好" "世界")

Function

在Racket里,人们往往使用一些约定俗成的符号来让函数的可读性更强,比如说判定系列的函数都统一用 ? 来结尾, 而转换系列的函数用 -> 来注明。

1
2
3
4
5
# 测试是否为字符串
(string? "你好") => #t

# 测试数字
(number? "1") => #f

Expression

#%expression 强制定义表达式

1
2
(number? (+ 1 2))
(number? (#%expression (+ 1 2)))

Quote

1
2
(quote x)   =>  `x
(quote (+ 1 2)) => `(+ 1 2)

Variable

define

define既可以定义变量,也可以定义函数。

默认情况下,变量的值是不可变的,它只能绑定和重新绑定。

1
2
3
(define PI 3.1415926)
(define name "hello")
(format "~a:~a" name PI)

define 是可以做全局绑定的,每次只能绑定一个变量。

let let*

如果想一次绑定多个变量,可以使用 let,let 是局部绑定。在绑定的过程中,需要互相引用,可以使用 let*

1
2
3
4
5
(let ([x 5]) x) =>  5

(let ([x 5])
(let ([x 2] [y x])
(list x y))) => `(2 5)

let-values let*-values

一次绑定多个值

1
2
(let-values ([(x y) (quotient/remainder 10 3)])
(list y x)) => '(1 3)

Lib

引入库关键字require

1
(require 2htdp/image)