2010-10-25 8 views
1

Je cherche une fonction dans Scheme pour remplacer un élément d'une équation par une valeur.Remplacer un élément dans une liste dans le schéma

Exemple: '(+ a b c a) avec (1 2 3) devrait me donner '(+ 1 2 3 1). (Je ne veux pas résoudre l'équation, il était juste un exemple)

Fondamentalement, je veux dire que a = 1, b = 2, c = 3

Pour continuer, j'extrais les variables de ma première liste dans une autre liste. Ensuite, j'ai reçu les valeurs attendues dans une autre liste. Maintenant, je veux assigner des valeurs aux variables.

Des conseils sur la façon dont je procède? Merci beaucoup.

+1

Avez-vous un mappage de 'a-> 1',' b-> 2', etc. stockés, ou est l'ordre des éléments dans les deux listes le facteur déterminant? – BudgieInWA

+0

Oui. Mais les vars peuvent apparaître plus d'une fois. – esylvestre

+0

Répondre «Oui» à une question ou une autre, tout en étant très programmeur, ne nous dit aucune information. Aussi, si c'est dans l'ordre, alors pourquoi le + est-il exclu? – Greg

Répondre

3

Vous pouvez utiliser une "liste d'associations" de mappages qui ressemble à ((a 1) (b 2) (c 3)).

assq peut récupérer la paire correspondante. Donc, pour tout dans votre liste d'origine, vous pouvez le rechercher en utilisant assq et ensuite le remplacer.

Alors:

(lambda (ls a-list) 
    (map (lambda (x) 
      (let ((lookup (assq x a-list))) 
      (if lookup 
       (cadr lookup) 
       x))) 
     ls))) 

prendrions une liste et une liste d'associations et tout remplacer dans la liste originale avec son remplacement (s'il y en a un).

+0

Merci. Je vais essayer! – esylvestre

+0

Très bien, exactement ce que je cherchais. Merci beaucoup! Je vais marquer votre réponse comme résolue demain. – esylvestre

1

N'est-ce pas ce que fait let?

> (let ((a 1) (b 2) (c 3)) 
    (+ a b c b)) 
=> 8 

Si vous ne voulez pas d'évaluer l'expression:

> (let ((a 1) (b 2) (c 3)) 
    `(+ ,a ,b ,c ,a)) 
=> (+ 1 2 3 1) 
+0

Hum, je vais essayer pour voir si ça marche dans mon cas. – esylvestre

Questions connexes