Apply a callback to an array

From Rosetta Code
Task
Apply a callback to an array
You are encouraged to solve this task according to the task description, using any language you may know.

Create a generic mapping function that applies a callback to elements in a list:


C++

Compiler: GNU Compiler Collection 4.1.1

Using c-style array

#include <iostream> //cout for printing
#include <algorithm> //for_each defined here
//create the function (print the square)
void print_square(int i) {
  std::cout << i*i << " ";
}
int main() {
  //create the array
  int ary[]={1,2,3,4,5};
  //stl for_each
  std::for_each(ary,ary+5,print_square);
  return 0;
}
//prints 1 4 9 16 25

Using std::vector

#include <iostream> //cout for printing
#include <algorithm> //for_each defined here
#include <vector> //stl vector class
//create the function (print the square)
void print_square(int i) {
  std::cout << i*i << " ";
}
int main() {
  //create the array
  std::vector<int> ary;
  ary.push_back(1);
  ary.push_back(2);
  ary.push_back(3);
  ary.push_back(4);
  ary.push_back(5);
  //stl for_each
  std::for_each(ary.begin(),ary.end(),print_square);
  return 0;
}
//prints 1 4 9 16 25

More tricky with binary function

#include <iostream> //cout for printing
#include <algorithm> //for_each defined here
#include <vector> //stl vector class
#include <functional> //bind and ptr_fun
//create a binary function (print any two arguments together)
template<class type1,class type2>
void print_juxtaposed(type1 x, type2 y) {
  std::cout << x << y;
}
int main() {
  //create the array
  std::vector<int> ary;
  ary.push_back(1);
  ary.push_back(2);
  ary.push_back(3);
  ary.push_back(4);
  ary.push_back(5);
  //stl for_each, using binder and adaptable unary function
  std::for_each(ary.begin(),ary.end(),std::bind2nd(std::ptr_fun(print_juxtaposed<int,std::string>),"x "));
  return 0;
}
//prints 1x 2x 3x 4x 5x

Python

 def square(n):
   return n * n
 
 numbers = [1, 3, 5, 7]
 squares1 = [square(n) for n in numbers] # list comprehension
 squares2 = map(square, numbers) # discouraged nowadays
 squares3 = [n * n for n in numbers] # best - doesn't need a function, anonymous or otherwise

Ruby

 #create the array
 ary = [1,2,3,4,5]
 #create the function (print the square)
 def print_square(i)
   puts i**2
 end
 #ruby
 ary.each do |i|
   print_square(i)
 end
 # prints 1,4,9,16,25

 # Alternatively:
 [1,2,3,4,5].each { |i| puts i**2 }

C#

Platform: .NET Language Version: 2.0+

using System; 

static class Program
{
  // Purpose: Apply a callback (or anonymous method) to an Array
  // Output: Prints the squares of an int array to the console.
  // Compiler: Visual Studio 2005
  // Framework: .net 2
   
  [STAThread]
  public static void Main() 
  {
    int[] intArray = { 1, 2, 3, 4, 5 };

    // Using a callback,
    Console.WriteLine("Printing squares using a callback:");
    Array.ForEach<int>(intArray, PrintSquare);

    // or using an anonymous method:
    Console.WriteLine("Printing squares using an anonymous method:");
    Array.ForEach<int>
    (
      intArray,
      delegate(int value) 
      {
        Console.WriteLine(value * value);    
      });
  }

  public static void PrintSquare(int value) 
  { 
    Console.WriteLine(value * value);
  }
}

Haskell

Interpreter : GHCi

 let square x = x*x
 let values = [1..10]
 map square values

-- Using list comprehension

 [square x | x <- values]

-- Or more succinctly

 [x * x | x <- [1..10]]

PL/SQL

Interpreter : Oracle compiler

 set serveroutput on
 declare
 	type myarray is table of number index by binary_integer;
 	x myarray;
 	i pls_integer;
 begin
 	-- populate array
 	for i in 1..5 loop
 		x(i) := i;
 	end loop;
 	i :=0;
 
 	-- square array
 	loop
 		i := i + 1;
 		begin
 			x(i) := x(i)*x(i);
 			dbms_output.put_line(x(i));
 		exception 
 			when no_data_found then exit;
 		end;
 	end loop;
 
 end;
 /

Smalltalk

 | anArray |
 anArray = #( 1 2 3 4 5 )
 anArray do: [ :x | Transcript nextPut: x * x ]