atomy 0.1.1 → 0.6.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +13 -0
  3. data/LICENSE.md +201 -0
  4. data/bin/atomy +16 -133
  5. data/kernel/array.ay +6 -0
  6. data/kernel/atomy.ay +18 -0
  7. data/kernel/condition.ay +171 -271
  8. data/kernel/control-flow.ay +197 -192
  9. data/kernel/core.ay +120 -0
  10. data/kernel/data.ay +83 -39
  11. data/kernel/define.ay +84 -93
  12. data/kernel/doc.ay +282 -449
  13. data/kernel/dynamic.ay +25 -29
  14. data/kernel/file.ay +9 -0
  15. data/kernel/grammar.ay +267 -0
  16. data/kernel/hash.ay +17 -0
  17. data/kernel/interpolation.ay +59 -0
  18. data/kernel/io.ay +70 -244
  19. data/kernel/let-macro.ay +24 -0
  20. data/kernel/let-pattern.ay +24 -0
  21. data/kernel/loop.ay +80 -0
  22. data/kernel/mutation.ay +53 -0
  23. data/kernel/particles.ay +176 -39
  24. data/kernel/patterns.ay +527 -191
  25. data/kernel/pretty.ay +311 -277
  26. data/kernel/quotes.ay +29 -0
  27. data/kernel/range.ay +4 -0
  28. data/kernel/regexp.ay +23 -0
  29. data/kernel/repl.ay +83 -109
  30. data/kernel/stack-local.ay +21 -0
  31. data/lib/atomy.rb +37 -0
  32. data/lib/atomy/bootstrap.rb +256 -0
  33. data/lib/atomy/code/assign.rb +64 -0
  34. data/lib/atomy/code/block.rb +98 -0
  35. data/lib/atomy/code/class_variable.rb +17 -0
  36. data/lib/atomy/code/constant.rb +21 -0
  37. data/lib/atomy/code/define.rb +242 -0
  38. data/lib/atomy/code/define_function.rb +51 -0
  39. data/lib/atomy/code/define_method.rb +20 -0
  40. data/lib/atomy/code/false.rb +9 -0
  41. data/lib/atomy/code/instance_variable.rb +15 -0
  42. data/lib/atomy/code/integer.rb +13 -0
  43. data/lib/atomy/code/list.rb +17 -0
  44. data/lib/atomy/code/nil.rb +9 -0
  45. data/lib/atomy/code/pattern.rb +23 -0
  46. data/lib/atomy/code/pattern/and.rb +61 -0
  47. data/lib/atomy/code/pattern/quasi_quote.rb +185 -0
  48. data/lib/atomy/code/pattern/splat.rb +29 -0
  49. data/lib/atomy/code/pattern/wildcard.rb +37 -0
  50. data/lib/atomy/code/quasi_quote.rb +118 -0
  51. data/lib/atomy/code/quote.rb +13 -0
  52. data/lib/atomy/code/self.rb +9 -0
  53. data/lib/atomy/code/send.rb +110 -0
  54. data/lib/atomy/code/sequence.rb +23 -0
  55. data/lib/atomy/code/string_literal.rb +53 -0
  56. data/lib/atomy/code/symbol.rb +13 -0
  57. data/lib/atomy/code/true.rb +9 -0
  58. data/lib/atomy/code/undefined.rb +9 -0
  59. data/lib/atomy/code/variable.rb +17 -0
  60. data/lib/atomy/codeloader.rb +218 -0
  61. data/lib/atomy/compiler.rb +57 -0
  62. data/lib/atomy/errors.rb +54 -0
  63. data/lib/atomy/grammar.rb +2278 -0
  64. data/lib/atomy/locals.rb +75 -0
  65. data/lib/atomy/message_structure.rb +277 -0
  66. data/lib/atomy/method.rb +343 -0
  67. data/lib/atomy/module.rb +144 -0
  68. data/lib/atomy/node/constructable.rb +169 -0
  69. data/lib/atomy/node/equality.rb +113 -0
  70. data/lib/atomy/node/meta.rb +206 -0
  71. data/lib/atomy/node/pretty.rb +108 -0
  72. data/lib/atomy/parser.rb +21 -0
  73. data/lib/atomy/pattern.rb +26 -0
  74. data/lib/atomy/pattern/and.rb +59 -0
  75. data/lib/atomy/pattern/attribute.rb +16 -0
  76. data/lib/atomy/pattern/class_variable.rb +15 -0
  77. data/lib/atomy/pattern/equality.rb +42 -0
  78. data/lib/atomy/pattern/instance_variable.rb +15 -0
  79. data/lib/atomy/pattern/kind_of.rb +20 -0
  80. data/lib/atomy/pattern/or.rb +48 -0
  81. data/lib/atomy/pattern/quasi_quote.rb +164 -0
  82. data/lib/atomy/pattern/splat.rb +15 -0
  83. data/lib/atomy/pattern/wildcard.rb +18 -0
  84. data/lib/atomy/rubygems.rb +48 -0
  85. data/lib/atomy/version.rb +3 -0
  86. metadata +169 -134
  87. data/COPYING +0 -30
  88. data/README.md +0 -1
  89. data/kernel/block.ay +0 -30
  90. data/kernel/boot.ay +0 -10
  91. data/kernel/comparison.ay +0 -61
  92. data/kernel/concurrency.ay +0 -84
  93. data/kernel/cosmetics.ay +0 -3
  94. data/kernel/data-delta.ay +0 -105
  95. data/kernel/documentation.ay +0 -135
  96. data/kernel/errors.ay +0 -6
  97. data/kernel/format.ay +0 -13
  98. data/kernel/format/data.ay +0 -89
  99. data/kernel/format/formatter.ay +0 -345
  100. data/kernel/format/parser.ay +0 -13
  101. data/kernel/hashes.ay +0 -39
  102. data/kernel/namespaces.ay +0 -63
  103. data/kernel/node.ay +0 -48
  104. data/kernel/operators.ay +0 -28
  105. data/kernel/precision.ay +0 -148
  106. data/kernel/therie.ay +0 -204
  107. data/lib/ast/binary_send.rb +0 -44
  108. data/lib/ast/block.rb +0 -268
  109. data/lib/ast/constant.rb +0 -88
  110. data/lib/ast/internal/assign.rb +0 -19
  111. data/lib/ast/internal/block_pass.rb +0 -21
  112. data/lib/ast/internal/catch.rb +0 -247
  113. data/lib/ast/internal/class.rb +0 -30
  114. data/lib/ast/internal/class_variable.rb +0 -23
  115. data/lib/ast/internal/define.rb +0 -174
  116. data/lib/ast/internal/ensure.rb +0 -135
  117. data/lib/ast/internal/file.rb +0 -14
  118. data/lib/ast/internal/global_variable.rb +0 -20
  119. data/lib/ast/internal/if_then_else.rb +0 -24
  120. data/lib/ast/internal/instance_variable.rb +0 -17
  121. data/lib/ast/internal/let_macro.rb +0 -35
  122. data/lib/ast/internal/macro_quote.rb +0 -23
  123. data/lib/ast/internal/match.rb +0 -53
  124. data/lib/ast/internal/module.rb +0 -30
  125. data/lib/ast/internal/pattern.rb +0 -17
  126. data/lib/ast/internal/return.rb +0 -29
  127. data/lib/ast/internal/set.rb +0 -19
  128. data/lib/ast/internal/singleton_class.rb +0 -18
  129. data/lib/ast/internal/splat.rb +0 -14
  130. data/lib/ast/internal/when.rb +0 -24
  131. data/lib/ast/list.rb +0 -25
  132. data/lib/ast/macro.rb +0 -37
  133. data/lib/ast/node.rb +0 -599
  134. data/lib/ast/operator.rb +0 -21
  135. data/lib/ast/particle.rb +0 -13
  136. data/lib/ast/primitive.rb +0 -20
  137. data/lib/ast/quasi_quote.rb +0 -20
  138. data/lib/ast/quote.rb +0 -13
  139. data/lib/ast/send.rb +0 -104
  140. data/lib/ast/splice.rb +0 -32
  141. data/lib/ast/string.rb +0 -23
  142. data/lib/ast/unary.rb +0 -44
  143. data/lib/ast/unquote.rb +0 -45
  144. data/lib/ast/variable.rb +0 -64
  145. data/lib/atomy.kpeg.rb +0 -3995
  146. data/lib/code_loader.rb +0 -137
  147. data/lib/compiler/compiler.rb +0 -155
  148. data/lib/compiler/stages.rb +0 -81
  149. data/lib/formatter.kpeg.rb +0 -1394
  150. data/lib/macros.rb +0 -317
  151. data/lib/method.rb +0 -261
  152. data/lib/namespace.rb +0 -236
  153. data/lib/parser.rb +0 -28
  154. data/lib/patterns.rb +0 -276
  155. data/lib/patterns/any.rb +0 -21
  156. data/lib/patterns/attribute.rb +0 -59
  157. data/lib/patterns/block_pass.rb +0 -54
  158. data/lib/patterns/constant.rb +0 -33
  159. data/lib/patterns/default.rb +0 -44
  160. data/lib/patterns/head_tail.rb +0 -63
  161. data/lib/patterns/list.rb +0 -77
  162. data/lib/patterns/match.rb +0 -45
  163. data/lib/patterns/named.rb +0 -55
  164. data/lib/patterns/named_class.rb +0 -46
  165. data/lib/patterns/named_global.rb +0 -46
  166. data/lib/patterns/named_instance.rb +0 -46
  167. data/lib/patterns/particle.rb +0 -29
  168. data/lib/patterns/quasi_quote.rb +0 -184
  169. data/lib/patterns/quote.rb +0 -33
  170. data/lib/patterns/singleton_class.rb +0 -31
  171. data/lib/patterns/splat.rb +0 -57
  172. data/lib/util.rb +0 -37
data/kernel/pretty.ay CHANGED
@@ -1,283 +1,317 @@
1
- namespace(atomy/pretty)
2
-
3
- dynamic(multiline?, false)
4
- dynamic(context, #top)
5
- dynamic(colored?, false)
6
-
7
- comma-delim(ds) :=
8
- hsep(comma punctuate(ds))
9
-
10
- ident(n) := text(n [0, 1] + n [1 .. -1] tr("_", "-") gsub("_ns_", "/"))
11
-
12
- module(Atomy::AST):
13
- Block unamb := pretty
14
- ClassVariable unamb := pretty
15
- Constant unamb := pretty
16
- GlobalVariable unamb := pretty
17
- (InlinedBody ? @contents size < 2) unamb := pretty
18
- InstanceVariable unamb := pretty
19
- List unamb := pretty
20
- Particle unamb := pretty
21
- Primitive unamb := pretty
22
- QuasiQuote unamb := pretty
23
- Quote unamb := pretty
24
- ScopedConstant unamb := pretty
25
- Send unamb :=
26
- if(from?(#binary, #send))
27
- then: pretty
28
- else: Doc parens(pretty)
29
- Splice unamb := pretty
30
- String unamb := pretty
31
- ToplevelConstant unamb := pretty
32
- Unary unamb := pretty
33
- Unquote unamb := pretty
34
- Variable unamb := pretty
35
- Node unamb := Doc parens(pretty)
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
- args =
215
- from(#list):
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
- Variable pretty := doc: ident(@name)
41
+ [a, b]:
42
+ a == b
247
43
 
248
- InlinedBody pretty := doc:
249
- if(^multiline?)
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
- from(#top): vcat(@expressions all-pretty)
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
- from(#list): comma-delim(@expressions all-pretty)
254
-
255
- Or pretty := `(~@a || ~@b) pretty
256
-
257
- And pretty := `(~@a && ~@b) pretty
258
-
259
- Ensure pretty := doc:
260
- @body pretty <+> text("ensuring:") <+> @ensure pretty
261
-
262
-
263
- Array all-pretty := collect [x]: x pretty
264
-
265
- Doc colored(color) := do:
266
- -- only makes sense to colorize if we're outputting to a terminal
267
- unless(^output-port tty? && ^colored?):
268
- return(self)
269
-
270
- codes =
271
- [ #black
272
- #red
273
- #green
274
- #yellow
275
- #blue
276
- #magenta
277
- #cyan
278
- #white
279
- ] zip((0 .. 7) to-a)
280
-
281
- hash = Hash [codes]
282
-
283
- Doc text("\e[9" + hash [color] to-s + "m") <> self <> Doc text("\e[0m")
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)