aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-10-04 21:49:26 -0500
committerJoel Martin <github@martintribe.org>2014-10-04 21:49:26 -0500
commit70ea599b6e0787102f12cd543dcd65a2eb3751d5 (patch)
tree81e43e09ed4f56f9290cc765e0f57dd35de02a5d
parent45e1db6afbb0c63b1cd5d17e0996d7929803f37b (diff)
downloadmal-70ea599b6e0787102f12cd543dcd65a2eb3751d5.tar.gz
mal-70ea599b6e0787102f12cd543dcd65a2eb3751d5.zip
go: step1_read_print print working.
-rw-r--r--go/Makefile2
-rw-r--r--go/src/printer/printer.go35
-rw-r--r--go/src/reader/reader.go5
-rw-r--r--go/src/step1_read_print/step1_read_print.go5
-rw-r--r--tests/step1_read_print.mal4
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