skeem 0.0.18 → 0.0.19

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 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