Pari/GP:用户定义的函数为 return 值
Pari/GP: the user defined function as a return value
我在 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 中 first-class 函数的限制,还是我做错了什么?如果是后者,我该如何解决?
请注意,local
关键字将您的变量限制在动态范围内。确保在调用 h(1)
时 same/outer 范围内的 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 作者 (http://pari.math.u-bordeaux1.fr/pub/pari/manuals/2.4.2/users.pdf)
的代码风格
我在 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 中 first-class 函数的限制,还是我做错了什么?如果是后者,我该如何解决?
请注意,local
关键字将您的变量限制在动态范围内。确保在调用 h(1)
时 same/outer 范围内的 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 作者 (http://pari.math.u-bordeaux1.fr/pub/pari/manuals/2.4.2/users.pdf)