Как сделать многострочную вложенность для циклов в PARI/GP?
Как я могу сделать вложенные циклы в PARI/GP, которые занимают несколько строк на каждом уровне? Мне часто приходится делать несколько вещей внутри для циклов, и для удобства чтения я не люблю писать свои циклы в одной строке. Для цикла над одной переменной я делал это:
for(i=1,10,{
printf("%u\n",i);
})
Однако для вложенных циклов мне удалось поместить разрывы строк только на одном уровне. Это работает:
for(i=1, 10, for(j=1, 10, {
printf("%2u\t%2u\n", i, j);
}));
Это также работает:
for(i=1, 10, {
for(j=1, 10, printf("%2u\t%2u\n", i, j));
});
Тем не менее, это то, что я действительно хотел бы сделать:
for(i=1, 10, {
for(j=1, 10, {
printf("%2u\t%2u\n", i, j);
});
});
Этот последний пример не работает; это дает ошибку:
*** 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
Я использую PARI/GP 2.5.3 на OS X 10.8.3. Я пишу свои скрипты в файл nested_for.gp
и запустить их, используя gp ./nested_for.gp
в Баш.
1 ответ
Вопреки тому, что мы ожидаем от C-подобного синтаксиса, фигурные скобки не определяют блок в GP. Они позволяют разбить последовательность инструкций только на несколько последовательных строк. Они не гнездятся; с другой стороны, вы можете вкладывать циклы в один блок { }:
{
for (i = 1, 10,
for (j = 1, 10,
print (i+j)))
}
Многострочные команды обычно находятся в пользовательских функциях и могут выглядеть более естественно в таком контексте:
fun(a, b) =
{
for (i = 1, a,
for (j = 1, b,
print (i+j)));
}