2012-02-12 3 views
0
(defmethod! expand-t-setclass (pcset &optional (n 12)) 
    :icon *PC_ICON* 
    :doc " 
Given any member of a t-setclass, lists every member of that t-setclass. 
The optional parameter N can be used to set the number of equal steps per 
octave to something other than the default of 12. 

Will tolerate integers out of the mod-N range in PCSET." 
    :initvals '((1 3 4) 12) 
    :indoc '("pcset or list of them" 
      "modulus of the pc space") 
    (if (listp (first pcset)) 
    (expand-t-setclasses pcset) 
    (let ((t-prime (t-primeform pcset n))) 
     (loop with result = nil 
      repeat n 
      for x-pcset = pcset then (xpose x-pcset 1 n) 
      unless (member x-pcset result) collect x-pcset into result 
      finally return result)))) 


(defmethod! expand-t-setclasses (pcset &optional (n 12)) 
    (loop for item in pcset collect (expand-t-setclass item n))) 

;----- 

Je ne suis pas trop familier avec Lisp en général, et essaie de trouver le bug qui casues cette erreur:Aide Lisp | Erreur: double fixation dans la boucle: (résultat)

ERREUR: double liaison dans la boucle: (résultat

Répondre

1

Vous avez deux formes dans la LOOP introduisant une variable RESULT.

WITH result = nil 

et

COLLECT ... INTO result 

Les deux créent au-dessus d'une variable de liaison.

Je voudrais remplacer le COLLECT par un formulaire qui pousse l'élément à la liste de résultats.

(loop ... 
     collect item into foo 
     ... 
     finally (return foo)) 

dans

(loop with foo = nil 
     ... 
     (push item foo) 
     ... 
     finally (return (reverse foo))) 

Vous avez une autre erreur:

FINALLY RETURN result 

La syntaxe de boucle ne supporte pas. FINALEMENT attend une forme composée.

Remplacez-le par:

FINALLY (return result) 

RETOUR est une macro définie en Common Lisp.

+0

Merci pour la réponse! Savez-vous quelle autre forme je pourrais utiliser? Je ne sais toujours pas trop comment corriger ma première erreur. (Ceci est un vieux morceau de code d'un ancien programme et je ne peux pas contacter le développeur) –

+0

J'ai essayé d'entrer: (boucle avec foo = nul , enlever avec un résultat répétition n pour x-pcset = pcset alors? (xpose x-pcset 1 n) sauf (résultat x-pcset membre) (pousser x-pcset foo) enfin (retour (foo inverse)))))) mais a obtenu l'erreur: Mot clé LOOP attendu dans (. .. (push x-pcset résultat) finally (return (reverse result))) –

+0

Si je me débarrassais simplement de "avec foo = nil" et que je collais, quand il compile à chaque boucle, est-il initialisé à 0 à chaque fois? Donc, je pourrais simplement me débarrasser de cette ligne de code et résoudre le problème? –