我读了他们两个,他们似乎都构建了一个列表,它们的区别是什么?
答案 0 :(得分:7)
cons
是所有对的构造函数。
正确的列表是()
(空列表,又名nil
)或cdr
是正确列表的一对。最后一个对()
cdr
的任何一对对象是一个正确的列表(除了空列表本身)。
虚线列表是一对没有正确列表的cdr
。因此,最后一个cdr
不是()
的一对数组与此匹配。
;; dotted lists
(cons 1 2) ; ==> (1 . 2)
(cons 1 (cons 2 3)) ; ==> (1 2 . 3) or (1 . (2 . 3))
;; proper lists
(cons 1 '()) ; ==> (1) or (1 . ())
(cons 1 (cons 2 '())) ; ==> (1 2) or (1 . (2 . ()))
append
是一个使用cons
制作列表的过程,该列表包含从左到右的参数列表的所有元素。只有两个列表的append
的常见实现是:
(define (append lst tail)
(if (null? lst)
tail
(cons (car lst)
(append (cdr lst)
tail))))
如果除了last之外的其中一个参数不是正确的列表, append
将失败。尾巴,可以是任何价值:
(append '(1 2 3) '(4 5)) ; ==> (1 2 3 4 5) or (1 . (2 . (3 . (4 . (5 . ())))))
(append '(1 2 3) '(4 5 . 6)) ; ==> (1 2 3 4 5 . 6) or (1 . (2 . (3 . (4 . (5 . 6)))))
(append '(1 2 3) #f) ; ==> (1 2 3 . #f) or (1 . (2 . (3 . #f)))
(append '(1 2 . 3) '(4 5 . 6)) ; ==> error `car` of number not allowed