skeem 0.2.03 → 0.2.04
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 +12 -1
- data/README.md +3 -0
- data/lib/skeem/grammar.rb +1 -1
- data/lib/skeem/primitive/primitive_builder.rb +3 -2
- data/lib/skeem/s_expr_builder.rb +5 -0
- data/lib/skeem/s_expr_nodes.rb +0 -23
- data/lib/skeem/skm_procedure_exec.rb +13 -2
- data/lib/skeem/version.rb +1 -1
- data/spec/skeem/interpreter_spec.rb +14 -0
- data/spec/skeem/primitive/primitive_builder_spec.rb +3 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8efda1e2bcaf2e4d07ca4bc52f3708c0e217b27c191d6ed0a42d3b7125e26de5
|
4
|
+
data.tar.gz: '0359bae57e376f724f17b0e10bcc819f6fe8ee1f2478d2b330111c16546ab8ec'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48f64eea51bbbe3e701214101ad7bf114cf45ef4281db722de2b2786d0e932793cf6945bd2cfbb6afc8ea320264ca7eb920fc79d0f7a81ac49efd1cd9af863c1
|
7
|
+
data.tar.gz: d4ae84b2ebf2d3a20efcbb950d11ea1fc2b31b06a62d33c5fd375df6ff726a0a0b51f2a693f8cb3d0a47864de59ed79f2fbafe2cad9e99092ce25f0784271944
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,18 @@
|
|
1
|
+
## [0.2.04] - 2019-04-29
|
2
|
+
- Support for local definitions [initial]
|
3
|
+
|
4
|
+
### Changed
|
5
|
+
- File `grammar.rb` Added one production rule for third `begin` form syntax.
|
6
|
+
- Method `SkmBuilder#reduce_begin_cmd` added to implement semantic action for new `begin...` production rule.
|
7
|
+
- File `README.md` Added a couple of links for additional Scheme resources.
|
8
|
+
|
9
|
+
|
10
|
+
### Removed
|
11
|
+
- Method `SkmLambda#evaluate_defs` replaced by homonymous method in `SkmProcedureExec` class.
|
12
|
+
|
1
13
|
## [0.2.03] - 2019-04-26
|
2
14
|
### Changed
|
3
15
|
- File `README.md` added new example with procedures holding each their local states.
|
4
|
-
|
5
16
|
### Fixed
|
6
17
|
- The nesting of a lambda expression nested in a let construct caused an aliasing of the bindings.
|
7
18
|
|
data/README.md
CHANGED
@@ -39,6 +39,8 @@ Here are a few pointers for the Scheme programming language:
|
|
39
39
|
#### Online tutorials and books:
|
40
40
|
- [The Scheme Programming Language, 4th Edition](https://www.scheme.com/tspl4/) by Kent Dybvig. A complete, introductory textbook on Scheme based on the older R5RS standard.
|
41
41
|
- [Teach Yourself Scheme in Fixnum Days](http://ds26gte.github.io/tyscheme/index.html) by Dorai Sitaram
|
42
|
+
- [Yet Another Scheme Tutorial](http://www.shido.info/lisp/idx_scm_e.html) by Shido Takafumi
|
43
|
+
- [An Introduction to Scheme and its Implementation](http://www.cs.utexas.edu/ftp/garbage/cs345/schintro-v14/schintro_toc.html) by Paul R. Wilson
|
42
44
|
|
43
45
|
## Usage
|
44
46
|
|
@@ -253,6 +255,7 @@ Here are a few other ones:
|
|
253
255
|
|
254
256
|
- [rubic gem](https://rubygems.org/gems/rubic). The last commit for the [project](https://github.com/notozeki/rubic) is June 2015.
|
255
257
|
|
258
|
+
- [RLisp](https://github.com/davydovanton/rlisp) ...Simple scheme interpreter written on ruby
|
256
259
|
## Contributing
|
257
260
|
|
258
261
|
Bug reports and pull requests are welcome on GitHub at https://github.com/famished-tiger/Skeem.
|
data/lib/skeem/grammar.rb
CHANGED
@@ -29,7 +29,7 @@ module Skeem
|
|
29
29
|
rule('cmd_or_def_plus' => 'cmd_or_def').as 'last_cmd_def'
|
30
30
|
rule 'cmd_or_def' => 'command'
|
31
31
|
rule 'cmd_or_def' => 'definition'
|
32
|
-
|
32
|
+
rule('cmd_or_def' => 'LPAREN BEGIN cmd_or_def_plus RPAREN').as 'begin_cmd'
|
33
33
|
rule 'command' => 'expression'
|
34
34
|
rule('definition' => 'LPAREN DEFINE IDENTIFIER expression RPAREN').as 'definition'
|
35
35
|
rule('definition' => 'LPAREN DEFINE LPAREN IDENTIFIER def_formals RPAREN body RPAREN').as 'alt_definition'
|
@@ -616,8 +616,9 @@ module Skeem
|
|
616
616
|
assert_call = aRuntime.caller
|
617
617
|
pos = assert_call.call_site
|
618
618
|
# Error: assertion failed: (> 1 2)
|
619
|
-
|
620
|
-
|
619
|
+
msg1 = "assertion failed on line #{pos.line}, column #{pos.column}"
|
620
|
+
msg2 = ", with #{arg.inspect}"
|
621
|
+
raise StandardError, 'Error: ' + msg1 + msg2
|
621
622
|
else
|
622
623
|
boolean(true)
|
623
624
|
end
|
data/lib/skeem/s_expr_builder.rb
CHANGED
@@ -58,6 +58,11 @@ module Skeem
|
|
58
58
|
def reduce_last_cmd_def(_production, _range, _tokens, theChildren)
|
59
59
|
SkmPair.create_from_a([theChildren.last])
|
60
60
|
end
|
61
|
+
|
62
|
+
# rule('cmd_or_def' => 'LPAREN BEGIN cmd_or_def_plus RPAREN').as 'begin_cmd'
|
63
|
+
def reduce_begin_cmd(_production, _range, _tokens, theChildren)
|
64
|
+
SkmSequencingBlock.new(theChildren[2])
|
65
|
+
end
|
61
66
|
|
62
67
|
# rule('definition' => 'LPAREN DEFINE IDENTIFIER expression RPAREN')
|
63
68
|
# .as 'definition'
|
data/lib/skeem/s_expr_nodes.rb
CHANGED
@@ -342,24 +342,6 @@ require_relative 'skm_procedure_exec'
|
|
342
342
|
set_cond_environment(aRuntime.environment) # Last chance for anonymous lambda
|
343
343
|
application = SkmProcedureExec.new(self)
|
344
344
|
application.run!(aRuntime, theActuals)
|
345
|
-
=begin
|
346
|
-
# $stderr.puts "Start of lambda #{object_id.to_s(16)}"
|
347
|
-
aRuntime.nest
|
348
|
-
# $stderr.puts ' Before bind_locals'
|
349
|
-
bind_locals(aRuntime, aProcedureCall)
|
350
|
-
# $stderr.puts ' After bind_locals'
|
351
|
-
# $stderr.puts 'LOCALS vvvvvvvvvvv'
|
352
|
-
# $stderr.puts aRuntime.environment.inspect
|
353
|
-
# $stderr.puts 'LOCALS ^^^^^^^^^^^'
|
354
|
-
result = evaluate_defs(aRuntime)
|
355
|
-
# $stderr.puts ' Before evaluate_sequence'
|
356
|
-
result = evaluate_sequence(aRuntime)
|
357
|
-
# $stderr.puts ' After evaluate_sequence'
|
358
|
-
aRuntime.unnest
|
359
|
-
# $stderr.puts " Result: #{result.inspect}"
|
360
|
-
# $stderr.puts "End of lambda #{object_id.to_s(16)}"
|
361
|
-
result
|
362
|
-
=end
|
363
345
|
end
|
364
346
|
|
365
347
|
def arity
|
@@ -414,7 +396,6 @@ require_relative 'skm_procedure_exec'
|
|
414
396
|
end
|
415
397
|
variadic_arg_name = formals.formals.last
|
416
398
|
args_coll = SkmPair.create_from_a(variadic_part)
|
417
|
-
# a_def = SkmDefinition.new(position, variadic_arg_name, args_coll)
|
418
399
|
a_def = SkmBinding.new(variadic_arg_name, args_coll)
|
419
400
|
a_def.evaluate(aRuntime)
|
420
401
|
aRuntime.add_binding(a_def.variable, a_def.value)
|
@@ -427,10 +408,6 @@ require_relative 'skm_procedure_exec'
|
|
427
408
|
#aProcedureCall.operands_consumed = true
|
428
409
|
end
|
429
410
|
|
430
|
-
def evaluate_defs(aRuntime)
|
431
|
-
definitions.each { |a_def| a_def.evaluate(runtime) }
|
432
|
-
end
|
433
|
-
|
434
411
|
def evaluate_sequence(aRuntime)
|
435
412
|
result = nil
|
436
413
|
if sequence
|
@@ -18,14 +18,25 @@ module Skeem
|
|
18
18
|
runtime = aRuntime
|
19
19
|
runtime.push(frame)
|
20
20
|
definition.bind_locals(runtime, theActuals)
|
21
|
+
evaluate_defs(aRuntime)
|
22
|
+
# definition.evaluate_defs(runtime)
|
21
23
|
# $stderr.puts "Locals"
|
22
|
-
# $stderr.puts frame.bindings.keys.join(', ')
|
23
|
-
definition.evaluate_defs(runtime)
|
24
|
+
# $stderr.puts frame.bindings.keys.join(', ')
|
24
25
|
result = definition.evaluate_sequence(runtime)
|
25
26
|
runtime.pop
|
26
27
|
# $stderr.puts "Lambda result: #{result.object_id.to_s(16)}" if result.kind_of?(SkmLambda)
|
27
28
|
|
28
29
|
result
|
29
30
|
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def evaluate_defs(aRuntime)
|
35
|
+
definition.definitions.each do |bndng|
|
36
|
+
var = bndng.variable.evaluate(aRuntime)
|
37
|
+
val = bndng.value.evaluate(aRuntime)
|
38
|
+
frame.add_binding(var, val)
|
39
|
+
end
|
40
|
+
end
|
30
41
|
end # class
|
31
42
|
end # module
|
data/lib/skeem/version.rb
CHANGED
@@ -304,6 +304,20 @@ SKEEM
|
|
304
304
|
result = subject.run(source)
|
305
305
|
expect(result.last.last.value).to eq(4)
|
306
306
|
end
|
307
|
+
|
308
|
+
|
309
|
+
it 'should support the nested define construct' do
|
310
|
+
source = <<-SKEEM
|
311
|
+
(define (quadruple x)
|
312
|
+
(define (double x) ; define a local procedure double
|
313
|
+
(+ x x))
|
314
|
+
(double (double x))) ; nested calls to the local procedure
|
315
|
+
|
316
|
+
(quadruple 5) ; => 20
|
317
|
+
SKEEM
|
318
|
+
result = subject.run(source)
|
319
|
+
expect(result.last.value).to eq(20)
|
320
|
+
end
|
307
321
|
end # context
|
308
322
|
|
309
323
|
context 'Binding constructs:' do
|
@@ -696,8 +696,9 @@ SKEEM
|
|
696
696
|
(test-assert (> x y))
|
697
697
|
SKEEM
|
698
698
|
err = StandardError
|
699
|
-
|
700
|
-
|
699
|
+
msg1 = 'Error: assertion failed on line 3, column 4'
|
700
|
+
msg2 = 'with <Skeem::SkmBoolean: false>'
|
701
|
+
expect { subject.run(source) }.to raise_error(err, msg1 + ', '+ msg2)
|
701
702
|
end
|
702
703
|
end # context
|
703
704
|
end # describe
|
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.2.
|
4
|
+
version: 0.2.04
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dimitri Geshef
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-04-
|
11
|
+
date: 2019-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rley
|