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.