and then say “The distinction above is perhaps not obvious - and without ]box on they would look identical. Catenate ravels its right argument.”. I don't think I got what you were _trying_ to say, but the sentence is wrong – catenate does _not_ ravel its right argument! (If it did, I wouldn't be able to catenate two matrices, for e.g....)
These two cases are different because, in the first case, `5 6 'hello'` is a nested array, whereas `'hello'` is just a regular vector:
```APL
5 6'hello'
┌─┬─┬─────┐
│5│6│hello│
└─┴─┴─────┘
'hello'
hello
[x] “If selfie is given an array operand, it becoms constant: it always returns its left argument, kind of like a left-tack, or {⍺}:”
A⍨, with an array A, derives a new function that can be monadic or dyadic. When you say “it always returns its left argument”, you are technically saying that X (A⍨) Y should return X, when it returns A. You can replace “argument" with “operand” and you will be correct, but then it could be nice to show a couple of examples of A⍨ used monadically and dyadically, and also show that A⍨ is not a scalar function, e.g., with
[x] Right after the above, you write “If we give no left argument we also get constant but in a slightly different way. It echoes its right argument to its left:”. Because you already introduced A⍨ with an array A, readers cannot tell you are trying to talk about f⍨ with a function f. What is more, the name of f⍨ that “echoes its right argument to its left” is still "commute/switch", it is not "constant". (See, for e.g., this orchard msg, or check the docs to see the official name.)
[ ]
To consider
In here I include things that, from my point of view, would be nice additions/modifications. Tick them as you ponder on them, feel free to disregard.
[x] In “Learning what each glyph does is an unavoidable chunk of time investment, and there are some mnemonic cues sometimes based on where they sit on the keyboard, or that related functions sometimes have glyphs that are visually similar.”, the first statement (we have to invest time) should be contrasted with the fact that there are mnemonics, meaning "unavoidable chunk of time investment, and there" could probably be rewritten as something like
unavoidable chunk of time investment, but there
unavoidable chunk of time investment; thankfully, there
unavoidable chunk of time investment. However, there
[x] Be consistent in the way you write the names of the glyphs and the functions. In previous chapters, they were used as regular words. In this chapter, the capitalisation and italicisation of those names was rather inconsistent. I just want you to know, however, that I know how hard it is to be consistent with these tiny things 😛
[x] “We can somewhat simplified think of match being “deep equals for arrays”” needs something. I think the “simplified” there is conjugated in the wrong tense, or something like that; but the sentence is, at least, missing commas around “somewhat simplified”. It might also be me missing something, but the sentence would be simpler if it were just “We can think of match being “deep equals for arrays””.
[x] You use ⊢var←value all the time, so why did you opt for
[x] as the zip() found in for example Python, → as the zip() found in Python, for example,
[x] use “index of” or “index-of” for dyadic ⍳, but not both
[x] Talking about index of, you say “The right argument can have any shape, but the left argument is usually restricted to a vector.”. Maybe consider dropping the word "restricted" from there? IMO that will make it clearer that we generally see vectors on the left of ⍳, but doesn't make it look like ⍳ can only work with vectors on the left.
[x] see the ‘find’ section later! → Jupyter notebooks and the jupyter book tool have support for internal cross references, so it would be neat if ‘find’ were linked to the correct place :)
[x] When talking about selfie, consider presenting the two usages of f⍨ first, and only then talking about A⍨
[x] When talking about implementing ≢ as +/=⍨, refer to =⍨ as "self-equals" instead of "constant-equals", to prevent any confusion with the fact that ⍨ is also the "constant" operator, which is not what ⍨ is doing in =⍨
[x] We have the full complement of relational algebra operations at our disposal. → We have the full complement of set operations at our disposal. (?)
[x] When exemplifying grade up, it might help if the data you are ordering has numbers significantly different from the indices you will get
Revision
Here I include all of the things that, to the best of my knowledge and experience, should be changed/corrected.
[x] Typos and other minor issues:
,
and Enlist, monadic∊
do related things →,
, and Enlist, monadic∊
, do related things,
) and Enlist (monadic∊
) do related things⍋
and grade down,⍒
. → these twins are called grade up (⍋
) and grade down (⍒
).[x] You show
┌→────────────────────┐ │ ┌→────┐ │ │ 1 2 3 4 5 6 │hello│ │ │ └─────┘ │ └∊────────────────────┘ ┌→────────────────┐ │1 2 3 4 5 6 hello│ └+────────────────┘
[x] “If selfie is given an array operand, it becoms constant: it always returns its left argument, kind of like a left-tack, or {⍺}:”
A⍨
, with an arrayA
, derives a new function that can be monadic or dyadic. When you say “it always returns its left argument”, you are technically saying thatX (A⍨) Y
should returnX
, when it returnsA
. You can replace “argument" with “operand” and you will be correct, but then it could be nice to show a couple of examples ofA⍨
used monadically and dyadically, and also show thatA⍨
is not a scalar function, e.g., with[x] Right after the above, you write “If we give no left argument we also get constant but in a slightly different way. It echoes its right argument to its left:”. Because you already introduced
A⍨
with an arrayA
, readers cannot tell you are trying to talk aboutf⍨
with a functionf
. What is more, the name off⍨
that “echoes its right argument to its left” is still "commute/switch", it is not "constant". (See, for e.g., this orchard msg, or check the docs to see the official name.)[ ]
To consider
In here I include things that, from my point of view, would be nice additions/modifications. Tick them as you ponder on them, feel free to disregard.
[x] In “Learning what each glyph does is an unavoidable chunk of time investment, and there are some mnemonic cues sometimes based on where they sit on the keyboard, or that related functions sometimes have glyphs that are visually similar.”, the first statement (we have to invest time) should be contrasted with the fact that there are mnemonics, meaning "unavoidable chunk of time investment, and there" could probably be rewritten as something like
[x] Be consistent in the way you write the names of the glyphs and the functions. In previous chapters, they were used as regular words. In this chapter, the capitalisation and italicisation of those names was rather inconsistent. I just want you to know, however, that I know how hard it is to be consistent with these tiny things 😛
[x] “We can somewhat simplified think of match being “deep equals for arrays”” needs something. I think the “simplified” there is conjugated in the wrong tense, or something like that; but the sentence is, at least, missing commas around “somewhat simplified”. It might also be me missing something, but the sentence would be simpler if it were just “We can think of match being “deep equals for arrays””.
[x] You use
⊢var←value
all the time, so why did you opt forinstead of
[x] as the
zip()
found in for example Python, → as thezip()
found in Python, for example,[x] use “index of” or “index-of” for dyadic
⍳
, but not both[x] Talking about index of, you say “The right argument can have any shape, but the left argument is usually restricted to a vector.”. Maybe consider dropping the word "restricted" from there? IMO that will make it clearer that we generally see vectors on the left of
⍳
, but doesn't make it look like⍳
can only work with vectors on the left.[x] see the ‘find’ section later! → Jupyter notebooks and the jupyter book tool have support for internal cross references, so it would be neat if ‘find’ were linked to the correct place :)
[x] When talking about selfie, consider presenting the two usages of
f⍨
first, and only then talking aboutA⍨
[x] When talking about implementing
≢
as+/=⍨
, refer to=⍨
as "self-equals" instead of "constant-equals", to prevent any confusion with the fact that⍨
is also the "constant" operator, which is not what⍨
is doing in=⍨
[x] We have the full complement of relational algebra operations at our disposal. → We have the full complement of set operations at our disposal. (?)
[x] When exemplifying grade up, it might help if the data you are ordering has numbers significantly different from the indices you will get