skeem 0.0.26 → 0.0.27
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 +6 -0
- data/lib/skeem/primitive/primitive_procedure.rb +1 -0
- data/lib/skeem/runtime.rb +2 -2
- data/lib/skeem/s_expr_nodes.rb +34 -9
- data/lib/skeem/version.rb +1 -1
- data/spec/skeem/interpreter_spec.rb +31 -17
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a462458401748edba53f3c95f80b56478d7cfeb0
|
4
|
+
data.tar.gz: bca52ec89e55cfe23c95e644da601fd2557877c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fbcbaf830c1ba588cd34700f7ebc4f7815b0972efa8ddd496fbda977538e2d5921cdb88830e880ee2cc4c6a7ecb6f214d903ea945a970b46653d366de22b4fc0
|
7
|
+
data.tar.gz: 959251339c07128dc76a7557761d915cacea326432bf4ab0e3728d894f63bf2fe609d743ea07b1b0753ca65d728528e2d4fe8b3b246bf381ddd0b74533aca1ca
|
data/CHANGELOG.md
CHANGED
data/lib/skeem/runtime.rb
CHANGED
data/lib/skeem/s_expr_nodes.rb
CHANGED
@@ -121,6 +121,7 @@ module Skeem
|
|
121
121
|
attr_reader :operator
|
122
122
|
attr_reader :operands
|
123
123
|
attr_accessor :call_site
|
124
|
+
attr_accessor :operands_consumed
|
124
125
|
|
125
126
|
def initialize(aPosition, anOperator, theOperands)
|
126
127
|
super(aPosition)
|
@@ -131,13 +132,28 @@ module Skeem
|
|
131
132
|
@operator = anOperator
|
132
133
|
end
|
133
134
|
@operands = SkmList.new(theOperands)
|
135
|
+
@operands_consumed = false
|
134
136
|
end
|
135
137
|
|
136
138
|
def evaluate(aRuntime)
|
139
|
+
aRuntime.push_call(self)
|
137
140
|
if operator.kind_of?(SkmLambda)
|
138
141
|
procedure = operator
|
139
142
|
else
|
140
143
|
var_key = operator.evaluate(aRuntime)
|
144
|
+
if operator.kind_of?(ProcedureCall) && operands_consumed
|
145
|
+
return var_key
|
146
|
+
end
|
147
|
+
begin
|
148
|
+
aRuntime.include?(var_key.value)
|
149
|
+
rescue NoMethodError
|
150
|
+
$stderr.puts "VVVVVVVVVVVVVVV"
|
151
|
+
$stderr.puts 'var_key: ' + var_key.inspect
|
152
|
+
$stderr.puts 'operator: ' + operator.inspect
|
153
|
+
$stderr.puts 'operands: ' + operands.inspect
|
154
|
+
$stderr.puts 'operands_consumed: ' + operands_consumed.inspect
|
155
|
+
$stderr.puts "^^^^^^^^^^^^^^^"
|
156
|
+
end
|
141
157
|
unless aRuntime.include?(var_key.value)
|
142
158
|
err = StandardError
|
143
159
|
key = var_key.kind_of?(SkmIdentifier) ? var_key.value : var_key
|
@@ -145,13 +161,16 @@ module Skeem
|
|
145
161
|
raise err, err_msg
|
146
162
|
end
|
147
163
|
procedure = aRuntime.environment.fetch(var_key.value)
|
148
|
-
# $stderr.puts "## CALL(#{var_key.value}) ###################"
|
149
|
-
# $stderr.puts operands.inspect
|
150
164
|
end
|
151
|
-
|
165
|
+
# $stderr.puts "## In ProcCall #{var_key.value} #############"
|
166
|
+
# $stderr.puts 'operator: ' + operator.inspect
|
167
|
+
# $stderr.puts 'operands: ' + operands.inspect
|
168
|
+
# $stderr.puts "## CALL(#{var_key.value}) ###################"
|
169
|
+
# $stderr.puts 'callee: ' + procedure.inspect
|
152
170
|
result = procedure.call(aRuntime, self)
|
171
|
+
operands_consumed = true
|
153
172
|
aRuntime.pop_call
|
154
|
-
# $stderr.puts "## RETURN #{result.inspect}"
|
173
|
+
# $stderr.puts "## RETURN #{result.inspect} from #{var_key.value}"
|
155
174
|
result
|
156
175
|
end
|
157
176
|
|
@@ -317,7 +336,6 @@ module Skeem
|
|
317
336
|
def call(aRuntime, aProcedureCall)
|
318
337
|
aRuntime.nest
|
319
338
|
bind_locals(aRuntime, aProcedureCall)
|
320
|
-
# TODO remove next line
|
321
339
|
# $stderr.puts aRuntime.environment.inspect
|
322
340
|
result = evaluate_defs(aRuntime)
|
323
341
|
result = evaluate_sequence(aRuntime)
|
@@ -382,7 +400,14 @@ module Skeem
|
|
382
400
|
def evaluate_sequence(aRuntime)
|
383
401
|
result = nil
|
384
402
|
if sequence
|
385
|
-
sequence.each
|
403
|
+
sequence.each do |cmd|
|
404
|
+
if cmd.kind_of?(SkmLambda)
|
405
|
+
aRuntime.caller(-2).operands_consumed = true
|
406
|
+
result = cmd.call(aRuntime, aRuntime.caller(-2))
|
407
|
+
else
|
408
|
+
result = cmd.evaluate(aRuntime)
|
409
|
+
end
|
410
|
+
end
|
386
411
|
end
|
387
412
|
|
388
413
|
result
|
@@ -411,10 +436,10 @@ module Skeem
|
|
411
436
|
end
|
412
437
|
end
|
413
438
|
|
414
|
-
def msg_arity_mismatch(
|
439
|
+
def msg_arity_mismatch(aProcCall)
|
415
440
|
# *** ERROR: wrong number of arguments for #<closure morph> (required 2, got 1)
|
416
|
-
msg1 = "Wrong number of arguments for procedure #{operator} "
|
417
|
-
count_actuals =
|
441
|
+
msg1 = "Wrong number of arguments for procedure #{aProcCall.operator} "
|
442
|
+
count_actuals = aProcCall.operands.members.size
|
418
443
|
msg2 = "(required #{required_arity}, got #{count_actuals})"
|
419
444
|
msg1 + msg2
|
420
445
|
end
|
data/lib/skeem/version.rb
CHANGED
@@ -202,7 +202,7 @@ SKEEM
|
|
202
202
|
result = subject.run(source)
|
203
203
|
expect(result).to be_kind_of(SkmList)
|
204
204
|
expect(result).to be_null
|
205
|
-
end
|
205
|
+
end
|
206
206
|
|
207
207
|
it 'should implement the lambda function with one arg' do
|
208
208
|
source = <<-SKEEM
|
@@ -332,7 +332,7 @@ SKEEM
|
|
332
332
|
expect(result.members[index]).to eq(value)
|
333
333
|
end
|
334
334
|
end
|
335
|
-
|
335
|
+
|
336
336
|
it 'should implement the unquote of vectors' do
|
337
337
|
source = '`#( ,(+ 1 2) 4)'
|
338
338
|
result = subject.run(source)
|
@@ -350,7 +350,7 @@ SKEEM
|
|
350
350
|
result = subject.run(source)
|
351
351
|
expect(result).to be_kind_of(SkmVector)
|
352
352
|
expect(result).to be_empty
|
353
|
-
|
353
|
+
|
354
354
|
# Nested vectors
|
355
355
|
source = '`#(a b #(,(+ 2 3) c) d)'
|
356
356
|
result = subject.run(source)
|
@@ -365,9 +365,9 @@ SKEEM
|
|
365
365
|
predictions.each_with_index do |(type, value), index|
|
366
366
|
expect(result.members[index]).to be_kind_of(type)
|
367
367
|
expect(result.members[index]).to eq(value)
|
368
|
-
end
|
369
|
-
end
|
370
|
-
|
368
|
+
end
|
369
|
+
end
|
370
|
+
|
371
371
|
it 'should implement the quasiquotation of lists' do
|
372
372
|
source = '(quasiquote (+ 1 2))'
|
373
373
|
result = subject.run(source)
|
@@ -387,7 +387,7 @@ SKEEM
|
|
387
387
|
expect(result).to be_kind_of(SkmList)
|
388
388
|
expect(result).to be_null
|
389
389
|
end
|
390
|
-
|
390
|
+
|
391
391
|
it 'should implement the unquote of lists' do
|
392
392
|
source = '`(list ,(+ 1 2) 4)'
|
393
393
|
result = subject.run(source)
|
@@ -406,7 +406,7 @@ SKEEM
|
|
406
406
|
result = subject.run(source)
|
407
407
|
expect(result).to be_kind_of(SkmList)
|
408
408
|
expect(result).to be_null
|
409
|
-
|
409
|
+
|
410
410
|
# nested lists
|
411
411
|
source = '`(a b (,(+ 2 3) c) d)'
|
412
412
|
result = subject.run(source)
|
@@ -421,22 +421,22 @@ SKEEM
|
|
421
421
|
predictions.each_with_index do |(type, value), index|
|
422
422
|
expect(result.members[index]).to be_kind_of(type)
|
423
423
|
expect(result.members[index]).to eq(value)
|
424
|
-
end
|
424
|
+
end
|
425
425
|
end
|
426
426
|
=begin
|
427
427
|
`(+ 2 ,(* 3 4)) (+ 2 12)
|
428
428
|
`(a b ,(reverse '(c d e)) f g) (a b (e d c) f g)
|
429
429
|
(let ([a 1] [b 2])
|
430
|
-
`(,a . ,b)) (1 . 2)
|
430
|
+
`(,a . ,b)) (1 . 2)
|
431
431
|
|
432
432
|
`(+ ,@(cdr '(* 2 3))) (+ 2 3)
|
433
433
|
`(a b ,@(reverse '(c d e)) f g) (a b e d c f g)
|
434
434
|
(let ([a 1] [b 2])
|
435
435
|
`(,a ,@b)) (1 . 2)
|
436
|
-
`#(,@(list 1 2 3)) #(1 2 3)
|
436
|
+
`#(,@(list 1 2 3)) #(1 2 3)
|
437
437
|
|
438
438
|
'`,(cons 'a 'b) `,(cons 'a 'b)
|
439
|
-
`',(cons 'a 'b) '(a . b)
|
439
|
+
`',(cons 'a 'b) '(a . b)
|
440
440
|
=end
|
441
441
|
end # context
|
442
442
|
|
@@ -567,7 +567,7 @@ SKEEM
|
|
567
567
|
expect(result).to eq(expectation)
|
568
568
|
end
|
569
569
|
end
|
570
|
-
|
570
|
+
|
571
571
|
it 'should implement the not procedure' do
|
572
572
|
checks = [
|
573
573
|
['(not #t)', false],
|
@@ -582,8 +582,8 @@ SKEEM
|
|
582
582
|
result = subject.run(skeem_expr)
|
583
583
|
expect(result).to eq(expectation)
|
584
584
|
end
|
585
|
-
end
|
586
|
-
|
585
|
+
end
|
586
|
+
|
587
587
|
it 'should implement the list procedure' do
|
588
588
|
checks = [
|
589
589
|
['(list)', []],
|
@@ -595,7 +595,7 @@ SKEEM
|
|
595
595
|
expect(result.members).to eq(expectation)
|
596
596
|
end
|
597
597
|
end
|
598
|
-
|
598
|
+
|
599
599
|
it 'should implement the symbol=? procedure' do
|
600
600
|
checks = [
|
601
601
|
["(symbol=? 'a 'a)", true],
|
@@ -606,7 +606,21 @@ SKEEM
|
|
606
606
|
result = subject.run(skeem_expr)
|
607
607
|
expect(result).to eq(expectation)
|
608
608
|
end
|
609
|
-
end
|
609
|
+
end
|
610
|
+
end # context
|
611
|
+
|
612
|
+
context 'More advanced tests' do
|
613
|
+
it 'should implement second-order functions' do
|
614
|
+
source = <<-SKEEM
|
615
|
+
(define compose
|
616
|
+
(lambda (f g)
|
617
|
+
(lambda (x)
|
618
|
+
(f (g x)))))
|
619
|
+
((compose list square) 5)
|
620
|
+
SKEEM
|
621
|
+
result = subject.run(source)
|
622
|
+
expect(result.last.members).to eq([25])
|
623
|
+
end
|
610
624
|
end # context
|
611
625
|
end # describe
|
612
626
|
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.
|
4
|
+
version: 0.0.27
|
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-
|
11
|
+
date: 2018-12-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rley
|