I'm trying to write a function that reads forms from a file. The
caller may optionally specify a maximum number of forms to read; if
that variable is null, the function should read forms until eof. Is
there a way to do this with loop? The best I've been able to come up
with is really ugly:
(loop for n = 0 then (1+ n)
for form = (read s nil 'eof)
until (or (eql form 'eof)
(when max-forms ; max-forms is &optional
(>= n max-quotes)))
collecting (make-instance 'foo :src form))
This looks cleaner, but of course only works if max-quotes is a
number.
(loop repeat max-quotes
for form = (read s nil 'eof)
until (eql form 'eof)
collecting (make-instance 'foo :src form))
Ari.
--
Elections only count as free and trials as fair if you can lose money
betting on the outcome.
Ari Krupnik <···@lib.aero> writes:
> I'm trying to write a function that reads forms from a file. The
> caller may optionally specify a maximum number of forms to read; if
> that variable is null, the function should read forms until eof. Is
> there a way to do this with loop? The best I've been able to come up
> with is really ugly:
>
> (loop for n = 0 then (1+ n)
You can let loop do the increment for you.
> for form = (read s nil 'eof)
eof could be present in the file.
> until (or (eql form 'eof)
> (when max-forms ; max-forms is &optional
> (>= n max-quotes)))
> collecting (make-instance 'foo :src form))
(loop
:for n :from 1
:for form = (read s nil s)
:until (eq form s)
:collect (make-instance 'foo :src form)
:until (and count (<= count n)))
--
__Pascal Bourguignon__ http://www.informatimago.com/
In a World without Walls and Fences,
who needs Windows and Gates?
Pascal Bourguignon <···@informatimago.com> writes:
> Ari Krupnik <···@lib.aero> writes:
>
>> (loop for n = 0 then (1+ n)
> You can let loop do the increment for you.
I was not aware that to or downto was optional.
>> for form = (read s nil 'eof)
> eof could be present in the file.
Not in this file, but your idiom is clearly superior. Thank you. Also
I see that eq is more appropriate here. I'm still learning to pick the
right equality functions.
>> until (or (eql form 'eof)
>> (when max-forms ; max-forms is &optional
>> (>= n max-quotes)))
>> collecting (make-instance 'foo :src form))
>
> (loop
> :for n :from 1
> :for form = (read s nil s)
> :until (eq form s)
> :collect (make-instance 'foo :src form)
> :until (and count (<= count n)))
--
Elections only count as free and trials as fair if you can lose money
betting on the outcome.
On 2006-07-16 03:46:30 -0400, Pascal Bourguignon <···@informatimago.com> said:
> (loop :for n :from 1
> :for form = (read s nil s)
> :until (eq form s)
> :collect (make-instance 'foo :src form)
> :until (and count (<= count n)))
Or if you like loops that look more like lisp than loop:
(iter (for form in-stream s)
(for n upfrom 0)
(until (and count (<= count n)))
(collect (make-instance 'foo :src form))))
Novus