First class functions Pari/GP:用户定义的返回值函数

First class functions Pari/GP:用户定义的返回值函数,first-class-functions,pari,pari-gp,First Class Functions,Pari,Pari Gp,我对Pari/GP用户定义函数使用用户定义函数返回函数有问题。下面是一个简单的例子: ? f(x) = { (t) -> x + t } %1 = (x)->(t)->x+t ? g(x) = { local(y); y = f(x); (t) -> y(t) } %2 = (x)->local(y);y=f(x);(t)->y(t) ? h = g(2) %3 = (t)->my(x=2);y(t) ? h(1) *** at top-leve

我对Pari/GP用户定义函数使用用户定义函数返回函数有问题。下面是一个简单的例子:

? f(x) = { (t) -> x + t }
%1 = (x)->(t)->x+t
? g(x) = { local(y); y = f(x); (t) -> y(t) }
%2 = (x)->local(y);y=f(x);(t)->y(t)
? h = g(2)
%3 = (t)->my(x=2);y(t)
? h(1)
  ***   at top-level: h(1)
  ***                 ^----
  ***   in function h: y(t)
  ***                  ^----
  ***   not a function in function call
  ***   Break loop: type 'break' to go back to GP

我期望得到h(1)=(g(2))(1)=y(1)=(f(2))(1)=3。我是不是在Pari中遇到了一级函数的限制,还是我做错了什么?如果是后者,我如何修复它?

注意,
local
关键字将变量限制在动态范围内。当调用
h(1)
时,确保来自相同/外部作用域的guy
y
引用了预期对象。在这种情况下,适当的修复方法如下所示:

?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作者的代码样式()