Call a function: Difference between revisions

Content added Content deleted
(Added Bracmat example)
Line 193: Line 193:
goto :eof
goto :eof
</lang>
</lang>

=={{header|Bracmat}}==

* Calling a function that requires no arguments:

Strictly speaking, all Bracmat functions receive at least one argument. But empty strings are valid expressions, so you can do

<lang bracmat>aFunctionWithoutArguments$</lang>
or
<lang bracmat>aFunctionWithoutArguments'</lang>

Both function calls pass the right and side of the <code>$</code> or <code>'</code> operator. This is in fact still something: an empty string.

The <code>$</code> operator always evaluates its right hand side before passing it to the function, while the <code>'</code> does not. Therefore it is slightly faster to use the <code>functionName'</code> variant.

* Calling a function with a fixed number of arguments:

Bracmat passes exactly one argument to a function, called <code>arg</code>. The argument can be any Bracmat expression. In patterns, if a function call expression is a pattern component, a second argument <code>sjt</code> is added, the part of the subject that the pattern component is going trying to match.

* Calling a function with optional arguments

There is no special syntax for that. It is up to the programmer to define a datastructure with a variable part, e.g., a list.

* Calling a function with a variable number of arguments

Same answer.

* Calling a function with named arguments

There is no special syntax for that. You could pass a list of (name.value) pairs.

* Using a function in statement context

A f...

You can do
<lang bracmat>func$!myargument;</lang>
The <code>;</code> marks the end of a Bracmat statement.

* Using a function in first-class context within an expression

(Copied from JavaScript:) Bracmat functions are first-class citizens; they can be stored in variables and passed as arguments. Assigning to a variable <code>yourfunc</code> can be done in a few ways. The most common one is

<lang bracmat>(yourfunc=local vars.function body)</lang>
If there is already a function <code>myfunc</code> that you want to assign to <code>yourfunc</code> as well, do
<lang bracmat>('$myfunc:(=?yourfunc))</lang>

* Obtaining the return value of a function

<lang bracmat>myfunc$!myarg:?myresult</lang>

Notice that the returned value can be any evaluated expression.

* Distinguishing built-in functions and user-defined functions

You cannot list built-in functions that are implemented directly in C. Nor can such functions be passed as arguments or assigned to variables. There are also a number of built-in functions that are written in Bracmat. They are nothing special and can be deleted or redefined. You can see a list of all currently defined functions that are written in Bracmat with the function call <code>cat'</code>.

* Distinguishing subroutines and functions

You can ignore the return value of a function <code>myfunc</code> as follows:

<lang bracmat>myfunc$!myarg&yourfunc$!yourarg</lang>

But notice that if <code>myfunc</code> fails, the above expression returns the value produced by <code>myfunc</code>! To also ignore the success/failure of a function, do

<lang bracmat>`(myfunc$!myarg)&yourfunc$!yourarg</lang>

* Stating whether arguments are passed by value or by reference

Values are passed by reference, or by value if the reference counter, which is a very small integer, overflows. Most values are immutable, so for those there is no practical difference between passing by reference or value. The single exception of a mutable value is always passed by reference, and has an enormous reference counter. (The binary operator <code>=</code> introduces a mutable value and can be used for an object oriented style of programming.)

* Is partial application possible and how

There is no special syntax for that, but you can write a function that e.g., can take a list with one or with two elements and that returns a function in the first case.

<lang bracmat>( ( plus
= a b
. !arg:%?a ?b
& !b:
& '(.!arg+$a)
| !a+!b
)
& out$("1+2, not partial:" plus$(1 2))
& out$("1+2, partial:" (plus$1)$2)
);</lang>

Output:

<pre>1+2, not partial: 3
1+2, partial: 3</pre>


=={{header|C}}==
=={{header|C}}==