skeem 0.0.22 → 0.0.23

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4b1748ebcacd81d8e56ece9deb9a8087d28ebb50
4
- data.tar.gz: b4263783f841a2f3577c5cb885554f01f44c067e
3
+ metadata.gz: 46a43c0a96d793c7f042976ec034e9e261fe8198
4
+ data.tar.gz: 381a4e60b09bc4ffe797dce9ed62a40b53ec1225
5
5
  SHA512:
6
- metadata.gz: fda3cea9741f1b2da1016b41b90b7ff627e54d37a3c3ac851b5afe6f85eaab943e2a245e1bbde96796179a464c1bcc6e8384fe03aaed3a4a40efe71110ff9483
7
- data.tar.gz: 75fec756b836694aa1b2ac8874fbdb503017fb99328ce440ea9c8a45ea95f9a8232c5e16e8e5288aa4a3144c52d4de37ebfb22d1a913e1abd71886ea0c412cd7
6
+ metadata.gz: e7dc6aa941a1e5fc4940b4d35df274ac08cf3064990dd033af703d3e72afc59f7abfd19249c24574162fdac5e72fb74425e54303780df215764fb800d19b4cb6
7
+ data.tar.gz: a716f8595373f25da0796eb58c07f53d47bb83db183fe0d969226ff3216993198f5c9a47cb6bea7e3e578e539eb1760c9effbf8426483b59fcd34058be5c362a
data/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## [0.0.23] - 2018-10-24
2
+ ### Added
3
+ - File `primitive_builder.rb` implementation of: standard `or`, `string->symbol`, `number->string`, `string-append` procedures.
4
+
5
+ ### Changed
6
+ - File `README.md` udpated to reflect currently implemented features.
7
+
8
+ ### Fixed
9
+ - Method `Convertible#to_skm` Now converts String argument into `SkmString` and raises an exception when unable to convert.
10
+
1
11
  ## [0.0.22] - 2018-10-23
2
12
  ### Added
3
13
  - Class `SkmBuilder`added support for list datum.
@@ -6,7 +16,6 @@
6
16
  ### Fixed
7
17
  - File `interpreter_spec.rb` Added test example of list quotation.
8
18
 
9
-
10
19
  ## [0.0.21] - 2018-10-22
11
20
  ### Added
12
21
  - Added support for alternative `define` syntax.
data/README.md CHANGED
@@ -125,6 +125,8 @@ Here are a few other ones:
125
125
  - Vectors: `#(1 2 "three")`
126
126
 
127
127
  ### Scheme Expressions
128
+ - Constant literals
129
+ - Quotations
128
130
  - Variable references
129
131
  - Procedure calls
130
132
  - Lambda expressions
@@ -145,20 +147,25 @@ __Syntax:__
145
147
  * (if <test\> <consequent\> <alternate\>)
146
148
 
147
149
 
148
-
149
150
  #### lambda
150
151
  __Purpose:__ Definition of a procedure.
151
152
  __Syntax:__
152
153
  * (lambda <formals\> <body\>)
153
154
 
155
+ #### quote
156
+ __Purpose:__ Quoting an expression (leave it unevaluated).
157
+ __Syntax:__
158
+ * (quote <datum\>)
159
+ * '<datum\>
160
+
154
161
  ### Standard library
155
162
  This section lists the implemented standard procedures
156
163
 
157
164
  #### Boolean procedures
158
- * `boolean?`, `not`
165
+ * `boolean?`, `and`, `or`, `not`
159
166
 
160
167
  #### Numerical operations
161
- * Number-level: `number?`, `real?`, `integer?`, `zero?`, `+`, `-`, `*`, `/`, `=`, `square`
168
+ * Number-level: `number?`, `real?`, `integer?`, `zero?`, `+`, `-`, `*`, `/`, `=`, `square`, `number->string`
162
169
  * Real-level: `positive?`, `negative?`, `<`, `>`, `<=`, `>=`, `abs`, `floor-remainder`
163
170
  * Integer-level: `even?`, `odd?`
164
171
 
@@ -166,7 +173,7 @@ This section lists the implemented standard procedures
166
173
  * `list?`, `null?`, `list`, `length`
167
174
 
168
175
  #### String procedures
169
- * `string?`
176
+ * `string?`, `string-append`, `string->symbol`,
170
177
 
171
178
  #### Symbol procedures
172
179
  * `symbol?`
@@ -13,6 +13,10 @@ module Skeem
13
13
  SkmReal.create(native_obj)
14
14
  when Integer
15
15
  SkmInteger.create(native_obj)
16
+ when String
17
+ SkmString.create(native_obj)
18
+ else
19
+ raise StandardError, "No conversion of #{native_obj.class}"
16
20
  end
17
21
  end
18
22
  end # module
@@ -8,7 +8,7 @@ module Skeem
8
8
  def add_primitives(aRuntime)
9
9
  add_arithmetic(aRuntime)
10
10
  add_comparison(aRuntime)
11
- add_number_predicates(aRuntime)
11
+ add_number_procedures(aRuntime)
12
12
  add_boolean_procedures(aRuntime)
13
13
  add_string_procedures(aRuntime)
14
14
  add_symbol_procedures(aRuntime)
@@ -56,20 +56,24 @@ module Skeem
56
56
  create_gte(aRuntime)
57
57
  end
58
58
 
59
- def add_number_predicates(aRuntime)
59
+ def add_number_procedures(aRuntime)
60
60
  create_object_predicate(aRuntime, 'number?')
61
61
  create_object_predicate(aRuntime, 'real?')
62
62
  create_object_predicate(aRuntime, 'integer?')
63
+ create_number2string(aRuntime)
63
64
  end
64
65
 
65
66
  def add_boolean_procedures(aRuntime)
66
67
  create_not(aRuntime)
67
68
  create_and(aRuntime)
69
+ create_or(aRuntime)
68
70
  create_object_predicate(aRuntime, 'boolean?')
69
71
  end
70
72
 
71
73
  def add_string_procedures(aRuntime)
72
74
  create_object_predicate(aRuntime, 'string?')
75
+ create_string_append(aRuntime)
76
+ create_string2symbol(aRuntime)
73
77
  end
74
78
 
75
79
  def add_symbol_procedures(aRuntime)
@@ -267,6 +271,17 @@ module Skeem
267
271
  define_primitive_proc(aRuntime, '>=', one_or_more, primitive)
268
272
  end
269
273
 
274
+ def create_number2string(aRuntime)
275
+ # TODO: add support for radix argument
276
+ primitive = ->(runtime, arg) do
277
+ arg_evaluated = arg.evaluate(runtime)
278
+ check_argtype(arg_evaluated, SkmNumber, 'number', 'number->string')
279
+ to_skm(arg_evaluated.value.to_s)
280
+ end
281
+
282
+ define_primitive_proc(aRuntime, 'number->string', unary, primitive)
283
+ end
284
+
270
285
  def create_not(aRuntime)
271
286
  primitive = ->(runtime, arg) do
272
287
  arg_evaluated = arg.evaluate(runtime)
@@ -279,7 +294,7 @@ module Skeem
279
294
 
280
295
  define_primitive_proc(aRuntime, 'not', unary, primitive)
281
296
  end
282
-
297
+
283
298
  def create_and(aRuntime)
284
299
  # arglist should be a Ruby Array
285
300
  primitive = ->(runtime, arglist) do
@@ -298,7 +313,53 @@ module Skeem
298
313
  to_skm(raw_result)
299
314
  end
300
315
  end
301
- define_primitive_proc(aRuntime, 'and', zero_or_more, primitive)
316
+ define_primitive_proc(aRuntime, 'and', zero_or_more, primitive)
317
+ end
318
+
319
+ def create_or(aRuntime)
320
+ # arglist should be a Ruby Array
321
+ primitive = ->(runtime, arglist) do
322
+ if arglist.empty?
323
+ to_skm(false) # in conformance with 4.2.1
324
+ else
325
+ raw_result = false
326
+ last_result = nil
327
+ arglist.each do |raw_arg|
328
+ argument = raw_arg.evaluate(aRuntime)
329
+ last_result = argument
330
+ raw_result ||= (!argument.boolean? || argument.value)
331
+ break if raw_result
332
+ end
333
+ raw_result = last_result if raw_result
334
+ to_skm(raw_result)
335
+ end
336
+ end
337
+ define_primitive_proc(aRuntime, 'or', zero_or_more, primitive)
338
+ end
339
+
340
+ def create_string_append(aRuntime)
341
+ primitive = ->(runtime, arglist) do
342
+ if arglist.empty?
343
+ value = ''
344
+ else
345
+ parts = evaluate_array(arglist, aRuntime)
346
+ value = parts.reduce('') { |interim, substr| interim << substr.value }
347
+ end
348
+
349
+ SkmString.create(value)
350
+ end
351
+
352
+ define_primitive_proc(aRuntime, 'string-append', zero_or_more, primitive)
353
+ end
354
+
355
+ def create_string2symbol(aRuntime)
356
+ primitive = ->(runtime, arg) do
357
+ arg_evaluated = arg.evaluate(runtime)
358
+ check_argtype(arg_evaluated, SkmString, 'string', 'string->symbol')
359
+ SkmIdentifier.create(arg_evaluated.value)
360
+ end
361
+
362
+ define_primitive_proc(aRuntime, 'string->symbol', unary, primitive)
302
363
  end
303
364
 
304
365
  def create_length(aRuntime)
data/lib/skeem/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Skeem
2
- VERSION = '0.0.22'.freeze
2
+ VERSION = '0.0.23'.freeze
3
3
  end
@@ -148,7 +148,7 @@ module Skeem
148
148
  end
149
149
  end # context
150
150
 
151
- context 'Number predicates:' do
151
+ context 'Number procedures:' do
152
152
  it 'should implement the number? predicate' do
153
153
  checks = [
154
154
  ['(number? 3.1)', true],
@@ -161,7 +161,7 @@ module Skeem
161
161
  expect(result.value).to eq(expectation)
162
162
  end
163
163
  end
164
-
164
+
165
165
  it 'should implement the real? predicate' do
166
166
  checks = [
167
167
  ['(real? 3.1)', true],
@@ -188,8 +188,21 @@ module Skeem
188
188
  expect(result.value).to eq(expectation)
189
189
  end
190
190
  end
191
+
192
+ it 'should implement the number->string procedure' do
193
+ checks = [
194
+ ['(number->string 3.4)', '3.4'],
195
+ ['(number->string 1e2)', '100.0'],
196
+ ['(number->string 1e-23)', '1.0e-23'],
197
+ ['(number->string -7)', '-7']
198
+ ]
199
+ checks.each do |(skeem_expr, expectation)|
200
+ result = subject.run(skeem_expr)
201
+ expect(result.value).to eq(expectation)
202
+ end
203
+ end
191
204
  end # context
192
-
205
+
193
206
  context 'Boolean procedures:' do
194
207
  it 'should implement the not procedure' do
195
208
  checks = [
@@ -202,7 +215,7 @@ module Skeem
202
215
  expect(result.value).to eq(expectation)
203
216
  end
204
217
  end
205
-
218
+
206
219
  it 'should implement the and procedure' do
207
220
  checks = [
208
221
  ['(and (= 2 2) (> 2 1))', true],
@@ -213,14 +226,39 @@ module Skeem
213
226
  result = subject.run(skeem_expr)
214
227
  expect(result.value).to eq(expectation)
215
228
  end
216
-
229
+
217
230
  # If all the expressions evaluate to true values,
218
231
  # the values of the last expression are returned.
219
232
  source = "(and 1 2 'c '(f g))"
220
233
  result = subject.run(source)
221
- p result
222
- end
223
-
234
+ expect(result).to be_kind_of(SkmList)
235
+ expect(result.head.value).to eq('f')
236
+ expect(result.last.value).to eq('g')
237
+ end
238
+
239
+ it 'should implement the or procedure' do
240
+ checks = [
241
+ ['(or (= 2 2) (> 2 1))', true],
242
+ ['(or (= 2 2) (< 2 1))', true],
243
+ ['(or)', false],
244
+ ['(or #f)', false],
245
+ ['(or #f #t)', true],
246
+ ['(or #f #f #f)', false],
247
+
248
+ ]
249
+ checks.each do |(skeem_expr, expectation)|
250
+ result = subject.run(skeem_expr)
251
+ expect(result.value).to eq(expectation)
252
+ end
253
+
254
+ # When an expression evaluates to true value,
255
+ # the values of the this expression is returned.
256
+ source = "(or #f 'a #f)"
257
+ result = subject.run(source)
258
+ expect(result).to be_kind_of(SkmIdentifier)
259
+ expect(result.value).to eq('a')
260
+ end
261
+
224
262
  it 'should implement the boolean? procedure' do
225
263
  checks = [
226
264
  ['(boolean? #f)', true],
@@ -230,9 +268,9 @@ module Skeem
230
268
  result = subject.run(skeem_expr)
231
269
  expect(result.value).to eq(expectation)
232
270
  end
233
- end
271
+ end
234
272
  end # context
235
-
273
+
236
274
  context 'String procedures:' do
237
275
  it 'should implement the string? procedure' do
238
276
  checks = [
@@ -244,10 +282,32 @@ module Skeem
244
282
  result = subject.run(skeem_expr)
245
283
  expect(result.value).to eq(expectation)
246
284
  end
247
- end
285
+ end
286
+
287
+ it 'should implement the string->symbol procedure' do
288
+ checks = [
289
+ ['(string->symbol "mISSISSIppi")', 'mISSISSIppi']
290
+ ]
291
+ checks.each do |(skeem_expr, expectation)|
292
+ result = subject.run(skeem_expr)
293
+ expect(result.value).to eq(expectation)
294
+ end
295
+ end
296
+
297
+ it 'should implement the string-append procedure' do
298
+ checks = [
299
+ ['(string-append)', ''],
300
+ ['(string-append "abc" "def")', 'abcdef'],
301
+ ['(string-append "Hey " "you " "there!")', 'Hey you there!']
302
+ ]
303
+ checks.each do |(skeem_expr, expectation)|
304
+ result = subject.run(skeem_expr)
305
+ expect(result.value).to eq(expectation)
306
+ end
307
+ end
248
308
  end # context
249
-
250
- context 'Symbol procedures:' do
309
+
310
+ context 'Symbol procedures:' do
251
311
  it 'should implement the symbol? procedure' do
252
312
  checks = [
253
313
  ['(symbol? #f)', false],
@@ -259,8 +319,8 @@ module Skeem
259
319
  end
260
320
  end
261
321
  end # context
262
-
263
- context 'List procedures:' do
322
+
323
+ context 'List procedures:' do
264
324
  it 'should implement the list? procedure' do
265
325
  checks = [
266
326
  ['(list? #f)', false],
@@ -274,7 +334,7 @@ module Skeem
274
334
  expect(result.value).to eq(expectation)
275
335
  end
276
336
  end
277
-
337
+
278
338
  it 'should implement the null? procedure' do
279
339
  checks = [
280
340
  ['(null? #f)', false],
@@ -289,7 +349,7 @@ module Skeem
289
349
  result = subject.run(skeem_expr)
290
350
  expect(result.value).to eq(expectation)
291
351
  end
292
- end
352
+ end
293
353
 
294
354
  it 'should implement the length procedure' do
295
355
  checks = [
@@ -302,10 +362,10 @@ module Skeem
302
362
  result = subject.run(skeem_expr)
303
363
  expect(result.value).to eq(expectation)
304
364
  end
305
- end
306
- end # context
365
+ end
366
+ end # context
307
367
 
308
- context 'Vector procedures:' do
368
+ context 'Vector procedures:' do
309
369
  it 'should implement the vector? procedure' do
310
370
  checks = [
311
371
  ['(vector? #f)', false],
@@ -319,13 +379,13 @@ module Skeem
319
379
  expect(result.value).to eq(expectation)
320
380
  end
321
381
  end
322
-
382
+
323
383
  it 'should implement the vector procedure' do
324
384
  source = '(vector)'
325
385
  result = subject.run(source)
326
386
  expect(result).to be_kind_of(SkmVector)
327
387
  expect(result).to be_empty
328
-
388
+
329
389
  source = '(vector 1 2 3)'
330
390
  result = subject.run(source)
331
391
  expect(result).to be_kind_of(SkmVector)
@@ -346,17 +406,17 @@ module Skeem
346
406
  result = subject.run(skeem_expr)
347
407
  expect(result.value).to eq(expectation)
348
408
  end
349
- end
409
+ end
350
410
 
351
411
  it 'should implement the vector-ref procedure' do
352
412
  source = "(vector-ref '#(1 1 2 3 5 8 13 21) 5)"
353
413
  result = subject.run(source)
354
414
  expect(result).to be_kind_of(SkmInteger)
355
- expect(result.value).to eq(8)
356
- end
357
- end # context
358
-
359
- context 'IO procedures:' do
415
+ expect(result.value).to eq(8)
416
+ end
417
+ end # context
418
+
419
+ context 'IO procedures:' do
360
420
  it 'should implement the newline procedure' do
361
421
  default_stdout = $stdout
362
422
  $stdout = StringIO.new()
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.0.22
4
+ version: 0.0.23
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dimitri Geshef
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-23 00:00:00.000000000 Z
11
+ date: 2018-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rley