Skip to content

Commit 0ebb580

Browse files
committed
pprint WIP. #76
1 parent 353f339 commit 0ebb580

File tree

2 files changed

+184
-0
lines changed

2 files changed

+184
-0
lines changed

pprint.go

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
}

pprint_test.go

+149
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
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+
}

0 commit comments

Comments
 (0)