File tree Expand file tree Collapse file tree 3 files changed +27
-1
lines changed Expand file tree Collapse file tree 3 files changed +27
-1
lines changed Original file line number Diff line number Diff line change 119
119
\' (node/var-node (parse-printables reader :var 1 true ))
120
120
\= (node/eval-node (parse-printables reader :eval 1 true ))
121
121
\_ (node/uneval-node (parse-printables reader :uneval 1 true ))
122
+ \? (do
123
+ ; ; we need to examine the next character, so consume one (known \?)
124
+ (reader/next reader)
125
+ ; ; we will always have a reader-macro-node as the result
126
+ (node/reader-macro-node
127
+ (let [read1 (fn [] (parse-printables reader :reader-macro 1 ))]
128
+ (cons (case (reader/peek reader)
129
+ ; ; the easy case, just emit a token
130
+ \( (node/token-node (symbol " ?" ))
131
+
132
+ ; ; the harder case, match \@, consume it and emit the token
133
+ \@ (do (reader/next reader)
134
+ (node/token-node (symbol " ?@" )))
135
+
136
+ ; ; otherwise no idea what we're reading but its \? prefixed
137
+ (do (reader/unread reader \?)
138
+ (first (read1 ))))
139
+ (read1 )))))
122
140
(node/reader-macro-node (parse-printables reader :reader-macro 2 ))))
123
141
124
142
(defmethod parse-next* :deref
Original file line number Diff line number Diff line change 109
109
[reader]
110
110
(r/read-char reader))
111
111
112
+ (defn unread
113
+ " Unreads a char. Puts the char back on the reader."
114
+ [reader ch]
115
+ (r/unread reader ch))
116
+
112
117
(defn peek
113
118
" Peek next char."
114
119
[reader]
Original file line number Diff line number Diff line change 86
86
" #=sym" :eval [] '(eval 'sym)
87
87
" #= sym" :eval [:whitespace ] '(eval 'sym)
88
88
" #'sym" :var [] '(var sym)
89
- " #'\n sym" :var [:newline ]) '(var sym)
89
+ " #'\n sym" :var [:newline ])
90
90
91
91
(fact " about eval."
92
92
(let [n (p/parse-string " #=(+ 1 2)" )]
191
191
" #=(+ 1 2)" :eval [:list ]
192
192
" #macro 1" :reader-macro [:token :whitespace :token ]
193
193
" #macro (* 2 3)" :reader-macro [:token :whitespace :list ]
194
+ " #?(:clj bar)" :reader-macro [:token :list ]
195
+ " #?@(:clj bar)" :reader-macro [:token :list ]
196
+ " #?foo baz" :reader-macro [:token :whitespace :token ]
194
197
" #_abc" :uneval [:token ]
195
198
" #_(+ 1 2)" :uneval [:list ]
196
199
" #(+ % 1)" :fn [:token :whitespace
You can’t perform that action at this time.
0 commit comments