]> gitweb.factorcode.org Git - factor.git/blob - core/prettyprint/prettyprint.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / core / prettyprint / prettyprint.factor
1 ! Copyright (C) 2003, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 IN: prettyprint
4 USING: arrays generic generic.standard assocs io kernel
5 math namespaces sequences strings io.styles io.streams.string
6 vectors words prettyprint.backend prettyprint.sections
7 prettyprint.config sorting splitting math.parser vocabs
8 definitions effects classes.builtin classes.tuple io.files
9 classes continuations hashtables classes.mixin classes.union
10 classes.intersection classes.predicate classes.singleton
11 combinators quotations sets ;
12
13 : make-pprint ( obj quot -- block in use )
14     [
15         0 position set
16         H{ } clone pprinter-use set
17         V{ } clone recursion-check set
18         V{ } clone pprinter-stack set
19         over <object
20         call
21         pprinter-block
22         pprinter-in get
23         pprinter-use get keys
24     ] with-scope ; inline
25
26 : with-pprint ( obj quot -- )
27     make-pprint 2drop do-pprint ; inline
28
29 : pprint-vocab ( vocab -- )
30     dup vocab present-text ;
31
32 : write-in ( vocab -- )
33     [ \ IN: pprint-word pprint-vocab ] with-pprint ;
34
35 : in. ( vocab -- )
36     [ write-in nl ] when* ;
37
38 : use. ( seq -- )
39     dup empty? [ drop ] [
40         natural-sort [
41             \ USING: pprint-word
42             [ pprint-vocab ] each
43             \ ; pprint-word
44         ] with-pprint nl
45     ] if ;
46
47 : vocabs. ( in use -- )
48     dupd remove [ { "syntax" "scratchpad" } member? not ] filter
49     use. in. ;
50
51 : with-use ( obj quot -- )
52     make-pprint vocabs. do-pprint ; inline
53
54 : with-in ( obj quot -- )
55     make-pprint drop [ write-in bl ] when* do-pprint ; inline
56
57 : pprint ( obj -- ) [ pprint* ] with-pprint ;
58
59 : . ( obj -- )
60     H{
61        { length-limit 1000 }
62        { nesting-limit 10 }
63     } clone [ pprint ] bind nl ;
64
65 : pprint-use ( obj -- ) [ pprint* ] with-use ;
66
67 : unparse ( obj -- str ) [ pprint ] with-string-writer ;
68
69 : unparse-use ( obj -- str ) [ pprint-use ] with-string-writer ;
70
71 : pprint-short ( obj -- )
72     H{
73        { line-limit 1 }
74        { length-limit 15 }
75        { nesting-limit 2 }
76        { string-limit t }
77     } clone [ pprint ] bind ;
78
79 : unparse-short ( obj -- str )
80     [ pprint-short ] with-string-writer ;
81
82 : short. ( obj -- ) pprint-short nl ;
83
84 : .b ( n -- ) >bin print ;
85 : .o ( n -- ) >oct print ;
86 : .h ( n -- ) >hex print ;
87
88 : stack. ( seq -- ) [ short. ] each ;
89
90 : .s ( -- ) datastack stack. ;
91 : .r ( -- ) retainstack stack. ;
92
93 <PRIVATE
94
95 SYMBOL: ->
96
97 \ ->
98 { { foreground { 1 1 1 1 } } { background { 0 0 0 1 } } }
99 "word-style" set-word-prop
100
101 : remove-step-into ( word -- )
102     building get dup empty? [ drop ] [ nip pop wrapped ] if , ;
103
104 : (remove-breakpoints) ( quot -- newquot )
105     [
106         [
107             {
108                 { [ dup word? not ] [ , ] }
109                 { [ dup "break?" word-prop ] [ drop ] }
110                 { [ dup "step-into?" word-prop ] [ remove-step-into ] }
111                 [ , ]
112             } cond
113         ] each
114     ] [ ] make ;
115
116 : remove-breakpoints ( quot pos -- quot' )
117     over quotation? [
118         1+ cut [ (remove-breakpoints) ] bi@
119         [ -> ] swap 3append
120     ] [
121         drop
122     ] if ;
123
124 PRIVATE>
125
126 : callstack. ( callstack -- )
127     callstack>array 2 <groups> [
128         remove-breakpoints
129         2 nesting-limit [ . ] with-variable
130     ] assoc-each ;
131
132 : .c ( -- ) callstack callstack. ;
133
134 : pprint-cell ( obj -- ) [ pprint ] with-cell ;
135
136 GENERIC: see ( defspec -- )
137
138 : comment. ( string -- )
139     [ H{ { font-style italic } } styled-text ] when* ;
140
141 : seeing-word ( word -- )
142     word-vocabulary pprinter-in set ;
143
144 : definer. ( defspec -- )
145     definer drop pprint-word ;
146
147 : stack-effect. ( word -- )
148     dup parsing? over symbol? or not swap stack-effect and
149     [ effect>string comment. ] when* ;
150
151 : word-synopsis ( word -- )
152     dup seeing-word
153     dup definer.
154     dup pprint-word
155     stack-effect. ;
156
157 M: word synopsis* word-synopsis ;
158
159 M: simple-generic synopsis* word-synopsis ;
160
161 M: standard-generic synopsis*
162     dup definer.
163     dup seeing-word
164     dup pprint-word
165     dup dispatch# pprint*
166     stack-effect. ;
167
168 M: hook-generic synopsis*
169     dup definer.
170     dup seeing-word
171     dup pprint-word
172     dup "combination" word-prop hook-combination-var pprint*
173     stack-effect. ;
174
175 M: method-spec synopsis*
176     first2 method synopsis* ;
177
178 M: method-body synopsis*
179     dup dup
180     definer.
181     "method-class" word-prop pprint-word
182     "method-generic" word-prop pprint-word ;
183
184 M: mixin-instance synopsis*
185     dup definer.
186     dup mixin-instance-class pprint-word
187     mixin-instance-mixin pprint-word ;
188
189 M: pathname synopsis* pprint* ;
190
191 : synopsis ( defspec -- str )
192     [
193         0 margin set
194         1 line-limit set
195         [ synopsis* ] with-in
196     ] with-string-writer ;
197
198 : synopsis-alist ( definitions -- alist )
199     [ dup synopsis swap ] { } map>assoc ;
200
201 : definitions. ( alist -- )
202     [ write-object nl ] assoc-each ;
203
204 : sorted-definitions. ( definitions -- )
205     synopsis-alist sort-keys definitions. ;
206
207 GENERIC: declarations. ( obj -- )
208
209 M: object declarations. drop ;
210
211 : declaration. ( word prop -- )
212     tuck word-name word-prop [ pprint-word ] [ drop ] if ;
213
214 M: word declarations.
215     {
216         POSTPONE: parsing
217         POSTPONE: delimiter
218         POSTPONE: inline
219         POSTPONE: foldable
220         POSTPONE: flushable
221     } [ declaration. ] with each ;
222
223 : pprint-; \ ; pprint-word ;
224
225 : (see) ( spec -- )
226     <colon dup synopsis*
227     <block dup definition pprint-elements block>
228     dup definer nip [ pprint-word ] when* declarations.
229     block> ;
230
231 M: object see
232     [ (see) ] with-use nl ;
233
234 GENERIC: see-class* ( word -- )
235
236 M: union-class see-class*
237     <colon \ UNION: pprint-word
238     dup pprint-word
239     members pprint-elements pprint-; block> ;
240
241 M: intersection-class see-class*
242     <colon \ INTERSECTION: pprint-word
243     dup pprint-word
244     participants pprint-elements pprint-; block> ;
245
246 M: mixin-class see-class*
247     <block \ MIXIN: pprint-word
248     dup pprint-word <block
249     dup members [
250         hard line-break
251         \ INSTANCE: pprint-word pprint-word pprint-word
252     ] with each block> block> ;
253
254 M: predicate-class see-class*
255     <colon \ PREDICATE: pprint-word
256     dup pprint-word
257     "<" text
258     dup superclass pprint-word
259     <block
260     "predicate-definition" word-prop pprint-elements
261     pprint-; block> block> ;
262
263 M: singleton-class see-class* ( class -- )
264     \ SINGLETON: pprint-word pprint-word ;
265
266 M: tuple-class see-class*
267     <colon \ TUPLE: pprint-word
268     dup pprint-word
269     dup superclass tuple eq? [
270         "<" text dup superclass pprint-word
271     ] unless
272     slot-names [ text ] each
273     pprint-; block> ;
274
275 M: word see-class* drop ;
276
277 M: builtin-class see-class*
278     drop "! Built-in class" comment. ;
279
280 : see-all ( seq -- )
281     natural-sort [ nl see ] each ;
282
283 : see-implementors ( class -- seq )
284     dup implementors
285     [ method ] with map
286     natural-sort ;
287
288 : see-class ( class -- )
289     dup class? [
290         [
291             dup seeing-word dup see-class*
292         ] with-use nl
293     ] when drop ;
294
295 : see-methods ( generic -- seq )
296     "methods" word-prop values natural-sort ;
297
298 M: word see
299     dup see-class
300     dup class? over symbol? not and [
301         nl
302     ] when
303     dup class? over symbol? and not [
304         [ dup (see) ] with-use nl
305     ] when
306     [
307         dup class? [ dup see-implementors % ] when
308         dup generic? [ dup see-methods % ] when
309         drop
310     ] { } make prune see-all ;