Higher-order functions: Difference between revisions

From Rosetta Code
Content added Content deleted
(syntax corrections to C/C++ example)
(standard and compiler info for C/C++ added)
Line 5: Line 5:
==[[C]]==
==[[C]]==
[[Category:C]]
[[Category:C]]

'''Standard:''' [[ANSI C]]

'''Compiler:''' [[GCC]] version 3.4.2 (mingw-special)



Simple example, the pointer to the function to be passed as an argument is the only involved pointer.
Simple example, the pointer to the function to be passed as an argument is the only involved pointer.
Line 72: Line 77:
==[[C plus plus|C++]]==
==[[C plus plus|C++]]==
[[Category:C plus plus|C++]]
[[Category:C plus plus|C++]]

'''Standard:''' [[ANSI C++]]

'''Compiler:''' [[GCC]] version 3.4.2 (mingw-special)



Same as C.
Same as C.

Revision as of 09:51, 25 January 2007

Task
Higher-order functions
You are encouraged to solve this task according to the task description, using any language you may know.

Pass a function as an argument to another function.

C

Standard: ANSI C

Compiler: GCC version 3.4.2 (mingw-special)


Simple example, the pointer to the function to be passed as an argument is the only involved pointer.

Definition of a function whose only parameter is a pointer to a function with no parameters and no return value:

 void myFuncSimple( void (*funcParameter)(void) )
 {
     /* ... */
    
     (*funcParameter)();  /* Call the passed function. */
     funcParameter();     /* Same as above with slight different syntax. */
 
     /* ... */
 }

Note that you can't call the passed function by " *funcParameter() ", since that would mean "call funcParameter and than apply the * operator on the returned value".

Call:

 void funcToBePassed(void);
 
 /* ... */
 
 myFuncSimple(&funcToBePassed);


Complex example.

Definition of a function whose return value is a pointer to int and whose only parameter is a pointer to a function, whose (in turn) return value is a pointer to double and whose only parameter is a pointer to long.

 int* myFuncComplex( double* (*funcParameter)(long* parameter) )
 {
      long* inLong;
      double* outDouble;
 
      /* ... */
 
      outDouble = (*funcParameter)(inLong);  /* Call the passed function and store returned pointer. */
      outDouble = funcParameter(inLong);     /* Same as above with slight different syntax. */
 
      /* ... */
 }

Call:

 double* funcToBePassed(long* parameter);
 
 /* ... */
 
 int* outInt;  
 
 outInt = myFuncComplex(&funcToBePassed);


Finally, declaration of a pointer variable of the proper type to hold such a function as myFunc:

 int* (*funcPointer)( double* (*funcParameter)(long* parameter) );
 
 /* ... */
 
 funcPointer = myFuncComplex;


Of course, in a real project you shouldn't write such a convoluted code, but use some typedef instead, in order to break complexity into steps.

C++

Standard: ANSI C++

Compiler: GCC version 3.4.2 (mingw-special)


Same as C.


Perl

Interpreter: Perl

Passing a pointer to a function

my $retval = first('data', \&second);

sub first ($ $){
  my $val = shift;
  my $func = shift;
  return $func->($val);
}

sub second ($){
  return(reverse(shift));
}

Passing a string to be used as a function

my $retval = first('data', 'second');

sub first ($ $){
  my $val = shift;
  my $func = shift;
  return &{$func}($val);
}

sub second ($){
  return(reverse(shift));
}

PHP

In this simple example, an array of two values is passed and the statistical average is computed.

 function average($arry) {
     $tmp = ($arry[0] + $arry[1]) / 2;
     return $tmp;
 }

To call it:

 $array1 = ( 5, 15 );
 echo "The average is ".average($arrayl)."\n"; 


Python

Interpreter: Python 2.5

 def first(function):
     return function()
 
 def second():
     return "second"
 
 result = first(second)