skeem 0.0.23 → 0.0.24

Sign up to get free protection for your applications and to get access to all the features.
@@ -39,7 +39,7 @@ module Skeem
39
39
  samples.each do |source, predicted|
40
40
  result = subject.run(source)
41
41
  expect(result).to be_kind_of(SkmBoolean)
42
- expect(result.value).to eq(predicted)
42
+ expect(result).to eq(predicted)
43
43
  end
44
44
  end
45
45
 
@@ -54,7 +54,7 @@ module Skeem
54
54
  samples.each do |source, predicted|
55
55
  result = subject.run(source)
56
56
  expect(result).to be_kind_of(SkmInteger)
57
- expect(result.value).to eq(predicted)
57
+ expect(result).to eq(predicted)
58
58
  end
59
59
  end
60
60
 
@@ -69,7 +69,7 @@ module Skeem
69
69
  samples.each do |source, predicted|
70
70
  result = subject.run(source)
71
71
  expect(result).to be_kind_of(SkmReal)
72
- expect(result.value).to eq(predicted)
72
+ expect(result).to eq(predicted)
73
73
  end
74
74
  end
75
75
 
@@ -80,7 +80,7 @@ module Skeem
80
80
  samples.each do |source, predicted|
81
81
  result = subject.run(source)
82
82
  expect(result).to be_kind_of(SkmString)
83
- expect(result.value).to eq(predicted)
83
+ expect(result).to eq(predicted)
84
84
  end
85
85
  end
86
86
 
@@ -95,8 +95,8 @@ module Skeem
95
95
  [SkmString, 'Sat']
96
96
  ]
97
97
  predictions.each_with_index do |(type, value), index|
98
- expect(result.elements[index]).to be_kind_of(type)
99
- expect(result.elements[index].value).to eq(value)
98
+ expect(result.members[index]).to be_kind_of(type)
99
+ expect(result.members[index]).to eq(value)
100
100
  end
101
101
  end
102
102
  end # context
@@ -116,7 +116,7 @@ SKEEM
116
116
  result = subject.run(source)
117
117
  end_result = result.last
118
118
  expect(end_result).to be_kind_of(SkmInteger)
119
- expect(end_result.value).to eq(28)
119
+ expect(end_result).to eq(28)
120
120
  end
121
121
 
122
122
  it 'should implement the simple conditional form' do
@@ -126,7 +126,7 @@ SKEEM
126
126
  ]
127
127
  checks.each do |(skeem_expr, expectation)|
128
128
  result = subject.run(skeem_expr)
129
- expect(result.value).to eq(expectation)
129
+ expect(result).to eq(expectation)
130
130
  end
131
131
  end
132
132
 
@@ -137,7 +137,7 @@ SKEEM
137
137
  ]
138
138
  checks.each do |(skeem_expr, expectation)|
139
139
  result = subject.run(skeem_expr)
140
- expect(result.value).to eq(expectation)
140
+ expect(result).to eq(expectation)
141
141
  end
142
142
  source = <<-SKEEM
143
143
  ; Example from R7RS section 4.1.5
@@ -146,7 +146,7 @@ SKEEM
146
146
  (+ 3 2))
147
147
  SKEEM
148
148
  result = subject.run(source)
149
- expect(result.value).to eq(1)
149
+ expect(result).to eq(1)
150
150
  end
151
151
 
152
152
  it 'should implement the quotation of constant literals' do
@@ -162,7 +162,7 @@ SKEEM
162
162
  ]
163
163
  checks.each do |(skeem_expr, expectation)|
164
164
  result = subject.run(skeem_expr)
165
- expect(result.value).to eq(expectation)
165
+ expect(result).to eq(expectation)
166
166
  end
167
167
  end
168
168
 
@@ -176,8 +176,8 @@ SKEEM
176
176
  [SkmIdentifier, 'c']
177
177
  ]
178
178
  predictions.each_with_index do |(type, value), index|
179
- expect(result.elements[index]).to be_kind_of(type)
180
- expect(result.elements[index].value).to eq(value)
179
+ expect(result.members[index]).to be_kind_of(type)
180
+ expect(result.members[index]).to eq(value)
181
181
  end
182
182
  end
183
183
 
@@ -192,13 +192,13 @@ SKEEM
192
192
  ]
193
193
  predictions.each_with_index do |(type, value), index|
194
194
  expect(result.members[index]).to be_kind_of(type)
195
- expect(result.members[index].value).to eq(value)
195
+ expect(result.members[index]).to eq(value)
196
196
  end
197
-
197
+
198
198
  source = "'()"
199
199
  result = subject.run(source)
200
200
  expect(result).to be_kind_of(SkmList)
201
- expect(result).to be_empty
201
+ expect(result).to be_null
202
202
  end
203
203
 
204
204
  it 'should implement the lambda function with one arg' do
@@ -212,11 +212,11 @@ SKEEM
212
212
  procedure = subject.fetch('abs').expression
213
213
  expect(procedure.arity).to eq(1)
214
214
  result = subject.run('(abs -3)')
215
- expect(result.value).to eq(3)
215
+ expect(result).to eq(3)
216
216
  result = subject.run('(abs 0)')
217
- expect(result.value).to eq(0)
217
+ expect(result).to eq(0)
218
218
  result = subject.run('(abs 3)')
219
- expect(result.value).to eq(3)
219
+ expect(result).to eq(3)
220
220
  end
221
221
 
222
222
  it 'should implement the lambda function with two args' do
@@ -230,11 +230,11 @@ SKEEM
230
230
  procedure = subject.fetch('min').expression
231
231
  expect(procedure.arity).to eq(2)
232
232
  result = subject.run('(min 1 2)')
233
- expect(result.value).to eq(1)
233
+ expect(result).to eq(1)
234
234
  result = subject.run('(min 2 1)')
235
- expect(result.value).to eq(1)
235
+ expect(result).to eq(1)
236
236
  result = subject.run('(min 2 2)')
237
- expect(result.value).to eq(2)
237
+ expect(result).to eq(2)
238
238
  end
239
239
 
240
240
  it 'should implement recursive functions' do
@@ -253,7 +253,7 @@ SKEEM
253
253
  it 'should accept calls to anonymous procedures' do
254
254
  source = '((lambda (x) (+ x x)) 4)'
255
255
  result = subject.run(source)
256
- expect(result.value).to eq(8)
256
+ expect(result).to eq(8)
257
257
  end
258
258
 
259
259
  it 'should support procedures with variable number of arguments' do
@@ -270,8 +270,8 @@ SKEEM
270
270
  result = subject.run(source)
271
271
  expect(result).to be_kind_of(SkmList)
272
272
  expect(result.length).to eq(2)
273
- expect(result.head.value).to eq(5)
274
- expect(result.last.value).to eq(6)
273
+ expect(result.head).to eq(5)
274
+ expect(result.last).to eq(6)
275
275
  end
276
276
 
277
277
  it 'should implement the compact define + lambda syntax' do
@@ -297,17 +297,107 @@ SKEEM
297
297
  end
298
298
  end # context
299
299
 
300
+ context 'Quasiquotation:' do
301
+ it 'should implement the quasiquotation of constant literals' do
302
+ checks = [
303
+ ['(quasiquote a)', 'a'],
304
+ ['(quasiquote 145932)', 145932],
305
+ ['(quasiquote "abc")', 'abc'],
306
+ ['(quasiquote #t)', true],
307
+ ['`a', 'a'],
308
+ ['`145932', 145932],
309
+ ['`"abc"', 'abc'],
310
+ ['`#t', true]
311
+ ]
312
+ checks.each do |(skeem_expr, expectation)|
313
+ result = subject.run(skeem_expr)
314
+ expect(result).to eq(expectation)
315
+ end
316
+ end
317
+
318
+ it 'should implement the quasiquotation of vectors' do
319
+ source = '(quasiquote #(a b c))'
320
+ result = subject.run(source)
321
+ expect(result).to be_kind_of(SkmVector)
322
+ predictions = [
323
+ [SkmIdentifier, 'a'],
324
+ [SkmIdentifier, 'b'],
325
+ [SkmIdentifier, 'c']
326
+ ]
327
+ predictions.each_with_index do |(type, value), index|
328
+ expect(result.members[index]).to be_kind_of(type)
329
+ expect(result.members[index]).to eq(value)
330
+ end
331
+ end
332
+
333
+ it 'should implement the quasiquotation of lists' do
334
+ source = '(quasiquote (+ 1 2))'
335
+ result = subject.run(source)
336
+ expect(result).to be_kind_of(SkmList)
337
+ predictions = [
338
+ [SkmIdentifier, '+'],
339
+ [SkmInteger, 1],
340
+ [SkmInteger, 2]
341
+ ]
342
+ predictions.each_with_index do |(type, value), index|
343
+ expect(result.members[index]).to be_kind_of(type)
344
+ expect(result.members[index]).to eq(value)
345
+ end
346
+
347
+ source = "`()"
348
+ result = subject.run(source)
349
+ expect(result).to be_kind_of(SkmList)
350
+ expect(result).to be_null
351
+ end
352
+
353
+ it 'should implement the unquote of lists' do
354
+ source = '`(list ,(+ 1 2) 4)'
355
+ result = subject.run(source)
356
+ expect(result).to be_kind_of(SkmList)
357
+ predictions = [
358
+ [SkmIdentifier, 'list'],
359
+ [SkmInteger, 3],
360
+ [SkmInteger, 4]
361
+ ]
362
+ predictions.each_with_index do |(type, value), index|
363
+ expect(result.members[index]).to be_kind_of(type)
364
+ expect(result.members[index]).to eq(value)
365
+ end
366
+
367
+ source = "`()"
368
+ result = subject.run(source)
369
+ expect(result).to be_kind_of(SkmList)
370
+ expect(result).to be_null
371
+ end
372
+ =begin
373
+ `(+ 2 ,(* 3 4)) (+ 2 12)
374
+ `(a b (,(+ 2 3) c) d) (a b (5 c) d)
375
+ `(a b ,(reverse '(c d e)) f g) (a b (e d c) f g)
376
+ (let ([a 1] [b 2])
377
+ `(,a . ,b)) (1 . 2)
378
+
379
+ `(+ ,@(cdr '(* 2 3))) (+ 2 3)
380
+ `(a b ,@(reverse '(c d e)) f g) (a b e d c f g)
381
+ (let ([a 1] [b 2])
382
+ `(,a ,@b)) (1 . 2)
383
+ `#(,@(list 1 2 3)) #(1 2 3)
384
+
385
+ '`,(cons 'a 'b) `,(cons 'a 'b)
386
+ `',(cons 'a 'b) '(a . b)
387
+ =end
388
+ end # context
389
+
300
390
  context 'Built-in primitive procedures' do
301
391
  it 'should implement the division of numbers' do
302
392
  result = subject.run('(/ 24 3)')
303
393
  expect(result).to be_kind_of(SkmInteger)
304
- expect(result.value).to eq(8)
394
+ expect(result).to eq(8)
305
395
  end
306
396
 
307
397
  it 'should handle arithmetic expressions' do
308
398
  result = subject.run('(+ (* 2 100) (* 1 10))')
309
399
  expect(result).to be_kind_of(SkmInteger)
310
- expect(result.value).to eq(210)
400
+ expect(result).to eq(210)
311
401
  end
312
402
  end # context
313
403
 
@@ -323,7 +413,7 @@ SKEEM
323
413
  ]
324
414
  checks.each do |(skeem_expr, expectation)|
325
415
  result = subject.run(skeem_expr)
326
- expect(result.value).to eq(expectation)
416
+ expect(result).to eq(expectation)
327
417
  end
328
418
  end
329
419
 
@@ -338,7 +428,7 @@ SKEEM
338
428
  ]
339
429
  checks.each do |(skeem_expr, expectation)|
340
430
  result = subject.run(skeem_expr)
341
- expect(result.value).to eq(expectation)
431
+ expect(result).to eq(expectation)
342
432
  end
343
433
  end
344
434
 
@@ -353,7 +443,7 @@ SKEEM
353
443
  ]
354
444
  checks.each do |(skeem_expr, expectation)|
355
445
  result = subject.run(skeem_expr)
356
- expect(result.value).to eq(expectation)
446
+ expect(result).to eq(expectation)
357
447
  end
358
448
  end
359
449
 
@@ -368,7 +458,7 @@ SKEEM
368
458
  ]
369
459
  checks.each do |(skeem_expr, expectation)|
370
460
  result = subject.run(skeem_expr)
371
- expect(result.value).to eq(expectation)
461
+ expect(result).to eq(expectation)
372
462
  end
373
463
  end
374
464
 
@@ -381,7 +471,7 @@ SKEEM
381
471
  ]
382
472
  checks.each do |(skeem_expr, expectation)|
383
473
  result = subject.run(skeem_expr)
384
- expect(result.value).to eq(expectation)
474
+ expect(result).to eq(expectation)
385
475
  end
386
476
  end
387
477
 
@@ -394,7 +484,7 @@ SKEEM
394
484
  ]
395
485
  checks.each do |(skeem_expr, expectation)|
396
486
  result = subject.run(skeem_expr)
397
- expect(result.value).to eq(expectation)
487
+ expect(result).to eq(expectation)
398
488
  end
399
489
  end
400
490
 
@@ -409,7 +499,7 @@ SKEEM
409
499
  ]
410
500
  checks.each do |(skeem_expr, expectation)|
411
501
  result = subject.run(skeem_expr)
412
- expect(result.value).to eq(expectation)
502
+ expect(result).to eq(expectation)
413
503
  end
414
504
  end
415
505
 
@@ -421,7 +511,7 @@ SKEEM
421
511
  ]
422
512
  checks.each do |(skeem_expr, expectation)|
423
513
  result = subject.run(skeem_expr)
424
- expect(result.value).to eq(expectation)
514
+ expect(result).to eq(expectation)
425
515
  end
426
516
  end
427
517
 
@@ -433,7 +523,7 @@ SKEEM
433
523
  ]
434
524
  checks.each do |(skeem_expr, expectation)|
435
525
  result = subject.run(skeem_expr)
436
- expect(result.members.map(&:value)).to eq(expectation)
526
+ expect(result.members).to eq(expectation)
437
527
  end
438
528
  end
439
529
  end # context
@@ -16,7 +16,7 @@ module Skeem
16
16
  ['(+ 2 2.34)', 4.34]
17
17
  ].each do |(expr, predicted)|
18
18
  result = subject.run(expr)
19
- expect(result.value).to eq(predicted)
19
+ expect(result).to eq(predicted)
20
20
  end
21
21
  end
22
22
 
@@ -27,7 +27,7 @@ module Skeem
27
27
  ['(- 3 4 5)', -6] # '-' as variadic operator. Example from section 6.2.6
28
28
  ].each do |(expr, predicted)|
29
29
  result = subject.run(expr)
30
- expect(result.value).to eq(predicted)
30
+ expect(result).to eq(predicted)
31
31
  end
32
32
  end
33
33
 
@@ -39,7 +39,7 @@ module Skeem
39
39
  ['(* 2 3 4 5)', 120] # '*' as variadic operator.
40
40
  ].each do |(expr, predicted)|
41
41
  result = subject.run(expr)
42
- expect(result.value).to eq(predicted)
42
+ expect(result).to eq(predicted)
43
43
  end
44
44
  end
45
45
 
@@ -50,7 +50,7 @@ module Skeem
50
50
  ['(/ 3 4 5)', 3.0/20] # '/' as variadic operator. Example from section 6.2.6
51
51
  ].each do |(expr, predicted)|
52
52
  result = subject.run(expr)
53
- expect(result.value).to eq(predicted)
53
+ expect(result).to eq(predicted)
54
54
  end
55
55
  end
56
56
 
@@ -64,7 +64,7 @@ module Skeem
64
64
  ]
65
65
  checks.each do |(skeem_expr, expectation)|
66
66
  result = subject.run(skeem_expr)
67
- expect(result.value).to eq(expectation)
67
+ expect(result).to eq(expectation)
68
68
  end
69
69
  end
70
70
  end # context
@@ -81,7 +81,7 @@ module Skeem
81
81
  ]
82
82
  checks.each do |(skeem_expr, expectation)|
83
83
  result = subject.run(skeem_expr)
84
- expect(result.value).to eq(expectation)
84
+ expect(result).to eq(expectation)
85
85
  end
86
86
  end
87
87
 
@@ -111,7 +111,7 @@ module Skeem
111
111
  ]
112
112
  checks.each do |(skeem_expr, expectation)|
113
113
  result = subject.run(skeem_expr)
114
- expect(result.value).to eq(expectation)
114
+ expect(result).to eq(expectation)
115
115
  end
116
116
  end
117
117
 
@@ -127,7 +127,7 @@ module Skeem
127
127
  ]
128
128
  checks.each do |(skeem_expr, expectation)|
129
129
  result = subject.run(skeem_expr)
130
- expect(result.value).to eq(expectation)
130
+ expect(result).to eq(expectation)
131
131
  end
132
132
  end
133
133
 
@@ -143,7 +143,7 @@ module Skeem
143
143
  ]
144
144
  checks.each do |(skeem_expr, expectation)|
145
145
  result = subject.run(skeem_expr)
146
- expect(result.value).to eq(expectation)
146
+ expect(result).to eq(expectation)
147
147
  end
148
148
  end
149
149
  end # context
@@ -158,7 +158,7 @@ module Skeem
158
158
  ]
159
159
  checks.each do |(skeem_expr, expectation)|
160
160
  result = subject.run(skeem_expr)
161
- expect(result.value).to eq(expectation)
161
+ expect(result).to eq(expectation)
162
162
  end
163
163
  end
164
164
 
@@ -171,7 +171,7 @@ module Skeem
171
171
  ]
172
172
  checks.each do |(skeem_expr, expectation)|
173
173
  result = subject.run(skeem_expr)
174
- expect(result.value).to eq(expectation)
174
+ expect(result).to eq(expectation)
175
175
  end
176
176
  end
177
177
 
@@ -185,7 +185,7 @@ module Skeem
185
185
  ]
186
186
  checks.each do |(skeem_expr, expectation)|
187
187
  result = subject.run(skeem_expr)
188
- expect(result.value).to eq(expectation)
188
+ expect(result).to eq(expectation)
189
189
  end
190
190
  end
191
191
 
@@ -198,7 +198,7 @@ module Skeem
198
198
  ]
199
199
  checks.each do |(skeem_expr, expectation)|
200
200
  result = subject.run(skeem_expr)
201
- expect(result.value).to eq(expectation)
201
+ expect(result).to eq(expectation)
202
202
  end
203
203
  end
204
204
  end # context
@@ -212,7 +212,7 @@ module Skeem
212
212
  ]
213
213
  checks.each do |(skeem_expr, expectation)|
214
214
  result = subject.run(skeem_expr)
215
- expect(result.value).to eq(expectation)
215
+ expect(result).to eq(expectation)
216
216
  end
217
217
  end
218
218
 
@@ -224,7 +224,7 @@ module Skeem
224
224
  ]
225
225
  checks.each do |(skeem_expr, expectation)|
226
226
  result = subject.run(skeem_expr)
227
- expect(result.value).to eq(expectation)
227
+ expect(result).to eq(expectation)
228
228
  end
229
229
 
230
230
  # If all the expressions evaluate to true values,
@@ -232,8 +232,8 @@ module Skeem
232
232
  source = "(and 1 2 'c '(f g))"
233
233
  result = subject.run(source)
234
234
  expect(result).to be_kind_of(SkmList)
235
- expect(result.head.value).to eq('f')
236
- expect(result.last.value).to eq('g')
235
+ expect(result.head).to eq('f')
236
+ expect(result.last).to eq('g')
237
237
  end
238
238
 
239
239
  it 'should implement the or procedure' do
@@ -248,7 +248,7 @@ module Skeem
248
248
  ]
249
249
  checks.each do |(skeem_expr, expectation)|
250
250
  result = subject.run(skeem_expr)
251
- expect(result.value).to eq(expectation)
251
+ expect(result).to eq(expectation)
252
252
  end
253
253
 
254
254
  # When an expression evaluates to true value,
@@ -256,7 +256,7 @@ module Skeem
256
256
  source = "(or #f 'a #f)"
257
257
  result = subject.run(source)
258
258
  expect(result).to be_kind_of(SkmIdentifier)
259
- expect(result.value).to eq('a')
259
+ expect(result).to eq('a')
260
260
  end
261
261
 
262
262
  it 'should implement the boolean? procedure' do
@@ -266,7 +266,7 @@ module Skeem
266
266
  ]
267
267
  checks.each do |(skeem_expr, expectation)|
268
268
  result = subject.run(skeem_expr)
269
- expect(result.value).to eq(expectation)
269
+ expect(result).to eq(expectation)
270
270
  end
271
271
  end
272
272
  end # context
@@ -280,7 +280,7 @@ module Skeem
280
280
  ]
281
281
  checks.each do |(skeem_expr, expectation)|
282
282
  result = subject.run(skeem_expr)
283
- expect(result.value).to eq(expectation)
283
+ expect(result).to eq(expectation)
284
284
  end
285
285
  end
286
286
 
@@ -290,10 +290,10 @@ module Skeem
290
290
  ]
291
291
  checks.each do |(skeem_expr, expectation)|
292
292
  result = subject.run(skeem_expr)
293
- expect(result.value).to eq(expectation)
293
+ expect(result).to eq(expectation)
294
294
  end
295
295
  end
296
-
296
+
297
297
  it 'should implement the string-append procedure' do
298
298
  checks = [
299
299
  ['(string-append)', ''],
@@ -302,7 +302,19 @@ module Skeem
302
302
  ]
303
303
  checks.each do |(skeem_expr, expectation)|
304
304
  result = subject.run(skeem_expr)
305
- expect(result.value).to eq(expectation)
305
+ expect(result).to eq(expectation)
306
+ end
307
+ end
308
+
309
+ it 'should implement the string-length procedure' do
310
+ checks = [
311
+ ['(string-length "abc")', 3],
312
+ ['(string-length "")', 0],
313
+ ['(string-length "hi there")', 8],
314
+ ]
315
+ checks.each do |(skeem_expr, expectation)|
316
+ result = subject.run(skeem_expr)
317
+ expect(result).to eq(expectation)
306
318
  end
307
319
  end
308
320
  end # context
@@ -315,7 +327,7 @@ module Skeem
315
327
  ]
316
328
  checks.each do |(skeem_expr, expectation)|
317
329
  result = subject.run(skeem_expr)
318
- expect(result.value).to eq(expectation)
330
+ expect(result).to eq(expectation)
319
331
  end
320
332
  end
321
333
  end # context
@@ -323,15 +335,15 @@ module Skeem
323
335
  context 'List procedures:' do
324
336
  it 'should implement the list? procedure' do
325
337
  checks = [
326
- ['(list? #f)', false],
327
- ['(list? 1)', false],
328
- ['(list? "bar")', false],
329
- ['(list? (list 1 2 3))', true],
338
+ #['(list? #f)', false],
339
+ #['(list? 1)', false],
340
+ #['(list? "bar")', false],
341
+ #['(list? (list 1 2 3))', true],
330
342
  ['(list? (list))', true]
331
343
  ]
332
344
  checks.each do |(skeem_expr, expectation)|
333
345
  result = subject.run(skeem_expr)
334
- expect(result.value).to eq(expectation)
346
+ expect(result).to eq(expectation)
335
347
  end
336
348
  end
337
349
 
@@ -347,7 +359,7 @@ module Skeem
347
359
  ]
348
360
  checks.each do |(skeem_expr, expectation)|
349
361
  result = subject.run(skeem_expr)
350
- expect(result.value).to eq(expectation)
362
+ expect(result).to eq(expectation)
351
363
  end
352
364
  end
353
365
 
@@ -360,7 +372,7 @@ module Skeem
360
372
  ]
361
373
  checks.each do |(skeem_expr, expectation)|
362
374
  result = subject.run(skeem_expr)
363
- expect(result.value).to eq(expectation)
375
+ expect(result).to eq(expectation)
364
376
  end
365
377
  end
366
378
  end # context
@@ -376,7 +388,7 @@ module Skeem
376
388
  ]
377
389
  checks.each do |(skeem_expr, expectation)|
378
390
  result = subject.run(skeem_expr)
379
- expect(result.value).to eq(expectation)
391
+ expect(result).to eq(expectation)
380
392
  end
381
393
  end
382
394
 
@@ -389,7 +401,7 @@ module Skeem
389
401
  source = '(vector 1 2 3)'
390
402
  result = subject.run(source)
391
403
  expect(result).to be_kind_of(SkmVector)
392
- expect(result.elements.map(&:value)).to eq([1, 2, 3])
404
+ expect(result.members).to eq([1, 2, 3])
393
405
  end
394
406
 
395
407
  it 'should implement the vector-length procedure' do
@@ -404,7 +416,7 @@ module Skeem
404
416
  ]
405
417
  checks.each do |(skeem_expr, expectation)|
406
418
  result = subject.run(skeem_expr)
407
- expect(result.value).to eq(expectation)
419
+ expect(result).to eq(expectation)
408
420
  end
409
421
  end
410
422
 
@@ -412,7 +424,7 @@ module Skeem
412
424
  source = "(vector-ref '#(1 1 2 3 5 8 13 21) 5)"
413
425
  result = subject.run(source)
414
426
  expect(result).to be_kind_of(SkmInteger)
415
- expect(result.value).to eq(8)
427
+ expect(result).to eq(8)
416
428
  end
417
429
  end # context
418
430
 
@@ -1,9 +1,13 @@
1
1
  require_relative '../spec_helper' # Use the RSpec framework
2
- require_relative '../../lib/skeem/environment' # Load the class under test
2
+ require_relative '../../lib/skeem/datum_dsl'
3
+ require_relative '../../lib/skeem/primitive/primitive_builder'
4
+
3
5
  require_relative '../../lib/skeem/runtime' # Load the class under test
4
6
 
5
7
  module Skeem
6
8
  describe Runtime do
9
+ include DatumDSL
10
+
7
11
  let(:some_env) { Environment.new }
8
12
  subject { Runtime.new(some_env) }
9
13
 
@@ -30,7 +34,29 @@ module Skeem
30
34
  subject.define('dummy', entry)
31
35
  expect(subject.include?('dummy')).to be_truthy
32
36
  end
33
-
37
+ end # context
38
+
39
+ context 'Evaluation:' do
40
+ include Primitive::PrimitiveBuilder
41
+
42
+ it 'should evaluate a given entry' do
43
+ entry = double('three')
44
+ result = double('fake-procedure')
45
+ expect(entry).to receive(:expression).and_return(result)
46
+ expect(result).to receive(:evaluate).with(subject).and_return(integer(3))
47
+ subject.define('three', entry)
48
+ expect(subject.evaluate('three')).to eq(3)
49
+ end
50
+
51
+ it 'should evaluate a given list' do
52
+ add_primitives(subject)
53
+ sum = list([identifier('+'), 3, 4])
54
+
55
+ expect(subject.evaluate_form(sum)).to eq(7)
56
+ end
57
+ end # context
58
+
59
+ context 'Environment nesting' do
34
60
  it 'should add nested environment' do
35
61
  expect(subject.depth).to be_zero
36
62
  env_before = subject.environment