第 1 部分 · Racket 核心
结构体与向量
结构体与向量
使用结构体构建自定义数据类型,用向量实现高效随机访问。
结构体
结构体让你像 C 语言那样构建自己的数据类型:
#lang racket ;; 定义结构体 (struct point (x y)) ;; 创建实例 (define p (point 3 4)) ;; 访问字段 (point-x p) ; => 3 (point-y p) ; => 4
结构体选项
;; transparent:可以查看内容 (struct point (x y) #:transparent) (point 1 2) ; => #(struct:point 1 2) ;; mutable:字段可变 (struct counter ([value #:mutable])) (define c (counter 0)) (set-counter-value! c (+ (counter-value c) 1)) ;; guard:构造时校验 (struct pos-point (x y) #:guard (lambda (x y name) (unless (and (positive? x) (positive? y)) (error name "coordinates must be positive")) (values x y)))
向量
向量是固定长度的数组,支持 O(1) 随机访问:
;; 创建向量 #(1 2 3) (vector 1 2 3) (make-vector 5 0) ; => #(0 0 0 0 0) ;; 访问与修改 (vector-ref #(a b c d) 2) ; => 'c (define v (vector 1 2 3)) (vector-set! v 1 99) v ; => #(1 99 3) ;; 向量长度 (vector-length #(1 2 3)) ; => 3 ;; 向量转列表 / 列表转向量 (vector->list #(1 2 3)) ; => '(1 2 3) (list->vector '(1 2 3)) ; => #(1 2 3)
集合与哈希表
;; 集合 (set 1 2 3 2 1) ; => (set 1 2 3) (set-add (set 1 2) 3) ; => (set 1 2 3) (set-member? (set 1 2 3) 2) ; => #t ;; 不可变哈希表 (define ht (hash 'a 1 'b 2 'c 3)) (hash-ref ht 'b) ; => 2 (hash-set ht 'd 4) ; => #hash((a . 1) (b . 2) (c . 3) (d . 4)) ;; 可变哈希表 (define mht (make-hash)) (hash-set! mht 'name "Racket") (hash-ref mht 'name) ; => "Racket"
小结
结构体用于建模领域数据,向量用于高性能随机访问,哈希表和集合提供高效的查找能力。根据场景选择合适的数据结构。