forthic 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.standard.yml +3 -0
- data/CHANGELOG.md +5 -0
- data/Guardfile +42 -0
- data/README.md +37 -0
- data/Rakefile +14 -0
- data/lib/forthic/code_location.rb +20 -0
- data/lib/forthic/forthic_error.rb +51 -0
- data/lib/forthic/forthic_module.rb +145 -0
- data/lib/forthic/global_module.rb +2341 -0
- data/lib/forthic/interpreter.rb +328 -0
- data/lib/forthic/positioned_string.rb +19 -0
- data/lib/forthic/token.rb +38 -0
- data/lib/forthic/tokenizer.rb +305 -0
- data/lib/forthic/variable.rb +34 -0
- data/lib/forthic/version.rb +5 -0
- data/lib/forthic/words/definition_word.rb +40 -0
- data/lib/forthic/words/end_array_word.rb +28 -0
- data/lib/forthic/words/end_module_word.rb +16 -0
- data/lib/forthic/words/imported_word.rb +27 -0
- data/lib/forthic/words/map_word.rb +169 -0
- data/lib/forthic/words/module_memo_bang_at_word.rb +22 -0
- data/lib/forthic/words/module_memo_bang_word.rb +21 -0
- data/lib/forthic/words/module_memo_word.rb +35 -0
- data/lib/forthic/words/module_word.rb +21 -0
- data/lib/forthic/words/push_value_word.rb +21 -0
- data/lib/forthic/words/start_module_word.rb +31 -0
- data/lib/forthic/words/word.rb +30 -0
- data/lib/forthic.rb +25 -0
- data/sig/forthic.rbs +4 -0
- metadata +72 -0
@@ -0,0 +1,34 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
module Forthic
|
4
|
+
class Variable
|
5
|
+
attr_accessor :name, :value
|
6
|
+
|
7
|
+
# @param [String] name
|
8
|
+
# @param [Object] value
|
9
|
+
def initialize(name, value = nil)
|
10
|
+
@name = name
|
11
|
+
@value = value
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [String]
|
15
|
+
def get_name
|
16
|
+
@name
|
17
|
+
end
|
18
|
+
|
19
|
+
# @param [Object] val
|
20
|
+
def set_value(val)
|
21
|
+
@value = val
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [Object]
|
25
|
+
def get_value
|
26
|
+
@value
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Variable]
|
30
|
+
def dup
|
31
|
+
Variable.new(@name, @value)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'word'
|
4
|
+
require_relative '../forthic_error'
|
5
|
+
|
6
|
+
module Forthic
|
7
|
+
class DefinitionWord < Word
|
8
|
+
attr_accessor :words, :cur_index
|
9
|
+
|
10
|
+
# @param [String] name
|
11
|
+
def initialize(name)
|
12
|
+
super(name)
|
13
|
+
@words = []
|
14
|
+
@cur_index = 0
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param [Word] word
|
18
|
+
def add_word(word)
|
19
|
+
@words.push(word)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @param [Interpreter] interp
|
23
|
+
def execute(interp)
|
24
|
+
@words.each do |word|
|
25
|
+
begin
|
26
|
+
word.execute(interp)
|
27
|
+
rescue => e
|
28
|
+
error = ForthicError.new(
|
29
|
+
"definition_word-29",
|
30
|
+
"Error executing word #{word.name}",
|
31
|
+
"Error in #{self.name} definition",
|
32
|
+
interp.get_string_location
|
33
|
+
)
|
34
|
+
error.set_caught_error(e)
|
35
|
+
raise error
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'word'
|
4
|
+
require_relative '../token'
|
5
|
+
|
6
|
+
module Forthic
|
7
|
+
class EndArrayWord < Word
|
8
|
+
def initialize
|
9
|
+
super("]")
|
10
|
+
end
|
11
|
+
|
12
|
+
# @param [Interpreter] interp
|
13
|
+
def execute(interp)
|
14
|
+
items = []
|
15
|
+
item = interp.stack_pop
|
16
|
+
|
17
|
+
# NOTE: This won't infinite loop because interp.stack_pop() will eventually fail
|
18
|
+
loop do
|
19
|
+
break if item.is_a?(Token) && item.type == TokenType::START_ARRAY
|
20
|
+
items.push(item)
|
21
|
+
item = interp.stack_pop
|
22
|
+
end
|
23
|
+
|
24
|
+
items.reverse!
|
25
|
+
interp.stack_push(items)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'word'
|
4
|
+
|
5
|
+
module Forthic
|
6
|
+
class EndModuleWord < Word
|
7
|
+
def initialize
|
8
|
+
super("}")
|
9
|
+
end
|
10
|
+
|
11
|
+
# @param [Interpreter] interp
|
12
|
+
def execute(interp)
|
13
|
+
interp.module_stack_pop
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'word'
|
4
|
+
require_relative 'module_word'
|
5
|
+
|
6
|
+
module Forthic
|
7
|
+
class ImportedWord < Word
|
8
|
+
attr_accessor :module_word, :imported_module
|
9
|
+
|
10
|
+
# @param [Word] module_word
|
11
|
+
# @param [String] prefix
|
12
|
+
# @param [ModuleWord] imported_module
|
13
|
+
def initialize(module_word, prefix, imported_module)
|
14
|
+
prefix = prefix.empty? ? "" : "#{prefix}."
|
15
|
+
super("#{prefix}#{module_word.name}")
|
16
|
+
@module_word = module_word
|
17
|
+
@imported_module = imported_module
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param [Interpreter] interp
|
21
|
+
def execute(interp)
|
22
|
+
interp.module_stack_push(@imported_module)
|
23
|
+
@module_word.execute(interp)
|
24
|
+
interp.module_stack_pop
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,169 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Forthic
|
4
|
+
class MapWord
|
5
|
+
attr_accessor :forthic, :forthic_location, :items, :flags, :depth, :num_interps, :push_error, :with_key, :cur_index, :result, :errors, :is_debugging, :processing_item, :is_done
|
6
|
+
|
7
|
+
def initialize(items, forthic, forthic_location, flags)
|
8
|
+
@forthic = forthic
|
9
|
+
@forthic_location = forthic_location
|
10
|
+
@items = items
|
11
|
+
@flags = flags
|
12
|
+
|
13
|
+
# MAP flags
|
14
|
+
@depth = flags[:depth] || 0
|
15
|
+
@num_interps = flags[:interps] || 1
|
16
|
+
@push_error = flags[:push_error]
|
17
|
+
@with_key = flags[:with_key]
|
18
|
+
|
19
|
+
@cur_index = 0
|
20
|
+
@result = []
|
21
|
+
@errors = []
|
22
|
+
@is_debugging = false
|
23
|
+
@processing_item = false
|
24
|
+
@is_done = false
|
25
|
+
end
|
26
|
+
|
27
|
+
def execute(interp)
|
28
|
+
normal_execute(interp)
|
29
|
+
end
|
30
|
+
|
31
|
+
def normal_execute(interp)
|
32
|
+
@is_debugging = false
|
33
|
+
items = @items
|
34
|
+
if !items || items.empty?
|
35
|
+
interp.stack_push(items)
|
36
|
+
return
|
37
|
+
end
|
38
|
+
|
39
|
+
@result = []
|
40
|
+
@errors = []
|
41
|
+
if @num_interps > 1
|
42
|
+
interp.stack_push(items)
|
43
|
+
interp.run("LENGTH")
|
44
|
+
num_items = interp.stack_pop
|
45
|
+
group_size = (num_items.to_f / @num_interps).ceil
|
46
|
+
interp.stack_push(items)
|
47
|
+
interp.stack_push(group_size)
|
48
|
+
interp.run("GROUPS-OF")
|
49
|
+
groups = interp.stack_pop
|
50
|
+
|
51
|
+
# Clone and load up interpreters
|
52
|
+
interp_runs = []
|
53
|
+
|
54
|
+
groups.each do |group|
|
55
|
+
new_interp = interp.dup
|
56
|
+
interp_run = -> { map(new_interp, group) }
|
57
|
+
interp_runs.push(interp_run)
|
58
|
+
end
|
59
|
+
|
60
|
+
# Run in parallel using threads
|
61
|
+
threads = interp_runs.map do |interp_run|
|
62
|
+
Thread.new { interp_run.call }
|
63
|
+
end
|
64
|
+
run_results = threads.map(&:value)
|
65
|
+
|
66
|
+
# Gather results
|
67
|
+
is_array = items.is_a?(Array)
|
68
|
+
array_result = []
|
69
|
+
object_result = {}
|
70
|
+
errors = []
|
71
|
+
run_results.each do |res|
|
72
|
+
if is_array
|
73
|
+
array_result.concat(res[0])
|
74
|
+
else
|
75
|
+
object_result.merge!(res[0])
|
76
|
+
end
|
77
|
+
errors.concat(res[1])
|
78
|
+
end
|
79
|
+
@result = is_array ? array_result : object_result
|
80
|
+
@errors = errors
|
81
|
+
else
|
82
|
+
map(interp, items)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Return results
|
86
|
+
interp.stack_push(@result)
|
87
|
+
interp.stack_push(@errors) if @push_error
|
88
|
+
end
|
89
|
+
|
90
|
+
def map(interp, items)
|
91
|
+
forthic = @forthic
|
92
|
+
forthic_location = @forthic_location
|
93
|
+
self_ref = self
|
94
|
+
|
95
|
+
if !items
|
96
|
+
interp.stack_push(items)
|
97
|
+
return
|
98
|
+
end
|
99
|
+
|
100
|
+
# This maps the forthic over an item, storing errors if needed
|
101
|
+
map_value = lambda do |key, value, errors|
|
102
|
+
interp.stack_push(key) if self_ref.with_key
|
103
|
+
interp.stack_push(value)
|
104
|
+
|
105
|
+
if self_ref.push_error
|
106
|
+
error = nil
|
107
|
+
begin
|
108
|
+
# If this runs successfully, it would have pushed the result onto the stack
|
109
|
+
interp.run(forthic, forthic_location)
|
110
|
+
rescue => e
|
111
|
+
# Since this didn't run successfully, push nil onto the stack
|
112
|
+
interp.stack_push(nil)
|
113
|
+
error = e
|
114
|
+
end
|
115
|
+
errors.push(error)
|
116
|
+
else
|
117
|
+
interp.run(forthic, forthic_location)
|
118
|
+
end
|
119
|
+
interp.stack_pop
|
120
|
+
end
|
121
|
+
|
122
|
+
# This recursively descends a record structure
|
123
|
+
descend_record = lambda do |record, depth, accum, errors|
|
124
|
+
record.each do |k, item|
|
125
|
+
if depth > 0
|
126
|
+
if item.is_a?(Array)
|
127
|
+
accum[k] = []
|
128
|
+
descend_list.call(item, depth - 1, accum[k], errors)
|
129
|
+
else
|
130
|
+
accum[k] = {}
|
131
|
+
descend_record.call(item, depth - 1, accum[k], errors)
|
132
|
+
end
|
133
|
+
else
|
134
|
+
accum[k] = map_value.call(k, item, errors)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
accum
|
138
|
+
end
|
139
|
+
|
140
|
+
# This recursively descends a list
|
141
|
+
descend_list = lambda do |items, depth, accum, errors|
|
142
|
+
items.each_with_index do |item, i|
|
143
|
+
if depth > 0
|
144
|
+
if item.is_a?(Array)
|
145
|
+
accum.push([])
|
146
|
+
descend_list.call(item, depth - 1, accum.last, errors)
|
147
|
+
else
|
148
|
+
accum.push({})
|
149
|
+
descend_record.call(item, depth - 1, accum.last, errors)
|
150
|
+
end
|
151
|
+
else
|
152
|
+
accum.push(map_value.call(i, item, errors))
|
153
|
+
end
|
154
|
+
end
|
155
|
+
accum
|
156
|
+
end
|
157
|
+
|
158
|
+
errors = []
|
159
|
+
result = if items.is_a?(Array)
|
160
|
+
descend_list.call(items, @depth, [], errors)
|
161
|
+
else
|
162
|
+
descend_record.call(items, @depth, {}, errors)
|
163
|
+
end
|
164
|
+
@result = result
|
165
|
+
@errors = errors
|
166
|
+
[result, errors]
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'word'
|
4
|
+
require_relative 'module_memo_word'
|
5
|
+
|
6
|
+
module Forthic
|
7
|
+
class ModuleMemoBangAtWord < Word
|
8
|
+
attr_accessor :memo_word
|
9
|
+
|
10
|
+
# @param [ModuleMemoWord] memo_word
|
11
|
+
def initialize(memo_word)
|
12
|
+
super("#{memo_word.name}!@")
|
13
|
+
@memo_word = memo_word
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param [Interpreter] interp
|
17
|
+
def execute(interp)
|
18
|
+
@memo_word.refresh(interp)
|
19
|
+
interp.stack_push(@memo_word.value)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'word'
|
4
|
+
require_relative 'module_memo_word'
|
5
|
+
|
6
|
+
module Forthic
|
7
|
+
class ModuleMemoBangWord < Word
|
8
|
+
attr_accessor :memo_word
|
9
|
+
|
10
|
+
# @param [ModuleMemoWord] memo_word
|
11
|
+
def initialize(memo_word)
|
12
|
+
super("#{memo_word.name}!")
|
13
|
+
@memo_word = memo_word
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param [Interpreter] interp
|
17
|
+
def execute(interp)
|
18
|
+
@memo_word.refresh(interp)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'word'
|
4
|
+
|
5
|
+
module Forthic
|
6
|
+
class ModuleMemoWord < Word
|
7
|
+
attr_accessor :word, :has_value, :value
|
8
|
+
|
9
|
+
# @param [Word] word
|
10
|
+
def initialize(word)
|
11
|
+
super(word.name)
|
12
|
+
@word = word
|
13
|
+
@has_value = false
|
14
|
+
@value = nil
|
15
|
+
end
|
16
|
+
|
17
|
+
# @param [Interpreter] interp
|
18
|
+
def refresh(interp)
|
19
|
+
@word.execute(interp)
|
20
|
+
@value = interp.stack_pop
|
21
|
+
@has_value = true
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param [Interpreter] interp
|
25
|
+
def execute(interp)
|
26
|
+
refresh(interp) unless @has_value
|
27
|
+
interp.stack_push(@value)
|
28
|
+
end
|
29
|
+
|
30
|
+
def reset
|
31
|
+
@has_value = false
|
32
|
+
@value = nil
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'word'
|
4
|
+
|
5
|
+
module Forthic
|
6
|
+
class ModuleWord < Word
|
7
|
+
attr_accessor :handler
|
8
|
+
|
9
|
+
# @param [String] name
|
10
|
+
# @param [Proc] handler
|
11
|
+
def initialize(name, handler)
|
12
|
+
super(name)
|
13
|
+
@handler = handler
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param [Interpreter] interp
|
17
|
+
def execute(interp)
|
18
|
+
@handler.call(interp)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'word'
|
4
|
+
|
5
|
+
module Forthic
|
6
|
+
class PushValueWord < Word
|
7
|
+
attr_accessor :value
|
8
|
+
|
9
|
+
# @param [String] name
|
10
|
+
# @param [Object] value
|
11
|
+
def initialize(name, value)
|
12
|
+
super(name)
|
13
|
+
@value = value
|
14
|
+
end
|
15
|
+
|
16
|
+
# @param [Interpreter] interp
|
17
|
+
def execute(interp, _options = {})
|
18
|
+
interp.stack_push(@value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# # frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'word'
|
4
|
+
require_relative '../forthic_module'
|
5
|
+
|
6
|
+
module Forthic
|
7
|
+
class StartModuleWord < Word
|
8
|
+
# @param [Interpreter] interp
|
9
|
+
def execute(interp)
|
10
|
+
# The app module is the only module with a blank name
|
11
|
+
if self.name == ""
|
12
|
+
interp.module_stack_push(interp.get_app_module)
|
13
|
+
return
|
14
|
+
end
|
15
|
+
|
16
|
+
# If the module is used by the current module, push it onto the stack, otherwise
|
17
|
+
# create a new module.
|
18
|
+
mod = interp.cur_module.find_module(self.name)
|
19
|
+
unless mod
|
20
|
+
mod = ForthicModule.new(self.name)
|
21
|
+
interp.cur_module.register_module(mod.name, mod.name, mod)
|
22
|
+
|
23
|
+
# If we're at the app module, also register with interpreter
|
24
|
+
if interp.cur_module.name == ""
|
25
|
+
interp.register_module(mod)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
interp.module_stack_push(mod)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Forthic
|
4
|
+
class Word
|
5
|
+
attr_accessor :name, :string, :location
|
6
|
+
|
7
|
+
# @param [String] name
|
8
|
+
def initialize(name)
|
9
|
+
@name = name
|
10
|
+
@string = name
|
11
|
+
@location = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
# @param [CodeLocation] location
|
15
|
+
def set_location(location)
|
16
|
+
@location = location
|
17
|
+
end
|
18
|
+
|
19
|
+
# @return [CodeLocation, nil]
|
20
|
+
def get_location
|
21
|
+
@location
|
22
|
+
end
|
23
|
+
|
24
|
+
# @param [Interpreter] _interp
|
25
|
+
# @param [Hash] _options
|
26
|
+
def execute(_interp, _options = {})
|
27
|
+
raise "Must override Word.execute"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/forthic.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "forthic/version"
|
4
|
+
|
5
|
+
module Forthic
|
6
|
+
autoload :Tokenizer, 'forthic/tokenizer'
|
7
|
+
autoload :CodeLocation, 'forthic/code_location'
|
8
|
+
autoload :Token, 'forthic/token'
|
9
|
+
autoload :PositionedString, 'forthic/positioned_string'
|
10
|
+
autoload :ForthicError, 'forthic/forthic_error'
|
11
|
+
autoload :Word, 'forthic/words/word'
|
12
|
+
autoload :PushValueWord, 'forthic/words/push_value_word'
|
13
|
+
autoload :DefinitionWord, 'forthic/words/definition_word'
|
14
|
+
autoload :ModuleMemoWord, 'forthic/words/module_memo_word'
|
15
|
+
autoload :ModuleMemoBangAtWord, 'forthic/words/module_memo_bang_at_word'
|
16
|
+
autoload :ModuleMemoBangWord, 'forthic/words/module_memo_bang_word'
|
17
|
+
autoload :ModuleMemoBangAtWord, 'forthic/words/module_memo_bang_at_word'
|
18
|
+
autoload :EndArrayWord, 'forthic/words/end_array_word'
|
19
|
+
autoload :StartModuleWord, 'forthic/words/start_module_word'
|
20
|
+
autoload :EndModuleWord, 'forthic/words/end_module_word'
|
21
|
+
autoload :MapWord, 'forthic/words/map_word'
|
22
|
+
autoload :ForthicModule, 'forthic/forthic_module'
|
23
|
+
autoload :GlobalModule, 'forthic/global_module'
|
24
|
+
autoload :Interpreter, 'forthic/interpreter'
|
25
|
+
end
|
data/sig/forthic.rbs
ADDED
metadata
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: forthic
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Rino Jose
|
8
|
+
bindir: exe
|
9
|
+
cert_chain: []
|
10
|
+
date: 2025-01-02 00:00:00.000000000 Z
|
11
|
+
dependencies: []
|
12
|
+
description: This package provides a Forthic interpreter that allows you to execute
|
13
|
+
Forthic code within your Ruby projects. Forthic is a stack-based programming language
|
14
|
+
inspired by Forth.
|
15
|
+
email:
|
16
|
+
- rjose@forthix.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- ".standard.yml"
|
22
|
+
- CHANGELOG.md
|
23
|
+
- Guardfile
|
24
|
+
- README.md
|
25
|
+
- Rakefile
|
26
|
+
- lib/forthic.rb
|
27
|
+
- lib/forthic/code_location.rb
|
28
|
+
- lib/forthic/forthic_error.rb
|
29
|
+
- lib/forthic/forthic_module.rb
|
30
|
+
- lib/forthic/global_module.rb
|
31
|
+
- lib/forthic/interpreter.rb
|
32
|
+
- lib/forthic/positioned_string.rb
|
33
|
+
- lib/forthic/token.rb
|
34
|
+
- lib/forthic/tokenizer.rb
|
35
|
+
- lib/forthic/variable.rb
|
36
|
+
- lib/forthic/version.rb
|
37
|
+
- lib/forthic/words/definition_word.rb
|
38
|
+
- lib/forthic/words/end_array_word.rb
|
39
|
+
- lib/forthic/words/end_module_word.rb
|
40
|
+
- lib/forthic/words/imported_word.rb
|
41
|
+
- lib/forthic/words/map_word.rb
|
42
|
+
- lib/forthic/words/module_memo_bang_at_word.rb
|
43
|
+
- lib/forthic/words/module_memo_bang_word.rb
|
44
|
+
- lib/forthic/words/module_memo_word.rb
|
45
|
+
- lib/forthic/words/module_word.rb
|
46
|
+
- lib/forthic/words/push_value_word.rb
|
47
|
+
- lib/forthic/words/start_module_word.rb
|
48
|
+
- lib/forthic/words/word.rb
|
49
|
+
- sig/forthic.rbs
|
50
|
+
homepage: https://github.com/linkedin/forthic
|
51
|
+
licenses: []
|
52
|
+
metadata:
|
53
|
+
homepage_uri: https://github.com/linkedin/forthic
|
54
|
+
source_code_uri: https://github.com/linkedin/forthic
|
55
|
+
rdoc_options: []
|
56
|
+
require_paths:
|
57
|
+
- lib
|
58
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - ">="
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 3.1.0
|
63
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirements: []
|
69
|
+
rubygems_version: 3.6.2
|
70
|
+
specification_version: 4
|
71
|
+
summary: A Forthic interpreter that runs within Ruby.
|
72
|
+
test_files: []
|