Module: Akaza::Ruby2ws

Defined in:
lib/akaza/ruby2ws.rb

Overview

Convert Ruby like script to Whitespace. The syntax is a subset of Ruby, but it has different semantics with Ruby.

# sample code

# output
put_as_number n
put_as_char ch
put_as_number 42
put_as_char 'a'

# input
num = get_as_number
char = get_as_char

# flow
def foo
end

exit

if x == 0
end

if x < 0
end

# heap
x = 10
push x

Defined Under Namespace

Classes: MethodDefinition, ParseError, Transpiler

Constant Summary collapse

SPACE =
' '
TAB =
"\t"
NL =
"\n"
NONE_ADDR =
0
TMP_ADDR =
1
HEAP_COUNT_ADDR =
2
TYPES =
%w[Integer Hash Array]
TYPE_BITS =
2
TYPE_SPECIAL =
0b00
TYPE_INT =
0b01
TYPE_ARRAY =
0b10
TYPE_HASH =
0b11
HASH_SIZE =
11
ARRAY_FIRST_CAPACITY =
10
FALSE =
0 << TYPE_BITS + TYPE_SPECIAL
NONE =

NONE is for internal. It does not available for user.

1 << TYPE_BITS + TYPE_SPECIAL
TRUE =
2 << TYPE_BITS + TYPE_SPECIAL
NIL =

NIL is nil

4 << TYPE_BITS + TYPE_SPECIAL
CLASS_SPECIAL =

Classes

(8 + TYPE_SPECIAL) << TYPE_BITS + TYPE_SPECIAL
CLASS_INT =
(8 + TYPE_INT) << TYPE_BITS + TYPE_SPECIAL
CLASS_ARRAY =
(8 + TYPE_ARRAY) << TYPE_BITS + TYPE_SPECIAL
CLASS_HASH =
(8 + TYPE_HASH) << TYPE_BITS + TYPE_SPECIAL
UNWRAP_COMMANDS =

Call when stack top is the target number.

[
  [:stack_push, 2 ** TYPE_BITS],
  [:calc_div],
].freeze
WRAP_NUMBER_COMMANDS =
[
  [:stack_push, 2 ** TYPE_BITS],
  [:calc_multi],
  [:stack_push, TYPE_INT],
  [:calc_add],
].freeze
WRAP_ARRAY_COMMANDS =
[
  [:stack_push, 2 ** TYPE_BITS],
  [:calc_multi],
  [:stack_push, TYPE_ARRAY],
  [:calc_add],
].freeze
WRAP_HASH_COMMANDS =
[
  [:stack_push, 2 ** TYPE_BITS],
  [:calc_multi],
  [:stack_push, TYPE_HASH],
  [:calc_add],
].freeze
SAVE_TMP_COMMANDS =
[
  [:stack_push, TMP_ADDR],
  [:stack_swap],
  [:heap_save],
].freeze
LOAD_TMP_COMMANDS =
[
  [:stack_push, TMP_ADDR],
  [:heap_load],
].freeze
ALLOCATE_HEAP_COMMANDS =

Allocate heap and push allocated address to the stack

[
  [:stack_push, HEAP_COUNT_ADDR],
  [:heap_load],
  [:stack_push, 1],
  [:calc_add],
  [:stack_dup],
  [:stack_push, HEAP_COUNT_ADDR],
  [:stack_swap],
  [:heap_save],
].freeze
ALLOCATE_N_HEAP_COMMANDS =

Allocate N size heap and push nothing stack: [N] return stack: []

[
  [:stack_push, HEAP_COUNT_ADDR],
  [:heap_load],
  [:calc_add],
  [:stack_push, HEAP_COUNT_ADDR],
  [:stack_swap],
  [:heap_save],
].freeze
NEXT_HEAP_ADDRESS =

Return an address that will be allocated by ALLOCATE_HEAP_COMMANDS

[
  [:stack_push, HEAP_COUNT_ADDR],
  [:heap_load],
  [:stack_push, 1],
  [:calc_add],
].freeze
ALLOCATE_NEW_HASH_ITEM_COMMANDS =
[
  *ALLOCATE_HEAP_COMMANDS,
  [:stack_dup],
  [:stack_push, NONE],
  [:heap_save],
  *ALLOCATE_HEAP_COMMANDS,
  [:stack_pop],
  *ALLOCATE_HEAP_COMMANDS,
  [:stack_pop],
].freeze
PRELUDE_AST =
RubyVM::AbstractSyntaxTree.parse(File.read(prelude_path))

Class Method Summary collapse

Class Method Details

.ruby_to_ws(ruby_code, path: '(eval)') ⇒ Object



147
148
149
# File 'lib/akaza/ruby2ws.rb', line 147

def self.ruby_to_ws(ruby_code, path: '(eval)')
  Transpiler.new(ruby_code, path: path).transpile
end