/src/str/str.scm

http://github.com/dharmatech/abstracting · Scheme · 62 lines · 38 code · 21 blank · 3 comment · 0 complexity · bf724ee1590ad90afd60aeba69a27799 MD5 · raw file

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. (define (str-obj s)
  3. (let ((len (string-length s))
  4. (ref (lambda (i) (string-ref s i)))
  5. (set (lambda (i elt) (string-set! s i elt))))
  6. (let ((first-index 0)
  7. (last-index (- len 1)))
  8. (let ((before-beginning? (lambda (i) (< i first-index)))
  9. (after-end? (lambda (i) (> i last-index))))
  10. (let ((index-start-at
  11. (lambda (pred i past? step)
  12. (let loop ((i i))
  13. (cond
  14. ((past? i) #f)
  15. ((pred (ref i)) i)
  16. (else (loop (step i 1))))))))
  17. (let ((index-forward-start-at
  18. (lambda (pred i)
  19. (index-start-at pred i after-end? +)))
  20. (index-backward-start-at
  21. (lambda (pred i)
  22. (index-start-at pred i before-beginning? -))))
  23. (let ((index-forward
  24. (lambda (pred)
  25. (index-forward-start-at pred first-index)))
  26. (index-backward
  27. (lambda (pred)
  28. (index-backward-start-at pred last-index))))
  29. (let ((message-handler
  30. (lambda (msg)
  31. (case msg
  32. ((len) len)
  33. ((ref) ref)
  34. ((set) set)
  35. ((index-forward) index-forward)
  36. ((index-backward) index-backward)
  37. ;;
  38. ((raw) s)
  39. ))))
  40. (vector 'str s message-handler)))))))))
  41. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;