 Can't hear you. Hello. Can you hear me? How about now? Good. That weird thing where I just have to turn the volume up and down for no particular reason. I think sometimes there's a setting when you start, they turn off everything. Oh look, Ben's joining us. Hello Ben. You're muted. Hello. It's like you've got a halo around you there. Very elegant. I put it there especially. Nice to meet you. Hi. Hey Serrata. Yeah. Yeah. Serrata and I live on the same side of the country but yeah, should catch up sometime. Hello, you're in Perth, Ben. I'm in Coley which is 40 minutes up the hill from Bumbry. It's another two hours. It took two and Bumbry's two hours south of Perth. That is Bill Coley. C-O-L-L-I-E like the dog. Coley Western Australia. It's the power generation centre of the state prior to renewables. Okay. I see. You're inland. Yeah. Lots of forests around you. That sounds nice. It is. Yeah. Actually in my introduction at the course, I at least I showed a few videos of the place. We were transitioning from yeah, from coal power to something else. So I'm not quite sure yet but the government's putting a lot of money into the town to help it get started in other industries. So it's good. Not good, eh? Yeah. So usually this is right in the middle of my drive to work but I've got a little cough developing so I thought I'd stay home and have an opportunity to tune in. I hope you're all right. Yeah. Yeah. I'll see you guys. All right. Any news since yesterday? Talking at the forum. I was just looking at one thing that just happened to do a poll on the APL notebook and I was just looking at the 9-11-1 which is monadic and it's called rank. Are you looking at what? I'm looking at the notebook. The notebook. Yep. All right. I got it open here. So I just go there to pull a few minutes ago. Yeah. So it should be 9-11-1. What does that mean? 9-11-1. Or they all don't numbered each thing. So I don't have numbering on them. No. Okay. It's interesting why mine's different. That's because you'll have the table of contents extension installed. Ah, got you. I can say jot diresis. Okay. The monadic. Go down to operators and towards the end. jot diresis. Yeah. Yeah. It says in brackets it says rank and that's what it's doing is not what I understood rank to be. No. That seems to be incorrect. So Jeremy, do you want to start this group? Yes. Just looking up the correct name for jot diresis. Oh. It does say rank on for a different meaning of rank. Is it or? Yeah. Yeah. Okay. No. It is. Oh, yeah. It is rank. And we haven't really fully investigated this one yet. So, yeah, let's come back to that. Maybe even today. All right. Let me share my screen. Hi, Wasim. How are you? I'm good. Thanks. Not bad. All right. So yesterday we were doing access. We did comma. We did comma bar. Is that basically where we got to? I guess so. Oh, and then we were doing access with monadic operand. Okay. Yeah. Well, that's actually not a bad time actually to look at jot diresis. So what if we move? Well, I mean, the first thing I'd say is slope and slope probably deserve to be moved up anyway. And then let's move jot diresis up. This one. Oh, okay. This one's got a monadic as well. Sorry. No. Not a monadic as well. Okay. This is where we need to be careful to include the all the possible versions. So there's both rank and a top. So rank is not its meaning. Rank is its meaning. This is the type of rank is its meaning. Yep. I don't know what it is now. It is the rank operator. So, okay. So it's quite similar to access. And in fact, okay. So slope bar and slash bar are basically identical, I think, to using the access operator. Yes. As you can see. And then rank is also the same. Yes. As you see here. So the rank operator is takes a function on the left and a scalar on the right. Is it always a scalar? Wrong one. Rank B. Okay. It can be a scalar. Okay. Sorry. A scalar or it can be a vector. Ah, yes. Yes. Yes. Okay. I knew that too. All right. So what this is going to do is it's going to take the plus slash function and it's going to apply it over this axis. So it's very similar to the access operator. So just to clarify, it's not ranking the in the way that we learned through the course where it's the number of dimensions of correct. It is not. So it is not that. So that rank is row row. So you can always get the rank by calling row. I think maybe just an extra comment there, just because when I read rank. Yeah. I mean, I haven't added any pros to this yet. So I'm not going to add it just yet, but yeah, when we do that. So if we've got here, so the first dimension, the first axis is this one. So this is going to apply some over the first axis, which is identical to slash bar. No, it's not slash bar. It's slash bar would be at doing it over the second axis. Now what am I just doing going on here? So, so there's any, okay, it's different to axes because if we did axes. To need to use a cube for an example to see the difference. Okay. So axes works this way. It specifies the rank of the cells. Okay. So it selects k cells of the corresponding argument. So k cells. So, okay. So the one cells of this are the cells which are vectors. I see. So rank isn't able to like transpose it or anything, I guess, using this approach. I don't know if there's something if it's negative. Here we are. If it's negative, minus one selects major cells. Okay. So there's a whole thing about cells and subarrays here. That's useful. A rank k cell describes a subarray on the last k axes. Okay. Negative k describes a subarray on the leading k axes of an array. R plus k. What does that mean? Because like R is the rank of the array. Okay. So in our case, that's two. So a negative k would be, oh, R plus minus one. I see. That's why. So got it. R plus minus one would be the last axis. Okay. That makes perfect sense. Yeah. So this is different to the axis operator. You can't change the axis. You can just say what cells to do this over. So I like this idea of using a cube and then that big cube. Okay. So that's doing it over the one cells. So these are the one cells. And here are the sums of the one cells. Okay. So then if we do two, should be over the two cells, which are two cells would be, I see, I thought a two cell would be this whole thing. So I was expecting it to add that all up. Do they have some examples? Confusing. I posted a link in the chat. Go ahead. Go ahead, sir. I posted a link in the chat to the wiki, which shows rank versus axis, like some examples. Oh, great. I'll take it the same. Okay. It's forgetting to use APL wiki rank. And what's an anomalous axes operator? A non-negative right operand. That's what we have. Specifies the number of final axes to which the function applies. Negative is called rank versus axis example. It looks like they don't use plus slash or they use like slash bar. That shouldn't make any difference, should it? When you've got a rank with it, I think this should be the same. I am wrong. Is the round brackets causing something to change how it's applied? The round brackets, I think, would be necessary because otherwise, because of precedence without it, it would be parsed like that, I believe. Okay. So this is different somehow. Monadic. Okay. Diodec slash bar as an operator. So the sense and subarrays documentation says that two cells are like two matrices of 2D shape. So if we look at the notebook. Just before we do, I just want to mention, this is what I thought it says. It just implies reduction among a particular axis. So I'm not sure why these two are giving slightly different answers. Oh, I see why. So cube is reducing down. So in this case, it's one cells are considered to go downwards rather than acrosswards. That's why it's different here. So it's doing matrices and it's summing up each lot of things in each of those matrices. Okay. Yeah. So go ahead. So what were you saying about notebook? I think you are on the right. So the documentation says if X is a three-dimensional matrix of shape 2, 3, 4, the two cells are its two matrices of shape 3, 4. So in our case it is two matrices of shape 2 by 2. Let's do that, shall we? So 2, 3, 6, 4. So 24. Okay. Yeah. And so two cells rank two cells are the matrices of shapes three by four. And we are applying the slash to that whole matrix, the each matrix. So slash bar, I guess, is applying it to the last axis. So 1 plus 5 plus 9 is 15. 2, 6, 10 is 18. And 13, 17, 21 is 15. Which gives us these? So the operator is applied for each matrix of 3 by 4. So normally if we went matrix is a 3 by 4. Yeah. So that's, that is the first row of that because it's being applied to matrices. Is that the idea? And then this one is being applied to vectors. That one is the rank of the sub-matrix, the documentation you showed you before, k-cells. Yeah. So that I believe is a k-cell. So I'd expect it gets 7, 10. Yes, which you do, 10. Okay. That makes sense, kind of. The one I think is particularly helpful is the version where you pass a two-element array on the right-hand side. Because then you've got, we should be able to add, let's say we wanted to add one to each row or add one, two, three to the first, second, third rows, we'd go one, two, three. Now you can't just add that to the matrix because they don't match. But what you could do is you could say, so the keyboard shortcut for this is shift J. So we're going to go through each cell on the left. And then on the right, we're going to go through each vector on the right. That is zero. Yes, okay. Scalar on the left. So this is going to go through each scalar on the left and each vector on the right. And so the vectors on the right are the first one, one, two, three, four. And the first scalar on the left is one. So the first result is one plus one, two, three, four. The second is two plus five, six, seven, eight. So that's how we can do quick loops between two different things. So that's a pretty important operator. And Adam mentioned that as well on the forums. Does anybody have any questions about that? It's a bit odd. I think a key thing is to look at this idea about cells and cell arrays. I've come across this before because they talk about it in J a lot. J being the language that Iverson built after he built APL. All right. So maybe we should move to a top, which I think is going to be easy because I think it's largely the same as Jot bind like so. So we can just borrow the use from Jot. And this is not monadic. This is dyadic. So that should all be the same as far as I know. Okay. I think it's a shift J. Different. Okay. Let's find out why. So a top, fty equals f of dy. Oh, this is the wrong version. I need the bind one. No, I don't need the bind one. I mean, I need beside. Yes, it's the same. And this one is the same. It looks like for Jot, we, now that's interesting. There's some difference between them. I thought in the dyadic. Oh, okay. Only two. Okay. Whoops. I forgot to change it. Oh, that's the same. And this one's different. Okay. So the monadic one's the same. The dyadic one's different. Let's have a look. I think there's some nice pictures. Here we are. Okay. Here's the difference. So beside, which is the one we've learned before, first of all, applies the right hand function, the way Adam describes it as a preprocesses the right hand side. And then the left hand function applies to the left hand side and that preprocessed right hand side. Oh, and it tops doing the opposite. Basically, it's applying the right hand side dyadically and then post-processing with the left hand side. You see the difference? Okay. So that means that this one here would be, should be two divided by three first, two divided by three first, and then it's going to do E to the power of that, which means we basically don't need any parentheses. Does that make sense? It did for me. All right. Great. Thanks, Molly. I'm still getting my eye in with all the symbols. Yeah, tell me about it. Eddie, in particular, you want to explain or reviewed? No, it's just having the time to process. So this is E to the power of. So this is E to the power of two thirds, which makes me think we should do this last one now over. It probably makes sense, right? So over is here, shift O over. A little bit confusing because it looks a bit the same. Just in those three diagrams, can you, in the notebook, can you break down which is X and which is Y? So Y is always the right hand side and X is always the left hand side. The final X hand side. Okay. And you can tell in the documentation because, if you look at a particular example, like here, over here, it shows you here. So R is the result, X is the left hand side, Y is the right hand side, and F and G and the left and right arguments to the operator. Yeah, I just, in the example, I just want to concretely point it, which is which. So in the example, this is X, this is X and Y. Yeah. Oh, and G is inside the F function. And G is F and G. Yeah, got it. And if you define your own operator, they have different names. I kind of wish I used these names in the documentation. They're called, F is called alpha, alpha. G is called omega, omega, which we don't have for this one. X is called alpha and Y is called omega. So over is, okay, same thing, magnetically. So that's pretty easy. I guess we don't need quite so many examples for the ones that are identical. It's all right. Copy that, paste that. So shift O, the symbols called circle dioresis, dyadic version called over. I should do this one, over. Okay. So over, that should be exactly the same, which it is. Now, the dyadic version is different. It's going to apply G. It's going to pre-prose both left and right. So I'm going to try to predict what it's going to do. So here, it's going to apply divide to both sides. So we're going to get, I think should be the answer. It is. So it's applying divide to the left. It's applying divide to the right, and then it's applying power of to that result. That is what this useful picture is showing. Okay. And then it's showing when any of these applied monetically, the dotted branch disappears. It means in every case, you're left with FGY, FGY, FGY. All right. So it's nice to see all these different types of function composition. Yeah. You know, it's something that we're not used to from other languages, are we really? But the idea comes from combinatorial logic. And there is the Haskell, so Haskell carry kind of, I don't know if he invented it, but he certainly developed it. There's the carry combinators. It basically defines these different ways of combining, or I guess we'd say in computer science composing functions. And so, yeah, all the, all the, these ways of doing things in APL, I believe are directly aligned with different carry combinators. I am not at all an expert on that though. Is that where the term carry comes from? It is. Yeah. Carrying of functions. I thought that was a this thing that predated Haskell. Haskell was named after Haskell carry. Haskell carry predates Haskell by a long way. Yeah. Yes. Good. And that's what we would call partial functions in Python. Great. Another thing I wanted to mention, actually, which is to go back a bit to the Boolean stuff, I feel like we should have covered a couple of other things. One is, I think we should have covered slash as a function, because we've covered slash as an operator, but not slash as a function. And the reason I want to put it with Boolean is because, oh, in fact, there's quite a few monadic versions, like quite a few. Let's check this. There's equals. Okay. It doesn't have a monadic. Not equals. Yeah. Okay. So I want to, do you guys remember a monadic not equal to, which tells you, have we seen this number before in the list? And so it's going to end up giving you a one for unique values. Where this is interesting is we can combine it with slash. Can you guys still hear me? My headphones do. Yeah, it's good. Okay. I think they're running out of batteries. Should I do a bit more fancy? Hi. Can you guys hear me? Yep. Can do. Great. It's a bit louder. Bit louder. Okay. But okay. Cool. See if I can adjust it here. Audio settings. All right. Yep. All right. So paste. So we're going to do slash as a function. And it's called replicate. And what it does is it, let's put this in v and then not equal to is eight. What it does is repeats whatever's on the right by the number of things that's on the left. So if we say on the left is a Boolean array and on the right is the array itself, then that returns a unique list of the elements of v because it's repeating. It's basically element wise repeat. So one copy of 22, one copy of 10, zero copies of 22, zero copies of 22. So it makes sense. One copy of 21. And so that's the result. So you don't need a separate unique function in APL. We can just combine this idea of replicate with a unique mask. And it behaves as a mask. Is this where they might use that XY swap thing to get rid of the brackets? Yeah, could try that. We just added as a second line output to quarterly. Yeah, just oh yeah, we could do that. Now I've messed it all up. Obviously, does he? Yeah, but it was a second line. Okay. So actually, I have a general question for everyone. With the keyboards, I find that actually, I haven't tried to hunt this down myself much, but I find I'm hitting control and shift keys often to do things. And it changes my keyboard every time. And then my control zed state work. Does anyone else experiencing that? Yeah, so you can just hold down windows and press space to switch Yeah, it does. But but it's also switching keyboards every time I hold control and shift together. Oh, you can change that in your language bar settings. Okay, I'll go looking for it then. Cool. I'm on a Mac at the moment. So I don't see the same thing. Okay, so the swap was like this one. I think so. Shift T. So switch them around. And if we've done that yet? No, we haven't done that yet. Oh, I won't put it there. But yeah, that would totally totally work. And then yeah, the other thing you can do, since it's replicate, you could say like three. So it's just going to repeat, maybe we want to repeat the constant three times or something. There you go. I like this thing in APL, you know, this white, I feel like things are always just made more general than most other languages. So rather than just having a Boolean mask operator, you know, it's called replicate. I like that. Very cool. Yeah. Yeah, very cool. All right. So then we need to revisit all of our operators and make sure we didn't miss any examples of what they can do, which is what Adam pointed out that probably that we definitely have. So we've got, yes, we have not done expand, for example, which is, oh, that's used as a function. Okay, I've never seen this before. So in the, in the, in the letters, wherever it had the minus, it gave spaces. It's got one and then two spaces and then a subarray of fill elements is replicated. Like in, well, in the matrix example, you've got a number one and then you've got two zeros because it's minus two. And then you've got two replicated. So that's replicating the second element to us. And then you have. Yeah. So it's doing it kind of like across columns. So yeah, I think if you put it in your local and had a box around it, maybe easier to see. Oh, you think there's a boxing thing going on here? Yeah, I think the second one, the ace, that maybe definitely have some boxing around it. Okay. Not much to say. So I guess that means it's the actual spaces. That's two spaces. Yes. And then there's four spaces. Okay, this isn't really got anything to do with Boolean, so we can probably come back to it. So I don't think we need that right now. As an operator, we've done, okay, they don't, have they got a dyadic? I don't think so. Okay, so I think we've done this operator fully slash bars the same. And I think we check these pretty carefully. So let's check star dioresis, power operator. I don't think we've, oh, I did want to talk about power operator some more because we missed a really interesting case of power operator, which is a negative number here. So if you remember here, we're saying, okay, this is, sorry, this is the successor function. Okay, so it adds one to things. And this here says run the successor function three times to zero. So we get three. What's interesting though is we can also say, we can also create subtraction. And the way we can create subtraction is to say, like subtract one, for example, subtract one. I guess that should be P, predecessor instead of successor, predecessor. We can define as successor star dioresis. Sorry. Oh, I'm, notice, I don't know if it's only me, but it looks like you're typing off the edge of the screen. Okay, thanks for letting me know. Is it okay now? I can see that. Yeah, I can see it now. All right. Power negative one. Now, what power negative one does is it's the inverse function. So the inverse of adding one is subtracting one. The predecessor of three should be two. Isn't that amazing? So APL understands inverse functions, which is a pretty sophisticated mathematical concept. And it's even like doing inverse functions of functions that we have to find ourselves. And if you put a negative something other than one, I believe it applies it. The inverse function that many times. So I think we could say apply the successor inverse function three times to the number five, for example. There you go. That's the equivalent of five minus three. So you could also do a square root. So if you wanted square root, you could do, I think, so that's going to be, let's say square is the power of dot two. So then we should be able to get the square root of nine by doing square inverses, the inverse function of square, which is square root. There you go. Very cool. So it's like solving an equation. Yeah. Okay. So I'm glad we revisited that one. I think that's pretty amazing. To all the diaries. Okay. Yeah, we missed one of these. So this is dyadic. Oh, no, it looks like we've got it here. And we've also, this one's called, this one's called constant. All right. And then diarisis. Okay. Each. And we've got each with dyadic operand. And here we have got each with monadcovered. Okay. So now I'm wondering what, does anybody remember on the forums Adan said that there was a problem with our operators? We had a particular example of something we missed. So I made this post. Oh, that's interesting. So Adan says many APLs frown on bracket access as anomalous. And there's no general rule. Yeah, the modern alternative is rank operator. Often together with transpose. Okay, we haven't done come to that yet. But I guess we can guess what that means, which is general. Cool. So you don't often need bracket access. Ah, that's good to know. So transpose should be one we could do reasonably early wouldn't rely on yeah other ones. Absolutely. I'm just trying to find this one with about what we've got to fix. Why I'm pretty sure we're missing something. Ah, here it is. Okay, systematic problem of terminology. So for functions, yes, they're monadic or dietic. But for operators, there's monadic and dietic operators. And then these can derive monadic and dietic functions. Well, this one we've got dietic commute. So we've missed the fact that this derives a monadic function. Okay, let's check that one. So this to order diresus derives a monadic function. Which I guess is this year. Oh, look at that. If the left argument X is admitted, and you can tell that you can because it's in curly brackets here. Then the right argument is duplicated. Okay. Not sure the APO docs really laid that out as nicely as Adam is done either. It's not really showing us that as clearly. But yeah, I can see that now. So we need to check when we look at the documentation for these X curly brackets to see things where there's an optional left hand side. That's interesting. So it's going to duplicate it. What would be an example of where you might want to do that? I think maybe our unique thing would that work. So let's do it the other way around the slash. Oh, I have a feeling this is going to work the slash. So we've got this, which has got V on both sides. So I wonder I don't feel that confident, but I wonder if you can do that. No, I can't. I've got it in the wrong place. Yeah. No, the problem is that's going to put this on each side. That's not a good example. Okay. So does anybody have an example of something? Oh, I know a simple example. We could define power as being as being multiply on either side. That should be power, right? Ah, yeah. There you go. All right. Well, if anybody comes across any other ones where we didn't notice a monadic version, let me know. Just back in that previous cell, did you want to lose that previous example? Which previous example? The one you overwrote to in this cell 223. Oh, was there something there? Oops. Oh, this one? Oh, no, no. Back in that cell, if you just hit control Z a few times, you'll see. Maybe you meant to overwrote it, but it was a, look like it was a good example before that. No, this is... You didn't want to keep that? Oh, yeah, because we can use it. I see what you're saying. We can use it for the, we can use it for this one. Just give it a new cell. Oh, yeah, yeah, yeah. That makes sense. Okay. Thanks for the idea. Okay. All right. Thanks, Karen. Cheers. See ya. Thank you. See ya.