A propos de vos questions:
- Bien que vous pouvez mettre à jour une variable globale à partir d'une fonction à l'aide
(set! x <value>)
, vous devriez vraiment pas, ce n'est pas la meilleure façon de programmer en utilisant le schéma; à la place, vous devez renvoyer une nouvelle liste de votre procédure et, si nécessaire, affecter la valeur renvoyée à x
par la suite
- Que voulez-vous dire par "la bonne façon"? la procédure
append
concatène deux listes, c'est la bonne façon de le faire, si vous me demandez :). Vous appelez simplement comme ceci: (append a b)
, où les deux a
et b
doivent être listes
- Le code est erroné, parce que vous êtes autour de l'appel à
append
entre une paire de parenthèses, le schéma va essayer d'appliquer la valeur retourné par (append ...)
comme s'il s'agissait d'une procédure avec les arguments (manageFirstList (cdr a) b)
, et évidemment il va échouer, puisque append
retourne une liste, pas une procédure. Et peut-être devriez-vous expliquer exactement ce que vous voulez dire par «puis-je appeler plus d'une fonction» - bien sûr que vous le pouvez, mais qu'avez-vous l'intention de faire? combiner les résultats des deux appels? traiter les résultats indépendamment?
Quoi qu'il en soit, la procédure ci-dessus va échouer pour plusieurs raisons - vous ne pensez pas les cas où les listes sont nuls, vous êtes seulement récurrent sur l'une des listes, etc.
Enfin , vous devriez préciser quel est le résultat attendu de la procédure, après l'avoir appelé avec (ff test1DataA test1DataB)
, quelle est la valeur que vous voulez voir dans x
? écrivez-le dans le cadre de votre question, car le texte "copier récursivement un élément à la fois sur la liste globale x" n'est pas assez clair.
Edit:
Ok, voici mon coup à répondre à votre question, je l'espère, je vous ai bien compris.Notez que j'utilise la procédure assoc
pour la recherche chaque seconde valeur dans la première liste, dans la deuxième liste, en interprétant donc la deuxième liste comme une liste d'association:
(define (manageFirstList lst1 lst2)
(cond ((null? lst1) '())
(else (cons (list (caar lst1) (cadr (assoc (cadar lst1) lst2)))
(manageFirstList (cdr lst1) lst2)))))
Maintenant, si vous devez absolument changer la valeur de la variable globale x
, il suffit de faire quelque chose comme ceci:
(define x '())
(set! x (manageFirstList test1DataA test1DataB))
Remarquez comment j'évitais complètement la nécessité de modifier x
intérieur de la procédure, car en général ce n'est pas la façon dont le schéma pour résoudre les problèmes. À la fin, la valeur dans x
est:
(("a" "aa") ("b" "bb") ("c" "cc") ("d" "dd") ("e" "Ir OK!"))
Merci pour l'explication. Ce que j'essaie de faire est de créer une liste avec la première valeur de chaque élément de liste test1DataA et la deuxième valeur de chaque élément de liste test1DataB, où la deuxième valeur de l'élément de liste test1DataA est identique à la première valeur test1DataB de son élément list. C'est ce que la valeur X devrait contenir. – Trac3
Il serait beaucoup plus clair si vous écrivez simplement la liste résultante comme vous le voulez, au lieu de l'expliquer en mots. Quoi qu'il en soit, je vais essayer. –
Merci :) Vos réponses m'ont vraiment aidé à mieux comprendre SCHEME. – Trac3