I like to order my program code files as follows:
Initial comment header
require statements, etc.
“main” code
method definitions
Unfortunately, Ruby has a “single pass” execution flow
(a bit reminiscent of Pascal’s single-pass compiler :-/)
that doesn’t allow this order to be used, by default.
My current hack is to wrap the “main” code in a method
(e.g., main
and invoke it at the end of the file, I
can get around this issue. I also like the fact that it
(a) puts the code at the same level of indentation as the
code in my methods and (b) limits the scope of variables:
#!/usr/bin/env ruby -w
foo - code formatting demo
def main
bar
end
def bar
puts ‘Hi!’
end
main
However, I have two concerns with this approach:
-
I might be missing a common Ruby idiom (at least,
common within the small group of folks who like to
order their code as I do).
-
I might be in danger of running into some sort of
“dynamic language issue”, in which some method has
to be defined early, because it gets used in main’s
definition.
I don’t know, unfortunately, whether this is a real
concern. Or, if it is, whether I could work around
it by putting the location-sensitive definitions in
front of main’s definition.
Comments? Clues? Suggestions?
-r
http://www.cfcl.com/rdm Rich M.
http://www.cfcl.com/rdm/resume [email protected]
http://www.cfcl.com/rdm/weblog +1 650-873-7841
Technical editing and writing, programming, and web development
On 21.08.2006 16:29, Rich M. wrote:
Unfortunately, Ruby has a “single pass” execution flow
#!/usr/bin/env ruby -w
main
However, I have two concerns with this approach:
- I might be missing a common Ruby idiom (at least,
common within the small group of folks who like to
order their code as I do).
As I don’t belong to that group I don’t have any insight there. 
Personally I don’t mind having the order Ruby imposes.
-
I might be in danger of running into some sort of
“dynamic language issue”, in which some method has
to be defined early, because it gets used in main’s
definition.
I don’t know, unfortunately, whether this is a real
concern. Or, if it is, whether I could work around
it by putting the location-sensitive definitions in
front of main’s definition.
This is not an issue at all:
16:34:42 [~]: ruby -e ‘def main() foo() end; def foo() puts “icks” end;
main()’
icks
IOW, the method needs to be there when it’s called - not earlier.
Kind regards
robert
On Mon, 21 Aug 2006, Rich M. wrote:
I like to order my program code files as follows:
Initial comment header
require statements, etc.
“main” code
BEGIN{
method definitions
}
note that there are also END{} blocks
bar
end
def bar
puts ‘Hi!’
end
main
if you take tis to the next step it’s really useful
class Main
def foo
end
def bar
end
def run
foo and bar
end
end
Main.new(ENV, ARGV).run if $0 == FILE
the reason is that it allows your program to be used as a library
without
polluting the global namespace.
regards.
-a
On 8/22/06, [email protected] [email protected] wrote:
end
end
Main.new(ENV, ARGV).run if $0 == FILE
the reason is that it allows your program to be used as a library without
polluting the global namespace.
I agree, but the OP wants to see the main algorithm at the top of the
file (at least, I think that’s the idea), so “run” should be at the
top:
class Main
def run
foo and bar
end
def foo
end
def bar
end
end
Main.new(ENV, ARGV).run if $0 == FILE
Neat and Tidy… Tidy and Neat (
http://pages.eidosnet.co.uk/pobotrol/whomessy.htm )
At 11:52 PM +0900 8/21/06, [email protected] wrote:
Main.new(ENV, ARGV).run if $0 == FILE
the reason is that it allows your program to be used as a
library without polluting the global namespace.
Assuming that my code contains generally useful functions,
this makes sense (and why bet the other way? :-). However,
I’m curious whether I need to worry about the possibility
of bringing in multiple “Main” classes and “run” methods,
if I use this approach a lot. Do you have any relevant
experience to offer?
-r
http://www.cfcl.com/rdm Rich M.
http://www.cfcl.com/rdm/resume [email protected]
http://www.cfcl.com/rdm/weblog +1 650-873-7841
Technical editing and writing, programming, and web development