|
178 | 178 | ;; starting and stoping positions for error highlighting.
|
179 | 179 | ;; If all three return #f, then there was no tree to search, or
|
180 | 180 | ;; the position did not immediately follow a close.
|
181 |
| - (define/public (match-backward pos) |
| 181 | + #;(define/public (match-backward pos) |
182 | 182 | (define (not-found)
|
183 | 183 | (send tree search! pos)
|
184 | 184 | (values (- pos (paren-length (send tree get-root-data))) pos #t))
|
|
225 | 225 | [else
|
226 | 226 | (values #f #f #f)]))]))
|
227 | 227 |
|
228 |
| - #;(define/public (match-backward pos) |
229 |
| - (send tree search! (if (> pos 0) (sub1 pos) pos)) |
| 228 | + (define/public (match-backward pos) |
230 | 229 | (cond
|
231 |
| - ((and (not (send tree is-empty?)) |
232 |
| - (is-close? (paren-type (send tree get-root-data))) |
233 |
| - (= (+ (paren-length (send tree get-root-data)) |
234 |
| - (send tree get-root-start-position)) |
235 |
| - pos)) |
236 |
| - (let ((end |
237 |
| - (let/ec ret |
238 |
| - (do-match-backward (node-left (send tree get-root)) |
239 |
| - 0 |
240 |
| - (list (paren-type (send tree get-root-data))) |
241 |
| - ret) |
242 |
| - #f))) |
243 |
| - (cond |
244 |
| - (end |
245 |
| - (values end pos #f)) |
246 |
| - (else |
247 |
| - (send tree search! pos) |
248 |
| - (values (- pos (paren-length (send tree get-root-data))) pos #t))))) |
249 |
| - (else |
250 |
| - (values #f #f #f)))) |
| 230 | + [(hash-ref back-cache pos #f) => (λ (res) (values res pos #f))] |
| 231 | + [else |
| 232 | + (send tree search! (if (> pos 0) (sub1 pos) pos)) |
| 233 | + (cond |
| 234 | + ((and (not (send tree is-empty?)) |
| 235 | + (is-close? (paren-type (send tree get-root-data))) |
| 236 | + (= (+ (paren-length (send tree get-root-data)) |
| 237 | + (send tree get-root-start-position)) |
| 238 | + pos)) |
| 239 | + (let ((end |
| 240 | + (let/ec ret |
| 241 | + (do-match-backward (node-left (send tree get-root)) |
| 242 | + 0 |
| 243 | + (list (paren-type (send tree get-root-data))) |
| 244 | + ret) |
| 245 | + #f))) |
| 246 | + (cond |
| 247 | + (end |
| 248 | + (hash-set! back-cache pos end) |
| 249 | + (values end pos #f)) |
| 250 | + (else |
| 251 | + (send tree search! pos) |
| 252 | + (values (- pos (paren-length (send tree get-root-data))) pos #t))))) |
| 253 | + (else |
| 254 | + (values #f #f #f)))])) |
251 | 255 |
|
252 | 256 | ;; is-open-pos?: natural-number -> (union #f symbol)
|
253 | 257 | ;; if the position starts an open, return the corresponding close,
|
|
0 commit comments