string.scm 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey
  3. (define (xwrite-string string out)
  4. (let ((len (string-length string)))
  5. (do ((i 0 (+ i 1)))
  6. ((>= i len))
  7. (write-char (string-ref string (- len (+ i 1))) out))
  8. (newline out)))
  9. (define (write-string string out)
  10. (let ((len (string-length string)))
  11. (do ((i 0 (+ i 1)))
  12. ((>= i len))
  13. (write-char (string-ref string i) out))
  14. (newline out)))
  15. (define a-string "Hello sailor...")
  16. (define (test)
  17. (let* ((in (current-input-port))
  18. (out (current-output-port))
  19. (len (ashr (read-number in) 2))
  20. (string (make-string len)))
  21. (let loop ((i 0))
  22. (if (< i len)
  23. (ps-read-char in
  24. (lambda (ch)
  25. (string-set! string i ch)
  26. (loop (+ i 1)))
  27. (lambda ()
  28. (unassigned)))))
  29. (write-string string out)
  30. (xwrite-string string out)
  31. (deallocate string)
  32. (write-string a-string out)
  33. (xwrite-string a-string out)))
  34. (define (read-number port)
  35. (let loop ((r 0))
  36. (ps-read-char port
  37. (lambda (ch)
  38. (cond ((digit? ch)
  39. (loop (+ (- (char->ascii ch) (char->ascii #\0))
  40. (* r 10))))
  41. (else r)))
  42. (lambda () 0))))
  43. (define (digit? ch)
  44. (let ((ch (char->ascii ch)))
  45. (and (>= ch (char->ascii #\0))
  46. (<= ch (char->ascii #\9)))))