B. Pym
2024-09-13 22:59:51 UTC
(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(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.
spelled as
(defun read-to-char (c stream)
(loop for x = (read-char stream nil)
while x do (when (char= x c) (return t))))
(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))]))