2016-02-29 13 views
0

我這樣定義吸氣劑的結構域在列表中

(struct anobject name1 name2 name3) 

一個struct我創建一個包含這些結構

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

話,我想獲得名2或NAME3給出名1的值列表。

一種方法是寫兩個功能

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

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

通過列表尋找其名1相匹配的姓名1 ARG並返回我們想要的屬性結構循環。

但是這兩個函數基本上是相同的,除了一個訪問name2,另一個訪問name3。如果我添加更多的字段,我將不得不添加更多的功能。

有沒有更好的方式檢索name2/name3與一個單一的功能(或其他方式)?

回答

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