如何在 Scheme 中编写自己的 "list?" 过程

How to write your own "list?" procedure in Scheme

我正在尝试在方案中编写自己的 'list?' 谓词。我知道列表的定义: 1. 空列表 2. pair,其 cdr 是一对

我知道我的代码是错误的,因为它在每一对上都返回真值,但每一对都不是列表。我不知道如何实现列表的 cdr 也必须是一对的条件。

(define (my-list? x)
  (if (equal? x ()) #t
      (pair? x)))

list? procedure checks if a list is proper(嵌套cons-cells以null值结尾),因此我们必须考虑三种情况:

(define (my-list? x)
  (cond ((null? x) #t)                 ; empty list
        ((pair? x) (my-list? (cdr x))) ; pair, advance recursion
        (else #f)))                    ; atom

一个null值被认为是一个空列表。如果我们是一对,那么我们通过递归调用过程来推进它的 cdr 。如果它不是 null 也不是一对,那么它就是一个原子。这将涵盖边缘情况,例如:

(my-list? 42)
=> #f
(my-list? (cons 1 2))
=> #f

并将 return true 用于适当的列表:

(my-list? '())
=> #t
(my-list? (cons 1 (cons 2 '())))
=> #t