【问题标题】:Dotted lists in Guile SchemeGuile 方案中的点列表
【发布时间】:2020-01-23 09:27:12
【问题描述】:

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

【问题讨论】:

  • cdr 是正确列表的对是正确列表。 “点”版本将是 '(c . ((d . 3) . (e . 4)))。

标签: scheme guile


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 2020-09-10
      • 2016-11-29
      • 2019-09-12
      • 2012-05-25
      • 2011-12-29
      • 2016-12-11
      • 1970-01-01
      • 2019-05-31
      相关资源
      最近更新 更多