Skip to content

Commit

Permalink
Implement builtin procedures #car and #cdr
Browse files Browse the repository at this point in the history
  • Loading branch information
Josep M. Bach committed Mar 8, 2011
1 parent 355913a commit e78daa5
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 0 deletions.
4 changes: 4 additions & 0 deletions lib/schemer/ast.rb
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ def to_a
@elements.to_a
end

def to_list
self
end

def empty?
@elements.empty?
end
Expand Down
8 changes: 8 additions & 0 deletions lib/schemer/interpreter.rb
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,14 @@ def initialize(ast = nil)
end
end)

env.add_binding(:car, lambda do |list|
list.to_list.elements.first
end)

env.add_binding(:cdr, lambda do |list|
list.to_list.elements.last
end)

end
end

Expand Down
24 changes: 24 additions & 0 deletions spec/schemer/interpreter_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,30 @@ module Schemer
end
end

describe "#car" do
it 'returns the first element from a list' do
expression = "(car (x 3))"
lexer = Schemer::Lexer.new
parser = Schemer::Parser.new
ast = parser.apply(lexer.parse expression)

interpreter = Schemer::Interpreter.new(ast)
interpreter.walk.should be_a(AST::Identifier)
end
end

describe "#cdr" do
it 'returns the last element from a list' do
expression = "(cdr (x 3))"
lexer = Schemer::Lexer.new
parser = Schemer::Parser.new
ast = parser.apply(lexer.parse expression)

interpreter = Schemer::Interpreter.new(ast)
interpreter.walk.should == 3
end
end

end

end
Expand Down

0 comments on commit e78daa5

Please sign in to comment.