6.2 双和链
6.2.1 双、阴阳、链
“双”(pair)是LISP语言最最基础的数据结构。
对于名语言来说,如果我们把两个数据配在一块,我们就得到一个“双”,而配在一块的这两个数据分别处于他们所构成的这个“双”的阳位和阴位。
另外,如果一个“双”的阴位不是存的一个具体数据而是存的另外一个“双”的索引,此时的这个“双”,也是链(list)。
> (配 1 2) '(1 . 2)
> (双? '(1 . 2)) #t
> (阳 '(1 . 2)) 1
> (阴 '(1 . 2)) 2
> (配 1 (配 2 (配 3 4))) '(1 2 3 . 4)
> (配 1 (配 2 (配 3 (配 4 空)))) '(1 2 3 4)
> (同? (配 1 (配 2 (配 3 (配 4 空)))) (链 1 2 3 4)) #t
> (链 1 2 3 4) '(1 2 3 4)
> (链~ 1 2 3 4) '(1 2 3 . 4)
> (阳 '(1 2 3 4)) 1
> (阴 '(1 2 3 4)) '(2 3 4)
> (阴之阳 '(1 2 3 4)) 2
> (阴之阴阳 '(1 2 3 4)) 3
> (阳 '((1 1.1) 2 3 4)) '(1 1.1)
> (阳之阳 '((1 1.1) 2 3 4)) 1
> (阳之阴阳 '((1 1.1) 2 3 4)) 1.1
> (序链 5 加一) '(1 2 3 4 5)
> (复链 5 'foo) '(foo foo foo foo foo)
> (接 '(1 2) '(3 4) '(5 6) '(7 8)) '(1 2 3 4 5 6 7 8)
6.2.2 例程命名规则
6.2.3 甲–癸、末
6.2.4 第、提、修
> (第 '(a b c d e c f) 2) 'c
> (提 '(a b c d e c f) 'c) 2
> (提* '(a b c d e c f) 'c) '(2 5)
> (提/入 '(a b c d e c f) (入 (x) (或 (同? x 'b) (同? x 'c)))) 1
> (提*/入 '(a b c d e c f) (入 (x) (或 (同? x 'b) (同? x 'c)))) '(1 2 5)
> (修 '(10 15 20 25) 1 1555) '(10 1555 20 25)
> (修/入 '(10 15 20 25) 1 加一) '(10 16 20 25)
6.2.5 出、去
> (出 '(a b c d e f g) 2) '(a b)
> (去 '(a b c d e f g) 2) '(c d e f g)
> (出去 '(a b c d e f g) 2)
'(a b)
'(c d e f g)
6.2.6 间、扁、洗、重
> (始链于链? '(a j) '(a j d k)) #t
> (始链于链? '(a f j) '(a j d k)) #f
> (间插 '(a b c d) '和) '(a 和 b 和 c 和 d)
> (扁平 '((a b) (c d) (e f))) '(a b c d e f)
> (洗乱 '(a b c d e c f)) '(e b c c d a f)
> (查重 '(a b c d e c f)) 'c
> (去重 '(a b c d e c f)) '(a b c d e f)
6.2.7 理、段
> (理 '(21 3 888 666 55 77 1000) <) '(3 21 55 77 666 888 1000)
> (理 '(21 3 888 666 55 77 1000) >) '(1000 888 666 77 55 21 3)
> (理 '("cat" "dog" "chicken" "duck" "fox") 诗<?) '("cat" "chicken" "dog" "duck" "fox")
> (理 '("cat" "dog" "chicken" "duck" "fox") 诗>?) '("fox" "duck" "dog" "chicken" "cat")
> (一段数 10 20) '(10 11 12 13 14 15 16 17 18 19)
> (一段数/间隔 10 20 2) '(10 12 14 16 18 20)
6.2.8 索、探,查、筛、消,计
> (索 'c '(a b c d e f)) '(c d e f)
> (探 'c '((a b) (c d) (e f))) '(c d)
> (查找 正数? '(1 2 -3 4)) 1
> (筛选 正数? '(1 2 -3 4)) '(1 2 4)
> (筛除 正数? '(1 2 -3 4)) '(-3)
> (筛分 正数? '(1 2 -3 4))
'(1 2 4)
'(-3)
> (消 'c '(a b c d e c f)) '(a b d e c f)
> (消/入 偶数? '(1 2 3 4 5 6 7 8)) '(1 3 4 5 6 7 8)
> (消*/以链 '(c e) '(a b c d e c f)) '(a b d f)
> (消*/入 偶数? '(1 2 3 4 5 6 7 8)) '(1 3 5 7)
> (计数 正数? '(1 2 -3 4)) 3
6.2.9 各、巡
> (各 加一 '(1 2 3 4)) '(2 3 4 5)
> (各 + '(1 2 3 4) '(100 200 300 400)) '(101 202 303 404)
> (各都为 正数? '(1 2 -3 4)) #f
> (各中有 负数? '(1 2 -3 4)) #t
> (各左参与 配 '() '(1 2 -3 4)) '(4 -3 2 1)
> (各右参与 配 '() '(1 2 -3 4)) '(1 2 -3 4)
> (筛而各 (入 (x) (且 (正数? x) (加一 x))) '(1 3 -4 5)) '(2 4 6)
> (各而接~ vector->list '(#(1) #(2 3) #(4))) '(1 2 3 4)
> (巡 (入 (i) (行示 i)) (链 2 4 6 8))
2
4
6
8
6.2.10 基础例程
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
序链 : 链内元素是按照一定次序排列的链即为序链。 = build-list
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
6.2.11 额外例程
(require ming/racket/list) | package: ming |
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
汉化
修/入 : 修改链第N处的值为一个例程输出的新值。 = list-update
汉化
汉化
提/入 : 从链中查出某个值(传入例程比对结果)的第 = index-where
汉化
提* : 从链中查出某值的全部第,返回一个存着查找到的所有索引的链。 = indexes-of
汉化
提*/入 : 从链中用查出某值(传入例程比对结果)的全部第,返回一个存着查找到的所有索引的链。 = indexes-where
汉化
汉化
汉化
汉化
汉化
汉化
右出 : 同出类似,除了是从右边开始操作的。 = take-right
汉化
右去 : 同去类似,除了是从右边开始操作的。 = drop-right
汉化
右出去 : 同出去类似,除了是从右边开始操作的。 = split-at-right
汉化
右出/入 : 同出/入类似,除了是从右边开始操作的。 = takef-right
汉化
右去/入 : 同去/入类似,除了是从右边开始操作的。 = dropf-right
汉化
右出去/入 : 同出去/入类似,除了是从右边开始操作的。 = splitf-at-right
汉化
始链于链? : 某链是否是某另一链的起始部分的。 = list-prefix?
汉化
汉化
间插 : 链的每两个元素之间插入另一元素。 = add-between
汉化
汉化
查重 : = check-duplicates
汉化
去重 : = remove-duplicates
汉化
汉化
汉化
汉化
筛除 : = filter-not
汉化
筛而各 : = filter-map
汉化
各而接~ : = append-map
汉化
汉化
一段数/间隔 : A到B之间的一段数组成的链(包括A不包括B),每两个数间隔N = inclusive-range
汉化
互组相合 : = combinations
汉化
序列组合 : = in-combinations
汉化
汉化
汉化
汉化
汉化
汉化