Goto function?

Hey!
I have been trying to find a goto function in ruby..
Like this:

foo: bar
If blabla then GOTO foo

Is there any command for exiting the app?
And how do I search ex a textfile for a certain word and delete it?

···

------

if value == "2"
    system('clear')
    print "[Opening file..]\n\n"
      r_file = File.open( "file", "a") #Wrote this so I wouldn't get an
error like "File doesn't exist".
      r_file = File.open( "file", "r")
      print "-----\n"
      print r_file.read
      print "-----"
      print "\n"
      system ('ruby note.rb') #is there anyway to restart or goto the
beginning of the script?
    end

-----

Thanks!

quoth the fabsy:

Hey!
I have been trying to find a goto function in ruby..
Like this:

foo: bar
If blabla then GOTO foo

Use a function:

def foo
  #whatever foo does

foo() if blabla

or invert the test:

foo() unless !blabla

Is there any command for exiting the app?

Yeah: 'exit'

And how do I search ex a textfile for a certain word and delete it?

Probably lots of ways. One would be to read the file to a string and use
gsub(). See the String and IO docs
http://www.whytheluckystiff.net/ruby/pickaxe/html/builtins.html

------

if value == "2"
    system('clear')
    print "[Opening file..]\n\n"
      r_file = File.open( "file", "a") #Wrote this so I wouldn't get an
error like "File doesn't exist".
      r_file = File.open( "file", "r")
      print "-----\n"
      print r_file.read
      print "-----"
      print "\n"
      system ('ruby note.rb') #is there anyway to restart or goto the
beginning of the script?
    end

-----

Thanks!

-d

···

--
darren kirby :: Part of the problem since 1976 :: http://badcomputer.org
"...the number of UNIX installations has grown to 10, with more expected..."
- Dennis Ritchie and Ken Thompson, June 1972

fabsy wrote:

Hey!
I have been trying to find a goto function in ruby..
Like this:

foo: bar
If blabla then GOTO foo

Is there any command for exiting the app?
And how do I search ex a textfile for a certain word and delete it?

------

if value == "2"
    system('clear')
    print "[Opening file..]\n\n"
      r_file = File.open( "file", "a") #Wrote this so I wouldn't get an
error like "File doesn't exist".
      r_file = File.open( "file", "r")
      print "-----\n"
      print r_file.read
      print "-----"
      print "\n"
      system ('ruby note.rb') #is there anyway to restart or goto the
beginning of the script?
    end

-----

Thanks!

begin
...
end while your_condition_here

begin
...
end until your_condition_here

If you need an endless loop

loop do
...
end

See also
http://ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html#S6

Note that your script opens the file over and over again and never closes it. This can cause problems - especially since you do it with different modes.

Kind regards

  robert

fabsy wrote:

Hey!
I have been trying to find a goto function in ruby..
Like this:

foo: bar
If blabla then GOTO foo

Is there any command for exiting the app?
And how do I search ex a textfile for a certain word and delete it?

------

if value == "2"
    system('clear')
    print "[Opening file..]\n\n"
      r_file = File.open( "file", "a") #Wrote this so I wouldn't get an
error like "File doesn't exist".
      r_file = File.open( "file", "r")
      print "-----\n"
      print r_file.read
      print "-----"
      print "\n"
      system ('ruby note.rb') #is there anyway to restart or goto the
beginning of the script?
    end

-----

Thanks!

There is a reason why there are no gotos in Ruby or the vast majority
of modern languages. They are the complete antithesis of good program
design. You should be writing something more like this:

while value == 2
  begin
    system("clear") # This is a pretty bad idea - it's not portable and
completely unneccesary.
    puts "[Opening file...]"
    puts
    File.open("file", "r") do |file|
      puts "---"
      puts file.read
      puts "---"
    end
    system("ruby note.rb") # What is this for?
  rescue Errno:ENOENT
    puts "File does not exist."
  end
end

This program properly handles file closing and uses exception handling
to pick up problems with opening the file. Exceptions and simple loops
can produce the same result as any GOTO mess while maintaining good
structure. I would avoid system() as well, but you may have your
reasons for using it.

fabsy wrote:

Hey!
I have been trying to find a goto function in ruby..
Like this:

foo: bar
If blabla then GOTO foo

Is there any command for exiting the app?
And how do I search ex a textfile for a certain word and delete it?

<snip for rforum />

Since no-one mentioned it, how about a throw/catch solution?

···

Thanks!

--
Posted via http://www.ruby-forum.com/\.

My friends ! Let's not become dogmatic, please !!! …

I have nothing against standards in coding and all, but please, let us
people write dirty code sometimes ! It can be so handy !

I like well indented code, and pushing a whole lot of code I want to
make optional one indentation further is a pain in the back. There are
many ways to program well, and there is also idiosyncratic or
exceptional programming that may be way clearer with a blatant GOTO.

Why not ? I like it when a language gives me tools, handy tools, logical
ones, for particular situations, like, imagine, you just want to have
the data in a proper format and start doing nifty stuff with it right
away. Who cares if the data-load part is not yet modularized, and all,
and if there are some orange cones around your hefty chunk of code with
multiple passes and all — with DEVIATION signs flashing in front it ?
It's surely temporary, so, let's relaaax.

And… what if it wasn't temporary ? I agree that using it too much
(especially backwards) is a bad habit, but in some situations, why not ?
Like, we have a break instruction that is very handy to short-circuit
the code and jump above it.

I like cleanliness and modularization, but I also like to have the eval
command, and metaprogramming stuff to explore sometimes unexpected ways.
So, why not a goto command ?

It's neat to be able to get dirty when one needs it and feels confident
about it !

Anyway… for now, I'll just make exceptions to my indentation fixation,
waiting for a freer future.

Ciao !

···

--
Posted via http://www.ruby-forum.com/.

begin
...
end while your_condition_here

begin
...
end until your_condition_here

If you need an endless loop

loop do
...
end

See also
Programming Ruby: The Pragmatic Programmer's Guide

Note that your script opens the file over and over again and never
closes it. This can cause problems - especially since you do it with
different modes.

Kind regards

  robert

I don't really understand..

I want the script to start over again.. for example..
When the user made an input and pressed return I want the script to
"restart" or jump to the beginning..

Timothy Goddard skrev:

fabsy wrote:
> Hey!
> I have been trying to find a goto function in ruby..
> Like this:
>
> foo: bar
> If blabla then GOTO foo
>
> Is there any command for exiting the app?
> And how do I search ex a textfile for a certain word and delete it?
>
>
> ------
>
> if value == "2"
> system('clear')
> print "[Opening file..]\n\n"
> r_file = File.open( "file", "a") #Wrote this so I wouldn't get an
> error like "File doesn't exist".
> r_file = File.open( "file", "r")
> print "-----\n"
> print r_file.read
> print "-----"
> print "\n"
> system ('ruby note.rb') #is there anyway to restart or goto the
> beginning of the script?
> end
>
> -----
>
> Thanks!

There is a reason why there are no gotos in Ruby or the vast majority
of modern languages. They are the complete antithesis of good program
design. You should be writing something more like this:

while value == 2
  begin
    system("clear") # This is a pretty bad idea - it's not portable and
completely unneccesary.
    puts "[Opening file...]"
    puts
    File.open("file", "r") do |file|
      puts "---"
      puts file.read
      puts "---"
    end
    system("ruby note.rb") # What is this for?
  rescue Errno:ENOENT
    puts "File does not exist."
  end
end

This program properly handles file closing and uses exception handling
to pick up problems with opening the file. Exceptions and simple loops
can produce the same result as any GOTO mess while maintaining good
structure. I would avoid system() as well, but you may have your
reasons for using it.

Naa, Im just testing to create something simple.. I think thats the
best way of learning..
So the system() thingy is just for test. :slight_smile:
the system("ruby note.rb") was just a solution to get the script to
"restart", I know it's a bad way but I had to try it. The system(clear)
was just so the screen was cleared.

Throw / catch is for hairier nonlocal returns, he wanted to repeat something using goto. Looping with a break or an end condition is easier to understand (YMMV) if you don't need to get a result value of any sort. But yes, that would also work. Especially since you can implement any control construct with ruby's throw / catch if you're stark raving mad enough.

David Vallner

···

On Wed, 16 Aug 2006 04:07:26 +0200, Eero Saynatkari <eero.saynatkari@kolumbus.fi> wrote:

Since no-one mentioned it, how about a throw/catch solution?

fabsy wrote:

Hey!
I have been trying to find a goto function in ruby..
Like this:

foo: bar
If blabla then GOTO foo

Is there any command for exiting the app?
And how do I search ex a textfile for a certain word and delete it?

<snip for rforum />

Since no-one mentioned it, how about a throw/catch solution?

I originally tried to do it with throw/catch, but its not really "goto-y" enough. Hence the continuation solution.

···

On Aug 15, 2006, at 10:07 PM, Eero Saynatkari wrote:

Thanks!

--
Posted via http://www.ruby-forum.com/\.

...

I like cleanliness and modularization, but I also like to have the eval
command, and metaprogramming stuff to explore sometimes unexpected ways.
So, why not a goto command ?

It's neat to be able to get dirty when one needs it and feels confident
about it !

Anyway… for now, I'll just make exceptions to my indentation fixation,
waiting for a freer future.

You can use continuations (although I think I recall hearing that they
were either removed or dumbed down in 1.9).

···

On Tue, Oct 9, 2012 at 4:45 PM, Frédéric Lemire <lists@ruby-forum.com> wrote:

You can compile Ruby with SUPPORT_JOKE to enable goto.

http://patshaughnessy.net/2012/2/29/the-joke-is-on-us-how-ruby-1-9-supports-the-goto-statement

-- Matma Rex

I wouldn't recommend making this a habit but:

% cat cc.rb
x = 0
bar = callcc {|cc| cc}
puts "Hello"
x += 1
bar.call(bar) unless x == 3
puts "x is #{x}"

% ruby cc.rb
Hello
x is 3

···

On Aug 15, 2006, at 5:05 PM, fabsy wrote:

begin
...
end while your_condition_here

begin
...
end until your_condition_here

If you need an endless loop

loop do
...
end

See also
Programming Ruby: The Pragmatic Programmer's Guide

Note that your script opens the file over and over again and never
closes it. This can cause problems - especially since you do it with
different modes.

Kind regards

  robert

I don't really understand..

I want the script to start over again.. for example..
When the user made an input and pressed return I want the script to
"restart" or jump to the beginning..

Let me introduce you to my good friend: structured programming. I'm sure you'll get along marvelous once you get to know each other.

The BASIC construct of "goto" is rightfully considered harmful for programs above a certain complexity. It's not present in Ruby in any direct way that would let you jump around a program's structure arbitrarily. (Actually, that's a lie, but I'll hold the continuations for the sake of simplicity.)

If you want a script to start over, the easiest way is to put all the logic of the script into a function / procedure / whatever, and repeatedly call that one in a loop like Darren and Robert indicated.

If you want the script to react to user input, you could for example do:

def do_stuff_with_file(r_file)
  # Most of your original code goes here.
end

should_print_file = true
while should_print_file

  # Better way to avoid file not found errors - you're creating a completely
  # useless temporary file as a workaround.
  File.open('file') { | r_file | do_stuff_with_file(r_file) } if File.exist? ('file')

  puts('Print file again? [y/n]')
  should_print_file = (gets[0] == 'y') # Flaky bit, should be more forgiving.

end

David Vallner

···

On Tue, 15 Aug 2006 23:05:10 +0200, fabsy <fabbyfabs@gmail.com> wrote:

I want the script to start over again.. for example..
When the user made an input and pressed return I want the script to
"restart" or jump to the beginning..

Since no-one mentioned it, how about a throw/catch solution?

Throw / catch is for hairier nonlocal returns, he wanted to repeat something using goto. Looping with a break or an end condition is easier to understand (YMMV) if you don't need to get a result value of any sort. But yes, that would also work. Especially since you can implement any control construct with ruby's throw / catch if you're stark raving mad enough.

Even if you need a return value you can break with a value. I.e.,

i = 0
loop do
   i = i + 1
   break i * i if i == 5
end

will return 25.

···

On 06-08-15, at 22:23, David Vallner wrote:

On Wed, 16 Aug 2006 04:07:26 +0200, Eero Saynatkari > <eero.saynatkari@kolumbus.fi> wrote:

David Vallner

--
Jeremy Tregunna
jtregunna@blurgle.ca

"One serious obstacle to the adoption of good programming languages is the notion that everything has to be sacrificed for speed. In computer languages as in life, speed kills." -- Mike Vanier

begin
...
end while your_condition_here

begin
...
end until your_condition_here

If you need an endless loop

loop do
...
end

See also
Programming Ruby: The Pragmatic Programmer's Guide

Note that your script opens the file over and over again and never
closes it. This can cause problems - especially since you do it with
different modes.

I don't really understand..

You call File.open() but you do not call #close(). Note that there are other means to read from a file, e.g you can do File.readlines or File.read. See RDOC here RDoc Documentation

I want the script to start over again.. for example..
When the user made an input and pressed return I want the script to
"restart" or jump to the beginning..

That's why I gave you the looping constructs.

  robert

···

On 15.08.2006 23:00, fabsy wrote:

It's a question of structure and proper planning more than any type of
dogmatic fanboyism. Goto is not good practice. We have loops and recursion
for such things, and if you admit it's dirty then why in the world are you
using it? This is more of an appeal to logic and sanity than anything.

···

Eric Christopherson писал 10.10.2012 02:12:

···

On Tue, Oct 9, 2012 at 4:45 PM, Frédéric Lemire > <lists@ruby-forum.com> wrote:
...

I like cleanliness and modularization, but I also like to have the eval
command, and metaprogramming stuff to explore sometimes unexpected ways.
So, why not a goto command ?

It's neat to be able to get dirty when one needs it and feels confident
about it !

Anyway… for now, I'll just make exceptions to my indentation fixation,
waiting for a freer future.

You can use continuations (although I think I recall hearing that they
were either removed or dumbed down in 1.9).

They were, in fact, added in 1.9.

--
   WBR, Peter Zotov.

I wouldn't recommend making this a habit but:

% cat cc.rb
x = 0
bar = callcc {|cc| cc}
puts "Hello"
x += 1
bar.call(bar) unless x == 3
puts "x is #{x}"

Yikes, someone asks questions which indicate that they
are a novice programmer and you throw continuations at them?

Isn't that like throwing someone in the deep end of the pool and
seeing if they can swim? Or maybe it is like holding them under
water and seeing if they have gills? :slight_smile:

Fasby wrote:

I don't really understand..

I want the script to start over again.. for example..
When the user made an input and pressed return I want the script to
"restart" or jump to the beginning..

You can use 'next' to begin the next iteration of a loop:

loop {
   # your code here
   if startover?
      next # will cause loop to start over
   end
   # more stuff here
   if quit?
     break # to get out of the loop entirely
   end
   # more stuff here
}

Gary Wright

···

On Aug 15, 2006, at 5:28 PM, Logan Capaldo wrote:

<snip>

Obligatory response:

In some very rare circumstances, using gotos does in fact have a rightful
place in code. In very long switch/case statements in C code, a _very_
well structured (and properly named) set of labels/gotos can make code
much cleaner, and easier to understand, than if they were not used. But
I'll say again, this is very rare.

Nate

···

On Wed, 16 Aug 2006, David Vallner wrote:

On Tue, 15 Aug 2006 23:05:10 +0200, fabsy <fabbyfabs@gmail.com> wrote:
> I want the script to start over again.. for example..
> When the user made an input and pressed return I want the script to
> "restart" or jump to the beginning..
>

Let me introduce you to my good friend: structured programming. I'm sure
you'll get along marvelous once you get to know each other.

The BASIC construct of "goto" is rightfully considered harmful for
programs above a certain complexity. It's not present in Ruby in any
direct way that would let you jump around a program's structure
arbitrarily. (Actually, that's a lie, but I'll hold the continuations for
the sake of simplicity.)