首页 > 解决方案 > Guile 方案中的点列表

问题描述

如何专门检查(a . b)Guile 形式的点列表?的dotted-listsrfi-1 奇怪地返回 #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

标签: schemeguile

解决方案


请注意,这(atom . (x1 ... xn))是另一种写法(atom x1 ... xn),所以(c . ((d . 3) (e . 4)))就相当于(c (d . 3) (e . 4))which 只不过是一个三元素列表(因此dotted-list?在这种情况下返回 false)。

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

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

推荐阅读