<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>test/scheme_tests/protection.scm</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -5,7 +5,7 @@ module Heist
     
     def initialize(options = {})
       @runtime = Runtime.new(options)
-      @scope = Runtime::FileScope.new(@runtime.top_level, File.expand_path('.'))
+      @scope = Runtime::FileScope.new(@runtime.user_scope, File.expand_path('.'))
       @results = []
       
       @runtime.define('~') { |x| @results[-x] }
@@ -17,7 +17,7 @@ module Heist
       puts @runtime.info
       
       Readline.completion_append_character = nil
-      Readline.completion_proc = @runtime.top_level.method(:longest_prefix)
+      Readline.completion_proc = @runtime.user_scope.method(:longest_prefix)
       
       loop do
         begin</diff>
      <filename>lib/repl.rb</filename>
    </modified>
    <modified>
      <diff>@@ -22,9 +22,9 @@ module Heist
     end
     
     extend Forwardable
-    def_delegators(:@top_level, :[], :eval, :exec, :program, :define, :syntax, :run)
+    def_delegators(:@user_scope, :[], :eval, :exec, :program, :define, :syntax, :run)
     
-    attr_accessor :stack, :top_level
+    attr_accessor :stack, :user_scope
     
     # A +Runtime+ is initialized using a set of options. The available
     # options include the following, all of which are +false+ unless
@@ -42,9 +42,11 @@ module Heist
       @top_level = Scope.new(self)
       @stack = stackless? ? Stackless.new : Stack.new
       
-      run(&quot;#{ BUILTIN_PATH }primitives.rb&quot;)
-      run(&quot;#{ BUILTIN_PATH }syntax.scm&quot;)
-      run(&quot;#{ BUILTIN_PATH }library.rb&quot;)
+      %w[primitives.rb syntax.scm library.rb].each do |lib|
+        @top_level.run(&quot;#{ BUILTIN_PATH }#{ lib }&quot;)
+      end
+      
+      @user_scope = Scope.new(@top_level)
       
       @start_time = Time.now.to_f
     end</diff>
      <filename>lib/runtime/runtime.rb</filename>
    </modified>
    <modified>
      <diff>@@ -8,20 +8,22 @@ require $dir + &quot;/../lib/bin_spec&quot;
 require &quot;test/unit&quot;
 
 Class.new(Test::Unit::TestCase) do
-  @@env = nil
+  @env = nil
   
   def setup
-    return @@env if @@env
-    @@env = Heist::Runtime.new(Heist::BIN_SPEC.parse($args))
-    puts @@env.info
+    return @env if @env
+    @env = Heist::Runtime.new(Heist::BIN_SPEC.parse($args))
     
-    @@env.define('assert') do |value|
+    puts @env.info unless defined?(@@info_printed)
+    @@info_printed = true
+    
+    @env.define('assert') do |value|
       assert(value)
     end
-    @@env.define('assert-equal') do |expected, actual|
+    @env.define('assert-equal') do |expected, actual|
       assert_equal(expected, actual)
     end
-    @@env.syntax('assert-raise') do |scope, cells|
+    @env.syntax('assert-raise') do |scope, cells|
       exception = Heist.const_get(cells.car.to_s)
       assert_raise(exception) { scope.eval(cells.cdr.car) }
     end
@@ -43,10 +45,11 @@ Class.new(Test::Unit::TestCase) do
         file_loading
         macros
         delay
+        protection
         
   ].each do |test|
     define_method('test_' + test) do
-      @@env.run($dir + '/scheme_tests/' + test)
+      @env.run($dir + '/scheme_tests/' + test)
     end
   end
   
@@ -84,55 +87,55 @@ Class.new(Test::Unit::TestCase) do
   end
   
   def test_macro_hygiene
-    @@env.run($dir + '/scheme_tests/' + (@@env.hygienic? ? 'hygienic' : 'unhygienic'))
+    @env.run($dir + '/scheme_tests/' + (@env.hygienic? ? 'hygienic' : 'unhygienic'))
   end
   
   def test_continuations
-    return if @@env.stackless?
-    @@env.run($dir + '/scheme_tests/continuations')
+    return if @env.stackless?
+    @env.run($dir + '/scheme_tests/continuations')
   end
   
   def test_quotation
     cons = Heist::Runtime::Cons
     c = cons.method(:new)
     
-    assert_equal 7,                     @@env.eval(&quot;(+ 3 4)&quot;)
-    assert_equal [:+, 3, 4],            @@env.eval(&quot;'(+ 3 4)&quot;).to_ruby
-    assert cons === @@env.eval(&quot;'(+ 3 4)&quot;)
-    assert_equal 7,                     @@env.eval(&quot;(+ '3 4)&quot;)
-    assert_equal c[1,8],                @@env.eval(&quot;'(1 . 8)&quot;)
-    assert_equal c[1,8],                @@env.eval(&quot;`(1 . 8)&quot;)
-    assert_equal [:+, [:-, 7, 9], 4],   @@env.eval(&quot;'(+ (- 7 9) 4)&quot;).to_ruby
-    assert_equal [7, 9, 6],             @@env.eval(&quot;`(7 ,(+ 4 5) 6)&quot;).to_ruby
-    assert cons === @@env.eval(&quot;`(7 ,(+ 4 5) 6)&quot;)
-    assert_equal [3, 7, 6, 2, 6, 9],    @@env.eval(&quot;`(3 7 6 ,@((lambda () '(2 6))) 9)&quot;).to_ruby
-    assert_equal [1, 2, 10],            @@env.eval(&quot;`(1 2 ,(+ 4 6))&quot;).to_ruby
-    assert_equal [3, 2, 9, 8],          @@env.eval(&quot;`(,(/ 9 3) 2 ,@(list 9 8))&quot;).to_ruby
-    assert_equal [1, 2, 4, 9, 8, 5],    @@env.eval(&quot;`(,@(list 1 2) 4 ,@(list 9 8) 5)&quot;).to_ruby
-    assert_equal c[9,c[8,c[5,7]]],      @@env.eval(&quot;`(,@(list 9 8) 5 . 7)&quot;)
-    assert_equal c[9,c[8,24]],          @@env.eval(&quot;`(,@(list 9 8) . ,(* 4 6))&quot;)
-    assert_equal [:quote, []],          @@env.eval(&quot;''()&quot;).to_ruby
+    assert_equal 7,                     @env.eval(&quot;(+ 3 4)&quot;)
+    assert_equal [:+, 3, 4],            @env.eval(&quot;'(+ 3 4)&quot;).to_ruby
+    assert cons === @env.eval(&quot;'(+ 3 4)&quot;)
+    assert_equal 7,                     @env.eval(&quot;(+ '3 4)&quot;)
+    assert_equal c[1,8],                @env.eval(&quot;'(1 . 8)&quot;)
+    assert_equal c[1,8],                @env.eval(&quot;`(1 . 8)&quot;)
+    assert_equal [:+, [:-, 7, 9], 4],   @env.eval(&quot;'(+ (- 7 9) 4)&quot;).to_ruby
+    assert_equal [7, 9, 6],             @env.eval(&quot;`(7 ,(+ 4 5) 6)&quot;).to_ruby
+    assert cons === @env.eval(&quot;`(7 ,(+ 4 5) 6)&quot;)
+    assert_equal [3, 7, 6, 2, 6, 9],    @env.eval(&quot;`(3 7 6 ,@((lambda () '(2 6))) 9)&quot;).to_ruby
+    assert_equal [1, 2, 10],            @env.eval(&quot;`(1 2 ,(+ 4 6))&quot;).to_ruby
+    assert_equal [3, 2, 9, 8],          @env.eval(&quot;`(,(/ 9 3) 2 ,@(list 9 8))&quot;).to_ruby
+    assert_equal [1, 2, 4, 9, 8, 5],    @env.eval(&quot;`(,@(list 1 2) 4 ,@(list 9 8) 5)&quot;).to_ruby
+    assert_equal c[9,c[8,c[5,7]]],      @env.eval(&quot;`(,@(list 9 8) 5 . 7)&quot;)
+    assert_equal c[9,c[8,24]],          @env.eval(&quot;`(,@(list 9 8) . ,(* 4 6))&quot;)
+    assert_equal [:quote, []],          @env.eval(&quot;''()&quot;).to_ruby
   end
   
   def test_birdhouse
-    return unless @@env.lazy?
-    @@env.eval('(load &quot;birdhouse&quot;)')
+    return unless @env.lazy?
+    @env.eval('(load &quot;birdhouse&quot;)')
     
-    @@env.eval &lt;&lt;-CODE
+    @env.eval &lt;&lt;-CODE
       (define factorial (Y
         (lambda (rec)
           (lambda (x)
             (if (= x 0) 1 (* x (rec (- x 1))))))))
     CODE
     assert_equal (1..6).inject { |a,b| a*b },
-                 @@env.eval(&quot;(factorial 6)&quot;)
+                 @env.eval(&quot;(factorial 6)&quot;)
     
-    assert_equal 45, @@env.eval(&quot;((K 45) 6)&quot;)
+    assert_equal 45, @env.eval(&quot;((K 45) 6)&quot;)
   end
   
   def test_ruby_execution
     expr = [[:lambda, [:x], [:+, 1, :x]], 3]
-    assert_equal 4, @@env.exec(expr)
+    assert_equal 4, @env.exec(expr)
     list = Heist.parse(expr)
     assert Heist::Runtime::Cons === list
     assert_equal expr, list.to_ruby</diff>
      <filename>test/test_heist.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>7cf5e61a83727c512795d6281c7de1bf1385edfc</id>
    </parent>
  </parents>
  <author>
    <name>James Coglan</name>
    <email>jcoglan@googlemail.com</email>
  </author>
  <url>http://github.com/jcoglan/heist/commit/22aa76aa365ffe4df9e9fce4920f1b506124de6d</url>
  <id>22aa76aa365ffe4df9e9fce4920f1b506124de6d</id>
  <committed-date>2009-10-08T17:13:35-07:00</committed-date>
  <authored-date>2009-10-08T17:13:35-07:00</authored-date>
  <message>Load built-in library code in a privileged scope so that user-level code can redefine built-in functions without breaking other built-in functions that use the redefined name.</message>
  <tree>079a2e5d84fdb449b386ae130bf65f3e4df33171</tree>
  <committer>
    <name>James Coglan</name>
    <email>jcoglan@googlemail.com</email>
  </committer>
</commit>
