Deutsch English Français Italiano |
<vc2g56$12ukb$1@dont-email.me> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" <Nobody447095@here-nor-there.org> Newsgroups: comp.lang.lisp,comp.lang.scheme Subject: Re: case and quoted keys - a misunderstanding Date: Fri, 13 Sep 2024 22:59:51 -0000 (UTC) Organization: A noiseless patient Spider Lines: 52 Message-ID: <vc2g56$12ukb$1@dont-email.me> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Injection-Date: Sat, 14 Sep 2024 00:59:51 +0200 (CEST) Injection-Info: dont-email.me; posting-host="ee687035ab0f3367b9efcf5ae7f07364"; logging-data="1145483"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/GfRJDu21mTFYu5p9RdW3S" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:ppZGK3ndHsIrmti1mS8eOFYQohM= Bytes: 2080 Frode Vatvedt Fjeld wrote: > > (defun read-to-char (c stream) > > (let ((x (read-char stream nil))) > > (cond ((null x) nil) > > ((char= x c) t) > > (t (read-to-char c stream))))) > > > > This isn't much worse looking then the obvious iterative solutions. > > ..only it has Scheme written all over it ;-) In Common Lisp this is > spelled as > > (defun read-to-char (c stream) > (loop for x = (read-char stream nil) > while x do (when (char= x c) (return t)))) It's shorter in Gauche Scheme: (use srfi-42) ;; first-ec (define (read-to-char c port) (first-ec #f (:port x port read-char) (if (char=? x c)) #t)) Testing. (call-with-input-string "foo-Frodo is foolish." (lambda (in) (read-to-char #\- in) (read-line in))) ===> "Frodo is foolish." Shorter yet: (use srfi-121) ; generators (define (read-to-char c port) (generator-find (is c) (cut read-char port))) Given: (define-syntax is (syntax-rules () [(is x) (lambda (y) (equal? y x))] [(is compare x) (lambda (y) (compare y x))] [(is key compare x) (lambda (y) (compare (key y) x))]))