Variadic function: Difference between revisions
(JavaScript and Logo) |
(C stdarg.h) |
||
Line 1: | Line 1: | ||
{{task}}Create a function which takes in a variable number of arguments and prints each one on its own line. |
{{task}}Create a function which takes in a variable number of arguments and prints each one on its own line. |
||
=={{header|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"); |
|||
=={{header|Java}}== |
=={{header|Java}}== |
Revision as of 20:57, 2 June 2008
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
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]) }
Logo
UCB Logo allows four classes of arguments (in order):
- 0 or more required inputs (colon prefixed words)
- 0 or more optional inputs (two member lists: colon prefixed word with default value)
- an optional "rest" input (a list containing a colon prefixed word, set to the list of remaining arguments)
- ...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>