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
>>>>>
>>>>>
>>>>
>>>
>
>

Reply via email to