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 |