File tree 2 files changed +184
-0
lines changed
2 files changed +184
-0
lines changed Original file line number Diff line number Diff line change
1
+ package main
2
+
3
+ import (
4
+ "fmt"
5
+ "strings"
6
+ )
7
+
8
+ func pprint (s Sexpr ) string {
9
+ c , ok := s .(* ConsCell )
10
+ if ! ok {
11
+ return s .String ()
12
+ }
13
+ return pprintCons (c , 0 )
14
+ }
15
+
16
+ func pprintCons (c * ConsCell , indent int ) string {
17
+ fmt .Println ("indent:" , indent )
18
+ firstTry := c .String ()
19
+ if len (firstTry )+ indent < 80 {
20
+ return c .String ()
21
+ }
22
+ indentStr := strings .Repeat (" " , indent + 1 )
23
+ head := c .car .String ()
24
+ ret := "("
25
+ for c != Nil {
26
+ if c .cdr == Nil {
27
+ ret += head
28
+ break
29
+ }
30
+ ret += head + "\n " + indentStr
31
+ c = c .cdr .(* ConsCell )
32
+ head = c .car .String ()
33
+ }
34
+ return ret + ")"
35
+ }
Original file line number Diff line number Diff line change
1
+ package main
2
+
3
+ import (
4
+ "testing"
5
+ )
6
+
7
+ func TestPprint (t * testing.T ) {
8
+ var tests = []struct {
9
+ example string
10
+ }{
11
+ {"1" },
12
+ {"(1 2 3)" },
13
+ {"(0 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)" },
14
+ {`(0
15
+ 1
16
+ 2
17
+ 3
18
+ 4
19
+ 5
20
+ 6
21
+ 7
22
+ 8
23
+ 9
24
+ 10
25
+ 11
26
+ 12
27
+ 13
28
+ 14
29
+ 15
30
+ 16
31
+ 17
32
+ 18
33
+ 19
34
+ 20
35
+ 21
36
+ 22
37
+ 23
38
+ 24
39
+ 25
40
+ 26
41
+ 27
42
+ 28
43
+ 29
44
+ 30
45
+ 31
46
+ 32
47
+ 33
48
+ 34
49
+ 35
50
+ 36
51
+ 37
52
+ 38
53
+ 39
54
+ 40
55
+ 41
56
+ 42
57
+ 43
58
+ 44
59
+ 45
60
+ 46
61
+ 47
62
+ 48
63
+ 49
64
+ 50
65
+ 51
66
+ 52
67
+ 53
68
+ 54
69
+ 55
70
+ 56
71
+ 57
72
+ 58
73
+ 59
74
+ 60
75
+ 61
76
+ 62
77
+ 63
78
+ 64
79
+ 65
80
+ 66
81
+ 67
82
+ 68
83
+ 69
84
+ 70
85
+ 71
86
+ 72
87
+ 73
88
+ 74
89
+ 75
90
+ 76
91
+ 77
92
+ 78
93
+ 79
94
+ 80
95
+ 81
96
+ 82
97
+ 83
98
+ 84
99
+ 85
100
+ 86
101
+ 87
102
+ 88
103
+ 89
104
+ 90
105
+ 91
106
+ 92
107
+ 93
108
+ 94
109
+ 95
110
+ 96
111
+ 97
112
+ 98
113
+ 99)` },
114
+ {"(snuffleupagus snuffleupagus snuffleupagus)" },
115
+ {`(snuffleupagus
116
+ snuffleupagus
117
+ snuffleupagus
118
+ snuffleupagus
119
+ snuffleupagus
120
+ snuffleupagus
121
+ snuffleupagus
122
+ snuffleupagus
123
+ snuffleupagus
124
+ snuffleupagus)` },
125
+ {"(f snuffleupagus snuffleupagus snuffleupagus)" },
126
+ {`(f snuffleupagus
127
+ snuffleupagus
128
+ snuffleupagus
129
+ snuffleupagus
130
+ snuffleupagus
131
+ snuffleupagus
132
+ snuffleupagus
133
+ snuffleupagus
134
+ snuffleupagus
135
+ snuffleupagus)` },
136
+ {"(defn inc (x) (+ x 1))" },
137
+ }
138
+ for _ , test := range tests {
139
+ s , err := lexAndParse ([]string {test .example })
140
+ if err != nil {
141
+ t .Errorf ("Testpprint: lexAndParse(%q) returned error: %v" , test .example , err )
142
+ }
143
+ if pprint (s [0 ]) != test .example {
144
+ t .Errorf ("%s != %s: FAIL" , s [0 ], test .example )
145
+ } else {
146
+ t .Logf ("%q == %q: OK" , s [0 ], test .example )
147
+ }
148
+ }
149
+ }
You can’t perform that action at this time.
0 commit comments