start on blocks

This commit is contained in:
Torsten Ruger 2018-06-26 20:28:27 +03:00
parent 4103da7490
commit c6a903073a
5 changed files with 76 additions and 1 deletions

View File

@ -37,6 +37,18 @@ module Vool
arg.first arg.first
end end
def on_block(block_node)
sendd = process(block_node.children[0])
args = process(block_node.children[1])
body = process(block_node.children[2])
sendd.block = BlockStatement.new(args , body)
sendd
end
def on_args(args)
args.children.collect{|a| process(a)}
end
#basic Values #basic Values
def on_self exp def on_self exp
SelfExpression.new SelfExpression.new

View File

@ -65,6 +65,7 @@ end
require_relative "statements/assign_statement" require_relative "statements/assign_statement"
require_relative "statements/array_statement" require_relative "statements/array_statement"
require_relative "statements/basic_values" require_relative "statements/basic_values"
require_relative "statements/block_statement"
require_relative "statements/class_statement" require_relative "statements/class_statement"
require_relative "statements/hash_statement" require_relative "statements/hash_statement"
require_relative "statements/if_statement" require_relative "statements/if_statement"

View File

@ -0,0 +1,29 @@
module Vool
class BlockStatement < Statement
attr_reader :args , :body , :clazz
def initialize( args , body , clazz = nil)
@args , @body = args , body
raise "no bod" unless @body
@clazz = clazz
end
def to_mom( _ )
raise "should not be called (call create_objects)"
end
def each(&block)
block.call(self)
@body.each(&block)
end
def normalize
BlockStatement.new( @args , @body.normalize)
end
def create_objects(clazz)
end
end
end

View File

@ -10,13 +10,17 @@ module Vool
# As cache key we must use the type of the object (which is the first word of _every_ object) # As cache key we must use the type of the object (which is the first word of _every_ object)
# as that is constant, and function implementations depend on the type (not class) # as that is constant, and function implementations depend on the type (not class)
class SendStatement < Statement class SendStatement < Statement
attr_reader :name , :receiver , :arguments attr_reader :name , :receiver , :arguments , :block
def initialize(name , receiver , arguments ) def initialize(name , receiver , arguments )
@name , @receiver , @arguments = name , receiver , arguments @name , @receiver , @arguments = name , receiver , arguments
@arguments ||= [] @arguments ||= []
end end
def block=( block )
@block = block
end
def normalize def normalize
statements = Statements.new([]) statements = Statements.new([])
arguments = [] arguments = []

View File

@ -0,0 +1,29 @@
require_relative "helper"
module Vool
class TestBlockStatement < MiniTest::Test
def setup()
input = "plus_one{|arg1| arg1 + 1 } "
@lst = RubyCompiler.compile( input )
end
def test_method
assert_equal SendStatement , @lst.class
end
def test_block
assert_equal BlockStatement , @lst.block.class
end
def test_method_name
assert_equal :plus_one , @lst.name
end
def test_block_args
assert_equal [:arg1] , @lst.block.args
end
def test_block_body
assert_equal SendStatement , @lst.block.body.class
assert_equal 1 , @lst.block.body.arguments.length
end
end
end