kapusta 0.2.3 → 0.2.4
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/examples/counter.kap +1 -2
- data/examples/length-of-last-word.kap +5 -2
- data/examples/palindrome.kap +2 -3
- data/examples/pangram.kap +6 -5
- data/examples/pivot-index.kap +13 -0
- data/lib/kapusta/compiler/emitter/collections.rb +22 -17
- data/lib/kapusta/compiler/emitter/interop.rb +1 -1
- data/lib/kapusta/version.rb +1 -1
- data/spec/examples_spec.rb +4 -0
- metadata +2 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ef91159e2623e199fc391fa483440fa9f8ca76f273fbc31caeb0b07e891ee92c
|
|
4
|
+
data.tar.gz: 5468818f0ad4b0509a31635d886f3374009e3e8499a197d82f99da22c53e3a12
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 7bcc51b164c21357c2aa2ef52e4e544cba0116ca8d8b6b1c02ecb55dc62697508a3cbb22d4c56a0a7cf0da77f53d7500827ecd2debe0760fec34ebe4d992be07
|
|
7
|
+
data.tar.gz: 40b1b709b5e083b94584424f9fb2ad7c3ec6908786ea80051173df8edaa380b9b5b76d0c485a6377f7e77bbed5799633501204d7a39acf0b919eb74197fabcf2
|
data/examples/counter.kap
CHANGED
data/examples/palindrome.kap
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
(fn palindrome? [s]
|
|
2
|
-
(let [
|
|
3
|
-
|
|
4
|
-
(= normalized (normalized.reverse))))
|
|
2
|
+
(let [normalized (-> s (: :downcase) (: :gsub (ruby "/[^a-z]/") ""))]
|
|
3
|
+
(= normalized (: normalized :reverse))))
|
|
5
4
|
|
|
6
5
|
(print (palindrome? "racecar"))
|
|
7
6
|
(print (palindrome? "A man, a plan, a canal: Panama"))
|
data/examples/pangram.kap
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
(fn pangram? [s]
|
|
2
|
-
(
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
(= 26
|
|
3
|
+
(length (-> s
|
|
4
|
+
(: :downcase)
|
|
5
|
+
(: :gsub (ruby "/[^a-z]/") "")
|
|
6
|
+
(: :chars)
|
|
7
|
+
(: :uniq)))))
|
|
7
8
|
|
|
8
9
|
(print (pangram? "The quick brown fox jumps over the lazy dog"))
|
|
9
10
|
(print (pangram? "Hello, world"))
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
(fn pivot-index [nums]
|
|
2
|
+
(var total 0)
|
|
3
|
+
(each [n nums] (set total (+ total n)))
|
|
4
|
+
(var left 0)
|
|
5
|
+
(var found -1)
|
|
6
|
+
(each [i n (ipairs nums)]
|
|
7
|
+
(when (and (= found -1) (= left (- total left n))) (set found i))
|
|
8
|
+
(set left (+ left n)))
|
|
9
|
+
found)
|
|
10
|
+
|
|
11
|
+
(print (pivot-index [1 7 3 6 5 6]))
|
|
12
|
+
(print (pivot-index [1 2 3]))
|
|
13
|
+
(print (pivot-index [2 1 -1]))
|
|
@@ -106,22 +106,19 @@ module Kapusta
|
|
|
106
106
|
if iter_expr.is_a?(List) && iter_expr.head.is_a?(Sym)
|
|
107
107
|
case iter_expr.head.name
|
|
108
108
|
when 'ipairs'
|
|
109
|
-
value_var = temp('value')
|
|
110
|
-
index_var = temp('index')
|
|
111
109
|
body_env = env.child
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
)
|
|
110
|
+
value_var, value_bind = bind_iteration_param(binding_pats[1], 'value', body_env)
|
|
111
|
+
index_var, index_bind = bind_iteration_param(binding_pats[0], 'index', body_env)
|
|
112
|
+
bind_code = [index_bind, value_bind].compact.join("\n")
|
|
115
113
|
body_code = yield(body_env)
|
|
116
114
|
header = "#{emit_expr(iter_expr.items[1], env, current_scope)}" \
|
|
117
115
|
".each_with_index do |#{value_var}, #{index_var}|"
|
|
118
116
|
return iteration_block(header, bind_code, body_code)
|
|
119
117
|
when 'pairs'
|
|
120
|
-
key_var = temp('key')
|
|
121
|
-
value_var = temp('value')
|
|
122
118
|
body_env = env.child
|
|
123
|
-
|
|
124
|
-
|
|
119
|
+
key_var, key_bind = bind_iteration_param(binding_pats[0], 'key', body_env)
|
|
120
|
+
value_var, value_bind = bind_iteration_param(binding_pats[1], 'value', body_env)
|
|
121
|
+
bind_code = [key_bind, value_bind].compact.join("\n")
|
|
125
122
|
body_code = yield(body_env)
|
|
126
123
|
header = "#{emit_expr(iter_expr.items[1], env, current_scope)}.each do |#{key_var}, #{value_var}|"
|
|
127
124
|
return iteration_block(header, bind_code, body_code)
|
|
@@ -130,11 +127,10 @@ module Kapusta
|
|
|
130
127
|
|
|
131
128
|
coll_code = emit_expr(iter_expr, env, current_scope)
|
|
132
129
|
if binding_pats.length == 1
|
|
133
|
-
value_var = temp('value')
|
|
134
130
|
body_env = env.child
|
|
135
|
-
|
|
131
|
+
value_var, bind_code = bind_iteration_param(binding_pats[0], 'value', body_env)
|
|
136
132
|
body_code = yield(body_env)
|
|
137
|
-
iteration_block("#{coll_code}.each do |#{value_var}|", bind_code, body_code)
|
|
133
|
+
iteration_block("#{coll_code}.each do |#{value_var}|", bind_code || '', body_code)
|
|
138
134
|
else
|
|
139
135
|
parts_var = temp('parts')
|
|
140
136
|
body_env = env.child
|
|
@@ -145,6 +141,17 @@ module Kapusta
|
|
|
145
141
|
end
|
|
146
142
|
end
|
|
147
143
|
|
|
144
|
+
def bind_iteration_param(pattern, fallback_name, env)
|
|
145
|
+
if pattern.is_a?(Sym) && !pattern.dotted?
|
|
146
|
+
ruby_name = pattern.name == '_' ? '_' : define_local(env, pattern.name)
|
|
147
|
+
[ruby_name, nil]
|
|
148
|
+
else
|
|
149
|
+
tmp = temp(fallback_name)
|
|
150
|
+
bind_code, _new_env = emit_iteration_bindings([[pattern, tmp]], env)
|
|
151
|
+
[tmp, bind_code.empty? ? nil : bind_code]
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
148
155
|
def iteration_block(header, bind_code, body_code)
|
|
149
156
|
[header, indent(join_code(bind_code, body_code)), 'end'].join("\n")
|
|
150
157
|
end
|
|
@@ -189,11 +196,9 @@ module Kapusta
|
|
|
189
196
|
end
|
|
190
197
|
|
|
191
198
|
def emit_sequence_value_assignment(target_var, body_code)
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
end
|
|
196
|
-
RUBY
|
|
199
|
+
return "#{target_var} = #{body_code}" unless body_code.include?("\n")
|
|
200
|
+
|
|
201
|
+
["#{target_var} = begin", indent(body_code), 'end'].join("\n")
|
|
197
202
|
end
|
|
198
203
|
end
|
|
199
204
|
end
|
|
@@ -491,7 +491,7 @@ module Kapusta
|
|
|
491
491
|
code.match?(/\A\$[a-zA-Z_]\w*\z/) ||
|
|
492
492
|
code.match?(/\A[A-Z]\w*(?:::[A-Z]\w*)*\z/) ||
|
|
493
493
|
code.match?(/\A[a-z_]\w*[!?=]?\([^()\n]*\)\z/) ||
|
|
494
|
-
code.match?(/\A
|
|
494
|
+
code.match?(/\A-?\d+(?:\.\d+)?\z/) ||
|
|
495
495
|
code.match?(/\A[a-z_]\w*(?:\.[a-z_]\w*[!?=]?(?:\([^()\n]*\))?|\[[^\[\]]*\])+\z/) ||
|
|
496
496
|
code.match?(/\A[A-Z]\w*(?:::[A-Z]\w*)*(?:\.[a-z_]\w*[!?=]?(?:\([^()\n]*\))?|\[[^\[\]]*\])+\z/) ||
|
|
497
497
|
code.match?(/\A:[a-zA-Z_]\w*[!?=]?\z/) ||
|
data/lib/kapusta/version.rb
CHANGED
data/spec/examples_spec.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: kapusta
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Evgenii Morozov
|
|
@@ -68,6 +68,7 @@ files:
|
|
|
68
68
|
- examples/pangram.kap
|
|
69
69
|
- examples/pcall.kap
|
|
70
70
|
- examples/pipeline.kap
|
|
71
|
+
- examples/pivot-index.kap
|
|
71
72
|
- examples/plus-one.kap
|
|
72
73
|
- examples/points.kap
|
|
73
74
|
- examples/primes.kap
|