列表中结构字段的getters

时间:2016-02-29 03:37:12

标签: scheme

我定义了一个这样的结构

(struct anobject name1 name2 name3)

我创建包含这些结构的列表

(define list1 (list (anobject name1a name2a name3a) 
                    (anobject name1b name2b name3b)))

然后我希望获得name2或name3给定name1的值。

一种方法是编写2个函数

(define (get-name2 name1)
    ...)

(define (get-name3 name1)
   ...)

循环遍历列表,查找name1与name1 arg匹配的struct,并返回我们想要的属性。

但是这两个函数除了一个访问name2之外基本相同,另一个访问name3。如果我添加更多字段,我将不得不添加更多功能。

使用单个函数(或其他方式)检索name2 / name3是否有更好的方法?

1 个答案:

答案 0 :(得分:1)

我认为更好的方法是首先使用库函数找到具有匹配的name1字段的项目,然后提取所需的字段。
您可以将访问器函数作为参数传递,因此您只需要一个函数。

在球拍中的例子,但它不应该太难以适应"你的"方案:

(require srfi/1)  ; For 'find'

(struct anobject (name1 name2 name3))

(define (lookup n1 field ls)
  (let ((r (find (lambda (x) (equal? (anobject-name1 x) n1)) ls)))
    (and r (field r))))

使用示例:

> (define l1 (list (anobject "name1a" "name2a" "name3a") 
                   (anobject "name1b" "name2b" "name3b")))
> (lookup "name1b" anobject-name2 l1)
"name2b"
> (lookup "name1b" anobject-name3 l1)
"name3b"
> (lookup "name1c" anobject-name3 l1)
#f