Trivial Example: Compose a meet & greet in Ruby
class Greeter
class << self
def meet(person, &block)
yield person
end
# Greet everyone except Johnny
def greet(person, &block)
if person == "Johnny"
yield "Can't talk right now, Johnny"
else
yield "Hello #{person}!"
end
end
end
end
Greeter.meet "Johnny" do |person|
Greeter.greet person do |message|
puts message
end
end
Greeter.meet "Brooke" do |person|
Greeter.greet person do |message|
puts message
end
end
The same functionality in Elixir:
defmodule Greeter do
def meet(person), do: person
def greet("Johnny"), do: "Can't talk right now, Johnny"
def greet(person), do: "Hello #{person}!"
end
"Johnny" |> Greeter.meet |> Greeter.greet |> IO.puts
"Brooke" |> Greeter.meet |> Greeter.greet |> IO.puts
I see both sides, but think both are idiomatic of their implementing language and is a fair comparison. Also to consider, less lines of code does not mean better. Though I do think the Elixir example is just as, if not more, readable as the Ruby so it "wins" on both fronts.