On Apr 3, 2014, at 7:08 PM, Spencer Florence <[email protected]> wrote:

> Is there any way to perform `substring` without creating a new string? I'm 
> working with lots of very large and (for all intents and purposes) immutable 
> strings and would like to avoid the extra allocations and copy time.

Seems like it would be fairly easy to roll this yourself:

#lang racket

(require rackunit)

;; represent a lazy substring operation:
(struct lazysubstring (str start end))

;; force a lazy substring
(define (lss-force s)
  (substring (lazysubstring-str s)
             (lazysubstring-start s)
             (lazysubstring-end s)))

;; get the length of a lazy substring:
(define (lss-len s)
  (- (lazysubstring-end s) (lazysubstring-start s)))

;; create one:
(define source-text "othho tot stnh ontuh .nt")

(define lss1 (lazysubstring source-text 3 9))
(check-equal? (lss-len lss1) 6)

Obviously, you have to “roll your own” for any operation that you want to 
perform that retains the laziness.

John


____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to