通过列表检索其他列表

时间:2010-11-01 20:15:45

标签: scheme

(define *graph* (read (open-input-file "test.sxml")))

(define get
  (lambda (l)
    (cond ((null? l) '())
          ((equal? 'opm:artifacts (car l))  l)
          (else (get (cdr l))))))

(get *graph*)

我有这个遍历列表的递归函数,并返回以“opm:artifacts”开头的列表的其余部分。

它适用于其他列表。 例如,它适用于列表(1 2 3 4);当我调用该函数时, (get 2)会返回(2 3 4)

test.sxml是一个列表。我用list?检查了它。

2 个答案:

答案 0 :(得分:0)

(define (get l)
  (match l
    [(? null?) '()]
    [(list 'opm:artifacts _ ...) l]
    [(list _ rs ...) (get rs)]))

答案 1 :(得分:0)

(define (get mat ls*)
  (define (get* ls)
    (cond ((null? ls) '())
          ((and (list? (car ls)) (not (null? (car ls))))  
           (if (equal? mat (caar ls)) 
               (car ls)
               (let ((sub-result (get* (car ls))))
                 (if (null? sub-result)
                     (get* (cdr ls))
                     sub-result))))

          (else (get* (cdr ls)))))
  (let ((result (get* ls*)))
    (if (null? result)
        '()
        (cdr result))))

(get 'b '(a (b c d) e)) ;-> '(c d)
(get 'b '((a (b c d) e))) ;-> '(c d)
(get '() '( 4 6 () (2 ()) (() () ()))) ;-> '(() ())

我也将其概括为一般,以便您可以提供您希望与之匹配的内容。