WEBVTT
00:00:14.400 --> 00:00:19.280
Welcome to episode one hundred and twenty-three of Arraycast.
00:00:19.280 --> 00:00:27.039
I am your host, Connor, and today with us we have our only panelists, therefore promoted to co-host Adam.
00:00:27.039 --> 00:00:28.719
Introduce yourself briefly, Adam.
00:00:28.719 --> 00:00:30.559
I'm Adam Dlotzewski.
00:00:30.800 --> 00:00:32.640
I have a long history with APL.
00:00:32.640 --> 00:00:37.759
I currently work as head of language design and also doing a bunch of other stuff at Look Limited.
00:00:38.079 --> 00:00:42.719
And as mentioned before, my name's Connor, host of ArrayCast, massive fan of all the array languages.
00:00:42.719 --> 00:00:45.039
Excited for today's episode.
00:00:45.039 --> 00:00:47.119
And we do have, I think, two announcements from Adam.
00:00:47.119 --> 00:00:57.359
But before we get to that, I realized we should mention that we had a regularly scheduled array cast, this ArrayCast episode 123, that was going to be with Henry Rich.
00:00:57.359 --> 00:01:00.000
And I'm going to mispronounce uh his name.
00:01:00.000 --> 00:01:01.119
I believe it's Marcin.
00:01:01.119 --> 00:01:05.599
I'm going to avoid the last name because I one don't have it in front of me, and two, I'm going to butcher it.
00:01:05.599 --> 00:01:09.760
And they were going to be talking about the upcoming release of J9.7.
00:01:09.760 --> 00:01:15.680
And then typically in these episodes, the annual J release episodes, we talk about the beta, which would have been 9.8.
00:01:15.680 --> 00:01:24.400
That episode, if you are an astute viewer of the channel, you will have seen has been postponed until tentatively May 4th.
00:01:24.400 --> 00:01:27.519
So we've titled that Arraycast Episode 125.
00:01:27.519 --> 00:01:33.519
It was because I believe they wanted to put together some demos now that we have the live stream on YouTube.
00:01:33.519 --> 00:01:38.239
And so we were originally going to do it today, and it wasn't because they don't want to come on.
00:01:38.239 --> 00:01:39.359
They definitely still want to come on.
00:01:39.359 --> 00:01:41.200
They're just in preparation mode.
00:01:41.200 --> 00:01:47.120
So expect tentatively a month from now, we'll have both Henry on and Marcin on to talk about J9.7.
00:01:47.120 --> 00:01:54.079
So if you were looking forward to that episode, just put that hope on pause and we will do that interview in a month's time.
00:01:54.079 --> 00:02:00.560
So we're going to do a different episode today, which we, I guess, kind of chatted about last episode in Arraycast 122.
00:02:00.560 --> 00:02:04.959
But before we get to that, we've got two announcements, so we'll throw it over to Adam and we can do those first.
00:02:05.280 --> 00:02:05.519
Right.
00:02:05.519 --> 00:02:09.039
So there are two uh get togethers, real life, coming up.
00:02:09.039 --> 00:02:15.680
First, there is the APL Germany spring meeting in Mainz, sort of southwestern Germany.
00:02:15.680 --> 00:02:20.800
It is on the 20th to the 21st of April, so it's just coming up very soon.
00:02:20.800 --> 00:02:29.120
And immediately after that, the week after, is Dinah 26, so Dinah's dialogue's North American get together in New York City on the 27th.
00:02:29.120 --> 00:02:33.520
And the registration for that dialoges on the 17th.
00:02:33.520 --> 00:02:39.439
So if you're here during this live, then uh that's in 10 days.
00:02:40.159 --> 00:02:40.639
Awesome.
00:02:40.639 --> 00:02:49.199
And if you watch it anytime in the next 10 days, you'll still have time to figure out if you can make it, if you're local to New York, or if not, you're able to travel there.
00:02:49.199 --> 00:02:52.479
Links we'll try and put in the description slash show notes.
00:02:52.479 --> 00:02:55.360
And I don't think I have any announcements.
00:02:55.360 --> 00:02:58.080
I mean, technically, I'm working on a YouTube video.
00:02:58.080 --> 00:03:03.520
I tell you, with AI these days, my YouTube videos take way longer because I can realize I realize I can do way more.
00:03:03.520 --> 00:03:14.319
And there's been some interesting interactions between Elias, author of CAP online, and also Dima, implementer of CBQN.
00:03:14.319 --> 00:03:16.960
So, I mean, there's a GitHub repo.
00:03:16.960 --> 00:03:20.560
I'll find it and put it in the link of the the discussion.
00:03:20.560 --> 00:03:26.960
If people want to take a look, it's on the maximum odd binary, so M-O-B.
00:03:26.960 --> 00:03:31.039
And it's solvable very simply in three characters.
00:03:31.039 --> 00:03:33.120
A one rotate reverse sort.
00:03:33.120 --> 00:03:35.840
If you have the reverse sort primitive, that is.
00:03:35.840 --> 00:03:42.639
And anyways, there's gonna be it's almost gonna be like a YouTube talk, because it's gonna be such a long video.
00:03:42.639 --> 00:03:45.199
I'm thinking about even doing it live, but that's probably too much work.
00:03:45.199 --> 00:03:51.039
Anyways, if you follow me on the Blue Skies, Macedons or Twitters or any of those, you might have seen some of that interaction.
00:03:51.039 --> 00:04:00.000
But yeah, we'll uh look forward to that video coming out on this not this channel, this is the Arraycast channel, which I don't know, pop the uh the champagne and little confetis.
00:04:00.000 --> 00:04:02.080
We've we've crossed the 200 subscriber mark.
00:04:02.080 --> 00:04:04.080
We're a fifth of our way to the goal.
00:04:04.080 --> 00:04:10.240
I I see on the statistics we get about 800 within the first like month, 800 downloads.
00:04:10.240 --> 00:04:12.000
So we do have at least close to a thousand.
00:04:12.000 --> 00:04:14.960
So hopefully we can translate that into a thousand YouTube subscribers.
00:04:14.960 --> 00:04:20.480
Anyways, we're looking at on the screen what I'm calling the APL dojo.
00:04:20.480 --> 00:04:23.920
And this was we did talk about this in the last episode, right?
00:04:23.920 --> 00:04:37.360
It wasn't like a month ago, it was ArrayCast episode 122, I think, where there was this idea of concepts, primitives, expressions that exist in array languages, not specifically APL.
00:04:37.360 --> 00:04:42.639
I'm calling it APL dojo, but as you can see in the the bottom right here, I guess it's this is confusing.
00:04:42.639 --> 00:04:47.839
So I'm screen sharing on one monitor, but then I've also got the thing that I'm screen sharing on a different monitor.
00:04:47.839 --> 00:04:51.360
So I've got to look at this monitor, even though you know the screen share's here.
00:04:51.360 --> 00:04:54.000
And so you can see down here we've got six languages.
00:04:54.000 --> 00:04:57.279
I do feel really bad that I haven't added K to ArrayBox.
00:04:57.279 --> 00:05:06.079
The reason that K is not here is that anytime I build one of these AI scaffolded websites, I just have git submodule, the ArrayBox site.
00:05:06.079 --> 00:05:09.839
So it has all the syntax highlighting, the logos, the input methods.
00:05:09.839 --> 00:05:13.759
So it's actually pretty easy to spin up these little websites now.
00:05:13.759 --> 00:05:23.199
And the idea is that we are going to, if you've ever seen the tier lists on YouTube, usually it's S tier, then A, B, C, D, etc.
00:05:23.199 --> 00:05:27.439
And they'll do, like, you know, the tiered list of Pokemons, the tiered list.
00:05:27.439 --> 00:05:34.399
I just watched one the other day of all the different Harry Potter games in existence from the Lego Harry Potter to Hogwarts Legacy.
00:05:34.399 --> 00:05:37.120
And so usually they use like a rainbow of colors.
00:05:37.120 --> 00:05:42.160
I personally prefer the karate, like dojo black belt, white belt system.
00:05:42.160 --> 00:05:46.800
If you saw the last episode on YouTube, you will notice that we are missing a bunch of colors.
00:05:46.800 --> 00:05:50.079
I've omitted the yellow belt, the orange belt, a couple other belts.
00:05:50.079 --> 00:05:53.040
Mostly because one, we don't need that level of granularity.
00:05:53.040 --> 00:05:56.959
We don't need like 18 levels of, you know, levels or grades.
00:05:56.959 --> 00:05:58.959
And so I just pick my favorite colors.
00:05:58.959 --> 00:06:06.639
Obviously, white is beginner, black is expert, and then green, blue, and purple are the intermediate levels in between.
00:06:06.639 --> 00:06:12.319
And so now we just get to have fun for the next 90 minutes or two hours or however long this goes, and we can come back to this.
00:06:12.319 --> 00:06:14.959
You might think, oh, you didn't cover all the primitives, all the expressions.
00:06:14.959 --> 00:06:15.439
Of course not.
00:06:15.439 --> 00:06:16.879
We can't do that in 90 minutes, folks.
00:06:16.879 --> 00:06:19.120
But you know, we're calling this the APL dojo.
00:06:19.120 --> 00:06:27.600
Maybe we'll have the J Dojo where we're still gonna have the existing board, but then we can add primitives that are specific to certain languages.
00:06:27.600 --> 00:06:32.720
And hopefully at some point when I add NGNK6, um, we can come back and add those.
00:06:32.720 --> 00:06:38.959
Anyway, so thoughts from Adam first before we start throwing up primitives and expressions, questions, thoughts, or can we just hop into this?
00:06:38.959 --> 00:06:40.399
What do you what do you what do you think?
00:06:40.720 --> 00:06:41.920
Well, I mean, this looks promising.
00:06:41.920 --> 00:06:42.959
I don't know exactly how it works.
00:06:42.959 --> 00:06:43.839
I haven't seen that yet.
00:06:43.839 --> 00:06:44.800
I like the colors.
00:06:44.800 --> 00:06:49.680
They should be safe for people who have uh colorblindness or color vision deficiencies.
00:06:49.759 --> 00:06:51.199
So that's the way it's well we also have the text.
00:06:51.199 --> 00:06:54.399
I was I was that was I was thinking that we should they asked me, do you want to keep the text?
00:06:54.399 --> 00:06:58.079
And I was like, yes, yes, yes, because you know, just in case we've got colorblind.
00:06:58.079 --> 00:07:03.199
I don't know the full spectrum, but uh definitely you should hopefully be able to make all the black, purple, blue, green, white.
00:07:03.199 --> 00:07:06.959
And I guess, yeah, we should try to keep this audio friendly as much as possible.
00:07:06.959 --> 00:07:10.639
So the the way it works is we've got APL input.
00:07:10.639 --> 00:07:12.160
So we can start with IOTA.
00:07:12.160 --> 00:07:14.160
Well, actually, is this the website?
00:07:14.160 --> 00:07:16.079
I might have not prepared correctly, folks.
00:07:16.079 --> 00:07:17.279
We got an F11 out of this.
00:07:17.279 --> 00:07:19.279
This is the website we need to launch.
00:07:19.279 --> 00:07:21.279
Uh actually, I think it already is launched.
00:07:21.279 --> 00:07:22.480
So if we go into local website.
00:07:22.480 --> 00:07:31.600
So can can anybody go to that website and yes, anybody can go to this, but it's not gonna like save your stuff to the official website.
00:07:31.600 --> 00:07:34.720
And so the idea is this is the locally hosted one.
00:07:34.720 --> 00:07:38.560
And you can see actually, so let's get rid of this because we're gonna do this from scratch.
00:07:38.560 --> 00:07:56.480
Is that if we want to make changes on the fly, I have a cursor instance open and we can just say, like, I haven't I've tested this minimally, but you know, if we get to the point where we have, you know, a whole row's worth of blue cards or chips as the app likes to call it, is it gonna wrap and create like a second line?
00:07:56.480 --> 00:07:57.120
Probably not.
00:07:57.120 --> 00:08:00.399
My guess is that it's gonna create a horizontal scroll bar.
00:08:00.399 --> 00:08:05.120
I don't want a horizontal scroll bar, so we could quickly ask and say, hey, make this wrap onto a second line.
00:08:05.120 --> 00:08:11.120
We may or may not get there, but the point being is that this is local, so we can uh potentially you know make changes on the fly.
00:08:11.120 --> 00:08:15.759
Madeline in the chat is saying this is gonna be the most rage-inducing array cast episode ever.
00:08:15.759 --> 00:08:25.040
Well, I'm not sure if you mean because we're gonna be arguing over what category things go in, or because the audio listener is gonna have absolutely no idea what we're doing right now.
00:08:25.040 --> 00:08:33.679
But, anyways, if we want to add iota, we can you know type back tick i, we can name this because you pointed out Adam, it might be nice to have uh the name of this.
00:08:33.679 --> 00:08:34.879
You can choose the rank.
00:08:35.120 --> 00:08:37.600
So currently it's only probably called range, right?
00:08:37.600 --> 00:08:41.440
A range generator or index generator because iota is just a symbol name.
00:08:41.440 --> 00:08:42.720
Ah, well, so here's the thing.
00:08:42.799 --> 00:08:44.399
I'll put range in parentheses.
00:08:44.399 --> 00:08:57.039
I I have a soft place in my heart for IOTA, and it's you know, if we have a little bit of editorial control here, iOTA shall rename remain named IOTA as far as this app is concerned.
00:08:57.039 --> 00:09:01.600
But I do agree, range is the better name for this from like a non-emotional point of view.
00:09:01.679 --> 00:09:16.240
So we'll put range in parentheses, and we will actually uh Rubin Reg or Medelin has already sort of given names to all the primitives across all the various APL like languages in the omnibar.
00:09:16.240 --> 00:09:19.120
So shout out to that, and there's something we could pull on as well.
00:09:19.360 --> 00:09:21.200
Oh yeah, should we open up omnibar here?
00:09:21.200 --> 00:09:21.919
I think so.
00:09:21.919 --> 00:09:25.440
And then I can just tab through uh we go omnibar.
00:09:25.440 --> 00:09:26.799
I was just on it the other day.
00:09:26.799 --> 00:09:27.440
And so I can't.
00:09:31.919 --> 00:09:35.679
So if we search IOTA, or is it gonna is it gonna be Yeah, it's it found it.
00:09:35.679 --> 00:09:36.399
It found it, right?
00:09:36.399 --> 00:09:39.200
But it says it calls it index generator or range, right?
00:09:39.200 --> 00:09:40.399
Which is fine.
00:09:40.639 --> 00:09:45.200
Although, so how do you get it to Okay, so clearly I don't use this enough.
00:09:45.200 --> 00:09:52.000
So, like you know how in Google Translate you can search by the name and then click and it'll show you everything else with the same definition but a different name?
00:09:52.000 --> 00:09:53.279
Yeah, it doesn't do that.
00:09:53.279 --> 00:09:54.480
It doesn't do that here?
00:09:54.480 --> 00:09:57.279
Or am I just not showing BQN, show one hidden language?
00:09:57.279 --> 00:09:58.559
Yeah, there we go.
00:09:58.559 --> 00:09:59.440
That's what I was expecting.
00:09:59.440 --> 00:10:00.720
Oh, that's what he meant, okay.
00:10:00.720 --> 00:10:03.279
Is that I wanted to see the alternative glyphs.
00:10:03.279 --> 00:10:10.159
So a better example for this, if we go table, you know, this is one of the the most what's the word disagreeing.
00:10:10.159 --> 00:10:16.639
Yeah, yeah, like disagreeing, bifurcating, non-uniformly not so much named.
00:10:16.639 --> 00:10:33.039
Most languages either call this table or outer product, but in terms of the symbol, it's got uh bajillion symbols, which is uh it's nice from a kind of historical, you know, anthropological or archaeological point of view, but from a learnability point of view, it's it's kind of sad.
00:10:33.039 --> 00:10:34.639
I love this little table thing.
00:10:34.639 --> 00:10:36.159
And so, like, well, let's do that.
00:10:36.159 --> 00:10:39.519
Let's do iota and table as our our first two.
00:10:39.519 --> 00:10:48.799
And so if we go back to our little thing here, we'll just, you know, Adam mentioned that I should add rank because technically, you know, we've got different behaviors across ranks.
00:10:48.799 --> 00:10:50.799
So we just want our rank zero iota.
00:10:50.799 --> 00:10:57.360
This is a primitive, it's a monadic function, so we go create, and then we get this little thing, and then oh, except I messed it up.
00:10:57.360 --> 00:11:06.879
We want to go all because even though they've got different symbols, the the the Unicode character is not supposed to be representative of what the language chooses as a symbol.
00:11:06.879 --> 00:11:10.559
It's just uh look, there's a little bug there, but that should be fixed once we drop it.
00:11:10.559 --> 00:11:16.000
And so I would say that this is a beginner level primitive or concept.
00:11:16.000 --> 00:11:17.759
Then the question is is do you agree?
00:11:18.159 --> 00:11:29.679
Well, it depends a little bit on what kind of scale we are, because you could probably say that plus is even simpler in a way, but you could also say plus is more complicated depending on what kind of arguments you give it.
00:11:29.679 --> 00:11:36.000
And so do we do we even look at things like basic mathematics or do we just ignore that?
00:11:36.639 --> 00:11:45.679
Okay, well now we have to redo this because uh we've I mean, like I said, I minimally tested this, but now Iota, all, create.
00:11:45.679 --> 00:11:48.320
Okay, so there are the little language logos at the bottom.
00:11:48.320 --> 00:11:51.279
And then I should be yeah, when you click on it, it should give you an update.
00:11:51.279 --> 00:11:52.639
For some reason, it just didn't do that.
00:11:52.639 --> 00:11:56.000
So repeat what you just said, because I was a little bit concerned that this whole thing was gonna fall apart.
00:11:56.000 --> 00:11:58.960
You said are we defining this just for arithmetic?
00:11:59.279 --> 00:12:04.480
Like no, are we defining are we defining this for just for, should we say, interesting functions, right?
00:12:04.480 --> 00:12:07.279
That do sort of array manipulation generation things.
00:12:07.279 --> 00:12:13.200
Otherwise, there are certain structural functions or mathematical functions that are super, super simple, right?
00:12:13.200 --> 00:12:14.559
That are even simpler than this.
00:12:14.559 --> 00:12:22.879
So I agree that when I teach APL to somebody, then uh the index generator function comes in very early on, generally.
00:12:22.879 --> 00:12:26.320
But that doesn't mean that there aren't any other functions that are even simpler.
00:12:26.320 --> 00:12:34.559
For example, you could argue that the write tech, the right identity function, is the simplest function that is even theoretically possible.
00:12:34.559 --> 00:12:36.399
It takes an argument, returns it.
00:12:36.399 --> 00:12:37.279
Nothing done.
00:12:37.279 --> 00:12:38.559
There's nothing to understand.
00:12:38.559 --> 00:12:41.759
A lot of people have problems understanding it because it's too simple.
00:12:41.759 --> 00:12:43.679
They think it's gotta do something, but it doesn't.
00:12:44.000 --> 00:12:46.320
So yeah, I guess that's a good point to clarify.
00:12:46.320 --> 00:12:53.200
There's no uh or at least the design of this when I designed it, there's not supposed to be any kind of ordering of simplicity here.
00:12:53.200 --> 00:12:55.600
It's not like we're we're reaching for the simplest idea.
00:12:55.600 --> 00:12:58.960
We can do that if we want, but the order that these show up, and I'm not even actually sure.
00:12:58.960 --> 00:13:02.799
So I mean if you want to, you're calling this what is it, right tack?
00:13:02.799 --> 00:13:03.759
And what do we call this?
00:13:03.919 --> 00:13:04.399
Identity?
00:13:04.399 --> 00:13:06.080
Well, is monetic dadic?
00:13:06.080 --> 00:13:09.840
So monetic, yeah, monetic identity function or it's officially called same.
00:13:09.840 --> 00:13:11.919
I want to change that, but that's that's irrelevant.
00:13:11.919 --> 00:13:14.879
And like every everything is languages that have this.
00:13:14.879 --> 00:13:18.960
Well, maybe maybe not wewa, because maybe it might not make sense in Weewa, right?
00:13:19.120 --> 00:13:21.279
Uh I mean Wewa does have a monadic identity.
00:13:21.279 --> 00:13:25.279
Well, like they don't have a they don't have ambivalence, but they definitely do have identity in the the jot.
00:13:25.279 --> 00:13:27.279
So like I said, it it uses a different thing.
00:13:27.279 --> 00:13:30.320
So if we go create for this, we can drag it.
00:13:30.320 --> 00:13:33.279
And so, I mean, can we rearrange them?
00:13:33.279 --> 00:13:34.879
I mean, I it doesn't look like it.
00:13:34.879 --> 00:13:36.639
I mean, technically we could do this, right?
00:13:36.639 --> 00:13:38.559
Oh actually, what's going on here?
00:13:38.559 --> 00:13:41.440
Is it possible to get the tack on the left?
00:13:41.440 --> 00:13:43.759
There we go.
00:13:43.759 --> 00:13:44.399
What?
00:13:44.399 --> 00:13:44.720
Nope.
00:13:44.720 --> 00:13:45.600
It doesn't like it.
00:13:45.600 --> 00:13:46.320
It doesn't like it.
00:13:46.320 --> 00:13:53.679
So I don't know what what sorting is using here, but the point being is it's supposed to just be like the level of we would not have it, yeah.
00:13:54.399 --> 00:13:56.159
Or at least the concept of a density.
00:13:56.159 --> 00:13:57.200
So so that's the thing.
00:13:57.200 --> 00:13:58.480
What which one is simpler?
00:13:58.480 --> 00:14:07.840
A monetic identity function or a range generator, where you have to think about like inclusive start, exclusive start, and end, and index origin.
00:14:07.840 --> 00:14:13.919
There's a lot more to understand and know with a range generator than there is for an identity function, right?
00:14:14.320 --> 00:14:15.519
I would agree.
00:14:15.519 --> 00:14:26.240
But to be honest, like that's the thing, is your brain is always operating in like the most complex, fully formed version of like every primitive, which is something I've realized, right?
00:14:26.240 --> 00:14:33.200
Like if we if we go to uh array box, and you know, I I was just mentioning the the one rotate reverse sort.
00:14:33.200 --> 00:14:42.480
So if we go, I actually don't know how to type uh rotate now that I think about it, and then I think it's four or yeah, there we go.
00:14:42.480 --> 00:14:46.320
And that, and then we do this.
00:14:46.320 --> 00:14:50.159
Uh and so what was I about to show here?
00:14:50.159 --> 00:15:00.240
Oh, right, is that if if you click on this, you know, so it shows you do you want the monadic or dyadic definition of the function, and then it has the same concept of rank.
00:15:00.240 --> 00:15:07.279
And what I've realized too is that when you go to dyadic, you've got two arguments, so you have to consider the rank of two different arguments.
00:15:07.279 --> 00:15:21.279
And like I, to be honest, I just like I have never in my what's 2019, seven years-ish of array programming ever thought about like the rank of arguments when using a dyadic function.
00:15:21.279 --> 00:15:29.919
Like a lot of the dyadic functions are pervasive or scalar, so you don't need to think about it, unless if like you've got a vector and a matrix, and then you know what are you doing?
00:15:29.919 --> 00:15:33.840
But honestly, that's that's typically you've got a scalar and then some arbitrarily ranked array.
00:15:36.480 --> 00:15:45.360
Let's say, for example, something similar to what you've been doing lately, let's say you have a matrix of text lines and you want to center them or write justify them, something like that.
00:15:45.360 --> 00:15:48.000
So you want to do a separate rotate on every line.
00:15:48.000 --> 00:15:58.159
Now, in in or in languages that are leading axis originally, like J and BQN, there you would have to use the rank operator to do that.
00:15:58.159 --> 00:16:00.399
But APL traditionally is not like that.
00:16:00.399 --> 00:16:10.720
So therefore it defines vector left argument with matrix right argument on a last axis rotate to automatically pair up a rank zero, one.
00:16:10.720 --> 00:16:15.919
So every element on the left argument will rotate one row of the right argument.
00:16:15.919 --> 00:16:18.000
And similarly, you can use the first axis.
00:16:18.000 --> 00:16:21.440
It's not really first axis then, it's really column-wise, right?
00:16:21.440 --> 00:16:35.840
So then if if you do a the the circle horizontal bar rotate with a vector left argument and a matrix right argument, then it rotates the columns individually, which would be complicated to do in the other languages that are strictly first axis.
00:16:35.840 --> 00:16:42.559
You would have to transpose first and then do a a uh rotate rank zero, one, and then transpose back again.
00:16:42.799 --> 00:16:51.519
So there's a lot more nuance to this than I mean, how do let's take a little mini tangent in our we've we've barely even got two primitives up on the board, folks, and we're already in tangent land.
00:16:51.519 --> 00:17:10.480
I mean, what is your cause what is your thought on the complex because I've realized that like dyadic functions are so complicated, you know, in a certain sense, if you start to think about them in like the rank of both arguments, because like a lot of times when I'm working with these languages, I I like I say, I am thinking in rank one land or like rank zero land.
00:17:10.480 --> 00:17:17.920
Like when I think of the without glyph, I've never thought about a without on anything other than a rank one left and right argument.
00:17:17.920 --> 00:17:23.359
It's just like that's and maybe maybe uh without if you've got a rank zero, like just a scalar, yeah.
00:17:23.359 --> 00:17:24.720
Um like that that makes sense.
00:17:24.720 --> 00:17:29.039
But like I've never thought about it in matrix land or like you know, rank three plus land.
00:17:29.359 --> 00:17:35.279
It it it dial like it doesn't, but it should, and you know, you know, everything it does go by major cells.
00:17:35.279 --> 00:17:36.240
So that's another thing.
00:17:36.240 --> 00:17:45.519
That's the that's the that leading axis orientation thing where everything that applies to the individual elements of a vector really also apply to the major cells of any rank array.
00:17:45.519 --> 00:17:57.279
And then for the dyadic ones, then they have to have some ad hoc rules that sort of say, okay, we have to decide on on the rank of the major cells combined of the right and left argument.
00:17:57.279 --> 00:18:09.759
So, for example, for a lookup, you want to treat a higher rank array as in the lookup table, and then a lower one lower rank array under on what you're looking for, you would treat that as a single major cell of the higher rank ones.
00:18:09.759 --> 00:18:13.039
For example, you can look for a vector in a matrix, means you're looking for a row.
00:18:13.039 --> 00:18:16.640
If you're looking for a matrix in a matrix, you're looking for individual rows.
00:18:16.640 --> 00:18:21.680
But they are you can't just generalize it like that, and there are some complicated things.
00:18:21.680 --> 00:18:41.119
So J makes it very explicit in this documentation what the function rank is, and that means it defines a behavior on the smallest possible rank, and then if you uh and then if you give it arguments that have a higher rank than that, then it just runs a loop basically.
00:18:41.119 --> 00:18:45.759
It just applies to cells of that rank that the array can handle.
00:18:45.759 --> 00:18:51.599
So as an example of this is matrix division, matrix inversion operates on matrices, obviously.
00:18:51.599 --> 00:18:56.720
If you give it higher rank arrays, then we'll just go to the individual rank two cells.
00:18:56.720 --> 00:18:57.440
I see.
00:18:57.440 --> 00:18:59.680
So that's what function rank means in J.
00:18:59.759 --> 00:19:07.759
I've like I've it's come up a couple times, and I think I've every time I've either been confused silently or I vocally said, I've never really understood function rank in J.
00:19:07.759 --> 00:19:27.759
Function rank in Just is a is a primitive being assigned basically like and that's actually that's what I've done here a little bit, is that like you can see in the top right, I'm defining like what is the most common, you know, defined by me half the time when it was done explicitly, and then you know, Claude 4.6 Opus when it are the primitives I didn't look at.
00:19:27.759 --> 00:19:32.960
You know, so if you s if you add to this list IOTA, I don't I I think this is for, yeah.
00:19:32.960 --> 00:19:33.759
Oh, look at that.
00:19:33.759 --> 00:19:34.880
It calls it index generator.
00:19:34.880 --> 00:19:37.599
Like I said, the AI was responsible for getting all this stuff.
00:19:37.599 --> 00:19:46.880
But I made sure that it gave index generator like its most I don't know what you call it, the default rank or the function rank, but it's the one that you most commonly use in my experience.
00:19:46.880 --> 00:19:58.720
And and then if if you add like in in one of the ones when it was the I think mix and split, you know, mix is typically on a nested list, yeah, and then split is typically on a matrix.
00:19:58.720 --> 00:20:20.079
Like in my experience, I'm not saying that these are you know representative of all array language programmers everywhere, but when I'm building this tool for you know myself and then other people that want to use it, you end up with this kind of like, oh yeah, you know, some operations you know you use across ranks, but others you're typically reaching for a single rank, and I guess so that is what Jay has tried to do.
00:20:20.079 --> 00:20:22.720
They choose a rank and then they loop.
00:20:23.119 --> 00:20:38.319
Well, they I think I think at the time of definition of the primitive, they would have looked for the highest rank that they could have some kind of unique behavior and then set the rank there, and that's actually in a way sad because that prevents further extension in the future.
00:20:38.319 --> 00:20:41.359
So uh for example, with a matrix division, right?
00:20:41.359 --> 00:20:49.200
So dialogue APL, or I think all APLs supposedly, they don't have the rank two set for matrix inversion.
00:20:49.200 --> 00:20:52.319
If you try to invert something higher rank than that, it will just error.
00:20:52.319 --> 00:21:03.680
Maybe one day somebody will come up with some ingenious insight that will be the multidimensional or many many-dimensional equivalent of inversion, right?
00:21:03.680 --> 00:21:07.279
What something that is to a to a hyper matrix, right?
00:21:07.279 --> 00:21:11.200
A cube or higher, what inversion is to a matrix.
00:21:11.200 --> 00:21:18.799
And that that day that that happens, APL will just go, okay, well, we'll add that algorithm and the primitive is extended and all good.
00:21:18.799 --> 00:21:22.640
And J will go add another dot to the primitive, right?
00:21:22.640 --> 00:21:31.759
To make a new primitive, because the matrix division, matrix uh inversion primitive, is already defined to loop over rank two subarrays.
00:21:31.759 --> 00:21:33.119
And there's nothing you can do.
00:21:33.119 --> 00:21:38.720
You cannot use any sort of inverse rank operator to tell it to no, no, no, I don't want to look at rank two.
00:21:38.720 --> 00:21:40.880
Broaden your scope, look higher.
00:21:40.880 --> 00:21:41.680
You can't.
00:21:41.680 --> 00:21:43.039
So it's it's a gunner.
00:21:43.039 --> 00:21:44.559
It's it's fully defined.
00:21:44.559 --> 00:21:46.079
You can never again extend it.
00:21:46.079 --> 00:21:48.079
Yeah, interesting trade offs.
00:21:48.079 --> 00:21:53.039
So it saves you some rank operators that you don't have to explicitly loop over things.
00:21:53.039 --> 00:21:56.000
That might also make it a more obscure what's actually happening.
00:21:56.000 --> 00:21:57.599
That's the cost, of course.
00:21:57.599 --> 00:21:59.599
But then again, you can say that about arithmetic.
00:21:59.599 --> 00:22:01.680
Functions being scalar in nature, right?
00:22:01.680 --> 00:22:06.400
That not having a loop like you do in most languages makes it maybe more obscure what's happening.
00:22:06.400 --> 00:22:09.279
But on the other hand, you're able to extend things.
00:22:09.279 --> 00:22:15.599
So you could say like yeah, as an example of something that could happen, but obviously it didn't historically.
00:22:15.599 --> 00:22:24.559
You could mul you could define multiplication on scalars, and like nobody could think of what they would do on vectors, so we just define it as rank zero.
00:22:24.559 --> 00:22:28.559
And then somebody comes up with the idea of a vector multiply, right?
00:22:28.559 --> 00:22:30.079
The inner product thing.
00:22:30.079 --> 00:22:37.039
And and then you want to extend it, you can't, because you already overloaded it to all higher rank arrays by automatic looping.
00:22:37.039 --> 00:22:38.079
Uh, we don't want to do that.
00:22:38.079 --> 00:22:41.759
We experience has shown that that for for array programmers, that's not what we want.
00:22:41.759 --> 00:22:43.839
But that's the that's kind of concept that it could happen.
00:22:43.839 --> 00:22:44.880
Right, right.
00:22:45.279 --> 00:22:47.200
Okay, well, I mean yeah.
00:22:47.440 --> 00:22:53.599
There are cases where where this is where things are weird if you if you try to just extend them with rank.
00:22:53.599 --> 00:22:57.839
For example, you if let's say we now we're doing with the range generator, right?
00:22:57.839 --> 00:23:03.440
There are different ways you could extend the range generator to a long right argument.
00:23:03.440 --> 00:23:10.720
So the way dialogue does it, and I think most APLs do it, is that they say, okay, it generates the indices of an array of a certain shape.
00:23:10.720 --> 00:23:20.960
So if you say two by three, then you get a nested two by three array where every element has a vector, uh two-element vector, that is the enumeration of the indices of all those elements.
00:23:20.960 --> 00:23:25.119
Right, like exactly like what you're showing now, IOTA 2.3.
00:23:25.119 --> 00:23:27.119
J defines it differently.
00:23:27.119 --> 00:23:35.119
It defines it as filling a two by three array with the range of the product of the right argument.
00:23:35.119 --> 00:23:40.079
There is a there's a third definition you could have done, and then you could say, oh, range.
00:23:40.079 --> 00:23:51.920
I imagine if they had back in flat APL land when there was no nested arrays, if they had thought, hmm, there it doesn't make any sense to do the range of more than one number, so we'll just define it as rank zero.
00:23:51.920 --> 00:23:59.119
That would mean that if you do the range of two, three, you'd get uh a a uh rank two array.
00:23:59.119 --> 00:24:05.359
The first uh row is uh the range of two and the second one range of three, but that means it has to pad it.
00:24:05.359 --> 00:24:12.160
Yeah, so if you do if you uh range rank zero here, no not each, it has to be rank zero.
00:24:12.160 --> 00:24:17.599
So just uh citation zero and you have to put a right square bracket to separate the strand.
00:24:17.599 --> 00:24:28.079
So then you would get this result where the first row of so this is range rank zero on the array two three is zero, one, zero in the first row and then zero one two, right?
00:24:28.079 --> 00:24:33.200
And they might have said, okay, you know, it's maybe not the most useful, maybe sometimes you want this, and it's fine, and just pad with zeros.
00:24:33.200 --> 00:24:35.519
Maybe it's good for like making triangles and things.
00:24:35.519 --> 00:24:40.960
This would allow you, for example, if you now write instead of two three, if you write iota five or i.
00:24:40.960 --> 00:24:46.880
Maybe that would be useful.
00:24:46.880 --> 00:24:50.079
And then somebody comes and says, Hey, no, we could we could do this instead.
00:24:50.079 --> 00:25:01.039
We could make it fill a two by three array with the numbers from zero to six or two five, or in the APL land, you say, Oh, we could make it nested because now we invented nested arrays, it's too bad ship is shelled.
00:25:01.039 --> 00:25:03.839
Anyway, that's there's a tangent a bit.
00:25:03.839 --> 00:25:20.079
You're absolutely right that when we can't just make a list of perimeters because the pairing of left and right rank, or even left and right nesting level, and and in monetic form as well, and nesting level and rank and so on.
00:25:20.079 --> 00:25:25.680
Sometimes even type, like in K, you get in Q land you have like type overloads as well.
00:25:25.920 --> 00:25:26.160
Yeah, yeah.
00:25:26.160 --> 00:25:41.920
This is what we were I was just talking uh with Madeline, who's also in the chat right now, on the last tacit talk, is this realization that we you know we always hear about rank polymorphism in array languages, but you never explicitly hear about ad hoc polymorphism.
00:25:41.920 --> 00:25:43.920
And on top of that, like there's multiple kinds.
00:25:43.920 --> 00:25:47.759
You're overloading on the rank of your argument.
00:25:48.319 --> 00:25:53.440
Type polymorphism, type polymorphism, even value polymorphism, I would say.
00:25:53.440 --> 00:26:02.079
So if you go to to say dialogue APL and you do question mark five, you get a uh a random number from between one and five.
00:26:02.079 --> 00:26:06.319
But if you change and and any any positive integer there will give you that same sort of result.
00:26:06.319 --> 00:26:10.240
But if you change the to a zero instead, it's actually a different function.
00:26:10.240 --> 00:26:21.839
It's actually it doesn't generate a and value in the range from of the first zero natural numbers, rather it gives you a float between zero and one, which is actually something completely different.
00:26:21.839 --> 00:26:23.839
So that's type overloading, right?
00:26:23.839 --> 00:26:27.680
There's no rank polymorphism here that's different between those two cases.
00:26:27.680 --> 00:26:29.680
There's no depth polymorphism that's different.
00:26:29.680 --> 00:26:48.160
An example of the depth making a difference is I believe in the in the from or select or whatever it's called function in j, then you you for every dimension you can give it a list of the uh the indices along that dimension that you want to to pick out.
00:26:48.160 --> 00:26:57.279
But if you enclose that one of those elements, it means all the those enumerations along that dimension except these.
00:26:57.279 --> 00:27:03.039
So the depth, you just adding an enclose, changing the functionality completely.
00:27:03.039 --> 00:27:06.799
So to being instead of select these, it means deselect these.
00:27:06.799 --> 00:27:08.480
So what do you call that?
00:27:08.480 --> 00:27:10.480
That's depth of it.
00:27:10.720 --> 00:27:14.240
Definitely it's a type of ad hoc polymorphism, but yeah, it's sure.
00:27:14.240 --> 00:27:16.079
But then you could call anything ad hoc polymorphism.
00:27:16.079 --> 00:27:19.599
I mean that's that's the thing is ad hoc polymorphism is is ad hoc, right?
00:27:19.599 --> 00:27:27.200
It's it's when you define separate behaviors based on different things, number of arguments, type of the arguments, depth of the arguments.
00:27:27.200 --> 00:27:33.680
That's I mean, that's why it's called ad hoc, because it's just kind of like ah, like we could we could inject different behavior in here based on something, right?
00:27:34.000 --> 00:27:43.680
And if you go with with uh an APL2, then the slash is either replicate or reduce, and it's always an operator.
00:27:43.680 --> 00:27:49.839
And the type of the operand, it's a monetic operator, the type of the operand determines the functionality.
00:27:49.839 --> 00:27:52.079
What what is that then?
00:27:52.079 --> 00:27:56.000
Type overloading, two different primitives, is the same primitive?
00:27:56.000 --> 00:27:59.759
And and you really have that as well in in some dialogue operators, right?
00:27:59.759 --> 00:28:15.119
The the the power operator, the the asterisk with two dots on top, if you give it a function right operand, then it means until, until that function returns true when evaluated with the arguments of the previous and the current iteration.
00:28:15.119 --> 00:28:23.279
If you give it a value and an array, which has to be a type scalar number, then it repeats, right?
00:28:23.279 --> 00:28:26.880
So it's repeat and until which are related concepts but definitely not the same.
00:28:26.880 --> 00:28:33.440
Repeat is is a is a fixed bound, and until is could run forever, we don't know.
00:28:33.440 --> 00:28:37.920
So here again, it's the it's the type of the upper end.
00:28:37.920 --> 00:28:46.880
So if you go back to the dojo, things are things will go get a lot more complicated if you don't have nearly enough selectors on the right.
00:28:46.880 --> 00:28:50.240
Because what what what if you want to do something like reduce?
00:28:50.240 --> 00:28:52.640
So let's try.
00:28:53.200 --> 00:28:57.440
First of all, so which one this is not so this is uh a one monitor.
00:28:58.640 --> 00:28:58.799
Okay.
00:28:58.799 --> 00:29:02.880
So we lose our ranks, which is Yeah, but but hold on.
00:29:02.880 --> 00:29:13.599
So which which derived function in in APL, dialogue APL at least, the diadic derived function is windowed reduce, but the monetic derived function is just normal reduce.
00:29:13.599 --> 00:29:19.200
But you if you try to select monetic dyadic function up here, then you lose the selection of the one modifier.
00:29:19.200 --> 00:29:20.720
Those are not exclusive.
00:29:20.720 --> 00:29:25.599
Well, if I do it's not an expression either, it's a derived function.
00:29:25.599 --> 00:29:27.119
So you need to use the.
00:29:27.279 --> 00:29:34.960
I mean, but you can technically if we call it an expression, I can choose you know this to have just the reduced meaning.
00:29:34.960 --> 00:30:01.680
We choose it as APL, and we choose all of this, and when we create this, this will basically it'll syntax highlight it as I mean, so technically this is you know, so I guess actually what we should what the real thing to do is if we get rid of this, we we want a primitive and we want to be able to select one modifier, but when you select one or two modifiers, it should give you the option to say what you want function.
00:30:01.680 --> 00:30:04.000
Uh yeah, yeah, the area.
00:30:04.400 --> 00:30:07.039
Or ambivalent, because sometimes it's nice to treat them together.
00:30:07.039 --> 00:30:13.119
For example, we for the dojo here, we might want like functions derived from key or anything derived from key, right?
00:30:13.119 --> 00:30:25.440
That might be you want to want to treat that separately, but sometimes you would you would want to treat both the monetic and daddy form, things like constructs with ad or something, where it doesn't really matter if it's monetic daddy, the the the power operator and so on.
00:30:25.440 --> 00:30:28.720
There it's not important, so you should be able to leave that out.
00:30:28.720 --> 00:30:44.160
But what you could do here is some actually internally in dialogue and in APL2 as well, I think the other APLs, if you ask the system for the attributes of a of an entity you have, then it will tell you the valence.
00:30:44.160 --> 00:30:46.880
So, and that's also something that's missing over here.
00:30:46.880 --> 00:30:52.559
You you have you have subtype, you've written monadic function, daddy function, but there's also in principle niladic, right?
00:30:52.559 --> 00:30:54.559
So, for example, zilda, right?
00:30:54.559 --> 00:31:01.359
That's a sort of a niladic function, returns a constant value if you want, or you could see it as an actual array, that's up to you.
00:31:01.359 --> 00:31:15.680
So so we we use numbers, and you can query these numbers for any given name, and say what is the function valence, and that could be zero, one, or two, and it can be ambivalent, which is designated minus two, but it's just some number that you can refer to.
00:31:15.680 --> 00:31:22.000
And then there is the what is the operator valence, and that's also zero, one, or two, where zero means not an operator.
00:31:22.000 --> 00:31:26.799
One means you're right, one modifier, two means a two modifier, or monetic that it could operate.
00:31:26.799 --> 00:31:38.240
So those two numbers, the function valence and the operator valence, those completely describe the the syntactic role of any given thing.
00:31:38.960 --> 00:31:41.119
Are you saying, well, I got a little bit confused.
00:31:41.119 --> 00:31:52.799
Are you saying that because uh one modifiers don't have the ability to accept different airity or in your parlance valence functions, right?
00:31:52.799 --> 00:31:54.400
Like a reduction change.
00:31:54.880 --> 00:31:56.480
True, but that's not the that's not the point.
00:31:56.480 --> 00:32:06.880
It's the the the the function valence of an of some of a construct using in an operator would be referring to the derived function.
00:32:06.880 --> 00:32:08.480
So for example, plus slash.
00:32:08.880 --> 00:32:09.519
Oh, I see.
00:32:09.519 --> 00:32:12.319
What you meant there was not the argument, it was the derived function.
00:32:12.319 --> 00:32:13.039
Yeah, okay.
00:32:13.200 --> 00:32:13.920
Yeah, the derived function.
00:32:13.920 --> 00:32:15.359
I mean, definitely we should add that.
00:32:15.519 --> 00:32:19.680
So let's let's go which one of my cursor implementations.
00:32:20.240 --> 00:32:28.000
Okay, so if we say for the one modifier and two modifier, you just need to split that, right?
00:32:28.160 --> 00:32:34.319
So the subtype that we have here, there should just be three options for each row, and there should be not one radio button group, should be two groups.
00:32:35.119 --> 00:32:47.599
Oh, you're saying don't have a new section that is enabled by click because I was thinking if you click either one modifier or two modifier, it'll pop up a news section that says like derived airity.
00:32:48.000 --> 00:32:50.240
I mean, you're saying just have like a reason for that.
00:32:50.240 --> 00:32:58.720
Yeah, just instead of a stop type, you have one that's called function valence, that which and and then a new section called operator valence, right?
00:32:58.720 --> 00:33:02.240
And then the first option in operator valence is not an operator, right?
00:33:02.240 --> 00:33:04.160
On an A or whatever you want to call it.
00:33:04.319 --> 00:33:13.119
And the first the first option under function valence is a idea better because the having to click uh not applicable is anyway.
00:33:13.200 --> 00:33:14.960
So that can be the default, right?
00:33:14.960 --> 00:33:16.720
It will just be zero.
00:33:17.119 --> 00:33:22.160
Add a section called what do we want to call it?
00:33:22.400 --> 00:33:23.680
Derived function.
00:33:23.920 --> 00:33:26.400
Yeah, derived valence or derived function.
00:33:26.559 --> 00:33:27.680
Should I switch to valence?
00:33:27.680 --> 00:33:37.039
I mean, I I like erity, even though I prefer monadic and dyadic, and I know erity goes with unary and binary, and valence goes with dyadic and monadic, but I I don't know.
00:33:37.039 --> 00:33:43.920
I guess if you if you're if you're listening to episode 123 of a ray cast, you probably are able to interchange between the and valence.
00:33:44.240 --> 00:33:47.039
I think Marshall had a very good point in like keep simple language.
00:33:47.039 --> 00:33:49.200
Just you call it a one modifier, two modifier.
00:33:49.200 --> 00:33:54.799
Why not instead of subtype monadic function, diadic function, you just say one arc, one argument, two argument, right?
00:33:54.799 --> 00:33:56.720
And then one modifier two modifier.
00:33:56.720 --> 00:33:57.759
That's all it means.
00:33:57.759 --> 00:34:06.079
And then zero argument zero argument means it doesn't, it's something that's like zilda or hash or those things, null or just numbers.
00:34:07.839 --> 00:34:09.679
Why use monadic and diet?
00:34:09.679 --> 00:34:23.519
I guess because one argument and two argument to my ear sounds like the this is the incorrect word, but the the word that popped into my head was like Neanderthal is like it is you're describing it to understand.
00:34:23.519 --> 00:34:39.440
Yeah, you're describing something in simpler vocabulary, but something that has a specific a word that was specifically designed for it, and it's it's kind of like Trumpy, you know, like Trump says we've got big, beautiful books, you know, and it's he says one-syllable words to make it understandable to more people.
00:34:39.440 --> 00:34:43.760
But it's like, well, there is a word for that that we have called unary binary monadic dyadic.
00:34:43.920 --> 00:34:54.159
Um but I guess why I started doing this in the in the appeal challenge that we have going, where I've started simplifying the way we describe things, both the la the names for things.
00:34:54.159 --> 00:35:06.079
Like we use we experts like using long, complicated sounding words to make them sound more intelligent or or more educated than the masses, even though it's just simple concepts.
00:35:06.400 --> 00:35:07.360
Yeah, that's true.
00:35:07.360 --> 00:35:09.039
I mean there's pros and cons, right?
00:35:09.039 --> 00:35:29.760
One argument, like I definitely when I'm giving talks, and ever I whenever I first say the words unary and binary or monadic and dyadic, I always add a little explainer like FYI, and sometimes I'll even show the Wikipedia table of the Greek words and the Latin words for unary, binary, ternary, quaternary, and monadic, dyadic, tetradic, and quadratic.
00:35:29.760 --> 00:35:32.639
And then people probably go, oh, okay, yeah, that makes sense.
00:35:32.639 --> 00:35:39.519
Because I definitely remember being confused the first time I heard the word binary and didn't realize they were talking about aridity or valence.
00:35:39.519 --> 00:35:45.280
But anyways, let's uh we'll put the maybe maybe I'll rename this stuff, but let's uh I'm I'm still halfway writing the prompts.
00:35:45.280 --> 00:35:52.719
Add a border with the color for the modifiers similar to uh expression.
00:35:52.719 --> 00:35:57.119
I didn't really explain this well, so I mean if the AI understands what I want, that'll be very impressive.
00:35:57.119 --> 00:35:58.880
It will understand something.
00:35:58.880 --> 00:36:02.719
Uh well that's I I mean it'll understand something, but it will it understand what I wanted?
00:36:02.719 --> 00:36:03.360
Maybe maybe not.
00:36:03.360 --> 00:36:10.880
So what I'm hoping is that there'll be a new section called derived function erity, and then it only shows up if one or two modifiers selected.
00:36:10.880 --> 00:36:17.920
And then so if you currently, if you add a slash and we call this reduce.
00:36:17.920 --> 00:36:26.079
And so technically we're we're talking about the monadic derived case here, which I believe all the languages have.
00:36:26.079 --> 00:36:32.079
The dyadic derived differs, but if we do this, it should create me a yellow.
00:36:32.079 --> 00:36:34.400
And and note here at the bottom, I haven't mentioned this.
00:36:34.400 --> 00:36:45.119
So I'm using the Weewa syntax highlighting, which is differentiates between monadic and dyadic functions, which we can do in wiwa because we have no ambivalence.
00:36:45.119 --> 00:36:45.920
We've got fixed area.
00:36:46.639 --> 00:36:48.159
That's good, that's good for this purpose here.
00:36:48.159 --> 00:36:52.239
Yeah, I do that in AppleCard as well, differentiating entirely between monadic daddy functions.
00:36:52.960 --> 00:37:02.639
I do give the option though underneath, because people are gonna get confused if they start seeing, because technically a one modifier in most of the array languages is syntax highlighted green.
00:37:02.639 --> 00:37:08.880
So if you want, you can switch and then make all the functions blue, actually, just so people don't get confused.
00:37:08.880 --> 00:37:11.119
And what should this be?
00:37:11.119 --> 00:37:12.159
A green?
00:37:12.159 --> 00:37:13.199
Blue?
00:37:13.519 --> 00:37:14.239
Reduce?
00:37:14.239 --> 00:37:15.760
I mean, again, it depends.
00:37:15.760 --> 00:37:23.119
The in the basic form where the where the where the upper end is a scalar function, then it's yeah, green is fine.
00:37:23.119 --> 00:37:28.800
But if the if the upper end is not a scalar function, then it's interesting.
00:37:28.800 --> 00:37:30.800
And I would even say you could even go further.
00:37:30.800 --> 00:37:32.000
What kind of reduce?
00:37:32.000 --> 00:37:34.960
Plus reduce, times reduce, sure.
00:37:34.960 --> 00:37:36.159
Those are very simple.
00:37:36.159 --> 00:37:37.119
Everybody gets those.
00:37:37.119 --> 00:37:40.480
Maybe those are even white, even if they have a bit of special syntax.
00:37:40.480 --> 00:37:45.679
But unequal reduce, which is an which is an XR checksum.
00:37:45.679 --> 00:37:47.519
Maybe not.
00:37:47.519 --> 00:37:51.360
What about left tag and right tag reduce that selects the first and the last elements?
00:37:51.360 --> 00:37:52.719
Are they as simple?
00:37:52.719 --> 00:37:55.679
And then you have things like custom function reduce.
00:37:55.679 --> 00:37:56.719
I do that sometimes.
00:37:56.719 --> 00:38:03.599
We want to run the same function on the original data and then with varying left arguments.
00:38:03.599 --> 00:38:10.159
So you take all the left arguments, concatenate them to the enclosed of the original data, and then apply reduce with some giant custom function.
00:38:10.159 --> 00:38:11.840
That's a whole different technique.
00:38:12.079 --> 00:38:14.320
Alright, let's let's pause you there because this is fantastic.
00:38:14.320 --> 00:38:15.920
This is f this is what I'm talking about, folks.
00:38:15.920 --> 00:38:17.920
This is what the APL dojo is all about.
00:38:17.920 --> 00:38:21.360
Well, first of all, we're gonna hit F5, see if the AI did what we wanted.
00:38:21.360 --> 00:38:22.480
We're gonna hit this.
00:38:23.119 --> 00:38:28.719
It doesn't seem to Well, what if we uh Did you reload it?
00:38:28.719 --> 00:38:31.039
I did reload it.
00:38:31.039 --> 00:38:35.440
I don't want to hit control F5 because that could potentially relate my memory release.
00:38:35.679 --> 00:38:40.639
But if we Th there's another thing that's missing here, I think, is the type.
00:38:40.639 --> 00:38:45.119
You've got primitive expression concept, and I would also add technique as another one.
00:38:45.119 --> 00:38:47.760
That's neither really an expression nor is the concept.
00:38:47.760 --> 00:39:00.480
But but as we'll get to eventually on the black belt is is dual-wielding uh rank operator with with two different ranks for the left and right argument.
00:39:00.480 --> 00:39:05.039
Uh that's a technique, it's not an expression, it's not a primitive, it's not a concept.
00:39:05.039 --> 00:39:08.239
Alright, we'll add the technique for next time.
00:39:08.480 --> 00:39:13.760
So the the AI, I think we can start a new podcast, the APL Dojo podcast.
00:39:13.760 --> 00:39:15.280
This is all we do.
00:39:15.519 --> 00:39:16.559
This is all we do.
00:39:18.079 --> 00:39:29.920
Well, so actually, while we're waiting for the AI to fix what it failed to do, let's add the not equal to because I actually had this as one of the expressions when I was sending you screenshots.
00:39:29.920 --> 00:39:31.679
So this is an expression.
00:39:31.679 --> 00:39:34.239
It is a monetic It's not an expression.
00:39:34.239 --> 00:39:36.079
It's I mean you could I guess you could call it an expression.
00:39:37.440 --> 00:39:37.920
Yeah, okay.
00:39:37.920 --> 00:39:38.880
Yeah, it's an expression.
00:39:39.440 --> 00:39:46.159
Anything that's more than a primitive but less than something that needs to be described by words, and then we can highlight it as APL.
00:39:46.159 --> 00:39:49.280
Do all of the I think all the languages have it.
00:39:49.280 --> 00:39:52.880
So we go create, and so this one you can see has a gray background.
00:39:52.880 --> 00:39:54.400
And what is this?
00:39:54.400 --> 00:39:55.599
Is this blue?
00:39:55.599 --> 00:39:56.079
Purple?
00:39:56.079 --> 00:39:59.679
I don't think it's black belt, but it's no, not more than blue, I would say.
00:39:59.840 --> 00:40:01.119
All right, it's not that hard to understand.
00:40:01.119 --> 00:40:04.320
And so you can see also the the scan equivalent, right?
00:40:04.880 --> 00:40:05.840
That one's more interesting.
00:40:05.840 --> 00:40:07.679
Actually, that's the one that I was thinking about.
00:40:07.679 --> 00:40:08.639
That's what I was thinking about.
00:40:08.639 --> 00:40:09.920
So let's add that one as well.
00:40:09.920 --> 00:40:12.159
And actually, wait, we the AI sets it's done.
00:40:12.159 --> 00:40:14.079
Let's hit F5 and see what happens.
00:40:14.079 --> 00:40:15.360
So now we go here.
00:40:15.360 --> 00:40:16.480
What is going on here?
00:40:16.480 --> 00:40:22.079
It says I mean it's so sad, you know, you spend so much time working with these tools and it does everything perfectly.
00:40:22.480 --> 00:40:25.360
I think we might be running out of belts very soon.
00:40:25.360 --> 00:40:32.800
Because I think we'll be able to identify things that are definitely easier than one of them but harder than another one, and fits in between.
00:40:32.800 --> 00:40:43.039
Madeline wrote in the chat that she thinks a reasonable split is associative scalar or scalar or other on and then on vector or higher rank.
00:40:43.039 --> 00:40:49.039
And that's probably especially like reduced first would be higher difficult than different than higher rank.
00:40:49.039 --> 00:40:50.960
So so yeah, think about it.
00:40:50.960 --> 00:40:55.199
Where would you put plus slash like monetic plus slash, the sum?
00:40:55.199 --> 00:40:56.880
On on green, right?
00:40:57.119 --> 00:41:14.239
Yeah, I mean I would say, I would say, and that's the that's the tricky part, is when you were breaking down all the different reduces, is that there are more complicated reduces like the not equal to reduce and you know the left tack, right tack, and the custom ones, and the non-scalar ones.
00:41:14.239 --> 00:41:20.159
But like when I when I see just the reduce, in my mind it kind of categorizes it as like the simplest version.
00:41:20.159 --> 00:41:24.079
So like plus reduce fits in here, multiplication reduce fits in here, you know.
00:41:24.400 --> 00:41:25.679
But it stops there, right?
00:41:25.679 --> 00:41:30.320
Because as soon as you go to minus reduce, things get real fun, right?
00:41:30.320 --> 00:41:32.079
Because that's an alternating sum.
00:41:32.079 --> 00:41:32.960
And division.
00:41:33.440 --> 00:41:39.679
It depends on your implementation, only APL has alternating, and then other ones do not, right?
00:41:39.679 --> 00:41:40.320
BK.
00:41:41.039 --> 00:41:50.239
So so the so the so the plus slash in in APL is different from the plus, well, the tiny little and that's and that's why we've got the languages.
00:41:50.320 --> 00:41:53.280
So when what as soon as it's different, you start tagging them.
00:41:53.280 --> 00:41:57.920
But like uh honestly, like that's that's the problem, is that in my mind you do all right, let's hit F5 again.
00:41:57.920 --> 00:41:59.440
I sent them a screenshot.
00:41:59.519 --> 00:42:01.039
So what happened?
00:42:01.039 --> 00:42:02.400
I mean, what's going on here?
00:42:02.559 --> 00:42:03.440
It's not different.
00:42:03.679 --> 00:42:05.440
Should I risk hitting control F5?
00:42:05.760 --> 00:42:07.119
You're gonna lose all your data.
00:42:07.119 --> 00:42:07.920
Well, it didn't lose.
00:42:07.920 --> 00:42:09.679
How does it go?
00:42:09.679 --> 00:42:10.079
There we go.
00:42:10.159 --> 00:42:12.159
It was it was uh it was a hard refresh problem.
00:42:12.159 --> 00:42:18.639
So now this is monadic, and if I update it, now it shows that this.
00:42:18.639 --> 00:42:23.039
And so technically, nice if we want, we can do what you were talking about earlier.
00:42:23.039 --> 00:42:28.239
And so for this, which so BQN doesn't have so I'm thinking about the n-wise reduction.
00:42:28.239 --> 00:42:30.800
So J but see there's a difference as well.
00:42:30.800 --> 00:42:32.079
Uh here's a value difference.
00:42:32.079 --> 00:42:33.199
There's always a difference, man.
00:42:33.199 --> 00:42:38.400
That's the problem, is you're operating up here, and I'm just like, let's just add this, and you're like, no, no, no, there's six different things.
00:42:38.880 --> 00:42:44.639
Connor, if you do a two-wise unequal reduce, that is a very simple concept.
00:42:44.639 --> 00:42:49.199
That's just comparing adjacent elements to see where do we have edges, right?
00:42:49.199 --> 00:42:51.039
Where do we switch from one value to another?
00:42:51.039 --> 00:42:59.440
But anything more than a two as left argument, that means you're actually doing XOR reduces over Windows, which is right.
00:43:00.159 --> 00:43:03.440
Well, I mean, so in my mind, it was just gonna be this.
00:43:03.440 --> 00:43:09.760
It was gonna be, once again, this is uh one modifier, but dyadic derived airity, primitive.
00:43:09.760 --> 00:43:12.639
We can even call this n wise.
00:43:12.639 --> 00:43:18.320
BQN doesn't have it because they uh use the left argument as an initial value.
00:43:18.320 --> 00:43:20.320
I actually doesn't have it either, right?
00:43:20.320 --> 00:43:22.000
J doesn't have it.
00:43:22.000 --> 00:43:28.079
Wewah has folds and reduces, and I I definitely don't think wewa doesn't build it in here.
00:43:28.079 --> 00:43:31.840
Cap, I know, has it, and I think Tiny Apple has it as well.
00:43:31.840 --> 00:43:35.599
So we create this, now you get one with the green border.
00:43:35.599 --> 00:43:37.119
I would add this.
00:43:37.440 --> 00:43:38.320
Not the prettiest thing.
00:43:38.880 --> 00:43:42.000
Yeah, it's a little bit hard, but you know, it's it's something, it's something.
00:43:42.000 --> 00:43:45.440
Um and also, too, it's a little bit I should add like a black.
00:43:45.760 --> 00:43:49.760
I would say that's a big difference between the two wise reduce and n wise reduce.
00:43:49.760 --> 00:43:56.880
Two wise reduced is something so simple that even K has it as an as a standalone operator, right?
00:43:56.880 --> 00:43:58.159
Yeah, it's prior, right?
00:43:58.159 --> 00:43:59.360
Prior, exactly.
00:43:59.360 --> 00:43:59.760
Okay.
00:43:59.760 --> 00:44:05.440
By the way, Badland says Tiny Apple doesn't have that reduces his intlai value.
00:44:05.440 --> 00:44:07.519
Well then be gone, Tiny Apple.
00:44:07.519 --> 00:44:08.000
Yeah.
00:44:08.000 --> 00:44:10.480
So so I think there's a big difference there.
00:44:10.480 --> 00:44:14.960
Between what do you like if we go to C land, right?
00:44:14.960 --> 00:44:19.760
Adjacent differences is called and and doing windowed things.
00:44:19.760 --> 00:44:21.519
Yeah, adjacent difference.
00:44:22.000 --> 00:44:33.519
Adjacent difference in C 98 is just that, but the generic adjacent transform that showed up in C23, that takes a static argument, a template argument that can be anything.
00:44:33.519 --> 00:44:35.599
So it's it's like the n-wise reduction.
00:44:35.599 --> 00:44:44.559
So I mean, but like how do we so if you want to delineate these, technically the way to do it would be, you know, it's technically well.
00:44:44.559 --> 00:44:46.079
I don't actually know.
00:44:46.079 --> 00:44:47.440
So how does that work by the way?
00:44:47.519 --> 00:44:50.079
When you click the addict function there, you know what we should have?
00:44:50.559 --> 00:44:58.000
We should have like the cross, you know, like the uh we should get the symbol, you know, the you know, the two different crosses, one's like Henry's and one's I don't know, some other guy's names.
00:44:58.000 --> 00:45:07.360
And we should like that's not a symbol in any of the array languages, so that should just be for a generic binary operator, so that we can put like how is that not not a multiplication symbol?
00:45:07.360 --> 00:45:10.159
Well, because multiplication is actually uh a thing, right?
00:45:10.400 --> 00:45:12.159
Yeah, but that's the other cross you're talking about, right?
00:45:12.320 --> 00:45:19.519
Yeah, anyways, but I'm just saying we need one of those symbols, like in in at in mathematical like academic papers, they use that for they usually use a blob, a blob or something.
00:45:19.519 --> 00:45:20.079
Yeah, yeah.
00:45:20.079 --> 00:45:21.760
Well, we need something because op looks bad.
00:45:21.760 --> 00:45:25.760
You know, all of these are taken, and you know, question mark, it means something.
00:45:25.760 --> 00:45:27.440
But you want the solid blob.
00:45:27.440 --> 00:45:30.159
Well, uh we can just go get that.
00:45:30.159 --> 00:45:39.840
Yeah, where let me uh I need another uh let's Google Google generic binary operator cross unicus.
00:45:40.800 --> 00:45:41.360
Actually, what do you think?
00:45:41.360 --> 00:45:43.440
What I've seen in mathematical papers are two different things.
00:45:43.440 --> 00:45:48.960
One is a star, and then there's the those that use just a filled black circle, a blob.
00:45:48.960 --> 00:45:53.119
So I'm on shape catcher right now on a different monitor.
00:45:53.119 --> 00:45:56.400
That's that's a bad thing for filled out things.
00:45:56.400 --> 00:45:58.639
It'll be you have to fill it by hand.
00:45:58.639 --> 00:46:00.320
Man, I just got a bunch of clocks.
00:46:00.480 --> 00:46:01.039
What the hell?
00:46:01.119 --> 00:46:02.159
Here, actually, people might be.
00:46:02.159 --> 00:46:03.679
Yeah, because you're trying to fill it.
00:46:03.679 --> 00:46:04.559
That's the problem.
00:46:04.559 --> 00:46:06.800
I can give you the Unicode value if you want.
00:46:06.800 --> 00:46:10.480
Uh you have the U U plus 25C F.
00:46:10.719 --> 00:46:11.039
What?
00:46:11.280 --> 00:46:12.320
Yeah, never mind that.
00:46:12.320 --> 00:46:13.679
Just go just right.
00:46:13.679 --> 00:46:15.519
Get U plus 25 C F.
00:46:16.079 --> 00:46:20.480
U plus 25C F, yeah.
00:46:20.480 --> 00:46:21.920
That's not the one I want.
00:46:21.920 --> 00:46:23.519
No, sir, I don't know what you want.
00:46:23.760 --> 00:46:25.199
I want the I want the cross one.
00:46:25.199 --> 00:46:26.159
Which cross?
00:46:26.159 --> 00:46:27.280
The dagger symbol?
00:46:27.280 --> 00:46:27.920
I don't know.
00:46:27.920 --> 00:46:29.119
There's two, there's two.
00:46:29.199 --> 00:46:30.400
There's Henry's cross.
00:46:30.400 --> 00:46:32.960
Oh, you want them the circled ones?
00:46:33.119 --> 00:46:33.679
Yeah, yeah.
00:46:33.920 --> 00:46:35.039
Oh, that's one around.
00:46:35.039 --> 00:46:36.159
I mean, even that's sort of.
00:46:36.159 --> 00:46:38.400
Come on, what's going on here?
00:46:38.400 --> 00:46:39.760
Is this this?
00:46:39.760 --> 00:46:41.840
No, that's a that's a weird letter.
00:46:41.840 --> 00:46:45.199
I can also old italic letter the?
00:46:45.199 --> 00:46:48.880
I mean, this is pretty close, but that's not what you want.
00:46:48.880 --> 00:46:51.199
You want the one with a I know now I understand what it is.
00:46:51.199 --> 00:46:52.960
What is your after?
00:46:52.960 --> 00:46:55.119
Here, there are a couple of different ones.
00:46:55.119 --> 00:46:59.119
It's NRE circled operators called or circle plus, if you want.
00:46:59.440 --> 00:46:59.840
Circle.
00:46:59.840 --> 00:47:01.519
I mean, actually, I should have been able to guess that.
00:47:01.519 --> 00:47:02.079
Circle plus.
00:47:02.079 --> 00:47:05.119
It is uh it's u plus two two nine five.
00:47:05.119 --> 00:47:09.039
U plus two two nine five, he says.
00:47:09.039 --> 00:47:09.519
Yeah.
00:47:09.519 --> 00:47:10.320
There we go.
00:47:10.320 --> 00:47:13.199
Now we're gonna You should have just told me what it was you wanted.
00:47:13.519 --> 00:47:14.480
Well, you know.
00:47:14.480 --> 00:47:17.360
Or you could have a S an LLM, who knows?
00:47:17.360 --> 00:47:18.639
That's true.
00:47:19.199 --> 00:47:20.880
You could there we go the whole thing.
00:47:20.880 --> 00:47:23.199
All right, I'll keep that in my copy buffer and make sure not to.
00:47:23.840 --> 00:47:27.519
Roger Huey and I suggested giving that meaning in APL, but yeah.
00:47:27.519 --> 00:47:31.199
And I believe it's actually an a function in tiny appl?
00:47:31.199 --> 00:47:36.639
So now we create this, and you're saying this is simple?
00:47:36.800 --> 00:47:37.599
This should be here?
00:47:37.760 --> 00:47:38.320
I don't know.
00:47:38.320 --> 00:47:42.000
Yeah, no, that should be on yeah, I don't know, I guess.
00:47:42.400 --> 00:47:44.559
And then you're just saying like N.
00:47:45.119 --> 00:47:51.679
And this is Yeah, so just know that in Tiny APL, this is a a function that Roger Huey and I proposed.
00:47:51.920 --> 00:47:55.280
So does that mean we get rid of the nwise reduce here?
00:47:55.280 --> 00:47:57.519
Like, what's a better way, like yeah?
00:47:57.599 --> 00:47:58.800
I think that's much clearer.
00:47:58.800 --> 00:48:00.159
Now you can see what it means.
00:48:00.159 --> 00:48:06.320
Otherwise, I can't tell the difference other than by color, the difference between that nwise reduced and the normal reduced on there.
00:48:06.800 --> 00:48:12.000
So get rid of this one, the one that I'm the the colored yellow one, and then just keep the expressions is what you're saying.
00:48:12.000 --> 00:48:13.199
Yeah, I think so.
00:48:13.440 --> 00:48:15.840
It's much clearer at a glance what it means.
00:48:15.840 --> 00:48:19.280
I mean, what I would do in in say AppleCard is I put an F.
00:48:19.280 --> 00:48:21.840
An F for the N or an F for the symbol?
00:48:21.840 --> 00:48:25.760
For the for the generic function, because it's not necessarily a primitive.
00:48:25.760 --> 00:48:28.239
This sort of indicates there's a primitive, it could be any function.
00:48:28.639 --> 00:48:33.119
Well, it's supposed to just mean binary operation, yeah, is what it's supposed to mean.
00:48:33.119 --> 00:48:37.280
So I mean for the audio listener that hasn't switched over to YouTube, big mistake.
00:48:37.280 --> 00:48:45.840
We're we're we have been trying to figure out how to separate the variations or variance of the nwise reduced.
00:48:45.840 --> 00:48:53.039
So, Adam, I'm sure you understood earlier with saying that a twowise reduction is much simpler than an nwise, where n is greater than two.
00:48:53.039 --> 00:48:59.840
And I guess, yeah, that's actually not technically n could be two here, but hopefully the fact that both of them are on the screen, people can deduce that.
00:49:00.079 --> 00:49:01.280
Yeah, that that that's fine.
00:49:01.280 --> 00:49:03.199
Otherwise, it'll be too complicated.
00:49:03.199 --> 00:49:06.320
But see, what I would do here, you have another problem, right?
00:49:06.320 --> 00:49:10.719
Which is the rank that's not steady that you're going to put in the little circle in the corner.
00:49:10.719 --> 00:49:12.559
That that also makes a difference.
00:49:12.559 --> 00:49:22.400
So here this is last if you're doing APL, this is last access reduced, but the first access reduced would probably move up one level because then you have to understand how it works along the columns.
00:49:22.400 --> 00:49:25.280
So you're just saying just the first access reduction?
00:49:25.280 --> 00:49:35.760
And we can well, first no, that's first access and reduce first access, all of the first X reduces are like one level up, sort of from from their equivalent last access reduces.
00:49:35.760 --> 00:49:38.800
It's easier to understand the last access reduces.
00:49:39.039 --> 00:49:40.559
Oh man, it's so confusing.
00:49:41.039 --> 00:49:42.159
Yeah, but that means we have so many.
00:49:42.159 --> 00:49:51.599
So so what I do, instead of all these colors and the settings and things you have to do, what I do in in say Apple card and and the other Apple card-inspired things do the same thing, I believe.
00:49:51.599 --> 00:49:53.760
That is to use codes, right?
00:49:53.760 --> 00:49:58.320
So so here on if you go down to like the IOTA one, right?
00:49:58.320 --> 00:50:03.039
That says IOTA with rank zero, then I would I would write that as an expression.
00:50:03.039 --> 00:50:07.360
I would write IOTA M uppercase M lowercase s.
00:50:07.360 --> 00:50:12.400
That means so M means a write argument that is numeric.
00:50:12.400 --> 00:50:15.519
And oh sorry, sorry, uh N.
00:50:15.519 --> 00:50:20.639
So uh uppercase n lowercase s that means oh and numeric scalar.
00:50:20.639 --> 00:50:29.360
And then if you want a vector, you write nv, numeric vector, and then at a glance you can see what it what it means, and that's so so too with a function.
00:50:29.360 --> 00:50:36.320
So you could you could also introduce things like fs for scalar function or fm for mixed function, things like that.
00:50:36.320 --> 00:50:43.360
There, so I use I use text codes that don't rely on coloring, don't rely on like little icons and things, those different stuff, anyway.
00:50:43.360 --> 00:50:44.719
This is hard, right?
00:50:44.800 --> 00:50:49.199
It is because now it's ruining the fun of APL Dojo, there's too much nuance.
00:50:50.159 --> 00:50:56.000
Yeah, so now we are up to the purple belt on N-WISE uh reduce, right?
00:50:56.000 --> 00:51:03.360
On a on a primitive, but would you not say that there are concepts and primitives and so on that are like leagues above that?
00:51:03.360 --> 00:51:10.639
Yeah, so you're saying we need more colors, maybe, or we need to revise our strategy here because this is that's what I'm saying.
00:51:10.639 --> 00:51:12.400
This is hard.
00:51:13.119 --> 00:51:16.159
What do you mean it's it's uh that's something the AI is not gonna mess up?
00:51:16.159 --> 00:51:29.280
We can add back a couple colors, although it's gonna have to choose a red because I gave it an image and it chose the colors perfectly based off that image, but now that it's just gonna have to make up a red, which may or may not choose a red I like or a brown I like.
00:51:29.679 --> 00:51:33.280
I'm not sure it's a good idea because at what point does it not become useful, right?
00:51:33.280 --> 00:51:44.320
Well, we could also do a sort order, like an absolute ordering, or like a total ordering of primitives and concepts, and everything is like what is harder than what, and then you can choose your cutoffs arbitrarily and then you get your belts.
00:51:44.320 --> 00:51:56.239
Medalin saying in the in the chat that first axis reduced is is simpler than last axis reduce because if you explain uh if you explain leading access concepts early, but that's not true.
00:51:56.239 --> 00:52:24.800
That is true in a proper leading access language, but in traditional APL, leading access reduce is not actually a full leading access primitive dealing with higher rank cells, instead, it does some uh sort of interesting thing along the columns or along the it's it splits up the array into slices along the first coordinate and then applies things.
00:52:24.800 --> 00:52:31.039
Well, is it well it says APL dojo, Madeleine's protesting it's a general array language dojo, and I don't know.
00:52:31.039 --> 00:52:38.480
I think this I think it would be incredibly difficult to do all of this and also have all the different nuances across languages in mind.
00:52:38.559 --> 00:52:47.119
There's already so much nuance just for one language, and I guess here's the question Is it possible to do on to do this nuance less?
00:52:47.119 --> 00:52:48.719
Modulo nuance?
00:52:48.719 --> 00:52:58.559
Like, is it is it possible to just kind of discard the because like in general, you know, we don't need to split two wise reduction and n-wise reduction.
00:52:58.559 --> 00:53:06.639
Like, and that's I guess that's the problem, is depending on how you learn these languages, what your background is, how you're coming at it, you know.
00:53:06.639 --> 00:53:17.280
I I technically when when I discovered n-wise reductions, I I had seen the two, comma slash, and I just thought that that was an idiom.
00:53:17.280 --> 00:53:20.960
I didn't realize you could replace the comma with like any operation.
00:53:20.960 --> 00:53:24.000
And the day I realized that, I was like, holy smokes, that's amazing.
00:53:24.000 --> 00:53:29.599
And so really, like when commas your operation, a two, a three, a four, it doesn't really make a difference.
00:53:29.599 --> 00:53:38.000
And so then when you realize you can place it with a binary operation or, you know, and then it just does a reduction equivalent basically on it, it's uh to me, they're the same thing.
00:53:38.000 --> 00:53:47.360
So it's like people are gonna, you know, if if Madeline thinks that reduce first is simpler, you know, because of her path, and I think you know, ny's and two y's go together.
00:53:47.360 --> 00:53:50.960
The question is, is like, are we able like, you know, dyadic transpose?
00:53:50.960 --> 00:53:52.719
That's what we mentioned at one point.
00:53:52.719 --> 00:54:00.000
This is a dyadic function, and we're just gonna put, I believe that's that.
00:54:00.000 --> 00:54:02.880
We call this dyadic transpose.
00:54:02.880 --> 00:54:05.920
And how many languages have dyadic transpose?
00:54:05.920 --> 00:54:07.280
I don't know, because I never use it.
00:54:07.280 --> 00:54:07.920
APL?
00:54:08.239 --> 00:54:12.079
I suppose all of them have, but they don't they're not defined the same way.
00:54:12.079 --> 00:54:12.639
That's all right.
00:54:12.639 --> 00:54:13.519
That's what I mean.
00:54:13.519 --> 00:54:13.920
Nuance.
00:54:13.920 --> 00:54:15.519
Yeah.
00:54:15.519 --> 00:54:19.679
So you can you can is it easy enough to just do that?
00:54:19.679 --> 00:54:23.199
And like, or or do we have to say that we're all What are we trying to achieve?
00:54:23.199 --> 00:54:24.400
What's the goal of this?
00:54:24.719 --> 00:54:25.039
I don't know.
00:54:25.039 --> 00:54:51.679
I think the goal of this is to at a high level put primitives, idioms in the form of expressions and high-level concepts in these different categories so that if you are in general at like the blue belt level, you can look at what is above your level of knowledge and find the missing you know tools and concepts and ideas and be like, oh, okay, like, and you know, double rank.
00:54:51.679 --> 00:54:53.280
You know, is that a concept?
00:54:53.280 --> 00:54:54.800
No, it's a technique.
00:54:54.800 --> 00:54:55.599
It's a technique?
00:54:55.599 --> 00:54:57.280
All right, well, we don't have technique for now.
00:54:57.280 --> 00:55:01.039
So we'll just call, and I I guess can I oh I look at that.
00:55:01.039 --> 00:55:04.719
I can the the uh the input method still uh still works here.
00:55:04.719 --> 00:55:07.760
And so is double rank, is that a thing for all the languages as well?
00:55:07.760 --> 00:55:10.719
This is something that I never do as well, so like I'm out of my depth here.
00:55:10.960 --> 00:55:15.039
And any of any rank any language that has the rank operator can do double rank.
00:55:15.039 --> 00:55:24.400
Double rank is not a built-in thing, it just means you took a you took a function that's derived from the rank operator and you applied it with the rank operator.
00:55:24.639 --> 00:55:26.159
Does we will have rank?
00:55:26.719 --> 00:55:28.800
Uh has planets, right?
00:55:29.039 --> 00:55:30.320
We'll keep we'll leave a weewa.
00:55:30.320 --> 00:55:34.880
So if I do this and then I just put double rank up here, you know, that works.
00:55:35.119 --> 00:55:39.760
And so if that is where hold on, if that's black belt, where do you put single usage of rank?
00:55:39.760 --> 00:55:40.880
Yeah, that's a good question.
00:55:40.880 --> 00:55:41.840
That's what we're here for.
00:55:41.840 --> 00:55:43.760
That's what the APL dojo is about.
00:55:43.760 --> 00:55:50.880
Yeah, but if the if single usage of rank is purple, then surely dyadic transpose would go down to purple as well.
00:55:50.880 --> 00:55:52.559
They sort of belong together in my mind.
00:55:52.880 --> 00:55:53.679
Right, say that again.
00:55:53.679 --> 00:55:55.199
If single usage of transpose.
00:55:55.360 --> 00:56:03.280
If single usage of rank of single usage of rank goes down to purple, then I would put dyadic transpose down to purple as well.
00:56:03.599 --> 00:56:07.280
You think dyadic transpose and rank are at the same level?
00:56:07.280 --> 00:56:08.400
Yeah, I think so.
00:56:08.400 --> 00:56:09.039
No, no.
00:56:09.039 --> 00:56:12.000
I've never used dyadic transpose once in the seven years.
00:56:12.000 --> 00:56:12.800
But that's what I mean.
00:56:12.800 --> 00:56:13.760
It's different for everybody.
00:56:13.760 --> 00:56:16.480
I've never used it once, and I don't even know what you use it for.
00:56:16.480 --> 00:56:28.320
I've heard you and Marshall have the most crazy tennis match of like primitive high-level black belts going back and forth of like, oh, it's a one rotate on the left argument, it's like, oh, it's just a reverse of blah blah blah.
00:56:28.320 --> 00:56:35.840
I still remember, I don't remember what episode that was, but the rest of the array cast panelists and uh me were were just like baffled.
00:56:35.840 --> 00:56:37.039
I use rank all the time.
00:56:37.039 --> 00:56:45.440
I mean, if I need to do something on a real-wise basis or a column-wise basis or something, and especially in J, you know, rank zero in J is a very common thing.
00:56:45.440 --> 00:56:47.360
Yeah, and Adam, what is that?
00:56:47.360 --> 00:56:47.920
What is the chat?
00:56:47.920 --> 00:56:53.679
I mean, we've got we've got Max, Madeline, and I guess Adam is a third person right now in the chat.
00:56:53.679 --> 00:56:55.360
What do what do Max and Madeline think?
00:56:55.360 --> 00:56:59.280
Where does rank Madeline's saying that the transpose has nuance, right?
00:56:59.679 --> 00:57:06.639
That's that dyadic transpose has nuance because there's some languages where you can give like a short left argument to transpose.
00:57:06.639 --> 00:57:14.639
And she says it's simpler to explain how just bringing one axis to the front rather than reordering or reordering all the axes.
00:57:14.639 --> 00:57:23.840
Whereas a different way of coming at it is saying dyadic transpose exists in a simpler version that is less powerful, and a more complicated version that's more powerful.
00:57:23.840 --> 00:57:36.000
And by more complicated meaning those that can take short left arguments, like a single left scalar left argument that Madeline was saying was a simpler thing, I would say that makes the whole primitive more complicated.
00:57:36.000 --> 00:57:38.000
I'm not saying we shouldn't do it, I think it's a good idea.
00:57:38.000 --> 00:57:41.599
But I but but there's a there's so much nuance here.
00:57:41.599 --> 00:57:45.039
I don't know how to do this.
00:57:45.039 --> 00:57:46.800
That is the problem.
00:57:46.800 --> 00:57:48.000
We're drowning in nuance.
00:57:48.000 --> 00:58:01.840
So so so what I have done really, like for real, something that already exists is that I always sort the data table in Apple card by a a very simplistic sort.
00:58:01.840 --> 00:58:06.079
It doesn't even distinguish between any of these nuances at all.
00:58:06.079 --> 00:58:07.599
Of course, this is only for APL.
00:58:07.599 --> 00:58:11.360
The only thing it distinguishes between is the character involved.
00:58:11.360 --> 00:58:19.360
Okay, and I have made some sort of according to my head arbitrary ordering of primitives of symbols in APL.
00:58:19.360 --> 00:58:23.039
And I can show you that or you can pull it up yourself if you want.
00:58:23.039 --> 00:58:24.400
We're going to Apple card?
00:58:24.400 --> 00:58:27.599
Well, no, don't go to AppleCard, go to AppleCard source, right?
00:58:27.599 --> 00:58:28.239
On GitHub.
00:58:28.239 --> 00:58:29.039
I can see it.
00:58:29.039 --> 00:58:32.079
Yeah, you can you can go through and click click the GitHub thing.
00:58:32.079 --> 00:58:32.639
Yeah.
00:58:32.639 --> 00:58:35.760
And then you go to a file called cars.
00:58:35.760 --> 00:58:36.320
Okay.
00:58:36.320 --> 00:58:38.400
Cars.apila.
00:58:38.400 --> 00:58:40.559
Is it in the top?
00:58:40.960 --> 00:58:41.599
Yeah, it's in the root.
00:58:41.599 --> 00:58:42.320
Yeah.
00:58:42.800 --> 00:58:44.079
I like to keep my thing simple.
00:58:44.079 --> 00:58:45.440
It's right there in the middle of your screen.
00:58:45.440 --> 00:58:46.719
It was before you scrolled.
00:58:46.719 --> 00:58:49.119
Oh, it's not in alphabetical order.
00:58:49.119 --> 00:58:50.559
Oh, it's yeah.
00:58:50.559 --> 00:58:54.000
Okay, so this is a bit small, I might want to make it bigger.
00:58:54.000 --> 00:58:54.960
Yeah.
00:58:54.960 --> 00:59:04.000
So this is my attempt at a rough ordering from simplest on the left to most complicated on the right, where I remove all the nuance, right?
00:59:04.000 --> 00:59:10.639
There's no consideration of ranks or depths of arguments, no consideration of even the monetic or the form of the primitive.
00:59:10.639 --> 00:59:11.280
Right?
00:59:11.280 --> 00:59:15.760
But this is so that I'm saying there was I think it was a space on the left, right?
00:59:15.760 --> 00:59:17.360
Space is the simplest thing.
00:59:17.360 --> 00:59:23.119
And then and then right tag is the simplest function, and left tag is this next simplest function.
00:59:23.119 --> 00:59:27.920
It has the slight complication that when you give it a right argument only, it still gives you the right argument.
00:59:27.920 --> 00:59:31.039
So it makes it more complicated than the right tag, which is pretty obvious.
00:59:31.039 --> 00:59:35.280
Then plus removing the nuance that plus deals with complex numbers, right?
00:59:35.280 --> 00:59:39.760
Comple conjugate, and it is just passed through for none numbers and so on.
00:59:39.760 --> 00:59:44.239
So that forgetting that nuance, minus times should be pretty simple, right?
00:59:44.239 --> 00:59:51.199
And then or and and removing the nuance of the number theoretical things, right?
00:59:51.199 --> 00:59:55.199
Because in the most common case, it's just logical or and and those are easy to understand.
00:59:55.199 --> 01:00:01.599
Then round up and maximum and round down and minimum, reverse last, reverse first.
01:00:01.599 --> 01:00:04.880
Notice I do the last axis before the first axis.
01:00:04.880 --> 01:00:06.880
I think it's easier to understand for most people.
01:00:06.880 --> 01:00:08.079
Then division, right?
01:00:08.079 --> 01:00:10.320
Why didn't division go plus minus times division?
01:00:10.320 --> 01:00:18.159
Because you know, division is a bit more interesting that you have to learn the with the with the typical sort of yeah.
01:00:18.159 --> 01:00:26.400
So I mean we had minus there, then modulus and absolute value, then we go the the factorial and then and choose k.
01:00:26.400 --> 01:00:33.360
And then we get our our the random number function, which yeah, it's again in combinatoric, so it's sort of that area.
01:00:33.360 --> 01:00:35.440
Then we get all the all the comparisons.
01:00:35.440 --> 01:00:37.199
I didn't order them by simplicity, right?
01:00:37.199 --> 01:00:40.000
There's no way I can say that less than is simpler than greater than.
01:00:40.000 --> 01:00:42.960
So I just put them in the standard order they appear in.
01:00:42.960 --> 01:00:58.639
And then and those are scalar comparison functions, so slightly more complicated in the scalar comparison function are the the full array comparison functions, and then some structural things, and of course, I would say mix and split are maybe more complicated to deal with than drop and take.
01:00:58.639 --> 01:01:09.119
But being that they share symbols, I've got to put them in an order, so that's where they go, and then reshape, because reshape is sort of similar to to take, you know, and then and then we do more advanced math.
01:01:09.119 --> 01:01:11.440
So all the advanced math comes comes over here.
01:01:11.440 --> 01:01:18.320
That's the power, exponential, logarithm, and and uh and the circle fun all the circular functions.
01:01:18.320 --> 01:01:24.320
And tilde comes here, you could say it's a simple Boolean function, but it deals with sets also.
01:01:24.320 --> 01:01:26.159
So I guess I put it here.
01:01:26.159 --> 01:01:38.000
Then the compositional operators, first the monetic compositional operator, then the binding, so on, and then the the more iterative ones, and then reductions and and replicate there, right?
01:01:38.000 --> 01:01:58.079
And and we keep we keep going, like we can see scrolling, then the naned nores tend to be a bit harder for people to wrap their hand heads around than some of the structural thong things that deal with combining arrays and opening it up and splitting them up and selecting from arrays and lookups and all the kind of lookups and set functions, power operators, not that complicated.
01:01:58.079 --> 01:01:59.760
Grade, pretty complicated.
01:01:59.760 --> 01:02:09.679
But again, if we had nuance, monetic grade, not so bad on numbers, monetic grade on characters, yeah, sure, not so bad if you know about Unicode, things like that.
01:02:09.920 --> 01:02:10.960
I can't believe scan.
01:02:10.960 --> 01:02:12.639
Scan is so far.
01:02:12.960 --> 01:02:21.119
Well, yeah, well, uh but think about what does grade mean on on a on a not not simple array, right?
01:02:21.119 --> 01:02:24.400
On a vector of multidimensional arrays, right?
01:02:24.400 --> 01:02:25.199
What comes first?
01:02:25.199 --> 01:02:29.440
A two by three array or a three by two array of the otherwise containing the same things?
01:02:29.440 --> 01:02:31.039
That's not that's pretty complicated.
01:02:31.039 --> 01:02:32.480
That the total array ordering.
01:02:32.480 --> 01:02:36.239
And then dyadic grade is again has nuance to it, right?
01:02:36.239 --> 01:02:40.639
The left argument that is scale, that is a vector, and a left argument that's multidimensional.
01:02:40.639 --> 01:02:42.719
That's like the multidimensional left argument.
01:02:42.719 --> 01:02:47.039
That's something Roger Hugh would test us to test people if they really know what they're talking about.
01:02:47.039 --> 01:02:54.960
Then the brackets, and again, I can't say that left or right bracket is becomes one before another, but they actually do a bunch of different things.
01:02:54.960 --> 01:02:56.880
So that's there's a lot of stuff to learn.
01:02:56.880 --> 01:02:59.679
Transpose, key, right?
01:02:59.679 --> 01:03:04.000
It's it gets harder and harder to sort of know see exactly what things should be.
01:03:04.000 --> 01:03:10.719
Then then the then we've got inner product, but that's also duding into things, so there's a whole bunch of complication there of the stencil.
01:03:10.719 --> 01:03:16.559
In code decode, it's all simple when you've got a single number you work on and a single base you're working on.
01:03:16.559 --> 01:03:26.159
But when you like mixed base multi-number conversions, it's right up there in in some pretty advanced stuff mathematically, especially like in code.
01:03:26.159 --> 01:03:30.239
So at that point, also more mathematics of of Domino, right?
01:03:30.239 --> 01:03:32.400
Matrix division inversion.
01:03:32.400 --> 01:03:34.400
Then you've got all kinds of systemy stuff, right?
01:03:34.400 --> 01:03:35.199
That comes over here.
01:03:35.199 --> 01:03:52.880
Things that are not even like core language things, but I still have glyphs, execute, format, spawn a thread, system calls to the IBM, the variant thing that changes the behavior of things, input, output assignments that which behave in the assignments, not just assignments, like that's like the simplest concept you can have in a in a programming language.
01:03:52.880 --> 01:03:54.320
But think about APL assignments.
01:03:54.320 --> 01:04:04.719
You've got modified assignments, multiple assignments, function assignments, operator assignments, localizing assignments in in defense, which you can override depending on what's on the left.
01:04:04.719 --> 01:04:11.679
Pass-through values, multi-name left side with a function that has implied each.
01:04:11.679 --> 01:04:13.840
There's so much stuff to know about assignment.
01:04:13.840 --> 01:04:32.800
A diamond now fulfills multiple roles, guards in defense, and control structures and stuff like that, and and what is and the and function definitions and uh and other things you do in in a treadfin and a defen, and hash is for namespace references, and then comes arrays.
01:04:32.800 --> 01:04:35.360
Now, here's not for for complication reasons, right?
01:04:35.360 --> 01:04:37.920
So I put all arrays and identifiers and so on at the end.
01:04:37.920 --> 01:04:43.840
That's not because they're more complicated, it's because I wanted that sort order in in for C decreasions in in Apple Cards.
01:04:43.840 --> 01:04:46.000
The primitives come before name things.
01:04:46.000 --> 01:04:55.199
But this is like this was my sort of take on a rough without any nuance ordering of the dialect primitives.
01:04:55.199 --> 01:04:57.119
And of course, you'll disagree with it.
01:04:57.119 --> 01:04:58.159
I can disagree with it.
01:04:58.159 --> 01:05:00.639
It's sort of rough like that.
01:05:00.639 --> 01:05:06.559
But if you now want to give them belts, you have got how got to put some arbitrary cutoffs between them.
01:05:06.559 --> 01:05:08.159
Yeah, go for it.
01:05:08.159 --> 01:05:09.440
No nuance.
01:05:09.440 --> 01:05:10.079
That's what it is.
01:05:10.079 --> 01:05:11.760
This is what happens if you get no nuance.
01:05:11.760 --> 01:05:17.199
Well we And this is just for APL, dialogue APL specifically.
01:05:17.199 --> 01:05:30.000
Now you add splitting monetic dietic, splitting all kinds of overloads, splitting up with argument ranks and depth and values, and multiple array languages, you've got so much nuance.
01:05:30.000 --> 01:05:49.599
It's like Well, I mean we before we move on from uh uh Madeline pointed out that uh the exclamation mark and the oh I tried to zoom in and uh it's a very minor thing, but yes, the distance between the the dot and the rest of the symbol in the exclamation point and and question mark are different.
01:05:49.599 --> 01:05:51.519
Also the height of the symbols is a bit different.
01:05:51.519 --> 01:05:52.400
It's a bit funny.
01:05:52.400 --> 01:05:56.239
I would say that the the actual problem here is the exclamation point.
01:05:56.239 --> 01:05:59.679
No, the question marks are sort of loopy part is.
01:05:59.679 --> 01:06:03.280
Too too low, it should just be higher up in general.
01:06:03.280 --> 01:06:05.039
Potato, this is minor.
01:06:05.039 --> 01:06:06.400
This is very much a tangent.
01:06:06.639 --> 01:06:19.119
Yeah, I mean I'm torn because I really do think that there it's possible to have a thing like this and a thing like that, this being the APL dojo where you've got a nice little tiered ranking.
01:06:19.119 --> 01:06:21.280
You know, a linear list of this doesn't.
01:06:21.280 --> 01:06:26.239
I mean, maybe I guess if you want to learn, you can start just by going primitive by primitive by primitive.
01:06:26.559 --> 01:06:28.400
But I don't think it's a good idea either.
01:06:28.400 --> 01:06:36.719
Because because I I like to put my students in APL in a position of being able to do something fun really quickly.
01:06:36.719 --> 01:06:40.000
So I want to teach them sure range duration on it.
01:06:40.000 --> 01:06:40.880
That that's fine.
01:06:40.880 --> 01:06:58.400
Then I want to teach them maybe some uh some reductions and some arithmetic, and all of a sudden they can now compute things like Pascal Triangle type things and and and uh the number of sugar cubes in a pyramid of of sugar cubes and things like that.
01:06:58.400 --> 01:07:02.320
So there's also like what should you be learning next?
01:07:02.320 --> 01:07:06.320
And I think I I I have taken very, very little art martial arts.
01:07:06.320 --> 01:07:15.519
I started going to an Aikido course uh long time ago when I was in high school, and I hurt my shoulder and I didn't want to continue.
01:07:15.519 --> 01:07:17.760
And there's just a couple of lessons, I think.
01:07:17.760 --> 01:07:25.280
And then I I I took like a uh a month long, but it wasn't full time, it was like 10 hours a week or something.
01:07:25.280 --> 01:07:29.280
Course on Balinese martial arts, I don't remember what it was called.
01:07:29.280 --> 01:07:33.679
So there was nothing about belts, not even getting to any any belts or anything.
01:07:33.679 --> 01:07:45.199
But even there, I would imagine that you you would take some more difficult concepts and put together with some some simpler moves so that you can actually do something.
01:07:45.199 --> 01:07:51.840
If you do all the simplest things, it's just the wiggle one finger, wiggle the wiggle the next finger, it gets very boring very quickly.
01:07:51.840 --> 01:07:58.320
But what this might be able to we might be able to do is to say if somebody's struggling, right?
01:07:58.320 --> 01:08:05.679
There's they're self-studying APL, and then they're they're they're dealing with dyadic transpose, and they think, why m is my brain not catching this?
01:08:05.679 --> 01:08:08.480
Getting the reassurance that yeah, this is hard.
01:08:08.480 --> 01:08:10.159
We know this is hard.
01:08:10.159 --> 01:08:11.519
It might help.
01:08:12.480 --> 01:08:22.000
Yeah, like I said, that's I mean fits with the thing of like saying I'm at this level, what are the concepts or things above that I should uh learn?
01:08:22.000 --> 01:08:29.840
Like the goal of this is isn't like I I want to have a certain amount of, like I said, granularity so that you're able to represent.
01:08:30.079 --> 01:08:35.920
Yeah, but I don't know, maybe maybe the rank is Are you uh are you aware of the AppleCart quiz?
01:08:35.920 --> 01:08:36.880
You ever seen that?
01:08:36.880 --> 01:08:37.359
No.
01:08:37.359 --> 01:08:39.760
So try if you go to AppleCart for a moment.
01:08:40.159 --> 01:08:44.319
So it does a link at the bottom center where you can write click on quiz.
01:08:44.319 --> 01:08:49.039
And there are these three different types of quizzes you that you can do, right?
01:08:49.039 --> 01:08:59.840
It doesn't check your answer or anything, it just lets you in your head try to, or paper, whatever, solve something, and then you can check it with your see the see the result and then continue.
01:08:59.840 --> 01:09:06.479
But notice the first one of these, which is always writing a function of a given task, it says how difficult it is.
01:09:06.479 --> 01:09:09.680
It solves the following medium difficulty task.
01:09:09.680 --> 01:09:14.960
And that so there you have a sort of granularity of how difficult is the task as a whole.
01:09:14.960 --> 01:09:16.399
How did I do that?
01:09:16.399 --> 01:09:19.039
It's I if I remember right, it's been a long time.
01:09:19.039 --> 01:09:22.960
It looks at the it does a weighted sum, right?
01:09:22.960 --> 01:09:35.199
So we we it looks at the primitives necessary to solve this because it's just using the Apple card table, and then it looks at the position of the symbols in that list that you saw before of the primitives, difficulty, and sums them up.
01:09:35.199 --> 01:09:37.119
That means more primitives, more difficult.
01:09:37.119 --> 01:09:41.840
More primitives that peer further to the right in the in that list, more difficult.
01:09:41.840 --> 01:09:52.640
So the simplest thing is to have something on the uh on the far left, a single thing from the far left, and then it just grades it into those three different levels easy, medium, and hard.
01:09:52.640 --> 01:10:00.239
So I did some arbitrary cutoff, probably like the one-third and two-third cutoffs between the easiest and the hardest, something like that.
01:10:00.239 --> 01:10:15.600
So there is I think I agree with you that is a way that it's possible to say that something is harder than something else, but I'm not sure how much value there is in saying that this is Jake, this is the level you're at, these are the primitives you should study.
01:10:15.600 --> 01:10:16.800
Sorry, sorry, Fanny.
01:10:16.960 --> 01:10:18.479
No, no, we're getting we're getting down, yeah.
01:10:18.880 --> 01:10:23.520
We're getting lost in the like, well, first of all, this is just I mean, it's gray.
01:10:23.520 --> 01:10:31.840
There's a reason why a rake a rake box, if we uh oh that's not correct, delete, and we zoom out here.
01:10:31.840 --> 01:10:36.640
I mean, if we hit F5, you know, I got this nice little animation now.
01:10:36.640 --> 01:10:40.479
You click this, people under, or I don't know, everyone's different one.
01:10:40.479 --> 01:10:47.840
Maybe some people like gray websites, but people I really value logos, color, and the aesthetic of things, you know?
01:10:47.840 --> 01:10:54.640
It brings me so much joy to hit control K and then to go control down and to toggle through all these keyboards.
01:10:54.640 --> 01:10:59.119
And and like color is color is so important, it at least for me.
01:10:59.119 --> 01:11:05.439
Like when I was doing the Wait, so are you are you commenting now on the colors in that book card rather than that everything is gray?
01:11:05.439 --> 01:11:09.359
I'm gonna learn something or deal with something.
01:11:09.359 --> 01:11:11.359
Like I go to a ray box all the time now.
01:11:11.359 --> 01:11:17.920
I want it to I want it to be a pleasant like visual and like all all all above.
01:11:17.920 --> 01:11:20.479
The the quiz, it hurts my soul.
01:11:20.479 --> 01:11:23.279
It looks like it looks like something died.
01:11:23.279 --> 01:11:24.079
You know?
01:11:24.079 --> 01:11:27.520
It looks like uh the you know, or at least something inside me died.
01:11:27.520 --> 01:11:32.319
Whereas even if this is less, we got a little color, we got some logos, we gotta have logos.
01:11:32.319 --> 01:11:36.319
That's why K, you know, K would already be included if K had a logo.
01:11:36.319 --> 01:11:38.479
And that's the problem, is I gotta come up with my own logo.
01:11:38.479 --> 01:11:40.000
I don't want to come up with a logo.
01:11:40.000 --> 01:11:42.720
And uh logo for APL then.
01:11:42.720 --> 01:11:49.359
And uh and I there was a bug in J that this was not being syntax highlighted correctly.
01:11:49.359 --> 01:11:53.520
And I realized because this was like blue and this was orange, and I was like, wait, what's going on anyway?
01:11:53.520 --> 01:11:54.800
So and then I went and got and fixed it.
01:11:55.119 --> 01:11:56.079
You have to tokenize it.
01:11:56.399 --> 01:12:08.479
And but that's the thing, is it it's a lot easier to read J when you've got syntax highlighting of you know the operators and the functions, and anyway, so you could have multiple multiple things of the same.
01:12:08.560 --> 01:12:16.159
We're we're way off topic from what we discussed before, but in even in J, you can have multiple tokens of the same type adjacent to each other, and you can't see the borders.
01:12:16.159 --> 01:12:22.239
For me, the big problem with J is the tokenization, it just blurs in my mind.
01:12:22.239 --> 01:12:36.079
Maybe maybe a uh a clever ligature font could fix it to like sort of move the things together so you get a little space, or it's much easier for me to read J that has spaces between the primitives, between the tokens in APL.
01:12:36.079 --> 01:12:36.880
I don't like that.
01:12:36.880 --> 01:12:38.479
Yeah, yeah, that's fair enough.
01:12:38.479 --> 01:12:48.319
I know I don't understand why, but like when people write verbose proper light languages like C and Python, JavaScript, and so on, they put spaces everywhere, and I don't get it.
01:12:48.319 --> 01:12:50.880
It's already so verbose, so little information on the screen.
01:12:50.880 --> 01:12:52.399
Why do you add more spacing?
01:12:52.399 --> 01:12:57.520
But but maybe also because those languages have multi-character tokens, right?
01:12:57.520 --> 01:13:07.600
So the spaces help you sort of tokenize, whereas in array languages that use fancy glyphs and and in K, you you barely need that.
01:13:07.600 --> 01:13:13.359
There are very, very few multi-character tokens in those array languages.
01:13:13.359 --> 01:13:15.600
Yeah, yeah, I mean that's a separate issue.
01:13:15.600 --> 01:13:20.399
Um the syntax colouring, it might it might be more useful if every other token had a different color.
01:13:20.399 --> 01:13:31.439
I but and I guess if you're not so used to the language, the the syntactic role of any given token is not so obvious to you, but once you're used to that, it doesn't really add much.
01:13:31.439 --> 01:13:35.439
I know Martin Kronberg says syntax coloring doesn't really do much for him.
01:13:36.000 --> 01:13:36.800
I mean there are some things.
01:13:38.000 --> 01:13:42.800
Everybody's different, but like you can't for some there's some utility things that I that I agree on.
01:13:42.800 --> 01:13:44.960
Like I would I would I mean I do have that.
01:13:44.960 --> 01:13:51.279
Uh in when you're dealing with trade difference in the APL, then there's a big difference whether your your names are localized or not.
01:13:51.279 --> 01:13:57.680
And having a different color or some indication of whether something's local or global, that is genuinely useful.
01:13:57.680 --> 01:14:02.319
Maybe the syntactic type of of user-defined names would be useful for me.
01:14:02.319 --> 01:14:04.079
But the primitives, whatever.
01:14:04.079 --> 01:14:07.119
Anyway, we can add color to AppleCart if you want, or I'll do a lot of things.
01:14:11.039 --> 01:14:12.239
That's the website again.
01:14:12.239 --> 01:14:15.359
The the goal here, I mean, we're we're so we're so lost in the sauce here.
01:14:15.359 --> 01:14:21.920
I mean, this is this is uh uh not a failure, but you know, we we shot for the stars and we landed in a dumpster.
01:14:21.920 --> 01:14:41.119
Like the the the the goal is that, or at least for me, like I had this vision of like a board that you know it's not it's it's not that oh this is the go-to place for people to learn languages or you know, the I I want to get into array languages, you know, you start at white and then you work your way up.
01:14:41.119 --> 01:15:01.279
It's more of just like I'm hoping that you know you and others that are more expert can put things here that like I can target as like you know, for for instance, you know, I don't know if this is a concept or an expression or a technique, I guess it would be a technique, but it's like you know, a dyadic reduce.
01:15:01.279 --> 01:15:07.920
You know, you want to apply a dyadic function on two arguments, but you know, it's in the form of a list.
01:15:07.920 --> 01:15:12.720
So you you you know, it's like it's like the idea of outer product, you know.
01:15:12.720 --> 01:15:13.920
Yeah, yeah, but for rank.
01:15:14.880 --> 01:15:22.239
So so so I think I think that one of the reasons why we end up in the dumpster shooting for the stars here is is exactly that shooting for the stars.
01:15:22.239 --> 01:15:23.920
Like try to reach the moon first.
01:15:23.920 --> 01:15:28.319
What I mean by that is we're trying to do all the array languages at the same time.
01:15:28.319 --> 01:15:32.079
We're trying to look at all the different possibilities of these primitives.
01:15:32.079 --> 01:15:40.720
One thing I sort of liked, sort of don't like, about the Weewa's website or documentation is it seems to sort of say that the highest rank is two.
01:15:40.720 --> 01:15:50.880
I know it's not the case, but if you pretend that the highest rank is two, then then instead of you first axis, last axis, this kind of thing, then it's just you know the rows and columns, it's easy.
01:15:50.880 --> 01:16:01.439
So I think if you remove nuance in a different way here, firstly, I would recommend starting with one language, you can always add it later because things get really complicated when there are new differences between the languages.
01:16:01.439 --> 01:16:10.000
And then maybe start with going through just the primitives, maybe start even with the primitive functions, just have a starting ground for like how difficult things are.
01:16:10.000 --> 01:16:14.399
And when you start with the functions, okay, split them in monadic, dyadic, that's fine.
01:16:14.399 --> 01:16:24.640
But assume that the arguments are of the smallest rank and depth that is reasonably meaningful for that primitive.
01:16:24.640 --> 01:16:33.039
So for example, dyadic transpose doesn't make sense on a vector write argument, but dadic and dyadic transpose doesn't make sense on a matrix right argument either.
01:16:33.039 --> 01:16:35.920
It only makes sense on rank three and more, right?
01:16:35.920 --> 01:16:42.560
Because, well, except if you're having duplicate left argument uh elements for the left argument, so you're already some some new answer.
01:16:42.560 --> 01:16:50.399
But assuming that the simplest application of dyadic transpose is when the left argument is a permutation without duplicates, right?
01:16:50.399 --> 01:16:53.760
So then it's much easier to speak about things.
01:16:53.760 --> 01:17:06.640
Then we know dyadic transpose is talking about vector left argument in in APL's case where there's it has to be a vector, so vector left argument, rank three right argument, and then it's way up there in the black belt, right?
01:17:06.640 --> 01:17:11.199
For for plus, even just one plus one, right?
01:17:11.199 --> 01:17:12.399
That's that's meaningful.
01:17:12.399 --> 01:17:17.920
Is that probably the most common case use of plus is just adding a scalar to another scalar that goes down in white.
01:17:17.920 --> 01:17:27.600
Yes, there's a lot more nuance to plus because there's scale extension, there is the uh array application, there is pervasiveness, right?
01:17:27.600 --> 01:17:35.039
There's and for some languages you got the leading axis, conformity, and bracket axis, and there's lots of stuff.
01:17:35.039 --> 01:17:39.119
But in the simplest case, one plus one is very simple, it goes in the white belt.
01:17:39.119 --> 01:17:40.800
Yeah, then build it up from there.
01:17:40.800 --> 01:17:48.560
Then we can always add more new ones, but start small, start with a minimal variable product where you say these are the primitives and their simplest forms.
01:17:48.560 --> 01:17:53.920
This is how you grade them, and then maybe maybe you even have like function black belt, right?
01:17:53.920 --> 01:18:08.800
Primitive function black belt on symbols form, and maybe there's like advanced function application where you later where you say, like, okay, these primitives actually can do a lot more, and then you get like separate build for that, or then you can start adjusting, like move everything down to just green and white, or something like that.
01:18:08.800 --> 01:18:10.319
Then you can do the nuance later.
01:18:10.319 --> 01:18:16.960
But I think if you start with that, you actually have a chance of getting somewhere that's that has some meaningful information to the reader.
01:18:16.960 --> 01:18:20.479
Uh I know you want to do everything, right?
01:18:20.640 --> 01:18:25.760
But it's not that I want to give everything, but just like starting with one plus one is boring.
01:18:26.000 --> 01:18:27.359
You don't have to start with one plus one.
01:18:27.359 --> 01:18:28.319
That's boring, yeah.
01:18:28.319 --> 01:18:33.439
So, but starting with IOTA on just an a scalar right argument, that's right.
01:18:33.439 --> 01:18:34.560
That's what we did start with.
01:18:34.560 --> 01:18:35.359
It was right here.
01:18:35.359 --> 01:18:36.640
Yes, yeah, yeah, sure.
01:18:36.640 --> 01:18:40.159
But it's but you're trying to fill out all the like to cover everything.
01:18:40.159 --> 01:18:42.159
You have the little badger in the corner saying it's a good one.
01:18:42.319 --> 01:18:43.279
I'm just trying to cover everything.
01:18:43.359 --> 01:18:55.760
I'm trying to create so so so if for so now we can go in and if you want to look at operators, I would recommend staying with functions just to get to get used to the process of assigning belts to the functions.
01:18:55.760 --> 01:19:04.159
So now we go through the language bar, whatever list of primitives, and just do the functions and just look at each one, what are their simple applications?
01:19:04.159 --> 01:19:07.119
That's what I would recommend, just as a starting point.
01:19:07.119 --> 01:19:13.760
So, sure, you can skip the arithmetic, but where would you put, for example, monadic circle, right?
01:19:13.760 --> 01:19:16.000
Monetic circle, I would say, is very simple.
01:19:16.000 --> 01:19:22.800
In its simplest form, it takes a scalar, right, argument number, and it just multiplies by pi, right?
01:19:22.800 --> 01:19:27.600
So pi is a bit of an interesting number, but it it's not a complicated concept, right?
01:19:27.600 --> 01:19:29.439
That is just multiplies by a constant.
01:19:29.439 --> 01:19:34.880
So I would probably put that on white or maybe one level up from white, but definitely not more than that.
01:19:34.880 --> 01:19:38.079
The fact that it's a scalar function that it can do all these stuff, right?
01:19:38.079 --> 01:19:40.560
Uh forget that for the moment.
01:19:40.560 --> 01:19:44.239
And then you can do the domino, monetic domino, right?
01:19:44.239 --> 01:19:53.520
So that's it's not a difficult thing from an APL perspective, as in like it takes a matrix and it returns a matrix, sort of similar to transpose.
01:19:53.520 --> 01:19:56.720
However, it does something that's mathematically difficult.
01:19:56.720 --> 01:20:04.079
So now this by by limiting our scope like this to something quite simple, now we get to actual questions that we need to ask ourselves.
01:20:04.079 --> 01:20:12.000
Do we look at things that are the difficulty of things from an array programming perspective or even from a concept perspective?
01:20:12.000 --> 01:20:14.000
Like N choose K, right?
01:20:14.000 --> 01:20:16.720
It's a scalar function APL that makes it very simple.
01:20:16.720 --> 01:20:22.800
But mathematically, it's sort of a more advanced thing, you don't really learn in in basic school.
01:20:22.800 --> 01:20:25.199
So do you want to grade that as well?
01:20:25.199 --> 01:20:26.560
Is it the APL part?
01:20:26.560 --> 01:20:27.359
Is it everything?
01:20:27.359 --> 01:20:32.239
Those are the questions you want to ask instead of getting into nitty-gritty nuance details, in my opinion.
01:20:32.560 --> 01:20:37.199
I mean, I've used this once in seven years, and I've never used the circle function ever.
01:20:37.520 --> 01:20:39.039
Yeah, but that depends what you're doing.
01:20:39.039 --> 01:20:46.560
If you're doing graphics, like somebody's writing basically a a Minecraft clone in APL, you want to use the circle function, right?
01:20:46.560 --> 01:20:53.119
You want to you have to determine what is the how far are things in in two dimensions or three dimensions from you.
01:20:53.119 --> 01:20:58.880
You need you have an angle and you need to know you need to know how many blocks this way and that way is it?
01:20:58.880 --> 01:21:00.239
How far can you throw in that direction?
01:21:00.239 --> 01:21:01.359
You need the circle function.
01:21:01.359 --> 01:21:16.079
And if you are trying to solve constraints or doing like a nicely ragged adjustment of text on each line in monospace at least or something, then or even not, then you need you need the domino function.
01:21:16.079 --> 01:21:21.920
Yeah, I guess this is there should be it very much depends on your on your domain.
01:21:23.039 --> 01:21:25.199
Well, I guess we're just doing APL now.
01:21:26.000 --> 01:21:32.159
That's that's also what I recommend is that like limiting the scope I think will get you a long way.
01:21:32.159 --> 01:21:38.479
I mean that that depends depends on the other question, right?
01:21:38.479 --> 01:21:40.800
But that's a fairly easily to resolve question.
01:21:40.800 --> 01:21:45.840
Do we take concept non-APL conceptual complexity into the picture or not?
01:21:45.840 --> 01:21:52.720
Like are you only interested in the difficulty of understanding array programming, or are you also interested in the actual concept involved?
01:21:52.720 --> 01:21:59.840
I don't know.
01:21:59.840 --> 01:22:00.640
I don't know.
01:22:00.640 --> 01:22:02.960
That's that's that's that's just a design choice.
01:22:02.960 --> 01:22:12.159
Is this this is this the the beltness of APL ness or is this the belt level of the everything in the in the primitive?
01:22:12.159 --> 01:22:20.479
So if it's just in the in the APL nest, then all scalar functions go down in the simple this on the same level.
01:22:20.479 --> 01:22:26.479
There should be no difference between n choose k and plus or minus, because they're but just scalar functions.
01:22:26.479 --> 01:22:38.399
There should be no difference between LCM and G C D and multiplication, even though there is a huge difference in the actual knowledge and the standing here to to uh to employ them.
01:22:38.720 --> 01:22:41.600
Okay, updated APL dojo with my death skulls.
01:22:41.760 --> 01:22:42.399
It has failed.
01:22:42.399 --> 01:22:43.840
It's not it's not dead.
01:22:43.840 --> 01:22:46.319
You just have there's some choices that need to be made.
01:22:46.319 --> 01:22:52.159
What is it and if you don't write user story first, what is it you want to to who's your target audience?
01:22:52.159 --> 01:22:53.840
What did you want to achieve for that target audience?
01:22:53.840 --> 01:22:55.439
The target audience was me.
01:22:55.439 --> 01:22:57.039
So okay, that's fine.
01:22:57.039 --> 01:22:57.840
That's valid.
01:22:57.840 --> 01:23:03.359
So if your target is you, right, that means you're already very familiar with programming concepts.
01:23:03.359 --> 01:23:07.520
That means that reduce is a pretty easy thing for you to understand, right?
01:23:07.520 --> 01:23:09.119
Or map, right, and each.
01:23:09.119 --> 01:23:18.560
But for somebody who is not familiar with that kind of thing, or if they are not familiar with higher order functions because they only program in C or something, then then that's more complicated.
01:23:18.560 --> 01:23:21.359
But if you're the target audience, that's much easier.
01:23:21.920 --> 01:23:22.720
Yeah, I don't know.
01:23:22.720 --> 01:23:25.680
I think if you convince me though that it just doesn't work.
01:23:25.680 --> 01:23:26.960
No, I don't want you to think.
01:23:31.920 --> 01:23:35.600
So so Loki is is suggesting something completely different.
01:23:35.600 --> 01:23:41.600
That it's more of a course indicator, saying, well, white build means learn this stuff first.
01:23:41.600 --> 01:23:44.159
Basically, you have to decide on a lesson plan.
01:23:44.159 --> 01:23:45.439
And that's something I've done.
01:23:45.439 --> 01:23:47.600
I don't know if you've looked at lately at the APL challenge.
01:23:47.600 --> 01:24:02.960
APL challenge I've tried to make really pedagogical, where we start you start with no knowledge necessary other than basic school mathematics, plus plus minus times, basically, is all I required to know, and the and the alphabet.
01:24:02.960 --> 01:24:05.600
So and then we build up from there.
01:24:05.600 --> 01:24:10.000
In that case, you say, okay, if I'm teaching somebody, and again, there's a question of who's the technologist.
01:24:10.000 --> 01:24:15.279
So obviously it doesn't make sense to say if I'm teaching Connor today APL, because you already know.
01:24:15.279 --> 01:24:20.399
But if I was teaching Connor seven years ago APL, what would be the first things he should learn?
01:24:20.399 --> 01:24:21.920
And they would put that on the white level.
01:24:21.920 --> 01:24:24.399
Then what would I teach him next on the green level?
01:24:24.399 --> 01:24:26.239
What would I teach him next on the blue level?
01:24:26.239 --> 01:24:27.279
That's a whole different thing.
01:24:27.279 --> 01:24:33.119
That's not a question of how difficult they are, but just of a pedagogically worked out lesson plan.
01:24:33.119 --> 01:24:37.680
But that probably corresponds more to the belts of martial arts, right?
01:24:37.680 --> 01:24:42.079
They don't say, oh, if a black belt means you're doing something more complicated.
01:24:42.079 --> 01:24:45.760
That just means more experience, you've learned more.
01:24:45.760 --> 01:24:47.439
It's like complexity.
01:24:47.439 --> 01:24:50.720
This is really the crux of it, I would say.
01:24:50.720 --> 01:24:55.359
Who's the target audience and what are you trying to do for that target audience?
01:24:55.359 --> 01:24:58.880
And then it's not dead, then you then you can do it.
01:24:59.279 --> 01:25:00.079
Yeah, Max.
01:25:00.079 --> 01:25:05.199
I mean, that's the problem, is that everybody there's a billion ways you can look at a thing like this.
01:25:05.199 --> 01:25:13.439
People mentioning teaching basics, Max is mentioning frequency of glyph usage and existing coding problems.
01:25:13.840 --> 01:25:15.760
But that doesn't mean that they're simple.
01:25:15.760 --> 01:25:17.199
That's just that's a different thing.
01:25:17.199 --> 01:25:19.760
Then it's color-coded frequency analysis.
01:25:19.760 --> 01:25:21.520
That's that's something else.
01:25:21.520 --> 01:25:24.319
It's also interesting to know how often primitives are used.
01:25:24.640 --> 01:25:28.560
But I yeah, I don't think Max, I think I'm more in line with what Max is thinking, though.
01:25:28.560 --> 01:25:33.760
It's that like, you know, I have you know, we can what what was the last one we we were trying to add here?
01:25:33.760 --> 01:25:35.279
Is like matrix inversion.
01:25:35.279 --> 01:25:37.039
It's like I said, like I've used this once.
01:25:37.039 --> 01:25:40.560
And yeah, that's my personal experience, but like this rarely comes to the case.
01:25:40.720 --> 01:25:42.000
So that's like build, right?
01:25:42.079 --> 01:25:44.560
You can basically remove it from APL and nobody would cry.
01:25:44.560 --> 01:25:52.560
Nobody would uh if you remove this versus like reduce, like obviously reduce is a bread and butter thing versus matrix inversion.
01:25:52.560 --> 01:25:56.640
And I mean, how many APLs actually have like BQN doesn't have it?
01:25:56.880 --> 01:25:58.239
What matrix inversion?
01:25:58.239 --> 01:26:05.680
Yeah, I don't ever every proper APL will have it because it's it's standard, it's been there since almost day one.
01:26:05.680 --> 01:26:09.119
It was I mean BQN's an APL and it doesn't have it.
01:26:09.119 --> 01:26:11.600
Okay, but that's the question of the definition of APL.
01:26:11.600 --> 01:26:18.319
Anything that I would say has the label APL, has the name APL, will have it essentially, because it's part of the standard.
01:26:18.319 --> 01:26:20.399
There's an APL standard, the ISO standard.
01:26:20.399 --> 01:26:27.199
And if you if you even if you like adhere somewhat to that standard, you'll have it because this is breaking news.
01:26:27.439 --> 01:26:30.079
Adam declares BQN not an APL.
01:26:30.079 --> 01:26:31.920
No, no, I'm not saying that.
01:26:31.920 --> 01:26:33.279
But you just did say that.
01:26:33.359 --> 01:26:37.520
You said every APL that no APL that has the APL label, right?
01:26:37.520 --> 01:26:42.319
BQN doesn't say that that it is just an an APL dialect, right?
01:26:42.319 --> 01:26:46.000
It's an A it's an APL, yeah, it does say it's an APL for a flying saucer.
01:26:46.000 --> 01:26:46.960
What's gonna say?
01:26:46.960 --> 01:26:48.800
Doesn't it say it's like a modern APL?
01:26:48.800 --> 01:26:53.840
Yeah, it's like but it's there's some pretty radical differences too.
01:26:53.840 --> 01:27:01.279
So it's it's an it's another we can do a whole episode on what is an APL, and we've had the question of what is an IVS and Yan language, so on.
01:27:01.279 --> 01:27:14.479
So I tend to go by by something like APL wiki's definition, which which is basically that it's recognizably something like APL 360 superset or something like that.
01:27:14.479 --> 01:27:22.720
At least the basic glyphs are the same as in as in good old APL and and the RAI model and so on.
01:27:22.720 --> 01:27:26.960
As soon as you depart that would make make J not an APL, right?
01:27:26.960 --> 01:27:31.039
Others would argue APJ is an APL, it's just a matter of spelling.
01:27:31.039 --> 01:27:38.560
And of course, if you took APL as is and replaced every glyph with some keyword, then is it still APL?
01:27:38.560 --> 01:27:41.279
Are you according to the APL wiki definition?
01:27:41.279 --> 01:27:42.159
No, it's not an APL.
01:27:42.159 --> 01:27:46.159
Madeleine's saying that APL wiki has an APL dialect category.
01:27:46.159 --> 01:27:46.800
Yeah.
01:27:46.800 --> 01:27:48.720
And DQN is not in that list.
01:27:48.720 --> 01:27:56.000
It has the it does there's a there's some text in in the APL wiki on what is APL.
01:27:56.000 --> 01:27:59.840
It's an interesting question, but it's a whole different question, right?
01:27:59.840 --> 01:28:13.119
So that's why like it's amazing this uh vibe coding, don't get me wrong, you can do beautiful looking things in short time, but you still have to have the human asking themselves, okay, what is what am I actually trying to do here?
01:28:13.119 --> 01:28:15.920
And I'm not shooting this down, I don't mean to kill this.
01:28:15.920 --> 01:28:17.119
I think it's a cool idea.
01:28:17.119 --> 01:28:21.840
This has nothing to do with vibe coding versus humans.
01:28:21.840 --> 01:28:22.720
I mean, uh humans.
01:28:22.720 --> 01:28:32.399
No, no, no, but no, the vibe coding makes it very easy to go from zero to something in no time, but you need to you still need to to take a step back and think, okay, what am what am I actually doing here?
01:28:32.399 --> 01:28:33.840
Is the ABL dojo?
01:28:33.840 --> 01:28:37.920
We're gonna grade the primitives and the expressions and the concepts and the other thing.
01:28:37.920 --> 01:28:40.239
But I really push back on that.
01:28:40.319 --> 01:28:45.199
I think the problem here is that we've just decided to drown in nuance and like at a certain point.
01:28:45.600 --> 01:28:48.399
What kind of nuance are we do you want to get rid of?
01:28:48.399 --> 01:28:52.720
I'm all for removing the nuance, otherwise you can't put things into five categories, right?
01:28:52.720 --> 01:28:55.520
But what kind of nuance are you getting do you want to get rid of?
01:28:55.520 --> 01:28:58.000
Or and what kind of grading or what is weird grading?
01:28:58.000 --> 01:28:59.439
What does it mean, difficulty?
01:28:59.439 --> 01:29:01.199
Is it difficulty again?
01:29:01.199 --> 01:29:03.039
Uh LCM, right?
01:29:03.039 --> 01:29:07.600
And GCD, they are not syntactically difficult.
01:29:07.600 --> 01:29:11.680
From an APL perspective, they are just uh scalar functions.
01:29:11.680 --> 01:29:19.760
They're even simple in the sense that for for most APLs that they only exist in daddy form, so there's not even the monadic daddy duality there.
01:29:19.760 --> 01:29:21.039
Very simple functions.
01:29:21.039 --> 01:29:25.920
Do you actually understand L LCM and G C D like mathematically?
01:29:25.920 --> 01:29:31.199
It requires a whole lot of number theory and prime numbers and stuff like that.
01:29:31.199 --> 01:29:33.760
So does that make the primitives more complicated?
01:29:33.760 --> 01:29:39.119
From an APL perspective, and how I usually teach APL is they're not complicated.
01:29:39.119 --> 01:29:50.880
Because what I will do is I'll teach people some representative functions for very and for operators and so on from the various categories, syntactic categories, and then I tell them, okay, now you basically know all of APL.
01:29:50.880 --> 01:29:52.479
You just need to expand your vocabulary.
01:29:52.479 --> 01:29:53.840
It's like learning a new language.
01:29:53.840 --> 01:30:00.960
So learning the pronunciation and learning the the writing system and learning the grammar and so on, those are those are hard things.
01:30:00.960 --> 01:30:04.960
But learning another word, even if it's a long, complicated word, that's fairly simple.
01:30:04.960 --> 01:30:12.800
Even if the word stands for something that's incredibly difficult to understand, acquiring that one more word in the language isn't really hard.
01:30:12.800 --> 01:30:16.720
Just understanding the concept is hard, but syntactically you can use it.
01:30:16.720 --> 01:30:20.640
So you can use quantum physics correctly in a sentence.
01:30:20.640 --> 01:30:23.680
But do you actually understand quantum physics?
01:30:23.680 --> 01:30:31.680
So if you were to grade English compound nouns in a list of dip by difficulty, why where do you grade quantum physics?
01:30:31.680 --> 01:30:39.840
It's not a it's not hard to spell, it's not no complicated pronunciations or anything, it's a fairly simple phrase of two words.
01:30:39.840 --> 01:30:42.880
But understanding what it stands for is much harder.
01:30:42.880 --> 01:30:43.840
Same thing here.
01:30:43.840 --> 01:30:44.960
The and symbol.
01:30:44.960 --> 01:30:47.520
Syntactically, it's straightforward.
01:30:47.520 --> 01:30:49.039
The symbol is not hard.
01:30:49.039 --> 01:30:52.079
And the how it behaves with data, very simple.
01:30:52.079 --> 01:30:54.399
What it does, that's complicated.
01:30:54.399 --> 01:30:56.000
What is it that we're grading here?
01:30:56.000 --> 01:30:56.640
That's all I'm asking.
01:30:56.640 --> 01:30:58.239
I'm just trying to shoot this down.
01:30:58.239 --> 01:31:01.920
We have some fun stuff going on in the chat here.
01:31:03.920 --> 01:31:11.279
Yeah, I mean, I agree with Madeline earlier in the chat when she said that teaching is all about nuance.
01:31:11.279 --> 01:31:13.039
I mean, I completely agree.
01:31:13.039 --> 01:31:21.359
There's a reason why I'm trying to build the whatever bells and whistles in the panel, and the same thing with the comparison mode and array box.
01:31:21.359 --> 01:31:32.960
But like it's like when I was talking with Ben Dean on ADSP about how you know teaching is just a series of lying to you less, you know, you omit stuff.
01:31:32.960 --> 01:31:38.640
Because right now, like, you know, and that's the thing is you're saying, what are we trying to do here?
01:31:38.640 --> 01:31:41.680
I have a very clear understanding of what I want to do.
01:31:41.680 --> 01:31:46.399
It's that other people have different ideas of is this a pedagogical teaching tool?
01:31:46.399 --> 01:31:47.760
Is this for beginners?
01:31:47.760 --> 01:31:49.680
Is this for someone that knows whatever?
01:31:49.840 --> 01:31:52.000
But like I don't disagree with you, Connor.
01:31:52.000 --> 01:31:54.560
I'm just trying to pull the information out of you.
01:31:54.560 --> 01:31:56.319
What is that thing you have in your head?
01:31:56.319 --> 01:31:58.079
Because it's not clear to me what you're trying to achieve.
01:31:58.079 --> 01:31:58.800
I asked you before.
01:31:58.960 --> 01:31:59.680
And it was very clear.
01:32:00.079 --> 01:32:00.960
You said it multiple times.
01:32:01.119 --> 01:32:07.119
It's that I want this to be a thing where people can look at and say, I'm roughly at this level.
01:32:07.119 --> 01:32:11.840
Here are some concepts that are like currently I have not like learned or put in my tool belt.
01:32:11.840 --> 01:32:17.279
Because in general, like my experience in learning the array languages is that some things are just obvious.
01:32:17.279 --> 01:32:21.039
And yes, that is informed by your experience and what are the programming languages you've learned.
01:32:21.039 --> 01:32:22.479
It's going to be different for every single person.
01:32:22.479 --> 01:32:23.439
I understand all that.
01:32:23.439 --> 01:32:29.279
I'm not trying to ignore that someone learned Python or someone doesn't know any programming or someone is good at math or isn't good at math.
01:32:29.279 --> 01:32:31.039
Everybody's experience is different.
01:32:31.039 --> 01:32:35.279
But in general, you pick up certain primitives, certain tools, certain concepts.
01:32:35.279 --> 01:32:38.000
Like I said, for me, I learned two, comma slash.
01:32:38.000 --> 01:32:39.760
I didn't realize that could generalize.
01:32:39.760 --> 01:32:48.960
And like having like N-wise reduction as a thing that like you could look at in a tool, and like there's a ton of these, and they are they exist in different array languages.
01:32:48.960 --> 01:32:57.039
But it seems like, you know, when we have this discussion, it's very quickly just like, oh, well, if you talk about IOTA, we got to talk about you know the 17 different flavors of IOTA.
01:32:57.039 --> 01:33:04.640
There's rank zero, there's rank one, it's different between jades, and it's just like, okay, well, then the tool can't exist because there's just too much nuance.
01:33:04.640 --> 01:33:23.199
And like, yes, we can drown in nuance, but like in general, depending on the tasks that you're doing, and that's the thing, is I have to say, depending on the task, because the tasks that I'm doing are different than the tasks that the graphics programming are doing, like, there in general are a set of primitives and techniques that you reach for on average more than others.
01:33:23.199 --> 01:33:32.239
And like the goal is to try and like put those on a kind of star map or a tier list that can expose them to people sooner rather than later.
01:33:32.239 --> 01:33:43.279
The fact that, you know, prefixes is available in Wiwa in the tuples primitive, like if you have a prefix concept and then you can, you know, hover over it and it shows that you know it's spellable a certain different ways.
01:33:43.279 --> 01:33:50.479
Anyways, it like, but I I I just feels like this kind of thing and it honestly it makes if yeah, I don't know.
01:33:50.479 --> 01:33:59.520
If this is the way that the conversation happens when you try to build a tool like this, that you have to either evaporate all nuance and just get a linear list of primitives, or it's too complicated.
01:33:59.520 --> 01:34:12.880
Like it's it's unsurprising that so many people bounce off of these languages because it's just like there is an easy path where you like over time learn things and you pick up a new thing, but it's just it feels like in trying to do this, it's just like, oh well.
01:34:13.359 --> 01:34:16.079
I think I I think that's there isn't one path.
01:34:16.079 --> 01:34:24.640
I think there are many paths, and then it's more like what Loka was saying, like, okay, so this is a course material, but then you have to choose your way, your path in.
01:34:24.640 --> 01:34:27.039
And I think that depends a lot on the person.
01:34:27.039 --> 01:34:31.039
It doesn't happen so much anymore, maybe because I'm not around so much.
01:34:31.039 --> 01:34:37.760
But usually when I see a new face, new avatar in the APL orchard, then I ask them, hey, interest in APL.
01:34:37.760 --> 01:34:46.159
And then sometimes it's somebody that doesn't know about APL, only heard about it, something, and sometimes I offer them like an intro course or even a full course in APL in the chat.
01:34:46.159 --> 01:35:06.159
And I usually my my the first thing I do is I I ask them if politely if they will tell a little bit about themselves because their background, whether they have programming background and which language is their programming language uh experience with, if any, their their knowledge and interest makes a huge difference to how I would approach them.
01:35:06.159 --> 01:35:13.279
So somebody who is like a mathematician and all and and into like theoretical things, so I have a very different approach to somebody who is a programmer.
01:35:13.279 --> 01:35:21.520
If somebody is a child that doesn't know a little whole lot of mathematics, then they'll try to avoid the mathematical things and and so on.
01:35:21.520 --> 01:35:32.399
So I it I think it depends a lot on the audience, and it's fair enough to say, okay, we imagine Connor, or maybe imagine Connor seven years ago, what would have been the best thing for you?
01:35:32.399 --> 01:35:40.560
And that's fine, just like Stefan Kruger wrote his book saying that this is the book that he wished would have been there for himself when he started learning.
01:35:40.560 --> 01:35:44.000
And there will be other people who are in a similar position to him, and it'll be useful for them.
01:35:44.000 --> 01:35:59.199
And I don't think it's a bad thing to have the Connor's APL dojo, and and for people who are sort of similar to where you were seven years ago, they would come in and see, okay, she learned these things and these things, and then it becomes sort of a course, and you get the belt, and when she's up to the black belt, and you can do a whole bunch of stuff.
01:35:59.199 --> 01:36:00.159
I think that's fine.
01:36:00.159 --> 01:36:01.439
I don't have a problem with that.
01:36:01.439 --> 01:36:10.239
As long as it's clear what we're trying to grade to grade, and then we can say, okay, Connor seven years ago, the war you're familiar with matrix inverses, right?
01:36:10.239 --> 01:36:11.920
No, yes, was it complicated?
01:36:11.920 --> 01:36:12.800
Could you pick it up?
01:36:12.800 --> 01:36:14.479
And then we grade it according to that.
01:36:14.479 --> 01:36:17.520
If you want to include all the concepts that APL includes.
01:36:17.520 --> 01:36:33.840
Because APL, as opposed to many programming languages, comes with a lot of it's not really the batteries includes included, but it's got a lot of, especially J has, and a lot of like mathematical things that that are included in the core language that you don't usually see including.
01:36:33.840 --> 01:36:42.560
There are no other real-world production series languages that have matrix inversion as a single glyph.
01:36:42.560 --> 01:36:44.000
That doesn't exist.
01:36:44.000 --> 01:36:47.520
There are those that have inner product as a as a single glyph.
01:36:47.520 --> 01:36:50.800
Yeah, so but that I think that's fine.
01:36:50.800 --> 01:36:52.479
I think it's perfectly valid to do this.
01:36:52.479 --> 01:36:53.600
Don't get me wrong.
01:36:53.600 --> 01:36:56.319
And if this is clear, yeah, let's go for it.
01:36:56.319 --> 01:37:00.399
But then the answer to every question as to how complex this is is asking you.
01:37:00.399 --> 01:37:04.000
Think about seven years ago, how difficult do you think this would have been for you?
01:37:04.000 --> 01:37:06.479
And think about this, how difficult would that be for you?
01:37:06.479 --> 01:37:11.760
And then you can put in the various concepts, you can leave out some things, you know, oh yeah, inwise reduced, two wise reduced.
01:37:11.760 --> 01:37:15.279
Yeah.
01:37:15.279 --> 01:37:18.319
Have you I never really got an answer to that.
01:37:18.319 --> 01:37:20.960
Have you looked at uh at the APL challenge lately?
01:37:20.960 --> 01:37:22.319
Yeah, I always do it.
01:37:22.319 --> 01:37:22.880
Okay.
01:37:22.880 --> 01:37:38.560
So so you there you have uh again, I don't have a talking audience uh that's a specific person, but I have in mind like kids, maybe like early teens or something like that, and trying to phrase it in such a way and build up level by level.
01:37:38.560 --> 01:37:41.279
And so there I don't teach all of APL, obviously.
01:37:41.279 --> 01:37:53.920
I teach so it's just some basics, and I try to make the tenth problem out of the 10 be a problem that is at least moderately interesting to do, where you do something that sort of looks nice or has a nice idea, concept.
01:37:53.920 --> 01:38:00.319
So for example, the the current one we build up to to determining whether a a square is a magic square.
01:38:00.319 --> 01:38:02.159
Sort of a cute thing to do.
01:38:02.159 --> 01:38:07.520
So you just learn learn just enough to be able to do that, but we get to dyadic transpose.
01:38:07.520 --> 01:38:15.760
Okay, so this is a from nothing course, a 10-step course that where where we end with dyadic transpose.
01:38:15.760 --> 01:38:16.800
So what happened?
01:38:16.800 --> 01:38:17.920
That black belt?
01:38:17.920 --> 01:38:18.239
No.
01:38:18.239 --> 01:38:21.680
You know by the end of this course, you know a fraction of APL.
01:38:21.680 --> 01:38:22.640
Tiny fraction.
01:38:22.640 --> 01:38:25.840
But you do know something about dyadic transpose, at least for a matrix.
01:38:26.640 --> 01:38:31.279
Yeah, I mean there's a a bunch of different paths, tools, and stuff.
01:38:31.680 --> 01:38:32.079
Yeah.
01:38:32.079 --> 01:38:45.439
I think they're all valid, and unless we can make some really clever AI that somebody is suggesting in the chat here as well, that can adapt to people automatically, maybe analyzing all the times that I've taught people APL in chat.
01:38:45.439 --> 01:38:54.239
I don't think it will actually work, but maybe because the problem is the AIs don't actually understand APL or any other programming language, so I'll venture to say.
01:38:54.560 --> 01:38:56.159
That's actually not true anymore.
01:38:56.159 --> 01:39:05.039
I mean, it successfully wrote profiling for every single one of the six languages that I wrote that I that I have on these sites.
01:39:05.199 --> 01:39:12.000
Like it knows quad underscore measure is tiny APLs thing, it knows the system timed thing from BQN.
01:39:12.239 --> 01:39:15.439
It's not it doesn't okay.
01:39:15.439 --> 01:39:16.640
Anyway, that's another discussion.
01:39:16.640 --> 01:39:22.319
There are lots of videos on YouTube, people discussing whether AI systems, LMS and so on, know anything, understand anything.
01:39:22.319 --> 01:39:24.640
That's not we don't have to take that discussion here.
01:39:24.640 --> 01:39:28.960
I doubt that it can be done well, but hey, maybe, maybe one day.
01:39:28.960 --> 01:39:31.279
So yeah, we can do this.
01:39:31.279 --> 01:39:32.800
Let's get let's get going.
01:39:32.800 --> 01:39:33.439
Let's start.
01:39:33.439 --> 01:39:37.039
We're 20 minutes past the hour and a half mark.
01:39:37.039 --> 01:39:39.920
That means we're almost okay, okay.
01:39:39.920 --> 01:39:42.960
Almost at the two-hour mark, then is how it's put it.
01:39:42.960 --> 01:39:46.159
Yeah, but I think this is potentially useful, right?
01:39:46.159 --> 01:39:49.760
We hashed out some of the issues that are involved in making something like this.
01:39:49.760 --> 01:39:56.319
We've narrowed down the scope of what is you're trying to do with it and and the and the goals and what we're not trying to do, right?
01:39:56.319 --> 01:39:58.399
You can't be comprehensive, we can't do everything.
01:39:58.399 --> 01:40:02.720
Yeah, I think it would be useful to not.
01:40:02.720 --> 01:40:11.119
I mean, I I know you like the color, but I think that itself is a barrier to have all this colour-coded and information.
01:40:11.119 --> 01:40:21.199
If I come to this as a complete new B, it's hard for me to put myself into the shoes of somebody completely new to APL, but I do tend to do it a lot because I teach people, right?
01:40:21.199 --> 01:40:23.119
This would be very overwhelming.
01:40:23.119 --> 01:40:27.039
Even what I'm seeing just here is already like, whoa, what are all these things?
01:40:27.039 --> 01:40:33.680
I think just some some much more neutral things that even with just the name that I can read, because I don't even know how to pronounce any of this.
01:40:33.680 --> 01:40:37.840
I can't refer to the to the right tech, because I don't know how to say right tech.
01:40:38.399 --> 01:40:44.640
So, so I think But like well, like I said, this is not designed for begin it's designed for me, you know?
01:40:44.800 --> 01:40:45.760
Yeah, yeah, I understand.
01:40:45.760 --> 01:40:47.439
So that's that that's the thing.
01:40:47.439 --> 01:40:50.000
But even for you, you didn't know all the glyphs either.
01:40:50.000 --> 01:40:51.920
Even though you had now I've heard you in the various parts of the city.
01:40:52.720 --> 01:40:54.640
You keep referring to the seven-year version of me.
01:40:54.640 --> 01:40:57.279
Like it's not designed for seven-year version of me.
01:40:57.279 --> 01:41:00.319
It hopefully is useful to that, but it's designed for me, like me now.
01:41:00.319 --> 01:41:02.880
The guy now, but you okay.
01:41:03.039 --> 01:41:06.399
Like, but but right now you're pretty high up in your belts, right?
01:41:06.399 --> 01:41:08.159
No, I think I'm blue.
01:41:08.319 --> 01:41:09.039
I think I'm blue.
01:41:09.119 --> 01:41:09.760
Yeah, that's it.
01:41:09.920 --> 01:41:18.880
I'm like, there's a bunch of stuff up here that I don't know, and the goal was to kind of fill this stuff out, and it's like, what is okay useful for someone here or someone here?
01:41:18.880 --> 01:41:23.840
Like, yes, I didn't know NWE reductions at one point, and so I was green at one point, and I was white.
01:41:23.840 --> 01:41:34.720
It's supposed to be useful for a bunch of people, but like honestly, selfishly, the same reason that I I built a Ray Box, if we can iterate over here, the reason I bought this built this was for me.
01:41:34.720 --> 01:41:37.199
Yes, other people can find it useful, hopefully.
01:41:37.199 --> 01:41:46.800
But like I wanted a nicer tiny Apple cap REPL, and like the main thing is when I make YouTube videos and things and I'm switch, I'm always switching, and it's such a pain.
01:41:46.800 --> 01:41:48.960
And like the docs are all over the place.
01:41:48.960 --> 01:41:52.880
Like for some languages, they you know, it's easy accessible, other ones.
01:41:52.880 --> 01:41:55.439
So I've always got like 20 different tabs open.
01:41:55.439 --> 01:42:00.079
I've got four different repls, and I I can't remember all the ways to type the glyphs.
01:42:00.079 --> 01:42:03.439
And so now I have a super easy way that I can you know flip through these.
01:42:03.439 --> 01:42:05.840
It's got a certain amount of like primitive translation.
01:42:05.840 --> 01:42:08.000
If I forget something, I can look at the keyboard.
01:42:08.000 --> 01:42:10.399
If I know the name, I can just like control space.
01:42:10.399 --> 01:42:12.159
Like it's a tool I built for myself.
01:42:12.159 --> 01:42:14.479
A ton of people would probably argue it's hard to use.
01:42:14.479 --> 01:42:15.199
Where's the help?
01:42:15.199 --> 01:42:15.760
You know what?
01:42:15.760 --> 01:42:20.720
If you hit F5 for 10 seconds, it shows you how to get the keyboard, how to get the help.
01:42:20.720 --> 01:42:21.359
You know what?
01:42:21.359 --> 01:42:27.359
It's not designed for like a hundred percent of everyone that hits this is gonna get it find it the most useful.
01:42:27.359 --> 01:42:33.039
It's for me, and I want it to be beautiful, and like it, it's it's also like primarily keyboard driven.
01:42:33.039 --> 01:42:34.640
It's not designed to be used with the most.
01:42:34.640 --> 01:42:37.119
If you if you bring the keyboard up, you can't really click.
01:42:37.119 --> 01:42:39.680
And I think that was a thing that like you asked for at one point.
01:42:39.680 --> 01:42:43.760
I designed this for me, and hopefully other people find it useful, and it's open for PRs.
01:42:43.760 --> 01:42:46.479
Like, there was someone who, you know, they contributed.
01:42:46.479 --> 01:42:51.520
I think it's I know I know it's been merged, but I think it'll work if we do this.
01:42:51.520 --> 01:42:54.000
If you hover over this, you know, someone contributed this.
01:42:54.000 --> 01:42:56.479
They were just like, oh, you know, this is kind of like BQN.
01:42:56.479 --> 01:43:00.960
I'm happy to accept contributions as long as it doesn't like ruin my design.
01:43:00.960 --> 01:43:07.760
But the point being is this is a thing that I'm designing for myself and then putting out into the world that hopefully other people will find useful.
01:43:07.760 --> 01:43:12.399
But if no one else finds it useful, it's still a win for me because this is how I primarily use stuff.
01:43:12.399 --> 01:43:14.640
That's the same goal for APL Dojo.
01:43:14.640 --> 01:43:19.359
I'm not thinking about the beginner, I'm not thinking about you know a hundred other flavors.
01:43:19.680 --> 01:43:23.760
I'm not actually We're sort of I don't know if we're running out of time.
01:43:23.760 --> 01:43:27.359
I've got time, but it's but at some point we want to draw a line.
01:43:27.359 --> 01:43:27.760
Yeah, yeah.
01:43:27.760 --> 01:43:38.720
Let me throw out just as an ex some examples, because because if this is really for Connor, to know like if you want to get better at these languages, what are you likely missing?
01:43:38.720 --> 01:43:38.960
Right?
01:43:38.960 --> 01:43:59.840
You've been going on APL for seven years, which means you have picked up some advanced stuff and some things you've probably completely neglected, often because the type of things you do, if you excuse the phrase, toy problems, you don't touch so much on certain more everyday business type things, or maybe you don't do so much advanced math, so you don't touch on those things.
01:43:59.840 --> 01:44:03.600
So it's sort of hard for me to know, of course, which things you have not you have not seen.
01:44:03.600 --> 01:44:07.600
But let me throw some things out at you that you might not have done.
01:44:08.000 --> 01:44:26.319
I mean, that was supposed to be the goal of the APL Tojo is that like you don't know what you don't know, and then every once exactly you run into like an N-Wise reduction, and you're like, it is for a lot of people, or at least it was for me, when I discovered the NWISE reduction, it was the first time I encountered like windowing algorithms in any programming language, and it blew my mind.
01:44:26.319 --> 01:44:30.800
Same thing with outer product, like outer product, first time I encountered it was in APL.
01:44:30.800 --> 01:44:42.319
Yes, Haskell has an outer product function in some library, but like a ton of the algorithm like ideas and techniques I discovered in APL, that is essentially what it's for.
01:44:42.319 --> 01:44:45.279
It's not for exhaustively listing out the primitives.
01:44:45.279 --> 01:44:50.239
Like the reason that IOTA's here is because it's like, I don't know, a bread and butter amazing.
01:44:50.239 --> 01:45:04.079
Like again, ideally, this is fleshed out with like the most coolest, you know, like unkeep from Weewa, which is like run length and code and a bunch of those things that like people can at a glance hover their thing and be like, oh, that's cool.
01:45:04.079 --> 01:45:10.399
And also for me, you know, I'd like to be a black belt, but you know, uh this is supposed to be like a hack.
01:45:10.399 --> 01:45:17.199
And it would work better if we had the full panel of you know a bunch of different people from languages contributing the best techniques.
01:45:17.199 --> 01:45:20.079
But anyways, go ahead and throw out I can probably go for like 10 more.
01:45:21.359 --> 01:45:25.680
Okay, I'll throw a couple of a couple of things at you just think off my head.
01:45:25.680 --> 01:45:30.159
Sometimes you want to normalize an array so that it's not a scalar.
01:45:30.159 --> 01:45:32.960
Are you familiar with one slash in APL?
01:45:33.279 --> 01:45:34.239
One slash?
01:45:34.239 --> 01:45:38.720
No, but also too, I was kind of catching up on the chat, so I missed the first little something with a scalar.
01:45:38.960 --> 01:45:41.920
Okay, so yeah, so sometimes you have you you want to normalize.
01:45:41.920 --> 01:45:43.920
You want if it's a high rank array, keep it the way it is.
01:45:43.920 --> 01:45:45.279
If it's a vector, keep it the way it is.
01:45:45.279 --> 01:45:47.279
If it's a scalar, you want to ravel it.
01:45:47.279 --> 01:45:50.640
You want to make it a one-element vector, so you have an axis to work on, right?
01:45:50.640 --> 01:45:55.119
So, how do you normalize an array to always be at least rank one?
01:45:55.119 --> 01:45:58.159
You can do that in the APL with one slash.
01:45:58.159 --> 01:45:59.439
That's a cool technique.
01:45:59.439 --> 01:46:00.800
You might not have realized.
01:46:00.800 --> 01:46:03.600
It's just a just an example of I definitely didn't know this.
01:46:03.600 --> 01:46:07.760
So okay, so this doesn't it's a no-up for every array except a scalar.
01:46:07.760 --> 01:46:09.920
For a scalar, it does a revel on it.
01:46:09.920 --> 01:46:11.920
So it's like revel if scalar.
01:46:11.920 --> 01:46:12.880
Yeah, okay.
01:46:12.880 --> 01:46:15.199
So we need to so what is this?
01:46:15.199 --> 01:46:17.279
It's a monadic function expression.
01:46:17.279 --> 01:46:19.279
It's it's not a function at all.
01:46:19.279 --> 01:46:20.720
It's a snippet.
01:46:20.720 --> 01:46:25.359
You can you could wrap it to become a function, but it's yeah, it's because expression, yeah.
01:46:25.359 --> 01:46:27.279
I mean it's a manadic.
01:46:27.279 --> 01:46:29.680
Oh, then that's there's a there's a bug here in the dojo.
01:46:29.680 --> 01:46:32.960
But it only primitives can be have that subtype, right?
01:46:32.960 --> 01:46:34.960
Expressions and concepts don't have subtypes.
01:46:35.199 --> 01:46:38.800
No, I added this so that it would you you were the one that pointed this out when I sent you.
01:46:38.800 --> 01:46:41.680
It's that like, oh, these have derived erity, right?
01:46:41.680 --> 01:46:42.560
This is a manadic function.
01:46:42.720 --> 01:46:44.159
Yeah, but this one does this one doesn't.
01:46:44.159 --> 01:46:45.840
It's not a monadic function at all.
01:46:45.840 --> 01:46:46.800
It's just a snippet.
01:46:46.800 --> 01:46:50.399
It doesn't have you can't assign in the in dialogue APL, you cannot assign this a name.
01:46:50.399 --> 01:46:53.199
It's not a valid syntactic construct, it's just a snippet.
01:46:53.199 --> 01:46:55.279
It's a technique if you want, or an expression.
01:46:55.279 --> 01:46:56.399
It doesn't have a value.
01:46:56.399 --> 01:46:58.880
If you enter this into the REPL, it will error.
01:46:58.880 --> 01:47:01.920
But you're applying this monadically, correct?
01:47:01.920 --> 01:47:02.560
No.
01:47:02.560 --> 01:47:03.199
Yeah.
01:47:03.199 --> 01:47:08.720
The point is specifically replicate with a scalar one as left argument, right?
01:47:08.720 --> 01:47:14.239
So the way I write it in Apple card, I would write one jot slash, but you don't actually want to ever write the jot.
01:47:14.880 --> 01:47:16.079
So but I'm I'm confused though.
01:47:16.079 --> 01:47:17.439
But we did not just apply this.
01:47:17.840 --> 01:47:18.960
It's a technique, right?
01:47:18.960 --> 01:47:20.960
No, this is dyadic slash.
01:47:20.960 --> 01:47:24.640
One slash is not a thing, it's dyadic slash slash is a function.
01:47:24.640 --> 01:47:28.399
It's applied with one as left argument and IOTA six as right argument.
01:47:28.399 --> 01:47:32.239
But it's a technique, it's a it's a tool in your toolbox to write.
01:47:32.239 --> 01:47:36.399
Oh, I need to normalize this so it's always has at least one axis, one slash.
01:47:36.720 --> 01:47:37.600
I mean, this is what I mean.
01:47:37.600 --> 01:47:39.279
This is what I mean by drowning in nuance.
01:47:39.279 --> 01:47:43.199
So like the point that you're making, your point that you're making is that like this is a valid expression.
01:47:44.079 --> 01:47:44.640
Yeah, sure.
01:47:44.640 --> 01:47:46.079
This is a valid function, right?
01:47:46.079 --> 01:47:48.079
A divided function, one jot slash.
01:47:48.079 --> 01:47:48.800
But that doesn't matter.
01:47:48.800 --> 01:47:53.680
I wasn't even trying to argue with the with the denimization in in in the APL Georgia.
01:47:53.680 --> 01:47:57.279
I was actually trying to give you a useful tool in your toolbox that you might not have known about.
01:47:57.279 --> 01:48:00.640
It doesn't matter how you ever you categorize it, it's up to you.
01:48:00.640 --> 01:48:09.600
In uh tiny APL and in some other in K and so on, it would it would be considered a monadic function, the monadic derived function, I guess.
01:48:09.600 --> 01:48:11.680
That doesn't categorize it as you want.
01:48:11.680 --> 01:48:12.000
Okay.
01:48:12.000 --> 01:48:14.960
It's a useful thing.
01:48:14.960 --> 01:48:19.119
Are you sometimes you yeah, sure, put it like that.
01:48:19.119 --> 01:48:21.600
That's but that's not yeah, okay.
01:48:21.600 --> 01:48:23.199
It just doesn't describe what it does.
01:48:23.199 --> 01:48:25.680
It's just a symbol, but yeah, that's fine.
01:48:25.680 --> 01:48:28.159
Yeah, you have to grade it.
01:48:28.159 --> 01:48:30.800
Okay.
01:48:30.800 --> 01:48:31.439
Good.
01:48:31.439 --> 01:48:38.000
Are you familiar with how to count if you have a Boolean vector to count the number of trailing ones?
01:48:38.000 --> 01:48:40.880
Like the tail end, how many ones are there at the tail?
01:48:40.880 --> 01:48:41.920
You ever seen that?
01:48:41.920 --> 01:48:44.720
I've seen you do it once, like I could solve it.
01:48:44.720 --> 01:48:48.880
Yeah, up up tech commute up self if you want.
01:48:48.880 --> 01:48:51.680
Oh yeah, this one.
01:48:51.680 --> 01:48:56.000
Yeah, and then you like one zero, yeah, whatever, it doesn't matter.
01:48:56.000 --> 01:48:57.520
Yeah, so this gives four.
01:48:57.520 --> 01:48:59.680
This is a nice tool in your toolbox.
01:48:59.680 --> 01:49:01.119
It doesn't have a name as such.
01:49:01.119 --> 01:49:02.880
And special maybe.
01:49:02.880 --> 01:49:12.720
And you you're you're you're aware of dadic transpose with all one all the index origin left argument, right?
01:49:12.720 --> 01:49:14.239
Gives you the diagonal.
01:49:14.239 --> 01:49:16.079
It's completely nothing to do with this one.
01:49:16.079 --> 01:49:21.359
I'm just giving another another one that's like something that that to put in your a tool in your belt.
01:49:21.359 --> 01:49:23.359
So sorry, I'm just going too fast.
01:49:23.359 --> 01:49:25.760
So this is a monetic function.
01:49:25.760 --> 01:49:28.720
It's not a primitive, but it is monetic function.
01:49:28.880 --> 01:49:29.119
Yeah.
01:49:30.399 --> 01:49:34.640
So so for for a matrix especially, one one jot transpose.
01:49:34.640 --> 01:49:36.399
This one you're familiar with?
01:49:36.399 --> 01:49:38.800
You should be if you've done the APL challenge.
01:49:38.800 --> 01:49:45.920
So it on a so one one jot transpose on you don't actually need the jot normally, but if you want to make it a function, then yes.
01:49:45.920 --> 01:49:48.800
On a m on a matrix, it gives you the diagonal.
01:49:48.800 --> 01:49:51.199
Yeah, I definitely didn't know that.
01:49:51.199 --> 01:49:52.000
Okay.
01:49:52.000 --> 01:49:55.199
You didn't know that's nice, that's the diagonal of a matrix.
01:49:55.199 --> 01:49:56.319
That's how you do it.
01:49:56.319 --> 01:50:01.600
Okay, here's another one.
01:50:01.600 --> 01:50:09.600
If you got a positive number, you want to split it into the integral part and the fractional part, you can write one zero jot encode.
01:50:09.600 --> 01:50:10.960
You ever seen that?
01:50:11.359 --> 01:50:13.039
One zero jot.
01:50:14.079 --> 01:50:17.760
You don't actually again you don't need the jot, but yeah, just to make it a function.
01:50:17.760 --> 01:50:21.840
Yeah, so you write one two three one two three point four five six.
01:50:21.840 --> 01:50:23.680
You split it.
01:50:23.680 --> 01:50:24.880
Sorry, this was wrong.
01:50:24.880 --> 01:50:25.840
Did I say it wrong?
01:50:25.840 --> 01:50:26.640
Zero zero one.
01:50:26.640 --> 01:50:27.279
I'm sorry.
01:50:27.279 --> 01:50:28.960
Zero one in yeah.
01:50:28.960 --> 01:50:32.079
So it splits it into the integer part and the fractional part.
01:50:32.079 --> 01:50:33.760
That's sort of a nice thing to do.
01:50:34.079 --> 01:50:38.479
Is this just like a custom it it's not special, right?
01:50:38.560 --> 01:50:43.359
It follows from the definition of encode, but it's a technique, it's a tool to have any tool belt.
01:50:43.359 --> 01:50:47.439
Like if you know this one, you're like, oh, I need to split this number into the whole part and the fractional part.
01:50:47.439 --> 01:50:48.720
Yeah, that's that's how you do it.
01:50:48.720 --> 01:50:55.760
Otherwise, you start with like, oh, the floor coordinated with, and then you know it's like the original number minus the floor.
01:50:55.760 --> 01:50:58.800
Yeah, but this is much easier to do it.
01:50:58.800 --> 01:51:01.039
And here's another one.
01:51:01.039 --> 01:51:07.439
Let's say you have a matrix and you want to rotate it 180 degrees, not flip it upside down.
01:51:07.439 --> 01:51:10.239
That's just a first axis reverse.
01:51:10.239 --> 01:51:11.760
You want to actually rotate it.
01:51:11.760 --> 01:51:16.000
So that's that's you do a rotate first, rotate last.
01:51:16.640 --> 01:51:18.960
Yeah, I think that one I've seen.
01:51:18.960 --> 01:51:20.960
But that one just kind of makes sense, right?
01:51:21.199 --> 01:51:21.760
Yeah, sure.
01:51:21.760 --> 01:51:24.960
But what about rotating 90 degrees left and right?
01:51:24.960 --> 01:51:28.479
Yeah, so this doesn't rotate, right?
01:51:28.479 --> 01:51:29.920
Up sorry, upside down.
01:51:29.920 --> 01:51:43.920
But if you want to rotate 90 degrees, you've got, for example, last axis reverse, transpose, that rotates clockwise, and clockwise and transpose, last axis reversed rotates counterclockwise.
01:51:43.920 --> 01:51:47.920
You could also spell them with in the opposite order with first axis reverse, that doesn't matter.
01:51:47.920 --> 01:51:49.920
But that's so the two different spellings of each one.
01:51:49.920 --> 01:51:54.640
So now you've got all the rotations of a matrix 90, 180, 270.
01:51:55.600 --> 01:51:58.319
Yeah, that was covered in a challenge, wasn't it?
01:51:58.640 --> 01:51:59.039
Maybe.
01:51:59.039 --> 01:52:01.359
Yeah, that kind of thing, right?
01:52:01.359 --> 01:52:03.039
So you've got all the rotations.
01:52:03.039 --> 01:52:06.479
So those are those are things I would say, those are good techniques to know.
01:52:06.800 --> 01:52:09.039
Yeah, how do we classify those though?
01:52:09.439 --> 01:52:12.399
I mean, they you get they are just they're just two trains, right?
01:52:12.399 --> 01:52:14.000
So you could just take them and put them in.
01:52:14.000 --> 01:52:16.800
Exactly.
01:52:16.800 --> 01:52:19.119
So that's that's so so there's rotations, right?
01:52:19.119 --> 01:52:20.800
The rotations of a matrix.
01:52:20.800 --> 01:52:22.880
Rotations and and yeah.
01:52:22.880 --> 01:52:24.319
Call it a concept.
01:52:24.319 --> 01:52:26.720
Yeah, matrix rotations, sure.
01:52:26.720 --> 01:52:31.039
Another thing, here's another different thing that like is good to know.
01:52:31.039 --> 01:52:33.920
Like basically all the entries in the in Apple card you could take.
01:52:33.920 --> 01:52:36.000
Like, what about an identity matrix?
01:52:36.000 --> 01:52:39.520
What's the best or fast way or whatever to make an identity matrix?
01:52:39.520 --> 01:52:41.520
That's a thing that's you should learn.
01:52:41.520 --> 01:52:44.239
So you don't sit there and try to piece it together.
01:52:44.720 --> 01:52:48.239
Yeah, I guess that would be depends on where outer product would go.
01:52:48.479 --> 01:52:49.760
And where the combination is.
01:52:49.760 --> 01:53:01.520
But that's not a good way to make it really, it's not a good way to make a an identity matrix because it using an outer product selfie of an IOTA range, right, makes a giant number, right?
01:53:01.520 --> 01:53:07.840
It's the n squared number of come of comparisons for no use whatsoever when you already know what values are gonna go in there.
01:53:07.840 --> 01:53:16.800
So what's better is to to do a one followed by n zeros and then reshape that into n by n, right?
01:53:16.800 --> 01:53:26.800
So like right, four, four, reshape zero, comma, four reshape one four, four reshape one, comma, four, reshape zero.
01:53:26.800 --> 01:53:28.000
Right?
01:53:28.000 --> 01:53:30.000
This is the better way to do it.
01:53:30.000 --> 01:53:33.600
Because here we're not computing anything, we're just reshaping.
01:53:33.600 --> 01:53:36.239
That's the fastest, you're just doing memory copying operations.
01:53:36.239 --> 01:53:38.479
There's nothing else the computer can do faster than this.
01:53:38.479 --> 01:53:41.600
And especially since we're using bit Boolean, it's gonna be right.
01:53:41.600 --> 01:53:43.840
It's literally just writing bits out in memory.
01:53:43.840 --> 01:53:48.960
That's that's the thing you should know if you didn't already.
01:53:48.960 --> 01:53:51.119
Yeah, exactly, like that.
01:53:51.119 --> 01:53:54.800
And there's an entry in Apple Card that looks something like that, right?
01:53:54.800 --> 01:53:55.760
Of course.
01:53:55.760 --> 01:54:12.560
It's comma comma selfie reshape one, comma, reshape jot zero if you want, but whatever.
01:54:12.560 --> 01:54:14.560
What is it tacitly?
01:54:14.560 --> 01:54:16.560
Yes, comma selfie, right?
01:54:16.560 --> 01:54:18.239
That that makes the omega omega.
01:54:18.239 --> 01:54:23.279
Reshape one, comma, uh reshape jot zero.
01:54:23.279 --> 01:54:24.800
It's a train.
01:54:24.800 --> 01:54:26.720
I like that.
01:54:26.720 --> 01:54:30.000
Switching the wrong tabs.
01:54:30.000 --> 01:54:32.960
There are other ways you can write it as well, but whatever.
01:54:32.960 --> 01:54:38.079
You could instead of the one comma and the V shape, you could do a and overtake, but whatever.
01:54:38.079 --> 01:54:39.279
There are different ways to do it.
01:54:39.279 --> 01:54:40.479
It doesn't really matter so much.
01:54:40.479 --> 01:54:41.840
But something like that, right?
01:54:41.840 --> 01:54:42.800
Is good to know.
01:54:42.800 --> 01:54:53.359
Okay, so these are all these are all things that I would say you should learn as an APL or you should just reach for immediately without really having to think about it.
01:54:53.359 --> 01:54:55.920
Um and then you can you can use those to build up, right?
01:54:55.920 --> 01:54:57.840
It really is like like Lego bricks.
01:54:57.840 --> 01:55:05.279
So an APL that had has a higher level built, they don't have to think for writing certain things.
01:55:05.279 --> 01:55:07.039
Like, for example, the average, right?
01:55:07.039 --> 01:55:12.880
If you give in the task as a new APL to write average, then you might need to sit sit and think about it.
01:55:12.880 --> 01:55:14.640
But you can you can do it in your sleep, right?
01:55:14.640 --> 01:55:17.760
You can wake you up in the middle of the night and say, How do you do average an APL, right?
01:55:17.760 --> 01:55:18.239
You're right.
01:55:18.239 --> 01:55:20.880
Plus slash bar divided by tally, done.
01:55:20.880 --> 01:55:24.880
But that's something that that is something you sort of have to know, right?
01:55:25.680 --> 01:55:31.279
Yeah, maybe maybe the better way to do this than is just with idioms, basically, because this is what they are.
01:55:31.600 --> 01:55:34.079
That's what I but we can go through something completely different, right?
01:55:34.079 --> 01:55:37.039
This was just some examples of some techniques, right?
01:55:37.039 --> 01:55:40.560
That that I would say you have to learn in order to become a black belt APLR.
01:55:40.560 --> 01:55:43.439
There's many, many are basically you have to know Apple cart, right?
01:55:43.439 --> 01:55:46.960
By heart to to uh to be a black belt APLR.
01:55:46.960 --> 01:55:50.399
But there are also also other things that you should know about.
01:55:50.399 --> 01:55:53.520
For example, how to use namespaces effectively.
01:55:53.520 --> 01:55:55.520
You ever use namespaces in APL?
01:55:55.840 --> 01:55:56.159
Nope.
01:55:56.159 --> 01:55:58.239
I mean I've seen them used and I know what they are.
01:55:58.239 --> 01:56:03.039
And I've saw when we had TASA talk episode 30, you demoed a bunch of stuff, but uh right.
01:56:03.119 --> 01:56:06.800
So now with version 20, and like there's a whole bunch of stuff that you should know.
01:56:06.800 --> 01:56:08.319
That is some that's essential.
01:56:08.319 --> 01:56:11.359
Being able to decide on on you how you structure your things.
01:56:11.359 --> 01:56:12.880
How about error trapping?
01:56:12.880 --> 01:56:24.399
I would say if you're writing a production system in APL, you better be able to trap any errors and deal with them and write and report that you send by email to your to yourself so that so you can go do something about it, right?
01:56:24.399 --> 01:56:26.720
And that don't have this the user system crash.
01:56:26.720 --> 01:56:34.720
So collecting information, pertinent information from from the system when it when it crashed and and and catching that and dealing with that.
01:56:34.720 --> 01:56:37.520
Have you ever used traditional functions in APL?
01:56:37.520 --> 01:56:40.319
I think I've written like one or two, but I forgot.
01:56:40.319 --> 01:56:46.159
So all the can I understand, but sometimes you need control structures to write something sanely, I would say.
01:56:46.159 --> 01:56:57.199
I know DQN shirts away from that, but you know, with the type of programming I do, I very often have like giant switch statements with loads of different things that I need to do or for loops and so on.
01:56:57.199 --> 01:57:04.640
So um that's something I would I would say you should you should know about.
01:57:04.640 --> 01:57:09.840
The even object-oriented programming in APL that occasionally is useful to use.
01:57:09.840 --> 01:57:12.880
Um if you've never never used that.
01:57:12.880 --> 01:57:28.800
For example, right, if you're writing some kind of some object that that represents some things, connection to some database or something, and the user can set all kinds of options, and you need to like normalize the settings that the user uses or check that they are valid.
01:57:28.800 --> 01:57:34.319
So they might be exposed as as as fields, but then you don't have a chance to check them until runtime.
01:57:34.319 --> 01:57:42.720
If you expose them as properties, then you have a getter and setter, as a setter that checks when the user assigns to them that the value they're trying to assign is actually valid.
01:57:42.720 --> 01:57:43.760
All those kinds of things.
01:57:43.760 --> 01:57:44.800
That's stuff you need.
01:57:44.800 --> 01:57:50.640
That's bread and butter for the applications programmer, but not for toy problems from lead code, of course.
01:57:50.640 --> 01:57:54.000
So there's a bunch of stuff there to learn.
01:57:54.000 --> 01:57:57.359
How to effectively use regex in APL.
01:57:57.359 --> 01:58:00.159
I don't know if you've ever used regex in APL at all.
01:58:00.159 --> 01:58:06.399
So so Max is saying in the in the chat that air trapping and transference are beyond Connor's use cases.
01:58:06.399 --> 01:58:11.520
But if the the question is, how does Connor become a black belt APL er, right?
01:58:11.520 --> 01:58:13.279
Then what does it mean black belt APL?
01:58:13.279 --> 01:58:16.880
In my mind, it means you could work as an APL consultant, right?
01:58:16.880 --> 01:58:22.079
One of those companies that use APL, they can say, hey, we have some code that needs to be worked on.
01:58:22.079 --> 01:58:23.119
Can you come in, have a look?
01:58:23.119 --> 01:58:25.199
It's running slow, can you make it faster?
01:58:25.199 --> 01:58:29.039
Or we need to implement some new functionality, and Connor is able to do that.
01:58:29.039 --> 01:58:30.479
That's I would say is a black belt.
01:58:30.960 --> 01:58:31.920
That's not my definition.
01:58:31.920 --> 01:58:32.640
Definitely not.
01:58:32.640 --> 01:58:34.079
So how do you define it?
01:58:34.399 --> 01:58:38.079
I'm more interested in like the algorithmic ideas.
01:58:38.079 --> 01:58:53.039
Like all of these things, I mean, some of them are more idiomish than algorithmic, but like you know, like this is a great example of like every single time I ever spell an identity matrix, I use the outer product selfie iota.
01:58:53.600 --> 01:58:57.520
It's just fine, it's easy to understand and explain, but you but you understand why this is better.
01:58:57.840 --> 01:59:02.479
Yeah, this is this is really good to know, and I feel like I probably should have known by now.
01:59:02.479 --> 01:59:23.119
And also, too, uh, you know, going back and forth with Zima on Twitter over the weekend, he was talking about you know optimizations of bit arrays and and how the problem I was working on was a string of ones and zeros, and he immediately, his idea was to convert it to a bit array of integer ones and zeros.
01:59:23.119 --> 01:59:31.920
And that's not really something I think about because I'm not typically thinking about like performance-oriented APL programming or BQM programming or whatever array language.
01:59:31.920 --> 01:59:37.199
But then as soon as I start to profile things, you know, I I I am looking for that kind of stuff.
01:59:37.199 --> 01:59:40.800
And then, you know, Zyma, I think, is thinking that way like 100% of the time.
01:59:40.800 --> 01:59:44.479
He's always thinking, what's the way that I can make this run faster?
01:59:44.479 --> 01:59:59.119
And so, anyways, Max is absolutely correct that error trapping and trad funds and like going to trad funds and to to need control structures is like a limitation of dialogue, it's not necessary from a language point of view, right?
01:59:59.119 --> 02:00:04.319
And also, too, just like trad funds in my mind are much more difficult.
02:00:04.319 --> 02:00:15.680
Like the barrier to writing a trad fund is a lot higher than like a D fund because of the fact that you need like, what is it, a minimum of a couple lines to get the the deltas?
02:00:15.920 --> 02:00:20.399
And uh I like I don't even know the syntax of the syntax of the that's just the syntactic thing.
02:00:20.399 --> 02:00:23.119
Okay, so so here's here's another thing you might like.
02:00:23.119 --> 02:00:30.319
You sometimes you want to do it like Lisp style, I guess, to take the first element and then all the remaining elements.
02:00:30.319 --> 02:00:35.279
And and that you can do with one one jot what is it called?
02:00:35.279 --> 02:00:37.520
Uh partition enclose or something.
02:00:38.000 --> 02:00:40.479
One one jot partition enclosed.
02:00:40.880 --> 02:00:41.520
Yeah.
02:00:41.520 --> 02:00:45.439
So if you were one one enclose or whatever, left shoe.
02:00:45.439 --> 02:00:47.680
No, no, no, that no, just a plain one, yeah.
02:00:47.680 --> 02:00:50.960
And then write like quote A B C D E or something like that.
02:00:50.960 --> 02:00:56.079
Alright, so it takes the first element as a vector, one element vector, and then the rest of the elements.
02:00:56.079 --> 02:00:57.359
I think that's pretty neat.
02:00:57.359 --> 02:00:58.800
Nice technique to have.
02:00:59.199 --> 02:01:12.079
So that's interesting because like as soon as you mention this, um, my thought is that in cap um, and I guess you need pair.
02:01:12.479 --> 02:01:12.880
Yeah.
02:01:12.880 --> 02:01:17.439
I guess this is one one drop and one, yeah, sure.
02:01:17.439 --> 02:01:19.359
But you this also this is not pair.
02:01:19.359 --> 02:01:21.840
You need you need comma wing club or something.
02:01:21.840 --> 02:01:22.560
Yeah.
02:01:22.560 --> 02:01:24.239
Does it have pair?
02:01:24.239 --> 02:01:25.279
Oh, it has pair, yeah.
02:01:25.279 --> 02:01:27.359
Oh, so yeah, so is that similar?
02:01:27.359 --> 02:01:29.600
It's not exactly the same, but yeah, it's similar enough, yeah.
02:01:29.600 --> 02:01:30.079
Sure.
02:01:30.079 --> 02:01:31.920
It's a technique, it depends on the language.
02:01:31.920 --> 02:01:36.720
It's a fairly recent extension we did to allow you to do this, but I found that useful on occasion.
02:01:36.720 --> 02:01:49.119
Here's another thing that's really useful that I've had to tell a customer about multiple times, and that is you these days uh you spell it comma square bracket iota 2 go square bracket.
02:01:50.960 --> 02:01:54.000
Oh, that's comma square bracket iota 2.
02:01:54.399 --> 02:01:55.039
Yeah.
02:01:55.039 --> 02:01:57.119
Well, you can't do it on a on a vector.
02:01:57.119 --> 02:02:02.720
You have to so the way you have to do it on a on a like a 345 reshape quad A or something.
02:02:02.720 --> 02:02:04.399
Yeah.
02:02:04.399 --> 02:02:07.520
So this merges the first two X's.
02:02:07.520 --> 02:02:15.600
So so if you don't have the have what I anything in front of the three, four, five, you get like a three three layers that are each four by five.
02:02:15.600 --> 02:02:21.199
And this merges all the layer bunches together all the layers into a single to a single matrix.
02:02:21.199 --> 02:02:26.239
You can't actually you can't see because of the boxing here, so it's hard to tell.
02:02:26.239 --> 02:02:30.720
But it doesn't if you turn on full boxing or something, you can I don't know if you have that.
02:02:30.720 --> 02:02:35.760
But if you if you do it on oh, I think you I think your output is missing spaces.
02:02:35.760 --> 02:02:39.279
Try try to stick a there's something there's something funny.
02:02:39.279 --> 02:02:40.159
Yeah, you can't do that.
02:02:40.159 --> 02:02:42.079
Try to stick a format in front of this.
02:02:42.079 --> 02:02:44.159
I'm not sure there's something wrong with the output.
02:02:44.159 --> 02:02:45.600
This is not okay.
02:02:45.600 --> 02:02:51.520
The it looks like your array box doesn't render empty lines in the output, which is a mistake.
02:02:51.840 --> 02:02:57.039
Yeah, I think yeah there might be a bug because I stripped those at one point.
02:02:57.359 --> 02:03:05.119
Yeah, that's about if you go to try APL you can see what's happening, or or just a open APL and one.
02:03:05.600 --> 02:03:09.920
Oh OBS is that works slowing down the system.
02:03:10.319 --> 02:03:11.199
Yeah, okay.
02:03:11.199 --> 02:03:14.239
So now if you write this, this is not gonna fit on the screen, yeah.
02:03:14.239 --> 02:03:15.039
Okay, okay.
02:03:15.039 --> 02:03:17.199
See now, so this has got three layers.
02:03:17.199 --> 02:03:20.399
Each one of the layers is three by a is four by five.
02:03:20.399 --> 02:03:34.079
And then if you do the the comma square bracket and iota two, close square bracket, then it will merge those two, the merge the leading two axes, and you can merge any number of x's by changing the two to to a higher number.
02:03:34.079 --> 02:03:38.720
So if you merge if you write IOTA three inside, you will merge all three axes, then it's just a normal rebel.
02:03:38.720 --> 02:03:40.720
So it's basically like a leading revel.
02:03:40.720 --> 02:03:42.880
That's a very useful thing to do.
02:03:42.880 --> 02:03:54.319
Another useful thing to do is so you so Max is saying you can spell what we just did with a rank, and I will challenge you to do so, at least without using transpose.
02:03:54.319 --> 02:03:55.600
So go for it, Max.
02:03:55.600 --> 02:03:57.439
You are here's another thing.
02:03:57.439 --> 02:04:02.960
If you got let's say you've got three matrices of the same shape, or no, or so even more common, you can try this.
02:04:02.960 --> 02:04:10.960
So write like open paren and like three, four, reshape quad A, for example, and then close the paren.
02:04:10.960 --> 02:04:23.119
And then open paren and two four reshape, say quad C quad A, just if you can see the difference, and then yeah, you can add one more just for good measure.
02:04:23.119 --> 02:04:29.600
So you can add open and then like uh four, four reshape quad D or something, so you can see the difference.
02:04:29.600 --> 02:04:32.399
Okay, so now so now we want to stack these.
02:04:32.399 --> 02:04:34.800
So you can see these are rows, right?
02:04:34.800 --> 02:04:38.239
These are collections of rows, and we want to merge them all into a single matrix.
02:04:38.239 --> 02:04:39.279
So, how would you do that?
02:04:39.279 --> 02:04:44.239
So the way you do it is disclose comma bar slash.
02:04:44.239 --> 02:04:48.399
Which is not the same thing as a mix.
02:04:48.399 --> 02:04:55.119
If you do a mix, then you end up with a three-dimensional array with padding, which and then you can't fix that.
02:04:55.119 --> 02:04:56.159
That's the split.
02:04:56.159 --> 02:04:59.840
And you need the the parentheses.
02:04:59.840 --> 02:05:01.359
See, that's not useful.
02:05:01.359 --> 02:05:03.279
And you can't even do anything to merge.
02:05:03.279 --> 02:05:07.600
Now you have to remove the rows, but you don't know which rows were inserted, so that's that's not what you need.
02:05:07.600 --> 02:05:08.000
Right?
02:05:08.000 --> 02:05:08.960
So that's the technique.
02:05:08.960 --> 02:05:11.279
Disclose, comma bar slash.
02:05:11.279 --> 02:05:15.039
Very useful tool to have in your toolbox.
02:05:15.039 --> 02:05:16.479
Join matrices.
02:05:16.960 --> 02:05:18.239
Alright, last one.
02:05:18.239 --> 02:05:24.159
We've now set the record for the longest uh longest episode.
02:05:24.239 --> 02:05:26.079
I mean, there's a ton more we can do, right?
02:05:26.079 --> 02:05:27.279
Well, but this is the one.
02:05:30.079 --> 02:05:30.960
No, no, no, it was good.
02:05:30.960 --> 02:05:31.680
It was necessary.
02:05:31.680 --> 02:05:32.880
I don't think it was necessary.
02:05:33.920 --> 02:05:34.880
I don't think it was necessary.
02:05:34.880 --> 02:05:42.239
Even even the jot, you know, like this jot is like a beginner, you know, like, and technically in certain cases, it's necessary.
02:05:42.239 --> 02:05:49.840
Like I can't remember if it was you or someone made the comment that when I was building the comparison tables on a ray box.
02:05:49.840 --> 02:05:51.600
Uh what was this for?
02:05:51.600 --> 02:06:09.760
It was for a first, and you know, when I was doing this, and if you switch these to nested and nested, you know, initially I didn't have these at, which like I I understand that they're not valid expressions, but like, do we need to explain that?
02:06:10.159 --> 02:06:11.520
I think I think they should be.
02:06:11.520 --> 02:06:20.479
I I'm in favor of making the well, I don't like the two trains being hooks in J, but I'm in favor of making what we call AF trains valid.
02:06:20.479 --> 02:06:22.640
So you can just but that's that's the difference.
02:06:22.880 --> 02:06:23.760
Yeah, I don't I don't know.
02:06:23.760 --> 02:06:31.119
And like honestly, like this is what makes me really like cap's two-train model because there's no difference.
02:06:31.119 --> 02:06:53.760
Like I think it's such a such such a wart, or and maybe warts not the wrong word, such a I don't know the exact word, like deficiency is too strong, but like it is it is so nice in the cap two-train model that two juxtaposed functions are the same, uh parsed the same, you know, whether it's tacit or there is a argument on the right.
02:06:53.760 --> 02:07:14.880
And like the reason that I ended up adding these at is because I've set up a unit testing system in the background that like tests every single one of these expressions on input and expected output, so that like if I want, I can go and mess around with these to change them and then check, does it still give the correct result?
02:07:14.880 --> 02:07:22.239
And in order for that to work, you do need the way that I set it up, you do need these to actually be correct tacit expressions.
02:07:22.239 --> 02:07:30.239
But like I could you could argue that like you don't actually need these because you know, are people going to expect what?
02:07:30.479 --> 02:07:32.960
Yeah, what are you saying is it would be a snippet.
02:07:33.199 --> 02:07:36.000
It's a prefix of a non-tacit expression.
02:07:36.000 --> 02:07:42.720
Yeah, and that's like the the same thing here when we're talking about like, oh, this isn't a monadic function.
02:07:42.720 --> 02:08:01.760
You know, yes, I understand that like technically what you're saying is correct, but I don't think that like the jot not being there is detrimental to the understandability because like a lot of people that are beginners that don't understand that it doesn't parse as like a function are just gonna copy and paste this into whatever REPL they're using and then put another.
02:08:02.159 --> 02:08:04.159
If they put it into an expression, that's fine.
02:08:04.159 --> 02:08:07.760
But if they try to give it a name to save it for next time, it will fail.
02:08:07.760 --> 02:08:11.680
And that's one of the reasons why I think we should allow saving that.
02:08:11.680 --> 02:08:18.880
I think you should allow, for example, like diagonal gets one one transpose and not have a jot.
02:08:18.880 --> 02:08:22.479
I think that would make that that makes it so much nicer.
02:08:22.479 --> 02:08:30.319
And we often speak about it, we often speak about some some function with a fixed left argument because the left argument is usually the control argument.
02:08:30.319 --> 02:08:36.159
So then so the the pairing of a left argument with a with a function often has its own meaning.
02:08:36.159 --> 02:08:41.920
And having to insert a jot there, I think is just unnecessary, especially since syntactically it's unnecessary.
02:08:41.920 --> 02:08:48.239
And there are a lot of entries in Apple cart that are of the form argument jot function.
02:08:48.239 --> 02:08:50.239
I think it's a pity that I have to do that.
02:08:50.239 --> 02:08:52.239
I think it would be much nicer if I didn't.
02:08:52.239 --> 02:08:59.760
But that's that be that as it may, however your notation for it is, that is that is there are we can stop here.
02:08:59.760 --> 02:09:03.359
There are a ton more of these like short snippets and things.
02:09:03.359 --> 02:09:12.079
Bunch of them are in AppleCart, of things that I think one should know as a black belt algorithmic APL er, even if you're not writing applications.
02:09:12.079 --> 02:09:14.880
I think there's so many things that you should be aware of.
02:09:14.880 --> 02:09:19.920
Some of it to do with quirks and language, some of it is just using primitives in ways you might not think.
02:09:19.920 --> 02:09:21.359
I'll give you I'll give you one more.
02:09:21.359 --> 02:09:23.520
Sorry, Connor, I'll give you one more.
02:09:23.520 --> 02:09:28.560
Let let's say if you uh if you go over to like array box or something, so you can play with this.
02:09:28.560 --> 02:09:37.039
So let's say we have we have some some phrase and so like a a a uh in text phrase, just easy sounds, like your name or something like that.
02:09:37.039 --> 02:09:38.800
I mean a dog, yeah, that's fine.
02:09:38.800 --> 02:09:39.760
Yeah, that's fine.
02:09:39.760 --> 02:09:42.560
Okay, should probably put single, yeah, single quotes like that.
02:09:42.560 --> 02:09:47.359
Okay, so you know how you can how you can remove all the vowels, right?
02:09:47.359 --> 02:09:50.239
So without and then a list of vowels.
02:09:50.239 --> 02:09:53.680
But it's the way around, but yeah, you need to do without.
02:09:53.680 --> 02:09:55.600
You can do a commute on it if you want.
02:09:55.600 --> 02:09:56.159
Yeah.
02:09:56.159 --> 02:10:03.119
And if you put uh if you put instead an intersection, then it finds all the vowels.
02:10:03.119 --> 02:10:08.159
Yeah.
02:10:08.159 --> 02:10:08.640
Right?
02:10:08.640 --> 02:10:11.520
So this now that is basically just a primitive.
02:10:11.520 --> 02:10:14.239
You put in commute, but you could just have reverse the arguments, of course.
02:10:14.239 --> 02:10:15.279
It would be the same thing.
02:10:15.279 --> 02:10:24.479
It's just a primitive, but I think a lot of people think of intersection as being just for sets, and in and this can actually be used for data extraction.
02:10:24.479 --> 02:10:32.479
So sometimes you have in in some kind of problem where they have some digits and they've got some letters in between, and you want to extract just the digits.
02:10:32.479 --> 02:10:34.000
So then you would write that.
02:10:34.000 --> 02:10:41.840
So if you if you remove everything to the left of the cursor right now, right, and you write one dog, so change a to a digit one, example.
02:10:41.840 --> 02:10:43.439
A to a digit one.
02:10:43.439 --> 02:10:48.079
And the second A, I changed A cat, change that to like three and cats.
02:10:48.079 --> 02:10:52.960
So let's say you have some some parsing problem with this, and you want to extract the digits that are in there.
02:10:52.960 --> 02:10:56.960
So at the end of the line of the expression, you just write intersection quad D.
02:10:56.960 --> 02:11:02.720
Now you could do whatever execute each or something like that to get the numbers, right?
02:11:02.720 --> 02:11:06.720
That's a that's a technique that I would say you should you should be familiar with.
02:11:06.720 --> 02:11:08.159
It might not be so obvious.
02:11:08.159 --> 02:11:10.079
Maybe it is obvious, it's just a primitive.
02:11:10.079 --> 02:11:12.560
There's nothing nothing special going on here.
02:11:12.560 --> 02:11:14.000
But these kind of things.
02:11:14.000 --> 02:11:15.119
And how do you write this?
02:11:15.199 --> 02:11:23.039
This is I mean, there's the more complicated like one where you need to deal with juxtaposed digits.
02:11:23.039 --> 02:11:29.439
And yeah, Marshall has a thing in BQN just called ints or nats that is used for ads.
02:11:29.680 --> 02:11:31.119
So we we can try that.
02:11:31.119 --> 02:11:38.000
If you if you write so if you get rid of the each here and the uh and after the quad D, yeah.
02:11:38.000 --> 02:11:43.840
After quad D, uh you can write commas quote space quote, for example.
02:11:43.840 --> 02:11:45.279
It's one way to do it.
02:11:45.279 --> 02:11:46.479
There are many ways to do it.
02:11:46.479 --> 02:11:49.279
Yeah, and now you can just do an execute on the whole thing.
02:11:49.279 --> 02:11:52.640
That presumes the digits are followed by spaces.
02:11:52.640 --> 02:11:56.640
No, it presumes that there's at least one space between all numbers.
02:11:56.640 --> 02:11:57.760
They can be anywhere.
02:11:57.760 --> 02:12:36.479
So even if you remove the space between one and dog and between chased and three and cats it will still work as long as there's at least one so no need each just execute if you want to get the numbers and you can we can do even better because you could actually you could take you could you could do there are things like quad v fi there are system functions you can use for this if you want maybe you call that not pure anymore but there are lots of like this also shows there's a whole area that you should know as a black belt AP other even if you're just doing algorithms there's a whole area of knowledge of of how do you extract easily the parts of the data that you want.
02:12:36.479 --> 02:12:39.520
So I'm not saying this is the right way to do it in a production system.
02:12:39.520 --> 02:12:46.720
Of course if there's no space between dog and chase this will fail but there are other ways you can do you can do this and that would that works nicely.
02:12:47.039 --> 02:12:47.279
Right.
02:12:47.520 --> 02:13:43.439
So if if you write qua yeah quad c open brand quad c quad a close brand quad v fi omega that will that will work no matter what's in between them that basically means sp split and convert it does the execute for you numbers separated by any numbers any letters want me to spell it out again no no no we'll stick we'll stick with this one we're now we're now past the two and a half hour mark we gotta yeah yeah we gotta go so so we're saying there are right there are there are things that are techniques like this this is what I so even if we say right you just want to be an algorithmic expert you gotta know these right you can't sit and spend time thinking about how to do this kind of thing that you just gotta know and there's so many more right we could do a whole episode just of these but but essentially I've put as many as I could into into apple cart that's one of the points of apple cart you gotta know Apple cart.
02:13:43.760 --> 02:13:46.239
But aren't there like thousands of entries in Apple card?
02:13:46.479 --> 02:13:50.479
Yeah there are almost four thousand but many of them are are not techniques like this.
02:13:50.640 --> 02:14:02.079
Many of them are just primitives is there a way to filter by these like idioms that's the thing is I don't think as I don't think of AppleCart or BQN crate as like idiom repositories.
02:14:02.079 --> 02:14:16.880
I think of them as like just a very exhaustive or you know not exhaustive but a very long list of expressions that you can find useful so if you need to know how to do something that you're struggling with you pipe it into BQN crate or Apple cart and it's likely to show up.
02:14:17.279 --> 02:14:27.119
Yeah there's no information in the table in AppleCart that tells you like a flag saying this is in Connor wants to be in a it's not just me.
02:14:27.119 --> 02:14:37.760
I guarantee you there's other folks out there that want to like like there's no you're right there's nothing in the Apple card table that tells you this one you have to know in order to be a black belt algorithm person.
02:14:37.760 --> 02:14:38.960
That's that's true.
02:14:38.960 --> 02:14:40.479
Yeah that'd be useful.
02:14:40.479 --> 02:15:40.720
Although that'd be going through 4000 entries and flag oh I've I've gone through those 4000 entries so many times so I'm not sure if that would be a lot of work but then but but it's sort of an arbitrary criteria right what about things you have to know in order to deal with text manipulation right or things you have to know if in order to do math in APL right those that another flag so yeah we could do we could do a lot of Boolean columns that say that so that you can say like these are these are mathematically necessary things to do for like this level of mathematics these things you need to do for text processing these are things you need to do for accounting these are things you need to do for etc etc we could do that but that like what what there's no limit there's no end to the number of of c of subjects and and and fields of study that exist and and for every field of study and every interest group there is marking for every every entry in AbleCard whether it's relevant for that it seems a bit much maybe.
02:15:40.720 --> 02:15:52.000
So instead you read through it you doesn't have you can you could filter out all the primitives all the system functions or the user commands and so on and then you could go you go through them.
02:15:52.000 --> 02:15:58.399
If you I mean if you take 10 a day you get through it in the course of of a year right yeah that's true.
02:15:58.560 --> 02:16:14.800
I mean Max in the chat's just saying so APL dojo could be belt based rankings from Apple card in the midst of Madeline author of the Apple and Elias author of Cap discussing uh implementation of primitives.
02:16:14.800 --> 02:16:43.120
But anyways this is this has uh been an interesting episode we did end up kind of where we were where I was aiming to go with a lot of new nuance along the way and it may has me you know if anything has come out of this it's got me convinced that well it would it be the ideal but I was talking to Madeline on the last Tacit talk that she has empty syntactic space for non banana bracketed primitives.
02:16:43.120 --> 02:16:48.399
So the trains need the banana brackets but then it's empty syntactic space when they're not there.
02:16:48.399 --> 02:17:05.520
And I said well you could technically have like a hybrid tacit model and borrow you wouldn't even need to borrow everything necessarily from a cap just like the two trains in the form of the you know monadic function composition and left bound functions.
02:17:05.520 --> 02:17:18.239
You wouldn't even I wouldn't even really miss the uh the B1 combinator that much but even if you just had juxtaposition of left bound so aka an argument on the left and the monadic functions that would like be so nice.
02:17:18.239 --> 02:17:38.159
And like it would avoid the problem that we have with the the jot in dialog APL and the at in j of that those just parse correctly it it is it is available syntactic space in dialogue as well right we can make array function be a valid construct in a in dialogue APL.
02:17:38.399 --> 02:18:01.360
It's not the that's the ship hasn't sailed I and which it doesn't make it the same thing conceptually as the left bound functions if that's what you call them but it but effectively that's what it gives you right because in a train that would mean you can put so we could we could do how far ever we want right you still have to do a a jot when it's in the middle of a train.
02:18:01.600 --> 02:18:26.479
But wait what are you saying that is uh and also wait to answer the in the in the chat ellias is asking is banana brackets the official term Madeline says I call them moons at one point I was calling them moon brackets but then I read a 1987 or 89 paper called the introduction to the theory of lists by Richard Byrd who is the algebra of programming and he was calling them banana brackets back then and uses them for like list notation.
02:18:26.479 --> 02:18:32.879
And so since then I've been calling them banana brackets but it's it's not like the official term brought to you by Madeline.
02:18:32.879 --> 02:18:47.840
It's a term that I read in a paper from like what is that 40 years ago and and then I started using so what is the and what is this the all right and honestly last thing we're gonna hit like three hours now and I guess alias was the one that messaged in at one point that he said he wanted three or four hour episodes.
02:18:47.840 --> 02:18:54.399
What's the thing that there's still because you definitely can't have monadic functions in a row because that that space is taken.
02:18:54.639 --> 02:19:06.479
No but but essentially right if you write in in APL one plus two times divide right it looks like you have left bound functions.
02:19:06.959 --> 02:19:12.399
One plus two one plus two times divide?
02:19:12.799 --> 02:19:17.040
Yeah okay yeah so AGH fork and then an AGH fork.
02:19:17.440 --> 02:19:27.040
Yeah this is fine right the one thing you're missing is that if you want to do to do one plus two times ten divide that's not valid.
02:19:27.040 --> 02:19:32.879
Right because you mean the tack then you've got a you have an extra divide division symbol in there.
02:19:32.879 --> 02:19:50.399
Right and that tack or you can put a jot if you want right a jot between the 10 and on the left of the right and that could just be removed the that requirement you could just say if the second carriage so to say of the train counting from the right is an array then it has an implied jot or right tech or whatever.
02:19:50.799 --> 02:19:53.680
Oh I see so you're saying this is empty syntactic space.
02:19:54.000 --> 02:19:54.399
Exactly.
02:19:54.639 --> 02:19:58.239
So you could add left bound functions you could add a part of the cap model.
02:19:58.319 --> 02:20:08.639
So you couldn't add the two trains no but but the inside that inside a a longer train it already works right you you have the effectively you have the left bound functions because you have AGH trains.
02:20:08.639 --> 02:20:09.600
So that's not a problem.
02:20:09.600 --> 02:20:11.920
It's only to the far right that there's a problem.
02:20:11.920 --> 02:20:36.159
You're saying AGH trains essentially are already this yeah just if you go back to what you had read before the one plus two times divide right or and then put that in parentheses right it looks like it's a one plus applied to the two times applied to the reciprocal so it looks like you got left right this this is works identically in cap and in dialogue right and in k.
02:20:36.159 --> 02:20:46.639
Even though two of the languages cap and k have left bound functions and dialogue doesn't but effectively works the same because there's no notational difference between left bound functions used in this matter.
02:20:46.639 --> 02:21:11.120
Does it you have to give an argument yeah well I mean this is just an expression now put parentheses around every about two times the reciprocal and then one plus that so that's a different thing that you would get right how is it reciprocal of 10 is 0.1 times two zero point two one plus that one plus one to plus one point two or six fifths.
02:21:11.120 --> 02:21:15.120
The fact that this is an AGH fork doesn't actually it doesn't matter that's what I'm saying.
02:21:15.120 --> 02:21:30.079
So so notationality there's no difference between left bound functions and AGH trains when it comes to to this the difference is on the far right and of course the ability to to stack monetic functions that are not left bound.
02:21:30.079 --> 02:21:42.000
The way that that's solved in in BQN for example is by having the nothing right so then effectively you have AGH trains where the A, the array on the left is a nothing and then everything just works out.
02:21:42.000 --> 02:21:48.959
So you have if you had a by convention and a left argument that signals to the function that don't use me.
02:21:48.959 --> 02:21:53.840
Just pretend I'm not here and just run your monetic function definition.
02:21:54.399 --> 02:21:59.760
So food for thought I'd love it in dialogue APL I'd love it in Tiny Apple.
02:21:59.760 --> 02:22:02.879
Or I'd love it in some new array language that doesn't exist.
02:22:03.120 --> 02:22:05.840
I I I think I think I'm not sure I would add nothing.
02:22:05.840 --> 02:22:17.600
I don't think so I don't think it it it it adds anything no pun intended but I think I would add the AF train if you want to call it that or left bound whatever you want to call it.
02:22:17.840 --> 02:22:18.159
Yeah.
02:22:18.479 --> 02:22:22.159
Alright well we gotta call we're at two hours and 46 minutes at this point.
02:22:22.559 --> 02:22:26.959
Yes my my food has been served my dinner has been served and is now getting cold on the table.
02:22:26.959 --> 02:22:32.239
I sent a photo but from my wife of my food getting cold on the table and it looks delicious.
02:22:32.479 --> 02:22:37.840
My wife just popped in and was looked very confused as what are you still doing podcasting?
02:22:37.840 --> 02:24:03.040
Anyway So are we are we launching the APL Dojo podcast I mean what's we're not launching a separate podcast that's for sure will we revisit this topic maybe maybe not I will push these whatever changes to the live site and link it for folks that are interested in they can play around but I think we've talked enough about the APL Dojo for at least a few episodes if you do have comments thoughts questions you can either leave them in the YouTube description or reach us at here we go contact at arraycast.com first time since the relaunch of a cast 2.0 era that we got that right and yeah thanks for everyone in the chat we've got people we've got people asking for a 24 hour charity stream a raycast episode um no I don't think we could do a 24 hour conference but uh yeah Adam in the chat saying I do it yeah I don't know we'll we'll uh we'll see I've I've thought about doing like a an online conference a Raycon kind of thing uh which could could go 24 hours but you need multiple people uh hosting anyways thanks for everybody in the chat yeah leave comments in the description or you can reach us at that email address and with that we will say happy array programming nailed it nailed it thanks everyone by
00:00:14.400 --> 00:00:19.280
Welcome to episode one hundred and twenty-three of Arraycast.
00:00:19.280 --> 00:00:27.039
I am your host, Connor, and today with us we have our only panelists, therefore promoted to co-host Adam.
00:00:27.039 --> 00:00:28.719
Introduce yourself briefly, Adam.
00:00:28.719 --> 00:00:30.559
I'm Adam Dlotzewski.
00:00:30.800 --> 00:00:32.640
I have a long history with APL.
00:00:32.640 --> 00:00:37.759
I currently work as head of language design and also doing a bunch of other stuff at Look Limited.
00:00:38.079 --> 00:00:42.719
And as mentioned before, my name's Connor, host of ArrayCast, massive fan of all the array languages.
00:00:42.719 --> 00:00:45.039
Excited for today's episode.
00:00:45.039 --> 00:00:47.119
And we do have, I think, two announcements from Adam.
00:00:47.119 --> 00:00:57.359
But before we get to that, I realized we should mention that we had a regularly scheduled array cast, this ArrayCast episode 123, that was going to be with Henry Rich.
00:00:57.359 --> 00:01:00.000
And I'm going to mispronounce uh his name.
00:01:00.000 --> 00:01:01.119
I believe it's Marcin.
00:01:01.119 --> 00:01:05.599
I'm going to avoid the last name because I one don't have it in front of me, and two, I'm going to butcher it.
00:01:05.599 --> 00:01:09.760
And they were going to be talking about the upcoming release of J9.7.
00:01:09.760 --> 00:01:15.680
And then typically in these episodes, the annual J release episodes, we talk about the beta, which would have been 9.8.
00:01:15.680 --> 00:01:24.400
That episode, if you are an astute viewer of the channel, you will have seen has been postponed until tentatively May 4th.
00:01:24.400 --> 00:01:27.519
So we've titled that Arraycast Episode 125.
00:01:27.519 --> 00:01:33.519
It was because I believe they wanted to put together some demos now that we have the live stream on YouTube.
00:01:33.519 --> 00:01:38.239
And so we were originally going to do it today, and it wasn't because they don't want to come on.
00:01:38.239 --> 00:01:39.359
They definitely still want to come on.
00:01:39.359 --> 00:01:41.200
They're just in preparation mode.
00:01:41.200 --> 00:01:47.120
So expect tentatively a month from now, we'll have both Henry on and Marcin on to talk about J9.7.
00:01:47.120 --> 00:01:54.079
So if you were looking forward to that episode, just put that hope on pause and we will do that interview in a month's time.
00:01:54.079 --> 00:02:00.560
So we're going to do a different episode today, which we, I guess, kind of chatted about last episode in Arraycast 122.
00:02:00.560 --> 00:02:04.959
But before we get to that, we've got two announcements, so we'll throw it over to Adam and we can do those first.
00:02:05.280 --> 00:02:05.519
Right.
00:02:05.519 --> 00:02:09.039
So there are two uh get togethers, real life, coming up.
00:02:09.039 --> 00:02:15.680
First, there is the APL Germany spring meeting in Mainz, sort of southwestern Germany.
00:02:15.680 --> 00:02:20.800
It is on the 20th to the 21st of April, so it's just coming up very soon.
00:02:20.800 --> 00:02:29.120
And immediately after that, the week after, is Dinah 26, so Dinah's dialogue's North American get together in New York City on the 27th.
00:02:29.120 --> 00:02:33.520
And the registration for that dialoges on the 17th.
00:02:33.520 --> 00:02:39.439
So if you're here during this live, then uh that's in 10 days.
00:02:40.159 --> 00:02:40.639
Awesome.
00:02:40.639 --> 00:02:49.199
And if you watch it anytime in the next 10 days, you'll still have time to figure out if you can make it, if you're local to New York, or if not, you're able to travel there.
00:02:49.199 --> 00:02:52.479
Links we'll try and put in the description slash show notes.
00:02:52.479 --> 00:02:55.360
And I don't think I have any announcements.
00:02:55.360 --> 00:02:58.080
I mean, technically, I'm working on a YouTube video.
00:02:58.080 --> 00:03:03.520
I tell you, with AI these days, my YouTube videos take way longer because I can realize I realize I can do way more.
00:03:03.520 --> 00:03:14.319
And there's been some interesting interactions between Elias, author of CAP online, and also Dima, implementer of CBQN.
00:03:14.319 --> 00:03:16.960
So, I mean, there's a GitHub repo.
00:03:16.960 --> 00:03:20.560
I'll find it and put it in the link of the the discussion.
00:03:20.560 --> 00:03:26.960
If people want to take a look, it's on the maximum odd binary, so M-O-B.
00:03:26.960 --> 00:03:31.039
And it's solvable very simply in three characters.
00:03:31.039 --> 00:03:33.120
A one rotate reverse sort.
00:03:33.120 --> 00:03:35.840
If you have the reverse sort primitive, that is.
00:03:35.840 --> 00:03:42.639
And anyways, there's gonna be it's almost gonna be like a YouTube talk, because it's gonna be such a long video.
00:03:42.639 --> 00:03:45.199
I'm thinking about even doing it live, but that's probably too much work.
00:03:45.199 --> 00:03:51.039
Anyways, if you follow me on the Blue Skies, Macedons or Twitters or any of those, you might have seen some of that interaction.
00:03:51.039 --> 00:04:00.000
But yeah, we'll uh look forward to that video coming out on this not this channel, this is the Arraycast channel, which I don't know, pop the uh the champagne and little confetis.
00:04:00.000 --> 00:04:02.080
We've we've crossed the 200 subscriber mark.
00:04:02.080 --> 00:04:04.080
We're a fifth of our way to the goal.
00:04:04.080 --> 00:04:10.240
I I see on the statistics we get about 800 within the first like month, 800 downloads.
00:04:10.240 --> 00:04:12.000
So we do have at least close to a thousand.
00:04:12.000 --> 00:04:14.960
So hopefully we can translate that into a thousand YouTube subscribers.
00:04:14.960 --> 00:04:20.480
Anyways, we're looking at on the screen what I'm calling the APL dojo.
00:04:20.480 --> 00:04:23.920
And this was we did talk about this in the last episode, right?
00:04:23.920 --> 00:04:37.360
It wasn't like a month ago, it was ArrayCast episode 122, I think, where there was this idea of concepts, primitives, expressions that exist in array languages, not specifically APL.
00:04:37.360 --> 00:04:42.639
I'm calling it APL dojo, but as you can see in the the bottom right here, I guess it's this is confusing.
00:04:42.639 --> 00:04:47.839
So I'm screen sharing on one monitor, but then I've also got the thing that I'm screen sharing on a different monitor.
00:04:47.839 --> 00:04:51.360
So I've got to look at this monitor, even though you know the screen share's here.
00:04:51.360 --> 00:04:54.000
And so you can see down here we've got six languages.
00:04:54.000 --> 00:04:57.279
I do feel really bad that I haven't added K to ArrayBox.
00:04:57.279 --> 00:05:06.079
The reason that K is not here is that anytime I build one of these AI scaffolded websites, I just have git submodule, the ArrayBox site.
00:05:06.079 --> 00:05:09.839
So it has all the syntax highlighting, the logos, the input methods.
00:05:09.839 --> 00:05:13.759
So it's actually pretty easy to spin up these little websites now.
00:05:13.759 --> 00:05:23.199
And the idea is that we are going to, if you've ever seen the tier lists on YouTube, usually it's S tier, then A, B, C, D, etc.
00:05:23.199 --> 00:05:27.439
And they'll do, like, you know, the tiered list of Pokemons, the tiered list.
00:05:27.439 --> 00:05:34.399
I just watched one the other day of all the different Harry Potter games in existence from the Lego Harry Potter to Hogwarts Legacy.
00:05:34.399 --> 00:05:37.120
And so usually they use like a rainbow of colors.
00:05:37.120 --> 00:05:42.160
I personally prefer the karate, like dojo black belt, white belt system.
00:05:42.160 --> 00:05:46.800
If you saw the last episode on YouTube, you will notice that we are missing a bunch of colors.
00:05:46.800 --> 00:05:50.079
I've omitted the yellow belt, the orange belt, a couple other belts.
00:05:50.079 --> 00:05:53.040
Mostly because one, we don't need that level of granularity.
00:05:53.040 --> 00:05:56.959
We don't need like 18 levels of, you know, levels or grades.
00:05:56.959 --> 00:05:58.959
And so I just pick my favorite colors.
00:05:58.959 --> 00:06:06.639
Obviously, white is beginner, black is expert, and then green, blue, and purple are the intermediate levels in between.
00:06:06.639 --> 00:06:12.319
And so now we just get to have fun for the next 90 minutes or two hours or however long this goes, and we can come back to this.
00:06:12.319 --> 00:06:14.959
You might think, oh, you didn't cover all the primitives, all the expressions.
00:06:14.959 --> 00:06:15.439
Of course not.
00:06:15.439 --> 00:06:16.879
We can't do that in 90 minutes, folks.
00:06:16.879 --> 00:06:19.120
But you know, we're calling this the APL dojo.
00:06:19.120 --> 00:06:27.600
Maybe we'll have the J Dojo where we're still gonna have the existing board, but then we can add primitives that are specific to certain languages.
00:06:27.600 --> 00:06:32.720
And hopefully at some point when I add NGNK6, um, we can come back and add those.
00:06:32.720 --> 00:06:38.959
Anyway, so thoughts from Adam first before we start throwing up primitives and expressions, questions, thoughts, or can we just hop into this?
00:06:38.959 --> 00:06:40.399
What do you what do you what do you think?
00:06:40.720 --> 00:06:41.920
Well, I mean, this looks promising.
00:06:41.920 --> 00:06:42.959
I don't know exactly how it works.
00:06:42.959 --> 00:06:43.839
I haven't seen that yet.
00:06:43.839 --> 00:06:44.800
I like the colors.
00:06:44.800 --> 00:06:49.680
They should be safe for people who have uh colorblindness or color vision deficiencies.
00:06:49.759 --> 00:06:51.199
So that's the way it's well we also have the text.
00:06:51.199 --> 00:06:54.399
I was I was that was I was thinking that we should they asked me, do you want to keep the text?
00:06:54.399 --> 00:06:58.079
And I was like, yes, yes, yes, because you know, just in case we've got colorblind.
00:06:58.079 --> 00:07:03.199
I don't know the full spectrum, but uh definitely you should hopefully be able to make all the black, purple, blue, green, white.
00:07:03.199 --> 00:07:06.959
And I guess, yeah, we should try to keep this audio friendly as much as possible.
00:07:06.959 --> 00:07:10.639
So the the way it works is we've got APL input.
00:07:10.639 --> 00:07:12.160
So we can start with IOTA.
00:07:12.160 --> 00:07:14.160
Well, actually, is this the website?
00:07:14.160 --> 00:07:16.079
I might have not prepared correctly, folks.
00:07:16.079 --> 00:07:17.279
We got an F11 out of this.
00:07:17.279 --> 00:07:19.279
This is the website we need to launch.
00:07:19.279 --> 00:07:21.279
Uh actually, I think it already is launched.
00:07:21.279 --> 00:07:22.480
So if we go into local website.
00:07:22.480 --> 00:07:31.600
So can can anybody go to that website and yes, anybody can go to this, but it's not gonna like save your stuff to the official website.
00:07:31.600 --> 00:07:34.720
And so the idea is this is the locally hosted one.
00:07:34.720 --> 00:07:38.560
And you can see actually, so let's get rid of this because we're gonna do this from scratch.
00:07:38.560 --> 00:07:56.480
Is that if we want to make changes on the fly, I have a cursor instance open and we can just say, like, I haven't I've tested this minimally, but you know, if we get to the point where we have, you know, a whole row's worth of blue cards or chips as the app likes to call it, is it gonna wrap and create like a second line?
00:07:56.480 --> 00:07:57.120
Probably not.
00:07:57.120 --> 00:08:00.399
My guess is that it's gonna create a horizontal scroll bar.
00:08:00.399 --> 00:08:05.120
I don't want a horizontal scroll bar, so we could quickly ask and say, hey, make this wrap onto a second line.
00:08:05.120 --> 00:08:11.120
We may or may not get there, but the point being is that this is local, so we can uh potentially you know make changes on the fly.
00:08:11.120 --> 00:08:15.759
Madeline in the chat is saying this is gonna be the most rage-inducing array cast episode ever.
00:08:15.759 --> 00:08:25.040
Well, I'm not sure if you mean because we're gonna be arguing over what category things go in, or because the audio listener is gonna have absolutely no idea what we're doing right now.
00:08:25.040 --> 00:08:33.679
But, anyways, if we want to add iota, we can you know type back tick i, we can name this because you pointed out Adam, it might be nice to have uh the name of this.
00:08:33.679 --> 00:08:34.879
You can choose the rank.
00:08:35.120 --> 00:08:37.600
So currently it's only probably called range, right?
00:08:37.600 --> 00:08:41.440
A range generator or index generator because iota is just a symbol name.
00:08:41.440 --> 00:08:42.720
Ah, well, so here's the thing.
00:08:42.799 --> 00:08:44.399
I'll put range in parentheses.
00:08:44.399 --> 00:08:57.039
I I have a soft place in my heart for IOTA, and it's you know, if we have a little bit of editorial control here, iOTA shall rename remain named IOTA as far as this app is concerned.
00:08:57.039 --> 00:09:01.600
But I do agree, range is the better name for this from like a non-emotional point of view.
00:09:01.679 --> 00:09:16.240
So we'll put range in parentheses, and we will actually uh Rubin Reg or Medelin has already sort of given names to all the primitives across all the various APL like languages in the omnibar.
00:09:16.240 --> 00:09:19.120
So shout out to that, and there's something we could pull on as well.
00:09:19.360 --> 00:09:21.200
Oh yeah, should we open up omnibar here?
00:09:21.200 --> 00:09:21.919
I think so.
00:09:21.919 --> 00:09:25.440
And then I can just tab through uh we go omnibar.
00:09:25.440 --> 00:09:26.799
I was just on it the other day.
00:09:26.799 --> 00:09:27.440
And so I can't.
00:09:31.919 --> 00:09:35.679
So if we search IOTA, or is it gonna is it gonna be Yeah, it's it found it.
00:09:35.679 --> 00:09:36.399
It found it, right?
00:09:36.399 --> 00:09:39.200
But it says it calls it index generator or range, right?
00:09:39.200 --> 00:09:40.399
Which is fine.
00:09:40.639 --> 00:09:45.200
Although, so how do you get it to Okay, so clearly I don't use this enough.
00:09:45.200 --> 00:09:52.000
So, like you know how in Google Translate you can search by the name and then click and it'll show you everything else with the same definition but a different name?
00:09:52.000 --> 00:09:53.279
Yeah, it doesn't do that.
00:09:53.279 --> 00:09:54.480
It doesn't do that here?
00:09:54.480 --> 00:09:57.279
Or am I just not showing BQN, show one hidden language?
00:09:57.279 --> 00:09:58.559
Yeah, there we go.
00:09:58.559 --> 00:09:59.440
That's what I was expecting.
00:09:59.440 --> 00:10:00.720
Oh, that's what he meant, okay.
00:10:00.720 --> 00:10:03.279
Is that I wanted to see the alternative glyphs.
00:10:03.279 --> 00:10:10.159
So a better example for this, if we go table, you know, this is one of the the most what's the word disagreeing.
00:10:10.159 --> 00:10:16.639
Yeah, yeah, like disagreeing, bifurcating, non-uniformly not so much named.
00:10:16.639 --> 00:10:33.039
Most languages either call this table or outer product, but in terms of the symbol, it's got uh bajillion symbols, which is uh it's nice from a kind of historical, you know, anthropological or archaeological point of view, but from a learnability point of view, it's it's kind of sad.
00:10:33.039 --> 00:10:34.639
I love this little table thing.
00:10:34.639 --> 00:10:36.159
And so, like, well, let's do that.
00:10:36.159 --> 00:10:39.519
Let's do iota and table as our our first two.
00:10:39.519 --> 00:10:48.799
And so if we go back to our little thing here, we'll just, you know, Adam mentioned that I should add rank because technically, you know, we've got different behaviors across ranks.
00:10:48.799 --> 00:10:50.799
So we just want our rank zero iota.
00:10:50.799 --> 00:10:57.360
This is a primitive, it's a monadic function, so we go create, and then we get this little thing, and then oh, except I messed it up.
00:10:57.360 --> 00:11:06.879
We want to go all because even though they've got different symbols, the the the Unicode character is not supposed to be representative of what the language chooses as a symbol.
00:11:06.879 --> 00:11:10.559
It's just uh look, there's a little bug there, but that should be fixed once we drop it.
00:11:10.559 --> 00:11:16.000
And so I would say that this is a beginner level primitive or concept.
00:11:16.000 --> 00:11:17.759
Then the question is is do you agree?
00:11:18.159 --> 00:11:29.679
Well, it depends a little bit on what kind of scale we are, because you could probably say that plus is even simpler in a way, but you could also say plus is more complicated depending on what kind of arguments you give it.
00:11:29.679 --> 00:11:36.000
And so do we do we even look at things like basic mathematics or do we just ignore that?
00:11:36.639 --> 00:11:45.679
Okay, well now we have to redo this because uh we've I mean, like I said, I minimally tested this, but now Iota, all, create.
00:11:45.679 --> 00:11:48.320
Okay, so there are the little language logos at the bottom.
00:11:48.320 --> 00:11:51.279
And then I should be yeah, when you click on it, it should give you an update.
00:11:51.279 --> 00:11:52.639
For some reason, it just didn't do that.
00:11:52.639 --> 00:11:56.000
So repeat what you just said, because I was a little bit concerned that this whole thing was gonna fall apart.
00:11:56.000 --> 00:11:58.960
You said are we defining this just for arithmetic?
00:11:59.279 --> 00:12:04.480
Like no, are we defining are we defining this for just for, should we say, interesting functions, right?
00:12:04.480 --> 00:12:07.279
That do sort of array manipulation generation things.
00:12:07.279 --> 00:12:13.200
Otherwise, there are certain structural functions or mathematical functions that are super, super simple, right?
00:12:13.200 --> 00:12:14.559
That are even simpler than this.
00:12:14.559 --> 00:12:22.879
So I agree that when I teach APL to somebody, then uh the index generator function comes in very early on, generally.
00:12:22.879 --> 00:12:26.320
But that doesn't mean that there aren't any other functions that are even simpler.
00:12:26.320 --> 00:12:34.559
For example, you could argue that the write tech, the right identity function, is the simplest function that is even theoretically possible.
00:12:34.559 --> 00:12:36.399
It takes an argument, returns it.
00:12:36.399 --> 00:12:37.279
Nothing done.
00:12:37.279 --> 00:12:38.559
There's nothing to understand.
00:12:38.559 --> 00:12:41.759
A lot of people have problems understanding it because it's too simple.
00:12:41.759 --> 00:12:43.679
They think it's gotta do something, but it doesn't.
00:12:44.000 --> 00:12:46.320
So yeah, I guess that's a good point to clarify.
00:12:46.320 --> 00:12:53.200
There's no uh or at least the design of this when I designed it, there's not supposed to be any kind of ordering of simplicity here.
00:12:53.200 --> 00:12:55.600
It's not like we're we're reaching for the simplest idea.
00:12:55.600 --> 00:12:58.960
We can do that if we want, but the order that these show up, and I'm not even actually sure.
00:12:58.960 --> 00:13:02.799
So I mean if you want to, you're calling this what is it, right tack?
00:13:02.799 --> 00:13:03.759
And what do we call this?
00:13:03.919 --> 00:13:04.399
Identity?
00:13:04.399 --> 00:13:06.080
Well, is monetic dadic?
00:13:06.080 --> 00:13:09.840
So monetic, yeah, monetic identity function or it's officially called same.
00:13:09.840 --> 00:13:11.919
I want to change that, but that's that's irrelevant.
00:13:11.919 --> 00:13:14.879
And like every everything is languages that have this.
00:13:14.879 --> 00:13:18.960
Well, maybe maybe not wewa, because maybe it might not make sense in Weewa, right?
00:13:19.120 --> 00:13:21.279
Uh I mean Wewa does have a monadic identity.
00:13:21.279 --> 00:13:25.279
Well, like they don't have a they don't have ambivalence, but they definitely do have identity in the the jot.
00:13:25.279 --> 00:13:27.279
So like I said, it it uses a different thing.
00:13:27.279 --> 00:13:30.320
So if we go create for this, we can drag it.
00:13:30.320 --> 00:13:33.279
And so, I mean, can we rearrange them?
00:13:33.279 --> 00:13:34.879
I mean, I it doesn't look like it.
00:13:34.879 --> 00:13:36.639
I mean, technically we could do this, right?
00:13:36.639 --> 00:13:38.559
Oh actually, what's going on here?
00:13:38.559 --> 00:13:41.440
Is it possible to get the tack on the left?
00:13:41.440 --> 00:13:43.759
There we go.
00:13:43.759 --> 00:13:44.399
What?
00:13:44.399 --> 00:13:44.720
Nope.
00:13:44.720 --> 00:13:45.600
It doesn't like it.
00:13:45.600 --> 00:13:46.320
It doesn't like it.
00:13:46.320 --> 00:13:53.679
So I don't know what what sorting is using here, but the point being is it's supposed to just be like the level of we would not have it, yeah.
00:13:54.399 --> 00:13:56.159
Or at least the concept of a density.
00:13:56.159 --> 00:13:57.200
So so that's the thing.
00:13:57.200 --> 00:13:58.480
What which one is simpler?
00:13:58.480 --> 00:14:07.840
A monetic identity function or a range generator, where you have to think about like inclusive start, exclusive start, and end, and index origin.
00:14:07.840 --> 00:14:13.919
There's a lot more to understand and know with a range generator than there is for an identity function, right?
00:14:14.320 --> 00:14:15.519
I would agree.
00:14:15.519 --> 00:14:26.240
But to be honest, like that's the thing, is your brain is always operating in like the most complex, fully formed version of like every primitive, which is something I've realized, right?
00:14:26.240 --> 00:14:33.200
Like if we if we go to uh array box, and you know, I I was just mentioning the the one rotate reverse sort.
00:14:33.200 --> 00:14:42.480
So if we go, I actually don't know how to type uh rotate now that I think about it, and then I think it's four or yeah, there we go.
00:14:42.480 --> 00:14:46.320
And that, and then we do this.
00:14:46.320 --> 00:14:50.159
Uh and so what was I about to show here?
00:14:50.159 --> 00:15:00.240
Oh, right, is that if if you click on this, you know, so it shows you do you want the monadic or dyadic definition of the function, and then it has the same concept of rank.
00:15:00.240 --> 00:15:07.279
And what I've realized too is that when you go to dyadic, you've got two arguments, so you have to consider the rank of two different arguments.
00:15:07.279 --> 00:15:21.279
And like I, to be honest, I just like I have never in my what's 2019, seven years-ish of array programming ever thought about like the rank of arguments when using a dyadic function.
00:15:21.279 --> 00:15:29.919
Like a lot of the dyadic functions are pervasive or scalar, so you don't need to think about it, unless if like you've got a vector and a matrix, and then you know what are you doing?
00:15:29.919 --> 00:15:33.840
But honestly, that's that's typically you've got a scalar and then some arbitrarily ranked array.
00:15:36.480 --> 00:15:45.360
Let's say, for example, something similar to what you've been doing lately, let's say you have a matrix of text lines and you want to center them or write justify them, something like that.
00:15:45.360 --> 00:15:48.000
So you want to do a separate rotate on every line.
00:15:48.000 --> 00:15:58.159
Now, in in or in languages that are leading axis originally, like J and BQN, there you would have to use the rank operator to do that.
00:15:58.159 --> 00:16:00.399
But APL traditionally is not like that.
00:16:00.399 --> 00:16:10.720
So therefore it defines vector left argument with matrix right argument on a last axis rotate to automatically pair up a rank zero, one.
00:16:10.720 --> 00:16:15.919
So every element on the left argument will rotate one row of the right argument.
00:16:15.919 --> 00:16:18.000
And similarly, you can use the first axis.
00:16:18.000 --> 00:16:21.440
It's not really first axis then, it's really column-wise, right?
00:16:21.440 --> 00:16:35.840
So then if if you do a the the circle horizontal bar rotate with a vector left argument and a matrix right argument, then it rotates the columns individually, which would be complicated to do in the other languages that are strictly first axis.
00:16:35.840 --> 00:16:42.559
You would have to transpose first and then do a a uh rotate rank zero, one, and then transpose back again.
00:16:42.799 --> 00:16:51.519
So there's a lot more nuance to this than I mean, how do let's take a little mini tangent in our we've we've barely even got two primitives up on the board, folks, and we're already in tangent land.
00:16:51.519 --> 00:17:10.480
I mean, what is your cause what is your thought on the complex because I've realized that like dyadic functions are so complicated, you know, in a certain sense, if you start to think about them in like the rank of both arguments, because like a lot of times when I'm working with these languages, I I like I say, I am thinking in rank one land or like rank zero land.
00:17:10.480 --> 00:17:17.920
Like when I think of the without glyph, I've never thought about a without on anything other than a rank one left and right argument.
00:17:17.920 --> 00:17:23.359
It's just like that's and maybe maybe uh without if you've got a rank zero, like just a scalar, yeah.
00:17:23.359 --> 00:17:24.720
Um like that that makes sense.
00:17:24.720 --> 00:17:29.039
But like I've never thought about it in matrix land or like you know, rank three plus land.
00:17:29.359 --> 00:17:35.279
It it it dial like it doesn't, but it should, and you know, you know, everything it does go by major cells.
00:17:35.279 --> 00:17:36.240
So that's another thing.
00:17:36.240 --> 00:17:45.519
That's the that's the that leading axis orientation thing where everything that applies to the individual elements of a vector really also apply to the major cells of any rank array.
00:17:45.519 --> 00:17:57.279
And then for the dyadic ones, then they have to have some ad hoc rules that sort of say, okay, we have to decide on on the rank of the major cells combined of the right and left argument.
00:17:57.279 --> 00:18:09.759
So, for example, for a lookup, you want to treat a higher rank array as in the lookup table, and then a lower one lower rank array under on what you're looking for, you would treat that as a single major cell of the higher rank ones.
00:18:09.759 --> 00:18:13.039
For example, you can look for a vector in a matrix, means you're looking for a row.
00:18:13.039 --> 00:18:16.640
If you're looking for a matrix in a matrix, you're looking for individual rows.
00:18:16.640 --> 00:18:21.680
But they are you can't just generalize it like that, and there are some complicated things.
00:18:21.680 --> 00:18:41.119
So J makes it very explicit in this documentation what the function rank is, and that means it defines a behavior on the smallest possible rank, and then if you uh and then if you give it arguments that have a higher rank than that, then it just runs a loop basically.
00:18:41.119 --> 00:18:45.759
It just applies to cells of that rank that the array can handle.
00:18:45.759 --> 00:18:51.599
So as an example of this is matrix division, matrix inversion operates on matrices, obviously.
00:18:51.599 --> 00:18:56.720
If you give it higher rank arrays, then we'll just go to the individual rank two cells.
00:18:56.720 --> 00:18:57.440
I see.
00:18:57.440 --> 00:18:59.680
So that's what function rank means in J.
00:18:59.759 --> 00:19:07.759
I've like I've it's come up a couple times, and I think I've every time I've either been confused silently or I vocally said, I've never really understood function rank in J.
00:19:07.759 --> 00:19:27.759
Function rank in Just is a is a primitive being assigned basically like and that's actually that's what I've done here a little bit, is that like you can see in the top right, I'm defining like what is the most common, you know, defined by me half the time when it was done explicitly, and then you know, Claude 4.6 Opus when it are the primitives I didn't look at.
00:19:27.759 --> 00:19:32.960
You know, so if you s if you add to this list IOTA, I don't I I think this is for, yeah.
00:19:32.960 --> 00:19:33.759
Oh, look at that.
00:19:33.759 --> 00:19:34.880
It calls it index generator.
00:19:34.880 --> 00:19:37.599
Like I said, the AI was responsible for getting all this stuff.
00:19:37.599 --> 00:19:46.880
But I made sure that it gave index generator like its most I don't know what you call it, the default rank or the function rank, but it's the one that you most commonly use in my experience.
00:19:46.880 --> 00:19:58.720
And and then if if you add like in in one of the ones when it was the I think mix and split, you know, mix is typically on a nested list, yeah, and then split is typically on a matrix.
00:19:58.720 --> 00:20:20.079
Like in my experience, I'm not saying that these are you know representative of all array language programmers everywhere, but when I'm building this tool for you know myself and then other people that want to use it, you end up with this kind of like, oh yeah, you know, some operations you know you use across ranks, but others you're typically reaching for a single rank, and I guess so that is what Jay has tried to do.
00:20:20.079 --> 00:20:22.720
They choose a rank and then they loop.
00:20:23.119 --> 00:20:38.319
Well, they I think I think at the time of definition of the primitive, they would have looked for the highest rank that they could have some kind of unique behavior and then set the rank there, and that's actually in a way sad because that prevents further extension in the future.
00:20:38.319 --> 00:20:41.359
So uh for example, with a matrix division, right?
00:20:41.359 --> 00:20:49.200
So dialogue APL, or I think all APLs supposedly, they don't have the rank two set for matrix inversion.
00:20:49.200 --> 00:20:52.319
If you try to invert something higher rank than that, it will just error.
00:20:52.319 --> 00:21:03.680
Maybe one day somebody will come up with some ingenious insight that will be the multidimensional or many many-dimensional equivalent of inversion, right?
00:21:03.680 --> 00:21:07.279
What something that is to a to a hyper matrix, right?
00:21:07.279 --> 00:21:11.200
A cube or higher, what inversion is to a matrix.
00:21:11.200 --> 00:21:18.799
And that that day that that happens, APL will just go, okay, well, we'll add that algorithm and the primitive is extended and all good.
00:21:18.799 --> 00:21:22.640
And J will go add another dot to the primitive, right?
00:21:22.640 --> 00:21:31.759
To make a new primitive, because the matrix division, matrix uh inversion primitive, is already defined to loop over rank two subarrays.
00:21:31.759 --> 00:21:33.119
And there's nothing you can do.
00:21:33.119 --> 00:21:38.720
You cannot use any sort of inverse rank operator to tell it to no, no, no, I don't want to look at rank two.
00:21:38.720 --> 00:21:40.880
Broaden your scope, look higher.
00:21:40.880 --> 00:21:41.680
You can't.
00:21:41.680 --> 00:21:43.039
So it's it's a gunner.
00:21:43.039 --> 00:21:44.559
It's it's fully defined.
00:21:44.559 --> 00:21:46.079
You can never again extend it.
00:21:46.079 --> 00:21:48.079
Yeah, interesting trade offs.
00:21:48.079 --> 00:21:53.039
So it saves you some rank operators that you don't have to explicitly loop over things.
00:21:53.039 --> 00:21:56.000
That might also make it a more obscure what's actually happening.
00:21:56.000 --> 00:21:57.599
That's the cost, of course.
00:21:57.599 --> 00:21:59.599
But then again, you can say that about arithmetic.
00:21:59.599 --> 00:22:01.680
Functions being scalar in nature, right?
00:22:01.680 --> 00:22:06.400
That not having a loop like you do in most languages makes it maybe more obscure what's happening.
00:22:06.400 --> 00:22:09.279
But on the other hand, you're able to extend things.
00:22:09.279 --> 00:22:15.599
So you could say like yeah, as an example of something that could happen, but obviously it didn't historically.
00:22:15.599 --> 00:22:24.559
You could mul you could define multiplication on scalars, and like nobody could think of what they would do on vectors, so we just define it as rank zero.
00:22:24.559 --> 00:22:28.559
And then somebody comes up with the idea of a vector multiply, right?
00:22:28.559 --> 00:22:30.079
The inner product thing.
00:22:30.079 --> 00:22:37.039
And and then you want to extend it, you can't, because you already overloaded it to all higher rank arrays by automatic looping.
00:22:37.039 --> 00:22:38.079
Uh, we don't want to do that.
00:22:38.079 --> 00:22:41.759
We experience has shown that that for for array programmers, that's not what we want.
00:22:41.759 --> 00:22:43.839
But that's the that's kind of concept that it could happen.
00:22:43.839 --> 00:22:44.880
Right, right.
00:22:45.279 --> 00:22:47.200
Okay, well, I mean yeah.
00:22:47.440 --> 00:22:53.599
There are cases where where this is where things are weird if you if you try to just extend them with rank.
00:22:53.599 --> 00:22:57.839
For example, you if let's say we now we're doing with the range generator, right?
00:22:57.839 --> 00:23:03.440
There are different ways you could extend the range generator to a long right argument.
00:23:03.440 --> 00:23:10.720
So the way dialogue does it, and I think most APLs do it, is that they say, okay, it generates the indices of an array of a certain shape.
00:23:10.720 --> 00:23:20.960
So if you say two by three, then you get a nested two by three array where every element has a vector, uh two-element vector, that is the enumeration of the indices of all those elements.
00:23:20.960 --> 00:23:25.119
Right, like exactly like what you're showing now, IOTA 2.3.
00:23:25.119 --> 00:23:27.119
J defines it differently.
00:23:27.119 --> 00:23:35.119
It defines it as filling a two by three array with the range of the product of the right argument.
00:23:35.119 --> 00:23:40.079
There is a there's a third definition you could have done, and then you could say, oh, range.
00:23:40.079 --> 00:23:51.920
I imagine if they had back in flat APL land when there was no nested arrays, if they had thought, hmm, there it doesn't make any sense to do the range of more than one number, so we'll just define it as rank zero.
00:23:51.920 --> 00:23:59.119
That would mean that if you do the range of two, three, you'd get uh a a uh rank two array.
00:23:59.119 --> 00:24:05.359
The first uh row is uh the range of two and the second one range of three, but that means it has to pad it.
00:24:05.359 --> 00:24:12.160
Yeah, so if you do if you uh range rank zero here, no not each, it has to be rank zero.
00:24:12.160 --> 00:24:17.599
So just uh citation zero and you have to put a right square bracket to separate the strand.
00:24:17.599 --> 00:24:28.079
So then you would get this result where the first row of so this is range rank zero on the array two three is zero, one, zero in the first row and then zero one two, right?
00:24:28.079 --> 00:24:33.200
And they might have said, okay, you know, it's maybe not the most useful, maybe sometimes you want this, and it's fine, and just pad with zeros.
00:24:33.200 --> 00:24:35.519
Maybe it's good for like making triangles and things.
00:24:35.519 --> 00:24:40.960
This would allow you, for example, if you now write instead of two three, if you write iota five or i.
00:24:40.960 --> 00:24:46.880
Maybe that would be useful.
00:24:46.880 --> 00:24:50.079
And then somebody comes and says, Hey, no, we could we could do this instead.
00:24:50.079 --> 00:25:01.039
We could make it fill a two by three array with the numbers from zero to six or two five, or in the APL land, you say, Oh, we could make it nested because now we invented nested arrays, it's too bad ship is shelled.
00:25:01.039 --> 00:25:03.839
Anyway, that's there's a tangent a bit.
00:25:03.839 --> 00:25:20.079
You're absolutely right that when we can't just make a list of perimeters because the pairing of left and right rank, or even left and right nesting level, and and in monetic form as well, and nesting level and rank and so on.
00:25:20.079 --> 00:25:25.680
Sometimes even type, like in K, you get in Q land you have like type overloads as well.
00:25:25.920 --> 00:25:26.160
Yeah, yeah.
00:25:26.160 --> 00:25:41.920
This is what we were I was just talking uh with Madeline, who's also in the chat right now, on the last tacit talk, is this realization that we you know we always hear about rank polymorphism in array languages, but you never explicitly hear about ad hoc polymorphism.
00:25:41.920 --> 00:25:43.920
And on top of that, like there's multiple kinds.
00:25:43.920 --> 00:25:47.759
You're overloading on the rank of your argument.
00:25:48.319 --> 00:25:53.440
Type polymorphism, type polymorphism, even value polymorphism, I would say.
00:25:53.440 --> 00:26:02.079
So if you go to to say dialogue APL and you do question mark five, you get a uh a random number from between one and five.
00:26:02.079 --> 00:26:06.319
But if you change and and any any positive integer there will give you that same sort of result.
00:26:06.319 --> 00:26:10.240
But if you change the to a zero instead, it's actually a different function.
00:26:10.240 --> 00:26:21.839
It's actually it doesn't generate a and value in the range from of the first zero natural numbers, rather it gives you a float between zero and one, which is actually something completely different.
00:26:21.839 --> 00:26:23.839
So that's type overloading, right?
00:26:23.839 --> 00:26:27.680
There's no rank polymorphism here that's different between those two cases.
00:26:27.680 --> 00:26:29.680
There's no depth polymorphism that's different.
00:26:29.680 --> 00:26:48.160
An example of the depth making a difference is I believe in the in the from or select or whatever it's called function in j, then you you for every dimension you can give it a list of the uh the indices along that dimension that you want to to pick out.
00:26:48.160 --> 00:26:57.279
But if you enclose that one of those elements, it means all the those enumerations along that dimension except these.
00:26:57.279 --> 00:27:03.039
So the depth, you just adding an enclose, changing the functionality completely.
00:27:03.039 --> 00:27:06.799
So to being instead of select these, it means deselect these.
00:27:06.799 --> 00:27:08.480
So what do you call that?
00:27:08.480 --> 00:27:10.480
That's depth of it.
00:27:10.720 --> 00:27:14.240
Definitely it's a type of ad hoc polymorphism, but yeah, it's sure.
00:27:14.240 --> 00:27:16.079
But then you could call anything ad hoc polymorphism.
00:27:16.079 --> 00:27:19.599
I mean that's that's the thing is ad hoc polymorphism is is ad hoc, right?
00:27:19.599 --> 00:27:27.200
It's it's when you define separate behaviors based on different things, number of arguments, type of the arguments, depth of the arguments.
00:27:27.200 --> 00:27:33.680
That's I mean, that's why it's called ad hoc, because it's just kind of like ah, like we could we could inject different behavior in here based on something, right?
00:27:34.000 --> 00:27:43.680
And if you go with with uh an APL2, then the slash is either replicate or reduce, and it's always an operator.
00:27:43.680 --> 00:27:49.839
And the type of the operand, it's a monetic operator, the type of the operand determines the functionality.
00:27:49.839 --> 00:27:52.079
What what is that then?
00:27:52.079 --> 00:27:56.000
Type overloading, two different primitives, is the same primitive?
00:27:56.000 --> 00:27:59.759
And and you really have that as well in in some dialogue operators, right?
00:27:59.759 --> 00:28:15.119
The the the power operator, the the asterisk with two dots on top, if you give it a function right operand, then it means until, until that function returns true when evaluated with the arguments of the previous and the current iteration.
00:28:15.119 --> 00:28:23.279
If you give it a value and an array, which has to be a type scalar number, then it repeats, right?
00:28:23.279 --> 00:28:26.880
So it's repeat and until which are related concepts but definitely not the same.
00:28:26.880 --> 00:28:33.440
Repeat is is a is a fixed bound, and until is could run forever, we don't know.
00:28:33.440 --> 00:28:37.920
So here again, it's the it's the type of the upper end.
00:28:37.920 --> 00:28:46.880
So if you go back to the dojo, things are things will go get a lot more complicated if you don't have nearly enough selectors on the right.
00:28:46.880 --> 00:28:50.240
Because what what what if you want to do something like reduce?
00:28:50.240 --> 00:28:52.640
So let's try.
00:28:53.200 --> 00:28:57.440
First of all, so which one this is not so this is uh a one monitor.
00:28:58.640 --> 00:28:58.799
Okay.
00:28:58.799 --> 00:29:02.880
So we lose our ranks, which is Yeah, but but hold on.
00:29:02.880 --> 00:29:13.599
So which which derived function in in APL, dialogue APL at least, the diadic derived function is windowed reduce, but the monetic derived function is just normal reduce.
00:29:13.599 --> 00:29:19.200
But you if you try to select monetic dyadic function up here, then you lose the selection of the one modifier.
00:29:19.200 --> 00:29:20.720
Those are not exclusive.
00:29:20.720 --> 00:29:25.599
Well, if I do it's not an expression either, it's a derived function.
00:29:25.599 --> 00:29:27.119
So you need to use the.
00:29:27.279 --> 00:29:34.960
I mean, but you can technically if we call it an expression, I can choose you know this to have just the reduced meaning.
00:29:34.960 --> 00:30:01.680
We choose it as APL, and we choose all of this, and when we create this, this will basically it'll syntax highlight it as I mean, so technically this is you know, so I guess actually what we should what the real thing to do is if we get rid of this, we we want a primitive and we want to be able to select one modifier, but when you select one or two modifiers, it should give you the option to say what you want function.
00:30:01.680 --> 00:30:04.000
Uh yeah, yeah, the area.
00:30:04.400 --> 00:30:07.039
Or ambivalent, because sometimes it's nice to treat them together.
00:30:07.039 --> 00:30:13.119
For example, we for the dojo here, we might want like functions derived from key or anything derived from key, right?
00:30:13.119 --> 00:30:25.440
That might be you want to want to treat that separately, but sometimes you would you would want to treat both the monetic and daddy form, things like constructs with ad or something, where it doesn't really matter if it's monetic daddy, the the the power operator and so on.
00:30:25.440 --> 00:30:28.720
There it's not important, so you should be able to leave that out.
00:30:28.720 --> 00:30:44.160
But what you could do here is some actually internally in dialogue and in APL2 as well, I think the other APLs, if you ask the system for the attributes of a of an entity you have, then it will tell you the valence.
00:30:44.160 --> 00:30:46.880
So, and that's also something that's missing over here.
00:30:46.880 --> 00:30:52.559
You you have you have subtype, you've written monadic function, daddy function, but there's also in principle niladic, right?
00:30:52.559 --> 00:30:54.559
So, for example, zilda, right?
00:30:54.559 --> 00:31:01.359
That's a sort of a niladic function, returns a constant value if you want, or you could see it as an actual array, that's up to you.
00:31:01.359 --> 00:31:15.680
So so we we use numbers, and you can query these numbers for any given name, and say what is the function valence, and that could be zero, one, or two, and it can be ambivalent, which is designated minus two, but it's just some number that you can refer to.
00:31:15.680 --> 00:31:22.000
And then there is the what is the operator valence, and that's also zero, one, or two, where zero means not an operator.
00:31:22.000 --> 00:31:26.799
One means you're right, one modifier, two means a two modifier, or monetic that it could operate.
00:31:26.799 --> 00:31:38.240
So those two numbers, the function valence and the operator valence, those completely describe the the syntactic role of any given thing.
00:31:38.960 --> 00:31:41.119
Are you saying, well, I got a little bit confused.
00:31:41.119 --> 00:31:52.799
Are you saying that because uh one modifiers don't have the ability to accept different airity or in your parlance valence functions, right?
00:31:52.799 --> 00:31:54.400
Like a reduction change.
00:31:54.880 --> 00:31:56.480
True, but that's not the that's not the point.
00:31:56.480 --> 00:32:06.880
It's the the the the function valence of an of some of a construct using in an operator would be referring to the derived function.
00:32:06.880 --> 00:32:08.480
So for example, plus slash.
00:32:08.880 --> 00:32:09.519
Oh, I see.
00:32:09.519 --> 00:32:12.319
What you meant there was not the argument, it was the derived function.
00:32:12.319 --> 00:32:13.039
Yeah, okay.
00:32:13.200 --> 00:32:13.920
Yeah, the derived function.
00:32:13.920 --> 00:32:15.359
I mean, definitely we should add that.
00:32:15.519 --> 00:32:19.680
So let's let's go which one of my cursor implementations.
00:32:20.240 --> 00:32:28.000
Okay, so if we say for the one modifier and two modifier, you just need to split that, right?
00:32:28.160 --> 00:32:34.319
So the subtype that we have here, there should just be three options for each row, and there should be not one radio button group, should be two groups.
00:32:35.119 --> 00:32:47.599
Oh, you're saying don't have a new section that is enabled by click because I was thinking if you click either one modifier or two modifier, it'll pop up a news section that says like derived airity.
00:32:48.000 --> 00:32:50.240
I mean, you're saying just have like a reason for that.
00:32:50.240 --> 00:32:58.720
Yeah, just instead of a stop type, you have one that's called function valence, that which and and then a new section called operator valence, right?
00:32:58.720 --> 00:33:02.240
And then the first option in operator valence is not an operator, right?
00:33:02.240 --> 00:33:04.160
On an A or whatever you want to call it.
00:33:04.319 --> 00:33:13.119
And the first the first option under function valence is a idea better because the having to click uh not applicable is anyway.
00:33:13.200 --> 00:33:14.960
So that can be the default, right?
00:33:14.960 --> 00:33:16.720
It will just be zero.
00:33:17.119 --> 00:33:22.160
Add a section called what do we want to call it?
00:33:22.400 --> 00:33:23.680
Derived function.
00:33:23.920 --> 00:33:26.400
Yeah, derived valence or derived function.
00:33:26.559 --> 00:33:27.680
Should I switch to valence?
00:33:27.680 --> 00:33:37.039
I mean, I I like erity, even though I prefer monadic and dyadic, and I know erity goes with unary and binary, and valence goes with dyadic and monadic, but I I don't know.
00:33:37.039 --> 00:33:43.920
I guess if you if you're if you're listening to episode 123 of a ray cast, you probably are able to interchange between the and valence.
00:33:44.240 --> 00:33:47.039
I think Marshall had a very good point in like keep simple language.
00:33:47.039 --> 00:33:49.200
Just you call it a one modifier, two modifier.
00:33:49.200 --> 00:33:54.799
Why not instead of subtype monadic function, diadic function, you just say one arc, one argument, two argument, right?
00:33:54.799 --> 00:33:56.720
And then one modifier two modifier.
00:33:56.720 --> 00:33:57.759
That's all it means.
00:33:57.759 --> 00:34:06.079
And then zero argument zero argument means it doesn't, it's something that's like zilda or hash or those things, null or just numbers.
00:34:07.839 --> 00:34:09.679
Why use monadic and diet?
00:34:09.679 --> 00:34:23.519
I guess because one argument and two argument to my ear sounds like the this is the incorrect word, but the the word that popped into my head was like Neanderthal is like it is you're describing it to understand.
00:34:23.519 --> 00:34:39.440
Yeah, you're describing something in simpler vocabulary, but something that has a specific a word that was specifically designed for it, and it's it's kind of like Trumpy, you know, like Trump says we've got big, beautiful books, you know, and it's he says one-syllable words to make it understandable to more people.
00:34:39.440 --> 00:34:43.760
But it's like, well, there is a word for that that we have called unary binary monadic dyadic.
00:34:43.920 --> 00:34:54.159
Um but I guess why I started doing this in the in the appeal challenge that we have going, where I've started simplifying the way we describe things, both the la the names for things.
00:34:54.159 --> 00:35:06.079
Like we use we experts like using long, complicated sounding words to make them sound more intelligent or or more educated than the masses, even though it's just simple concepts.
00:35:06.400 --> 00:35:07.360
Yeah, that's true.
00:35:07.360 --> 00:35:09.039
I mean there's pros and cons, right?
00:35:09.039 --> 00:35:29.760
One argument, like I definitely when I'm giving talks, and ever I whenever I first say the words unary and binary or monadic and dyadic, I always add a little explainer like FYI, and sometimes I'll even show the Wikipedia table of the Greek words and the Latin words for unary, binary, ternary, quaternary, and monadic, dyadic, tetradic, and quadratic.
00:35:29.760 --> 00:35:32.639
And then people probably go, oh, okay, yeah, that makes sense.
00:35:32.639 --> 00:35:39.519
Because I definitely remember being confused the first time I heard the word binary and didn't realize they were talking about aridity or valence.
00:35:39.519 --> 00:35:45.280
But anyways, let's uh we'll put the maybe maybe I'll rename this stuff, but let's uh I'm I'm still halfway writing the prompts.
00:35:45.280 --> 00:35:52.719
Add a border with the color for the modifiers similar to uh expression.
00:35:52.719 --> 00:35:57.119
I didn't really explain this well, so I mean if the AI understands what I want, that'll be very impressive.
00:35:57.119 --> 00:35:58.880
It will understand something.
00:35:58.880 --> 00:36:02.719
Uh well that's I I mean it'll understand something, but it will it understand what I wanted?
00:36:02.719 --> 00:36:03.360
Maybe maybe not.
00:36:03.360 --> 00:36:10.880
So what I'm hoping is that there'll be a new section called derived function erity, and then it only shows up if one or two modifiers selected.
00:36:10.880 --> 00:36:17.920
And then so if you currently, if you add a slash and we call this reduce.
00:36:17.920 --> 00:36:26.079
And so technically we're we're talking about the monadic derived case here, which I believe all the languages have.
00:36:26.079 --> 00:36:32.079
The dyadic derived differs, but if we do this, it should create me a yellow.
00:36:32.079 --> 00:36:34.400
And and note here at the bottom, I haven't mentioned this.
00:36:34.400 --> 00:36:45.119
So I'm using the Weewa syntax highlighting, which is differentiates between monadic and dyadic functions, which we can do in wiwa because we have no ambivalence.
00:36:45.119 --> 00:36:45.920
We've got fixed area.
00:36:46.639 --> 00:36:48.159
That's good, that's good for this purpose here.
00:36:48.159 --> 00:36:52.239
Yeah, I do that in AppleCard as well, differentiating entirely between monadic daddy functions.
00:36:52.960 --> 00:37:02.639
I do give the option though underneath, because people are gonna get confused if they start seeing, because technically a one modifier in most of the array languages is syntax highlighted green.
00:37:02.639 --> 00:37:08.880
So if you want, you can switch and then make all the functions blue, actually, just so people don't get confused.
00:37:08.880 --> 00:37:11.119
And what should this be?
00:37:11.119 --> 00:37:12.159
A green?
00:37:12.159 --> 00:37:13.199
Blue?
00:37:13.519 --> 00:37:14.239
Reduce?
00:37:14.239 --> 00:37:15.760
I mean, again, it depends.
00:37:15.760 --> 00:37:23.119
The in the basic form where the where the where the upper end is a scalar function, then it's yeah, green is fine.
00:37:23.119 --> 00:37:28.800
But if the if the upper end is not a scalar function, then it's interesting.
00:37:28.800 --> 00:37:30.800
And I would even say you could even go further.
00:37:30.800 --> 00:37:32.000
What kind of reduce?
00:37:32.000 --> 00:37:34.960
Plus reduce, times reduce, sure.
00:37:34.960 --> 00:37:36.159
Those are very simple.
00:37:36.159 --> 00:37:37.119
Everybody gets those.
00:37:37.119 --> 00:37:40.480
Maybe those are even white, even if they have a bit of special syntax.
00:37:40.480 --> 00:37:45.679
But unequal reduce, which is an which is an XR checksum.
00:37:45.679 --> 00:37:47.519
Maybe not.
00:37:47.519 --> 00:37:51.360
What about left tag and right tag reduce that selects the first and the last elements?
00:37:51.360 --> 00:37:52.719
Are they as simple?
00:37:52.719 --> 00:37:55.679
And then you have things like custom function reduce.
00:37:55.679 --> 00:37:56.719
I do that sometimes.
00:37:56.719 --> 00:38:03.599
We want to run the same function on the original data and then with varying left arguments.
00:38:03.599 --> 00:38:10.159
So you take all the left arguments, concatenate them to the enclosed of the original data, and then apply reduce with some giant custom function.
00:38:10.159 --> 00:38:11.840
That's a whole different technique.
00:38:12.079 --> 00:38:14.320
Alright, let's let's pause you there because this is fantastic.
00:38:14.320 --> 00:38:15.920
This is f this is what I'm talking about, folks.
00:38:15.920 --> 00:38:17.920
This is what the APL dojo is all about.
00:38:17.920 --> 00:38:21.360
Well, first of all, we're gonna hit F5, see if the AI did what we wanted.
00:38:21.360 --> 00:38:22.480
We're gonna hit this.
00:38:23.119 --> 00:38:28.719
It doesn't seem to Well, what if we uh Did you reload it?
00:38:28.719 --> 00:38:31.039
I did reload it.
00:38:31.039 --> 00:38:35.440
I don't want to hit control F5 because that could potentially relate my memory release.
00:38:35.679 --> 00:38:40.639
But if we Th there's another thing that's missing here, I think, is the type.
00:38:40.639 --> 00:38:45.119
You've got primitive expression concept, and I would also add technique as another one.
00:38:45.119 --> 00:38:47.760
That's neither really an expression nor is the concept.
00:38:47.760 --> 00:39:00.480
But but as we'll get to eventually on the black belt is is dual-wielding uh rank operator with with two different ranks for the left and right argument.
00:39:00.480 --> 00:39:05.039
Uh that's a technique, it's not an expression, it's not a primitive, it's not a concept.
00:39:05.039 --> 00:39:08.239
Alright, we'll add the technique for next time.
00:39:08.480 --> 00:39:13.760
So the the AI, I think we can start a new podcast, the APL Dojo podcast.
00:39:13.760 --> 00:39:15.280
This is all we do.
00:39:15.519 --> 00:39:16.559
This is all we do.
00:39:18.079 --> 00:39:29.920
Well, so actually, while we're waiting for the AI to fix what it failed to do, let's add the not equal to because I actually had this as one of the expressions when I was sending you screenshots.
00:39:29.920 --> 00:39:31.679
So this is an expression.
00:39:31.679 --> 00:39:34.239
It is a monetic It's not an expression.
00:39:34.239 --> 00:39:36.079
It's I mean you could I guess you could call it an expression.
00:39:37.440 --> 00:39:37.920
Yeah, okay.
00:39:37.920 --> 00:39:38.880
Yeah, it's an expression.
00:39:39.440 --> 00:39:46.159
Anything that's more than a primitive but less than something that needs to be described by words, and then we can highlight it as APL.
00:39:46.159 --> 00:39:49.280
Do all of the I think all the languages have it.
00:39:49.280 --> 00:39:52.880
So we go create, and so this one you can see has a gray background.
00:39:52.880 --> 00:39:54.400
And what is this?
00:39:54.400 --> 00:39:55.599
Is this blue?
00:39:55.599 --> 00:39:56.079
Purple?
00:39:56.079 --> 00:39:59.679
I don't think it's black belt, but it's no, not more than blue, I would say.
00:39:59.840 --> 00:40:01.119
All right, it's not that hard to understand.
00:40:01.119 --> 00:40:04.320
And so you can see also the the scan equivalent, right?
00:40:04.880 --> 00:40:05.840
That one's more interesting.
00:40:05.840 --> 00:40:07.679
Actually, that's the one that I was thinking about.
00:40:07.679 --> 00:40:08.639
That's what I was thinking about.
00:40:08.639 --> 00:40:09.920
So let's add that one as well.
00:40:09.920 --> 00:40:12.159
And actually, wait, we the AI sets it's done.
00:40:12.159 --> 00:40:14.079
Let's hit F5 and see what happens.
00:40:14.079 --> 00:40:15.360
So now we go here.
00:40:15.360 --> 00:40:16.480
What is going on here?
00:40:16.480 --> 00:40:22.079
It says I mean it's so sad, you know, you spend so much time working with these tools and it does everything perfectly.
00:40:22.480 --> 00:40:25.360
I think we might be running out of belts very soon.
00:40:25.360 --> 00:40:32.800
Because I think we'll be able to identify things that are definitely easier than one of them but harder than another one, and fits in between.
00:40:32.800 --> 00:40:43.039
Madeline wrote in the chat that she thinks a reasonable split is associative scalar or scalar or other on and then on vector or higher rank.
00:40:43.039 --> 00:40:49.039
And that's probably especially like reduced first would be higher difficult than different than higher rank.
00:40:49.039 --> 00:40:50.960
So so yeah, think about it.
00:40:50.960 --> 00:40:55.199
Where would you put plus slash like monetic plus slash, the sum?
00:40:55.199 --> 00:40:56.880
On on green, right?
00:40:57.119 --> 00:41:14.239
Yeah, I mean I would say, I would say, and that's the that's the tricky part, is when you were breaking down all the different reduces, is that there are more complicated reduces like the not equal to reduce and you know the left tack, right tack, and the custom ones, and the non-scalar ones.
00:41:14.239 --> 00:41:20.159
But like when I when I see just the reduce, in my mind it kind of categorizes it as like the simplest version.
00:41:20.159 --> 00:41:24.079
So like plus reduce fits in here, multiplication reduce fits in here, you know.
00:41:24.400 --> 00:41:25.679
But it stops there, right?
00:41:25.679 --> 00:41:30.320
Because as soon as you go to minus reduce, things get real fun, right?
00:41:30.320 --> 00:41:32.079
Because that's an alternating sum.
00:41:32.079 --> 00:41:32.960
And division.
00:41:33.440 --> 00:41:39.679
It depends on your implementation, only APL has alternating, and then other ones do not, right?
00:41:39.679 --> 00:41:40.320
BK.
00:41:41.039 --> 00:41:50.239
So so the so the so the plus slash in in APL is different from the plus, well, the tiny little and that's and that's why we've got the languages.
00:41:50.320 --> 00:41:53.280
So when what as soon as it's different, you start tagging them.
00:41:53.280 --> 00:41:57.920
But like uh honestly, like that's that's the problem, is that in my mind you do all right, let's hit F5 again.
00:41:57.920 --> 00:41:59.440
I sent them a screenshot.
00:41:59.519 --> 00:42:01.039
So what happened?
00:42:01.039 --> 00:42:02.400
I mean, what's going on here?
00:42:02.559 --> 00:42:03.440
It's not different.
00:42:03.679 --> 00:42:05.440
Should I risk hitting control F5?
00:42:05.760 --> 00:42:07.119
You're gonna lose all your data.
00:42:07.119 --> 00:42:07.920
Well, it didn't lose.
00:42:07.920 --> 00:42:09.679
How does it go?
00:42:09.679 --> 00:42:10.079
There we go.
00:42:10.159 --> 00:42:12.159
It was it was uh it was a hard refresh problem.
00:42:12.159 --> 00:42:18.639
So now this is monadic, and if I update it, now it shows that this.
00:42:18.639 --> 00:42:23.039
And so technically, nice if we want, we can do what you were talking about earlier.
00:42:23.039 --> 00:42:28.239
And so for this, which so BQN doesn't have so I'm thinking about the n-wise reduction.
00:42:28.239 --> 00:42:30.800
So J but see there's a difference as well.
00:42:30.800 --> 00:42:32.079
Uh here's a value difference.
00:42:32.079 --> 00:42:33.199
There's always a difference, man.
00:42:33.199 --> 00:42:38.400
That's the problem, is you're operating up here, and I'm just like, let's just add this, and you're like, no, no, no, there's six different things.
00:42:38.880 --> 00:42:44.639
Connor, if you do a two-wise unequal reduce, that is a very simple concept.
00:42:44.639 --> 00:42:49.199
That's just comparing adjacent elements to see where do we have edges, right?
00:42:49.199 --> 00:42:51.039
Where do we switch from one value to another?
00:42:51.039 --> 00:42:59.440
But anything more than a two as left argument, that means you're actually doing XOR reduces over Windows, which is right.
00:43:00.159 --> 00:43:03.440
Well, I mean, so in my mind, it was just gonna be this.
00:43:03.440 --> 00:43:09.760
It was gonna be, once again, this is uh one modifier, but dyadic derived airity, primitive.
00:43:09.760 --> 00:43:12.639
We can even call this n wise.
00:43:12.639 --> 00:43:18.320
BQN doesn't have it because they uh use the left argument as an initial value.
00:43:18.320 --> 00:43:20.320
I actually doesn't have it either, right?
00:43:20.320 --> 00:43:22.000
J doesn't have it.
00:43:22.000 --> 00:43:28.079
Wewah has folds and reduces, and I I definitely don't think wewa doesn't build it in here.
00:43:28.079 --> 00:43:31.840
Cap, I know, has it, and I think Tiny Apple has it as well.
00:43:31.840 --> 00:43:35.599
So we create this, now you get one with the green border.
00:43:35.599 --> 00:43:37.119
I would add this.
00:43:37.440 --> 00:43:38.320
Not the prettiest thing.
00:43:38.880 --> 00:43:42.000
Yeah, it's a little bit hard, but you know, it's it's something, it's something.
00:43:42.000 --> 00:43:45.440
Um and also, too, it's a little bit I should add like a black.
00:43:45.760 --> 00:43:49.760
I would say that's a big difference between the two wise reduce and n wise reduce.
00:43:49.760 --> 00:43:56.880
Two wise reduced is something so simple that even K has it as an as a standalone operator, right?
00:43:56.880 --> 00:43:58.159
Yeah, it's prior, right?
00:43:58.159 --> 00:43:59.360
Prior, exactly.
00:43:59.360 --> 00:43:59.760
Okay.
00:43:59.760 --> 00:44:05.440
By the way, Badland says Tiny Apple doesn't have that reduces his intlai value.
00:44:05.440 --> 00:44:07.519
Well then be gone, Tiny Apple.
00:44:07.519 --> 00:44:08.000
Yeah.
00:44:08.000 --> 00:44:10.480
So so I think there's a big difference there.
00:44:10.480 --> 00:44:14.960
Between what do you like if we go to C land, right?
00:44:14.960 --> 00:44:19.760
Adjacent differences is called and and doing windowed things.
00:44:19.760 --> 00:44:21.519
Yeah, adjacent difference.
00:44:22.000 --> 00:44:33.519
Adjacent difference in C 98 is just that, but the generic adjacent transform that showed up in C23, that takes a static argument, a template argument that can be anything.
00:44:33.519 --> 00:44:35.599
So it's it's like the n-wise reduction.
00:44:35.599 --> 00:44:44.559
So I mean, but like how do we so if you want to delineate these, technically the way to do it would be, you know, it's technically well.
00:44:44.559 --> 00:44:46.079
I don't actually know.
00:44:46.079 --> 00:44:47.440
So how does that work by the way?
00:44:47.519 --> 00:44:50.079
When you click the addict function there, you know what we should have?
00:44:50.559 --> 00:44:58.000
We should have like the cross, you know, like the uh we should get the symbol, you know, the you know, the two different crosses, one's like Henry's and one's I don't know, some other guy's names.
00:44:58.000 --> 00:45:07.360
And we should like that's not a symbol in any of the array languages, so that should just be for a generic binary operator, so that we can put like how is that not not a multiplication symbol?
00:45:07.360 --> 00:45:10.159
Well, because multiplication is actually uh a thing, right?
00:45:10.400 --> 00:45:12.159
Yeah, but that's the other cross you're talking about, right?
00:45:12.320 --> 00:45:19.519
Yeah, anyways, but I'm just saying we need one of those symbols, like in in at in mathematical like academic papers, they use that for they usually use a blob, a blob or something.
00:45:19.519 --> 00:45:20.079
Yeah, yeah.
00:45:20.079 --> 00:45:21.760
Well, we need something because op looks bad.
00:45:21.760 --> 00:45:25.760
You know, all of these are taken, and you know, question mark, it means something.
00:45:25.760 --> 00:45:27.440
But you want the solid blob.
00:45:27.440 --> 00:45:30.159
Well, uh we can just go get that.
00:45:30.159 --> 00:45:39.840
Yeah, where let me uh I need another uh let's Google Google generic binary operator cross unicus.
00:45:40.800 --> 00:45:41.360
Actually, what do you think?
00:45:41.360 --> 00:45:43.440
What I've seen in mathematical papers are two different things.
00:45:43.440 --> 00:45:48.960
One is a star, and then there's the those that use just a filled black circle, a blob.
00:45:48.960 --> 00:45:53.119
So I'm on shape catcher right now on a different monitor.
00:45:53.119 --> 00:45:56.400
That's that's a bad thing for filled out things.
00:45:56.400 --> 00:45:58.639
It'll be you have to fill it by hand.
00:45:58.639 --> 00:46:00.320
Man, I just got a bunch of clocks.
00:46:00.480 --> 00:46:01.039
What the hell?
00:46:01.119 --> 00:46:02.159
Here, actually, people might be.
00:46:02.159 --> 00:46:03.679
Yeah, because you're trying to fill it.
00:46:03.679 --> 00:46:04.559
That's the problem.
00:46:04.559 --> 00:46:06.800
I can give you the Unicode value if you want.
00:46:06.800 --> 00:46:10.480
Uh you have the U U plus 25C F.
00:46:10.719 --> 00:46:11.039
What?
00:46:11.280 --> 00:46:12.320
Yeah, never mind that.
00:46:12.320 --> 00:46:13.679
Just go just right.
00:46:13.679 --> 00:46:15.519
Get U plus 25 C F.
00:46:16.079 --> 00:46:20.480
U plus 25C F, yeah.
00:46:20.480 --> 00:46:21.920
That's not the one I want.
00:46:21.920 --> 00:46:23.519
No, sir, I don't know what you want.
00:46:23.760 --> 00:46:25.199
I want the I want the cross one.
00:46:25.199 --> 00:46:26.159
Which cross?
00:46:26.159 --> 00:46:27.280
The dagger symbol?
00:46:27.280 --> 00:46:27.920
I don't know.
00:46:27.920 --> 00:46:29.119
There's two, there's two.
00:46:29.199 --> 00:46:30.400
There's Henry's cross.
00:46:30.400 --> 00:46:32.960
Oh, you want them the circled ones?
00:46:33.119 --> 00:46:33.679
Yeah, yeah.
00:46:33.920 --> 00:46:35.039
Oh, that's one around.
00:46:35.039 --> 00:46:36.159
I mean, even that's sort of.
00:46:36.159 --> 00:46:38.400
Come on, what's going on here?
00:46:38.400 --> 00:46:39.760
Is this this?
00:46:39.760 --> 00:46:41.840
No, that's a that's a weird letter.
00:46:41.840 --> 00:46:45.199
I can also old italic letter the?
00:46:45.199 --> 00:46:48.880
I mean, this is pretty close, but that's not what you want.
00:46:48.880 --> 00:46:51.199
You want the one with a I know now I understand what it is.
00:46:51.199 --> 00:46:52.960
What is your after?
00:46:52.960 --> 00:46:55.119
Here, there are a couple of different ones.
00:46:55.119 --> 00:46:59.119
It's NRE circled operators called or circle plus, if you want.
00:46:59.440 --> 00:46:59.840
Circle.
00:46:59.840 --> 00:47:01.519
I mean, actually, I should have been able to guess that.
00:47:01.519 --> 00:47:02.079
Circle plus.
00:47:02.079 --> 00:47:05.119
It is uh it's u plus two two nine five.
00:47:05.119 --> 00:47:09.039
U plus two two nine five, he says.
00:47:09.039 --> 00:47:09.519
Yeah.
00:47:09.519 --> 00:47:10.320
There we go.
00:47:10.320 --> 00:47:13.199
Now we're gonna You should have just told me what it was you wanted.
00:47:13.519 --> 00:47:14.480
Well, you know.
00:47:14.480 --> 00:47:17.360
Or you could have a S an LLM, who knows?
00:47:17.360 --> 00:47:18.639
That's true.
00:47:19.199 --> 00:47:20.880
You could there we go the whole thing.
00:47:20.880 --> 00:47:23.199
All right, I'll keep that in my copy buffer and make sure not to.
00:47:23.840 --> 00:47:27.519
Roger Huey and I suggested giving that meaning in APL, but yeah.
00:47:27.519 --> 00:47:31.199
And I believe it's actually an a function in tiny appl?
00:47:31.199 --> 00:47:36.639
So now we create this, and you're saying this is simple?
00:47:36.800 --> 00:47:37.599
This should be here?
00:47:37.760 --> 00:47:38.320
I don't know.
00:47:38.320 --> 00:47:42.000
Yeah, no, that should be on yeah, I don't know, I guess.
00:47:42.400 --> 00:47:44.559
And then you're just saying like N.
00:47:45.119 --> 00:47:51.679
And this is Yeah, so just know that in Tiny APL, this is a a function that Roger Huey and I proposed.
00:47:51.920 --> 00:47:55.280
So does that mean we get rid of the nwise reduce here?
00:47:55.280 --> 00:47:57.519
Like, what's a better way, like yeah?
00:47:57.599 --> 00:47:58.800
I think that's much clearer.
00:47:58.800 --> 00:48:00.159
Now you can see what it means.
00:48:00.159 --> 00:48:06.320
Otherwise, I can't tell the difference other than by color, the difference between that nwise reduced and the normal reduced on there.
00:48:06.800 --> 00:48:12.000
So get rid of this one, the one that I'm the the colored yellow one, and then just keep the expressions is what you're saying.
00:48:12.000 --> 00:48:13.199
Yeah, I think so.
00:48:13.440 --> 00:48:15.840
It's much clearer at a glance what it means.
00:48:15.840 --> 00:48:19.280
I mean, what I would do in in say AppleCard is I put an F.
00:48:19.280 --> 00:48:21.840
An F for the N or an F for the symbol?
00:48:21.840 --> 00:48:25.760
For the for the generic function, because it's not necessarily a primitive.
00:48:25.760 --> 00:48:28.239
This sort of indicates there's a primitive, it could be any function.
00:48:28.639 --> 00:48:33.119
Well, it's supposed to just mean binary operation, yeah, is what it's supposed to mean.
00:48:33.119 --> 00:48:37.280
So I mean for the audio listener that hasn't switched over to YouTube, big mistake.
00:48:37.280 --> 00:48:45.840
We're we're we have been trying to figure out how to separate the variations or variance of the nwise reduced.
00:48:45.840 --> 00:48:53.039
So, Adam, I'm sure you understood earlier with saying that a twowise reduction is much simpler than an nwise, where n is greater than two.
00:48:53.039 --> 00:48:59.840
And I guess, yeah, that's actually not technically n could be two here, but hopefully the fact that both of them are on the screen, people can deduce that.
00:49:00.079 --> 00:49:01.280
Yeah, that that that's fine.
00:49:01.280 --> 00:49:03.199
Otherwise, it'll be too complicated.
00:49:03.199 --> 00:49:06.320
But see, what I would do here, you have another problem, right?
00:49:06.320 --> 00:49:10.719
Which is the rank that's not steady that you're going to put in the little circle in the corner.
00:49:10.719 --> 00:49:12.559
That that also makes a difference.
00:49:12.559 --> 00:49:22.400
So here this is last if you're doing APL, this is last access reduced, but the first access reduced would probably move up one level because then you have to understand how it works along the columns.
00:49:22.400 --> 00:49:25.280
So you're just saying just the first access reduction?
00:49:25.280 --> 00:49:35.760
And we can well, first no, that's first access and reduce first access, all of the first X reduces are like one level up, sort of from from their equivalent last access reduces.
00:49:35.760 --> 00:49:38.800
It's easier to understand the last access reduces.
00:49:39.039 --> 00:49:40.559
Oh man, it's so confusing.
00:49:41.039 --> 00:49:42.159
Yeah, but that means we have so many.
00:49:42.159 --> 00:49:51.599
So so what I do, instead of all these colors and the settings and things you have to do, what I do in in say Apple card and and the other Apple card-inspired things do the same thing, I believe.
00:49:51.599 --> 00:49:53.760
That is to use codes, right?
00:49:53.760 --> 00:49:58.320
So so here on if you go down to like the IOTA one, right?
00:49:58.320 --> 00:50:03.039
That says IOTA with rank zero, then I would I would write that as an expression.
00:50:03.039 --> 00:50:07.360
I would write IOTA M uppercase M lowercase s.
00:50:07.360 --> 00:50:12.400
That means so M means a write argument that is numeric.
00:50:12.400 --> 00:50:15.519
And oh sorry, sorry, uh N.
00:50:15.519 --> 00:50:20.639
So uh uppercase n lowercase s that means oh and numeric scalar.
00:50:20.639 --> 00:50:29.360
And then if you want a vector, you write nv, numeric vector, and then at a glance you can see what it what it means, and that's so so too with a function.
00:50:29.360 --> 00:50:36.320
So you could you could also introduce things like fs for scalar function or fm for mixed function, things like that.
00:50:36.320 --> 00:50:43.360
There, so I use I use text codes that don't rely on coloring, don't rely on like little icons and things, those different stuff, anyway.
00:50:43.360 --> 00:50:44.719
This is hard, right?
00:50:44.800 --> 00:50:49.199
It is because now it's ruining the fun of APL Dojo, there's too much nuance.
00:50:50.159 --> 00:50:56.000
Yeah, so now we are up to the purple belt on N-WISE uh reduce, right?
00:50:56.000 --> 00:51:03.360
On a on a primitive, but would you not say that there are concepts and primitives and so on that are like leagues above that?
00:51:03.360 --> 00:51:10.639
Yeah, so you're saying we need more colors, maybe, or we need to revise our strategy here because this is that's what I'm saying.
00:51:10.639 --> 00:51:12.400
This is hard.
00:51:13.119 --> 00:51:16.159
What do you mean it's it's uh that's something the AI is not gonna mess up?
00:51:16.159 --> 00:51:29.280
We can add back a couple colors, although it's gonna have to choose a red because I gave it an image and it chose the colors perfectly based off that image, but now that it's just gonna have to make up a red, which may or may not choose a red I like or a brown I like.
00:51:29.679 --> 00:51:33.280
I'm not sure it's a good idea because at what point does it not become useful, right?
00:51:33.280 --> 00:51:44.320
Well, we could also do a sort order, like an absolute ordering, or like a total ordering of primitives and concepts, and everything is like what is harder than what, and then you can choose your cutoffs arbitrarily and then you get your belts.
00:51:44.320 --> 00:51:56.239
Medalin saying in the in the chat that first axis reduced is is simpler than last axis reduce because if you explain uh if you explain leading access concepts early, but that's not true.
00:51:56.239 --> 00:52:24.800
That is true in a proper leading access language, but in traditional APL, leading access reduce is not actually a full leading access primitive dealing with higher rank cells, instead, it does some uh sort of interesting thing along the columns or along the it's it splits up the array into slices along the first coordinate and then applies things.
00:52:24.800 --> 00:52:31.039
Well, is it well it says APL dojo, Madeleine's protesting it's a general array language dojo, and I don't know.
00:52:31.039 --> 00:52:38.480
I think this I think it would be incredibly difficult to do all of this and also have all the different nuances across languages in mind.
00:52:38.559 --> 00:52:47.119
There's already so much nuance just for one language, and I guess here's the question Is it possible to do on to do this nuance less?
00:52:47.119 --> 00:52:48.719
Modulo nuance?
00:52:48.719 --> 00:52:58.559
Like, is it is it possible to just kind of discard the because like in general, you know, we don't need to split two wise reduction and n-wise reduction.
00:52:58.559 --> 00:53:06.639
Like, and that's I guess that's the problem, is depending on how you learn these languages, what your background is, how you're coming at it, you know.
00:53:06.639 --> 00:53:17.280
I I technically when when I discovered n-wise reductions, I I had seen the two, comma slash, and I just thought that that was an idiom.
00:53:17.280 --> 00:53:20.960
I didn't realize you could replace the comma with like any operation.
00:53:20.960 --> 00:53:24.000
And the day I realized that, I was like, holy smokes, that's amazing.
00:53:24.000 --> 00:53:29.599
And so really, like when commas your operation, a two, a three, a four, it doesn't really make a difference.
00:53:29.599 --> 00:53:38.000
And so then when you realize you can place it with a binary operation or, you know, and then it just does a reduction equivalent basically on it, it's uh to me, they're the same thing.
00:53:38.000 --> 00:53:47.360
So it's like people are gonna, you know, if if Madeline thinks that reduce first is simpler, you know, because of her path, and I think you know, ny's and two y's go together.
00:53:47.360 --> 00:53:50.960
The question is, is like, are we able like, you know, dyadic transpose?
00:53:50.960 --> 00:53:52.719
That's what we mentioned at one point.
00:53:52.719 --> 00:54:00.000
This is a dyadic function, and we're just gonna put, I believe that's that.
00:54:00.000 --> 00:54:02.880
We call this dyadic transpose.
00:54:02.880 --> 00:54:05.920
And how many languages have dyadic transpose?
00:54:05.920 --> 00:54:07.280
I don't know, because I never use it.
00:54:07.280 --> 00:54:07.920
APL?
00:54:08.239 --> 00:54:12.079
I suppose all of them have, but they don't they're not defined the same way.
00:54:12.079 --> 00:54:12.639
That's all right.
00:54:12.639 --> 00:54:13.519
That's what I mean.
00:54:13.519 --> 00:54:13.920
Nuance.
00:54:13.920 --> 00:54:15.519
Yeah.
00:54:15.519 --> 00:54:19.679
So you can you can is it easy enough to just do that?
00:54:19.679 --> 00:54:23.199
And like, or or do we have to say that we're all What are we trying to achieve?
00:54:23.199 --> 00:54:24.400
What's the goal of this?
00:54:24.719 --> 00:54:25.039
I don't know.
00:54:25.039 --> 00:54:51.679
I think the goal of this is to at a high level put primitives, idioms in the form of expressions and high-level concepts in these different categories so that if you are in general at like the blue belt level, you can look at what is above your level of knowledge and find the missing you know tools and concepts and ideas and be like, oh, okay, like, and you know, double rank.
00:54:51.679 --> 00:54:53.280
You know, is that a concept?
00:54:53.280 --> 00:54:54.800
No, it's a technique.
00:54:54.800 --> 00:54:55.599
It's a technique?
00:54:55.599 --> 00:54:57.280
All right, well, we don't have technique for now.
00:54:57.280 --> 00:55:01.039
So we'll just call, and I I guess can I oh I look at that.
00:55:01.039 --> 00:55:04.719
I can the the uh the input method still uh still works here.
00:55:04.719 --> 00:55:07.760
And so is double rank, is that a thing for all the languages as well?
00:55:07.760 --> 00:55:10.719
This is something that I never do as well, so like I'm out of my depth here.
00:55:10.960 --> 00:55:15.039
And any of any rank any language that has the rank operator can do double rank.
00:55:15.039 --> 00:55:24.400
Double rank is not a built-in thing, it just means you took a you took a function that's derived from the rank operator and you applied it with the rank operator.
00:55:24.639 --> 00:55:26.159
Does we will have rank?
00:55:26.719 --> 00:55:28.800
Uh has planets, right?
00:55:29.039 --> 00:55:30.320
We'll keep we'll leave a weewa.
00:55:30.320 --> 00:55:34.880
So if I do this and then I just put double rank up here, you know, that works.
00:55:35.119 --> 00:55:39.760
And so if that is where hold on, if that's black belt, where do you put single usage of rank?
00:55:39.760 --> 00:55:40.880
Yeah, that's a good question.
00:55:40.880 --> 00:55:41.840
That's what we're here for.
00:55:41.840 --> 00:55:43.760
That's what the APL dojo is about.
00:55:43.760 --> 00:55:50.880
Yeah, but if the if single usage of rank is purple, then surely dyadic transpose would go down to purple as well.
00:55:50.880 --> 00:55:52.559
They sort of belong together in my mind.
00:55:52.880 --> 00:55:53.679
Right, say that again.
00:55:53.679 --> 00:55:55.199
If single usage of transpose.
00:55:55.360 --> 00:56:03.280
If single usage of rank of single usage of rank goes down to purple, then I would put dyadic transpose down to purple as well.
00:56:03.599 --> 00:56:07.280
You think dyadic transpose and rank are at the same level?
00:56:07.280 --> 00:56:08.400
Yeah, I think so.
00:56:08.400 --> 00:56:09.039
No, no.
00:56:09.039 --> 00:56:12.000
I've never used dyadic transpose once in the seven years.
00:56:12.000 --> 00:56:12.800
But that's what I mean.
00:56:12.800 --> 00:56:13.760
It's different for everybody.
00:56:13.760 --> 00:56:16.480
I've never used it once, and I don't even know what you use it for.
00:56:16.480 --> 00:56:28.320
I've heard you and Marshall have the most crazy tennis match of like primitive high-level black belts going back and forth of like, oh, it's a one rotate on the left argument, it's like, oh, it's just a reverse of blah blah blah.
00:56:28.320 --> 00:56:35.840
I still remember, I don't remember what episode that was, but the rest of the array cast panelists and uh me were were just like baffled.
00:56:35.840 --> 00:56:37.039
I use rank all the time.
00:56:37.039 --> 00:56:45.440
I mean, if I need to do something on a real-wise basis or a column-wise basis or something, and especially in J, you know, rank zero in J is a very common thing.
00:56:45.440 --> 00:56:47.360
Yeah, and Adam, what is that?
00:56:47.360 --> 00:56:47.920
What is the chat?
00:56:47.920 --> 00:56:53.679
I mean, we've got we've got Max, Madeline, and I guess Adam is a third person right now in the chat.
00:56:53.679 --> 00:56:55.360
What do what do Max and Madeline think?
00:56:55.360 --> 00:56:59.280
Where does rank Madeline's saying that the transpose has nuance, right?
00:56:59.679 --> 00:57:06.639
That's that dyadic transpose has nuance because there's some languages where you can give like a short left argument to transpose.
00:57:06.639 --> 00:57:14.639
And she says it's simpler to explain how just bringing one axis to the front rather than reordering or reordering all the axes.
00:57:14.639 --> 00:57:23.840
Whereas a different way of coming at it is saying dyadic transpose exists in a simpler version that is less powerful, and a more complicated version that's more powerful.
00:57:23.840 --> 00:57:36.000
And by more complicated meaning those that can take short left arguments, like a single left scalar left argument that Madeline was saying was a simpler thing, I would say that makes the whole primitive more complicated.
00:57:36.000 --> 00:57:38.000
I'm not saying we shouldn't do it, I think it's a good idea.
00:57:38.000 --> 00:57:41.599
But I but but there's a there's so much nuance here.
00:57:41.599 --> 00:57:45.039
I don't know how to do this.
00:57:45.039 --> 00:57:46.800
That is the problem.
00:57:46.800 --> 00:57:48.000
We're drowning in nuance.
00:57:48.000 --> 00:58:01.840
So so so what I have done really, like for real, something that already exists is that I always sort the data table in Apple card by a a very simplistic sort.
00:58:01.840 --> 00:58:06.079
It doesn't even distinguish between any of these nuances at all.
00:58:06.079 --> 00:58:07.599
Of course, this is only for APL.
00:58:07.599 --> 00:58:11.360
The only thing it distinguishes between is the character involved.
00:58:11.360 --> 00:58:19.360
Okay, and I have made some sort of according to my head arbitrary ordering of primitives of symbols in APL.
00:58:19.360 --> 00:58:23.039
And I can show you that or you can pull it up yourself if you want.
00:58:23.039 --> 00:58:24.400
We're going to Apple card?
00:58:24.400 --> 00:58:27.599
Well, no, don't go to AppleCard, go to AppleCard source, right?
00:58:27.599 --> 00:58:28.239
On GitHub.
00:58:28.239 --> 00:58:29.039
I can see it.
00:58:29.039 --> 00:58:32.079
Yeah, you can you can go through and click click the GitHub thing.
00:58:32.079 --> 00:58:32.639
Yeah.
00:58:32.639 --> 00:58:35.760
And then you go to a file called cars.
00:58:35.760 --> 00:58:36.320
Okay.
00:58:36.320 --> 00:58:38.400
Cars.apila.
00:58:38.400 --> 00:58:40.559
Is it in the top?
00:58:40.960 --> 00:58:41.599
Yeah, it's in the root.
00:58:41.599 --> 00:58:42.320
Yeah.
00:58:42.800 --> 00:58:44.079
I like to keep my thing simple.
00:58:44.079 --> 00:58:45.440
It's right there in the middle of your screen.
00:58:45.440 --> 00:58:46.719
It was before you scrolled.
00:58:46.719 --> 00:58:49.119
Oh, it's not in alphabetical order.
00:58:49.119 --> 00:58:50.559
Oh, it's yeah.
00:58:50.559 --> 00:58:54.000
Okay, so this is a bit small, I might want to make it bigger.
00:58:54.000 --> 00:58:54.960
Yeah.
00:58:54.960 --> 00:59:04.000
So this is my attempt at a rough ordering from simplest on the left to most complicated on the right, where I remove all the nuance, right?
00:59:04.000 --> 00:59:10.639
There's no consideration of ranks or depths of arguments, no consideration of even the monetic or the form of the primitive.
00:59:10.639 --> 00:59:11.280
Right?
00:59:11.280 --> 00:59:15.760
But this is so that I'm saying there was I think it was a space on the left, right?
00:59:15.760 --> 00:59:17.360
Space is the simplest thing.
00:59:17.360 --> 00:59:23.119
And then and then right tag is the simplest function, and left tag is this next simplest function.
00:59:23.119 --> 00:59:27.920
It has the slight complication that when you give it a right argument only, it still gives you the right argument.
00:59:27.920 --> 00:59:31.039
So it makes it more complicated than the right tag, which is pretty obvious.
00:59:31.039 --> 00:59:35.280
Then plus removing the nuance that plus deals with complex numbers, right?
00:59:35.280 --> 00:59:39.760
Comple conjugate, and it is just passed through for none numbers and so on.
00:59:39.760 --> 00:59:44.239
So that forgetting that nuance, minus times should be pretty simple, right?
00:59:44.239 --> 00:59:51.199
And then or and and removing the nuance of the number theoretical things, right?
00:59:51.199 --> 00:59:55.199
Because in the most common case, it's just logical or and and those are easy to understand.
00:59:55.199 --> 01:00:01.599
Then round up and maximum and round down and minimum, reverse last, reverse first.
01:00:01.599 --> 01:00:04.880
Notice I do the last axis before the first axis.
01:00:04.880 --> 01:00:06.880
I think it's easier to understand for most people.
01:00:06.880 --> 01:00:08.079
Then division, right?
01:00:08.079 --> 01:00:10.320
Why didn't division go plus minus times division?
01:00:10.320 --> 01:00:18.159
Because you know, division is a bit more interesting that you have to learn the with the with the typical sort of yeah.
01:00:18.159 --> 01:00:26.400
So I mean we had minus there, then modulus and absolute value, then we go the the factorial and then and choose k.
01:00:26.400 --> 01:00:33.360
And then we get our our the random number function, which yeah, it's again in combinatoric, so it's sort of that area.
01:00:33.360 --> 01:00:35.440
Then we get all the all the comparisons.
01:00:35.440 --> 01:00:37.199
I didn't order them by simplicity, right?
01:00:37.199 --> 01:00:40.000
There's no way I can say that less than is simpler than greater than.
01:00:40.000 --> 01:00:42.960
So I just put them in the standard order they appear in.
01:00:42.960 --> 01:00:58.639
And then and those are scalar comparison functions, so slightly more complicated in the scalar comparison function are the the full array comparison functions, and then some structural things, and of course, I would say mix and split are maybe more complicated to deal with than drop and take.
01:00:58.639 --> 01:01:09.119
But being that they share symbols, I've got to put them in an order, so that's where they go, and then reshape, because reshape is sort of similar to to take, you know, and then and then we do more advanced math.
01:01:09.119 --> 01:01:11.440
So all the advanced math comes comes over here.
01:01:11.440 --> 01:01:18.320
That's the power, exponential, logarithm, and and uh and the circle fun all the circular functions.
01:01:18.320 --> 01:01:24.320
And tilde comes here, you could say it's a simple Boolean function, but it deals with sets also.
01:01:24.320 --> 01:01:26.159
So I guess I put it here.
01:01:26.159 --> 01:01:38.000
Then the compositional operators, first the monetic compositional operator, then the binding, so on, and then the the more iterative ones, and then reductions and and replicate there, right?
01:01:38.000 --> 01:01:58.079
And and we keep we keep going, like we can see scrolling, then the naned nores tend to be a bit harder for people to wrap their hand heads around than some of the structural thong things that deal with combining arrays and opening it up and splitting them up and selecting from arrays and lookups and all the kind of lookups and set functions, power operators, not that complicated.
01:01:58.079 --> 01:01:59.760
Grade, pretty complicated.
01:01:59.760 --> 01:02:09.679
But again, if we had nuance, monetic grade, not so bad on numbers, monetic grade on characters, yeah, sure, not so bad if you know about Unicode, things like that.
01:02:09.920 --> 01:02:10.960
I can't believe scan.
01:02:10.960 --> 01:02:12.639
Scan is so far.
01:02:12.960 --> 01:02:21.119
Well, yeah, well, uh but think about what does grade mean on on a on a not not simple array, right?
01:02:21.119 --> 01:02:24.400
On a vector of multidimensional arrays, right?
01:02:24.400 --> 01:02:25.199
What comes first?
01:02:25.199 --> 01:02:29.440
A two by three array or a three by two array of the otherwise containing the same things?
01:02:29.440 --> 01:02:31.039
That's not that's pretty complicated.
01:02:31.039 --> 01:02:32.480
That the total array ordering.
01:02:32.480 --> 01:02:36.239
And then dyadic grade is again has nuance to it, right?
01:02:36.239 --> 01:02:40.639
The left argument that is scale, that is a vector, and a left argument that's multidimensional.
01:02:40.639 --> 01:02:42.719
That's like the multidimensional left argument.
01:02:42.719 --> 01:02:47.039
That's something Roger Hugh would test us to test people if they really know what they're talking about.
01:02:47.039 --> 01:02:54.960
Then the brackets, and again, I can't say that left or right bracket is becomes one before another, but they actually do a bunch of different things.
01:02:54.960 --> 01:02:56.880
So that's there's a lot of stuff to learn.
01:02:56.880 --> 01:02:59.679
Transpose, key, right?
01:02:59.679 --> 01:03:04.000
It's it gets harder and harder to sort of know see exactly what things should be.
01:03:04.000 --> 01:03:10.719
Then then the then we've got inner product, but that's also duding into things, so there's a whole bunch of complication there of the stencil.
01:03:10.719 --> 01:03:16.559
In code decode, it's all simple when you've got a single number you work on and a single base you're working on.
01:03:16.559 --> 01:03:26.159
But when you like mixed base multi-number conversions, it's right up there in in some pretty advanced stuff mathematically, especially like in code.
01:03:26.159 --> 01:03:30.239
So at that point, also more mathematics of of Domino, right?
01:03:30.239 --> 01:03:32.400
Matrix division inversion.
01:03:32.400 --> 01:03:34.400
Then you've got all kinds of systemy stuff, right?
01:03:34.400 --> 01:03:35.199
That comes over here.
01:03:35.199 --> 01:03:52.880
Things that are not even like core language things, but I still have glyphs, execute, format, spawn a thread, system calls to the IBM, the variant thing that changes the behavior of things, input, output assignments that which behave in the assignments, not just assignments, like that's like the simplest concept you can have in a in a programming language.
01:03:52.880 --> 01:03:54.320
But think about APL assignments.
01:03:54.320 --> 01:04:04.719
You've got modified assignments, multiple assignments, function assignments, operator assignments, localizing assignments in in defense, which you can override depending on what's on the left.
01:04:04.719 --> 01:04:11.679
Pass-through values, multi-name left side with a function that has implied each.
01:04:11.679 --> 01:04:13.840
There's so much stuff to know about assignment.
01:04:13.840 --> 01:04:32.800
A diamond now fulfills multiple roles, guards in defense, and control structures and stuff like that, and and what is and the and function definitions and uh and other things you do in in a treadfin and a defen, and hash is for namespace references, and then comes arrays.
01:04:32.800 --> 01:04:35.360
Now, here's not for for complication reasons, right?
01:04:35.360 --> 01:04:37.920
So I put all arrays and identifiers and so on at the end.
01:04:37.920 --> 01:04:43.840
That's not because they're more complicated, it's because I wanted that sort order in in for C decreasions in in Apple Cards.
01:04:43.840 --> 01:04:46.000
The primitives come before name things.
01:04:46.000 --> 01:04:55.199
But this is like this was my sort of take on a rough without any nuance ordering of the dialect primitives.
01:04:55.199 --> 01:04:57.119
And of course, you'll disagree with it.
01:04:57.119 --> 01:04:58.159
I can disagree with it.
01:04:58.159 --> 01:05:00.639
It's sort of rough like that.
01:05:00.639 --> 01:05:06.559
But if you now want to give them belts, you have got how got to put some arbitrary cutoffs between them.
01:05:06.559 --> 01:05:08.159
Yeah, go for it.
01:05:08.159 --> 01:05:09.440
No nuance.
01:05:09.440 --> 01:05:10.079
That's what it is.
01:05:10.079 --> 01:05:11.760
This is what happens if you get no nuance.
01:05:11.760 --> 01:05:17.199
Well we And this is just for APL, dialogue APL specifically.
01:05:17.199 --> 01:05:30.000
Now you add splitting monetic dietic, splitting all kinds of overloads, splitting up with argument ranks and depth and values, and multiple array languages, you've got so much nuance.
01:05:30.000 --> 01:05:49.599
It's like Well, I mean we before we move on from uh uh Madeline pointed out that uh the exclamation mark and the oh I tried to zoom in and uh it's a very minor thing, but yes, the distance between the the dot and the rest of the symbol in the exclamation point and and question mark are different.
01:05:49.599 --> 01:05:51.519
Also the height of the symbols is a bit different.
01:05:51.519 --> 01:05:52.400
It's a bit funny.
01:05:52.400 --> 01:05:56.239
I would say that the the actual problem here is the exclamation point.
01:05:56.239 --> 01:05:59.679
No, the question marks are sort of loopy part is.
01:05:59.679 --> 01:06:03.280
Too too low, it should just be higher up in general.
01:06:03.280 --> 01:06:05.039
Potato, this is minor.
01:06:05.039 --> 01:06:06.400
This is very much a tangent.
01:06:06.639 --> 01:06:19.119
Yeah, I mean I'm torn because I really do think that there it's possible to have a thing like this and a thing like that, this being the APL dojo where you've got a nice little tiered ranking.
01:06:19.119 --> 01:06:21.280
You know, a linear list of this doesn't.
01:06:21.280 --> 01:06:26.239
I mean, maybe I guess if you want to learn, you can start just by going primitive by primitive by primitive.
01:06:26.559 --> 01:06:28.400
But I don't think it's a good idea either.
01:06:28.400 --> 01:06:36.719
Because because I I like to put my students in APL in a position of being able to do something fun really quickly.
01:06:36.719 --> 01:06:40.000
So I want to teach them sure range duration on it.
01:06:40.000 --> 01:06:40.880
That that's fine.
01:06:40.880 --> 01:06:58.400
Then I want to teach them maybe some uh some reductions and some arithmetic, and all of a sudden they can now compute things like Pascal Triangle type things and and and uh the number of sugar cubes in a pyramid of of sugar cubes and things like that.
01:06:58.400 --> 01:07:02.320
So there's also like what should you be learning next?
01:07:02.320 --> 01:07:06.320
And I think I I I have taken very, very little art martial arts.
01:07:06.320 --> 01:07:15.519
I started going to an Aikido course uh long time ago when I was in high school, and I hurt my shoulder and I didn't want to continue.
01:07:15.519 --> 01:07:17.760
And there's just a couple of lessons, I think.
01:07:17.760 --> 01:07:25.280
And then I I I took like a uh a month long, but it wasn't full time, it was like 10 hours a week or something.
01:07:25.280 --> 01:07:29.280
Course on Balinese martial arts, I don't remember what it was called.
01:07:29.280 --> 01:07:33.679
So there was nothing about belts, not even getting to any any belts or anything.
01:07:33.679 --> 01:07:45.199
But even there, I would imagine that you you would take some more difficult concepts and put together with some some simpler moves so that you can actually do something.
01:07:45.199 --> 01:07:51.840
If you do all the simplest things, it's just the wiggle one finger, wiggle the wiggle the next finger, it gets very boring very quickly.
01:07:51.840 --> 01:07:58.320
But what this might be able to we might be able to do is to say if somebody's struggling, right?
01:07:58.320 --> 01:08:05.679
There's they're self-studying APL, and then they're they're they're dealing with dyadic transpose, and they think, why m is my brain not catching this?
01:08:05.679 --> 01:08:08.480
Getting the reassurance that yeah, this is hard.
01:08:08.480 --> 01:08:10.159
We know this is hard.
01:08:10.159 --> 01:08:11.519
It might help.
01:08:12.480 --> 01:08:22.000
Yeah, like I said, that's I mean fits with the thing of like saying I'm at this level, what are the concepts or things above that I should uh learn?
01:08:22.000 --> 01:08:29.840
Like the goal of this is isn't like I I want to have a certain amount of, like I said, granularity so that you're able to represent.
01:08:30.079 --> 01:08:35.920
Yeah, but I don't know, maybe maybe the rank is Are you uh are you aware of the AppleCart quiz?
01:08:35.920 --> 01:08:36.880
You ever seen that?
01:08:36.880 --> 01:08:37.359
No.
01:08:37.359 --> 01:08:39.760
So try if you go to AppleCart for a moment.
01:08:40.159 --> 01:08:44.319
So it does a link at the bottom center where you can write click on quiz.
01:08:44.319 --> 01:08:49.039
And there are these three different types of quizzes you that you can do, right?
01:08:49.039 --> 01:08:59.840
It doesn't check your answer or anything, it just lets you in your head try to, or paper, whatever, solve something, and then you can check it with your see the see the result and then continue.
01:08:59.840 --> 01:09:06.479
But notice the first one of these, which is always writing a function of a given task, it says how difficult it is.
01:09:06.479 --> 01:09:09.680
It solves the following medium difficulty task.
01:09:09.680 --> 01:09:14.960
And that so there you have a sort of granularity of how difficult is the task as a whole.
01:09:14.960 --> 01:09:16.399
How did I do that?
01:09:16.399 --> 01:09:19.039
It's I if I remember right, it's been a long time.
01:09:19.039 --> 01:09:22.960
It looks at the it does a weighted sum, right?
01:09:22.960 --> 01:09:35.199
So we we it looks at the primitives necessary to solve this because it's just using the Apple card table, and then it looks at the position of the symbols in that list that you saw before of the primitives, difficulty, and sums them up.
01:09:35.199 --> 01:09:37.119
That means more primitives, more difficult.
01:09:37.119 --> 01:09:41.840
More primitives that peer further to the right in the in that list, more difficult.
01:09:41.840 --> 01:09:52.640
So the simplest thing is to have something on the uh on the far left, a single thing from the far left, and then it just grades it into those three different levels easy, medium, and hard.
01:09:52.640 --> 01:10:00.239
So I did some arbitrary cutoff, probably like the one-third and two-third cutoffs between the easiest and the hardest, something like that.
01:10:00.239 --> 01:10:15.600
So there is I think I agree with you that is a way that it's possible to say that something is harder than something else, but I'm not sure how much value there is in saying that this is Jake, this is the level you're at, these are the primitives you should study.
01:10:15.600 --> 01:10:16.800
Sorry, sorry, Fanny.
01:10:16.960 --> 01:10:18.479
No, no, we're getting we're getting down, yeah.
01:10:18.880 --> 01:10:23.520
We're getting lost in the like, well, first of all, this is just I mean, it's gray.
01:10:23.520 --> 01:10:31.840
There's a reason why a rake a rake box, if we uh oh that's not correct, delete, and we zoom out here.
01:10:31.840 --> 01:10:36.640
I mean, if we hit F5, you know, I got this nice little animation now.
01:10:36.640 --> 01:10:40.479
You click this, people under, or I don't know, everyone's different one.
01:10:40.479 --> 01:10:47.840
Maybe some people like gray websites, but people I really value logos, color, and the aesthetic of things, you know?
01:10:47.840 --> 01:10:54.640
It brings me so much joy to hit control K and then to go control down and to toggle through all these keyboards.
01:10:54.640 --> 01:10:59.119
And and like color is color is so important, it at least for me.
01:10:59.119 --> 01:11:05.439
Like when I was doing the Wait, so are you are you commenting now on the colors in that book card rather than that everything is gray?
01:11:05.439 --> 01:11:09.359
I'm gonna learn something or deal with something.
01:11:09.359 --> 01:11:11.359
Like I go to a ray box all the time now.
01:11:11.359 --> 01:11:17.920
I want it to I want it to be a pleasant like visual and like all all all above.
01:11:17.920 --> 01:11:20.479
The the quiz, it hurts my soul.
01:11:20.479 --> 01:11:23.279
It looks like it looks like something died.
01:11:23.279 --> 01:11:24.079
You know?
01:11:24.079 --> 01:11:27.520
It looks like uh the you know, or at least something inside me died.
01:11:27.520 --> 01:11:32.319
Whereas even if this is less, we got a little color, we got some logos, we gotta have logos.
01:11:32.319 --> 01:11:36.319
That's why K, you know, K would already be included if K had a logo.
01:11:36.319 --> 01:11:38.479
And that's the problem, is I gotta come up with my own logo.
01:11:38.479 --> 01:11:40.000
I don't want to come up with a logo.
01:11:40.000 --> 01:11:42.720
And uh logo for APL then.
01:11:42.720 --> 01:11:49.359
And uh and I there was a bug in J that this was not being syntax highlighted correctly.
01:11:49.359 --> 01:11:53.520
And I realized because this was like blue and this was orange, and I was like, wait, what's going on anyway?
01:11:53.520 --> 01:11:54.800
So and then I went and got and fixed it.
01:11:55.119 --> 01:11:56.079
You have to tokenize it.
01:11:56.399 --> 01:12:08.479
And but that's the thing, is it it's a lot easier to read J when you've got syntax highlighting of you know the operators and the functions, and anyway, so you could have multiple multiple things of the same.
01:12:08.560 --> 01:12:16.159
We're we're way off topic from what we discussed before, but in even in J, you can have multiple tokens of the same type adjacent to each other, and you can't see the borders.
01:12:16.159 --> 01:12:22.239
For me, the big problem with J is the tokenization, it just blurs in my mind.
01:12:22.239 --> 01:12:36.079
Maybe maybe a uh a clever ligature font could fix it to like sort of move the things together so you get a little space, or it's much easier for me to read J that has spaces between the primitives, between the tokens in APL.
01:12:36.079 --> 01:12:36.880
I don't like that.
01:12:36.880 --> 01:12:38.479
Yeah, yeah, that's fair enough.
01:12:38.479 --> 01:12:48.319
I know I don't understand why, but like when people write verbose proper light languages like C and Python, JavaScript, and so on, they put spaces everywhere, and I don't get it.
01:12:48.319 --> 01:12:50.880
It's already so verbose, so little information on the screen.
01:12:50.880 --> 01:12:52.399
Why do you add more spacing?
01:12:52.399 --> 01:12:57.520
But but maybe also because those languages have multi-character tokens, right?
01:12:57.520 --> 01:13:07.600
So the spaces help you sort of tokenize, whereas in array languages that use fancy glyphs and and in K, you you barely need that.
01:13:07.600 --> 01:13:13.359
There are very, very few multi-character tokens in those array languages.
01:13:13.359 --> 01:13:15.600
Yeah, yeah, I mean that's a separate issue.
01:13:15.600 --> 01:13:20.399
Um the syntax colouring, it might it might be more useful if every other token had a different color.
01:13:20.399 --> 01:13:31.439
I but and I guess if you're not so used to the language, the the syntactic role of any given token is not so obvious to you, but once you're used to that, it doesn't really add much.
01:13:31.439 --> 01:13:35.439
I know Martin Kronberg says syntax coloring doesn't really do much for him.
01:13:36.000 --> 01:13:36.800
I mean there are some things.
01:13:38.000 --> 01:13:42.800
Everybody's different, but like you can't for some there's some utility things that I that I agree on.
01:13:42.800 --> 01:13:44.960
Like I would I would I mean I do have that.
01:13:44.960 --> 01:13:51.279
Uh in when you're dealing with trade difference in the APL, then there's a big difference whether your your names are localized or not.
01:13:51.279 --> 01:13:57.680
And having a different color or some indication of whether something's local or global, that is genuinely useful.
01:13:57.680 --> 01:14:02.319
Maybe the syntactic type of of user-defined names would be useful for me.
01:14:02.319 --> 01:14:04.079
But the primitives, whatever.
01:14:04.079 --> 01:14:07.119
Anyway, we can add color to AppleCart if you want, or I'll do a lot of things.
01:14:11.039 --> 01:14:12.239
That's the website again.
01:14:12.239 --> 01:14:15.359
The the goal here, I mean, we're we're so we're so lost in the sauce here.
01:14:15.359 --> 01:14:21.920
I mean, this is this is uh uh not a failure, but you know, we we shot for the stars and we landed in a dumpster.
01:14:21.920 --> 01:14:41.119
Like the the the the goal is that, or at least for me, like I had this vision of like a board that you know it's not it's it's not that oh this is the go-to place for people to learn languages or you know, the I I want to get into array languages, you know, you start at white and then you work your way up.
01:14:41.119 --> 01:15:01.279
It's more of just like I'm hoping that you know you and others that are more expert can put things here that like I can target as like you know, for for instance, you know, I don't know if this is a concept or an expression or a technique, I guess it would be a technique, but it's like you know, a dyadic reduce.
01:15:01.279 --> 01:15:07.920
You know, you want to apply a dyadic function on two arguments, but you know, it's in the form of a list.
01:15:07.920 --> 01:15:12.720
So you you you know, it's like it's like the idea of outer product, you know.
01:15:12.720 --> 01:15:13.920
Yeah, yeah, but for rank.
01:15:14.880 --> 01:15:22.239
So so so I think I think that one of the reasons why we end up in the dumpster shooting for the stars here is is exactly that shooting for the stars.
01:15:22.239 --> 01:15:23.920
Like try to reach the moon first.
01:15:23.920 --> 01:15:28.319
What I mean by that is we're trying to do all the array languages at the same time.
01:15:28.319 --> 01:15:32.079
We're trying to look at all the different possibilities of these primitives.
01:15:32.079 --> 01:15:40.720
One thing I sort of liked, sort of don't like, about the Weewa's website or documentation is it seems to sort of say that the highest rank is two.
01:15:40.720 --> 01:15:50.880
I know it's not the case, but if you pretend that the highest rank is two, then then instead of you first axis, last axis, this kind of thing, then it's just you know the rows and columns, it's easy.
01:15:50.880 --> 01:16:01.439
So I think if you remove nuance in a different way here, firstly, I would recommend starting with one language, you can always add it later because things get really complicated when there are new differences between the languages.
01:16:01.439 --> 01:16:10.000
And then maybe start with going through just the primitives, maybe start even with the primitive functions, just have a starting ground for like how difficult things are.
01:16:10.000 --> 01:16:14.399
And when you start with the functions, okay, split them in monadic, dyadic, that's fine.
01:16:14.399 --> 01:16:24.640
But assume that the arguments are of the smallest rank and depth that is reasonably meaningful for that primitive.
01:16:24.640 --> 01:16:33.039
So for example, dyadic transpose doesn't make sense on a vector write argument, but dadic and dyadic transpose doesn't make sense on a matrix right argument either.
01:16:33.039 --> 01:16:35.920
It only makes sense on rank three and more, right?
01:16:35.920 --> 01:16:42.560
Because, well, except if you're having duplicate left argument uh elements for the left argument, so you're already some some new answer.
01:16:42.560 --> 01:16:50.399
But assuming that the simplest application of dyadic transpose is when the left argument is a permutation without duplicates, right?
01:16:50.399 --> 01:16:53.760
So then it's much easier to speak about things.
01:16:53.760 --> 01:17:06.640
Then we know dyadic transpose is talking about vector left argument in in APL's case where there's it has to be a vector, so vector left argument, rank three right argument, and then it's way up there in the black belt, right?
01:17:06.640 --> 01:17:11.199
For for plus, even just one plus one, right?
01:17:11.199 --> 01:17:12.399
That's that's meaningful.
01:17:12.399 --> 01:17:17.920
Is that probably the most common case use of plus is just adding a scalar to another scalar that goes down in white.
01:17:17.920 --> 01:17:27.600
Yes, there's a lot more nuance to plus because there's scale extension, there is the uh array application, there is pervasiveness, right?
01:17:27.600 --> 01:17:35.039
There's and for some languages you got the leading axis, conformity, and bracket axis, and there's lots of stuff.
01:17:35.039 --> 01:17:39.119
But in the simplest case, one plus one is very simple, it goes in the white belt.
01:17:39.119 --> 01:17:40.800
Yeah, then build it up from there.
01:17:40.800 --> 01:17:48.560
Then we can always add more new ones, but start small, start with a minimal variable product where you say these are the primitives and their simplest forms.
01:17:48.560 --> 01:17:53.920
This is how you grade them, and then maybe maybe you even have like function black belt, right?
01:17:53.920 --> 01:18:08.800
Primitive function black belt on symbols form, and maybe there's like advanced function application where you later where you say, like, okay, these primitives actually can do a lot more, and then you get like separate build for that, or then you can start adjusting, like move everything down to just green and white, or something like that.
01:18:08.800 --> 01:18:10.319
Then you can do the nuance later.
01:18:10.319 --> 01:18:16.960
But I think if you start with that, you actually have a chance of getting somewhere that's that has some meaningful information to the reader.
01:18:16.960 --> 01:18:20.479
Uh I know you want to do everything, right?
01:18:20.640 --> 01:18:25.760
But it's not that I want to give everything, but just like starting with one plus one is boring.
01:18:26.000 --> 01:18:27.359
You don't have to start with one plus one.
01:18:27.359 --> 01:18:28.319
That's boring, yeah.
01:18:28.319 --> 01:18:33.439
So, but starting with IOTA on just an a scalar right argument, that's right.
01:18:33.439 --> 01:18:34.560
That's what we did start with.
01:18:34.560 --> 01:18:35.359
It was right here.
01:18:35.359 --> 01:18:36.640
Yes, yeah, yeah, sure.
01:18:36.640 --> 01:18:40.159
But it's but you're trying to fill out all the like to cover everything.
01:18:40.159 --> 01:18:42.159
You have the little badger in the corner saying it's a good one.
01:18:42.319 --> 01:18:43.279
I'm just trying to cover everything.
01:18:43.359 --> 01:18:55.760
I'm trying to create so so so if for so now we can go in and if you want to look at operators, I would recommend staying with functions just to get to get used to the process of assigning belts to the functions.
01:18:55.760 --> 01:19:04.159
So now we go through the language bar, whatever list of primitives, and just do the functions and just look at each one, what are their simple applications?
01:19:04.159 --> 01:19:07.119
That's what I would recommend, just as a starting point.
01:19:07.119 --> 01:19:13.760
So, sure, you can skip the arithmetic, but where would you put, for example, monadic circle, right?
01:19:13.760 --> 01:19:16.000
Monetic circle, I would say, is very simple.
01:19:16.000 --> 01:19:22.800
In its simplest form, it takes a scalar, right, argument number, and it just multiplies by pi, right?
01:19:22.800 --> 01:19:27.600
So pi is a bit of an interesting number, but it it's not a complicated concept, right?
01:19:27.600 --> 01:19:29.439
That is just multiplies by a constant.
01:19:29.439 --> 01:19:34.880
So I would probably put that on white or maybe one level up from white, but definitely not more than that.
01:19:34.880 --> 01:19:38.079
The fact that it's a scalar function that it can do all these stuff, right?
01:19:38.079 --> 01:19:40.560
Uh forget that for the moment.
01:19:40.560 --> 01:19:44.239
And then you can do the domino, monetic domino, right?
01:19:44.239 --> 01:19:53.520
So that's it's not a difficult thing from an APL perspective, as in like it takes a matrix and it returns a matrix, sort of similar to transpose.
01:19:53.520 --> 01:19:56.720
However, it does something that's mathematically difficult.
01:19:56.720 --> 01:20:04.079
So now this by by limiting our scope like this to something quite simple, now we get to actual questions that we need to ask ourselves.
01:20:04.079 --> 01:20:12.000
Do we look at things that are the difficulty of things from an array programming perspective or even from a concept perspective?
01:20:12.000 --> 01:20:14.000
Like N choose K, right?
01:20:14.000 --> 01:20:16.720
It's a scalar function APL that makes it very simple.
01:20:16.720 --> 01:20:22.800
But mathematically, it's sort of a more advanced thing, you don't really learn in in basic school.
01:20:22.800 --> 01:20:25.199
So do you want to grade that as well?
01:20:25.199 --> 01:20:26.560
Is it the APL part?
01:20:26.560 --> 01:20:27.359
Is it everything?
01:20:27.359 --> 01:20:32.239
Those are the questions you want to ask instead of getting into nitty-gritty nuance details, in my opinion.
01:20:32.560 --> 01:20:37.199
I mean, I've used this once in seven years, and I've never used the circle function ever.
01:20:37.520 --> 01:20:39.039
Yeah, but that depends what you're doing.
01:20:39.039 --> 01:20:46.560
If you're doing graphics, like somebody's writing basically a a Minecraft clone in APL, you want to use the circle function, right?
01:20:46.560 --> 01:20:53.119
You want to you have to determine what is the how far are things in in two dimensions or three dimensions from you.
01:20:53.119 --> 01:20:58.880
You need you have an angle and you need to know you need to know how many blocks this way and that way is it?
01:20:58.880 --> 01:21:00.239
How far can you throw in that direction?
01:21:00.239 --> 01:21:01.359
You need the circle function.
01:21:01.359 --> 01:21:16.079
And if you are trying to solve constraints or doing like a nicely ragged adjustment of text on each line in monospace at least or something, then or even not, then you need you need the domino function.
01:21:16.079 --> 01:21:21.920
Yeah, I guess this is there should be it very much depends on your on your domain.
01:21:23.039 --> 01:21:25.199
Well, I guess we're just doing APL now.
01:21:26.000 --> 01:21:32.159
That's that's also what I recommend is that like limiting the scope I think will get you a long way.
01:21:32.159 --> 01:21:38.479
I mean that that depends depends on the other question, right?
01:21:38.479 --> 01:21:40.800
But that's a fairly easily to resolve question.
01:21:40.800 --> 01:21:45.840
Do we take concept non-APL conceptual complexity into the picture or not?
01:21:45.840 --> 01:21:52.720
Like are you only interested in the difficulty of understanding array programming, or are you also interested in the actual concept involved?
01:21:52.720 --> 01:21:59.840
I don't know.
01:21:59.840 --> 01:22:00.640
I don't know.
01:22:00.640 --> 01:22:02.960
That's that's that's that's just a design choice.
01:22:02.960 --> 01:22:12.159
Is this this is this the the beltness of APL ness or is this the belt level of the everything in the in the primitive?
01:22:12.159 --> 01:22:20.479
So if it's just in the in the APL nest, then all scalar functions go down in the simple this on the same level.
01:22:20.479 --> 01:22:26.479
There should be no difference between n choose k and plus or minus, because they're but just scalar functions.
01:22:26.479 --> 01:22:38.399
There should be no difference between LCM and G C D and multiplication, even though there is a huge difference in the actual knowledge and the standing here to to uh to employ them.
01:22:38.720 --> 01:22:41.600
Okay, updated APL dojo with my death skulls.
01:22:41.760 --> 01:22:42.399
It has failed.
01:22:42.399 --> 01:22:43.840
It's not it's not dead.
01:22:43.840 --> 01:22:46.319
You just have there's some choices that need to be made.
01:22:46.319 --> 01:22:52.159
What is it and if you don't write user story first, what is it you want to to who's your target audience?
01:22:52.159 --> 01:22:53.840
What did you want to achieve for that target audience?
01:22:53.840 --> 01:22:55.439
The target audience was me.
01:22:55.439 --> 01:22:57.039
So okay, that's fine.
01:22:57.039 --> 01:22:57.840
That's valid.
01:22:57.840 --> 01:23:03.359
So if your target is you, right, that means you're already very familiar with programming concepts.
01:23:03.359 --> 01:23:07.520
That means that reduce is a pretty easy thing for you to understand, right?
01:23:07.520 --> 01:23:09.119
Or map, right, and each.
01:23:09.119 --> 01:23:18.560
But for somebody who is not familiar with that kind of thing, or if they are not familiar with higher order functions because they only program in C or something, then then that's more complicated.
01:23:18.560 --> 01:23:21.359
But if you're the target audience, that's much easier.
01:23:21.920 --> 01:23:22.720
Yeah, I don't know.
01:23:22.720 --> 01:23:25.680
I think if you convince me though that it just doesn't work.
01:23:25.680 --> 01:23:26.960
No, I don't want you to think.
01:23:31.920 --> 01:23:35.600
So so Loki is is suggesting something completely different.
01:23:35.600 --> 01:23:41.600
That it's more of a course indicator, saying, well, white build means learn this stuff first.
01:23:41.600 --> 01:23:44.159
Basically, you have to decide on a lesson plan.
01:23:44.159 --> 01:23:45.439
And that's something I've done.
01:23:45.439 --> 01:23:47.600
I don't know if you've looked at lately at the APL challenge.
01:23:47.600 --> 01:24:02.960
APL challenge I've tried to make really pedagogical, where we start you start with no knowledge necessary other than basic school mathematics, plus plus minus times, basically, is all I required to know, and the and the alphabet.
01:24:02.960 --> 01:24:05.600
So and then we build up from there.
01:24:05.600 --> 01:24:10.000
In that case, you say, okay, if I'm teaching somebody, and again, there's a question of who's the technologist.
01:24:10.000 --> 01:24:15.279
So obviously it doesn't make sense to say if I'm teaching Connor today APL, because you already know.
01:24:15.279 --> 01:24:20.399
But if I was teaching Connor seven years ago APL, what would be the first things he should learn?
01:24:20.399 --> 01:24:21.920
And they would put that on the white level.
01:24:21.920 --> 01:24:24.399
Then what would I teach him next on the green level?
01:24:24.399 --> 01:24:26.239
What would I teach him next on the blue level?
01:24:26.239 --> 01:24:27.279
That's a whole different thing.
01:24:27.279 --> 01:24:33.119
That's not a question of how difficult they are, but just of a pedagogically worked out lesson plan.
01:24:33.119 --> 01:24:37.680
But that probably corresponds more to the belts of martial arts, right?
01:24:37.680 --> 01:24:42.079
They don't say, oh, if a black belt means you're doing something more complicated.
01:24:42.079 --> 01:24:45.760
That just means more experience, you've learned more.
01:24:45.760 --> 01:24:47.439
It's like complexity.
01:24:47.439 --> 01:24:50.720
This is really the crux of it, I would say.
01:24:50.720 --> 01:24:55.359
Who's the target audience and what are you trying to do for that target audience?
01:24:55.359 --> 01:24:58.880
And then it's not dead, then you then you can do it.
01:24:59.279 --> 01:25:00.079
Yeah, Max.
01:25:00.079 --> 01:25:05.199
I mean, that's the problem, is that everybody there's a billion ways you can look at a thing like this.
01:25:05.199 --> 01:25:13.439
People mentioning teaching basics, Max is mentioning frequency of glyph usage and existing coding problems.
01:25:13.840 --> 01:25:15.760
But that doesn't mean that they're simple.
01:25:15.760 --> 01:25:17.199
That's just that's a different thing.
01:25:17.199 --> 01:25:19.760
Then it's color-coded frequency analysis.
01:25:19.760 --> 01:25:21.520
That's that's something else.
01:25:21.520 --> 01:25:24.319
It's also interesting to know how often primitives are used.
01:25:24.640 --> 01:25:28.560
But I yeah, I don't think Max, I think I'm more in line with what Max is thinking, though.
01:25:28.560 --> 01:25:33.760
It's that like, you know, I have you know, we can what what was the last one we we were trying to add here?
01:25:33.760 --> 01:25:35.279
Is like matrix inversion.
01:25:35.279 --> 01:25:37.039
It's like I said, like I've used this once.
01:25:37.039 --> 01:25:40.560
And yeah, that's my personal experience, but like this rarely comes to the case.
01:25:40.720 --> 01:25:42.000
So that's like build, right?
01:25:42.079 --> 01:25:44.560
You can basically remove it from APL and nobody would cry.
01:25:44.560 --> 01:25:52.560
Nobody would uh if you remove this versus like reduce, like obviously reduce is a bread and butter thing versus matrix inversion.
01:25:52.560 --> 01:25:56.640
And I mean, how many APLs actually have like BQN doesn't have it?
01:25:56.880 --> 01:25:58.239
What matrix inversion?
01:25:58.239 --> 01:26:05.680
Yeah, I don't ever every proper APL will have it because it's it's standard, it's been there since almost day one.
01:26:05.680 --> 01:26:09.119
It was I mean BQN's an APL and it doesn't have it.
01:26:09.119 --> 01:26:11.600
Okay, but that's the question of the definition of APL.
01:26:11.600 --> 01:26:18.319
Anything that I would say has the label APL, has the name APL, will have it essentially, because it's part of the standard.
01:26:18.319 --> 01:26:20.399
There's an APL standard, the ISO standard.
01:26:20.399 --> 01:26:27.199
And if you if you even if you like adhere somewhat to that standard, you'll have it because this is breaking news.
01:26:27.439 --> 01:26:30.079
Adam declares BQN not an APL.
01:26:30.079 --> 01:26:31.920
No, no, I'm not saying that.
01:26:31.920 --> 01:26:33.279
But you just did say that.
01:26:33.359 --> 01:26:37.520
You said every APL that no APL that has the APL label, right?
01:26:37.520 --> 01:26:42.319
BQN doesn't say that that it is just an an APL dialect, right?
01:26:42.319 --> 01:26:46.000
It's an A it's an APL, yeah, it does say it's an APL for a flying saucer.
01:26:46.000 --> 01:26:46.960
What's gonna say?
01:26:46.960 --> 01:26:48.800
Doesn't it say it's like a modern APL?
01:26:48.800 --> 01:26:53.840
Yeah, it's like but it's there's some pretty radical differences too.
01:26:53.840 --> 01:27:01.279
So it's it's an it's another we can do a whole episode on what is an APL, and we've had the question of what is an IVS and Yan language, so on.
01:27:01.279 --> 01:27:14.479
So I tend to go by by something like APL wiki's definition, which which is basically that it's recognizably something like APL 360 superset or something like that.
01:27:14.479 --> 01:27:22.720
At least the basic glyphs are the same as in as in good old APL and and the RAI model and so on.
01:27:22.720 --> 01:27:26.960
As soon as you depart that would make make J not an APL, right?
01:27:26.960 --> 01:27:31.039
Others would argue APJ is an APL, it's just a matter of spelling.
01:27:31.039 --> 01:27:38.560
And of course, if you took APL as is and replaced every glyph with some keyword, then is it still APL?
01:27:38.560 --> 01:27:41.279
Are you according to the APL wiki definition?
01:27:41.279 --> 01:27:42.159
No, it's not an APL.
01:27:42.159 --> 01:27:46.159
Madeleine's saying that APL wiki has an APL dialect category.
01:27:46.159 --> 01:27:46.800
Yeah.
01:27:46.800 --> 01:27:48.720
And DQN is not in that list.
01:27:48.720 --> 01:27:56.000
It has the it does there's a there's some text in in the APL wiki on what is APL.
01:27:56.000 --> 01:27:59.840
It's an interesting question, but it's a whole different question, right?
01:27:59.840 --> 01:28:13.119
So that's why like it's amazing this uh vibe coding, don't get me wrong, you can do beautiful looking things in short time, but you still have to have the human asking themselves, okay, what is what am I actually trying to do here?
01:28:13.119 --> 01:28:15.920
And I'm not shooting this down, I don't mean to kill this.
01:28:15.920 --> 01:28:17.119
I think it's a cool idea.
01:28:17.119 --> 01:28:21.840
This has nothing to do with vibe coding versus humans.
01:28:21.840 --> 01:28:22.720
I mean, uh humans.
01:28:22.720 --> 01:28:32.399
No, no, no, but no, the vibe coding makes it very easy to go from zero to something in no time, but you need to you still need to to take a step back and think, okay, what am what am I actually doing here?
01:28:32.399 --> 01:28:33.840
Is the ABL dojo?
01:28:33.840 --> 01:28:37.920
We're gonna grade the primitives and the expressions and the concepts and the other thing.
01:28:37.920 --> 01:28:40.239
But I really push back on that.
01:28:40.319 --> 01:28:45.199
I think the problem here is that we've just decided to drown in nuance and like at a certain point.
01:28:45.600 --> 01:28:48.399
What kind of nuance are we do you want to get rid of?
01:28:48.399 --> 01:28:52.720
I'm all for removing the nuance, otherwise you can't put things into five categories, right?
01:28:52.720 --> 01:28:55.520
But what kind of nuance are you getting do you want to get rid of?
01:28:55.520 --> 01:28:58.000
Or and what kind of grading or what is weird grading?
01:28:58.000 --> 01:28:59.439
What does it mean, difficulty?
01:28:59.439 --> 01:29:01.199
Is it difficulty again?
01:29:01.199 --> 01:29:03.039
Uh LCM, right?
01:29:03.039 --> 01:29:07.600
And GCD, they are not syntactically difficult.
01:29:07.600 --> 01:29:11.680
From an APL perspective, they are just uh scalar functions.
01:29:11.680 --> 01:29:19.760
They're even simple in the sense that for for most APLs that they only exist in daddy form, so there's not even the monadic daddy duality there.
01:29:19.760 --> 01:29:21.039
Very simple functions.
01:29:21.039 --> 01:29:25.920
Do you actually understand L LCM and G C D like mathematically?
01:29:25.920 --> 01:29:31.199
It requires a whole lot of number theory and prime numbers and stuff like that.
01:29:31.199 --> 01:29:33.760
So does that make the primitives more complicated?
01:29:33.760 --> 01:29:39.119
From an APL perspective, and how I usually teach APL is they're not complicated.
01:29:39.119 --> 01:29:50.880
Because what I will do is I'll teach people some representative functions for very and for operators and so on from the various categories, syntactic categories, and then I tell them, okay, now you basically know all of APL.
01:29:50.880 --> 01:29:52.479
You just need to expand your vocabulary.
01:29:52.479 --> 01:29:53.840
It's like learning a new language.
01:29:53.840 --> 01:30:00.960
So learning the pronunciation and learning the the writing system and learning the grammar and so on, those are those are hard things.
01:30:00.960 --> 01:30:04.960
But learning another word, even if it's a long, complicated word, that's fairly simple.
01:30:04.960 --> 01:30:12.800
Even if the word stands for something that's incredibly difficult to understand, acquiring that one more word in the language isn't really hard.
01:30:12.800 --> 01:30:16.720
Just understanding the concept is hard, but syntactically you can use it.
01:30:16.720 --> 01:30:20.640
So you can use quantum physics correctly in a sentence.
01:30:20.640 --> 01:30:23.680
But do you actually understand quantum physics?
01:30:23.680 --> 01:30:31.680
So if you were to grade English compound nouns in a list of dip by difficulty, why where do you grade quantum physics?
01:30:31.680 --> 01:30:39.840
It's not a it's not hard to spell, it's not no complicated pronunciations or anything, it's a fairly simple phrase of two words.
01:30:39.840 --> 01:30:42.880
But understanding what it stands for is much harder.
01:30:42.880 --> 01:30:43.840
Same thing here.
01:30:43.840 --> 01:30:44.960
The and symbol.
01:30:44.960 --> 01:30:47.520
Syntactically, it's straightforward.
01:30:47.520 --> 01:30:49.039
The symbol is not hard.
01:30:49.039 --> 01:30:52.079
And the how it behaves with data, very simple.
01:30:52.079 --> 01:30:54.399
What it does, that's complicated.
01:30:54.399 --> 01:30:56.000
What is it that we're grading here?
01:30:56.000 --> 01:30:56.640
That's all I'm asking.
01:30:56.640 --> 01:30:58.239
I'm just trying to shoot this down.
01:30:58.239 --> 01:31:01.920
We have some fun stuff going on in the chat here.
01:31:03.920 --> 01:31:11.279
Yeah, I mean, I agree with Madeline earlier in the chat when she said that teaching is all about nuance.
01:31:11.279 --> 01:31:13.039
I mean, I completely agree.
01:31:13.039 --> 01:31:21.359
There's a reason why I'm trying to build the whatever bells and whistles in the panel, and the same thing with the comparison mode and array box.
01:31:21.359 --> 01:31:32.960
But like it's like when I was talking with Ben Dean on ADSP about how you know teaching is just a series of lying to you less, you know, you omit stuff.
01:31:32.960 --> 01:31:38.640
Because right now, like, you know, and that's the thing is you're saying, what are we trying to do here?
01:31:38.640 --> 01:31:41.680
I have a very clear understanding of what I want to do.
01:31:41.680 --> 01:31:46.399
It's that other people have different ideas of is this a pedagogical teaching tool?
01:31:46.399 --> 01:31:47.760
Is this for beginners?
01:31:47.760 --> 01:31:49.680
Is this for someone that knows whatever?
01:31:49.840 --> 01:31:52.000
But like I don't disagree with you, Connor.
01:31:52.000 --> 01:31:54.560
I'm just trying to pull the information out of you.
01:31:54.560 --> 01:31:56.319
What is that thing you have in your head?
01:31:56.319 --> 01:31:58.079
Because it's not clear to me what you're trying to achieve.
01:31:58.079 --> 01:31:58.800
I asked you before.
01:31:58.960 --> 01:31:59.680
And it was very clear.
01:32:00.079 --> 01:32:00.960
You said it multiple times.
01:32:01.119 --> 01:32:07.119
It's that I want this to be a thing where people can look at and say, I'm roughly at this level.
01:32:07.119 --> 01:32:11.840
Here are some concepts that are like currently I have not like learned or put in my tool belt.
01:32:11.840 --> 01:32:17.279
Because in general, like my experience in learning the array languages is that some things are just obvious.
01:32:17.279 --> 01:32:21.039
And yes, that is informed by your experience and what are the programming languages you've learned.
01:32:21.039 --> 01:32:22.479
It's going to be different for every single person.
01:32:22.479 --> 01:32:23.439
I understand all that.
01:32:23.439 --> 01:32:29.279
I'm not trying to ignore that someone learned Python or someone doesn't know any programming or someone is good at math or isn't good at math.
01:32:29.279 --> 01:32:31.039
Everybody's experience is different.
01:32:31.039 --> 01:32:35.279
But in general, you pick up certain primitives, certain tools, certain concepts.
01:32:35.279 --> 01:32:38.000
Like I said, for me, I learned two, comma slash.
01:32:38.000 --> 01:32:39.760
I didn't realize that could generalize.
01:32:39.760 --> 01:32:48.960
And like having like N-wise reduction as a thing that like you could look at in a tool, and like there's a ton of these, and they are they exist in different array languages.
01:32:48.960 --> 01:32:57.039
But it seems like, you know, when we have this discussion, it's very quickly just like, oh, well, if you talk about IOTA, we got to talk about you know the 17 different flavors of IOTA.
01:32:57.039 --> 01:33:04.640
There's rank zero, there's rank one, it's different between jades, and it's just like, okay, well, then the tool can't exist because there's just too much nuance.
01:33:04.640 --> 01:33:23.199
And like, yes, we can drown in nuance, but like in general, depending on the tasks that you're doing, and that's the thing, is I have to say, depending on the task, because the tasks that I'm doing are different than the tasks that the graphics programming are doing, like, there in general are a set of primitives and techniques that you reach for on average more than others.
01:33:23.199 --> 01:33:32.239
And like the goal is to try and like put those on a kind of star map or a tier list that can expose them to people sooner rather than later.
01:33:32.239 --> 01:33:43.279
The fact that, you know, prefixes is available in Wiwa in the tuples primitive, like if you have a prefix concept and then you can, you know, hover over it and it shows that you know it's spellable a certain different ways.
01:33:43.279 --> 01:33:50.479
Anyways, it like, but I I I just feels like this kind of thing and it honestly it makes if yeah, I don't know.
01:33:50.479 --> 01:33:59.520
If this is the way that the conversation happens when you try to build a tool like this, that you have to either evaporate all nuance and just get a linear list of primitives, or it's too complicated.
01:33:59.520 --> 01:34:12.880
Like it's it's unsurprising that so many people bounce off of these languages because it's just like there is an easy path where you like over time learn things and you pick up a new thing, but it's just it feels like in trying to do this, it's just like, oh well.
01:34:13.359 --> 01:34:16.079
I think I I think that's there isn't one path.
01:34:16.079 --> 01:34:24.640
I think there are many paths, and then it's more like what Loka was saying, like, okay, so this is a course material, but then you have to choose your way, your path in.
01:34:24.640 --> 01:34:27.039
And I think that depends a lot on the person.
01:34:27.039 --> 01:34:31.039
It doesn't happen so much anymore, maybe because I'm not around so much.
01:34:31.039 --> 01:34:37.760
But usually when I see a new face, new avatar in the APL orchard, then I ask them, hey, interest in APL.
01:34:37.760 --> 01:34:46.159
And then sometimes it's somebody that doesn't know about APL, only heard about it, something, and sometimes I offer them like an intro course or even a full course in APL in the chat.
01:34:46.159 --> 01:35:06.159
And I usually my my the first thing I do is I I ask them if politely if they will tell a little bit about themselves because their background, whether they have programming background and which language is their programming language uh experience with, if any, their their knowledge and interest makes a huge difference to how I would approach them.
01:35:06.159 --> 01:35:13.279
So somebody who is like a mathematician and all and and into like theoretical things, so I have a very different approach to somebody who is a programmer.
01:35:13.279 --> 01:35:21.520
If somebody is a child that doesn't know a little whole lot of mathematics, then they'll try to avoid the mathematical things and and so on.
01:35:21.520 --> 01:35:32.399
So I it I think it depends a lot on the audience, and it's fair enough to say, okay, we imagine Connor, or maybe imagine Connor seven years ago, what would have been the best thing for you?
01:35:32.399 --> 01:35:40.560
And that's fine, just like Stefan Kruger wrote his book saying that this is the book that he wished would have been there for himself when he started learning.
01:35:40.560 --> 01:35:44.000
And there will be other people who are in a similar position to him, and it'll be useful for them.
01:35:44.000 --> 01:35:59.199
And I don't think it's a bad thing to have the Connor's APL dojo, and and for people who are sort of similar to where you were seven years ago, they would come in and see, okay, she learned these things and these things, and then it becomes sort of a course, and you get the belt, and when she's up to the black belt, and you can do a whole bunch of stuff.
01:35:59.199 --> 01:36:00.159
I think that's fine.
01:36:00.159 --> 01:36:01.439
I don't have a problem with that.
01:36:01.439 --> 01:36:10.239
As long as it's clear what we're trying to grade to grade, and then we can say, okay, Connor seven years ago, the war you're familiar with matrix inverses, right?
01:36:10.239 --> 01:36:11.920
No, yes, was it complicated?
01:36:11.920 --> 01:36:12.800
Could you pick it up?
01:36:12.800 --> 01:36:14.479
And then we grade it according to that.
01:36:14.479 --> 01:36:17.520
If you want to include all the concepts that APL includes.
01:36:17.520 --> 01:36:33.840
Because APL, as opposed to many programming languages, comes with a lot of it's not really the batteries includes included, but it's got a lot of, especially J has, and a lot of like mathematical things that that are included in the core language that you don't usually see including.
01:36:33.840 --> 01:36:42.560
There are no other real-world production series languages that have matrix inversion as a single glyph.
01:36:42.560 --> 01:36:44.000
That doesn't exist.
01:36:44.000 --> 01:36:47.520
There are those that have inner product as a as a single glyph.
01:36:47.520 --> 01:36:50.800
Yeah, so but that I think that's fine.
01:36:50.800 --> 01:36:52.479
I think it's perfectly valid to do this.
01:36:52.479 --> 01:36:53.600
Don't get me wrong.
01:36:53.600 --> 01:36:56.319
And if this is clear, yeah, let's go for it.
01:36:56.319 --> 01:37:00.399
But then the answer to every question as to how complex this is is asking you.
01:37:00.399 --> 01:37:04.000
Think about seven years ago, how difficult do you think this would have been for you?
01:37:04.000 --> 01:37:06.479
And think about this, how difficult would that be for you?
01:37:06.479 --> 01:37:11.760
And then you can put in the various concepts, you can leave out some things, you know, oh yeah, inwise reduced, two wise reduced.
01:37:11.760 --> 01:37:15.279
Yeah.
01:37:15.279 --> 01:37:18.319
Have you I never really got an answer to that.
01:37:18.319 --> 01:37:20.960
Have you looked at uh at the APL challenge lately?
01:37:20.960 --> 01:37:22.319
Yeah, I always do it.
01:37:22.319 --> 01:37:22.880
Okay.
01:37:22.880 --> 01:37:38.560
So so you there you have uh again, I don't have a talking audience uh that's a specific person, but I have in mind like kids, maybe like early teens or something like that, and trying to phrase it in such a way and build up level by level.
01:37:38.560 --> 01:37:41.279
And so there I don't teach all of APL, obviously.
01:37:41.279 --> 01:37:53.920
I teach so it's just some basics, and I try to make the tenth problem out of the 10 be a problem that is at least moderately interesting to do, where you do something that sort of looks nice or has a nice idea, concept.
01:37:53.920 --> 01:38:00.319
So for example, the the current one we build up to to determining whether a a square is a magic square.
01:38:00.319 --> 01:38:02.159
Sort of a cute thing to do.
01:38:02.159 --> 01:38:07.520
So you just learn learn just enough to be able to do that, but we get to dyadic transpose.
01:38:07.520 --> 01:38:15.760
Okay, so this is a from nothing course, a 10-step course that where where we end with dyadic transpose.
01:38:15.760 --> 01:38:16.800
So what happened?
01:38:16.800 --> 01:38:17.920
That black belt?
01:38:17.920 --> 01:38:18.239
No.
01:38:18.239 --> 01:38:21.680
You know by the end of this course, you know a fraction of APL.
01:38:21.680 --> 01:38:22.640
Tiny fraction.
01:38:22.640 --> 01:38:25.840
But you do know something about dyadic transpose, at least for a matrix.
01:38:26.640 --> 01:38:31.279
Yeah, I mean there's a a bunch of different paths, tools, and stuff.
01:38:31.680 --> 01:38:32.079
Yeah.
01:38:32.079 --> 01:38:45.439
I think they're all valid, and unless we can make some really clever AI that somebody is suggesting in the chat here as well, that can adapt to people automatically, maybe analyzing all the times that I've taught people APL in chat.
01:38:45.439 --> 01:38:54.239
I don't think it will actually work, but maybe because the problem is the AIs don't actually understand APL or any other programming language, so I'll venture to say.
01:38:54.560 --> 01:38:56.159
That's actually not true anymore.
01:38:56.159 --> 01:39:05.039
I mean, it successfully wrote profiling for every single one of the six languages that I wrote that I that I have on these sites.
01:39:05.199 --> 01:39:12.000
Like it knows quad underscore measure is tiny APLs thing, it knows the system timed thing from BQN.
01:39:12.239 --> 01:39:15.439
It's not it doesn't okay.
01:39:15.439 --> 01:39:16.640
Anyway, that's another discussion.
01:39:16.640 --> 01:39:22.319
There are lots of videos on YouTube, people discussing whether AI systems, LMS and so on, know anything, understand anything.
01:39:22.319 --> 01:39:24.640
That's not we don't have to take that discussion here.
01:39:24.640 --> 01:39:28.960
I doubt that it can be done well, but hey, maybe, maybe one day.
01:39:28.960 --> 01:39:31.279
So yeah, we can do this.
01:39:31.279 --> 01:39:32.800
Let's get let's get going.
01:39:32.800 --> 01:39:33.439
Let's start.
01:39:33.439 --> 01:39:37.039
We're 20 minutes past the hour and a half mark.
01:39:37.039 --> 01:39:39.920
That means we're almost okay, okay.
01:39:39.920 --> 01:39:42.960
Almost at the two-hour mark, then is how it's put it.
01:39:42.960 --> 01:39:46.159
Yeah, but I think this is potentially useful, right?
01:39:46.159 --> 01:39:49.760
We hashed out some of the issues that are involved in making something like this.
01:39:49.760 --> 01:39:56.319
We've narrowed down the scope of what is you're trying to do with it and and the and the goals and what we're not trying to do, right?
01:39:56.319 --> 01:39:58.399
You can't be comprehensive, we can't do everything.
01:39:58.399 --> 01:40:02.720
Yeah, I think it would be useful to not.
01:40:02.720 --> 01:40:11.119
I mean, I I know you like the color, but I think that itself is a barrier to have all this colour-coded and information.
01:40:11.119 --> 01:40:21.199
If I come to this as a complete new B, it's hard for me to put myself into the shoes of somebody completely new to APL, but I do tend to do it a lot because I teach people, right?
01:40:21.199 --> 01:40:23.119
This would be very overwhelming.
01:40:23.119 --> 01:40:27.039
Even what I'm seeing just here is already like, whoa, what are all these things?
01:40:27.039 --> 01:40:33.680
I think just some some much more neutral things that even with just the name that I can read, because I don't even know how to pronounce any of this.
01:40:33.680 --> 01:40:37.840
I can't refer to the to the right tech, because I don't know how to say right tech.
01:40:38.399 --> 01:40:44.640
So, so I think But like well, like I said, this is not designed for begin it's designed for me, you know?
01:40:44.800 --> 01:40:45.760
Yeah, yeah, I understand.
01:40:45.760 --> 01:40:47.439
So that's that that's the thing.
01:40:47.439 --> 01:40:50.000
But even for you, you didn't know all the glyphs either.
01:40:50.000 --> 01:40:51.920
Even though you had now I've heard you in the various parts of the city.
01:40:52.720 --> 01:40:54.640
You keep referring to the seven-year version of me.
01:40:54.640 --> 01:40:57.279
Like it's not designed for seven-year version of me.
01:40:57.279 --> 01:41:00.319
It hopefully is useful to that, but it's designed for me, like me now.
01:41:00.319 --> 01:41:02.880
The guy now, but you okay.
01:41:03.039 --> 01:41:06.399
Like, but but right now you're pretty high up in your belts, right?
01:41:06.399 --> 01:41:08.159
No, I think I'm blue.
01:41:08.319 --> 01:41:09.039
I think I'm blue.
01:41:09.119 --> 01:41:09.760
Yeah, that's it.
01:41:09.920 --> 01:41:18.880
I'm like, there's a bunch of stuff up here that I don't know, and the goal was to kind of fill this stuff out, and it's like, what is okay useful for someone here or someone here?
01:41:18.880 --> 01:41:23.840
Like, yes, I didn't know NWE reductions at one point, and so I was green at one point, and I was white.
01:41:23.840 --> 01:41:34.720
It's supposed to be useful for a bunch of people, but like honestly, selfishly, the same reason that I I built a Ray Box, if we can iterate over here, the reason I bought this built this was for me.
01:41:34.720 --> 01:41:37.199
Yes, other people can find it useful, hopefully.
01:41:37.199 --> 01:41:46.800
But like I wanted a nicer tiny Apple cap REPL, and like the main thing is when I make YouTube videos and things and I'm switch, I'm always switching, and it's such a pain.
01:41:46.800 --> 01:41:48.960
And like the docs are all over the place.
01:41:48.960 --> 01:41:52.880
Like for some languages, they you know, it's easy accessible, other ones.
01:41:52.880 --> 01:41:55.439
So I've always got like 20 different tabs open.
01:41:55.439 --> 01:42:00.079
I've got four different repls, and I I can't remember all the ways to type the glyphs.
01:42:00.079 --> 01:42:03.439
And so now I have a super easy way that I can you know flip through these.
01:42:03.439 --> 01:42:05.840
It's got a certain amount of like primitive translation.
01:42:05.840 --> 01:42:08.000
If I forget something, I can look at the keyboard.
01:42:08.000 --> 01:42:10.399
If I know the name, I can just like control space.
01:42:10.399 --> 01:42:12.159
Like it's a tool I built for myself.
01:42:12.159 --> 01:42:14.479
A ton of people would probably argue it's hard to use.
01:42:14.479 --> 01:42:15.199
Where's the help?
01:42:15.199 --> 01:42:15.760
You know what?
01:42:15.760 --> 01:42:20.720
If you hit F5 for 10 seconds, it shows you how to get the keyboard, how to get the help.
01:42:20.720 --> 01:42:21.359
You know what?
01:42:21.359 --> 01:42:27.359
It's not designed for like a hundred percent of everyone that hits this is gonna get it find it the most useful.
01:42:27.359 --> 01:42:33.039
It's for me, and I want it to be beautiful, and like it, it's it's also like primarily keyboard driven.
01:42:33.039 --> 01:42:34.640
It's not designed to be used with the most.
01:42:34.640 --> 01:42:37.119
If you if you bring the keyboard up, you can't really click.
01:42:37.119 --> 01:42:39.680
And I think that was a thing that like you asked for at one point.
01:42:39.680 --> 01:42:43.760
I designed this for me, and hopefully other people find it useful, and it's open for PRs.
01:42:43.760 --> 01:42:46.479
Like, there was someone who, you know, they contributed.
01:42:46.479 --> 01:42:51.520
I think it's I know I know it's been merged, but I think it'll work if we do this.
01:42:51.520 --> 01:42:54.000
If you hover over this, you know, someone contributed this.
01:42:54.000 --> 01:42:56.479
They were just like, oh, you know, this is kind of like BQN.
01:42:56.479 --> 01:43:00.960
I'm happy to accept contributions as long as it doesn't like ruin my design.
01:43:00.960 --> 01:43:07.760
But the point being is this is a thing that I'm designing for myself and then putting out into the world that hopefully other people will find useful.
01:43:07.760 --> 01:43:12.399
But if no one else finds it useful, it's still a win for me because this is how I primarily use stuff.
01:43:12.399 --> 01:43:14.640
That's the same goal for APL Dojo.
01:43:14.640 --> 01:43:19.359
I'm not thinking about the beginner, I'm not thinking about you know a hundred other flavors.
01:43:19.680 --> 01:43:23.760
I'm not actually We're sort of I don't know if we're running out of time.
01:43:23.760 --> 01:43:27.359
I've got time, but it's but at some point we want to draw a line.
01:43:27.359 --> 01:43:27.760
Yeah, yeah.
01:43:27.760 --> 01:43:38.720
Let me throw out just as an ex some examples, because because if this is really for Connor, to know like if you want to get better at these languages, what are you likely missing?
01:43:38.720 --> 01:43:38.960
Right?
01:43:38.960 --> 01:43:59.840
You've been going on APL for seven years, which means you have picked up some advanced stuff and some things you've probably completely neglected, often because the type of things you do, if you excuse the phrase, toy problems, you don't touch so much on certain more everyday business type things, or maybe you don't do so much advanced math, so you don't touch on those things.
01:43:59.840 --> 01:44:03.600
So it's sort of hard for me to know, of course, which things you have not you have not seen.
01:44:03.600 --> 01:44:07.600
But let me throw some things out at you that you might not have done.
01:44:08.000 --> 01:44:26.319
I mean, that was supposed to be the goal of the APL Tojo is that like you don't know what you don't know, and then every once exactly you run into like an N-Wise reduction, and you're like, it is for a lot of people, or at least it was for me, when I discovered the NWISE reduction, it was the first time I encountered like windowing algorithms in any programming language, and it blew my mind.
01:44:26.319 --> 01:44:30.800
Same thing with outer product, like outer product, first time I encountered it was in APL.
01:44:30.800 --> 01:44:42.319
Yes, Haskell has an outer product function in some library, but like a ton of the algorithm like ideas and techniques I discovered in APL, that is essentially what it's for.
01:44:42.319 --> 01:44:45.279
It's not for exhaustively listing out the primitives.
01:44:45.279 --> 01:44:50.239
Like the reason that IOTA's here is because it's like, I don't know, a bread and butter amazing.
01:44:50.239 --> 01:45:04.079
Like again, ideally, this is fleshed out with like the most coolest, you know, like unkeep from Weewa, which is like run length and code and a bunch of those things that like people can at a glance hover their thing and be like, oh, that's cool.
01:45:04.079 --> 01:45:10.399
And also for me, you know, I'd like to be a black belt, but you know, uh this is supposed to be like a hack.
01:45:10.399 --> 01:45:17.199
And it would work better if we had the full panel of you know a bunch of different people from languages contributing the best techniques.
01:45:17.199 --> 01:45:20.079
But anyways, go ahead and throw out I can probably go for like 10 more.
01:45:21.359 --> 01:45:25.680
Okay, I'll throw a couple of a couple of things at you just think off my head.
01:45:25.680 --> 01:45:30.159
Sometimes you want to normalize an array so that it's not a scalar.
01:45:30.159 --> 01:45:32.960
Are you familiar with one slash in APL?
01:45:33.279 --> 01:45:34.239
One slash?
01:45:34.239 --> 01:45:38.720
No, but also too, I was kind of catching up on the chat, so I missed the first little something with a scalar.
01:45:38.960 --> 01:45:41.920
Okay, so yeah, so sometimes you have you you want to normalize.
01:45:41.920 --> 01:45:43.920
You want if it's a high rank array, keep it the way it is.
01:45:43.920 --> 01:45:45.279
If it's a vector, keep it the way it is.
01:45:45.279 --> 01:45:47.279
If it's a scalar, you want to ravel it.
01:45:47.279 --> 01:45:50.640
You want to make it a one-element vector, so you have an axis to work on, right?
01:45:50.640 --> 01:45:55.119
So, how do you normalize an array to always be at least rank one?
01:45:55.119 --> 01:45:58.159
You can do that in the APL with one slash.
01:45:58.159 --> 01:45:59.439
That's a cool technique.
01:45:59.439 --> 01:46:00.800
You might not have realized.
01:46:00.800 --> 01:46:03.600
It's just a just an example of I definitely didn't know this.
01:46:03.600 --> 01:46:07.760
So okay, so this doesn't it's a no-up for every array except a scalar.
01:46:07.760 --> 01:46:09.920
For a scalar, it does a revel on it.
01:46:09.920 --> 01:46:11.920
So it's like revel if scalar.
01:46:11.920 --> 01:46:12.880
Yeah, okay.
01:46:12.880 --> 01:46:15.199
So we need to so what is this?
01:46:15.199 --> 01:46:17.279
It's a monadic function expression.
01:46:17.279 --> 01:46:19.279
It's it's not a function at all.
01:46:19.279 --> 01:46:20.720
It's a snippet.
01:46:20.720 --> 01:46:25.359
You can you could wrap it to become a function, but it's yeah, it's because expression, yeah.
01:46:25.359 --> 01:46:27.279
I mean it's a manadic.
01:46:27.279 --> 01:46:29.680
Oh, then that's there's a there's a bug here in the dojo.
01:46:29.680 --> 01:46:32.960
But it only primitives can be have that subtype, right?
01:46:32.960 --> 01:46:34.960
Expressions and concepts don't have subtypes.
01:46:35.199 --> 01:46:38.800
No, I added this so that it would you you were the one that pointed this out when I sent you.
01:46:38.800 --> 01:46:41.680
It's that like, oh, these have derived erity, right?
01:46:41.680 --> 01:46:42.560
This is a manadic function.
01:46:42.720 --> 01:46:44.159
Yeah, but this one does this one doesn't.
01:46:44.159 --> 01:46:45.840
It's not a monadic function at all.
01:46:45.840 --> 01:46:46.800
It's just a snippet.
01:46:46.800 --> 01:46:50.399
It doesn't have you can't assign in the in dialogue APL, you cannot assign this a name.
01:46:50.399 --> 01:46:53.199
It's not a valid syntactic construct, it's just a snippet.
01:46:53.199 --> 01:46:55.279
It's a technique if you want, or an expression.
01:46:55.279 --> 01:46:56.399
It doesn't have a value.
01:46:56.399 --> 01:46:58.880
If you enter this into the REPL, it will error.
01:46:58.880 --> 01:47:01.920
But you're applying this monadically, correct?
01:47:01.920 --> 01:47:02.560
No.
01:47:02.560 --> 01:47:03.199
Yeah.
01:47:03.199 --> 01:47:08.720
The point is specifically replicate with a scalar one as left argument, right?
01:47:08.720 --> 01:47:14.239
So the way I write it in Apple card, I would write one jot slash, but you don't actually want to ever write the jot.
01:47:14.880 --> 01:47:16.079
So but I'm I'm confused though.
01:47:16.079 --> 01:47:17.439
But we did not just apply this.
01:47:17.840 --> 01:47:18.960
It's a technique, right?
01:47:18.960 --> 01:47:20.960
No, this is dyadic slash.
01:47:20.960 --> 01:47:24.640
One slash is not a thing, it's dyadic slash slash is a function.
01:47:24.640 --> 01:47:28.399
It's applied with one as left argument and IOTA six as right argument.
01:47:28.399 --> 01:47:32.239
But it's a technique, it's a it's a tool in your toolbox to write.
01:47:32.239 --> 01:47:36.399
Oh, I need to normalize this so it's always has at least one axis, one slash.
01:47:36.720 --> 01:47:37.600
I mean, this is what I mean.
01:47:37.600 --> 01:47:39.279
This is what I mean by drowning in nuance.
01:47:39.279 --> 01:47:43.199
So like the point that you're making, your point that you're making is that like this is a valid expression.
01:47:44.079 --> 01:47:44.640
Yeah, sure.
01:47:44.640 --> 01:47:46.079
This is a valid function, right?
01:47:46.079 --> 01:47:48.079
A divided function, one jot slash.
01:47:48.079 --> 01:47:48.800
But that doesn't matter.
01:47:48.800 --> 01:47:53.680
I wasn't even trying to argue with the with the denimization in in in the APL Georgia.
01:47:53.680 --> 01:47:57.279
I was actually trying to give you a useful tool in your toolbox that you might not have known about.
01:47:57.279 --> 01:48:00.640
It doesn't matter how you ever you categorize it, it's up to you.
01:48:00.640 --> 01:48:09.600
In uh tiny APL and in some other in K and so on, it would it would be considered a monadic function, the monadic derived function, I guess.
01:48:09.600 --> 01:48:11.680
That doesn't categorize it as you want.
01:48:11.680 --> 01:48:12.000
Okay.
01:48:12.000 --> 01:48:14.960
It's a useful thing.
01:48:14.960 --> 01:48:19.119
Are you sometimes you yeah, sure, put it like that.
01:48:19.119 --> 01:48:21.600
That's but that's not yeah, okay.
01:48:21.600 --> 01:48:23.199
It just doesn't describe what it does.
01:48:23.199 --> 01:48:25.680
It's just a symbol, but yeah, that's fine.
01:48:25.680 --> 01:48:28.159
Yeah, you have to grade it.
01:48:28.159 --> 01:48:30.800
Okay.
01:48:30.800 --> 01:48:31.439
Good.
01:48:31.439 --> 01:48:38.000
Are you familiar with how to count if you have a Boolean vector to count the number of trailing ones?
01:48:38.000 --> 01:48:40.880
Like the tail end, how many ones are there at the tail?
01:48:40.880 --> 01:48:41.920
You ever seen that?
01:48:41.920 --> 01:48:44.720
I've seen you do it once, like I could solve it.
01:48:44.720 --> 01:48:48.880
Yeah, up up tech commute up self if you want.
01:48:48.880 --> 01:48:51.680
Oh yeah, this one.
01:48:51.680 --> 01:48:56.000
Yeah, and then you like one zero, yeah, whatever, it doesn't matter.
01:48:56.000 --> 01:48:57.520
Yeah, so this gives four.
01:48:57.520 --> 01:48:59.680
This is a nice tool in your toolbox.
01:48:59.680 --> 01:49:01.119
It doesn't have a name as such.
01:49:01.119 --> 01:49:02.880
And special maybe.
01:49:02.880 --> 01:49:12.720
And you you're you're you're aware of dadic transpose with all one all the index origin left argument, right?
01:49:12.720 --> 01:49:14.239
Gives you the diagonal.
01:49:14.239 --> 01:49:16.079
It's completely nothing to do with this one.
01:49:16.079 --> 01:49:21.359
I'm just giving another another one that's like something that that to put in your a tool in your belt.
01:49:21.359 --> 01:49:23.359
So sorry, I'm just going too fast.
01:49:23.359 --> 01:49:25.760
So this is a monetic function.
01:49:25.760 --> 01:49:28.720
It's not a primitive, but it is monetic function.
01:49:28.880 --> 01:49:29.119
Yeah.
01:49:30.399 --> 01:49:34.640
So so for for a matrix especially, one one jot transpose.
01:49:34.640 --> 01:49:36.399
This one you're familiar with?
01:49:36.399 --> 01:49:38.800
You should be if you've done the APL challenge.
01:49:38.800 --> 01:49:45.920
So it on a so one one jot transpose on you don't actually need the jot normally, but if you want to make it a function, then yes.
01:49:45.920 --> 01:49:48.800
On a m on a matrix, it gives you the diagonal.
01:49:48.800 --> 01:49:51.199
Yeah, I definitely didn't know that.
01:49:51.199 --> 01:49:52.000
Okay.
01:49:52.000 --> 01:49:55.199
You didn't know that's nice, that's the diagonal of a matrix.
01:49:55.199 --> 01:49:56.319
That's how you do it.
01:49:56.319 --> 01:50:01.600
Okay, here's another one.
01:50:01.600 --> 01:50:09.600
If you got a positive number, you want to split it into the integral part and the fractional part, you can write one zero jot encode.
01:50:09.600 --> 01:50:10.960
You ever seen that?
01:50:11.359 --> 01:50:13.039
One zero jot.
01:50:14.079 --> 01:50:17.760
You don't actually again you don't need the jot, but yeah, just to make it a function.
01:50:17.760 --> 01:50:21.840
Yeah, so you write one two three one two three point four five six.
01:50:21.840 --> 01:50:23.680
You split it.
01:50:23.680 --> 01:50:24.880
Sorry, this was wrong.
01:50:24.880 --> 01:50:25.840
Did I say it wrong?
01:50:25.840 --> 01:50:26.640
Zero zero one.
01:50:26.640 --> 01:50:27.279
I'm sorry.
01:50:27.279 --> 01:50:28.960
Zero one in yeah.
01:50:28.960 --> 01:50:32.079
So it splits it into the integer part and the fractional part.
01:50:32.079 --> 01:50:33.760
That's sort of a nice thing to do.
01:50:34.079 --> 01:50:38.479
Is this just like a custom it it's not special, right?
01:50:38.560 --> 01:50:43.359
It follows from the definition of encode, but it's a technique, it's a tool to have any tool belt.
01:50:43.359 --> 01:50:47.439
Like if you know this one, you're like, oh, I need to split this number into the whole part and the fractional part.
01:50:47.439 --> 01:50:48.720
Yeah, that's that's how you do it.
01:50:48.720 --> 01:50:55.760
Otherwise, you start with like, oh, the floor coordinated with, and then you know it's like the original number minus the floor.
01:50:55.760 --> 01:50:58.800
Yeah, but this is much easier to do it.
01:50:58.800 --> 01:51:01.039
And here's another one.
01:51:01.039 --> 01:51:07.439
Let's say you have a matrix and you want to rotate it 180 degrees, not flip it upside down.
01:51:07.439 --> 01:51:10.239
That's just a first axis reverse.
01:51:10.239 --> 01:51:11.760
You want to actually rotate it.
01:51:11.760 --> 01:51:16.000
So that's that's you do a rotate first, rotate last.
01:51:16.640 --> 01:51:18.960
Yeah, I think that one I've seen.
01:51:18.960 --> 01:51:20.960
But that one just kind of makes sense, right?
01:51:21.199 --> 01:51:21.760
Yeah, sure.
01:51:21.760 --> 01:51:24.960
But what about rotating 90 degrees left and right?
01:51:24.960 --> 01:51:28.479
Yeah, so this doesn't rotate, right?
01:51:28.479 --> 01:51:29.920
Up sorry, upside down.
01:51:29.920 --> 01:51:43.920
But if you want to rotate 90 degrees, you've got, for example, last axis reverse, transpose, that rotates clockwise, and clockwise and transpose, last axis reversed rotates counterclockwise.
01:51:43.920 --> 01:51:47.920
You could also spell them with in the opposite order with first axis reverse, that doesn't matter.
01:51:47.920 --> 01:51:49.920
But that's so the two different spellings of each one.
01:51:49.920 --> 01:51:54.640
So now you've got all the rotations of a matrix 90, 180, 270.
01:51:55.600 --> 01:51:58.319
Yeah, that was covered in a challenge, wasn't it?
01:51:58.640 --> 01:51:59.039
Maybe.
01:51:59.039 --> 01:52:01.359
Yeah, that kind of thing, right?
01:52:01.359 --> 01:52:03.039
So you've got all the rotations.
01:52:03.039 --> 01:52:06.479
So those are those are things I would say, those are good techniques to know.
01:52:06.800 --> 01:52:09.039
Yeah, how do we classify those though?
01:52:09.439 --> 01:52:12.399
I mean, they you get they are just they're just two trains, right?
01:52:12.399 --> 01:52:14.000
So you could just take them and put them in.
01:52:14.000 --> 01:52:16.800
Exactly.
01:52:16.800 --> 01:52:19.119
So that's that's so so there's rotations, right?
01:52:19.119 --> 01:52:20.800
The rotations of a matrix.
01:52:20.800 --> 01:52:22.880
Rotations and and yeah.
01:52:22.880 --> 01:52:24.319
Call it a concept.
01:52:24.319 --> 01:52:26.720
Yeah, matrix rotations, sure.
01:52:26.720 --> 01:52:31.039
Another thing, here's another different thing that like is good to know.
01:52:31.039 --> 01:52:33.920
Like basically all the entries in the in Apple card you could take.
01:52:33.920 --> 01:52:36.000
Like, what about an identity matrix?
01:52:36.000 --> 01:52:39.520
What's the best or fast way or whatever to make an identity matrix?
01:52:39.520 --> 01:52:41.520
That's a thing that's you should learn.
01:52:41.520 --> 01:52:44.239
So you don't sit there and try to piece it together.
01:52:44.720 --> 01:52:48.239
Yeah, I guess that would be depends on where outer product would go.
01:52:48.479 --> 01:52:49.760
And where the combination is.
01:52:49.760 --> 01:53:01.520
But that's not a good way to make it really, it's not a good way to make a an identity matrix because it using an outer product selfie of an IOTA range, right, makes a giant number, right?
01:53:01.520 --> 01:53:07.840
It's the n squared number of come of comparisons for no use whatsoever when you already know what values are gonna go in there.
01:53:07.840 --> 01:53:16.800
So what's better is to to do a one followed by n zeros and then reshape that into n by n, right?
01:53:16.800 --> 01:53:26.800
So like right, four, four, reshape zero, comma, four reshape one four, four reshape one, comma, four, reshape zero.
01:53:26.800 --> 01:53:28.000
Right?
01:53:28.000 --> 01:53:30.000
This is the better way to do it.
01:53:30.000 --> 01:53:33.600
Because here we're not computing anything, we're just reshaping.
01:53:33.600 --> 01:53:36.239
That's the fastest, you're just doing memory copying operations.
01:53:36.239 --> 01:53:38.479
There's nothing else the computer can do faster than this.
01:53:38.479 --> 01:53:41.600
And especially since we're using bit Boolean, it's gonna be right.
01:53:41.600 --> 01:53:43.840
It's literally just writing bits out in memory.
01:53:43.840 --> 01:53:48.960
That's that's the thing you should know if you didn't already.
01:53:48.960 --> 01:53:51.119
Yeah, exactly, like that.
01:53:51.119 --> 01:53:54.800
And there's an entry in Apple Card that looks something like that, right?
01:53:54.800 --> 01:53:55.760
Of course.
01:53:55.760 --> 01:54:12.560
It's comma comma selfie reshape one, comma, reshape jot zero if you want, but whatever.
01:54:12.560 --> 01:54:14.560
What is it tacitly?
01:54:14.560 --> 01:54:16.560
Yes, comma selfie, right?
01:54:16.560 --> 01:54:18.239
That that makes the omega omega.
01:54:18.239 --> 01:54:23.279
Reshape one, comma, uh reshape jot zero.
01:54:23.279 --> 01:54:24.800
It's a train.
01:54:24.800 --> 01:54:26.720
I like that.
01:54:26.720 --> 01:54:30.000
Switching the wrong tabs.
01:54:30.000 --> 01:54:32.960
There are other ways you can write it as well, but whatever.
01:54:32.960 --> 01:54:38.079
You could instead of the one comma and the V shape, you could do a and overtake, but whatever.
01:54:38.079 --> 01:54:39.279
There are different ways to do it.
01:54:39.279 --> 01:54:40.479
It doesn't really matter so much.
01:54:40.479 --> 01:54:41.840
But something like that, right?
01:54:41.840 --> 01:54:42.800
Is good to know.
01:54:42.800 --> 01:54:53.359
Okay, so these are all these are all things that I would say you should learn as an APL or you should just reach for immediately without really having to think about it.
01:54:53.359 --> 01:54:55.920
Um and then you can you can use those to build up, right?
01:54:55.920 --> 01:54:57.840
It really is like like Lego bricks.
01:54:57.840 --> 01:55:05.279
So an APL that had has a higher level built, they don't have to think for writing certain things.
01:55:05.279 --> 01:55:07.039
Like, for example, the average, right?
01:55:07.039 --> 01:55:12.880
If you give in the task as a new APL to write average, then you might need to sit sit and think about it.
01:55:12.880 --> 01:55:14.640
But you can you can do it in your sleep, right?
01:55:14.640 --> 01:55:17.760
You can wake you up in the middle of the night and say, How do you do average an APL, right?
01:55:17.760 --> 01:55:18.239
You're right.
01:55:18.239 --> 01:55:20.880
Plus slash bar divided by tally, done.
01:55:20.880 --> 01:55:24.880
But that's something that that is something you sort of have to know, right?
01:55:25.680 --> 01:55:31.279
Yeah, maybe maybe the better way to do this than is just with idioms, basically, because this is what they are.
01:55:31.600 --> 01:55:34.079
That's what I but we can go through something completely different, right?
01:55:34.079 --> 01:55:37.039
This was just some examples of some techniques, right?
01:55:37.039 --> 01:55:40.560
That that I would say you have to learn in order to become a black belt APLR.
01:55:40.560 --> 01:55:43.439
There's many, many are basically you have to know Apple cart, right?
01:55:43.439 --> 01:55:46.960
By heart to to uh to be a black belt APLR.
01:55:46.960 --> 01:55:50.399
But there are also also other things that you should know about.
01:55:50.399 --> 01:55:53.520
For example, how to use namespaces effectively.
01:55:53.520 --> 01:55:55.520
You ever use namespaces in APL?
01:55:55.840 --> 01:55:56.159
Nope.
01:55:56.159 --> 01:55:58.239
I mean I've seen them used and I know what they are.
01:55:58.239 --> 01:56:03.039
And I've saw when we had TASA talk episode 30, you demoed a bunch of stuff, but uh right.
01:56:03.119 --> 01:56:06.800
So now with version 20, and like there's a whole bunch of stuff that you should know.
01:56:06.800 --> 01:56:08.319
That is some that's essential.
01:56:08.319 --> 01:56:11.359
Being able to decide on on you how you structure your things.
01:56:11.359 --> 01:56:12.880
How about error trapping?
01:56:12.880 --> 01:56:24.399
I would say if you're writing a production system in APL, you better be able to trap any errors and deal with them and write and report that you send by email to your to yourself so that so you can go do something about it, right?
01:56:24.399 --> 01:56:26.720
And that don't have this the user system crash.
01:56:26.720 --> 01:56:34.720
So collecting information, pertinent information from from the system when it when it crashed and and and catching that and dealing with that.
01:56:34.720 --> 01:56:37.520
Have you ever used traditional functions in APL?
01:56:37.520 --> 01:56:40.319
I think I've written like one or two, but I forgot.
01:56:40.319 --> 01:56:46.159
So all the can I understand, but sometimes you need control structures to write something sanely, I would say.
01:56:46.159 --> 01:56:57.199
I know DQN shirts away from that, but you know, with the type of programming I do, I very often have like giant switch statements with loads of different things that I need to do or for loops and so on.
01:56:57.199 --> 01:57:04.640
So um that's something I would I would say you should you should know about.
01:57:04.640 --> 01:57:09.840
The even object-oriented programming in APL that occasionally is useful to use.
01:57:09.840 --> 01:57:12.880
Um if you've never never used that.
01:57:12.880 --> 01:57:28.800
For example, right, if you're writing some kind of some object that that represents some things, connection to some database or something, and the user can set all kinds of options, and you need to like normalize the settings that the user uses or check that they are valid.
01:57:28.800 --> 01:57:34.319
So they might be exposed as as as fields, but then you don't have a chance to check them until runtime.
01:57:34.319 --> 01:57:42.720
If you expose them as properties, then you have a getter and setter, as a setter that checks when the user assigns to them that the value they're trying to assign is actually valid.
01:57:42.720 --> 01:57:43.760
All those kinds of things.
01:57:43.760 --> 01:57:44.800
That's stuff you need.
01:57:44.800 --> 01:57:50.640
That's bread and butter for the applications programmer, but not for toy problems from lead code, of course.
01:57:50.640 --> 01:57:54.000
So there's a bunch of stuff there to learn.
01:57:54.000 --> 01:57:57.359
How to effectively use regex in APL.
01:57:57.359 --> 01:58:00.159
I don't know if you've ever used regex in APL at all.
01:58:00.159 --> 01:58:06.399
So so Max is saying in the in the chat that air trapping and transference are beyond Connor's use cases.
01:58:06.399 --> 01:58:11.520
But if the the question is, how does Connor become a black belt APL er, right?
01:58:11.520 --> 01:58:13.279
Then what does it mean black belt APL?
01:58:13.279 --> 01:58:16.880
In my mind, it means you could work as an APL consultant, right?
01:58:16.880 --> 01:58:22.079
One of those companies that use APL, they can say, hey, we have some code that needs to be worked on.
01:58:22.079 --> 01:58:23.119
Can you come in, have a look?
01:58:23.119 --> 01:58:25.199
It's running slow, can you make it faster?
01:58:25.199 --> 01:58:29.039
Or we need to implement some new functionality, and Connor is able to do that.
01:58:29.039 --> 01:58:30.479
That's I would say is a black belt.
01:58:30.960 --> 01:58:31.920
That's not my definition.
01:58:31.920 --> 01:58:32.640
Definitely not.
01:58:32.640 --> 01:58:34.079
So how do you define it?
01:58:34.399 --> 01:58:38.079
I'm more interested in like the algorithmic ideas.
01:58:38.079 --> 01:58:53.039
Like all of these things, I mean, some of them are more idiomish than algorithmic, but like you know, like this is a great example of like every single time I ever spell an identity matrix, I use the outer product selfie iota.
01:58:53.600 --> 01:58:57.520
It's just fine, it's easy to understand and explain, but you but you understand why this is better.
01:58:57.840 --> 01:59:02.479
Yeah, this is this is really good to know, and I feel like I probably should have known by now.
01:59:02.479 --> 01:59:23.119
And also, too, uh, you know, going back and forth with Zima on Twitter over the weekend, he was talking about you know optimizations of bit arrays and and how the problem I was working on was a string of ones and zeros, and he immediately, his idea was to convert it to a bit array of integer ones and zeros.
01:59:23.119 --> 01:59:31.920
And that's not really something I think about because I'm not typically thinking about like performance-oriented APL programming or BQM programming or whatever array language.
01:59:31.920 --> 01:59:37.199
But then as soon as I start to profile things, you know, I I I am looking for that kind of stuff.
01:59:37.199 --> 01:59:40.800
And then, you know, Zyma, I think, is thinking that way like 100% of the time.
01:59:40.800 --> 01:59:44.479
He's always thinking, what's the way that I can make this run faster?
01:59:44.479 --> 01:59:59.119
And so, anyways, Max is absolutely correct that error trapping and trad funds and like going to trad funds and to to need control structures is like a limitation of dialogue, it's not necessary from a language point of view, right?
01:59:59.119 --> 02:00:04.319
And also, too, just like trad funds in my mind are much more difficult.
02:00:04.319 --> 02:00:15.680
Like the barrier to writing a trad fund is a lot higher than like a D fund because of the fact that you need like, what is it, a minimum of a couple lines to get the the deltas?
02:00:15.920 --> 02:00:20.399
And uh I like I don't even know the syntax of the syntax of the that's just the syntactic thing.
02:00:20.399 --> 02:00:23.119
Okay, so so here's here's another thing you might like.
02:00:23.119 --> 02:00:30.319
You sometimes you want to do it like Lisp style, I guess, to take the first element and then all the remaining elements.
02:00:30.319 --> 02:00:35.279
And and that you can do with one one jot what is it called?
02:00:35.279 --> 02:00:37.520
Uh partition enclose or something.
02:00:38.000 --> 02:00:40.479
One one jot partition enclosed.
02:00:40.880 --> 02:00:41.520
Yeah.
02:00:41.520 --> 02:00:45.439
So if you were one one enclose or whatever, left shoe.
02:00:45.439 --> 02:00:47.680
No, no, no, that no, just a plain one, yeah.
02:00:47.680 --> 02:00:50.960
And then write like quote A B C D E or something like that.
02:00:50.960 --> 02:00:56.079
Alright, so it takes the first element as a vector, one element vector, and then the rest of the elements.
02:00:56.079 --> 02:00:57.359
I think that's pretty neat.
02:00:57.359 --> 02:00:58.800
Nice technique to have.
02:00:59.199 --> 02:01:12.079
So that's interesting because like as soon as you mention this, um, my thought is that in cap um, and I guess you need pair.
02:01:12.479 --> 02:01:12.880
Yeah.
02:01:12.880 --> 02:01:17.439
I guess this is one one drop and one, yeah, sure.
02:01:17.439 --> 02:01:19.359
But you this also this is not pair.
02:01:19.359 --> 02:01:21.840
You need you need comma wing club or something.
02:01:21.840 --> 02:01:22.560
Yeah.
02:01:22.560 --> 02:01:24.239
Does it have pair?
02:01:24.239 --> 02:01:25.279
Oh, it has pair, yeah.
02:01:25.279 --> 02:01:27.359
Oh, so yeah, so is that similar?
02:01:27.359 --> 02:01:29.600
It's not exactly the same, but yeah, it's similar enough, yeah.
02:01:29.600 --> 02:01:30.079
Sure.
02:01:30.079 --> 02:01:31.920
It's a technique, it depends on the language.
02:01:31.920 --> 02:01:36.720
It's a fairly recent extension we did to allow you to do this, but I found that useful on occasion.
02:01:36.720 --> 02:01:49.119
Here's another thing that's really useful that I've had to tell a customer about multiple times, and that is you these days uh you spell it comma square bracket iota 2 go square bracket.
02:01:50.960 --> 02:01:54.000
Oh, that's comma square bracket iota 2.
02:01:54.399 --> 02:01:55.039
Yeah.
02:01:55.039 --> 02:01:57.119
Well, you can't do it on a on a vector.
02:01:57.119 --> 02:02:02.720
You have to so the way you have to do it on a on a like a 345 reshape quad A or something.
02:02:02.720 --> 02:02:04.399
Yeah.
02:02:04.399 --> 02:02:07.520
So this merges the first two X's.
02:02:07.520 --> 02:02:15.600
So so if you don't have the have what I anything in front of the three, four, five, you get like a three three layers that are each four by five.
02:02:15.600 --> 02:02:21.199
And this merges all the layer bunches together all the layers into a single to a single matrix.
02:02:21.199 --> 02:02:26.239
You can't actually you can't see because of the boxing here, so it's hard to tell.
02:02:26.239 --> 02:02:30.720
But it doesn't if you turn on full boxing or something, you can I don't know if you have that.
02:02:30.720 --> 02:02:35.760
But if you if you do it on oh, I think you I think your output is missing spaces.
02:02:35.760 --> 02:02:39.279
Try try to stick a there's something there's something funny.
02:02:39.279 --> 02:02:40.159
Yeah, you can't do that.
02:02:40.159 --> 02:02:42.079
Try to stick a format in front of this.
02:02:42.079 --> 02:02:44.159
I'm not sure there's something wrong with the output.
02:02:44.159 --> 02:02:45.600
This is not okay.
02:02:45.600 --> 02:02:51.520
The it looks like your array box doesn't render empty lines in the output, which is a mistake.
02:02:51.840 --> 02:02:57.039
Yeah, I think yeah there might be a bug because I stripped those at one point.
02:02:57.359 --> 02:03:05.119
Yeah, that's about if you go to try APL you can see what's happening, or or just a open APL and one.
02:03:05.600 --> 02:03:09.920
Oh OBS is that works slowing down the system.
02:03:10.319 --> 02:03:11.199
Yeah, okay.
02:03:11.199 --> 02:03:14.239
So now if you write this, this is not gonna fit on the screen, yeah.
02:03:14.239 --> 02:03:15.039
Okay, okay.
02:03:15.039 --> 02:03:17.199
See now, so this has got three layers.
02:03:17.199 --> 02:03:20.399
Each one of the layers is three by a is four by five.
02:03:20.399 --> 02:03:34.079
And then if you do the the comma square bracket and iota two, close square bracket, then it will merge those two, the merge the leading two axes, and you can merge any number of x's by changing the two to to a higher number.
02:03:34.079 --> 02:03:38.720
So if you merge if you write IOTA three inside, you will merge all three axes, then it's just a normal rebel.
02:03:38.720 --> 02:03:40.720
So it's basically like a leading revel.
02:03:40.720 --> 02:03:42.880
That's a very useful thing to do.
02:03:42.880 --> 02:03:54.319
Another useful thing to do is so you so Max is saying you can spell what we just did with a rank, and I will challenge you to do so, at least without using transpose.
02:03:54.319 --> 02:03:55.600
So go for it, Max.
02:03:55.600 --> 02:03:57.439
You are here's another thing.
02:03:57.439 --> 02:04:02.960
If you got let's say you've got three matrices of the same shape, or no, or so even more common, you can try this.
02:04:02.960 --> 02:04:10.960
So write like open paren and like three, four, reshape quad A, for example, and then close the paren.
02:04:10.960 --> 02:04:23.119
And then open paren and two four reshape, say quad C quad A, just if you can see the difference, and then yeah, you can add one more just for good measure.
02:04:23.119 --> 02:04:29.600
So you can add open and then like uh four, four reshape quad D or something, so you can see the difference.
02:04:29.600 --> 02:04:32.399
Okay, so now so now we want to stack these.
02:04:32.399 --> 02:04:34.800
So you can see these are rows, right?
02:04:34.800 --> 02:04:38.239
These are collections of rows, and we want to merge them all into a single matrix.
02:04:38.239 --> 02:04:39.279
So, how would you do that?
02:04:39.279 --> 02:04:44.239
So the way you do it is disclose comma bar slash.
02:04:44.239 --> 02:04:48.399
Which is not the same thing as a mix.
02:04:48.399 --> 02:04:55.119
If you do a mix, then you end up with a three-dimensional array with padding, which and then you can't fix that.
02:04:55.119 --> 02:04:56.159
That's the split.
02:04:56.159 --> 02:04:59.840
And you need the the parentheses.
02:04:59.840 --> 02:05:01.359
See, that's not useful.
02:05:01.359 --> 02:05:03.279
And you can't even do anything to merge.
02:05:03.279 --> 02:05:07.600
Now you have to remove the rows, but you don't know which rows were inserted, so that's that's not what you need.
02:05:07.600 --> 02:05:08.000
Right?
02:05:08.000 --> 02:05:08.960
So that's the technique.
02:05:08.960 --> 02:05:11.279
Disclose, comma bar slash.
02:05:11.279 --> 02:05:15.039
Very useful tool to have in your toolbox.
02:05:15.039 --> 02:05:16.479
Join matrices.
02:05:16.960 --> 02:05:18.239
Alright, last one.
02:05:18.239 --> 02:05:24.159
We've now set the record for the longest uh longest episode.
02:05:24.239 --> 02:05:26.079
I mean, there's a ton more we can do, right?
02:05:26.079 --> 02:05:27.279
Well, but this is the one.
02:05:30.079 --> 02:05:30.960
No, no, no, it was good.
02:05:30.960 --> 02:05:31.680
It was necessary.
02:05:31.680 --> 02:05:32.880
I don't think it was necessary.
02:05:33.920 --> 02:05:34.880
I don't think it was necessary.
02:05:34.880 --> 02:05:42.239
Even even the jot, you know, like this jot is like a beginner, you know, like, and technically in certain cases, it's necessary.
02:05:42.239 --> 02:05:49.840
Like I can't remember if it was you or someone made the comment that when I was building the comparison tables on a ray box.
02:05:49.840 --> 02:05:51.600
Uh what was this for?
02:05:51.600 --> 02:06:09.760
It was for a first, and you know, when I was doing this, and if you switch these to nested and nested, you know, initially I didn't have these at, which like I I understand that they're not valid expressions, but like, do we need to explain that?
02:06:10.159 --> 02:06:11.520
I think I think they should be.
02:06:11.520 --> 02:06:20.479
I I'm in favor of making the well, I don't like the two trains being hooks in J, but I'm in favor of making what we call AF trains valid.
02:06:20.479 --> 02:06:22.640
So you can just but that's that's the difference.
02:06:22.880 --> 02:06:23.760
Yeah, I don't I don't know.
02:06:23.760 --> 02:06:31.119
And like honestly, like this is what makes me really like cap's two-train model because there's no difference.
02:06:31.119 --> 02:06:53.760
Like I think it's such a such such a wart, or and maybe warts not the wrong word, such a I don't know the exact word, like deficiency is too strong, but like it is it is so nice in the cap two-train model that two juxtaposed functions are the same, uh parsed the same, you know, whether it's tacit or there is a argument on the right.
02:06:53.760 --> 02:07:14.880
And like the reason that I ended up adding these at is because I've set up a unit testing system in the background that like tests every single one of these expressions on input and expected output, so that like if I want, I can go and mess around with these to change them and then check, does it still give the correct result?
02:07:14.880 --> 02:07:22.239
And in order for that to work, you do need the way that I set it up, you do need these to actually be correct tacit expressions.
02:07:22.239 --> 02:07:30.239
But like I could you could argue that like you don't actually need these because you know, are people going to expect what?
02:07:30.479 --> 02:07:32.960
Yeah, what are you saying is it would be a snippet.
02:07:33.199 --> 02:07:36.000
It's a prefix of a non-tacit expression.
02:07:36.000 --> 02:07:42.720
Yeah, and that's like the the same thing here when we're talking about like, oh, this isn't a monadic function.
02:07:42.720 --> 02:08:01.760
You know, yes, I understand that like technically what you're saying is correct, but I don't think that like the jot not being there is detrimental to the understandability because like a lot of people that are beginners that don't understand that it doesn't parse as like a function are just gonna copy and paste this into whatever REPL they're using and then put another.
02:08:02.159 --> 02:08:04.159
If they put it into an expression, that's fine.
02:08:04.159 --> 02:08:07.760
But if they try to give it a name to save it for next time, it will fail.
02:08:07.760 --> 02:08:11.680
And that's one of the reasons why I think we should allow saving that.
02:08:11.680 --> 02:08:18.880
I think you should allow, for example, like diagonal gets one one transpose and not have a jot.
02:08:18.880 --> 02:08:22.479
I think that would make that that makes it so much nicer.
02:08:22.479 --> 02:08:30.319
And we often speak about it, we often speak about some some function with a fixed left argument because the left argument is usually the control argument.
02:08:30.319 --> 02:08:36.159
So then so the the pairing of a left argument with a with a function often has its own meaning.
02:08:36.159 --> 02:08:41.920
And having to insert a jot there, I think is just unnecessary, especially since syntactically it's unnecessary.
02:08:41.920 --> 02:08:48.239
And there are a lot of entries in Apple cart that are of the form argument jot function.
02:08:48.239 --> 02:08:50.239
I think it's a pity that I have to do that.
02:08:50.239 --> 02:08:52.239
I think it would be much nicer if I didn't.
02:08:52.239 --> 02:08:59.760
But that's that be that as it may, however your notation for it is, that is that is there are we can stop here.
02:08:59.760 --> 02:09:03.359
There are a ton more of these like short snippets and things.
02:09:03.359 --> 02:09:12.079
Bunch of them are in AppleCart, of things that I think one should know as a black belt algorithmic APL er, even if you're not writing applications.
02:09:12.079 --> 02:09:14.880
I think there's so many things that you should be aware of.
02:09:14.880 --> 02:09:19.920
Some of it to do with quirks and language, some of it is just using primitives in ways you might not think.
02:09:19.920 --> 02:09:21.359
I'll give you I'll give you one more.
02:09:21.359 --> 02:09:23.520
Sorry, Connor, I'll give you one more.
02:09:23.520 --> 02:09:28.560
Let let's say if you uh if you go over to like array box or something, so you can play with this.
02:09:28.560 --> 02:09:37.039
So let's say we have we have some some phrase and so like a a a uh in text phrase, just easy sounds, like your name or something like that.
02:09:37.039 --> 02:09:38.800
I mean a dog, yeah, that's fine.
02:09:38.800 --> 02:09:39.760
Yeah, that's fine.
02:09:39.760 --> 02:09:42.560
Okay, should probably put single, yeah, single quotes like that.
02:09:42.560 --> 02:09:47.359
Okay, so you know how you can how you can remove all the vowels, right?
02:09:47.359 --> 02:09:50.239
So without and then a list of vowels.
02:09:50.239 --> 02:09:53.680
But it's the way around, but yeah, you need to do without.
02:09:53.680 --> 02:09:55.600
You can do a commute on it if you want.
02:09:55.600 --> 02:09:56.159
Yeah.
02:09:56.159 --> 02:10:03.119
And if you put uh if you put instead an intersection, then it finds all the vowels.
02:10:03.119 --> 02:10:08.159
Yeah.
02:10:08.159 --> 02:10:08.640
Right?
02:10:08.640 --> 02:10:11.520
So this now that is basically just a primitive.
02:10:11.520 --> 02:10:14.239
You put in commute, but you could just have reverse the arguments, of course.
02:10:14.239 --> 02:10:15.279
It would be the same thing.
02:10:15.279 --> 02:10:24.479
It's just a primitive, but I think a lot of people think of intersection as being just for sets, and in and this can actually be used for data extraction.
02:10:24.479 --> 02:10:32.479
So sometimes you have in in some kind of problem where they have some digits and they've got some letters in between, and you want to extract just the digits.
02:10:32.479 --> 02:10:34.000
So then you would write that.
02:10:34.000 --> 02:10:41.840
So if you if you remove everything to the left of the cursor right now, right, and you write one dog, so change a to a digit one, example.
02:10:41.840 --> 02:10:43.439
A to a digit one.
02:10:43.439 --> 02:10:48.079
And the second A, I changed A cat, change that to like three and cats.
02:10:48.079 --> 02:10:52.960
So let's say you have some some parsing problem with this, and you want to extract the digits that are in there.
02:10:52.960 --> 02:10:56.960
So at the end of the line of the expression, you just write intersection quad D.
02:10:56.960 --> 02:11:02.720
Now you could do whatever execute each or something like that to get the numbers, right?
02:11:02.720 --> 02:11:06.720
That's a that's a technique that I would say you should you should be familiar with.
02:11:06.720 --> 02:11:08.159
It might not be so obvious.
02:11:08.159 --> 02:11:10.079
Maybe it is obvious, it's just a primitive.
02:11:10.079 --> 02:11:12.560
There's nothing nothing special going on here.
02:11:12.560 --> 02:11:14.000
But these kind of things.
02:11:14.000 --> 02:11:15.119
And how do you write this?
02:11:15.199 --> 02:11:23.039
This is I mean, there's the more complicated like one where you need to deal with juxtaposed digits.
02:11:23.039 --> 02:11:29.439
And yeah, Marshall has a thing in BQN just called ints or nats that is used for ads.
02:11:29.680 --> 02:11:31.119
So we we can try that.
02:11:31.119 --> 02:11:38.000
If you if you write so if you get rid of the each here and the uh and after the quad D, yeah.
02:11:38.000 --> 02:11:43.840
After quad D, uh you can write commas quote space quote, for example.
02:11:43.840 --> 02:11:45.279
It's one way to do it.
02:11:45.279 --> 02:11:46.479
There are many ways to do it.
02:11:46.479 --> 02:11:49.279
Yeah, and now you can just do an execute on the whole thing.
02:11:49.279 --> 02:11:52.640
That presumes the digits are followed by spaces.
02:11:52.640 --> 02:11:56.640
No, it presumes that there's at least one space between all numbers.
02:11:56.640 --> 02:11:57.760
They can be anywhere.
02:11:57.760 --> 02:12:36.479
So even if you remove the space between one and dog and between chased and three and cats it will still work as long as there's at least one so no need each just execute if you want to get the numbers and you can we can do even better because you could actually you could take you could you could do there are things like quad v fi there are system functions you can use for this if you want maybe you call that not pure anymore but there are lots of like this also shows there's a whole area that you should know as a black belt AP other even if you're just doing algorithms there's a whole area of knowledge of of how do you extract easily the parts of the data that you want.
02:12:36.479 --> 02:12:39.520
So I'm not saying this is the right way to do it in a production system.
02:12:39.520 --> 02:12:46.720
Of course if there's no space between dog and chase this will fail but there are other ways you can do you can do this and that would that works nicely.
02:12:47.039 --> 02:12:47.279
Right.
02:12:47.520 --> 02:13:43.439
So if if you write qua yeah quad c open brand quad c quad a close brand quad v fi omega that will that will work no matter what's in between them that basically means sp split and convert it does the execute for you numbers separated by any numbers any letters want me to spell it out again no no no we'll stick we'll stick with this one we're now we're now past the two and a half hour mark we gotta yeah yeah we gotta go so so we're saying there are right there are there are things that are techniques like this this is what I so even if we say right you just want to be an algorithmic expert you gotta know these right you can't sit and spend time thinking about how to do this kind of thing that you just gotta know and there's so many more right we could do a whole episode just of these but but essentially I've put as many as I could into into apple cart that's one of the points of apple cart you gotta know Apple cart.
02:13:43.760 --> 02:13:46.239
But aren't there like thousands of entries in Apple card?
02:13:46.479 --> 02:13:50.479
Yeah there are almost four thousand but many of them are are not techniques like this.
02:13:50.640 --> 02:14:02.079
Many of them are just primitives is there a way to filter by these like idioms that's the thing is I don't think as I don't think of AppleCart or BQN crate as like idiom repositories.
02:14:02.079 --> 02:14:16.880
I think of them as like just a very exhaustive or you know not exhaustive but a very long list of expressions that you can find useful so if you need to know how to do something that you're struggling with you pipe it into BQN crate or Apple cart and it's likely to show up.
02:14:17.279 --> 02:14:27.119
Yeah there's no information in the table in AppleCart that tells you like a flag saying this is in Connor wants to be in a it's not just me.
02:14:27.119 --> 02:14:37.760
I guarantee you there's other folks out there that want to like like there's no you're right there's nothing in the Apple card table that tells you this one you have to know in order to be a black belt algorithm person.
02:14:37.760 --> 02:14:38.960
That's that's true.
02:14:38.960 --> 02:14:40.479
Yeah that'd be useful.
02:14:40.479 --> 02:15:40.720
Although that'd be going through 4000 entries and flag oh I've I've gone through those 4000 entries so many times so I'm not sure if that would be a lot of work but then but but it's sort of an arbitrary criteria right what about things you have to know in order to deal with text manipulation right or things you have to know if in order to do math in APL right those that another flag so yeah we could do we could do a lot of Boolean columns that say that so that you can say like these are these are mathematically necessary things to do for like this level of mathematics these things you need to do for text processing these are things you need to do for accounting these are things you need to do for etc etc we could do that but that like what what there's no limit there's no end to the number of of c of subjects and and and fields of study that exist and and for every field of study and every interest group there is marking for every every entry in AbleCard whether it's relevant for that it seems a bit much maybe.
02:15:40.720 --> 02:15:52.000
So instead you read through it you doesn't have you can you could filter out all the primitives all the system functions or the user commands and so on and then you could go you go through them.
02:15:52.000 --> 02:15:58.399
If you I mean if you take 10 a day you get through it in the course of of a year right yeah that's true.
02:15:58.560 --> 02:16:14.800
I mean Max in the chat's just saying so APL dojo could be belt based rankings from Apple card in the midst of Madeline author of the Apple and Elias author of Cap discussing uh implementation of primitives.
02:16:14.800 --> 02:16:43.120
But anyways this is this has uh been an interesting episode we did end up kind of where we were where I was aiming to go with a lot of new nuance along the way and it may has me you know if anything has come out of this it's got me convinced that well it would it be the ideal but I was talking to Madeline on the last Tacit talk that she has empty syntactic space for non banana bracketed primitives.
02:16:43.120 --> 02:16:48.399
So the trains need the banana brackets but then it's empty syntactic space when they're not there.
02:16:48.399 --> 02:17:05.520
And I said well you could technically have like a hybrid tacit model and borrow you wouldn't even need to borrow everything necessarily from a cap just like the two trains in the form of the you know monadic function composition and left bound functions.
02:17:05.520 --> 02:17:18.239
You wouldn't even I wouldn't even really miss the uh the B1 combinator that much but even if you just had juxtaposition of left bound so aka an argument on the left and the monadic functions that would like be so nice.
02:17:18.239 --> 02:17:38.159
And like it would avoid the problem that we have with the the jot in dialog APL and the at in j of that those just parse correctly it it is it is available syntactic space in dialogue as well right we can make array function be a valid construct in a in dialogue APL.
02:17:38.399 --> 02:18:01.360
It's not the that's the ship hasn't sailed I and which it doesn't make it the same thing conceptually as the left bound functions if that's what you call them but it but effectively that's what it gives you right because in a train that would mean you can put so we could we could do how far ever we want right you still have to do a a jot when it's in the middle of a train.
02:18:01.600 --> 02:18:26.479
But wait what are you saying that is uh and also wait to answer the in the in the chat ellias is asking is banana brackets the official term Madeline says I call them moons at one point I was calling them moon brackets but then I read a 1987 or 89 paper called the introduction to the theory of lists by Richard Byrd who is the algebra of programming and he was calling them banana brackets back then and uses them for like list notation.
02:18:26.479 --> 02:18:32.879
And so since then I've been calling them banana brackets but it's it's not like the official term brought to you by Madeline.
02:18:32.879 --> 02:18:47.840
It's a term that I read in a paper from like what is that 40 years ago and and then I started using so what is the and what is this the all right and honestly last thing we're gonna hit like three hours now and I guess alias was the one that messaged in at one point that he said he wanted three or four hour episodes.
02:18:47.840 --> 02:18:54.399
What's the thing that there's still because you definitely can't have monadic functions in a row because that that space is taken.
02:18:54.639 --> 02:19:06.479
No but but essentially right if you write in in APL one plus two times divide right it looks like you have left bound functions.
02:19:06.959 --> 02:19:12.399
One plus two one plus two times divide?
02:19:12.799 --> 02:19:17.040
Yeah okay yeah so AGH fork and then an AGH fork.
02:19:17.440 --> 02:19:27.040
Yeah this is fine right the one thing you're missing is that if you want to do to do one plus two times ten divide that's not valid.
02:19:27.040 --> 02:19:32.879
Right because you mean the tack then you've got a you have an extra divide division symbol in there.
02:19:32.879 --> 02:19:50.399
Right and that tack or you can put a jot if you want right a jot between the 10 and on the left of the right and that could just be removed the that requirement you could just say if the second carriage so to say of the train counting from the right is an array then it has an implied jot or right tech or whatever.
02:19:50.799 --> 02:19:53.680
Oh I see so you're saying this is empty syntactic space.
02:19:54.000 --> 02:19:54.399
Exactly.
02:19:54.639 --> 02:19:58.239
So you could add left bound functions you could add a part of the cap model.
02:19:58.319 --> 02:20:08.639
So you couldn't add the two trains no but but the inside that inside a a longer train it already works right you you have the effectively you have the left bound functions because you have AGH trains.
02:20:08.639 --> 02:20:09.600
So that's not a problem.
02:20:09.600 --> 02:20:11.920
It's only to the far right that there's a problem.
02:20:11.920 --> 02:20:36.159
You're saying AGH trains essentially are already this yeah just if you go back to what you had read before the one plus two times divide right or and then put that in parentheses right it looks like it's a one plus applied to the two times applied to the reciprocal so it looks like you got left right this this is works identically in cap and in dialogue right and in k.
02:20:36.159 --> 02:20:46.639
Even though two of the languages cap and k have left bound functions and dialogue doesn't but effectively works the same because there's no notational difference between left bound functions used in this matter.
02:20:46.639 --> 02:21:11.120
Does it you have to give an argument yeah well I mean this is just an expression now put parentheses around every about two times the reciprocal and then one plus that so that's a different thing that you would get right how is it reciprocal of 10 is 0.1 times two zero point two one plus that one plus one to plus one point two or six fifths.
02:21:11.120 --> 02:21:15.120
The fact that this is an AGH fork doesn't actually it doesn't matter that's what I'm saying.
02:21:15.120 --> 02:21:30.079
So so notationality there's no difference between left bound functions and AGH trains when it comes to to this the difference is on the far right and of course the ability to to stack monetic functions that are not left bound.
02:21:30.079 --> 02:21:42.000
The way that that's solved in in BQN for example is by having the nothing right so then effectively you have AGH trains where the A, the array on the left is a nothing and then everything just works out.
02:21:42.000 --> 02:21:48.959
So you have if you had a by convention and a left argument that signals to the function that don't use me.
02:21:48.959 --> 02:21:53.840
Just pretend I'm not here and just run your monetic function definition.
02:21:54.399 --> 02:21:59.760
So food for thought I'd love it in dialogue APL I'd love it in Tiny Apple.
02:21:59.760 --> 02:22:02.879
Or I'd love it in some new array language that doesn't exist.
02:22:03.120 --> 02:22:05.840
I I I think I think I'm not sure I would add nothing.
02:22:05.840 --> 02:22:17.600
I don't think so I don't think it it it it adds anything no pun intended but I think I would add the AF train if you want to call it that or left bound whatever you want to call it.
02:22:17.840 --> 02:22:18.159
Yeah.
02:22:18.479 --> 02:22:22.159
Alright well we gotta call we're at two hours and 46 minutes at this point.
02:22:22.559 --> 02:22:26.959
Yes my my food has been served my dinner has been served and is now getting cold on the table.
02:22:26.959 --> 02:22:32.239
I sent a photo but from my wife of my food getting cold on the table and it looks delicious.
02:22:32.479 --> 02:22:37.840
My wife just popped in and was looked very confused as what are you still doing podcasting?
02:22:37.840 --> 02:24:03.040
Anyway So are we are we launching the APL Dojo podcast I mean what's we're not launching a separate podcast that's for sure will we revisit this topic maybe maybe not I will push these whatever changes to the live site and link it for folks that are interested in they can play around but I think we've talked enough about the APL Dojo for at least a few episodes if you do have comments thoughts questions you can either leave them in the YouTube description or reach us at here we go contact at arraycast.com first time since the relaunch of a cast 2.0 era that we got that right and yeah thanks for everyone in the chat we've got people we've got people asking for a 24 hour charity stream a raycast episode um no I don't think we could do a 24 hour conference but uh yeah Adam in the chat saying I do it yeah I don't know we'll we'll uh we'll see I've I've thought about doing like a an online conference a Raycon kind of thing uh which could could go 24 hours but you need multiple people uh hosting anyways thanks for everybody in the chat yeah leave comments in the description or you can reach us at that email address and with that we will say happy array programming nailed it nailed it thanks everyone by