[Gambas-user] "Groups" of optional arguments

Brian G brian at westwoodsvcs.com
Wed Nov 30 20:17:57 CET 2022


----- On Nov 30, 2022, at 8:15 AM, T Lee Davidson t.lee.davidson at gmail.com wrote:

> On 11/30/22 03:04, BB wrote:
>> Maybe I'm overthinking this or maybe my brain is just not as sharp as it used to
>> be.
>> 
>> Short explanation: I think I need to group optional arguments something along
>> the lines of :
>> 
>> Sub XYZ ( arg1 As String, Optional ( arg2 As Boolean, arg3 As Integer = 0),
>> Optional ( arg4 As Date = Null, arg5 as Integer =
>> -Inf ) )
>> 
>> The illogical thinking is that calls to the method
>> 
>>   * must have arg1 provided and
>>   * either
>>       o arg2 and possibly arg3
>>   * or
>>       o possibly arg4 and possibly arg5
>> 
>> The example is simpified, btw. 😁
>> 
>> Is there a way to do this?
>> 
>> 
> 
> This may be a gross misunderstanding of the problem. But, couldn't you pass in
> the callee's class as a required parameter in
> addition to the reqion, and pass all the optionals as variadic or, simply,
> positional optionals?
> 
> Ie.: given Sub XYZ ( arg1 As String, Optional ( arg2 As Boolean, arg3 As Integer
> = 0), Optional ( arg4 As Date = Null, arg5 as
> Integer = -Inf ) )
> 
> data = XYZ(regionid, Object.Type(Me), ...) , or
> data = XYZ(regionid, Object.Type(Me), Optional arg3 as blah, Optional arg4 as
> blahblah, etc.)
> 
> 
> and handle the myriad optional arguments based on who's calling? Or would that
> lead to more spaghetti code?
> 
> 
> --
> Lee
> 
> 
> ----[ http://gambaswiki.org/wiki/doc/netiquette ]----

How about from your example the following script example of parsing parameters:

#!/usr/bin/env gbs3
' Gambas Script File Created 11/30/2022 17:09:34.817

class xyz

Static Public Sub _call(regionid As String, ...)

    On param.count Goto sublabel1, sublabelerr, sublabel2, sublabelerr, sublabel4 ' 1 parm, 2 parms, 3 params 4 params

    Dim a As Integer
    Dim b As String
    Dim offset As Integer = 0
    Dim OutputLine As String = ""

SubLabel1:
    GoSub sublabel11
    Print "editVariety" & Outputline

sublabel11:  ' one parameter
    OutputLine = " -r " & regionID
    'do stuff here
    Return

Sublabel2:  ' three parameters
    GoSub SubLabel11

    If Not (TypeOf(param[0]) = gb.boolean) Then
        GoSub SubLabel22
    Else
        GoSub Sublabel21
    Endif
    Print "editVariety " & outputLine
    Return

Sublabel21: ' First parm was boolean
    ' Print "optional Parm set with boolean as first and ";; param.count;; "params Values =";; param[0];; ",";; param[1];;
    OutputLine &= " -v " & Str(param[0]) & " -Y " & Str(Param[1])
    ' do stuff here
    Return

SubLabel22: ' First param was not boolean
    'If Param.count = 2 Then Print "optional Parm set not boolean as first and ";; param.count;; "params Values =";; Else Print ",";;
    'Print param[0 + offset];; ",";; param[1 + offset]
    outputline &= " -u " & Str(Param[0 + offset]) & " -q " & Str(Param[1 + offset])
    ' do stuff here
    Return

SublabelErr: ' Invalid parm count
    Print
    error.raise("Error : Not enough parameters (" & Str(Param.count) & ")")

Sublabel4:
    'Print "Recieved 4 parameters"
    offset = 2
    GoSub sublabel11
    GoSub sublabel21
    GoSub sublabel22
    Print "editVariety" & OutPutline

End
end class


    xyz("Sacramento")
    Try xyz("Boston", True)
    If Error Then Print "Error", "Boston";; Error.text
    xyz("Boston", True, "1987")
    Try xyz("Washinton", "Badcnt")
    If Error Then Print "Error", "Washinton";; Error.text
    xyz("Washinton", "Arg3", "Arg4")
    Try xyz("Daton", True, "2007", "arg3")
    If Error Then Print "Error", "Daton";; Error.text
    xyz("Daton", True, "2008", "arg3", "arg4")



QUIT 0
catch
Print error.text&"\n" & error.where




More information about the User mailing list