skeem 0.0.28 → 0.1.00
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 +4 -4
- data/CHANGELOG.md +24 -1
- data/README.md +3 -3
- data/lib/skeem/datum_dsl.rb +11 -6
- data/lib/skeem/element_visitor.rb +26 -0
- data/lib/skeem/grammar.rb +1 -1
- data/lib/skeem/primitive/primitive_builder.rb +111 -33
- data/lib/skeem/primitive/primitive_procedure.rb +6 -5
- data/lib/skeem/runtime.rb +5 -5
- data/lib/skeem/s_expr_builder.rb +28 -12
- data/lib/skeem/s_expr_nodes.rb +39 -9
- data/lib/skeem/skm_compound_datum.rb +3 -2
- data/lib/skeem/skm_element.rb +4 -0
- data/lib/skeem/skm_empty_list.rb +60 -0
- data/lib/skeem/skm_pair.rb +126 -0
- data/lib/skeem/skm_simple_datum.rb +1 -2
- data/lib/skeem/standard/base.skm +24 -0
- data/lib/skeem/version.rb +1 -1
- data/spec/skeem/datum_dsl_spec.rb +45 -33
- data/spec/skeem/element_visitor_spec.rb +54 -53
- data/spec/skeem/interpreter_spec.rb +29 -25
- data/spec/skeem/parser_spec.rb +3 -3
- data/spec/skeem/primitive/primitive_builder_spec.rb +121 -12
- data/spec/skeem/s_expr_nodes_spec.rb +10 -10
- data/spec/skeem/skm_element_spec.rb +1 -0
- data/spec/skeem/skm_empty_list_spec.rb +44 -0
- data/spec/skeem/skm_pair_spec.rb +140 -0
- metadata +8 -2
data/lib/skeem/s_expr_nodes.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# Classes that implement nodes of Abstract Syntax Trees (AST) representing
|
2
2
|
# Skeem parse results.
|
3
3
|
|
4
|
-
require_relative '
|
5
|
-
require_relative 'skm_compound_datum'
|
4
|
+
require_relative 'datum_dsl'
|
6
5
|
require_relative 'skm_unary_expression'
|
7
6
|
|
8
7
|
module Skeem
|
@@ -46,6 +45,9 @@ module Skeem
|
|
46
45
|
super(aPosition)
|
47
46
|
@variable = aVariable
|
48
47
|
@expression = theExpression
|
48
|
+
unless expression.kind_of?(SkmElement)
|
49
|
+
raise StandardError, "Bad definition"
|
50
|
+
end
|
49
51
|
end
|
50
52
|
|
51
53
|
def evaluate(aRuntime)
|
@@ -134,7 +136,11 @@ module Skeem
|
|
134
136
|
else
|
135
137
|
@operator = anOperator
|
136
138
|
end
|
137
|
-
|
139
|
+
if theOperands.nil?
|
140
|
+
@operands = SkmEmptyList.instance
|
141
|
+
else
|
142
|
+
@operands = SkmPair.create_from_a(theOperands)
|
143
|
+
end
|
138
144
|
@operands_consumed = false
|
139
145
|
end
|
140
146
|
|
@@ -313,6 +319,8 @@ module Skeem
|
|
313
319
|
end # class
|
314
320
|
|
315
321
|
class SkmLambda < SkmMultiExpression
|
322
|
+
include DatumDSL
|
323
|
+
|
316
324
|
# @!attribute [r] formals
|
317
325
|
# @return [Array<SkmIdentifier>] the argument names
|
318
326
|
attr_reader :formals
|
@@ -377,7 +385,7 @@ module Skeem
|
|
377
385
|
private
|
378
386
|
|
379
387
|
def bind_locals(aRuntime, aProcedureCall)
|
380
|
-
actuals = aProcedureCall.operands.
|
388
|
+
actuals = aProcedureCall.operands.to_a
|
381
389
|
count_actuals = actuals.size
|
382
390
|
|
383
391
|
if (count_actuals < required_arity) ||
|
@@ -392,12 +400,16 @@ module Skeem
|
|
392
400
|
if actual.kind_of?(ProcedureCall)
|
393
401
|
actual.evaluate(aRuntime)
|
394
402
|
else
|
395
|
-
actual
|
403
|
+
to_datum(actual)
|
396
404
|
end
|
397
405
|
end
|
398
406
|
variadic_arg_name = formals.formals.last
|
399
|
-
args_coll =
|
407
|
+
args_coll = SkmPair.create_from_a(variadic_part)
|
400
408
|
a_def = SkmDefinition.new(position, variadic_arg_name, args_coll)
|
409
|
+
# $stderr.puts "Tef #{a_def.inspect}"
|
410
|
+
# $stderr.puts "Tef #{actuals.inspect}"
|
411
|
+
# $stderr.puts "Tef #{variadic_part.inspect}"
|
412
|
+
# $stderr.puts "Tef #{aProcedureCall.inspect}"
|
401
413
|
a_def.evaluate(aRuntime)
|
402
414
|
end
|
403
415
|
aProcedureCall.operands_consumed = true
|
@@ -423,7 +435,14 @@ module Skeem
|
|
423
435
|
caller_index -= 1
|
424
436
|
end
|
425
437
|
else
|
426
|
-
|
438
|
+
begin
|
439
|
+
result = cmd.evaluate(aRuntime)
|
440
|
+
rescue NoMethodError => exc
|
441
|
+
$stderr.puts self.inspect
|
442
|
+
$stderr.puts sequence.inspect
|
443
|
+
$stderr.puts cmd.inspect
|
444
|
+
raise exc
|
445
|
+
end
|
427
446
|
end
|
428
447
|
end
|
429
448
|
end
|
@@ -434,14 +453,22 @@ module Skeem
|
|
434
453
|
# Purpose: bind each formal from lambda to an actual value from the call
|
435
454
|
def bind_required_locals(aRuntime, aProcedureCall)
|
436
455
|
max_index = required_arity - 1
|
437
|
-
|
456
|
+
case aProcedureCall.operands
|
457
|
+
when SkmPair
|
458
|
+
actuals = aProcedureCall.operands.to_a
|
459
|
+
when SkmEmptyList
|
460
|
+
actuals = []
|
461
|
+
else
|
462
|
+
raise StandardError, "Unsupported type of operand list #{aProcedureCall.operands.inspect}"
|
463
|
+
actuals = aProcedureCall.operands.members
|
464
|
+
end
|
438
465
|
formal_names = formals.formals.map(&:value)
|
439
466
|
|
440
467
|
formals.formals.each_with_index do |arg_name, index|
|
441
468
|
arg = actuals[index]
|
442
469
|
if arg.nil?
|
443
470
|
if actuals.empty? && formals.variadic?
|
444
|
-
arg =
|
471
|
+
arg = SkmPair.create_from_a([])
|
445
472
|
else
|
446
473
|
raise StandardError, "Unbound variable: '#{arg_name.value}'"
|
447
474
|
end
|
@@ -449,6 +476,9 @@ module Skeem
|
|
449
476
|
|
450
477
|
# IMPORTANT: execute procedure call in argument list now
|
451
478
|
arg = arg.evaluate(aRuntime) if arg.kind_of?(ProcedureCall)
|
479
|
+
unless arg.kind_of?(SkmElement)
|
480
|
+
arg = to_datum(arg)
|
481
|
+
end
|
452
482
|
a_def = SkmDefinition.new(position, arg_name, arg)
|
453
483
|
# $stderr.puts "Procedure call #{aProcedureCall.operator.inspect}"
|
454
484
|
# $stderr.puts "LOCAL #{arg_name.value} #{arg.inspect}"
|
@@ -26,7 +26,7 @@ module Skeem
|
|
26
26
|
members == other
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
alias eqv? equal?
|
31
31
|
|
32
32
|
def evaluate(aRuntime)
|
@@ -58,6 +58,7 @@ module Skeem
|
|
58
58
|
end
|
59
59
|
end # class
|
60
60
|
|
61
|
+
# @deprecated Use {#SkmPair} class instead.
|
61
62
|
class SkmList < SkmCompoundDatum
|
62
63
|
def tail()
|
63
64
|
SkmList.new(members.slice(1..-1))
|
@@ -70,7 +71,7 @@ module Skeem
|
|
70
71
|
def null?
|
71
72
|
empty?
|
72
73
|
end
|
73
|
-
|
74
|
+
|
74
75
|
def evaluate(aRuntime)
|
75
76
|
if empty?
|
76
77
|
self.class.new(nil)
|
data/lib/skeem/skm_element.rb
CHANGED
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require_relative 'skm_element'
|
3
|
+
|
4
|
+
module Skeem
|
5
|
+
# From R7RS: The empty list is a special object of its own type.
|
6
|
+
# It is not a pair, it has no elements, and its length is zero.
|
7
|
+
class SkmEmptyList < SkmElement
|
8
|
+
include Singleton
|
9
|
+
|
10
|
+
def list?
|
11
|
+
true
|
12
|
+
end
|
13
|
+
|
14
|
+
def null?
|
15
|
+
true
|
16
|
+
end
|
17
|
+
|
18
|
+
def pair?
|
19
|
+
false
|
20
|
+
end
|
21
|
+
|
22
|
+
def length
|
23
|
+
0
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_a
|
27
|
+
[]
|
28
|
+
end
|
29
|
+
|
30
|
+
def empty?
|
31
|
+
true
|
32
|
+
end
|
33
|
+
|
34
|
+
def evaluate(_runtime)
|
35
|
+
self
|
36
|
+
end
|
37
|
+
|
38
|
+
def quasiquote(_runtime)
|
39
|
+
self
|
40
|
+
end
|
41
|
+
|
42
|
+
# Part of the 'visitee' role in Visitor design pattern.
|
43
|
+
# @param _visitor [SkmElementVisitor] the visitor
|
44
|
+
def accept(aVisitor)
|
45
|
+
aVisitor.visit_empty_list(self)
|
46
|
+
end
|
47
|
+
|
48
|
+
protected
|
49
|
+
|
50
|
+
def inspect_specific
|
51
|
+
'()'
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def initialize()
|
57
|
+
super(0)
|
58
|
+
end
|
59
|
+
end # class
|
60
|
+
end # module
|
@@ -0,0 +1,126 @@
|
|
1
|
+
require_relative 'skm_empty_list'
|
2
|
+
|
3
|
+
module Skeem
|
4
|
+
class SkmPair < SkmElement
|
5
|
+
attr_accessor :car
|
6
|
+
attr_accessor :cdr
|
7
|
+
|
8
|
+
alias first car
|
9
|
+
alias members to_a
|
10
|
+
|
11
|
+
def initialize(head, tail)
|
12
|
+
super(0)
|
13
|
+
@car = head
|
14
|
+
@cdr = tail
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.create_from_a(anArray)
|
18
|
+
current = nil
|
19
|
+
return SkmEmptyList.instance if anArray.empty?
|
20
|
+
anArray.reverse_each do |elem|
|
21
|
+
if current.nil?
|
22
|
+
current = self.new(elem, SkmEmptyList.instance)
|
23
|
+
else
|
24
|
+
current = self.new(elem, current)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
current
|
29
|
+
end
|
30
|
+
|
31
|
+
def empty?
|
32
|
+
return false if car
|
33
|
+
if [SkmPair, SkmEmptyList].include? cdr.class
|
34
|
+
cdr.empty?
|
35
|
+
else
|
36
|
+
false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def list?
|
41
|
+
if cdr.nil?
|
42
|
+
false
|
43
|
+
else
|
44
|
+
cdr.list?
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def pair?
|
49
|
+
true
|
50
|
+
end
|
51
|
+
|
52
|
+
def length
|
53
|
+
if [SkmPair, SkmEmptyList].include?(cdr.class)
|
54
|
+
cdr.length + 1
|
55
|
+
else
|
56
|
+
raise StandardError, 'Improper list'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def to_a
|
61
|
+
result = [car]
|
62
|
+
if cdr && !cdr.null?
|
63
|
+
result.concat(cdr.to_a)
|
64
|
+
end
|
65
|
+
|
66
|
+
result
|
67
|
+
end
|
68
|
+
|
69
|
+
def last
|
70
|
+
self.to_a.last
|
71
|
+
end
|
72
|
+
|
73
|
+
def each(&aBlock)
|
74
|
+
aBlock.call(car)
|
75
|
+
cdr.each(&aBlock) if cdr && !cdr.null?
|
76
|
+
end
|
77
|
+
|
78
|
+
def append(anElement)
|
79
|
+
if cdr.nil? || cdr.kind_of?(SkmEmptyList)
|
80
|
+
self.cdr = SkmPair.new(anElement, SkmEmptyList.instance)
|
81
|
+
elsif cdr.kind_of?(SkmPair)
|
82
|
+
self.cdr.append(anElement)
|
83
|
+
else
|
84
|
+
raise StandardError, "Cannot append #{anElement.inspect}"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def evaluate(aRuntime)
|
89
|
+
return SkmEmptyList.instance if empty?
|
90
|
+
if car.kind_of?(SkmIdentifier)
|
91
|
+
result = aRuntime.evaluate_form(self)
|
92
|
+
else
|
93
|
+
members_eval = self.to_a.map { |elem| elem.evaluate(aRuntime) }
|
94
|
+
result = self.class.create_from_a(members_eval)
|
95
|
+
end
|
96
|
+
result
|
97
|
+
end
|
98
|
+
|
99
|
+
def quasiquote(aRuntime)
|
100
|
+
members_eval = self.to_a.map { |elem| elem.quasiquote(aRuntime) }
|
101
|
+
self.class.create_from_a(members_eval)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Part of the 'visitee' role in Visitor design pattern.
|
105
|
+
# @param _visitor [SkmElementVisitor] the visitor
|
106
|
+
def accept(aVisitor)
|
107
|
+
aVisitor.visit_pair(self)
|
108
|
+
end
|
109
|
+
|
110
|
+
def done!()
|
111
|
+
# Do nothing
|
112
|
+
end
|
113
|
+
|
114
|
+
protected
|
115
|
+
|
116
|
+
def inspect_specific
|
117
|
+
result = car.inspect
|
118
|
+
if cdr && !cdr.null?
|
119
|
+
result << ', ' << cdr.send(:inspect_specific)
|
120
|
+
end
|
121
|
+
|
122
|
+
result
|
123
|
+
end
|
124
|
+
|
125
|
+
end # class
|
126
|
+
end # module
|
data/lib/skeem/standard/base.skm
CHANGED
@@ -72,6 +72,30 @@
|
|
72
72
|
; Allocates and returns a new list from its arguments
|
73
73
|
(define list
|
74
74
|
(lambda args args))
|
75
|
+
|
76
|
+
; (define caar
|
77
|
+
; (lambda (x)
|
78
|
+
; (car (car x))))
|
75
79
|
|
80
|
+
; (define cadr
|
81
|
+
; (lambda (x)
|
82
|
+
; (car (cdr x))))
|
76
83
|
|
84
|
+
;(define cdar
|
85
|
+
; (lambda(x)
|
86
|
+
; (cdr (car x))))
|
87
|
+
|
88
|
+
;(define cddr
|
89
|
+
; (lambda (x)
|
90
|
+
; (cdr (cdr x))))
|
91
|
+
|
92
|
+
;; (list-ref list n)
|
93
|
+
;; Return the nth (sero-based) element of list
|
94
|
+
;; n must be a nonnegative integer
|
95
|
+
;(define list-ref
|
96
|
+
; (lambda (ls n)
|
97
|
+
; (if (= n 0)
|
98
|
+
; (car ls)
|
99
|
+
; (list-ref (cdr ls) (- n 1)))))
|
100
|
+
|
77
101
|
(define symbol=? string=?)
|
data/lib/skeem/version.rb
CHANGED
@@ -24,7 +24,7 @@ module Skeem
|
|
24
24
|
['false', false]
|
25
25
|
]
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
let(:integer_tests) do
|
29
29
|
[
|
30
30
|
[0, 0],
|
@@ -33,10 +33,10 @@ module Skeem
|
|
33
33
|
['0', 0],
|
34
34
|
['-123', -123],
|
35
35
|
['+456', 456]
|
36
|
-
]
|
36
|
+
]
|
37
37
|
end
|
38
38
|
|
39
|
-
let(:real_tests) do
|
39
|
+
let(:real_tests) do
|
40
40
|
[
|
41
41
|
[0, 0],
|
42
42
|
[-123.4, -123.4],
|
@@ -48,18 +48,18 @@ module Skeem
|
|
48
48
|
['-1.234e+3', -1234]
|
49
49
|
]
|
50
50
|
end
|
51
|
-
|
52
|
-
let(:string_tests) do
|
51
|
+
|
52
|
+
let(:string_tests) do
|
53
53
|
[
|
54
54
|
['hello', 'hello']
|
55
|
-
]
|
55
|
+
]
|
56
56
|
end
|
57
|
-
|
58
|
-
let(:identifier_tests) do
|
57
|
+
|
58
|
+
let(:identifier_tests) do
|
59
59
|
[
|
60
60
|
['define', 'define'],
|
61
61
|
[SkmString.create('positive?'), 'positive?']
|
62
|
-
]
|
62
|
+
]
|
63
63
|
end
|
64
64
|
|
65
65
|
let(:simple_datum_tests) do
|
@@ -102,38 +102,38 @@ module Skeem
|
|
102
102
|
end
|
103
103
|
end
|
104
104
|
end # context
|
105
|
-
|
106
|
-
|
105
|
+
|
106
|
+
|
107
107
|
context 'Compound datums:' do
|
108
|
-
it 'should convert empty array into one-member list' do
|
108
|
+
it 'should convert empty array into one-member list' do
|
109
109
|
result = subject.list([])
|
110
|
-
expect(result).to be_kind_of(
|
111
|
-
expect(result).to be_null
|
110
|
+
expect(result).to be_kind_of(SkmEmptyList)
|
111
|
+
expect(result).to be_null
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
it 'should convert array of simple datums into list' do
|
115
115
|
literals = simple_datum_tests.map { |(datum, _predicted)| datum }
|
116
116
|
predictions = simple_datum_tests.map { |(_datum, predicted)| predicted }
|
117
117
|
list_result = subject.list(literals)
|
118
|
-
expect(list_result).to be_kind_of(
|
119
|
-
list_result.
|
118
|
+
expect(list_result).to be_kind_of(SkmPair)
|
119
|
+
list_result.to_a.each_with_index do |member, index|
|
120
120
|
expect(member).to eq(predictions[index])
|
121
121
|
end
|
122
122
|
end
|
123
|
-
|
124
|
-
it 'should convert a single datum into one-member list' do
|
123
|
+
|
124
|
+
it 'should convert a single datum into one-member list' do
|
125
125
|
result = subject.list('123')
|
126
|
-
expect(result).to be_kind_of(
|
127
|
-
expect(result.
|
128
|
-
end
|
129
|
-
|
130
|
-
it 'should convert empty array into one-member list' do
|
126
|
+
expect(result).to be_kind_of(SkmPair)
|
127
|
+
expect(result.car).to eq(123)
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'should convert empty array into one-member list' do
|
131
131
|
result = subject.vector([])
|
132
132
|
expect(result).to be_kind_of(SkmVector)
|
133
|
-
expect(result.members).to be_empty
|
133
|
+
expect(result.members).to be_empty
|
134
134
|
end
|
135
|
-
|
136
|
-
|
135
|
+
|
136
|
+
|
137
137
|
it 'should convert array of simple datums into vector' do
|
138
138
|
literals = simple_datum_tests.map { |(datum, _predicted)| datum }
|
139
139
|
predictions = simple_datum_tests.map { |(_datum, predicted)| predicted }
|
@@ -144,11 +144,11 @@ module Skeem
|
|
144
144
|
end
|
145
145
|
end
|
146
146
|
|
147
|
-
it 'should convert a single datum into one-member vector' do
|
147
|
+
it 'should convert a single datum into one-member vector' do
|
148
148
|
result = subject.vector('123')
|
149
149
|
expect(result).to be_kind_of(SkmVector)
|
150
150
|
expect(result.members.first).to eq(123)
|
151
|
-
end
|
151
|
+
end
|
152
152
|
end # context
|
153
153
|
|
154
154
|
context 'Arbitrary datums:' do
|
@@ -157,7 +157,7 @@ module Skeem
|
|
157
157
|
expect(subject.to_datum(literal)).to eq(predicted)
|
158
158
|
end
|
159
159
|
end
|
160
|
-
|
160
|
+
|
161
161
|
it 'should recognize & convert integer literals' do
|
162
162
|
integer_tests.each do |(literal, predicted)|
|
163
163
|
expect(subject.to_datum(literal)).to eq(predicted)
|
@@ -178,14 +178,26 @@ module Skeem
|
|
178
178
|
|
179
179
|
it 'should convert nested compound datums' do
|
180
180
|
literals = [
|
181
|
-
'false', '123', '-1.41',
|
181
|
+
'false', '123', '-1.41',
|
182
182
|
'foo', SkmVector.new(['uno', '2', 3.0]), 'bar'
|
183
183
|
]
|
184
184
|
result = subject.list(literals)
|
185
|
-
expect(result).to be_kind_of(
|
186
|
-
expect(result).to eq([false, 123, -1.41, 'foo', ['uno', 2, 3], 'bar'])
|
185
|
+
expect(result).to be_kind_of(SkmPair)
|
186
|
+
expect(result.to_a).to eq([false, 123, -1.41, 'foo', ['uno', 2, 3], 'bar'])
|
187
187
|
end
|
188
188
|
end
|
189
189
|
|
190
|
+
it 'should duplicate a given list' do
|
191
|
+
f = subject.identifier('f')
|
192
|
+
g = subject.identifier('g')
|
193
|
+
one_list = subject.list([f, g])
|
194
|
+
expect(one_list).to be_list
|
195
|
+
expect(one_list.to_a).to eq([f, g])
|
196
|
+
duplicate = subject.to_datum(one_list)
|
197
|
+
expect(duplicate).to be_list
|
198
|
+
# $stderr.puts duplicate.inspect
|
199
|
+
expect(duplicate.to_a).to eq([f, g])
|
200
|
+
end
|
201
|
+
|
190
202
|
end # describe
|
191
203
|
end # module
|
@@ -75,16 +75,32 @@ module Skeem
|
|
75
75
|
ls = list ['#false', 3, 'foo']
|
76
76
|
instance = SkmElementVisitor.new(ls)
|
77
77
|
instance.subscribe(listener)
|
78
|
-
expect(listener).to receive(:
|
79
|
-
expect(listener).to receive(:
|
80
|
-
expect(listener).to receive(:before_simple_datum).with(runtime, ls.
|
81
|
-
expect(listener).to receive(:after_simple_datum).with(runtime, ls.
|
82
|
-
expect(listener).to receive(:
|
83
|
-
expect(listener).to receive(:
|
84
|
-
expect(listener).to receive(:
|
85
|
-
expect(listener).to receive(:
|
86
|
-
expect(listener).to receive(:
|
87
|
-
expect(listener).to receive(:
|
78
|
+
expect(listener).to receive(:before_pair).with(runtime, ls).ordered
|
79
|
+
expect(listener).to receive(:before_car).with(runtime, ls, ls.car).ordered
|
80
|
+
expect(listener).to receive(:before_simple_datum).with(runtime, ls.car).ordered
|
81
|
+
expect(listener).to receive(:after_simple_datum).with(runtime, ls.car).ordered
|
82
|
+
expect(listener).to receive(:after_car).with(runtime, ls, ls.car).ordered
|
83
|
+
expect(listener).to receive(:before_cdr).with(runtime, ls, ls.cdr).ordered
|
84
|
+
expect(listener).to receive(:before_pair).with(runtime, ls.cdr).ordered
|
85
|
+
expect(listener).to receive(:before_car).with(runtime, ls.cdr, ls.cdr.car).ordered
|
86
|
+
expect(listener).to receive(:before_simple_datum).with(runtime, ls.cdr.car).ordered
|
87
|
+
expect(listener).to receive(:after_simple_datum).with(runtime, ls.cdr.car).ordered
|
88
|
+
expect(listener).to receive(:after_car).with(runtime, ls.cdr, ls.cdr.car).ordered
|
89
|
+
expect(listener).to receive(:before_cdr).with(runtime, ls.cdr, ls.cdr.cdr).ordered
|
90
|
+
expect(listener).to receive(:before_pair).with(runtime, ls.cdr.cdr).ordered
|
91
|
+
expect(listener).to receive(:before_car).with(runtime, ls.cdr.cdr, ls.cdr.cdr.car).ordered
|
92
|
+
expect(listener).to receive(:before_simple_datum).with(runtime, ls.cdr.cdr.car).ordered
|
93
|
+
expect(listener).to receive(:after_simple_datum).with(runtime, ls.cdr.cdr.car).ordered
|
94
|
+
expect(listener).to receive(:after_car).with(runtime, ls.cdr.cdr, ls.cdr.cdr.car).ordered
|
95
|
+
expect(listener).to receive(:before_cdr).with(runtime, ls.cdr.cdr, ls.cdr.cdr.cdr).ordered
|
96
|
+
expect(listener).to receive(:before_empty_list).with(runtime, ls.cdr.cdr.cdr).ordered
|
97
|
+
expect(listener).to receive(:after_empty_list).with(runtime, ls.cdr.cdr.cdr).ordered
|
98
|
+
expect(listener).to receive(:after_cdr).with(runtime, ls.cdr.cdr, ls.cdr.cdr.cdr).ordered
|
99
|
+
expect(listener).to receive(:after_pair).with(runtime, ls.cdr.cdr).ordered
|
100
|
+
expect(listener).to receive(:after_cdr).with(runtime, ls.cdr, ls.cdr.cdr).ordered
|
101
|
+
expect(listener).to receive(:after_pair).with(runtime, ls.cdr).ordered
|
102
|
+
expect(listener).to receive(:after_cdr).with(runtime, ls, ls.cdr).ordered
|
103
|
+
expect(listener).to receive(:after_pair).with(runtime, ls).ordered
|
88
104
|
instance.start(runtime)
|
89
105
|
end
|
90
106
|
|
@@ -116,55 +132,40 @@ module Skeem
|
|
116
132
|
expect(listener).to receive(:after_simple_datum).with(runtime, vec.members[0]).ordered
|
117
133
|
expect(listener).to receive(:before_simple_datum).with(runtime, vec.members[1]).ordered
|
118
134
|
expect(listener).to receive(:after_simple_datum).with(runtime, vec.members[1]).ordered
|
119
|
-
|
120
|
-
expect(listener).to receive(:
|
121
|
-
expect(listener).to receive(:
|
122
|
-
expect(
|
123
|
-
expect(listener).to receive(:before_simple_datum).with(runtime, nested_list.
|
124
|
-
expect(listener).to receive(:after_simple_datum).with(runtime, nested_list.
|
125
|
-
expect(listener).to receive(:
|
126
|
-
expect(listener).to receive(:
|
127
|
-
expect(listener).to receive(:
|
128
|
-
expect(listener).to receive(:
|
135
|
+
|
136
|
+
expect(listener).to receive(:before_pair).with(runtime, nested_list).ordered
|
137
|
+
expect(listener).to receive(:before_car).with(runtime, nested_list, nested_list.car).ordered
|
138
|
+
expect(nested_list.car).to eq('uno')
|
139
|
+
expect(listener).to receive(:before_simple_datum).with(runtime, nested_list.car).ordered
|
140
|
+
expect(listener).to receive(:after_simple_datum).with(runtime, nested_list.car).ordered
|
141
|
+
expect(listener).to receive(:after_car).with(runtime, nested_list, nested_list.car).ordered
|
142
|
+
expect(listener).to receive(:before_cdr).with(runtime, nested_list, nested_list.cdr).ordered
|
143
|
+
expect(listener).to receive(:before_pair).with(runtime, nested_list.cdr).ordered
|
144
|
+
expect(listener).to receive(:before_car).with(runtime, nested_list.cdr, nested_list.cdr.car).ordered
|
145
|
+
expect(listener).to receive(:before_simple_datum).with(runtime, nested_list.cdr.car).ordered
|
146
|
+
expect(listener).to receive(:after_simple_datum).with(runtime, nested_list.cdr.car).ordered
|
147
|
+
expect(listener).to receive(:after_car).with(runtime, nested_list.cdr, nested_list.cdr.car).ordered
|
148
|
+
expect(listener).to receive(:before_cdr).with(runtime, nested_list.cdr, nested_list.cdr.cdr).ordered
|
149
|
+
expect(listener).to receive(:before_pair).with(runtime, nested_list.cdr.cdr).ordered
|
150
|
+
expect(listener).to receive(:before_car).with(runtime, nested_list.cdr.cdr, nested_list.cdr.cdr.car).ordered
|
151
|
+
expect(listener).to receive(:before_simple_datum).with(runtime, nested_list.cdr.cdr.car).ordered
|
152
|
+
expect(listener).to receive(:after_simple_datum).with(runtime, nested_list.cdr.cdr.car).ordered
|
153
|
+
expect(listener).to receive(:after_car).with(runtime, nested_list.cdr.cdr, nested_list.cdr.cdr.car).ordered
|
154
|
+
expect(listener).to receive(:before_cdr).with(runtime, nested_list.cdr.cdr, nested_list.cdr.cdr.cdr).ordered
|
155
|
+
expect(listener).to receive(:before_empty_list).with(runtime, nested_list.cdr.cdr.cdr).ordered
|
156
|
+
expect(listener).to receive(:after_empty_list).with(runtime, nested_list.cdr.cdr.cdr).ordered
|
157
|
+
expect(listener).to receive(:after_cdr).with(runtime, nested_list.cdr.cdr, nested_list.cdr.cdr.cdr).ordered
|
158
|
+
expect(listener).to receive(:after_pair).with(runtime, nested_list.cdr.cdr).ordered
|
159
|
+
expect(listener).to receive(:after_cdr).with(runtime, nested_list.cdr, nested_list.cdr.cdr).ordered
|
160
|
+
expect(listener).to receive(:after_pair).with(runtime, nested_list.cdr).ordered
|
161
|
+
expect(listener).to receive(:after_cdr).with(runtime, nested_list, nested_list.cdr).ordered
|
162
|
+
expect(listener).to receive(:after_pair).with(runtime, nested_list).ordered
|
129
163
|
expect(listener).to receive(:before_simple_datum).with(runtime, vec.members[3]).ordered
|
130
164
|
expect(listener).to receive(:after_simple_datum).with(runtime, vec.members[3]).ordered
|
131
165
|
expect(listener).to receive(:after_children).with(runtime, vec, vec.members).ordered
|
132
166
|
expect(listener).to receive(:after_compound_datum).with(runtime, vec).ordered
|
133
167
|
instance.start(runtime)
|
134
168
|
end
|
135
|
-
|
136
|
-
# it 'should allow the visit of list datum object' do
|
137
|
-
# subject.subscribe(listener)
|
138
|
-
# expect(listener).to receive(:before_compound_datum).with(runtime, simple_datum)
|
139
|
-
# expect(listener).to receive(:after_compound_datum).with(runtime, simple_datum)
|
140
|
-
# subject.start(runtime)
|
141
|
-
# expect(subject.runtime).to eq(runtime)
|
142
|
-
# end
|
143
169
|
end # context
|
144
|
-
|
145
|
-
=begin
|
146
|
-
it 'should react to the start_visit_nonterminal message' do
|
147
|
-
# Notify subscribers when start the visit of a non-terminal node
|
148
|
-
expect(listener1).to receive(:before_non_terminal).with(nterm_node)
|
149
|
-
subject.visit_nonterminal(nterm_node)
|
150
|
-
end
|
151
|
-
|
152
|
-
it 'should react to the visit_children message' do
|
153
|
-
# Notify subscribers when start the visit of children nodes
|
154
|
-
children = nterm_node.subnodes
|
155
|
-
args = [nterm_node, children]
|
156
|
-
expect(listener1).to receive(:before_subnodes).with(*args)
|
157
|
-
expect(listener1).to receive(:before_terminal).with(children[0])
|
158
|
-
expect(listener1).to receive(:after_terminal).with(children[0])
|
159
|
-
expect(listener1).to receive(:after_subnodes).with(nterm_node, children)
|
160
|
-
subject.send(:traverse_subnodes, nterm_node)
|
161
|
-
end
|
162
|
-
|
163
|
-
it 'should react to the end_visit_nonterminal message' do
|
164
|
-
# Notify subscribers when ending the visit of a non-terminal node
|
165
|
-
expect(listener1).to receive(:after_non_terminal).with(nterm_node)
|
166
|
-
subject.end_visit_nonterminal(nterm_node)
|
167
|
-
end
|
168
|
-
=end
|
169
170
|
end # describe
|
170
171
|
end # module
|