列表中结构字段的获取器

Getters for struct fields in a list

我这样定义一个结构体

(struct anobject name1 name2 name3)

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

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

然后我想得到给定 name1 的 name2 或 name3 的值。

一种方法是编写 2 个函数

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

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

循环遍历列表以查找 name1 与 name1 arg 匹配的结构和 return 我们想要的 属性。

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

是否有更好的方法通过单一函数(或其他方式)检索 name2/name3?

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

Racket中的示例,但适应"your"方案应该不难:

(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