In article <Pine.GSO.4.44.0211191855480.3450-100000 / hardy.math.umd.edu>, Daniel Carrera <dcarrera / math.umd.edu> wrote: >Hi, > >I am a Perl hacker trying to get to know Ruby. I have two questions: Welcome... I used to do Perl a few years back, then I found Ruby ;-) > >1) What is a good resource for learning Ruby in general? Is there a Ruby >equivalent to "Learning Perl"? Well, since you know Perl I'd recommend the 'pickaxe' book: "Programming Ruby: The Pragmatic Programmer's Guide" by Dave Thomas and Andrew Hunt. Also available online at: http://165.193.123.250/book/index.html (there's currently a problem with the registration of the rubycentral domain, hence the use of numbers in the URL) The pickaxe is a great book for learning Ruby (if you're familiar with programming in general already) and it is also has a very good library reference section. > >2) Where does Ruby lie in the interpreted vs compiled range? >For instance, Perl is not really interpreted. The file is compiled into >an object code which is then run. This causes a speed benefit, and allows >for some flexibility. Is Ruby like that? or it is JIT-compiled? or is it >truly interpreted, like the shell? Ruby is interpreted - The parser creates an AST that is walked. There are projects in the works to create a RubyVM (Rite, or Ruby 2.0) as well as Cardinal (Ruby frontend for the ParrotVM). Being interpretted does effect the speed of execution to some extent, but Ruby actually does pretty well in the language shootout rankings. Generally not as fast as Perl, but not too much slower. >I noticed that Ruby doesn't let me use functions until after I define >them (unlike Perl). Why is that? I want to have the freedom to define >the functions anywhere. But even with Perl, don't you have to pre-declare the function prototype? Yes, in Ruby you do need to have the function predeclared prior to using it. That's because there's really no distinction between compile-time and runtime in Ruby. This actually is a very nice feature: you can do things like: if RUBY_PLATFORM =~ /win/ require "Win32Defs" elsif RUBY_PLATFORM =~ /nix/ require "UnixDefs" end OR, things like conditional inheritance or conditional mixins based on some environment setting, for example: #conditional mixin class Foo if ENV['FOO'] && ENV['FOO'] == "true" require 'foo' include FooMod elsif ENV['BAR'] && ENV['BAR'] == "true" require 'bar' include BarMod end #rest of class definition... end It's probably not as easy to do that sort of thing in Perl because there is a seperate compile phase. But, I have to admit, it's been a while so I wouldn't be surprised if there is a way of doing this in Perl. Phil