Racket 编程

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"

小结

结构体用于建模领域数据,向量用于高性能随机访问,哈希表和集合提供高效的查找能力。根据场景选择合适的数据结构。