2009-06-12 7 views
1

Comment parcourir une liste ou extraire un élément d'une liste dans le schéma?Récupérer des éléments de la liste dans le schéma

Comment puis-je nommer chaque élément (comme nous le faisons pour les variables en java) dans une liste?

Merci d'avance. Je veux comparer chaque point d'une liste à un autre point. Donc, comme nous le faisons en java ou python-

for(int i;i<list.size();i++){ 
    if (list[i]> k){ 
     //do something 
    } 

} 

Comment puis-je faire quelque chose de similaire dans le schéma?

+0

Je ne comprends pas la question, pourriez-vous clarifier un peu? Voulez-vous nommer chaque valeur dans une liste? – Jonas

+0

Merci Jonas pour votre réponse. J'ai édité la question. S'il te plaît vérifie le. – fireball003

Répondre

0

Exemple

`(define func 
    (lambda (a b) 
    (if (> a b) 
     (dosomething a))))` 

Dans ce cas, "dosomething" serait une autre définition, soit prédéfinie ou non. Disons que la définition est analogue à une "fonction", par exemple square() ou mult().

Je pense qu'un récursive comme cela devrait fonctionner pour la liste a besoin:

(define (func list) (if (> (car list) k) (dosomething)) (func (cdr list)))

Vous pouvez également écrire deux définitions, ont une contient une liste et l'envoyer au premier exemple et renvoyer le résultat , comparez, faites quelque chose ou non, et continuez.

+0

Mais où est la liste? Je suis supposé comparer chaque élément de la liste un par un. Mais ici, il semble que seules deux valeurs sont comparables. Mon problème principal est d'extraire l'élément de la liste (comme nous le faisons dans la liste java [i]). Comment faire ça? – fireball003

5
(map (lambda (x) (if (< x k) (dosomething x) x)) list) 
2

Vous pouvez utiliser for-each:

 
    (let ((a-list (list 9 2 7 6 1 4 3 8 1)) 
      (k 4) 
      (something display)) 
     (for-each (lambda (i) ; The 'name' of the list element is i 
        (if (> i k) 
         (something i) ; Do something with i 
         #f)) ; Do nothing 
       a-list)) 

for-each est similaire à map, mais la valeur de retour est non spécifiée. Il est appelé pour ses effets secondaires seulement. Sur une note de côté, il me semble que vous apprenez un schéma provenant d'un arrière-plan java (ce qui est correct). Les programmes de schémas sont souvent écrits dans un style différent de Java. Le schéma est un langage fonctionnel et les constructions en boucle ne sont pas utilisées aussi souvent. Prenez un livre sur Scheme, par exemple The Scheme Programming Language ou How to Design Programs pour apprendre à écrire des programmes "the Scheme way"

+0

Merci encore Jonas. Oui, j'ai beaucoup appris sur java, puis sur C puis sur python. Tous les langages de tuyau ont plus ou moins le même modèle tandis que le schéma est complètement différent. Ainsi, est le doc de régime qui ne semble pas amical pour ceux qui viennent de différentes pratiques de programmation. Cependant, je quitte cette pratique de vol et suivra les livres. – fireball003

4

leppie et Jonas donnent la bonne réponse pour l'itération sur une liste dans Scheme. Cependant, si vous avez besoin d'une seule valeur dans une liste, utilisez list-ref.

(let ((l '(1 2 3 4))) 
    (list-ref l 2)) 

=> 3 

est principalement équivalent au code Java

int[] l = new int[] { 1, 2, 3, 4 }; 
return l[2]; 
0

Vous pouvez utiliser list-ref pour tirer une valeur dans une liste par son index. Mais notez que dans les listes de schémas sont réellement des listes liées - ainsi (list-ref l 100) aura besoin de suivre à travers 100 références. Si vous voulez vraiment des valeurs d'accès aléatoire, utilisez un vecteur.

2

Vous devriez penser différemment lorsque vous écrivez dans un langage fonctionnel. En fait, vous devriez oublier la pensée de programmation (pour les boucles, etc.), définissez simplement ce que vous voulez. Par exemple "Je veux appliquer une action à chaque nombre impair de ma liste." Vous écririez:

(map an-action 
    (filter odd? my-list)) 

Ou la condition peut être l'élément> 4

(define (higher-than-four? n) (> n 4)) 
(map an-action 
    (filter higher-than-four? 
      my-list)) 

Pour une action, vous donnez une fonction:

> (map number->string 
     (filter higher-than-four? my-list)) 
("5" "6" "7" "8" "9" "10") 
0

Je ne sais pas si c'est ce que vous voulez, mais cela va à la liste entière (liée) et compare chaque élément avec l'élément que vous passez en paramètre:

(define (compare aList element) 
     (if (> element (car aList)) 
     (display (car aList)) ;here do something great 
     ;here the else if you have 
     ) 
     (if (not (null? (cdr aList))) 
       (compare (cdr aList) element)) 'ok) 

Le problème que c'est une procédure, c'est peut-être utile pour quelqu'un.

salue