Variadic function: Difference between revisions

(Modula-3)
Line 508:
=={{header|Modula-3}}==
Modula-3 provides the built ins <tt>FIRST</tt> and <tt>LAST</tt>, which can be used with <tt>FOR</tt> loops to cycle over all elements of an array. This, combined with open arrays allows Modula-3 to simulate variadic functions.
<lang modula3> MODULE Varargs EXPORTS Main;
 
IMPORT IO;
Line 524:
Variable(strings);
END Varargs.</lang>
Output:
<pre>
foo
bar
baz
quux
zeepf
</pre>
Things get more complicated if you want to mix types:
<lang modula3>MODULE Varargs EXPORTS Main;
 
IMPORT IO, Fmt;
 
VAR
strings := NEW(REF TEXT);
ints := NEW(REF INTEGER);
reals := NEW(REF REAL);
refarr := ARRAY [1..3] OF REFANY {strings, ints, reals};
 
PROCEDURE Variable(VAR arr: ARRAY OF REFANY) =
BEGIN
FOR i := FIRST(arr) TO LAST(arr) DO
TYPECASE arr[i] OF
| REF TEXT(n) => IO.Put(n^ & "\n");
| REF INTEGER(n) => IO.Put(Fmt.Int(n^) & "\n");
| REF REAL(n) => IO.Put(Fmt.Real(n^) & "\n");
ELSE (* skip *)
END;
END;
END Variable;
BEGIN
strings^ := "Rosetta"; ints^ := 1; reals^ := 3.1415;
Variable(refarr);
END Varargs.</lang>
Output:
<pre>
Rosetta
1
3.1415
</pre>
 
=={{header|Objective-C}}==
Anonymous user