macro concat(*values) {% top = -1 %} {% for value, i in values %} {% if value.is_a? ProcLiteral %} {% new_top = top - value.args.size + 1 %} %var{new_top} = {{value}}.call({% for arg, j in value.args %} %var{top - (value.args.size - j - 1)}, {% end %}) {% top = new_top %} {% elsif value.is_a? Call %} {% new_top = top - value.args.size + 1 %} %var{new_top} = {{value}}({% for arg, j in value.args %} %var{top - (value.args.size - j - 1)}, {% end %}) {% top = new_top %} {% elsif value.is_a? SymbolLiteral && value == :put_stack %} {% for i in (0..top) %} puts(%var{i}) {% end %} puts("---------") {% elsif value.is_a? SymbolLiteral && value == :swap %} %var{top}, %var{top - 1} = %var{top - 1}, %var{top} {% elsif value.is_a? SymbolLiteral && value == :dup %} {% top += 1 %} %var{top} = %var{top - 1} {% elsif value.is_a? SymbolLiteral && value == :over %} {% top += 1 %} %var{top} = %var{top - 2} {% elsif value.is_a? SymbolLiteral && value == :drop %} {% top -= 1 %} {% else %} {% top += 1 %} %var{top} = {{value}} {% end %} {% end %} end three = concat( 1, 2, :over, :over, ->(x : Int32, y : Int32){ x - y }, :dup, ->(x : Int32, y : Int32){ x + y }, :drop, ->(x : Int32, y : Int32){ x / y } )