Hi Richard, I'm not able to come to the same conclusions. Specifically, the previous code examples starting with 'for lines()' always have to have parentheses following 'lines' (as in 'lines() {...}'), otherwise Perl_6 balks (examples 6 and 7 previously posted). This is whether 'information is being passed' or not (i.e. empty parentheses are required):
#example 6: mbook:~ homedir$ perl6 -e ' for lines() { say .split(":")[0, 2, 1, 5].join("\t") };' six_fruits1.txt apple carrot banana favabean apricot cabbage basil fennel acai celery beets figs #example 6 no-parens: mbook:~ homedir$ perl6 -e ' for lines { say .split(":")[0, 2, 1, 5].join("\t") };' six_fruits1.txt ===SORRY!=== Function 'lines' needs parens to avoid gobbling block at -e:1 ------> say .split(":")[0, 2, 1, 5].join("\t") }; Missing block (apparently claimed by 'lines') at -e:1 ------> say .split(":")[0, 2, 1, 5].join("\t") }; #example 7: mbook:~ homedir$ perl6 -e 'for lines() {.split(":")[0, 2, 1, 5].join("\t").say};' six_fruits1.txt apple carrot banana favabean apricot cabbage basil fennel acai celery beets figs #example 7 no-parens: mbook:~ homedir$ perl6 -e 'for lines {.split(":")[0, 2, 1, 5].join("\t").say};' six_fruits1.txt ===SORRY!=== Function 'lines' needs parens to avoid gobbling block at -e:1 ------> {.split(":")[0, 2, 1, 5].join("\t").say}; Missing block (apparently claimed by 'lines') at -e:1 ------> {.split(":")[0, 2, 1, 5].join("\t").say}; mbook:~ homedir$ perl6 --version This is Rakudo version 2019.07.1 built on MoarVM version 2019.07.1 implementing Perl 6.d. mbook:~ homedir$ Other Perl_6 users have replied with a general discussion of differences between using lines() as a method, or in a subroutine. I still have to review some of those comments. However, as I'm using the latest Perl_6 version (2019.07.1), I'm fairly confident in the results above (and below). Also, the examples below show that 'for lines[0..2] {...}' works, despite the previous error message insisting on parentheses ("Function 'lines' needs parens to avoid gobbling block at -e:1"). Taken together, the results above and below seem to indicate to me that the use of a bare 'lines' sub is disallowed, at least in a 'for' loop. --Best Regards, Bill. #example 10: mbook:~ homedir$ perl6 -e 'for lines { say .split(":")[0, 2, 1, 5].join("\t") };' six_fruits1.txt ===SORRY!=== Function 'lines' needs parens to avoid gobbling block at -e:1 ------> say .split(":")[0, 2, 1, 5].join("\t") }; Missing block (apparently claimed by 'lines') at -e:1 ------> say .split(":")[0, 2, 1, 5].join("\t") }; #example 11: mbook:~ homedir$ perl6 -e 'for lines() { say .split(":")[0, 2, 1, 5].join("\t") };' six_fruits1.txt apple carrot banana favabean apricot cabbage basil fennel acai celery beets figs #example 12: mbook:~ homedir$ perl6 -e 'for lines[0..2] { say .split(":")[0, 2, 1, 5].join("\t") };' six_fruits1.txt apple carrot banana favabean apricot cabbage basil fennel acai celery beets figs On Fri, Aug 2, 2019 at 1:20 AM Richard Hainsworth <rnhainswo...@gmail.com> wrote: > > Not quite sure what sort of "rule" you want. > > You used () and [] which do different things and the results were exactly > what I would expect. They are covered in the documentation. Basically, () > without a space, eg xxxx() not xxxx (), is used to pass information to the > sub or method xxxx. > If no information is being passed, then no need to use (). The way xxxx > responds to no data provided depends on the way xxxx is written. The > programmer could provide default values for the arguments it expects. Perl6 > also makes the value of the default variable, eg $_, to xxxx. > If you put a space between xxxx (), then () is interpreted as an empty list > and provide to xxxx as a single piece of information. > [] Are used to dereference a list (sequence or array, they are all slightly > different). > > I'll comment more below. Sometimes I think through the process using slightly > different and less exact words. My comments are illustrative. > > On Fri, 2 Aug 2019, 04:50 William Michels, <w...@caa.columbia.edu> wrote: >> >> Hi Richard, I'm trying to figure out when the parentheses in 'lines()' >> can be dropped, and 'lines' used instead. Any pointers? I have about >> nine or so working examples below, but formulating a clear >> rule-of-thumb is proving elusive. Any help appreciated, --Best, Bill. >> >> # test file: six_fruits1.txt >> mbook:~ homedir$ cat six_fruits1.txt >> apple:banana:carrot:dragonfruit:eggplant:favabean >> apricot:basil:cabbage:dill:escarole:fennel >> acai:beets:celery:daikon:endive:figs >> >> mbook:~ homedir$ perl6 -e '.say for lines()' six_fruits1.txt >> apple:banana:carrot:dragonfruit:eggplant:favabean >> apricot:basil:cabbage:dill:escarole:fennel >> acai:beets:celery:daikon:endive:figs > > Here 'lines ()' is the same as 'lines'. > The program in the string after -e is provided with the data inside the file. >> >> >> mbook:~ homedir$ perl6 -e '.say for lines' six_fruits1.txt >> apple:banana:carrot:dragonfruit:eggplant:favabean >> apricot:basil:cabbage:dill:escarole:fennel >> acai:beets:celery:daikon:endive:figs > > The top two are equivalent >> >> >> mbook:~ homedir$ perl6 -e '.say for lines("a\nb\n")' six_fruits1.txt >> a >> b > > Here you provided data to 'lines' which it was able to interpret as a set of > lines. So it printed them. The data in six_fruits is ignored because you > provided the data explicitly. >> >> >> mbook:~ homedir$ perl6 -e '.say for lines[0]' six_fruits1.txt >> apple:banana:carrot:dragonfruit:eggplant:favabean > > Six_fruits has 3 lines. Lines has processed the data. But you wrote '[0]' > which extracted the first line, and that was processed by the 'for' loop. In > other words the 'for' was only given one piece of information to process. >> >> >> mbook:~ homedir$ perl6 -e '.say for lines[0..1]' six_fruits1.txt >> apple:banana:carrot:dragonfruit:eggplant:favabean >> apricot:basil:cabbage:dill:escarole:fennel > > The '[0..1]' extracts the first three pieces of data from 'lines' and they > are processed by the 'for' >> >> >> mbook:~ homedir$ perl6 -e ' for lines() { say .split(":")[0, 2, 1, >> 5].join("\t") };' six_fruits1.txt >> apple carrot banana favabean >> apricot cabbage basil fennel >> acai celery beets figs > > Could be just 'lines', which provides a list of the lines in the file to the > 'for' > Inside the 'for' the data is in the topic or default variable. You could > access it as $_ but '.split' accesses it automatically. Split generates > another list. '[0,2,1,5]' extracts the relevant elements of the list and > generates another list which is passed to the'join'. The output from join is > passed to 'say' which is written in sub form. Sub form means you write the > name of the sub first, then you write where the data is coming from. > >> >> mbook:~ homedir$ perl6 -e ' for lines() {.split(":")[0, 2, 1, >> 5].join("\t").say};' six_fruits1.txt >> apple carrot banana favabean >> apricot cabbage basil fennel >> acai celery beets figs > > Exactly the same for perl6 as before except that 'say' is written in sub form > above and in method form here. Method form means you can append the 'say' to > a chain of processing units. >> >> >> mbook:~ homedir$ perl6 -e 'for "six_fruits1.txt".IO.lines() >> {.split(/\:/)[0, 2, 1, 5].join("\t").say};' >> apple carrot banana favabean >> apricot cabbage basil fennel >> acai celery beets figs > > Here just accessing the data in the file explicitly in perl6. >> >> >> mbook:~ homedir$ perl6 -e 'for "six_fruits1.txt".IO.lines >> {.split(/\:/)[0, 2, 1, 5].join("\t").say};' >> apple carrot banana favabean >> apricot cabbage basil fennel >> acai celery beets figs > > Same as above. No () on lines >> >> >> >> >> >> On Mon, Jul 29, 2019 at 1:07 AM Richard Hainsworth >> <rnhainswo...@gmail.com> wrote: >> > >> > Also no need for all the brackets >> > >> > .say for lines; >> > >> > This is quite idiomatic Perl 6 and not golfing >> > >> > On Mon, 29 Jul 2019, 07:13 Joseph Brenner, <doom...@gmail.com> wrote: >> >> >> >> > Hmmm. I would expect that to be in the Perl 5 to Perl 6 Migration >> >> > Guides, but I do not see it there. >> >> >> >> Exactly, I was just looking there, and I ended up playing around with >> >> the method form of lines, and didn't think to try the function >> >> form of it. >> >> >> >> To summarize, if the goal is to write a "simple_echo" script that >> >> can work with a file name or with lines on standard input: >> >> >> >> simple_echo lines.txt >> >> cat lines.txt | simple_echo >> >> >> >> The perl5 version would probably be: >> >> >> >> #!/usr/bin/env perl >> >> while(<>){ >> >> print; >> >> } >> >> >> >> The perl6 version would be something like: >> >> >> >> #!/usr/bin/env perl6 >> >> use v6; >> >> for lines() { >> >> say $_; >> >> } >> >> >> >> >> >> The kind of thing I was playing with was: >> >> >> >> #!/usr/bin/env perl6 >> >> use v6; >> >> my @lines = $*ARGFILES.IO.lines; >> >> say @lines; >> >> >> >> That works for lines from a file, but not from standard input, and the >> >> error message isn't tremendously helpful: >> >> >> >> No such method 'lines' for invocant of type 'IO::Special' >> >> >> >> >> >> >> >> >> >> On 7/28/19, Bruce Gray <robertbrucegr...@gmail.com> wrote: >> >> > >> >> > >> >> >> On Jul 28, 2019, at 6:20 PM, Joseph Brenner <doom...@gmail.com> wrote: >> >> >> >> >> >> I was just wondering if there's some direct analog in perl6 to the >> >> >> perl5 construct: >> >> >> >> >> >> while(<>){ ... } >> >> >> >> >> >> If I'm planning on passing a filename on the command-line, I can just >> >> >> get it out of $*ARGFILES easily enough, but what if I also wanted it >> >> >> to work on lines passed in via standard input? >> >> > >> >> > >> >> > `lines` , as a sub instead of a method, and no arguments. >> >> > >> >> > See: https://docs.perl6.org/routine/lines#(Cool)_routine_lines >> >> > Without any arguments, sub lines operates on $*ARGFILES, which >> >> > defaults to >> >> > $*IN in the absence of any filenames. >> >> > >> >> > For example: >> >> > perl6 -e 'say .join("\t") for lines().rotor(4);' path/to/file.txt >> >> > >> >> > Hmmm. I would expect that to be in the Perl 5 to Perl 6 Migration >> >> > Guides, >> >> > but I do not see it there. >> >> > >> >> > — >> >> > Hope this helps, >> >> > Bruce Gray (Util of PerlMonks) >> >> > >> >> >