To make a function with default argument, I tried this:
f: function [a b] [either unset? :b [a + 1] [a + b]]
f 5
f 3 5
then I receive this message *** Script Error: f is missing its b argument
.
So, what shall I do?
There's a trick to implement variable-arity functions that some of the built-ins use, most notably help
:
>> ? help
...
ARGUMENTS:
'word [any-type!]
Specify your argument as quoted and belonging to any-type!
typeset. Or, alternatively, list the allowed types and include unset!
in it.
>> foo: func [a 'b [unset! integer!]][a + do pick [1 b] unset? :b]
== func [a 'b [unset! integer!]][a + do pick [1 b] unset? :b]
>> foo 5
== 6
>> foo 3 5
== 8
This, however, comes at a certain price:
any-type!
accepts any argument; '
in front of the argument also enforces specific semantics, which makes such variadic functions even more cumbersome.block!
argument, which might even be dialected.Such an approach is justified only for user-facing polymorphic functions, intended to be used from command-line prompt (such as help
) or any other kind of interface that provides clear-cut boundaries for typed expressions (e.g. end of the line, special terminating symbol), and even then the number of optional arguments is kept at minimum.