[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Collecting data into a string.



Hi,

  I have a question regarding a piece of code which I've already
  posted to this list before.  I have a loop which collects data that
  needs to be set into a MrEd text-field% widget.  In order to set the
  box to contain this data, I have to call the set-value method which
  expects a single string.  My approach to solving this would be to
  simply append all my data as I iterate through the loop into one
  string and then pass that string to the procedure; I realize that
  this may not be the Scheme/Functional way of doing this--it seems
  rather procedural because it (as far as I understand) involves
  declaring a variable before using it, so if you can think of a
  cleaner way please let me know, but I tried implementing this as
  described (there are other minor questions in the comments of the code):

;;
;; This is my version of a string concatenation function.
;; I was *extremely* surprised to find that the MzScheme manual had
;; no function to concatenate strings.  If I overlooked it or if you
;; can think of a better way to write this one, let me know. 
;; 
(define (string-concat str1 str2)
  (let ((s-list1 (string->list str1))
        (s-list2 (string->list str2)))
    (list->string (append s-list1 s-list2))))

(define (grab-html b e)
  (let*-values
   (((url) (send urlbox get-value))
    ((sin sout) (tcp-connect url 80))
    ((html-start) (regexp "Content-Type:.*"))
    ;;
    ;; I thought I need to declare `html-src' as a string here so
    ;; I can later use it to store all the values from the second
    ;; do loop, and this was my way of doing it. 
    ;;
    ((html-src) (string)))
   (fprintf sout "GET http://www.~a/ HTTP/1.0~n~n" url)

   ;; read until "Content-Type..." is met
   (do ((line (read-line sin 'any) (read-line sin 'any)))
       ((regexp-match html-start line)))
   
   (read-line sin 'any)
   (read-line sin 'any)  ;; once more for the blank line

   ;; print the actual source
   (do ((line (read-line sin 'any) (read-line sin 'any)))
       ((eof-object? line))
     ;;
     ;; Why the hell isn't there documentation for string-set! ?
     ;; 
     (string-set! html-src (string-concat html-src line)))

   (printf "~a~n" html-src)))

Thanks a lot,
-- 
Jordan Katz <katz@underlevel.net>  |  Mind the gap