3 or 4 is called depending on which is integer. If both are real, the function on line 2 is called. For default parameters, consider the following: const Three = 3; var K: Integer; function add(i1: integer = 0; i2: integer = 0; i3: integer = 0; i4: integer = 0; i5: integer = 0; i6: integer = 0; i7: integer = 0; i8: integer = 0): integer; begin add := i1+i2+i3+I4+I5+i6+I7+I8; end; begin K := add; { K is 0} K := add(K,1); { K is 1} K := add(1,2); { K is 3} K := add(1,2,Three); { K is 6, etc.} end. On Line 6, (and the lines below) the parameter tells the compiler, "if no argument is provided, presume the argument to be zero". On line 19, no arguments were given, so the function returns . On line 20, either a number or a variable can be supplied for any argument, and as shown on line 22, a constant. In PHP PHP does not care about types of variadic arguments unless the argument is typed. function sum(...$nums): int { return array_sum($nums); } echo sum(1, 2, 3); // 6 And typed variadic arguments: function sum(int ...$nums): int { return array_sum($nums); } echo sum(1, 'a', 3); // TypeError: Argument 2 passed to sum() must be of the type int (since PHP 7.3) In Python Python does not care about types of variadic arguments. def foo(a, b, *args): print(args) # args is a tuple (immutable sequence). foo(1, 2) # () foo(1, 2, 3) # (3,) foo(1, 2, 3, "hello") # (3, "hello") Keyword arguments can be stored in a dictionary, e.g. . In Raku In Raku, the type of parameters that create variadic functions are known as slurpy array parameters and they're classified into three groups: Flattened slurpy These parameters are declared with a single asterisk (*) and they flatten arguments by dissolving one or more layers of elements that can be iterated over (i.e, Iterables). sub foo($a, $b, *@args) { say @args.perl; } foo(1, 2) # [] foo(1, 2, 3) # [3] foo(1, 2, 3, "hello") # [3 "hello"] foo(1, 2, 3, [4, 5], [6]); # [3, 4, 5, 6] Unflattened slurpy These parameters are declared with two asterisks () and they do not flatten any iterable arguments within the list, but keep the arguments more or less as-is: sub bar($a, $b, **@args) { say @args.perl; } bar(1, 2);