Bill Allombert on Wed, 21 Oct 2015 01:03:19 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: Vector of args |
On Tue, Oct 20, 2015 at 08:58:16AM +0200, Loïc Grenié wrote: > On 2015-10-19 at 23:24 GMT+02:00 Bill wrote: > > > So, what do you think about this proposal ? > > > > Il looks perfect for me. Excatly what I would have needed (not > tested though). Thanks, I have applied the patch. The documentation explains how to do generic memoization. call(f, A): A = [a_1,..., a_n] being a vector and f being a function, return the evaluation of f(a_1,...,a_n). f can also be the name of a built-in GP function. If f is variadic, the variadic arguments must grouped in a vector in the last component of A. This function is useful * when writing a variadic function, to call another: fprintf(file,format,args[..]) = write(file,call(Strprintf,[format,args])) * when dealing with function arguments with unspecified arity The function below implements a global memoization interface: memo=Map(); memoize(f,A[..])= { my(res); if(!mapisdefined(memo, [f,A], &res), res = call(f,A); mapput(memo,[f,A],res)); res; } for example: ? memoize(factor,2^128+1) %3 = [59649589127497217,1;5704689200685129054721,1] ? ## *** last result computed in 76 ms. ? memoize(factor,2^128+1) %4 = [59649589127497217,1;5704689200685129054721,1] ? ## *** last result computed in 0 ms. ? memoize(ffinit,3,3) %5 = Mod(1,3)*x^3+Mod(1,3)*x^2+Mod(1,3)*x+Mod(2,3) ? fibo(n)=if(n==0,0,n==1,1,memoize(fibo,n-2)+memoize(fibo,n-1)); ? fibo(100) %7 = 354224848179261915075 * to call operators through their internal names without using alias matnbelts(M) = call("_*_",matsize(M)) The library syntax is GEN call0(GEN f, GEN A). Cheers, Bill