a580e12000-09-27Fredrik Hübinette (Hubbe) #pike __REAL_VERSION__
a20af62000-09-26Fredrik Hübinette (Hubbe) 
f56aef1999-09-06Fredrik Hübinette (Hubbe) constant defined = __builtin.function_defined;
f321a82000-11-21Johan Sundström 
e5ef062003-04-01Martin Nilsson //! Calls the given function with the @[args] array plus the optional
f321a82000-11-21Johan Sundström //! extra arguments as its arguments and returns the result. //!
e5ef062003-04-01Martin Nilsson //! Most useful in conjunction with @[map], and particularly in combination //! with @[sscanf] with @expr{"...%{...%}..."@} scan strings (which indeed
f321a82000-11-21Johan Sundström //! was what it was invented for in the first place). //!
c00a382001-05-10Henrik Grubbström (Grubba) //! @param args
e5ef062003-04-01Martin Nilsson //! The first arguments the function @[f] expects.
c00a382001-05-10Henrik Grubbström (Grubba) //! @param f
e5ef062003-04-01Martin Nilsson //! The function to apply the arguments on.
c00a382001-05-10Henrik Grubbström (Grubba) //! @param extra
e5ef062003-04-01Martin Nilsson //! Optional extra arguments to send to @[f].
c00a382001-05-10Henrik Grubbström (Grubba) //! @returns
e5ef062003-04-01Martin Nilsson //! Whatever the supplied function @[f] returns.
c00a382001-05-10Henrik Grubbström (Grubba) //!
f321a82000-11-21Johan Sundström //! @example
1952d82003-04-04Martin Nilsson //! @code
f321a82000-11-21Johan Sundström //! class Product(string name, string version) //! { //! string _sprintf() //! { //! return sprintf("Product(%s/%s)", name, version); //! } //! } //! map(({ ({ "pike", "7.1.11" }), //! ({ "whitefish", "0.1" }) }), //! Function.splice_call, Product); //! ({ /* 2 elements */ //! Product(pike/7.1.11), //! Product(whitefish/0.1) //! })
1952d82003-04-04Martin Nilsson //! @endcode
f321a82000-11-21Johan Sundström mixed splice_call(array args, function f, mixed|void ... extra) { return f(@args, @extra); }
7424d62003-11-20Marcus Comstedt  //! The dreaded fixpoint combinator "Y". //! //! The Y combinator is useful when writing recursive lambdas. It //! converts a lambda that expects a self-reference as its first argument //! into one which can be called without this argument. //! //! @example //! This example creates a lambda that computes the faculty function. //! @code //! Function.Y(lambda(function f, int n) { return n>1? n*f(n-1) : 1; }) //! @endcode function Y(function f) { return lambda(function p) { return lambda(mixed ... args) { return f(p(p), @args); }; } (lambda(function p) { return lambda(mixed ... args) { return f(p(p), @args); }; }); } //! Partially evaluate a function call. //! //! This function allows N parameters to be given to a function taking //! M parameters (N<=M), yielding a new function taking M-N parameters. //! //! What is actually returned from this function is a function taking N //! parameters, and returning a function taking M-N parameters. //! //! @example //! This example creates a function adding 7 to its argument. //! @code //! Function.curry(`+)(7) //! @endcode
a3a9bc2013-04-16Per Hedbor function(mixed...:function(mixed...:mixed|void)) curry(function f)
7424d62003-11-20Marcus Comstedt { return lambda(mixed ... args1) { return lambda(mixed ... args2) { return f(@args1, @args2); }; }; }
24e8d32003-12-08Mirar (Pontus Hagland) 
3a34b12014-09-03Per Hedbor //! This function, given a function taking N parameters, returns a new //! function taking N+1 parameters. The first argument will be //! ignored. //! //! @example //! @code //! > Function.uncurry(`+)(7,2,3) //! Result: 5 //! @endcode function(mixed...:function(mixed...:mixed|void)) uncurry(function f) { return lambda(mixed ... args1) { return f(@args1[1..]); }; }
24e8d32003-12-08Mirar (Pontus Hagland) //! Call a callback function, but send throws from the callback //! function (ie, errors) to master()->handle_error. //! Also accepts if f is zero (0) without error. //! //! @example //! @code
3a34b12014-09-03Per Hedbor //! Functions.call_callback(the_callback,some,arguments);
24e8d32003-12-08Mirar (Pontus Hagland) //! @endcode //! equals //! @code //! { //! mixed err=catch { if (the_callback) the_callback(some,arguments); }; //! if (err) master()->handle_error(err); //! } //! @endcode //! (Approximately, since call_callback also calls handle_error //! if 0 were thrown.) void call_callback(function f,mixed ... args) { if (!f) return; mixed err=catch { f(@args); return; };
eede5e2004-02-23Martin Nilsson  handle_error(err);
24e8d32003-12-08Mirar (Pontus Hagland) }
eede5e2004-02-23Martin Nilsson 
3a34b12014-09-03Per Hedbor private function handle_error = master()->handle_error;