Hi, Gregg,

(popping my head up from the project from the black lagoon for a mo')

Gregg Irwin wrote:
> 
> If I'm processing a file, by lines, thus:
> 
>         foreach line read/lines/with file rec-sep [
> 
> It appears that foreach doesn't call read on each pass, but I thought
> I'd ask to see if anyone knows, for certain. I know you can modify
> the block that foreach uses and it will see the changes, but I wasn't
> sure what magic occurs in this scenario.
> 

There's no interaction at all between FOREACH and READ.  The above code
is exactly equivalent to

    tempfoo: read/lines/with file recsep
    foreach line tempfoo [

(except that this latter case burns up a word name).  Another way to
think of it is

    foreach line (read/lines/with file rec-sep) [

to emphasize that READ/LINES just creates a block of strings.  Then (on
completion) that block is used as the second arg to FOREACH.

>
> The real question, I suppose, is: Should I cache the return value
> from 'read before using it with foreach, or is that unnecessary?
> 

Totally unnecesary (and actually wastes a few nanoseconds ;-) unless
you want to do something else with the saved block after FOREACH gets
through doing its thing (in which case you already know that the
answer is "Yes").

>
> As a side question, does anyone on the list use AWK or think that
> something like it (i.e. an auto-driven rule/action file processor)
> would be useful?
> 

It would be marginally useful to me as a keystroke-saver, but a
brute-force equivalent in REBOL would (IMHO) only result in
replacing something vaguely like

    awk-like-func: func [one-line [string!] ...] [
        if parse/all/case one-line [ ;...first parse rule...
        ][
            ;...corresponding action...
            exit
        ]
        if parse/all/case one-line [ ;...next parse rule...
        ][
            ;...corresponding action...
            exit
        ]
        ;...
        if parse/all/case one-line [ ;...last parse rule...
        ][
            ;...corresponding action...
            exit
        ]
        ;...error or inaction...
    ]

    foreach myline read myfile [awk-like-func myline]

with

    do %awklib.r

    awk-plan: [
        [ ;...local words for rules/actions]
        [ ;...first parse rule...]  [ ;...corresponding action...]
        [ ;...next parse rule... ]  [ ;...corresponding action...]
        ;...
        [ ;...last parse rule... ]  [ ;...corresponding action...]
    ]

    awk-main myfile awk-plan

which would be handy but not a huge win.  I guess it just depends on
whether most of one's parsing/action tasks are line oriented or not.
However, I don't think AWK-PLAN would be too challenging to write.

-jn-

-- 
; sub REBOL {}; sub head ($) {@_[0]}
REBOL []
# despam: func [e] [replace replace/all e ":" "." "#" "@"]
; sub despam {my ($e) = @_; $e =~ tr/:#/.@/; return "\n$e"}
print head reverse despam "moc:xedef#yleen:leoj" ;
-- 
To unsubscribe from this list, please send an email to
[EMAIL PROTECTED] with "unsubscribe" in the 
subject, without the quotes.

Reply via email to