Apply a callback to an array

From Rosetta Code
Revision as of 07:18, 27 August 2007 by rosettacode>TucRup

donne bielorusse sexy best girls sex anal vree naket una ragazza nuda - strip-tease blond girls donne sopra, femmine sotto foto sexy di ilaria d amico porno games foto canalis convivendo simonerossi piccole donne crescono creazione sito gratis sesso vaginale teensex foto gay fabio uomini e donne foto porno grtis sfondi gratis pc film,porno cavalli sesso sexo esplicito hommes desnudos fotos racconti incesto elementi di analisi matematica cy girls nice girls george arliss la donna matura piu sex settimanale chi video porno gay gratis floriana nuda ragazze di teramo pregnant sex sex video free programmi pc gratis porno video gratis gioco ps2 gratis gothic girl canal codes japan fuck school girls fotogallery grati gay testo canzone fuck you right back video hey sexy lady videocamera analogica diana krall cover the girl in the other ro chiamami per sesso severina porno video www praia do nudismo com br foto annunci erotici porno en dibujos para enviar sexy a tahiti foto di piedi sexy illegal baby sex chat very sexy estudiantes sexis smallville kristin kreuk nuda free sex com bocche sex topless sara ricci piss gratis photo de sexe onepiece xxx programe gratis www oksesso it video erotici giorno pporno video gioco gratis muzica romaneasca download gratis video porno di geena lee nolin i piloti del sesso mas porno casalinghe porno annuncio personali ragazze sex 2006 sex now www tuttosessogratis com midi spot vodafone gratis foto di gay sex videoclip giocatori nudi foto cindy crawford nuda incontri sesso foggia annunci ragazze cinesi troie donne 40 sesso zoo scaricare dvx gratis le ragazze free porno movie italia porno migliori siti trans gratis giornaliste sexy uomo nudi suonerie polifoniche da scaricare gratis video anal gemelle olsen sexy www canal disney com coca cola girl porno web cam jet are you gonna be my girl pornografia pura girls sex foto ragazzi gratis pinkword sex gloria gaynor the ultimate collection ripley, george eros ramazzottti download california mp3 gratis strippoker gratis janet jackson nuda chat gay macdonald, george foto porno adolescenti gay suoneria nokia gratis video porno di celebrita show girl t v donne incatenate foto playboy nudi scaricare gioco gratis spiaggia nudista piedi e sesso ricevitore analogico ragazze nude completamente di 13 anni key canal satellite avventure sexy emilia bisex foto porno di emma watson foto trans bisex linsday lohan nuda sexy foto ass boubble girl free porno ideo sexual revolution femme pute xxx kazaa lite gratis scarica foto porno brunetta gioco erotico gratis ragazze hostes annuncio erotici gratis ragazze sotto chiave foto donne mature over40 bosna sex gyno lesbo sexyasia gay skinheads sex free gallerie sardegna vacanza bambino gratis download immaggini porno amatoriali giochi per adulti sul sesso canalecinque it ugo foscolo analisi del testo in morte d donne cerca uomo purchasing analyst (regione piemonte - torino provincia) sesso telefonico con un uomo children sexual photos vignette e cartoni animati sexy ver video porno de michelle vieth tutto su eros ramazotti porno mpeg basi midi file gratis porno porcate hombres gay ph sex video porno cristina bella bubble girlz download winzip gratis ribemont-dessaignes, georges sex revolucion tuttogratis anal cum donne legnano donne mature con foto sesso cam foto super tette calendari donne nude 2005 donne mature it www gay pride roma www pornografia org com serena gf nuda www donne nere bz annuncio gratis casa vacanza affitto girls gallery mujeres desnudas le donne sul tetto uomini sportivi foto xxx picsex first time sex file mp3 gratis sexiran sesso sporco michell vieth videos gratis il belo delle donne data base gratis eros ang glamour girl addio al celibato freee porno futurama foto porno ragazze a mano armata donne belle a sassari calendari porno gratis sesso ingoio gratis

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]}