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])))
请注意,与任何头脑简单的定义一样,这无法在循环列表上停止。
如何专门检查 (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])))
请注意,与任何头脑简单的定义一样,这无法在循环列表上停止。