这篇笔记,说明elisp相关的列表操作函数
(注,CAR是Contents of the Address part of the Register,表示列表的头一个元素;CDR是Contents of the Decrement part of the Register)
这种命名属于历史遗留问题.
*(cons CAR CDR)
---将返回一个新的列表(CAR CDR),CAR表示列表的头一个部分,CDR表示列表除CAR的其余部分,后面还有"car,cdr"函数的意思也是这个.
说明,1)CDR至少是个空列表.2)不改变CDR
---示例
(cons 1 '(2 3)) => (1 2 3)
*(car LIST)
---返回列表的头元素,可能是一个列表,原子或nil.不改变原LIST.
---示例
(car '(a b c)) => a
*(cdr LIST)
---返回除头元素以外的剩余列表.不改变原LIST
---示例
(cdr '((1 2) 3)) => (3)
*(nthcdr N LIST)
---对LIST执行N次cdr操作后,返回的剩余列表.不改变原LIST
---示例
(nthcdr 2 '(1 (2 3) 4)) => (4)
*(setcar LIST newCAR)
---将LIST的CAR设置为newCAR,执行返回newCAR.
改变原LIST
---示例
(setq list '(1 2 3)) => (1 2 3)
(setcar list 'a) => a
list => (a 2 3)
*(setcdr LIST newCDR)
---将LIST的CDR部分设为newCDR,执行返回newCDR.
改变原LIST
---示例
(setq list '(1 2 3)) => (1 2 3)
(setcdr list (a b)) => (a b)
list => (1 a b)
(setcdr list ()) => nil
list => (1)
(setcdr list ()) => nil
list => (1) ;;可见,setcdr对列表第一項无效,即使只有一项时
*(length LIST/STRING)
---返回列表元素个数或者字符串的字符数
---示例
(length '(1 2 3)) => 3
(length "海上升明月") => 5