Pari / GP:用户定义的函数作为返回值

时间:2015-05-19 06:55:03

标签: first-class-functions pari

Pari / GP用户定义的函数存在问题,它使用用户定义的函数返回函数。这是一个愚蠢的例子:

var scorer = new Scorer();
int myScore = scorer.getScore(Scorer.ScoringCategory.FullHouse);

我期望得到h(1)=(g(2))(1)= y(1)=(f(2))(1)= 3。我是否在Pari中遇到了一流功能的限制,或者我做错了什么?如果是后者,我该如何解决?

1 个答案:

答案 0 :(得分:3)

注意,local关键字在动态范围内界定变量。当y正在调用时,请确保来自相同/外部范围的人h(1)被引用到预期的事物。在这种情况下,适当的修复可以如下:

?f = (x) -> { (t) -> x + t }
%1 = (x)->(t)->x+t

?g = (x) -> { local(y); (t) -> y(x)(t) }
%1 = (x)->local(y);(t)->y(x)(t)

?h = g(2)
%1 = (t)->my(x=2);y(x)(t)

?y = (x) -> f(x);
?h(1)
%1 = 3

?y = 1;
?h(1)
*** not a function in function call 

或者,我强烈建议对变量使用静态(词法)作用域,以简化代码并消除引用依赖性。使用my说明符。请看下面的固定代码:

?f(x) = { (t) -> x + t }
%1 = (x)->my(t);t->x+t

?g(x) = { my (y = f(x)); (t) -> y(t) }
%1 = (x)->my(y=f(x));(t)->y(t)

?h = g(2)
%1 = (t)->my(x=2,y=(t)->my(x=2);x+t);y(t)

?h(1)
%1 = 3

注意,对h的最新版本的评估花费的时间更少。另外,我建议你使用PARI / GP作者的代码风格(http://pari.math.u-bordeaux1.fr/pub/pari/manuals/2.4.2/users.pdf