【问题标题】:Pari/GP: the user defined function as a return valuePari/GP:用户定义函数作为返回值
【发布时间】:2015-07-30 20:53:35
【问题描述】:

我对使用用户定义函数返回函数的 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-functions pari pari-gp


    【解决方案1】:

    注意,local 关键字将您的变量限制在动态范围内。确保在 h(1) 调用时,来自同一/外部范围的家伙 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) 的代码风格

    【讨论】:

      猜你喜欢
      • 2013-01-25
      • 1970-01-01
      • 2021-04-19
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2014-08-23
      相关资源
      最近更新 更多