Как сделать многострочную вложенность для циклов в 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)));
}
Другие вопросы по тегам