Guile Scheme 中的点列表

Dotted lists in Guile Scheme

如何专门检查 (a . b) Guile 形式的点列表? srfi-1 的 dotted-list 奇怪地 returns #t 也为例如数字(从什么时候开始也有数字列表?https://www.gnu.org/software/guile/manual/html_node/SRFI_002d1-Predicates.html)! pair? 也将对普通列表求值为 #t。有没有办法将 (a . b) 构造与其他事物区分开来,而 b 部分(cdr)本身可以是任何对象,包括其他关联列表等?

这是我没想到也无法理解的:

(dotted-list? '(c . ((d . 3)
                     (e . 4)))) ; ===> #f

(dotted-list? 3) ; ===> #t

注意 (atom . (x1 ... xn))(atom x1 ... xn) 的另一种写法,所以 (c . ((d . 3) (e . 4))) 等价于 (c (d . 3) (e . 4)) 只不过是一个三元素列表(对于这个原因 dotted-list? returns 在这种情况下是错误的)。

如果您不喜欢 srf-1 中给出的 dotted-list? 定义,请定义您自己的版本:

(define (my-dotted-list? l)
  (and (dotted-list? l)
       (pair? l)))

如果你想要一个独立的定义(一个不依赖于你不同意的现有定义的定义),那么我认为这是合理的:

(define (dotted-list? c)
  (and (cons? c)
       (cond [(cons? (cdr c))
              (dotted-list? (cdr c))]
             [(null? (cdr c))
              #f]
             [else #t])))

请注意,与任何头脑简单的定义一样,这无法在循环列表上停止。