skeem 0.0.5 → 0.0.6
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 +11 -0
- data/README.md +24 -15
- data/lib/skeem/interpreter.rb +16 -0
- data/lib/skeem/s_expr_nodes.rb +1 -1
- data/lib/skeem/version.rb +1 -1
- data/lib/skeem.rb +1 -1
- data/spec/skeem/interpreter_spec.rb +84 -0
- data/spec/skeem/parser_spec.rb +12 -13
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bfe901703f31ea172032969d5a52e73a99467917
|
4
|
+
data.tar.gz: e9ea6993d7f4f4a107e4c43dc8e342affe103439
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b034f52223d95e8d40e3de77596b126484116f900a5890d7da6c9f9de56a0ed1cd08d0ac0e80d1e6b92acc17da6663f3da55eb7b01a2041512e109d3a423285
|
7
|
+
data.tar.gz: f315e8f48f9c97391df7a665fd01c2fc6ea4ed292bc9c075bec7332e2706a01cfe00c0aad0ea6d54fccc50e3fb84bc8afc10596a8cedc3726413d3824343baac
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
## [0.0.6] - 2018-09-01
|
2
|
+
Initial (minimalistic) interpreter implementation.
|
3
|
+
### Added
|
4
|
+
- Class `Interpreter`.
|
5
|
+
- Spec file `interpreter_spec.rb` initial test suite for the interpreter.
|
6
|
+
|
7
|
+
### Changed
|
8
|
+
- File `README.md` Udpates, sample code snippet added, link to other similar project `heist`.
|
9
|
+
- Method `SExprTerminalNode#interpret` returns self instead of the `value` attribute.
|
10
|
+
|
11
|
+
|
1
12
|
## [0.0.5] - 2018-08-30
|
2
13
|
Parser now generates correct parse trees for expressions consisting of a single literal.
|
3
14
|
|
data/README.md
CHANGED
@@ -25,32 +25,41 @@ Or install it yourself as:
|
|
25
25
|
## Usage
|
26
26
|
|
27
27
|
The __Skeem__ project has just started.
|
28
|
-
At this stage, the gem consists of a
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
At this stage, the gem consists of a bare-bones interpreter.
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
require 'skeem'
|
32
|
+
|
33
|
+
schemer = Skeem::Interpreter.new
|
34
|
+
scheme_code = '"Hello, world"'
|
35
|
+
result = schemer.run(scheme_code)
|
36
|
+
puts result.value # => "Hello, world"
|
37
|
+
```
|
33
38
|
|
34
39
|
Roadmap:
|
40
|
+
- Extend language support
|
41
|
+
- Implement REPL
|
35
42
|
- Implement an equivalent of [lis.py](http://www.norvig.com/lispy.html)
|
36
43
|
- Implement an equivalent of [lispy](http://norvig.com/lispy2.html)
|
37
44
|
- Make it pass the test suite
|
38
45
|
- Extend the language in order to support [Minikanren](https://github.com/TheReasonedSchemer2ndEd/CodeFromTheReasonedSchemer2ndEd)
|
39
46
|
- Make it pass all examples from the [Reasoned Schemer](https://mitpress.mit.edu/books/reasoned-schemer-second-edition) book.
|
40
47
|
|
41
|
-
TODO: Write usage instructions here
|
42
48
|
|
43
49
|
Good to know:
|
44
50
|
Online book: [The Scheme Programming Language (4th Ed.)](https://www.scheme.com/tspl4/). Remark: covers an older version of Scheme.
|
45
|
-
|
46
|
-
##
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
51
|
+
|
52
|
+
## Implemented Scheme R7RS features:
|
53
|
+
|
54
|
+
### Literals
|
55
|
+
* Boolean literals: `#t`, `#true`, `#f` and `#false`
|
56
|
+
* Numeric literals for integers and reals.
|
57
|
+
* `string` and `identifier` literals
|
58
|
+
|
59
|
+
## Other similar Ruby projects
|
60
|
+
__Skeem__ isn't the sole implementation of the Scheme language in Ruby.
|
61
|
+
Here are a few other ones:
|
62
|
+
- [Heist gem](https://rubygems.org/gems/heist) -- Probably one of best Scheme implementation in Ruby. Really worth a try. Alas, the [project](https://github.com/jcoglan/heist) seems to be dormant for several years.
|
54
63
|
|
55
64
|
## Contributing
|
56
65
|
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require_relative 'parser'
|
2
|
+
|
3
|
+
module Skeem
|
4
|
+
class Interpreter
|
5
|
+
attr_reader(:parser)
|
6
|
+
|
7
|
+
def initialize()
|
8
|
+
end
|
9
|
+
|
10
|
+
def run(source)
|
11
|
+
@parser ||= Parser.new
|
12
|
+
@ptree = parser.parse(source)
|
13
|
+
return @ptree.root.interpret
|
14
|
+
end
|
15
|
+
end # class
|
16
|
+
end # module
|
data/lib/skeem/s_expr_nodes.rb
CHANGED
data/lib/skeem/version.rb
CHANGED
data/lib/skeem.rb
CHANGED
@@ -0,0 +1,84 @@
|
|
1
|
+
require_relative '../spec_helper' # Use the RSpec framework
|
2
|
+
require_relative '../../lib/skeem/interpreter' # Load the class under test
|
3
|
+
|
4
|
+
module Skeem
|
5
|
+
describe Interpreter do
|
6
|
+
context 'Initialization:' do
|
7
|
+
it 'should be initialized without argument' do
|
8
|
+
expect { Interpreter.new() }.not_to raise_error
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should not have its parser initialized' do
|
12
|
+
expect(subject.parser).to be_nil
|
13
|
+
end
|
14
|
+
end # context
|
15
|
+
|
16
|
+
context 'Interpreting self-evaluating expressions' do
|
17
|
+
it 'should evaluate isolated booleans' do
|
18
|
+
samples = [
|
19
|
+
['#f', false],
|
20
|
+
['#false', false],
|
21
|
+
['#t', true],
|
22
|
+
['#true', true]
|
23
|
+
]
|
24
|
+
samples.each do |source, predicted|
|
25
|
+
result = subject.run(source)
|
26
|
+
expect(result).to be_kind_of(SExprBooleanNode)
|
27
|
+
expect(result.value).to eq(predicted)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should evaluate isolated integers' do
|
33
|
+
samples = [
|
34
|
+
['0', 0],
|
35
|
+
['3', 3],
|
36
|
+
['-3', -3],
|
37
|
+
['+12345', 12345],
|
38
|
+
['-12345', -12345]
|
39
|
+
]
|
40
|
+
samples.each do |source, predicted|
|
41
|
+
result = subject.run(source)
|
42
|
+
expect(result).to be_kind_of(SExprIntegerNode)
|
43
|
+
expect(result.value).to eq(predicted)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'should evaluate isolated real numbers' do
|
48
|
+
samples = [
|
49
|
+
['0.0', 0.0],
|
50
|
+
['3.14', 3.14],
|
51
|
+
['-3.14', -3.14],
|
52
|
+
['+123e+45', 123e+45],
|
53
|
+
['-123e-45', -123e-45]
|
54
|
+
]
|
55
|
+
samples.each do |source, predicted|
|
56
|
+
result = subject.run(source)
|
57
|
+
expect(result).to be_kind_of(SExprRealNode)
|
58
|
+
expect(result.value).to eq(predicted)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
it 'should evaluate isolated strings' do
|
63
|
+
samples = [
|
64
|
+
['"Hello, world"', 'Hello, world']
|
65
|
+
]
|
66
|
+
samples.each do |source, predicted|
|
67
|
+
result = subject.run(source)
|
68
|
+
expect(result).to be_kind_of(SExprStringNode)
|
69
|
+
expect(result.value).to eq(predicted)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'should evaluate isolated identifiers' do
|
74
|
+
samples = [
|
75
|
+
['the-word-recursion-has-many-meanings', 'the-word-recursion-has-many-meanings']
|
76
|
+
]
|
77
|
+
samples.each do |source, predicted|
|
78
|
+
result = subject.run(source)
|
79
|
+
expect(result).to be_kind_of(SExprIdentifierNode)
|
80
|
+
expect(result.value).to eq(predicted)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end # describe
|
84
|
+
end # module
|
data/spec/skeem/parser_spec.rb
CHANGED
@@ -3,17 +3,16 @@ require_relative '../../lib/skeem/tokenizer' # Load the class under test
|
|
3
3
|
|
4
4
|
module Skeem
|
5
5
|
describe Parser do
|
6
|
-
|
7
6
|
context 'Initialization:' do
|
8
7
|
it 'should be initialized without argument' do
|
9
8
|
expect { Parser.new() }.not_to raise_error
|
10
9
|
end
|
11
10
|
|
12
|
-
it 'should have its
|
11
|
+
it 'should have its parse engine initialized' do
|
13
12
|
expect(subject.engine).to be_kind_of(Rley::Engine)
|
14
|
-
end
|
13
|
+
end
|
15
14
|
end # context
|
16
|
-
|
15
|
+
|
17
16
|
context 'Parsing literals:' do
|
18
17
|
it 'should parse isolated booleans' do
|
19
18
|
samples = [
|
@@ -26,9 +25,9 @@ module Skeem
|
|
26
25
|
ptree = subject.parse(source)
|
27
26
|
expect(ptree.root).to be_kind_of(SExprBooleanNode)
|
28
27
|
expect(ptree.root.value).to eq(predicted)
|
29
|
-
end
|
28
|
+
end
|
30
29
|
end
|
31
|
-
|
30
|
+
|
32
31
|
it 'should parse isolated integers' do
|
33
32
|
samples = [
|
34
33
|
['0', 0],
|
@@ -41,9 +40,9 @@ module Skeem
|
|
41
40
|
ptree = subject.parse(source)
|
42
41
|
expect(ptree.root).to be_kind_of(SExprIntegerNode)
|
43
42
|
expect(ptree.root.value).to eq(predicted)
|
44
|
-
end
|
43
|
+
end
|
45
44
|
end
|
46
|
-
|
45
|
+
|
47
46
|
it 'should parse isolated real numbers' do
|
48
47
|
samples = [
|
49
48
|
['0.0', 0.0],
|
@@ -56,7 +55,7 @@ module Skeem
|
|
56
55
|
ptree = subject.parse(source)
|
57
56
|
expect(ptree.root).to be_kind_of(SExprRealNode)
|
58
57
|
expect(ptree.root.value).to eq(predicted)
|
59
|
-
end
|
58
|
+
end
|
60
59
|
end
|
61
60
|
|
62
61
|
it 'should parse isolated strings' do
|
@@ -67,7 +66,7 @@ module Skeem
|
|
67
66
|
ptree = subject.parse(source)
|
68
67
|
expect(ptree.root).to be_kind_of(SExprStringNode)
|
69
68
|
expect(ptree.root.value).to eq(predicted)
|
70
|
-
end
|
69
|
+
end
|
71
70
|
end
|
72
71
|
|
73
72
|
it 'should parse isolated identifiers' do
|
@@ -78,11 +77,11 @@ module Skeem
|
|
78
77
|
ptree = subject.parse(source)
|
79
78
|
expect(ptree.root).to be_kind_of(SExprIdentifierNode)
|
80
79
|
expect(ptree.root.value).to eq(predicted)
|
81
|
-
end
|
82
|
-
end
|
80
|
+
end
|
81
|
+
end
|
83
82
|
end # context
|
84
83
|
|
85
|
-
context 'Parsing forms:' do
|
84
|
+
context 'Parsing forms:' do
|
86
85
|
# it 'should parse definitions' do
|
87
86
|
# source = '(define r 10)'
|
88
87
|
# expect { subject.parse(source) }.not_to raise_error
|
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.6
|
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-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rley
|
@@ -86,6 +86,7 @@ files:
|
|
86
86
|
- appveyor.yml
|
87
87
|
- lib/skeem.rb
|
88
88
|
- lib/skeem/grammar.rb
|
89
|
+
- lib/skeem/interpreter.rb
|
89
90
|
- lib/skeem/parser.rb
|
90
91
|
- lib/skeem/s_expr_builder.rb
|
91
92
|
- lib/skeem/s_expr_nodes.rb
|
@@ -93,6 +94,7 @@ files:
|
|
93
94
|
- lib/skeem/tokenizer.rb
|
94
95
|
- lib/skeem/version.rb
|
95
96
|
- skeem.gemspec
|
97
|
+
- spec/skeem/interpreter_spec.rb
|
96
98
|
- spec/skeem/parser_spec.rb
|
97
99
|
- spec/skeem/tokenizer_spec.rb
|
98
100
|
- spec/skeem_spec.rb
|
@@ -124,6 +126,7 @@ specification_version: 4
|
|
124
126
|
summary: Skeem is an interpreter of a subset of the Scheme programming language. Scheme
|
125
127
|
is a descendent of the Lisp language.
|
126
128
|
test_files:
|
129
|
+
- spec/skeem/interpreter_spec.rb
|
127
130
|
- spec/skeem/parser_spec.rb
|
128
131
|
- spec/skeem/tokenizer_spec.rb
|
129
132
|
- spec/skeem_spec.rb
|