第 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) | 键值存储 |