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,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 555eecaccf4bd5f00d4adb2c45d95a229fcc286d
4
+ data.tar.gz: 39ab0f4185e63de1958507d4a4bd85f117dd8fef
5
+ SHA512:
6
+ metadata.gz: cc6b7b66c30d45a9f0aa7717afad8fc2eac30151b9cbaa82bd495bbf98dc3687506f53d3094780f17fbc64c614115666df7d633debc9f7f2bf674f8f1d99020a
7
+ data.tar.gz: 897a8d530c9cfe6a81448f90cb45ad2134904048d625075318a2ca49fe92b21b10462ce5abf6835d5451a936decf090c61b2f1a72d3240560dfc69c163fdc4df
@@ -0,0 +1,21 @@
1
+ *.bat
2
+ *.zip
3
+ *.tmp
4
+ *.gem
5
+ *.rbc
6
+ .bundle
7
+ .config
8
+ .yardoc
9
+ Gemfile.lock
10
+ InstalledFiles
11
+ _yardoc
12
+ coverage
13
+ docs/.~lock.*
14
+ lib/bundler/man
15
+ pkg
16
+ rdoc
17
+ spec/reports
18
+ test/tmp
19
+ test/version_tmp
20
+ tmp
21
+ temp.txt
@@ -0,0 +1,17 @@
1
+ --- !ruby/object:RDoc::Options
2
+ encoding: UTF-8
3
+ static_path: []
4
+ rdoc_include:
5
+ - .
6
+ charset: UTF-8
7
+ exclude: !ruby/regexp /(?-mix:doc)|(?-mix:sire.rb)|(?-mix:.*\.4th)|(?-mix:.*\.odt)|(?-mix:.*bat)/
8
+ hyperlink_all: false
9
+ line_numbers: false
10
+ main_page:
11
+ markup: rdoc
12
+ page_dir:
13
+ show_hash: false
14
+ tab_width: 8
15
+ title:
16
+ visibility: :protected
17
+ webcvs:
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fOOrth.gemspec
4
+ gemspec
@@ -0,0 +1,67 @@
1
+ # The fOOrth Language gem.
2
+
3
+ This file contains the read-me for the fOOrth language gem. The fOOrth
4
+ language is an experimental variant of FORTH that attempts to incorporate
5
+ object oriented and functional programming concepts.
6
+
7
+ As an aside, there can be no doubt that the fOOrth project is an utter waste
8
+ of anyone's time, unless one counts the insights gained into the inner
9
+ workings of Ruby and meta programming.
10
+
11
+ ## Usage
12
+ Adding fOOrth can be as simple as:
13
+
14
+ require 'fOOrth'
15
+ XfOOrth.main
16
+
17
+ This will launch an interactive fOOrth session. Alternatively this can be
18
+ done with:
19
+
20
+ rake run
21
+
22
+ Be sure to be in the folder that contains the rakefile in order for this
23
+ command to work.
24
+
25
+ <br>If, instead, a non-interactive facility is required, use:
26
+
27
+ require 'fOOrth'
28
+ XfOOrth.virtual_machine.process_string '1 2 +'
29
+
30
+ where the string is fOOrth code to be executed, or for a file of code, use:
31
+
32
+ require 'fOOrth'
33
+ XfOOrth.virtual_machine.process_file 'my_file.foorth'
34
+
35
+ ## Further Documentation
36
+
37
+ The fOOrth Language System is documented in The fOOrth User Guide. This is
38
+ currently only available in Open Office format, and is still also very much
39
+ a work in progress. Please see The_fOOrth_User_Guide.odt in the docs folder.
40
+
41
+ Also for those who do not have or don't want Open Office: As each major
42
+ version of fOOrth is made available, expect to see portable document format
43
+ (pdf) versions of the guide. (In the docs folder in the repository)
44
+
45
+ ## Contributing
46
+
47
+ #### Plan A
48
+
49
+ 1. Fork it
50
+ 2. Switch to the development branch ('git branch development')
51
+ 3. Create your feature branch ('git checkout -b my-new-feature')
52
+ 4. Commit your changes ('git commit -am "Add some feature"')
53
+ 5. Push to the branch ('git push origin my-new-feature')
54
+ 6. Create new Pull Request
55
+
56
+
57
+ For more details on the branching strategy, please see:
58
+ http://nvie.com/posts/a-successful-git-branching-model/
59
+
60
+
61
+ #### Plan B
62
+
63
+ Go to the GitHub repository and raise an issue calling attention to some
64
+ aspect that could use some TLC or a suggestion or an idea. Apply labels
65
+ to the issue that match the point you are trying to make. Then follow
66
+ your issue and keep up-to-date as it is worked on. All input are greatly
67
+ appreciated.
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Standalone execution of the fOOrth environment.
4
+ #
5
+
6
+ require 'fOOrth'
7
+
8
+ XfOOrth::main
data/demo.rb ADDED
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+
3
+ #This file contains a minimum host environment for running the fOOrth system.
4
+
5
+ if ARGV[0] == 'local'
6
+ require_relative 'lib/fOOrth'
7
+ puts "\nOption(local) Loaded fOOrth from the local code folder."
8
+ elsif defined?(XfOOrth)
9
+ puts "\nThe fOOrth system is already loaded."
10
+ else
11
+ begin
12
+ require 'fOOrth'
13
+ puts "\nLoaded fOOrth from the system gem."
14
+ rescue LoadError
15
+ require_relative 'lib/fOOrth'
16
+ puts "\nLoaded fOOrth from the local code folder."
17
+ end
18
+ end
19
+
20
+ puts
21
+
22
+ if __FILE__==$0
23
+ XfOOrth::main
24
+ end
@@ -0,0 +1,40 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'fOOrth/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "fOOrth"
8
+ spec.version = XfOOrth::VERSION
9
+ spec.authors = ["Peter Camilleri"]
10
+ spec.email = "peter.c.camilleri@gmail.com"
11
+ spec.homepage = "http://teuthida-technologies.com/"
12
+ spec.description = "An Object Oriented FORTHesque language gem."
13
+ spec.summary = "FNF == fOOrth is Not FORTH."
14
+ spec.license = 'MIT'
15
+
16
+ raw_list = `git ls-files`.split($/)
17
+ raw_list = raw_list.keep_if {|entry| !entry.start_with?("docs") }
18
+
19
+ spec.files = raw_list
20
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
+ spec.require_paths = ["lib"]
23
+ spec.executables = ["fOOrth"]
24
+
25
+ spec.required_ruby_version = '>=1.9.3'
26
+
27
+ spec.add_development_dependency "bundler", "~> 1.3"
28
+ spec.add_development_dependency 'rake'
29
+ spec.add_development_dependency 'reek', "~> 3.0"
30
+ spec.add_development_dependency 'minitest', "~> 5.7"
31
+ spec.add_development_dependency 'minitest_visible', ">= 0.1.0"
32
+ spec.add_development_dependency 'rdoc', "~> 4.0.1"
33
+
34
+ spec.add_runtime_dependency 'ruby_sscanf', ">= 0.2.0"
35
+ spec.add_runtime_dependency 'format_engine', ">= 0.7.0"
36
+ spec.add_runtime_dependency 'full_clone'
37
+ spec.add_runtime_dependency 'safe_clone'
38
+ spec.add_runtime_dependency 'in_array'
39
+ spec.add_runtime_dependency 'mini_readline', ">= 0.3.3"
40
+ end
@@ -0,0 +1,109 @@
1
+ ---
2
+ Attribute:
3
+ enabled: false
4
+ exclude: []
5
+ BooleanParameter:
6
+ enabled: true
7
+ exclude: []
8
+ ClassVariable:
9
+ enabled: true
10
+ exclude: []
11
+ ControlParameter:
12
+ enabled: true
13
+ exclude: []
14
+ DataClump:
15
+ enabled: true
16
+ exclude: []
17
+ max_copies: 2
18
+ min_clump_size: 2
19
+ DuplicateMethodCall:
20
+ enabled: true
21
+ exclude: []
22
+ max_calls: 1
23
+ allow_calls: []
24
+ FeatureEnvy:
25
+ enabled: true
26
+ exclude: []
27
+ IrresponsibleModule:
28
+ enabled: true
29
+ exclude: []
30
+ LongParameterList:
31
+ enabled: true
32
+ exclude: []
33
+ max_params: 3
34
+ overrides:
35
+ initialize:
36
+ max_params: 5
37
+ LongYieldList:
38
+ enabled: true
39
+ exclude: []
40
+ max_params: 3
41
+ NestedIterators:
42
+ enabled: true
43
+ exclude: []
44
+ max_allowed_nesting: 1
45
+ ignore_iterators: []
46
+ NilCheck:
47
+ enabled: true
48
+ exclude: []
49
+ PrimaDonnaMethod:
50
+ enabled: true
51
+ exclude: []
52
+ RepeatedConditional:
53
+ enabled: true
54
+ exclude: []
55
+ max_ifs: 2
56
+ TooManyInstanceVariables:
57
+ enabled: true
58
+ exclude: []
59
+ max_instance_variables: 9
60
+ TooManyMethods:
61
+ enabled: true
62
+ exclude: []
63
+ max_methods: 25
64
+ TooManyStatements:
65
+ enabled: true
66
+ exclude:
67
+ - initialize
68
+ max_statements: 7
69
+ UncommunicativeMethodName:
70
+ enabled: true
71
+ exclude: []
72
+ reject:
73
+ - !ruby/regexp /^[a-z]$/
74
+ - !ruby/regexp /[0-9]$/
75
+ - !ruby/regexp /[A-Z]/
76
+ accept: []
77
+ UncommunicativeModuleName:
78
+ enabled: true
79
+ exclude: []
80
+ reject:
81
+ - !ruby/regexp /^.$/
82
+ - !ruby/regexp /[0-9]$/
83
+ accept:
84
+ - Inline::C
85
+ UncommunicativeParameterName:
86
+ enabled: true
87
+ exclude: []
88
+ reject:
89
+ - !ruby/regexp /^.$/
90
+ - !ruby/regexp /[0-9]$/
91
+ - !ruby/regexp /[A-Z]/
92
+ - !ruby/regexp /^_/
93
+ accept: []
94
+ UncommunicativeVariableName:
95
+ enabled: true
96
+ exclude: []
97
+ reject:
98
+ - !ruby/regexp /^.$/
99
+ - !ruby/regexp /[0-9]$/
100
+ - !ruby/regexp /[A-Z]/
101
+ accept:
102
+ - _
103
+ UnusedParameters:
104
+ enabled: true
105
+ exclude: []
106
+ UtilityFunction:
107
+ enabled: true
108
+ exclude: []
109
+ max_helper_calls: 1
@@ -0,0 +1,12 @@
1
+ # The Integration Test Suite.
2
+
3
+ While the tests folder mostly focuses on the internals of fOOrth, and in fact
4
+ does not even load the run time libraries, the integration test suite loads
5
+ the entire fOOrth language in order to be able to conduct testing on the
6
+ system as a whole.
7
+
8
+ This is done via the following rake command:
9
+
10
+ rake integration
11
+
12
+ Most of the integration testing is done in fOOrth itself.
@@ -0,0 +1,5 @@
1
+ // Test the _FILE_ method
2
+
3
+ _FILE_
4
+
5
+ true if 7 _FILE_ then
@@ -0,0 +1,360 @@
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 ArrayLibraryTester < Minitest::Test
11
+
12
+ include XfOOrthTestExtensions
13
+
14
+ #Track mini-test progress.
15
+ include MinitestVisible
16
+
17
+ def test_some_array_basics
18
+ foorth_equal(' Array ', [Array])
19
+
20
+ foorth_equal(' Array .new ', [[]])
21
+ foorth_equal(': tt00 Array .new ; ', [])
22
+ foorth_equal('tt00 ', [[]])
23
+
24
+ foorth_equal(' 3 Array .new_size ', [[0,0,0]])
25
+ foorth_equal(': tt01 3 Array .new_size ; ', [])
26
+ foorth_equal('tt01 ', [[0,0,0]])
27
+
28
+ foorth_equal('try "apple" Array .new_size catch end', [])
29
+ foorth_equal('try -3 Array .new_size catch end', [])
30
+
31
+
32
+ foorth_equal(' 3 Array .new_value ', [[3]])
33
+ foorth_equal(': tt02 3 Array .new_value ; ', [])
34
+ foorth_equal('tt02 ', [[3]])
35
+
36
+ foorth_equal(' 3 2 Array .new_values ', [[3,3]])
37
+ foorth_equal(': tt03 3 2 Array .new_values ; ', [])
38
+ foorth_equal('tt03 ', [[3,3]])
39
+
40
+ foorth_equal('try "apple" "pie" Array .new_values catch end', [])
41
+ foorth_equal('try "apple" -3 Array .new_values catch end', [])
42
+
43
+ foorth_equal(' 3 Array .new{{ x }} ', [[0,1,2]])
44
+ foorth_equal(': tt04 3 Array .new{{ x }} ; ', [])
45
+ foorth_equal('tt04 ', [[0,1,2]])
46
+
47
+ foorth_equal('try -3 Array .new{{ x }} catch end', [])
48
+ foorth_equal('try "apple" Array .new{{ x }} catch end', [])
49
+ foorth_equal('try 3 Array .new{{ throw"xx" }} catch end', [])
50
+
51
+ foorth_equal(' [ 0 1 2 ] ', [[0,1,2]])
52
+ foorth_equal(': tt05 [ 0 1 2 ] ; ', [])
53
+ foorth_equal('tt05 ', [[0,1,2]])
54
+
55
+ foorth_equal(' [ 3 6 do i loop ] ', [[3,4,5]])
56
+ foorth_equal(': tt06 [ 3 6 do i loop ] ; ', [])
57
+ foorth_equal('tt06 ', [[3,4,5]])
58
+ end
59
+
60
+ def test_arrays_in_variables
61
+ foorth_equal('[ 3 6 9 ] val$: $taiv1 ', [])
62
+ foorth_equal('$taiv1 ', [[3,6,9]])
63
+ end
64
+
65
+ def test_some_basic_operators
66
+ foorth_equal('[ 3 6 9 ] [ 3 6 9 ] = ', [true])
67
+ foorth_equal('[ 3 6 9 ] [ 3 6 8 ] = ', [false])
68
+ foorth_equal('[ 3 6 9 ] [ 3 6 ] = ', [false])
69
+
70
+ foorth_equal('[ 3 6 9 ] [ 3 6 9 ] <>', [false])
71
+ foorth_equal('[ 3 6 9 ] [ 3 6 8 ] <>', [true])
72
+ foorth_equal('[ 3 6 9 ] [ 3 6 ] <>', [true])
73
+
74
+ foorth_equal('[ 3 6 9 ] [ 3 6 9 ] identical?', [false])
75
+ foorth_equal('[ 3 6 9 ] [ 3 6 9 ] distinct?', [true])
76
+
77
+ foorth_equal('[ 3 6 9 ] dup identical?', [true])
78
+ foorth_equal('[ 3 6 9 ] dup distinct?', [false])
79
+
80
+ foorth_equal('[ 3 6 9 ] clone identical?', [false])
81
+ foorth_equal('[ 3 6 9 ] clone distinct?', [true])
82
+ end
83
+
84
+ def test_the_each
85
+ foorth_equal('4 Array .new{{ x 1 + dup * }} val$: $tte ', [])
86
+ foorth_equal('$tte', [[1,4,9,16]])
87
+
88
+ foorth_equal('$tte .each{{ x }} ', [0,1,2,3])
89
+ foorth_equal('$tte .each{{ v }} ', [1,4,9,16])
90
+
91
+ foorth_equal(': tte $tte .each{{ v }} ;', [])
92
+ foorth_equal('tte', [1,4,9,16])
93
+ end
94
+
95
+ def test_the_map
96
+ foorth_equal('[ 2 3 4 ] .map{{ v 1+ }}', [[3,4,5]])
97
+ end
98
+
99
+ def test_the_select
100
+ foorth_equal('[ 0 10 do i loop ] .select{{ v 1 and 0= }}', [[0,2,4,6,8]])
101
+ end
102
+
103
+ def test_simple_array_indexing
104
+ foorth_equal('4 Array .new{{ x 1 + dup * }} val$: $tte ', [])
105
+ foorth_equal('$tte', [[1,4,9,16]])
106
+
107
+ foorth_equal('$tte @ ', [1])
108
+ foorth_equal('10 $tte ! ', [])
109
+ foorth_equal('$tte @ ', [10])
110
+
111
+ foorth_equal(' 0 $tte .[]@ ', [10])
112
+ foorth_equal(' -1 $tte .[]@ ', [16])
113
+ foorth_equal('1 0 $tte .[]! ', [])
114
+ foorth_equal('$tte @ ', [1])
115
+
116
+ foorth_equal(' 10 $tte .[]@ ', [nil])
117
+ foorth_equal('-10 $tte .[]@ ', [nil])
118
+
119
+ foorth_equal(' "0" $tte .[]@ ', [1])
120
+ foorth_equal('try "apple" $tte .[]@ catch end ', [])
121
+
122
+ end
123
+
124
+ def test_the_left_group
125
+ foorth_equal('2 [ 9 3 5 ] .left ', [[9,3]])
126
+ foorth_equal('2 [ 9 3 5 ] .-left ', [[5]])
127
+ foorth_equal('2 [ 0 8 9 ] [ 9 3 5 ] .+left ', [[0,8,9,5]])
128
+ foorth_equal('2 "apple" [ 9 3 5 ] .+left ', [["apple",5]])
129
+ foorth_equal('2 [ 0 8 9 7 ] .^left ', [[9,7], [0,8]])
130
+
131
+ foorth_equal('try "apple" [ 9 3 5 ] .left catch end', [])
132
+ foorth_equal('try -1 [ 9 3 5 ] .left catch end', [])
133
+
134
+ foorth_equal('try "apple" [ 9 3 5 ] .-left catch end', [])
135
+ foorth_equal('try -1 [ 9 3 5 ] .-left catch end', [])
136
+
137
+ foorth_equal('try -2 [ 0 8 9 ] [ 9 3 5 ] .+left catch end', [])
138
+ foorth_equal('try "apple" [ 0 8 9 ] [ 9 3 5 ] .+left catch end', [])
139
+
140
+ foorth_equal('try -2 [ 0 8 9 7 ] .^left catch end ', [])
141
+ foorth_equal('try "apple" [ 0 8 9 7 ] .^left catch end ', [])
142
+ end
143
+
144
+ def test_the_right_group
145
+ foorth_equal('2 [ 9 3 5 ] .right ', [[3,5]])
146
+ foorth_equal('2 [ 9 3 5 ] .-right ', [[9]])
147
+ foorth_equal('2 [ 0 8 9 ] [ 9 3 5 ] .+right ', [[9,0,8,9]])
148
+ foorth_equal('2 "apple" [ 9 3 5 ] .+right ', [[9,"apple"]])
149
+ foorth_equal('2 [ 0 8 9 7 ] .^right ', [[0,8], [9,7]])
150
+
151
+ foorth_equal('try "apple" [ 9 3 5 ] .right catch end', [])
152
+ foorth_equal('try -1 [ 9 3 5 ] .right catch end', [])
153
+
154
+ foorth_equal('try "apple" [ 9 3 5 ] .-right catch end', [])
155
+ foorth_equal('try -1 [ 9 3 5 ] .-right catch end', [])
156
+
157
+ foorth_equal('try -2 [ 0 8 9 ] [ 9 3 5 ] .+right catch end', [])
158
+ foorth_equal('try "apple" [ 0 8 9 ] [ 9 3 5 ] .+right catch end', [])
159
+
160
+ foorth_equal('try -2 [ 0 8 9 7 ] .^right catch end ', [])
161
+ foorth_equal('try "apple" [ 0 8 9 7 ] .^right catch end ', [])
162
+ end
163
+
164
+ def test_the_mid_group
165
+ foorth_equal('1 2 [ 9 3 5 7 ] .mid ', [[3,5]])
166
+ foorth_equal('1 2 [ 9 3 5 7 ] .-mid ', [[9,7]])
167
+ foorth_equal('1 2 [ 0 8 9 ] [ 9 3 5 7 ] .+mid ', [[9,0,8,9,7]])
168
+ foorth_equal('1 2 "apple" [ 9 3 5 7 ] .+mid ', [[9,"apple",7]])
169
+ foorth_equal('1 2 [ 9 3 5 7 ] .^mid ', [[9,7], [3,5]])
170
+
171
+ foorth_equal('try "apple" 2 [ 9 3 5 7 ] .mid catch end', [])
172
+ foorth_equal('try 1 "apple" [ 9 3 5 7 ] .mid catch end', [])
173
+ foorth_equal('try -1 2 [ 9 3 5 7 ] .mid catch end', [])
174
+ foorth_equal('try 1 -2 [ 9 3 5 7 ] .mid catch end', [])
175
+
176
+ foorth_equal('try "apple" 2 [ 9 3 5 7 ] .-mid catch end', [])
177
+ foorth_equal('try 1 "apple" [ 9 3 5 7 ] .-mid catch end', [])
178
+ foorth_equal('try -1 2 [ 9 3 5 7 ] .-mid catch end', [])
179
+ foorth_equal('try 1 -2 [ 9 3 5 7 ] .-mid catch end', [])
180
+
181
+ foorth_equal('try "apple" 2 [ 0 8 9 ] [ 9 3 5 7 ] .+mid catch end ', [])
182
+ foorth_equal('try 1 "apple" [ 0 8 9 ] [ 9 3 5 7 ] .+mid catch end ', [])
183
+ foorth_equal('try -1 2 [ 0 8 9 ] [ 9 3 5 7 ] .+mid catch end ', [])
184
+ foorth_equal('try 1 -2 [ 0 8 9 ] [ 9 3 5 7 ] .+mid catch end ', [])
185
+
186
+ foorth_equal('try -1 2 [ 9 3 5 7 ] .^mid catch end', [])
187
+ foorth_equal('try "apple" 2 [ 9 3 5 7 ] .^mid catch end', [])
188
+ foorth_equal('try 1 -2 [ 9 3 5 7 ] .^mid catch end', [])
189
+ foorth_equal('try 1 "apple" [ 9 3 5 7 ] .^mid catch end', [])
190
+ end
191
+
192
+ def test_the_midlr_group
193
+ foorth_equal('1 1 [ 9 3 5 7 ] .midlr ', [[3,5]])
194
+ foorth_equal('1 1 [ 9 3 5 7 ] .-midlr ', [[9,7]])
195
+ foorth_equal('0 2 [ 9 3 5 7 ] .-midlr ', [[5,7]])
196
+ foorth_equal('2 0 [ 9 3 5 7 ] .-midlr ', [[9,3]])
197
+ foorth_equal('1 1 [ 0 8 9 ] [ 9 3 5 7 ] .+midlr ', [[9,0,8,9,7]])
198
+ foorth_equal('0 2 [ 0 8 9 ] [ 9 3 5 7 ] .+midlr ', [[0,8,9,5,7]])
199
+ foorth_equal('2 0 [ 0 8 9 ] [ 9 3 5 7 ] .+midlr ', [[9,3,0,8,9]])
200
+ foorth_equal('1 1 "apple" [ 9 3 5 7 ] .+midlr ', [[9,"apple",7]])
201
+ foorth_equal('1 1 [ 9 3 5 7 ] .^midlr ', [[9,7], [3,5]])
202
+
203
+ foorth_equal('try "apple" 2 [ 9 3 5 7 ] .midlr catch end', [])
204
+ foorth_equal('try 2 "apple" [ 9 3 5 7 ] .midlr catch end', [])
205
+ foorth_equal('try -2 2 [ 9 3 5 7 ] .midlr catch end', [])
206
+ foorth_equal('try 2 -2 [ 9 3 5 7 ] .midlr catch end', [])
207
+
208
+ foorth_equal('try "apple" 2 [ 9 3 5 7 ] .-midlr catch end', [])
209
+ foorth_equal('try 2 "apple" [ 9 3 5 7 ] .-midlr catch end', [])
210
+ foorth_equal('try -2 2 [ 9 3 5 7 ] .-midlr catch end', [])
211
+ foorth_equal('try 2 -2 [ 9 3 5 7 ] .-midlr catch end', [])
212
+
213
+ foorth_equal('try "apple" 1 [ 0 8 9 ] [ 9 3 5 7 ] .+midlr catch end', [])
214
+ foorth_equal('try 1 "apple" [ 0 8 9 ] [ 9 3 5 7 ] .+midlr catch end', [])
215
+ foorth_equal('try -1 1 [ 0 8 9 ] [ 9 3 5 7 ] .+midlr catch end', [])
216
+ foorth_equal('try 1 -1 [ 0 8 9 ] [ 9 3 5 7 ] .+midlr catch end', [])
217
+
218
+ foorth_equal('try -1 1 [ 9 3 5 7 ] .^midlr catch end ', [])
219
+ foorth_equal('try "apple" 1 [ 9 3 5 7 ] .^midlr catch end ', [])
220
+ foorth_equal('try 1 -1 [ 9 3 5 7 ] .^midlr catch end ', [])
221
+ foorth_equal('try 1 "apple" [ 9 3 5 7 ] .^midlr catch end ', [])
222
+ end
223
+
224
+ def test_the_dequeue_methods
225
+ foorth_run('[ 1 2 3 ] val$: $tdqm')
226
+
227
+ #Test the non-mutating methods.
228
+ foorth_equal('$tdqm .pop_left', [[2,3], 1])
229
+ foorth_equal('$tdqm ', [[1,2,3]])
230
+ foorth_raises('[ ] .pop_left')
231
+
232
+ foorth_equal('$tdqm .pop_right', [[1,2], 3])
233
+ foorth_equal('$tdqm ', [[1,2,3]])
234
+ foorth_raises('[ ] .pop_right')
235
+
236
+ foorth_equal('0 $tdqm .push_left', [[0,1,2,3]])
237
+ foorth_equal('$tdqm ', [[1,2,3]])
238
+
239
+ foorth_equal('4 $tdqm .push_right', [[1,2,3,4]])
240
+ foorth_equal('$tdqm ', [[1,2,3]])
241
+
242
+ foorth_equal('$tdqm .peek_left', [[1,2,3], 1])
243
+ foorth_equal('$tdqm ', [[1,2,3]])
244
+ foorth_raises('[ ] .peek_left')
245
+
246
+ foorth_equal('$tdqm .peek_right', [[1,2,3], 3])
247
+ foorth_equal('$tdqm ', [[1,2,3]])
248
+ foorth_raises('[ ] .peek_right')
249
+
250
+
251
+ #Test the mutating methods.
252
+ foorth_equal('$tdqm .pop_left!', [1])
253
+ foorth_equal('$tdqm ', [[2,3]])
254
+ foorth_raises('[ ] .pop_left!')
255
+
256
+ foorth_equal('$tdqm .pop_right!', [3])
257
+ foorth_equal('$tdqm ', [[2]])
258
+ foorth_raises('[ ] .pop_right!')
259
+
260
+ foorth_equal('1 $tdqm .push_left!', [])
261
+ foorth_equal('$tdqm ', [[1,2]])
262
+
263
+ foorth_equal('3 $tdqm .push_right!', [])
264
+ foorth_equal('$tdqm ', [[1,2,3]])
265
+
266
+ foorth_equal('$tdqm .peek_left!', [1])
267
+ foorth_equal('$tdqm ', [[1,2,3]])
268
+ foorth_raises('[ ] .peek_left!')
269
+
270
+ foorth_equal('$tdqm .peek_right!', [3])
271
+ foorth_equal('$tdqm ', [[1,2,3]])
272
+ foorth_raises('[ ] .peek_right!')
273
+ end
274
+
275
+ def test_other_array_ops
276
+ foorth_equal('[ 0 1 2 ] .reverse ', [[2,1,0]])
277
+ foorth_equal('[ 9 3 5 ] .sort ', [[3,5,9]])
278
+
279
+ foorth_equal('[ 9 3 5 ] .length ', [3])
280
+
281
+ foorth_equal('[ 9 3 5 ] 0 << ', [[9,3,5,0]])
282
+ foorth_equal('[ 9 3 5 ] { } << ', [[9,3,5,{}]])
283
+ foorth_equal('[ 9 3 5 ] [ 4 1 ] << ', [[9,3,5,[4,1]]])
284
+ foorth_equal('[ 9 3 5 ] [ 4 1 ] << ', [[9,3,5,[4,1]]])
285
+
286
+ foorth_equal('[ 9 3 5 ] 0 + ', [[9,3,5,0]])
287
+ foorth_equal('[ 9 3 5 ] [ 0 ] + ', [[9,3,5,0]])
288
+ foorth_equal('[ 9 3 5 ] { } + ', [[9,3,5,{}]])
289
+
290
+ foorth_equal('[ "9" 3 5 ] .sort ', [[3,5,"9"]])
291
+ foorth_equal('[ 9 "3" 5 ] .sort ', [["3",5,9]])
292
+
293
+ foorth_equal('try [ 9 "apple" 5 ] .sort catch end', [])
294
+ end
295
+
296
+ def test_formatting_and_related
297
+ foorth_equal('[ 0 1 "hello" ] .strmax', [5])
298
+ end
299
+
300
+ def test_array_min_max
301
+ foorth_equal('[ 9 0 1 12 2 ] .min', [0])
302
+ foorth_equal('[ 9 0 1 12 2 ] .max', [12])
303
+
304
+ foorth_equal('[ "c" "d" "a" "g" "f" ] .min', ["a"])
305
+ foorth_equal('[ "c" "d" "a" "g" "f" ] .max', ["g"])
306
+
307
+ foorth_equal('[ "9" 0 1 "pear" ] .min', ["0"])
308
+ foorth_equal('[ "9" 0 1 "apple" ] .max', ["apple"])
309
+
310
+ foorth_raises('[ 9 0 1 "pear" ] .min')
311
+ foorth_raises('[ 9 0 1 "apple" ] .max')
312
+
313
+ foorth_equal('try [ 9 0 1 "pear" ] .min catch end', [])
314
+ foorth_equal('try [ 9 0 1 "pear" ] .max catch end', [])
315
+ end
316
+
317
+ def test_array_empty
318
+ foorth_equal('[ ] .empty?', [true])
319
+ foorth_equal('[ 1 2 3 ] .empty?', [false])
320
+ end
321
+
322
+ def test_array_split
323
+ foorth_equal('1 2 [ 3 4 ] .split', [1,2,3,4])
324
+ end
325
+
326
+ def test_array_join
327
+ foorth_equal('1 2 3 4 2 .join', [1,2,[3,4]])
328
+ foorth_raises('1 2 3 4 -2 .join')
329
+ foorth_raises('1 2 3 4 20 .join')
330
+ end
331
+
332
+ def test_scatter
333
+ foorth_equal('[ 1 2 3 ] .scatter', [1, 2, 3])
334
+ foorth_equal('5 6 [ 1 2 3 ] .scatter', [5, 6, 1, 2, 3])
335
+ end
336
+
337
+ def test_gather
338
+ foorth_equal(' gather', [[]])
339
+ foorth_equal(' 1 2 3 gather', [[1,2,3]])
340
+
341
+ foorth_equal(' 1 2 3 3 .gather', [[1,2,3]])
342
+ foorth_equal('5 6 1 2 3 3 .gather', [5,6,[1,2,3]])
343
+
344
+ foorth_raises('5 6 1 2 3 -1 .gather')
345
+ foorth_raises('5 6 1 2 3 0 .gather')
346
+ foorth_raises('5 6 1 2 3 9 .gather')
347
+ end
348
+
349
+ def test_array_to_s
350
+ foorth_equal('[ 1 2 3 ] .to_s', ["[ 1 2 3 ]"])
351
+ end
352
+
353
+ def test_compatibility_methods
354
+ foorth_equal('[ 2 4 6 8 ] .to_a ', [[2,4,6,8]])
355
+ foorth_equal('[ 2 4 6 8 ] .to_h ', [{0=>2, 1=>4, 2=>6, 3=>8}])
356
+ foorth_equal('[ 2 4 6 8 ] .values ', [[2,4,6,8]])
357
+ foorth_equal('[ 2 4 6 8 ] .keys ', [[0,1,2,3]])
358
+ end
359
+
360
+ end