搜索包含列表或conses的列表

时间:2012-05-11 22:04:46

标签: lisp scheme chicken-scheme

让我们说我们有一个这样的列表(有更多的元素,但方法应该是相同的):

(define l '((cons 'name 'john)
            (cons 'sur 'asurname)
            (cons 'name 'george)
            (cons 'sur 'georgesurname)))

我们可以随时在现有列表中添加更多元素。哪个是最有效的方式让我们说写一个带有用户名并返回姓氏的函数:

类似的东西:

(define display-surname
  (lamdba (name)
   (...)))

在这种情况下,一般做法是什么?任何人都可以指出如何的示例/链接?

1 个答案:

答案 0 :(得分:2)

最好在单个列表中表示每条记录(name,surname),然后将数据作为对列表列表处理:

(define lst '(((name . a) (sur . b)) ((name . c) (sur . d))))

通过上面的表示,找到一个名字(给出一个姓氏)就像这样简单(假设记录中的每个字段总是在同一个位置找到):

(define display-surname
  (lambda (lst name)
   (cond ((null? lst) #f)
         ((eq? (cdaar lst) name) (cdadar lst))
         (else (display-surname (cdr lst) name)))))

您可以进一步简化(再次假设记录中的每个字段始终位于相同位置),方法是按照以下方式表示上述数据,并在display-surname中进行相应的更改:

(define lst '((a . b) (c . d)))

(define display-surname
  (lambda (lst name)
   (cond ((null? lst) #f)
         ((eq? (caar lst) name) (cdar lst))
         (else (display-surname (cdr lst) name)))))

无论哪种方式,这都有效:

(display-surname lst 'a)
> 'b

(display-surname lst 'x)
> #f