Is it possible to write functions with optional arguments? I want to create a function similar to the inbuilt `rndu`

function which has an optional argument `state`

.

## 1 Answer

0

Yes, it is possible to write procedures which use optional arguments. The current API was written for internal use, so it is not very pretty. However, in the fall of 2019, a more user-friendly version will be available.

In the mean-time, here is a basic example.

```
print myRndu(1, 1, 777);
print myRndu(1, 1);
print myRndu(1, 1, 777);
#include dynargs.dec
// The optional argument is specified by ...
// it must be the last input to the procedure
proc (1) = myRndu(r, c, ...);
local n_dynargs, x, seed, state;
// Find out how many inputs came
// in as ...
n_dynargs = COUNT_DYNARGS;
if n_dynargs == 0;
x = rndu(r, c);
elseif n_dynargs == 1;
// The 1 after the comma below is
// the index of the dynamic / optional argument
seed = sysstate(GET_ONE_DYNARG, 1);
{ x, state } = rndu(r, c, seed);
endif;
retp(x);
endp;
```

If you run the above code you will get something like this:

0.69992051 0.13141210 0.69992051

The first and last number will be the same, but the middle number will be different.

## Your Answer

## 1 Answer

Yes, it is possible to write procedures which use optional arguments. The current API was written for internal use, so it is not very pretty. However, in the fall of 2019, a more user-friendly version will be available.

In the mean-time, here is a basic example.

```
print myRndu(1, 1, 777);
print myRndu(1, 1);
print myRndu(1, 1, 777);
#include dynargs.dec
// The optional argument is specified by ...
// it must be the last input to the procedure
proc (1) = myRndu(r, c, ...);
local n_dynargs, x, seed, state;
// Find out how many inputs came
// in as ...
n_dynargs = COUNT_DYNARGS;
if n_dynargs == 0;
x = rndu(r, c);
elseif n_dynargs == 1;
// The 1 after the comma below is
// the index of the dynamic / optional argument
seed = sysstate(GET_ONE_DYNARG, 1);
{ x, state } = rndu(r, c, seed);
endif;
retp(x);
endp;
```

If you run the above code you will get something like this:

0.69992051 0.13141210 0.69992051

The first and last number will be the same, but the middle number will be different.