2010-05-27 8 views
11

Le istruzioni loop Python possono avere una clausola else che viene eseguita se e solo se il ciclo è non terminato da break. In altre parole, quando la condizione diventa False (con while) o quando l'iteratore è esaurito (con for).Ispirazione e influenza della clausola else delle dichiarazioni di loop?

Questo costrutto loop-else proviene da un'altra lingua (teorica o implementata effettivamente)? È stato ripreso in una lingua più recente?

Forse dovrei chiedere al primo di Guido, ma sicuramente è troppo impegnato per un'inchiesta così futile. ;-)

di discussione correlati e gli esempi: Pythonic ways to use ‘else’ in a for loop

+1

Il ciclo - altro costrutto è presente da almeno python 0.9.1 (è presente nel file di grammatica). – Seth

+0

Grazie mille. Appena controllato è menzionato anche nel tutorial. Python 0.9.0 fu la prima versione (febbraio 1991), e Python 0.9.1 (febbraio 1991) seguì da vicino "solo micro modifiche" (http://svn.python.org/view/*checkout*/python/trunk/Misc/HISTORY). – Aristide

+0

L'utilizzo di * else * dopo * try * è correlato e allo stesso modo utile. (Vedi questo [esempio semplice] (http://stackoverflow.com/questions/1744070/why-should-exceptions-be-used-conservatively/1744176#1744176).) –

risposta

4

Una funzionalità simile si trova in macro LOOP di Common Lisp, described here by Peter Seibel:

... LOOP offre due parole chiave, all'inizio e alla fine , che introduce il codice da eseguire al di fuori del corpo principale del loop.

Dopo l'iniziale o la fine, queste clausole sono costituite da tutte le forme Lisp fino all'inizio della successiva clausola del ciclo o alla fine del ciclo. Tutte le forme iniziali sono riunite in un unico prologo, che viene eseguito una volta, immediatamente dopo l'inizializzazione di tutte le variabili del ciclo locale e prima del corpo del ciclo. Le forme finali sono analogamente combinate in un epilogo da eseguire dopo l'ultima iterazione del corpo del ciclo. Sia il codice del prologo che quello dell'epilogo possono riferirsi a variabili del ciclo locale.

Il prologo viene sempre eseguito, anche se il corpo del ciclo itera zero volte. Il ciclo può restituire senza eseguire l'epilogo se si verifica una delle seguenti situazioni:

  • Una clausola di ritorno viene eseguita.
  • RETURN, ritorno DA, o altro trasferimento del costrutto di controllo è chiamato da all'interno di un modulo Lisp all'interno del corpo ...

Ad esempio, parte di un campione pitone trovato nella domanda collegata:

for v in known_variables: 
    if self.bindings[v] is cell: 
     return v 
else: 
    raise CannotSimplify 

potrebbe essere simile a questa:

(loop for v in known-variables 
    when (eq (gethash v (slot-value self bindings)) cell) 
    do (return v) 
    finally (signal cannot-simplify)) 

Un'altra osservazione:

Anche il sistema di condizioni del Common Lisp è unico. Qualcuno, una volta, ha chiesto da dove proviene e ha puntato su Kent Pitman's paper, dove dice di averlo ricevuto da Maclisp. Allo stesso modo, la strana funzione FORMAT di Common Lisp apparentemente proveniva da Multics tramite Dan Weinreb.

Il fil rouge è che le caratteristiche del linguaggio non tendono a seguire il linguaggio degli antenati che più ha ispirato questa lingua, ma sono prese da persone che le hanno amate in qualsiasi nuova lingua lavorino. Quindi, se vuoi scoprire la vera fonte di Python for - else, cercherò chi l'ha aggiunto e vedremo in che lingua hanno lavorato prima.

2

Mi sono imbattuto in un buon lead sepolto nei commenti di this far more general question. Utente ΤΖΩΤΖΙΟΥ ha scritto:

Qualcuno ricorda FOR var ... AVANTI var ... END PER var di Sinclair QL di superbasic? Tutto tra NEXT e END FOR verrebbe eseguito alla fine del ciclo, a meno che EXIT FOR non sia stato emesso . Quella sintassi era più pulita :)

Un OCR rendition of Sinclair QL User Guide si trova a fluttuare su Internet. Si legge:

Una istruzione NEXT può essere inserita in un ciclo . Fa sì che il controllo passi all'istruzione che è subito dopo la parola chiave di apertura FOR o REPeat. Lo deve essere considerato come una specie di opposto all'istruzione EXIT. Con una coincidenza curiosa, le due parole NEXT e EXIT contengono EXT. Pensate di una proroga a loop e:

  • N significa "Ora ricomincio"
  • I significa "E 'finita"

un esempio affascinante segue:

Lo sceriffo ha una pistola carica di sei proiettili e deve sparare al bandito ma altre due condizioni y:

  1. Se colpisce il bandito si ferma cottura e torna a Dodge City.

  2. se corre fuori di proiettili prima che colpisce il bandito, dice al suo partner a guardare il bandito, mentre lui (sceriffo) restituisce a Dodge City.

100 REMark Western FOR with Epilogue 
110 FOR bullets = 1 TO 6 
120 PRINT "Take aim" 
130 PRINT "FIRE A SHOT" 
140 LET hit= RND(0 TO 1) 
150 IF hit = 1 THEN EXIT bullets 
160 NEXT bullets 
170 PRINT "Watch Bandit" 
180 END FOR bullets 
190 PRINT "Return to Dodge City" 

Così, sotto una sintassi diversa (e probabilmente meno inquietante), è esattamente la stessa semantica.

Wikipedia ci dice che il Sinclair QL è stato lanciato nel febbraio 1984 come successore del Sinclair ZX Spectrum, ma non è riuscito a raggiungere il successo commerciale.

+0

+1 un gioiello di un post –