有人可以解释Cons和Append in scheme之间的区别吗?

时间:2016-04-08 11:35:05

标签: scheme

我读了他们两个,他们似乎都构建了一个列表,它们的区别是什么?

1 个答案:

答案 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