skeem 0.2.01 → 0.2.02
Sign up to get free protection for your applications and to get access to all the features.
- 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
|