select.scm 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey
  3. (define (test)
  4. (let ((in (current-input-port))
  5. (out (current-output-port))
  6. (s1 (make-port-set))
  7. (s2 (make-port-set)))
  8. (let loop ((i 0))
  9. (cond ((char-ready? in)
  10. (got-char in out i)
  11. (loop 0))
  12. (else
  13. (clear-port-set! s1)
  14. (clear-port-set! s2)
  15. (add-to-port-set! s1 in)
  16. (case (find-ready-ports s1 s2 #f)
  17. ((0)
  18. (loop (+ i 1)))
  19. ((1)
  20. (cond ((port-set-member? s1 in)
  21. (got-char in out i)
  22. (loop 0))
  23. (else
  24. (write-string "not in port set" out)
  25. (newline out))))
  26. (else
  27. (write-string "funny port count " out))))))))
  28. (define (got-char in out i)
  29. (write-string "Got " out)
  30. (ps-read-char in
  31. (lambda (char)
  32. (write-number-no-newline (ascii->char char) out))
  33. (lambda ()
  34. (write-string "EOF!" out)))
  35. (write-string " after " out)
  36. (write-number i out))
  37. ; Printing integers
  38. ; Return 10**n such that 10**n <= x < 10**(n+1)
  39. (define (integer-mask x)
  40. (do ((x x (quotient x 10))
  41. (mask 1 (* mask 10)))
  42. ((< x 10) mask)))
  43. ; Write positive integer X out to PORT
  44. (define (write-number x port)
  45. (write-number-no-newline x port)
  46. (write-char '#\newline port))
  47. (define (write-number-no-newline x port)
  48. (let ((x (cond ((< x 0)
  49. (write-char '#\- port)
  50. (- 0 x))
  51. (else
  52. x))))
  53. (let loop ((x x) (mask (integer-mask x)))
  54. (let ((digit (quotient x mask)))
  55. (write-char (ascii->char (+ digit (char->ascii '#\0))) port)
  56. (if (> mask 1)
  57. (loop (remainder x mask) (quotient mask 10)))))))