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