aboutsummaryrefslogtreecommitdiff
path: root/go/src/reader
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-10-09 21:37:00 -0500
committerJoel Martin <github@martintribe.org>2014-10-09 21:37:00 -0500
commitf2544a9467ea032aff505b3ced3b4b3510a828fe (patch)
treeaa1984aef01c20b7b093527c28c37bd7d4d803d5 /go/src/reader
parentf2c9811fd8cbb205fad68952ebc1ba5d310f148d (diff)
downloadmal-f2544a9467ea032aff505b3ced3b4b3510a828fe.tar.gz
mal-f2544a9467ea032aff505b3ced3b4b3510a828fe.zip
go: add metadata and atoms. HashMap dedicated type.
HashMap needs a dedicated type now to be able to store the metadata.
Diffstat (limited to 'go/src/reader')
-rw-r--r--go/src/reader/reader.go19
1 files changed, 13 insertions, 6 deletions
diff --git a/go/src/reader/reader.go b/go/src/reader/reader.go
index 2ac5a08..38f163c 100644
--- a/go/src/reader/reader.go
+++ b/go/src/reader/reader.go
@@ -93,13 +93,13 @@ func read_list(rdr Reader, start string, end string) (MalType, error) {
ast_list = append(ast_list, f)
}
rdr.next()
- return List{ast_list}, nil
+ return List{ast_list,nil}, nil
}
func read_vector(rdr Reader) (MalType, error) {
lst, e := read_list(rdr, "[", "]")
if e != nil { return nil, e }
- vec := Vector{lst.(List).Val}
+ vec := Vector{lst.(List).Val,nil}
return vec, nil
}
@@ -116,16 +116,23 @@ func read_form(rdr Reader) (MalType, error) {
case `'`: rdr.next();
form, e := read_form(rdr); if e != nil { return nil, e }
- return List{[]MalType{Symbol{"quote"}, form}}, nil
+ return List{[]MalType{Symbol{"quote"}, form},nil}, nil
case "`": rdr.next();
form, e := read_form(rdr); if e != nil { return nil, e }
- return List{[]MalType{Symbol{"quasiquote"}, form}}, nil
+ return List{[]MalType{Symbol{"quasiquote"}, form},nil}, nil
case `~`: rdr.next();
form, e := read_form(rdr); if e != nil { return nil, e }
- return List{[]MalType{Symbol{"unquote"}, form}}, nil
+ return List{[]MalType{Symbol{"unquote"}, form},nil}, nil
case `~@`: rdr.next();
form, e := read_form(rdr); if e != nil { return nil, e }
- return List{[]MalType{Symbol{"splice-unquote"}, form}}, nil
+ return List{[]MalType{Symbol{"splice-unquote"}, form},nil}, nil
+ case `^`: rdr.next();
+ meta, e := read_form(rdr); if e != nil { return nil, e }
+ form, e := read_form(rdr); if e != nil { return nil, e }
+ return List{[]MalType{Symbol{"with-meta"}, form,meta},nil}, nil
+ case `@`: rdr.next();
+ form, e := read_form(rdr); if e != nil { return nil, e }
+ return List{[]MalType{Symbol{"deref"}, form},nil}, nil
// list
case ")": return nil, errors.New("unexpected ')'")