Posts: 490
Threads: 95
Joined: Apr 2022
Reputation:
23
03-11-2023, 06:46 PM
(This post was last modified: 03-11-2023, 06:47 PM by CharlieJV.)
Posts: 490
Threads: 95
Joined: Apr 2022
Reputation:
23
An example use case:
Code: (Select All) INIT:
_initaudio
_mapset("A", 1)
_mapset("B", 2)
_mapset("C", 3)
MAIN_PROGRAM:
getselection:
print "Press one of the following keys: A B C"
let selection$ = ucase$(input$(1))
if selection$ < "A" or selection$ > "C" then beep : goto getselection
on _mapget(selection$) gosub handle_A, handle_B, handle_C
goto getselection
end
SUBROUTINES:
handle_A:
print "stuff to do for selection A"
RETURN
handle_B:
print "stuff to do for selection B"
RETURN
handle_C:
print "stuff to do for selection C"
RETURN
Posts: 176
Threads: 36
Joined: May 2022
Reputation:
16
Something as this already exists:
Code: (Select All) INIT:
' _initaudio
' _mapset("A", 1)
' _mapset("B", 2)
' _mapset("C", 3)
'MAIN_PROGRAM:
getselection:
Print "Press one of the following keys: A B C"
Let selection$ = UCase$(Input$(1))
If selection$ < "A" Or selection$ > "C" Then Beep: GoTo getselection
Selected = Abs(64 - Asc(selection$))
Print Selected
' on _mapget(selection$) gosub handle_A, handle_B, handle_C
On Selected GOSUB Handle_A, Handle_B, Handle_c
GoTo getselection
End
SUBROUTINES:
Handle_A:
Print "stuff to do for selection A"
Return
Handle_B:
Print "stuff to do for selection B"
Return
Handle_c:
Print "stuff to do for selection C"
Return
Posts: 490
Threads: 95
Joined: Apr 2022
Reputation:
23
Mine was a ridiculous use case scenario.
I am not particularly good at inventing hypothetical examples.
Maybe this is better:
Code: (Select All) INIT:
_initaudio
_mapset("CARROT", 1)
_mapset("CORN", 2)
_mapset("POTATO", 3)
MAIN_PROGRAM:
getselection:
input "Search for recipes: enter one ingredient:", selection$
selection$ = ucase$(selection$)
if _mapget(selection$) = "" then beep : print "sorry, no recipes for " + selection$ : goto getselection
on _mapget(selection$) gosub CARROT, CORN, POTATO
goto getselection
end
SUBROUTINES:
CARROT:
print "setup special processing for carrot-related recipes and info"
RETURN
CORN:
print "setup special processing for corn-related recipes and info"
RETURN
POTATO:
print "setup special processing for potato-relatd recipes and info"
RETURN
Posts: 490
Threads: 95
Joined: Apr 2022
Reputation:
23
(03-12-2023, 04:16 PM)CharlieJV Wrote: Mine was a ridiculous use case scenario.
I am not particularly good at inventing hypothetical examples.
Maybe this is better:
Code: (Select All) INIT:
_initaudio
_mapset("CARROT", 1)
_mapset("CORN", 2)
_mapset("POTATO", 3)
MAIN_PROGRAM:
getselection:
input "Search for recipes: enter one ingredient:", selection$
selection$ = ucase$(selection$)
if _mapget(selection$) = "" then beep : print "sorry, no recipes for " + selection$ : goto getselection
on _mapget(selection$) gosub CARROT, CORN, POTATO
goto getselection
end
SUBROUTINES:
CARROT:
print "setup special processing for carrot-related recipes and info"
RETURN
CORN:
print "setup special processing for corn-related recipes and info"
RETURN
POTATO:
print "setup special processing for potato-relatd recipes and info"
RETURN
Hmm. That last sample would have been better with "ORANGE", "CARROT", "BEEF". Just to highlight that the processing might be pretty different for fruit vs veggies vs meat.
Posts: 176
Threads: 36
Joined: May 2022
Reputation:
16
Here is it - MapSet and MapGet - but first DIM definitons are need.
Code: (Select All) Type MapSet_Internal
v As String
value As Integer
End Type
ReDim Shared MU(0) As MapSet_Internal
MapSet "CARROT", 1
MapSet "CORN", 2
MapSet "POTATO", 3
MAIN_PROGRAM:
getselection:
Input "Search for recipes: enter one ingredient:", selection$
selection$ = UCase$(selection$)
If MapGet(selection$) = 0 Then Beep: Print "sorry, no recipes for " + selection$: GoTo getselection
On MapGet(selection$) GOSUB CARROT, CORN, POTATO
GoTo getselection
End
SUBROUTINES:
CARROT:
Print "setup special processing for carrot-related recipes and info CARROT"
Return
CORN:
Print "setup special processing for corn-related recipes and info CORN"
Return
POTATO:
Print "setup special processing for potato-relatd recipes and info POTATO"
Return
Sub MapSet (something As String, value)
u = UBound(MU)
MU(u).v = something$
MU(u).value = value
ReDim _Preserve MU(u + 1) As MapSet_Internal
End Sub
Function MapGet (value$)
U = LBound(MU)
Do Until m = UBound(MU)
V$ = _Trim$(MU(m).v)
If V$ = value$ Then MapGet = MU(m).value: Exit Function
m = m + 1
Loop
MapGet = 0
End Function
Posts: 490
Threads: 95
Joined: Apr 2022
Reputation:
23
Total aside.
One of the things I'm working on: debugging/fine-tuning meta-programming (macro-handling). For example:
Code: (Select All) <$vars ingredients="APPLE CARROT BEEF BARLEY CHICKEN PAPRIKA">
INIT:
_initaudio
<$list variable="ingredient" filter="[enlist<ingredients>sort[]]" counter="i">
_mapset("<<ingredient>>",<<i>>) </$list>
'
MAIN_PROGRAM:
'
getselection:
input "Search for recipes: enter one ingredient:", selection$
selection$ = ucase$(selection$)
if _mapget(selection$) = "" then beep : print "sorry, no recipes for " + selection$ : goto getselection
'
on _mapget(selection$) gosub {{{ [enlist<ingredients>sort[]join[, ]] }}}
'
goto getselection
'
end
'
SUBROUTINES:
'
<$list variable="ingredient" filter="[enlist<ingredients>sort[]]" counter="i">
<<ingredient>>:
print "setup special processing for <<ingredient>>-related recipes and info"
RETURN
'
</$list>
</$vars>
The above results in:
Code: (Select All) INIT:
_initaudio
_mapset("APPLE",1)
_mapset("BARLEY",2)
_mapset("BEEF",3)
_mapset("CARROT",4)
_mapset("CHICKEN",5)
_mapset("PAPRIKA",6)
'
MAIN_PROGRAM:
'
getselection:
input "Search for recipes: enter one ingredient:", selection$
selection$ = ucase$(selection$)
if _mapget(selection$) = "" then beep : print "sorry, no recipes for " + selection$ : goto getselection
'
on _mapget(selection$) gosub APPLE, BARLEY, BEEF, CARROT, CHICKEN, PAPRIKA
'
goto getselection
'
end
'
SUBROUTINES:
'
APPLE:
print "setup special processing for APPLE-related recipes and info"
RETURN
'
BARLEY:
print "setup special processing for BARLEY-related recipes and info"
RETURN
'
BEEF:
print "setup special processing for BEEF-related recipes and info"
RETURN
'
CARROT:
print "setup special processing for CARROT-related recipes and info"
RETURN
'
CHICKEN:
print "setup special processing for CHICKEN-related recipes and info"
RETURN
'
PAPRIKA:
print "setup special processing for PAPRIKA-related recipes and info"
RETURN
'
Posts: 176
Threads: 36
Joined: May 2022
Reputation:
16
That's a nice job, filtering out strings like that. I just now read the definition of MapGet - what I wrote is only for numeric values. I don't know of a way to use a function that is supposed to return a string to return a number so that the string function gives a numeric output and other functions that expect a number accept this if I were to strictly follow the notation used. The same with MapSet - there both parameters would have to be written in quotation marks. The C language could do the above, but I can't serve there. Unfortunately, in QB64 you cannot write two functions with the same name so that one returns strings and the other with the same name returns numbers.
Posts: 490
Threads: 95
Joined: Apr 2022
Reputation:
23
(03-12-2023, 06:55 PM)Petr Wrote: That's a nice job, filtering out strings like that. I just now read the definition of MapGet - what I wrote is only for numeric values. I don't know of a way to use a function that is supposed to return a string to return a number so that the string function gives a numeric output and other functions that expect a number accept this if I were to strictly follow the notation used. The same with MapSet - there both parameters would have to be written in quotation marks. The C language could do the above, but I can't serve there. Unfortunately, in QB64 you cannot write two functions with the same name so that one returns strings and the other with the same name returns numbers.
Yeah, BAM being a javascript-under-the-hood critter...
My mindset, from early training and throughout my career, has always been about strong typing.
Experiencing loose typing in BAM has me questioning much of what I've always been used to. Kind of like having a slight identity crisis ...
Aside: I got into this _MAPSET and _MAPGET thing because I was at first wondering if a "swtich" function could be useful. When I started thinking about the implementation of it, my mind wandered over to javascript maps, and my flickering-light-bulb-moment: switch function would be a javascript pain in the caboose to implement when I've got better things to do, but a global map and the statement+function will take me all of an hour. (all in the context of giving ON GOSUB a new trick.)
|