Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!uunet!zephyr.ens.tek.com!tekcrl!tekchips!kend From: kend@tekchips.LABS.TEK.COM (Ken Dickey) Newsgroups: comp.lang.scheme Subject: Re: Bogus bug in MIT-Scheme Message-ID: <5835@tekcrl.LABS.TEK.COM> Date: 23 Mar 90 22:55:51 GMT References: <9003221201.AA11816@zurich.ai.mit.edu> <9003231556.aa09018@mintaka.lcs.mit.edu> Sender: news@tekcrl.LABS.TEK.COM Reply-To: kend@mrloog.WR.TEK.COM (Ken Dickey) Organization: Tektronix, Inc., Beaventon, OR. Lines: 51 Here are a couple of somewhat more efficient versions of a portable string->cannonical-symbol. The only difference is the use of DO vs named LET {some people particularly dislike one or the other}. [Just for fun... or should we discuss style and esthetics for a few weeks? 8^] -Ken Dickey ;;================== (define STRING->CANNONICAL-SYMBOL (let ( (case-squasher (if (eq? 'a (string->symbol "A")) char-upcase char-downcase)) ) (lambda ( ) (let* ( (str-len (string-length )) (decaseified-string (make-string str-len)) ) (let loop ( (index (- str-len 1) ) ) (string-set! decaseified-string index (case-squasher (string-ref index))) (if (> index 0) (loop (- index 1)) (string->symbol decaseified-string)) ) ) ) ) ) ;;================== (define STRING->CANNONICAL-SYMBOL (let ( (case-squasher (if (eq? 'a (string->symbol "A")) char-upcase char-downcase)) ) (lambda ( ) (let* ( (str-len (string-length )) (decaseified-string (make-string str-len)) ) (do ( (index (- str-len 1) (- index 1)) ) ( (< index 0) (string->symbol decaseified-string) ) (string-set! decaseified-string index (case-squasher (string-ref index))) ) ) ) ) )