(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?
检查了它。
答案 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 ()) (() () ()))) ;-> '(() ())
我也将其概括为一般,以便您可以提供您希望与之匹配的内容。