Lisp »Tips 'n Tricks »Uso di Repeat Repeat valuta ogni espressione un numero specifico di volte e restituisce il valore dell'ultima espressione.
Forse il tutto è banale e ovvio però l'uso acritico e scontato di una istruzione può portare a generare errori (bugs) nell'esecuzione del programma o alla presenza di bugs indifferenti nel codice sorgente. Ad esempio nel tradurre il programma graph.pas in graph.lsp (vedi uso di foreach (I)) ho tradotto male questa parte di codice: repeat Write(Output, ' '); YPosition := YPosition - 1 until YPosition = 0; (repeat YPosition (setq spazio (strcat spazio " ")) (setq YPosition (- YPosition 1)) ) In Pascal l'istruzione repeat ha la forma:
(defun prova () (setq Y 10) (repeat Y (setq Y (1+ Y)) (princ "Y dentro=") (princ Y) (princ "\n") ) (princ) ) Command: (prova)
Repeat ripete per 10 volte (Y=10) l'istruzione che dichiara al mondo che Y non è 10 ma 11, 12, 13... Repeat è indifferente al mutare del contenuto della variabile Y all'interno del ciclo: allora Y fuori (prima del ciclo) e Y fuori (dopo il ciclo) sono due variabili diverse? (defun prova () (setq Y 10) (princ "Y prima=") (princ Y) (princ "\n") (repeat Y (setq Y "talpa") (princ "Y dentro=") (princ Y) (princ "\n") ) (princ "Y dopo=") (princ Y) (princ) ) Command: (prova)
Notare che repeat esegue n volte il suo contenuto, mentre repeat ad ogni ciclo fa un test alla variabile n.
Ultimo Aggiornamento_Last Update: 1 Marzo 2004 |