【问题标题】:Scheme "mcar: contract violation"方案“mcar:违反合同”
【发布时间】:2017-10-25 14:53:42
【问题描述】:
(define (create-polygon ptlist)
  (if (null? ptlist) 0
      (append (list (make-seg (car ptlist) (cadr ptlist))) (create-polygon (cdr ptlist)))))

我的问题是,每当我尝试运行此程序时,它都会出现违反合同的错误。我知道您不能 car 或 cdr 空列表,但我正在检查它是否为空。那么这里有什么问题呢?

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    考虑以下几点:

    (define lst '(1))
    
    (null? lst)
    => #f
    
    (cadr lst)
    => cadr: contract violation
    

    如您所见,发生合约违规是因为(null? lst) 只检查列表当前是否为空。但是如果你使用cadr,也就是(car (cdr lst)),那么你还要检查(cdr lst)是否为空。

    因此,您的 if 语句需要同时检查 (null? ptlist)(null? (cdr ptlist)),最好使用 cond

    【讨论】:

      猜你喜欢
      • 2016-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多