use tail recursion, not because of speed, but because breaking code would always have bad context dumps

svn: r17427

original commit: 9660490922a31892ae0ff132ae1c6d172154768d
This commit is contained in:
Eli Barzilay 2009-12-29 15:56:05 +00:00
parent 6e02663d2d
commit 40cf224166

View File

@ -173,19 +173,16 @@
(define (get-rest-of-multi-line-response communicator) (define (get-rest-of-multi-line-response communicator)
(let ([receiver (communicator-receiver communicator)]) (let ([receiver (communicator-receiver communicator)])
(let loop () (let loop ([r '()])
(let ([l (get-one-line-from-server receiver)]) (let ([l (get-one-line-from-server receiver)])
(cond (cond
[(eof-object? l) [(eof-object? l)
((signal-error make-premature-close ((signal-error make-premature-close
"port prematurely closed during multi-line response") "port prematurely closed during multi-line response")
communicator)] communicator)]
[(string=? l ".") [(string=? l ".") (reverse r)]
'()] [(string=? l "..") (loop (cons "." r))]
[(string=? l "..") [else (loop (cons l r))])))))
(cons "." (loop))]
[else
(cons l (loop))])))))
;; get-multi-line-response : ;; get-multi-line-response :
;; communicator -> number x string x list (string) ;; communicator -> number x string x list (string)
@ -307,12 +304,7 @@
;; list (string) x list (desired) -> list (string) ;; list (string) x list (desired) -> list (string)
(define (extract-desired-headers headers desireds) (define (extract-desired-headers headers desireds)
(let loop ([headers headers]) (filter (lambda (header)
(if (null? headers) null (ormap (lambda (matcher) (regexp-match matcher header))
(let ([first (car headers)] desireds))
[rest (cdr headers)]) headers))
(if (ormap (lambda (matcher)
(regexp-match matcher first))
desireds)
(cons first (loop rest))
(loop rest))))))