diff --git a/bin/lambra b/bin/lambra index a40a298..c401e5a 100755 --- a/bin/lambra +++ b/bin/lambra @@ -37,8 +37,13 @@ end display = proc do |file, code, ev=true, binding=nil| begin if settings[:ast] - ast = Lambra::Parser.parse_file(file) - info.call(:ast, 'AST') { Rubinius::AST::AsciiGrapher.new(ast).print } + ast = if file == '(eval)' + Lambra::Parser.parse_string(code) + else + Lambra::Parser.parse_file(file) + end + + info.call(:ast, 'AST') { RBX::AST::AsciiGrapher.new(ast).print } end info.call(:bc, "Bytecode") { puts Lambra::Compiler.compile_string(code, file).decode } diff --git a/lib/lambra/bytecode_compiler.rb b/lib/lambra/bytecode_compiler.rb index a23a376..605e513 100644 --- a/lib/lambra/bytecode_compiler.rb +++ b/lib/lambra/bytecode_compiler.rb @@ -43,6 +43,10 @@ def visit_EvalExpression(o) o.body.accept(self) end + def visit_Script(o) + o.body.accept(self) + end + def visit_List(o) set_line(o) return g.push_nil if o.elements.count.zero? diff --git a/spec/compiler_spec.rb b/spec/compiler_spec.rb index 711280e..6ff1a6a 100644 --- a/spec/compiler_spec.rb +++ b/spec/compiler_spec.rb @@ -31,4 +31,10 @@ '(let [x 2 y 3] (* x y))'.should eval_to 6 end end + + describe 'spawn' do + it 'spawns a new process' do + '(spawn (fn [] (sleep 10)))'.should eval_to_kind_of(Integer) + end + end end