<div>; lnic -- last non-white is colon</div><div><br></div><div>(define (lnic? s) ; explode to list</div><div>  (let loop ((cs (reverse (string-&gt;list s))))</div><div>    (cond ((null? cs) #f)</div><div>          ((char-whitespace? (car cs)) (loop (cdr cs)))</div>
<div>          (else (char=? (car cs) #\:)))))</div><div><br></div><div>(define (lnic? s) ; index into string</div><div>  (let loop ((i (- (string-length s) 1)))</div><div>    (cond ((negative? i) #f)</div><div>          ((char-whitespace? (string-ref s i)) (loop (- i 1)))</div>
<div>          (else (char=? (string-ref s i) #\:)))))</div><div><br></div><div>(define (lnic? s) ; saved current character</div><div>  (let loop ((i (string-length s)))</div><div>    (if (zero? i)</div><div>        #f</div>
<div>        (let ((c (string-ref s (- i 1))))</div><div>          (if (char-whitespace? c)</div><div>              (loop (- i 1))</div><div>              (char=? c #\:))))))</div><div><br></div><div>(define (trim s) ; remove whitespace from end of string</div>
<div>  (let loop ((i (- (string-length s) 1)))</div><div>    (cond ((negative? i) &quot;&quot;)</div><div>          ((char-whitespace? (string-ref s i)) (loop (- i 1)))</div><div>          (else (substring s 0 (+ i 1))))))</div>
<div><br></div><div>(define (lnic? s) ; trim, then check last character</div><div>  (let* ((s (trim s)) (len (string-length s)))</div><div>    (and (positive? len) (char=? (string-ref s (- len 1)) #\:))))</div><div><br></div>
<div>(define (lnic-test) ; returns (#f #t #t #t #f)</div><div>  (map lnic? &#39;(&quot;abcde&quot; &quot;abcd:&quot; &quot;abcd:   &quot; &quot;:   &quot; &quot;   &quot;)))</div><div><br></div><div>Pick the one you like the best.  The first version explodes the string to a list of characters, as your post suggested, but apparently you had some trouble making that work.  The second version repeatedly indexes into the string, starting at the end, until it finds a non-white character, then checks if that is a colon.  The third version shows a different way of computing the index, and stores the current character in a local variable so the lookup is only performed once, not twice.  The fourth version checks the last character of the trimmed string.  I would probably write the second version and skip the regular expression.</div>
<div><br></div><div>-- Phil (<a href="http://programmingpraxis.com">http://programmingpraxis.com</a>)</div><br><div class="gmail_quote">On Thu, Mar 31, 2011 at 6:38 PM, Charles Hixson <span dir="ltr">&lt;<a href="mailto:charleshixsn@earthlink.net">charleshixsn@earthlink.net</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Hi,<br>
I&#39;m trying to determine whether the last non-whitespace character of a string is a colon, and I haven&#39;t been able to figure out the best way of doing this.  In python I&#39;d just trim the string and look at the character before the end, but while Racket seems to have a string-length function, it doesn&#39;t seem to have anything analogous to trim.  So how should it be done?<br>

<br>
The best I&#39;ve come up with is to explode the string into a list of characters, and handle it that way, but that&#39;s clearly quite wasteful of both processing and RAM.  (Of course, part of it is that the best way I&#39;ve figured to proceed from there is to then copy that list to another list checking at each step of the way to tell if I was done, and then if it was successful to join the resultant list back into a string.)<br>

_________________________________________________<br>
 For list-related administrative tasks:<br>
 <a href="http://lists.racket-lang.org/listinfo/users" target="_blank">http://lists.racket-lang.org/listinfo/users</a><br>
</blockquote></div><br>