skeem 0.0.18 → 0.0.19

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 40345a7d71935a1329252989a9203c2acd2df799
4
- data.tar.gz: d6825f7d3703966a81261551dbcde76e3aa9633f
3
+ metadata.gz: 9cb4724d17594667921a2ccd39d5c39891edf55b
4
+ data.tar.gz: e5ac55b88a2c71fb84e5752881e11c36546e5c98
5
5
  SHA512:
6
- metadata.gz: a8a2f3b40f5869a33962577afa77b33ec6e117bdbcba6764ef485cd9a7941fb15d3fd1b708f1488d8b1f5cacea302d186c2c07165ba3fb42ee8ba755aa99e5f1
7
- data.tar.gz: e3ebc87f20fd00380e020e0ca9e24b29e1943d1504bdc4606fda873b05cda6c8af58ed1d497bebc5ee8f0abd40aa2fc2bdf6d9e74250e7c1d4a28acdee831e1d
6
+ metadata.gz: f70733db86074f7828e19bfb069f957372bfc10e95d2fa0d85484de418b147d6392ff357f533977d6d10db4fa08a29372f916274dd2d192fa6bdd8887561f608
7
+ data.tar.gz: 5ed2a9db63d57adb2d93cb1c99d4b5d40a452f5174531d3c06522c80c6f1914c34fd4e97ca02059e3c733a227d3dfb22c9eeba363b01dadb7d75786ad90f3c48
data/CHANGELOG.md CHANGED
@@ -1,3 +1,14 @@
1
+ ## [0.0.19] - 2018-10-15
2
+ Added primitive procedures `list?`, `null?`, `length`
3
+
4
+ ### Added
5
+ - File `primitive_builder.rb` implementation of: `list?`, `null?`, `length` procedures.
6
+ - File `primitive_builder_spec.rb` spec examples for: `list?`, `null?`, `length` procedures.
7
+
8
+ ### Fixed
9
+ - Method `SkmLambda#bind_locals` Fix: a variadic procedure with no argument provided, should have empty list as actual argument.
10
+ - File `interpreter_spec.rb` Added test case for calling `list` procedure without argument.
11
+
1
12
  ## [0.0.18] - 2018-10-14
2
13
  Reworked procedure argument-passing.
3
14
 
@@ -12,6 +12,7 @@ module Skeem
12
12
  add_boolean_procedures(aRuntime)
13
13
  add_string_procedures(aRuntime)
14
14
  add_symbol_procedures(aRuntime)
15
+ add_list_procedures(aRuntime)
15
16
  add_io_procedures(aRuntime)
16
17
  add_special_procedures(aRuntime)
17
18
  end
@@ -72,6 +73,12 @@ module Skeem
72
73
  def add_symbol_procedures(aRuntime)
73
74
  create_symbol?(aRuntime)
74
75
  end
76
+
77
+ def add_list_procedures(aRuntime)
78
+ create_list?(aRuntime)
79
+ create_null?(aRuntime)
80
+ create_length(aRuntime)
81
+ end
75
82
 
76
83
  def add_io_procedures(aRuntime)(aRuntime)
77
84
  create_newline(aRuntime)
@@ -317,6 +324,38 @@ module Skeem
317
324
 
318
325
  define_primitive_proc(aRuntime, 'symbol?', unary, primitive)
319
326
  end
327
+
328
+ def create_list?(aRuntime)
329
+ primitive = ->(runtime, arg) do
330
+ arg_evaluated = arg.evaluate(runtime)
331
+ to_skm(arg_evaluated.list?)
332
+ end
333
+
334
+ define_primitive_proc(aRuntime, 'list?', unary, primitive)
335
+ end
336
+
337
+ def create_null?(aRuntime)
338
+ primitive = ->(runtime, arg) do
339
+ arg_evaluated = arg.evaluate(runtime)
340
+ to_skm(arg_evaluated.null?)
341
+ end
342
+
343
+ define_primitive_proc(aRuntime, 'null?', unary, primitive)
344
+ end
345
+
346
+ def create_length(aRuntime)
347
+ primitive = ->(runtime, arg) do
348
+ arg_evaluated = arg.evaluate(runtime)
349
+ unless arg_evaluated.kind_of?(SkmList)
350
+ msg1 = "Procedure 'length': list argument required,"
351
+ msg2 = "but got #{arg_evaluated.value}"
352
+ raise StandardError, msg1 + ' ' + msg2
353
+ end
354
+ to_skm(arg_evaluated.length)
355
+ end
356
+
357
+ define_primitive_proc(aRuntime, 'length', unary, primitive)
358
+ end
320
359
 
321
360
  def create_newline(aRuntime)
322
361
  primitive = ->(runtime) do
@@ -48,6 +48,14 @@ module Skeem
48
48
  def symbol?
49
49
  false
50
50
  end
51
+
52
+ def list?
53
+ false
54
+ end
55
+
56
+ def null?
57
+ false
58
+ end
51
59
 
52
60
  # Abstract method.
53
61
  # Part of the 'visitee' role in Visitor design pattern.
@@ -185,6 +193,14 @@ module Skeem
185
193
  def tail()
186
194
  SkmList.new(members.slice(1..-1))
187
195
  end
196
+
197
+ def list?
198
+ true
199
+ end
200
+
201
+ def null?
202
+ empty?
203
+ end
188
204
 
189
205
  def evaluate(aRuntime)
190
206
  list_evaluated = members.map { |elem| elem.evaluate(aRuntime) }
@@ -519,9 +535,8 @@ module Skeem
519
535
  ((count_actuals > required_arity) && !formals.variadic?)
520
536
  raise StandardError, msg_arity_mismatch(aProcedureCall)
521
537
  end
522
- return if count_actuals.zero?
538
+ return if count_actuals.zero? && !formals.variadic?
523
539
  bind_required_locals(aRuntime, aProcedureCall)
524
-
525
540
  if formals.variadic?
526
541
  variadic_part_raw = actuals.drop(required_arity)
527
542
  variadic_part = variadic_part_raw.map do |actual|
@@ -558,7 +573,11 @@ module Skeem
558
573
  formals.formals.each_with_index do |arg_name, index|
559
574
  arg = actuals[index]
560
575
  if arg.nil?
561
- raise StandardError, "Unbound variable: '#{arg_name.value}'"
576
+ if actuals.empty? && formals.variadic?
577
+ arg = SkmList.new([])
578
+ else
579
+ raise StandardError, "Unbound variable: '#{arg_name.value}'"
580
+ end
562
581
  end
563
582
 
564
583
  # IMPORTANT: execute procedure call in argument list now
data/lib/skeem/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Skeem
2
- VERSION = '0.0.18'.freeze
2
+ VERSION = '0.0.19'.freeze
3
3
  end
@@ -352,7 +352,7 @@ SKEEM
352
352
 
353
353
  it 'should implement the list procedure' do
354
354
  checks = [
355
- #['(list)', []],
355
+ ['(list)', []],
356
356
  ['(list 1)', [1]],
357
357
  ['(list 1 2 3 4)', [1, 2, 3, 4]]
358
358
  ]
@@ -242,6 +242,51 @@ module Skeem
242
242
  end
243
243
  end # context
244
244
 
245
+ context 'List procedures:' do
246
+ it 'should implement the list? procedure' do
247
+ checks = [
248
+ ['(list? #f)', false],
249
+ ['(list? 1)', false],
250
+ ['(list? "bar")', false],
251
+ ['(list? (list 1 2 3))', true],
252
+ ['(list? (list))', true]
253
+ ]
254
+ checks.each do |(skeem_expr, expectation)|
255
+ result = subject.run(skeem_expr)
256
+ expect(result.value).to eq(expectation)
257
+ end
258
+ end
259
+
260
+ it 'should implement the null? procedure' do
261
+ checks = [
262
+ ['(null? #f)', false],
263
+ ['(null? 1)', false],
264
+ ['(null? 0)', false],
265
+ ['(null? "bar")', false],
266
+ ['(null? "")', false],
267
+ ['(null? (list 1 2 3))', false],
268
+ ['(list? (list))', true]
269
+ ]
270
+ checks.each do |(skeem_expr, expectation)|
271
+ result = subject.run(skeem_expr)
272
+ expect(result.value).to eq(expectation)
273
+ end
274
+ end
275
+
276
+ it 'should implement the length procedure' do
277
+ checks = [
278
+ ['(length (list))', 0],
279
+ ['(length (list 1))', 1],
280
+ ['(length (list 1 2))', 2],
281
+ ['(length (list 1 2 3))', 3]
282
+ ]
283
+ checks.each do |(skeem_expr, expectation)|
284
+ result = subject.run(skeem_expr)
285
+ expect(result.value).to eq(expectation)
286
+ end
287
+ end
288
+ end # context
289
+
245
290
  context 'IO procedures:' do
246
291
  it 'should implement the newline procedure' do
247
292
  default_stdout = $stdout
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.18
4
+ version: 0.0.19
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-10-14 00:00:00.000000000 Z
11
+ date: 2018-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rley