On this page:
6.2.1 双、阴阳、链
6.2.2 例程命名规则
6.2.3 甲–癸、末
6.2.4 第、提、修
6.2.5 出、去
6.2.6 间、扁、洗、重
6.2.7 理、段
6.2.8 索、探,查、筛、消,计
6.2.9 各、巡
6.2.10 基础例程
双?
空?
链~
链?
序链
各都为
各中有
各左参与
各右参与
消/  
消/  
消*/  以链
消*/  等/  以链
消*/  齐/  以链
索/  
索/  
索/  
查找
筛选
探/  
探/  
探/  
阳之阳
阳之阴
阴之阳
阴之阴
阳之阳阳
阳之阳阴
阳之阴阳
阳之阴阴
阴之阴阴
阴之阴阳
阴之阳阴
阴之阳阳
阳之阳阳阳
阴之阳阳阳
阳之阴阳阳
阴之阴阳阳
阳之阳阴阳
阴之阳阴阳
阳之阴阴阳
阴之阴阴阳
阳之阳阳阴
阴之阳阳阴
阳之阴阳阴
阴之阴阳阴
阳之阳阴阴
阴之阳阴阴
阳之阴阴阴
阴之阴阴阴
6.2.11 额外例程
末*
去甲
复链
修/  
提/  
提*
提*/  
出去
出/  
去/  
出去/  
右出
右去
右出去
右出/  
右去/  
右出去/  
始链于链?
接~
间插
扁平
查重
去重
计数
洗乱
筛分
筛除
筛而各
各而接~
一段数
一段数/  间隔
互组相合
序列组合
最小者/  
最大者/  
分组
笛卡尔值
消/  
消*/  
8.6

6.2 双和链

6.2.1 双、阴阳、链

“双”(pair)是LISP语言最最基础的数据结构。

对于名语言来说,如果我们把两个数据在一块,我们就得到一个“双”,而配在一块的这两个数据分别处于他们所构成的这个“双”的位和位。

另外,如果一个“双”的阴位不是存的一个具体数据而是存的另外一个“双”的索引,此时的这个“双”,也是list)。

Examples:
> ( 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 甲–癸、末

Examples:
> ( '(1 2 3 4))

1

> ( '(1 2 3 4))

2

> ( '(1 2 3 4))

4

> (末* '(1 2 3 4))

'(4)

> (去甲 '(1 2 3 4))

'(2 3 4)

6.2.4 第、提、修

Examples:
> ( '(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 出、去

Examples:
> ( '(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 间、扁、洗、重

Examples:
> (始链于链? '(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 理、段

Examples:
> ( '(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 索、探,查、筛、消,计

Examples:
> ( '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 各、巡

Examples:
> ( 加一 '(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 基础例程

汉化

 : 把两个参数组合成一个双 = cons

汉化

双? :  = pair?

汉化

 : 返回居于阳位的数据。 = car

汉化

 : 返回居于阴位的数据。 = cdr

汉化

空? :  = null?

汉化

 :  = null

汉化

 : 将数据依次排列组成链。 = list

汉化

链~ : 将数据依次排列组成链,链结尾无空。 = list*

汉化

链? :  = list?

汉化

序链 : 链内元素是按照一定次序排列的链即为序链。 = build-list

汉化

 : 返回链的第N个元素(从0起),即以链中的序号为参数来索引出相应的元素。 = list-ref

汉化

 : 返回链的长度 = length

汉化

 : 从链中去掉N个元素后余下的链。 = list-tail

汉化

 : 把多链连接在一块组成一个链 = append

汉化

 : 反向排序。 = reverse

汉化

 : 把某一例程依次映用到各个元素上,各个元素作为其参数。 = map

汉化

各都为 : 链中各个元素全都是...的吗? = andmap

汉化

各中有 : 链中各个元素中有是...的吗? = ormap

汉化

 : 酒席上给全座依次斟酒一遍称为巡杯(酒过三巡),这里意思是链内元素依次执行某一个例程。 = for-each

汉化

各左参与 : 链中各个元素依次作为某例程的最左遍的参数,和本有剩余的参数一块依次反复的应用到某例程上。 = foldl

汉化

各右参与 : 链中各个元素依次作为某例程的最右遍的参数,和本有剩余的参数一块依次反复的应用到某例程上。 = foldr

汉化

 : 作为比较来消去某值在链中的全部存在。 = remove

汉化

消/等 : 作为比较来消去某值在链中的全部存在。 = remq

汉化

消/齐 : 作为比较来消去某值在链中的全部存在。 = remv

汉化

消*/以链 : 作为比较来消去某值在链中的全部存在。 = remove*

汉化

消*/等/以链 :  = remq*

汉化

消*/齐/以链 :  = remv*

汉化

 : 整理、排序的意思 = sort

汉化

 : 作为比较来查询某值,返回链中某值和其之后的数据组成的新链 = member

汉化

索/齐 :  = memv

汉化

索/等 :  = memq

汉化

索/入 :  = memf

汉化

查找 : 筛选出第一个符合条件的链中元素并返回之。 = findf

汉化

筛选 : 筛选出符合条件的链中元素并组成新链返回。另见:筛分筛除 = filter

汉化

 : 作为比较来查找出联链中阳位是某值的元素链。 = assoc

汉化

探/等 :  = assq

汉化

探/齐 :  = assv

汉化

探/入 :  = assf

汉化

阳之阳 : 对取出的位数据再次取 = caar

汉化

阳之阴 :  = cdar

汉化

阴之阳 :  = cadr

汉化

阴之阴 :  = cddr

汉化

阳之阳阳 :  = caaar

汉化

阳之阳阴 :  = cdaar

汉化

阳之阴阳 :  = cadar

汉化

阳之阴阴 :  = caadr

汉化

阴之阴阴 :  = caddr

汉化

阴之阴阳 :  = caddr

汉化

阴之阳阴 :  = cdadr

汉化

阴之阳阳 :  = caadr

汉化

阳之阳阳阳 :  = caaaar

汉化

阴之阳阳阳 :  = caaadr

汉化

阳之阴阳阳 :  = caadar

汉化

阴之阴阳阳 :  = caaddr

汉化

阳之阳阴阳 :  = cadaar

汉化

阴之阳阴阳 :  = cadadr

汉化

阳之阴阴阳 :  = caddar

汉化

阴之阴阴阳 :  = cadddr

汉化

阳之阳阳阴 :  = cdaaar

汉化

阴之阳阳阴 :  = cdaadr

汉化

阳之阴阳阴 :  = cdadar

汉化

阴之阴阳阴 :  = cdaddr

汉化

阳之阳阴阴 :  = cddaar

汉化

阴之阳阴阴 :  = cddadr

汉化

阳之阴阴阴 :  = cdddar

汉化

阴之阴阴阴 :  = cddddr

6.2.11 额外例程

汉化

 : 第一个的意思,源自中国古代文字记序符号十天干。 = first

汉化

 : 第二个的意思,源自中国古代文字记序符号十天干。 = second

汉化

 :  = third

汉化

 :  = fourth

汉化

 :  = fifth

汉化

 :  = sixth

汉化

 :  = seventh

汉化

 :  = eighth

汉化

 :  = ninth

汉化

 :  = tenth

汉化

 :  = last

汉化

末* : 取出最后一双元素。 = last-pair

汉化

去甲 : 链除去甲以外剩下的链。 = rest

汉化

复链 : 链内各个元素相同的链即为复链,类比昆虫的“复眼”一词取名。 = make-list

汉化

 : 修改链N处的值为一个新的值。 = list-set

汉化

修/入 : 修改链N处的值为一个例程输出的新值。 = list-update

汉化

 : 从链中查出某个值的 = index-of

汉化

提/入 : 从链中查出某个值(传入例程比对结果)的 = index-where

汉化

提* : 从链中查出某值的全部,返回一个存着查找到的所有索引的链。 = indexes-of

汉化

提*/入 : 从链中用查出某值(传入例程比对结果)的全部,返回一个存着查找到的所有索引的链。 = indexes-where

汉化

 : 从链中取出来的N个元素所组成的链。 = take

汉化

出去 : 生成两个链:N个元素,N个元素。 = split-at

汉化

出/入 : 类似,除了参数是 = takef

汉化

去/入 : 类似,除了参数是 = dropf

汉化

出去/入 : 出去类似,除了参数是 = splitf-at

汉化

右出 : 类似,除了是从右边开始操作的。 = take-right

汉化

右去 : 类似,除了是从右边开始操作的。 = drop-right

汉化

右出去 : 出去类似,除了是从右边开始操作的。 = split-at-right

汉化

右出/入 : 出/入类似,除了是从右边开始操作的。 = takef-right

汉化

右去/入 : 去/入类似,除了是从右边开始操作的。 = dropf-right

汉化

右出去/入 : 出去/入类似,除了是从右边开始操作的。 = splitf-at-right

汉化

始链于链? : 某链是否是某另一链的起始部分的。 = list-prefix?

汉化

接~ : 类似,除了结尾无空 = append*

汉化

间插 : 链的每两个元素之间插入另一元素。 = add-between

汉化

扁平 :  = flatten

汉化

查重 :  = check-duplicates

汉化

去重 :  = remove-duplicates

汉化

计数 :  = count

汉化

洗乱 :  = shuffle

汉化

筛分 : 符合条件的元素选出为链,和剩下的链,共计返回两个值。另见:筛选 = partition

汉化

筛除 :  = filter-not

汉化

筛而各 :  = filter-map

汉化

各而接~ :  = append-map

汉化

一段数 : A到B之间的一段数组成的链(包括A不包括B) = range

汉化

一段数/间隔 : A到B之间的一段数组成的链(包括A不包括B),每两个数间隔N = inclusive-range

汉化

互组相合 :  = combinations

汉化

序列组合 :  = in-combinations

汉化

最小者/入 :  = argmin

汉化

最大者/入 :  = argmax

汉化

分组 :  = group-by

汉化

笛卡尔值 :  = cartesian-product

汉化

消/入 : 以例程做对比来消除某一符合条件元素。另见: = remf

汉化

消*/入 : 以例程做对比来消除所有符合条件元素。另见: = remf*