Call a function: Difference between revisions

Content added Content deleted
m (added a ;Task: (bold) header.)
Line 2,037: Line 2,037:


By default, arguments are passed readonly, which allows the implementation to decide whether pass-by-reference or pass-by-value is more efficient on a case-by-case basis. Explicit lvalue, reference, or copy semantics may be requested on a parameter-by-parameter basis, and the entire argument list may be processed raw if that level of control is needed.
By default, arguments are passed readonly, which allows the implementation to decide whether pass-by-reference or pass-by-value is more efficient on a case-by-case basis. Explicit lvalue, reference, or copy semantics may be requested on a parameter-by-parameter basis, and the entire argument list may be processed raw if that level of control is needed.

=={{header|Phix}}==
Phix has three kinds of routines: procedure, function, and type. A procedure does not return a value, whereas a function does.
A type is a specialised kind of function, that permits declarations of instances of that type, which are
automatically validated whenever they are changed, and further the type routine always returns true or false.
* Phix does not allow implicit discard of function results. The explicit discard statement takes the form
<lang Phix>{} = myfunction()</lang>
* This is in fact a simple contraction of standard multiple assigment (which can be nested):
<lang Phix>{cities,populations} = columize(muncipalities)
{{},populations} = columize(muncipalities) -- discard result[1]
{cities,{}} = columize(muncipalities) -- discard result[2]
{cities} = columize(muncipalities) -- ""</lang>
* Calling a function with no parameters still requires the empty argument list.
* Optional arguments are denoted by the presence of a default, and must be grouped on the right:
<lang Phix>function myfunction(integer a, string b="default")
return {a,b}
end function
--? myfunction() -- illegal, compile-time error
?myfunction(1) -- displays {1,"default"}
?myfunction(2,"that") -- displays {2,"that"}</lang>
* Sequence parameters can be of any length, which is another way to implement optional/variable number of arguments.
* Named arguments can be specified in any order, with an error if any non-optional parameters are missing:
<lang Phix>?myfunction(b:="then",a:=3) -- displays {3,"then"}
--?myfunction(b:="though") -- compile-time error</lang>
* The programmer is free to use either positional parameters or named parameters, or a mixture of both (with positional parameters first).
* Phix does not support first-class functions, but instead uses an integer routine_id mechanism (and obviously integers are first class):
<lang Phix>constant integer r_my_func = routine_id("myroutine")
?call_func(r_my_func,{1}) -- displays {1,"default"}</lang>
The value of r_my_func can be passed as an argument to any routine, or stored in a table, and invoked in a similar fashion.<br>
Note however that for performance reasons some builtins do not have a proper routine_id; if you need one you must write a trivial one-line wrapper.<br>
(For a full list, see psym.e/syminit() calls to AutoAsm(), whereas calls to initialAutoEntry() therein indicate builtins that can have routine_ids.)<br>
(One day the compiler may be enhanced to automatically create one-line wrappers as needed, but that is quite near the end of a fairly long to-do list.)
* Partial application is usually achieved through a single variable-length "user_data" parameter within a call_func() expression.
* All arguments are passed by reference with copy-on-write semantics: to modify the value of a parameter you must both return and assign it, as in:
<lang Phix>s = append(s,item)</lang>
* Implicit forward calls are supported, as are optional explicit forward declarations, which occasionally give better compilation error messages.


=={{header|PicoLisp}}==
=={{header|PicoLisp}}==