让我们说我们有一个这样的列表(有更多的元素,但方法应该是相同的):
(define l '((cons 'name 'john)
(cons 'sur 'asurname)
(cons 'name 'george)
(cons 'sur 'georgesurname)))
我们可以随时在现有列表中添加更多元素。哪个是最有效的方式让我们说写一个带有用户名并返回姓氏的函数:
类似的东西:
(define display-surname
(lamdba (name)
(...)))
在这种情况下,一般做法是什么?任何人都可以指出如何的示例/链接?
答案 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