skeem 0.2.14 → 0.2.18

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 (60) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +451 -195
  3. data/.travis.yml +27 -0
  4. data/CHANGELOG.md +35 -1
  5. data/Gemfile +2 -0
  6. data/README.md +125 -56
  7. data/Rakefile +2 -0
  8. data/appveyor.yml +3 -4
  9. data/bin/cubic.skm +4 -0
  10. data/bin/hello-world.skm +1 -0
  11. data/bin/skeem +72 -0
  12. data/lib/skeem/datum_dsl.rb +40 -30
  13. data/lib/skeem/element_visitor.rb +5 -2
  14. data/lib/skeem/grammar.rb +88 -26
  15. data/lib/skeem/interpreter.rb +9 -7
  16. data/lib/skeem/parser.rb +6 -4
  17. data/lib/skeem/primitive/primitive_builder.rb +148 -122
  18. data/lib/skeem/primitive/primitive_procedure.rb +23 -25
  19. data/lib/skeem/runtime.rb +17 -15
  20. data/lib/skeem/s_expr_builder.rb +49 -117
  21. data/lib/skeem/s_expr_nodes.rb +147 -132
  22. data/lib/skeem/skeem_exception.rb +1 -0
  23. data/lib/skeem/skm_binding.rb +9 -11
  24. data/lib/skeem/skm_compound_datum.rb +9 -6
  25. data/lib/skeem/skm_element.rb +15 -13
  26. data/lib/skeem/skm_empty_list.rb +6 -4
  27. data/lib/skeem/skm_exception.rb +9 -0
  28. data/lib/skeem/skm_expression.rb +3 -1
  29. data/lib/skeem/skm_frame.rb +3 -2
  30. data/lib/skeem/skm_pair.rb +26 -18
  31. data/lib/skeem/skm_procedure_exec.rb +11 -6
  32. data/lib/skeem/skm_simple_datum.rb +23 -20
  33. data/lib/skeem/skm_unary_expression.rb +34 -37
  34. data/lib/skeem/standard/base.skm +4 -0
  35. data/lib/skeem/tokenizer.rb +38 -28
  36. data/lib/skeem/version.rb +3 -1
  37. data/lib/skeem.rb +2 -0
  38. data/skeem.gemspec +9 -6
  39. data/spec/skeem/add4.skm +4 -0
  40. data/spec/skeem/datum_dsl_spec.rb +13 -12
  41. data/spec/skeem/element_visitor_spec.rb +14 -10
  42. data/spec/skeem/interpreter_spec.rb +84 -44
  43. data/spec/skeem/lambda_spec.rb +13 -11
  44. data/spec/skeem/parser_spec.rb +23 -19
  45. data/spec/skeem/primitive/primitive_builder_spec.rb +65 -48
  46. data/spec/skeem/primitive/primitive_procedure_spec.rb +14 -12
  47. data/spec/skeem/runtime_spec.rb +20 -18
  48. data/spec/skeem/s_expr_nodes_spec.rb +8 -6
  49. data/spec/skeem/skm_compound_datum_spec.rb +12 -10
  50. data/spec/skeem/skm_element_spec.rb +7 -5
  51. data/spec/skeem/skm_empty_list_spec.rb +7 -5
  52. data/spec/skeem/skm_frame_spec.rb +5 -4
  53. data/spec/skeem/skm_pair_spec.rb +9 -8
  54. data/spec/skeem/skm_procedure_exec_spec.rb +2 -0
  55. data/spec/skeem/skm_simple_datum_spec.rb +24 -22
  56. data/spec/skeem/skm_unary_expression_spec.rb +11 -9
  57. data/spec/skeem/tokenizer_spec.rb +54 -43
  58. data/spec/skeem_spec.rb +2 -0
  59. data/spec/spec_helper.rb +15 -10
  60. metadata +18 -10
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative '../spec_helper' # Use the RSpec framework
2
4
  require_relative '../../lib/skeem/tokenizer' # Load the class under test
3
5
 
@@ -12,14 +14,14 @@ module Skeem
12
14
  end
13
15
 
14
16
  # Assumption: subject is a Skeem::Tokenizer
15
- def check_tokens(tokenTests, tokType)
16
- tokenTests.each do |(input, prediction)|
17
+ def check_tokens(tokenTests, tokType)
18
+ tokenTests.each do |(input, prediction)|
17
19
  subject.reinitialize(input)
18
20
  token = subject.tokens.first
19
21
  expect(token.terminal).to eq(tokType)
20
22
  expect(token.lexeme).to eq(prediction)
21
- end
22
- end
23
+ end
24
+ end
23
25
 
24
26
  def unquoted(aString)
25
27
  aString.gsub(/(^")|("$)/, '')
@@ -46,8 +48,7 @@ module Skeem
46
48
  terminals = tokens.map(&:terminal)
47
49
  prediction = %w[LPAREN RPAREN APOSTROPHE
48
50
  GRAVE_ACCENT PERIOD
49
- COMMA COMMA_AT_SIGN
50
- ]
51
+ COMMA COMMA_AT_SIGN ]
51
52
  expect(terminals).to eq(prediction)
52
53
  end
53
54
  end # context
@@ -80,7 +81,7 @@ module Skeem
80
81
 
81
82
  check_tokens(tests, 'INTEGER')
82
83
  end
83
-
84
+
84
85
  it 'should tokenize integers with explicit radix 10' do
85
86
  tests = [
86
87
  # couple [raw input, expected]
@@ -106,7 +107,7 @@ module Skeem
106
107
  ]
107
108
 
108
109
  check_tokens(tests, 'INTEGER')
109
- end
110
+ end
110
111
  end # context
111
112
 
112
113
  context 'Rational literals recognition:' do
@@ -114,7 +115,7 @@ module Skeem
114
115
  tests = [
115
116
  # couple [raw input, expected]
116
117
  ['1/2', Rational(1, 2)],
117
- ['-22/7', -Rational(22, 7)],
118
+ ['-22/7', -Rational(22, 7)]
118
119
  ]
119
120
 
120
121
  check_tokens(tests, 'RATIONAL')
@@ -128,6 +129,7 @@ module Skeem
128
129
  end # context
129
130
 
130
131
  context 'Real number recognition:' do
132
+ # rubocop: disable Style/ExponentialNotation
131
133
  it 'should tokenize real numbers' do
132
134
  tests = [
133
135
  # couple [raw input, expected]
@@ -139,15 +141,16 @@ module Skeem
139
141
 
140
142
  check_tokens(tests, 'REAL')
141
143
  end
144
+ # rubocop: enable Style/ExponentialNotation
142
145
  end # context
143
146
 
144
147
  context 'Character literal recognition:' do
145
148
  it 'should tokenize named characters' do
146
149
  tests = [
147
150
  # couple [raw input, expected]
148
- ["#\\alarm", ?\a],
149
- ["#\\newline", ?\n],
150
- ["#\\return", ?\r]
151
+ ['#\alarm', ?\a],
152
+ ['#\newline', ?\n],
153
+ ['#\return', ?\r]
151
154
  ]
152
155
 
153
156
  check_tokens(tests, 'CHAR')
@@ -156,10 +159,10 @@ module Skeem
156
159
  it 'should tokenize escaped characters' do
157
160
  tests = [
158
161
  # couple [raw input, expected]
159
- ["#\\a", ?a],
160
- ["#\\A", ?A],
161
- ["#\\(", ?(],
162
- ["#\\ ", ?\s]
162
+ ['#\a', ?a],
163
+ ['#\A', ?A],
164
+ ['#\(', ?(],
165
+ ['#\ ', ?\s]
163
166
  ]
164
167
 
165
168
  check_tokens(tests, 'CHAR')
@@ -168,9 +171,9 @@ module Skeem
168
171
  it 'should tokenize hex-coded characters' do
169
172
  tests = [
170
173
  # couple [raw input, expected]
171
- ["#\\x07", ?\a],
172
- ["#\\x1B", ?\e],
173
- ["#\\x3BB", ?\u03bb]
174
+ ['#\x07', ?\a],
175
+ ['#\x1B', ?\e],
176
+ ['#\x3BB', ?\u03bb]
174
177
  ]
175
178
 
176
179
  check_tokens(tests, 'CHAR')
@@ -201,10 +204,10 @@ module Skeem
201
204
  # "\x03B1; is named GREEK SMALL LETTER ALPHA."
202
205
 
203
206
  context 'Identifier recognition:' do
204
- it 'should tokenize identifier' do
207
+ it 'should tokenize identifiers' do
205
208
  examples = [
206
209
  # Examples taken from R7RS document
207
- '...', '+', '+soup+', '<=?',
210
+ '+', '+soup+', '<=?',
208
211
  '->string', 'a34kTMNs', 'lambda',
209
212
  'list->vector', 'q', 'V17a',
210
213
  '|two words|', '|two\x20;words|',
@@ -222,6 +225,14 @@ module Skeem
222
225
  expect(token.lexeme).to eq(input)
223
226
  end
224
227
  end
228
+
229
+ it 'should recognize ellipsis' do
230
+ input = '...'
231
+ subject.reinitialize(input)
232
+ token = subject.tokens.first
233
+ expect(token.terminal).to eq('ELLIPSIS')
234
+ expect(token.lexeme).to eq(input)
235
+ end
225
236
  end # context
226
237
 
227
238
  context 'Vector recognition' do
@@ -233,7 +244,7 @@ module Skeem
233
244
  ['INTEGER', 0, 3],
234
245
  ['INTEGER', -2, 5],
235
246
  ['STRING_LIT', 'Sue', 8],
236
- ['RPAREN', ')', 13],
247
+ ['RPAREN', ')', 13]
237
248
  ]
238
249
  tokens = subject.tokens
239
250
  predictions.each_with_index do |(pr_terminal, pr_lexeme, pr_position), i|
@@ -255,7 +266,7 @@ module Skeem
255
266
  end
256
267
 
257
268
  it 'should skip trailing comments' do
258
- input = "\"Some text\"; Trailing comment"
269
+ input = '"Some text"; Trailing comment'
259
270
  subject.reinitialize(input)
260
271
  token = subject.tokens.first
261
272
  expect(token.terminal).to eq('STRING_LIT')
@@ -305,28 +316,28 @@ module Skeem
305
316
  context 'Scanning Scheme sample code' do
306
317
  it 'should produce a sequence of token objects' do
307
318
  # Deeper tokenizer testing
308
- source = "(define circle-area (lambda (r) (* pi (* r r))))"
319
+ source = '(define circle-area (lambda (r) (* pi (* r r))))'
309
320
  subject.reinitialize(source)
310
321
  predicted = [
311
- ['LPAREN', '('],
312
- ['DEFINE', 'define'],
313
- ['IDENTIFIER', 'circle-area'],
314
- ['LPAREN', '('],
315
- ['LAMBDA', 'lambda'],
316
- ['LPAREN', '('],
317
- ['IDENTIFIER', 'r'],
318
- ['RPAREN', ')'],
319
- ['LPAREN', '('],
320
- ['IDENTIFIER', '*'],
321
- ['IDENTIFIER', 'pi'],
322
- ['LPAREN', '('],
323
- ['IDENTIFIER', '*'],
324
- ['IDENTIFIER', 'r'],
325
- ['IDENTIFIER', 'r'],
326
- ['RPAREN', ')'],
327
- ['RPAREN', ')'],
328
- ['RPAREN', ')'],
329
- ['RPAREN', ')']
322
+ %w[LPAREN (],
323
+ %w[DEFINE define],
324
+ %w[IDENTIFIER circle-area],
325
+ %w[LPAREN (],
326
+ %w[LAMBDA lambda],
327
+ %w[LPAREN (],
328
+ %w[IDENTIFIER r],
329
+ %w[RPAREN )],
330
+ %w[LPAREN (],
331
+ %w[IDENTIFIER *],
332
+ %w[IDENTIFIER pi],
333
+ %w[LPAREN (],
334
+ %w[IDENTIFIER *],
335
+ %w[IDENTIFIER r],
336
+ %w[IDENTIFIER r],
337
+ %w[RPAREN )],
338
+ %w[RPAREN )],
339
+ %w[RPAREN )],
340
+ %w[RPAREN )]
330
341
  ]
331
342
  match_expectations(subject, predicted)
332
343
  end
data/spec/skeem_spec.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  RSpec.describe Skeem do
2
4
  it 'has a version number' do
3
5
  expect(Skeem::VERSION).not_to be nil
data/spec/spec_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/setup'
2
4
  require 'rspec' # Use the RSpec framework
3
5
  require_relative '../lib/skeem'
@@ -15,26 +17,29 @@ RSpec.configure do |config|
15
17
  config.full_backtrace = true
16
18
  end
17
19
 
20
+
18
21
  module InterpreterSpec
19
22
  def expect_expr(aSkeemExpr)
20
23
  result = subject.run(aSkeemExpr)
21
24
  expect(result)
22
25
  end
23
26
 
27
+ # rubocop: disable Lint/RescueException
28
+
24
29
  # This method assumes that 'subject' is a Skeem::Interpreter instance.
25
30
  def compare_to_predicted(arrActualsPredictions)
26
31
  arrActualsPredictions.each_with_index do |(source, predicted), index|
27
- begin
28
- result = subject.run(source)
29
- if block_given?
30
- yield result, predicted
31
- else
32
- expect(result).to eq(predicted)
33
- end
34
- rescue Exception => exc
35
- $stderr.puts "Row #{index + 1} failed."
36
- throw exc
32
+ result = subject.run(source)
33
+ if block_given?
34
+ yield result, predicted
35
+ else
36
+ expect(result).to eq(predicted)
37
37
  end
38
+
39
+ rescue Exception => e
40
+ $stderr.puts "Row #{index + 1} failed."
41
+ throw e
38
42
  end
39
43
  end
44
+ # rubocop: enable Lint/RescueException
40
45
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skeem
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.14
4
+ version: 0.2.18
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitri Geshef
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-29 00:00:00.000000000 Z
11
+ date: 2021-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rley
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '0.7'
19
+ version: 0.8.03
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '0.7'
26
+ version: 0.8.03
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -69,13 +69,15 @@ dependencies:
69
69
  description: " Skeem is a Scheme language interpreter implemented in Ruby.\n"
70
70
  email:
71
71
  - famished.tiger@yahoo.com
72
- executables: []
72
+ executables:
73
+ - skeem
73
74
  extensions: []
74
75
  extra_rdoc_files:
75
76
  - README.md
76
77
  files:
77
78
  - ".rspec"
78
79
  - ".rubocop.yml"
80
+ - ".travis.yml"
79
81
  - ".yardopts"
80
82
  - CHANGELOG.md
81
83
  - Gemfile
@@ -83,6 +85,9 @@ files:
83
85
  - README.md
84
86
  - Rakefile
85
87
  - appveyor.yml
88
+ - bin/cubic.skm
89
+ - bin/hello-world.skm
90
+ - bin/skeem
86
91
  - lib/skeem.rb
87
92
  - lib/skeem/datum_dsl.rb
88
93
  - lib/skeem/element_visitor.rb
@@ -94,10 +99,12 @@ files:
94
99
  - lib/skeem/runtime.rb
95
100
  - lib/skeem/s_expr_builder.rb
96
101
  - lib/skeem/s_expr_nodes.rb
102
+ - lib/skeem/skeem_exception.rb
97
103
  - lib/skeem/skm_binding.rb
98
104
  - lib/skeem/skm_compound_datum.rb
99
105
  - lib/skeem/skm_element.rb
100
106
  - lib/skeem/skm_empty_list.rb
107
+ - lib/skeem/skm_exception.rb
101
108
  - lib/skeem/skm_expression.rb
102
109
  - lib/skeem/skm_frame.rb
103
110
  - lib/skeem/skm_pair.rb
@@ -108,6 +115,7 @@ files:
108
115
  - lib/skeem/tokenizer.rb
109
116
  - lib/skeem/version.rb
110
117
  - skeem.gemspec
118
+ - spec/skeem/add4.skm
111
119
  - spec/skeem/datum_dsl_spec.rb
112
120
  - spec/skeem/element_visitor_spec.rb
113
121
  - spec/skeem/interpreter_spec.rb
@@ -132,7 +140,7 @@ homepage: https://github.com/famished-tiger/Skeem
132
140
  licenses:
133
141
  - MIT
134
142
  metadata: {}
135
- post_install_message:
143
+ post_install_message:
136
144
  rdoc_options:
137
145
  - --charset=UTF-8 --exclude="examples|spec"
138
146
  require_paths:
@@ -141,15 +149,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
141
149
  requirements:
142
150
  - - ">="
143
151
  - !ruby/object:Gem::Version
144
- version: '0'
152
+ version: 2.5.0
145
153
  required_rubygems_version: !ruby/object:Gem::Requirement
146
154
  requirements:
147
155
  - - ">="
148
156
  - !ruby/object:Gem::Version
149
157
  version: '0'
150
158
  requirements: []
151
- rubygems_version: 3.0.2
152
- signing_key:
159
+ rubygems_version: 3.1.4
160
+ signing_key:
153
161
  specification_version: 4
154
162
  summary: Skeem is an interpreter of a subset of the Scheme programming language. Scheme
155
163
  is a descendent of the Lisp language.