方案:为什么我得到这个错误 - 断言违规:错误类型的参数[car](car'())

时间:2017-10-18 05:01:42

标签: error-handling functional-programming scheme

我在计划中的职能是试图获得省份细节:

(define (getProvincesHelper sales provincesList)

  (if (null? sales) 

      provincesList

      ( getProvincesHelper (cdr sales) (append  (list (cadr(cadddr sales))) provincesList))

  ) 
)

(define (getProvinces sales)

 (getProvincesHelper sales '())

)

数据列表采用此格式

;(orderNum (orderDate shipDate) (grossSale discount profit unitPrice) (deliveryMethod province) product)

(3 ("10/13/2010" "10/20/2010") (261.54 0.04 -213.25 38.94) ("Regular Air" "Nunavut") "Eldon Base for stackable storage shelf, platinum")

我收到错误:

assertion-violation: argument of wrong type [car]
                     (car '())

2 个答案:

答案 0 :(得分:0)

此代码:

(cadr (cadddr sales))

要求sales具有足够的结构,以便您不会从非对值中取出carcdr。这适用于其名称中的每个a和d:

(cadr '(1))

出现同样的错误,cdr有效,但car上的'()却没有。

答案 1 :(得分:0)

如果您有更大的列表或树状结构,则可以使用list-ref。它需要一个列表并返回以0开头的第n个元素。

如果你想得到" Nunavut"从您的示例列表中,您必须获取第4个元素,这也是一个列表。而这个元素的cdr的车就是结果。

示例:

;;        (orderNum (orderDate    shipDate)     (grossSale discount profit  unitPrice) (deliveryMethod province)  product)
(let ((l '(3        ("10/13/2010" "10/20/2010") (261.54    0.04     -213.25 38.94)     ("Regular Air"  "Nunavut") "Eldon Base for stackable storage shelf, platinum")))
  (cadr (list-ref l 3)))