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

Calculating the number of matches for every sublist separately

这是我的带有子列表的大列表:

   (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 个元素。

我希望输出数据是这样的:

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

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

set!: bad syntax in: set!

有人指导可以告诉我该怎么做吗?

你的 set! 语法错误:

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

这是对 set! 的无效使用,试图 "mutate the structure" 列表 no-point-lst,更改其第一个中实际包含的内容位置。

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

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

如果这对你的算法很重要,你可以在 R5RS Scheme 中使用 set-car!,或者在 Racket 中使用 set-mcar!。或者您可以使用 vectors.

但您也可以将代码重组为

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