2013-04-03 11 views
6

Jak utworzyć zagnieżdżone pętle w PARI/GP, które obejmują wiele linii na każdym poziomie? Często muszę robić wiele rzeczy wewnątrz pętli, a dla czytelności nie lubię pisać moich pętli w jednym wierszu. W przypadku pętli na jednej zmiennej, robiłem to:Jak ustawić wieloliniowy zagnieżdżony dla pętli w PARI/GP?

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

Jednak dla zagnieżdżonych pętli udało mi się umieścić tylko line-przerwy na jednym poziomie. To działa:

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

Działa to również:

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

Jednak to, co naprawdę chciałbym zrobić:

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

Ten ostatni przykład nie działa; to daje błąd:

*** 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 

Używam PARI/GP 2.5.3 na OS X 10.8.3. Piszę moje skrypty do pliku nested_for.gp i uruchamiam je za pomocą gp ./nested_for.gp w Bash.

Odpowiedz

9

W przeciwieństwie do tego, czego oczekujemy od składni w stylu C, nawiasy klamrowe nie definiują bloku w GP. Pozwalają one jedynie dzielić sekwencję instrukcji na wiele kolejnych linii. Nie gniazdują; Z drugiej strony, można zagnieździć pętle wewnątrz pojedynczego {} bloku:

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

polecenia wieloliniowe są zwykle w funkcji użytkownika i mogą wyglądać bardziej naturalne w takim kontekście:

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

Witamy w Stack Overflow i dziękuję bardzo. –

+0

PS. Myślę, że powinny być przecinki na drugiej pętli for w każdym z bloków kodu. W przeciwnym razie działa to świetnie. –

+0

Udzielone. Naprawiłem fragmenty! –

Powiązane problemy