2013-04-03 18 views
6

Come posso creare loop annidati in PARI/GP che si estendono su più righe ad ogni livello? Spesso devo fare più cose all'interno di loop, e per la leggibilità non mi piace scrivere i miei loop su una singola riga. Per un ciclo su una variabile, ho fatto questo:Come rendere i loop multi-linea nidificati in PARI/GP?

for(i=1,10,{ 
    printf("%u\n",i); 
}) 

Tuttavia, per cicli annidati sono riuscito solo a mettere interruzioni di linea a un certo livello. Questo funziona:

for(i=1, 10, for(j=1, 10, { 
    printf("%2u\t%2u\n", i, j); 
})); 

Questo funziona anche:

for(i=1, 10, { 
    for(j=1, 10, printf("%2u\t%2u\n", i, j)); 
}); 

Tuttavia, questo è quello che mi piacerebbe davvero fare:

for(i=1, 10, { 
    for(j=1, 10, { 
      printf("%2u\t%2u\n", i, j); 
    }); 
}); 

Quest'ultimo esempio non funziona; dà un errore:

*** sorry, embedded braces (in parser) is not yet implemented. 
... skipping file 'nested_for.gp' 
    *** at top-level: printf("%2u\t%2u\n", 
    ***     ^-------------------- 
    *** printf: not a t_INT in integer format conversion: i. 
    *** Break loop: type 'break' to go back to GP 

Sto usando PARI/GP 2.5.3 su OS X 10.8.3. Scrivo i miei script in un file nested_for.gp e li eseguo utilizzando gp ./nested_for.gp in Bash.

risposta

9

Contrariamente a quanto ci si aspetterebbe dalla sintassi C-like, le parentesi non definiscono un blocco nel GP . Consentono solo di dividere una sequenza di istruzioni su più righe consecutive da . Non nidificano; d'altra parte, si può nido loop all'interno di un unico {} blocco:

{ 
    for (i = 1, 10, 
    for (j = 1, 10, 
     print (i+j))) 
} 

comandi multi-linea si trovano di solito nelle funzioni utente, e può guardare più naturale in un tale contesto:

fun(a, b) = 
{ 
    for (i = 1, a, 
    for (j = 1, b, 
     print (i+j))); 
} 
+0

Benvenuti in Stack Overflow, e grazie mille. –

+0

PS. Penso che ci dovrebbero essere virgole sul secondo ciclo per ciascuno dei blocchi di codice. Altrimenti funziona alla grande. –

+0

concesso. Ho appena corretto i frammenti! –