skeem 0.2.10 → 0.2.11

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,6 +6,8 @@ require_relative '../../../lib/skeem/interpreter'
6
6
  module Skeem
7
7
  module Primitive
8
8
  describe 'Testing primitive procedures' do
9
+ include InterpreterSpec
10
+
9
11
  subject do
10
12
  # We load the interpreter with the primitive procedures only
11
13
  Interpreter.new { |interp| interp.add_primitives(interp.runtime) }
@@ -31,55 +33,47 @@ SKEEM
31
33
 
32
34
  context 'Arithmetic operators:' do
33
35
  it 'should implement the addition operator' do
34
- [
36
+ checks = [
35
37
  ['(+)', 0], # '+' as nullary operator. Example from section 6.2.6
36
38
  ['(+ -3)', -3], # '+' as unary operator
37
39
  ['(+ 3 4)', 7], # '+' as binary operator. Example from section 4.1.3
38
40
  ['(+ 1/2 2/3)', Rational(7,6)],
39
41
  ['(+ 1/2 3)', Rational(7,2)],
40
42
  ['(+ 2 2.34)', 4.34]
41
- ].each do |(expr, predicted)|
42
- result = subject.run(expr)
43
- expect(result).to eq(predicted)
44
- end
43
+ ]
44
+ compare_to_predicted(checks)
45
45
  end
46
46
 
47
47
  it 'should implement the minus operator' do
48
- [
48
+ checks = [
49
49
  ['(- 3)', -3], # '-' as unary operator (= sign change)
50
50
  ['(- -2/3)', Rational(2, 3)],
51
51
  ['(- 3 4)', -1], # '-' as binary operator. Example from section 6.2.6
52
52
  ['(- 3 4 5)', -6] # '-' as variadic operator. Example from section 6.2.6
53
- ].each do |(expr, predicted)|
54
- result = subject.run(expr)
55
- expect(result).to eq(predicted)
56
- end
53
+ ]
54
+ compare_to_predicted(checks)
57
55
  end
58
56
 
59
57
  it 'should implement the product operator' do
60
- [
58
+ checks = [
61
59
  ['(*)', 1], # '*' as nullary operator. Example from section 6.2.6
62
60
  ['(* 4)', 4], # '*' as unary operator. Example from section 6.2.6
63
61
  ['(* 5 8)', 40], # '*' as binary operator.
64
62
  ['(* 2/3 5/7)', Rational(10, 21)],
65
63
  ['(* 2 3 4 5)', 120] # '*' as variadic operator.
66
- ].each do |(expr, predicted)|
67
- result = subject.run(expr)
68
- expect(result).to eq(predicted)
69
- end
64
+ ]
65
+ compare_to_predicted(checks)
70
66
  end
71
67
 
72
68
  it 'should implement the division operator' do
73
- [
69
+ checks = [
74
70
  ['(/ 3)', Rational(1, 3)], # '/' as unary operator (= inverse of argument)
75
71
  ['(/ 3/4)', Rational(4, 3)],
76
72
  ['(/ 3 4)', Rational(3, 4)], # '/' as binary operator.
77
73
  ['(/ 2/3 5/7)', Rational(14, 15)],
78
74
  ['(/ 3 4 5)', Rational(3, 20)] # '/' as variadic operator. Example from section 6.2.6
79
- ].each do |(expr, predicted)|
80
- result = subject.run(expr)
81
- expect(result).to eq(predicted)
82
- end
75
+ ]
76
+ compare_to_predicted(checks)
83
77
 
84
78
  result = subject.run('(/ 3 4.5)')
85
79
  expect(result.value).to be_within(0.000001).of(0.66666667)
@@ -92,12 +86,11 @@ SKEEM
92
86
  ['(floor/ 5 -2)', [-3, -1]],
93
87
  ['(floor/ -5 -2)', [2, -1]]
94
88
  ]
95
- checks.each do |(skeem_expr, expectation)|
96
- result = subject.run(skeem_expr)
89
+ compare_to_predicted(checks) do |result, expectation|
97
90
  expect([result.car, result.cdr]).to eq(expectation)
98
91
  end
99
92
  end
100
-
93
+
101
94
  it 'should implement the truncate/ procedure' do
102
95
  checks = [
103
96
  ['(truncate/ 5 2)', [2, 1]], # Binary procedure.
@@ -105,11 +98,73 @@ SKEEM
105
98
  ['(truncate/ 5 -2)', [-2, 1]],
106
99
  ['(truncate/ -5 -2)', [2, -1]]
107
100
  ]
108
- checks.each do |(skeem_expr, expectation)|
109
- result = subject.run(skeem_expr)
101
+ compare_to_predicted(checks) do |result, expectation|
110
102
  expect([result.car, result.cdr]).to eq(expectation)
111
103
  end
112
- end
104
+ end
105
+
106
+ it 'should implement the gcd procedure' do
107
+ checks = [
108
+ ['(gcd)', 0],
109
+ ['(gcd 47)', 47],
110
+ ['(gcd 7 11)', 1],
111
+ ['(gcd 32 -36)', 4],
112
+ ['(gcd 32 -36 25)', 1]
113
+ ]
114
+ compare_to_predicted(checks)
115
+ end
116
+
117
+ it 'should implement the lcm procedure' do
118
+ checks = [
119
+ ['(lcm)', 1],
120
+ ['(lcm 47)', 47],
121
+ ['(lcm 7 11)', 77],
122
+ ['(lcm 32 -36)', 288],
123
+ ['(lcm 32 -36 10)', 1440],
124
+ ['(lcm 32.0 -36)', 288]
125
+ ]
126
+ compare_to_predicted(checks)
127
+ end
128
+
129
+ it 'should implement the numerator procedure' do
130
+ checks = [
131
+ ['(numerator (/ 6 4))', 3]
132
+ ]
133
+ compare_to_predicted(checks)
134
+ end
135
+
136
+ it 'should implement the denominator procedure' do
137
+ checks = [
138
+ ['(denominator (/ 6 4))', 2]
139
+ ]
140
+ compare_to_predicted(checks)
141
+ end
142
+
143
+ it 'should implement the floor procedure' do
144
+ checks = [
145
+ ['(floor -4.3)', -5],
146
+ ['(floor 3.5)', 3]
147
+ ]
148
+ compare_to_predicted(checks)
149
+ end
150
+
151
+ it 'should implement the ceiling procedure' do
152
+ checks = [
153
+ ['(ceiling -4.3)', -4],
154
+ ['(ceiling 3.5)', 4]
155
+ ]
156
+ compare_to_predicted(checks)
157
+ end
158
+
159
+ it 'should implement the round procedure' do
160
+ checks = [
161
+ ['(round -4.3)', -4],
162
+ ['(round 3.5)', 4],
163
+ ['(round 7/2)', 4],
164
+ ['(round 7)', 7]
165
+ ]
166
+ compare_to_predicted(checks)
167
+ end
113
168
  end # context
114
169
 
115
170
  context 'Comparison operators' do
@@ -132,8 +187,7 @@ SKEEM
132
187
  ['(define p (lambda (x) x)) (eqv? p p)', true],
133
188
  ["(eqv? #f 'nil)", false]
134
189
  ]
135
- checks.each do |(skeem_expr, expectation)|
136
- result = subject.run(skeem_expr)
190
+ compare_to_predicted(checks) do |result, expectation|
137
191
  if result.length > 1
138
192
  expect(result.last).to eq(expectation)
139
193
  else
@@ -163,8 +217,7 @@ SKEEM
163
217
  ['(equal? car cdr)', false],
164
218
  ['(equal? (lambda (x) x) (lambda (y) y))', false],
165
219
  ]
166
- checks.each do |(skeem_expr, expectation)|
167
- result = subject.run(skeem_expr)
220
+ compare_to_predicted(checks) do |result, expectation|
168
221
  if result.length > 1
169
222
  expect(result.last).to eq(expectation)
170
223
  else
@@ -182,10 +235,7 @@ SKEEM
182
235
  ['(= 3 4)', false],
183
236
  ['(= "foo" "bar")', false]
184
237
  ]
185
- checks.each do |(skeem_expr, expectation)|
186
- result = subject.run(skeem_expr)
187
- expect(result).to eq(expectation)
188
- end
238
+ compare_to_predicted(checks)
189
239
  end
190
240
 
191
241
  it 'should implement the less than operator' do
@@ -197,10 +247,7 @@ SKEEM
197
247
  ['(< 3 2)', false],
198
248
  ['(< 3 4 5 4)', false]
199
249
  ]
200
- checks.each do |(skeem_expr, expectation)|
201
- result = subject.run(skeem_expr)
202
- expect(result.value).to eq(expectation)
203
- end
250
+ compare_to_predicted(checks)
204
251
  end
205
252
 
206
253
  it 'should implement the greater than operator' do
@@ -212,10 +259,7 @@ SKEEM
212
259
  ['(> 3 4)', false],
213
260
  ['(> 3 2 1 2)', false]
214
261
  ]
215
- checks.each do |(skeem_expr, expectation)|
216
- result = subject.run(skeem_expr)
217
- expect(result).to eq(expectation)
218
- end
262
+ compare_to_predicted(checks)
219
263
  end
220
264
 
221
265
  it 'should implement the less or equal than operator' do
@@ -228,10 +272,7 @@ SKEEM
228
272
  ['(<= 3 4 5 4)', false],
229
273
  ['(<= 3 4 5 5)', true]
230
274
  ]
231
- checks.each do |(skeem_expr, expectation)|
232
- result = subject.run(skeem_expr)
233
- expect(result).to eq(expectation)
234
- end
275
+ compare_to_predicted(checks)
235
276
  end
236
277
 
237
278
  it 'should implement the greater or equal than operator' do
@@ -244,10 +285,7 @@ SKEEM
244
285
  ['(>= 3 2 1 2)', false],
245
286
  ['(>= 3 2 1 1)', true]
246
287
  ]
247
- checks.each do |(skeem_expr, expectation)|
248
- result = subject.run(skeem_expr)
249
- expect(result).to eq(expectation)
250
- end
288
+ compare_to_predicted(checks)
251
289
  end
252
290
 
253
291
  it 'should implement the max procedure' do
@@ -256,10 +294,7 @@ SKEEM
256
294
  ['(max 3.9 4)', 4],
257
295
  ['(max 4 -7 2 0 -6)', 4]
258
296
  ]
259
- checks.each do |(skeem_expr, expectation)|
260
- result = subject.run(skeem_expr)
261
- expect(result).to eq(expectation)
262
- end
297
+ compare_to_predicted(checks)
263
298
  end
264
299
 
265
300
  it 'should implement the min procedure' do
@@ -268,10 +303,7 @@ SKEEM
268
303
  ['(min 3.9 4)', 3.9],
269
304
  ['(min 4 -7 2 0 -6)', -7]
270
305
  ]
271
- checks.each do |(skeem_expr, expectation)|
272
- result = subject.run(skeem_expr)
273
- expect(result).to eq(expectation)
274
- end
306
+ compare_to_predicted(checks)
275
307
  end
276
308
  end # context
277
309
 
@@ -284,10 +316,7 @@ SKEEM
284
316
  ['(number? "3")', false],
285
317
  ['(number? #t)', false]
286
318
  ]
287
- checks.each do |(skeem_expr, expectation)|
288
- result = subject.run(skeem_expr)
289
- expect(result).to eq(expectation)
290
- end
319
+ compare_to_predicted(checks)
291
320
  end
292
321
 
293
322
  it 'should implement the real? predicate' do
@@ -298,10 +327,7 @@ SKEEM
298
327
  ['(real? "3")', false],
299
328
  ['(real? #t)', false]
300
329
  ]
301
- checks.each do |(skeem_expr, expectation)|
302
- result = subject.run(skeem_expr)
303
- expect(result).to eq(expectation)
304
- end
330
+ compare_to_predicted(checks)
305
331
  end
306
332
 
307
333
  it 'should implement the rational? predicate' do
@@ -313,10 +339,7 @@ SKEEM
313
339
  ['(rational? "3")', false],
314
340
  ['(rational? #t)', false]
315
341
  ]
316
- checks.each do |(skeem_expr, expectation)|
317
- result = subject.run(skeem_expr)
318
- expect(result).to eq(expectation)
319
- end
342
+ compare_to_predicted(checks)
320
343
  end
321
344
 
322
345
  it 'should implement the integer? predicate' do
@@ -328,10 +351,7 @@ SKEEM
328
351
  ['(integer? "3")', false],
329
352
  ['(integer? #t)', false]
330
353
  ]
331
- checks.each do |(skeem_expr, expectation)|
332
- result = subject.run(skeem_expr)
333
- expect(result).to eq(expectation)
334
- end
354
+ compare_to_predicted(checks)
335
355
  end
336
356
 
337
357
  it 'should implement the number->string procedure' do
@@ -342,10 +362,7 @@ SKEEM
342
362
  ['(number->string 1e-23)', '1.0e-23'],
343
363
  ['(number->string -7)', '-7']
344
364
  ]
345
- checks.each do |(skeem_expr, expectation)|
346
- result = subject.run(skeem_expr)
347
- expect(result).to eq(expectation)
348
- end
365
+ compare_to_predicted(checks)
349
366
  end
350
367
  end # context
351
368
 
@@ -356,10 +373,7 @@ SKEEM
356
373
  ['(and (= 2 2) (< 2 1))', false],
357
374
  ['(and)', true]
358
375
  ]
359
- checks.each do |(skeem_expr, expectation)|
360
- result = subject.run(skeem_expr)
361
- expect(result).to eq(expectation)
362
- end
376
+ compare_to_predicted(checks)
363
377
 
364
378
  # If all the expressions evaluate to true values,
365
379
  # the values of the last expression are returned.
@@ -381,10 +395,7 @@ SKEEM
381
395
  ['(or #f #f #f)', false],
382
396
 
383
397
  ]
384
- checks.each do |(skeem_expr, expectation)|
385
- result = subject.run(skeem_expr)
386
- expect(result).to eq(expectation)
387
- end
398
+ compare_to_predicted(checks)
388
399
 
389
400
  # When an expression evaluates to true value,
390
401
  # the values of the this expression is returned.
@@ -400,10 +411,7 @@ SKEEM
400
411
  ['(boolean? 0)', false],
401
412
  ["(boolean? '())", false]
402
413
  ]
403
- checks.each do |(skeem_expr, expectation)|
404
- result = subject.run(skeem_expr)
405
- expect(result).to eq(expectation)
406
- end
414
+ compare_to_predicted(checks)
407
415
  end
408
416
  end # context
409
417
 
@@ -414,10 +422,7 @@ SKEEM
414
422
  ['(string? 3)', false],
415
423
  ['(string? "hi")', true]
416
424
  ]
417
- checks.each do |(skeem_expr, expectation)|
418
- result = subject.run(skeem_expr)
419
- expect(result).to eq(expectation)
420
- end
425
+ compare_to_predicted(checks)
421
426
  end
422
427
 
423
428
  it 'should implement the string->symbol procedure' do
@@ -436,10 +441,7 @@ SKEEM
436
441
  ['(string=? "Mom" "Mum")', false],
437
442
  ['(string=? "Mom" "Dad")', false]
438
443
  ]
439
- checks.each do |(skeem_expr, expectation)|
440
- result = subject.run(skeem_expr)
441
- expect(result).to eq(expectation)
442
- end
444
+ compare_to_predicted(checks)
443
445
  end
444
446
 
445
447
  it 'should implement the string-append procedure' do
@@ -448,10 +450,7 @@ SKEEM
448
450
  ['(string-append "abc" "def")', 'abcdef'],
449
451
  ['(string-append "Hey " "you " "there!")', 'Hey you there!']
450
452
  ]
451
- checks.each do |(skeem_expr, expectation)|
452
- result = subject.run(skeem_expr)
453
- expect(result).to eq(expectation)
454
- end
453
+ compare_to_predicted(checks)
455
454
  end
456
455
 
457
456
  it 'should implement the string-length procedure' do
@@ -460,10 +459,7 @@ SKEEM
460
459
  ['(string-length "")', 0],
461
460
  ['(string-length "hi there")', 8],
462
461
  ]
463
- checks.each do |(skeem_expr, expectation)|
464
- result = subject.run(skeem_expr)
465
- expect(result).to eq(expectation)
466
- end
462
+ compare_to_predicted(checks)
467
463
  end
468
464
  end # context
469
465
 
@@ -477,10 +473,7 @@ SKEEM
477
473
  ["(symbol? '())", false],
478
474
  ['(symbol? #f)', false]
479
475
  ]
480
- checks.each do |(skeem_expr, expectation)|
481
- result = subject.run(skeem_expr)
482
- expect(result).to eq(expectation)
483
- end
476
+ compare_to_predicted(checks)
484
477
  end
485
478
 
486
479
  it 'should implement the symbol->string procedure' do
@@ -490,10 +483,7 @@ SKEEM
490
483
  ["(equal? (symbol->string 'Martin) \"Martin\")", true],
491
484
  ['(equal? (symbol->string (string->symbol "Malvina")) "Malvina")', true]
492
485
  ]
493
- checks.each do |(skeem_expr, expectation)|
494
- result = subject.run(skeem_expr)
495
- expect(result).to eq(expectation)
496
- end
486
+ compare_to_predicted(checks)
497
487
  end
498
488
  end # context
499
489
 
@@ -505,10 +495,7 @@ SKEEM
505
495
  ["(pair? '())", false],
506
496
  ["(pair? '#(a b))", false]
507
497
  ]
508
- checks.each do |(skeem_expr, expectation)|
509
- result = subject.run(skeem_expr)
510
- expect(result).to eq(expectation)
511
- end
498
+ compare_to_predicted(checks)
512
499
  end
513
500
 
514
501
  it 'should implement the list? procedure' do
@@ -522,10 +509,7 @@ SKEEM
522
509
  ["(list? '(3 . 4))", false],
523
510
  ["(list? '())", true]
524
511
  ]
525
- checks.each do |(skeem_expr, expectation)|
526
- result = subject.run(skeem_expr)
527
- expect(result).to eq(expectation)
528
- end
512
+ compare_to_predicted(checks)
529
513
  end
530
514
 
531
515
  it 'should implement the null? procedure' do
@@ -538,10 +522,7 @@ SKEEM
538
522
  ["(null? '(1 2 3))", false],
539
523
  ["(list? '())", true]
540
524
  ]
541
- checks.each do |(skeem_expr, expectation)|
542
- result = subject.run(skeem_expr)
543
- expect(result).to eq(expectation)
544
- end
525
+ compare_to_predicted(checks)
545
526
  end
546
527
 
547
528
  it 'should implement the cons procedure' do
@@ -584,9 +565,7 @@ SKEEM
584
565
  end
585
566
 
586
567
  it 'should implement the car procedure' do
587
- example = "(car '(a b c))" # => a
588
- result = subject.run(example)
589
- expect(result).to eq('a')
568
+ expect_expr("(car '(a b c))").to eq('a')
590
569
 
591
570
  example = "(car '((a) b c d))" # => (a)
592
571
  result = subject.run(example)
@@ -594,9 +573,7 @@ SKEEM
594
573
  expect(result.length).to eq(1)
595
574
  expect(result.car).to eq('a')
596
575
 
597
- example = "(car '(1 . 2))"
598
- result = subject.run(example)
599
- expect(result).to eq(1)
576
+ expect_expr("(car '(1 . 2))").to eq(1)
600
577
 
601
578
  example = "(car '())" # => error
602
579
  expect { subject.run(example) }.to raise_error(StandardError)
@@ -609,9 +586,7 @@ SKEEM
609
586
  expect(result.length).to eq(3)
610
587
  expect(result.to_a).to eq(['b', 'c', 'd'])
611
588
 
612
- example = "(cdr '(1 . 2))"
613
- result = subject.run(example)
614
- expect(result).to eq(2)
589
+ expect_expr("(cdr '(1 . 2))").to eq(2)
615
590
 
616
591
  example = "(cdr '())" # => error
617
592
  expect { subject.run(example) }.to raise_error(StandardError)
@@ -625,11 +600,7 @@ SKEEM
625
600
  ["(length '(1 2 3))", 3],
626
601
  ["(length '(a (b) (c d e)))", 3]
627
602
  ]
628
-
629
- checks.each do |(skeem_expr, expectation)|
630
- result = subject.run(skeem_expr)
631
- expect(result).to eq(expectation)
632
- end
603
+ compare_to_predicted(checks)
633
604
  end
634
605
 
635
606
  def array2list_ids(arr)
@@ -649,8 +620,7 @@ SKEEM
649
620
  SkmPair.create_from_a(array2list_ids(['c']))]],
650
621
  [ "(append '() 'a)", SkmIdentifier.create('a')]
651
622
  ]
652
- checks.each do |(skeem_expr, expectation)|
653
- result = subject.run(skeem_expr)
623
+ compare_to_predicted(checks) do |result, expectation|
654
624
  if result.kind_of?(SkmPair)
655
625
  expect(result.to_a).to eq(expectation)
656
626
  else
@@ -672,8 +642,7 @@ SKEEM
672
642
  ["(list->vector '())", []],
673
643
  ["(list->vector '(a b c))", ['a', 'b', 'c']]
674
644
  ]
675
- checks.each do |(skeem_expr, expectation)|
676
- result = subject.run(skeem_expr)
645
+ compare_to_predicted(checks) do |result, expectation|
677
646
  expect(result.to_a).to eq(expectation)
678
647
  end
679
648
  end
@@ -700,20 +669,19 @@ SKEEM
700
669
 
701
670
  it 'should implement the assq procedure' do
702
671
  subject.run("(define e '((a 1) (b 2) (c 3)))")
703
- result = subject.run("(assq 'a e)")
704
- expect(result.to_a).to eq(['a', 1])
705
- result = subject.run("(assq 'b e)")
706
- expect(result.to_a).to eq(['b', 2])
707
- result = subject.run("(assq 'c e)")
708
- expect(result.to_a).to eq(['c', 3])
709
- result = subject.run("(assq 'd e)")
710
- expect(result).to eq(false)
711
- result = subject.run("(assq 'a '())")
712
- expect(result).to eq(false)
713
- result = subject.run("(assq 'a '())")
714
- expect(result).to eq(false)
715
- result = subject.run("(assq '(a) '(((a)) ((b)) ((c))))")
716
- expect(result).to eq(false)
672
+ checks = [
673
+ ["(assq 'a e)", ['a', 1]],
674
+ ["(assq 'b e)", ['b', 2]],
675
+ ["(assq 'c e)", ['c', 3]],
676
+ ["(assq 'd e)", [nil]]
677
+ ]
678
+ compare_to_predicted(checks) do |result, expectation|
679
+ expect(result.to_a).to eq(expectation)
680
+ end
681
+
682
+ expect_expr("(assq 'a '())").to eq(false)
683
+ expect_expr("(assq 'a '())").to eq(false)
684
+ expect_expr("(assq '(a) '(((a)) ((b)) ((c))))").to eq(false)
717
685
  end
718
686
 
719
687
  it 'should implement the assv procedure' do
@@ -726,8 +694,7 @@ SKEEM
726
694
  ["(list-copy '())", []],
727
695
  ["(list-copy '(a b c))", ['a', 'b', 'c']]
728
696
  ]
729
- checks.each do |(skeem_expr, expectation)|
730
- result = subject.run(skeem_expr)
697
+ compare_to_predicted(checks) do |result, expectation|
731
698
  expect(result.to_a).to eq(expectation)
732
699
  end
733
700
 
@@ -753,10 +720,7 @@ SKEEM
753
720
  ["(vector? '(1 2 3))", false],
754
721
  ['(vector? #(1 #f "cool"))', true]
755
722
  ]
756
- checks.each do |(skeem_expr, expectation)|
757
- result = subject.run(skeem_expr)
758
- expect(result).to eq(expectation)
759
- end
723
+ compare_to_predicted(checks)
760
724
  end
761
725
 
762
726
  it 'should implement the vector procedure' do
@@ -781,10 +745,7 @@ SKEEM
781
745
  ['(vector-length #(1 2))', 2],
782
746
  ['(vector-length (vector 1 2 3))', 3]
783
747
  ]
784
- checks.each do |(skeem_expr, expectation)|
785
- result = subject.run(skeem_expr)
786
- expect(result).to eq(expectation)
787
- end
748
+ compare_to_predicted(checks)
788
749
  end
789
750
 
790
751
  it 'should implement the make-vector procedure' do
@@ -793,10 +754,7 @@ SKEEM
793
754
  ["(vector-length (make-vector 0 'a))", 0],
794
755
  ["(equal? (make-vector 5 'a) '#(a a a a a))", true],
795
756
  ]
796
- checks.each do |(skeem_expr, expectation)|
797
- result = subject.run(skeem_expr)
798
- expect(result).to eq(expectation)
799
- end
757
+ compare_to_predicted(checks)
800
758
  end
801
759
 
802
760
  it 'should implement the vector-ref procedure' do
@@ -811,8 +769,7 @@ SKEEM
811
769
  ["(vector->list #())", []],
812
770
  ["(vector->list '#(a b c))", ['a', 'b', 'c']]
813
771
  ]
814
- checks.each do |(skeem_expr, expectation)|
815
- result = subject.run(skeem_expr)
772
+ compare_to_predicted(checks) do |result, expectation|
816
773
  expect(result.to_a).to eq(expectation)
817
774
  end
818
775
  end
@@ -826,20 +783,14 @@ SKEEM
826
783
  ["(procedure? (lambda (x) (* x x)))", true],
827
784
  # ["(procedure? '(lambda (x) (* x x)))", false] # Parse fail: non-standard syntax
828
785
  ]
829
- checks.each do |(skeem_expr, expectation)|
830
- result = subject.run(skeem_expr)
831
- expect(result).to eq(expectation)
832
- end
786
+ compare_to_predicted(checks)
833
787
  end
834
788
 
835
789
  it 'should implement the apply procedure' do
836
790
  checks = [
837
791
  ["(apply + '(3 4))", 7]
838
792
  ]
839
- checks.each do |(skeem_expr, expectation)|
840
- result = subject.run(skeem_expr)
841
- expect(result).to eq(expectation)
842
- end
793
+ compare_to_predicted(checks)
843
794
  end
844
795
 
845
796
  it 'should implement the map procedure' do
@@ -847,8 +798,7 @@ SKEEM
847
798
  ["(map car '((a b) (d e) (g h)))", ['a', 'd', 'g']],
848
799
  ["(map + '(1 2 3) '(4 5 6 7))", [5, 7, 9]]
849
800
  ]
850
- checks.each do |(skeem_expr, expectation)|
851
- result = subject.run(skeem_expr)
801
+ compare_to_predicted(checks) do |result, expectation|
852
802
  expect(result.to_a).to eq(expectation)
853
803
  end
854
804
  end