string.scm 1.3 KB

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