[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.lisp

Re: lisp idiom for processing each line in a file?

William James

3/30/2015 5:41:00 AM

Rob Warnock wrote:

> | I'm trying to process each line in a file, and am wondering if there is
> | a simpler or more idiomatic way of doing it than the following:
> |
> | ;;; Simplified version of my real process-line function
> | (defun process-line (line)
> | (format t "~A~%" line))
> |
> | ;;; Process stream, calling per-line-fn on each line of the stream
> | (defun process (per-line-fn stream)
> | (let ((line (read-line stream nil)))
> | (if (not (null line))
> | (progn (funcall per-line-fn line)
> | (process per-line-fn stream)))))
> +---------------
>
> This can blow up if your file is large and your CL implementation
> doesn't happen to perform tail-call optimization on the tail call
> to PROCESS. Note: Common Lisp is not Scheme.


Yes, CL (COBOL-Like) is so clunky that it can't even handle
recursion properly. It requires a Lispy language like Scheme
to do that. CL is used only when a COBOL-Like language will
suffice.


>
> +---------------
> | And I kick off the process like so:
> |
> | CL-USER> (with-open-file (stream "../../words/test.txt")
> | (process #'process-line stream))
> +---------------
>
> The standard CL idiom omits the intermediate PROCESS function
> entirely, and does the whole thing in the WITH-OPEN-FILE call:
>
> (with-open-file (stream "../../words/test.txt")
> (loop for line = (read-line stream nil nil)
> while line do
> (per-line-fn line)))
>
> +---------------
> | Is there a simpler way of doing what I'm trying to do here?
> +---------------
>
> See above.
>
> +---------------
> | I've seen some loop-based solutions, but am staying away from
> | loop for the moment.
> +---------------
>
> Why?!? It's the most natural way to code this particular task, IMHO.

Gauche Scheme:

(use srfi-42) ; do-ec

(call-with-input-file "stuff.txt"
(lambda (port)
(do-ec (: line port read-line) (per-line-fn line))))


Also works in Racket, with this change:

(require srfi/42) ; do-ec



It's disgusting that the little peacock pretends not to understand
why the original poster is reluctant to use the tumor called LOOP.
He indignantly demands an explanation for such a heretical attitude.
(Burning at the stake may be called for.)



Paul Graham:

I consider Loop one of the worst flaws in CL, and an example
to be borne in mind by both macro writers and language designers.


-----


Dan Weinreb, one of the designers of Common Lisp:

.... the problem with LOOP was that it turned out to be hard to
predict what it would do, when you started using a lot of
different facets of LOOP all together. This is a serious problem
since the whole idea of LOOP was to let you use many facets
together; if you're not doing that, LOOP is overkill.


-----


Barry Margolin, 05 Apr 2001
(http://groups.google.com/group/comp.lang.lisp/msg/8a48ce...)

>(My second rule of thumb concerning LOOP would be the negative of
>Barry Margolin's: The more complex the looping, the more you need/want
>to use LOOP.)

My recommendation is based on seeing many question in the past of the form
"What happens if you use both XXX and YYY in the same LOOP?" The
unfortunate fact is that when we were writing the standard we didn't have
time to nail down all the possible interactions between different LOOP
features, so many of these are not well specified. And even if we did get
it right in the standard, it's likely to be difficult to find them and I
wouldn't trust that all implementors got it right (many of those questions
were probably from implementors, trying to figure out what they were
supposed to do). And even if they all got it right, someone reading your
code may not be able to figure it out.

So, with all those potential problems, my feeling is that if you have to
ask, it's probably better to use something other than LOOP.

-----


From: John Foderaro <jkf@unspamx.franz.com>
Newsgroups: comp.lang.lisp
Subject: Re: the "loop" macro
Date: Sun, 26 Aug 2001 10:51:26 -0700

I'm not trying to join a debate on loop. I just wanted to present
the other side of [the issue so that] the intelligent people can
then weigh the arguments on both sides.

I'm not suggesting that loop can be fixed either by adding
parenthesis or coming up with ways of indenting it to make it
understandable. It's a lost cause.
1 Answer

Wakalukong

11/26/2013 11:38:00 PM

0

I suppose there's still a faint hint of the North and South in America, but the reasons why it's not more pronounced are because people move about and set up home freely in the US and get their news from the same national media (the US is after all a single political entity).

I suppose you want to say that there's no North South divide in the US because Americans pay homage to political correctness.

Wakalukong