Skip to content

Instantly share code, notes, and snippets.

@judofyr
Created July 22, 2010 10:22
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save judofyr/485811 to your computer and use it in GitHub Desktop.
Save judofyr/485811 to your computer and use it in GitHub Desktop.
## Ruby Quiz #666
module CompileSite; end
def compile(name, source)
CompileSite.class_eval <<-RUBY
def #{name}(locals)
Thread.current[:tilt_vars] = [self, locals]
class << self
this, locals = Thread.current[:tilt_vars]
this.instance_eval do
#{source}
end
end
end
RUBY
end
def render(name, scope, locals, &blk)
scope.__send__(name, locals, &blk)
end
module Helper
A = "A"
end
class Scope
include CompileSite
include Helper
B = "B"
end
class ScopeB < Scope
B = 'C'
end
compile('hello', <<-RUBY)
if locals.nil?
yield
else
[locals, A, B, yield, render(:hello, self, nil) { 'Y2' }, yield, locals].join(" ")
end
RUBY
CompileSite.instance_method(:hello)
res = render(:hello, Scope.new, "L") { "Y1" }
res2 = render(:hello, ScopeB.new, "L") { "Y1" }
if res == "L A B Y1 Y2 Y1 L" and res2 == "L A C Y1 Y2 Y1 L"
puts "YOU DID IT!"
else
puts "Failed:", res, res2
end
@rtomayko
Copy link

rtomayko commented Aug 1, 2010

Merged. Passes all tests on 1.8.7. I'm pulling down the latest 1.9.1 now. Review appreciated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment