From: "WILLS, JAMAL A" Date: 2013-02-16T02:39:05+09:00 Subject: Re: [from BASIC to Ruby] so, what's the proper way to replace funcionality of GOTO ? There is no one way to replace GOTO. GOTO is at the heart of many structured control structures. What you need to do is think about what you are trying to do and where you are trying to go when you are done. In your code, you have: "goto menu_01". After the sequence of statements starting at the menu_01 label, you have: "goto menu_00_endif". If you returned from your sequence to the goto, you would have a subroutine. I'm not familiar with FreeBASIC, but in Commodore BASIC, you could replace your GOTO with GOSUB and the GOTO at the end of the sequence with RETURN. That would eliminate the need for the "menu_00_endif" label. This is a subroutine and can be replaced by a method in Ruby. I think in FreeBASIC, your sub may be defined as follows: ' I think "goto menu_01" may be replaced by Menu_01() ' and the subroutine by Sub Menu_01 ... End Sub You also have a "goto menu_00" after the "End If" statement. The menu_00 and its goto can be replaced with a loop. Using a while loop would be a good idea. The loop using goto menu_00 is an infinite loop, but you use "goto programendshere" to exit it. By setting a condition variable for the loop, you can exit the loop by changing the variable. I'm taking a guess at the FreeBASIC grammar here: stillChoosing = True Do While stillChoosing ... ElseIf strKeyPress = 81 Or strKeyPress = 113 Then stillChoosing = False Else ... Loop It looks like your code is somewhat structured already. You just need to learn how control structures are built from gotos and other statements to properly replace them. Finally, since all you your menus will have the same structure, it make sense that you can replace multiple subroutines with just one. You can pass the text of each menu and return the result. (In Basic, that will make it a Function rather than a Sub, I believe! But either way, it would be a Method in Ruby.) Putting all that together in Ruby might look something like this: # Displays a menu and gets a response back. def showMenu menuText # Display the menu puts menuText puts # Display a prompt print "What do you desire? " # Get a string as a response. (The user will have to press enter, unlike your example.) # chomp removes a newline from the end of the string # downcase makes the string lowercase so "Q" and "q" are returned as "q" gets.chomp.downcase end # Here I am putting the menu text in a long string. menu_00 = %q{menu 00 1 - open menu_01 2 - open menu_02 3 - open menu_03 4 - open menu_04 q - Quit} # The same can be done for these when they are fleshed out menu_01 = "menu 01" menu_02 = "menu 02" menu_03 = "menu 03" menu_04 = "menu 04" stillChoosing = true while stillChoosing do case showMenu(menu_00) when "1" response = showMenu(menu_01) # do something with response here when "2" response = showMenu(menu_02) # do something with response here when "3" response = showMenu(menu_03) # do something with response here when "4" response = showMenu(menu_04) # do something with response here when "q" stillChoosing = false else puts "Wrong Choice, Try Again!" puts end end -----Original Message----- From: Stu P. D'naim [mailto:lists@ruby-forum.com] Sent: Friday, February 15, 2013 11:32 AM To: ruby-talk ML Subject: [from BASIC to Ruby] so, what's the proper way to replace funcionality of GOTO ? I need to make few scripts for tasks I do often manually, but last time I programmed something was almost 20 years ago in high school, we used some BASIC dialect. Since no one uses BASIC nowdays, I decided to give a try to Ruby (I also tried Python, but it's strict indentation is driving me insane). I watched Ruby Essentials Video from Lynda.com (twice), and I pretty much understand almost all of it, but still, I'm having trouble to adapt how to structure my programs (without using of GOTO) Here's a simple example written in FreeBASIC (it works) --------------------------------------------------------------------- Dim As Integer strKeyPress menu_00: CLS PRINT "what do you desire:" PRINT PRINT "1 - open menu_01" PRINT "2 - open menu_02" PRINT "3 - open menu_03" PRINT "4 - open menu_04" PRINT "q - Quit" REM is comment line, same as ' ... code for Q is 81, q = 113 Do strKeyPress = GetKey Loop Until strKeyPress <> 0 '49 represents number 1 on a keybord, and so on if strKeyPress = 49 THEN goto menu_01 elseif strKeyPress = 50 THEN goto menu_02 elseif strKeyPress = 51 THEN goto menu_03 elseif strKeyPress = 52 THEN goto menu_04 elseif strKeyPress = 81 or strKeyPress = 113 THEN goto programendshere else print print "Wrong Choice, Try Again!" sleep 1000 menu_00_endif: end if goto menu_00 menu_01: cls print print "menu 01" sleep 1000 goto menu_00_endif menu_02: cls print print "menu 02" sleep 1000 goto menu_00_endif menu_03: cls print print "menu 03" sleep 1000 goto menu_00_endif menu_04: cls print print "menu 04" sleep 1000 goto menu_00_endif programendshere: End 0 ------------------------------------------------------------------ So, what would be the best practice to make this work in modern languages, like Ruby ? Here are some ideas I have, would be nice to know if it's good thinking or wrong: 1- make all menues part of a same Class, so I can use instance variables (I will need to do some calculations) 2- define every menu as separate method, so you travel from root menu_00 (method) --> menu_01 (which is separate method) --> ... etc go back and forth ... #could this be memory demanding if there is too many sub-menu branching ??? 3- define every menu as separate method, but you DO NOT start new method from INSIDE of other method. It goes something like this: menu_00 returns value to a loop, that value is name of sub-menu (menu_01, separate method) ... I'd then have to use --> method(name_of_returned_value).call() This looks better than option #2, but my attempts to make it work so far failed ... not sure if it is even possible to achieve at all 4- every menu is separate method, but they only have puts "enter choice" lines, no other code, and a $global variable which I will use later in IF loops to detect inside which menu (method) I am: if $global == "00" and userInputChoice == "1" #if you are currently inside root menu 00, and user input is "1" menu_01() $global = "01" ... etc I think this could easily work, though, might not look nice ................................................................. So basically, I'd like to know which way should I go for, 2,3 or 4, or there is maybe even something else? And, also is idea #1 ok ? I hope this wasn't too long to read for my first question here, starting something new is always hardest part for me -- Posted via http://www.ruby-forum.com/.