9

各レベルで複数の行にまたがる PARI/GP でネストされたループを作成するにはどうすればよいですか? 多くの場合、for ループ内で複数のことを行う必要があり、読みやすくするために、ループを 1 行で書くのは好きではありません。1つの変数をループするために、私はこれを行ってきました:

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

ただし、ネストされたループの場合、改行を 1 つのレベルに配置することしかできませんでした。これは機能します:

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

OS X 10.8.3 で PARI/GP 2.5.3 を使用しています。スクリプトをファイルに書き込んで、Bash でnested_for.gp実行します。gp ./nested_for.gp

4

1 に答える 1

13

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)));
}
于 2013-04-05T15:12:45.137 に答える