Sujet : Re: [newbie] I need a function for read user input.
De : Nobody447095 (at) *nospam* here-nor-there.org (B. Pym)
Groupes : comp.lang.lisp comp.lang.schemeDate : 07. Jul 2025, 22:47:41
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <104hf9r$34a2a$1@dont-email.me>
References : 1 2
User-Agent : XanaNews/1.18.1.6
B. Pym wrote:
B. Pym wrote:
Gareth McCaughan wrote:
(loop for word = (read input nil) while word collect word)
which even the strictest LOOP-hater would have to agree
is clearer.
It's shorter in Gauche Scheme:
(use gauche.generator)
(generator->list (cut read input))
Another way:
(use srfi-42) ; list-ec
(list-ec (:port word input) word)
Using the old-fashioned and primitive "do":
(do ((r () (cons x r))
(x 0 (read)))
((eof-object? x) (cdr (reverse r))))
Using a slightly enhanced do:
(call-with-input-file "data.bak"
(lambda(input)
(do. ((word (read input) <>)
(r () (cons word r)))
((? word) @ r))))
It's not too much longer than the LOOP:
(loop for word = (read input nil) while word collect word)
(do. ((word (read input) <>) (r () (cons word r))) ((? word) @ r))
Explanation:
(call-with-input-file "data.bak"
(lambda(input)
(do. ((word (read input) <>)
The "<>" means repeat the preceding expression.
(r () (cons word r)))
((? word) @ r))))
The "?" means test word to see if it is an empty list
or the eof-object.
If the value being returned is preceded by "@", then
it is reversed.
Another example:
(do. ((r () (cons (pop! xs) r))
(xs '(a b c)))
((? xs) @ r))
===>
(a b c)