diff options
| author | Joel Martin <github@martintribe.org> | 2014-10-04 21:49:26 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-10-04 21:49:26 -0500 |
| commit | 70ea599b6e0787102f12cd543dcd65a2eb3751d5 (patch) | |
| tree | 81e43e09ed4f56f9290cc765e0f57dd35de02a5d | |
| parent | 45e1db6afbb0c63b1cd5d17e0996d7929803f37b (diff) | |
| download | mal-70ea599b6e0787102f12cd543dcd65a2eb3751d5.tar.gz mal-70ea599b6e0787102f12cd543dcd65a2eb3751d5.zip | |
go: step1_read_print print working.
| -rw-r--r-- | go/Makefile | 2 | ||||
| -rw-r--r-- | go/src/printer/printer.go | 35 | ||||
| -rw-r--r-- | go/src/reader/reader.go | 5 | ||||
| -rw-r--r-- | go/src/step1_read_print/step1_read_print.go | 5 | ||||
| -rw-r--r-- | tests/step1_read_print.mal | 4 |
5 files changed, 44 insertions, 7 deletions
diff --git a/go/Makefile b/go/Makefile index 076a7aa..463fd12 100644 --- a/go/Makefile +++ b/go/Makefile @@ -2,7 +2,7 @@ export GOPATH := $(dir $(abspath $(lastword $(MAKEFILE_LIST)))) ##################### -SOURCES_BASE = src/types/types.go src/reader/reader.go +SOURCES_BASE = src/types/types.go src/reader/reader.go src/printer/printer.go SOURCES_LISP = src/step1_read_print/step1_read_print.go SOURCES = $(SOURCES_BASE) $(SOURCES_LISP) diff --git a/go/src/printer/printer.go b/go/src/printer/printer.go new file mode 100644 index 0000000..83d4c84 --- /dev/null +++ b/go/src/printer/printer.go @@ -0,0 +1,35 @@ +package printer + +import ( + "fmt" + "strings" +) + +import ( + "types" +) + +func Pr_str(obj types.MalType, print_readably bool) string { + switch tobj := obj.(type) { + case types.List: + str_list := make([]string, 0, len(tobj.Val)) + for _, e := range tobj.Val { + str_list = append(str_list, Pr_str(e, print_readably)) + } + return "(" + strings.Join(str_list, " ") + ")" + case string: + if print_readably { + // TODO: quote backslash, quote, and newline + return `"` + fmt.Sprintf("%v", obj) + `"` + } else { + return fmt.Sprintf("%v", obj) + } + case types.Symbol: + return tobj.Val + case nil: + return "nil" + default: + return fmt.Sprintf("%v", obj) + } + return "<printed>" +} diff --git a/go/src/reader/reader.go b/go/src/reader/reader.go index 3222d6f..6a08840 100644 --- a/go/src/reader/reader.go +++ b/go/src/reader/reader.go @@ -29,7 +29,7 @@ func (tr *TokenReader) next() *string { } func (tr *TokenReader) peek() *string { - if tr.position > len(tr.tokens) { return nil } + if tr.position >= len(tr.tokens) { return nil } return &tr.tokens[tr.position] } @@ -79,8 +79,9 @@ func read_list(rdr Reader) (types.MalType, error) { return nil, errors.New("expected '('") } token = rdr.peek() - for ; token != nil && *token != ")" ; token = rdr.peek() { + for ; true ; token = rdr.peek() { if token == nil { return nil, errors.New("exepected ')', got EOF") } + if *token == ")" { break } f, e := read_form(rdr) if e != nil { return nil, e } ast_list = append(ast_list, f) diff --git a/go/src/step1_read_print/step1_read_print.go b/go/src/step1_read_print/step1_read_print.go index 60a06cb..1f020af 100644 --- a/go/src/step1_read_print/step1_read_print.go +++ b/go/src/step1_read_print/step1_read_print.go @@ -11,6 +11,7 @@ import ( import ( "types" "reader" + "printer" ) // read @@ -25,7 +26,7 @@ func EVAL(ast types.MalType, env string) (types.MalType, error) { // print func PRINT(exp types.MalType) (types.MalType, error) { - return exp, nil + return printer.Pr_str(exp, true), nil } // repl @@ -55,6 +56,6 @@ func main() { fmt.Printf("Error: %v\n", e) continue } - fmt.Printf("%#v\n", out) + fmt.Printf("%v\n", out) } } diff --git a/tests/step1_read_print.mal b/tests/step1_read_print.mal index 0c715de..7772de9 100644 --- a/tests/step1_read_print.mal +++ b/tests/step1_read_print.mal @@ -73,8 +73,8 @@ abc-def ;=>{"a" {"b" {"cde" 3}}} ;; Test commas as whitespace -[1 2, 3,,,,],, -;=>[1 2 3] +(1 2, 3,,,,),, +;=>(1 2 3) ;; ;; Testing reader errors |
