raganwald
Saturday, July 05, 2008
  Sneak Peek: Unhygienic Rewriting Ruby by Example

def test_unhygienic_andand
  andand = Unhygienic.from {
    __to_receiver.andand.__to_message(__splat_parameters)
  }.to {
    lambda { |andand_temp|
      andand_temp.__to_message(__splat_parameters) if andand_temp
    }.call(__to_receiver)
  }
  assert_equal(
    'Hello' + ' World', 
    with(andand) do
        'Hello'.andand + ' World'
    end
  )
  assert_nil(
    with(andand) do
        nil.andand + ' World'
    end
  )
end
Let’s take a closer look:

Rewrite::With.expand(andand) do
  class Funky
    def hello_world
      'Hello'.andand + ' World'
    end
  end
end
produces:

class Funky
  def hello_world
    lambda { |andand_temp| 
        (andand_temp + " World") if andand_temp 
    }.call("Hello")
  end
end
As you can probably deduce, it’s unhygienic: Variables like andand_temp shadow variables declared elsewhere. This is a problem if you fail to choose a sufficiently obfuscated name or—more likely—nest constructions like #andand.

Both the Classically Metaprogrammed and the Sexp-Rewriting versions of #andand avoid this problem.

Next step: Better hygiene.
 


Thank you for reading my work. Did you enjoy this post? You can find more like it in the sidebar. Please browse the archives, there are lots of hidden gems. A Brief History of Dangerous Ideas explains what I am up to at the moment.
Comments on “Sneak Peek: Unhygienic Rewriting Ruby by Example:
Post a Comment




<< Home
Reg Braithwaite


Recent Writing
Homoiconic

Share
rewrite_rails / andand / unfold.rb / string_to_proc.rb / dsl_and_let.rb / comprehension.rb / lazy_lists.rb

Beauty
IS-STRICTLY-EQUIVALENT-TO-A / Spaghetti-Western Coding / Golf is a good program spoiled / Programming conventions as signals / Not all functions should be object methods

The Not So Big Software Design / Writing programs for people to read / Why Why Functional Programming Matters Matters / But Y would I want to do a thing like this?

Work
The single most important thing you must do to improve your programming career / The Naïve Approach to Hiring People / No Disrespect / Take control of your interview / Three tips for getting a job through a recruiter / My favourite interview question

Management
Exception Handling in Software Development / What if powerful languages and idioms only work for small teams? / Bricks / Which theory fits the evidence? / Still failing, still learning / What I’ve learned from failure

Notation
The unary ampersand in Ruby / (1..100).inject(&:+) / The challenge of teaching yourself a programming language / The significance of the meta-circular interpreter / Block-Structured Javascript / Haskell, Ruby and Infinity / Closures and Higher-Order Functions

Opinion
Why Apple is more expensive than Amazon / Why we are the biggest obstacles to our own growth / Is software the documentation of business process mistakes? / We have lost control of the apparatus / What I’ve Learned From Sales I, II, III

Whimsey
The Narcissism of Small Code Differences / Billy Martin’s Technique for Managing his Manager / Three stories about The Tao / Programming Language Stories / Why You Need a Degree to Work For BigCo

History
06/04 / 07/04 / 08/04 / 09/04 / 10/04 / 11/04 / 12/04 / 01/05 / 02/05 / 03/05 / 04/05 / 06/05 / 07/05 / 08/05 / 09/05 / 10/05 / 11/05 / 01/06 / 02/06 / 03/06 / 04/06 / 05/06 / 06/06 / 07/06 / 08/06 / 09/06 / 10/06 / 11/06 / 12/06 / 01/07 / 02/07 / 03/07 / 04/07 / 05/07 / 06/07 / 07/07 / 08/07 / 09/07 / 10/07 / 11/07 / 12/07 / 01/08 / 02/08 / 03/08 / 04/08 / 05/08 / 06/08 / 07/08 /