Oops: that final else was wrong. If all we encounter in the string is
whitespace, the result is the empty string, not the input string, so:
;; ===
(require racket/unsafe/ops)
(define (string-trim s)
(define len (string-length s))
(let loop ([i 0])
(cond [(unsafe-fx< i len)
(cond [(char-whitespace? (unsafe-string-ref s i))
(loop (unsafe-fx+ i 1))]
[else
(let inner ([j (unsafe-fx- len 1)])
(cond [(char-whitespace? (unsafe-string-ref s j))
(inner (unsafe-fx- j 1))]
[else
(substring s i (unsafe-fx+ j 1))]))])]
[else
""])))
;; ===
On Sun, Jan 17, 2016 at 1:24 AM, Jon Zeppieri <[email protected]> wrote:
>
>
> On Sat, Jan 16, 2016 at 11:29 PM, Brian Adkins <[email protected]>
> wrote:
>
>>
>> I'm happy to run experiments and report timings though.
>>
>>
> Since the profile suggests that string-trim is the biggest culprit
> (followed by fprintf), try using this specialized version of string-trim
> locally:
>
> ;; ===
> (require racket/unsafe/ops)
>
> (define (string-trim s)
> (define len (string-length s))
>
> (let loop ([i 0])
> (cond [(unsafe-fx< i len)
> (cond [(char-whitespace? (unsafe-string-ref s i))
> (loop (unsafe-fx+ i 1))]
> [else
> (let inner ([j (unsafe-fx- len 1)])
> (cond [(char-whitespace? (unsafe-string-ref s j))
> (inner (unsafe-fx- j 1))]
> [else
> (substring s i (unsafe-fx+ j 1))]))])]
> [else
> s])))
> ;; ===
>
> Instead of fprintf-ing the tabbed values, you might try (displayln
> (string-join fields "\t")). Of course, that requires building a list of
> strings, which has its own cost.
>
--
You received this message because you are subscribed to the Google Groups
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.