From: Robert Klemme Date: 2006-08-21T23:40:12+09:00 Subject: Re: working around "single-pass" constraint On 21.08.2006 16:29, Rich Morin wrote: > 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). 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