Thank you Jürgen. You make a compelling argument. In particular, I'd argue that the ⎕FIO[n] functions should be seen as an internal implementation detail, and the “official” API as it were, should be the wrapper functions.
Speaking of which, ⎕FIO[49] needs a name in wslib5. Any suggestions? Regards, Elias On 25 January 2017 at 19:57, Juergen Sauermann < [email protected]> wrote: > Hi, > > there is nothing wrong with *⎕**ReadLines* as such. However, > > - if I remember correctly then in the 70s APL was very much loved by > programmers that were > not speaking English every day, in particular in France and Canada. > > - Every new ⎕ function requires quite some coding. The C-code that > implements it has typically only a few lines > because the function itself is normally already implemented somewhere in > libstdio. Suppose you already have the > implementation in, say, *{ CODE }*. > > Then making *{ CODE }* available as, say, *⎕FIO[N]* is currently simply a > new case clause: > > * case **N**:** { CODE** }* > > For *⎕ReadLines* instead fo *⎕FIO[N]* you would need far more changes: > > - a new *Id* for it, > - a new *Token* for it, > - a new class, say *Quad_ReadLines* around *{ CODE }.* That also means > two more source code > files and therefore impacts in *src/Makefile.am* and *SVN* > - write testcases for it, > - write a *)HELP* entry > - write documentation for it > > I am normally planning 3 days of (part-time) work for one new Quad > Function. This would be 3×49 days > for converting *⎕FIO* into different *⎕something* functions. And after > that, you would have a good > argument to ask why, for example *⎕CR* or *⎕SQL* are using numbers > instead of names. > > So this is half a year of work on my side compared to a simple > > *)COPY 5 FILE_IO* > > where named wrapper functions for every *⎕FIO**[X]* already exist (and > you can even change the names > if you don't like them). > > /// Jürgen > > > > > On 01/25/2017 05:54 AM, Elias Mårtenson wrote: > > Is there anything inherently wrong with having more quad-commands? What is > the reason we have to do ⎕FIO[49] instead of simply ⎕ReadLines or > something like that? > > It's like we're going out of way to make code unreadable. I know APL is > all about terseness, but I think this is going too far. Am I alone in this? > > Regards, > Elias > > On 25 January 2017 at 12:36, Christian Robert <[email protected] > > wrote: > >> In fact we should make all/most ⎕FIO[] in into parantheses >> >> things like this was working fine before ⎕FIO[49] >> >> fd← "r" ⎕fio[3] ".bashrc" >> fd >> 5 >> ⊣ ⎕fio[4] fd >> DOMAIN ERROR >> ⊣⎕FIO[4]fd >> ^ ^ >> >> well, I know now that I have to make it: >> >> ⊣ (⎕fio[4] fd) >> >> but it's a change into the previous behavior of ⎕FIO[]. It was not trying >> to grab the left operator of ⎕fio[4] >> >> >> Xtian. >> >> >> On 2017-01-20 10:57, Juergen Sauermann wrote: >> >>> Hi Xtian, >>> >>> yes, one thing that I overlooked was that you should put *⎕FIO**[**49] >>> *into parantheses because >>> otherwise it will grab the function left of it and apply it to each line >>> read from the file and not to >>> the final result: >>> >>> * ⎕FIO[49]'x' ** >>> ** Line 1 Line 2 Line 3 ** >>> * >>> * ⊃⎕FIO[49]'x' ⍝ apply ⊃ to each line**of the file (has no >>> effect) >>> ** Line 1 Line 2 Line 3 ** >>> ** >>> ** ⊃(⎕FIO[49]'x') ⍝ apply ⊃ to the final result of ⎕FIO[49]** >>> **Line 1** >>> **Line 2** >>> **Line 3** >>> * >>> Syntactically *⎕FIO[49]* behaves like a monadic operator with an >>> optional left function argument. >>> The parentheses prevent it from using the left argument. In my previous >>> example, >>> >>> *Z←CONVERT¨Z←⎕FIO**[49] 'filename' >>> * >>> the *←* had the same effect as the parentheses.* >>> * >>> >>> /// Jürgen >>> >>> >>> On 01/19/2017 11:10 PM, Christian Robert wrote: >>> >>>> Juergen, >>>> >>>> Just a note, your example as of yesterday to disclose the result of >>>> ⎕FIO[49] to obtain a matrix no longer work as is. >>>> >>>> >>>> I had to add a tack (⊢) between ⎕FIO[49] and the "⊃" as in LoadSudoku2 >>>> below. >>>> >>>> >>>> LoadSudoku2←{{⊂9 9 ⍴ ⍵}⍤1 ⊃ ⊢⎕FIO[49] ⍵} >>>> LoadSudoku3←{{⊂9 9 ⍴ ⍵} ⎕FIO[49] ⍵} >>>> >>>> without the tack it would run disclose on each line which is a noop. >>>> >>>> >>>> time "a←LoadSudoku2 'Sudoku_dump.txt'" >>>> 3.370101159 >>>> time "a←LoadSudoku3 'Sudoku_dump.txt'" >>>> 2.977278584 >>>> >>>> time "a←LoadSudoku2 'Sudoku_dump.txt'" >>>> 3.142475014 >>>> time "a←LoadSudoku3 'Sudoku_dump.txt'" >>>> 2.966579181 >>>> >>>> the LoadSudoku3 run faster than the LoadSudoku2 >>>> >>>> >>>> ⍴a >>>> 219025 >>>> ⊃a[1 2 3] >>>> 000000000 000000000 000000000 >>>> 000000008 000000009 000000009 >>>> 560230400 400008120 580030100 >>>> 100803000 001030000 001640008 >>>> 090060000 085009760 000300005 >>>> 000025010 090040200 602005041 >>>> 300500706 800070006 003700000 >>>> 076002000 000021050 920000076 >>>> 005090021 006000010 040809000 >>>> Display ¨ ⊃a[1 2 3] >>>> ╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗ >>>> ╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗ >>>> ╔═══╤═══╤═══╦═══╤═══╤═══╦═══╤═══╤═══╗ >>>> ║ │ │ ║ │ │ ║ │ │ ║ ║ │ │ ║ │ │ ║ │ >>>> │ ║ ║ │ │ ║ │ │ ║ │ │ ║ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ║ │ │ ║ │ │ ║ │ │ 8 ║ ║ │ │ ║ │ │ ║ │ >>>> │ 9 ║ ║ │ │ ║ │ │ ║ │ │ 9 ║ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ║ 5 │ 6 │ ║ 2 │ 3 │ ║ 4 │ │ ║ ║ 4 │ │ ║ │ │ 8 ║ 1 │ 2 >>>> │ ║ ║ 5 │ 8 │ ║ │ 3 │ ║ 1 │ │ ║ >>>> ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ >>>> ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ >>>> ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ >>>> ║ 1 │ │ ║ 8 │ │ 3 ║ │ │ ║ ║ │ │ 1 ║ │ 3 │ ║ │ >>>> │ ║ ║ │ │ 1 ║ 6 │ 4 │ ║ │ │ 8 ║ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ║ │ 9 │ ║ │ 6 │ ║ │ │ ║ ║ │ 8 │ 5 ║ │ │ 9 ║ 7 │ 6 >>>> │ ║ ║ │ │ ║ 3 │ │ ║ │ │ 5 ║ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ║ │ │ ║ │ 2 │ 5 ║ │ 1 │ ║ ║ │ 9 │ ║ │ 4 │ ║ 2 │ >>>> │ ║ ║ 6 │ │ 2 ║ │ │ 5 ║ │ 4 │ 1 ║ >>>> ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ >>>> ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ >>>> ╠═══╪═══╪═══╬═══╪═══╪═══╬═══╪═══╪═══╣ >>>> ║ 3 │ │ ║ 5 │ │ ║ 7 │ │ 6 ║ ║ 8 │ │ ║ │ 7 │ ║ │ >>>> │ 6 ║ ║ │ │ 3 ║ 7 │ │ ║ │ │ ║ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ║ │ 7 │ 6 ║ │ │ 2 ║ │ │ ║ ║ │ │ ║ │ 2 │ 1 ║ │ 5 >>>> │ ║ ║ 9 │ 2 │ ║ │ │ ║ │ 7 │ 6 ║ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ╟───┼───┼───╫───┼───┼───╫───┼───┼───╢ >>>> ║ │ │ 5 ║ │ 9 │ ║ │ 2 │ 1 ║ ║ │ │ 6 ║ │ │ ║ │ 1 >>>> │ ║ ║ │ 4 │ ║ 8 │ │ 9 ║ │ │ ║ >>>> ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝ >>>> ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝ >>>> ╚═══╧═══╧═══╩═══╧═══╧═══╩═══╧═══╧═══╝ >>>> >>>> >>>> I love ⎕FIO[49] ;-) >>>> >>>> Xtian. >>>> >>>> >>>> On 2017-01-19 09:17, Juergen Sauermann wrote: >>>> >>>>> Hi, >>>>> >>>>> I have added *⎕FIO[49]* to GNU APL in *SVN 858*. >>>>> >>>>> *Z←⎕FIO[49] 'filename'* reads the file named *filename* line by line >>>>> and stores every line >>>>> of the file in one enclosed item of result vector*Z* , for example >>>>> (file *x* has 3 lines): >>>>> >>>>> * **⍪**⊃ ⎕FIO[49] 'x' >>>>> Line 1 >>>>> Line 2 >>>>> Line 3 >>>>> * >>>>> The end of line character (LF = '\n') character possibly a trailing CR >>>>> = '\r' character is being removed in the process. >>>>> >>>>> *⎕FIO[49]* accepts an optional left function argument *F* which is a >>>>> monadic conversion function. >>>>> The conversion functions F is called with every line read and the >>>>> result of the function >>>>> is then stored in Z. for example: >>>>> >>>>> * ⍪⊃ {'x: ', ⍵} ⎕FIO[49] 'x'** >>>>> **x: Line 1** >>>>> **x: Line 2** >>>>> **x: Line 3* >>>>> >>>>> /// Jürgen >>>>> >>>>> >>>> >>> > >
