Variadic function

From Rosetta Code
Revision as of 20:57, 2 June 2008 by rosettacode>IanOsgood (C stdarg.h)
Task
Variadic function
You are encouraged to solve this task according to the task description, using any language you may know.

Create a function which takes in a variable number of arguments and prints each one on its own line.

C

The ANSI C standard header stdarg.h defines macros for low-level access to the parameter stack. It does not know the number or types of these parameters; this is specified by the required initial parameter(s). For example, it could be a simple count or a more complicated parameter specification, like a printf() format string.

#include <stdio.h>
#include <stdarg.h>

void varstrings(int count, ...)   /* the ellipsis indicates variable arguments */
{
  va_list args;
  va_start(args, count);
  while (count--)
    puts(va_arg(args, char *));
  va_end(args);
}
varstrings(5, "Mary", "had", "a", "little", "lamb");

Java

Works with: Java version 1.5+

Using ... after the type of argument will take in any number of arguments and put them all in one array of the given type with the given name. <java>public static void printAll(Object... things){

  for(Object i:things){
     System.out.println(i);
  }

}</java> This function can be called with any number of arguments: <java>printAll(4, 3, 5, 6, 4, 3); printAll(4, 3, 5); printAll("Rosetta", "Code", "Is", "Awseome!");</java>

JavaScript

function varargs() {
  for (var i=0; i<arguments.length; i++)
    print(arguments[i])
}

Works with: UCB Logo

UCB Logo allows four classes of arguments (in order):

  1. 0 or more required inputs (colon prefixed words)
  2. 0 or more optional inputs (two member lists: colon prefixed word with default value)
  3. an optional "rest" input (a list containing a colon prefixed word, set to the list of remaining arguments)
  4. ...with an optional default arity (a number)
to varargs [:args]
 foreach :args [print ?]
end
(varargs "Mary "had "a "little "lamb)
apply "varargs [Mary had a little lamb]

Perl

Functions in Perl 5 don't have argument lists. All arguments are stored in the array @_ anyway, so there is variable arguments by default.

<perl>sub print_all {

 foreach (@_) {
   print "$_\n";
 }

}</perl>

This function can be called with any number of arguments: <perl>print_all(4, 3, 5, 6, 4, 3); print_all(4, 3, 5); print_all("Rosetta", "Code", "Is", "Awseome!");</perl>

Python

Putting * before an argument will take in any number of arguments and put them all in a tuple with the given name.

<python>def print_all(*things):

   for x in things:
       print x</python>

This function can be called with any number of arguments: <python>print_all(4, 3, 5, 6, 4, 3) print_all(4, 3, 5) print_all("Rosetta", "Code", "Is", "Awseome!")</python>

Scheme

Putting a dot before the last argument will take in any number of arguments and put them all in a list with the given name.

<scheme>(define (print-all . things)

   (for-each
       (lambda (x) (display x) (newline))
       things))</scheme>

This function can be called with any number of arguments: <scheme>(print-all 4 3 5 6 4 3) (print-all 4 3 5) (print-all "Rosetta" "Code" "Is" "Awseome!")</scheme>