skeem 0.0.28 → 0.1.00

Sign up to get free protection for your applications and to get access to all the features.
@@ -187,20 +187,21 @@ SKEEM
187
187
  it 'should implement the quotation of lists' do
188
188
  source = '(quote (+ 1 2))'
189
189
  result = subject.run(source)
190
- expect(result).to be_kind_of(SkmList)
190
+ expect(result).to be_kind_of(SkmPair)
191
191
  predictions = [
192
192
  [SkmIdentifier, '+'],
193
193
  [SkmInteger, 1],
194
194
  [SkmInteger, 2]
195
195
  ]
196
+ members = result.to_a
196
197
  predictions.each_with_index do |(type, value), index|
197
- expect(result.members[index]).to be_kind_of(type)
198
- expect(result.members[index]).to eq(value)
198
+ expect(members[index]).to be_kind_of(type)
199
+ expect(members[index]).to eq(value)
199
200
  end
200
201
 
201
202
  source = "'()"
202
203
  result = subject.run(source)
203
- expect(result).to be_kind_of(SkmList)
204
+ expect(result).to be_kind_of(SkmEmptyList)
204
205
  expect(result).to be_null
205
206
  end
206
207
 
@@ -263,7 +264,7 @@ SKEEM
263
264
  # Example from R7RS section 4.1.4
264
265
  source = '((lambda x x) 3 4 5 6)'
265
266
  result = subject.run(source)
266
- expect(result).to be_kind_of(SkmList)
267
+ expect(result).to be_kind_of(SkmPair)
267
268
  expect(result.length).to eq(4)
268
269
  end
269
270
 
@@ -271,9 +272,9 @@ SKEEM
271
272
  # Example from R7RS section 4.1.4
272
273
  source = '((lambda (x y . z) z) 3 4 5 6)'
273
274
  result = subject.run(source)
274
- expect(result).to be_kind_of(SkmList)
275
+ expect(result).to be_kind_of(SkmPair)
275
276
  expect(result.length).to eq(2)
276
- expect(result.head).to eq(5)
277
+ expect(result.first).to eq(5)
277
278
  expect(result.last).to eq(6)
278
279
  end
279
280
 
@@ -371,56 +372,59 @@ SKEEM
371
372
  it 'should implement the quasiquotation of lists' do
372
373
  source = '(quasiquote (+ 1 2))'
373
374
  result = subject.run(source)
374
- expect(result).to be_kind_of(SkmList)
375
+ expect(result).to be_kind_of(SkmPair)
375
376
  predictions = [
376
377
  [SkmIdentifier, '+'],
377
378
  [SkmInteger, 1],
378
379
  [SkmInteger, 2]
379
380
  ]
380
- predictions.each_with_index do |(type, value), index|
381
- expect(result.members[index]).to be_kind_of(type)
382
- expect(result.members[index]).to eq(value)
381
+ predictions.each do |(type, value)|
382
+ expect(result.car).to be_kind_of(type)
383
+ expect(result.car).to eq(value)
384
+ result = result.cdr
383
385
  end
384
386
 
385
387
  source = "`()"
386
388
  result = subject.run(source)
387
- expect(result).to be_kind_of(SkmList)
389
+ expect(result).to be_kind_of(SkmEmptyList)
388
390
  expect(result).to be_null
389
391
  end
390
392
 
391
393
  it 'should implement the unquote of lists' do
392
394
  source = '`(list ,(+ 1 2) 4)'
393
395
  result = subject.run(source)
394
- expect(result).to be_kind_of(SkmList)
396
+ expect(result).to be_kind_of(SkmPair)
395
397
  predictions = [
396
398
  [SkmIdentifier, 'list'],
397
399
  [SkmInteger, 3],
398
400
  [SkmInteger, 4]
399
401
  ]
400
- predictions.each_with_index do |(type, value), index|
401
- expect(result.members[index]).to be_kind_of(type)
402
- expect(result.members[index]).to eq(value)
402
+ predictions.each do |(type, value)|
403
+ expect(result.car).to be_kind_of(type)
404
+ expect(result.car).to eq(value)
405
+ result = result.cdr
403
406
  end
404
407
 
405
408
  source = "`()"
406
409
  result = subject.run(source)
407
- expect(result).to be_kind_of(SkmList)
410
+ expect(result).to be_kind_of(SkmEmptyList)
408
411
  expect(result).to be_null
409
412
 
410
413
  # nested lists
411
414
  source = '`(a b (,(+ 2 3) c) d)'
412
415
  result = subject.run(source)
413
416
  # expected: (a b (5 c) d)
414
- expect(result).to be_kind_of(SkmList)
417
+ expect(result).to be_kind_of(SkmPair)
415
418
  predictions = [
416
419
  [SkmIdentifier, 'a'],
417
420
  [SkmIdentifier, 'b'],
418
- [SkmList, list([integer(5), identifier('c')])],
421
+ [SkmPair, list([integer(5), identifier('c')])],
419
422
  [SkmIdentifier, 'd']
420
423
  ]
421
- predictions.each_with_index do |(type, value), index|
422
- expect(result.members[index]).to be_kind_of(type)
423
- expect(result.members[index]).to eq(value)
424
+ predictions.each do |(type, value)|
425
+ expect(result.car).to be_kind_of(type)
426
+ expect(result.car).to eq(value)
427
+ result = result.cdr
424
428
  end
425
429
  end
426
430
  =begin
@@ -592,7 +596,7 @@ SKEEM
592
596
  ]
593
597
  checks.each do |(skeem_expr, expectation)|
594
598
  result = subject.run(skeem_expr)
595
- expect(result.members).to eq(expectation)
599
+ expect(result.to_a).to eq(expectation)
596
600
  end
597
601
  end
598
602
 
@@ -619,7 +623,7 @@ SKEEM
619
623
  ((compose list square) 5)
620
624
  SKEEM
621
625
  result = subject.run(source)
622
- expect(result.last.members).to eq([25])
626
+ expect(result.last.car).to eq(25)
623
627
  end
624
628
 
625
629
  it 'should implement lambda that calls second-order functions' do
@@ -637,7 +641,7 @@ SKEEM
637
641
  ((repeat twice) 5)
638
642
  SKEEM
639
643
  result = subject.run(source)
640
- expect(result.members.last).to eq(20)
644
+ expect(result.last).to eq(20)
641
645
  end
642
646
  end # context
643
647
  end # describe
@@ -17,9 +17,9 @@ module Skeem
17
17
  it 'should parse isolated booleans' do
18
18
  samples = [
19
19
  ['#f', false],
20
- ['#false', false],
21
- ['#t', true],
22
- ['#true', true]
20
+ # ['#false', false],
21
+ # ['#t', true],
22
+ # ['#true', true]
23
23
  ]
24
24
  samples.each do |source, predicted|
25
25
  ptree = subject.parse(source)
@@ -7,7 +7,7 @@ module Skeem
7
7
  module Primitive
8
8
  describe 'Testing primitive procedures' do
9
9
  subject { Interpreter.new }
10
-
10
+
11
11
  context 'Arithmetic operators:' do
12
12
  it 'should implement the set! form' do
13
13
  skeem1 = <<-SKEEM
@@ -22,7 +22,7 @@ SKEEM
22
22
  SKEEM
23
23
  result = subject.run(skeem2)
24
24
  expect(result.last).to eq(5) # x is now bound to value 4
25
- end
25
+ end
26
26
  end # context
27
27
 
28
28
  context 'Arithmetic operators:' do
@@ -105,9 +105,9 @@ SKEEM
105
105
  checks.each do |(skeem_expr, expectation)|
106
106
  result = subject.run(skeem_expr)
107
107
  expect(result).to eq(expectation)
108
- end
108
+ end
109
109
  end
110
-
110
+
111
111
  it 'should implement the equality operator' do
112
112
  checks = [
113
113
  ['(= 3)', true], # '=' as unary operator
@@ -257,9 +257,10 @@ SKEEM
257
257
  # the values of the last expression are returned.
258
258
  source = "(and 1 2 'c '(f g))"
259
259
  result = subject.run(source)
260
- expect(result).to be_kind_of(SkmList)
261
- expect(result.head).to eq('f')
262
- expect(result.last).to eq('g')
260
+ expect(result).to be_kind_of(SkmPair)
261
+ expect(result.car).to eq('f')
262
+ expect(result.cdr).to be_kind_of(SkmPair)
263
+ expect(result.cdr.car).to eq('g')
263
264
  end
264
265
 
265
266
  it 'should implement the or procedure' do
@@ -370,10 +371,23 @@ SKEEM
370
371
  result = subject.run(skeem_expr)
371
372
  expect(result).to eq(expectation)
372
373
  end
373
- end
374
+ end
374
375
  end # context
375
376
 
376
377
  context 'List procedures:' do
378
+ it 'should implement the pair? procedure' do
379
+ checks = [
380
+ ["(pair? '(a . b))", true],
381
+ ["(pair? '(a b c))", true],
382
+ ["(pair? '())", false],
383
+ ["(pair? '#(a b))", false]
384
+ ]
385
+ checks.each do |(skeem_expr, expectation)|
386
+ result = subject.run(skeem_expr)
387
+ expect(result).to eq(expectation)
388
+ end
389
+ end
390
+
377
391
  it 'should implement the list? procedure' do
378
392
  checks = [
379
393
  ['(list? #f)', false],
@@ -404,6 +418,79 @@ SKEEM
404
418
  end
405
419
  end
406
420
 
421
+ it 'should implement the cons procedure' do
422
+ example = "(cons 'a '())" # => (a)
423
+ result = subject.run(example)
424
+ expect(result).to be_list
425
+ expect(result.car).to eq('a')
426
+
427
+ example = "(cons '(a) '(b c d))" # => ((a) b c d)
428
+ result = subject.run(example)
429
+ expect(result).to be_list
430
+ members = result.to_a
431
+ expect(members[0]).to be_list
432
+ expect(members[0].car).to eq('a')
433
+ expect(members[1]).to eq('b')
434
+ expect(members[2]).to eq('c')
435
+ expect(members[3]).to eq('d')
436
+
437
+ example = "(cons \"a\" '(b c))" # => ("a" b c)
438
+ result = subject.run(example)
439
+ expect(result).to be_list
440
+ expect(result.car).to be_kind_of(SkmString)
441
+ expect(result.car).to eq('a')
442
+ expect(result.cdr.car).to be_kind_of(SkmIdentifier)
443
+ expect(result.cdr.car).to eq('b')
444
+ expect(result.cdr.cdr.car).to be_kind_of(SkmIdentifier)
445
+ expect(result.cdr.cdr.car).to eq('c')
446
+
447
+ example = "(cons 'a 3)" # => (a . 3)
448
+ result = subject.run(example)
449
+ expect(result.car).to eq('a')
450
+ expect(result.cdr).to eq(3)
451
+
452
+ example = "(cons '(a b) 'c)" # => ((a b) . c)
453
+ result = subject.run(example)
454
+ expect(result.car).to be_kind_of(SkmPair)
455
+ expect(result.car.to_a).to eq(['a', 'b'])
456
+ expect(result.cdr).to be_kind_of(SkmIdentifier)
457
+ expect(result.cdr).to eq('c')
458
+ end
459
+
460
+ it 'should implement the car procedure' do
461
+ example = "(car '(a b c))" # => a
462
+ result = subject.run(example)
463
+ expect(result).to eq('a')
464
+
465
+ example = "(car '((a) b c d))" # => (a)
466
+ result = subject.run(example)
467
+ expect(result).to be_list
468
+ expect(result.length).to eq(1)
469
+ expect(result.car).to eq('a')
470
+
471
+ # example = "(car '(1 . 2))" # => 1 # FAILURE
472
+ # result = subject.run(example)
473
+ # expect(result.car).to eq(1)
474
+
475
+ example = "(car '())" # => error
476
+ expect { subject.run(example) }.to raise_error(StandardError)
477
+ end
478
+
479
+ it 'should implement the cdr procedure' do
480
+ example = "(cdr '((a) b c d))" # => (b c d)
481
+ result = subject.run(example)
482
+ expect(result).to be_list
483
+ expect(result.length).to eq(3)
484
+ expect(result.to_a).to eq(['b', 'c', 'd'])
485
+
486
+ # example = "(cdr '(1 . 2))" # => 2 # PARSER FAILURE
487
+ # result = subject.run(example)
488
+ # expect(result.cdr).to eq(2)
489
+
490
+ example = "(cdr '())" # => error
491
+ expect { subject.run(example) }.to raise_error(StandardError)
492
+ end
493
+
407
494
  it 'should implement the length procedure' do
408
495
  checks = [
409
496
  ['(length (list))', 0],
@@ -416,6 +503,17 @@ SKEEM
416
503
  expect(result).to eq(expectation)
417
504
  end
418
505
  end
506
+
507
+ it 'should implement the list->vector procedure' do
508
+ checks = [
509
+ ["(list->vector '())", []],
510
+ ["(list->vector '(a b c))", ['a', 'b', 'c']]
511
+ ]
512
+ checks.each do |(skeem_expr, expectation)|
513
+ result = subject.run(skeem_expr)
514
+ expect(result.to_a).to eq(expectation)
515
+ end
516
+ end
419
517
  end # context
420
518
 
421
519
  context 'Vector procedures:' do
@@ -467,6 +565,17 @@ SKEEM
467
565
  expect(result).to be_kind_of(SkmInteger)
468
566
  expect(result).to eq(8)
469
567
  end
568
+
569
+ it 'should implement the vector-> procedure' do
570
+ checks = [
571
+ ["(vector->list #())", []],
572
+ ["(vector->list '#(a b c))", ['a', 'b', 'c']]
573
+ ]
574
+ checks.each do |(skeem_expr, expectation)|
575
+ result = subject.run(skeem_expr)
576
+ expect(result.to_a).to eq(expectation)
577
+ end
578
+ end
470
579
  end # context
471
580
 
472
581
  context 'IO procedures:' do
@@ -478,7 +587,7 @@ SKEEM
478
587
  $stdout = default_stdout
479
588
  end
480
589
  end # context
481
-
590
+
482
591
  context 'Miscellaneous procedures' do
483
592
  it 'should return true when an assertion succeeds' do
484
593
  source = <<-SKEEM
@@ -487,8 +596,8 @@ SKEEM
487
596
  (assert (> x y))
488
597
  SKEEM
489
598
  expect(subject.run(source).last).to eq(true)
490
- end
491
-
599
+ end
600
+
492
601
  it 'should raise an error when an assertion fails' do
493
602
  source = <<-SKEEM
494
603
  (define x 1)
@@ -498,7 +607,7 @@ SKEEM
498
607
  err = StandardError
499
608
  msg = 'Error: assertion failed on line 3, column 4'
500
609
  expect { subject.run(source) }.to raise_error(err, msg)
501
- end
610
+ end
502
611
  end # context
503
612
  end # describe
504
613
  end # module
@@ -28,7 +28,7 @@ module Skeem
28
28
 
29
29
  context 'Provided services:' do
30
30
  include Primitive::PrimitiveBuilder
31
-
31
+
32
32
  let(:runtime) { Runtime.new(Environment.new) }
33
33
 
34
34
  it 'should create an entry when evaluating' do
@@ -36,7 +36,7 @@ module Skeem
36
36
  subject.evaluate(runtime)
37
37
  expect(runtime).to include(sample_symbol)
38
38
  end
39
-
39
+
40
40
  it 'should optimize an entry that aliases a primitive proc' do
41
41
  add_primitives(runtime)
42
42
  identifier = SkmIdentifier.create('plus')
@@ -57,22 +57,22 @@ module Skeem
57
57
  id = SkmIdentifier.create('some-lambda')
58
58
  def1 = SkmDefinition.new(nil, id, lbd)
59
59
  def1.evaluate(runtime)
60
-
60
+
61
61
  # Let's create an alias to the lambda
62
62
  other_name = SkmIdentifier.create('aliased-lambda')
63
63
  var_ref = SkmVariableReference.new(nil, id)
64
-
64
+
65
65
  # (define aliased-lambda some-lambda)
66
- def2 = SkmDefinition.new(nil, other_name, var_ref)
66
+ def2 = SkmDefinition.new(nil, other_name, var_ref)
67
67
  expect(def2.expression).to eq(var_ref)
68
68
  def2.evaluate(runtime)
69
69
  # Optimization by getting rid of indirection
70
70
  expect(def2.expression).to eq(lbd)
71
- end
72
-
71
+ end
72
+
73
73
  it 'should quasiquote its variable and expression' do
74
74
  alter_ego = subject.quasiquote(runtime)
75
- expect(alter_ego).to eq(subject)
75
+ expect(alter_ego).to eq(subject)
76
76
  end
77
77
 
78
78
  it 'should return its text representation' do
@@ -100,14 +100,14 @@ module Skeem
100
100
  end
101
101
 
102
102
  it 'should know its operands' do
103
- expect(subject.operands.inspect).to eq('<Skeem::SkmList: 1, 2, 3>')
103
+ expect(subject.operands.inspect).to eq('<Skeem::SkmPair: 1, 2, 3>')
104
104
  end
105
105
  end # context
106
106
 
107
107
  context 'Provided services:' do
108
108
  it 'should return its text representation' do
109
109
  txt1 = '<Skeem::ProcedureCall: <Skeem::SkmIdentifier: +>, '
110
- txt2 = '@operands <Skeem::SkmList: 1, 2, 3>>'
110
+ txt2 = '@operands <Skeem::SkmPair: 1, 2, 3>>'
111
111
  expect(subject.inspect).to eq(txt1 + txt2)
112
112
  end
113
113
  end # context
@@ -25,6 +25,7 @@ module Skeem
25
25
  expect(subject).not_to be_symbol
26
26
  expect(subject).not_to be_list
27
27
  expect(subject).not_to be_null
28
+ expect(subject).not_to be_pair
28
29
  expect(subject).not_to be_vector
29
30
  end
30
31
  end # context
@@ -0,0 +1,44 @@
1
+ require_relative '../spec_helper' # Use the RSpec framework
2
+ require_relative '../../lib/skeem/skm_empty_list' # Load the class under test
3
+
4
+ module Skeem
5
+ describe SkmEmptyList do
6
+ subject { SkmEmptyList.instance }
7
+
8
+ context 'Initialization:' do
9
+ it 'should be initialized without argument' do
10
+ expect { SkmEmptyList.instance }.not_to raise_error
11
+ end
12
+
13
+ # Default (overridable) behavior of SkmElement
14
+ it 'should react by default to predicates' do
15
+ expect(subject).to be_list
16
+ expect(subject).to be_null
17
+ expect(subject).not_to be_pair
18
+ end
19
+ end # context
20
+
21
+ context 'Provided services:' do
22
+ let(:runtime) { double('fake-runtime') }
23
+
24
+ it "should return itself when receiving 'evaluate' message" do
25
+ expect(subject.evaluate(runtime)).to eq(subject)
26
+ end
27
+
28
+ it "should return itself receiving 'quasiquote' message" do
29
+ expect(subject.quasiquote(runtime)).to eq(subject)
30
+ end
31
+
32
+ it "should reply to visitor's 'accept' message" do
33
+ visitor = double('fake-visitor')
34
+ expect(visitor).to receive(:visit_empty_list).with(subject)
35
+ expect { subject.accept(visitor) }.not_to raise_error
36
+ end
37
+
38
+ it 'should return its representation upon inspection' do
39
+ predicted = '<Skeem::SkmEmptyList: ()>'
40
+ expect(subject.inspect).to eq(predicted)
41
+ end
42
+ end # context
43
+ end # describe
44
+ end # module
@@ -0,0 +1,140 @@
1
+ require_relative '../spec_helper' # Use the RSpec framework
2
+ require_relative '../../lib/skeem/datum_dsl'
3
+ require_relative '../../lib/skeem/runtime'
4
+ require_relative '../../lib/skeem/skm_pair' # Load the class under test
5
+
6
+ module Skeem
7
+ describe SkmPair do
8
+ include DatumDSL
9
+ let(:sample_car) { integer(3) }
10
+ let(:sample_cdr) { SkmEmptyList.instance }
11
+
12
+ # Default instance is proper list of length 1
13
+ subject { SkmPair.new(sample_car, sample_cdr) }
14
+
15
+ context 'Initialization:' do
16
+ it 'should be initialized with two arguments' do
17
+ expect { SkmPair.new(sample_car, sample_cdr) }.not_to raise_error
18
+ end
19
+
20
+ it "should know its 'car' field" do
21
+ expect(subject.car).to eq(sample_car)
22
+ end
23
+
24
+ it "should know its 'cdr' field" do
25
+ expect(subject.cdr).to eq(sample_cdr)
26
+ end
27
+
28
+ # Default (overridable) behavior of SkmElement
29
+ it 'should react by default to predicates' do
30
+ expect(subject).to be_list
31
+ expect(subject).not_to be_null
32
+ expect(subject).to be_pair
33
+ end
34
+ end # context
35
+
36
+ context 'Provided services:' do
37
+ let(:runtime) { Runtime.new(Environment.new) }
38
+ let(:list_length_2) { SkmPair.new(integer(10), subject) }
39
+ let(:quirk_element) { double('three') }
40
+ let(:quirk_members) { [integer(10), quirk_element] }
41
+
42
+ it 'should know its length' do
43
+ expect(subject.length).to eq(1)
44
+
45
+ # Use a list of length 2
46
+ expect(list_length_2.length).to eq(2)
47
+ end
48
+
49
+ it 'should convert itself into an array' do
50
+ expect(subject.to_a).to eq([sample_car])
51
+
52
+ # Use a list of length 2
53
+ expect(list_length_2.to_a).to eq([integer(10), sample_car])
54
+ end
55
+
56
+ it 'should return the last element of a list' do
57
+ expect(subject.last).to eq(sample_car)
58
+ expect(list_length_2.last).to eq(sample_car)
59
+ end
60
+
61
+ it 'should append a new element to a list' do
62
+ subject.append(integer(4))
63
+ expect(subject.length).to eq(2)
64
+ expect(subject.to_a).to eq([3, 4])
65
+ end
66
+
67
+ it 'should create a list from an array' do
68
+ # List of length 0
69
+ array0 = []
70
+ list = SkmPair.create_from_a(array0)
71
+ expect(list).to be_list # It's a proper list...
72
+ expect(list.length).to eq(0)
73
+ expect(list.to_a).to eq(array0)
74
+
75
+ # List of length 1
76
+ array1 = [boolean(false)]
77
+ list = SkmPair.create_from_a(array1)
78
+ expect(list).to be_list # It's a proper list...
79
+ expect(list.length).to eq(1)
80
+ expect(list.to_a).to eq(array1)
81
+
82
+ # List of length 2
83
+ array2 = [identifier('f'), identifier('g')]
84
+ list = SkmPair.create_from_a(array2)
85
+ expect(list).to be_list # It's a proper list...
86
+ expect(list.length).to eq(2)
87
+ expect(list.to_a).to eq(array2)
88
+
89
+ # List of length 3
90
+ array3 = [integer(4), integer(5), integer(6)]
91
+ list = SkmPair.create_from_a(array3)
92
+ expect(list).to be_list # It's a proper list...
93
+ expect(list.length).to eq(3)
94
+ expect(list.to_a).to eq([4, 5, 6])
95
+ end
96
+
97
+ it 'should support the each method' do
98
+ my_list = SkmPair.new('w', SkmPair.new('o', SkmPair.new('w', SkmEmptyList.instance)))
99
+ text = ''
100
+ my_list.each { |ch| text << ch.upcase }
101
+ expect(text).to eq('WOW')
102
+ end
103
+
104
+ it 'should evaluate its members' do
105
+ # subject contains simple literals
106
+ expect(subject.evaluate(runtime)).to eq(subject)
107
+
108
+ # Check that members receive the 'evaluate' message
109
+ expect(quirk_element).to receive(:evaluate).with(runtime).and_return(integer(3))
110
+ instance = SkmPair.create_from_a(quirk_members)
111
+ expect { instance.evaluate(runtime) }.not_to raise_error
112
+ end
113
+
114
+ it 'should quasiquote its members' do
115
+ # subject contains simple literals
116
+ expect(subject.quasiquote(runtime)).to eq(subject)
117
+
118
+ # Check that members receive the 'quasiquote' message
119
+ expect(quirk_element).to receive(:quasiquote).with(runtime).and_return(integer(3))
120
+ instance = SkmPair.create_from_a(quirk_members)
121
+ expect { instance.quasiquote(runtime) }.not_to raise_error
122
+ end
123
+
124
+ it "should reply to visitor's 'accept' message" do
125
+ visitor = double('fake-visitor')
126
+ expect(visitor).to receive(:visit_pair).with(subject)
127
+ expect { subject.accept(visitor) }.not_to raise_error
128
+ end
129
+
130
+ it 'should return its representation upon inspection' do
131
+ predicted = '<Skeem::SkmPair: <Skeem::SkmInteger: 3>>'
132
+ expect(subject.inspect).to eq(predicted)
133
+
134
+ predicted = '<Skeem::SkmPair: <Skeem::SkmInteger: 10>, <Skeem::SkmInteger: 3>>'
135
+ expect(list_length_2.inspect).to eq(predicted)
136
+ end
137
+ end # context
138
+
139
+ end # describe
140
+ end # module
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.28
4
+ version: 0.1.00
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-12-16 00:00:00.000000000 Z
11
+ date: 2018-12-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rley
@@ -98,7 +98,9 @@ files:
98
98
  - lib/skeem/s_expr_nodes.rb
99
99
  - lib/skeem/skm_compound_datum.rb
100
100
  - lib/skeem/skm_element.rb
101
+ - lib/skeem/skm_empty_list.rb
101
102
  - lib/skeem/skm_expression.rb
103
+ - lib/skeem/skm_pair.rb
102
104
  - lib/skeem/skm_simple_datum.rb
103
105
  - lib/skeem/skm_unary_expression.rb
104
106
  - lib/skeem/standard/base.skm
@@ -116,6 +118,8 @@ files:
116
118
  - spec/skeem/s_expr_nodes_spec.rb
117
119
  - spec/skeem/skm_compound_datum_spec.rb
118
120
  - spec/skeem/skm_element_spec.rb
121
+ - spec/skeem/skm_empty_list_spec.rb
122
+ - spec/skeem/skm_pair_spec.rb
119
123
  - spec/skeem/skm_simple_datum_spec.rb
120
124
  - spec/skeem/skm_unary_expression_spec.rb
121
125
  - spec/skeem/tokenizer_spec.rb
@@ -158,6 +162,8 @@ test_files:
158
162
  - spec/skeem/runtime_spec.rb
159
163
  - spec/skeem/skm_compound_datum_spec.rb
160
164
  - spec/skeem/skm_element_spec.rb
165
+ - spec/skeem/skm_empty_list_spec.rb
166
+ - spec/skeem/skm_pair_spec.rb
161
167
  - spec/skeem/skm_simple_datum_spec.rb
162
168
  - spec/skeem/skm_unary_expression_spec.rb
163
169
  - spec/skeem/s_expr_nodes_spec.rb