select.scm 1.6 KB

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