kapusta 0.1.5 → 0.2.1

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +43 -4
  3. data/examples/bank-account.kap +21 -0
  4. data/examples/baseball-game.kap +11 -0
  5. data/examples/best-time-to-buy-sell-stock.kap +12 -0
  6. data/examples/climbing-stairs.kap +13 -0
  7. data/examples/doto-hygiene.kap +5 -0
  8. data/examples/happy-number.kap +20 -0
  9. data/examples/length-of-last-word.kap +7 -0
  10. data/examples/majority-element.kap +11 -0
  11. data/examples/maximum-subarray.kap +12 -0
  12. data/examples/move-zeroes.kap +13 -0
  13. data/examples/plus-one.kap +14 -0
  14. data/examples/reverse-integer.kap +13 -0
  15. data/examples/roman-to-integer.kap +17 -0
  16. data/examples/stack.kap +27 -10
  17. data/examples/two-sum-hash.kap +17 -0
  18. data/examples/use_bank_account.rb +13 -0
  19. data/examples/valid-parentheses-1.kap +19 -0
  20. data/examples/valid-parentheses-2.kap +8 -0
  21. data/examples/zoo-animal-1.kap +5 -0
  22. data/examples/zoo-animal-inheritance-2.kap +8 -0
  23. data/lib/kapusta/ast.rb +33 -3
  24. data/lib/kapusta/compiler/emitter/bindings.rb +35 -25
  25. data/lib/kapusta/compiler/emitter/control_flow.rb +15 -7
  26. data/lib/kapusta/compiler/emitter/expressions.rb +13 -13
  27. data/lib/kapusta/compiler/emitter/interop.rb +91 -40
  28. data/lib/kapusta/compiler/emitter/patterns.rb +14 -11
  29. data/lib/kapusta/compiler/emitter/support.rb +13 -11
  30. data/lib/kapusta/compiler/emitter.rb +1 -5
  31. data/lib/kapusta/compiler/normalizer.rb +41 -17
  32. data/lib/kapusta/compiler/runtime.rb +0 -152
  33. data/lib/kapusta/env.rb +21 -6
  34. data/lib/kapusta/reader.rb +27 -3
  35. data/lib/kapusta/version.rb +1 -1
  36. data/lib/kapusta.rb +62 -1
  37. data/spec/cli_spec.rb +25 -2
  38. data/spec/examples_spec.rb +257 -81
  39. data/spec/reader_spec.rb +26 -0
  40. metadata +23 -8
  41. data/examples/inheritance.kap +0 -13
@@ -18,6 +18,15 @@ ensure
18
18
  ARGV.replace(previous_argv)
19
19
  end
20
20
 
21
+ def run_ruby_example(name)
22
+ previous_stdout = $stdout
23
+ $stdout = StringIO.new
24
+ load File.join(EXAMPLES_DIR, name)
25
+ $stdout.string
26
+ ensure
27
+ $stdout = previous_stdout
28
+ end
29
+
21
30
  RSpec.describe 'examples' do
22
31
  it 'ackermann.kap' do
23
32
  expect(run_example('ackermann.kap')).to eq("9\n61\n")
@@ -32,7 +41,21 @@ RSpec.describe 'examples' do
32
41
  end
33
42
 
34
43
  it 'anonymous-greeter.kap' do
35
- expect(run_example('anonymous-greeter.kap')).to eq("Hello, anonymous!\nHello, Ada!\n")
44
+ expect(run_example('anonymous-greeter.kap')).to eq(<<~OUT)
45
+ "Hello, anonymous!"
46
+ "Hello, Ada!"
47
+ OUT
48
+ end
49
+
50
+ it 'bank-account.kap' do
51
+ expect(run_example('bank-account.kap')).to eq('')
52
+ end
53
+
54
+ it 'use_bank_account.rb' do
55
+ expect(run_ruby_example('use_bank_account.rb')).to eq(<<~OUT)
56
+ Owner: Ada
57
+ Balance: 120
58
+ OUT
36
59
  end
37
60
 
38
61
  it 'calc.kap' do
@@ -51,12 +74,17 @@ RSpec.describe 'examples' do
51
74
  path = File.expand_path('../tmp/blocks-and-kwargs.txt', EXAMPLES_DIR)
52
75
  FileUtils.rm_f(path)
53
76
 
54
- expect(run_example('blocks-and-kwargs.kap')).to eq("Ada\nLin\n2\n")
77
+ expect(run_example('blocks-and-kwargs.kap')).to eq(<<~'OUT')
78
+ "Ada\nLin"
79
+ 2
80
+ OUT
55
81
  expect(File.exist?(path)).to eq(false)
56
82
  end
57
83
 
58
84
  it 'block-sort.kap' do
59
- expect(run_example('block-sort.kap')).to eq("3, 2, 1\n")
85
+ expect(run_example('block-sort.kap')).to eq(<<~OUT)
86
+ "3, 2, 1"
87
+ OUT
60
88
  end
61
89
 
62
90
  it 'counter.kap' do
@@ -67,16 +95,59 @@ RSpec.describe 'examples' do
67
95
  expect(run_example('contains-duplicate.kap')).to eq("true\nfalse\ntrue\n")
68
96
  end
69
97
 
98
+ it 'climbing-stairs.kap' do
99
+ expect(run_example('climbing-stairs.kap')).to eq("2\n3\n8\n89\n")
100
+ end
101
+
102
+ it 'maximum-subarray.kap' do
103
+ expect(run_example('maximum-subarray.kap')).to eq("6\n1\n23\n")
104
+ end
105
+
106
+ it 'happy-number.kap' do
107
+ expect(run_example('happy-number.kap')).to eq("true\nfalse\ntrue\n")
108
+ end
109
+
110
+ it 'move-zeroes.kap' do
111
+ expect(run_example('move-zeroes.kap')).to eq(<<~OUT)
112
+ [1, 3, 12, 0, 0]
113
+ [0]
114
+ [1, 2, 3]
115
+ OUT
116
+ end
117
+
70
118
  it 'doto.kap' do
71
- expect(run_example('doto.kap')).to eq("1, 2, 3\n")
119
+ expect(run_example('doto.kap')).to eq(<<~OUT)
120
+ "1, 2, 3"
121
+ OUT
122
+ end
123
+
124
+ it 'doto-hygiene.kap' do
125
+ expect(run_example('doto-hygiene.kap')).to eq(<<~OUT)
126
+ "[99]"
127
+ OUT
72
128
  end
73
129
 
74
130
  it 'describe.kap' do
75
- expect(run_example('describe.kap')).to eq("-3\tnegative\n0\tzero\n1\tone\n2\tmany\n99\tmany\n")
131
+ expect(run_example('describe.kap')).to eq(<<~OUT)
132
+ -3
133
+ "negative"
134
+ 0
135
+ "zero"
136
+ 1
137
+ "one"
138
+ 2
139
+ "many"
140
+ 99
141
+ "many"
142
+ OUT
76
143
  end
77
144
 
78
145
  it 'destructure.kap' do
79
- expect(run_example('destructure.kap')).to eq("6\nAda\t36\n")
146
+ expect(run_example('destructure.kap')).to eq(<<~OUT)
147
+ 6
148
+ "Ada"
149
+ 36
150
+ OUT
80
151
  end
81
152
 
82
153
  it 'egg-count.kap' do
@@ -84,22 +155,43 @@ RSpec.describe 'examples' do
84
155
  end
85
156
 
86
157
  it 'even-squares.kap' do
87
- expect(run_example('even-squares.kap')).to eq("4, 16, 36\n")
158
+ expect(run_example('even-squares.kap')).to eq(<<~OUT)
159
+ "4, 16, 36"
160
+ OUT
88
161
  end
89
162
 
90
163
  it 'exceptions.kap' do
91
- expect(run_example('exceptions.kap')).to eq("seen: 12\n12\nseen: oops\nbad: oops\n")
164
+ expect(run_example('exceptions.kap')).to eq(<<~OUT)
165
+ "seen: 12"
166
+ 12
167
+ "seen: oops"
168
+ "bad: oops"
169
+ OUT
92
170
  end
93
171
 
94
172
  it 'factorial.kap' do
95
- expect(run_example('factorial.kap')).to eq("0\t1\n1\t1\n5\t120\n6\t720\n10\t3628800\n")
173
+ expect(run_example('factorial.kap')).to eq(<<~OUT)
174
+ 0
175
+ 1
176
+ 1
177
+ 1
178
+ 5
179
+ 120
180
+ 6
181
+ 720
182
+ 10
183
+ 3628800
184
+ OUT
96
185
  end
97
186
 
98
187
  it 'files.kap' do
99
188
  path = File.expand_path('../tmp/file-io-example.txt', EXAMPLES_DIR)
100
189
  FileUtils.rm_f(path)
101
190
 
102
- expect(run_example('files.kap')).to eq("Ada\nLin\n2\n")
191
+ expect(run_example('files.kap')).to eq(<<~'OUT')
192
+ "Ada\nLin"
193
+ 2
194
+ OUT
103
195
  expect(File.exist?(path)).to eq(false)
104
196
  end
105
197
 
@@ -108,7 +200,28 @@ RSpec.describe 'examples' do
108
200
  end
109
201
 
110
202
  it 'fizzbuzz.kap' do
111
- expected = "1\n2\nFizz\n4\nBuzz\nFizz\n7\n8\nFizz\nBuzz\n11\nFizz\n13\n14\nFizzBuzz\n16\n17\nFizz\n19\nBuzz\n"
203
+ expected = <<~OUT
204
+ 1
205
+ 2
206
+ "Fizz"
207
+ 4
208
+ "Buzz"
209
+ "Fizz"
210
+ 7
211
+ 8
212
+ "Fizz"
213
+ "Buzz"
214
+ 11
215
+ "Fizz"
216
+ 13
217
+ 14
218
+ "FizzBuzz"
219
+ 16
220
+ 17
221
+ "Fizz"
222
+ 19
223
+ "Buzz"
224
+ OUT
112
225
  expect(run_example('fizzbuzz.kap')).to eq(expected)
113
226
  end
114
227
 
@@ -117,35 +230,63 @@ RSpec.describe 'examples' do
117
230
  end
118
231
 
119
232
  it 'greet.kap' do
120
- expect(run_example('greet.kap', argv: ['Ada'])).to eq("Hello, Ada!\n")
233
+ expect(run_example('greet.kap', argv: ['Ada'])).to eq(<<~OUT)
234
+ "Hello, Ada!"
235
+ OUT
121
236
  end
122
237
 
123
238
  it 'hashfn.kap' do
124
239
  expect(run_example('hashfn.kap')).to eq("5\n21\n")
125
240
  end
126
241
 
127
- it 'inheritance.kap' do
128
- expect(run_example('inheritance.kap')).to eq("true\tanimalia\tPoppy the dog\twoof\n")
242
+ it 'zoo-animal-1.kap' do
243
+ expect(run_example('zoo-animal-1.kap')).to eq('')
244
+ end
245
+
246
+ it 'zoo-animal-inheritance-2.kap' do
247
+ expect(run_example('zoo-animal-inheritance-2.kap')).to eq(<<~OUT)
248
+ true
249
+ "animalia"
250
+ "Poppy the dog"
251
+ "woof"
252
+ OUT
129
253
  end
130
254
 
131
255
  it 'leap-year.kap' do
132
256
  expect(run_example('leap-year.kap')).to eq("true\n")
133
257
  end
134
258
 
259
+ it 'length-of-last-word.kap' do
260
+ expect(run_example('length-of-last-word.kap')).to eq("5\n4\n6\n")
261
+ end
262
+
135
263
  it 'min-max.kap' do
136
- expect(run_example('min-max.kap')).to eq("1\t9\n")
264
+ expect(run_example('min-max.kap')).to eq(<<~OUT)
265
+ 1
266
+ 9
267
+ OUT
137
268
  end
138
269
 
139
270
  it 'module-header.kap' do
140
- expect(run_example('module-header.kap')).to eq("Hello, Ada!\n")
271
+ expect(run_example('module-header.kap')).to eq(<<~OUT)
272
+ "Hello, Ada!"
273
+ OUT
141
274
  end
142
275
 
143
276
  it 'pipeline.kap' do
144
- expect(run_example('pipeline.kap')).to eq("BLUE\nRED\n")
277
+ expect(run_example('pipeline.kap')).to eq(<<~OUT)
278
+ "BLUE"
279
+ "RED"
280
+ OUT
145
281
  end
146
282
 
147
283
  it 'points.kap' do
148
- expect(run_example('points.kap')).to eq("origin\ny-axis\nx-axis\npoint\n")
284
+ expect(run_example('points.kap')).to eq(<<~OUT)
285
+ "origin"
286
+ "y-axis"
287
+ "x-axis"
288
+ "point"
289
+ OUT
149
290
  end
150
291
 
151
292
  it 'primes.kap' do
@@ -153,44 +294,74 @@ RSpec.describe 'examples' do
153
294
  end
154
295
 
155
296
  it 'raindrops.kap' do
156
- expect(run_example('raindrops.kap')).to eq("PlingPlang\n")
297
+ expect(run_example('raindrops.kap')).to eq(<<~OUT)
298
+ "PlingPlang"
299
+ OUT
157
300
  end
158
301
 
159
302
  it 'record.kap' do
160
- expect(run_example('record.kap')).to eq("Ada / engineer / ruby, lisp\n")
303
+ expect(run_example('record.kap')).to eq(<<~OUT)
304
+ "Ada / engineer / ruby, lisp"
305
+ OUT
161
306
  end
162
307
 
163
308
  it 'regex.kap' do
164
- expected = <<~OUT
165
- 2026-04-23 -> {"year"=>"2026", "month"=>"04", "day"=>"23"}
166
- hello -> nil
167
- 1999-12-31 -> {"year"=>"1999", "month"=>"12", "day"=>"31"}
168
- OUT
309
+ first = { 'year' => '2026', 'month' => '04', 'day' => '23' }
310
+ last = { 'year' => '1999', 'month' => '12', 'day' => '31' }
311
+ expected = [
312
+ "2026-04-23 -> #{first}".inspect,
313
+ 'hello -> '.inspect,
314
+ "1999-12-31 -> #{last}".inspect
315
+ ].map { |line| "#{line}\n" }.join
169
316
  expect(run_example('regex.kap')).to eq(expected)
170
317
  end
171
318
 
172
319
  it 'ruby-eval.kap' do
173
- expect(run_example('ruby-eval.kap')).to eq("10-20-30\n")
320
+ expect(run_example('ruby-eval.kap')).to eq(<<~OUT)
321
+ "10-20-30"
322
+ OUT
174
323
  end
175
324
 
176
325
  it 'kwargs.kap' do
177
- expect(run_example('kwargs.kap')).to eq("Ada has 3 tasks\n")
326
+ expect(run_example('kwargs.kap')).to eq(<<~OUT)
327
+ "Ada has 3 tasks"
328
+ OUT
178
329
  end
179
330
 
180
331
  it 'match.kap' do
181
- expect(run_example('match.kap')).to eq("Ada: 9\nLin: no score\nunknown\n")
332
+ expect(run_example('match.kap')).to eq(<<~OUT)
333
+ "Ada: 9"
334
+ "Lin: no score"
335
+ "unknown"
336
+ OUT
182
337
  end
183
338
 
184
339
  it 'packet-router.kap' do
185
- expect(run_example('packet-router.kap')).to eq("score:9\nother\ncity:nil\n5\n0\nping:7\n")
340
+ expect(run_example('packet-router.kap')).to eq(<<~OUT)
341
+ "score:9"
342
+ "other"
343
+ "city:nil"
344
+ 5
345
+ 0
346
+ "ping:7"
347
+ OUT
186
348
  end
187
349
 
188
350
  it 'or-patterns.kap' do
189
- expect(run_example('or-patterns.kap')).to eq("1:2\n2:1\nother\n")
351
+ expect(run_example('or-patterns.kap')).to eq(<<~OUT)
352
+ "1:2"
353
+ "2:1"
354
+ "other"
355
+ OUT
190
356
  end
191
357
 
192
358
  it 'underscore-patterns.kap' do
193
- expect(run_example('underscore-patterns.kap')).to eq("5\nnil\n5\nfallback\n")
359
+ expect(run_example('underscore-patterns.kap')).to eq(<<~OUT)
360
+ 5
361
+ nil
362
+ 5
363
+ "fallback"
364
+ OUT
194
365
  end
195
366
 
196
367
  it 'scopes.kap' do
@@ -198,13 +369,13 @@ RSpec.describe 'examples' do
198
369
  end
199
370
 
200
371
  it 'pcall.kap' do
201
- expected = <<~OUT
372
+ expected = <<~'OUT'
202
373
  true
203
374
  12
204
375
  false
205
376
  ArgumentError
206
377
  false
207
- invalid value for Integer(): "oops"
378
+ "invalid value for Integer(): \"oops\""
208
379
  OUT
209
380
  expect(run_example('pcall.kap')).to eq(expected)
210
381
  end
@@ -218,7 +389,10 @@ RSpec.describe 'examples' do
218
389
  end
219
390
 
220
391
  it 'safe-lookup.kap' do
221
- expect(run_example('safe-lookup.kap')).to eq("Ada\nnil\n")
392
+ expect(run_example('safe-lookup.kap')).to eq(<<~OUT)
393
+ "Ada"
394
+ nil
395
+ OUT
222
396
  end
223
397
 
224
398
  it 'shapes.kap' do
@@ -230,7 +404,12 @@ RSpec.describe 'examples' do
230
404
  end
231
405
 
232
406
  it 'stack.kap' do
233
- expect(run_example('stack.kap')).to eq('')
407
+ expect(run_example('stack.kap')).to eq(<<~OUT)
408
+ -3
409
+ 0
410
+ -2
411
+ true
412
+ OUT
234
413
  end
235
414
 
236
415
  it 'sum.kap' do
@@ -238,74 +417,71 @@ RSpec.describe 'examples' do
238
417
  end
239
418
 
240
419
  it 'tset.kap' do
241
- expect(run_example('tset.kap')).to eq("{:name=>\"Ada\", :city=>\"Amsterdam\"}\nAmsterdam\n")
420
+ person = { name: 'Ada', city: 'Amsterdam' }
421
+ expect(run_example('tset.kap')).to eq("#{person.inspect}\n#{'Amsterdam'.inspect}\n")
242
422
  end
243
423
 
244
424
  it 'two-sum.kap' do
245
425
  expect(run_example('two-sum.kap')).to eq("[0, 1]\n[1, 2]\nnil\n")
246
426
  end
247
427
 
248
- it 'threading.kap' do
249
- expect(run_example('threading.kap')).to eq("[Ada Lovelace]!\t<Ada!>\tnil\tATSUPAK\tnil\n")
428
+ it 'two-sum-hash.kap' do
429
+ expect(run_example('two-sum-hash.kap')).to eq("[0, 1]\n[1, 2]\nnil\n")
250
430
  end
251
431
 
252
- it 'tic-tac-toe.kap' do
253
- expect(run_example('tic-tac-toe.kap')).to eq("X\nO\nX\ndraw\n")
432
+ it 'baseball-game.kap' do
433
+ expect(run_example('baseball-game.kap')).to eq("30\n27\n")
254
434
  end
255
- end
256
435
 
257
- RSpec.describe Kapusta do
258
- it 'exposes a gem version' do
259
- expect(Kapusta::VERSION).to match(/\A\d+\.\d+\.\d+\z/)
436
+ it 'valid-parentheses-1.kap' do
437
+ expect(run_example('valid-parentheses-1.kap')).to eq('')
260
438
  end
261
439
 
262
- it 'defaults classes to Object when the superclass is omitted' do
263
- source = <<~KAP
264
- (let [klass (class Stack
265
- (fn initialize []
266
- nil))]
267
- (values (= Stack.superclass Object)
268
- (= (Stack.new.class) Stack)
269
- (= klass Stack)))
270
- KAP
271
-
272
- expect(Kapusta.eval(source)).to eq([true, true, true])
440
+ it 'valid-parentheses-2.kap' do
441
+ expect(run_example('valid-parentheses-2.kap')).to eq("true\ntrue\ntrue\nfalse\nfalse\n")
273
442
  end
274
443
 
275
- it 'still accepts an explicit superclass vector' do
276
- source = <<~KAP
277
- (let [klass (class KapustaError [StandardError])]
278
- (values (= KapustaError.superclass StandardError)
279
- (= klass KapustaError)))
280
- KAP
444
+ it 'threading.kap' do
445
+ expect(run_example('threading.kap')).to eq(<<~OUT)
446
+ "[Ada Lovelace]!"
447
+ "<Ada!>"
448
+ nil
449
+ "ATSUPAK"
450
+ nil
451
+ OUT
452
+ end
281
453
 
282
- expect(Kapusta.eval(source)).to eq([true, true])
454
+ it 'tic-tac-toe.kap' do
455
+ expect(run_example('tic-tac-toe.kap')).to eq(<<~OUT)
456
+ "X"
457
+ "O"
458
+ "X"
459
+ "draw"
460
+ OUT
283
461
  end
284
462
 
285
- it 'preserves nested arithmetic precedence' do
286
- source = <<~KAP
287
- (values (/ (+ 3 5) 2)
288
- (* (+ 1 2) (- 10 4))
289
- (% (+ 10 5) 4))
290
- KAP
463
+ it 'reverse-integer.kap' do
464
+ expect(run_example('reverse-integer.kap')).to eq("321\n-321\n21\n0\n")
465
+ end
291
466
 
292
- expect(Kapusta.eval(source)).to eq([4, 18, 3])
467
+ it 'roman-to-integer.kap' do
468
+ expect(run_example('roman-to-integer.kap')).to eq("3\n58\n1994\n")
293
469
  end
294
470
 
295
- it 'supports postfix zero-arg method calls on non-symbol expressions' do
296
- source = <<~KAP
297
- (values [1 2].inspect
298
- (+ 1 2).inspect
299
- "Listen".downcase.chars.sort.join)
300
- KAP
471
+ it 'best-time-to-buy-sell-stock.kap' do
472
+ expect(run_example('best-time-to-buy-sell-stock.kap')).to eq("5\n0\n2\n")
473
+ end
301
474
 
302
- expect(Kapusta.eval(source)).to eq(['[1, 2]', '3', 'eilnst'])
475
+ it 'majority-element.kap' do
476
+ expect(run_example('majority-element.kap')).to eq("3\n2\n1\n")
303
477
  end
304
- end
305
478
 
306
- RSpec.describe 'errors' do
307
- it 'raises on unclosed list' do
308
- expect { Kapusta.eval('(fn hello [name] (.. "Hi " name "!")') }
309
- .to raise_error(Kapusta::Reader::Error, /unclosed \(/)
479
+ it 'plus-one.kap' do
480
+ expect(run_example('plus-one.kap')).to eq(<<~OUT)
481
+ [1, 2, 4]
482
+ [4, 3, 2, 2]
483
+ [1, 0]
484
+ [1, 0, 0]
485
+ OUT
310
486
  end
311
487
  end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Kapusta::Reader do
6
+ describe 'error messages' do
7
+ it 'reports unexpected closing delimiters with their source position' do
8
+ expect { Kapusta.eval('(print 1))') }
9
+ .to raise_error(Kapusta::Reader::Error,
10
+ /unexpected closing delimiter '\)' at line 1, column 10/)
11
+ end
12
+
13
+ it 'reports unclosed opening delimiters with their source position' do
14
+ cases = {
15
+ '(print 1' => /unclosed opening delimiter '\(' at line 1, column 1/,
16
+ '[1 2' => /unclosed opening delimiter '\[' at line 1, column 1/,
17
+ '{:name "A"' => /unclosed opening delimiter '\{' at line 1, column 1/
18
+ }
19
+
20
+ cases.each do |source, message|
21
+ expect { Kapusta.eval(source) }
22
+ .to raise_error(Kapusta::Reader::Error, message)
23
+ end
24
+ end
25
+ end
26
+ end
metadata CHANGED
@@ -1,17 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kapusta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evgenii Morozov
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2026-04-24 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies: []
13
12
  description: Kapusta is a Lisp for the Ruby runtime.
14
- email:
15
13
  executables:
16
14
  - kapfmt
17
15
  - kapusta
@@ -29,15 +27,20 @@ files:
29
27
  - examples/ackermann.kap
30
28
  - examples/anagram.kap
31
29
  - examples/anonymous-greeter.kap
30
+ - examples/bank-account.kap
31
+ - examples/baseball-game.kap
32
+ - examples/best-time-to-buy-sell-stock.kap
32
33
  - examples/binary-search.kap
33
34
  - examples/binary-to-decimal.kap
34
35
  - examples/block-sort.kap
35
36
  - examples/blocks-and-kwargs.kap
36
37
  - examples/calc.kap
38
+ - examples/climbing-stairs.kap
37
39
  - examples/contains-duplicate.kap
38
40
  - examples/counter.kap
39
41
  - examples/describe.kap
40
42
  - examples/destructure.kap
43
+ - examples/doto-hygiene.kap
41
44
  - examples/doto.kap
42
45
  - examples/egg-count.kap
43
46
  - examples/even-squares.kap
@@ -48,24 +51,31 @@ files:
48
51
  - examples/fizzbuzz.kap
49
52
  - examples/gcd.kap
50
53
  - examples/greet.kap
54
+ - examples/happy-number.kap
51
55
  - examples/hashfn.kap
52
- - examples/inheritance.kap
53
56
  - examples/kwargs.kap
54
57
  - examples/leap-year.kap
58
+ - examples/length-of-last-word.kap
59
+ - examples/majority-element.kap
55
60
  - examples/match.kap
61
+ - examples/maximum-subarray.kap
56
62
  - examples/min-max.kap
57
63
  - examples/module-header.kap
64
+ - examples/move-zeroes.kap
58
65
  - examples/or-patterns.kap
59
66
  - examples/packet-router.kap
60
67
  - examples/palindrome.kap
61
68
  - examples/pangram.kap
62
69
  - examples/pcall.kap
63
70
  - examples/pipeline.kap
71
+ - examples/plus-one.kap
64
72
  - examples/points.kap
65
73
  - examples/primes.kap
66
74
  - examples/raindrops.kap
67
75
  - examples/record.kap
68
76
  - examples/regex.kap
77
+ - examples/reverse-integer.kap
78
+ - examples/roman-to-integer.kap
69
79
  - examples/ruby-eval.kap
70
80
  - examples/safe-lookup.kap
71
81
  - examples/scopes.kap
@@ -76,8 +86,14 @@ files:
76
86
  - examples/threading.kap
77
87
  - examples/tic-tac-toe.kap
78
88
  - examples/tset.kap
89
+ - examples/two-sum-hash.kap
79
90
  - examples/two-sum.kap
80
91
  - examples/underscore-patterns.kap
92
+ - examples/use_bank_account.rb
93
+ - examples/valid-parentheses-1.kap
94
+ - examples/valid-parentheses-2.kap
95
+ - examples/zoo-animal-1.kap
96
+ - examples/zoo-animal-inheritance-2.kap
81
97
  - exe/kapfmt
82
98
  - exe/kapusta
83
99
  - kapusta.gemspec
@@ -104,6 +120,7 @@ files:
104
120
  - spec/cli_spec.rb
105
121
  - spec/examples_spec.rb
106
122
  - spec/formatter_spec.rb
123
+ - spec/reader_spec.rb
107
124
  - spec/spec_helper.rb
108
125
  homepage: https://github.com/evmorov/kapusta
109
126
  licenses: []
@@ -112,7 +129,6 @@ metadata:
112
129
  homepage_uri: https://github.com/evmorov/kapusta
113
130
  source_code_uri: https://github.com/evmorov/kapusta
114
131
  bug_tracker_uri: https://github.com/evmorov/kapusta/issues
115
- post_install_message:
116
132
  rdoc_options: []
117
133
  require_paths:
118
134
  - lib
@@ -127,8 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
127
143
  - !ruby/object:Gem::Version
128
144
  version: '0'
129
145
  requirements: []
130
- rubygems_version: 3.5.22
131
- signing_key:
146
+ rubygems_version: 3.6.9
132
147
  specification_version: 4
133
148
  summary: A Lisp for the Ruby runtime
134
149
  test_files: []
@@ -1,13 +0,0 @@
1
- (let [animal-class (class Zoo.Animal
2
- (fn initialize [name] (set (ivar name) name))
3
- (fn name [] (ivar name))
4
- (fn kingdom [] "animalia")
5
- (fn label [] (.. (self.name) " the animal")))
6
- dog-class (class Zoo.Dog [Zoo.Animal]
7
- (fn label [] (.. (self.name) " the dog"))
8
- (fn bark [] "woof"))
9
- dog (dog-class.new "Poppy")]
10
- (print (= dog-class.superclass animal-class)
11
- (dog.kingdom)
12
- (dog.label)
13
- (dog.bark)))