skeem 0.2.01 → 0.2.02
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 +4 -1
- data/README.md +5 -0
- data/lib/skeem/grammar.rb +2 -0
- data/lib/skeem/s_expr_builder.rb +5 -0
- data/lib/skeem/skm_unary_expression.rb +6 -1
- data/lib/skeem/tokenizer.rb +1 -0
- data/lib/skeem/version.rb +1 -1
- data/spec/skeem/interpreter_spec.rb +16 -5
- 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: ff26a0c0a06cb583052e17627fd7c620e26dc5c595613f1f6d5716a368c154b7
|
4
|
+
data.tar.gz: e7697be919dc2624c449ff001524d426ff914b2e09f8bc69f581599bd3961148
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a2ec84eec62e1bd007b480f89a843af69c023259dcfd37ae5808c8f7266f904ac0a6ab6ee8eb4f1877d3fbe16735c39c281c18ca16ee27c09307ae48f677287
|
7
|
+
data.tar.gz: e58e2a58401d9b8d6c17c9394029a4e2438917682e767e0541262c98ff4c0011dd8fd6b2fe998c019c96c7ce0a6007d2697d5987271858fba7c80d053242ba41
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -168,6 +168,11 @@ __Syntax:__
|
|
168
168
|
* (let (<binding_spec\*\>) <body\>)
|
169
169
|
|
170
170
|
|
171
|
+
#### let*
|
172
|
+
__Purpose:__ Define one or more variable local to the block.
|
173
|
+
__Syntax:__
|
174
|
+
* (let* (<binding_spec\*\>) <body\>)
|
175
|
+
|
171
176
|
### Standard library
|
172
177
|
This section lists the implemented standard procedures
|
173
178
|
|
data/lib/skeem/grammar.rb
CHANGED
@@ -20,6 +20,7 @@ module Skeem
|
|
20
20
|
|
21
21
|
# Keywords...
|
22
22
|
add_terminals('DEFINE', 'IF', 'LAMBDA', 'LET')
|
23
|
+
add_terminals('LET*')
|
23
24
|
add_terminals('QUOTE', 'QUASIQUOTE', 'SET!')
|
24
25
|
add_terminals('UNQUOTE', 'UNQUOTE-SPLICING')
|
25
26
|
|
@@ -93,6 +94,7 @@ module Skeem
|
|
93
94
|
rule 'number' => 'REAL'
|
94
95
|
rule('assignment' => 'LPAREN SET! IDENTIFIER expression RPAREN').as 'assignment'
|
95
96
|
rule('derived_expression' => 'LPAREN LET LPAREN binding_spec_star RPAREN body RPAREN').as 'short_let_form'
|
97
|
+
rule('derived_expression' => 'LPAREN LET* LPAREN binding_spec_star RPAREN body RPAREN').as 'let_star_form'
|
96
98
|
rule 'derived_expression' => 'quasiquotation'
|
97
99
|
rule('quasiquotation' => 'LPAREN QUASIQUOTE qq_template RPAREN').as 'quasiquotation'
|
98
100
|
rule('quasiquotation' => 'GRAVE_ACCENT qq_template').as 'quasiquotation_short'
|
data/lib/skeem/s_expr_builder.rb
CHANGED
@@ -256,6 +256,11 @@ module Skeem
|
|
256
256
|
def reduce_short_let_form(_production, aRange, _tokens, theChildren)
|
257
257
|
SkmBindingBlock.new(:let, theChildren[3], theChildren[5])
|
258
258
|
end
|
259
|
+
|
260
|
+
# rule('derived_expression' => 'LPAREN LET* LPAREN binding_spec_star RPAREN body RPAREN').as 'let_star_form'
|
261
|
+
def reduce_let_star_form(_production, aRange, _tokens, theChildren)
|
262
|
+
SkmBindingBlock.new(:let_star, theChildren[3], theChildren[5])
|
263
|
+
end
|
259
264
|
|
260
265
|
# rule('quasiquotation' => 'LPAREN QUASIQUOTE qq_template RPAREN').as 'quasiquotation'
|
261
266
|
def reduce_quasiquotation(_production, aRange, _tokens, theChildren)
|
@@ -125,14 +125,19 @@ module Skeem
|
|
125
125
|
end
|
126
126
|
|
127
127
|
def evaluate(aRuntime)
|
128
|
+
aRuntime.push(SkmFrame.new(aRuntime.environment))
|
128
129
|
if kind == :let
|
129
|
-
aRuntime.push(SkmFrame.new(aRuntime.environment))
|
130
130
|
locals = bindings.map do |bnd|
|
131
131
|
SkmBinding.new(bnd.variable, bnd.value.evaluate(aRuntime))
|
132
132
|
end
|
133
133
|
locals.each do |bnd|
|
134
134
|
aRuntime.add_binding(bnd.variable.evaluate(aRuntime), bnd.value)
|
135
135
|
end
|
136
|
+
elsif kind == :let_star
|
137
|
+
bindings.each do |bnd|
|
138
|
+
val = bnd.value.evaluate(aRuntime)
|
139
|
+
aRuntime.add_binding(bnd.variable.evaluate(aRuntime), val)
|
140
|
+
end
|
136
141
|
end
|
137
142
|
|
138
143
|
result = body[:sequence].evaluate(aRuntime)
|
data/lib/skeem/tokenizer.rb
CHANGED
data/lib/skeem/version.rb
CHANGED
@@ -305,7 +305,7 @@ SKEEM
|
|
305
305
|
expect(result.last.last.value).to eq(4)
|
306
306
|
end
|
307
307
|
end # context
|
308
|
-
|
308
|
+
|
309
309
|
context 'Binding constructs:' do
|
310
310
|
it 'should implement local bindings' do
|
311
311
|
source = <<-SKEEM
|
@@ -316,7 +316,7 @@ SKEEM
|
|
316
316
|
result = subject.run(source)
|
317
317
|
expect(result).to eq(6)
|
318
318
|
end
|
319
|
-
|
319
|
+
|
320
320
|
it 'should implement precedence of local bindings' do
|
321
321
|
source = <<-SKEEM
|
322
322
|
(define x 23)
|
@@ -328,8 +328,8 @@ SKEEM
|
|
328
328
|
SKEEM
|
329
329
|
result = subject.run(source)
|
330
330
|
expect(result.last).to eq(66)
|
331
|
-
end
|
332
|
-
|
331
|
+
end
|
332
|
+
|
333
333
|
it 'should support the nesting of local bindings' do
|
334
334
|
source = <<-SKEEM
|
335
335
|
(let ((x 2) (y 3))
|
@@ -339,7 +339,18 @@ SKEEM
|
|
339
339
|
SKEEM
|
340
340
|
result = subject.run(source)
|
341
341
|
expect(result).to eq(35)
|
342
|
-
end
|
342
|
+
end
|
343
|
+
|
344
|
+
it 'should implement let* expression' do
|
345
|
+
source = <<-SKEEM
|
346
|
+
(let ((x 2) (y 3))
|
347
|
+
(let* ((x 7)
|
348
|
+
(z (+ x y)))
|
349
|
+
(* z x)))
|
350
|
+
SKEEM
|
351
|
+
result = subject.run(source)
|
352
|
+
expect(result).to eq(70)
|
353
|
+
end
|
343
354
|
end # context
|
344
355
|
|
345
356
|
context 'Quasiquotation:' do
|
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.02
|
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-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rley
|