atomy 0.6.5 → 0.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/atomy/pattern.rb +1 -1
- data/lib/atomy/version.rb +1 -1
- metadata +10 -15
- data/kernel/format/data.ay +0 -56
- data/kernel/format/formatter.ay +0 -346
- data/kernel/format/parser.ay +0 -75
- data/kernel/format.ay +0 -14
- data/kernel/therie.ay +0 -193
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb9fbe912f398f02739a10a44f50918a01fe3ac4
|
4
|
+
data.tar.gz: 4728cd82f1aa5171babf677f74e6f07561815ad7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 74f797b2806e1069d7077e97d6e0ea8e15afc0a69fcdc564bbe50b6e0ff903aa7b1e9d9d479d7f64b070a5fc049107f7bf597208f842e02bf24788ca144ef1e4
|
7
|
+
data.tar.gz: 37770a5407e8de8082ac690b90fa4823feccc37e0960c0715575c072f1398e379569d98e27957e62f61607961260d088f2eea862dabb5b5aa891943659f9dd37
|
data/lib/atomy/pattern.rb
CHANGED
data/lib/atomy/version.rb
CHANGED
metadata
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: atomy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Suraci
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kpeg
|
15
|
-
prerelease: false
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
16
|
requirements:
|
18
17
|
- - "~>"
|
19
18
|
- !ruby/object:Gem::Version
|
20
19
|
version: '1.0'
|
21
20
|
type: :runtime
|
21
|
+
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
@@ -26,13 +26,13 @@ dependencies:
|
|
26
26
|
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rubinius-compiler
|
29
|
-
prerelease: false
|
30
29
|
requirement: !ruby/object:Gem::Requirement
|
31
30
|
requirements:
|
32
31
|
- - "~>"
|
33
32
|
- !ruby/object:Gem::Version
|
34
33
|
version: '2.3'
|
35
34
|
type: :runtime
|
35
|
+
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
@@ -40,27 +40,27 @@ dependencies:
|
|
40
40
|
version: '2.3'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rubinius-ast
|
43
|
-
prerelease: false
|
44
43
|
requirement: !ruby/object:Gem::Requirement
|
45
44
|
requirements:
|
46
45
|
- - "~>"
|
47
46
|
- !ruby/object:Gem::Version
|
48
|
-
version: '2.
|
47
|
+
version: '2.4'
|
49
48
|
type: :runtime
|
49
|
+
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '2.
|
54
|
+
version: '2.4'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
|
-
prerelease: false
|
58
57
|
requirement: !ruby/object:Gem::Requirement
|
59
58
|
requirements:
|
60
59
|
- - "~>"
|
61
60
|
- !ruby/object:Gem::Version
|
62
61
|
version: '10.4'
|
63
62
|
type: :development
|
63
|
+
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
@@ -68,13 +68,13 @@ dependencies:
|
|
68
68
|
version: '10.4'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec-its
|
71
|
-
prerelease: false
|
72
71
|
requirement: !ruby/object:Gem::Requirement
|
73
72
|
requirements:
|
74
73
|
- - "~>"
|
75
74
|
- !ruby/object:Gem::Version
|
76
75
|
version: '1.2'
|
77
76
|
type: :development
|
77
|
+
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
@@ -101,10 +101,6 @@ files:
|
|
101
101
|
- kernel/doc.ay
|
102
102
|
- kernel/dynamic.ay
|
103
103
|
- kernel/file.ay
|
104
|
-
- kernel/format.ay
|
105
|
-
- kernel/format/data.ay
|
106
|
-
- kernel/format/formatter.ay
|
107
|
-
- kernel/format/parser.ay
|
108
104
|
- kernel/grammar.ay
|
109
105
|
- kernel/hash.ay
|
110
106
|
- kernel/interpolation.ay
|
@@ -121,7 +117,6 @@ files:
|
|
121
117
|
- kernel/regexp.ay
|
122
118
|
- kernel/repl.ay
|
123
119
|
- kernel/stack-local.ay
|
124
|
-
- kernel/therie.ay
|
125
120
|
- lib/atomy.rb
|
126
121
|
- lib/atomy/bootstrap.rb
|
127
122
|
- lib/atomy/code/assign.rb
|
@@ -197,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
197
192
|
version: '0'
|
198
193
|
requirements: []
|
199
194
|
rubyforge_project:
|
200
|
-
rubygems_version: 2.4.
|
195
|
+
rubygems_version: 2.4.5.1
|
201
196
|
signing_key:
|
202
197
|
specification_version: 4
|
203
198
|
summary: the Atomy programming language
|
data/kernel/format/data.ay
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
use(require("core"))
|
2
|
-
use(require("define"))
|
3
|
-
use(require("array"))
|
4
|
-
use(require("control-flow"))
|
5
|
-
use(require("node"))
|
6
|
-
use(require("cosmetics"))
|
7
|
-
use(require("particles"))
|
8
|
-
|
9
|
-
Atomy Format open:
|
10
|
-
ast:
|
11
|
-
Segment:
|
12
|
-
Chunk([.flags], @text)
|
13
|
-
String([.flags])
|
14
|
-
Decimal([.flags])
|
15
|
-
Hex([.flags])
|
16
|
-
Octal([.flags])
|
17
|
-
Binary([.flags])
|
18
|
-
Radix([.flags])
|
19
|
-
Float([.flags])
|
20
|
-
Exponent([.flags])
|
21
|
-
General([.flags])
|
22
|
-
Character([.flags])
|
23
|
-
Any([.flags])
|
24
|
-
Pluralize(.singular, [.flags], .plural?)
|
25
|
-
Lowercase(.content, [.flags])
|
26
|
-
Capitalize(.content, [.flags])
|
27
|
-
Uppercase(.content, [.flags])
|
28
|
-
Justify([.segments], [.flags])
|
29
|
-
Skip([.flags])
|
30
|
-
Indirection([.flags])
|
31
|
-
Iterate(.content, [.flags])
|
32
|
-
Break([.flags])
|
33
|
-
Conditional([.branches], [.flags], .default?)
|
34
|
-
|
35
|
-
Flag:
|
36
|
-
Number(@value?)
|
37
|
-
Symbol(@character)
|
38
|
-
ZeroPad
|
39
|
-
Precision(@value)
|
40
|
-
|
41
|
-
Formatter([.segments])
|
42
|
-
|
43
|
-
Segment symbol(m)? :=
|
44
|
-
@flags any? [f]:
|
45
|
-
f match:
|
46
|
-
Symbol -> f character == m
|
47
|
-
_ -> false
|
48
|
-
|
49
|
-
Segment precision :=
|
50
|
-
@flags find .is-a(Precision)? ?value()
|
51
|
-
|
52
|
-
Segment zero-pad? :=
|
53
|
-
@flags any? [f]:
|
54
|
-
f match:
|
55
|
-
ZeroPad -> true
|
56
|
-
_ -> false
|
data/kernel/format/formatter.ay
DELETED
@@ -1,346 +0,0 @@
|
|
1
|
-
use("core")
|
2
|
-
use("define")
|
3
|
-
use("control-flow")
|
4
|
-
use("loop")
|
5
|
-
use("regexp")
|
6
|
-
use("particles")
|
7
|
-
use("patterns")
|
8
|
-
|
9
|
-
pretty = require("pretty")
|
10
|
-
|
11
|
-
|
12
|
-
Atomy Format open:
|
13
|
-
peek-input() = @input [@position]
|
14
|
-
|
15
|
-
next-input() =
|
16
|
-
peek-input tap:
|
17
|
-
@position += 1
|
18
|
-
|
19
|
-
next-inputs() = @input drop(@position) or []
|
20
|
-
|
21
|
-
pluralize(s) =
|
22
|
-
condition:
|
23
|
-
s =~ r"o$"(i) ->
|
24
|
-
s + "es"
|
25
|
-
|
26
|
-
s =~ r"[aeiou]$"(i) ->
|
27
|
-
s + "s"
|
28
|
-
|
29
|
-
s =~ r"(?<root>.+[aeiou])y$"(i) ->
|
30
|
-
s + "s"
|
31
|
-
|
32
|
-
s =~ r"(lay-by|stand-by)$"(i) ->
|
33
|
-
s + "s"
|
34
|
-
|
35
|
-
s =~ r"(.+)y$"(i) ->
|
36
|
-
$1 + "es"
|
37
|
-
|
38
|
-
s =~ r"(.+)us$"(i) ->
|
39
|
-
$1 + ""
|
40
|
-
|
41
|
-
s =~ r"(.+)sis$"(i) ->
|
42
|
-
$1 + "es"
|
43
|
-
|
44
|
-
s =~ r"(.+)(ex|ix)$"(i) ->
|
45
|
-
$1 + "ces"
|
46
|
-
|
47
|
-
s =~ r"(.+)(ss|sh|ch|dge)$"(i) ->
|
48
|
-
s + "es"
|
49
|
-
|
50
|
-
otherwise ->
|
51
|
-
s + "s"
|
52
|
-
|
53
|
-
sub-format(sub) = do:
|
54
|
-
sub position = @position
|
55
|
-
out = sub scan(*@input)
|
56
|
-
@position = sub position
|
57
|
-
sub reset!
|
58
|
-
out
|
59
|
-
|
60
|
-
iterate(f) =
|
61
|
-
until(next-inputs empty? or @stop?):
|
62
|
-
@output << sub-format(f)
|
63
|
-
|
64
|
-
iterate-max(max, f) =
|
65
|
-
max times:
|
66
|
-
when(next-inputs empty? or @stop?):
|
67
|
-
break
|
68
|
-
|
69
|
-
@output << sub-format(f)
|
70
|
-
|
71
|
-
number(s, default = 1) =
|
72
|
-
if(num = s flags find .is-a(Number)?)
|
73
|
-
then: num value or next-inputs size
|
74
|
-
else: default
|
75
|
-
|
76
|
-
next-number(s) =
|
77
|
-
number(s, nil) or next-input
|
78
|
-
|
79
|
-
justified(j, s, left? = false) =
|
80
|
-
if(w = number(j, nil))
|
81
|
-
then:
|
82
|
-
padding = if(j zero-pad?) then: "0"; else: " "
|
83
|
-
|
84
|
-
condition:
|
85
|
-
j symbol("=")? or j symbol("<")? and j symbol(">")? ->
|
86
|
-
s center(w, padding)
|
87
|
-
|
88
|
-
left? and not j symbol(">")? or j symbol("<")? ->
|
89
|
-
s ljust(w, padding)
|
90
|
-
|
91
|
-
otherwise ->
|
92
|
-
s rjust(w, padding)
|
93
|
-
else:
|
94
|
-
s
|
95
|
-
|
96
|
-
char(c, n: Integer) = justified(c, n chr, true)
|
97
|
-
char(c, s) = justified(c, s to-s [0, 1], true)
|
98
|
-
|
99
|
-
integer(i, base) = justified(i, Integer(next-input) to-s(base))
|
100
|
-
|
101
|
-
float(f, x) = do:
|
102
|
-
format =
|
103
|
-
if(f precision)
|
104
|
-
then: "%." + f precision to-s + x
|
105
|
-
else: "%" + x
|
106
|
-
|
107
|
-
justified(f, sprintf(format, Float(next-input)))
|
108
|
-
|
109
|
-
spaced(_, _, _, []) = ""
|
110
|
-
spaced(j, _, left, [s]) =
|
111
|
-
if(j symbol(">")? or j symbol("=")?)
|
112
|
-
then: s + " " * left
|
113
|
-
else: " " * left + s
|
114
|
-
spaced(j, average, left, s . ss) =
|
115
|
-
[ s
|
116
|
-
" " * average
|
117
|
-
spaced(j, average, left - average, ss)
|
118
|
-
] join
|
119
|
-
|
120
|
-
justify-to(_, _, []) = ""
|
121
|
-
justify-to(j, to, all: s . ss) = do:
|
122
|
-
needed = to - all collect .size inject .(+ _)
|
123
|
-
|
124
|
-
spacings =
|
125
|
-
condition:
|
126
|
-
j symbol("<")? and j symbol(">")? or j symbol("=")? ->
|
127
|
-
all size + 1
|
128
|
-
|
129
|
-
j symbol("<")? ->
|
130
|
-
all size
|
131
|
-
|
132
|
-
j symbol(">")? ->
|
133
|
-
all size
|
134
|
-
|
135
|
-
otherwise ->
|
136
|
-
all size - 1
|
137
|
-
|
138
|
-
naive-average = needed / spacings
|
139
|
-
|
140
|
-
average =
|
141
|
-
if(needed - naive-average * spacings >= spacings - 1)
|
142
|
-
then: naive-average + 1
|
143
|
-
else: naive-average
|
144
|
-
|
145
|
-
condition:
|
146
|
-
j symbol("<")? or j symbol("=")? ->
|
147
|
-
[ " " * naive-average
|
148
|
-
s
|
149
|
-
" " * average
|
150
|
-
spaced(j, average, needed - naive-average - average, ss)
|
151
|
-
] join
|
152
|
-
|
153
|
-
otherwise ->
|
154
|
-
[ s
|
155
|
-
" " * naive-average
|
156
|
-
spaced(j, average, needed - naive-average, ss)
|
157
|
-
] join
|
158
|
-
|
159
|
-
justify(j, [s]) = justified(j, s)
|
160
|
-
justify(j, ss) =
|
161
|
-
if(to = number(j, nil))
|
162
|
-
then: justify-to(j, to, ss)
|
163
|
-
else: ss join
|
164
|
-
|
165
|
-
|
166
|
-
process(c: Chunk) =
|
167
|
-
@output << c text
|
168
|
-
|
169
|
-
process(s: String) =
|
170
|
-
@output << justified(s, next-input to-s, true)
|
171
|
-
|
172
|
-
process(i: Decimal) =
|
173
|
-
@output << integer(i, 10)
|
174
|
-
|
175
|
-
process(i: Hex) =
|
176
|
-
@output << integer(i, 16)
|
177
|
-
|
178
|
-
process(i: Octal) =
|
179
|
-
@output << integer(i, 8)
|
180
|
-
|
181
|
-
process(i: Binary) =
|
182
|
-
@output << integer(i, 2)
|
183
|
-
|
184
|
-
process(i: Radix) =
|
185
|
-
@output << integer(i, i precision)
|
186
|
-
|
187
|
-
process(f: Float) =
|
188
|
-
@output << float(f, "f")
|
189
|
-
|
190
|
-
process(f: Exponent) =
|
191
|
-
@output << float(f, "e")
|
192
|
-
|
193
|
-
process(f: General) =
|
194
|
-
@output << float(f, "g")
|
195
|
-
|
196
|
-
process(c: Character) =
|
197
|
-
@output << char(c, next-input)
|
198
|
-
|
199
|
-
process(a: Any) =
|
200
|
-
@output << justified(a, pretty show(next-input), true)
|
201
|
-
|
202
|
-
process(p: Pluralize) = do:
|
203
|
-
num =
|
204
|
-
if(p symbol(">")?)
|
205
|
-
then: peek-input
|
206
|
-
else: next-input
|
207
|
-
|
208
|
-
@output <<
|
209
|
-
condition:
|
210
|
-
num == 1 ->
|
211
|
-
sub-format(p singular)
|
212
|
-
|
213
|
-
p plural ->
|
214
|
-
sub-format(p plural)
|
215
|
-
|
216
|
-
otherwise ->
|
217
|
-
pluralize(sub-format(p singular))
|
218
|
-
|
219
|
-
process(l: Lowercase) =
|
220
|
-
@output << sub-format(l content) downcase
|
221
|
-
|
222
|
-
process(c: Capitalize) = do:
|
223
|
-
words = sub-format(c content) split(" ")
|
224
|
-
number(c, words size) times [n]:
|
225
|
-
unless(n == 0):
|
226
|
-
@output << " "
|
227
|
-
|
228
|
-
@output << words shift capitalize
|
229
|
-
|
230
|
-
unless(words empty?):
|
231
|
-
@output << " " + words join(" ")
|
232
|
-
|
233
|
-
process(u: Uppercase) =
|
234
|
-
@output << sub-format(u content) upcase
|
235
|
-
|
236
|
-
process(s: Skip) =
|
237
|
-
if(s symbol("<")?)
|
238
|
-
then: @position -= number(s)
|
239
|
-
else: @position += number(s)
|
240
|
-
|
241
|
-
process(i: Indirection) =
|
242
|
-
@output <<
|
243
|
-
if(i symbol("*")?)
|
244
|
-
then: sub-format(next-input)
|
245
|
-
else: next-input format(*next-input)
|
246
|
-
|
247
|
-
process(i: Iterate) = do:
|
248
|
-
splat? = i symbol("*")?
|
249
|
-
sub? = i symbol(".")?
|
250
|
-
always-run? = i symbol("+")?
|
251
|
-
iterations = number(i, nil)
|
252
|
-
|
253
|
-
inputs =
|
254
|
-
if(splat?)
|
255
|
-
then: next-inputs
|
256
|
-
else: next-input
|
257
|
-
|
258
|
-
before = [@input, @position]
|
259
|
-
|
260
|
-
when(inputs empty? and always-run? and
|
261
|
-
iterations != 0):
|
262
|
-
@output << sub-format(i content)
|
263
|
-
return(nil)
|
264
|
-
|
265
|
-
condition:
|
266
|
-
iterations:
|
267
|
-
@input = inputs
|
268
|
-
@position = 0
|
269
|
-
iterate-max(iterations, i content)
|
270
|
-
|
271
|
-
sub?:
|
272
|
-
@iterating = inputs
|
273
|
-
inputs each [is]:
|
274
|
-
@output << i content format(*is)
|
275
|
-
|
276
|
-
otherwise:
|
277
|
-
@input = inputs
|
278
|
-
@position = 0
|
279
|
-
iterate(i content)
|
280
|
-
|
281
|
-
if(splat?)
|
282
|
-
then: @position = @input size
|
283
|
-
else: [@input, @position] = before
|
284
|
-
|
285
|
-
process(c: Conditional) =
|
286
|
-
[c symbol("?")?, c branches] match:
|
287
|
-
[true, t . (f . _)] ->
|
288
|
-
@output << sub-format(if(next-input) then: t; else: f)
|
289
|
-
|
290
|
-
[true, [t]] ->
|
291
|
-
when(next-input):
|
292
|
-
@output << sub-format(t)
|
293
|
-
|
294
|
-
_:
|
295
|
-
n = next-number(c)
|
296
|
-
if(n >= c branches size)
|
297
|
-
then:
|
298
|
-
when(c default):
|
299
|
-
@output << sub-format(c default)
|
300
|
-
else:
|
301
|
-
@output << sub-format(c branches [n])
|
302
|
-
|
303
|
-
process(j: Justify) =
|
304
|
-
@output <<
|
305
|
-
justify(j, j segments collect [s]: sub-format(s))
|
306
|
-
|
307
|
-
process(x) = raise("todo formatting: " + x inspect)
|
308
|
-
|
309
|
-
Formatter open:
|
310
|
-
attr-accessor(.position)
|
311
|
-
|
312
|
-
initialize(opts = nil) &blk := do:
|
313
|
-
super(opts) &blk
|
314
|
-
reset!
|
315
|
-
|
316
|
-
bytecode(g, mod) := do:
|
317
|
-
pos(g)
|
318
|
-
construct(g, mod)
|
319
|
-
|
320
|
-
reset! := do:
|
321
|
-
@input = []
|
322
|
-
@output = ""
|
323
|
-
@position = 0
|
324
|
-
@stop? = false
|
325
|
-
@iterating = []
|
326
|
-
|
327
|
-
scan(*@input) := do:
|
328
|
-
@segments each [s]:
|
329
|
-
s match:
|
330
|
-
Break ? symbol(".")? ->
|
331
|
-
when(@iterating empty?):
|
332
|
-
@stop? = true
|
333
|
-
break
|
334
|
-
|
335
|
-
Break ->
|
336
|
-
when(next-inputs empty?):
|
337
|
-
break
|
338
|
-
|
339
|
-
_ -> process(s)
|
340
|
-
|
341
|
-
@output
|
342
|
-
|
343
|
-
format(*inputs) :=
|
344
|
-
scan(*inputs) tap: reset!
|
345
|
-
|
346
|
-
alias-method(.[], .format)
|
data/kernel/format/parser.ay
DELETED
@@ -1,75 +0,0 @@
|
|
1
|
-
use("core")
|
2
|
-
use("define")
|
3
|
-
use("block")
|
4
|
-
use("control-flow")
|
5
|
-
use("grammar")
|
6
|
-
use("init")
|
7
|
-
|
8
|
-
Atomy Format open:
|
9
|
-
parser(Parser):
|
10
|
-
%atomy := Atomy Parser
|
11
|
-
|
12
|
-
text(e) := [
|
13
|
-
<(/"[^\\%#{Regexp quote(e)}]+"/)> { text }
|
14
|
-
"\\" <(/"[%\(\)\{\}\[\]]"/)> { text }
|
15
|
-
"\\" e=(%atomy(escape)) { e }
|
16
|
-
]
|
17
|
-
|
18
|
-
nested(e) := c=(text(e)+) { init(Chunk, text: c join) }
|
19
|
-
|
20
|
-
chunk := nested("")
|
21
|
-
|
22
|
-
flagged := "%" fs=(flag*) s=(segment) { s flags = fs, s }
|
23
|
-
|
24
|
-
flag := [
|
25
|
-
"#" { Number new }
|
26
|
-
"0" &("." /"\d"/ | /"\d"/) { ZeroPad new }
|
27
|
-
"." <(/"\d+"/)> { init(Precision, value: text to-i) }
|
28
|
-
<(/"\d+"/)> { init(Number, value: text to-i) }
|
29
|
-
<(/"[\.\+\*=<>,\?]"/)> { init(Symbol, character: text) }
|
30
|
-
]
|
31
|
-
|
32
|
-
segment := [
|
33
|
-
"p" "(" s=(sub(")")) ")" ("(" p=(sub(")")) ")")? {
|
34
|
-
Pluralize new [n]:
|
35
|
-
n singular = s
|
36
|
-
n plural = p
|
37
|
-
}
|
38
|
-
"l" "(" c=(sub(")")) ")" { init(Lowercase, content: c) }
|
39
|
-
"c" "(" c=(sub(")")) ")" { init(Capitalize, content: c) }
|
40
|
-
"u" "(" c=(sub(")")) ")" { init(Uppercase, content: c) }
|
41
|
-
"j" cs=(("(" c=(sub(")")) ")" { c })+) { init(Justify, segments: cs) }
|
42
|
-
"{" c=(sub("}")) "}" { init(Iterate, content: c) }
|
43
|
-
bs=(("[" c=(sub("]")) "]" { c })+) ("(" d=(sub(")")) ")")? {
|
44
|
-
init(Conditional, branches -> Array(bs), default -> d)
|
45
|
-
}
|
46
|
-
"_" { Skip new }
|
47
|
-
"^" { Break new }
|
48
|
-
"%" { Indirection new }
|
49
|
-
"s" { String new }
|
50
|
-
"d" { Decimal new }
|
51
|
-
"x" { Hex new }
|
52
|
-
"o" { Octal new }
|
53
|
-
"b" { Binary new }
|
54
|
-
"r" { Radix new }
|
55
|
-
"f" { Float new }
|
56
|
-
"e" { Exponent new }
|
57
|
-
"g" { General new }
|
58
|
-
"c" { Character new }
|
59
|
-
"v" { Any new }
|
60
|
-
]
|
61
|
-
|
62
|
-
sub(e) := as=((flagged | nested(e))*) {
|
63
|
-
init(Formatter, segments -> Array(as))
|
64
|
-
}
|
65
|
-
|
66
|
-
root := x=(sub("")) !(/"."/) { x }
|
67
|
-
|
68
|
-
|
69
|
-
Parser singleton:
|
70
|
-
parse(source) :=
|
71
|
-
new(source) onto:
|
72
|
-
unless(parse):
|
73
|
-
raise-error
|
74
|
-
|
75
|
-
result
|
data/kernel/format.ay
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
use(require("core"))
|
2
|
-
use(require("quotes"))
|
3
|
-
use(require("file"))
|
4
|
-
|
5
|
-
base = File expand-path("../", __FILE__)
|
6
|
-
|
7
|
-
Atomy const-set(.Format, Module new)
|
8
|
-
|
9
|
-
use(require(base + "/format/data"))
|
10
|
-
use(require(base + "/format/formatter"))
|
11
|
-
use(require(base + "/format/parser"))
|
12
|
-
|
13
|
-
macro-quoter(f) [c]:
|
14
|
-
Atomy Format Parser parse(c)
|
data/kernel/therie.ay
DELETED
@@ -1,193 +0,0 @@
|
|
1
|
-
use(require("atomy"))
|
2
|
-
|
3
|
-
io = require("io")
|
4
|
-
|
5
|
-
nesting-level = dynamic(0)
|
6
|
-
running-stats = dynamic
|
7
|
-
|
8
|
-
data(Stats(@passed = 0, @failed = 0))
|
9
|
-
|
10
|
-
fn(indented(s)): (" " * (^nesting-level * 2)) + s
|
11
|
-
|
12
|
-
fn(colored(color, s)):
|
13
|
-
unless(^(io OutputPort) tty?):
|
14
|
-
return(s)
|
15
|
-
|
16
|
-
codes = [
|
17
|
-
.black
|
18
|
-
.red
|
19
|
-
.green
|
20
|
-
.yellow
|
21
|
-
.blue
|
22
|
-
.magenta
|
23
|
-
.cyan
|
24
|
-
.white
|
25
|
-
]
|
26
|
-
|
27
|
-
i"\e[3#{codes index(color)}m#{s}\e[0m"
|
28
|
-
|
29
|
-
fn(in-own-module &action):
|
30
|
-
ctx = Atomy Module new
|
31
|
-
ctx use(self)
|
32
|
-
ctx module-exec &action
|
33
|
-
|
34
|
-
|
35
|
-
def(theorize &tests):
|
36
|
-
with(running-stats = Stats new):
|
37
|
-
tests call
|
38
|
-
puts("")
|
39
|
-
|
40
|
-
stats = ^running-stats
|
41
|
-
|
42
|
-
puts(
|
43
|
-
f"total of %d tests (%s passed, %s failed)" [
|
44
|
-
stats failed + stats passed
|
45
|
-
colored(.green, stats passed)
|
46
|
-
if(stats failed == 0)
|
47
|
-
then: "0"
|
48
|
-
else: colored(.red, stats failed)
|
49
|
-
])
|
50
|
-
|
51
|
-
stats
|
52
|
-
|
53
|
-
|
54
|
-
def(describe(what) &body):
|
55
|
-
puts(indented(f"- %s" [what]))
|
56
|
-
|
57
|
-
with(nesting-level = (^nesting-level + 1)):
|
58
|
-
in-own-module &body
|
59
|
-
|
60
|
-
nil
|
61
|
-
|
62
|
-
alias-method(.context, .describe)
|
63
|
-
|
64
|
-
|
65
|
-
def(let(name) &body):
|
66
|
-
define-method(name):
|
67
|
-
res = instance-exec &body
|
68
|
-
|
69
|
-
singleton:
|
70
|
-
define-method(name): res
|
71
|
-
|
72
|
-
res
|
73
|
-
|
74
|
-
def(subject &body): def(.subject) &body
|
75
|
-
|
76
|
-
|
77
|
-
def(it(description) &tests):
|
78
|
-
do {
|
79
|
-
in-own-module &tests
|
80
|
-
puts(indented(colored(.green, f"✓ %s" [description])))
|
81
|
-
} rescue {
|
82
|
-
e:
|
83
|
-
when(^running-stats):
|
84
|
-
^running-stats failed += 1
|
85
|
-
|
86
|
-
puts(indented(colored(.red, f"✗ %s" [description])))
|
87
|
-
puts(
|
88
|
-
indented(
|
89
|
-
colored(
|
90
|
-
.yellow
|
91
|
-
f" ` %s: %s" [
|
92
|
-
e class name
|
93
|
-
e message
|
94
|
-
])))
|
95
|
-
|
96
|
-
e backtrace first((ENV["THERIE_BT_LIMIT"] or 5) to-i) each [l]:
|
97
|
-
puts(indented(f" %s" [colored(.cyan, l)]))
|
98
|
-
} else:
|
99
|
-
when(^running-stats):
|
100
|
-
^running-stats passed += 1
|
101
|
-
|
102
|
-
nil
|
103
|
-
|
104
|
-
|
105
|
-
data(Actuality(@value = nil, @action = nil))
|
106
|
-
|
107
|
-
def(expect(value)): Actuality new(value)
|
108
|
-
def(expect &action): Actuality new(nil, action)
|
109
|
-
|
110
|
-
def(Actuality to): ExpectTo new(self)
|
111
|
-
def(Actuality to-not): ExpectTo new(self, true)
|
112
|
-
|
113
|
-
|
114
|
-
data(ExpectTo(@actual, @negated? = false))
|
115
|
-
|
116
|
-
def(ExpectTo(actual, negated) match(matcher)):
|
117
|
-
matched = matcher matches?(actual)
|
118
|
-
|
119
|
-
condition:
|
120
|
-
negated && matched:
|
121
|
-
/raise(matcher negative-failure-message(actual))
|
122
|
-
|
123
|
-
negated && !matched:
|
124
|
-
true
|
125
|
-
|
126
|
-
!matched:
|
127
|
-
/raise(matcher failure-message(actual))
|
128
|
-
|
129
|
-
negated:
|
130
|
-
true
|
131
|
-
|
132
|
-
|
133
|
-
data(Matcher)
|
134
|
-
|
135
|
-
def(Matcher matches?(actual)): /error(.not-implemented)
|
136
|
-
def(Matcher failure-message(actual)): /error(.not-implemented)
|
137
|
-
def(Matcher negative-failure-message(actual)): /error(.not-implemented)
|
138
|
-
|
139
|
-
Matcher data: EqualityMatcher(@value)
|
140
|
-
def(ExpectTo be(value)): match(EqualityMatcher new(value))
|
141
|
-
def(EqualityMatcher(value) matches?(actual)): actual value == value
|
142
|
-
def(EqualityMatcher(value) failure-message(actual)):
|
143
|
-
i"expected #{actual value} to be #{value}"
|
144
|
-
def(EqualityMatcher(value) negative-failure-message(actual)):
|
145
|
-
i"expected #{actual value} to not be #{value}, but it was"
|
146
|
-
|
147
|
-
|
148
|
-
Matcher data: RaiseMatcher(@exception, @message = nil)
|
149
|
-
def(ExpectTo raise(exception, message = nil)):
|
150
|
-
match(RaiseMatcher new(exception, message))
|
151
|
-
def(RaiseMatcher matches?(actual)):
|
152
|
-
actual action rescue {
|
153
|
-
e:
|
154
|
-
@raised = e
|
155
|
-
@raised is-a?(@exception)
|
156
|
-
} else: false
|
157
|
-
def(RaiseMatcher failure-message(actual)):
|
158
|
-
if(@raised)
|
159
|
-
then: i"expected #{@exception}, got #{@raised class}: #{@raised}"
|
160
|
-
else: i"expected #{@exception} but nothing was raised"
|
161
|
-
def(RaiseMatcher negative-failure-message(actual)):
|
162
|
-
i"expected #{@exception} to not be raised, but it was"
|
163
|
-
|
164
|
-
|
165
|
-
Matcher data: ErrorMatcher(@error)
|
166
|
-
def(ExpectTo error(error)): match(ErrorMatcher new(error))
|
167
|
-
def(ErrorMatcher matches?(actual)):
|
168
|
-
with-restarts(errored(matched?) -> matched?) {
|
169
|
-
actual action call
|
170
|
-
false
|
171
|
-
} bind {
|
172
|
-
(e: ExceptionError):
|
173
|
-
raise(e exception)
|
174
|
-
|
175
|
-
(e: Error):
|
176
|
-
@errored = e
|
177
|
-
/restart(.errored, e kind-of?(@error))
|
178
|
-
}
|
179
|
-
def(ErrorMatcher failure-message(actual)):
|
180
|
-
if(@errored)
|
181
|
-
then: i"expected #{@error}, got #{@errored class}: #{@errored}"
|
182
|
-
else: i"expected #{@error} but nothing was signalled"
|
183
|
-
def(ErrorMatcher negative-failure-message(actual)):
|
184
|
-
i"expected #{@error} to not be signalled, but it was"
|
185
|
-
|
186
|
-
|
187
|
-
Matcher data: KindMatcher(@class)
|
188
|
-
def(ExpectTo be-a(class)): match(KindMatcher new(class))
|
189
|
-
def(KindMatcher matches?(actual)): actual value is-a?(@class)
|
190
|
-
def(KindMatcher failure-message(actual)):
|
191
|
-
i"expected #{actual value} (#{actual value class}) to be a #{@class}"
|
192
|
-
def(KindMatcher negative-failure-message(actual)):
|
193
|
-
i"expected #{actual value} (#{actual value class}) to not be a #{@class}, but it was"
|