2010-11-01 3 views
0
(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: артефакты».через список, получающий другой список

Работает в других списках. Например, для списка (1 2 3 4); когда я вызываю функцию, (get 2) возвращает (2 3 4).

test.sxml есть список. Я проверил его с list?.

+0

Пожалуйста, проверьте свои факты. Ваша презентация непоследовательна. '(get 2)' конечно не будет работать с определением, которое вы показываете. – Svante

ответ

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

Куда вы играете 'match'? – erjiang

+0

На самом деле это не выглядит иначе, за исключением того, что вы определяете его с помощью сопоставления с образцом. –

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()) (()()()))) ;-> '(()()) 

Я также обобщил его, так что вы можете передать в том, что вы хотите, чтобы соответствовать против.

+0

спасибо большое Tyr !!! :) – pantelis

+0

Идем дальше и принимаем это, поэтому вопрос закрывается –

Смежные вопросы