Skip to content

Instantly share code, notes, and snippets.

@dreamr
Last active August 29, 2015 14:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dreamr/11275773 to your computer and use it in GitHub Desktop.
Save dreamr/11275773 to your computer and use it in GitHub Desktop.
Laziness - or code as data!
shout =->(name) { "HELLO #{name.upcase}!" }
def greet(name, greeter)
greeter.call(name)
end
puts greet("Robert", shout) #=> HELLO ROBERT!
module BackwardsGreeter
extend self
def greet(name)
"Hello #{name.chars.reverse.join.capitalize}."
end
alias_method :call, :greet
end
def greet(name, greeter)
greeter.call(name)
end
puts greet("Robert", BackwardsGreeter) #=> Hello Trebob.
# This was test driven enough to get through basic examples, it would fall apart
# on something like 'olga' but I wasnt trying to show how to TDD pig latin
module PigLatinGreeter
extend self
def greet(name)
"Ellohay #{piggify(name)}."
end
alias_method :call, :greet
private
def piggify(word)
pigged = [first_half(word), second_half(word), "ay"].join
pigged.capitalize
end
def first_vowel_position(word)
word.gsub(/#{vowels}.*$/, '').size
end
def first_half(word)
word.chars.drop(
first_vowel_position(word))
end
def second_half(word)
word.chars - first_half(word)
end
def vowels
%w[a e i o u]
end
def consonants
letters - vowels
end
def letters
('a'..'z').to_a
end
end
def greet(name, greeter)
greeter.call(name)
end
puts greet("Robert", BackwardsGreeter) #=> Hello Trebor.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment