分别计算每个子列表的匹配数

时间:2018-05-05 13:53:21

标签: racket sublist

以下是我列出的子列表:

   (define family
      (list
       (list 'Daddy 't-shirt 'raincoat 'sunglasses 'pants 'coat 'sneakers)
       (list 'Mamma 'high-heels 'dress 'pants 'sunglasses 'scarf)
       (list 'son 'pants 'sunglasses 'sneakers 't-shirt 'jacket)
       (list 'daughter 'bikini 'Leggings 'sneakers 'blouse 'top)))

我想将family与这个简单的列表进行比较:

   (list 'sneakers 'dress 'pants 'sunglasses 'scarf)

每个匹配应该给出1分,我希望为每个子列表分别计算点。

以下是代码:

;检查列表中是否存在元素

(define occurs?
  (lambda (element lst)                  
    (cond
      [(and (null? element) (null? lst))] 
      [(null? lst) #f]
      [(pair?  lst)
       (if
        (occurs? element (car lst)) #t
        (occurs? element (cdr lst)))]
      [else (eqv? element lst)])))
;--------------------------------------    

只创建名称列表。

(define (name-list lst)
  (list (map car lst)))

每个子列表都有一个名称(子列表的车)。名称列表转到每个子列表的点列表。除了下面的代码,我的所有代码都按照我的意愿运行。问题出在point-list代码中。

(define (point lst db)
  (let ((no-point (name-list db)))
    (cond ((or (null? lst) (null? db)) '())
          (set! (first no-point) (comp lst (rest db)))
          (else (point lst (cdr db))))))

Daddy-sublist共有3个元素。 Mamma-sublist共有4个元素,son-sublist 3元素和daugther-sublist 1元素。

我希望outdata是这样的:

> (comparison (list 'sneakers 'dress 'pants 'sunglasses 'scarf) family)
'(3 4 3 1)

我的代码无法正常运行。我得到这个Eror:

set!: bad syntax in: set!

有人可以向我解释一下该做什么吗?

1 个答案:

答案 0 :(得分:0)

set!语法错误:

          (set! (first no-point-lst) (comparison lst (rest db)))

这是对set!的无效使用,试图“改变列表no-point-lst的结构”,改变第一个位置实际保存的内容。

set!无法做到这一点。它可用于更改绑定,即变量的值:(let ((a 1)) (set! a 2))

在Common Lisp中,他们可以编写(setf (first list) newval),但不能编写Scheme / Racket。

如果这对您的算法至关重要,您可以在R5RS方案中使用set-car!,或在Racket中使用set-mcar!。或者您可以使用vectors执行此操作。

但您也可以将代码重组为

        (set! no-points-list 
              (cons 
                 (comparison lst (rest db))
                 (cdr no-points-list)))