2013-04-03 62 views
6

如何在PARI/GP中制作跨越每个级别多行的嵌套循环?我经常需要在循环内部做很多事情,为了可读性,我不喜欢在单行上编写循环。对于遍历一个变量,我一直在做这样的:如何在PARI/GP中创建多行嵌套for循环?

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 

我在OS X 10.8.3上使用PARI/GP 2.5.3。我将脚本写入文件nested_for.gp,并在Bash中使用gp ./nested_for.gp运行它们。

回答

9

与我们对类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))); 
} 
+0

欢迎来到Stack Overflow,非常感谢。 –

+0

PS。我认为每个代码块中的第二个for循环应该有逗号。否则,这很好。 –

+0

授予。只是修复了片段! –