atomy 0.1.1 → 0.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +13 -0
- data/LICENSE.md +201 -0
- data/bin/atomy +16 -133
- data/kernel/array.ay +6 -0
- data/kernel/atomy.ay +18 -0
- data/kernel/condition.ay +171 -271
- data/kernel/control-flow.ay +197 -192
- data/kernel/core.ay +120 -0
- data/kernel/data.ay +83 -39
- data/kernel/define.ay +84 -93
- data/kernel/doc.ay +282 -449
- data/kernel/dynamic.ay +25 -29
- data/kernel/file.ay +9 -0
- data/kernel/grammar.ay +267 -0
- data/kernel/hash.ay +17 -0
- data/kernel/interpolation.ay +59 -0
- data/kernel/io.ay +70 -244
- data/kernel/let-macro.ay +24 -0
- data/kernel/let-pattern.ay +24 -0
- data/kernel/loop.ay +80 -0
- data/kernel/mutation.ay +53 -0
- data/kernel/particles.ay +176 -39
- data/kernel/patterns.ay +527 -191
- data/kernel/pretty.ay +311 -277
- data/kernel/quotes.ay +29 -0
- data/kernel/range.ay +4 -0
- data/kernel/regexp.ay +23 -0
- data/kernel/repl.ay +83 -109
- data/kernel/stack-local.ay +21 -0
- data/lib/atomy.rb +37 -0
- data/lib/atomy/bootstrap.rb +256 -0
- data/lib/atomy/code/assign.rb +64 -0
- data/lib/atomy/code/block.rb +98 -0
- data/lib/atomy/code/class_variable.rb +17 -0
- data/lib/atomy/code/constant.rb +21 -0
- data/lib/atomy/code/define.rb +242 -0
- data/lib/atomy/code/define_function.rb +51 -0
- data/lib/atomy/code/define_method.rb +20 -0
- data/lib/atomy/code/false.rb +9 -0
- data/lib/atomy/code/instance_variable.rb +15 -0
- data/lib/atomy/code/integer.rb +13 -0
- data/lib/atomy/code/list.rb +17 -0
- data/lib/atomy/code/nil.rb +9 -0
- data/lib/atomy/code/pattern.rb +23 -0
- data/lib/atomy/code/pattern/and.rb +61 -0
- data/lib/atomy/code/pattern/quasi_quote.rb +185 -0
- data/lib/atomy/code/pattern/splat.rb +29 -0
- data/lib/atomy/code/pattern/wildcard.rb +37 -0
- data/lib/atomy/code/quasi_quote.rb +118 -0
- data/lib/atomy/code/quote.rb +13 -0
- data/lib/atomy/code/self.rb +9 -0
- data/lib/atomy/code/send.rb +110 -0
- data/lib/atomy/code/sequence.rb +23 -0
- data/lib/atomy/code/string_literal.rb +53 -0
- data/lib/atomy/code/symbol.rb +13 -0
- data/lib/atomy/code/true.rb +9 -0
- data/lib/atomy/code/undefined.rb +9 -0
- data/lib/atomy/code/variable.rb +17 -0
- data/lib/atomy/codeloader.rb +218 -0
- data/lib/atomy/compiler.rb +57 -0
- data/lib/atomy/errors.rb +54 -0
- data/lib/atomy/grammar.rb +2278 -0
- data/lib/atomy/locals.rb +75 -0
- data/lib/atomy/message_structure.rb +277 -0
- data/lib/atomy/method.rb +343 -0
- data/lib/atomy/module.rb +144 -0
- data/lib/atomy/node/constructable.rb +169 -0
- data/lib/atomy/node/equality.rb +113 -0
- data/lib/atomy/node/meta.rb +206 -0
- data/lib/atomy/node/pretty.rb +108 -0
- data/lib/atomy/parser.rb +21 -0
- data/lib/atomy/pattern.rb +26 -0
- data/lib/atomy/pattern/and.rb +59 -0
- data/lib/atomy/pattern/attribute.rb +16 -0
- data/lib/atomy/pattern/class_variable.rb +15 -0
- data/lib/atomy/pattern/equality.rb +42 -0
- data/lib/atomy/pattern/instance_variable.rb +15 -0
- data/lib/atomy/pattern/kind_of.rb +20 -0
- data/lib/atomy/pattern/or.rb +48 -0
- data/lib/atomy/pattern/quasi_quote.rb +164 -0
- data/lib/atomy/pattern/splat.rb +15 -0
- data/lib/atomy/pattern/wildcard.rb +18 -0
- data/lib/atomy/rubygems.rb +48 -0
- data/lib/atomy/version.rb +3 -0
- metadata +169 -134
- data/COPYING +0 -30
- data/README.md +0 -1
- data/kernel/block.ay +0 -30
- data/kernel/boot.ay +0 -10
- data/kernel/comparison.ay +0 -61
- data/kernel/concurrency.ay +0 -84
- data/kernel/cosmetics.ay +0 -3
- data/kernel/data-delta.ay +0 -105
- data/kernel/documentation.ay +0 -135
- data/kernel/errors.ay +0 -6
- data/kernel/format.ay +0 -13
- data/kernel/format/data.ay +0 -89
- data/kernel/format/formatter.ay +0 -345
- data/kernel/format/parser.ay +0 -13
- data/kernel/hashes.ay +0 -39
- data/kernel/namespaces.ay +0 -63
- data/kernel/node.ay +0 -48
- data/kernel/operators.ay +0 -28
- data/kernel/precision.ay +0 -148
- data/kernel/therie.ay +0 -204
- data/lib/ast/binary_send.rb +0 -44
- data/lib/ast/block.rb +0 -268
- data/lib/ast/constant.rb +0 -88
- data/lib/ast/internal/assign.rb +0 -19
- data/lib/ast/internal/block_pass.rb +0 -21
- data/lib/ast/internal/catch.rb +0 -247
- data/lib/ast/internal/class.rb +0 -30
- data/lib/ast/internal/class_variable.rb +0 -23
- data/lib/ast/internal/define.rb +0 -174
- data/lib/ast/internal/ensure.rb +0 -135
- data/lib/ast/internal/file.rb +0 -14
- data/lib/ast/internal/global_variable.rb +0 -20
- data/lib/ast/internal/if_then_else.rb +0 -24
- data/lib/ast/internal/instance_variable.rb +0 -17
- data/lib/ast/internal/let_macro.rb +0 -35
- data/lib/ast/internal/macro_quote.rb +0 -23
- data/lib/ast/internal/match.rb +0 -53
- data/lib/ast/internal/module.rb +0 -30
- data/lib/ast/internal/pattern.rb +0 -17
- data/lib/ast/internal/return.rb +0 -29
- data/lib/ast/internal/set.rb +0 -19
- data/lib/ast/internal/singleton_class.rb +0 -18
- data/lib/ast/internal/splat.rb +0 -14
- data/lib/ast/internal/when.rb +0 -24
- data/lib/ast/list.rb +0 -25
- data/lib/ast/macro.rb +0 -37
- data/lib/ast/node.rb +0 -599
- data/lib/ast/operator.rb +0 -21
- data/lib/ast/particle.rb +0 -13
- data/lib/ast/primitive.rb +0 -20
- data/lib/ast/quasi_quote.rb +0 -20
- data/lib/ast/quote.rb +0 -13
- data/lib/ast/send.rb +0 -104
- data/lib/ast/splice.rb +0 -32
- data/lib/ast/string.rb +0 -23
- data/lib/ast/unary.rb +0 -44
- data/lib/ast/unquote.rb +0 -45
- data/lib/ast/variable.rb +0 -64
- data/lib/atomy.kpeg.rb +0 -3995
- data/lib/code_loader.rb +0 -137
- data/lib/compiler/compiler.rb +0 -155
- data/lib/compiler/stages.rb +0 -81
- data/lib/formatter.kpeg.rb +0 -1394
- data/lib/macros.rb +0 -317
- data/lib/method.rb +0 -261
- data/lib/namespace.rb +0 -236
- data/lib/parser.rb +0 -28
- data/lib/patterns.rb +0 -276
- data/lib/patterns/any.rb +0 -21
- data/lib/patterns/attribute.rb +0 -59
- data/lib/patterns/block_pass.rb +0 -54
- data/lib/patterns/constant.rb +0 -33
- data/lib/patterns/default.rb +0 -44
- data/lib/patterns/head_tail.rb +0 -63
- data/lib/patterns/list.rb +0 -77
- data/lib/patterns/match.rb +0 -45
- data/lib/patterns/named.rb +0 -55
- data/lib/patterns/named_class.rb +0 -46
- data/lib/patterns/named_global.rb +0 -46
- data/lib/patterns/named_instance.rb +0 -46
- data/lib/patterns/particle.rb +0 -29
- data/lib/patterns/quasi_quote.rb +0 -184
- data/lib/patterns/quote.rb +0 -33
- data/lib/patterns/singleton_class.rb +0 -31
- data/lib/patterns/splat.rb +0 -57
- data/lib/util.rb +0 -37
data/kernel/pretty.ay
CHANGED
@@ -1,283 +1,317 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
_ unamb := pretty
|
37
|
-
|
38
|
-
from(*where, &y) :=
|
39
|
-
let(context = where flatten, &y)
|
40
|
-
|
41
|
-
from?(*where) :=
|
42
|
-
[^context, where] match:
|
43
|
-
[(a: Array), (b: Array)] ->
|
44
|
-
a any? [x]: b include?(x)
|
45
|
-
[(a: Array), b] ->
|
1
|
+
use(require("core"))
|
2
|
+
use(require("define"))
|
3
|
+
use(require("control-flow"))
|
4
|
+
use(require("particles"))
|
5
|
+
use(require("range"))
|
6
|
+
use(require("regexp"))
|
7
|
+
use(require("array"))
|
8
|
+
use(require("patterns"))
|
9
|
+
use(require("interpolation"))
|
10
|
+
use(require("dynamic"))
|
11
|
+
use(require("patterns"))
|
12
|
+
|
13
|
+
doc = use(require("doc"))
|
14
|
+
io = require("io")
|
15
|
+
|
16
|
+
const-set(.Printing, dynamic([]))
|
17
|
+
const-set(.Multiline, dynamic(false))
|
18
|
+
const-set(.Context, dynamic(.top))
|
19
|
+
const-set(.Colored, dynamic(false))
|
20
|
+
|
21
|
+
fn(ident(n)):
|
22
|
+
if(n =~ r"^__")
|
23
|
+
then: doc text(n)
|
24
|
+
else: doc text(n[0, 1] + n[1 .. -1] tr("_", "-"))
|
25
|
+
|
26
|
+
fn(from(*where) &y):
|
27
|
+
with(Context = where flatten):
|
28
|
+
y call
|
29
|
+
|
30
|
+
fn(from?(*where)):
|
31
|
+
[^Context, where] match:
|
32
|
+
[a & Array, b & Array]:
|
33
|
+
a any? &.(b include?(_))
|
34
|
+
|
35
|
+
[a & Array, b]:
|
46
36
|
a include?(b)
|
47
|
-
[a, (b: Array)] ->
|
48
|
-
b include?(a)
|
49
|
-
[a, b] ->
|
50
|
-
a == b
|
51
|
-
|
52
|
-
export-to(atomy):
|
53
|
-
String pretty := super colored(#yellow)
|
54
|
-
Integer pretty := super colored(#blue)
|
55
|
-
Float pretty := super colored(#blue)
|
56
|
-
TrueClass pretty := super colored(#green)
|
57
|
-
FalseClass pretty := super colored(#red)
|
58
|
-
NilClass pretty := super colored(#black)
|
59
|
-
Object pretty := Doc text(inspect)
|
60
|
-
|
61
|
-
Object show := pretty render
|
62
|
-
|
63
|
-
Doc pretty := self
|
64
|
-
|
65
|
-
Array pretty :=
|
66
|
-
doc: brackets(comma-delim(self all-pretty))
|
67
|
-
|
68
|
-
Particle pretty := doc:
|
69
|
-
wildcard = [c]:
|
70
|
-
if(c equal?(_undefined))
|
71
|
-
then: '_
|
72
|
-
else: c
|
73
|
-
|
74
|
-
operator? = self message to-s !~ r"^[a-z_]"
|
75
|
-
|
76
|
-
args = self arguments collect(&#(wildcard [_]))
|
77
|
-
|
78
|
-
msg+args =
|
79
|
-
if(operator?)
|
80
|
-
then:
|
81
|
-
text(self message to-s) <+> args first unamb
|
82
|
-
else:
|
83
|
-
ident(self message to-s) <>
|
84
|
-
parens(comma-delim(args all-pretty))
|
85
|
-
|
86
|
-
partial =
|
87
|
-
if(self receiver equal?(_undefined))
|
88
|
-
then:
|
89
|
-
if(operator?)
|
90
|
-
then: parens(msg+args)
|
91
|
-
else: msg+args
|
92
|
-
else: parens(self receiver unamb <+> msg+args)
|
93
|
-
|
94
|
-
text("#") <> partial
|
95
|
-
|
96
|
-
Particle to-s := show
|
97
|
-
|
98
|
-
Symbol pretty := do:
|
99
|
-
s = to-s
|
100
|
-
if(s =~ r"^[\p{Ll}_]([\p{L}\d\p{S}!@#%&*\-_\\:.\/\?])*$"(u))
|
101
|
-
then: Doc text("#") <> Doc ident(s)
|
102
|
-
else: Doc text("#") <> s pretty
|
103
|
-
|
104
|
-
Hash pretty := doc:
|
105
|
-
text("#") <>
|
106
|
-
brackets $:
|
107
|
-
comma-delim $:
|
108
|
-
self to-a collect [[k, v]]:
|
109
|
-
k unamb <+> text("->") <+> v unamb
|
110
|
-
|
111
|
-
module(Atomy::AST):
|
112
|
-
Assign pretty :=
|
113
|
-
from(#assign):
|
114
|
-
doc: @lhs unamb <+> text("=") <+> @rhs unamb
|
115
|
-
|
116
|
-
BinarySend pretty :=
|
117
|
-
from(#binary):
|
118
|
-
doc: @lhs unamb <+> text(@operator) <+> @rhs unamb
|
119
|
-
|
120
|
-
Block pretty :=
|
121
|
-
doc:
|
122
|
-
args =
|
123
|
-
if(@arguments empty?)
|
124
|
-
then: empty
|
125
|
-
else: brackets(from(#list): comma-delim(@arguments all-pretty))
|
126
|
-
|
127
|
-
contents = from(#list): comma-delim(@contents all-pretty)
|
128
|
-
if(from?(#send-block) && from?(#top))
|
129
|
-
then: args <> colon <+> contents
|
130
|
-
else: args <+> lbrace <+> contents <+> rbrace
|
131
|
-
|
132
|
-
BlockPass pretty :=
|
133
|
-
from(#unary):
|
134
|
-
doc: text("&") <> @body unamb
|
135
|
-
|
136
|
-
Class pretty := doc:
|
137
|
-
sub =
|
138
|
-
if(@superclass kind-of?(Primitive) && @superclass value == #nil)
|
139
|
-
then: empty
|
140
|
-
else: text("<") <+> from(#binary): @superclass unamb
|
141
|
-
|
142
|
-
name =
|
143
|
-
@name match:
|
144
|
-
Rubinius::AST::ClassName -> text(@name) name to-s
|
145
|
-
_ -> @name unamb
|
146
|
-
|
147
|
-
body = lbrace <+> semi-delim(@body) expressions <+> rbrace
|
148
|
-
|
149
|
-
text("class") <> text("(") <> name <+> sub <> text(")") <+> body
|
150
|
-
|
151
|
-
ClassVariable pretty := doc: ident(name to-s)
|
152
|
-
|
153
|
-
Constant pretty := doc: text(@identifier)
|
154
|
-
|
155
|
-
Define pretty :=
|
156
|
-
from(#define):
|
157
|
-
doc: @lhs unamb <+> text(":=") <+> @body unamb
|
158
|
-
|
159
|
-
GlobalVariable pretty := doc: ident(name to-s)
|
160
|
-
|
161
|
-
InstanceVariable pretty := doc: ident(name to-s)
|
162
|
-
|
163
|
-
List pretty :=
|
164
|
-
from(#list):
|
165
|
-
doc: brackets(comma-delim(@elements all-pretty))
|
166
|
-
|
167
|
-
Macro pretty := doc:
|
168
|
-
text("macro") <+> parens(@pattern pretty) <+> @body pretty
|
169
|
-
|
170
|
-
Particle pretty := doc: text("#") <> ident(@name)
|
171
|
-
|
172
|
-
Primitive pretty := doc:
|
173
|
-
@value match:
|
174
|
-
-- TODO: glitch with #doc/#onto
|
175
|
-
#"self" -> text("self")
|
176
|
-
#true -> text("true")
|
177
|
-
#false -> text("false")
|
178
|
-
#nil -> text("nil")
|
179
|
-
x -> text(x inspect)
|
180
|
-
|
181
|
-
QuasiQuote pretty :=
|
182
|
-
from(#unary):
|
183
|
-
doc: text("`") <> @expression unamb
|
184
|
-
|
185
|
-
Quote pretty :=
|
186
|
-
from(#unary):
|
187
|
-
doc: text("'") <> @expression unamb
|
188
|
-
|
189
|
-
ScopedConstant pretty :=
|
190
|
-
from(#scoped-constant):
|
191
|
-
doc:
|
192
|
-
@parent unamb <> text("::") <> text(@identifier)
|
193
|
-
|
194
|
-
Send pretty :=
|
195
|
-
doc:
|
196
|
-
block =
|
197
|
-
from(#send-block, ^context):
|
198
|
-
if(@block) then: @block unamb; else: empty
|
199
|
-
|
200
|
-
with-block = [x]:
|
201
|
-
condition:
|
202
|
-
^multiline? && @block is-a?(Block) -> do:
|
203
|
-
cs = from(#top): vcat(@block contents all-pretty) nest(2)
|
204
|
-
if(from?(#top))
|
205
|
-
then: x <> colon // cs
|
206
|
-
else: x <+> lbrace // cs // rbrace
|
207
|
-
|
208
|
-
from?(#top) && @block is-a?(Block) && @block arguments empty? ->
|
209
|
-
x <> block
|
210
|
-
|
211
|
-
otherwise ->
|
212
|
-
x <+> block
|
213
37
|
|
214
|
-
|
215
|
-
|
216
|
-
if(@arguments empty?)
|
217
|
-
then: empty
|
218
|
-
else: parens(comma-delim(@arguments all-pretty))
|
219
|
-
|
220
|
-
condition:
|
221
|
-
@receiver kind-of?(Primitive) && @receiver value == #"self" ->
|
222
|
-
with-block [ident(@method-name) <> args]
|
223
|
-
|
224
|
-
otherwise ->
|
225
|
-
with-block [
|
226
|
-
from(#send) { @receiver unamb } <+>
|
227
|
-
ident(@method-name) <> args
|
228
|
-
]
|
229
|
-
|
230
|
-
Splice pretty :=
|
231
|
-
from(#unary):
|
232
|
-
doc: text("~*") <> @expression unamb
|
233
|
-
|
234
|
-
String pretty := Doc text(@value inspect)
|
235
|
-
|
236
|
-
ToplevelConstant pretty := doc: text("::") <> text(@identifier)
|
237
|
-
|
238
|
-
Unary pretty :=
|
239
|
-
from(#unary):
|
240
|
-
doc: text(@operator) <> @receiver unamb
|
241
|
-
|
242
|
-
Unquote pretty :=
|
243
|
-
from(#unary):
|
244
|
-
doc: text("~") <> @expression unamb
|
38
|
+
[a, b & Array]:
|
39
|
+
b include?(a)
|
245
40
|
|
246
|
-
|
41
|
+
[a, b]:
|
42
|
+
a == b
|
247
43
|
|
248
|
-
|
249
|
-
|
44
|
+
fn(render-sequence([])): []
|
45
|
+
fn(render-sequence([x])): [from(.top, .list): render(x)]
|
46
|
+
fn(render-sequence(x . xs)): [from(.list): render(x)] + render-sequence(xs)
|
47
|
+
|
48
|
+
fn(tree(xs)): align(fill-sep(comma punctuate(xs)))
|
49
|
+
fn(body(xs)): tree(render-sequence(xs))
|
50
|
+
|
51
|
+
fn(vtree(xs)): align(vcat(xs))
|
52
|
+
fn(vbody(xs)): from(.top): vtree(xs collect &.(Self render(_)))
|
53
|
+
|
54
|
+
fn(array(xs)):
|
55
|
+
enclose(
|
56
|
+
lbracket
|
57
|
+
rbracket
|
58
|
+
align(suggest-sep(comma punctuate(xs))))
|
59
|
+
|
60
|
+
fn(colored(color, doc)):
|
61
|
+
unless(^Colored && ^(io OutputPort) tty?):
|
62
|
+
return(doc)
|
63
|
+
|
64
|
+
codes = [
|
65
|
+
.black
|
66
|
+
.red
|
67
|
+
.green
|
68
|
+
.yellow
|
69
|
+
.blue
|
70
|
+
.magenta
|
71
|
+
.cyan
|
72
|
+
.white
|
73
|
+
]
|
74
|
+
|
75
|
+
(raw(i"\e[3#{codes index(color)}m") <> doc) <> raw("\e[0m")
|
76
|
+
|
77
|
+
|
78
|
+
def(render(x)):
|
79
|
+
if(^Printing include?(x))
|
80
|
+
then: text("...")
|
81
|
+
else:
|
82
|
+
with(Printing = (x . ^Printing)):
|
83
|
+
doc(x)
|
84
|
+
|
85
|
+
def(show(x)):
|
86
|
+
with(Colored = false):
|
87
|
+
render(x) flatten render
|
88
|
+
|
89
|
+
def(puts(x)): x tap: ^(io OutputPort) puts(show(x))
|
90
|
+
def(print(x)): x tap: ^(io OutputPort) print(show(x))
|
91
|
+
|
92
|
+
def(doc(s & String)): colored(.yellow, text(s inspect gsub("\\#", "#")))
|
93
|
+
def(doc(x & Numeric)): colored(.blue, text(x inspect))
|
94
|
+
def(doc(true)): colored(.green, text("true"))
|
95
|
+
def(doc(false)): colored(.red, text("false"))
|
96
|
+
def(doc(nil)): colored(.black, text("nil"))
|
97
|
+
def(doc({ equal?(_) })): colored(.black, text("_"))
|
98
|
+
def(doc(d & Doc)): d
|
99
|
+
def(doc(a & Array)): list(render-sequence(a))
|
100
|
+
|
101
|
+
def(doc(p & Particle)):
|
102
|
+
operator? = (p message to-s !~ r"^[a-z_]")
|
103
|
+
|
104
|
+
msg-args =
|
105
|
+
if(operator?)
|
106
|
+
then:
|
107
|
+
text(p message to-s) <+> unamb(p arguments first)
|
108
|
+
else:
|
109
|
+
ident(p message to-s) <>
|
110
|
+
tupled(render-sequence(p arguments))
|
111
|
+
|
112
|
+
partial =
|
113
|
+
if(p receiver equal?(_))
|
114
|
+
then:
|
115
|
+
if(operator?)
|
116
|
+
then: parens(msg-args)
|
117
|
+
else: msg-args
|
118
|
+
else: parens(unamb(p receiver) <+> msg-args)
|
119
|
+
|
120
|
+
text(".") <> partial
|
121
|
+
|
122
|
+
def(doc(s & Symbol)):
|
123
|
+
str = s to-s
|
124
|
+
if(str =~ r"\[\]=?|[A-Z][a-zA-Z0-9_]*|^[\p{Ll}_][\p{L}_\d\-]*[!?=]?$")
|
125
|
+
then: text(".") <> ident(str)
|
126
|
+
else: text(".") <> doc(str)
|
127
|
+
|
128
|
+
def(doc(h & Hash)):
|
129
|
+
text("#") <>
|
130
|
+
align(
|
131
|
+
( lbrace </>
|
132
|
+
tree(
|
133
|
+
h to-a collect [[k, v]]:
|
134
|
+
from(.infix):
|
135
|
+
(unamb(k) <+> text("->")) <+> unamb(v))
|
136
|
+
) nest(2) </>
|
137
|
+
rbrace)
|
138
|
+
|
139
|
+
fn(grouped(x)): from(.top): parens(render(x))
|
140
|
+
|
141
|
+
pretty = self
|
142
|
+
Atomy Grammar AST open:
|
143
|
+
pretty open:
|
144
|
+
def(unamb(
|
145
|
+
-- ok maybe operator precedence isn't the worst thing in the world
|
146
|
+
x & (
|
147
|
+
Block | (
|
148
|
+
Apply | (
|
149
|
+
Constant | (
|
150
|
+
(Sequence & { @nodes size < 2 }) | (
|
151
|
+
List | (
|
152
|
+
Literal | (
|
153
|
+
Number | Word))))))))):
|
154
|
+
render(x)
|
155
|
+
def(unamb(c & Compose)):
|
156
|
+
if(from?(.infix, .compose))
|
157
|
+
then: render(c)
|
158
|
+
else: grouped(c)
|
159
|
+
def(unamb(p & (Prefix | (Postfix | (QuasiQuote | (Quote | Unquote)))))):
|
160
|
+
if(from?(.postfix, .apply))
|
161
|
+
then: grouped(p)
|
162
|
+
else: render(p)
|
163
|
+
def(unamb(n & Node)):
|
164
|
+
grouped(n)
|
165
|
+
|
166
|
+
|
167
|
+
fn(braces-block(contents, left = Self empty)):
|
168
|
+
align((left <+> (lbrace <+> body(contents)) nest(2)) <+> rbrace) <||>
|
169
|
+
if(left empty?)
|
170
|
+
then: align(((lbrace <+> vbody(contents)) nest(2)) <$> rbrace)
|
171
|
+
else: align((left <+> (lbrace <$> vbody(contents)) nest(2)) <$> rbrace)
|
172
|
+
|
173
|
+
fn(proc-arg(left, contents)):
|
174
|
+
if(from?(.top))
|
250
175
|
then:
|
251
|
-
|
176
|
+
single = (colon <+> body(contents))
|
177
|
+
multi = (colon <$> vbody(contents))
|
178
|
+
|
179
|
+
block =
|
180
|
+
if(from?(.list))
|
181
|
+
-- when in a list, prefer the single-line form
|
182
|
+
--
|
183
|
+
-- e.g.:
|
184
|
+
-- macro(foo: bar):
|
185
|
+
-- baz
|
186
|
+
--
|
187
|
+
-- here it's better to have `foo: bar` on one line
|
188
|
+
then: single <|> multi
|
189
|
+
|
190
|
+
-- otherwise, prefer the multiline form
|
191
|
+
else: single <||> multi
|
192
|
+
|
193
|
+
align((left <> block) nest(2))
|
252
194
|
else:
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
195
|
+
braces-block(contents, left)
|
196
|
+
|
197
|
+
|
198
|
+
def(doc(b & Infix)):
|
199
|
+
from(.infix):
|
200
|
+
( if(b left)
|
201
|
+
then:
|
202
|
+
(unamb(b left) <+> text(b operator)) <\> unamb(b right)
|
203
|
+
else:
|
204
|
+
text(b operator) </> unamb(b right)
|
205
|
+
) hang(2)
|
206
|
+
|
207
|
+
def(doc(b & Block)): braces-block(b nodes)
|
208
|
+
|
209
|
+
def(doc(a & Apply)):
|
210
|
+
from(.apply) { unamb(a node) } <> tupled(render-sequence(a arguments))
|
211
|
+
|
212
|
+
def(doc(`(~x [~*ys] { ~*zs }))):
|
213
|
+
proc-arg(
|
214
|
+
from(.compose) { unamb(x) } <+>
|
215
|
+
list(render-sequence(ys))
|
216
|
+
zs)
|
217
|
+
|
218
|
+
def(doc(`(~x { ~*ys }))):
|
219
|
+
proc-arg(
|
220
|
+
from(.compose): unamb(x)
|
221
|
+
ys)
|
222
|
+
|
223
|
+
def(doc(c & Compose)):
|
224
|
+
from(.compose):
|
225
|
+
unamb(c left) <+> unamb(c right)
|
226
|
+
|
227
|
+
def(doc(c & Constant)): text(c text)
|
228
|
+
|
229
|
+
def(doc(l & List)):
|
230
|
+
array(render-sequence(l nodes)) <||>
|
231
|
+
align(
|
232
|
+
(lbracket <+> vbody(l nodes)) <$>
|
233
|
+
rbracket)
|
234
|
+
|
235
|
+
def(doc(l & Literal)): render(l value)
|
236
|
+
|
237
|
+
def(doc(p & Postfix)):
|
238
|
+
from(.postfix):
|
239
|
+
unamb(p node) <> text(p operator)
|
240
|
+
|
241
|
+
def(doc(p & Prefix)):
|
242
|
+
from(.prefix):
|
243
|
+
text(p operator) <> unamb(p node)
|
244
|
+
|
245
|
+
def(doc(n & Number)): text(n value inspect)
|
246
|
+
|
247
|
+
def(doc(q & QuasiQuote)):
|
248
|
+
from(.prefix):
|
249
|
+
text("`") <> unamb(q node)
|
250
|
+
|
251
|
+
def(doc(q & Quote)):
|
252
|
+
from(.prefix):
|
253
|
+
text("'") <> unamb(q node)
|
254
|
+
|
255
|
+
def(doc(s & StringLiteral)): text(s value inspect gsub("\\#", "#"))
|
256
|
+
|
257
|
+
def(doc(u & Unquote)):
|
258
|
+
from(.prefix):
|
259
|
+
text("~") <> unamb(u node)
|
260
|
+
|
261
|
+
def(doc(w & Word)): ident(w text to-s)
|
262
|
+
|
263
|
+
def(doc(t & Sequence)):
|
264
|
+
if(^Multiline)
|
265
|
+
then: vbody(t nodes)
|
266
|
+
else: body(t nodes)
|
267
|
+
|
268
|
+
|
269
|
+
def(doc(x)): text(x inspect)
|
270
|
+
|
271
|
+
def(unamb(x)): render(x)
|
272
|
+
|
273
|
+
-- Atomy Patterns open:
|
274
|
+
-- pretty open:
|
275
|
+
-- def(doc(a & And)): render(`(~(a a) & ~(a b)))
|
276
|
+
-- def(doc(Any)): text("_")
|
277
|
+
-- def(doc(a & Attribute)):
|
278
|
+
-- render(`(~(a receiver) ~init(Atomy AST Word, text: a name)))
|
279
|
+
-- def(doc(b & BlockPass)): render(`&~(b pattern))
|
280
|
+
-- def(doc(c & Constant)): render(c constant)
|
281
|
+
-- def(doc(d & Default)): render(`(~(d pattern) = ~(d default)))
|
282
|
+
-- def(doc(h & HeadTail)): render(`(~(h head) . ~(h tail)))
|
283
|
+
-- def(doc(l & List)): array(render-sequence(@patterns))
|
284
|
+
-- def(doc(l & Literal)): render(l value)
|
285
|
+
-- def(doc(m & Match)): render(m value)
|
286
|
+
-- def(doc(n & Named)):
|
287
|
+
-- if(n pattern is-a?(Any))
|
288
|
+
-- then: text(n name)
|
289
|
+
-- else: text(n name) <> text(":") <+> render(n pattern)
|
290
|
+
-- def(doc(n & NamedClass)):
|
291
|
+
-- render(`(@@~init(Atomy AST Word, text: n identifier)))
|
292
|
+
-- def(doc(n & NamedInstance)):
|
293
|
+
-- render(`(@~init(Atomy AST Word, text: n identifier)))
|
294
|
+
-- def(doc(n & NamedGlobal)):
|
295
|
+
-- render(`($~init(Atomy AST Word, text: n identifier)))
|
296
|
+
-- def(doc(o & Or)):
|
297
|
+
-- render(`(~(o a) | ~(o b)))
|
298
|
+
-- def(doc(p & Particle)):
|
299
|
+
-- render(
|
300
|
+
-- Particle new(
|
301
|
+
-- p receiver
|
302
|
+
-- p message
|
303
|
+
-- p arguments patterns))
|
304
|
+
-- def(doc(p & Predicate)): render(`(~(p pattern) ? ~(p test)))
|
305
|
+
-- def(doc(q & QuasiQuote)): render(q quoted)
|
306
|
+
-- def(doc(q & Quote)): render(`'~(q expression))
|
307
|
+
-- def(doc(s & SingletonClass)): render(s body)
|
308
|
+
-- def(doc(s & Splat)): render(`*~(s pattern))
|
309
|
+
-- def(doc(w & With)):
|
310
|
+
-- render(`(~(w pattern) & with(~(w expression), ~(w sub-pattern))))
|
311
|
+
|
312
|
+
-- def(unamb(x & (And | Attribute | Default | HeadTail | Or | Predicate | With))):
|
313
|
+
-- grouped(x)
|
314
|
+
-- def(unamb(n & Named)):
|
315
|
+
-- if(n pattern is-a?(Any))
|
316
|
+
-- then: render(n)
|
317
|
+
-- else: grouped(n)
|