3 // Copyright 2009 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
7 // Test general operation using s-list.
8 // First Go program ever run (although not in this exact form).
19 next *Slist /* in hash bucket */
37 func (this *Slist) Car() *Slist {
41 func (this *Slist) Cdr() *Slist {
45 func (this *Slist) String() string {
49 func (this *Slist) Integer() int {
50 return this.atom.integer
53 func (slist *Slist) Free() {
58 // free(slist.String());
66 //Slist* atom(byte *s, int i);
73 var inputindex int = 0
74 var tokenbuf [100]byte
90 if r != "(defn foo (add 12 34))" {
97 func (slist *Slist) PrintOne(doparen bool) string {
106 r = fmt.Sprintf("%v", slist.Integer())
112 r += slist.Car().PrintOne(true)
113 if slist.Cdr() != nil {
115 r += slist.Cdr().PrintOne(false)
124 func (slist *Slist) Print() string {
125 return slist.PrintOne(true)
135 c = int(input[inputindex])
141 inputindex = inputindex - 1
148 func WhiteSpace(c int) bool {
149 return c == ' ' || c == '\t' || c == '\r' || c == '\n'
155 tokenbuf[0] = nilchar // clear previous token
167 for i = 0; i < 100-1; { // sizeof tokenbuf - 1
168 tokenbuf[i] = byte(c)
174 if WhiteSpace(c) || c == ')' {
179 if i >= 100-1 { // sizeof tokenbuf - 1
180 panic("atom too long\n")
183 tokenbuf[i] = nilchar
184 if '0' <= tokenbuf[0] && tokenbuf[0] <= '9' {
194 print("parse error: expected ", c, "\n")
200 // Parse a non-parenthesized list up to a closing paren or EOF
201 func ParseList() *Slist {
202 var slist, retval *Slist
208 slist.isstring = false
212 slist.list.car = Parse()
213 if token == ')' || token == EOF { // empty cdr
216 slist.list.cdr = new(Slist)
217 slist = slist.list.cdr
222 func atom(i int) *Slist { // BUG: uses tokenbuf; should take argument)
227 slist.atom.integer = i
228 slist.isstring = false
230 slist.atom.str = string(tokenbuf[0:tokenlen])
231 slist.isstring = true
237 func atoi() int { // BUG: uses tokenbuf; should take argument)
239 for i := 0; i < tokenlen && '0' <= tokenbuf[i] && tokenbuf[i] <= '9'; i = i + 1 {
240 v = 10*v + int(tokenbuf[i]-'0')
245 func Parse() *Slist {
248 if token == EOF || token == ')' {
267 print("unknown token: ", token, "\n")
276 input = "(defn foo (add 12 34))\n\x00"