2017-10-07 1 views
0

Ceci est un devoir de sorte que je ne demande pas de code juste des conseils. Je suis nouveau dans le langage Racket et utilise ISL sans lambda. Je ne peux pas utiliser lambda ou d'autres bibliothèques.Comment mettre à jour la liste des structures à l'intérieur d'une autre structure dans Racket (Universe)

J'utilise bigbang. J'ai une structure appelée struct-abc. A l'intérieur de struct-abc, j'ai une liste appelée list-abc. À l'intérieur de la liste-abc, j'ai une collection de struct-xyz. J'ai besoin de mettre à jour tous les struct-xyz dans list-abc qui est à l'intérieur de struct-abc à chaque tick.

Voici ce que j'ai jusqu'à présent:

; my main struct - struct-abc 

    (define-struct struct-abc (list-abc)) 

; my struct - struct-xyz 

    (define-struct struct-xyz (pos1 pos2 pos3 radius)) 

; my list - list-abc which adds instances of struct-xyz to the list 

    (define (list-abc struct-xyz-instance lst) 
     (cond 
     [(empty? lst) (cons struct-xyz-instance empty)] 
     [else (cons struct-xyz-instance lst)])) 

Avec l'extrait de code ci-dessus, je suis en mesure d'ajouter de nouvelles instances de struct-xyz à la liste-abc de la souris événement ou événement clé. Maintenant, comment mettre à jour automatiquement toutes les struct-xyz dans list-abc à chaque tick?

Voici ma fonction bigbang (hors tous les paramètres):

(define (main rate) 
    (big-bang (initial-world rate) 
      (on-tick world-after-tick rate) 
      (on-draw ...))) 

Voici ma fonction mondiale après tick où je passe des paramètres monde et liste-abc à une fonction d'assistance:

(define (world-after-tick-recursive world) 
    (update-world-recursive world (world-list-abc world))) 

Maintenant, dans cette fonction d'aide, je veux passer le premier struct-xyz de list-abc à une autre fonction d'assistance qui met à jour les valeurs et passe récursivement chaque structure de list-abc. Comment puis-je appeler la fonction récursive ainsi que la fonction qui met à jour la valeur? Je ne suis pas en mesure de comprendre cette partie sur:

(define (update-world-recursive world abc-list abc-rest-list) 
    (cond 
    [(empty? abc-list) #false] ; If empty end bigbang 
    [else 
    (update-world world (first abc-list) (rest abc-list))] 
; Where and how do I call the update-world-recursive function? 


(define (update-world world abc-list) ; This takes the first struct from list 
... update pos1 of abc-list 
... update pos2 of abc-list) 
+0

Avez-vous déjà eu connaissance de 'map'? – molbdnilo

Répondre

0

Les noms me prendre au dépourvu, je recommanderai votre fonction briser principale en niveaux. Chaque niveau fait une chose différente avec les informations qui lui sont fournies. Vous décidez quel niveau est basé sur ce à quoi chaque tâche doit accéder. Comme molbdnilo ladite carte résoudrait une grande partie de votre problème.