Racket 编程
第 1 部分 · Racket 核心

基本数据类型

基本数据类型

掌握 Racket 中的数字、字符串、列表、符号等核心数据类型。

数字(Numbers)

Racket 支持丰富的数值类型:

#lang racket

;; 整数
42
-17

;; 浮点数
3.14159
-0.001

;; 分数(精确运算)
1/3
22/7

;; 复数
3+4i

;; 运算
(+ 1 2 3)        ; => 6
(* 2 3 4)        ; => 24
(/ 10 3)         ; => 10/3 (精确分数)
(/ 10.0 3)       ; => 3.3333333333333335

布尔值

Racket 使用 #t 表示真,#f 表示假。

#t    ; true
#f    ; false

;; 布尔运算
(and #t #f)      ; => #f
(or #t #f)       ; => #t
(not #t)         ; => #f

字符串

"Hello, Racket!"
"字符串可以包含 中文"

;; 字符串操作
(string-length "hello")           ; => 5
(string-append "Hello" " " "World") ; => "Hello World"
(substring "hello" 1 4)           ; => "ell"

符号(Symbols)

符号是 Lisp 家族独有的数据类型,类似于不可变的字符串,但使用 eq? 比较时效率更高。

'symbol
'also-a-symbol
'中国

;; 符号 vs 字符串
(eq? 'hello 'hello)     ; => #t  (同一对象)
(string=? "hello" "hello") ; => #t  (内容相同)

列表

列表是 Racket 中最重要的数据结构:

'(1 2 3)
'(a b c)
'(1 "two" 3 'four)    ; 列表可以混合不同类型

;; 使用 list 函数构造
(list 1 2 3)

;; 常用列表操作
(car '(1 2 3))        ; => 1
(cdr '(1 2 3))        ; => '(2 3)
(cons 0 '(1 2 3))     ; => '(0 1 2 3)
(length '(a b c))     ; => 3
(member 2 '(1 2 3))   ; => '(2 3)

点对(Pairs)

列表本质上是由点对构成的链式结构:

;; 点对
(cons 1 2)            ; => '(1 . 2)

;; 列表是嵌套的点对
(cons 1 (cons 2 (cons 3 '())))  ; => '(1 2 3)

向量(Vectors)

向量是固定长度的数组,支持 O(1) 的随机访问:

#(1 2 3)
(vector "a" "b" "c")

;; 向量操作
(vector-ref #(1 2 3) 1)     ; => 2
(vector-length #(1 2 3))    ; => 3

散列表(Hash Tables)

(define ht (make-hash))
(hash-set! ht 'name "Racket")
(hash-set! ht 'year 1995)
(hash-ref ht 'name)         ; => "Racket"
(hash-ref ht 'missing #f)   ; => #f (提供默认值)

小结

数据类型示例主要用途
数字42, 3.14, 1/3数值计算
布尔#t, #f逻辑判断
字符串"hello"文本处理
符号'symbol标识符、关键字
列表'(1 2 3)序列数据
向量#(1 2 3)随机访问数组
散列表(make-hash)键值存储