 Hi, Jeremy. Hi there. How are you doing? Pretty good, you? I'm good. So you have installed your monitors up high? Is that good? I've got one monitor split into two halves. Yeah, I'm always curious where monitors are because you look up all the time. Oh, you have two stacked, is it? It's one monitor but it's in P by P mode so it's treated to monitors. Okay, that makes sense. I have a tall monitor, a wide monitor as well. Maybe you can do that. Yeah, so this one specifically designed for what they call P by P or picture by picture mode. Oh, it's designing. So I've got it plugged in to the computer with two cables. So the computer thinks there's two monitors connected. So I could move you guys down to the bottom. Okay, and now I'm looking down at you. That's more like it. But now it's in the way of where I want to type APL. And it's also, that's the screen. So I share the bottom screen, screen sharing. So I put you guys on the top screen. I know. Hi, Rory, welcome. Are you able to talk or be videoed or are you just on text chat today? Just text chat, I guess. That's what I am. Okay, no worries. I don't want you to disturb people. All right, well, since today is a extra, rather late announced extra session, it might just be the four of us. So, cool, that's fine. How are you, Isaac? I'm doing good. Yeah, I wasn't sure I was gonna be able to make it today, but I was able to wrap things up. So I'm happy we're doing an extra one today. Yeah, thanks for coming. Thanks for hosting. This is always fun. All right, share my screen. Great. We haven't done this big O-diarrhesis before, or have we? Have we ever ready an operators? Yeah, we did. We did. Okay, that's terrible because I forgot. In that case, I will add a explanation of something I just played with. Okay, here we are, circle-diarrhesis, dyadic. That's a rank thing. Oh, there are two versions of it. One is the big O and one is the small O. Yeah, this is the big one, the circle as opposed to jot. So, circle-diarrhesis, I don't think we've done the dyadic form of the function that it creates. Oh, maybe. Oh, yes, we have. Here it is here. Yeah, it's not in one. So this is... It's one over two to the one-third frame. So this one is increasing of both arguments. That doesn't seem quite correct then. So the reason I'm asking is I was trying to do the permutations function, which is, so if I wanted to do p10 comma four, that would be that, I'll just write six. So that is lamp, lamp, lamp. What's lamp comma? What's the mnemonic then for the lamp? You know, actually, Adam posted, it looks pretty helpful, lead to a bunch of mnemonics on four. Yeah, pointed out. So Adam replied to the session 14 with answers to pretty much everything. One of which is basically Jeremy stopped forgetting things. Look up the mnemonics with a link to the, which is exactly right, with a link to the page. This would be bottom row keys. See my words comma and comment. Okay. That's nine comma slash comment. Right. I've been doing the Yankee every day and that's been helping quite a bit. Yeah, I haven't been doing any extra study at all because I've been doing the NB Dev stuff. So my APL is four hours a week for this plus a bit of stuff with my daughter and her friend. So it's not really enough to remember. Okay, so rec one, five or seven reckons that this would do it. Okay, it does. So that's interesting. Oh yeah, I do see it. This is what it's doing. It's doing reciprocal of two, tower of reciprocal of three. So this is called over. Okay. That's awesome. I knew there'd be something. Just didn't have time to quite figure it out properly. So an interesting exercise for the reader would be to create a version of this tacit program that does the 10 minus six part as well. Because the definition is actually, actually we could write it out here, is really that, right? No, well. It's almost forward. Okay. That's useful review. So that another useful review, which I'm not going to do now is, well, A, Adam pointed out upper and lower attack with higher rank arguments and explain why and how that works in a way which somebody probably should put on the APL wiki, if anybody fills up to it. It looks really great. And also talked a bit about, oh yeah, this train that we had trouble with, which honestly the thing he ended up coming up with is really no better than the D fun anyway, which is fine, but it's still useful exercise. And he said he's proposing an operator that actually does pre-process the left-hand side rather than the right-hand side, which would be nice, which he's calling B, for example. And that would do exactly what we wanted. That would be a nifty operator. Because yeah, without it, it's quite ugly. And yeah, also some discussion about the Booleans, which the most interesting part being the point that you can think of and as just being times, and you can think of not as just being one minus, which I do all the time outside of APL. And if you do that, then all of the other things come out quite naturally. Although I didn't know they're called de Morgan's laws. There you go. Okay, so, and I was not smart enough to paste in a list of the things we're covering. So let's do that. Is it in here somewhere? Yes. Okay. So we've done the exclamation mark. We've done the tax. We've done less than and greater than. We've done these. We've done this. We've done this, right? Yeah, we've done that. These we haven't. And this is just Josh, isn't it? Or is that Diamond? Can't quite tell. Yeah, it's Diamond. We've done that. Did we do Diamond? I thought so. It's just a statement separator. I think we've talked about it. I don't remember us putting it in a notebook anywhere. Okay. Where did we discuss how to create functions? Was that in the first one? Under that. There we go. Functions. Oh, well, we should put it here then. Okay. So anybody know how to type the Diamond? I think it's either the back, the two or three times or something, right? You're right. Double back tick. Ops. That's no good. Broken help. No, you gotta search for the name of what it does. Uh-huh. Which is? It doesn't even show up in my toolbar. Does it for you? It looks like a very small dot if you don't have a great font. No, you guys search for statement separator. You found it? I'm searching for statement separator in APL Wiki now. There's a page on it in the dialogue doc. I don't see it in the Wiki yet. Okay. What should I search for? It's called under, send the link here. Okay. The different section, the defined function section. Yeah, I found that it's in trad funds though, it seems like a weird place for it. We can find in APL Wiki. Because it's not just used in trad funds, but okay, maybe that's just where they haven't put it. All right, fine. You know what it is anyway. Oh, I see. Serata said we actually haven't done slope bar because it's a placeholder. Got it. That's easy fix too. Okay. Okay. We could say F is equal to two things. First, we're going to calculate A as that. And then a new statement. And then we're going to return two plus A. There we go. Make sense? Like I said, Nicole, I'm really. Oh, so it's always the statement on the right side that just returned. That's the last thing that evaluates is returned. Yeah. There are some like wrinkles, like there's something called guard expressions, which you can look up in the help. But yeah, basically it's like, you know a lot of languages do this thing. There isn't exactly a return. Right, so that's that. Rory Kemp says it's not the last thing. It's the first thing. I don't think that's right. We're returning the last thing. We're returning two plus A. A equals four times two, and then we do two plus A, and then that's what we return. Okay, so Rory's got one to try, which is slightly different to what we just discussed. We're gonna work it all. Okay, that's interesting. So these are different for some reason. Here we expected three words. Right, so in this case, it's definitely returning two plus. It's the first non-assignment, or Rory puts something in the chart. Oh, the first non-assignment or something like that. Right, so yeah, okay. First non-assignment, fine. Thanks, Rory. Lamp is a comet, which is like a comma. And then better do slope bar, I see. So we haven't quite got it all right here. So, and this is probably wrong too. Yeah, it's called scan. So we've got to fix this scan. Okay, I guess this is then scan first. Okay, so that's so good. Next, I think I want to do these ones. They seem to come up a lot. Notice I believe our back tick pound and back tick dollar sign. So I'm having some trouble hearing you, Isaac. Say again? The, I guess I was gonna say in the short piece for those are back tick pound and back tick dollar sign. Oh, pound. I can't get over the fact that you Americans call that character pound. It's the weirdest thing in the world. I know what you mean. What do you call it? I would call it sharp or opto thaw or hash. Pound is a pound sterling English currency character to my mind. Gotcha. But, you know, after spending 10 years in America, I can come to terms with the fact that you guys are all crazy, it's fine. Yeah, I wish I could argue with that. I don't know, the last three or four years, I got nothing, no comeback for that. Got too much for us. I'm sorry. There's plenty of nice things about it, though. You've seen nothing go. I love that it's called grade down and dietic grade down. That's pretty straightforward to remember. Okay. And the character's called grade down. Oh, okay. Grade down with, okay. Does anybody know what the hell this does? It will give you the index locations that would put that list in order, that array order. Oh, okay. Got it. So the weird thing is that they don't actually bother to do the sorting. So what's the character... If you... The slash to get the... To actually do the sorting to get these indexes. I think what's normally done is if you put your array into a variable, then you can just index into your array with the sort thing. Yeah, but how do you index into an array? What's the character for that? Are you doing brackets or the... Oh, square brackets? I don't know what I'm doing, but I believe, yeah. I thought there's some glyph or... Op arrow. I think you can... Op arrow does it because it creates a major axis. Sorry, what does it? Op arrow. I forget what it's called here. Take? Right, that one. So... Yeah, there's the... So op arrow, right. Under... Okay. And then also the... The squash quad, but you're the... Squat squad. So here's one way to do it. So, oh, it's actually doing it in reverse order. Okay. And you're saying another way to do it would be with up arrow. On the left, no, on the other side of A. So it will be... Right, that will create... No, up arrow A will create a column vector. And then we can apply a sort grade to it. I think I need to run that boxing thing. Up arrow A, right? Okay, go on. Right, that should create a column vector, right? Doesn't seem to. Now we have... Oh, boy, doesn't it? How do we create a column vector? Yeah, man. I need to revise. I know we've done it. I've forgotten. Isaac, did you have another way of doing it? I think you're saying something. I thought I did, but... So Rory put in the chat, there's a way to use... I guess I'm calling it the squash quad, but I don't know if that's what it's actually called. So you've got two sort idioms, one of which was the brackets, but then there's a second way. Oh, a little square, a little, yes, here, it's this one. Okay, we'll let it... That uses capital L. Materialize. Okay, well, let's learn this as well now then. Oops. Interestingly, and this turned me off for a while, is there's actually... I'm gonna copy and paste Rory's comment into the notebook while we're here too. I think back to L and back to capital L are slightly different, one that's the indexing and one that's the printing of the screen. Even though they look almost the same. Okay, it's called a squad, not a quad. Squad means materialize. If it's an array returns it, otherwise it doesn't last or a column or a dot net collection. Okay, so it converts object-oriented thing. It's basically the same as doing list parentheses in Python, you know, taking with an iterator. It's a bit... And that's exactly what we call it in Python, I guess you'd say we're materializing the iterator. Guess you're the items of that. All right, so maybe let's sort after these. Okay. Squad. One attic. Material. Dietic. Squad. Index. Which is exactly what we want, I assume. God knows how we're gonna explain materialize. Let's see what they do. Yeah, okay. This is a nice example though, working with Excel. So the works, works, work, work, sheets. Okay, so sheets is an object of this class, but squad is, gives you the items in the sheets. Okay. So I'm just gonna paste it. So the one we care about is index. So we've got a matrix. Okay, so two, three gives you row two, column three. All right. It's just indexing, right? And then... Smart of tools. It looks like if you enclose it, we will get multiple ones. Okay. So, row three. Okay. Okay, that's what I was expecting. So then if we enclose, no. Damn it. Inclose. V. V? Z. Z. Oh, okay. I was close. Okay. ZXCV are the... Shoes. No, it's not that. Oh, inside the parens. Wait, what? Really? Oh, of course. Oh, that's a quote, yeah, precedence. So that was the enclose assignment. Yeah, right, right, right, right, right, of course. Everybody knows that. Maybe this would be easier if they multiplied this by two, so we can see it's not just returning whatever I passed it. Great. So now we know the answer to our question. Did it work correctly when you multiplied by two? As I expected, it returned three and five. Oh, I redefined the... Find it, because I'm silly. There we go. Thank you. Okay, so now we can do this. And we know we can index into A with the enclosed grade down of A. And I've done that wrong. Oh, I forgot the squad. Enclose grade down and then use that to index into A. And now how do we do that with a neat tacit thing? Rory's version is a D-fun. This might be another of those cases where you kind of want the reverse order. But that's the D-fun, which is fine. So you want to pre-process with that and then on the left-hand side. Yeah, so if we did the... Okay, so if we did it the other way around, A and then the total diuresis. And then we shouldn't need the parentheses. Okay. And so it's actually... Oh, now we can do another till the diuresis and get rid of A on the left if you put parentheses around the whole thing. Yeah, I don't think it's going to be quite that easy because as soon as... Well... Because if till the diuresis doesn't have a left-hand side, it will put one for you. Yeah, but I don't think it's quite the same. Because when you do this because of precedence, this is now a train that's treated in a different way. So we've actually got to be careful to put some jots in here, oh, which is what Rory just said as well. So what we want to do is we want to do... First, we do that and we do enclose. Does this the right way around though? It is. There you go. Okay, which is definitely less nice. So we could say like sort is that. And then we could say sort A, look at us, a fancy. That's really fancy. Rory. Rory's got a better one. Oh my God. You don't need the parentheses? Well, I think that's interesting. Let's get rid of things. I really want to learn how to parse these things, but I just don't have a sense of how to parse them. That's something we might talk about on the forum is how on earth do you know how this is parsed? Rory, if you know a link to anything that kind of defines reasonably in some detail what these parsing rules are, that we could read them to understand why this works. That would be interesting. Okay, so Rory's got a nicer train here, which I will call train sort. So this is, okay. So this is the right-hand side. Okay, so this is function, function, function. So this is a fork. So this first applies to both arguments. This is applied to both arguments. So this is just the right-hand side. This is omega. This is, oh, now in a, oh, no, in a jot, this whole thing is done monetically. So this is squad applied to, oh, this is just squad applied to the pre-processed. So this is omega and grade down omega. And then, oh, I guess this all goes first actually because the operator happens first. So that's gonna be the same as this, I believe. Yes. Very convinced why the same is needed. What does that do? Yeah, so, okay. So this is a fork. A fork is a list of three verbs. An operator returns a verb. So we've got function operator function. So this is the dyadic version of the operator. There is only dyadic of this operator. It returns a function. Therefore, this is a function. And it's a function which encloses and then grades. Right, I'll give that. So it's kind of backwards to when we don't use jot. Oh, he's saying grades and then encloses. Oh, yeah, yeah, grades and then encloses. So it's the same as not with jot. Okay, grades and then encloses. So you go right to left. That's easier to read. Cool, good. Okay, I like that. Okay, so there's a function. So function, function, function. So when you have F, G, H, that's the same as, you know, being applied to alpha and omega. That's the same as, do they kind of write it like this in? I think it's what they do in Fiel, informally at least. That's the same as alpha, F, omega, G, alpha. H, omega. So we have, so enclose jot grade down is F. So we have F squared, same. Well, I mean, diatically, it's actually right-hand side. So F squared, right-hand side. So we're gonna get, we're gonna get F applied to, oh, and we're calling it monetically. So we just have this. Okay, so we've got grade down, then enclose, so omega, A, squad, identity, A. Each of omega is omega in this case, right? H of omega is omega in this case, because of the same. Yes, exactly. Cool, it's gonna take a while for this to become intuitive, but it's all good. Okay, and then you can do it with axes as well, but we're just learning all the bits, so we don't need to do that because it's not a new glyph. So hopefully, is there a way to sync the contents? Nope, apparently not, it's not very useful. Never mind if I say grade up, I think it'll do it. So presumably, this is exactly the same thing, but it's gonna effectively sort it. Oh, and wait, did we do the dietic? No. We have not yet, no. Obviously, Daisy. Well, I guess while we're here, let's do monadic grade up. Okay, I think that's enough for that one. Okay, provides collating sequence, collating sequence for character data. A, N, grade down banana, maybe APL Wiki. Okay, collation order, I see what they're saying. So I think they're saying order it in a way where A always comes before N for vice versa. So grade down, so if we said like this, so this is saying the first element is a capital B, is that right? And then the second element is an N and then an A and then A, oh sorry, capital B, N, N, A, A. So capital B doesn't mean Q in there, so it's not going to restart. Yeah, that makes sense. So it's saying, and remember this is sorting in reverse, right? So it's saying this is the order in which I want the letters to appear. So let's try to come up with maybe a better example, like A, B, C, D, E, F, G. Okay, so I want to sort C first and then F, then G and then F and then everything else. So to sort that, then I say A bracket B. For some reason I'm a bit offended by the bracket thing. I kind of like the squad thing, but never mind. Okay, fair enough. Okay, so now it has, and this is in reverse order, so it's got the C's last, then the G's, then the F's and then everything else has not been moved at all. So just for my own practice, sorted into, well, sorted, B is the sort order for, so I could just say A, is that right? A is sort by C, E. Do you have to enclose it? Okay, oh, which one needs to be enclosed again? Closure is, no, back in 47 we don't enclose. No, we do enclose it. Okay, that's right, yes, yes, yes. Squad expects an enclosed argument on the left or squad into, if you wanna call it that, would be on the right. Okay, cool. Sorry. Well, the other way we could just do it is on the right, right? Let's just do it here, sorry. Squad, okay, enclose, which is a shoe, which is this one. Should it be the other way? Should it? I think so. So A is the thing where indexing, indexed by enclosed B. So the examples they give in the docs, or is it the APL Wiki? And the APL Wiki are good because they're using things like quad A and that contains the alphabet. So that's saying to it in the alphabetical order. And we haven't done this yet, but I know it means mirror, flip, rotate, whatever. So this is A backwards. So this would be reverse alphabetical order. Okay, great. Let's do these, shall we? Okay, I think broadly speaking we call these rotates and transpose. Okay, this is called this percent. Oh, that's nice. It's next to it on the keyboard. I think all three of those are gonna be the percent, the up-care and the n-percent, so five, six, and seven. Very handy. Where do we define our matrix here somewhere? Here we are. All right, not much to talk about this one as far as I can see. Diatic, I see, rotate. Makes sense. Okay, so this is just taking, so might be easier if we do one at a time. So this will take the first element from the front and put it on the back. Oh, it's rotating them. It's like, if you imagine that they're in a circle, it's rotating them around one. So that's gonna be doing by three. This is going in the opposite direction, taking stuff off the end and putting it at the front. This is doing it for each row. And this is doing it by a different amount for each row. Oh, magic. I really wish they used broadcasting in APL with the same rules as NumPy. They make stuff like this so much, you know, more consistent. It did broadcast in 82, no? What's that? In 82, it did broadcast. In 82, did you say? Or 82, line 82 in your script. Oh, it always broadcasts scalars to rank anything arrays, but it doesn't, in any very general way, broadcast vectors to matrices, for example. So for example, I don't believe you can do this. No, very. You know, it's like it's consistent. Whereas in NumPy, there's a set of rules and they're also super flexible in terms of like how they work and any combination of ranks and you can permute, transpose, or add unit axes to get it to do exactly what you want. Whereas in APL, some of them kind of behave like this case, it's kind of doing it, broadcasting each element of the left to each row on the right. The next three has to be the right, the left-hand side has to be three numbers. Yeah, and it just depends. Like this, it works for this particular glyph, but not all glyphs. Like the fact that that doesn't work for plus, I don't understand why they do it that way. So the NumPy broadcasting rules, like there's only three of them and they're just fantastically flexible. And they also work in PyTorch and they also work in TensorFlow, et cetera. Probably chance. All right. So that one, maybe I'm missing something, I don't know. I think it's, I think in both cases, I think it's not really doing broadcasting. I mean, it's just applying the function or it seems like it's applying the function. Right, it's a special case of a function with a left-hand side, which is rank one and a right-hand side that's ranked two. You know, it behaves like broadcasting in this special case, exactly. Rory is an object and so you're probably right. I don't know. Okay. So then there's the one that goes the other direction, which I guess is carrot. Nope, probably ampersand. Yep. Okay. So the first version is like the bar version. Okay. Circle bar. Mind you, it was when I am through Rory, he might want to sleep. Circle bar. He doesn't like broadcasting and new access and stuff. It likes rank, but doesn't know enough about it and make the reasonable argument. My argument basically is that should work. The fact that it doesn't seem like a missed opportunity. Or alternatively, that should work. Like, well, you know, it should pick an access by default and just do it. You can do it with rank, but it just seems like totally unnecessary to force you to have a rank when you don't need one. Okay. Monetic circle bar. By the way, Rory, you don't need new access. You can just use none, which makes it a bit less sporty. Reverse first. So it's only going to make a difference in the matrix case. The thing is, I mean, NumPy and stuff, they don't have anything like insert or reduce, whatever you want to call slope and stuff. So like there's a huge missed opportunity there, which is reductions in NumPy are not very flexible. And there isn't a rank operator. So like the things where you want that, it's missing. I want something with both. Broadcasting, insert slash reduce and rank operator. I think I want APL, but with this kind of like, the rank operator should not be required in situations where NumPy's broadcasting rules could work. I think that's what I want. Okay. It has reduced. I mean, I just Google, I didn't know what. Well, it has a reduce. Right. But it's not nearly like it's, it's not as nearly as rich as reduce with a rank operator, you know. So yeah, it does apply to Ufunk along an axis. So that's, I mean, that's cool. One thing I'm not sure about is the performance stuff around reduce how well that works. But I think it's a lot less rich than, you know, scan and all that stuff with rank. Right. Okay. That's the same. That's what we'd expect. Okay. So I think the next one presumably is going to be transposed based on how it's spelled or how it looks. This is carrot called circle backslash. And it is just transpose. And there was a whole array cast episode about transpose, which Rory's getting excited about in the chat because there's dietic transpose. Although I'm not sure we're going to get quite as excited about it as cognitive because we're all very used to it because it's pronounced for mute in pytorch and we're very familiar with it. So, yeah, so transpose is, yeah, so as I say, there was two episodes on leading access theory and transpose, if I remember correctly, but for people in deep learning, they're extremely familiar because we do it all the time, you know, because in, if you've got a video of 3D reconstructions of multi-channel color data, you've got time, depth, x, y channel, put them in batches. You've got a six, a rank six, tensor. And so when you want to, you know, take the mean across, well, you can take the mean across an axis with an axis argument, but like if you want to do things flexibly, you use dot perm mute in pytorch to put the thing in the order you want so that you can then do everything on the trailing axis. Where else on APL, everything happens on the leading axis, which is fine. We're always asking about doing repeated axes. Okay, let's come to that. All right, so transpose, now the thing I can't quite remember from the chat is what happens when you transpose higher rank. So let's do that as well. And I know all the different array languages do things a little bit differently. So let's start with our matrix, cent, I don't know, parrot. Okay, stop pressing wrong button. Transpose. I really wish we had Python magic and APL kernel or APL magic in a Python kernel because then we could very easily mix and match, compare, you know, with Python, Py and whatever. I think something I've requested and Rodrigo, I believe, is working on. So that would be cool. That's pineapple, no. No, it doesn't have magics. Pineapple lets you evaluate a string. It would be actually pretty straightforward to turn it into a magic. Probably be only like three or four lines of code, I'm guessing. But he did say they're trying to, I don't think pineapples had a lot of love by the sounds of it. That's the way he kind of described it. So I think they're trying to make it a bit better. Okay, this is two by three by four. Actually, this is one we probably want to print out. Okay, so it's, okay, yeah, it's reversed all the axes. So transpose on a higher rank, just reverses the axes. Turns it from 234 to 432. So that's what monodic transpose does. And I believe dietic transpose just lets you say what order you want to put them in, which I think is, I think it's the same as dot permute in pytorch, except that you can repeat the axes, which I don't think we can do in pytorch as far as I know. I guess we could try it. Never tried it honestly. Yeah, I'm curious too. Okay, so let's make annoying warnings. Okay, so we'll create an array. One, two, three, four, five, six, seven, eight, nine. Okay. M dot permute, one comma two. Oops. Oh, not an APL anymore. Okay, that's transpose. No, okay. So can't repeat. So there's a difference. Although of course in, I guess to do that in pytorch, we would use unsum. So unsum can do exactly that. But I do, you know, this is another thing of like, okay, why haven't they made it more general? I guess nobody thought of it. So it'd be, I like it when things are more general rather than what's general. I think we should definitely look at, okay. Oh my goodness. All right. Rory's giving us things to try to confuse us. Let's do that. It'll be fun. So we can do, so to flip axes one and two, two, one, three transpose cube. I don't think we have to print it out. Let's just print out its shape. Okay, so that's what you'd expect. And then for the matrix, we can obviously just do a normal transpose. Now what if we do two, two? So what is that really doing when you've got a repeating the ith element x? It's a new position for the ith axis. Okay. So we need to probably look at some of these details a bit more to learn why that is spelled one, one diagonal. Rory wants us to try this one, which is trouble copying. Okay. So one, five, nine, 14, 18, 22. Oh, that's interesting. Question. If we don't understand what it does, do we need it? I don't think you can know if you need something until you know what it does. No, I know what the opposite is true also. I see. Right. So in the nth position, you can, the maximum you can have is n minus one. That's why we got the rank error. Does the documentation say what it does? Oh, no, it's not quite that. Oh, no, it's more confusing than I thought. All right. So the details of how rank duplicated elements of the left-hand side is something we can definitely experiment a little bit more. Sounds interesting. So probably worth printing this one out. Because it's a bit confusing. Yeah, I can kind of see how this is this. The API explains what it does when there's duplicates. Yeah. Yeah. I mean, the manual tells you all that. I'm not going to look at it in too much detail right now. That sounds fun. Yeah. Okay. Question mark. I feel like we could deal with in the first notebook actually. It's pretty fundamental because it's random number generation. And I shouldn't say basic math operators. I just say basic math functions because they're not operators. Okay. Roll. Oh, I hadn't noticed the non-integer version of a roll before. It's interesting. Okay. So it generates a random number between one and N for each N on the right-hand side. And it looks like zero might be a special case that creates gives you a bloat between zero and one. Yeah. Yeah. Okay. Okay. Different random number generators are available. Why is that not a link? Come on people. Okay. Okay. This is called deal. I know these because I've done them with Claire already. And so that's going to select 13 elements, 13 numbers between one and 52 without replacement. Cool. X random selections from Iota Y. So something which was fun to play with and I won't do it now is if you create a character vector containing A's two, three, four, et cetera, J, Q, K, and then another one containing the Unicode characters for each suit. You can then actually do your cards using this. That's the name. All right. It seems like a good time to stop. Thanks for joining the bonus session. Yeah, thanks for joining us. We're getting close to the end of the glass. Kevin's. I'm fun, but I'm. So after the glyphs, what are you planning to do? In terms of APR. I'll probably pause it for a while. Because I want to do some NB dev live coding. Okay. Yeah, if people can create some like, I think, like the best thing would be if folks could add pros to those notebooks after we're done and maybe create some good Anki decks. And then like, I feel like we'll have a community of people that understand all the APL glyphs and could start to build the next level of documentation on top of that or tutorials. I should say on top of that. I'm also interested in BQN. Something interesting about BQN is that. I think it's got a, you know, smaller meter. Implementation. Like because because APL is a full programming language. Do you say smaller one? Because APL is a full programming language, it's, it's, it's big, you know, it's got all this language is fine, but it's got all this dot net stuff and control flows stuff and, you know, it's kind of like a standard library of things and a web server and blah, blah, blah. So BQN is just, you know, just the notation and the implementation of that notation, which is a bit I'm more interested in. More than regular expression. Might be more suitable for this. Anyway, certainly be interesting to explore to like see how that feels. See the differences. Anyway, I don't have any particular plans. I'd never make plans. Honestly. Thanks again for doing all this. Thanks all. Bye. Bye.