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))]))