Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

I can only explain in terms of an experiment:

Write an algorithm (or app) in your favorite language of the three. Then port it to a different one of those three.

Now port to Common Lisp or Haskell, and see how your code feels different.

I find that Ruby/Python/Perl basically let you write the same program with different syntax. "$self->foo" instead of "@foo". I find that Haskell changes the way you actually program. Example: Nobody (except me) uses a type like Haskell's Error monad in Perl; they use exceptions.

(Similarly, look for a "web framework" in Perl/Python/Ruby. Perl has Catalyst. Python has Django. Ruby has Rails. They are all different, true, but the idea is the same. If three people each started the same project on those various frameworks, the end result, code-wise, would be very similar.)



While you will have that experience with a lot of code, there are some concepts that don't translate so easily.

As an experiment port this Ruby to Perl:

  def  each (arg,*more_args)
      ( [] != more_args ) ?
          arg.each {|l| each(*more_args) {|r| yield [l]+ r }} :
          arg.each { |r| yield [r] }
  end

  each( 1..2, 'a'..'c', 'A'..'D') { |args|   puts args.join " " }
Then port this Python to Perl:

  def fib():
      fn2 = 1
      fn1 = 1
      while True:
          (fn1, fn2, oldfn2) = (fn1+fn2, fn1, fn2)
          yield oldfn2

  g = fib()
  for i in range(20):
      print i, g.next()
See what I mean?


The second one is easily translated into Perl 6:

    sub fib() {
        my $fn2 = 1;
        my $fn1 = 1;
        gather loop {
            my $oldfn2;
            ($fn1, $fn2, $oldfn2) = ($fn1 + $fn2, $fn1, $fn2);
            take $oldfn2;
        }
    }

    my @g = fib;
    for ^20 -> $i {
        say $i, @g.shift;
    }
That's untested because lazy evaluation isn't yet supported in Rakudo Perl 6, but my understanding is that feature should be up and running in the next few weeks.

I don't know enough Ruby to make heads or tails of the first example, though...


Some people refer to carbonated sugary beverages as "soda" and others say "pop", but both are still speaking the same language.


  $point->missed
I know Perl far, far better than I know Ruby or Python. But I can't easily reach for the abstractions in those examples within Perl.

That said, I'm in agreement with your basic point. On the whole the scripting languages (including JavaScript) are much more similar than different.


I don't consider these as being particularly interesting differences. With the right modules, I can write code that looks like that in Perl. (It's not idiomatic, though, so it is worth exploring other languages to see which idioms you'd like to steal. I stole monads and applicative functors from Haskell for Perl in MooseX::Data, for example. Monadic control flow is not a common Perl idiom, but it is perfect for my asynchronous CPAN client.)

I am talking major differences, things that are so fundamental that you can't really steal. Looking at Haskell, I see things like lazy evaluation, purity, static typing and type inference, etc. Very, very different from Perl.

In Scheme, I see the "call stack" as a graph of frames, not as a linked-list as in C. This is quite radical.

But in Ruby and Python all I see are different built-in functions, some with special syntax. (Generators, list comprehensions, etc., etc.)

I know Perl far, far better than I know Ruby or Python. But I can't easily reach for the abstractions in those examples within Perl.

I can. I hope you are considering CPAN as part of Perl, because "core perl" is a very, very outdated and broken programming language. I think I would even prefer Java!




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: