以下是我列出的子列表:
(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!
有人可以向我解释一下该做什么吗?
答案 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)))