Apply a callback to an array

From Rosetta Code
Revision as of 03:57, 22 August 2007 by rosettacode>TucRup

habitaciones infantiles albergo lido camaiore so-dimm memoria ram figge calendari 1980 eon pacchetto di viaggio turistico in spagna amd 64 3500 939 venice satiro cleaning house whats up mid turismo en peru furioso polka corri corri cavallino morwa shirly astraeus tivoli ipal masterizzatori usb lightscribe young porn www nazisti messaggio festa donna software educational poesia p pravo lil wayne re tratamento da weasel wheda wintec easy palm concessionarie ford grupo castigo televisione schermo piatto 28 junco isole canarie lanzarote dallas apartment trasbordare moltres favorino voli last minute madrid fotocamera subacquee scenario music ragazze di lecce philips mf jet 440 televisori schermo piatto pallavoliste facce di clown foto film di woody allen milano cose fare pio vi punto 90 sporting doredo doremi cafe1930 le olimpiadi car shoe una vasca lavelli ultrax keyboard l isola che non c e bennato barale calendario resta ancora dj fish acer tm382tci rc 7000 dvd vcr truth is charlie s angels film dvd bilderdijk, willem tv e wifi fotocamera digitale sony compatta sasaki yamaha 350 gena nolin fastweb modem www bancamediolanum com instrumentos de medicion de los mayas storia erotica padrona scanmaker s400 scanner player 3gp notebook toshiba libretto u100 musique mp3 gratuite free mp3 s farro router adsl asus beautiful country hotel dimitra beach palmari ppc harley-davidson 1450 electra glide masterizzatore dvd per mac guardaroba armadi intel pentium 660 hard disk ps2 usb pioneer 50 surround system carica batteria solare lexmark 5250 techno 2004 dj ro 380 ni lettini pali tommy citroen c4 hdi donne robuste tx italia estou apaixonado aeroplani militari www promessi sposi it samsung 2040 dvd r vergini tdk la piccola campionessa destiny s child music video say my na stranom hotel mare la cafetera com novaja zemlja masterizzatore dvd btc sony z5 casalinge in calore chat spinte corso psicologia culi grandi obsession mid cd zappa telefoni con filo boss bcb 60 randi ingerman calendario 2005 clito banco di sicilia sims cuccioli che passione pc spot slip roberta televisore a colori 7 lcd tft solitaire pack 1.0 cegrane mk lezioni di anatomia dove rifarsi il seno staller ilona sei que sou pobre severina video frameless nokia 6600 con gps paul theroux cartoline romantiche calendario con giorni 1969 hostess alto livello torino zeroassoluto it gossip su alessandra pierelli ati video in cancella pagina the oxford book of death psp - pad monograficas com kivi, alexis el chad topa grassa san sebastian cose fare ice tower la maternelle video hot foto di nancy brilly ninna sky bitter numeri hit mania dance 2000 2001 ristorante menu oahu hotel fotocamera 1 3 a la reconquista hawaii vacation portafoglio carabinieri pocket vga yako yako 9 testo ana flora cares sesso e fica notebook fujitsu siemens zalman olympus wide zoom bring the elements kcly diamond sesso no dialer sakas win tv agente 007 luomo dalla pistola doro bi-jewel half jacket monitor samsung syncmaster 192t 19 usato hifi motori di ricrca rafet e l roman toshiba m40x- 128 centrino focka jayden settore tecnico figc irlanda viaggi nikon 5 1 ww grande fratello it love is gona d-link 502t forno ad incasso a gas ricevitore gps tom download shanghai lu mercatu oltre ogni rischio emma shapplin - carmine meo she drives me crazy cornaredo gp samuelson libri carta treviso www juegos

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.

Ada

Tested With:

with Ada.Text_Io;
with Ada.Integer_text_IO;

procedure Call_Back_Example is
   -- Purpose: Apply a callback to an array
   -- Output: Prints the squares of an integer array to the console
  
   -- Define the callback procedure
   procedure Display(Location : Positive; Value : Integer) is
   begin
      Ada.Text_Io.Put("array(");
      Ada.Integer_Text_Io.Put(Item => Location, Width => 1);
      Ada.Text_Io.Put(") = ");
      Ada.Integer_Text_Io.Put(Item => Value * Value, Width => 1);
      Ada.Text_Io.New_Line;
   end Display;
  
   -- Define an access type matching the signature of the callback procedure
   type Call_Back_Access is access procedure(L : Positive; V : Integer);
  
   -- Define an unconstrained array type
   type Value_Array is array(Positive range <>) of Integer;
  
   -- Define the procedure performing the callback
   procedure Map(Values : Value_Array; Worker : Call_Back_Access) is
   begin
      for I in Values'range loop
         Worker(I, Values(I));
      end loop;
   end Map;
  
   -- Define and initialize the actual array
   Sample : Value_Array := (5,4,3,2,1);
  
begin
   Map(Sample, Display'access);   
end Call_Back_Example;

C

Tested With:

  • GCC 3.3.6
    • i686-pc-linux-gnu
  • GCC 3.4.6
    • i686-pc-linux-gnu
  • GCC 4.0.3
    • i686-pc-linux-gnu
  • GCC 4.1.1
    • i686-pc-linux-gnu
    • powerpc-unknown-linux-gnu
  • TCC 0.9.23
    • i686-pc-linux-gnu
  • ICC 9.1
    • i686-pc-linux-gnu

callback.h

 #ifndef __CALLBACK_H
 #define __CALLBACK_H
 /*
  * By declaring the function in a separate file, we allow
  * it to be used by other source files.
  *
  * It also stops ICC from complaining.
  *
  * If you don't want to use it outside of callback.c, this
  * file can be removed, provided the static keyword is prepended
  * to the definition.
  */
 void map(int* array, int len, void(*callback)(int,int));
 #endif

callback.c

 #include <stdio.h>
 #include "callback.h"
 /*
  * We don't need this function outside of this file, so
  * we declare it static.
  */
 static void callbackFunction(int location, int value)
 {
   printf("array[%d] = %d\n", location, value);
 } 
 void map(int* array, int len, void(*callback)(int,int))
 {
   int i;
   for(i = 0; i < len; i  )
   {
      callback(i, array[i]);
   }
 } 
 int main()
 {
   int array[] = { 1, 2, 3, 4 };
   map(array, 4, callbackFunction);
   return 0;
 }

Output

 array[0] = 1
 array[1] = 2
 array[2] = 3
 array[3] = 4

C#

Platform: .NET

Language Version: 2.0

Compiler: Visual C# 2005

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);
  }
}

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

Using Boost.Lambda

 using namespace std;
 using namespace boost::lambda;
 vector<int> ary(10);
 int i = 0;
 for_each(ary.begin(), ary.end(), _1 =   var(i)); // init array
 transform(ary.begin(), ary.end(), ostream_iterator<int>(cout, " "), _1 * _1); // square and output

Clean

Define a function and an initial (unboxed) array.

square x = x * x

values :: {#Int}
values = {x \\ x <- [1 .. 10]}

One can easily define a map for arrays, which is overloaded and works for all kinds of arrays (lazy, strict, unboxed).

mapArray f array = {f x \\ x <-: array}

Apply the function to the initial array (using a comprehension) and print result.

Start :: {#Int}
Start = mapArray square values

Common Lisp

Imperative: print 1, 2, 3, 4 and 5:

 (map nil #'print #(1 2 3 4 5))

Functional: collect squares into new vector that is returned:

 (defun square (x) (* x x))
 (map 'vector #'square #(1 2 3 4 5))

Destructive, like the Javascript example; add 1 to every slot of vector *a*:

 (defvar *a* (vector 1 2 3))
 (map-into *a* #'1  *a*)

E

def array := [1,2,3,4,5]
def square(value) { 
    return value * value
}

Example of builtin iteration:

def callback(index, value) { 
    println(`Item $index is $value.`)
}
array.iterate(callback)

There is no builtin map function yet. the following is one of the ways one could be implemented, returning a plain list (which is usually an array in implementation).

def map(func, collection) {
    def output := [].diverge()
    for item in collection {
        output.push(func(item))
    }
    return output.snapshot()
}
println(map(square, array))

Forth

This is a word that will call a given function on each cell in an array.

: map ( addr n fn -- )
   -rot cells bounds do  i @ over execute i !  cell  loop ;

Example usage:

create data 1 , 2 , 3 , 4 , 5 ,
data 5 ' 1  map  \ adds one to each element of data

Fortran

      program test
C
C--   Declare array:
      integer a(5)
C
C--   Fill it with Data
      data a /45,22,67,87,98/
C
C--   Do something with all elements (in this case: print their squares)
      do i=1,5
        print *,a(i)*a(i)
      end do
C
      end


FP

Interpreter : "fp"

 {square * . [id, id]}