2015-05-19 63 views
3

我使用用戶定義函數返回函數的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-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中一流功能的限制,還是我做錯了什麼?如果是後者,我該如何解決?

回答

3

請注意,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