fOOrth 0.5.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.
Files changed (155) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rdoc_options +17 -0
  4. data/Gemfile +4 -0
  5. data/README.md +67 -0
  6. data/bin/fOOrth +8 -0
  7. data/demo.rb +24 -0
  8. data/fOOrth.gemspec +40 -0
  9. data/fOOrth.reek +109 -0
  10. data/integration/README.md +12 -0
  11. data/integration/_FILE_test.foorth +5 -0
  12. data/integration/array_lib_tests.rb +360 -0
  13. data/integration/class_lib_tests.rb +116 -0
  14. data/integration/clone_lib_tests.rb +108 -0
  15. data/integration/comparison_tests.rb +132 -0
  16. data/integration/compile_lib_tests.rb +190 -0
  17. data/integration/ctrl_struct_lib_tests.rb +80 -0
  18. data/integration/data_ref_lib_tests.rb +43 -0
  19. data/integration/exception_lib_tests.rb +86 -0
  20. data/integration/fiber_bundle_tests.rb +380 -0
  21. data/integration/hash_lib_tests.rb +120 -0
  22. data/integration/in_stream_test_1.txt +4 -0
  23. data/integration/load_test_one.foorth +6 -0
  24. data/integration/load_test_two.foorth +4 -0
  25. data/integration/numeric_lib_tests.rb +321 -0
  26. data/integration/object_lib_tests.rb +38 -0
  27. data/integration/procedure_lib_tests.rb +40 -0
  28. data/integration/queue_lib_tests.rb +66 -0
  29. data/integration/stack_lib_tests.rb +70 -0
  30. data/integration/standard_lib_tests.rb +208 -0
  31. data/integration/stdio_lib_tests.rb +52 -0
  32. data/integration/stream_lib_tests.rb +196 -0
  33. data/integration/string_lib_tests.rb +217 -0
  34. data/integration/support/foorth_testing.rb +135 -0
  35. data/integration/thread_lib_tests.rb +83 -0
  36. data/integration/time_lib_tests.rb +791 -0
  37. data/integration/vm_lib_tests.rb +38 -0
  38. data/lib/fOOrth.rb +57 -0
  39. data/lib/fOOrth/compiler.rb +78 -0
  40. data/lib/fOOrth/compiler/context.rb +49 -0
  41. data/lib/fOOrth/compiler/context/locals.rb +34 -0
  42. data/lib/fOOrth/compiler/context/map_name.rb +92 -0
  43. data/lib/fOOrth/compiler/context/tags.rb +48 -0
  44. data/lib/fOOrth/compiler/modes.rb +32 -0
  45. data/lib/fOOrth/compiler/modes/compiled.rb +41 -0
  46. data/lib/fOOrth/compiler/modes/deferred.rb +57 -0
  47. data/lib/fOOrth/compiler/modes/delayed.rb +40 -0
  48. data/lib/fOOrth/compiler/modes/nested.rb +34 -0
  49. data/lib/fOOrth/compiler/modes/suspend.rb +32 -0
  50. data/lib/fOOrth/compiler/parser.rb +26 -0
  51. data/lib/fOOrth/compiler/parser/get_string.rb +71 -0
  52. data/lib/fOOrth/compiler/parser/normal.rb +53 -0
  53. data/lib/fOOrth/compiler/parser/skip.rb +50 -0
  54. data/lib/fOOrth/compiler/parser/special.rb +42 -0
  55. data/lib/fOOrth/compiler/process.rb +47 -0
  56. data/lib/fOOrth/compiler/process/generate.rb +24 -0
  57. data/lib/fOOrth/compiler/process/get_token.rb +23 -0
  58. data/lib/fOOrth/compiler/process/procedure.rb +55 -0
  59. data/lib/fOOrth/compiler/process/string.rb +20 -0
  60. data/lib/fOOrth/compiler/source.rb +51 -0
  61. data/lib/fOOrth/compiler/source/console.rb +70 -0
  62. data/lib/fOOrth/compiler/source/file_source.rb +37 -0
  63. data/lib/fOOrth/compiler/source/read_point.rb +46 -0
  64. data/lib/fOOrth/compiler/source/string_source.rb +28 -0
  65. data/lib/fOOrth/compiler/token.rb +37 -0
  66. data/lib/fOOrth/compiler/word_specs.rb +178 -0
  67. data/lib/fOOrth/core.rb +27 -0
  68. data/lib/fOOrth/core/class.rb +116 -0
  69. data/lib/fOOrth/core/object.rb +78 -0
  70. data/lib/fOOrth/core/virtual_machine.rb +28 -0
  71. data/lib/fOOrth/debug.rb +13 -0
  72. data/lib/fOOrth/debug/context_dump.rb +31 -0
  73. data/lib/fOOrth/debug/dbg_puts.rb +17 -0
  74. data/lib/fOOrth/debug/display_abort.rb +37 -0
  75. data/lib/fOOrth/debug/vm_dump.rb +27 -0
  76. data/lib/fOOrth/initialize.rb +83 -0
  77. data/lib/fOOrth/interpreter.rb +24 -0
  78. data/lib/fOOrth/interpreter/add_to_hash.rb +17 -0
  79. data/lib/fOOrth/interpreter/data_stack.rb +125 -0
  80. data/lib/fOOrth/interpreter/do_loop.rb +55 -0
  81. data/lib/fOOrth/interpreter/squash.rb +25 -0
  82. data/lib/fOOrth/library.rb +38 -0
  83. data/lib/fOOrth/library/array_library.rb +577 -0
  84. data/lib/fOOrth/library/bundle_library.rb +112 -0
  85. data/lib/fOOrth/library/class_library.rb +90 -0
  86. data/lib/fOOrth/library/clone_library.rb +72 -0
  87. data/lib/fOOrth/library/command_library.rb +205 -0
  88. data/lib/fOOrth/library/compile_library.rb +181 -0
  89. data/lib/fOOrth/library/complex_library.rb +81 -0
  90. data/lib/fOOrth/library/ctrl_struct_library.rb +116 -0
  91. data/lib/fOOrth/library/data_ref_library.rb +100 -0
  92. data/lib/fOOrth/library/duration/arithmetic.rb +114 -0
  93. data/lib/fOOrth/library/duration/formatter.rb +152 -0
  94. data/lib/fOOrth/library/duration/intervals.rb +233 -0
  95. data/lib/fOOrth/library/duration/make.rb +75 -0
  96. data/lib/fOOrth/library/duration_library.rb +52 -0
  97. data/lib/fOOrth/library/fiber_library.rb +120 -0
  98. data/lib/fOOrth/library/hash_library.rb +203 -0
  99. data/lib/fOOrth/library/in_stream_library.rb +81 -0
  100. data/lib/fOOrth/library/integer_library.rb +104 -0
  101. data/lib/fOOrth/library/mutex_library.rb +31 -0
  102. data/lib/fOOrth/library/numeric_library.rb +380 -0
  103. data/lib/fOOrth/library/object_library.rb +80 -0
  104. data/lib/fOOrth/library/other_value_types_library.rb +96 -0
  105. data/lib/fOOrth/library/out_stream_library.rb +146 -0
  106. data/lib/fOOrth/library/procedure_library.rb +65 -0
  107. data/lib/fOOrth/library/queue_library.rb +47 -0
  108. data/lib/fOOrth/library/rational_library.rb +90 -0
  109. data/lib/fOOrth/library/stack_library.rb +56 -0
  110. data/lib/fOOrth/library/stdio_library.rb +56 -0
  111. data/lib/fOOrth/library/string_library.rb +285 -0
  112. data/lib/fOOrth/library/stubs.rb +76 -0
  113. data/lib/fOOrth/library/sync_bundle_library.rb +50 -0
  114. data/lib/fOOrth/library/thread_library.rb +73 -0
  115. data/lib/fOOrth/library/time_library.rb +302 -0
  116. data/lib/fOOrth/library/vm_library.rb +105 -0
  117. data/lib/fOOrth/main.rb +125 -0
  118. data/lib/fOOrth/monkey_patch.rb +14 -0
  119. data/lib/fOOrth/monkey_patch/complex.rb +30 -0
  120. data/lib/fOOrth/monkey_patch/exceptions.rb +154 -0
  121. data/lib/fOOrth/monkey_patch/false.rb +11 -0
  122. data/lib/fOOrth/monkey_patch/float.rb +22 -0
  123. data/lib/fOOrth/monkey_patch/integer.rb +22 -0
  124. data/lib/fOOrth/monkey_patch/nil.rb +11 -0
  125. data/lib/fOOrth/monkey_patch/numeric.rb +33 -0
  126. data/lib/fOOrth/monkey_patch/object.rb +43 -0
  127. data/lib/fOOrth/monkey_patch/rational.rb +31 -0
  128. data/lib/fOOrth/monkey_patch/string.rb +51 -0
  129. data/lib/fOOrth/symbol_map.rb +82 -0
  130. data/lib/fOOrth/version.rb +7 -0
  131. data/license.txt +21 -0
  132. data/rakefile.rb +65 -0
  133. data/reek.txt +1 -0
  134. data/sire.rb +132 -0
  135. data/t.txt +3 -0
  136. data/test.foorth +5 -0
  137. data/tests/compiler/context_tests.rb +180 -0
  138. data/tests/compiler/file_source_test_one.txt +1 -0
  139. data/tests/compiler/file_source_test_three.txt +3 -0
  140. data/tests/compiler/file_source_test_two.txt +3 -0
  141. data/tests/compiler/file_source_tests.rb +130 -0
  142. data/tests/compiler/mode_tests.rb +45 -0
  143. data/tests/compiler/parser_tests.rb +116 -0
  144. data/tests/compiler/spec_tests.rb +113 -0
  145. data/tests/compiler/string_source_tests.rb +128 -0
  146. data/tests/core_tests.rb +138 -0
  147. data/tests/interpreter/data_stack_tests.rb +119 -0
  148. data/tests/monkey_patch/coerce_test.rb +131 -0
  149. data/tests/monkey_patch/complex_test.rb +25 -0
  150. data/tests/monkey_patch/numeric_test.rb +62 -0
  151. data/tests/monkey_patch/object_test.rb +49 -0
  152. data/tests/monkey_patch/rational_test.rb +57 -0
  153. data/tests/monkey_patch/string_test.rb +53 -0
  154. data/tests/symbol_map_tests.rb +53 -0
  155. metadata +366 -0
@@ -0,0 +1,38 @@
1
+ # coding: utf-8
2
+
3
+ require_relative '../lib/fOOrth'
4
+ require_relative 'support/foorth_testing'
5
+ gem 'minitest'
6
+ require 'minitest/autorun'
7
+ require 'minitest_visible'
8
+
9
+ #Test the standard fOOrth library.
10
+ class VMLibraryTester < Minitest::Test
11
+
12
+ include XfOOrthTestExtensions
13
+
14
+ #Track mini-test progress.
15
+ include MinitestVisible
16
+
17
+ def test_that_the_VM_class_and_instance_are_available
18
+ foorth_equal("VirtualMachine", [XfOOrth::VirtualMachine])
19
+
20
+ vm = Thread.current[:vm]
21
+ foorth_equal("vm", [vm])
22
+
23
+ end
24
+
25
+ def test_for_the_vm_as_string
26
+ foorth_equal("vm .to_s", ['VirtualMachine instance <Main>'])
27
+ foorth_output('vm .' , 'VirtualMachine instance <Main>')
28
+ end
29
+
30
+ def test_for_the_vm_name
31
+ foorth_equal("vm .vm_name", ['Main'])
32
+ end
33
+
34
+ def test_for_stack_clear
35
+ foorth_equal('3 4 5 6 clear', [])
36
+ end
37
+
38
+ end
@@ -0,0 +1,57 @@
1
+ # coding: utf-8
2
+
3
+ # The fOOrth Language System implemented via a Ruby gem.
4
+
5
+ require 'safe_clone'
6
+ require 'full_clone'
7
+ require 'in_array'
8
+ require 'format_engine'
9
+ require 'ruby_sscanf'
10
+ require 'English'
11
+
12
+ require 'pp'
13
+
14
+ $no_alias_read_line_module = true
15
+ require 'mini_readline'
16
+
17
+ require_relative 'fOOrth/version'
18
+ require_relative 'fOOrth/debug'
19
+ require_relative 'fOOrth/monkey_patch'
20
+ require_relative 'fOOrth/symbol_map'
21
+ require_relative 'fOOrth/interpreter'
22
+ require_relative 'fOOrth/compiler'
23
+ require_relative 'fOOrth/initialize'
24
+ require_relative 'fOOrth/core'
25
+
26
+ unless $exclude_fOOrth_library
27
+ require_relative 'fOOrth/library'
28
+ require_relative 'fOOrth/main'
29
+ end
30
+
31
+ #\XfOOrth - the module name space of the fOOrth language system.
32
+ #* fOOrth.rb - The root file that gathers up all the system's parts.
33
+ module XfOOrth
34
+
35
+ #The version of this module.
36
+ #<br>Returns
37
+ #* A version string; <major>.<minor>.<step>
38
+ def self.version
39
+ VERSION
40
+ end
41
+
42
+ #The virtual machine is the heart of the fOOrth language system that is
43
+ #used to facilitate the stack oriented processing of data and language
44
+ #elements.
45
+ #* fOOrth.rb - Version info lives here.
46
+ class VirtualMachine
47
+
48
+ #Get the version string for this virtual machine.
49
+ #<br>Endemic Code Smells
50
+ #* :reek:UtilityFunction
51
+ def version
52
+ XfOOrth.version
53
+ end
54
+ end
55
+
56
+ end
57
+
@@ -0,0 +1,78 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'compiler/source'
4
+ require_relative 'compiler/parser'
5
+ require_relative 'compiler/token'
6
+ require_relative 'compiler/modes'
7
+ require_relative 'compiler/word_specs'
8
+ require_relative 'compiler/context'
9
+ require_relative 'compiler/process'
10
+
11
+ #* compiler.rb - The compiler portion of the fOOrth language system.
12
+ module XfOOrth
13
+
14
+ #* compiler.rb - The compiler service of the virtual machine.
15
+ class VirtualMachine
16
+
17
+ #The current system console object. Gets the current console object
18
+ #only creating one if somebody asks for one.
19
+ #<br>Note
20
+ #* This is to be the sole occurrence of @_private_console
21
+ def console
22
+ @_private_console ||= Console.new
23
+ end
24
+
25
+ #The current compiler parser.
26
+ attr_reader :parser
27
+
28
+ #The current execution/compile context.
29
+ attr_reader :context
30
+
31
+ #The level of quote nesting.
32
+ attr_accessor :quotes
33
+
34
+ #Is a force compile in effect?
35
+ attr_accessor :force
36
+
37
+ #Return the compiler to a known state.
38
+ def compiler_reset
39
+ @buffer = nil
40
+ @parser = nil
41
+ @quotes = 0
42
+ @force = false
43
+ @context = Context.new(nil, vm: self, mode: :execute)
44
+ self
45
+ end
46
+
47
+ #Append text to the compile buffer.
48
+ def <<(text)
49
+ dbg_puts " Append=#{text.inspect}"
50
+ @buffer << text
51
+ end
52
+
53
+ #Execute code from the interactive console.
54
+ def process_console
55
+ process(console)
56
+ ensure
57
+ console.flush
58
+ end
59
+
60
+ #Execute a string of code.
61
+ def process_string(str)
62
+ process(StringSource.new(str))
63
+ end
64
+
65
+ #Execute a file of code.
66
+ def process_file(name)
67
+ source = FileSource.new(name)
68
+
69
+ begin
70
+ process(source)
71
+ ensure
72
+ source.close
73
+ end
74
+ end
75
+
76
+ end
77
+
78
+ end
@@ -0,0 +1,49 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'context/map_name'
4
+ require_relative 'context/tags'
5
+ require_relative 'context/locals'
6
+
7
+ #* compiler/context.rb - The compile progress context manager of the fOOrth
8
+ # language system.
9
+ module XfOOrth
10
+
11
+ #A class for the management of global, hierarchical, and nested compile time contexts.
12
+ #* compiler/context.rb - \Context constructor, tag support, and local defs.
13
+ class Context
14
+
15
+ #The previous context object that this one builds on. Set to nil if there
16
+ #is none.
17
+ attr_reader :previous
18
+
19
+ #Setup an instance of compiler context.
20
+ #<br>Parameters:
21
+ #* previous - The previous context object or nil if there is none.
22
+ #* data - A hash of context data.
23
+ def initialize(previous, data={})
24
+ @previous, @data = previous, data
25
+ end
26
+
27
+ #How many levels of nested context are there?
28
+ def depth
29
+ 1 + (previous ? previous.depth : 0)
30
+ end
31
+
32
+ #Is the current nesting level what is expected?
33
+ #<br>Parameters
34
+ #* expected_depth - the expected nesting depth.
35
+ #<br>Notes
36
+ #* Raises an error (F12) on incorrect nesting.
37
+ def check_depth(expected_depth)
38
+ if expected_depth - self.depth != 0
39
+ error "F12: Error, Invalid control/structure nesting."
40
+ end
41
+ end
42
+
43
+ #Get the currently define method receiver
44
+ def recvr
45
+ self[:obj] || self[:cls] || self[:vm] || error("F90: No message receiver.")
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+
3
+ #* compiler/context/locals.rb - Support local methods in context.
4
+ module XfOOrth
5
+
6
+ #* compiler/context/locals.rb - Support local methods in context.
7
+ class Context
8
+
9
+ #Create a local method on this context.
10
+ #<br>Parameters:
11
+ #* name - The name of the method to create.
12
+ #* spec_class - The specification class to use.
13
+ #* options - An array of options.
14
+ #* block - A block to associate with the name.
15
+ #<br>Returns
16
+ #* The spec created for the shared method.
17
+ def create_local_method(name, spec_class, options, &block)
18
+ sym = SymbolMap.add_entry(name)
19
+ self[sym] = spec_class.new(name, sym, options, &block)
20
+ end
21
+
22
+ #Remove a local method on this context.
23
+ #<br>Parameters:
24
+ #* The name of the method to remove.
25
+ def remove_local_method(name)
26
+ if (sym = SymbolMap.map(name))
27
+ @data.delete(sym)
28
+ else
29
+ error "F90: Unable to remove local method #{name}"
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,92 @@
1
+ # coding: utf-8
2
+
3
+ #* compiler/context/map_name.rb - The fOOrth language mapping of names in a context.
4
+ module XfOOrth
5
+
6
+ #* compiler/context/map_name.rb - The fOOrth language mapping of names in a context.
7
+ class Context
8
+
9
+ #Map a name to a specification.
10
+ #<br>Parameters:
11
+ #* name - The string to be mapped.
12
+ #<br>Returns:
13
+ #* The specification that corresponds to the name or nil if none found.
14
+ def map(name)
15
+ if (@symbol = SymbolMap.map(@name = name))
16
+ do_map_name
17
+ end
18
+ end
19
+
20
+ #Private methods follow.
21
+ private
22
+
23
+ #Do a search of dictionaries based on the syntax of the name.
24
+ def do_map_name
25
+ self[@symbol] ||
26
+ case @name[0]
27
+ when '.'
28
+ do_object_class_map ||
29
+ do_vm_target_map ||
30
+ TosSpec.new(@name, @symbol, [:temp])
31
+
32
+ when '~'
33
+ do_class_target_map ||
34
+ do_object_target_map ||
35
+ do_vm_target_map ||
36
+ SelfSpec.new(@name, @symbol, [:temp])
37
+
38
+ when '@'
39
+ do_class_target_map ||
40
+ do_object_target_map ||
41
+ do_vm_target_map ||
42
+ spec_error
43
+
44
+ when '$'
45
+ do_global_target_map ||
46
+ spec_error
47
+
48
+ when '#'
49
+ do_vm_target_map ||
50
+ spec_error
51
+
52
+ else
53
+ do_object_class_map ||
54
+ do_vm_target_map ||
55
+ do_global_target_map ||
56
+ spec_error
57
+ end
58
+
59
+ end
60
+
61
+ #Do a search of the Object class for the item.
62
+ def do_object_class_map
63
+ Object.map_foorth_shared(@symbol)
64
+ end
65
+
66
+ #Do a search of the :cls tag if it is specified.
67
+ def do_class_target_map
68
+ (tc = self[:cls]) && tc.map_foorth_shared(@symbol)
69
+ end
70
+
71
+ #Do a search of the :obj tag if it is specified.
72
+ def do_object_target_map
73
+ (to = self[:obj]) && to.map_foorth_exclusive(@symbol)
74
+ end
75
+
76
+ #Do a search of the :vm tag if it is specified.
77
+ def do_vm_target_map
78
+ (vm = self[:vm]) && vm.map_foorth_exclusive(@symbol)
79
+ end
80
+
81
+ #Do a search of the globals.
82
+ def do_global_target_map
83
+ $FOORTH_GLOBALS[@symbol]
84
+ end
85
+
86
+ #Error: Unable to find a specification.
87
+ def spec_error
88
+ error "F11: ?#{@name}?"
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,48 @@
1
+ # coding: utf-8
2
+
3
+ #* compiler/context/tags.rb - Support tags in context.
4
+ module XfOOrth
5
+
6
+ #* compiler/context/tags.rb - Support tags in context.
7
+ class Context
8
+
9
+ #Retrieve the data value currently in effect.
10
+ def [](index)
11
+ @data[index] || (previous && previous[index])
12
+ end
13
+
14
+ #Set a data value.
15
+ def []=(index,value)
16
+ @data[index] = value
17
+ end
18
+
19
+ #Get the compile tags in effect.
20
+ def tags
21
+ @data[:tags] || []
22
+ end
23
+
24
+ #Merge in a hash of tag data.
25
+ def merge(new_data)
26
+ @data.merge!(new_data)
27
+ end
28
+
29
+ #Validate a current data value.
30
+ #<br>Parameters:
31
+ #* symbol - The symbol of the value to be tested.
32
+ #* expect - An array of valid values.
33
+ #<br>Note:
34
+ #* Throws a XfOOrthError if the value is not valid.
35
+ #* To check for no value, use [nil] for expect.
36
+ #* Returns true to facilitate testing only.
37
+ def check_set(symbol, expect)
38
+ current = self[symbol]
39
+
40
+ unless expect.include?(current)
41
+ error "F10: Found a #{current.inspect}, excpected #{expect}"
42
+ end
43
+
44
+ true
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+
3
+ require_relative 'modes/compiled'
4
+ require_relative 'modes/suspend'
5
+ require_relative 'modes/delayed'
6
+ require_relative 'modes/deferred'
7
+ require_relative 'modes/nested'
8
+
9
+ #* compiler/modes.rb - The control of the various compiler modes.
10
+ module XfOOrth
11
+ #* modes.rb - The control of the various compiler modes.
12
+ class VirtualMachine
13
+
14
+ #Depending on the mode, process the text source code.
15
+ #<br>Parameters:
16
+ #* text - Some text to be executed or deferred.
17
+ def process_text(text)
18
+ if execute_mode?
19
+ dbg_puts " Code=#{text.inspect}"
20
+ @context.recvr.instance_exec(self, &eval("lambda {|vm| #{text} }"))
21
+ else
22
+ self << text
23
+ end
24
+ end
25
+
26
+ #Check to see if the virtual machine is in execute mode.
27
+ def execute_mode?
28
+ @context[:mode] == :execute
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,41 @@
1
+ # coding: utf-8
2
+
3
+ #* compiler/modes/compiled.rb - The compiled system mode.
4
+ module XfOOrth
5
+ #* compiler/modes/compiled.rb - The control of the compiled system mode.
6
+ class VirtualMachine
7
+
8
+ #Start compiling a fOOrth definition. This is used to get things going
9
+ #by the various compiling words like ':', '::', ':::', etc.
10
+ #<br>Parameters:
11
+ #* ctrl - The control symbol that started the compilation.
12
+ #* action - A block to be executed when the compilation is done.
13
+ #<br>Note:
14
+ #* Adds a nested context level to be un-nested at a later point.
15
+ def begin_compile_mode(ctrl, defs={}, &action)
16
+ dbg_puts " begin_compile_mode"
17
+ @context.check_set(:mode, [:execute])
18
+ @context = Context.new(@context, mode: :compile, ctrl: ctrl, action: action)
19
+ @context.merge(defs)
20
+ @buffer = ''
21
+ end
22
+
23
+ #Finish compiling a fOOrth definition. This is used to wrap things up,
24
+ #mostly by the semi-colon ';' word.
25
+ #<br>Parameters:
26
+ #* ctrls - an array of the allowed set of control values.
27
+ #<br>Returns:
28
+ #* The value of the action block.
29
+ #<br>Note:
30
+ #* Un-nests a context level.
31
+ def end_compile_mode(ctrls)
32
+ @context.check_set(:ctrl, ctrls)
33
+ source, @buffer = "lambda {|vm| #{@buffer} }", nil
34
+ result = instance_exec(self, source, @context.tags, &@context[:action])
35
+ @context = @context.previous
36
+ dbg_puts " end_compile_mode"
37
+ result
38
+ end
39
+
40
+ end
41
+ end