Apply a callback to an array

From Rosetta Code
Revision as of 03:17, 31 August 2007 by rosettacode>TucRup

il mistero della piramide sony cpx11 amplificatori akai gaychat www 113 com ww 130 it nana flora il figlio della giungla ornavasso frigo teak xaixai squadra azzurra fotoromanzi porno gratis video musicale maroon 5 esterno iomega hard disk e floppy astilbe ninna oh mares orologio l ape maya in concerto shopping ascoli piceno culi e cazzi super pelosi me muero rode k2 usb pen drive 2 gb piatti ceramica lg rz42px11 plasma codec per filmati dvx vanessa cerezo solaia 2002 bejeweled deluxe golf cabrio esecuzioni di americani nuova vitara diesel auto nuove thes lcd corvo rosso non avrai il mio scalpo rex frigoriferi da incasso scuola danza primavera tokina 12 24 iuventus in latino il marito i video musicali di biagio antonacci viaggi peru corte d appello di venezia ancora una volta con sentimento giochi 6630 recueil fossard kris bracciale irak decapitazioni cornice quadro trattamento dell aria apparecchi e impianti original song rivoluzione demografica video porno amatoriale gratis tempo di credere philips az 1310 bonney digital keys test al femminile san martino di ungaretti remix obsesion bluetooth palmare cartolina gratuite il carbone come combustibile fossile eros amatoriale gratis www linkami net que ganaste fort lauderdale www napolimania it www pro music it vasci rossi here she comes again kimco people 250 international karate plus god of war ps2 videogiochi www seven com br mercedes clk cdi traduzione leave jojo bus1 siberia jazz in un giorno destate gruppo dei sei doctor zhivago demolizioni cueball scuola inglese on line company directors 2004 convivendo biagio albergo istanbul argos contro le 7 maschere di cera freecom media player 3 isegoria bros travel plug adapter fick august correio da manha latilla spartito di love story rhodes alexandre de formato 2000 incontro sexy uur lives maria la o sedrianese biglietti aerei milano goa ricevitori audio video figc it norton antivirus gratis la via del reiki disney the small one www bluwin ch kaza lite software members of mayday san antonio hotel venta de autos tft monitor 18 te i pe videos musicales gratis lo straniero misterioso rinaldi cristina im lost without you seat ibiza 14 16v 5p plus samsung digimax a400 digital camera yakumo dx4 divx belle fighe provincia milano frassinetti tatuaggi fondoschiena grabster av250 gioco online azione patrizia rosetti video yamaha del peru edizione del 07 11 2004 del centro pirelli abbigliamento insegnanti religione cattolica foto di tagli di capelli valerio merola www cobra sor com bagasciona unita di misura della temperatura samos vacanze a fuerteventura pda phone psc805 aurilium dfi ultrad la vedetta lombarda giochi cellulare gratis giorgia on my mind micro hi cd dvd insegnamenti di yoga tibetano bracciale uomo stampa file binari tiziana foschi nuda vendita sci starsky and hucth golf 5 diesel film trans navigatori gps garmin v renato zero cattura cd covers sabrinaghio alleghe la nave degli schiavi bigcock noi2 fete sexi phocus wms avventura e logica la ex lcd videoproiettori sanyo fank dance mat hentai gratis hotel france yu gi oh cards com satellite m40146 brainwaves logitech driving force sissy 6262 ipaq wifi imparare italiano in italia wc elettrico motocross mania pcl colori universita di trieste farmacia manuale macromedia flash pac l30 commenti sul libro di primo levi se questo e un uomo corelli audio analogue internet con il cellulare www slovenia kompas jamellas editor gigaset sl 150 cordless numeri cellulari sandra kristoff testo canzone fever buble sin despertar analisi competitiva masterizzatori dual layer nec djimon hounsou un nuevo amor tranzas w w libero sony hdv 1080i pantalone pelle

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