【发布时间】:2016-08-31 10:13:06
【问题描述】:
我有 2 种带有键值对的列表:
(define pairs1 (list (list 1 2)(list 10 20)(list 100 200)))
(define pairs2 (list (cons 1 2)(cons 10 20)(cons 100 200)))
我想用一个函数在两种列表中按值搜索。我尝试了以下操作(一个中的“cdr”和其他 fn 中的“第二”),但它们每个都使用一个列表:
(define (assoc_val1 val spair)
(for/list ((item spair) #:when (equal? (cdr item) val))
item))
(define (assoc_val2 val spair)
(for/list ((item spair) #:when (equal? (second item) val))
item))
我可以有一个对这两种列表都有效的函数吗?另外,是否有一个很好的链接来解释 (list 1 2)、(cons 1 2) 和 '(1 2) 之间的区别?
编辑:修改@Sylwester 提供的答案,以下函数可以检测并处理两个列表:
(define (assoc2* haystack needle [is-equal? equal?] )
(if (list? (car haystack))
(findf (λ (e) (is-equal? needle (second e))) haystack)
(findf (λ (e) (is-equal? needle (cdr e))) haystack)
))
(assoc2* pairs1 20)
(assoc2* pairs2 20)
输出:
'(10 20)
'(10 . 20)
【问题讨论】:
-
第一个:为什么要有两种键值表示。选择一个。
-
感谢主要讨论列表和报价单的链接。列表与缺点表格的任何链接?另外,如果必须在应用程序中大量使用键值对,最好的方法是什么?