WEBVTT
00:00:11.919 --> 00:00:16.079
Welcome to episode 120 of ArrayCast.
00:00:16.160 --> 00:00:25.519
I'm your host, Connor, and today with us we have a special guest who I guess we will introduce in a moment, just after we have Adam give his brief introduction.
00:00:25.839 --> 00:00:27.600
Well, I'm Adam Blutsewy.
00:00:27.760 --> 00:00:30.960
I uh do APL at dialogue.
00:00:31.039 --> 00:00:33.280
I'm generally interested in array languages, so.
00:00:33.600 --> 00:00:37.679
And as mentioned before, my name's Connor, host of ArrayCast, Matt, host of Array Cast.
00:00:37.840 --> 00:00:39.119
Bob can't fix it in post.
00:00:39.520 --> 00:00:41.600
A massive fan of all the array languages.
00:00:41.679 --> 00:00:49.439
And typically we do announcements before we introduce the guests, but it's a bit odd seeing as we have Jacob with us live on screen on YouTube.
00:00:49.520 --> 00:00:55.200
If you're not watching this, or I say should say listening to this in an audio podcast app.
00:00:55.280 --> 00:01:02.320
So Jacob Lockpud, we don't know much about him yet, but we do know that he is the author of Fix APL.
00:01:02.399 --> 00:01:10.000
And he's, I think, for both Adam and I, a couple decades younger than both of us, quite amazing that you are the author of this APL.
00:01:10.159 --> 00:01:26.640
And you were brought on to our radar, or at least my radar, last episode in when we were just Adam and I talking in episode 119, I believe it was Madeline in the YouTube chat, which is one of the great things about the fact that we are now live on YouTube.
00:01:26.719 --> 00:01:30.400
We can interact more with the listeners, at least that are live.
00:01:30.640 --> 00:01:43.439
And Madeline mentioned when we were having the conversation about the learnability of languages, the number of primitives and ambivalence, she mentioned off-handedly, you should check out Fix APL, which I was like, I've never heard of this.
00:01:43.519 --> 00:01:45.040
And I'm live on a podcast right now.
00:01:45.200 --> 00:01:46.560
I don't have time to go check this out.
00:01:46.719 --> 00:01:52.239
And sure enough, when the podcast ended, I went and checked it out and I said, Holy smokes, how come I have not heard of this?
00:01:52.400 --> 00:01:54.560
And so I think that's what we're gonna talk about today.
00:01:54.799 --> 00:02:06.480
But before we do that, we're gonna do uh a couple announcements, and then we're gonna ask you, Jacob, about how you got into computing, how you got into array languages, and then we're gonna spend the rest of the episode talking about fixed APL.
00:02:06.560 --> 00:02:12.080
So I think first Adam has uh a couple announcements, and then we'll get into uh questions with you, Jacob.
00:02:12.319 --> 00:02:13.199
Sounds good.
00:02:13.439 --> 00:02:13.840
Right.
00:02:14.080 --> 00:02:17.520
So two things, both sort of competition related.
00:02:17.759 --> 00:02:32.240
We just launched a new round of the APL challenge, uh, which is this very basic introduction to APL, where you can also win some small prizes, but it gives you all you need to learn in order to complete the whole thing.
00:02:32.560 --> 00:02:40.800
I rewrote the whole system from scratch because the old one is getting a bit long in the tooth, and uh, I'm really happy about how it turned out, and you've got dark mode.
00:02:40.960 --> 00:02:44.719
Um, so go check that out at challenged dialogue.com.
00:02:44.960 --> 00:02:49.039
And then we made a modification also to the APL Forge.
00:02:49.199 --> 00:02:52.560
So that's a sort of a longer term, it's a once-a-year thing.
00:02:52.639 --> 00:03:01.199
Uh, the dialogue will give out some larger prices and uh opportunity to come and present your work at a dialogue user meeting.
00:03:01.280 --> 00:03:13.759
It's our yearly bi-weekly uh we yearly conference, and and so until now it has been only for projects where APL was the core of the algorithm of the system.
00:03:14.080 --> 00:03:16.000
But we thought we we'd expand that a bit.
00:03:16.080 --> 00:03:32.719
So if you want to write a tool or create a tool somehow that does not use APL as its its core technology, but provides some sort of quality of life improvements or help for people that are writing APL, then that's also eligible.
00:03:33.039 --> 00:03:50.240
So as an example of something that could have been obviously not eligible to win a prize, but like I I created Apple, which is this lookup table of APL phrases, but it's actually written in HML, CSS, JavaScript, not in APL, just the content that it serves as APL.
00:03:50.319 --> 00:03:54.080
So that's a tool that's not an APL tool, but it helps APLers.
00:03:54.400 --> 00:04:05.280
So if you have a tool like that that's not written in in APL, say like Connors uh array box, then uh that would be essentially eligible for a price in the APL Forge.
00:04:05.360 --> 00:04:08.000
So you can check that out at forge.dialog.com.
00:04:08.319 --> 00:04:08.719
Awesome.
00:04:08.879 --> 00:04:17.279
Links, as always, will be in both the description of the YouTube video and the show notes of the podcast and our beautiful new website, arraycast.com.
00:04:17.360 --> 00:04:20.079
I guess same domain, but new, beautiful design.
00:04:20.319 --> 00:04:24.240
And with the announcements out of the way, it is a huge, I don't know, excitement.
00:04:24.480 --> 00:04:27.680
I'm very excited to talk to you, Jacob, about uh fix APL.
00:04:27.759 --> 00:04:33.759
But before we talk about fixed APL, maybe I mean I'd say take us back to the beginning, but the beginning for you wasn't that long ago.
00:04:33.920 --> 00:04:46.800
Um, so take us back however many years uh it was that you started getting into computing or programming, and then tell us about your path from there to how you discovered array languages, and and then we'll get to fix APL.
00:04:47.279 --> 00:04:48.639
Okay, sure, yeah.
00:04:48.959 --> 00:04:57.759
So I started coding in 2020 when I was I guess 11 or 12, maybe 13.
00:04:58.079 --> 00:04:59.279
I don't I don't remember.
00:04:59.439 --> 00:05:03.040
I somehow, wow, I don't know why I can't think of it.
00:05:03.199 --> 00:05:04.639
I mean it was COVID times, right?
00:05:04.720 --> 00:05:08.079
So that that uh that era is like a blur from the disorienting.
00:05:08.560 --> 00:05:19.279
But however many years ago it was, I uh was kind of stuck at home, you know, doing Zoom middle school, and uh it really didn't have much going on.
00:05:19.439 --> 00:05:29.680
I looked up how did they make Minecraft and it said Java, and so I learned JavaScript, of course, and I thought it was interesting.
00:05:29.839 --> 00:05:55.040
I had some you know little iPad app where you could put in HTML and JavaScript, and it was terrible, there were ads all over it, but eventually I got a laptop, and around the same time I got into code golf through the code golf stack exchange website, and that was really how I got into a lot of more esoteric languages.
00:05:55.120 --> 00:06:18.639
Like I started with JavaScript and then I got into some of the you know languages designed for code golf, and uh eventually I found I mean I had known about array languages for a little while at that point, but I started trying out J for a little while, and I thought it was very interesting.
00:06:18.959 --> 00:06:27.920
I uh had really no idea what it was used for much about the other array languages, but I tried it out.
00:06:28.000 --> 00:06:32.399
I thought trains were cool, but they were too confusing for me, and so I kind of just gave up.
00:06:32.720 --> 00:06:40.160
Then later I tried Wewa, and that was actually the first array language that I seriously tried to learn.
00:06:40.399 --> 00:07:00.079
And uh I got really into that, and I still am very into it, and from there, you know, I started learning more about other array languages, VQN, APL, tiny APL actually, uh was the the first non-Weeba array language I really picked up, which is kind of funny.
00:07:00.480 --> 00:07:10.160
Eventually I I I was already sort of interested in language design at the time because a lot of the code golf community is interested in that kind of thing.
00:07:10.480 --> 00:07:20.079
I had done some little language design experiments in the past, but Fix APL was really my first serious programming language project.
00:07:20.319 --> 00:07:25.759
And I did it in July, June of last year.
00:07:26.000 --> 00:07:33.920
And you know, I had summer breaks, so I kind of just spent all day, every day working on it until I got it to how it is now.
00:07:34.240 --> 00:07:42.800
So let's uh I want to go back because I'm very curious about the the path to fix APL and the influences and the things that you liked in uh different languages.
00:07:42.959 --> 00:07:50.480
So you said that you uh were playing around with code golf languages before you kind of hit J and then Wi Won, then Tiny Apple.
00:07:50.639 --> 00:07:57.519
Were those the because I know of Jelly and I know of Vixel, I think is the name when we talked about Jelly on a ray cast.
00:07:57.680 --> 00:07:59.600
Are those the ones or is there like a whole collection?
00:07:59.680 --> 00:08:03.600
Because I'm I'm sure there's a world of golfing languages that I'm not familiar with.
00:08:03.920 --> 00:08:05.519
Yeah, I mean there are more.
00:08:05.759 --> 00:08:08.160
I I never really picked up jelly, honestly.
00:08:08.319 --> 00:08:13.680
I quite liked it, but it seemed too complicated for me to really understand.
00:08:13.759 --> 00:08:22.319
I did try Vixel, which I thought was interesting, and that maybe made it easier for me to get into Weewa because Vixel is stack-based.
00:08:23.199 --> 00:08:24.079
There were some other ones.
00:08:24.160 --> 00:08:35.039
There's one called Jept, which is basically JavaScript with a bunch of little shortcuts and just you know, golfier syntax, you don't need parentheses and things.
00:08:36.000 --> 00:08:38.240
There were a couple others, I'm trying to think.
00:08:38.480 --> 00:08:39.440
I don't know.
00:08:39.759 --> 00:08:42.240
But it was kind of mostly those, I guess.
00:08:42.480 --> 00:08:42.720
Okay.
00:08:42.960 --> 00:08:43.840
And that's yeah.
00:08:44.159 --> 00:08:46.000
And so from there you went to Jay.
00:08:46.240 --> 00:08:46.960
What are your thoughts about?
00:08:47.279 --> 00:08:55.600
I mean, you already said that you found trains confusing, but overall, like having programmed in a couple different languages, JavaScript, and then the code golfing ones, what were you what were your thoughts?
00:08:55.840 --> 00:08:59.279
Because clearly, like you got into you know array languages.
00:08:59.360 --> 00:09:07.600
Was it Weewa was the one that you really kind of sold you on the paradigm, or was it J that piqued your interest, but then you you found Weewa because it's all in the same family?
00:09:07.759 --> 00:09:11.440
Like what was your path to deciding that you wanted to write one for yourself?
00:09:11.919 --> 00:09:32.960
Well, I found J mostly just because I I knew some people who were talking about it, and uh I did really find it interesting, but I didn't totally understand arrays, how they worked with multiple dimensions, and also the syntax I thought was confusing, but it wasn't as scary to me because I'd already tried some of these code golf languages.
00:09:33.279 --> 00:09:40.000
Um but when I tried Wewa, that was when I really seriously got into the array paradigm, I would say.
00:09:40.080 --> 00:09:40.480
Yeah.
00:09:40.799 --> 00:09:43.200
That was definitely what sold me.
00:09:43.519 --> 00:09:48.320
Then from there to making a programming language myself, I'm not sure.
00:09:48.480 --> 00:09:58.799
I guess I I I started using TinyAPL and then BQN and some other array languages, and I did find those very interesting.
00:09:58.960 --> 00:10:03.279
I really liked the way APL works, just the infix nature of it.
00:10:03.600 --> 00:10:08.480
It made me realize, I guess, how different Wea really is to those.
00:10:09.120 --> 00:10:18.879
And as I was using them, I guess I sort of realized that I kind of missed some of the things about Wiwa when I was using APL.
00:10:19.200 --> 00:10:47.600
Like different things, but especially ambivalence was just something that I really found confusing, how different functions had different behaviors with different numbers of arguments, and especially the way it played into trains, how when you write a train you actually don't know what it means until it's applied, because it can have either a monadic or a dyadic form, which are totally different.
00:10:47.919 --> 00:10:55.759
And I knew a little bit about fixed air from looking at jelly and and we will, of course.
00:10:56.240 --> 00:11:10.159
And uh I just I was thinking about it and I I realized that if you did have an APL with fixed arity, you could do some very interesting stuff with trains and modifiers similar to what we will do.
00:11:10.559 --> 00:11:12.960
And I I sort of just got into it from there.
00:11:13.360 --> 00:11:23.279
I mean that is uh it's very, very interesting because as the viewer on YouTube can can see, we're staring at the character set of fixed APL.
00:11:23.679 --> 00:11:32.480
And I gotta say, I mean, we're talking we're talking about fixed APL and and your design choices, but I I they align very closely with like a lot of stuff.
00:11:32.559 --> 00:11:41.679
Like, I'll be honest, the BQN character set, I always miss the APL glyphs a lot of the time, especially IOTA, which it just warms my heart to see Iota back.
00:11:41.759 --> 00:11:42.399
IOTA's back.
00:11:42.639 --> 00:11:44.080
We do have a couple similar ones.
00:11:44.159 --> 00:11:48.159
Yeah, IOTA, we've got the selfie trying to think.
00:11:48.240 --> 00:11:49.039
What else is missing?
00:11:49.360 --> 00:11:53.200
You've got the rotate, which I guess technically BQN still has that one.
00:11:53.440 --> 00:11:56.399
But they're I in general though, I I like this.
00:11:56.639 --> 00:12:00.639
You brought back uh Eval and format, which are sorely missed.
00:12:00.879 --> 00:12:01.679
Yes, yes.
00:12:02.000 --> 00:12:03.600
In uh in in BQN.
00:12:03.679 --> 00:12:13.679
So, anyways, it's uh a lot of the stuff that I I really like that you've kind of it's I mean, it's a hybrid, probably I'm not sure if if you would agree, and maybe Adam, you can weigh in on this.
00:12:13.759 --> 00:12:18.879
Uh like this seems like the most hybrid inspired by different language.
00:12:18.960 --> 00:12:26.960
Like you can see the influence from Wiwa in that it's there's no ambivalence, and also two, like you have the same like length and shape.
00:12:27.279 --> 00:12:29.519
Yeah, there's there's characters influences.
00:12:29.679 --> 00:12:35.360
There's also the fact that you can now color these, you know, a monadic color and a dyadic color, and there's a transpose glyph.
00:12:35.519 --> 00:12:37.919
So like there's a ton of Wiwa influence at the same time.
00:12:38.000 --> 00:12:43.200
There's influences from APL and BQN, like you can see BQN glyphs in there as well.
00:12:43.360 --> 00:12:51.440
And sometimes they're repurposed for other things, like I think reverse uses the box glyph from or pear glyph from BQN.
00:12:51.519 --> 00:12:53.360
Although I'm not sure, maybe that's also in Wiwa.
00:12:53.519 --> 00:12:55.679
So I you can you maybe can tell us it's the like the boat.
00:12:56.000 --> 00:12:58.000
No, in Wi Wa is something else, yeah.
00:12:58.240 --> 00:13:00.799
I mean the boat I like a lot of this.
00:13:01.440 --> 00:13:02.240
Thank you.
00:13:02.480 --> 00:13:06.320
So I guess yeah, all to say that I I love a lot of the the influences.
00:13:06.639 --> 00:13:07.919
Oh yeah, table is another one.
00:13:08.000 --> 00:13:09.600
You've borrowed like so that's the thing.
00:13:09.679 --> 00:13:13.200
It's like it's got iota from APL, it's got table from Weewa.
00:13:13.440 --> 00:13:15.840
I mean, was Weewa the first or was it tiny apple?
00:13:15.919 --> 00:13:21.519
I I don't actually know what what language was the first one to introduce the the table outer product.
00:13:21.600 --> 00:13:34.480
Uh having a dedicated outer product symbol in in an APL, not in J, uh, has been a long time wish for many people because it has this anomalous syntax in the APL.
00:13:34.639 --> 00:13:40.000
I mean it has mixed, it has reason, historical reason, but it today it doesn't make much sense anymore.
00:13:40.399 --> 00:13:43.120
Sorry, what you said a dedicated a dedicated what glyph?
00:13:43.279 --> 00:13:45.039
So an out of outer product glyph.
00:13:45.279 --> 00:13:46.639
Oh, out of product glyph, gotcha.
00:13:46.960 --> 00:13:48.480
In in traditional APLs, right?
00:13:48.639 --> 00:13:59.039
The the syntax we have for out of products does have some amount of sense in a historical context, but in today's world it doesn't really fit in so well.
00:13:59.279 --> 00:13:59.679
Yeah.
00:13:59.919 --> 00:14:05.759
And so it's it's actually the jot that's the that's the problem more than the syntax itself.
00:14:06.399 --> 00:14:06.639
Yeah.
00:14:06.879 --> 00:14:10.000
So so that so that symbol there is an obvious symbol for table, right?
00:14:10.080 --> 00:14:11.200
It looks like a table.
00:14:11.519 --> 00:14:15.679
That's one of the symbols that has been this yeah, that has been discussed for many years.
00:14:15.919 --> 00:14:17.840
If we were to add a symbol, what would you add?
00:14:18.240 --> 00:14:20.399
I even I even discussed it with Roger Huey.
00:14:20.639 --> 00:14:24.320
Why don't we have have a or or or normalize the syntax like that?
00:14:24.399 --> 00:14:32.000
I even suggested that dyadic scan, like function backslash, doesn't have a dyadic form in in the gap.
00:14:32.639 --> 00:14:41.919
And I even suggested that we could just overload that to be the table because it sort of shows that the they can understand the diet the the backslash or sort of the diagonal going down.
00:14:42.159 --> 00:14:52.240
Uh the the if you were to do it like an equality on a YOTE sequence, you'd get the diagonal down with one's sort of outer product you think a little bit of a stretch.
00:14:52.399 --> 00:14:55.279
Yeah, and he said we don't need a symbol for for outer products.
00:14:55.440 --> 00:15:00.480
We've already got one, the rank operator, which is yeah, yeah.
00:15:00.559 --> 00:15:07.440
I mean it's I should make a YouTube video on the the what do you call it, non-uniformity of outer product.
00:15:07.600 --> 00:15:10.639
Like if you go to the omnibar, it's like the most different glyphs.
00:15:10.799 --> 00:15:12.000
Cap has a different glyph, right?
00:15:12.080 --> 00:15:20.080
It's the like the quad jot, and then we've got table, we've got APLs outer product, we've got BQNs, little, I don't even know what you call that.
00:15:20.320 --> 00:15:21.440
Oh yeah, yeah, look at this.
00:15:21.519 --> 00:15:22.320
We can even look at it.
00:15:22.480 --> 00:15:26.320
The beauty of yeah, like this one probably it's got the most what do you call it?
00:15:26.559 --> 00:15:29.200
Yeah, non-uniformity number of different glyphs.
00:15:29.360 --> 00:15:33.440
Look at that, it's even got the target, which is from Zima APL.
00:15:33.600 --> 00:15:34.320
I had no idea.
00:15:34.559 --> 00:15:35.519
I guess so, yeah.
00:15:35.759 --> 00:15:44.159
But anyways, it's fascinating that there's so many, because most languages or most glyphs don't have this this many different uh symbols for it, right?
00:15:44.559 --> 00:15:49.120
Anyway, so it's it's just uh I I really love the fact that there's just so many different things.
00:15:49.200 --> 00:15:58.799
You've got you know the before and after from BQN, you've you've got stuff from BQN, stuff from Wiwa, stuff from the OG, you know, APL 360 and also uh dialog APL.
00:15:58.879 --> 00:16:02.480
You've got the the shape, and so there's just a lot, there's a lot to like, folks.
00:16:02.559 --> 00:16:12.720
And on top of that, you've got a completely different model from all APLs that exists if you exclude Wiwa from APLs with the the fixed airity, which leads to a completely different train model.
00:16:12.799 --> 00:16:14.559
But anyways, I'm gonna stop talking.
00:16:14.799 --> 00:16:16.879
You now is is your uh time.
00:16:17.200 --> 00:16:25.360
Introduce a fixed APL to the world and wherever you want to start, and then we'll go from there and we can ask questions and explore the language after that.
00:16:25.840 --> 00:16:26.799
Okay, sure.
00:16:26.960 --> 00:16:40.720
Yeah, so fix APL absolutely, as was mentioned, influenced by a lot of languages, uh especially in the glyphs, but also things like the array model, it uses VQN's what's it, base model.
00:16:41.440 --> 00:16:42.960
So really a lot of things.
00:16:43.200 --> 00:16:56.399
But the language itself is in essence an APL with fixed alert functions, which means that instead of having each function, you can call it either monadically or dyadically.
00:16:56.879 --> 00:16:59.039
There's one way to call each function, right?
00:16:59.120 --> 00:17:05.279
And you can see it with the colors, like green shape, the shape of an array, you can only call it with one function, right?
00:17:05.359 --> 00:17:10.400
It's not overloaded to be reshaped with two, like it is in some APLs.
00:17:10.720 --> 00:17:13.519
We have a separate symbol for that, for the dyadic form.
00:17:14.079 --> 00:17:27.839
So in theory, this does mean there are twice as many symbols, but it actually ends up being less than that because when you look at a lot of the monadic forms of dyadic functions, you don't really need all of them in a language.
00:17:28.160 --> 00:17:31.680
And it's it takes sort of a similar approach to Wewa in that way.
00:17:31.920 --> 00:17:36.559
But the reason for having fixed erity, there's really three of them.
00:17:36.880 --> 00:17:43.119
The first one is that just the overloading of glyphs can be confusing.
00:17:43.359 --> 00:17:49.279
Like when you have in APL, you have what's the classic from APL?
00:17:49.440 --> 00:17:51.279
I don't know, I'm blanking on it, but like in BQ.
00:17:52.799 --> 00:18:00.160
No, but just like when you have like the ambivalence, the problem with one glyph having two meanings that are totally unrelated.
00:18:00.400 --> 00:18:04.720
Like I know in BQN there's windows and range on the same symbol.
00:18:05.119 --> 00:18:14.880
There's something like match match and depth in APL is like the or length and equals in BQN, yeah, or whatever that one is.
00:18:15.839 --> 00:18:25.440
Like not equals is is length, which kind of is honestly at least it's an educated guess, but it's just a similar glyph to tally in APL minus a lot.
00:18:26.000 --> 00:18:26.799
Simple tally, yeah.
00:18:27.119 --> 00:18:29.839
Same thing goes with equal, the equal than depth, right?
00:18:30.000 --> 00:18:39.680
So yes, it's clever in terms of the glyph, but if you're looking at it from a you know a lens of it being like consistent in any way, it doesn't really make sense.
00:18:40.000 --> 00:18:40.960
So that's one.
00:18:41.119 --> 00:18:55.279
Another one is something I got from Weewa, which is that when you do have modifiers that can look at the airities of the functions that they're passed, you do get some interesting cases.
00:18:55.599 --> 00:19:24.400
And there are a lot of ones which I can get into later, maybe, but some of the biggest ones for APL are before and after, which I got from BQN, but they are modified and they just operate rather differently because they can switch in rather than switching behavior based on the number of arguments that it's passed, it switches based on the number of arguments that each function is meant to take.
00:19:25.039 --> 00:19:28.079
So you get you know, several more cases.
00:19:28.640 --> 00:19:35.200
So you get you get a lot of compositions that are otherwise, like in tiny APL, you would need dedicated symbols for those compositions.
00:19:35.359 --> 00:19:38.480
So that gives you it gives you hooks, I I would guess.
00:19:38.799 --> 00:19:40.799
Yeah, and I think there might be a few others.
00:19:41.200 --> 00:19:42.640
But so how did that work then?
00:19:44.319 --> 00:19:56.799
The function derived from a an operator is ambivalent in principle, but determined by the operands according to some rule set, or there's a general rule for that?
00:19:57.200 --> 00:20:00.480
It's different for every operator, basically, for every modifier.
00:20:00.720 --> 00:20:08.400
But like if I have like here's an example, one before add, this is gonna just bind one to add as the left argument.
00:20:08.640 --> 00:20:19.039
And what you can do is you can look at the airity of this by making it a subject and passing it to the erity function, and you can see it is monadic there.
00:20:19.279 --> 00:20:25.279
But if you have something like I don't know, add before add, then you are gonna get a diad.
00:20:25.680 --> 00:20:34.640
And this is like writing I'm not totally sure actually, but I think it would be alpha plus omega in parentheses plus omega.
00:20:35.440 --> 00:20:36.319
I believe so.
00:20:36.799 --> 00:20:38.799
It could also be the opposite, right?
00:20:39.440 --> 00:20:43.519
There's not really there's no way for me really to tell what it what it is.
00:20:43.839 --> 00:20:47.039
I guess you have to, it says you oh, I guess I guess it makes sense.
00:20:47.119 --> 00:20:52.640
If you say plus before plus, or I mean maybe take a different uh um two different functions, plus before minus.
00:20:52.720 --> 00:21:02.400
So then the idea is we have to evaluate plus before the minus, and since it's dyadic, it has to take both arguments, so there has to be alpha minus omega in this case.
00:21:02.480 --> 00:21:10.880
Yeah, if you want to do it like that, and then then we do a plus, which has to be dyadic, so it has to take that argument on the left, and then something else on the right.
00:21:11.039 --> 00:21:16.240
Now, the thing it takes on the right could be anything, it could have been alpha, it could have been omega.
00:21:16.319 --> 00:21:22.799
There's not really any rule to say that, but it sort of makes sense that if it needs something on its right, it would be the right argument.
00:21:22.960 --> 00:21:33.759
Yeah, can I can see the reasoning so and then if you wrote minus after plus, it would be the mirror image would be alpha plus alpha minus yeah, alpha plus omega, right?
00:21:34.079 --> 00:21:35.599
Uh should be, yeah.
00:21:37.200 --> 00:21:41.039
We can't yeah, there's no you don't have a way to test stuff like that, but yeah.
00:21:41.359 --> 00:21:42.400
No, it's not hard to test.
00:21:42.480 --> 00:21:46.799
You can just make uh make this placeholder functions that spit out the results argument.
00:21:47.759 --> 00:21:50.559
Right, we can do and then three.
00:21:54.079 --> 00:21:58.960
So yeah, this is yeah, three plus five equals eight, and then three minus eight.
00:22:00.319 --> 00:22:02.400
I mean this these ones are kind of confusing, right?
00:22:02.480 --> 00:22:06.559
Because it's you're using uh two dyadic functions.
00:22:06.880 --> 00:22:07.440
Yeah, it is.
00:22:07.920 --> 00:22:11.200
I assume the ones where it's like compositions are a little weird, yeah.
00:22:11.440 --> 00:22:11.680
Yeah.
00:22:11.920 --> 00:22:24.640
Because like to have two dyadic functions with a before after means that basically one argument is getting duplicated within your you know composition and another one is just being used once.
00:22:24.799 --> 00:22:28.559
Where you have like the hooks, the hooks make a lot of sense, right?
00:22:28.640 --> 00:22:43.680
Like you've got two arguments, or well, I guess in the monadic hooks, you have one argument and then you're applying a unary function and then copying that argument and passing that to the binary operation, and then in the dyadic case, you're just applying the unary operation to only one of them.
00:22:43.839 --> 00:22:47.359
I'm assuming so here's a here's a trick to make it really clear.
00:22:47.519 --> 00:22:49.680
I think at least really clear what's happening.
00:22:49.839 --> 00:22:52.480
Can I know if I can can I send it to you somehow?
00:22:52.559 --> 00:22:56.880
Yeah I can I mean you can send it in the chat and then I can just pull up the chat.
00:22:57.440 --> 00:22:58.960
Yeah, I guess so.
00:22:59.599 --> 00:23:00.400
There you go.
00:23:00.559 --> 00:23:02.319
Or maybe Jacob should pull it up.
00:23:04.079 --> 00:23:04.480
There you go.
00:23:04.720 --> 00:23:08.160
Everyone can see uh copy that and uh everyone except me, I guess.
00:23:08.240 --> 00:23:10.400
Uh yeah, I can't see it either.
00:23:10.640 --> 00:23:15.440
We're playing with Jacob, can you can you paste that into your into your session there?
00:23:15.599 --> 00:23:17.119
Well, or do you want me to dictate it?
00:23:17.519 --> 00:23:17.839
I don't know.
00:23:17.920 --> 00:23:19.359
It's gonna be yeah, I don't know.
00:23:19.680 --> 00:23:21.359
I can dictate it to you instead if you want.
00:23:21.440 --> 00:23:22.799
It's not that yeah, that'd be better.
00:23:22.960 --> 00:23:25.119
Okay, so then we can I can also explain what I'm doing here.
00:23:25.200 --> 00:23:26.960
This is a trick that I use in dialogue APL.
00:23:27.119 --> 00:23:28.400
It's it works very well here as well.
00:23:28.480 --> 00:23:32.160
So you write uh quote X quote, open brace.
00:23:32.319 --> 00:23:34.079
I don't know how what do you call that ligature?
00:23:34.160 --> 00:23:42.640
Okay, so alpha ligature quote F quote uh ligature omega before or close, sorry, close brace.
00:23:42.880 --> 00:23:50.720
You want to do close brace first, and before, and then write the same thing again, but with a uh the same brace thing again, but with a G instead of F.
00:23:50.799 --> 00:23:52.799
You can just copy and paste it if you want.
00:23:53.599 --> 00:23:56.480
Yeah, and then a Y at the end in quotes.
00:23:56.720 --> 00:23:57.119
Okay, okay.
00:23:57.279 --> 00:23:58.319
Yeah, yeah, okay.
00:23:58.480 --> 00:24:05.680
So what's happening here is that the structure shows us the what happened, right?
00:24:06.160 --> 00:24:07.920
If I'm not mistaken, right?
00:24:08.000 --> 00:24:12.799
So we can so we can see that we got uh the uh it's sort of a fork, right?
00:24:12.960 --> 00:24:15.680
The middle time is the g, that's the top level function.
00:24:15.839 --> 00:24:19.359
It we've got xfy on the left and just the y on the right.
00:24:19.519 --> 00:24:27.119
And if you go and recall this statement and then replace the before with an after, then we get we can see what happens when you use that other composition.
00:24:27.200 --> 00:24:29.359
And we can do we can do this with every composition, right?
00:24:29.440 --> 00:24:31.759
You can do this with over, and so yes, yes.
00:24:32.000 --> 00:24:38.079
And then you can replace the the operands with monetic functions instead, and then we can see exactly what's going to happen.
00:24:38.319 --> 00:24:38.960
Yeah.
00:24:39.279 --> 00:24:47.759
There's with monadic left and so this is a dyadic application of monadic f after dyadic G.
00:24:48.079 --> 00:24:48.319
Yeah.
00:24:48.640 --> 00:24:49.920
So we can so that's on the top.
00:24:50.160 --> 00:24:50.400
Yeah.
00:24:50.720 --> 00:24:52.720
Or now it is interesting here.
00:24:53.039 --> 00:24:53.200
Yeah.
00:24:53.359 --> 00:24:56.400
What happens if you replace this with uh the other one?
00:24:59.119 --> 00:25:00.559
So this makes sense as well.
00:25:00.720 --> 00:25:02.880
This is a this is a a hook.
00:25:03.119 --> 00:25:04.000
Dyadic hook, right?
00:25:04.079 --> 00:25:06.880
Or beside or beside if you want, yeah, dyadically.
00:25:07.119 --> 00:25:09.680
And so uh yeah, all of them.
00:25:09.920 --> 00:25:10.799
So what we can?
00:25:10.880 --> 00:25:16.000
What happens if you both sides are monadic and but you still have a dyadic derived one?
00:25:16.319 --> 00:25:18.880
Uh well then it didn't like that.
00:25:19.039 --> 00:25:19.519
Yeah, okay.
00:25:19.599 --> 00:25:20.799
So that that's an invalid tool.
00:25:22.880 --> 00:25:27.519
Yeah, because well, I couldn't figure out how what there's nothing sensible you could do with this, I agree.
00:25:27.680 --> 00:25:28.000
Yeah.
00:25:28.240 --> 00:25:29.759
But they I think this is a pretty cool tool.
00:25:29.839 --> 00:25:36.000
You should almost add that so you can like translate my my tacit so to to understand what the combinations do.
00:25:36.319 --> 00:25:41.200
Because then maybe this isn't interesting because uh go ahead.
00:25:41.440 --> 00:26:02.000
This isn't this is an interesting case because you have the before with monadics on both sides, which means that you end up having G being applied after, which makes sense, but it just ends up being looking a little weird here because you have it getting past the function on the left as its right argument.
00:26:02.160 --> 00:26:12.480
So but that that could actually be really useful because sometimes you want a I I I don't know, but I my guess is that your your combinator bindings, or what do you call them?
00:26:12.559 --> 00:26:16.400
They are like an APL, so they bind with a long left scope.
00:26:16.559 --> 00:26:27.920
Yeah, that sometimes you want a the you want on the top, but the right function in that top, the one you're applying first, is derived in itself, but the left one is not, and then you have to use parentheses.
00:26:28.079 --> 00:26:30.319
But this actually allows you to swap the order.
00:26:30.640 --> 00:26:31.599
Yes, it is very nice.
00:26:31.680 --> 00:26:35.359
It's a little bit like reverse the top in dialogue 20, right?
00:26:35.680 --> 00:26:37.200
Or maybe I'm misremembering.
00:26:37.599 --> 00:26:39.759
No, you can't we don't have that.
00:26:40.000 --> 00:26:42.400
Yeah, it's not it that doesn't it doesn't do that.
00:26:42.880 --> 00:26:51.359
But but an example of that, just as a as a uh as an silly example of it, is the negation of the sum, right?
00:26:51.440 --> 00:26:53.359
So I assume that sum is plus slash.
00:26:53.920 --> 00:27:04.240
Oh yeah, so you would do like this as sum before negation, which actually reads it very nicely.
00:27:04.559 --> 00:27:05.119
Yeah.
00:27:05.359 --> 00:27:11.359
So if you take the sum, that would be one plus two plus three, which is six, and then you negate it so you get negative six.
00:27:11.680 --> 00:27:17.440
Of course, if you negate first, it will give the same result, but that's yes irrelevant for our our purposes here.
00:27:17.599 --> 00:27:19.279
But you couldn't otherwise write this.
00:27:20.079 --> 00:27:20.400
Yeah.
00:27:20.880 --> 00:27:21.759
I don't know what that is.
00:27:21.920 --> 00:27:22.400
Contents.
00:27:22.799 --> 00:27:24.079
Yeah, that is content.
00:27:24.240 --> 00:27:29.440
So that's sort of a a weird thing that's not really specific to fixterity, I guess.
00:27:29.519 --> 00:27:31.920
It's just something I decided to have in fixed APL.
00:27:32.000 --> 00:27:36.079
But because it is well, it is sort of related to fixterity.
00:27:36.319 --> 00:28:09.759
In BQN, the reduce function has it takes the it operates on the cells of its the array that it's passed, which makes sense, but when you have a list, it makes sense for higher rank, but when you have a list, you have the cells of a list are rank zero arrays instead of the atoms of the risk the list, which is a little complicated, but it ends up being that if you just plus reduce a list, you end up with a rank zero array containing your results.
00:28:09.839 --> 00:28:12.960
So you need to use content to get it as an actual number.
00:28:13.279 --> 00:28:15.039
Isn't that why you've got fold?
00:28:15.599 --> 00:28:24.160
Well, see, it's different because in in fix APL, fold is actually what Weewa calls fold.
00:28:24.319 --> 00:28:24.960
It's different.
00:28:25.200 --> 00:28:34.400
So fold in Wiwa is for setting an initial argument as the beginning of the reduction.
00:28:34.880 --> 00:28:36.160
So it's a little confusing.
00:28:36.240 --> 00:28:39.039
That's why I want to write docs, but I haven't gotten to them yet.
00:28:39.279 --> 00:28:40.880
But who needs docs?
00:28:41.359 --> 00:28:42.559
You need more APLs.
00:28:42.640 --> 00:28:43.200
That's what we need.
00:28:43.279 --> 00:28:45.200
I'd rather have more APLs than docs.
00:28:45.839 --> 00:28:50.880
Yeah, currently we've got documentation fourfold as the docs, if that's what you're looking for.
00:28:50.960 --> 00:28:52.400
So now we know.
00:28:52.720 --> 00:28:53.200
Yeah.
00:28:53.519 --> 00:28:56.160
So that's I guess one thing to keep in mind.
00:28:56.240 --> 00:29:26.799
I'll I'm I might redesign it at some point, but it's a bit weird because if you want to have reduce as you want to have a version of reduce that does this content thing automatically for you, you need to have two versions of each of these reductions, or not necessarily all of them, but it it just gets weird because like then do you want to have a content version of the dyadic reduce, or do you want a content version of scan?
00:29:27.039 --> 00:29:30.799
Actually, I don't think you need it for scan, but it's a bit weird.
00:29:31.279 --> 00:29:35.839
All right, let's take a step back just so that we uh we're putting the uh what do you call it?
00:29:35.920 --> 00:29:37.359
Uh audio only listener.
00:29:37.519 --> 00:29:40.000
We'll we'll save them from the water, put them in a lifeboat.
00:29:40.079 --> 00:29:42.640
They might still be like drowned, but that's fine.
00:29:42.799 --> 00:29:50.799
So let's uh because I I totally haven't mapped all the definitions of of the glyphs before and after that we were talking about.
00:29:50.960 --> 00:30:04.240
So if you got lost in that conversation, dear listener in you know Spotify or Apple Podcasts or wherever you're listening, we were talking about the you know glyphs that BQN, I think, initially had, which are very beautiful for before and after.
00:30:04.319 --> 00:30:23.359
And in BQN, because you have ambivalence, you end up with basically monadic and dyadic definitions of these, which map to the hook and back hook in both monadic and dyadic versions, which correspond to like I believe it's the S and the Sigma and the D and the Delta.
00:30:23.680 --> 00:30:41.920
So we saw that basically because we don't have ambivalence and fixed APL, you can think of the of having you've got two glyphs, your before and after still, but you can have a monadic or dyadic function on both the left and right of each of these glyphs.
00:30:42.079 --> 00:30:52.240
And so correct me if I'm wrong, I guess one of them didn't have defined definition, but all the others meaning you know, monadic actually, all of them are defined.
00:30:52.640 --> 00:30:53.359
All of them are defined.
00:30:54.160 --> 00:30:59.680
Yeah, there was one where I there was a residual thing that caused an error, but okay.
00:31:00.880 --> 00:31:05.920
So can we rewind and just go walk through what you know, monadic before dyadic, dyadic?
00:31:06.319 --> 00:31:07.920
But there's so many combinations, right?
00:31:08.000 --> 00:31:10.319
Because I mean we gotta know every listener wants to know.
00:31:12.400 --> 00:31:21.119
There are two possibilities on the left times two possibilities on the right, times two possibilities on the derived or the usage of the derived function.
00:31:21.440 --> 00:31:23.039
I saw I heard two times too.
00:31:24.880 --> 00:31:26.799
Okay, so it's so it's only it's only four possibilities.
00:31:33.519 --> 00:31:40.720
I was calling it dyadically with x on the left, and that's why it was erroring, because it's only allowed to be called monadically.
00:31:40.960 --> 00:31:41.279
Right, right.
00:31:43.519 --> 00:31:50.880
But can you can you can you predict the if I tell you that I've got in my hand a uh what do we call what do you call them?
00:31:50.960 --> 00:31:52.799
You call them combinators, what do you call them?
00:31:52.960 --> 00:31:54.079
Uh I guess.
00:31:54.400 --> 00:31:55.119
Or modifiers.
00:31:55.440 --> 00:31:56.880
I've got a two a two modifier.
00:31:56.960 --> 00:32:00.400
I mean if I I got in hand my my my two modifier.
00:32:00.720 --> 00:32:08.960
You I um I won't tell you which to modifier it is, and now we're giving it a monetic left operand and a diadic right upper end.
00:32:09.039 --> 00:32:11.039
Can you predict there's no generic rule?
00:32:11.440 --> 00:32:14.400
Okay, so there is a little bit of different for each modifier, yeah.
00:32:14.960 --> 00:32:21.119
You can't you have to look at the definition of the modifier in order to know the arity of the derived function.
00:32:21.200 --> 00:32:31.279
So you've sort of pushed off the problem of APLs and Bivalence to derived functions, that you have to know the function itself to know the aerity of the derived function.
00:32:31.599 --> 00:32:32.480
I guess so.
00:32:32.720 --> 00:32:42.319
Well, you need to know the airity of each of the functions that are passed to the modifier, and you have to know what the modifier's behavior is for those airities.
00:32:42.480 --> 00:32:43.359
So yeah, I guess so.
00:32:43.680 --> 00:32:45.359
But I I mean I feel like this is unfair.
00:32:45.599 --> 00:32:52.000
If I understand the critique that Adam's making, I feel like it's unfair because all of this is perfectly knowable, right?
00:32:52.079 --> 00:32:56.640
Like you can't look at the ambivalent APL expression and know without context.
00:32:56.720 --> 00:33:08.079
But like as long as you know what before and after do, which is if you see the context, if I don't know the meaning of the symbols, but I know their syntactic class, which is a problem in API, I'll give you that.
00:33:08.160 --> 00:33:23.839
In BQN, you do know the syntactic class of every symbol and every user-defined thing as well, because that's apparent either from the symbols sort of look or from the name of the thing you're calling, or from the uh content of the actual code that's between the braces.
00:33:24.000 --> 00:33:35.039
But if you know the the airity of of everything that you're looking at, but you don't know what they mean, meaning what they actually do, you still can completely parse what you've got in front of you.
00:33:35.200 --> 00:33:39.599
But here you have to know the meaning of the symbol in order to parse.
00:33:39.920 --> 00:33:40.559
That's true.
00:33:40.640 --> 00:33:42.640
Only for the modifiers, but yeah.
00:33:43.119 --> 00:33:44.000
No, I got lost.
00:33:44.319 --> 00:33:49.920
But you still want to take it again, kind of the uh you have to know the so we're talking about parsing now.
00:33:50.079 --> 00:33:52.079
I was talking about like readability effects.
00:33:52.160 --> 00:33:54.799
Well, we're talking about alias here, right?
00:33:54.880 --> 00:34:02.720
If you give an alias now, I don't know if you can do that, but can you give a name to a dietic uh or a two modifier in in no, I didn't add that.
00:34:02.960 --> 00:34:04.319
Okay, but let's say we could.
00:34:04.480 --> 00:34:06.160
It means you can't define your own either, right?
00:34:06.240 --> 00:34:08.159
Because I don't see any symbol for operating.
00:34:08.400 --> 00:34:09.360
No, there's no, yeah.
00:34:09.519 --> 00:34:15.280
I wanted to add it at some point, but it's a little complicated to know the semantics of how it should work when you have fixedity.
00:34:15.760 --> 00:34:20.639
But but Connor, imagine here where it says uh where it says after, right?
00:34:20.800 --> 00:34:21.760
In the input line.
00:34:22.400 --> 00:34:36.960
If if it were hiding that symbol and instead we wrote uh mod two or something, something we had defined that was a two modifier that could that did something, you wouldn't know whether it was valid to give a left argument to this derived function or not.
00:34:37.119 --> 00:34:38.159
You simply can't know.
00:34:38.639 --> 00:34:39.199
That's true.
00:34:39.440 --> 00:34:48.320
And you've got if you've got a black box to modify here, meaning you can't inspect the code because whatever reason, however it's implemented, then you simply can't parse.
00:34:48.719 --> 00:34:49.840
Parsing stops here.
00:34:50.159 --> 00:34:56.400
There's no way for you to know whether it's valid to give a a left argument or not to this to this derived function.
00:34:56.639 --> 00:35:01.039
In APR, you have any black box ones, so no, no, I understand there can't be right.
00:35:01.199 --> 00:35:06.559
Currently it's not a problem because this is there's a limited set of modifiers and you cannot add more.
00:35:06.800 --> 00:35:08.880
But yes, I see what you're saying, yeah.
00:35:09.280 --> 00:35:15.920
Uh I'm I I'm still I I kind of get what Adam's trying to the point Adam's trying to make.
00:35:16.000 --> 00:35:40.000
But so you're saying that that that you because like what is the underlying problem here is that because these modifiers, based on the airity that they're passed, can generate different airity functions, you then end up in like ambiguity ambiguity land where but like well it's it's it's not that it's not ambiguous as such, it's just that they can choose by their definition what they do, right?
00:35:40.079 --> 00:35:57.360
They internally we could we could set have a uh a mental model of these combinators where as soon as you enter the code by them, there's a a table or a case statement if you want, where it says, Okay, what are the valences of my operands?
00:35:57.440 --> 00:35:59.679
And then it goes down and chooses what to do.
00:35:59.760 --> 00:36:04.079
And what it chooses to do is either strictly monetic or strictly dyadic.
00:36:04.159 --> 00:36:05.599
But that table is arbitrary.
00:36:06.079 --> 00:36:08.719
There's no way for you to predict it, you just have to know.
00:36:09.440 --> 00:36:09.760
Yes.
00:36:10.000 --> 00:36:14.880
Although it's it's pretty simple for most of them after and before uh don't get me wrong.
00:36:14.960 --> 00:36:17.039
I I think this is beautiful, I think it's amazing.
00:36:17.119 --> 00:36:25.840
It it it allows all those sort of less usual constructions to be expressed very neatly with a small number of combinators.
00:36:26.000 --> 00:36:26.800
Don't get me wrong.
00:36:26.960 --> 00:36:31.840
It's just I just noticed that there isn't things aren't as fixed as you might think they are.
00:36:32.159 --> 00:36:40.719
Uh I'm still I'm still confused because now you're saying so you're saying that the set of stuff that was chosen in this table that's being dispatched is arbitrary?
00:36:41.119 --> 00:36:42.960
I mean, that if isn't everything arbitrary?
00:36:43.039 --> 00:36:44.000
Why did we choose two trees?
00:36:44.800 --> 00:36:47.440
We can come up with alternative definitions that are equally valid.
00:36:47.760 --> 00:36:59.679
The point is that like if instead of before here I had a two here, right, which is my dyadic modifier, then you can't know whether this resulting function is monadic or dadic.
00:36:59.760 --> 00:37:00.880
Like it just stops here.
00:37:01.199 --> 00:37:01.519
Yeah.
00:37:01.840 --> 00:37:05.760
Oh, here's an example that'll make methods in the language, but right.
00:37:05.840 --> 00:37:06.639
Not the other thing.
00:37:06.800 --> 00:37:13.360
This is because you don't have the stuff that Tiny Apple and BQN have where they have like uh No, it's it's not even that.
00:37:13.440 --> 00:37:25.440
I mean, sure, even if I did, it wouldn't it wouldn't change anything because this, like if we assign this to foo, you don't know if foo is monadic or dyadic.
00:37:25.599 --> 00:37:28.480
Like you don't know if you would call it with like this or with this.
00:37:28.960 --> 00:37:33.199
It depends on mod two, which might not yeah, which might not be decided yet.
00:37:33.280 --> 00:37:34.880
So it's not statically parsable.
00:37:34.960 --> 00:37:37.199
It has to be, you have to know everything.
00:37:37.440 --> 00:37:40.400
But but something that here's an example that makes this very clear.
00:37:40.639 --> 00:37:42.960
Something that will make Madeline really excited here.
00:37:43.599 --> 00:37:49.679
The over operator is is the crossover thing when you make dyadic dyadic.
00:37:49.760 --> 00:37:52.400
So normally we do over, the right operand is monadic.
00:37:52.480 --> 00:37:54.000
It's a pre-processing function, right?
00:37:54.159 --> 00:37:57.280
Do this function f but pre-process the arguments with y.
00:37:57.440 --> 00:38:10.800
But if you give it a dyadic function over dyadic function, then it does what Madeline's yeah, her uh yeah, it does the swapped uh application of of G, F, the normal application of G.
00:38:11.199 --> 00:38:17.679
We can actually you can type this up if you go and take the previous statement we did with the whole pattern thing to make it say what it does.
00:38:17.760 --> 00:38:19.199
Yeah, we could write like this as well.
00:38:19.360 --> 00:38:21.360
Yeah, okay, that's this makes it clear, right?
00:38:22.400 --> 00:38:30.000
But now there's we say that the swapped version is on the oh, where's the swapped version on the right here?
00:38:30.159 --> 00:38:31.280
I thought it was on the left.
00:38:31.760 --> 00:38:32.960
Oh no, Q is on the left.
00:38:33.119 --> 00:38:33.360
Okay, yeah.
00:38:34.079 --> 00:38:42.000
So you see, you have you see the reversed version is on the left, and the normal version is on the right, but it might as well have been opposite, right?
00:38:42.079 --> 00:38:43.599
That's completely arbitrary.
00:38:43.760 --> 00:38:48.719
Uh which what it does with its operand, that's the definition of the over.
00:38:49.119 --> 00:38:55.920
Now, the fact that it is is dyadic that sort of makes sense here, especially since over basically only makes sense like that.
00:38:56.000 --> 00:39:00.639
But it's but it's still arbitrary what it the how it chooses to pipe the arguments in.
00:39:00.800 --> 00:39:12.639
In the same way with any way it uses the arguments, in principle, it we the before and after, for example, could be defined as ignoring the left argument and only using the right argument the appropriate number of times for the operands.
00:39:12.719 --> 00:39:14.960
It makes no sense to define them like that, but you could.
00:39:15.840 --> 00:39:16.719
I guess so.
00:39:17.199 --> 00:39:29.679
And and and that also means that if you had the addict function, sort of after the addict function, you it could have been a a strictly monetic derived function that just uses the right argument over and over and over and over.
00:39:30.000 --> 00:39:35.119
Could have been, it doesn't make so much sense, but you sort of had to learn these patterns, and I find it really neat.
00:39:35.360 --> 00:39:40.000
It's the same as the therapist F after G self.
00:39:40.320 --> 00:39:41.039
Yeah, yeah, yeah.
00:39:41.280 --> 00:39:42.559
Okay, no, right, you could do that.
00:39:43.039 --> 00:39:46.079
And and it that makes more sense and is more readable and so on.
00:39:46.239 --> 00:39:52.079
But I'm I'm just trying to communicate that it is sort of arbitrary how the plumbing is is working out, yeah.
00:39:52.400 --> 00:40:02.239
Whereas the the BQN and APL operators are completely predictable in how they treat the argument, they're just patterns of application.
00:40:02.480 --> 00:40:04.800
And you can apply the result either monetically or daddy.
00:40:05.039 --> 00:40:08.960
Might not work for those operands, but it does, but you can certainly do it.
00:40:09.440 --> 00:40:09.840
Yes.
00:40:10.079 --> 00:40:17.280
But now we need a a in the documentation or some some auxiliary site, uh, I don't know, fixable cart, uh, or something like that.
00:40:17.440 --> 00:40:23.840
Yeah, we need this grand table of all the compositions and and what they derive exactly.
00:40:23.920 --> 00:40:24.639
That would be really good.
00:40:24.800 --> 00:40:25.760
Yes, that's a good idea.
00:40:25.920 --> 00:40:27.280
I should I should add that.
00:40:27.599 --> 00:40:36.000
I haven't I mean there's sort of uh inter implementation detail, but it actually the parsing isn't static.
00:40:36.400 --> 00:40:38.639
It is totally possible to do statically.
00:40:38.800 --> 00:40:41.360
I just kind of didn't implement it that way.
00:40:41.679 --> 00:40:55.599
So in fact, like it's impossible to write anything that can't that you can't you couldn't determine statically, but because of the way I implemented it, like this actually well actually, I don't know, it's sort of hard to explain.
00:40:55.679 --> 00:40:59.840
I'm not sure how relevant it is, but like this, there isn't actually a lookup table.
00:41:00.000 --> 00:41:07.360
Like it it does it literally returns a function that has this definition of that does.
00:41:08.239 --> 00:41:10.960
Ah does this you can capture that capture that.
00:41:11.119 --> 00:41:12.719
No, I think I think it does make sense.
00:41:12.800 --> 00:41:24.639
That it's not it doesn't it doesn't it's not lazy and waiting for for you to call it if before it goes into the combinator code, rather it immediately returns a function that that does that thing, that does that pattern.
00:41:24.880 --> 00:41:33.280
And I think it's neat there's a there's a there's a huge potential for uh we could say overloading if you want, despite your best efforts, right?
00:41:33.440 --> 00:41:39.519
Because there are lots of arities of the right functions that are not defined, but certainly could be defined.
00:41:40.480 --> 00:41:45.920
Yeah, or like like with over, over the left function has to be dyadic, right?
00:41:46.000 --> 00:41:48.400
It'll error if you put a monadic function here.
00:41:49.840 --> 00:42:01.760
But in theory, I could define two new, you know, a new modifier here where the left function has to be di monadic and there could be two new cases here.
00:42:02.079 --> 00:42:04.960
It wouldn't make sense for it to be called over, but I could.
00:42:05.199 --> 00:42:07.599
You know, that's empty syntactic space.
00:42:08.000 --> 00:42:08.400
Yeah.
00:42:08.719 --> 00:42:11.679
Well, it has to be a separate operator, right?
00:42:11.920 --> 00:42:14.480
Because uh how does it work there?
00:42:15.760 --> 00:42:29.599
So is it is it the case that every operate every operator with a particular set of monetic dadic operands has to return the static arity of derived function.
00:42:31.039 --> 00:42:31.440
Right.
00:42:31.599 --> 00:42:33.039
I think that's the case, Eril.
00:42:33.199 --> 00:42:35.679
I don't know if I expressed that in a way that was understandable at all.
00:42:36.079 --> 00:42:39.119
Um yeah, I've been lost since I said the last time I was lost.
00:42:39.440 --> 00:42:41.199
It's not it's not Jacob's fault.
00:42:41.280 --> 00:42:42.400
It is Adam's fault.
00:42:42.559 --> 00:42:49.440
Although actually it's probably the array cast disbanding's fault, because usually I used to just be the moderator and I get confused all the time.
00:42:49.599 --> 00:42:57.440
But now I'm half of a panel of which, you know, I'm only like a blue belt or whatever is a couple levels before below a black belt.
00:42:57.760 --> 00:43:00.880
Let's because I if I'm confused, I guarantee a couple listeners.
00:43:00.960 --> 00:43:02.880
Although, I mean, I'm looking at the YouTube chat.
00:43:03.039 --> 00:43:08.719
We've got Kai, we got Max, we got Madeline, we got like implementers and creators.
00:43:08.800 --> 00:43:12.159
So potentially I'm the only one that's confused right now.
00:43:12.480 --> 00:43:24.800
So here's my here's my main thing where I'm I'm hung I'm hung up on is that I hear that like it's there's some arbitrariness, but in my head I'm going, like, isn't aren't the semantics that are attached to everything arbitrary?
00:43:24.880 --> 00:43:35.199
I mean, not really, but yeah, we at we attach semantics to things, and I do understand that some of these glyphs can result in either a monadic or dyadic derived function.
00:43:35.360 --> 00:43:42.079
And I guess is the point here that like in WiWAT, Tiny Apple, BQN, like you you don't have that.
00:43:42.239 --> 00:43:50.559
This is a new thing, and that's what's confusing because from my point of view, yes, there's overloading of the airity that can be passed to these modifiers.
00:43:50.719 --> 00:43:52.719
But to me, that is not confusing.
00:43:52.880 --> 00:43:56.159
That is a set of rules that you learn as a part of learning the language.
00:43:56.239 --> 00:44:01.519
And yes, if it's monadic before dyadic or dyadic before manadic, Fanatic, that's not confusing to me.
00:44:01.679 --> 00:44:05.840
You learn those rules the same way that you learn how to parse two trains and three trains.
00:44:05.920 --> 00:44:15.840
But like the problem with you learn how to parse two trains and three trains in these array languages, and then you still can't know what the function does at the end of the day because you need extra context.
00:44:16.000 --> 00:44:29.360
Whereas here, you learn the overloading of the before and the after and the different modifiers, and like you know that table, and now with the knowledge of that table in your head, you look at the airity pattern, and then like you can just learn what it means.
00:44:29.440 --> 00:44:30.480
So that's what I'm hung up on.
00:44:30.559 --> 00:44:41.519
Is it sounds like there's some kind of thing where we're saying, oh, this is arbitrary, but like is it just that the arbitrariness is the rules that we attached to the modifiers and that you have to learn them?
00:44:41.599 --> 00:44:45.119
Because like that is perfectly knowable like knowledge that you can learn.
00:44:45.280 --> 00:44:52.719
Anyways, that's where I'm I'm confused, is like I feel like I'm missing a thing that, like, yes, I understand you can end up with a dyadic or monadic derived function.
00:44:52.880 --> 00:44:53.840
I don't see a problem with that.
00:44:54.000 --> 00:44:57.679
Sure, for a for maybe that makes as a language implementer it harder to parse.
00:44:57.840 --> 00:44:58.880
Not my problem as a user.
00:44:58.960 --> 00:44:59.920
That's Jacob's problem.
00:45:00.000 --> 00:45:01.679
He figured out how to do that, not my problem.
00:45:01.840 --> 00:45:06.400
And I guess it's also Adam's problem because he is head of language design for a dialogue.
00:45:06.480 --> 00:45:11.599
So it's everybody's problem but the guy who's not designing the language, which is why I'm sitting here being like, this is fantastic for me.
00:45:11.760 --> 00:45:16.800
Anyways, please, and and uh the someone in the chat did say I'm I'm confused without the deal.
00:45:17.760 --> 00:45:19.599
So I'm not the only one I appreciate it.
00:45:20.239 --> 00:45:28.639
I I I think I think we can compare this a little bit to something that appears in J, and I think also in Sharp APL, old Sharp APL.
00:45:28.960 --> 00:45:44.880
So in in or in dictionary of APL that Iverson wrote, he wrote about something called function rank, which for every function you define a a monetic daddy ranks, and it's sort of like having the rank operator implicit.
00:45:45.360 --> 00:45:50.719
So for example, the plus function is is very simple, it's rank zero zero.
00:45:50.880 --> 00:45:57.280
That means it applies, it's sort of conceptually applies loopingly to every subarray of rank zero.
00:45:57.599 --> 00:46:03.199
But other arrays, uh sorry, other functions have apply to bigger ranks.
00:46:03.360 --> 00:46:08.960
So a very strict example would be the matrix inversion function.
00:46:09.119 --> 00:46:19.920
So matrix inversion only makes sense on matrices in traditional APLs, including that I give today, if you try to apply it on something that's higher rank than two, you just get an error.
00:46:20.239 --> 00:46:25.039
According to Iverson, the functional rank of matrix inversion is two.
00:46:25.280 --> 00:46:26.400
It applied to matrices.
00:46:26.480 --> 00:46:32.000
If you apply it to an array of higher than two, it's as if you wrote function inversion rank two.
00:46:32.239 --> 00:46:34.639
So it just splits up the array into arrays of rank two.
00:46:34.960 --> 00:46:54.159
Here too, in the documentation for the uh for the uh modifiers, you would write, for example, that this modifier has the right function valence, or come up with some fancy name for that, equivalent to alpha under bar, is that right, or uh omega under bar.
00:46:54.639 --> 00:47:03.599
So you say, so for example, we know that that over has to has the valence of the left operand, and the left operand has to be dyadic.
00:47:04.079 --> 00:47:08.239
So therefore, the all derived functions from over are dyadic.
00:47:08.639 --> 00:47:16.400
But before also has the the derived valence of the left operand, but it's unbounded.
00:47:16.480 --> 00:47:24.800
So you can set the you can use any valence left operand, but then you can predict the the right function will have that same valence as the left operand.
00:47:24.880 --> 00:47:26.079
And the right operand doesn't matter.
00:47:26.239 --> 00:47:29.119
The meaning matters with the right operand, but the valence doesn't.
00:47:29.280 --> 00:47:30.880
So did I get that right, Jacob?
00:47:31.119 --> 00:47:31.840
I believe so.
00:47:32.079 --> 00:47:32.480
Yeah.
00:47:32.639 --> 00:47:33.039
Yeah.
00:47:33.119 --> 00:47:36.159
I'm I'm not sure, honestly, I'm starting to get confused.
00:47:36.400 --> 00:47:39.199
But we're losing everyone.
00:47:40.000 --> 00:47:41.039
Okay, yeah.
00:47:41.440 --> 00:47:47.599
I mean Madeline in the chat, Madeline in the chat said in APL you can't know what a function does if you don't know how it's called.
00:47:47.760 --> 00:47:55.199
And in fixed APL, you can't know how a function is parsed if you don't know the airities of the identifiers referred in it.
00:47:55.519 --> 00:47:55.840
Yeah.
00:47:56.079 --> 00:47:59.920
Oh no, but you do know that the airity of the identifiers referred in, right?
00:48:00.079 --> 00:48:01.039
Yeah, yeah, you do.
00:48:01.519 --> 00:48:03.679
So yeah, that's what I'm thinking.
00:48:03.920 --> 00:48:04.960
We know the arities of everything.
00:48:05.440 --> 00:48:06.320
That's either blue or green.
00:48:18.159 --> 00:48:20.639
Yeah modifiers, you have to use these underscores.
00:48:20.719 --> 00:48:47.599
If there was an equivalent of that for functions, like if I had to write underscore foo underscore equals plus, or like if we defined this dyadic foo to like if every dyadic function has to be written like this with the delimiters like that, then yeah, it would be I guess more it would be yeah, less ambiguous, but that sort of defeats the purpose.
00:48:47.840 --> 00:49:01.199
Oh wait, hold on, but are you saying that there's there's no you can't I can tell in an APL symbol what herity it has by my internal dictionary of which ones do what, but I can't tell in a user-defined name what if it's monadic daddy.
00:49:01.280 --> 00:49:04.400
I just realized now because I haven't played around with it, they all look the same, right?
00:49:04.800 --> 00:49:09.119
Yeah, like if I write foo is plus, right?
00:49:09.280 --> 00:49:12.880
Yeah, uh oh, for some reason it's not highlighting, I don't know why.
00:49:13.039 --> 00:49:15.760
Um okay, that was a weird glitch.
00:49:15.840 --> 00:49:16.719
I'll have to fix that.
00:49:16.880 --> 00:49:20.719
But it's highlighted in blue, which tells you that it's dyadic.
00:49:20.800 --> 00:49:28.960
But if you didn't have any highlighting and you just saw foo, you don't know what its arity is unless some language where it was written like this.
00:49:29.280 --> 00:49:29.920
Right, exactly.
00:49:30.000 --> 00:49:33.119
And now if you use foo in the derived function, you really don't know what's going on.
00:49:33.280 --> 00:49:39.760
If you write foo over bar, you have no idea whether the derived function is monetic or daddy because it depends on the errority of foo.
00:49:40.000 --> 00:49:42.719
So you can't statically parse this.
00:49:43.039 --> 00:49:43.920
That's why that's the same.
00:49:44.079 --> 00:49:47.519
Yeah, once again, this seems this seems like an implementer versus user thing.
00:49:47.599 --> 00:49:50.800
Because like I'm thinking like we only have fixed aerity functions.
00:49:50.960 --> 00:49:56.239
So like don't text it, I let you have fixed aity all over the place, even if I can't tell.
00:49:56.400 --> 00:50:05.119
Well, I guess that is gets back to the readability thing, but like assumably, yeah, like it whatever you do a subscript one, two, or the underscore before and after.
00:50:05.360 --> 00:50:14.880
If you make it some way, like we do, it's not like you're gonna end up in a situation where the function can either be monadic or dyadic, and therefore we now are in back in like APL land.
00:50:15.039 --> 00:50:20.800
It's always gonna just have either oh, except do you well let me ask another couple of questions.
00:50:20.960 --> 00:50:29.679
Do you have I haven't tried this, but do you have like defenguards where you where you can return something based on the return now based on the condition?
00:50:29.920 --> 00:50:30.239
No.
00:50:30.880 --> 00:50:34.800
So that I will there's no reason not to have them, I just didn't add them.
00:50:35.039 --> 00:50:45.119
Well, there is because you if your functions can return functions and you can have guards, then a function can return but a function that returns a function, it returns the function in subject position.
00:50:45.280 --> 00:50:52.000
And then so that that that's maybe a good thing to mention is like say I have this list which contains plus.
00:50:52.480 --> 00:51:00.960
If I get the first element of plus, it's this, but I can't it is plus the first element of the list, but I can't remember.
00:51:02.400 --> 00:51:02.719
I see.
00:51:02.800 --> 00:51:04.159
Yeah, because you have to activate it.
00:51:05.199 --> 00:51:10.559
I have to use this diad uh this modifier dyad, which lets me call it.
00:51:11.280 --> 00:51:13.760
What happens if you call it with a monad modifier?
00:51:14.320 --> 00:51:17.679
Then uh I don't remember if it errors or if there's coercion.
00:51:18.320 --> 00:51:20.000
Yeah, I I guess it errors.
00:51:20.239 --> 00:51:20.800
I see.
00:51:21.119 --> 00:51:23.679
Wait, so walk us through what we just introduced here.
00:51:23.760 --> 00:51:30.159
You've got subscript 0, 1, and 2, which is for I'm assuming nilad, monad, and dyad, and these are modifiers?
00:51:30.639 --> 00:51:35.119
Yeah, so there are these monadic modifiers, subject, monad, and dyad.
00:51:35.519 --> 00:51:50.239
And the idea is you can use them to move functions from the subject position to the function position, basically, which is sort of a a weird thing to explain.
00:51:50.320 --> 00:51:59.920
But if you have one plus two, this is gonna work because the plus is in the position of a dyadic function, and it just knows that.
00:52:00.239 --> 00:52:14.159
But if I have a list that contains plus, and I get the first element of that, it's still the function plus, but it doesn't have the right syntax position to be called like this.
00:52:14.639 --> 00:52:18.880
It it's yeah, it's become it's become value-ified, right?
00:52:19.280 --> 00:52:21.760
It's now valid plus not the function plus.
00:52:22.159 --> 00:52:34.559
But then I have I have a question, then yeah, according to the coloring and the claim of the pop-up, the zero sub the subscript zero is a monetic modifier, but that does not seem right.
00:52:34.639 --> 00:52:36.960
It seems to be special syntax, right?
00:52:37.199 --> 00:52:42.000
No, they're all modifiers, but it's just well, it's hard to explain, basically.
00:52:42.239 --> 00:52:43.360
I can't derivate.
00:52:49.920 --> 00:52:50.239
I don't know.
00:52:50.639 --> 00:52:51.599
Because well, maybe I'm missing.
00:52:52.079 --> 00:52:56.800
They're parse the same as monadic modifiers, but they work a little sp they work differently from the other ones.
00:52:57.119 --> 00:53:01.360
Yeah, because normally, well, maybe it's just a way I think about it.
00:53:01.440 --> 00:53:17.599
Normally, when I apply a modifier operator to a function, then the derived thing will always be a function on its own, or in in some APLs, you can derive a monetic operator from a dyadic operator, but it doesn't matter so much.
00:53:18.639 --> 00:53:25.199
But here, could it be that we have a modifier that derives a nilet?
00:53:25.440 --> 00:53:28.320
I mean derives a value instead.
00:53:28.480 --> 00:53:32.559
Yeah, and I think J also has something like this, but I've always been confused.
00:53:32.800 --> 00:53:35.119
Yeah, but I've always been confused that how does that work?
00:53:35.199 --> 00:53:36.960
Because how does it know when to apply it?
00:53:37.039 --> 00:53:39.039
But maybe it's not a problem, maybe just me.
00:53:39.199 --> 00:53:40.320
I don't I don't understand.
00:53:40.639 --> 00:53:42.480
Yeah, it is it does parse, right?
00:53:42.559 --> 00:53:45.840
Like if I have one each, I think that would work.
00:53:46.000 --> 00:53:47.360
Oh no, it errors.
00:53:47.679 --> 00:53:49.360
Alpha must be a function.
00:53:49.599 --> 00:53:50.639
So yeah, I don't know.
00:53:50.880 --> 00:53:53.280
But you can do you could put a one, right?
00:53:53.760 --> 00:53:56.079
What do you oh one sub one you like this?
00:53:56.239 --> 00:53:57.039
Yeah, one sub one.
00:53:57.119 --> 00:53:59.599
So this makes one into a constant function that takes one argument.
00:54:00.639 --> 00:54:02.639
Yeah, I guess so then you could do that, yeah.
00:54:02.880 --> 00:54:12.320
But although the normal way you would write yeah, maybe that should error, I guess, because the normal way to write a constant function is to use self.
00:54:12.719 --> 00:54:13.840
There's no difference, right?
00:54:14.079 --> 00:54:18.159
Yeah, they are the same, but maybe this maybe that should error, but it doesn't.
00:54:18.559 --> 00:54:26.400
But then then you need you need self for for something that takes one argument and you need commute or whatever backwards.
00:54:26.800 --> 00:54:29.519
Yeah, fact that's that's why there's there's two of them, yeah.
00:54:29.920 --> 00:54:32.000
It's almost clearer to write it with a subscript.
00:54:32.320 --> 00:54:34.320
Just write one th, isn't it?
00:54:34.639 --> 00:54:37.760
This is a constant one that's monetic, or constant one that's dyadic.
00:54:38.000 --> 00:54:40.400
So I guess maybe it's better to just write it like this.
00:54:40.639 --> 00:54:41.440
I'm not sure.
00:54:41.760 --> 00:54:45.519
Wait, explain the I was following along that you because I ran into that myself.
00:54:45.599 --> 00:54:50.960
You have to split the self and swap or the C combinator and the W combinator into two different glyphs.
00:54:51.119 --> 00:54:53.440
But what are you doing with the subscript two here?
00:54:53.519 --> 00:54:55.440
The dyad turns this into what?
00:54:55.840 --> 00:54:57.920
It's a one is a it's a constant, right?
00:54:58.239 --> 00:55:02.320
It's a value, and we want to make a constant function from it.
00:55:02.480 --> 00:55:04.800
So the constant function also has to have fixed area T.
00:55:04.880 --> 00:55:08.159
So is it a monetic constant function or is it dyadic constant function?
00:55:08.320 --> 00:55:09.599
So there are two ways to do it.
00:55:10.320 --> 00:55:10.719
Right?
00:55:11.039 --> 00:55:13.360
Yeah, yeah, as Adam's saying, there's two ways to do it.
00:55:13.440 --> 00:55:24.239
You can either make a constant function monadic or dyadic using these sub one and sub two glyphs, or you can use self or backward.
00:55:24.480 --> 00:55:29.360
And like you can see here, it's called self slash constant one and constant two.
00:55:30.880 --> 00:55:39.840
But I don't know, because you can also do it with the subscript one and subscript two, so I'm not sure which way I like more, but both ways are equivalent at the moment.
00:55:40.400 --> 00:55:40.880
That's all right.
00:55:41.119 --> 00:55:49.360
I love Tiny Apple, and there's like 700 ways to do everything there, so uh I mean I I I'm fascinated by the by the design space that is in this language.
00:55:49.440 --> 00:55:56.639
It it's sort of a small language, yes, in in the vocabulary, but the but in a way it reminds me of K.
00:55:57.280 --> 00:56:07.599
I guess, yeah, I guess this is similar to K, because in K you can it also looks sort of at the what types you're giving things, and then it can things have different meaning.
00:56:07.920 --> 00:56:17.039
So I just I just realized that because of the strict way that the operators work here, then there are actually three options for every operand.
00:56:17.280 --> 00:56:20.000
You could also give a value as operand.
00:56:20.159 --> 00:56:23.039
Like I suppose the rank operator particular value.
00:56:23.679 --> 00:56:25.519
Most of them don't accept it, but yeah.
00:56:26.159 --> 00:56:27.280
But that doesn't yeah.
00:56:27.440 --> 00:56:34.159
And for example, there's no so the I don't know if transpose is monadic or dyadic, I can't tell because of the colors.
00:56:34.559 --> 00:56:36.159
Uh transpose is monadic.
00:56:36.480 --> 00:56:38.559
Uh it's just there on the on the pop-up, yeah.
00:56:38.800 --> 00:56:39.360
Yeah.
00:56:39.920 --> 00:56:45.039
But for example, if I do reverse, no, that's rotate, sorry.
00:56:45.280 --> 00:56:54.079
Reverse, if I do like a reverse reduction, it doesn't currently have meaning, but you could define a meaning to a monetic function applied with reduction.
00:56:54.400 --> 00:56:55.119
Yeah, I could.
00:56:55.280 --> 00:56:58.239
And and and if I understand right, this is exactly what k does.
00:56:58.320 --> 00:57:03.679
So if you give a dyadic function with reduction in k, that's normal, that's reduced, fold, whatever you want to call it.
00:57:03.760 --> 00:57:18.719
And if you give a monetic function, then it's fixed point, like it applies that function over and over again until yeah, and and it has a whole system with with a with with a forward slash and backslash, but they're all related depending on give it monetic functions or dyadic functions, they all do the thing.
00:57:18.800 --> 00:57:24.239
So scan give with a monetic function is also fixed point, but it gives you all the intermediary values.
00:57:24.880 --> 00:57:25.679
That's funny.
00:57:25.920 --> 00:57:26.400
Yeah.
00:57:26.880 --> 00:57:28.800
So I guess it is like K in that way.
00:57:28.960 --> 00:57:29.199
Yeah.
00:57:29.440 --> 00:57:30.079
Which is funny.
00:57:30.320 --> 00:57:33.280
K is the language that is famous for having all the overloading.
00:57:33.360 --> 00:57:36.639
Fixed APL is supposed to have none, but in a way it's the most similar.
00:57:36.960 --> 00:57:39.920
Well, so too, fixed APL has heavy overloading.
00:57:40.239 --> 00:57:43.199
Of course, it does have heavy overloading with the modifiers, yeah.
00:57:43.360 --> 00:57:45.360
But it's just conceptually, yeah.
00:57:45.760 --> 00:57:46.320
Yeah, yeah.
00:57:46.400 --> 00:57:51.440
The the the yeah, before and after carry a lot here.
00:57:51.599 --> 00:57:55.760
Whereas in APL at BKN, they they don't need nearly as much.
00:57:56.239 --> 00:57:56.800
Yeah.
00:57:57.119 --> 00:57:57.440
Okay.
00:57:58.079 --> 00:58:00.159
Um, not sure what we should talk about next here.
00:58:00.480 --> 00:58:01.760
Well, I mean, I've got a bunch of questions.
00:58:01.840 --> 00:58:07.599
I was just thinking about because I'm still trying to clear up the confusion, but we'll circle back and uh we'll just don't worry.
00:58:07.760 --> 00:58:09.280
I'll spend some time playing around with this.
00:58:09.360 --> 00:58:14.000
We'll have you back and then we'll we'll be I'd like to talk about trains at some point, but oh yeah, that's the thing.
00:58:14.079 --> 00:58:18.079
Yeah, like oh well we'll do that now and I'll save my my my questions.
00:58:18.159 --> 00:58:21.280
Or at one point we'll go through all the all the glyphs, we'll rapid fire.
00:58:21.360 --> 00:58:25.360
Um, but yes, I mean we also have uh a different train model, and that's the thing.
00:58:25.440 --> 00:58:32.800
That's we haven't even gotten to trains yet, which is ridiculous that we were well not ridiculous, I guess it just shows you the power of the modifiers and fixed APO.
00:58:34.159 --> 00:58:40.079
Maybe a thorough treatment of of fixed APO's tested programming is an episode on Tested Talk.
00:58:40.239 --> 00:58:42.000
I won't say oh yeah, yeah.
00:58:43.440 --> 00:58:45.760
We got two we got two podcasts, we're gonna have you on them both.
00:58:45.920 --> 00:58:50.800
But yes, let's move to so uh for the audio listener that got confused and is still listening for some reason.
00:58:50.880 --> 00:58:51.199
Thank you.
00:58:51.280 --> 00:58:53.599
We appreciate uh your valuable time.
00:58:54.000 --> 00:58:57.840
We were up until this point talking about uh glyph land.
00:58:57.920 --> 00:59:00.800
You know, we were talking about the before, the after.
00:59:00.880 --> 00:59:05.599
At one point we were talking about over, talking about rank, talking about the sub-012.
00:59:05.920 --> 00:59:08.480
We haven't even talked about trains, folks.
00:59:08.559 --> 00:59:12.480
So these are different trains than you're used to because we now have fixed airity.
00:59:12.719 --> 00:59:14.000
All right, over to you, Jacob.
00:59:14.320 --> 00:59:19.519
Yeah, so the basic idea of trains is similar, but it's not quite the same.
00:59:19.760 --> 00:59:27.679
I'd say the first major difference is that you can have a train whose right most time is a value, right?
00:59:27.920 --> 00:59:29.840
Which is very different from APL.
00:59:29.920 --> 00:59:36.639
In APL, if you write plus one, it's just gonna give you one, but in fixed APL, it gives you a monadic function.
00:59:36.800 --> 00:59:40.079
And if you write plus one in parentheses, it's two.
00:59:42.239 --> 00:59:46.880
Because it's you filled one slot of the plus, so there's one slot left.
00:59:46.960 --> 00:59:49.920
That's exactly again like like K does it.
00:59:50.800 --> 00:59:50.960
Yeah.
00:59:51.280 --> 00:59:52.480
And the same thing goes all the way.
00:59:52.559 --> 00:59:58.639
You can write what one plus as well because it's a diad on the right, so it has to have something more, so it knows it's a train.
00:59:58.719 --> 00:59:59.599
That's very neat.
00:59:59.920 --> 01:00:00.480
Yes.
01:00:00.719 --> 01:00:03.039
So that's maybe the first difference.
01:00:03.760 --> 01:00:13.360
Another major one is that because you know what's monadic and what's dyadic, you don't have every application be a fork.
01:00:13.519 --> 01:00:16.639
You also have a top, and it's very implicit.
01:00:16.960 --> 01:00:24.960
So maybe a simple example would be the length plus the I don't know.
01:00:25.360 --> 01:00:39.039
Maybe the square root plus the of the or maybe actually, you know, it would be easier, it would be easier to just do something that you can see with a couple.
01:00:39.599 --> 01:00:45.599
So we can have or pair the existing round up and round out and round the value.
01:00:46.079 --> 01:00:46.800
Yeah, you can do that as well.
01:00:46.960 --> 01:00:47.440
Yeah, that works.
01:00:47.840 --> 01:00:53.360
The sign an absolute value of negative four gives you a fork, right?
01:00:53.519 --> 01:01:05.119
Where you have the two monadic functions being applied to the input, and then they are passed dyadically to the middle function, which is couple, so you get negative one and four.
01:01:05.360 --> 01:01:14.880
And this is a classic fork, and you also have two dyadic versions, so you have maybe sign and then equal, so we can put three here.
01:01:15.119 --> 01:01:21.599
And here you have the sine of negative four, which is negative one, coupled with a three is equal to negative four, which is zero.
01:01:21.920 --> 01:01:23.119
Wait, wait, hold on, what?
01:01:23.440 --> 01:01:28.559
Why why did it decide to decide to take the sign of the right argument, not the sign of the left argument?
01:01:28.719 --> 01:01:38.159
Yeah, I understand the sign is monetic, but how do you think it takes the sign of the right argument, and that's it's arbitrary, basically, but that's the way I decided to do it.
01:01:38.320 --> 01:01:40.800
And perhaps it's not the most intuitive way.
01:01:40.960 --> 01:01:52.719
But I thought it was more consistent with the monadic version, because if this is monadic, sign the monadic function always applies to the right argument.
01:01:52.800 --> 01:01:59.840
So it seems a little weird for just because you switch one function to be dyadic, the monadic is the left argument instead of the right.
01:02:00.400 --> 01:02:02.320
I mean, yeah, I guess so.
01:02:02.480 --> 01:02:05.599
It it makes sense with like the main argument is the right argument, and that's the same.
01:02:05.760 --> 01:02:11.039
Especially if you switch it around, like if you write equal couple with sign, you can see it maybe better.
01:02:11.679 --> 01:02:14.880
The sign in both situations is treated the same.
01:02:16.320 --> 01:02:24.159
So that's that's the first thing, I guess, is you know, your normal basically your normal forks are just a little different.
01:02:24.400 --> 01:02:28.159
But then you also have a top, and it's quite normal.
01:02:28.320 --> 01:02:35.360
So you have we can say the square root, or maybe yeah, square root of the absolute value of the input value.
01:02:35.760 --> 01:02:37.360
Square root of absolute value, sure.
01:02:37.920 --> 01:02:39.840
And that works how you would expect.
01:02:39.920 --> 01:02:45.679
It does the square root of the absolute value of the input, which is so with negative four, you get absolute value is four, square root is two.
01:02:46.239 --> 01:02:53.199
And you can combine this with fork, and this is not specifically because it has two tines in this train.
01:02:53.280 --> 01:02:56.000
This is just the way that it is parsed.
01:02:56.159 --> 01:02:58.960
And it can be with any number, not just a negative.
01:03:01.840 --> 01:03:03.679
Yeah, the negation of that.
01:03:04.000 --> 01:03:13.199
And in another language, this would be parsed as a fork because it would treat square root as some dyadic function, which doesn't exist.
01:03:13.440 --> 01:03:14.800
So I guess it would error.
01:03:15.119 --> 01:03:21.760
But here, because it knows that square square root is a monad function, it treats it as a top.
01:03:22.079 --> 01:03:37.039
And uh you can mix this with all sorts of different trains, but like if we have the function, if we add negative four to this negative two, you can see we're combining a fork and this a top.
01:03:37.599 --> 01:03:40.000
How do we uh the grouping is not clear to me?
01:03:40.159 --> 01:03:45.360
Like, how do I know that does it group from the right and or or it groups from the right?
01:03:45.599 --> 01:03:49.119
Yeah, because so it it's sort of greedy, it takes all the monetic functions on the right.
01:03:49.360 --> 01:03:55.920
We could also understand this is id plus negate applied to the result of the square root of the absolute value.
01:03:56.639 --> 01:03:57.840
Well, this is this is not distinctly.
01:03:58.320 --> 01:04:03.440
Or you could even parse it like this, where yeah, and just plus is treated as its own function.
01:04:03.840 --> 01:04:06.960
So we so for the function lookout is actually parse.
01:04:07.360 --> 01:04:14.800
But for a train, we start on the right, we take as many monetic functions as we can find, and and they they get coupled together, right?
01:04:15.039 --> 01:04:21.519
Or you could, but not exactly because you can also switch it around and have it on the left, and you can have any combination.
01:04:21.760 --> 01:04:22.639
How does that hold on?
01:04:22.960 --> 01:04:23.519
Can try this?
01:04:23.599 --> 01:04:25.280
But now you you can't have ID here, right?
01:04:25.360 --> 01:04:32.000
If you put ID on the right, squared of maybe we can have did it do the same thing, but put the ID on the right of the plus?
01:04:32.480 --> 01:04:33.679
Uh yeah, you can do this.
01:04:33.920 --> 01:04:34.320
Hold on.
01:04:34.400 --> 01:04:35.119
No, that's not without.
01:04:36.880 --> 01:04:38.400
Yeah, but that doesn't matter too much.
01:04:38.480 --> 01:04:41.440
But if you if you remove the left ID here, yeah.
01:04:41.760 --> 01:04:48.079
Then you're getting something else where you have the squ absolute value plus plus identity.
01:04:48.400 --> 01:04:48.719
Yeah.
01:04:48.960 --> 01:04:52.719
And then we apply the negation of oh, actually you do need identity.
01:04:52.800 --> 01:04:53.199
Yeah.
01:04:53.519 --> 01:04:54.559
Yeah, but it doesn't make sense.
01:04:54.719 --> 01:04:56.159
Always give zero for every number.
01:04:56.320 --> 01:04:59.119
But yeah, this is a bad function.
01:04:59.360 --> 01:05:04.559
Well, for every for every real number, it gives it gives uh the but but it doesn't matter so much.
01:05:04.880 --> 01:05:06.159
All right, so let's put it.
01:05:06.320 --> 01:05:11.840
We we lost the audio listener because we're not explaining we're building up trains here.
01:05:12.159 --> 01:05:12.800
Yes, we started.
01:05:13.599 --> 01:05:16.159
I feel like it's hard to explain trains to the audio listener now.
01:05:16.400 --> 01:05:17.440
Oh, that's it's pretty easy.
01:05:17.599 --> 01:05:20.559
It's pretty easy because we got green function, we got blue functions, folks.
01:05:20.639 --> 01:05:21.280
That's all we got.
01:05:21.440 --> 01:05:22.159
It's real easy.
01:05:22.239 --> 01:05:23.920
We got uh yeah, but hold on.
01:05:24.000 --> 01:05:32.400
The audio reader, the audio reader, yeah, the audio listener might be listening and not looking because they can't see, in which case calling using the names blue and green is not gonna help them.
01:05:32.639 --> 01:05:34.239
Oh, it doesn't matter, it's just the pattern, right?
01:05:34.320 --> 01:05:48.400
So right now we are building we started off by looking at the forks, and there's a couple different overloads because now you can have like the way that I think of forks and APO and friends is you've got the monadic, which is one two one, and you've got the dyadic, which is two two two.
01:05:48.639 --> 01:05:59.760
Those are the airities of the function, and because those are the only patterns you've got those are the only patterns, and we showed earlier some two two ones, some one two twos because you've got fixterity, it enables you.
01:06:00.320 --> 01:06:04.960
To do this like aity pattern matching, which is what I was going to say earlier, is this is not dissimilar at all.
01:06:05.119 --> 01:06:07.440
In fact, it might be very similar to what jelly does.
01:06:07.519 --> 01:06:11.039
Basically, it looks at a sequence of aridies.
01:06:11.119 --> 01:06:26.480
I actually talk about this in an unpublished paper called uh trains, chains, and function composition or something, that this idea in jelly of chains, where you basically just look at the airity of every function, which is why the the listener's probably being like blue functions and green functions.
01:06:26.559 --> 01:06:27.679
What the hell is this guy talking about?
01:06:27.920 --> 01:06:30.800
A green function is monadic, a blue function is dyadic.
01:06:30.880 --> 01:06:31.920
And that is borrowed.
01:06:32.559 --> 01:06:36.480
I just wanted to jump in here and say this is so classic corner here.
01:06:36.639 --> 01:06:36.880
What?
01:06:37.039 --> 01:06:39.760
So you speak about it in an unpublished paper.
01:06:39.840 --> 01:06:42.159
That's like as tacit as it can be, right?
01:06:42.559 --> 01:06:43.519
I tried to publish it.
01:06:43.599 --> 01:06:44.320
I tried to publish it.
01:06:44.400 --> 01:06:51.760
The the wonderful folks at Array uh the PLDI co-located workshop said that it was uh not novel enough or something like that.
01:06:51.840 --> 01:06:52.239
I don't know.
01:06:52.400 --> 01:06:53.440
I didn't have it peer-reviewed.
01:06:53.519 --> 01:06:57.440
My other paper that was published was peer-reviewed, and this one I kind of wrote at the last.
01:06:58.480 --> 01:07:02.559
We've got a train that read from left to right is monad, monad, monad, diad, monad.
01:07:03.039 --> 01:07:06.719
But it's better to read it from right to left, seeing as we're parsing it and grouping it from right to left.
01:07:06.800 --> 01:07:09.679
So it's and also too, monad, diad, let's just do one, two.
01:07:09.920 --> 01:07:13.440
So it's one, two, one is your fork, and then we had one one.
01:07:13.679 --> 01:07:16.880
And so then you're just applying those monadic operations afterwards.
01:07:16.960 --> 01:07:25.440
And before we had one, one, one, two, one, which means you're kind of combining those unary functions with, you know, that's the classic unary function composition.
01:07:25.519 --> 01:07:36.400
And then at the tail end of that, that kind of formed unary function with the three monadic functions now all are treated kind of as the single function to a monadic fork.
01:07:36.960 --> 01:07:39.280
Yeah, you lost me, and I'm even looking at it.
01:07:39.519 --> 01:07:40.320
I mean, the point being here.
01:07:41.840 --> 01:07:43.119
Yeah, yeah, that's where we started.
01:07:43.280 --> 01:07:44.320
Yeah, this is what we started.
01:07:44.400 --> 01:07:48.719
So so the simple case is easy to understand, is one, two, one, one, one.
01:07:48.880 --> 01:07:49.119
Right?
01:07:49.280 --> 01:07:50.800
So there we start from the right.
01:07:50.880 --> 01:07:55.280
So we've got the one one sequence that all just groups together, applies to the argument.
01:07:55.360 --> 01:07:59.039
We have to say also this this train is applied monetically.
01:07:59.280 --> 01:08:05.199
Wait, wait, are you are you talking about you said start from the right, but then you said quantity one one, which is starting from the left.
01:08:05.519 --> 01:08:08.639
Yeah, I'm reading, I'm reading it from the left, I'm applying it from the right.
01:08:08.719 --> 01:08:09.840
Ah, come on, this is hopeless.
01:08:10.159 --> 01:08:15.760
I mean, it's not hopeless, but uh we gotta we gotta agree which way we're we're reading it.
01:08:15.840 --> 01:08:20.079
Um I saw some list of programming languages that was like comparing them to cars.
01:08:20.239 --> 01:08:25.600
And APL is a is a bus, it takes all the values from A to B at the same time.
01:08:25.760 --> 01:08:29.840
The only problem is that the signage is in Greek and the bus is driving backwards.
01:08:30.079 --> 01:08:31.279
Oh yes.
01:08:32.159 --> 01:08:36.079
Greek, it should be uh like hieroglyphics if we're being uh you know fair.
01:08:36.479 --> 01:08:46.079
Anyway, so when Adam said one, two, one, one, one, he was reading that from left to right, but we parse it from right to left like the rest of APLs.
01:08:47.520 --> 01:08:48.079
Yes.
01:08:48.399 --> 01:08:56.640
And then we went on to say that if you switch the order of that, so you put the three medadic functions at the end on the right.
01:08:57.760 --> 01:08:59.199
At the end is the left, yeah.
01:08:59.359 --> 01:09:00.079
Thank you.
01:09:00.319 --> 01:09:02.880
Or yeah, at the it's impossible.
01:09:03.039 --> 01:09:14.640
Uh you then you then start with, I mean, this is I guess why we've never shared screens on the podcast before, folks, because it just evolves into uh you know colliding with the audio listener.
01:09:14.800 --> 01:09:21.680
You then start off with the monadic fork, the one, two, one, and then that's followed by two more monadic functions.
01:09:21.840 --> 01:09:31.199
So it's it's very interesting because you like this is why I find like Cap and Tiny Apple and now FixAPO.
01:09:31.359 --> 01:09:38.159
Like these are all such interesting models because you can achieve different things with different tacit models.
01:09:38.239 --> 01:09:47.760
Like cap did away with the three train, made the syntax explicit, and then gets the composed unary functions just for free.
01:09:48.000 --> 01:10:08.960
And then the initial thing that you had, which was kind of like the juxtaposition of a nil ad and a unary or a binary function, that's like falls into this arity pattern matching, but cap gets that via left bound functions, where if you have a binary function with just a left argument, it just automatically parses that as like a partial application.
01:10:09.119 --> 01:10:12.479
Whereas here I it's like a form of forg kind of.
01:10:12.720 --> 01:10:21.600
Yeah, it's it's like you're treating this as a if you read the arities of this like you would in jelly, it's a dyadic, and then on the right argument is a nil ad.
01:10:21.760 --> 01:10:25.520
So it's like two zero, and uh if you reverse that, then it's zero, two.
01:10:25.840 --> 01:10:28.800
And so you just I am a s I don't know how this is implemented.
01:10:28.880 --> 01:10:33.359
We should we should I guess you did mention that that uh fix APL implemented in in TypeScript.
01:10:33.680 --> 01:10:33.920
Yes.
01:10:34.159 --> 01:10:35.359
But I assume that's what you do.
01:10:35.439 --> 01:10:38.640
You look at the arities and then you dispatch based on that.
01:10:38.960 --> 01:10:40.479
Is that correct, or is it slightly different?
01:10:40.880 --> 01:10:47.119
Yes, it it's kind of complicated, but yeah, it does look at all the airities and then read it from right to left.
01:10:47.279 --> 01:11:04.319
And yeah, it it breaks it into it treats the the rightmost thing a little differently from the rest, but it reads kind of the rightmost section, then it after that it either reads a monadic function or a dyadic function and then another one.
01:11:04.800 --> 01:11:06.880
So you end up scope.
01:11:09.760 --> 01:11:10.079
Yeah.
01:11:10.560 --> 01:11:21.520
It it's interesting also because the way that traditional APL trains and J trains work, it's actually the dyadic functions are taking on the role of dyadic operators.
01:11:21.680 --> 01:11:27.920
There's a little bit about the the the binding, it's from left to right, right to left, but that's that's sort of just a rule you apply.
01:11:28.159 --> 01:11:41.840
But but the original idea about the fork came from wanting to have an an operator, a two modifier, that acted as a function on the results on of its operand.
01:11:42.239 --> 01:11:49.199
So if we take like a very simple example is plus, comma plus catenate minus, right?
01:11:49.840 --> 01:12:02.399
So there you could think of it as oh, what if there was a catenate operator that took two operands and the effect of the operator was applying the left operand and applying the right operand and catenating the results together.
01:12:02.640 --> 01:12:08.720
So too, for every dyadic function, there exists an operator that does exactly that.
01:12:08.880 --> 01:12:16.560
And Iverson was all in like, uh oh, we have to add as many operators now as there are functions or dyadic functions at least, right?
01:12:16.800 --> 01:12:28.079
So and he actually came up with a scheme, a spelling scheme, where you could take and the symbol for a dyadic function and over strike it with an overbar, and that would make the corresponding operate dyadic operator.
01:12:28.239 --> 01:12:28.720
Oh wow.
01:12:29.119 --> 01:12:32.880
Plus plus overbar and times over bar and divide over bar and so on and so on and so on.
01:12:33.279 --> 01:12:40.399
But then they came they then they realized no, we don't need to do that because since by syntactically isolating them, so that's the cost, right?
01:12:40.560 --> 01:12:50.720
Yeah, putting parentheses around them or naming them, then it's clear, since it's a syntax error in old APL, it's clear that the middle function acts in this operative role.
01:12:50.960 --> 01:12:52.239
That's where trains came from.
01:12:52.399 --> 01:12:53.680
That's where forks came from.
01:12:54.159 --> 01:12:54.880
Interesting.
01:12:55.199 --> 01:12:58.079
And here we sort of abandon that idea, right?
01:12:58.720 --> 01:13:01.680
Yeah, it's not really treated like that at all.
01:13:01.840 --> 01:13:02.239
Yeah.
01:13:02.560 --> 01:13:19.760
It it really just breaks the whole expression into kind of two patterns and just reads them all rather than and it's totally consistent with both expressions that are niladic and expressions that are monadic or dyadic or whatever.
01:13:19.840 --> 01:13:21.439
They all follow the same rules.
01:13:21.920 --> 01:13:29.279
Like there's no difference between writing one plus one, which is two, and identity plus one, which is a monadic function.
01:13:29.840 --> 01:13:30.319
Right.
01:13:30.880 --> 01:13:31.680
Fascinating.
01:13:32.079 --> 01:13:43.520
So I guess I mean I ran into this when I was trying to put a hook, I believe, at the beginning of a fork, but it wouldn't parse the way I wanted.
01:13:43.680 --> 01:13:53.279
And then I got Claude to go scrape all the docs which didn't exist, and then it said, Don't worry, we got the implementation, it's open source.
01:13:53.520 --> 01:13:57.520
So Claude went and figured out how everything worked and then came back with the correct answer.
01:13:57.760 --> 01:14:05.760
It said that if you want the hook at the beginning, it it will aggressively read it as a one-two-one, so that'll treat it as a fork.
01:14:05.840 --> 01:14:07.359
So you need to parenthesize.
01:14:07.520 --> 01:14:12.560
I can't I can't remember if it's a two-one or a one-two, but in that instance you had to parenthesize the two one.
01:14:12.880 --> 01:14:26.720
But now, after having had the before and after discussion, is it actually the case that if you've got a hook that precedes a fork, so you want to do a hook first and a fork, you could actually use before after instead of the two parentheses?
01:14:26.960 --> 01:14:27.920
You still have to parenthesize.
01:14:28.079 --> 01:14:28.720
You still have to parenthesize.
01:14:29.760 --> 01:14:32.079
Because of because of the scoping, right?
01:14:32.159 --> 01:14:33.760
The the the the long scope.
01:14:33.920 --> 01:14:36.399
So trains group from the right.
01:14:36.560 --> 01:14:53.920
And if you want a hook, say, where you want a essentially you want a function applied on the argument as as both its argument, but you want to pre-process on the right, that pre-processing, if it's part of your train, has to be parenthesized.
01:14:54.239 --> 01:15:00.079
Or the the operator that's way out to the left will grab only one time.
01:15:01.199 --> 01:15:02.720
Does that make any sense, Connor?
01:15:03.039 --> 01:15:06.079
Because the operator binding is much stronger than the train binding.
01:15:06.159 --> 01:15:07.680
Or whether there's no train binding, right?
01:15:07.760 --> 01:15:09.439
They just sort of sit there.
01:15:09.760 --> 01:15:10.159
Yeah.
01:15:10.319 --> 01:15:10.560
Right.
01:15:10.640 --> 01:15:11.199
Like you're not going to be able to do it.
01:15:14.399 --> 01:15:15.279
It's like a list.
01:15:15.680 --> 01:15:36.560
Maybe I'm gonna have an existential crisis soon because uh on my most recent ADSP in the cinematic, you know, code report podcast universe, the most recent ADSP podcast was I went on a rant about PedMass and how that's like an arbitrary hierarchy of evaluation that is just ridiculous and array languages are better.
01:15:36.800 --> 01:16:04.079
And then we haven't I know, and and then someone had a very thoughtful response in the GitHub discussion saying, I find it very ironic that all these array language people they bring up how their linear evaluation is so much better than PedMass, and they never acknowledge the fact that there is a ton of precedence, and then he linked or she, I actually don't know, or they linked to the APL wiki precedence page.
01:16:04.319 --> 01:16:08.159
And and then I was kind of well, first of all, I was very thankful.
01:16:08.239 --> 01:16:25.439
It was a very thought-provocative post that led me to hours the next day thinking about this, but then also it's it was worse because I I had never read the precedence page, and at first I was kind of like, ah, well, stranding is kind of fixed, you know, BQN, Tiny Apple, you know, we've all fixed that.
01:16:25.520 --> 01:16:27.359
It only exists in APL and J.
01:16:28.079 --> 01:16:38.479
But then when I thought about I started kept reading, and it was talking about what Adam just mentioned, the long left scope and right scope of functions versus operators.
01:16:38.640 --> 01:16:48.720
And then I was like, yeah, I guess there are times when I'm using, you know, I want to sum over something and I have to parenthesize the sum in order to get the correct binding of the modifier or the operator.
01:16:48.880 --> 01:16:57.039
But then while I was writing it, I was like, wait a second, all of this train stuff that I've I I, you know, I have a whole podcast called Tacitalk.
01:16:57.119 --> 01:17:09.199
I love all this stuff, but it technically is not necessarily like the order of evaluation, but it is a bunch of context that the the way that you read this stuff, and you know, half the time I get confused if I'm in a language that I don't spend enough time in.
01:17:09.439 --> 01:17:15.439
And uh I anyways, I mean, yes, there is a precedence, absolutely, binding strengths, whatever you call it.
01:17:15.600 --> 01:17:17.439
Maybe not in Wea, I'm not sure.
01:17:17.840 --> 01:17:19.359
Because it's really just a fourth.
01:17:19.760 --> 01:17:20.159
Not really.
01:17:20.319 --> 01:17:21.199
I mean, there are, yeah.
01:17:21.359 --> 01:17:26.239
In Wea there are modifiers, but and then that's the only precedent's role, really.
01:17:26.399 --> 01:17:50.880
Yeah, and I guess but I I think a big difference, Connor, is that if you think about you know growing the language, if that says anything to you, uh the pre the precedents' rules in should we say popular languages, languages that share syntax with C or closely aligned with C, they uh the rules get worse and worse.
01:17:51.039 --> 01:17:51.359
Oh yeah.
01:17:52.399 --> 01:17:54.239
The bigger the vocabulary becomes.
01:17:54.720 --> 01:18:02.319
Whereas in the array languages, the rules only get worse the bigger the number of syntactic constructs become.
01:18:02.560 --> 01:18:10.640
But generally a language will have or should have a large vocabulary but a low number of syntactic rules or syntactic constructs.
01:18:10.800 --> 01:18:17.119
So once you master, you know, stranding and dyadic operators and monetic operators and and all those things, right?
01:18:17.279 --> 01:18:18.880
Those rules apply universally.
01:18:18.960 --> 01:18:20.800
But look at this list of JavaScript precedents.
01:18:21.119 --> 01:18:25.199
Yeah, this is JavaScript precedents, and there's 15 levels, or there's even more.
01:18:25.600 --> 01:18:38.800
No, no, the sub-levels, the sub-levels inside the levels, it's a two-dimensional level system, and not only that, the system is so bad that there are things you're not allowed to even put next to each other without parenthesizing because it's just too terrible, right?
01:18:39.039 --> 01:18:55.600
So there are things, yeah, even though it has a rule here, apparent rule here, if you actually try to put some of them next to each other, then the JavaScript interpreter will will blow up at you and say, uh no, you're not allowed to leave this up to in to press uh to the table, rather you must force uh order.
01:18:55.840 --> 01:18:56.319
Yes, there are.
01:18:56.720 --> 01:18:57.840
That's how bad it is, right?
01:18:58.159 --> 01:19:05.279
And and it's like with some of the newer ones, like the null nullish coalescing things, I think, yeah, like that.
01:19:05.760 --> 01:19:09.199
So uh I would say this, yeah.
01:19:09.680 --> 01:19:10.479
Own it, right?
01:19:10.640 --> 01:19:14.960
Yeah, you're not those who are not allowed to to to just arbitrarily put next to each other.
01:19:15.119 --> 01:19:17.760
Um let's own it.
01:19:17.920 --> 01:19:26.079
There is pr there there is a table of rules for how things are applied even in array languages, like I was only in array languages.
01:19:26.399 --> 01:19:29.119
Only we have it way better than they have it anyway.
01:19:29.359 --> 01:19:30.239
It's a lot smaller.
01:19:30.479 --> 01:19:33.840
Yeah, I guess that's that's you can't I've been trying to figure out a way to articulate it.
01:19:34.000 --> 01:19:44.800
Maybe you just have it's that like in C, there's a similar table for this that honestly like most people aren't even aware of, and that's because the best practice is not to rely on the precedence thing.
01:19:44.880 --> 01:19:46.880
It's just like Which means something is broken, just yeah.
01:19:49.439 --> 01:20:01.920
Like, sure, maybe you have the table memorized, but if uh you don't, like if you're working with someone that doesn't have expecting that they will have it memorized, it is not a good like best practice thing.
01:20:02.159 --> 01:20:05.439
And I think Jacob's hearing I we can still hear you.
01:20:05.600 --> 01:20:06.079
Can you hear us?
01:20:06.399 --> 01:20:07.520
My headphones died.
01:20:08.239 --> 01:20:08.800
That's all right.
01:20:08.960 --> 01:20:12.319
But there doesn't seem to be any uh feedback, so no, it's good.
01:20:12.479 --> 01:20:12.960
Okay, yeah.
01:20:13.039 --> 01:20:16.319
So so the rules are very set in the array languages, right?
01:20:16.399 --> 01:20:18.960
And if you expand the vocabulary, you add another thing, right?
01:20:19.119 --> 01:20:24.159
Let's say somebody decides in in JavaScript, oh we we've got to add a new thing, right?
01:20:24.319 --> 01:20:33.600
You know, the equality, it doesn't work on properly on on say arrays, we've got to add equal sign, equal sign, equal sign, equal sign, and call it equality for good, right?
01:20:33.920 --> 01:20:40.000
And now you have to add another level in the in the table, or a new sub-level in the table.
01:20:40.079 --> 01:20:45.359
But if somebody adds another primitive to fix APL or dialogue APL, BQN, or so there's nothing to be done.
01:20:45.439 --> 01:20:47.760
You just you you say from the outside, what am I adding here?
01:20:47.840 --> 01:20:50.079
Is it a monetic function, diadic function?
01:20:50.159 --> 01:20:52.000
Is it an operator monetic dyadic?
01:20:52.239 --> 01:20:52.479
Right?
01:20:52.720 --> 01:20:56.159
It's very rare to have a new construct.
01:20:56.319 --> 01:21:07.359
It can happen, like dialogue version 20 added uh the array notation, but the array notation's nature is such that it does not come into any, there's no question about what the binary strength is going to be there.
01:21:07.520 --> 01:21:10.800
So yeah, nothing changes on the separators, yeah.
01:21:10.960 --> 01:21:12.880
Yeah, and the same thing here, right?
01:21:12.960 --> 01:21:14.560
There is a little bit of a question here.
01:21:14.640 --> 01:21:22.640
If if we look at fixed APL isn't like, okay, take any other APL and basically just modify the vocabulary, because many of these languages are just that, right?
01:21:22.960 --> 01:21:30.560
And then there's a little bit of question about those subscripts, about what exactly is the nature of those.
01:21:30.640 --> 01:21:33.680
Those are not they don't conform to the normal rules.
01:21:33.920 --> 01:21:39.359
And and you can see this well, dialogue APL has a couple of things that are sort of don't conform to the normal rules.
01:21:39.439 --> 01:21:40.399
You have to learn ad hoc.
01:21:40.720 --> 01:21:42.319
Like we mentioned the outer product.
01:21:42.399 --> 01:21:50.319
There's actually a a fun thing is the quad off and system name, which is a constant, but you can still give it an argument, sort of.
01:21:50.479 --> 01:21:53.439
It reacts to being stranded with another arg uh element.
01:21:54.079 --> 01:21:58.479
So those are like syntactic quirks that are there, but they're very far and few in between.
01:21:58.560 --> 01:22:07.439
And we notice them so much in APL land because the rest of the language is so uniform, whereas many other languages is just such a mess that you don't like, one more quirk.
01:22:07.600 --> 01:22:08.720
Yeah, whatever.
01:22:09.119 --> 01:22:13.439
Yeah, I guess that's makes me feel better about my maybe I won't have an existential crisis.
01:22:13.520 --> 01:22:14.079
We're better.
01:22:14.159 --> 01:22:14.960
Yes, we have precedents.
01:22:15.279 --> 01:22:16.000
Crisis about it.
01:22:18.159 --> 01:22:19.039
We'll tell your wife.
01:22:19.600 --> 01:22:20.159
Not to worry.
01:22:20.319 --> 01:22:21.520
Yeah, well, I already told her.
01:22:21.680 --> 01:22:24.399
I already told her, so it's uh not about the existential crisis.
01:22:24.479 --> 01:22:26.079
I I told her about the precedence.
01:22:26.319 --> 01:22:26.960
She didn't really care.
01:22:27.199 --> 01:22:32.239
I mean, she thought it was kind of interesting, but uh, I think to be honest, she was just humoring me because I was all worked up about it.
01:22:32.319 --> 01:22:39.279
And she's happy to listen to me be worked up about something, even if she not necessarily uh you know a super fan of the topic.
01:22:39.520 --> 01:22:41.760
Is there more to say about the the trains?
01:22:41.840 --> 01:22:53.439
Because I we got a little bit distracted and and went on uh an important tangent, but uh yeah, is is there more to say about the train model in fix APL before we move on to the next uh question?
01:22:53.520 --> 01:22:58.159
Because we're already past the hour and a half mark, but uh we got I got one last question I definitely want to ask.
01:22:58.239 --> 01:23:01.359
Uh I also have a I have a question about the trains here.
01:23:01.520 --> 01:23:05.119
So you mentioned, Connor, the what did you call it?
01:23:05.199 --> 01:23:12.960
The application of a dyadic function with a constant on its left that you get in cap of three and k also has left bound function.
01:23:13.119 --> 01:23:18.880
So here we we saw that already, like you can write in parentheses one plus, and that's fine.
01:23:19.039 --> 01:23:25.039
But if you want something like that inside your function, so it's then how exactly does it work?
01:23:25.279 --> 01:23:30.159
So do do so like one plus the average, right?
01:23:30.239 --> 01:23:34.800
If you write plus slash divided by the tally or whatever you call it, length.
01:23:35.520 --> 01:23:36.000
Yeah.
01:23:36.560 --> 01:23:36.960
Yeah.
01:23:37.199 --> 01:23:38.880
So what just happened here?
01:23:39.199 --> 01:23:41.439
Never mind that that contents thing.
01:23:41.840 --> 01:23:54.399
So this is parsed as the length, and then so this is kind of the first thing is we get the length, and then here we have the sum divided, that's kind of its own thing, and then finally we have one plus.
01:23:54.720 --> 01:23:57.279
And but the one plus is not standalone here, right?
01:23:57.359 --> 01:23:58.239
It's or is it?
01:23:58.319 --> 01:24:00.399
I don't, I'm just sort of unsure what's happening here.
01:24:00.640 --> 01:24:04.159
Well, kind of, it's not parsed, but it's it's the same as this, basically.
01:24:04.399 --> 01:24:06.159
It's treated exactly the same as this.
01:24:06.319 --> 01:24:08.479
This is so you become oh, that's what you said.
01:24:08.560 --> 01:24:21.039
You go towards the left and you see a diad, so which is plus here, and so we we go one more step left and find something that we can use as left argument, whether it is a constant or a function.
01:24:21.199 --> 01:24:22.640
If it's a function, we need to apply it.
01:24:23.039 --> 01:24:25.039
If it's a constant, we just use it as is.
01:24:25.199 --> 01:24:38.319
So essentially, just like it like dialogues, AGH trains, we call them, where the array can take the the position of either monetic or static function, depending on the evaluation of the train usage.
01:24:38.720 --> 01:24:45.760
So to hear the plus is effectively working as as a nil as a function that uh uh constant function, right?
01:24:46.239 --> 01:24:48.079
Yeah, effectively.
01:24:48.960 --> 01:24:50.159
So I'm surprised actually.
01:24:50.239 --> 01:24:58.399
So the the one to effectively one from the one contents reduce that forms a unary function.
01:24:58.640 --> 01:25:05.039
That doesn't form uh the equivalent of a manadic fork and then is applied first.
01:25:05.119 --> 01:25:09.119
It applies tally and then that's interesting.
01:25:09.600 --> 01:25:15.199
Well it it's plus reduced divide does not it does not form a time in the overall trait.
01:25:15.520 --> 01:25:19.359
This is not its own function, it's this is just the order that it's parsed in, kind of yeah.
01:25:19.439 --> 01:25:26.319
The same thing happens in normal APL, but if you put a left a space here on the left of the divide, I think Condor will recognize it faster.
01:25:26.479 --> 01:25:27.520
What's actually right?
01:25:27.920 --> 01:25:34.319
The same thing goes in in normal when you write normal APL or J or BQN average, right?
01:25:34.479 --> 01:25:36.640
Plus slash divide by tally.
01:25:37.039 --> 01:25:55.039
I mean you use that plus slash sort of groups together with the division, and that's a train rule that that trains each intermediary carriage in the train has a short left scope catching its left argument with a function or array that's on its immediate left.
01:25:55.279 --> 01:25:55.920
Oh, interesting.
01:25:56.399 --> 01:26:00.560
So we can treat them together, and that is a nice way to sort of read them and explain it to people.
01:26:00.800 --> 01:26:04.800
You write one plus the sum divided by the tally.
01:26:05.439 --> 01:26:06.479
Yeah, but there is no binding.
01:26:08.560 --> 01:26:10.000
Yeah, there's no binding.
01:26:10.319 --> 01:26:10.560
No.
01:26:11.119 --> 01:26:18.640
Or if you would say the binding here is is of all three rightmost carriages the sum, the division, and the legend.
01:26:18.880 --> 01:26:20.079
Yeah, you could say that.
01:26:20.319 --> 01:26:22.960
Although it it will parenthesize it like that, right?
01:26:23.039 --> 01:26:26.399
If you remove the argument now and press enter, it will be like that.
01:26:26.560 --> 01:26:28.159
No, it just kind of spaces it out like this.
01:26:28.560 --> 01:26:29.359
That's interesting.
01:26:29.680 --> 01:26:31.439
It used to have parentheses, I think.
01:26:31.520 --> 01:26:31.920
I'm not sure.
01:26:32.079 --> 01:26:36.000
Well no, it doesn't some in some cases I've seen it in adds parenthesis.
01:26:36.239 --> 01:26:41.760
Um, trains it doesn't, but maybe it should.
01:26:43.359 --> 01:26:44.479
How have you found this?
01:26:44.560 --> 01:26:47.760
I mean, so you've you've done some J programming, you've done some Wi WAP programming.
01:26:48.000 --> 01:26:53.680
Well, how do you find this tacit model compared to your other and you you also did some Tiny Apple?
01:26:54.560 --> 01:26:56.079
I quite like it.
01:26:56.399 --> 01:27:05.279
I think it's basically if you want to use it, like how you write trains in APL, it's basically the same.
01:27:05.520 --> 01:27:08.800
It just lets you have more options, kind of.
01:27:09.119 --> 01:27:22.720
And it means that there are more things that you can write shorter and more patterns that you can express tacitly, or at least tacit with um without lots of parentheses or combinators.
01:27:23.279 --> 01:27:39.680
Um and but you still have the combinators before and after and all of them, if you you know, if you need them, and you can combine them with trains, which I think basically means whatever you want, you very rarely are gonna need to add extra parentheses to a train.
01:27:40.640 --> 01:27:42.000
That sounds like a dream to me.
01:27:42.159 --> 01:27:44.319
We all know that parentheses are the worst.
01:27:48.239 --> 01:27:49.680
Yes, yes, fewer.
01:27:49.920 --> 01:27:54.319
That you the left text and right text are only for dyadic functions.
01:27:54.560 --> 01:27:57.600
You still have identity, which you have to use sometimes.
01:27:58.000 --> 01:27:59.840
This is just the monadic identity.
01:28:00.399 --> 01:28:02.720
Function, but it doesn't come up that often.
01:28:02.960 --> 01:28:05.920
And like, for example, with this actually I'm trying to remember.
01:28:06.079 --> 01:28:17.439
Yeah, with this, you do need identity to the right to have it like this, because otherwise, if you have the dyadic function as the leftmost time, it wants to read it as a fork.
01:28:17.520 --> 01:28:18.720
So you would have it like that.
01:28:19.119 --> 01:28:25.680
But you could also you could also express this if you go back to the the previous one where you're adding the density to the average.
01:28:25.920 --> 01:28:26.159
Yeah.
01:28:26.399 --> 01:28:27.600
And one up there, that one.
01:28:27.680 --> 01:28:31.359
You can instead of drawing this, we can write that as a as a hook, right?
01:28:31.439 --> 01:28:33.199
So you can remove the that density.
01:28:33.359 --> 01:28:33.600
Yes.
01:28:33.840 --> 01:28:38.960
And then you write on the right of the plus, you write after, and then you but then you have to add parentheses there.
01:28:39.520 --> 01:28:40.399
Yeah, like this.
01:28:40.560 --> 01:28:40.800
Yeah.
01:28:40.960 --> 01:28:43.760
Although you actually need to put self because of the way it is.
01:28:44.000 --> 01:28:44.640
But yeah.
01:28:44.960 --> 01:28:46.079
Oh, all right.
01:28:46.479 --> 01:28:48.399
There's no there's no monetic hook.
01:28:48.640 --> 01:28:53.600
But you can write it as before plus, and that will do what you want.
01:28:53.920 --> 01:28:59.439
Yeah, that's actually eerily similar to what dialogue has with with beside and before.
01:28:59.600 --> 01:29:04.239
They all they one of them also needs needs the self and the other one doesn't.
01:29:04.880 --> 01:29:05.439
Yeah.
01:29:05.760 --> 01:29:10.000
Wait, so why why is there no monadic hook?
01:29:10.319 --> 01:29:12.159
There is, but only one, not two.
01:29:12.560 --> 01:29:13.439
So that's things, yeah.
01:29:13.520 --> 01:29:15.199
Like BQN like one.
01:29:15.279 --> 01:29:16.319
This is the hook.
01:29:16.399 --> 01:29:17.119
That's like that.
01:29:17.279 --> 01:29:23.119
But if you have like this is uh monadic hook, but this is dyadic.
01:29:23.600 --> 01:29:29.039
If you ha it depends on if the the dyadic hooking function basically is on the left.
01:29:29.119 --> 01:29:33.439
Because if it's on the left, then it wants to read this um as the left argument.
01:29:33.520 --> 01:29:36.800
Whereas if it's on the right, then actually wait what?
01:29:37.119 --> 01:29:40.560
No, one of them becomes a projection, they're not hooks, both of them.
01:29:41.439 --> 01:29:42.399
Whatever you want to call it.
01:29:42.479 --> 01:29:44.479
Actually, this one I'm not sure why it does that.
01:29:45.199 --> 01:29:47.279
Maybe it's actually I think I know why.
01:29:47.439 --> 01:29:49.279
I think it's this is a weird case.
01:29:49.359 --> 01:29:53.359
I think it might be parsed as a top, but I'm not sure.
01:29:53.600 --> 01:29:55.600
The right the hooks are weird basically.
01:29:55.680 --> 01:30:04.960
I try to avoid right using hooks because uh they're a little unpredictable because there's so many ways they could be, and I always forget which one it is.
01:30:05.199 --> 01:30:07.279
So I might change them in the future.
01:30:07.840 --> 01:30:12.800
But but you don't need them so much because of the cleverness of uh before and after.
01:30:12.880 --> 01:30:14.159
Those are explicit hooks.
01:30:14.239 --> 01:30:16.319
I mean yes when you use them correctly.
01:30:16.479 --> 01:30:20.000
So so using a tested hook here is not really that valuable.
01:30:20.319 --> 01:30:32.079
But yeah, but there was only one monadic hook, so like I think of the like there's S and Sigma, like a monadic hook and monadic back hook, but you've only got one of those via the before and after, or you have both of them?
01:30:32.399 --> 01:30:34.159
Well, you have both if you use self.
01:30:34.399 --> 01:30:35.920
I think if that's what you mean.
01:30:36.239 --> 01:30:39.840
Like if you write that's the same, it's the same thing in AP in dialogue APL.
01:30:39.920 --> 01:30:42.000
You also only have one, but you have both if you use self.
01:30:42.319 --> 01:30:42.800
I see.
01:30:43.119 --> 01:30:56.479
If you write a plus after average, what it wants to do is there like this could be monadic, but it could also be having the left argument be passed to this plus.
01:30:57.039 --> 01:31:04.079
So it just does that because that's the more general version, and if you do want the more specific, it's just one character you add self.
01:31:04.239 --> 01:31:05.359
So I thought it was more useful.
01:31:05.680 --> 01:31:17.760
So if you come full circle to those lookup tables, basically we've got the after operator here, and it says in it says diad after m monad is a diad, right?
01:31:18.000 --> 01:31:18.960
Strictly a diet, right?
01:31:19.039 --> 01:31:25.760
You cannot apply it monadically, therefore you have to to use the self to change uh the diad into a monad.
01:31:26.319 --> 01:31:34.640
Yeah, but this is ex this is exactly equivalent to how you have it in dialogue APL right now, just happens to be it falls out like that, right?
01:31:34.720 --> 01:31:43.359
If you write, if you write plus beside average, right, then it will apply the try well, it's not exactly the same, it's very similar.
01:31:43.439 --> 01:31:51.840
It will not try to apply the plus statically and and make a projection like this, but it will just apply the plus monetically because there's not there's no left argument.
01:31:52.079 --> 01:31:54.319
If you gave it a left argument, it would be it would be the same.
01:31:54.479 --> 01:31:57.039
If you put the self, then it does what you expect it to do.
01:31:57.279 --> 01:32:02.640
But if you do average before um plus, then it does what you want.
01:32:03.039 --> 01:32:09.840
So basically you're saying that in APL in dialogue, you have both this and this are allowed.
01:32:10.239 --> 01:32:12.000
Yeah, because because they're ambividance, right?
01:32:12.079 --> 01:32:15.680
So they do they they do both of them are applied immediately, one is just an atop.
01:32:15.920 --> 01:32:19.760
But the effect is that we've got three different top operators in a in dialogue.
01:32:20.159 --> 01:32:31.840
Yeah, because because of the ambividance, then they'll have yeah, we could have defined them as having different meanings, but we didn't because it makes the most intuitive sense that that monetic at top and the over and beside they all do the same thing.
01:32:32.159 --> 01:32:37.119
I guess beside could have been different, but that's the original composition and dialogue APL, so we can't go back and change that.
01:32:37.359 --> 01:32:40.000
Whereas I think tiny APL fixes that.
01:32:40.159 --> 01:32:51.039
So I I yeah, I can see this making sense, but it's but again, it does require you to be intimately familiar with your compositional operators, which you'll learn in no time, of course, if you use this in anger.
01:32:51.439 --> 01:33:01.199
Yeah, yeah, like this this pattern of having dyad after something self does come up fairly frequently, I would say.
01:33:03.039 --> 01:33:04.560
So you get used to it.
01:33:05.279 --> 01:33:06.000
Interesting.
01:33:06.159 --> 01:33:07.359
So much food for thought.
01:33:07.520 --> 01:33:13.359
All right, so we've already, like I said, blown past the hour and a half mark, as per usual, as per usual.
01:33:13.600 --> 01:33:19.119
And I guess maybe uh a last thing, well, um two last things, because I've forgotten to bring this up.
01:33:19.279 --> 01:33:24.560
We haven't talked about the typing mechanism, which is clearly quasi-influenced by Weewa yet slightly different.
01:33:25.039 --> 01:33:29.039
And talk to us about that, and then also is there a rhyme or reason?
01:33:29.119 --> 01:33:36.560
Because when I first started using this, I could not figure out when to drop the third letter, when to when to just use the first three letters.
01:33:36.720 --> 01:33:39.119
There seems to be some some differences.
01:33:39.199 --> 01:33:45.119
So, anyways, talk to us about the input method and are there tips for mastering it quickly?
01:33:45.600 --> 01:33:46.239
Yes.
01:33:46.640 --> 01:33:49.920
So the input method is quite simple.
01:33:50.079 --> 01:33:53.359
It is influenced by Wewa, but it's simpler than in Wea.
01:33:53.600 --> 01:33:56.159
Um, it's less powerful, but it's simpler.
01:33:56.560 --> 01:34:08.399
And uh what you have is rather than having a keyboard, and of course you could have a keyboard, I just prefer Wewa's way, you have each of these symbols having an alias of letters.
01:34:08.479 --> 01:34:14.720
And if you use the tooltips in the grid where you hover, it tells you equal alias eq.
01:34:15.359 --> 01:34:20.319
So if I type in EQ, it formats to the equals function of the glyph.
01:34:20.479 --> 01:34:23.439
And if I type in equal, that's just gonna be an error.
01:34:23.520 --> 01:34:25.680
It only works if I type in exactly EQ.
01:34:26.159 --> 01:34:31.439
And all of these glyphs have an alias that you can type easily.
01:34:31.760 --> 01:34:35.359
Like negate, this is a weird one, it's not N-E-G, it's N-G.
01:34:36.640 --> 01:34:40.960
And but the main thing is that every single function has one.
01:34:41.039 --> 01:34:44.399
So if you learn all of the aliases, then you can easily type them.
01:34:44.720 --> 01:34:46.159
Wait, some have two, right?
01:34:46.479 --> 01:34:47.359
Do some have two?
01:34:47.439 --> 01:34:47.920
I don't think so.
01:34:48.079 --> 01:34:52.800
Oh, negate has the only that's the only one with two, I think.
01:34:53.039 --> 01:34:55.760
Negate you can use back tick or ng.
01:34:55.920 --> 01:35:05.279
I did it like that because backtick is easier, but people have dead keys sometimes on backtick, so it's just for those people it's easier.
01:35:05.680 --> 01:35:08.720
And is there a method to the the alias?
01:35:08.960 --> 01:35:14.960
Because that was the part that like for pair it's par, but then for a lot of them it's the first three letters.
01:35:15.119 --> 01:35:18.479
Is there a do you just have to memorize them for when it's not the maybe?
01:35:18.560 --> 01:35:20.000
I should change it to P A I.
01:35:20.239 --> 01:35:20.800
I don't know.
01:35:20.880 --> 01:35:22.000
It's kind of random.
01:35:22.159 --> 01:35:25.760
There's no Yeah, even sort sort up is S R U.
01:35:26.000 --> 01:35:26.800
I'm not really sure.
01:35:26.960 --> 01:35:27.520
Oh yeah, yeah.
01:35:27.680 --> 01:35:30.159
Grade up is G grew, yeah.
01:35:30.399 --> 01:35:35.840
And have you made sure that there aren't any like prefixes, suffixes that that clash to each other?
01:35:36.319 --> 01:35:38.479
Self is SLF, you know.
01:35:38.800 --> 01:35:44.399
Yeah, could but could it be could it be like you don't have to write spaces between these, right?
01:35:44.560 --> 01:35:44.880
No.
01:35:45.039 --> 01:35:48.079
So so how do you make sure that you don't clash?
01:35:48.560 --> 01:35:50.640
It's yeah, that is a good question.
01:35:50.800 --> 01:35:55.119
And there are some cases that clash, like pi and pick.
01:35:55.600 --> 01:35:55.920
Oh yeah.
01:35:56.159 --> 01:35:57.119
Um where's pick?
01:35:57.439 --> 01:35:59.760
Pick is P I C pi is P I.
01:36:00.319 --> 01:36:02.880
So it just has to do it greedily, basically.
01:36:03.039 --> 01:36:10.640
If you write pi P I P I C, it formats the pie pick, but if you write P-I-C-P-I, it formats the pick pie.
01:36:10.880 --> 01:36:12.159
So yeah, it's greedy.
01:36:12.800 --> 01:36:15.119
Okay, but that's that's like that.
01:36:15.359 --> 01:36:16.720
Is there anything that begins with a C?
01:36:16.880 --> 01:36:17.920
That's the question.
01:36:18.239 --> 01:36:20.479
Oh, P I Yeah, the cell.
01:36:22.560 --> 01:36:24.960
If you write P P P I C L it errors.
01:36:25.279 --> 01:36:26.960
Yeah, so that's so this one is unambiguous.
01:36:29.039 --> 01:36:31.119
Semicolon, it just formats to nothing.
01:36:31.359 --> 01:36:32.000
Oh, I see.
01:36:32.159 --> 01:36:32.479
Okay.
01:36:33.039 --> 01:36:34.239
It's less than nothing.
01:36:34.399 --> 01:36:36.560
It's not like nothing in VQN, it's like nothing.
01:36:36.800 --> 01:36:38.960
No, literally it formats to nothing.
01:36:39.199 --> 01:36:41.760
But you could also you could also write a space in between, right?
01:36:41.840 --> 01:36:42.640
Wouldn't that do the same thing?
01:36:42.880 --> 01:36:48.479
Yes, you can write a space, but if you don't want there to be a space in the output, then oh right, see that that survives.
01:36:48.560 --> 01:36:50.159
Yeah, it doesn't reformat it, so to say.
01:36:50.479 --> 01:36:51.359
Okay, so it's greedy.
01:36:58.319 --> 01:36:59.199
All right, so there we go.
01:36:59.520 --> 01:37:01.119
We're formatter is much more advanced.
01:37:01.359 --> 01:37:02.479
Yeah, the we wa one.
01:37:02.560 --> 01:37:09.760
And uh, you know, if I add this to a ray box at some point, then you know, poof, you just control space, you won't have to memorize the aliases.
01:37:10.000 --> 01:37:19.760
And but so uh as a final question, we have uh talked about a ton of the glyphs before, after, table or outer product, transpose, reverse, iota.
01:37:20.239 --> 01:37:22.560
Are there I mean we we haven't talked about them all though.
01:37:22.640 --> 01:37:30.640
So I'm I'm I said we could go through them rapid fire, but maybe uh I mean it doesn't it doesn't it's not very meaningful to talk about the comparison glyphs, which are like the first six.
01:37:30.800 --> 01:37:34.239
Are there any glyphs or primitives that you want to highlight?
01:37:34.399 --> 01:37:36.720
I mean, we haven't talked about sort up, sort down.
01:37:36.880 --> 01:37:42.319
We they were just mentioned, but they either borrow from tiny apes, tiny apple.
01:37:42.560 --> 01:37:43.359
Tiny APL, yeah.
01:37:43.520 --> 01:37:52.319
Yeah, as close, very close to the desired sort glyphs that Adam wants for dialogue APL, not identical, but closer than what BQN and Ape.
01:37:52.800 --> 01:37:59.840
They're the less than, greater than, but with triangles instead of the less than I mean you could sort of argue against that, right?
01:38:00.079 --> 01:38:05.840
Saying, do I really desire more overloading of monetic dietic type thing after seeing a fixed APL?
01:38:06.000 --> 01:38:08.560
But I also designed not adding too many glyphs.
01:38:08.880 --> 01:38:09.520
So yeah.
01:38:09.840 --> 01:38:11.840
Well, I mean you're already in dialogue APL land.
01:38:11.920 --> 01:38:15.439
It's not like it's not like you're getting rid of ambivalence at this point.
01:38:15.600 --> 01:38:29.600
Um and these sorting functions are sort of only partially implemented right now because they only support sorting lists of numbers or characters, so they don't have any of the fancy array ordering stuff BQN has yet.
01:38:30.560 --> 01:38:36.079
Any other favorite groups that are yeah worth bringing up though that yeah, what um fat transpose is interesting.
01:38:36.239 --> 01:38:39.279
What what would you think this is I just fill up from Wiwa.
01:38:40.319 --> 01:38:48.720
I don't know what I don't know what it does in in Wiwa because the two different magnetic transpose can can do two of the two couple of different things on high-rank arrays.
01:38:49.039 --> 01:38:50.239
It does, I can show you.
01:38:50.319 --> 01:38:52.399
If I do like okay.
01:38:52.800 --> 01:38:59.920
Okay, so it does the it does a it does a one reshape zero it does a one a one rotate of the of the shape.
01:39:00.079 --> 01:39:02.479
Yeah, like if we do shape, yeah.
01:39:02.800 --> 01:39:03.039
Right.
01:39:03.119 --> 01:39:07.680
So in the shape of transposing uh shape two three four goes to three, four, two.
01:39:08.159 --> 01:39:10.960
But you don't have a generalized transpose then, right?
01:39:11.119 --> 01:39:12.159
But you haven't reordered it.
01:39:12.239 --> 01:39:15.439
No, I probably will add it, but I haven't.
01:39:15.760 --> 01:39:26.479
Because if you if you uh depending on the rank and transpose to do anything, since you don't have like access modifiers and things, you really need a generalized transpose, otherwise it gets really tricky.
01:39:26.560 --> 01:39:31.680
You have to do use lots of with like transpose cells and stuff.
01:39:31.920 --> 01:39:33.359
Yes, you could well that's not enough.
01:39:33.439 --> 01:39:41.279
You have to have transpose rank, but then you have to do multiple transposes to if you want an arbitrary order of the of the then you need multiple transposes, yeah.
01:39:41.520 --> 01:39:53.680
And multiple transposes, and each time you have to first move things to the end, and then you yeah, it's it's not perfect, but yeah, yeah, but it can it can happen, it can happen, yeah.
01:39:53.920 --> 01:40:04.560
There's also there's definitely cases where you have like transpose, transpose, you know, it comes up, especially because you've got the re the reshape.
01:40:04.880 --> 01:40:13.920
So yeah, Jay has a fancy reshape, and Marshall went for the simple APL reshape, and then he regretted to do it doing that.
01:40:14.079 --> 01:40:16.800
But I don't I don't know if you've had any thoughts about that.
01:40:16.880 --> 01:40:18.479
No, it seems it seems to have the APL.
01:40:18.800 --> 01:40:20.720
I don't one I don't know what I did.
01:40:20.800 --> 01:40:33.600
Uh it just cycles it, like yeah, but yeah, but that's that's the point is it is revel reshape it just like reshape has an implicit revel or flatten or whatever you call it, right?
01:40:33.680 --> 01:40:40.239
Yeah, it always flattens its art right argument before it reshapes, whereas in J it doesn't do that, it works on on cells.
01:40:40.479 --> 01:40:48.560
Yes, so if you do like a two by two reshape enough for two by two, then you would get two by two by two by two in in J but not in AP.
01:40:49.119 --> 01:40:52.319
And yeah, I do like that.
01:40:52.479 --> 01:40:53.680
I thought it was cool.
01:40:53.920 --> 01:40:55.600
It's complicated basically.
01:40:55.680 --> 01:40:56.800
Uh it's not that hard.
01:40:56.880 --> 01:40:57.920
I guess I could implement it.
01:40:58.000 --> 01:41:01.520
I feel like you can do similar stuff by just enclosing it and then merging it though.
01:41:01.600 --> 01:41:03.680
So like uh yeah, you can do that.
01:41:04.000 --> 01:41:08.399
Jade sort of tries to avoid having to do that kind of thing, but it's a classic API pattern.
01:41:08.560 --> 01:41:10.079
What does the fixed function do?
01:41:10.399 --> 01:41:11.119
The diamond.
01:41:11.680 --> 01:41:14.000
Yeah, so I actually I just added it yesterday.
01:41:14.159 --> 01:41:17.199
So maybe I can talk about these four functions.
01:41:17.279 --> 01:41:20.479
They're pretty simple, but they have a nice relationship.
01:41:20.800 --> 01:41:22.960
So the square is enclosed.
01:41:23.359 --> 01:41:29.680
I got that from Wewa, which uses the square for box because enclosing and boxing are very similar.
01:41:30.079 --> 01:41:36.079
Um then this diamond is uh called fix.
01:41:36.239 --> 01:41:38.079
I'm planning to rename it probably.
01:41:38.159 --> 01:41:39.760
That's just what we will call it.
01:41:40.000 --> 01:41:42.800
It just adds a leading one axis to an array.
01:41:43.039 --> 01:41:43.760
Ah, okay.
01:41:43.920 --> 01:41:44.319
I see.
01:41:44.479 --> 01:41:47.039
It's um I might call it promote, yeah.
01:41:47.119 --> 01:41:48.720
I think is that the more normal term?
01:41:49.359 --> 01:41:58.560
I mean it's a sort of a new concept to do that, but I think I came up with the name promote and demote because he was talking about rank, so increasing the rank is a promotion.
01:41:58.960 --> 01:41:59.279
Yeah, yeah.
01:41:59.439 --> 01:42:01.199
So maybe I'll call it promote, I'm not sure.
01:42:01.359 --> 01:42:02.720
Currently it's called fix.
01:42:02.880 --> 01:42:09.039
And then this one is pair, which makes a list of the two, I think.
01:42:09.439 --> 01:42:13.439
And the diamond with the line through it is couple.
01:42:13.520 --> 01:42:15.119
Let me let me double check that I have that right.
01:42:15.199 --> 01:42:18.399
Yeah, the diamond is couple, which ah, okay.
01:42:18.479 --> 01:42:19.840
I see that's that's very clever.
01:42:20.479 --> 01:42:22.079
Yeah, I like that.
01:42:22.479 --> 01:42:24.159
Yes, I was quite proud of myself.
01:42:24.239 --> 01:42:25.600
I just thought of this yesterday.
01:42:25.840 --> 01:42:28.720
So this is this is it not something you got from Weewa, no?
01:42:28.960 --> 01:42:31.920
No, well, it's inspired by Weewa, but it's not quite the same.
01:42:32.079 --> 01:42:37.279
So Wewa but also uses these two symbols, but they don't have quite the same relationship.
01:42:37.600 --> 01:42:39.119
Right, no, but this is beautiful, right?
01:42:39.359 --> 01:42:40.640
Conor, are you getting this?
01:42:40.960 --> 01:42:44.560
No, the insight you you had before the explanation was done.
01:42:44.960 --> 01:42:46.560
So this is explained this.
01:42:46.960 --> 01:42:52.159
Yeah, that that the boxing one, right, adds a net level of nesting, if you want.
01:42:52.800 --> 01:43:01.520
And the if you turn it 90 degrees, so you get the diamond shape, it doesn't add a level of nesting, it adds a level of axis of the outer dimensions.
01:43:01.680 --> 01:43:10.000
And if you add a horizontal bar on it, then it does that to the argument, but stacking things on top of each other onto the argument.
01:43:10.079 --> 01:43:15.680
So it's like an over, they are the same thing as catenate over the unbarred version, right?
01:43:16.000 --> 01:43:16.880
If I understand right.
01:43:17.119 --> 01:43:19.359
Um just about, yeah, yeah.
01:43:19.680 --> 01:43:22.720
Yeah, so cat if you write catenate over boxes.
01:43:23.199 --> 01:43:34.159
Yeah, pair is it puts the two in a list and couple puts the two it puts the two in an array together with a two-axis in front.
01:43:34.880 --> 01:43:36.880
But that's the same thing, right?
01:43:36.960 --> 01:43:42.239
So but it's not a list because it's not like it's yeah, it's what you said basically.
01:43:42.640 --> 01:43:46.319
I think it's catenate uh over that, yeah.
01:43:46.640 --> 01:43:48.000
I'm just trying trying it out here.
01:43:48.079 --> 01:43:48.880
Yeah, okay, there it is.
01:43:48.960 --> 01:44:05.760
Yeah, so you if you write if you write at the yeah, it's kind of the left bottom left one, so so the what I can call it, pair pair is catenate over box and couple is casinate over fix or whatever uh promote promote.
01:44:06.000 --> 01:44:09.119
Which is that's a beautiful relationship in the in the visuals of it.
01:44:09.199 --> 01:44:10.000
I really like that.
01:44:14.800 --> 01:44:15.600
Is in the font.
01:44:15.760 --> 01:44:25.680
Apparently, Madeline I'm using Tiny Apple 386 for this, so yeah, apparently Madeline added it for strawberry, which I don't know if it's used yet, but yeah.
01:44:26.000 --> 01:44:29.680
Yeah, so so it bothered me in in PQN's choice of glyphs.
01:44:29.920 --> 01:44:46.880
That it has it doesn't really like for for the couple one, it's just like two bows, like kind of like the stranding bow, but two of them opposite each other, and then it uses the butterfly symbol for the enlist, and it doesn't really tell me what's what, they sort of do the same thing.
01:44:47.119 --> 01:44:48.239
But this was really nice.
01:44:48.319 --> 01:44:52.479
I mean you can remember that the enclosing is boxing, or you don't have to call it in close, you just call it box.
01:44:52.640 --> 01:44:55.119
Jay calls it box, Shop A calls it box.
01:44:55.279 --> 01:45:05.600
Yeah, and you put it in the box like okay, and then you to if boxing sort of turned on its side, it is increasing rank, and you can sort of see the yeah.
01:45:06.079 --> 01:45:17.119
It also has a relationship to the array notation where where you use the square braces you have higher rank, and when you use the diamond braces, you have the list.
01:45:17.279 --> 01:45:20.880
Although it's a little inverted, but it it is connected to that also.
01:45:21.439 --> 01:45:22.479
It would be the opposite.
01:45:22.640 --> 01:45:27.119
I mean, yeah, it's a bit inverted, which is but it's I don't know.
01:45:27.279 --> 01:45:32.159
I guess in a perfect world it would be different, but I like the square being boxed, so I don't want to change it.
01:45:32.560 --> 01:45:33.119
That's it.
01:45:33.279 --> 01:45:36.720
Yeah, yeah, I mean too, but um you might change the array notation instead.
01:45:36.960 --> 01:45:38.960
Yeah, I guess I could change the array notation.
01:45:39.119 --> 01:45:40.000
That would work.
01:45:40.319 --> 01:45:47.039
Uh it would be weird to have fixed APL be the only array notation to have the square and the diamond one swapped.
01:45:47.359 --> 01:45:57.199
I mean, I if I could start over with everything, uh then I think I would use square brackets for just for lists because that would make it a superset of JSON.
01:45:57.520 --> 01:45:58.159
Yeah, true.
01:45:59.039 --> 01:46:08.319
If you're using anyway like BQN uses comma, comma uses comma for separators between between elements, then it would really be like JSON, and and a lot of JSON would be valid.
01:46:08.560 --> 01:46:10.720
It does use comma here for this, yeah.
01:46:11.039 --> 01:46:13.840
Yeah, so then so that would be a good argument.
01:46:14.000 --> 01:46:18.399
Now, is it a good idea to use square brackets for like JSON does or JavaScript does it?
01:46:18.479 --> 01:46:22.560
I maybe not, but pragmatically with the way the world is today, that's sort of nice.
01:46:22.880 --> 01:46:23.359
Yeah.
01:46:23.600 --> 01:46:24.640
And then then it would be a good idea.
01:46:24.800 --> 01:46:26.159
Maybe maybe I'll think about it.
01:46:26.239 --> 01:46:27.600
Yeah, maybe I should.
01:46:27.920 --> 01:46:31.119
Well, so yeah, that's that's a great thing to uh have final question.
01:46:31.199 --> 01:46:32.239
Is what are the plans?
01:46:32.319 --> 01:46:37.039
I mean, uh obviously you're still making changes, but like what's your grand plan?
01:46:37.199 --> 01:46:48.159
Is this gonna take over uh unseat all the other array languages and one an array language to rule them all, or are you just gonna I don't I assume you're still in school, so you gotta finish that too.
01:46:49.680 --> 01:46:59.520
Yeah, I am I don't think I have the time or the budget to do something like that, but I do quite like this as a foundation.
01:46:59.760 --> 01:47:03.600
I don't think I I'm gonna keep expanding it, making it better.
01:47:03.840 --> 01:47:15.840
Like, for example, one thing I really want to do is currently you can only use it on this website, so I want to add uh you know uh a version that you can run locally on your computer also.
01:47:16.560 --> 01:47:20.399
Um and you know, adding documentation, things like that.
01:47:20.640 --> 01:47:21.520
But I don't know.
01:47:21.680 --> 01:47:35.439
I mean, I do have some plans to uh eventually make another array language with fixed arity, but with left to right actually instead of right to left.
01:47:35.520 --> 01:47:38.720
And it it it's quite different from fixed APL.
01:47:38.800 --> 01:47:48.800
Um, I don't want to say too much because I feel like whatever I say is gonna change, but I I've been thinking about making another one for even before I made fixed APL.
01:47:49.039 --> 01:47:50.000
So I don't know.
01:47:50.079 --> 01:47:51.359
But it would take a lot longer.
01:47:51.760 --> 01:48:03.840
Any advice for folks out there, you know, uh that are budding programming language uh designers that uh don't have the confidence that you had to start your own and put it out in the world?
01:48:04.399 --> 01:48:05.920
Do I have any advice?
01:48:06.159 --> 01:48:06.800
I don't know.
01:48:06.960 --> 01:48:09.359
I guess I would say just start.
01:48:09.439 --> 01:48:18.079
I don't know, start with something small, maybe, and then the smaller you start with, you know, s keep starting over and add building on, you know.
01:48:18.239 --> 01:48:26.479
I I'm I'm not sure on the if I have all of the expertise, perhaps, to you know, be giving all this advice.
01:48:26.640 --> 01:48:31.199
I mean, I made the language, but you know, I don't have 20 years of experience.
01:48:31.760 --> 01:48:33.039
I don't think you need 20 years of experience.
01:48:33.439 --> 01:48:35.600
Only started coding a few years ago.
01:48:35.680 --> 01:48:37.600
I'm 17, like you know.
01:48:38.319 --> 01:48:40.880
Well, I mean, I I think it's it's so impressive what you've done.
01:48:40.960 --> 01:48:50.560
If I was 17 years old and uh and had uh an array language like this, and the thing is, I think the the most really impressive part of it is that you've you've explored like a new space.
01:48:50.720 --> 01:48:56.079
Like I've been talking about a fixed arity like APO for I don't know however long.
01:48:56.239 --> 01:49:03.680
And and I was just reading the other day, I think it was because it was on your site that you had a link to Marshall's complaints about ambivalence.
01:49:03.840 --> 01:49:06.640
Yeah, the ambivalence.com here.
01:49:06.880 --> 01:49:15.840
Yeah, it comes up all the time, like literally just last uh array cast, we were chatting about you know readability and is it is it the number of glyphs in tiny apple or etc.
01:49:16.159 --> 01:49:21.359
Anyways, and so when I discovered Jelly, I thought to myself, like, oh, what we really need.
01:49:21.520 --> 01:49:22.640
Oh, there goes Adam.
01:49:22.800 --> 01:49:24.239
He may or may not be back.
01:49:24.560 --> 01:49:33.840
But that when I discovered Jelly, my my first thought was like, how come there hasn't been like a APL like glyph language that kind of explores this space?
01:49:34.000 --> 01:49:36.880
Because it is a very interesting, tacit model, right?
01:49:36.960 --> 01:49:41.520
Just having fixed airity and then dispatching based on the pattern.
01:49:41.760 --> 01:49:46.560
And then I guess yeah, you've taken influence from a ton of languages, but I love it.
01:49:46.640 --> 01:49:51.600
Like I loved it when I I discovered Cap, when I discovered Tiny Apple, when I discovered Weewa.
01:49:51.920 --> 01:49:59.600
It's always just so exciting, especially when it's like a new space is explored, because then you know the other languages get to.
01:50:00.239 --> 01:50:03.439
See, you know, what what falls out of this design.
01:50:03.600 --> 01:50:11.439
And even in the comments, I saw Kai said that they were going to incorporate something into their documentation just based on this conversation.
01:50:11.520 --> 01:50:13.199
Anyways, it's so it's it's just fantastic.
01:50:13.920 --> 01:50:19.119
Um so, anyways, you're saying I don't have 20 years of experience, and you also haven't even been alive that long.
01:50:19.600 --> 01:50:22.800
But uh yeah, I just think it's it's awesome that you've done this project.
01:50:22.880 --> 01:50:25.680
I really hope that yeah, you continue to explore this stuff.
01:50:25.840 --> 01:50:30.319
Very excited to see you're already similar to Madeline, you're already thinking about a second array language.
01:50:30.479 --> 01:50:32.239
And it's gonna be awesome.
01:50:32.399 --> 01:50:36.960
In the future, we're gonna have like 20 different array languages, all with different trade-offs.
01:50:37.119 --> 01:50:40.000
So I guess, yeah, the last thing is folks can check this out.
01:50:40.239 --> 01:50:42.640
I believe the URL is netlify.
01:50:43.439 --> 01:50:46.000
Yeah, fixapl.netlify.app.
01:50:47.359 --> 01:50:50.399
And yeah, uh there's also a GitHub repository.
01:50:50.720 --> 01:50:51.199
Okay, yeah.
01:50:51.279 --> 01:50:54.880
And this does have, like you said, it has minimal docs, not for everything.
01:50:54.960 --> 01:50:58.560
But there are docs on on the readme.md.
01:50:59.199 --> 01:51:03.600
There are docs for some of the functions, but not all of them.
01:51:03.680 --> 01:51:06.560
There's a lot of missing stuff, especially the modifiers.
01:51:06.800 --> 01:51:12.000
So I'll work on that in the coming, you know, coming however much time it takes me.
01:51:12.159 --> 01:51:12.800
I don't know.
01:51:13.039 --> 01:51:13.760
Eventually.
01:51:13.920 --> 01:51:16.960
I've already got the foundation of the UI, but yeah.
01:51:17.039 --> 01:51:22.159
I mean, being able to play around it arguably is is well, is it more important?
01:51:22.239 --> 01:51:24.079
You know, it gives people the ability like me.
01:51:24.159 --> 01:51:26.479
Like I was already messing around with it and discovering stuff.
01:51:26.560 --> 01:51:30.079
And I've tried a dozen languages with zero documentation, yeah.
01:51:30.319 --> 01:51:30.880
Yeah, yeah.
01:51:31.039 --> 01:51:32.560
I mean, and you've got the source, you know.
01:51:32.640 --> 01:51:33.600
Did I go read the source?
01:51:33.680 --> 01:51:38.319
No, but you can go ask a tool to go parse it and answer questions.
01:51:38.399 --> 01:51:40.479
Um yeah, or ask me, you know.
01:51:40.560 --> 01:51:44.640
I'm happy to Oh yeah, what's the best is are you I assume you're on the um the Apple Discord?
01:51:44.960 --> 01:51:48.960
Yeah, I'm on Discord at Jacob.abc.
01:51:49.439 --> 01:52:02.239
I'm also on you can you can DM me or you can message me in the Wea server or in the APL farm server, uh whatever works.
01:52:02.319 --> 01:52:02.560
Yeah.
01:52:03.039 --> 01:52:03.439
Awesome.
01:52:03.760 --> 01:52:13.119
I will uh I'm not sure if you can link to a specific user, but if I can I'll find a way to put those in the description or the the show notes.
01:52:13.279 --> 01:52:14.720
And uh yeah, thank you so much for coming on.
01:52:16.319 --> 01:52:18.560
Yeah, yeah, no problem.
01:52:18.960 --> 01:52:22.079
This has been uh it was I was very happy to talk about it.
01:52:22.159 --> 01:52:23.039
This has been a lot of fun.
01:52:23.520 --> 01:52:30.079
Okay, wait, we're letting Adam he's been kicking back people admit one guess.
01:52:30.239 --> 01:52:31.600
We're doing it all live, folks.
01:52:31.760 --> 01:52:32.960
I see, he was blocked out.
01:52:33.439 --> 01:52:35.119
Alright, we were just wrapping up, Adam.
01:52:35.520 --> 01:52:37.119
We were saying thanks for coming on.
01:52:37.199 --> 01:52:42.399
We're giving people uh links to try out fix APL and links to reach Jacob.
01:52:42.560 --> 01:52:43.840
Any final words from you, Adam?
01:52:44.000 --> 01:52:45.920
Sorry, you you missed you missed my whole ramble.
01:52:46.000 --> 01:52:46.960
I guess you can catch it in post.
01:52:47.199 --> 01:52:48.399
Oh no, I could hear you all right.
01:52:48.479 --> 01:53:02.720
I just turned it on on YouTube, but I couldn't get back in because Google decided in their wisdom that uh I needed to uh something might have changed in my user account, and therefore I need to be letting it as proclamation to continue.
01:53:02.880 --> 01:53:04.720
So yeah, we're ready for that.
01:53:06.960 --> 01:53:07.920
What the hell?
01:53:08.720 --> 01:53:11.920
Okay, I was just trying to show I'm not sure what was happening with the screen.
01:53:12.000 --> 01:53:15.279
I was just trying to show a little Mandelbratz example I added to the website.
01:53:15.760 --> 01:53:17.760
There's also a Sophinsky triangle here.
01:53:19.439 --> 01:53:23.439
Every new language has got the uh the in-repo graphics now, you know?
01:53:23.520 --> 01:53:24.079
It's uh yeah.
01:53:24.319 --> 01:53:25.600
I gotta add that to a Raybox.
01:53:25.680 --> 01:53:30.960
Someone someone commented there, they tried to do some plotting thing and they were like, this is table stakes.
01:53:31.760 --> 01:53:37.600
We should we should add this to uh not just to try pill, but also to to our main ID as well.
01:53:37.840 --> 01:53:39.279
Yeah, it can't be that hard.
01:53:39.520 --> 01:53:41.840
In fact, I think we don't have to add that to it.
01:53:42.000 --> 01:53:46.640
I think I can I can just like some library that you can just plop in and it would work.
01:53:47.680 --> 01:53:48.239
Not my right.
01:53:48.479 --> 01:54:00.640
Actually, I I did uh I have some more questions about the primitives, but I guess we shouldn't take more time with that because there are lots of other primitives that I but I'll have to go look at what is documented and and we'll we'll definitely have uh Jacob uh we'll have you back.
01:54:00.720 --> 01:54:01.199
Also, too.
01:54:01.279 --> 01:54:04.560
I mean we can just bring Adam on if you want uh when we have you on Tacit Talk.
01:54:04.640 --> 01:54:06.880
And also too, I'm not sure if people remember.
01:54:06.960 --> 01:54:13.199
We said we were gonna do like four or five episodes of just Adam and I, like, you know, getting the process of rolling these out.
01:54:13.359 --> 01:54:17.520
And then Madeline mentioned fixed APL, and then I went and checked it out, and then I messaged Adam.
01:54:17.600 --> 01:54:19.039
I was like, should we have a guest on?
01:54:19.199 --> 01:54:20.960
I need to talk to Jacob about fixed APL.
01:54:21.119 --> 01:54:22.479
And so then we threw that out the window.
01:54:22.640 --> 01:54:32.800
Arguably it would have been a better idea to wait till we had a couple more people, a larger panel, and you know, I didn't have to put half of uh the questions on my back and just ended up being confused the whole time.
01:54:32.880 --> 01:54:36.960
If Marshall was here, I'm sure it would have been Marshall, Jacob, and Adam going boo-boo, boo, boo, boo.
01:54:37.119 --> 01:54:40.640
And then I would have just been like, all right, well, at least they all seem to understand what's going on.
01:54:40.880 --> 01:54:46.800
But uh, once we put together the the larger team, we'll have you back and uh we can we can chat more about the primitives.
01:54:46.880 --> 01:54:51.359
And I'm sure there'll be some some new changes since then as well, because it sounds like you're active on this.
01:54:51.680 --> 01:54:52.159
All right.
01:54:52.319 --> 01:54:57.760
With that, oh yeah, we're supposed to say you can reach us at contact at arraycast.com.
01:54:57.920 --> 01:55:02.159
I guess also now there's no reason why we can't do the same thing that I do on my other podcasts.
01:55:02.319 --> 01:55:05.680
I mean, lots of folks have been leaving comments on the YouTube video.
01:55:05.840 --> 01:55:06.800
Feel free to do that.
01:55:06.960 --> 01:55:11.760
If you want, though, we might set up uh GitHub discussions pertaining to each episode.
01:55:11.920 --> 01:55:18.960
And also, too, thank you for all the folks in the Apple Farm Discord or other mechanisms where people reached out.
01:55:19.119 --> 01:55:26.560
We had some broken links to past, there was like the show note avenue and technically the episode page were two different things.
01:55:26.720 --> 01:55:27.840
A couple of those got broken.
01:55:28.000 --> 01:55:29.039
They're all fixed now.
01:55:29.279 --> 01:55:31.039
Thank you for pointing and bringing those to our attention.
01:55:31.119 --> 01:55:46.960
But also, too, now that we have a GitHub page's website, uh, if you ever find a broken, like a one-off broken link, or you want to even add links that we missed in the show notes, you're able to just go either open an issue or even better a pull request, and then we'll be happy to just ship that.
01:55:47.119 --> 01:55:54.319
And this can be more of like a community-driven podcast, I guess, in that sense, because this was not open source before and now it is.
01:55:54.640 --> 01:55:59.600
And yeah, with that, we can say happy array programming.
01:55:59.920 --> 01:56:01.119
Happy array programming.
01:56:01.199 --> 01:56:02.720
Oh, we have to do this differently.
01:56:02.960 --> 01:56:03.760
It has to work like this.
01:56:03.840 --> 01:56:06.560
Like Jacob and I have to say happy array programming.
01:56:06.800 --> 01:56:08.960
Jacob was just are we still on?
01:56:09.279 --> 01:56:10.319
Yeah, we're still on.
01:56:10.560 --> 01:56:14.079
So so we have to say we have to write down and say and say it together.
01:56:14.239 --> 01:56:16.239
I haven't watched it and then we'll win a long time.
01:56:16.960 --> 01:56:20.159
When we when we finish, that's when Connor is supposed to say it.
01:56:20.239 --> 01:56:21.680
Exactly when you hear array programming.
01:56:21.920 --> 01:56:25.600
Oh my god, then you're supposed to say it because then it will line up because now we know the timing.
01:56:26.000 --> 01:56:28.800
I think we just have to give up on that and just you know no no.
01:56:28.960 --> 01:56:31.199
This can work, we just have to happy array program.
01:56:31.600 --> 01:56:35.920
So you hear like three, two, one, happy array program.
01:56:36.239 --> 01:56:37.119
Happy array program.
01:56:37.520 --> 01:56:38.319
I mean, that sounded pretty good.
01:56:38.960 --> 01:56:39.680
I mean, it doesn't sound good.
01:56:39.760 --> 01:56:40.479
That's the problem, Adam.
01:56:40.560 --> 01:56:44.079
It doesn't sound good for you, but that one actually did sound pretty good on my end.
01:56:44.479 --> 01:56:45.039
That was my point.
01:56:45.199 --> 01:56:45.520
Exactly.
01:56:45.600 --> 01:56:46.239
That's my point.
01:56:46.399 --> 01:56:48.880
We can we can figure this out at the course of the next hundred episodes.
01:56:48.960 --> 01:56:50.479
We'll figure out how to do this.
01:56:51.279 --> 01:56:56.479
Every single time we're just gonna be debating on the uh the mechanism on how we uh wrap the episode.
01:56:56.800 --> 01:56:57.039
Exactly.
01:56:57.279 --> 01:57:04.319
All right, thanks everybody in the chat, and we will schedule another one of these in roughly plus or minus two or min plus or minus two weeks.
01:57:04.399 --> 01:57:06.239
And once again, Jacob, thank you uh so much.
01:57:06.560 --> 01:57:07.199
Yeah, sure.
01:57:07.359 --> 01:57:07.680
No problem.
01:57:07.760 --> 01:57:09.520
It was fun to fun to talk about it.
01:57:09.600 --> 01:57:10.960
Yeah, absolutely.
00:00:11.919 --> 00:00:16.079
Welcome to episode 120 of ArrayCast.
00:00:16.160 --> 00:00:25.519
I'm your host, Connor, and today with us we have a special guest who I guess we will introduce in a moment, just after we have Adam give his brief introduction.
00:00:25.839 --> 00:00:27.600
Well, I'm Adam Blutsewy.
00:00:27.760 --> 00:00:30.960
I uh do APL at dialogue.
00:00:31.039 --> 00:00:33.280
I'm generally interested in array languages, so.
00:00:33.600 --> 00:00:37.679
And as mentioned before, my name's Connor, host of ArrayCast, Matt, host of Array Cast.
00:00:37.840 --> 00:00:39.119
Bob can't fix it in post.
00:00:39.520 --> 00:00:41.600
A massive fan of all the array languages.
00:00:41.679 --> 00:00:49.439
And typically we do announcements before we introduce the guests, but it's a bit odd seeing as we have Jacob with us live on screen on YouTube.
00:00:49.520 --> 00:00:55.200
If you're not watching this, or I say should say listening to this in an audio podcast app.
00:00:55.280 --> 00:01:02.320
So Jacob Lockpud, we don't know much about him yet, but we do know that he is the author of Fix APL.
00:01:02.399 --> 00:01:10.000
And he's, I think, for both Adam and I, a couple decades younger than both of us, quite amazing that you are the author of this APL.
00:01:10.159 --> 00:01:26.640
And you were brought on to our radar, or at least my radar, last episode in when we were just Adam and I talking in episode 119, I believe it was Madeline in the YouTube chat, which is one of the great things about the fact that we are now live on YouTube.
00:01:26.719 --> 00:01:30.400
We can interact more with the listeners, at least that are live.
00:01:30.640 --> 00:01:43.439
And Madeline mentioned when we were having the conversation about the learnability of languages, the number of primitives and ambivalence, she mentioned off-handedly, you should check out Fix APL, which I was like, I've never heard of this.
00:01:43.519 --> 00:01:45.040
And I'm live on a podcast right now.
00:01:45.200 --> 00:01:46.560
I don't have time to go check this out.
00:01:46.719 --> 00:01:52.239
And sure enough, when the podcast ended, I went and checked it out and I said, Holy smokes, how come I have not heard of this?
00:01:52.400 --> 00:01:54.560
And so I think that's what we're gonna talk about today.
00:01:54.799 --> 00:02:06.480
But before we do that, we're gonna do uh a couple announcements, and then we're gonna ask you, Jacob, about how you got into computing, how you got into array languages, and then we're gonna spend the rest of the episode talking about fixed APL.
00:02:06.560 --> 00:02:12.080
So I think first Adam has uh a couple announcements, and then we'll get into uh questions with you, Jacob.
00:02:12.319 --> 00:02:13.199
Sounds good.
00:02:13.439 --> 00:02:13.840
Right.
00:02:14.080 --> 00:02:17.520
So two things, both sort of competition related.
00:02:17.759 --> 00:02:32.240
We just launched a new round of the APL challenge, uh, which is this very basic introduction to APL, where you can also win some small prizes, but it gives you all you need to learn in order to complete the whole thing.
00:02:32.560 --> 00:02:40.800
I rewrote the whole system from scratch because the old one is getting a bit long in the tooth, and uh, I'm really happy about how it turned out, and you've got dark mode.
00:02:40.960 --> 00:02:44.719
Um, so go check that out at challenged dialogue.com.
00:02:44.960 --> 00:02:49.039
And then we made a modification also to the APL Forge.
00:02:49.199 --> 00:02:52.560
So that's a sort of a longer term, it's a once-a-year thing.
00:02:52.639 --> 00:03:01.199
Uh, the dialogue will give out some larger prices and uh opportunity to come and present your work at a dialogue user meeting.
00:03:01.280 --> 00:03:13.759
It's our yearly bi-weekly uh we yearly conference, and and so until now it has been only for projects where APL was the core of the algorithm of the system.
00:03:14.080 --> 00:03:16.000
But we thought we we'd expand that a bit.
00:03:16.080 --> 00:03:32.719
So if you want to write a tool or create a tool somehow that does not use APL as its its core technology, but provides some sort of quality of life improvements or help for people that are writing APL, then that's also eligible.
00:03:33.039 --> 00:03:50.240
So as an example of something that could have been obviously not eligible to win a prize, but like I I created Apple, which is this lookup table of APL phrases, but it's actually written in HML, CSS, JavaScript, not in APL, just the content that it serves as APL.
00:03:50.319 --> 00:03:54.080
So that's a tool that's not an APL tool, but it helps APLers.
00:03:54.400 --> 00:04:05.280
So if you have a tool like that that's not written in in APL, say like Connors uh array box, then uh that would be essentially eligible for a price in the APL Forge.
00:04:05.360 --> 00:04:08.000
So you can check that out at forge.dialog.com.
00:04:08.319 --> 00:04:08.719
Awesome.
00:04:08.879 --> 00:04:17.279
Links, as always, will be in both the description of the YouTube video and the show notes of the podcast and our beautiful new website, arraycast.com.
00:04:17.360 --> 00:04:20.079
I guess same domain, but new, beautiful design.
00:04:20.319 --> 00:04:24.240
And with the announcements out of the way, it is a huge, I don't know, excitement.
00:04:24.480 --> 00:04:27.680
I'm very excited to talk to you, Jacob, about uh fix APL.
00:04:27.759 --> 00:04:33.759
But before we talk about fixed APL, maybe I mean I'd say take us back to the beginning, but the beginning for you wasn't that long ago.
00:04:33.920 --> 00:04:46.800
Um, so take us back however many years uh it was that you started getting into computing or programming, and then tell us about your path from there to how you discovered array languages, and and then we'll get to fix APL.
00:04:47.279 --> 00:04:48.639
Okay, sure, yeah.
00:04:48.959 --> 00:04:57.759
So I started coding in 2020 when I was I guess 11 or 12, maybe 13.
00:04:58.079 --> 00:04:59.279
I don't I don't remember.
00:04:59.439 --> 00:05:03.040
I somehow, wow, I don't know why I can't think of it.
00:05:03.199 --> 00:05:04.639
I mean it was COVID times, right?
00:05:04.720 --> 00:05:08.079
So that that uh that era is like a blur from the disorienting.
00:05:08.560 --> 00:05:19.279
But however many years ago it was, I uh was kind of stuck at home, you know, doing Zoom middle school, and uh it really didn't have much going on.
00:05:19.439 --> 00:05:29.680
I looked up how did they make Minecraft and it said Java, and so I learned JavaScript, of course, and I thought it was interesting.
00:05:29.839 --> 00:05:55.040
I had some you know little iPad app where you could put in HTML and JavaScript, and it was terrible, there were ads all over it, but eventually I got a laptop, and around the same time I got into code golf through the code golf stack exchange website, and that was really how I got into a lot of more esoteric languages.
00:05:55.120 --> 00:06:18.639
Like I started with JavaScript and then I got into some of the you know languages designed for code golf, and uh eventually I found I mean I had known about array languages for a little while at that point, but I started trying out J for a little while, and I thought it was very interesting.
00:06:18.959 --> 00:06:27.920
I uh had really no idea what it was used for much about the other array languages, but I tried it out.
00:06:28.000 --> 00:06:32.399
I thought trains were cool, but they were too confusing for me, and so I kind of just gave up.
00:06:32.720 --> 00:06:40.160
Then later I tried Wewa, and that was actually the first array language that I seriously tried to learn.
00:06:40.399 --> 00:07:00.079
And uh I got really into that, and I still am very into it, and from there, you know, I started learning more about other array languages, VQN, APL, tiny APL actually, uh was the the first non-Weeba array language I really picked up, which is kind of funny.
00:07:00.480 --> 00:07:10.160
Eventually I I I was already sort of interested in language design at the time because a lot of the code golf community is interested in that kind of thing.
00:07:10.480 --> 00:07:20.079
I had done some little language design experiments in the past, but Fix APL was really my first serious programming language project.
00:07:20.319 --> 00:07:25.759
And I did it in July, June of last year.
00:07:26.000 --> 00:07:33.920
And you know, I had summer breaks, so I kind of just spent all day, every day working on it until I got it to how it is now.
00:07:34.240 --> 00:07:42.800
So let's uh I want to go back because I'm very curious about the the path to fix APL and the influences and the things that you liked in uh different languages.
00:07:42.959 --> 00:07:50.480
So you said that you uh were playing around with code golf languages before you kind of hit J and then Wi Won, then Tiny Apple.
00:07:50.639 --> 00:07:57.519
Were those the because I know of Jelly and I know of Vixel, I think is the name when we talked about Jelly on a ray cast.
00:07:57.680 --> 00:07:59.600
Are those the ones or is there like a whole collection?
00:07:59.680 --> 00:08:03.600
Because I'm I'm sure there's a world of golfing languages that I'm not familiar with.
00:08:03.920 --> 00:08:05.519
Yeah, I mean there are more.
00:08:05.759 --> 00:08:08.160
I I never really picked up jelly, honestly.
00:08:08.319 --> 00:08:13.680
I quite liked it, but it seemed too complicated for me to really understand.
00:08:13.759 --> 00:08:22.319
I did try Vixel, which I thought was interesting, and that maybe made it easier for me to get into Weewa because Vixel is stack-based.
00:08:23.199 --> 00:08:24.079
There were some other ones.
00:08:24.160 --> 00:08:35.039
There's one called Jept, which is basically JavaScript with a bunch of little shortcuts and just you know, golfier syntax, you don't need parentheses and things.
00:08:36.000 --> 00:08:38.240
There were a couple others, I'm trying to think.
00:08:38.480 --> 00:08:39.440
I don't know.
00:08:39.759 --> 00:08:42.240
But it was kind of mostly those, I guess.
00:08:42.480 --> 00:08:42.720
Okay.
00:08:42.960 --> 00:08:43.840
And that's yeah.
00:08:44.159 --> 00:08:46.000
And so from there you went to Jay.
00:08:46.240 --> 00:08:46.960
What are your thoughts about?
00:08:47.279 --> 00:08:55.600
I mean, you already said that you found trains confusing, but overall, like having programmed in a couple different languages, JavaScript, and then the code golfing ones, what were you what were your thoughts?
00:08:55.840 --> 00:08:59.279
Because clearly, like you got into you know array languages.
00:08:59.360 --> 00:09:07.600
Was it Weewa was the one that you really kind of sold you on the paradigm, or was it J that piqued your interest, but then you you found Weewa because it's all in the same family?
00:09:07.759 --> 00:09:11.440
Like what was your path to deciding that you wanted to write one for yourself?
00:09:11.919 --> 00:09:32.960
Well, I found J mostly just because I I knew some people who were talking about it, and uh I did really find it interesting, but I didn't totally understand arrays, how they worked with multiple dimensions, and also the syntax I thought was confusing, but it wasn't as scary to me because I'd already tried some of these code golf languages.
00:09:33.279 --> 00:09:40.000
Um but when I tried Wewa, that was when I really seriously got into the array paradigm, I would say.
00:09:40.080 --> 00:09:40.480
Yeah.
00:09:40.799 --> 00:09:43.200
That was definitely what sold me.
00:09:43.519 --> 00:09:48.320
Then from there to making a programming language myself, I'm not sure.
00:09:48.480 --> 00:09:58.799
I guess I I I started using TinyAPL and then BQN and some other array languages, and I did find those very interesting.
00:09:58.960 --> 00:10:03.279
I really liked the way APL works, just the infix nature of it.
00:10:03.600 --> 00:10:08.480
It made me realize, I guess, how different Wea really is to those.
00:10:09.120 --> 00:10:18.879
And as I was using them, I guess I sort of realized that I kind of missed some of the things about Wiwa when I was using APL.
00:10:19.200 --> 00:10:47.600
Like different things, but especially ambivalence was just something that I really found confusing, how different functions had different behaviors with different numbers of arguments, and especially the way it played into trains, how when you write a train you actually don't know what it means until it's applied, because it can have either a monadic or a dyadic form, which are totally different.
00:10:47.919 --> 00:10:55.759
And I knew a little bit about fixed air from looking at jelly and and we will, of course.
00:10:56.240 --> 00:11:10.159
And uh I just I was thinking about it and I I realized that if you did have an APL with fixed arity, you could do some very interesting stuff with trains and modifiers similar to what we will do.
00:11:10.559 --> 00:11:12.960
And I I sort of just got into it from there.
00:11:13.360 --> 00:11:23.279
I mean that is uh it's very, very interesting because as the viewer on YouTube can can see, we're staring at the character set of fixed APL.
00:11:23.679 --> 00:11:32.480
And I gotta say, I mean, we're talking we're talking about fixed APL and and your design choices, but I I they align very closely with like a lot of stuff.
00:11:32.559 --> 00:11:41.679
Like, I'll be honest, the BQN character set, I always miss the APL glyphs a lot of the time, especially IOTA, which it just warms my heart to see Iota back.
00:11:41.759 --> 00:11:42.399
IOTA's back.
00:11:42.639 --> 00:11:44.080
We do have a couple similar ones.
00:11:44.159 --> 00:11:48.159
Yeah, IOTA, we've got the selfie trying to think.
00:11:48.240 --> 00:11:49.039
What else is missing?
00:11:49.360 --> 00:11:53.200
You've got the rotate, which I guess technically BQN still has that one.
00:11:53.440 --> 00:11:56.399
But they're I in general though, I I like this.
00:11:56.639 --> 00:12:00.639
You brought back uh Eval and format, which are sorely missed.
00:12:00.879 --> 00:12:01.679
Yes, yes.
00:12:02.000 --> 00:12:03.600
In uh in in BQN.
00:12:03.679 --> 00:12:13.679
So, anyways, it's uh a lot of the stuff that I I really like that you've kind of it's I mean, it's a hybrid, probably I'm not sure if if you would agree, and maybe Adam, you can weigh in on this.
00:12:13.759 --> 00:12:18.879
Uh like this seems like the most hybrid inspired by different language.
00:12:18.960 --> 00:12:26.960
Like you can see the influence from Wiwa in that it's there's no ambivalence, and also two, like you have the same like length and shape.
00:12:27.279 --> 00:12:29.519
Yeah, there's there's characters influences.
00:12:29.679 --> 00:12:35.360
There's also the fact that you can now color these, you know, a monadic color and a dyadic color, and there's a transpose glyph.
00:12:35.519 --> 00:12:37.919
So like there's a ton of Wiwa influence at the same time.
00:12:38.000 --> 00:12:43.200
There's influences from APL and BQN, like you can see BQN glyphs in there as well.
00:12:43.360 --> 00:12:51.440
And sometimes they're repurposed for other things, like I think reverse uses the box glyph from or pear glyph from BQN.
00:12:51.519 --> 00:12:53.360
Although I'm not sure, maybe that's also in Wiwa.
00:12:53.519 --> 00:12:55.679
So I you can you maybe can tell us it's the like the boat.
00:12:56.000 --> 00:12:58.000
No, in Wi Wa is something else, yeah.
00:12:58.240 --> 00:13:00.799
I mean the boat I like a lot of this.
00:13:01.440 --> 00:13:02.240
Thank you.
00:13:02.480 --> 00:13:06.320
So I guess yeah, all to say that I I love a lot of the the influences.
00:13:06.639 --> 00:13:07.919
Oh yeah, table is another one.
00:13:08.000 --> 00:13:09.600
You've borrowed like so that's the thing.
00:13:09.679 --> 00:13:13.200
It's like it's got iota from APL, it's got table from Weewa.
00:13:13.440 --> 00:13:15.840
I mean, was Weewa the first or was it tiny apple?
00:13:15.919 --> 00:13:21.519
I I don't actually know what what language was the first one to introduce the the table outer product.
00:13:21.600 --> 00:13:34.480
Uh having a dedicated outer product symbol in in an APL, not in J, uh, has been a long time wish for many people because it has this anomalous syntax in the APL.
00:13:34.639 --> 00:13:40.000
I mean it has mixed, it has reason, historical reason, but it today it doesn't make much sense anymore.
00:13:40.399 --> 00:13:43.120
Sorry, what you said a dedicated a dedicated what glyph?
00:13:43.279 --> 00:13:45.039
So an out of outer product glyph.
00:13:45.279 --> 00:13:46.639
Oh, out of product glyph, gotcha.
00:13:46.960 --> 00:13:48.480
In in traditional APLs, right?
00:13:48.639 --> 00:13:59.039
The the syntax we have for out of products does have some amount of sense in a historical context, but in today's world it doesn't really fit in so well.
00:13:59.279 --> 00:13:59.679
Yeah.
00:13:59.919 --> 00:14:05.759
And so it's it's actually the jot that's the that's the problem more than the syntax itself.
00:14:06.399 --> 00:14:06.639
Yeah.
00:14:06.879 --> 00:14:10.000
So so that so that symbol there is an obvious symbol for table, right?
00:14:10.080 --> 00:14:11.200
It looks like a table.
00:14:11.519 --> 00:14:15.679
That's one of the symbols that has been this yeah, that has been discussed for many years.
00:14:15.919 --> 00:14:17.840
If we were to add a symbol, what would you add?
00:14:18.240 --> 00:14:20.399
I even I even discussed it with Roger Huey.
00:14:20.639 --> 00:14:24.320
Why don't we have have a or or or normalize the syntax like that?
00:14:24.399 --> 00:14:32.000
I even suggested that dyadic scan, like function backslash, doesn't have a dyadic form in in the gap.
00:14:32.639 --> 00:14:41.919
And I even suggested that we could just overload that to be the table because it sort of shows that the they can understand the diet the the backslash or sort of the diagonal going down.
00:14:42.159 --> 00:14:52.240
Uh the the if you were to do it like an equality on a YOTE sequence, you'd get the diagonal down with one's sort of outer product you think a little bit of a stretch.
00:14:52.399 --> 00:14:55.279
Yeah, and he said we don't need a symbol for for outer products.
00:14:55.440 --> 00:15:00.480
We've already got one, the rank operator, which is yeah, yeah.
00:15:00.559 --> 00:15:07.440
I mean it's I should make a YouTube video on the the what do you call it, non-uniformity of outer product.
00:15:07.600 --> 00:15:10.639
Like if you go to the omnibar, it's like the most different glyphs.
00:15:10.799 --> 00:15:12.000
Cap has a different glyph, right?
00:15:12.080 --> 00:15:20.080
It's the like the quad jot, and then we've got table, we've got APLs outer product, we've got BQNs, little, I don't even know what you call that.
00:15:20.320 --> 00:15:21.440
Oh yeah, yeah, look at this.
00:15:21.519 --> 00:15:22.320
We can even look at it.
00:15:22.480 --> 00:15:26.320
The beauty of yeah, like this one probably it's got the most what do you call it?
00:15:26.559 --> 00:15:29.200
Yeah, non-uniformity number of different glyphs.
00:15:29.360 --> 00:15:33.440
Look at that, it's even got the target, which is from Zima APL.
00:15:33.600 --> 00:15:34.320
I had no idea.
00:15:34.559 --> 00:15:35.519
I guess so, yeah.
00:15:35.759 --> 00:15:44.159
But anyways, it's fascinating that there's so many, because most languages or most glyphs don't have this this many different uh symbols for it, right?
00:15:44.559 --> 00:15:49.120
Anyway, so it's it's just uh I I really love the fact that there's just so many different things.
00:15:49.200 --> 00:15:58.799
You've got you know the before and after from BQN, you've you've got stuff from BQN, stuff from Wiwa, stuff from the OG, you know, APL 360 and also uh dialog APL.
00:15:58.879 --> 00:16:02.480
You've got the the shape, and so there's just a lot, there's a lot to like, folks.
00:16:02.559 --> 00:16:12.720
And on top of that, you've got a completely different model from all APLs that exists if you exclude Wiwa from APLs with the the fixed airity, which leads to a completely different train model.
00:16:12.799 --> 00:16:14.559
But anyways, I'm gonna stop talking.
00:16:14.799 --> 00:16:16.879
You now is is your uh time.
00:16:17.200 --> 00:16:25.360
Introduce a fixed APL to the world and wherever you want to start, and then we'll go from there and we can ask questions and explore the language after that.
00:16:25.840 --> 00:16:26.799
Okay, sure.
00:16:26.960 --> 00:16:40.720
Yeah, so fix APL absolutely, as was mentioned, influenced by a lot of languages, uh especially in the glyphs, but also things like the array model, it uses VQN's what's it, base model.
00:16:41.440 --> 00:16:42.960
So really a lot of things.
00:16:43.200 --> 00:16:56.399
But the language itself is in essence an APL with fixed alert functions, which means that instead of having each function, you can call it either monadically or dyadically.
00:16:56.879 --> 00:16:59.039
There's one way to call each function, right?
00:16:59.120 --> 00:17:05.279
And you can see it with the colors, like green shape, the shape of an array, you can only call it with one function, right?
00:17:05.359 --> 00:17:10.400
It's not overloaded to be reshaped with two, like it is in some APLs.
00:17:10.720 --> 00:17:13.519
We have a separate symbol for that, for the dyadic form.
00:17:14.079 --> 00:17:27.839
So in theory, this does mean there are twice as many symbols, but it actually ends up being less than that because when you look at a lot of the monadic forms of dyadic functions, you don't really need all of them in a language.
00:17:28.160 --> 00:17:31.680
And it's it takes sort of a similar approach to Wewa in that way.
00:17:31.920 --> 00:17:36.559
But the reason for having fixed erity, there's really three of them.
00:17:36.880 --> 00:17:43.119
The first one is that just the overloading of glyphs can be confusing.
00:17:43.359 --> 00:17:49.279
Like when you have in APL, you have what's the classic from APL?
00:17:49.440 --> 00:17:51.279
I don't know, I'm blanking on it, but like in BQ.
00:17:52.799 --> 00:18:00.160
No, but just like when you have like the ambivalence, the problem with one glyph having two meanings that are totally unrelated.
00:18:00.400 --> 00:18:04.720
Like I know in BQN there's windows and range on the same symbol.
00:18:05.119 --> 00:18:14.880
There's something like match match and depth in APL is like the or length and equals in BQN, yeah, or whatever that one is.
00:18:15.839 --> 00:18:25.440
Like not equals is is length, which kind of is honestly at least it's an educated guess, but it's just a similar glyph to tally in APL minus a lot.
00:18:26.000 --> 00:18:26.799
Simple tally, yeah.
00:18:27.119 --> 00:18:29.839
Same thing goes with equal, the equal than depth, right?
00:18:30.000 --> 00:18:39.680
So yes, it's clever in terms of the glyph, but if you're looking at it from a you know a lens of it being like consistent in any way, it doesn't really make sense.
00:18:40.000 --> 00:18:40.960
So that's one.
00:18:41.119 --> 00:18:55.279
Another one is something I got from Weewa, which is that when you do have modifiers that can look at the airities of the functions that they're passed, you do get some interesting cases.
00:18:55.599 --> 00:19:24.400
And there are a lot of ones which I can get into later, maybe, but some of the biggest ones for APL are before and after, which I got from BQN, but they are modified and they just operate rather differently because they can switch in rather than switching behavior based on the number of arguments that it's passed, it switches based on the number of arguments that each function is meant to take.
00:19:25.039 --> 00:19:28.079
So you get you know, several more cases.
00:19:28.640 --> 00:19:35.200
So you get you get a lot of compositions that are otherwise, like in tiny APL, you would need dedicated symbols for those compositions.
00:19:35.359 --> 00:19:38.480
So that gives you it gives you hooks, I I would guess.
00:19:38.799 --> 00:19:40.799
Yeah, and I think there might be a few others.
00:19:41.200 --> 00:19:42.640
But so how did that work then?
00:19:44.319 --> 00:19:56.799
The function derived from a an operator is ambivalent in principle, but determined by the operands according to some rule set, or there's a general rule for that?
00:19:57.200 --> 00:20:00.480
It's different for every operator, basically, for every modifier.
00:20:00.720 --> 00:20:08.400
But like if I have like here's an example, one before add, this is gonna just bind one to add as the left argument.
00:20:08.640 --> 00:20:19.039
And what you can do is you can look at the airity of this by making it a subject and passing it to the erity function, and you can see it is monadic there.
00:20:19.279 --> 00:20:25.279
But if you have something like I don't know, add before add, then you are gonna get a diad.
00:20:25.680 --> 00:20:34.640
And this is like writing I'm not totally sure actually, but I think it would be alpha plus omega in parentheses plus omega.
00:20:35.440 --> 00:20:36.319
I believe so.
00:20:36.799 --> 00:20:38.799
It could also be the opposite, right?
00:20:39.440 --> 00:20:43.519
There's not really there's no way for me really to tell what it what it is.
00:20:43.839 --> 00:20:47.039
I guess you have to, it says you oh, I guess I guess it makes sense.
00:20:47.119 --> 00:20:52.640
If you say plus before plus, or I mean maybe take a different uh um two different functions, plus before minus.
00:20:52.720 --> 00:21:02.400
So then the idea is we have to evaluate plus before the minus, and since it's dyadic, it has to take both arguments, so there has to be alpha minus omega in this case.
00:21:02.480 --> 00:21:10.880
Yeah, if you want to do it like that, and then then we do a plus, which has to be dyadic, so it has to take that argument on the left, and then something else on the right.
00:21:11.039 --> 00:21:16.240
Now, the thing it takes on the right could be anything, it could have been alpha, it could have been omega.
00:21:16.319 --> 00:21:22.799
There's not really any rule to say that, but it sort of makes sense that if it needs something on its right, it would be the right argument.
00:21:22.960 --> 00:21:33.759
Yeah, can I can see the reasoning so and then if you wrote minus after plus, it would be the mirror image would be alpha plus alpha minus yeah, alpha plus omega, right?
00:21:34.079 --> 00:21:35.599
Uh should be, yeah.
00:21:37.200 --> 00:21:41.039
We can't yeah, there's no you don't have a way to test stuff like that, but yeah.
00:21:41.359 --> 00:21:42.400
No, it's not hard to test.
00:21:42.480 --> 00:21:46.799
You can just make uh make this placeholder functions that spit out the results argument.
00:21:47.759 --> 00:21:50.559
Right, we can do and then three.
00:21:54.079 --> 00:21:58.960
So yeah, this is yeah, three plus five equals eight, and then three minus eight.
00:22:00.319 --> 00:22:02.400
I mean this these ones are kind of confusing, right?
00:22:02.480 --> 00:22:06.559
Because it's you're using uh two dyadic functions.
00:22:06.880 --> 00:22:07.440
Yeah, it is.
00:22:07.920 --> 00:22:11.200
I assume the ones where it's like compositions are a little weird, yeah.
00:22:11.440 --> 00:22:11.680
Yeah.
00:22:11.920 --> 00:22:24.640
Because like to have two dyadic functions with a before after means that basically one argument is getting duplicated within your you know composition and another one is just being used once.
00:22:24.799 --> 00:22:28.559
Where you have like the hooks, the hooks make a lot of sense, right?
00:22:28.640 --> 00:22:43.680
Like you've got two arguments, or well, I guess in the monadic hooks, you have one argument and then you're applying a unary function and then copying that argument and passing that to the binary operation, and then in the dyadic case, you're just applying the unary operation to only one of them.
00:22:43.839 --> 00:22:47.359
I'm assuming so here's a here's a trick to make it really clear.
00:22:47.519 --> 00:22:49.680
I think at least really clear what's happening.
00:22:49.839 --> 00:22:52.480
Can I know if I can can I send it to you somehow?
00:22:52.559 --> 00:22:56.880
Yeah I can I mean you can send it in the chat and then I can just pull up the chat.
00:22:57.440 --> 00:22:58.960
Yeah, I guess so.
00:22:59.599 --> 00:23:00.400
There you go.
00:23:00.559 --> 00:23:02.319
Or maybe Jacob should pull it up.
00:23:04.079 --> 00:23:04.480
There you go.
00:23:04.720 --> 00:23:08.160
Everyone can see uh copy that and uh everyone except me, I guess.
00:23:08.240 --> 00:23:10.400
Uh yeah, I can't see it either.
00:23:10.640 --> 00:23:15.440
We're playing with Jacob, can you can you paste that into your into your session there?
00:23:15.599 --> 00:23:17.119
Well, or do you want me to dictate it?
00:23:17.519 --> 00:23:17.839
I don't know.
00:23:17.920 --> 00:23:19.359
It's gonna be yeah, I don't know.
00:23:19.680 --> 00:23:21.359
I can dictate it to you instead if you want.
00:23:21.440 --> 00:23:22.799
It's not that yeah, that'd be better.
00:23:22.960 --> 00:23:25.119
Okay, so then we can I can also explain what I'm doing here.
00:23:25.200 --> 00:23:26.960
This is a trick that I use in dialogue APL.
00:23:27.119 --> 00:23:28.400
It's it works very well here as well.
00:23:28.480 --> 00:23:32.160
So you write uh quote X quote, open brace.
00:23:32.319 --> 00:23:34.079
I don't know how what do you call that ligature?
00:23:34.160 --> 00:23:42.640
Okay, so alpha ligature quote F quote uh ligature omega before or close, sorry, close brace.
00:23:42.880 --> 00:23:50.720
You want to do close brace first, and before, and then write the same thing again, but with a uh the same brace thing again, but with a G instead of F.
00:23:50.799 --> 00:23:52.799
You can just copy and paste it if you want.
00:23:53.599 --> 00:23:56.480
Yeah, and then a Y at the end in quotes.
00:23:56.720 --> 00:23:57.119
Okay, okay.
00:23:57.279 --> 00:23:58.319
Yeah, yeah, okay.
00:23:58.480 --> 00:24:05.680
So what's happening here is that the structure shows us the what happened, right?
00:24:06.160 --> 00:24:07.920
If I'm not mistaken, right?
00:24:08.000 --> 00:24:12.799
So we can so we can see that we got uh the uh it's sort of a fork, right?
00:24:12.960 --> 00:24:15.680
The middle time is the g, that's the top level function.
00:24:15.839 --> 00:24:19.359
It we've got xfy on the left and just the y on the right.
00:24:19.519 --> 00:24:27.119
And if you go and recall this statement and then replace the before with an after, then we get we can see what happens when you use that other composition.
00:24:27.200 --> 00:24:29.359
And we can do we can do this with every composition, right?
00:24:29.440 --> 00:24:31.759
You can do this with over, and so yes, yes.
00:24:32.000 --> 00:24:38.079
And then you can replace the the operands with monetic functions instead, and then we can see exactly what's going to happen.
00:24:38.319 --> 00:24:38.960
Yeah.
00:24:39.279 --> 00:24:47.759
There's with monadic left and so this is a dyadic application of monadic f after dyadic G.
00:24:48.079 --> 00:24:48.319
Yeah.
00:24:48.640 --> 00:24:49.920
So we can so that's on the top.
00:24:50.160 --> 00:24:50.400
Yeah.
00:24:50.720 --> 00:24:52.720
Or now it is interesting here.
00:24:53.039 --> 00:24:53.200
Yeah.
00:24:53.359 --> 00:24:56.400
What happens if you replace this with uh the other one?
00:24:59.119 --> 00:25:00.559
So this makes sense as well.
00:25:00.720 --> 00:25:02.880
This is a this is a a hook.
00:25:03.119 --> 00:25:04.000
Dyadic hook, right?
00:25:04.079 --> 00:25:06.880
Or beside or beside if you want, yeah, dyadically.
00:25:07.119 --> 00:25:09.680
And so uh yeah, all of them.
00:25:09.920 --> 00:25:10.799
So what we can?
00:25:10.880 --> 00:25:16.000
What happens if you both sides are monadic and but you still have a dyadic derived one?
00:25:16.319 --> 00:25:18.880
Uh well then it didn't like that.
00:25:19.039 --> 00:25:19.519
Yeah, okay.
00:25:19.599 --> 00:25:20.799
So that that's an invalid tool.
00:25:22.880 --> 00:25:27.519
Yeah, because well, I couldn't figure out how what there's nothing sensible you could do with this, I agree.
00:25:27.680 --> 00:25:28.000
Yeah.
00:25:28.240 --> 00:25:29.759
But they I think this is a pretty cool tool.
00:25:29.839 --> 00:25:36.000
You should almost add that so you can like translate my my tacit so to to understand what the combinations do.
00:25:36.319 --> 00:25:41.200
Because then maybe this isn't interesting because uh go ahead.
00:25:41.440 --> 00:26:02.000
This isn't this is an interesting case because you have the before with monadics on both sides, which means that you end up having G being applied after, which makes sense, but it just ends up being looking a little weird here because you have it getting past the function on the left as its right argument.
00:26:02.160 --> 00:26:12.480
So but that that could actually be really useful because sometimes you want a I I I don't know, but I my guess is that your your combinator bindings, or what do you call them?
00:26:12.559 --> 00:26:16.400
They are like an APL, so they bind with a long left scope.
00:26:16.559 --> 00:26:27.920
Yeah, that sometimes you want a the you want on the top, but the right function in that top, the one you're applying first, is derived in itself, but the left one is not, and then you have to use parentheses.
00:26:28.079 --> 00:26:30.319
But this actually allows you to swap the order.
00:26:30.640 --> 00:26:31.599
Yes, it is very nice.
00:26:31.680 --> 00:26:35.359
It's a little bit like reverse the top in dialogue 20, right?
00:26:35.680 --> 00:26:37.200
Or maybe I'm misremembering.
00:26:37.599 --> 00:26:39.759
No, you can't we don't have that.
00:26:40.000 --> 00:26:42.400
Yeah, it's not it that doesn't it doesn't do that.
00:26:42.880 --> 00:26:51.359
But but an example of that, just as a as a uh as an silly example of it, is the negation of the sum, right?
00:26:51.440 --> 00:26:53.359
So I assume that sum is plus slash.
00:26:53.920 --> 00:27:04.240
Oh yeah, so you would do like this as sum before negation, which actually reads it very nicely.
00:27:04.559 --> 00:27:05.119
Yeah.
00:27:05.359 --> 00:27:11.359
So if you take the sum, that would be one plus two plus three, which is six, and then you negate it so you get negative six.
00:27:11.680 --> 00:27:17.440
Of course, if you negate first, it will give the same result, but that's yes irrelevant for our our purposes here.
00:27:17.599 --> 00:27:19.279
But you couldn't otherwise write this.
00:27:20.079 --> 00:27:20.400
Yeah.
00:27:20.880 --> 00:27:21.759
I don't know what that is.
00:27:21.920 --> 00:27:22.400
Contents.
00:27:22.799 --> 00:27:24.079
Yeah, that is content.
00:27:24.240 --> 00:27:29.440
So that's sort of a a weird thing that's not really specific to fixterity, I guess.
00:27:29.519 --> 00:27:31.920
It's just something I decided to have in fixed APL.
00:27:32.000 --> 00:27:36.079
But because it is well, it is sort of related to fixterity.
00:27:36.319 --> 00:28:09.759
In BQN, the reduce function has it takes the it operates on the cells of its the array that it's passed, which makes sense, but when you have a list, it makes sense for higher rank, but when you have a list, you have the cells of a list are rank zero arrays instead of the atoms of the risk the list, which is a little complicated, but it ends up being that if you just plus reduce a list, you end up with a rank zero array containing your results.
00:28:09.839 --> 00:28:12.960
So you need to use content to get it as an actual number.
00:28:13.279 --> 00:28:15.039
Isn't that why you've got fold?
00:28:15.599 --> 00:28:24.160
Well, see, it's different because in in fix APL, fold is actually what Weewa calls fold.
00:28:24.319 --> 00:28:24.960
It's different.
00:28:25.200 --> 00:28:34.400
So fold in Wiwa is for setting an initial argument as the beginning of the reduction.
00:28:34.880 --> 00:28:36.160
So it's a little confusing.
00:28:36.240 --> 00:28:39.039
That's why I want to write docs, but I haven't gotten to them yet.
00:28:39.279 --> 00:28:40.880
But who needs docs?
00:28:41.359 --> 00:28:42.559
You need more APLs.
00:28:42.640 --> 00:28:43.200
That's what we need.
00:28:43.279 --> 00:28:45.200
I'd rather have more APLs than docs.
00:28:45.839 --> 00:28:50.880
Yeah, currently we've got documentation fourfold as the docs, if that's what you're looking for.
00:28:50.960 --> 00:28:52.400
So now we know.
00:28:52.720 --> 00:28:53.200
Yeah.
00:28:53.519 --> 00:28:56.160
So that's I guess one thing to keep in mind.
00:28:56.240 --> 00:29:26.799
I'll I'm I might redesign it at some point, but it's a bit weird because if you want to have reduce as you want to have a version of reduce that does this content thing automatically for you, you need to have two versions of each of these reductions, or not necessarily all of them, but it it just gets weird because like then do you want to have a content version of the dyadic reduce, or do you want a content version of scan?
00:29:27.039 --> 00:29:30.799
Actually, I don't think you need it for scan, but it's a bit weird.
00:29:31.279 --> 00:29:35.839
All right, let's take a step back just so that we uh we're putting the uh what do you call it?
00:29:35.920 --> 00:29:37.359
Uh audio only listener.
00:29:37.519 --> 00:29:40.000
We'll we'll save them from the water, put them in a lifeboat.
00:29:40.079 --> 00:29:42.640
They might still be like drowned, but that's fine.
00:29:42.799 --> 00:29:50.799
So let's uh because I I totally haven't mapped all the definitions of of the glyphs before and after that we were talking about.
00:29:50.960 --> 00:30:04.240
So if you got lost in that conversation, dear listener in you know Spotify or Apple Podcasts or wherever you're listening, we were talking about the you know glyphs that BQN, I think, initially had, which are very beautiful for before and after.
00:30:04.319 --> 00:30:23.359
And in BQN, because you have ambivalence, you end up with basically monadic and dyadic definitions of these, which map to the hook and back hook in both monadic and dyadic versions, which correspond to like I believe it's the S and the Sigma and the D and the Delta.
00:30:23.680 --> 00:30:41.920
So we saw that basically because we don't have ambivalence and fixed APL, you can think of the of having you've got two glyphs, your before and after still, but you can have a monadic or dyadic function on both the left and right of each of these glyphs.
00:30:42.079 --> 00:30:52.240
And so correct me if I'm wrong, I guess one of them didn't have defined definition, but all the others meaning you know, monadic actually, all of them are defined.
00:30:52.640 --> 00:30:53.359
All of them are defined.
00:30:54.160 --> 00:30:59.680
Yeah, there was one where I there was a residual thing that caused an error, but okay.
00:31:00.880 --> 00:31:05.920
So can we rewind and just go walk through what you know, monadic before dyadic, dyadic?
00:31:06.319 --> 00:31:07.920
But there's so many combinations, right?
00:31:08.000 --> 00:31:10.319
Because I mean we gotta know every listener wants to know.
00:31:12.400 --> 00:31:21.119
There are two possibilities on the left times two possibilities on the right, times two possibilities on the derived or the usage of the derived function.
00:31:21.440 --> 00:31:23.039
I saw I heard two times too.
00:31:24.880 --> 00:31:26.799
Okay, so it's so it's only it's only four possibilities.
00:31:33.519 --> 00:31:40.720
I was calling it dyadically with x on the left, and that's why it was erroring, because it's only allowed to be called monadically.
00:31:40.960 --> 00:31:41.279
Right, right.
00:31:43.519 --> 00:31:50.880
But can you can you can you predict the if I tell you that I've got in my hand a uh what do we call what do you call them?
00:31:50.960 --> 00:31:52.799
You call them combinators, what do you call them?
00:31:52.960 --> 00:31:54.079
Uh I guess.
00:31:54.400 --> 00:31:55.119
Or modifiers.
00:31:55.440 --> 00:31:56.880
I've got a two a two modifier.
00:31:56.960 --> 00:32:00.400
I mean if I I got in hand my my my two modifier.
00:32:00.720 --> 00:32:08.960
You I um I won't tell you which to modifier it is, and now we're giving it a monetic left operand and a diadic right upper end.
00:32:09.039 --> 00:32:11.039
Can you predict there's no generic rule?
00:32:11.440 --> 00:32:14.400
Okay, so there is a little bit of different for each modifier, yeah.
00:32:14.960 --> 00:32:21.119
You can't you have to look at the definition of the modifier in order to know the arity of the derived function.
00:32:21.200 --> 00:32:31.279
So you've sort of pushed off the problem of APLs and Bivalence to derived functions, that you have to know the function itself to know the aerity of the derived function.
00:32:31.599 --> 00:32:32.480
I guess so.
00:32:32.720 --> 00:32:42.319
Well, you need to know the airity of each of the functions that are passed to the modifier, and you have to know what the modifier's behavior is for those airities.
00:32:42.480 --> 00:32:43.359
So yeah, I guess so.
00:32:43.680 --> 00:32:45.359
But I I mean I feel like this is unfair.
00:32:45.599 --> 00:32:52.000
If I understand the critique that Adam's making, I feel like it's unfair because all of this is perfectly knowable, right?
00:32:52.079 --> 00:32:56.640
Like you can't look at the ambivalent APL expression and know without context.
00:32:56.720 --> 00:33:08.079
But like as long as you know what before and after do, which is if you see the context, if I don't know the meaning of the symbols, but I know their syntactic class, which is a problem in API, I'll give you that.
00:33:08.160 --> 00:33:23.839
In BQN, you do know the syntactic class of every symbol and every user-defined thing as well, because that's apparent either from the symbols sort of look or from the name of the thing you're calling, or from the uh content of the actual code that's between the braces.
00:33:24.000 --> 00:33:35.039
But if you know the the airity of of everything that you're looking at, but you don't know what they mean, meaning what they actually do, you still can completely parse what you've got in front of you.
00:33:35.200 --> 00:33:39.599
But here you have to know the meaning of the symbol in order to parse.
00:33:39.920 --> 00:33:40.559
That's true.
00:33:40.640 --> 00:33:42.640
Only for the modifiers, but yeah.
00:33:43.119 --> 00:33:44.000
No, I got lost.
00:33:44.319 --> 00:33:49.920
But you still want to take it again, kind of the uh you have to know the so we're talking about parsing now.
00:33:50.079 --> 00:33:52.079
I was talking about like readability effects.
00:33:52.160 --> 00:33:54.799
Well, we're talking about alias here, right?
00:33:54.880 --> 00:34:02.720
If you give an alias now, I don't know if you can do that, but can you give a name to a dietic uh or a two modifier in in no, I didn't add that.
00:34:02.960 --> 00:34:04.319
Okay, but let's say we could.
00:34:04.480 --> 00:34:06.160
It means you can't define your own either, right?
00:34:06.240 --> 00:34:08.159
Because I don't see any symbol for operating.
00:34:08.400 --> 00:34:09.360
No, there's no, yeah.
00:34:09.519 --> 00:34:15.280
I wanted to add it at some point, but it's a little complicated to know the semantics of how it should work when you have fixedity.
00:34:15.760 --> 00:34:20.639
But but Connor, imagine here where it says uh where it says after, right?
00:34:20.800 --> 00:34:21.760
In the input line.
00:34:22.400 --> 00:34:36.960
If if it were hiding that symbol and instead we wrote uh mod two or something, something we had defined that was a two modifier that could that did something, you wouldn't know whether it was valid to give a left argument to this derived function or not.
00:34:37.119 --> 00:34:38.159
You simply can't know.
00:34:38.639 --> 00:34:39.199
That's true.
00:34:39.440 --> 00:34:48.320
And you've got if you've got a black box to modify here, meaning you can't inspect the code because whatever reason, however it's implemented, then you simply can't parse.
00:34:48.719 --> 00:34:49.840
Parsing stops here.
00:34:50.159 --> 00:34:56.400
There's no way for you to know whether it's valid to give a a left argument or not to this to this derived function.
00:34:56.639 --> 00:35:01.039
In APR, you have any black box ones, so no, no, I understand there can't be right.
00:35:01.199 --> 00:35:06.559
Currently it's not a problem because this is there's a limited set of modifiers and you cannot add more.
00:35:06.800 --> 00:35:08.880
But yes, I see what you're saying, yeah.
00:35:09.280 --> 00:35:15.920
Uh I'm I I'm still I I kind of get what Adam's trying to the point Adam's trying to make.
00:35:16.000 --> 00:35:40.000
But so you're saying that that that you because like what is the underlying problem here is that because these modifiers, based on the airity that they're passed, can generate different airity functions, you then end up in like ambiguity ambiguity land where but like well it's it's it's not that it's not ambiguous as such, it's just that they can choose by their definition what they do, right?
00:35:40.079 --> 00:35:57.360
They internally we could we could set have a uh a mental model of these combinators where as soon as you enter the code by them, there's a a table or a case statement if you want, where it says, Okay, what are the valences of my operands?
00:35:57.440 --> 00:35:59.679
And then it goes down and chooses what to do.
00:35:59.760 --> 00:36:04.079
And what it chooses to do is either strictly monetic or strictly dyadic.
00:36:04.159 --> 00:36:05.599
But that table is arbitrary.
00:36:06.079 --> 00:36:08.719
There's no way for you to predict it, you just have to know.
00:36:09.440 --> 00:36:09.760
Yes.
00:36:10.000 --> 00:36:14.880
Although it's it's pretty simple for most of them after and before uh don't get me wrong.
00:36:14.960 --> 00:36:17.039
I I think this is beautiful, I think it's amazing.
00:36:17.119 --> 00:36:25.840
It it it allows all those sort of less usual constructions to be expressed very neatly with a small number of combinators.
00:36:26.000 --> 00:36:26.800
Don't get me wrong.
00:36:26.960 --> 00:36:31.840
It's just I just noticed that there isn't things aren't as fixed as you might think they are.
00:36:32.159 --> 00:36:40.719
Uh I'm still I'm still confused because now you're saying so you're saying that the set of stuff that was chosen in this table that's being dispatched is arbitrary?
00:36:41.119 --> 00:36:42.960
I mean, that if isn't everything arbitrary?
00:36:43.039 --> 00:36:44.000
Why did we choose two trees?
00:36:44.800 --> 00:36:47.440
We can come up with alternative definitions that are equally valid.
00:36:47.760 --> 00:36:59.679
The point is that like if instead of before here I had a two here, right, which is my dyadic modifier, then you can't know whether this resulting function is monadic or dadic.
00:36:59.760 --> 00:37:00.880
Like it just stops here.
00:37:01.199 --> 00:37:01.519
Yeah.
00:37:01.840 --> 00:37:05.760
Oh, here's an example that'll make methods in the language, but right.
00:37:05.840 --> 00:37:06.639
Not the other thing.
00:37:06.800 --> 00:37:13.360
This is because you don't have the stuff that Tiny Apple and BQN have where they have like uh No, it's it's not even that.
00:37:13.440 --> 00:37:25.440
I mean, sure, even if I did, it wouldn't it wouldn't change anything because this, like if we assign this to foo, you don't know if foo is monadic or dyadic.
00:37:25.599 --> 00:37:28.480
Like you don't know if you would call it with like this or with this.
00:37:28.960 --> 00:37:33.199
It depends on mod two, which might not yeah, which might not be decided yet.
00:37:33.280 --> 00:37:34.880
So it's not statically parsable.
00:37:34.960 --> 00:37:37.199
It has to be, you have to know everything.
00:37:37.440 --> 00:37:40.400
But but something that here's an example that makes this very clear.
00:37:40.639 --> 00:37:42.960
Something that will make Madeline really excited here.
00:37:43.599 --> 00:37:49.679
The over operator is is the crossover thing when you make dyadic dyadic.
00:37:49.760 --> 00:37:52.400
So normally we do over, the right operand is monadic.
00:37:52.480 --> 00:37:54.000
It's a pre-processing function, right?
00:37:54.159 --> 00:37:57.280
Do this function f but pre-process the arguments with y.
00:37:57.440 --> 00:38:10.800
But if you give it a dyadic function over dyadic function, then it does what Madeline's yeah, her uh yeah, it does the swapped uh application of of G, F, the normal application of G.
00:38:11.199 --> 00:38:17.679
We can actually you can type this up if you go and take the previous statement we did with the whole pattern thing to make it say what it does.
00:38:17.760 --> 00:38:19.199
Yeah, we could write like this as well.
00:38:19.360 --> 00:38:21.360
Yeah, okay, that's this makes it clear, right?
00:38:22.400 --> 00:38:30.000
But now there's we say that the swapped version is on the oh, where's the swapped version on the right here?
00:38:30.159 --> 00:38:31.280
I thought it was on the left.
00:38:31.760 --> 00:38:32.960
Oh no, Q is on the left.
00:38:33.119 --> 00:38:33.360
Okay, yeah.
00:38:34.079 --> 00:38:42.000
So you see, you have you see the reversed version is on the left, and the normal version is on the right, but it might as well have been opposite, right?
00:38:42.079 --> 00:38:43.599
That's completely arbitrary.
00:38:43.760 --> 00:38:48.719
Uh which what it does with its operand, that's the definition of the over.
00:38:49.119 --> 00:38:55.920
Now, the fact that it is is dyadic that sort of makes sense here, especially since over basically only makes sense like that.
00:38:56.000 --> 00:39:00.639
But it's but it's still arbitrary what it the how it chooses to pipe the arguments in.
00:39:00.800 --> 00:39:12.639
In the same way with any way it uses the arguments, in principle, it we the before and after, for example, could be defined as ignoring the left argument and only using the right argument the appropriate number of times for the operands.
00:39:12.719 --> 00:39:14.960
It makes no sense to define them like that, but you could.
00:39:15.840 --> 00:39:16.719
I guess so.
00:39:17.199 --> 00:39:29.679
And and and that also means that if you had the addict function, sort of after the addict function, you it could have been a a strictly monetic derived function that just uses the right argument over and over and over and over.
00:39:30.000 --> 00:39:35.119
Could have been, it doesn't make so much sense, but you sort of had to learn these patterns, and I find it really neat.
00:39:35.360 --> 00:39:40.000
It's the same as the therapist F after G self.
00:39:40.320 --> 00:39:41.039
Yeah, yeah, yeah.
00:39:41.280 --> 00:39:42.559
Okay, no, right, you could do that.
00:39:43.039 --> 00:39:46.079
And and it that makes more sense and is more readable and so on.
00:39:46.239 --> 00:39:52.079
But I'm I'm just trying to communicate that it is sort of arbitrary how the plumbing is is working out, yeah.
00:39:52.400 --> 00:40:02.239
Whereas the the BQN and APL operators are completely predictable in how they treat the argument, they're just patterns of application.
00:40:02.480 --> 00:40:04.800
And you can apply the result either monetically or daddy.
00:40:05.039 --> 00:40:08.960
Might not work for those operands, but it does, but you can certainly do it.
00:40:09.440 --> 00:40:09.840
Yes.
00:40:10.079 --> 00:40:17.280
But now we need a a in the documentation or some some auxiliary site, uh, I don't know, fixable cart, uh, or something like that.
00:40:17.440 --> 00:40:23.840
Yeah, we need this grand table of all the compositions and and what they derive exactly.
00:40:23.920 --> 00:40:24.639
That would be really good.
00:40:24.800 --> 00:40:25.760
Yes, that's a good idea.
00:40:25.920 --> 00:40:27.280
I should I should add that.
00:40:27.599 --> 00:40:36.000
I haven't I mean there's sort of uh inter implementation detail, but it actually the parsing isn't static.
00:40:36.400 --> 00:40:38.639
It is totally possible to do statically.
00:40:38.800 --> 00:40:41.360
I just kind of didn't implement it that way.
00:40:41.679 --> 00:40:55.599
So in fact, like it's impossible to write anything that can't that you can't you couldn't determine statically, but because of the way I implemented it, like this actually well actually, I don't know, it's sort of hard to explain.
00:40:55.679 --> 00:40:59.840
I'm not sure how relevant it is, but like this, there isn't actually a lookup table.
00:41:00.000 --> 00:41:07.360
Like it it does it literally returns a function that has this definition of that does.
00:41:08.239 --> 00:41:10.960
Ah does this you can capture that capture that.
00:41:11.119 --> 00:41:12.719
No, I think I think it does make sense.
00:41:12.800 --> 00:41:24.639
That it's not it doesn't it doesn't it's not lazy and waiting for for you to call it if before it goes into the combinator code, rather it immediately returns a function that that does that thing, that does that pattern.
00:41:24.880 --> 00:41:33.280
And I think it's neat there's a there's a there's a huge potential for uh we could say overloading if you want, despite your best efforts, right?
00:41:33.440 --> 00:41:39.519
Because there are lots of arities of the right functions that are not defined, but certainly could be defined.
00:41:40.480 --> 00:41:45.920
Yeah, or like like with over, over the left function has to be dyadic, right?
00:41:46.000 --> 00:41:48.400
It'll error if you put a monadic function here.
00:41:49.840 --> 00:42:01.760
But in theory, I could define two new, you know, a new modifier here where the left function has to be di monadic and there could be two new cases here.
00:42:02.079 --> 00:42:04.960
It wouldn't make sense for it to be called over, but I could.
00:42:05.199 --> 00:42:07.599
You know, that's empty syntactic space.
00:42:08.000 --> 00:42:08.400
Yeah.
00:42:08.719 --> 00:42:11.679
Well, it has to be a separate operator, right?
00:42:11.920 --> 00:42:14.480
Because uh how does it work there?
00:42:15.760 --> 00:42:29.599
So is it is it the case that every operate every operator with a particular set of monetic dadic operands has to return the static arity of derived function.
00:42:31.039 --> 00:42:31.440
Right.
00:42:31.599 --> 00:42:33.039
I think that's the case, Eril.
00:42:33.199 --> 00:42:35.679
I don't know if I expressed that in a way that was understandable at all.
00:42:36.079 --> 00:42:39.119
Um yeah, I've been lost since I said the last time I was lost.
00:42:39.440 --> 00:42:41.199
It's not it's not Jacob's fault.
00:42:41.280 --> 00:42:42.400
It is Adam's fault.
00:42:42.559 --> 00:42:49.440
Although actually it's probably the array cast disbanding's fault, because usually I used to just be the moderator and I get confused all the time.
00:42:49.599 --> 00:42:57.440
But now I'm half of a panel of which, you know, I'm only like a blue belt or whatever is a couple levels before below a black belt.
00:42:57.760 --> 00:43:00.880
Let's because I if I'm confused, I guarantee a couple listeners.
00:43:00.960 --> 00:43:02.880
Although, I mean, I'm looking at the YouTube chat.
00:43:03.039 --> 00:43:08.719
We've got Kai, we got Max, we got Madeline, we got like implementers and creators.
00:43:08.800 --> 00:43:12.159
So potentially I'm the only one that's confused right now.
00:43:12.480 --> 00:43:24.800
So here's my here's my main thing where I'm I'm hung I'm hung up on is that I hear that like it's there's some arbitrariness, but in my head I'm going, like, isn't aren't the semantics that are attached to everything arbitrary?
00:43:24.880 --> 00:43:35.199
I mean, not really, but yeah, we at we attach semantics to things, and I do understand that some of these glyphs can result in either a monadic or dyadic derived function.
00:43:35.360 --> 00:43:42.079
And I guess is the point here that like in WiWAT, Tiny Apple, BQN, like you you don't have that.
00:43:42.239 --> 00:43:50.559
This is a new thing, and that's what's confusing because from my point of view, yes, there's overloading of the airity that can be passed to these modifiers.
00:43:50.719 --> 00:43:52.719
But to me, that is not confusing.
00:43:52.880 --> 00:43:56.159
That is a set of rules that you learn as a part of learning the language.
00:43:56.239 --> 00:44:01.519
And yes, if it's monadic before dyadic or dyadic before manadic, Fanatic, that's not confusing to me.
00:44:01.679 --> 00:44:05.840
You learn those rules the same way that you learn how to parse two trains and three trains.
00:44:05.920 --> 00:44:15.840
But like the problem with you learn how to parse two trains and three trains in these array languages, and then you still can't know what the function does at the end of the day because you need extra context.
00:44:16.000 --> 00:44:29.360
Whereas here, you learn the overloading of the before and the after and the different modifiers, and like you know that table, and now with the knowledge of that table in your head, you look at the airity pattern, and then like you can just learn what it means.
00:44:29.440 --> 00:44:30.480
So that's what I'm hung up on.
00:44:30.559 --> 00:44:41.519
Is it sounds like there's some kind of thing where we're saying, oh, this is arbitrary, but like is it just that the arbitrariness is the rules that we attached to the modifiers and that you have to learn them?
00:44:41.599 --> 00:44:45.119
Because like that is perfectly knowable like knowledge that you can learn.
00:44:45.280 --> 00:44:52.719
Anyways, that's where I'm I'm confused, is like I feel like I'm missing a thing that, like, yes, I understand you can end up with a dyadic or monadic derived function.
00:44:52.880 --> 00:44:53.840
I don't see a problem with that.
00:44:54.000 --> 00:44:57.679
Sure, for a for maybe that makes as a language implementer it harder to parse.
00:44:57.840 --> 00:44:58.880
Not my problem as a user.
00:44:58.960 --> 00:44:59.920
That's Jacob's problem.
00:45:00.000 --> 00:45:01.679
He figured out how to do that, not my problem.
00:45:01.840 --> 00:45:06.400
And I guess it's also Adam's problem because he is head of language design for a dialogue.
00:45:06.480 --> 00:45:11.599
So it's everybody's problem but the guy who's not designing the language, which is why I'm sitting here being like, this is fantastic for me.
00:45:11.760 --> 00:45:16.800
Anyways, please, and and uh the someone in the chat did say I'm I'm confused without the deal.
00:45:17.760 --> 00:45:19.599
So I'm not the only one I appreciate it.
00:45:20.239 --> 00:45:28.639
I I I think I think we can compare this a little bit to something that appears in J, and I think also in Sharp APL, old Sharp APL.
00:45:28.960 --> 00:45:44.880
So in in or in dictionary of APL that Iverson wrote, he wrote about something called function rank, which for every function you define a a monetic daddy ranks, and it's sort of like having the rank operator implicit.
00:45:45.360 --> 00:45:50.719
So for example, the plus function is is very simple, it's rank zero zero.
00:45:50.880 --> 00:45:57.280
That means it applies, it's sort of conceptually applies loopingly to every subarray of rank zero.
00:45:57.599 --> 00:46:03.199
But other arrays, uh sorry, other functions have apply to bigger ranks.
00:46:03.360 --> 00:46:08.960
So a very strict example would be the matrix inversion function.
00:46:09.119 --> 00:46:19.920
So matrix inversion only makes sense on matrices in traditional APLs, including that I give today, if you try to apply it on something that's higher rank than two, you just get an error.
00:46:20.239 --> 00:46:25.039
According to Iverson, the functional rank of matrix inversion is two.
00:46:25.280 --> 00:46:26.400
It applied to matrices.
00:46:26.480 --> 00:46:32.000
If you apply it to an array of higher than two, it's as if you wrote function inversion rank two.
00:46:32.239 --> 00:46:34.639
So it just splits up the array into arrays of rank two.
00:46:34.960 --> 00:46:54.159
Here too, in the documentation for the uh for the uh modifiers, you would write, for example, that this modifier has the right function valence, or come up with some fancy name for that, equivalent to alpha under bar, is that right, or uh omega under bar.
00:46:54.639 --> 00:47:03.599
So you say, so for example, we know that that over has to has the valence of the left operand, and the left operand has to be dyadic.
00:47:04.079 --> 00:47:08.239
So therefore, the all derived functions from over are dyadic.
00:47:08.639 --> 00:47:16.400
But before also has the the derived valence of the left operand, but it's unbounded.
00:47:16.480 --> 00:47:24.800
So you can set the you can use any valence left operand, but then you can predict the the right function will have that same valence as the left operand.
00:47:24.880 --> 00:47:26.079
And the right operand doesn't matter.
00:47:26.239 --> 00:47:29.119
The meaning matters with the right operand, but the valence doesn't.
00:47:29.280 --> 00:47:30.880
So did I get that right, Jacob?
00:47:31.119 --> 00:47:31.840
I believe so.
00:47:32.079 --> 00:47:32.480
Yeah.
00:47:32.639 --> 00:47:33.039
Yeah.
00:47:33.119 --> 00:47:36.159
I'm I'm not sure, honestly, I'm starting to get confused.
00:47:36.400 --> 00:47:39.199
But we're losing everyone.
00:47:40.000 --> 00:47:41.039
Okay, yeah.
00:47:41.440 --> 00:47:47.599
I mean Madeline in the chat, Madeline in the chat said in APL you can't know what a function does if you don't know how it's called.
00:47:47.760 --> 00:47:55.199
And in fixed APL, you can't know how a function is parsed if you don't know the airities of the identifiers referred in it.
00:47:55.519 --> 00:47:55.840
Yeah.
00:47:56.079 --> 00:47:59.920
Oh no, but you do know that the airity of the identifiers referred in, right?
00:48:00.079 --> 00:48:01.039
Yeah, yeah, you do.
00:48:01.519 --> 00:48:03.679
So yeah, that's what I'm thinking.
00:48:03.920 --> 00:48:04.960
We know the arities of everything.
00:48:05.440 --> 00:48:06.320
That's either blue or green.
00:48:18.159 --> 00:48:20.639
Yeah modifiers, you have to use these underscores.
00:48:20.719 --> 00:48:47.599
If there was an equivalent of that for functions, like if I had to write underscore foo underscore equals plus, or like if we defined this dyadic foo to like if every dyadic function has to be written like this with the delimiters like that, then yeah, it would be I guess more it would be yeah, less ambiguous, but that sort of defeats the purpose.
00:48:47.840 --> 00:49:01.199
Oh wait, hold on, but are you saying that there's there's no you can't I can tell in an APL symbol what herity it has by my internal dictionary of which ones do what, but I can't tell in a user-defined name what if it's monadic daddy.
00:49:01.280 --> 00:49:04.400
I just realized now because I haven't played around with it, they all look the same, right?
00:49:04.800 --> 00:49:09.119
Yeah, like if I write foo is plus, right?
00:49:09.280 --> 00:49:12.880
Yeah, uh oh, for some reason it's not highlighting, I don't know why.
00:49:13.039 --> 00:49:15.760
Um okay, that was a weird glitch.
00:49:15.840 --> 00:49:16.719
I'll have to fix that.
00:49:16.880 --> 00:49:20.719
But it's highlighted in blue, which tells you that it's dyadic.
00:49:20.800 --> 00:49:28.960
But if you didn't have any highlighting and you just saw foo, you don't know what its arity is unless some language where it was written like this.
00:49:29.280 --> 00:49:29.920
Right, exactly.
00:49:30.000 --> 00:49:33.119
And now if you use foo in the derived function, you really don't know what's going on.
00:49:33.280 --> 00:49:39.760
If you write foo over bar, you have no idea whether the derived function is monetic or daddy because it depends on the errority of foo.
00:49:40.000 --> 00:49:42.719
So you can't statically parse this.
00:49:43.039 --> 00:49:43.920
That's why that's the same.
00:49:44.079 --> 00:49:47.519
Yeah, once again, this seems this seems like an implementer versus user thing.
00:49:47.599 --> 00:49:50.800
Because like I'm thinking like we only have fixed aerity functions.
00:49:50.960 --> 00:49:56.239
So like don't text it, I let you have fixed aity all over the place, even if I can't tell.
00:49:56.400 --> 00:50:05.119
Well, I guess that is gets back to the readability thing, but like assumably, yeah, like it whatever you do a subscript one, two, or the underscore before and after.
00:50:05.360 --> 00:50:14.880
If you make it some way, like we do, it's not like you're gonna end up in a situation where the function can either be monadic or dyadic, and therefore we now are in back in like APL land.
00:50:15.039 --> 00:50:20.800
It's always gonna just have either oh, except do you well let me ask another couple of questions.
00:50:20.960 --> 00:50:29.679
Do you have I haven't tried this, but do you have like defenguards where you where you can return something based on the return now based on the condition?
00:50:29.920 --> 00:50:30.239
No.
00:50:30.880 --> 00:50:34.800
So that I will there's no reason not to have them, I just didn't add them.
00:50:35.039 --> 00:50:45.119
Well, there is because you if your functions can return functions and you can have guards, then a function can return but a function that returns a function, it returns the function in subject position.
00:50:45.280 --> 00:50:52.000
And then so that that that's maybe a good thing to mention is like say I have this list which contains plus.
00:50:52.480 --> 00:51:00.960
If I get the first element of plus, it's this, but I can't it is plus the first element of the list, but I can't remember.
00:51:02.400 --> 00:51:02.719
I see.
00:51:02.800 --> 00:51:04.159
Yeah, because you have to activate it.
00:51:05.199 --> 00:51:10.559
I have to use this diad uh this modifier dyad, which lets me call it.
00:51:11.280 --> 00:51:13.760
What happens if you call it with a monad modifier?
00:51:14.320 --> 00:51:17.679
Then uh I don't remember if it errors or if there's coercion.
00:51:18.320 --> 00:51:20.000
Yeah, I I guess it errors.
00:51:20.239 --> 00:51:20.800
I see.
00:51:21.119 --> 00:51:23.679
Wait, so walk us through what we just introduced here.
00:51:23.760 --> 00:51:30.159
You've got subscript 0, 1, and 2, which is for I'm assuming nilad, monad, and dyad, and these are modifiers?
00:51:30.639 --> 00:51:35.119
Yeah, so there are these monadic modifiers, subject, monad, and dyad.
00:51:35.519 --> 00:51:50.239
And the idea is you can use them to move functions from the subject position to the function position, basically, which is sort of a a weird thing to explain.
00:51:50.320 --> 00:51:59.920
But if you have one plus two, this is gonna work because the plus is in the position of a dyadic function, and it just knows that.
00:52:00.239 --> 00:52:14.159
But if I have a list that contains plus, and I get the first element of that, it's still the function plus, but it doesn't have the right syntax position to be called like this.
00:52:14.639 --> 00:52:18.880
It it's yeah, it's become it's become value-ified, right?
00:52:19.280 --> 00:52:21.760
It's now valid plus not the function plus.
00:52:22.159 --> 00:52:34.559
But then I have I have a question, then yeah, according to the coloring and the claim of the pop-up, the zero sub the subscript zero is a monetic modifier, but that does not seem right.
00:52:34.639 --> 00:52:36.960
It seems to be special syntax, right?
00:52:37.199 --> 00:52:42.000
No, they're all modifiers, but it's just well, it's hard to explain, basically.
00:52:42.239 --> 00:52:43.360
I can't derivate.
00:52:49.920 --> 00:52:50.239
I don't know.
00:52:50.639 --> 00:52:51.599
Because well, maybe I'm missing.
00:52:52.079 --> 00:52:56.800
They're parse the same as monadic modifiers, but they work a little sp they work differently from the other ones.
00:52:57.119 --> 00:53:01.360
Yeah, because normally, well, maybe it's just a way I think about it.
00:53:01.440 --> 00:53:17.599
Normally, when I apply a modifier operator to a function, then the derived thing will always be a function on its own, or in in some APLs, you can derive a monetic operator from a dyadic operator, but it doesn't matter so much.
00:53:18.639 --> 00:53:25.199
But here, could it be that we have a modifier that derives a nilet?
00:53:25.440 --> 00:53:28.320
I mean derives a value instead.
00:53:28.480 --> 00:53:32.559
Yeah, and I think J also has something like this, but I've always been confused.
00:53:32.800 --> 00:53:35.119
Yeah, but I've always been confused that how does that work?
00:53:35.199 --> 00:53:36.960
Because how does it know when to apply it?
00:53:37.039 --> 00:53:39.039
But maybe it's not a problem, maybe just me.
00:53:39.199 --> 00:53:40.320
I don't I don't understand.
00:53:40.639 --> 00:53:42.480
Yeah, it is it does parse, right?
00:53:42.559 --> 00:53:45.840
Like if I have one each, I think that would work.
00:53:46.000 --> 00:53:47.360
Oh no, it errors.
00:53:47.679 --> 00:53:49.360
Alpha must be a function.
00:53:49.599 --> 00:53:50.639
So yeah, I don't know.
00:53:50.880 --> 00:53:53.280
But you can do you could put a one, right?
00:53:53.760 --> 00:53:56.079
What do you oh one sub one you like this?
00:53:56.239 --> 00:53:57.039
Yeah, one sub one.
00:53:57.119 --> 00:53:59.599
So this makes one into a constant function that takes one argument.
00:54:00.639 --> 00:54:02.639
Yeah, I guess so then you could do that, yeah.
00:54:02.880 --> 00:54:12.320
But although the normal way you would write yeah, maybe that should error, I guess, because the normal way to write a constant function is to use self.
00:54:12.719 --> 00:54:13.840
There's no difference, right?
00:54:14.079 --> 00:54:18.159
Yeah, they are the same, but maybe this maybe that should error, but it doesn't.
00:54:18.559 --> 00:54:26.400
But then then you need you need self for for something that takes one argument and you need commute or whatever backwards.
00:54:26.800 --> 00:54:29.519
Yeah, fact that's that's why there's there's two of them, yeah.
00:54:29.920 --> 00:54:32.000
It's almost clearer to write it with a subscript.
00:54:32.320 --> 00:54:34.320
Just write one th, isn't it?
00:54:34.639 --> 00:54:37.760
This is a constant one that's monetic, or constant one that's dyadic.
00:54:38.000 --> 00:54:40.400
So I guess maybe it's better to just write it like this.
00:54:40.639 --> 00:54:41.440
I'm not sure.
00:54:41.760 --> 00:54:45.519
Wait, explain the I was following along that you because I ran into that myself.
00:54:45.599 --> 00:54:50.960
You have to split the self and swap or the C combinator and the W combinator into two different glyphs.
00:54:51.119 --> 00:54:53.440
But what are you doing with the subscript two here?
00:54:53.519 --> 00:54:55.440
The dyad turns this into what?
00:54:55.840 --> 00:54:57.920
It's a one is a it's a constant, right?
00:54:58.239 --> 00:55:02.320
It's a value, and we want to make a constant function from it.
00:55:02.480 --> 00:55:04.800
So the constant function also has to have fixed area T.
00:55:04.880 --> 00:55:08.159
So is it a monetic constant function or is it dyadic constant function?
00:55:08.320 --> 00:55:09.599
So there are two ways to do it.
00:55:10.320 --> 00:55:10.719
Right?
00:55:11.039 --> 00:55:13.360
Yeah, yeah, as Adam's saying, there's two ways to do it.
00:55:13.440 --> 00:55:24.239
You can either make a constant function monadic or dyadic using these sub one and sub two glyphs, or you can use self or backward.
00:55:24.480 --> 00:55:29.360
And like you can see here, it's called self slash constant one and constant two.
00:55:30.880 --> 00:55:39.840
But I don't know, because you can also do it with the subscript one and subscript two, so I'm not sure which way I like more, but both ways are equivalent at the moment.
00:55:40.400 --> 00:55:40.880
That's all right.
00:55:41.119 --> 00:55:49.360
I love Tiny Apple, and there's like 700 ways to do everything there, so uh I mean I I I'm fascinated by the by the design space that is in this language.
00:55:49.440 --> 00:55:56.639
It it's sort of a small language, yes, in in the vocabulary, but the but in a way it reminds me of K.
00:55:57.280 --> 00:56:07.599
I guess, yeah, I guess this is similar to K, because in K you can it also looks sort of at the what types you're giving things, and then it can things have different meaning.
00:56:07.920 --> 00:56:17.039
So I just I just realized that because of the strict way that the operators work here, then there are actually three options for every operand.
00:56:17.280 --> 00:56:20.000
You could also give a value as operand.
00:56:20.159 --> 00:56:23.039
Like I suppose the rank operator particular value.
00:56:23.679 --> 00:56:25.519
Most of them don't accept it, but yeah.
00:56:26.159 --> 00:56:27.280
But that doesn't yeah.
00:56:27.440 --> 00:56:34.159
And for example, there's no so the I don't know if transpose is monadic or dyadic, I can't tell because of the colors.
00:56:34.559 --> 00:56:36.159
Uh transpose is monadic.
00:56:36.480 --> 00:56:38.559
Uh it's just there on the on the pop-up, yeah.
00:56:38.800 --> 00:56:39.360
Yeah.
00:56:39.920 --> 00:56:45.039
But for example, if I do reverse, no, that's rotate, sorry.
00:56:45.280 --> 00:56:54.079
Reverse, if I do like a reverse reduction, it doesn't currently have meaning, but you could define a meaning to a monetic function applied with reduction.
00:56:54.400 --> 00:56:55.119
Yeah, I could.
00:56:55.280 --> 00:56:58.239
And and and if I understand right, this is exactly what k does.
00:56:58.320 --> 00:57:03.679
So if you give a dyadic function with reduction in k, that's normal, that's reduced, fold, whatever you want to call it.
00:57:03.760 --> 00:57:18.719
And if you give a monetic function, then it's fixed point, like it applies that function over and over again until yeah, and and it has a whole system with with a with with a forward slash and backslash, but they're all related depending on give it monetic functions or dyadic functions, they all do the thing.
00:57:18.800 --> 00:57:24.239
So scan give with a monetic function is also fixed point, but it gives you all the intermediary values.
00:57:24.880 --> 00:57:25.679
That's funny.
00:57:25.920 --> 00:57:26.400
Yeah.
00:57:26.880 --> 00:57:28.800
So I guess it is like K in that way.
00:57:28.960 --> 00:57:29.199
Yeah.
00:57:29.440 --> 00:57:30.079
Which is funny.
00:57:30.320 --> 00:57:33.280
K is the language that is famous for having all the overloading.
00:57:33.360 --> 00:57:36.639
Fixed APL is supposed to have none, but in a way it's the most similar.
00:57:36.960 --> 00:57:39.920
Well, so too, fixed APL has heavy overloading.
00:57:40.239 --> 00:57:43.199
Of course, it does have heavy overloading with the modifiers, yeah.
00:57:43.360 --> 00:57:45.360
But it's just conceptually, yeah.
00:57:45.760 --> 00:57:46.320
Yeah, yeah.
00:57:46.400 --> 00:57:51.440
The the the yeah, before and after carry a lot here.
00:57:51.599 --> 00:57:55.760
Whereas in APL at BKN, they they don't need nearly as much.
00:57:56.239 --> 00:57:56.800
Yeah.
00:57:57.119 --> 00:57:57.440
Okay.
00:57:58.079 --> 00:58:00.159
Um, not sure what we should talk about next here.
00:58:00.480 --> 00:58:01.760
Well, I mean, I've got a bunch of questions.
00:58:01.840 --> 00:58:07.599
I was just thinking about because I'm still trying to clear up the confusion, but we'll circle back and uh we'll just don't worry.
00:58:07.760 --> 00:58:09.280
I'll spend some time playing around with this.
00:58:09.360 --> 00:58:14.000
We'll have you back and then we'll we'll be I'd like to talk about trains at some point, but oh yeah, that's the thing.
00:58:14.079 --> 00:58:18.079
Yeah, like oh well we'll do that now and I'll save my my my questions.
00:58:18.159 --> 00:58:21.280
Or at one point we'll go through all the all the glyphs, we'll rapid fire.
00:58:21.360 --> 00:58:25.360
Um, but yes, I mean we also have uh a different train model, and that's the thing.
00:58:25.440 --> 00:58:32.800
That's we haven't even gotten to trains yet, which is ridiculous that we were well not ridiculous, I guess it just shows you the power of the modifiers and fixed APO.
00:58:34.159 --> 00:58:40.079
Maybe a thorough treatment of of fixed APO's tested programming is an episode on Tested Talk.
00:58:40.239 --> 00:58:42.000
I won't say oh yeah, yeah.
00:58:43.440 --> 00:58:45.760
We got two we got two podcasts, we're gonna have you on them both.
00:58:45.920 --> 00:58:50.800
But yes, let's move to so uh for the audio listener that got confused and is still listening for some reason.
00:58:50.880 --> 00:58:51.199
Thank you.
00:58:51.280 --> 00:58:53.599
We appreciate uh your valuable time.
00:58:54.000 --> 00:58:57.840
We were up until this point talking about uh glyph land.
00:58:57.920 --> 00:59:00.800
You know, we were talking about the before, the after.
00:59:00.880 --> 00:59:05.599
At one point we were talking about over, talking about rank, talking about the sub-012.
00:59:05.920 --> 00:59:08.480
We haven't even talked about trains, folks.
00:59:08.559 --> 00:59:12.480
So these are different trains than you're used to because we now have fixed airity.
00:59:12.719 --> 00:59:14.000
All right, over to you, Jacob.
00:59:14.320 --> 00:59:19.519
Yeah, so the basic idea of trains is similar, but it's not quite the same.
00:59:19.760 --> 00:59:27.679
I'd say the first major difference is that you can have a train whose right most time is a value, right?
00:59:27.920 --> 00:59:29.840
Which is very different from APL.
00:59:29.920 --> 00:59:36.639
In APL, if you write plus one, it's just gonna give you one, but in fixed APL, it gives you a monadic function.
00:59:36.800 --> 00:59:40.079
And if you write plus one in parentheses, it's two.
00:59:42.239 --> 00:59:46.880
Because it's you filled one slot of the plus, so there's one slot left.
00:59:46.960 --> 00:59:49.920
That's exactly again like like K does it.
00:59:50.800 --> 00:59:50.960
Yeah.
00:59:51.280 --> 00:59:52.480
And the same thing goes all the way.
00:59:52.559 --> 00:59:58.639
You can write what one plus as well because it's a diad on the right, so it has to have something more, so it knows it's a train.
00:59:58.719 --> 00:59:59.599
That's very neat.
00:59:59.920 --> 01:00:00.480
Yes.
01:00:00.719 --> 01:00:03.039
So that's maybe the first difference.
01:00:03.760 --> 01:00:13.360
Another major one is that because you know what's monadic and what's dyadic, you don't have every application be a fork.
01:00:13.519 --> 01:00:16.639
You also have a top, and it's very implicit.
01:00:16.960 --> 01:00:24.960
So maybe a simple example would be the length plus the I don't know.
01:00:25.360 --> 01:00:39.039
Maybe the square root plus the of the or maybe actually, you know, it would be easier, it would be easier to just do something that you can see with a couple.
01:00:39.599 --> 01:00:45.599
So we can have or pair the existing round up and round out and round the value.
01:00:46.079 --> 01:00:46.800
Yeah, you can do that as well.
01:00:46.960 --> 01:00:47.440
Yeah, that works.
01:00:47.840 --> 01:00:53.360
The sign an absolute value of negative four gives you a fork, right?
01:00:53.519 --> 01:01:05.119
Where you have the two monadic functions being applied to the input, and then they are passed dyadically to the middle function, which is couple, so you get negative one and four.
01:01:05.360 --> 01:01:14.880
And this is a classic fork, and you also have two dyadic versions, so you have maybe sign and then equal, so we can put three here.
01:01:15.119 --> 01:01:21.599
And here you have the sine of negative four, which is negative one, coupled with a three is equal to negative four, which is zero.
01:01:21.920 --> 01:01:23.119
Wait, wait, hold on, what?
01:01:23.440 --> 01:01:28.559
Why why did it decide to decide to take the sign of the right argument, not the sign of the left argument?
01:01:28.719 --> 01:01:38.159
Yeah, I understand the sign is monetic, but how do you think it takes the sign of the right argument, and that's it's arbitrary, basically, but that's the way I decided to do it.
01:01:38.320 --> 01:01:40.800
And perhaps it's not the most intuitive way.
01:01:40.960 --> 01:01:52.719
But I thought it was more consistent with the monadic version, because if this is monadic, sign the monadic function always applies to the right argument.
01:01:52.800 --> 01:01:59.840
So it seems a little weird for just because you switch one function to be dyadic, the monadic is the left argument instead of the right.
01:02:00.400 --> 01:02:02.320
I mean, yeah, I guess so.
01:02:02.480 --> 01:02:05.599
It it makes sense with like the main argument is the right argument, and that's the same.
01:02:05.760 --> 01:02:11.039
Especially if you switch it around, like if you write equal couple with sign, you can see it maybe better.
01:02:11.679 --> 01:02:14.880
The sign in both situations is treated the same.
01:02:16.320 --> 01:02:24.159
So that's that's the first thing, I guess, is you know, your normal basically your normal forks are just a little different.
01:02:24.400 --> 01:02:28.159
But then you also have a top, and it's quite normal.
01:02:28.320 --> 01:02:35.360
So you have we can say the square root, or maybe yeah, square root of the absolute value of the input value.
01:02:35.760 --> 01:02:37.360
Square root of absolute value, sure.
01:02:37.920 --> 01:02:39.840
And that works how you would expect.
01:02:39.920 --> 01:02:45.679
It does the square root of the absolute value of the input, which is so with negative four, you get absolute value is four, square root is two.
01:02:46.239 --> 01:02:53.199
And you can combine this with fork, and this is not specifically because it has two tines in this train.
01:02:53.280 --> 01:02:56.000
This is just the way that it is parsed.
01:02:56.159 --> 01:02:58.960
And it can be with any number, not just a negative.
01:03:01.840 --> 01:03:03.679
Yeah, the negation of that.
01:03:04.000 --> 01:03:13.199
And in another language, this would be parsed as a fork because it would treat square root as some dyadic function, which doesn't exist.
01:03:13.440 --> 01:03:14.800
So I guess it would error.
01:03:15.119 --> 01:03:21.760
But here, because it knows that square square root is a monad function, it treats it as a top.
01:03:22.079 --> 01:03:37.039
And uh you can mix this with all sorts of different trains, but like if we have the function, if we add negative four to this negative two, you can see we're combining a fork and this a top.
01:03:37.599 --> 01:03:40.000
How do we uh the grouping is not clear to me?
01:03:40.159 --> 01:03:45.360
Like, how do I know that does it group from the right and or or it groups from the right?
01:03:45.599 --> 01:03:49.119
Yeah, because so it it's sort of greedy, it takes all the monetic functions on the right.
01:03:49.360 --> 01:03:55.920
We could also understand this is id plus negate applied to the result of the square root of the absolute value.
01:03:56.639 --> 01:03:57.840
Well, this is this is not distinctly.
01:03:58.320 --> 01:04:03.440
Or you could even parse it like this, where yeah, and just plus is treated as its own function.
01:04:03.840 --> 01:04:06.960
So we so for the function lookout is actually parse.
01:04:07.360 --> 01:04:14.800
But for a train, we start on the right, we take as many monetic functions as we can find, and and they they get coupled together, right?
01:04:15.039 --> 01:04:21.519
Or you could, but not exactly because you can also switch it around and have it on the left, and you can have any combination.
01:04:21.760 --> 01:04:22.639
How does that hold on?
01:04:22.960 --> 01:04:23.519
Can try this?
01:04:23.599 --> 01:04:25.280
But now you you can't have ID here, right?
01:04:25.360 --> 01:04:32.000
If you put ID on the right, squared of maybe we can have did it do the same thing, but put the ID on the right of the plus?
01:04:32.480 --> 01:04:33.679
Uh yeah, you can do this.
01:04:33.920 --> 01:04:34.320
Hold on.
01:04:34.400 --> 01:04:35.119
No, that's not without.
01:04:36.880 --> 01:04:38.400
Yeah, but that doesn't matter too much.
01:04:38.480 --> 01:04:41.440
But if you if you remove the left ID here, yeah.
01:04:41.760 --> 01:04:48.079
Then you're getting something else where you have the squ absolute value plus plus identity.
01:04:48.400 --> 01:04:48.719
Yeah.
01:04:48.960 --> 01:04:52.719
And then we apply the negation of oh, actually you do need identity.
01:04:52.800 --> 01:04:53.199
Yeah.
01:04:53.519 --> 01:04:54.559
Yeah, but it doesn't make sense.
01:04:54.719 --> 01:04:56.159
Always give zero for every number.
01:04:56.320 --> 01:04:59.119
But yeah, this is a bad function.
01:04:59.360 --> 01:05:04.559
Well, for every for every real number, it gives it gives uh the but but it doesn't matter so much.
01:05:04.880 --> 01:05:06.159
All right, so let's put it.
01:05:06.320 --> 01:05:11.840
We we lost the audio listener because we're not explaining we're building up trains here.
01:05:12.159 --> 01:05:12.800
Yes, we started.
01:05:13.599 --> 01:05:16.159
I feel like it's hard to explain trains to the audio listener now.
01:05:16.400 --> 01:05:17.440
Oh, that's it's pretty easy.
01:05:17.599 --> 01:05:20.559
It's pretty easy because we got green function, we got blue functions, folks.
01:05:20.639 --> 01:05:21.280
That's all we got.
01:05:21.440 --> 01:05:22.159
It's real easy.
01:05:22.239 --> 01:05:23.920
We got uh yeah, but hold on.
01:05:24.000 --> 01:05:32.400
The audio reader, the audio reader, yeah, the audio listener might be listening and not looking because they can't see, in which case calling using the names blue and green is not gonna help them.
01:05:32.639 --> 01:05:34.239
Oh, it doesn't matter, it's just the pattern, right?
01:05:34.320 --> 01:05:48.400
So right now we are building we started off by looking at the forks, and there's a couple different overloads because now you can have like the way that I think of forks and APO and friends is you've got the monadic, which is one two one, and you've got the dyadic, which is two two two.
01:05:48.639 --> 01:05:59.760
Those are the airities of the function, and because those are the only patterns you've got those are the only patterns, and we showed earlier some two two ones, some one two twos because you've got fixterity, it enables you.
01:06:00.320 --> 01:06:04.960
To do this like aity pattern matching, which is what I was going to say earlier, is this is not dissimilar at all.
01:06:05.119 --> 01:06:07.440
In fact, it might be very similar to what jelly does.
01:06:07.519 --> 01:06:11.039
Basically, it looks at a sequence of aridies.
01:06:11.119 --> 01:06:26.480
I actually talk about this in an unpublished paper called uh trains, chains, and function composition or something, that this idea in jelly of chains, where you basically just look at the airity of every function, which is why the the listener's probably being like blue functions and green functions.
01:06:26.559 --> 01:06:27.679
What the hell is this guy talking about?
01:06:27.920 --> 01:06:30.800
A green function is monadic, a blue function is dyadic.
01:06:30.880 --> 01:06:31.920
And that is borrowed.
01:06:32.559 --> 01:06:36.480
I just wanted to jump in here and say this is so classic corner here.
01:06:36.639 --> 01:06:36.880
What?
01:06:37.039 --> 01:06:39.760
So you speak about it in an unpublished paper.
01:06:39.840 --> 01:06:42.159
That's like as tacit as it can be, right?
01:06:42.559 --> 01:06:43.519
I tried to publish it.
01:06:43.599 --> 01:06:44.320
I tried to publish it.
01:06:44.400 --> 01:06:51.760
The the wonderful folks at Array uh the PLDI co-located workshop said that it was uh not novel enough or something like that.
01:06:51.840 --> 01:06:52.239
I don't know.
01:06:52.400 --> 01:06:53.440
I didn't have it peer-reviewed.
01:06:53.519 --> 01:06:57.440
My other paper that was published was peer-reviewed, and this one I kind of wrote at the last.
01:06:58.480 --> 01:07:02.559
We've got a train that read from left to right is monad, monad, monad, diad, monad.
01:07:03.039 --> 01:07:06.719
But it's better to read it from right to left, seeing as we're parsing it and grouping it from right to left.
01:07:06.800 --> 01:07:09.679
So it's and also too, monad, diad, let's just do one, two.
01:07:09.920 --> 01:07:13.440
So it's one, two, one is your fork, and then we had one one.
01:07:13.679 --> 01:07:16.880
And so then you're just applying those monadic operations afterwards.
01:07:16.960 --> 01:07:25.440
And before we had one, one, one, two, one, which means you're kind of combining those unary functions with, you know, that's the classic unary function composition.
01:07:25.519 --> 01:07:36.400
And then at the tail end of that, that kind of formed unary function with the three monadic functions now all are treated kind of as the single function to a monadic fork.
01:07:36.960 --> 01:07:39.280
Yeah, you lost me, and I'm even looking at it.
01:07:39.519 --> 01:07:40.320
I mean, the point being here.
01:07:41.840 --> 01:07:43.119
Yeah, yeah, that's where we started.
01:07:43.280 --> 01:07:44.320
Yeah, this is what we started.
01:07:44.400 --> 01:07:48.719
So so the simple case is easy to understand, is one, two, one, one, one.
01:07:48.880 --> 01:07:49.119
Right?
01:07:49.280 --> 01:07:50.800
So there we start from the right.
01:07:50.880 --> 01:07:55.280
So we've got the one one sequence that all just groups together, applies to the argument.
01:07:55.360 --> 01:07:59.039
We have to say also this this train is applied monetically.
01:07:59.280 --> 01:08:05.199
Wait, wait, are you are you talking about you said start from the right, but then you said quantity one one, which is starting from the left.
01:08:05.519 --> 01:08:08.639
Yeah, I'm reading, I'm reading it from the left, I'm applying it from the right.
01:08:08.719 --> 01:08:09.840
Ah, come on, this is hopeless.
01:08:10.159 --> 01:08:15.760
I mean, it's not hopeless, but uh we gotta we gotta agree which way we're we're reading it.
01:08:15.840 --> 01:08:20.079
Um I saw some list of programming languages that was like comparing them to cars.
01:08:20.239 --> 01:08:25.600
And APL is a is a bus, it takes all the values from A to B at the same time.
01:08:25.760 --> 01:08:29.840
The only problem is that the signage is in Greek and the bus is driving backwards.
01:08:30.079 --> 01:08:31.279
Oh yes.
01:08:32.159 --> 01:08:36.079
Greek, it should be uh like hieroglyphics if we're being uh you know fair.
01:08:36.479 --> 01:08:46.079
Anyway, so when Adam said one, two, one, one, one, he was reading that from left to right, but we parse it from right to left like the rest of APLs.
01:08:47.520 --> 01:08:48.079
Yes.
01:08:48.399 --> 01:08:56.640
And then we went on to say that if you switch the order of that, so you put the three medadic functions at the end on the right.
01:08:57.760 --> 01:08:59.199
At the end is the left, yeah.
01:08:59.359 --> 01:09:00.079
Thank you.
01:09:00.319 --> 01:09:02.880
Or yeah, at the it's impossible.
01:09:03.039 --> 01:09:14.640
Uh you then you then start with, I mean, this is I guess why we've never shared screens on the podcast before, folks, because it just evolves into uh you know colliding with the audio listener.
01:09:14.800 --> 01:09:21.680
You then start off with the monadic fork, the one, two, one, and then that's followed by two more monadic functions.
01:09:21.840 --> 01:09:31.199
So it's it's very interesting because you like this is why I find like Cap and Tiny Apple and now FixAPO.
01:09:31.359 --> 01:09:38.159
Like these are all such interesting models because you can achieve different things with different tacit models.
01:09:38.239 --> 01:09:47.760
Like cap did away with the three train, made the syntax explicit, and then gets the composed unary functions just for free.
01:09:48.000 --> 01:10:08.960
And then the initial thing that you had, which was kind of like the juxtaposition of a nil ad and a unary or a binary function, that's like falls into this arity pattern matching, but cap gets that via left bound functions, where if you have a binary function with just a left argument, it just automatically parses that as like a partial application.
01:10:09.119 --> 01:10:12.479
Whereas here I it's like a form of forg kind of.
01:10:12.720 --> 01:10:21.600
Yeah, it's it's like you're treating this as a if you read the arities of this like you would in jelly, it's a dyadic, and then on the right argument is a nil ad.
01:10:21.760 --> 01:10:25.520
So it's like two zero, and uh if you reverse that, then it's zero, two.
01:10:25.840 --> 01:10:28.800
And so you just I am a s I don't know how this is implemented.
01:10:28.880 --> 01:10:33.359
We should we should I guess you did mention that that uh fix APL implemented in in TypeScript.
01:10:33.680 --> 01:10:33.920
Yes.
01:10:34.159 --> 01:10:35.359
But I assume that's what you do.
01:10:35.439 --> 01:10:38.640
You look at the arities and then you dispatch based on that.
01:10:38.960 --> 01:10:40.479
Is that correct, or is it slightly different?
01:10:40.880 --> 01:10:47.119
Yes, it it's kind of complicated, but yeah, it does look at all the airities and then read it from right to left.
01:10:47.279 --> 01:11:04.319
And yeah, it it breaks it into it treats the the rightmost thing a little differently from the rest, but it reads kind of the rightmost section, then it after that it either reads a monadic function or a dyadic function and then another one.
01:11:04.800 --> 01:11:06.880
So you end up scope.
01:11:09.760 --> 01:11:10.079
Yeah.
01:11:10.560 --> 01:11:21.520
It it's interesting also because the way that traditional APL trains and J trains work, it's actually the dyadic functions are taking on the role of dyadic operators.
01:11:21.680 --> 01:11:27.920
There's a little bit about the the the binding, it's from left to right, right to left, but that's that's sort of just a rule you apply.
01:11:28.159 --> 01:11:41.840
But but the original idea about the fork came from wanting to have an an operator, a two modifier, that acted as a function on the results on of its operand.
01:11:42.239 --> 01:11:49.199
So if we take like a very simple example is plus, comma plus catenate minus, right?
01:11:49.840 --> 01:12:02.399
So there you could think of it as oh, what if there was a catenate operator that took two operands and the effect of the operator was applying the left operand and applying the right operand and catenating the results together.
01:12:02.640 --> 01:12:08.720
So too, for every dyadic function, there exists an operator that does exactly that.
01:12:08.880 --> 01:12:16.560
And Iverson was all in like, uh oh, we have to add as many operators now as there are functions or dyadic functions at least, right?
01:12:16.800 --> 01:12:28.079
So and he actually came up with a scheme, a spelling scheme, where you could take and the symbol for a dyadic function and over strike it with an overbar, and that would make the corresponding operate dyadic operator.
01:12:28.239 --> 01:12:28.720
Oh wow.
01:12:29.119 --> 01:12:32.880
Plus plus overbar and times over bar and divide over bar and so on and so on and so on.
01:12:33.279 --> 01:12:40.399
But then they came they then they realized no, we don't need to do that because since by syntactically isolating them, so that's the cost, right?
01:12:40.560 --> 01:12:50.720
Yeah, putting parentheses around them or naming them, then it's clear, since it's a syntax error in old APL, it's clear that the middle function acts in this operative role.
01:12:50.960 --> 01:12:52.239
That's where trains came from.
01:12:52.399 --> 01:12:53.680
That's where forks came from.
01:12:54.159 --> 01:12:54.880
Interesting.
01:12:55.199 --> 01:12:58.079
And here we sort of abandon that idea, right?
01:12:58.720 --> 01:13:01.680
Yeah, it's not really treated like that at all.
01:13:01.840 --> 01:13:02.239
Yeah.
01:13:02.560 --> 01:13:19.760
It it really just breaks the whole expression into kind of two patterns and just reads them all rather than and it's totally consistent with both expressions that are niladic and expressions that are monadic or dyadic or whatever.
01:13:19.840 --> 01:13:21.439
They all follow the same rules.
01:13:21.920 --> 01:13:29.279
Like there's no difference between writing one plus one, which is two, and identity plus one, which is a monadic function.
01:13:29.840 --> 01:13:30.319
Right.
01:13:30.880 --> 01:13:31.680
Fascinating.
01:13:32.079 --> 01:13:43.520
So I guess I mean I ran into this when I was trying to put a hook, I believe, at the beginning of a fork, but it wouldn't parse the way I wanted.
01:13:43.680 --> 01:13:53.279
And then I got Claude to go scrape all the docs which didn't exist, and then it said, Don't worry, we got the implementation, it's open source.
01:13:53.520 --> 01:13:57.520
So Claude went and figured out how everything worked and then came back with the correct answer.
01:13:57.760 --> 01:14:05.760
It said that if you want the hook at the beginning, it it will aggressively read it as a one-two-one, so that'll treat it as a fork.
01:14:05.840 --> 01:14:07.359
So you need to parenthesize.
01:14:07.520 --> 01:14:12.560
I can't I can't remember if it's a two-one or a one-two, but in that instance you had to parenthesize the two one.
01:14:12.880 --> 01:14:26.720
But now, after having had the before and after discussion, is it actually the case that if you've got a hook that precedes a fork, so you want to do a hook first and a fork, you could actually use before after instead of the two parentheses?
01:14:26.960 --> 01:14:27.920
You still have to parenthesize.
01:14:28.079 --> 01:14:28.720
You still have to parenthesize.
01:14:29.760 --> 01:14:32.079
Because of because of the scoping, right?
01:14:32.159 --> 01:14:33.760
The the the the long scope.
01:14:33.920 --> 01:14:36.399
So trains group from the right.
01:14:36.560 --> 01:14:53.920
And if you want a hook, say, where you want a essentially you want a function applied on the argument as as both its argument, but you want to pre-process on the right, that pre-processing, if it's part of your train, has to be parenthesized.
01:14:54.239 --> 01:15:00.079
Or the the operator that's way out to the left will grab only one time.
01:15:01.199 --> 01:15:02.720
Does that make any sense, Connor?
01:15:03.039 --> 01:15:06.079
Because the operator binding is much stronger than the train binding.
01:15:06.159 --> 01:15:07.680
Or whether there's no train binding, right?
01:15:07.760 --> 01:15:09.439
They just sort of sit there.
01:15:09.760 --> 01:15:10.159
Yeah.
01:15:10.319 --> 01:15:10.560
Right.
01:15:10.640 --> 01:15:11.199
Like you're not going to be able to do it.
01:15:14.399 --> 01:15:15.279
It's like a list.
01:15:15.680 --> 01:15:36.560
Maybe I'm gonna have an existential crisis soon because uh on my most recent ADSP in the cinematic, you know, code report podcast universe, the most recent ADSP podcast was I went on a rant about PedMass and how that's like an arbitrary hierarchy of evaluation that is just ridiculous and array languages are better.
01:15:36.800 --> 01:16:04.079
And then we haven't I know, and and then someone had a very thoughtful response in the GitHub discussion saying, I find it very ironic that all these array language people they bring up how their linear evaluation is so much better than PedMass, and they never acknowledge the fact that there is a ton of precedence, and then he linked or she, I actually don't know, or they linked to the APL wiki precedence page.
01:16:04.319 --> 01:16:08.159
And and then I was kind of well, first of all, I was very thankful.
01:16:08.239 --> 01:16:25.439
It was a very thought-provocative post that led me to hours the next day thinking about this, but then also it's it was worse because I I had never read the precedence page, and at first I was kind of like, ah, well, stranding is kind of fixed, you know, BQN, Tiny Apple, you know, we've all fixed that.
01:16:25.520 --> 01:16:27.359
It only exists in APL and J.
01:16:28.079 --> 01:16:38.479
But then when I thought about I started kept reading, and it was talking about what Adam just mentioned, the long left scope and right scope of functions versus operators.
01:16:38.640 --> 01:16:48.720
And then I was like, yeah, I guess there are times when I'm using, you know, I want to sum over something and I have to parenthesize the sum in order to get the correct binding of the modifier or the operator.
01:16:48.880 --> 01:16:57.039
But then while I was writing it, I was like, wait a second, all of this train stuff that I've I I, you know, I have a whole podcast called Tacitalk.
01:16:57.119 --> 01:17:09.199
I love all this stuff, but it technically is not necessarily like the order of evaluation, but it is a bunch of context that the the way that you read this stuff, and you know, half the time I get confused if I'm in a language that I don't spend enough time in.
01:17:09.439 --> 01:17:15.439
And uh I anyways, I mean, yes, there is a precedence, absolutely, binding strengths, whatever you call it.
01:17:15.600 --> 01:17:17.439
Maybe not in Wea, I'm not sure.
01:17:17.840 --> 01:17:19.359
Because it's really just a fourth.
01:17:19.760 --> 01:17:20.159
Not really.
01:17:20.319 --> 01:17:21.199
I mean, there are, yeah.
01:17:21.359 --> 01:17:26.239
In Wea there are modifiers, but and then that's the only precedent's role, really.
01:17:26.399 --> 01:17:50.880
Yeah, and I guess but I I think a big difference, Connor, is that if you think about you know growing the language, if that says anything to you, uh the pre the precedents' rules in should we say popular languages, languages that share syntax with C or closely aligned with C, they uh the rules get worse and worse.
01:17:51.039 --> 01:17:51.359
Oh yeah.
01:17:52.399 --> 01:17:54.239
The bigger the vocabulary becomes.
01:17:54.720 --> 01:18:02.319
Whereas in the array languages, the rules only get worse the bigger the number of syntactic constructs become.
01:18:02.560 --> 01:18:10.640
But generally a language will have or should have a large vocabulary but a low number of syntactic rules or syntactic constructs.
01:18:10.800 --> 01:18:17.119
So once you master, you know, stranding and dyadic operators and monetic operators and and all those things, right?
01:18:17.279 --> 01:18:18.880
Those rules apply universally.
01:18:18.960 --> 01:18:20.800
But look at this list of JavaScript precedents.
01:18:21.119 --> 01:18:25.199
Yeah, this is JavaScript precedents, and there's 15 levels, or there's even more.
01:18:25.600 --> 01:18:38.800
No, no, the sub-levels, the sub-levels inside the levels, it's a two-dimensional level system, and not only that, the system is so bad that there are things you're not allowed to even put next to each other without parenthesizing because it's just too terrible, right?
01:18:39.039 --> 01:18:55.600
So there are things, yeah, even though it has a rule here, apparent rule here, if you actually try to put some of them next to each other, then the JavaScript interpreter will will blow up at you and say, uh no, you're not allowed to leave this up to in to press uh to the table, rather you must force uh order.
01:18:55.840 --> 01:18:56.319
Yes, there are.
01:18:56.720 --> 01:18:57.840
That's how bad it is, right?
01:18:58.159 --> 01:19:05.279
And and it's like with some of the newer ones, like the null nullish coalescing things, I think, yeah, like that.
01:19:05.760 --> 01:19:09.199
So uh I would say this, yeah.
01:19:09.680 --> 01:19:10.479
Own it, right?
01:19:10.640 --> 01:19:14.960
Yeah, you're not those who are not allowed to to to just arbitrarily put next to each other.
01:19:15.119 --> 01:19:17.760
Um let's own it.
01:19:17.920 --> 01:19:26.079
There is pr there there is a table of rules for how things are applied even in array languages, like I was only in array languages.
01:19:26.399 --> 01:19:29.119
Only we have it way better than they have it anyway.
01:19:29.359 --> 01:19:30.239
It's a lot smaller.
01:19:30.479 --> 01:19:33.840
Yeah, I guess that's that's you can't I've been trying to figure out a way to articulate it.
01:19:34.000 --> 01:19:44.800
Maybe you just have it's that like in C, there's a similar table for this that honestly like most people aren't even aware of, and that's because the best practice is not to rely on the precedence thing.
01:19:44.880 --> 01:19:46.880
It's just like Which means something is broken, just yeah.
01:19:49.439 --> 01:20:01.920
Like, sure, maybe you have the table memorized, but if uh you don't, like if you're working with someone that doesn't have expecting that they will have it memorized, it is not a good like best practice thing.
01:20:02.159 --> 01:20:05.439
And I think Jacob's hearing I we can still hear you.
01:20:05.600 --> 01:20:06.079
Can you hear us?
01:20:06.399 --> 01:20:07.520
My headphones died.
01:20:08.239 --> 01:20:08.800
That's all right.
01:20:08.960 --> 01:20:12.319
But there doesn't seem to be any uh feedback, so no, it's good.
01:20:12.479 --> 01:20:12.960
Okay, yeah.
01:20:13.039 --> 01:20:16.319
So so the rules are very set in the array languages, right?
01:20:16.399 --> 01:20:18.960
And if you expand the vocabulary, you add another thing, right?
01:20:19.119 --> 01:20:24.159
Let's say somebody decides in in JavaScript, oh we we've got to add a new thing, right?
01:20:24.319 --> 01:20:33.600
You know, the equality, it doesn't work on properly on on say arrays, we've got to add equal sign, equal sign, equal sign, equal sign, and call it equality for good, right?
01:20:33.920 --> 01:20:40.000
And now you have to add another level in the in the table, or a new sub-level in the table.
01:20:40.079 --> 01:20:45.359
But if somebody adds another primitive to fix APL or dialogue APL, BQN, or so there's nothing to be done.
01:20:45.439 --> 01:20:47.760
You just you you say from the outside, what am I adding here?
01:20:47.840 --> 01:20:50.079
Is it a monetic function, diadic function?
01:20:50.159 --> 01:20:52.000
Is it an operator monetic dyadic?
01:20:52.239 --> 01:20:52.479
Right?
01:20:52.720 --> 01:20:56.159
It's very rare to have a new construct.
01:20:56.319 --> 01:21:07.359
It can happen, like dialogue version 20 added uh the array notation, but the array notation's nature is such that it does not come into any, there's no question about what the binary strength is going to be there.
01:21:07.520 --> 01:21:10.800
So yeah, nothing changes on the separators, yeah.
01:21:10.960 --> 01:21:12.880
Yeah, and the same thing here, right?
01:21:12.960 --> 01:21:14.560
There is a little bit of a question here.
01:21:14.640 --> 01:21:22.640
If if we look at fixed APL isn't like, okay, take any other APL and basically just modify the vocabulary, because many of these languages are just that, right?
01:21:22.960 --> 01:21:30.560
And then there's a little bit of question about those subscripts, about what exactly is the nature of those.
01:21:30.640 --> 01:21:33.680
Those are not they don't conform to the normal rules.
01:21:33.920 --> 01:21:39.359
And and you can see this well, dialogue APL has a couple of things that are sort of don't conform to the normal rules.
01:21:39.439 --> 01:21:40.399
You have to learn ad hoc.
01:21:40.720 --> 01:21:42.319
Like we mentioned the outer product.
01:21:42.399 --> 01:21:50.319
There's actually a a fun thing is the quad off and system name, which is a constant, but you can still give it an argument, sort of.
01:21:50.479 --> 01:21:53.439
It reacts to being stranded with another arg uh element.
01:21:54.079 --> 01:21:58.479
So those are like syntactic quirks that are there, but they're very far and few in between.
01:21:58.560 --> 01:22:07.439
And we notice them so much in APL land because the rest of the language is so uniform, whereas many other languages is just such a mess that you don't like, one more quirk.
01:22:07.600 --> 01:22:08.720
Yeah, whatever.
01:22:09.119 --> 01:22:13.439
Yeah, I guess that's makes me feel better about my maybe I won't have an existential crisis.
01:22:13.520 --> 01:22:14.079
We're better.
01:22:14.159 --> 01:22:14.960
Yes, we have precedents.
01:22:15.279 --> 01:22:16.000
Crisis about it.
01:22:18.159 --> 01:22:19.039
We'll tell your wife.
01:22:19.600 --> 01:22:20.159
Not to worry.
01:22:20.319 --> 01:22:21.520
Yeah, well, I already told her.
01:22:21.680 --> 01:22:24.399
I already told her, so it's uh not about the existential crisis.
01:22:24.479 --> 01:22:26.079
I I told her about the precedence.
01:22:26.319 --> 01:22:26.960
She didn't really care.
01:22:27.199 --> 01:22:32.239
I mean, she thought it was kind of interesting, but uh, I think to be honest, she was just humoring me because I was all worked up about it.
01:22:32.319 --> 01:22:39.279
And she's happy to listen to me be worked up about something, even if she not necessarily uh you know a super fan of the topic.
01:22:39.520 --> 01:22:41.760
Is there more to say about the the trains?
01:22:41.840 --> 01:22:53.439
Because I we got a little bit distracted and and went on uh an important tangent, but uh yeah, is is there more to say about the train model in fix APL before we move on to the next uh question?
01:22:53.520 --> 01:22:58.159
Because we're already past the hour and a half mark, but uh we got I got one last question I definitely want to ask.
01:22:58.239 --> 01:23:01.359
Uh I also have a I have a question about the trains here.
01:23:01.520 --> 01:23:05.119
So you mentioned, Connor, the what did you call it?
01:23:05.199 --> 01:23:12.960
The application of a dyadic function with a constant on its left that you get in cap of three and k also has left bound function.
01:23:13.119 --> 01:23:18.880
So here we we saw that already, like you can write in parentheses one plus, and that's fine.
01:23:19.039 --> 01:23:25.039
But if you want something like that inside your function, so it's then how exactly does it work?
01:23:25.279 --> 01:23:30.159
So do do so like one plus the average, right?
01:23:30.239 --> 01:23:34.800
If you write plus slash divided by the tally or whatever you call it, length.
01:23:35.520 --> 01:23:36.000
Yeah.
01:23:36.560 --> 01:23:36.960
Yeah.
01:23:37.199 --> 01:23:38.880
So what just happened here?
01:23:39.199 --> 01:23:41.439
Never mind that that contents thing.
01:23:41.840 --> 01:23:54.399
So this is parsed as the length, and then so this is kind of the first thing is we get the length, and then here we have the sum divided, that's kind of its own thing, and then finally we have one plus.
01:23:54.720 --> 01:23:57.279
And but the one plus is not standalone here, right?
01:23:57.359 --> 01:23:58.239
It's or is it?
01:23:58.319 --> 01:24:00.399
I don't, I'm just sort of unsure what's happening here.
01:24:00.640 --> 01:24:04.159
Well, kind of, it's not parsed, but it's it's the same as this, basically.
01:24:04.399 --> 01:24:06.159
It's treated exactly the same as this.
01:24:06.319 --> 01:24:08.479
This is so you become oh, that's what you said.
01:24:08.560 --> 01:24:21.039
You go towards the left and you see a diad, so which is plus here, and so we we go one more step left and find something that we can use as left argument, whether it is a constant or a function.
01:24:21.199 --> 01:24:22.640
If it's a function, we need to apply it.
01:24:23.039 --> 01:24:25.039
If it's a constant, we just use it as is.
01:24:25.199 --> 01:24:38.319
So essentially, just like it like dialogues, AGH trains, we call them, where the array can take the the position of either monetic or static function, depending on the evaluation of the train usage.
01:24:38.720 --> 01:24:45.760
So to hear the plus is effectively working as as a nil as a function that uh uh constant function, right?
01:24:46.239 --> 01:24:48.079
Yeah, effectively.
01:24:48.960 --> 01:24:50.159
So I'm surprised actually.
01:24:50.239 --> 01:24:58.399
So the the one to effectively one from the one contents reduce that forms a unary function.
01:24:58.640 --> 01:25:05.039
That doesn't form uh the equivalent of a manadic fork and then is applied first.
01:25:05.119 --> 01:25:09.119
It applies tally and then that's interesting.
01:25:09.600 --> 01:25:15.199
Well it it's plus reduced divide does not it does not form a time in the overall trait.
01:25:15.520 --> 01:25:19.359
This is not its own function, it's this is just the order that it's parsed in, kind of yeah.
01:25:19.439 --> 01:25:26.319
The same thing happens in normal APL, but if you put a left a space here on the left of the divide, I think Condor will recognize it faster.
01:25:26.479 --> 01:25:27.520
What's actually right?
01:25:27.920 --> 01:25:34.319
The same thing goes in in normal when you write normal APL or J or BQN average, right?
01:25:34.479 --> 01:25:36.640
Plus slash divide by tally.
01:25:37.039 --> 01:25:55.039
I mean you use that plus slash sort of groups together with the division, and that's a train rule that that trains each intermediary carriage in the train has a short left scope catching its left argument with a function or array that's on its immediate left.
01:25:55.279 --> 01:25:55.920
Oh, interesting.
01:25:56.399 --> 01:26:00.560
So we can treat them together, and that is a nice way to sort of read them and explain it to people.
01:26:00.800 --> 01:26:04.800
You write one plus the sum divided by the tally.
01:26:05.439 --> 01:26:06.479
Yeah, but there is no binding.
01:26:08.560 --> 01:26:10.000
Yeah, there's no binding.
01:26:10.319 --> 01:26:10.560
No.
01:26:11.119 --> 01:26:18.640
Or if you would say the binding here is is of all three rightmost carriages the sum, the division, and the legend.
01:26:18.880 --> 01:26:20.079
Yeah, you could say that.
01:26:20.319 --> 01:26:22.960
Although it it will parenthesize it like that, right?
01:26:23.039 --> 01:26:26.399
If you remove the argument now and press enter, it will be like that.
01:26:26.560 --> 01:26:28.159
No, it just kind of spaces it out like this.
01:26:28.560 --> 01:26:29.359
That's interesting.
01:26:29.680 --> 01:26:31.439
It used to have parentheses, I think.
01:26:31.520 --> 01:26:31.920
I'm not sure.
01:26:32.079 --> 01:26:36.000
Well no, it doesn't some in some cases I've seen it in adds parenthesis.
01:26:36.239 --> 01:26:41.760
Um, trains it doesn't, but maybe it should.
01:26:43.359 --> 01:26:44.479
How have you found this?
01:26:44.560 --> 01:26:47.760
I mean, so you've you've done some J programming, you've done some Wi WAP programming.
01:26:48.000 --> 01:26:53.680
Well, how do you find this tacit model compared to your other and you you also did some Tiny Apple?
01:26:54.560 --> 01:26:56.079
I quite like it.
01:26:56.399 --> 01:27:05.279
I think it's basically if you want to use it, like how you write trains in APL, it's basically the same.
01:27:05.520 --> 01:27:08.800
It just lets you have more options, kind of.
01:27:09.119 --> 01:27:22.720
And it means that there are more things that you can write shorter and more patterns that you can express tacitly, or at least tacit with um without lots of parentheses or combinators.
01:27:23.279 --> 01:27:39.680
Um and but you still have the combinators before and after and all of them, if you you know, if you need them, and you can combine them with trains, which I think basically means whatever you want, you very rarely are gonna need to add extra parentheses to a train.
01:27:40.640 --> 01:27:42.000
That sounds like a dream to me.
01:27:42.159 --> 01:27:44.319
We all know that parentheses are the worst.
01:27:48.239 --> 01:27:49.680
Yes, yes, fewer.
01:27:49.920 --> 01:27:54.319
That you the left text and right text are only for dyadic functions.
01:27:54.560 --> 01:27:57.600
You still have identity, which you have to use sometimes.
01:27:58.000 --> 01:27:59.840
This is just the monadic identity.
01:28:00.399 --> 01:28:02.720
Function, but it doesn't come up that often.
01:28:02.960 --> 01:28:05.920
And like, for example, with this actually I'm trying to remember.
01:28:06.079 --> 01:28:17.439
Yeah, with this, you do need identity to the right to have it like this, because otherwise, if you have the dyadic function as the leftmost time, it wants to read it as a fork.
01:28:17.520 --> 01:28:18.720
So you would have it like that.
01:28:19.119 --> 01:28:25.680
But you could also you could also express this if you go back to the the previous one where you're adding the density to the average.
01:28:25.920 --> 01:28:26.159
Yeah.
01:28:26.399 --> 01:28:27.600
And one up there, that one.
01:28:27.680 --> 01:28:31.359
You can instead of drawing this, we can write that as a as a hook, right?
01:28:31.439 --> 01:28:33.199
So you can remove the that density.
01:28:33.359 --> 01:28:33.600
Yes.
01:28:33.840 --> 01:28:38.960
And then you write on the right of the plus, you write after, and then you but then you have to add parentheses there.
01:28:39.520 --> 01:28:40.399
Yeah, like this.
01:28:40.560 --> 01:28:40.800
Yeah.
01:28:40.960 --> 01:28:43.760
Although you actually need to put self because of the way it is.
01:28:44.000 --> 01:28:44.640
But yeah.
01:28:44.960 --> 01:28:46.079
Oh, all right.
01:28:46.479 --> 01:28:48.399
There's no there's no monetic hook.
01:28:48.640 --> 01:28:53.600
But you can write it as before plus, and that will do what you want.
01:28:53.920 --> 01:28:59.439
Yeah, that's actually eerily similar to what dialogue has with with beside and before.
01:28:59.600 --> 01:29:04.239
They all they one of them also needs needs the self and the other one doesn't.
01:29:04.880 --> 01:29:05.439
Yeah.
01:29:05.760 --> 01:29:10.000
Wait, so why why is there no monadic hook?
01:29:10.319 --> 01:29:12.159
There is, but only one, not two.
01:29:12.560 --> 01:29:13.439
So that's things, yeah.
01:29:13.520 --> 01:29:15.199
Like BQN like one.
01:29:15.279 --> 01:29:16.319
This is the hook.
01:29:16.399 --> 01:29:17.119
That's like that.
01:29:17.279 --> 01:29:23.119
But if you have like this is uh monadic hook, but this is dyadic.
01:29:23.600 --> 01:29:29.039
If you ha it depends on if the the dyadic hooking function basically is on the left.
01:29:29.119 --> 01:29:33.439
Because if it's on the left, then it wants to read this um as the left argument.
01:29:33.520 --> 01:29:36.800
Whereas if it's on the right, then actually wait what?
01:29:37.119 --> 01:29:40.560
No, one of them becomes a projection, they're not hooks, both of them.
01:29:41.439 --> 01:29:42.399
Whatever you want to call it.
01:29:42.479 --> 01:29:44.479
Actually, this one I'm not sure why it does that.
01:29:45.199 --> 01:29:47.279
Maybe it's actually I think I know why.
01:29:47.439 --> 01:29:49.279
I think it's this is a weird case.
01:29:49.359 --> 01:29:53.359
I think it might be parsed as a top, but I'm not sure.
01:29:53.600 --> 01:29:55.600
The right the hooks are weird basically.
01:29:55.680 --> 01:30:04.960
I try to avoid right using hooks because uh they're a little unpredictable because there's so many ways they could be, and I always forget which one it is.
01:30:05.199 --> 01:30:07.279
So I might change them in the future.
01:30:07.840 --> 01:30:12.800
But but you don't need them so much because of the cleverness of uh before and after.
01:30:12.880 --> 01:30:14.159
Those are explicit hooks.
01:30:14.239 --> 01:30:16.319
I mean yes when you use them correctly.
01:30:16.479 --> 01:30:20.000
So so using a tested hook here is not really that valuable.
01:30:20.319 --> 01:30:32.079
But yeah, but there was only one monadic hook, so like I think of the like there's S and Sigma, like a monadic hook and monadic back hook, but you've only got one of those via the before and after, or you have both of them?
01:30:32.399 --> 01:30:34.159
Well, you have both if you use self.
01:30:34.399 --> 01:30:35.920
I think if that's what you mean.
01:30:36.239 --> 01:30:39.840
Like if you write that's the same, it's the same thing in AP in dialogue APL.
01:30:39.920 --> 01:30:42.000
You also only have one, but you have both if you use self.
01:30:42.319 --> 01:30:42.800
I see.
01:30:43.119 --> 01:30:56.479
If you write a plus after average, what it wants to do is there like this could be monadic, but it could also be having the left argument be passed to this plus.
01:30:57.039 --> 01:31:04.079
So it just does that because that's the more general version, and if you do want the more specific, it's just one character you add self.
01:31:04.239 --> 01:31:05.359
So I thought it was more useful.
01:31:05.680 --> 01:31:17.760
So if you come full circle to those lookup tables, basically we've got the after operator here, and it says in it says diad after m monad is a diad, right?
01:31:18.000 --> 01:31:18.960
Strictly a diet, right?
01:31:19.039 --> 01:31:25.760
You cannot apply it monadically, therefore you have to to use the self to change uh the diad into a monad.
01:31:26.319 --> 01:31:34.640
Yeah, but this is ex this is exactly equivalent to how you have it in dialogue APL right now, just happens to be it falls out like that, right?
01:31:34.720 --> 01:31:43.359
If you write, if you write plus beside average, right, then it will apply the try well, it's not exactly the same, it's very similar.
01:31:43.439 --> 01:31:51.840
It will not try to apply the plus statically and and make a projection like this, but it will just apply the plus monetically because there's not there's no left argument.
01:31:52.079 --> 01:31:54.319
If you gave it a left argument, it would be it would be the same.
01:31:54.479 --> 01:31:57.039
If you put the self, then it does what you expect it to do.
01:31:57.279 --> 01:32:02.640
But if you do average before um plus, then it does what you want.
01:32:03.039 --> 01:32:09.840
So basically you're saying that in APL in dialogue, you have both this and this are allowed.
01:32:10.239 --> 01:32:12.000
Yeah, because because they're ambividance, right?
01:32:12.079 --> 01:32:15.680
So they do they they do both of them are applied immediately, one is just an atop.
01:32:15.920 --> 01:32:19.760
But the effect is that we've got three different top operators in a in dialogue.
01:32:20.159 --> 01:32:31.840
Yeah, because because of the ambividance, then they'll have yeah, we could have defined them as having different meanings, but we didn't because it makes the most intuitive sense that that monetic at top and the over and beside they all do the same thing.
01:32:32.159 --> 01:32:37.119
I guess beside could have been different, but that's the original composition and dialogue APL, so we can't go back and change that.
01:32:37.359 --> 01:32:40.000
Whereas I think tiny APL fixes that.
01:32:40.159 --> 01:32:51.039
So I I yeah, I can see this making sense, but it's but again, it does require you to be intimately familiar with your compositional operators, which you'll learn in no time, of course, if you use this in anger.
01:32:51.439 --> 01:33:01.199
Yeah, yeah, like this this pattern of having dyad after something self does come up fairly frequently, I would say.
01:33:03.039 --> 01:33:04.560
So you get used to it.
01:33:05.279 --> 01:33:06.000
Interesting.
01:33:06.159 --> 01:33:07.359
So much food for thought.
01:33:07.520 --> 01:33:13.359
All right, so we've already, like I said, blown past the hour and a half mark, as per usual, as per usual.
01:33:13.600 --> 01:33:19.119
And I guess maybe uh a last thing, well, um two last things, because I've forgotten to bring this up.
01:33:19.279 --> 01:33:24.560
We haven't talked about the typing mechanism, which is clearly quasi-influenced by Weewa yet slightly different.
01:33:25.039 --> 01:33:29.039
And talk to us about that, and then also is there a rhyme or reason?
01:33:29.119 --> 01:33:36.560
Because when I first started using this, I could not figure out when to drop the third letter, when to when to just use the first three letters.
01:33:36.720 --> 01:33:39.119
There seems to be some some differences.
01:33:39.199 --> 01:33:45.119
So, anyways, talk to us about the input method and are there tips for mastering it quickly?
01:33:45.600 --> 01:33:46.239
Yes.
01:33:46.640 --> 01:33:49.920
So the input method is quite simple.
01:33:50.079 --> 01:33:53.359
It is influenced by Wewa, but it's simpler than in Wea.
01:33:53.600 --> 01:33:56.159
Um, it's less powerful, but it's simpler.
01:33:56.560 --> 01:34:08.399
And uh what you have is rather than having a keyboard, and of course you could have a keyboard, I just prefer Wewa's way, you have each of these symbols having an alias of letters.
01:34:08.479 --> 01:34:14.720
And if you use the tooltips in the grid where you hover, it tells you equal alias eq.
01:34:15.359 --> 01:34:20.319
So if I type in EQ, it formats to the equals function of the glyph.
01:34:20.479 --> 01:34:23.439
And if I type in equal, that's just gonna be an error.
01:34:23.520 --> 01:34:25.680
It only works if I type in exactly EQ.
01:34:26.159 --> 01:34:31.439
And all of these glyphs have an alias that you can type easily.
01:34:31.760 --> 01:34:35.359
Like negate, this is a weird one, it's not N-E-G, it's N-G.
01:34:36.640 --> 01:34:40.960
And but the main thing is that every single function has one.
01:34:41.039 --> 01:34:44.399
So if you learn all of the aliases, then you can easily type them.
01:34:44.720 --> 01:34:46.159
Wait, some have two, right?
01:34:46.479 --> 01:34:47.359
Do some have two?
01:34:47.439 --> 01:34:47.920
I don't think so.
01:34:48.079 --> 01:34:52.800
Oh, negate has the only that's the only one with two, I think.
01:34:53.039 --> 01:34:55.760
Negate you can use back tick or ng.
01:34:55.920 --> 01:35:05.279
I did it like that because backtick is easier, but people have dead keys sometimes on backtick, so it's just for those people it's easier.
01:35:05.680 --> 01:35:08.720
And is there a method to the the alias?
01:35:08.960 --> 01:35:14.960
Because that was the part that like for pair it's par, but then for a lot of them it's the first three letters.
01:35:15.119 --> 01:35:18.479
Is there a do you just have to memorize them for when it's not the maybe?
01:35:18.560 --> 01:35:20.000
I should change it to P A I.
01:35:20.239 --> 01:35:20.800
I don't know.
01:35:20.880 --> 01:35:22.000
It's kind of random.
01:35:22.159 --> 01:35:25.760
There's no Yeah, even sort sort up is S R U.
01:35:26.000 --> 01:35:26.800
I'm not really sure.
01:35:26.960 --> 01:35:27.520
Oh yeah, yeah.
01:35:27.680 --> 01:35:30.159
Grade up is G grew, yeah.
01:35:30.399 --> 01:35:35.840
And have you made sure that there aren't any like prefixes, suffixes that that clash to each other?
01:35:36.319 --> 01:35:38.479
Self is SLF, you know.
01:35:38.800 --> 01:35:44.399
Yeah, could but could it be could it be like you don't have to write spaces between these, right?
01:35:44.560 --> 01:35:44.880
No.
01:35:45.039 --> 01:35:48.079
So so how do you make sure that you don't clash?
01:35:48.560 --> 01:35:50.640
It's yeah, that is a good question.
01:35:50.800 --> 01:35:55.119
And there are some cases that clash, like pi and pick.
01:35:55.600 --> 01:35:55.920
Oh yeah.
01:35:56.159 --> 01:35:57.119
Um where's pick?
01:35:57.439 --> 01:35:59.760
Pick is P I C pi is P I.
01:36:00.319 --> 01:36:02.880
So it just has to do it greedily, basically.
01:36:03.039 --> 01:36:10.640
If you write pi P I P I C, it formats the pie pick, but if you write P-I-C-P-I, it formats the pick pie.
01:36:10.880 --> 01:36:12.159
So yeah, it's greedy.
01:36:12.800 --> 01:36:15.119
Okay, but that's that's like that.
01:36:15.359 --> 01:36:16.720
Is there anything that begins with a C?
01:36:16.880 --> 01:36:17.920
That's the question.
01:36:18.239 --> 01:36:20.479
Oh, P I Yeah, the cell.
01:36:22.560 --> 01:36:24.960
If you write P P P I C L it errors.
01:36:25.279 --> 01:36:26.960
Yeah, so that's so this one is unambiguous.
01:36:29.039 --> 01:36:31.119
Semicolon, it just formats to nothing.
01:36:31.359 --> 01:36:32.000
Oh, I see.
01:36:32.159 --> 01:36:32.479
Okay.
01:36:33.039 --> 01:36:34.239
It's less than nothing.
01:36:34.399 --> 01:36:36.560
It's not like nothing in VQN, it's like nothing.
01:36:36.800 --> 01:36:38.960
No, literally it formats to nothing.
01:36:39.199 --> 01:36:41.760
But you could also you could also write a space in between, right?
01:36:41.840 --> 01:36:42.640
Wouldn't that do the same thing?
01:36:42.880 --> 01:36:48.479
Yes, you can write a space, but if you don't want there to be a space in the output, then oh right, see that that survives.
01:36:48.560 --> 01:36:50.159
Yeah, it doesn't reformat it, so to say.
01:36:50.479 --> 01:36:51.359
Okay, so it's greedy.
01:36:58.319 --> 01:36:59.199
All right, so there we go.
01:36:59.520 --> 01:37:01.119
We're formatter is much more advanced.
01:37:01.359 --> 01:37:02.479
Yeah, the we wa one.
01:37:02.560 --> 01:37:09.760
And uh, you know, if I add this to a ray box at some point, then you know, poof, you just control space, you won't have to memorize the aliases.
01:37:10.000 --> 01:37:19.760
And but so uh as a final question, we have uh talked about a ton of the glyphs before, after, table or outer product, transpose, reverse, iota.
01:37:20.239 --> 01:37:22.560
Are there I mean we we haven't talked about them all though.
01:37:22.640 --> 01:37:30.640
So I'm I'm I said we could go through them rapid fire, but maybe uh I mean it doesn't it doesn't it's not very meaningful to talk about the comparison glyphs, which are like the first six.
01:37:30.800 --> 01:37:34.239
Are there any glyphs or primitives that you want to highlight?
01:37:34.399 --> 01:37:36.720
I mean, we haven't talked about sort up, sort down.
01:37:36.880 --> 01:37:42.319
We they were just mentioned, but they either borrow from tiny apes, tiny apple.
01:37:42.560 --> 01:37:43.359
Tiny APL, yeah.
01:37:43.520 --> 01:37:52.319
Yeah, as close, very close to the desired sort glyphs that Adam wants for dialogue APL, not identical, but closer than what BQN and Ape.
01:37:52.800 --> 01:37:59.840
They're the less than, greater than, but with triangles instead of the less than I mean you could sort of argue against that, right?
01:38:00.079 --> 01:38:05.840
Saying, do I really desire more overloading of monetic dietic type thing after seeing a fixed APL?
01:38:06.000 --> 01:38:08.560
But I also designed not adding too many glyphs.
01:38:08.880 --> 01:38:09.520
So yeah.
01:38:09.840 --> 01:38:11.840
Well, I mean you're already in dialogue APL land.
01:38:11.920 --> 01:38:15.439
It's not like it's not like you're getting rid of ambivalence at this point.
01:38:15.600 --> 01:38:29.600
Um and these sorting functions are sort of only partially implemented right now because they only support sorting lists of numbers or characters, so they don't have any of the fancy array ordering stuff BQN has yet.
01:38:30.560 --> 01:38:36.079
Any other favorite groups that are yeah worth bringing up though that yeah, what um fat transpose is interesting.
01:38:36.239 --> 01:38:39.279
What what would you think this is I just fill up from Wiwa.
01:38:40.319 --> 01:38:48.720
I don't know what I don't know what it does in in Wiwa because the two different magnetic transpose can can do two of the two couple of different things on high-rank arrays.
01:38:49.039 --> 01:38:50.239
It does, I can show you.
01:38:50.319 --> 01:38:52.399
If I do like okay.
01:38:52.800 --> 01:38:59.920
Okay, so it does the it does a it does a one reshape zero it does a one a one rotate of the of the shape.
01:39:00.079 --> 01:39:02.479
Yeah, like if we do shape, yeah.
01:39:02.800 --> 01:39:03.039
Right.
01:39:03.119 --> 01:39:07.680
So in the shape of transposing uh shape two three four goes to three, four, two.
01:39:08.159 --> 01:39:10.960
But you don't have a generalized transpose then, right?
01:39:11.119 --> 01:39:12.159
But you haven't reordered it.
01:39:12.239 --> 01:39:15.439
No, I probably will add it, but I haven't.
01:39:15.760 --> 01:39:26.479
Because if you if you uh depending on the rank and transpose to do anything, since you don't have like access modifiers and things, you really need a generalized transpose, otherwise it gets really tricky.
01:39:26.560 --> 01:39:31.680
You have to do use lots of with like transpose cells and stuff.
01:39:31.920 --> 01:39:33.359
Yes, you could well that's not enough.
01:39:33.439 --> 01:39:41.279
You have to have transpose rank, but then you have to do multiple transposes to if you want an arbitrary order of the of the then you need multiple transposes, yeah.
01:39:41.520 --> 01:39:53.680
And multiple transposes, and each time you have to first move things to the end, and then you yeah, it's it's not perfect, but yeah, yeah, but it can it can happen, it can happen, yeah.
01:39:53.920 --> 01:40:04.560
There's also there's definitely cases where you have like transpose, transpose, you know, it comes up, especially because you've got the re the reshape.
01:40:04.880 --> 01:40:13.920
So yeah, Jay has a fancy reshape, and Marshall went for the simple APL reshape, and then he regretted to do it doing that.
01:40:14.079 --> 01:40:16.800
But I don't I don't know if you've had any thoughts about that.
01:40:16.880 --> 01:40:18.479
No, it seems it seems to have the APL.
01:40:18.800 --> 01:40:20.720
I don't one I don't know what I did.
01:40:20.800 --> 01:40:33.600
Uh it just cycles it, like yeah, but yeah, but that's that's the point is it is revel reshape it just like reshape has an implicit revel or flatten or whatever you call it, right?
01:40:33.680 --> 01:40:40.239
Yeah, it always flattens its art right argument before it reshapes, whereas in J it doesn't do that, it works on on cells.
01:40:40.479 --> 01:40:48.560
Yes, so if you do like a two by two reshape enough for two by two, then you would get two by two by two by two in in J but not in AP.
01:40:49.119 --> 01:40:52.319
And yeah, I do like that.
01:40:52.479 --> 01:40:53.680
I thought it was cool.
01:40:53.920 --> 01:40:55.600
It's complicated basically.
01:40:55.680 --> 01:40:56.800
Uh it's not that hard.
01:40:56.880 --> 01:40:57.920
I guess I could implement it.
01:40:58.000 --> 01:41:01.520
I feel like you can do similar stuff by just enclosing it and then merging it though.
01:41:01.600 --> 01:41:03.680
So like uh yeah, you can do that.
01:41:04.000 --> 01:41:08.399
Jade sort of tries to avoid having to do that kind of thing, but it's a classic API pattern.
01:41:08.560 --> 01:41:10.079
What does the fixed function do?
01:41:10.399 --> 01:41:11.119
The diamond.
01:41:11.680 --> 01:41:14.000
Yeah, so I actually I just added it yesterday.
01:41:14.159 --> 01:41:17.199
So maybe I can talk about these four functions.
01:41:17.279 --> 01:41:20.479
They're pretty simple, but they have a nice relationship.
01:41:20.800 --> 01:41:22.960
So the square is enclosed.
01:41:23.359 --> 01:41:29.680
I got that from Wewa, which uses the square for box because enclosing and boxing are very similar.
01:41:30.079 --> 01:41:36.079
Um then this diamond is uh called fix.
01:41:36.239 --> 01:41:38.079
I'm planning to rename it probably.
01:41:38.159 --> 01:41:39.760
That's just what we will call it.
01:41:40.000 --> 01:41:42.800
It just adds a leading one axis to an array.
01:41:43.039 --> 01:41:43.760
Ah, okay.
01:41:43.920 --> 01:41:44.319
I see.
01:41:44.479 --> 01:41:47.039
It's um I might call it promote, yeah.
01:41:47.119 --> 01:41:48.720
I think is that the more normal term?
01:41:49.359 --> 01:41:58.560
I mean it's a sort of a new concept to do that, but I think I came up with the name promote and demote because he was talking about rank, so increasing the rank is a promotion.
01:41:58.960 --> 01:41:59.279
Yeah, yeah.
01:41:59.439 --> 01:42:01.199
So maybe I'll call it promote, I'm not sure.
01:42:01.359 --> 01:42:02.720
Currently it's called fix.
01:42:02.880 --> 01:42:09.039
And then this one is pair, which makes a list of the two, I think.
01:42:09.439 --> 01:42:13.439
And the diamond with the line through it is couple.
01:42:13.520 --> 01:42:15.119
Let me let me double check that I have that right.
01:42:15.199 --> 01:42:18.399
Yeah, the diamond is couple, which ah, okay.
01:42:18.479 --> 01:42:19.840
I see that's that's very clever.
01:42:20.479 --> 01:42:22.079
Yeah, I like that.
01:42:22.479 --> 01:42:24.159
Yes, I was quite proud of myself.
01:42:24.239 --> 01:42:25.600
I just thought of this yesterday.
01:42:25.840 --> 01:42:28.720
So this is this is it not something you got from Weewa, no?
01:42:28.960 --> 01:42:31.920
No, well, it's inspired by Weewa, but it's not quite the same.
01:42:32.079 --> 01:42:37.279
So Wewa but also uses these two symbols, but they don't have quite the same relationship.
01:42:37.600 --> 01:42:39.119
Right, no, but this is beautiful, right?
01:42:39.359 --> 01:42:40.640
Conor, are you getting this?
01:42:40.960 --> 01:42:44.560
No, the insight you you had before the explanation was done.
01:42:44.960 --> 01:42:46.560
So this is explained this.
01:42:46.960 --> 01:42:52.159
Yeah, that that the boxing one, right, adds a net level of nesting, if you want.
01:42:52.800 --> 01:43:01.520
And the if you turn it 90 degrees, so you get the diamond shape, it doesn't add a level of nesting, it adds a level of axis of the outer dimensions.
01:43:01.680 --> 01:43:10.000
And if you add a horizontal bar on it, then it does that to the argument, but stacking things on top of each other onto the argument.
01:43:10.079 --> 01:43:15.680
So it's like an over, they are the same thing as catenate over the unbarred version, right?
01:43:16.000 --> 01:43:16.880
If I understand right.
01:43:17.119 --> 01:43:19.359
Um just about, yeah, yeah.
01:43:19.680 --> 01:43:22.720
Yeah, so cat if you write catenate over boxes.
01:43:23.199 --> 01:43:34.159
Yeah, pair is it puts the two in a list and couple puts the two it puts the two in an array together with a two-axis in front.
01:43:34.880 --> 01:43:36.880
But that's the same thing, right?
01:43:36.960 --> 01:43:42.239
So but it's not a list because it's not like it's yeah, it's what you said basically.
01:43:42.640 --> 01:43:46.319
I think it's catenate uh over that, yeah.
01:43:46.640 --> 01:43:48.000
I'm just trying trying it out here.
01:43:48.079 --> 01:43:48.880
Yeah, okay, there it is.
01:43:48.960 --> 01:44:05.760
Yeah, so you if you write if you write at the yeah, it's kind of the left bottom left one, so so the what I can call it, pair pair is catenate over box and couple is casinate over fix or whatever uh promote promote.
01:44:06.000 --> 01:44:09.119
Which is that's a beautiful relationship in the in the visuals of it.
01:44:09.199 --> 01:44:10.000
I really like that.
01:44:14.800 --> 01:44:15.600
Is in the font.
01:44:15.760 --> 01:44:25.680
Apparently, Madeline I'm using Tiny Apple 386 for this, so yeah, apparently Madeline added it for strawberry, which I don't know if it's used yet, but yeah.
01:44:26.000 --> 01:44:29.680
Yeah, so so it bothered me in in PQN's choice of glyphs.
01:44:29.920 --> 01:44:46.880
That it has it doesn't really like for for the couple one, it's just like two bows, like kind of like the stranding bow, but two of them opposite each other, and then it uses the butterfly symbol for the enlist, and it doesn't really tell me what's what, they sort of do the same thing.
01:44:47.119 --> 01:44:48.239
But this was really nice.
01:44:48.319 --> 01:44:52.479
I mean you can remember that the enclosing is boxing, or you don't have to call it in close, you just call it box.
01:44:52.640 --> 01:44:55.119
Jay calls it box, Shop A calls it box.
01:44:55.279 --> 01:45:05.600
Yeah, and you put it in the box like okay, and then you to if boxing sort of turned on its side, it is increasing rank, and you can sort of see the yeah.
01:45:06.079 --> 01:45:17.119
It also has a relationship to the array notation where where you use the square braces you have higher rank, and when you use the diamond braces, you have the list.
01:45:17.279 --> 01:45:20.880
Although it's a little inverted, but it it is connected to that also.
01:45:21.439 --> 01:45:22.479
It would be the opposite.
01:45:22.640 --> 01:45:27.119
I mean, yeah, it's a bit inverted, which is but it's I don't know.
01:45:27.279 --> 01:45:32.159
I guess in a perfect world it would be different, but I like the square being boxed, so I don't want to change it.
01:45:32.560 --> 01:45:33.119
That's it.
01:45:33.279 --> 01:45:36.720
Yeah, yeah, I mean too, but um you might change the array notation instead.
01:45:36.960 --> 01:45:38.960
Yeah, I guess I could change the array notation.
01:45:39.119 --> 01:45:40.000
That would work.
01:45:40.319 --> 01:45:47.039
Uh it would be weird to have fixed APL be the only array notation to have the square and the diamond one swapped.
01:45:47.359 --> 01:45:57.199
I mean, I if I could start over with everything, uh then I think I would use square brackets for just for lists because that would make it a superset of JSON.
01:45:57.520 --> 01:45:58.159
Yeah, true.
01:45:59.039 --> 01:46:08.319
If you're using anyway like BQN uses comma, comma uses comma for separators between between elements, then it would really be like JSON, and and a lot of JSON would be valid.
01:46:08.560 --> 01:46:10.720
It does use comma here for this, yeah.
01:46:11.039 --> 01:46:13.840
Yeah, so then so that would be a good argument.
01:46:14.000 --> 01:46:18.399
Now, is it a good idea to use square brackets for like JSON does or JavaScript does it?
01:46:18.479 --> 01:46:22.560
I maybe not, but pragmatically with the way the world is today, that's sort of nice.
01:46:22.880 --> 01:46:23.359
Yeah.
01:46:23.600 --> 01:46:24.640
And then then it would be a good idea.
01:46:24.800 --> 01:46:26.159
Maybe maybe I'll think about it.
01:46:26.239 --> 01:46:27.600
Yeah, maybe I should.
01:46:27.920 --> 01:46:31.119
Well, so yeah, that's that's a great thing to uh have final question.
01:46:31.199 --> 01:46:32.239
Is what are the plans?
01:46:32.319 --> 01:46:37.039
I mean, uh obviously you're still making changes, but like what's your grand plan?
01:46:37.199 --> 01:46:48.159
Is this gonna take over uh unseat all the other array languages and one an array language to rule them all, or are you just gonna I don't I assume you're still in school, so you gotta finish that too.
01:46:49.680 --> 01:46:59.520
Yeah, I am I don't think I have the time or the budget to do something like that, but I do quite like this as a foundation.
01:46:59.760 --> 01:47:03.600
I don't think I I'm gonna keep expanding it, making it better.
01:47:03.840 --> 01:47:15.840
Like, for example, one thing I really want to do is currently you can only use it on this website, so I want to add uh you know uh a version that you can run locally on your computer also.
01:47:16.560 --> 01:47:20.399
Um and you know, adding documentation, things like that.
01:47:20.640 --> 01:47:21.520
But I don't know.
01:47:21.680 --> 01:47:35.439
I mean, I do have some plans to uh eventually make another array language with fixed arity, but with left to right actually instead of right to left.
01:47:35.520 --> 01:47:38.720
And it it it's quite different from fixed APL.
01:47:38.800 --> 01:47:48.800
Um, I don't want to say too much because I feel like whatever I say is gonna change, but I I've been thinking about making another one for even before I made fixed APL.
01:47:49.039 --> 01:47:50.000
So I don't know.
01:47:50.079 --> 01:47:51.359
But it would take a lot longer.
01:47:51.760 --> 01:48:03.840
Any advice for folks out there, you know, uh that are budding programming language uh designers that uh don't have the confidence that you had to start your own and put it out in the world?
01:48:04.399 --> 01:48:05.920
Do I have any advice?
01:48:06.159 --> 01:48:06.800
I don't know.
01:48:06.960 --> 01:48:09.359
I guess I would say just start.
01:48:09.439 --> 01:48:18.079
I don't know, start with something small, maybe, and then the smaller you start with, you know, s keep starting over and add building on, you know.
01:48:18.239 --> 01:48:26.479
I I'm I'm not sure on the if I have all of the expertise, perhaps, to you know, be giving all this advice.
01:48:26.640 --> 01:48:31.199
I mean, I made the language, but you know, I don't have 20 years of experience.
01:48:31.760 --> 01:48:33.039
I don't think you need 20 years of experience.
01:48:33.439 --> 01:48:35.600
Only started coding a few years ago.
01:48:35.680 --> 01:48:37.600
I'm 17, like you know.
01:48:38.319 --> 01:48:40.880
Well, I mean, I I think it's it's so impressive what you've done.
01:48:40.960 --> 01:48:50.560
If I was 17 years old and uh and had uh an array language like this, and the thing is, I think the the most really impressive part of it is that you've you've explored like a new space.
01:48:50.720 --> 01:48:56.079
Like I've been talking about a fixed arity like APO for I don't know however long.
01:48:56.239 --> 01:49:03.680
And and I was just reading the other day, I think it was because it was on your site that you had a link to Marshall's complaints about ambivalence.
01:49:03.840 --> 01:49:06.640
Yeah, the ambivalence.com here.
01:49:06.880 --> 01:49:15.840
Yeah, it comes up all the time, like literally just last uh array cast, we were chatting about you know readability and is it is it the number of glyphs in tiny apple or etc.
01:49:16.159 --> 01:49:21.359
Anyways, and so when I discovered Jelly, I thought to myself, like, oh, what we really need.
01:49:21.520 --> 01:49:22.640
Oh, there goes Adam.
01:49:22.800 --> 01:49:24.239
He may or may not be back.
01:49:24.560 --> 01:49:33.840
But that when I discovered Jelly, my my first thought was like, how come there hasn't been like a APL like glyph language that kind of explores this space?
01:49:34.000 --> 01:49:36.880
Because it is a very interesting, tacit model, right?
01:49:36.960 --> 01:49:41.520
Just having fixed airity and then dispatching based on the pattern.
01:49:41.760 --> 01:49:46.560
And then I guess yeah, you've taken influence from a ton of languages, but I love it.
01:49:46.640 --> 01:49:51.600
Like I loved it when I I discovered Cap, when I discovered Tiny Apple, when I discovered Weewa.
01:49:51.920 --> 01:49:59.600
It's always just so exciting, especially when it's like a new space is explored, because then you know the other languages get to.
01:50:00.239 --> 01:50:03.439
See, you know, what what falls out of this design.
01:50:03.600 --> 01:50:11.439
And even in the comments, I saw Kai said that they were going to incorporate something into their documentation just based on this conversation.
01:50:11.520 --> 01:50:13.199
Anyways, it's so it's it's just fantastic.
01:50:13.920 --> 01:50:19.119
Um so, anyways, you're saying I don't have 20 years of experience, and you also haven't even been alive that long.
01:50:19.600 --> 01:50:22.800
But uh yeah, I just think it's it's awesome that you've done this project.
01:50:22.880 --> 01:50:25.680
I really hope that yeah, you continue to explore this stuff.
01:50:25.840 --> 01:50:30.319
Very excited to see you're already similar to Madeline, you're already thinking about a second array language.
01:50:30.479 --> 01:50:32.239
And it's gonna be awesome.
01:50:32.399 --> 01:50:36.960
In the future, we're gonna have like 20 different array languages, all with different trade-offs.
01:50:37.119 --> 01:50:40.000
So I guess, yeah, the last thing is folks can check this out.
01:50:40.239 --> 01:50:42.640
I believe the URL is netlify.
01:50:43.439 --> 01:50:46.000
Yeah, fixapl.netlify.app.
01:50:47.359 --> 01:50:50.399
And yeah, uh there's also a GitHub repository.
01:50:50.720 --> 01:50:51.199
Okay, yeah.
01:50:51.279 --> 01:50:54.880
And this does have, like you said, it has minimal docs, not for everything.
01:50:54.960 --> 01:50:58.560
But there are docs on on the readme.md.
01:50:59.199 --> 01:51:03.600
There are docs for some of the functions, but not all of them.
01:51:03.680 --> 01:51:06.560
There's a lot of missing stuff, especially the modifiers.
01:51:06.800 --> 01:51:12.000
So I'll work on that in the coming, you know, coming however much time it takes me.
01:51:12.159 --> 01:51:12.800
I don't know.
01:51:13.039 --> 01:51:13.760
Eventually.
01:51:13.920 --> 01:51:16.960
I've already got the foundation of the UI, but yeah.
01:51:17.039 --> 01:51:22.159
I mean, being able to play around it arguably is is well, is it more important?
01:51:22.239 --> 01:51:24.079
You know, it gives people the ability like me.
01:51:24.159 --> 01:51:26.479
Like I was already messing around with it and discovering stuff.
01:51:26.560 --> 01:51:30.079
And I've tried a dozen languages with zero documentation, yeah.
01:51:30.319 --> 01:51:30.880
Yeah, yeah.
01:51:31.039 --> 01:51:32.560
I mean, and you've got the source, you know.
01:51:32.640 --> 01:51:33.600
Did I go read the source?
01:51:33.680 --> 01:51:38.319
No, but you can go ask a tool to go parse it and answer questions.
01:51:38.399 --> 01:51:40.479
Um yeah, or ask me, you know.
01:51:40.560 --> 01:51:44.640
I'm happy to Oh yeah, what's the best is are you I assume you're on the um the Apple Discord?
01:51:44.960 --> 01:51:48.960
Yeah, I'm on Discord at Jacob.abc.
01:51:49.439 --> 01:52:02.239
I'm also on you can you can DM me or you can message me in the Wea server or in the APL farm server, uh whatever works.
01:52:02.319 --> 01:52:02.560
Yeah.
01:52:03.039 --> 01:52:03.439
Awesome.
01:52:03.760 --> 01:52:13.119
I will uh I'm not sure if you can link to a specific user, but if I can I'll find a way to put those in the description or the the show notes.
01:52:13.279 --> 01:52:14.720
And uh yeah, thank you so much for coming on.
01:52:16.319 --> 01:52:18.560
Yeah, yeah, no problem.
01:52:18.960 --> 01:52:22.079
This has been uh it was I was very happy to talk about it.
01:52:22.159 --> 01:52:23.039
This has been a lot of fun.
01:52:23.520 --> 01:52:30.079
Okay, wait, we're letting Adam he's been kicking back people admit one guess.
01:52:30.239 --> 01:52:31.600
We're doing it all live, folks.
01:52:31.760 --> 01:52:32.960
I see, he was blocked out.
01:52:33.439 --> 01:52:35.119
Alright, we were just wrapping up, Adam.
01:52:35.520 --> 01:52:37.119
We were saying thanks for coming on.
01:52:37.199 --> 01:52:42.399
We're giving people uh links to try out fix APL and links to reach Jacob.
01:52:42.560 --> 01:52:43.840
Any final words from you, Adam?
01:52:44.000 --> 01:52:45.920
Sorry, you you missed you missed my whole ramble.
01:52:46.000 --> 01:52:46.960
I guess you can catch it in post.
01:52:47.199 --> 01:52:48.399
Oh no, I could hear you all right.
01:52:48.479 --> 01:53:02.720
I just turned it on on YouTube, but I couldn't get back in because Google decided in their wisdom that uh I needed to uh something might have changed in my user account, and therefore I need to be letting it as proclamation to continue.
01:53:02.880 --> 01:53:04.720
So yeah, we're ready for that.
01:53:06.960 --> 01:53:07.920
What the hell?
01:53:08.720 --> 01:53:11.920
Okay, I was just trying to show I'm not sure what was happening with the screen.
01:53:12.000 --> 01:53:15.279
I was just trying to show a little Mandelbratz example I added to the website.
01:53:15.760 --> 01:53:17.760
There's also a Sophinsky triangle here.
01:53:19.439 --> 01:53:23.439
Every new language has got the uh the in-repo graphics now, you know?
01:53:23.520 --> 01:53:24.079
It's uh yeah.
01:53:24.319 --> 01:53:25.600
I gotta add that to a Raybox.
01:53:25.680 --> 01:53:30.960
Someone someone commented there, they tried to do some plotting thing and they were like, this is table stakes.
01:53:31.760 --> 01:53:37.600
We should we should add this to uh not just to try pill, but also to to our main ID as well.
01:53:37.840 --> 01:53:39.279
Yeah, it can't be that hard.
01:53:39.520 --> 01:53:41.840
In fact, I think we don't have to add that to it.
01:53:42.000 --> 01:53:46.640
I think I can I can just like some library that you can just plop in and it would work.
01:53:47.680 --> 01:53:48.239
Not my right.
01:53:48.479 --> 01:54:00.640
Actually, I I did uh I have some more questions about the primitives, but I guess we shouldn't take more time with that because there are lots of other primitives that I but I'll have to go look at what is documented and and we'll we'll definitely have uh Jacob uh we'll have you back.
01:54:00.720 --> 01:54:01.199
Also, too.
01:54:01.279 --> 01:54:04.560
I mean we can just bring Adam on if you want uh when we have you on Tacit Talk.
01:54:04.640 --> 01:54:06.880
And also too, I'm not sure if people remember.
01:54:06.960 --> 01:54:13.199
We said we were gonna do like four or five episodes of just Adam and I, like, you know, getting the process of rolling these out.
01:54:13.359 --> 01:54:17.520
And then Madeline mentioned fixed APL, and then I went and checked it out, and then I messaged Adam.
01:54:17.600 --> 01:54:19.039
I was like, should we have a guest on?
01:54:19.199 --> 01:54:20.960
I need to talk to Jacob about fixed APL.
01:54:21.119 --> 01:54:22.479
And so then we threw that out the window.
01:54:22.640 --> 01:54:32.800
Arguably it would have been a better idea to wait till we had a couple more people, a larger panel, and you know, I didn't have to put half of uh the questions on my back and just ended up being confused the whole time.
01:54:32.880 --> 01:54:36.960
If Marshall was here, I'm sure it would have been Marshall, Jacob, and Adam going boo-boo, boo, boo, boo.
01:54:37.119 --> 01:54:40.640
And then I would have just been like, all right, well, at least they all seem to understand what's going on.
01:54:40.880 --> 01:54:46.800
But uh, once we put together the the larger team, we'll have you back and uh we can we can chat more about the primitives.
01:54:46.880 --> 01:54:51.359
And I'm sure there'll be some some new changes since then as well, because it sounds like you're active on this.
01:54:51.680 --> 01:54:52.159
All right.
01:54:52.319 --> 01:54:57.760
With that, oh yeah, we're supposed to say you can reach us at contact at arraycast.com.
01:54:57.920 --> 01:55:02.159
I guess also now there's no reason why we can't do the same thing that I do on my other podcasts.
01:55:02.319 --> 01:55:05.680
I mean, lots of folks have been leaving comments on the YouTube video.
01:55:05.840 --> 01:55:06.800
Feel free to do that.
01:55:06.960 --> 01:55:11.760
If you want, though, we might set up uh GitHub discussions pertaining to each episode.
01:55:11.920 --> 01:55:18.960
And also, too, thank you for all the folks in the Apple Farm Discord or other mechanisms where people reached out.
01:55:19.119 --> 01:55:26.560
We had some broken links to past, there was like the show note avenue and technically the episode page were two different things.
01:55:26.720 --> 01:55:27.840
A couple of those got broken.
01:55:28.000 --> 01:55:29.039
They're all fixed now.
01:55:29.279 --> 01:55:31.039
Thank you for pointing and bringing those to our attention.
01:55:31.119 --> 01:55:46.960
But also, too, now that we have a GitHub page's website, uh, if you ever find a broken, like a one-off broken link, or you want to even add links that we missed in the show notes, you're able to just go either open an issue or even better a pull request, and then we'll be happy to just ship that.
01:55:47.119 --> 01:55:54.319
And this can be more of like a community-driven podcast, I guess, in that sense, because this was not open source before and now it is.
01:55:54.640 --> 01:55:59.600
And yeah, with that, we can say happy array programming.
01:55:59.920 --> 01:56:01.119
Happy array programming.
01:56:01.199 --> 01:56:02.720
Oh, we have to do this differently.
01:56:02.960 --> 01:56:03.760
It has to work like this.
01:56:03.840 --> 01:56:06.560
Like Jacob and I have to say happy array programming.
01:56:06.800 --> 01:56:08.960
Jacob was just are we still on?
01:56:09.279 --> 01:56:10.319
Yeah, we're still on.
01:56:10.560 --> 01:56:14.079
So so we have to say we have to write down and say and say it together.
01:56:14.239 --> 01:56:16.239
I haven't watched it and then we'll win a long time.
01:56:16.960 --> 01:56:20.159
When we when we finish, that's when Connor is supposed to say it.
01:56:20.239 --> 01:56:21.680
Exactly when you hear array programming.
01:56:21.920 --> 01:56:25.600
Oh my god, then you're supposed to say it because then it will line up because now we know the timing.
01:56:26.000 --> 01:56:28.800
I think we just have to give up on that and just you know no no.
01:56:28.960 --> 01:56:31.199
This can work, we just have to happy array program.
01:56:31.600 --> 01:56:35.920
So you hear like three, two, one, happy array program.
01:56:36.239 --> 01:56:37.119
Happy array program.
01:56:37.520 --> 01:56:38.319
I mean, that sounded pretty good.
01:56:38.960 --> 01:56:39.680
I mean, it doesn't sound good.
01:56:39.760 --> 01:56:40.479
That's the problem, Adam.
01:56:40.560 --> 01:56:44.079
It doesn't sound good for you, but that one actually did sound pretty good on my end.
01:56:44.479 --> 01:56:45.039
That was my point.
01:56:45.199 --> 01:56:45.520
Exactly.
01:56:45.600 --> 01:56:46.239
That's my point.
01:56:46.399 --> 01:56:48.880
We can we can figure this out at the course of the next hundred episodes.
01:56:48.960 --> 01:56:50.479
We'll figure out how to do this.
01:56:51.279 --> 01:56:56.479
Every single time we're just gonna be debating on the uh the mechanism on how we uh wrap the episode.
01:56:56.800 --> 01:56:57.039
Exactly.
01:56:57.279 --> 01:57:04.319
All right, thanks everybody in the chat, and we will schedule another one of these in roughly plus or minus two or min plus or minus two weeks.
01:57:04.399 --> 01:57:06.239
And once again, Jacob, thank you uh so much.
01:57:06.560 --> 01:57:07.199
Yeah, sure.
01:57:07.359 --> 01:57:07.680
No problem.
01:57:07.760 --> 01:57:09.520
It was fun to fun to talk about it.
01:57:09.600 --> 01:57:10.960
Yeah, absolutely.