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

Pro*_*ent 3 scheme

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

Syl*_*ter 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 . ()))
Run Code Online (Sandbox Code Playgroud)

append是一个过程,用于cons从左到右创建包含参数列表的所有元素的列表.append只有两个列表的常见实现是:

(define (append lst tail)
  (if (null? lst)
      tail
      (cons (car lst)
            (append (cdr lst)
                    tail))))
Run Code Online (Sandbox Code Playgroud)

append如果除了last之外的其中一个参数不是正确的列表,则会失败.尾巴,可以是任何价值:

(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
Run Code Online (Sandbox Code Playgroud)