3 if(!exists("..types..")) source("types.r")
5 new
.Reader
<- function(tokens
) {
6 e
<- structure(new
.env(), class
="Reader")
12 Reader
.peek
<- function(rdr
) {
13 if (rdr$position
> length(rdr$tokens
)) return(NULL)
14 rdr$tokens
[[rdr$position
]]
17 Reader
.next <- function(rdr
) {
18 if (rdr$position
> length(rdr$tokens
)) return(NULL)
19 rdr$position
<- rdr$position
+ 1
20 rdr$tokens
[[rdr$position
-1]]
23 tokenize
<- function(str
) {
24 re
<- "[\\s,]*(~@|[\\[\\]\\{\\}\\(\\)'`~^@]|\"(?:\\\\.|[^\\\\\"])*\"|;.*|[^\\s\\[\\]\\{\\}\\('\"`,;\\)]*)"
25 m
<- lapply(regmatches(str
, gregexpr(re
, str
, perl
=TRUE)),
26 function(e
) sub("^[\\s,]+", "", e
, perl
=TRUE))
30 if (v
== "" || substr(v
,1,1) == ";") next
37 re_match
<- function(re
, str
) { length(grep(re
, c(str
))) > 0 }
39 read_atom
<- function(rdr
) {
40 token
<- Reader
.next(rdr
)
41 if (re_match("^-?[0-9][0-9.]*$", token
)) {
43 } else if (substr(token
,1,1) == "\"") {
46 substr(token
, 2, nchar(token
)-1)))
47 } else if (token
== "nil") {
49 } else if (token
== "true") {
51 } else if (token
== "false") {
58 read_seq
<- function(rdr
, start
="(", end
=")") {
60 token
<- Reader
.next(rdr
)
62 throw(concat("expected '", start
, "'"))
65 token
<- Reader
.peek(rdr
)
67 throw(concat("expected '", end
, "', got EOF"))
69 if (token
== end
) break
70 lst
[[length(lst
)+1]] <- read_form(rdr
)
76 read_form
<- function(rdr
) {
77 token
<- Reader
.peek(rdr
)
79 . <- Reader
.next(rdr
);
80 new
.list(new
.symbol("quote"), read_form(rdr
))
81 } else if (token
== "`") {
82 . <- Reader
.next(rdr
);
83 new
.list(new
.symbol("quasiquote"), read_form(rdr
))
84 } else if (token
== "~") {
85 . <- Reader
.next(rdr
);
86 new
.list(new
.symbol("unquote"), read_form(rdr
))
87 } else if (token
== "~@") {
88 . <- Reader
.next(rdr
);
89 new
.list(new
.symbol("splice-unquote"), read_form(rdr
))
90 } else if (token
== ")") {
91 throw("unexpected ')'")
92 } else if (token
== "(") {
93 new
.listl(read_seq(rdr
))
94 } else if (token
== "]") {
95 throw("unexpected ']'")
96 } else if (token
== "[") {
97 new
.vectorl(read_seq(rdr
, "[", "]"))
103 read_str
<- function(str
) {
104 tokens
<- tokenize(str
)
105 if (length(tokens
) == 0) return(nil
)
106 return(read_form(new
.Reader(tokens
)))
110 #print(tokenize("123"))
112 #print(tokenize(" ( 123 456 abc \"def\" ) "))
114 #rdr <- new.reader(tokenize(" ( 123 456 abc \"def\" ) "))