[gambit-list] I/O Question

Francisco francisco.listas at gmail.com
Thu May 1 17:50:02 EDT 2008


I need to implement a function to read from a port until a certain char 
is reached, I want it to stop if there is no such char is retrieved from 
the string. The original intent is to retrieve data from a network 
connection, but I am testing it with a string for now, why does it fail 
with a:
"*** ERROR IN ##thread-deadlock-action! -- Deadlock detected"?
Please find the code below,
Regards,
Francisco


;; Reads from connection until stop-char appears
(define (read-string-until-char connection stop-char)
  (letrec ((str "")
       (reader (lambda ()
             (let ((c (read-char connection)))
               (cond
            ((or
              (char=? c stop-char)
              (eof-object? c))
             str)
            (else
             (set! str (string-append-char str c))
             (reader)))))))
    (reader)
    str))

;; Reads from connection until stop-char appears
(define (read-string-until-char connection stop-char)
  (letrec ((str "")
       (reader (lambda ()
             (let ((c (read-char connection)))
               (cond
            ((or
              (char=? c stop-char)
              ;it never stops here!!
              (eof-object? c))
             str)
            (else
             (set! str (string-append-char str c))
             (reader)))))))
    (reader)
    str))

;; Appends a char to a string
(define (string-append-char str c)
  (let*
      ((expanded-str (string-append str " "))
       (position (string-length str)))
    (string-set! expanded-str position c)
    expanded-str))

(define (with-string-stop str c)
  (let
      ((port (open-string str)))
    (read-string-until-char port c)))


(display (with-string-stop "123456" #\5))
(display (with-string-stop "123456" #\7))




More information about the Gambit-list mailing list