2010-11-01 4 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*) 

J'ai cette fonction récursive qui parcourt la liste et retourne le reste d'une liste qui commence par "opm: artefacts".en parcourant une liste en récupérant une autre liste

Cela fonctionne sur d'autres listes. Par exemple, cela fonctionne pour la liste (1 2 3 4); Lorsque j'appelle la fonction, (get 2) renvoie (2 3 4).

test.sxml est une liste. Je l'ai vérifié avec list?.

+0

Veuillez vérifier vos faits. Votre présentation est incohérente. '(get 2)' ne fonctionnera certainement pas avec la définition que vous montrez. – Svante

Répondre

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

Où obtenez-vous 'match'? – erjiang

+0

Cela ne semble pas vraiment différent, sauf que vous le définissez avec la correspondance de modèle. –

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

J'ai aussi généralisé afin que vous puissiez remettre ce que vous voulez qu'il match contre.

+0

merci beaucoup Tyr !!! :) – pantelis

+0

Allez-y et acceptez-le, alors la question se ferme –

Questions connexes