Tacit Talk
Tacit Talk is a podcast about programming languages, combinators, algorithms and more!
Tacit Talk
Episode 35: TinyAPL 0.13, Inverses & AP8L with Madeline Vergani
Use Left/Right to seek, Home/End to jump to start or end. Hold shift to jump forward or backward.
In this episode, Conor interviews Madeline Vergani about TinyAPL 0.13, inverses, AP8L and more!
Socials
- Tacit Talk YouTube Playlist
- Conor Hoekstra: LinkTree / Bio
About the Guest
Madeline Vergani is the creator of TinyAPL, the Omnibar and AP8L.
Show Notes
Date Recorded: 2026-03-30
Date Released: 2026-03-31
Welcome to Tacit Talk, episode, I believe, 35. And I am extremely excited to have back a guest that it's been, I believe, over a year. I think it was February of 2025. I'm not going to recall the episode. It was probably like episode 15 or something, that plus or minus. But we're having back Madeline Vrigani, creator of many things, probably, I'm actually not sure what most folks know you for. It's probably Tiny Apple, but also uh creator of the Omnibar, a fantastic tool for comparing glyphs across all the different APLs. More recently, creator of, I'm not sure if I'm gonna pronounce this correctly, AP8L. I'm not sure if it has a Q is that correct? Yeah. That's correct. All right, because I know that what is it, Kubernetes has some like K8s, but they pronounce it weird when they're doing their conferences. Anyway, so uh, and potentially creator of other things that I don't even know about, but primarily we're we're having you back on to talk about the editions that have been released since the last time we had you on. I believe it was on either dot, I think it was dot 10 last time, and so you've released officially dot 11 and dot 12, but we are on dot 13 beta of tiny Apple. We also might chat about some other things. You just released a blog post, I think it was today. Was it today or in the last couple days? Yeah, this morning, yeah. Just this morning. And uh was mentioning inverses, and I was I was before this even started, I was thinking I got some questions, but I'll just wait until we're chatting on Tacitalk so that folks in the future can uh get the I guess what is it? The the knowledge that I will accrue by asking you, they will also have access to. So, anyways, thanks for coming back on. How's it been? And yeah, well, I guess we can start with uh a tiny apple, but yeah, what's what's what's new and and and how's it been?
SPEAKER_01A while there's been you know some breaks between adding new things. I'm back right now. You can see I'm sharing the history thing that I added, but yeah, for sure the main thing is inverted. Let me see if I can. It's a lot of stuff. Okay. So it's very much inspired by Wewa. So there is a ton of different like ways a function can be inverted based on how you use it. You know, in like dialogue, usually there's just like mm-hmm you do like power minus one to get the inverse of a function. And it's like you can invert it like majorly or you can invert it dyadically, and by like the left argument gets binded automatically. So wewa calls the first one an uninverse, so it just has the same name here. And then the second one, uh I guess it's a bit different because the arguments are like ordered differently because there's a stack and whatever. Uh I doesn't want me to say there's a stack, but uh kind of it's a stack. So yeah, the the binding thing is called anti, which is uh inspired by the Wiwa and Wewa has a third type of inverse, which dialogue doesn't really have, I don't think. Maybe it's there for just like a few specific printers, which is the one where you invert it dyadically but you bind the other way. And we are called this contrast, I just took the uh the name from there. Uh and the other three are well the names are new, but the actual behavior not not really, I guess. So I remember the order once I could.
SPEAKER_00And it's just is but well, just you know, to interrupt you in the middle of your explanation. So all of this is baked into the inverse modifier that we're looking at right now. Is that correct?
SPEAKER_01Yes. It depends on how you call the derived function, yes. So this first one is just the monantical, so you do f inverse y, you get the uninverse. Then if you pass the left argument, you get anti. And then if you commute the function before inverting it, you get like a commuted version of the contrary inverse. So if you commute it again, you get the the contra inverse. The this inverse is like splitting a thing in half, so you know, like in we wa, I think I didn't share it. If you have minus three and then you do unmultiply it, uh it splits into like the sign and uh the absolute value. I don't think it has a name in we wa, so I call it a this inverse, which is like uh splitting apart into two things, and you get it with reduction. So if you invert a reduction, you get a pair, just like because of course if you get have a pair or like a two cell list and you reduce it, you can apply a diary function to the two halves without like splitting apart or something like that. So yes, it's the inverse of that, and then there is the inverse which is like splitting a thing into two of the same parts. I actually don't remember which functions have this, but maybe it's like halves that if you have like if you do like the the by inverse of addition, you get the half or something and remember. Uh and then the last inverse is like the the prime factorization in wea. If you in we will if you undo reduction, you get this a list of the prime factor of the prime factors of a number. And because I already had used reduction for the other thing, of course, I can disambiguate by anything other than the arity. So if you call the inverse of a reduction diadically, instead of getting the pair, it's treated like the inverse of a fold, so it does the the wewa thing. So if, for example, for the prime factory, you would pass the left argument of one. If you gave it something else, you would divide the number first, but it's kind of like a side effect of how it's implemented. And I think that's everything. There's also like the contextual under, but it just uses the inverses on the way forward and on the way back. And this is definitely the biggest thing, I think. Um bit hard to remember like what I already used and what I didn't, because it's been like a year or something.
SPEAKER_00It all blends together.
SPEAKER_01Yeah, this is definitely the most important bit for sure.
SPEAKER_00So it I mean, uh probably not, but I know Weewa has a page that lists a lot of the I don't know what you call them, idioms, like the uninverse idioms. Do you does Tiny Apple have any of this stuff? Because it is very curious. I didn't realize that it kind of is in so basically like a lot this stuff is kind of implicit in Weewa. If you have the unmodifier, you can apply that to, I guess, some function, some expression, and you're kind of splitting that. So in the case where you're using un on a reduction, you're calling that I can't remember if it was was it the anna, or was that the by inverse?
SPEAKER_01Bye is the inverse of the selfie.
SPEAKER_00Of the selfie.
SPEAKER_01Monadic selfie.
SPEAKER_00And so dis inverse and inverse. Right. So yeah, it's it's dis and anna are on reductions, and the question is whether you call it monadically or dyadically. And yeah, so this stuff is very curious. And I guess you're baking this all into a single primitive, but I know that we wa has un, it has anti, and so I guess Yeah, it's just because of the fixed arity, basically. It's because of the fixed airity. Oh, I see. So all of what Weewa provides via un and anti, you've baked into the inverse primitive in Tiny Apple because Tiny Apple has ambivalence.
unknownYes.
SPEAKER_00Interesting. Interesting. I'm gonna have to play around with this and and see. So does Tiny Apple I I assume it's borrowed some of the Wiwa idioms like the prime factors and stuff? Or yeah.
SPEAKER_01I don't have a lot of them, but mm most of the ones they have come from there, yeah. Come from Weewa.
SPEAKER_02Can I get the prime factors yet?
SPEAKER_01Oh no, it doesn't work. Uh I'm gonna try the other one called a rebox.
SPEAKER_00I've heard of it.
SPEAKER_01I forgot.
SPEAKER_00It's uh control up.
SPEAKER_01Okay. Yeah. Uh one multiply reduce inverse 24. There we go. So yeah, I also have this one for me. And so if the only one that feels a little bit like hacky is this one, the um the this inverse, because like I want both of them, right? If I do just one without the one before, I get the sign and magnitude, and I want both, but I can't really do anything to distinguish them other than type the sorry the IRT as we call them. So one of them has to take two arguments, and I can't really think of a way to get this one to take two arguments, but the prime factorization it just divides the number first. So if I write two, it's got one less two, if I write three, it's got one less three, it's not great, but uh, the alternative was having two primitives, which you know uh not things like that.
SPEAKER_00Yeah. Right. Oh, so you prefer to keep it just all basically in the single inverse primitive, is what you're saying. Yeah.
unknownYeah.
SPEAKER_00I started thinking, I mean, this is kind of like a tangential thought, but I was just thinking about this yesterday when I was working on the last touches to the YouTube video I put out, and it was actually from the comment that you left on that YouTube video where you mentioned that the name of the was it mixed glyph was like um split glyph. It it had picked up the key value pairs, and I actually intentionally left that in and forgot to make a comment about it in the video because it it made me realize that it we don't actually, or at least I haven't seen any papers or heard conversations of people talking about it, but in C, or I guess in a bunch of languages, there is a type of polymorphism called ad hoc polymorphism, but it's typically referred to as function overloading. And you can function overload on the number of arguments, on the type of the arguments, and really like this is a it's a key feature of APLs. Like the the overloading, like what we call ambivalence is just ad hoc polymorphism in other languages like C, in that we've assigned two different meanings to the airity of the function. And then on top of that, and I I you can correct me because you probably know more about this stuff. You've studied these languages more than I have, that I think K has this, and now maybe Tiny Apple with dictionaries, is that when you're overloading on type, that's like another form of ad hoc polymorphism. So there's kind of like there's type ad hoc polymorphism, and then there's airity ad hoc polymorphism, where whenever you're overloading a glyph to have a different behavior, and so uh correct me if I'm wrong, is that what the key value pairs is when when you use the drop glyph on a dictionary, it has this custom behavior, correct?
SPEAKER_01Yeah, yeah. The idea with all of the preemptives that take dictionaries that they have to be like pretty similar to the ones for arrays. So in some cases they just get grouped into the same documentation thing, but in some things they feel like it's just close enough, but there's enough for a difference that they want to split them. And yeah, there's not really a great way in like uh metadata to specify what the type is. There's a lot of different ways you can overload things in APL. I'm trying to think of a good example, but you know, like in BQN you can add the numbers and characters and arguably that's already an overload by type. There's also we will have overloads by rank, for example. Well uh uh dialogue has overloads by rank, let's see. If I do like IOTA 5, I get a normal list, but if I do iota 2, 3, I get a box array, that's overloading by rank essentially. You know, kind of because it's yeah, so that's that's rank polymorphism, yeah. Yeah. Rank polyformi is usually is about like being independent of rank, like you can add any arrays or things like that. This is actually like changing behavior based on the rank, which is slightly different. Um has his own wear.
SPEAKER_00That's true. If I do well, so that actually that actually means that there's kind of two different types of rank polymorphism. Like the the and now the what is it, the sibling of ad hoc polymorphism is parametric polymorphism, which is like you know, one primitive same behavior. So kind of like you you have rank you have parametric rank polymorphism, and then you also have ad hoc rank polymorphism. So that the iota was an example of ad hoc rank polymorphism. But in anyways, it's it's made me think that there's actually like a bajillion types of polymorphism inside these array languages, but we only refer to them as like rank polymorphic, but really it's it's rank polymorphic and ad hoc polymorphic. And within ad hoc polymorphic, there's like there's type, there's airity. There's a lot of types of polymorphism in these array languages, and no one's talking about it. What's going on here?
SPEAKER_01Yeah, I guess it's uh it feels more like a consequence, I guess. Sounds really like a key feature. But then on the other hand, you can't really do it for your own functions. You have to like you know do manual guards and whatever. You can't like really say, Oh, I want to do this based on the rank, and this is the other rank, you just have to write a define and say if the rank is due to this, and why is this the other? I can't take I can't define f on rank one, f on rank two as different things.
SPEAKER_00Yeah, that is I mean, what is that? I guess it's unfortunate that the language primitives have all that rich functionality, but you can't get it as I mean technically some languages, I think including does tiny apple have obverse or an equivalent of it? No, not yet. Okay, not yet. But J has it and I think WeWa has it, right?
SPEAKER_01Yeah, the one for setting inverses.
SPEAKER_00Yeah, yeah.
SPEAKER_01Yeah, yeah.
SPEAKER_00And I guess does that mean if Tiny Apple adds obverse, you have to add a very complicated obverse that enables you to uh to define it?
SPEAKER_01Yeah, is that the right argument is a dictionary. Uh right operand, sorry. So you say, well, you can just say the normal inverse and you test buffs function, that's fine, but if you want to say all of the inverses, you you give it to that dictionary, so essentially each inverse gets a different number uh or a graph, I'm not really sure. And you just do key by plus based, and that's like uh you could do if I have my function f and I want to set the inverse, I can do let me pick a random grip like that. I don't know. Let's say this is obverse, and I do like a dictionary, and I say the normal inverse is or maybe like that. The normal inverse is I don't know, plus, and then the the contra inverse is gonna be minus and then reduce and the annual and this together are going to be times, whatever. So like something like this. Right. And of course, each one of these means two things because you can still overload by RT. If you want to do different things within the arc, you can use valences, which is like this. So you can say yeah. So like the complete uh way to say all sticks would be something like that.
SPEAKER_00Very neat. So this is uh hypothetical, it doesn't exist at the moment, but yeah.
SPEAKER_01If I can't come no, the list is random, but if I can't come up in anything about it like this, it's kind of a bit like maybe unwieldy, I guess, but there's a lot of things that you can set, and it's not not really an easy way for you to be able to specify them.
SPEAKER_00Alright, so we have a number of questions in the chat. I think the most recent one is how can you distinguish between a single primitive with various modes and a single glyph being shared by multiple primitives?
SPEAKER_01I think it's just subjective, I guess. There's some things that are obviously very far away, so it just feels like an overload. Some things are feel really close, so just different modes, but you know, the boundary is definitely arbitrary. So like is just an overload or not? I I wouldn't say it is, but you know, you could definitely argue that it's an overload.
SPEAKER_00Right. I mean do you have a so yeah, a single primitive with various modes versus a single glyph being shared by multiple actually I don't understand the the latter part. A single glyph being shared by multiple quote unquote primitives.
SPEAKER_01Like single glyph multiple functions, I think.
SPEAKER_00And does that mean yeah, you're overloading on you're overloading on something? Yeah. Yeah, I guess this is kind of the and that's what I've been thinking. I I mean I have to add K to array box so that I can play around with it more. But that was the realization when we were talking to Jacob about fixed APL that it actually has a lot more in common with K because K does a lot of overloading on types. And it also makes me think too, and I maybe this is a question that you can you can answer, maybe maybe you don't know. Does like in in building that comparison mode where you're showing the table of translations and then you have like the nested, like how does it, what's the expression on nested? What does K have? Like K because K doesn't even fully have like a fully ranked arrays, right? Like they've got their do they call them dictionaries or do they call them tables?
SPEAKER_01I think well it depends on the dialect. I think there's a lot of different K's with different things. Some of them I think don't have dictionaries at all. And I'm pretty sure tables and dictionaries are slightly different, but I'm not really the right person to ask about KMS.
SPEAKER_00Gotta bring on John Ernest so he can answer in the future. But the the point being is that K and Q don't really have like the same model. And also Weewa even like I don't actually fully understand what Weewa has. Does Weewa have the concept of nested arrays? Because a lot of the times when I'm typing things, it'll just automatically put it like in matrix form if it recognizes that the shapes align. Oh, we always the same as J. Weewa's the same as J.
SPEAKER_01Yeah. The main difference is that if you have like a box, you can do arithmetic on it. If I do if I have a box one, two, three, like this, I can do three plus. You can do a bit and this works, and in J it doesn't. Uh I'm just gonna do it here. If I do three plus box three, that's not gonna work. Uh but the actual model is the same mostly. Yeah, it doesn't really big difference other than that. But yeah, it's definitely got rank. Maybe it's you mean that like the the brackets like this already uh automatically mixed up like this.
SPEAKER_00Yeah, exactly. Like a lot of times when I expect to see like the equivalent of like a nested array and j or dialogue APL or even tiny apple, it formats it like this, and then I you have to switch to the braces. And I am not a I'm not a WeWind expert enough to know like what's the what's the difference here?
SPEAKER_01And well it's kind of like a ray notation dialogue, and you can't do it in tiny apple because uh I know it by the bra. Actually I can do it here now. So if I do two one, two, three like this, it's nested, and like this it's a matrix. It's the same thing except instead of the parents you use bases. Uh of course the model is like the different, so it's not the exact same thing. Like I can do this, one, two, and I get two boxes, but because the dialogue is nested, if I do just one and then two, I just get normal what oh oh sorry, like if I do this, it just gets matches one, two, it's the same array, of course, because it's uh it's nested, so this one doesn't get boxed or like if it did, it wouldn't change anything. Uh of course in Wii Wide that's different because you can box the scalars.
SPEAKER_00Yeah, we I mean I still need we need to have another full episode on a ray cast on the different flat boxed, you know, whatever the different models are. We've talked about it multiple times, and I always get like 75% to a full understanding, and then like two episodes later, I've forgotten my understanding of the different models because it's it's very subtle the differences. Like for the most part, you know, pervasive or scalar primitives, they all work the same. And in like the 90% of cases, all the models are roughly working the same way. It's only when you get to the corner cases of, yeah, like boxing scalars or when you do some kind of reduction. And that was that was kind of when we were talking to Jacob as well. You know, he had the different types of folds or whatever of whether it's gonna unbox and and his choices, anyways. We've got a we've got a lot of comments in the chat too. Adam saying uh in K-land a table and dictionary are transposes or flips of each other, and that makes sense. We gotta, like I said, I gotta add I gotta add, I think the choice is gonna be NGNK is the one that's gonna get added. And we also we missed at the very beginning. Um Adam asked, Does it handle all compositions of primitives too? And I think that was a question about the inverse.
SPEAKER_01Yeah, yes, it does the yeah, it does uh company inverse, but it doesn't do force yet. But you can use I don't know, like what's a function that could inverse, maybe I don't know, square root and then uh square root and then maybe I can't think of any function that has an inverse. So it's doing a negation, which is the self-inverse, of course. And if I do this on minus two, I get two. And if I invert s and two, I'm gonna get minus four. Yeah, so uh inverting compositions works, but you can't undo forks because that's I don't think you can like forks at velocity, I guess you can't really do that cleanly. And there's also like non-numerical solutions, like I think dialogue has some like numerical solver in case it can't invert it to the function itself. But I don't have that like if I can try to invert any thing in define just doesn't work.
SPEAKER_00Right. Okay, that makes sense. All right, so that is I mean, that's inverses. Are there is there more to say? I gotta like I said, I have to play around and uh I I I find the idea of inverses very attractive because I mean, as you know, I I like the non I don't know. I I honestly I'm of two minds of which model I prefer. Uh I love probably and and this I I forgot that uh we were supposed to start off the top saying I th you know I I flip I flop over what's my favorite array language, but I think Tiny Apple is my favorite array language, at least of the day of the last few weeks. And it's and at one point I thought maybe it was WeWa, but mostly the thing that I love about WeWa is how great the like tooling, you know, it kind of feels like if you're going from APL to Weewa, it feels like you're going from C to Rust. Like it has like you know, you write Weewa test, Weewa run. It's got, you know, in its Weewa pad, you can do asserts and and run like unit tests. It's got a lot of nice stuff. It's got like the the formatting and the alignment of uh comments and whatnot. So that is really what I love about WiWA. It's not some and it also does have a lot of really nice like the design and the thoughtfulness that Kai has put into some of the prints. Like when I found out that one of the overloads of tuples was the equivalent of prefixes in J, I thought that was just really, really nice. And uh and and I've again and again I come across, you know, I think Kai and Wewa was the first to have the stencil minus for basically your two wise reductions. And I know that Tiny Apple, I'm not sure if you want to show that. Yeah, sure. That because I think that's new since the last time we talked. You baked that into the stencil operator. So you you have both n-wise reductions, but then you also have specifically for the you know the two wise case, and this is something that I've always wanted in all of the array languages. It breaks my heart in BQN that I I I guess I heard Adam said the other day that Marshall made a choice that structural things are functions, and so things like windows and prefixes he puts into functions that that do the modifications. I never realized that. You know, Adam made it as like a throwaway comment, and I've been thinking about it ever since. Anyways, oh yeah. Yeah, yeah. A lot of thought, and he's been very principled about the way that he designed BQN. And so, anyways, yes, this is fantastic. But so the things that I love about Weewa are more its tooling. And when we were talking to Jacob, he mentioned that he really liked the infix nature of APLs. And I realized that like that is so true. Like, probably my least favorite thing about Weewa is the prefix notation for binary operations. I really, and and maybe it is just because I started with APL, and so you grow to like what you first know, whereas someone else that starts with WeWa might prefer that and then think that APL is weird. Whatever the reason, I do tend to prefer the kind of symmetry of of forks and APL. And and then Tiny APL, the thing, the the tiny apple, the thing that I really love is it's got all the it's got all the primitives. Everything you want, like you know, in the last video I made, the fact that you've got last, the fact that you've got both the you know, the BQN first and the first cell and both equivalents, it's just very nice. And you know, you kind of you've joked in the past that like, oh, I'm trying to put everything from all the array languages, but that's actually kind of like it's a feature, you know, like and people say, Oh, how many primitives is too many? I don't think it's that, it's too many, you know? Anyways, and there's still things about, I mean, we were chatting, I can't remember if it was via Discord or it was on a YouTube comment section, but I uh I think it was in Discord, the Weewa Discord. I asked, would you ever consider doing something with the empty syntactic space outside of the fork or the banana brackets, whatever you want to call them? And you said, uh maybe. I'll think about it or see how hard it is. And I I think if I recall, you said that just parsing it is is a bit tricky. Yeah.
SPEAKER_01But I think because my parser is a little bit like I'm not sure I fully understand how it works. Do you want to say I think I had a fever when I was writing and I never touched it later. So I'm not sure. The parser that you wrote, you're not sure you understand. Yeah, I add new things every time, but the old core and not even try touching, I don't think, for a while.
SPEAKER_00I see. Yeah, because it would be very, I mean, when I was solving that problem, the so the problem was the basically you're given pairs of characters if you haven't seen the YouTube video, and you want to extract the first character from each pair and the last character from each pair, and then do a without to basically remove any of the uh characters that show up in the first. Yeah, I guess we can we can write up an example.
SPEAKER_01Do you remember a good example already?
SPEAKER_00This works because basically it'll remove ABC from B C D, so the answer will be D, hopefully. Oh yeah, this is not that I forgot. Um like this. So yeah, the answer here is D. So you if you and if you use pair for a second with to replace without, it'll it'll show. So you've got your firsts, your lasts, or I guess technically it's lasts and then firsts, and then you want to get rid of from the lasts the firsts. You know, the problem says it has something to do with whatever destinations and whatnot, but the this is the essence of it. And I thought that cap would have the shortest solution because if if you do the alternative. So the alternative way to solve this problem is to transpose and then do a so yeah, let's let's see if we can do this slide. So yeah, if you transpose and then you have to do a uh column-wise reverse. Oh yeah. So but now in order to make this tacit though, so I think that was correct. Oh, I found can I not undo a memory books? Not really. If you go control shift up, it'll bring you back your last expression, I believe. Oh yeah, but it doesn't actually have control Z. Yeah, so it's gonna make sense. Yeah, I think this works. Yeah. So yeah, this works. And so what I was hoping for, and this is actually, we can talk about this because I don't actually fully understand why certain languages, the without reduction doesn't work. And but the the thing I was thinking is that cap has their two-train only and left bound functions. And so I thought as long as it's got uh trans it as long as it has the mix, the split, and the transpose, you should be able to do this in cap, but it doesn't have, I believe, the one of them. And then it also the I don't think the without reduction works. So yeah, let's see how this falls apart.
SPEAKER_02So oh yeah, sorry.
SPEAKER_00Well, I mean I should be saying sorry, the uh array box should be converting that correctly, but it's uh failing. So this is not correct.
SPEAKER_01So what I mean Oh sorry, this has to be like this, yeah, and then this doesn't work. Oh, it's because it it does each choice and okay, this is gonna be uh actually.
SPEAKER_00So why so this is the thing. I don't actually uh my understanding is that some of the I mean if if you do do they have reduced first? Yeah, some of the reduced first is the reduced the reduce firsts, hard to pronounce, is not doing the like they're not doing without on like a row wise basis. So you should be like basically applying a binary operation, which is the without reduction, but for so some of the array languages, when you do a without reduction, it does it on like a element-wise as if it were.
SPEAKER_01So if I want to get the same result, I have to write each here and I think that's gonna work. And it has to be a reduction. So this is the same result. So in cap and like dialogue and most nested APLs, the each time you do a reduction, there's an implicit each added to the function that you give it. Of course, if you only have flat arrays, it doesn't change anything and like pervasive functions here. So like it's a choice that you can make going from like no nesting to having nested arrays. Like if in J, for example, you don't need this, but I have no idea how you do it. Like this, and then transpose and like this, it's just that.
SPEAKER_00You'll have to get rid of the uh semicolons. And then I use this. Yes. So this works.
SPEAKER_01This works in J because there is no each. If I do like this or something, you're gonna get the same result. Yeah. So some languages add an each to the function and some don't. Usually suck languages don't and nested languages do. I don't really like nesting like as a concept. Yeah, I mean I put it nested because when I started making it I knew about dialogue essentially, so you know that's what I was used to. But I'm not sure I would make the same choice, but in any ways, I don't like the like nesting it as a concept. I like to keep things flat yet. So I didn't feel like uh adding the implicit each was a good idea. The same thing happens with like table.
SPEAKER_02I have like I do.
SPEAKER_01Yeah, it's a bit hard to read, but if I did this in cap it would be the I'm not sure how it's gonna be the there's like one left level of nasty, I'm not sure that's clear, but yeah, so here there's also an implicit each. Like if I wrote the of course if I do that, there's gonna be another each. We don't think there's anything in this case. Oh no, yeah, it does. So I'm not really sure, but so yeah, there's some functions that have an each sometimes, which is implicit, and I removed all of those, so it's like closer to J and WiY and languages like that. So if it works there, it's more likely to work in Tiny Apple rather than if it works in Battery PL, I think.
SPEAKER_00And so is this because Adam in the chat's saying that's because of how first access reduction is defined along the vectors made from the columns versus the major cells, whereas in the case of a matrix, major cells are the rows. And that's typically how I think of like the when I see a uh reduce first, I think of it operating on the rows. Like even though when you're adding those, it is essentially the same thing as adding up the columns. Really, it's like you're putting pluses in between the rows, but that's not how all arrays work. So you're saying J and Wewa don't work that way.
SPEAKER_01So the J way, which is also my way, is to just take this cell and this cell. Well, mine is left right, but it doesn't really matter in this case. So take this one and this one and add them together, and then take this one and add good result. Uh the dialogue way is to add these three, it's gonna work. These three and you see my curve? I'm not sure. Yeah, I can't. And this three and this three, and then put them in the in a vector. So it's the same thing for flat arrays, it's always the same for flat, but if you go into next arrays, it's gonna act different because of the different way that nesting would be the case, I guess. Yeah, so like if you put them into a low-rank array, you're gonna lose some nesting something. So yeah, the fact is the same as having implicit. I explained it like that because if you want the behavior, you add an each in tiny apple. But yeah, there's definitely other ways of seeing it for sure. Yeah, it's kind of complicated, and I'm not sure either way is better than the other. It kind of depends on your goals, I guess.
SPEAKER_00And so is this an inherently a flat versus nested versus base thing, or is this just an implementation definition?
SPEAKER_01Well, I mean clearly it's not because uh Tynapple is nested and has this, but y I would say it's traditionally it's a split between flat and nested languages, but necessarily not like an idiot difference is just kind of like the the pervasiveness of arithmetic through nesting, which usually works in nested languages and usually it doesn't work in flat languages, but you know, we are as flattened still works, so it's just a design choice, I guess.
SPEAKER_00Right. Yeah, I was very surprised because I think I was doing it first in Tiny Apple and I did the without reduction, and I was like, ooh, that's very nice. I had I don't think I've ever written a without reduction on a two-row array, and then I was so disappointed when I got to CAP because I was like, Cap has the tacit model that I that could lead to the shortest solution, but unfortunately it it didn't have it. Yeah. What are you trying to do here?
SPEAKER_01I'm going to the the the the dictionary version of the my solution and try from memory. So there's this function that takes the exact format uh that uh the problem is and turns it into a dictionary. Now I have to I guess do the values, subtract the I think that first and it is essentially already a train. Yeah. So it's the same length, I think, but it's just uh slightly different approach. So instead of doing the the each and the first, you just group that into a dictionary first and then you do so last when you give it to dictionary, it gives you the values of the training and first gives you the the keys. So it's just another kind of overload, I guess.
SPEAKER_00Is it I guess it's not possible to use nothing after the dictionary primitive?
SPEAKER_01Because that's uh no, because you want to apply this on the result on this. So you can do like this if you want.
SPEAKER_00I was I was just about to ask, do you have do you have a you know design philosophy that leads you to choose for the the cap fork versus the banana bracket fork?
SPEAKER_01Oh, it's just what takes less parents. Um if I can do it without brackets, it's gonna oh sorry. If I can do it without brackets, it's gonna be I'm gonna use a cap thing, but if it's like maybe longer or one of the things is a kind of yeah. One of the things is a composite function, not just a primitive, then it's gonna be the banana bracket. It's mostly just what looks neater, I guess.
SPEAKER_00Right. I guess so in the case before it kind of looks a little bit nicer because you don't have nested banana.
SPEAKER_01Yeah, double train, yeah, it kind of looks mad. But then you can remove the other one, of course, and I do with one hand, but you can just put it on top here. This also works. Yeah, you can't see the same result, but it's the same thing. Interesting. I usually try to use trains as least as possible, I guess. If I can do it with combinators, I'm gonna use combinators, but I mean if if I have, of course, I'm just gonna use trains, but I think they're just a little bit less pretty than combinators.
SPEAKER_00You're saying that in general, if you can avoid trains, the code ends up looking nicer.
SPEAKER_01Yeah, in my opinion, yeah. This is prettier, I think, than the version with an advert.
SPEAKER_00Yeah, that's true. Although I wonder if I if I syntax highlighted the brackets, if that would change my mind. Interesting. So there's oh yeah, so we so we did end up talking about flat versus nested and the fact that a without reduction, depending on the language, there's an implicit each. And so then I guess for the languages where there is an implicit each, what's the solution? You have to switch it to a nested array and then do the without reduction on that nested array?
SPEAKER_01Yeah, I think if you split it first, you know, like do may your cells based on what you want to do, you think that's more or less. Um I do from here. So we have like I want to mix and then I want to transpose and again mix. There we go. So then I want to split it on the cells again. I could do split, but I don't think it's encapsulated as the other thing else.
SPEAKER_00So I have to do enclose rank one, yeah.
SPEAKER_01Okay. I think it works. Yeah, because it's a matrix, I guess. And then you just do the reduction and it works. Yeah. Yeah. So you have to like go around each by adding a layer of nesting yourself.
SPEAKER_00Yeah, and this is this is why honestly, tiny apple a lot of the time, it just I end up so fond of it because having to write like enclose rank one and then parenthesizing it, it just hurts, it hurts the soul, you know? That like you're almost doubling the length of your solution, which I I know code golf is not the end goal, but it's like when when you talk to Kai, it's about how the ease of like expressing what you want. You're always like he is they're always trying to make that as easy as possible, right? Like it's not about like we're we're trying to make uh code golfing the usefulness of this language, but when you end up having to write five characters in order to express a thing that's expressible with a single primitive in another language, like I don't know, that that there's always like it makes me a little bit sad because I'm just trying to express and like I know how to do it in like three or four characters in my head, but if it ends up being twice as many or three times as many, like that it does seem like you know it's a barrier to expressing the algorithm. And in Tiny Apple, a lot of the times, like you have the shortest path to expressing yourself because you have access to all all the all the primitives, which is which is really really nice in my opinion.
SPEAKER_01I mean sometimes brackets, but uh one of my design principles is like writing code has to be satisfying, and you know, working around things is never satisfying, you know. Adding it an each, it's fine, but you know, having to do all of this might work myself, it's a bit less satisfying. So if I had to choose between the two options, I'm gonna go with the more satisfying one.
SPEAKER_00Yeah. Max is saying disclose rank one is more general and compositional than split.
SPEAKER_01They are the same thing. I I think they mean minus one, maybe. Or may or maybe they mean like split the the tiny apple version. We were talking about this early in the record, I think. So if I have like a 3D array, actually it doesn't work here. Let me do it here. Okay. If I have uh two, three, four, something, then split it's gonna be like this. This is the dialogue uh down arrow, and then this is the tiny apple down arrow. So they are clearly different. I like the second one more because it you know it feels more line axis, which is always nice, but I don't really ever reach for the first one, I don't think. But you know, I can imagine you know, some users for it, maybe. Of course, for matrix, the matrices is the same thing. If I just do two, three, I'm gonna get the same thing. Because of course, you know, the rank is two, so two minus one is one again. But for everything else, it's different. So I guess it depends on your goals, I guess.
SPEAKER_00Yeah, Adam in the chat he's he's saying all very good to be able to express yourself. He's saying precisely, but maybe he means concisely. Or maybe he does mean precisely, he can clarify. But the inflated vocabulary has cost for readers, see Chinese. I mean, I don't know obviously there's a threshold. That being said, like Yeah, you can see that there's all of this.
SPEAKER_01Yeah, I'm not gonna deny that, but I don't know though.
SPEAKER_00I don't I do not think that there are too many primitives in the wrong, I don't know them all, but that's just because I don't spend, you know, eight hours a day writing Tiny Apple. I spend most of my time switching between these languages and then forgetting, as as you did a couple times, that like the split or whatever in in cap is is the disclosed, because it's so confusing when we swap between the different names. And I don't know every single primitive in any one of these languages. But that being said, I don't think Tiny Apple uh has too many. And like uh in fact, uh I don't know what the limit is, but like a hundred, two hundred, that's not the limit. The the human brain is capable, especially if you're using these things as like a daily driver, like yeah, I think it's it's more than possible to uh and like the thing is when I when I go to when I go to fixed APL, I mean I know that fixed APL is in its infancy right now, but like there's I think there could be like three times as many glyphs, because there's a ton of things that don't exist there yet, right? I think I don't think deduplicate is there. I don't even think, if I recall correctly, that there are sort primitives yet, maybe, or I don't know. There was not I'm not sure actually. There might have been grade. I know they have one or the other, but they didn't have both. Anyways, I that that uh yeah. And that that's the other thing, is uh we uh a while ago I was talking about how Tiny Apple, I'm pretty sure is my favorite. But sometimes I I I flip-flop between do I want fixed airity or do I not want fixed airity? Because if you have fixed airity, one of the disadvantages is now you you know all things equal need twice as many glyphs. Whereas with Tiny Apple, you can overload on the the valence. And so is that just a problem though, that we have a lack of like nice fitting together Unicode glyphs? And so that I'm gonna end up with like an awkward-looking language because you know, if I want all the whatever 200 primitives and tiny apple in a fixed airity language, I now need 400 primitives, uh, which then leads you to exactly where I mean you mentioned in your blog that inverses, I I did you I can't remember if you called it it was a cheap trick or a hack or something just to like avoid needing new glyphs.
SPEAKER_01Oh, I don't remember either, but yeah, it's definitely something like that.
SPEAKER_00Something like that. And that's I I mean, when I see what Kai's done with Weewa, I really like the the un and the ante and yeah, a cheap way. And uh I don't know. I like I I haven't made my mind up. I I'm curious to get your thoughts. You know, you've implemented Tiny Apple. It's like, is there a sweet spot for number of glyphs, overloading on inverses, fixed arity versus ambivalence? Like, what's your opinion and like if you were to design an I don't know, and like I guess you have tiny apple, but I'm not sure you that would be your ideal language, right? It was more of a let's throw everything at the at the whatever the kitchen sink in an array language and and see where we end up.
SPEAKER_01Well, you know, again, I'm not the best person to ask how many printers too many because I definitely gonna have as easy to time remembering them than any other user of my language. But I think I've not reached the limit yet, for sure. I yeah, I can I don't think that being like maximistic like this is the best idea for all types of languages, but you know, the goal is actually to be the kitchen thing to be the playground for experimentation and things like that. So the more things you have at your disposal, the easier the new things you can tell if they are useful or not, I guess. But yeah, if I were to design more like serious language, I would definitely cut down on the number of images. I like Ambivalence. I know it's a bit controversial, but you know, there's definitely better pairings and worse pairings, but if they're close enough, I think it's fine. It doesn't really hinder the build as much because you know most of the time you can tell what herity something is trying to be. You know, maybe it's uh very long range, maybe not, but there's not a lot of those. I I do write a lot of those, but uh the average code doesn't, so you can usually tell, I guess.
SPEAKER_00Yeah. I feel like I would have to go through the exercise of implementing like a fixed APL like language to realize that like there's uh a lack of enough. Like if you think of certain primitives like sorting, minimum, maximum, floor, ceiling, all the kind of things like first-last, like all the kind of things where you need to indicate like directional. Like we and I know Weewa, they kind of use the arrows with like dashes through them. And that that's I'm not do I I I asked it in the YouTube video, but then didn't get any comments so far. I don't in particular love any of the first last primitives because I don't really I mean, arguably the tiny Apple ones are the nicest because one of them is like smaller than the other one. There's still symmetry, but the underbar you can kind of think of as you know, the default is sorting up, and therefore if you were to like sort size-wise, you know, you kind of can see that it's at the end. But that is, admittedly, a bit of a stretch, right? I'm building a story. Oh, for sorting. Um not for sorting, but just for first and last, like uh like you just had. It's yeah, it's it's and even the tax that Weewa uses for first and last. And it's the same thing with the pick, because I I think they say is that it you're supposed to be like picking from one, but then like the the tax, I don't actually anyways, I I don't I don't have I'm I'm waiting for someone to discover the the perfect first and last primitives because or or not pick and weewa, but the the first and last and weewa. Um and I've hey I've heard that like in BQN and and APL when you use the the pick or the select, it's kind of supposed to be like a hand, or I guess it's not on camera, it's supposed to be like a hand grabbing something. But like, does this mean you're like because I I don't know the visually, what is the argument for this being first tier? Like I could build a story either way of it being first or last. Because technically it could be pointing like it's kind of an arrow at the beginning, you know, without the tip.
SPEAKER_01It's like the latter half of an arrow towards the beginning or whatever, I think.
SPEAKER_00Yeah.
SPEAKER_01Yeah, but Unicode, uh, you know, it's uh I think every language designer has a little bit of a low-hate relationship with Unicode. Um you know, it is never exactly what you want, but uh you can always almost always get close enough, and that's fine. But yeah, you know, maybe maybe you know Iverson was luckier, you know, getting to pick whatever he wanted for his primitives. And you know, maybe you know, there's some languages that do like just make their own things and uh then you put them on like you know, custom encoding and things like that. And uh, you know, it's got the drawback that it's sometimes I think it's nice that you can just draw things however you want them and uh they can become your primitives without having to, you know, slightly alter the existing Unicode characters in a way that doesn't make them too far from them, but you know, you can still read them without the font and things like that. You know, it's a bit of a struggle.
SPEAKER_00Yeah. I don't even know what I would choose if I could design from scratch a first and last primitive, what I would even choose. At one point I thought actually the Alpha and Omega from dialog APL was actually kind of nice, but I've always thought that those don't really fit as like primitives.
SPEAKER_01Yeah, I think it's definitely better as names. They used to be primitives in like the very early days. I think I used this for first. This one. I don't know if there's equivalent for last, but I would use this one.
SPEAKER_00That one's decent, I guess, because yeah, it's pointing to the what is canonically the first element of a matrix, I guess, right?
SPEAKER_01Yeah, I think it attends to any array in general, like pretty easily.
SPEAKER_00Actually, actually, yeah. I guess well, I guess we use the arrows for assignment. So you can't repurpose those. I was gonna say you could just use the left arrow, but those are well technically we'll be like that.
SPEAKER_01You know, it just uh slightly looks like an arrow, I suppose, closely now.
SPEAKER_00Are there are there primitives on ShapeCatcher for um a left arrow with like a a uh vertical dash through it?
SPEAKER_01Oh, like the yeah, left arrow with size.
SPEAKER_00Like a sideways version of what WeWa does? Yeah, like that's yeah. Oh wait, that's already an APL symbol? Yeah. What what APL uses that?
SPEAKER_01Uh I don't remember. There's a lot of those that I have no idea where they're actually from. Let's see if I can show the whole block. Oh, no? Okay, whatever. There is a lot of primitive uh uh glyphs in the APL block, which either like we're I don't think we're ever to actually use or like only used by very old things, and uh you know some of those nice lot of like quads with arrows and uh with like a jot with uh colon and all that. So some of them like could repurpose later for newer things, like the what is it? It's cap that uses it for like the um alter product, the the quad with the jot, I think. Yeah, yeah, that's cap, yeah. Yeah, I think it was used for something else, but then it never really caught on, so it ended up being free. So these ones specifically, the arrows with the strokes, I'm not really sure what they're for. You know, we were obviously using it right now, but I don't think they were at because of V1.
SPEAKER_00Interesting. Well, one of these days there will be an array language with the perfect first and last glyphs. Anyways, we we also haven't mentioned so I I recently added Tiny Apple to the combinatory logic website. And so I don't think I did, I did, if you follow me on any of the Blue Skies or Mastodons, it's on the graphic tab. Yeah, now Tiny Apple is there. And I've also I've also changed it. I mean I made a YouTube video in the past where uh it was had these animating glow boxes, but no one ever commented on it. But I've always was subtly upset with the fact that I only would highlight the trains if there weren't any primitives for also spelling the two trains. So the B and the B1 combinator and dialogue and BQN were never there. No one ever said anything about it, but I always was kind of like that's an incomplete thing. And so when I was adding Tiny Apple, I I finally bit the bullet, got rid of the animations, and now just color the the asterisk, which represents the fact that there's a train there. A question that came out of this was what was the motivation? So you have two different primitives for the S and Sigma combinators, and from what I can tell, they are identical. Is that so are they identical? And if so, no, what's so there is a difference?
SPEAKER_01Only identical monadically. You don't have the computers for the dialogue version? It's the left and right forks. I think we talked about that last time. Let's see. Let's do it here. So if I have was I already entering Apple? Yes, I was. Okay. Let's change a good example. So you know how in dialogue you do like not equals what is this? No, yeah. Not equals partition rights at the best. Oh yeah, for splitting on spaces. Oh, like on the keyboard, okay. Yeah, and it splits on like uh places or whatever. You know, there's a tag here, so it means it's kind of useless stuff. You know, it's not really doing anything, just it's just saying grab the right argument. I don't think it's gonna work. Yeah. This tag here is not saying anything, there's no meaning attached to it, just saying grab this argument. So you can reduce it to just two functions, right? So it's the not equals and the partition, those are the important ones. And then you can so that you just use a combinator for that, and it's the left fork combinator. So it's called left fork because uh you specify like the leftmost functions of a fork. So the the rightmost one is implicitly a right tack. So if I do this, what happened? Oh, it has to be like this, I think. Yeah. So you just this is the same as using like little banana brackets like this. Right. And the other one is just a schematic version, and the implicit one is the left duck, of course. But moradically, they just have the same meaning as the the hooks because I I don't know, I just couldn't find anything that was useful other than that.
SPEAKER_00I see. So that's what happened. I tested this on monadic use cases and then came to the conclusion that they were the same, but they're only the same in the monadic case, not in the dyadic case. And I guess, yeah, so Adam Adam's pointing out that there's a bunch of combinators that are missing from my table. That's a good question. Should I go add the rows that haven't don't have representation there? Because historically there was no array language that had those. But now I guess Wewa has a bunch of the Nike.
SPEAKER_01Let's see. This one I think we want, this one isn't. Just some for me, I think. This one and this one aren't, but they're just you know not that important to me. They're just like swapped versions of the other ones. So like so. If I write F atop G, I can always write G reverse it up F. It's just the same thing, but it saves on like those sometimes it's easier to read compositions the other way. Yeah, just for reading other reverse it up.
SPEAKER_02No, that's uh I don't remember like this.
SPEAKER_01Yeah, reverse it up is just the same as doing sorry, what's called over, yeah, F reverse over, yeah. So these ones, the Q bird is from the Smollyon book, I think. This one I just made up to be honest, and this one as well. Uh I'm trying to think if there's anything else. Yeah, the hooks I think you already called them Z bro, yeah. So yeah, I think the main ones that I would add are these two because they are both in Tiny Apple and in Weewa. Maybe the ones that only I have, they're not that important. You know, if somebody else has them, maybe they become important, you know. And definitely not that important in the grand scheme of things, you know.
unknownYeah.
SPEAKER_00Yeah, it makes sense, I guess, why or I'm actually I'm not sure about in Wiwa, but in Tiny Apple or just in general in APLs if that have forks, they aren't necessarily going to save you characters. Although in CAP, CAP would actually benefit from them in the case where you might need it, because it would save you having to write the fork syntax, right? Yeah. It would save you two characters. And in that case, it probably is, it does seem more irritating to write like the double angle and then just to put an identity there, right? Like that seems a little bit I guess if you're just in a three-train and in dialog APL, it's not that bad. But yeah, in general, I mean that's what combinators are, right? There when you have an identity or a W combinator, a duplicator, like those just become new combinators because you can omit that stuff. Interesting, interesting. So yes, I will consider adding because both Weewa and Tiny APL have the Nicator birds. And I think was it did those come from Smollian or did uh did Kai make those up? I think uh I researched this when I made the page, and I think no, I don't know actually.
SPEAKER_01I I couldn't find any area reference. I think they're from Kai, but I didn't ever actually ask him.
SPEAKER_00I think also the zebra dove, I think is his uh the zebra dove I think I made up, but I I made it up just like I was like, I need some other dove. Yeah, and that was the one that I ended up chosing. Yeah, the same with the violet starling. The weewa page for sure. Uh okay. Yes, maybe the Nicators though I didn't.
SPEAKER_01If it didn't do this one, I think it was Kai. I couldn't find any earlier reference around other than the Wiwa pages, so it's probably inevitable.
SPEAKER_00Let's see, let's see if I can get an Eastern Nicator. You're not yeah, yeah, you're not gonna see this, but oh except watch this as I crash. Oh, it's cute bird. That's not that's not what I meant to do. But uh it's alright. Is it as good as a zebra dove? Let me tell you folks, it's not well, I gotta be honest, I was expecting that to look a little bit more like a zebra than it does. Anyways, I bombard, I guess. Oh, wait, you were showing it the whole thing. Here I am trying to hover up, but uh we're doing the same thing. I was blocking uh, I guess yeah, your zebra dove looks a little cuter than my zebra dove that I came up with. All right, so I mean we've got uh 20 or 25 minutes left. Uh, one of the things that I said that maybe we could do, I can send you the link if you want. So, and I actually too, maybe before I we switched to our our kind of last thing. Are there are there things that we haven't touched on that you maybe wanted, I mean, just while you're on TASIC talk to to bring up to chat about? I mean, have we talked about AP8L previously? No. I don't think so. I don't think so. That's definitely worth highlighting.
SPEAKER_01Yeah, I just uh one second and I'll share the another screen. Yeah, this was uh I made it to doing the you know, the kind of like burnout from Tiny Apple. You know, it's starting to to end that one, but you know, I was trying to to get back into doing uh array stuff, so I made uh a whole new language.
SPEAKER_00As one does. You get burned out from one array language and then you just go create a whole new one.
SPEAKER_02Uh let's see if I can share my screen. Okay.
SPEAKER_01Ooh, look at that. Yeah, it's just this one is uh a lot is very much inspired by you know old EPL, so it's got no nesting at all. It's m very similar to EPL 360, except the function definition is slightly different, but there's like you know, it's mostly draw-massed as branching and things like that, which Tiny Apple doesn't have. There is a few like modern things, like there is essentially orientation with uh curly grasses. Um trying to see if there's like a square root lift. So cute. I think I have a point. Oh all the points.
SPEAKER_00Oh, this is uh yeah, d I feel like I've seen a K dock screen similar to this. Because it shows the monadic on one side and the dyadic on the other side, correct? Oh you might be frozen. Alright, well bear with us folks while Madeline rejoins. You're back. Although is your audio working? Yeah, it looks like it's working.
SPEAKER_01Great. Yeah, it's definitely inspired by K. I'm not sure what last thing we're saying. Yeah, so I kind of like, you know, not being able to fit any more things in this page kind of made you stop, which is probably a good thing because uh, you know, some projects have to be complete sometimes, you know, you can just keep adding things forever.
SPEAKER_00Yeah, this looks well, I can see you look at this. AP8L also has first and last, as you can see in the bottom left corner. So really, really making the uh the languages that don't have it look bad. And but I'm seeing a couple things. Is pivot just a uh name for dyadic transpose? Yes, it's a we were name for it.
SPEAKER_01Um the primitive orient, but orient is like the inverse of transpose. So if you do the inverse of orient, you get uh, you know, it's I don't think it's an official name, but the community usually calls it pivot. So I called it that because you know dyad transpose is too long.
SPEAKER_00And what is uh I see group, and then below that I see groon.
SPEAKER_01So I guess my question is Oh no, it's grade up and grade down.
SPEAKER_00Oh, great.
SPEAKER_01These are supposed to look like the great characters, but there's not much you can do in five by three, you know. I tried to make that I think those are suggested by someone else actually. Uh asked in the farm for some ideas, and somebody suggested these.
SPEAKER_00Oh, I see. There's a a slight difference between the D and the O. I was looking or Yeah, okay, yeah, it isn't O. I was gonna like it. That's sort up and sort down. Okay, so grade up and grade down, solo pair, drop take. Okay, so basically, yeah, this is this is I mean a couple different names for things and a couple new things like square root and root. But very cool. And people can go and play with this online if they want.
SPEAKER_01I Marsha made a week page for me. I'm very thankful for that. I think it's linked there. I can't find my oh no. I can't find my the the the window to share, but uh if you go on the weekend and you look up my name, you can find the link to detail that. Okay.
SPEAKER_00I mean I can share the uh the next one if you want. Or if you want, you can share it. Uh which one you want me to share?
SPEAKER_01Yeah, I'm having a little bit of problems we have sharing, so you should do it smart in that area.
SPEAKER_00Let's which what which screen should I share on? I think I'll share on and so we're gonna also have to go. I can't even actually remember what the name of the problem is, but I guess we don't need it. And let's make this full screen, and I will share I guess just the window is fine. So hopefully this should work. So this was a problem I don't actually remember. I'm pretty sure it was a pro weekly challenge that I solved a while ago, and I'm pretty sure was it the first one? And I think I think the name of the problem I've taken now, whenever there's a problem on Pro Weekland Challenge, I try and abbreviate it to like two characters. So I think this is like text justification. And this was the solution that I came up with in Tiny Apple, and essentially the problem is you're given a number and you're given a string, and you're supposed to center justify as best as possible that string in asterisks. So, I mean, I guess we should just put can I do this with the lowercase? And we put N, N, N, and that's the idea, right? So if if I change, keep on changing this, and if you ever have like an odd number, you're supposed to put the one less asterisk on the left, or one one less on the yeah, one less on the left, and then have one extra on the right. And so this was the solution that I came up with, which if we go through it, we're getting the length of our string, and then we are dividing that by two after subtracting our total length. And you had so we're gonna the for the rest of this, we I I have a meeting in the 17 minutes, but uh I often I will uh when I'm doing this in Tiny Apple, after I've solved it, I'll send it to Madeline and be like, How can I do this better? Because whenever you have something this long, my first thought is like this can't be the best possible solution to this. And I think this was your first stab at like changing mine, but then ultimately this is what you had. And I have this was I don't know, when when do you think this was? A couple months ago, something like that. But yeah, definitely feel why. It was it wasn't recently. And I said, I'm gonna have to take some time to understand everything that's going on here because I'm not familiar with On Left, and there was a couple other things that you had done. And anyway, so maybe we can go through, and I think there was one thing you said that this could be this could be shortened, or I was doing something inefficiently here. Do you remember that?
SPEAKER_01I think that the second one was your attempt at making it tacit, and uh yeah, this was my attempt at making it tacit. There was like a a a bunch of extra brackets that you didn't need that you could move maybe with nothing or with other compositions and things like that. And I think if I remember correctly, that I tried like reducing yours as much as possible and ended up being shorter than mine. So like your approach was better, but uh you know, you just needed a little bit of refining, I think. There's like uh yeah, a thing I can immediately see is that you have like you go like with his two opening brackets like that next to each other.
SPEAKER_00The for on the left or the right?
SPEAKER_01Yeah. Like you're just it's like two atops in a row essentially, so you can remove the inner ones and make them into like with nothing, I think. No, not that one. Um I don't remember exactly, but you know, there's a lot of places where you could like compose things a little bit differently to get a showter expression. Yeah, but the idea is mostly the same within R2, I think. Right. And so you essentially I think you just build the two strings and then rotate them into place, whereas I built them separately and then combine them at the end, I think it's enough. And so on left on left is literally just the same as the top left. Same thing, but one less character.
SPEAKER_00On left is the same thing as a top left?
SPEAKER_01Yeah. So if you call it dyadically, it's gonna apply the function just to left argument and completely ignore the right one.
SPEAKER_00Oh, okay. That's good to know. And so you have both on left and on right. And I guess yeah, so so your tip is in general that whenever you see a top atop, like so. I guess you were saying here, um now these are two autopsy, I can get rid of these two things potentially.
SPEAKER_01Yeah, those are being given to an over, so not right now, but you can if you move switch essentially, yeah. You can do it like that. Yeah, or if you want, you can use the reverse over from before. So you could take all of the parentheses and move the already over. Oh, so because we only have because the right one is a single glyph, so you can switch it. I mean you don't need the market. So you know, it just is mostly golf, but you know, it's really satisfying to get short of things.
SPEAKER_00Oh did I not did I not? And so this is actually I I never use this this glyph, so this is the shift, shift, this is the reverse bind. Which I don't think I've ever successfully used. The question is, is can I type it? There we go.
SPEAKER_01Yeah. And then you're gonna need uh another between the enclose and replicate because uh it was removed. Yeah, I think that's gonna work. Yeah.
SPEAKER_00All right. So that's it'll be shorter for that. That's like one or two shorter.
SPEAKER_01Um let's see if I can see anything here. Usually when you have like a lot of uh brackets at the end, you can remove some of them because it means that you're like composing things with trains when you could be composing them with something else. See if I can see. I think that the one after the right catenate, you can just remove the train bracket after that and then one at the very end. I think that's going to work.
SPEAKER_00This guy right here?
SPEAKER_01No, the other catenate. That yeah. If you can remove the bracket right after that, and then one at the very end, I think that's going to work. Yeah. Oh no. Yeah, I don't know. I'd be hard to do it right now, but yeah, no, yeah, it does definitely have to like you could remove again.
SPEAKER_00Yeah, I don't exactly uh Well, so actually, so this is a right tack. So actually this seems like it might be a combinator, right? We just had the forks. This is I think it's just a hook because it's monadic.
SPEAKER_01But if it's not, it's not a combinator because essentially so the left fork has an implicit right tack and the right fork has an implicit left tack. So because the things that you want to keep are on the right, you're gonna have to use the right tack, but then the the sorry right fork, but then the implicit attack is going to be the left one, so it's not what you want. You can probably do it with some commutes. So if you use a left tack and a commute, I think it works, but I'm not sure exactly what I'm saying. I have to try to understand. I don't really have a way to find the link myself here.
SPEAKER_00Yeah, that's what I was thinking. You could do some commute, but then would it actually be shorter at the end of the day? Yeah, I'm not sure.
SPEAKER_01Maybe if you combine it, we all think it's gonna be the end of the folder. I'm not sure. I think mine, I'm trying to read it right now. Yeah, I just like divide the thing in half and then I I do the floor and the ceiling, and I use one on the left and one on the right. So I don't be biased uh the way you want it to be.
SPEAKER_00I mean this doesn't work, right? If I do Oh, it does work. Oh yeah, it could work. Oh wait, did I did I I know I did evaluate that. So that works. So now I mean, well, if we get rid of the spaces in the explicit solution, we're still a couple characters longer. But so this is all one fork. Yeah. This is a fork. That's and then this is uh a fork as well. I mean there's a I mean there's a I mean that's uh it's probably a lot of work, but that's this is where it would be a killer feature, is if you had the uh the train trees.
SPEAKER_01Yeah. I can't like train like boxes, I guess. I already have the structure for that trees. It's probably gonna take more work for sure, but yeah, eventually they're very nice to look at, so I'm probably gonna have them at some point.
SPEAKER_00Yeah, it helps with readability or and shouldn't say readability, understandability uh quite a bit. But defin definitely, yeah, like when I see this, I still think to myself, like, there's gotta be a way, a much nicer way, because we've got what, eight banana brackets on screen right now. But yeah, maybe we'll leave it at this. But yeah, yours making use of on left. It's also making use of the left fork, which is uh really, really nice. Anyways, maybe I'll also post this so folks. Well, I mean, uh the solution to this is that I just have to release my leak golf website. But now uh because of AI, I've just got too many things that I'm working on. I've got a Raybox, I've got Leak Golf, there's not enough time in the day to do everything. AI just needs to get a little bit better, and uh then ever then everything will be shipped off into the world. All right, let me uh stop sharing and then maybe for the last or I got multiple cursors, and for the last uh couple minutes, I haven't been checking the the chat, but I imagine that there's been uh a couple questions. And so, yes, there has been a couple questions in the chat. So if you have questions, yeah, for the last five minutes here, feel free to ask Madeline. So one that looks like you already answered what does cells slash cells do? And then you typed transl well, that looks like a Chinese character, but it says like BQN cells, and then so it's just an operator. And then Adam said for a modern old flat APL, wouldn't a rank operator make sense?
SPEAKER_01Yes, I have most of the code for rank operator already working because I have function access and it's implemented using rank. But if I remember correctly, it's like a few issues with it. But yeah, probably if I end up fixing those, I'm gonna replace cells with rank, because it's you know definitely more general. But I mostly have the cells because just I don't have a way to loop at all inside like functions and stuff, so that was close enough. But yeah, I definitely want rank at some point, I think.
SPEAKER_00So is Tiny Apple currently doesn't have oh no, it is about AP8L. Oh, this is uh AP8L. I was gonna say I definitely I recall using uh rank in Tiny Apple, and that would be shocking if in the 200 primitives you didn't you didn't have rank, so this is uh AP8L.
SPEAKER_01Oh yeah, and seamlessly, you know, kind of like a rank fangirl. So I would definitely keep it uh everywhere.
SPEAKER_00Okay. Well, while we wait to see if there's one other, you know, final question from or uh cap programming like uh wrote programming language. It says 200 isn't enough. I assume that's Elias. But then it's wrong user of the language self-speaking. I'm not sure if that's a joke, but uh like I've we were mentioning that earlier. That yeah, I mean I I don't think 200's the limit. I I don't know what it is, but like you need 2,000 Chinese or 4,000 Chinese characters just to read a basic newspaper. And like, you know, kids in elementary school do that, so you know, we just we need more Unicode symbols. And Adam's saying, Where can I find AP8L?
SPEAKER_01Uh it's here on my wiki page. You can click AP8L and sneak here. I was thinking of adding like a table with the parentheses since there's like extra information that's not on the actual implementation, which is about like the the because there is no Unicode in uh in Pico8, so every character has like uh you know a byte associated to it, and I thought maybe adding it to the wiki would be useful, but uh I even asked Marshall Get if I can do that. Uh I'm gonna ask him soon.
SPEAKER_00Alright, so we've got one last question, and it says, is there any exploration into Hangel style symbol composition for Iversonian language? I do not know what Hangel style is. Do you?
SPEAKER_01Hangle is the Korean alphabet kind of so it's basically like uh every syllable is a glyph. Uh I don't have a Hangle keyboard right now, but let's see if we can see so each glyph is a syllable, but the syllable is composed of different characters. So each character is a sound, and then you know, each group of characters is a syllable, and maybe I guess it's something like maybe like modifiers apply above and below instead of to the side and not something like that. I suppose it's the suggestion. Yeah, it would definitely be cool, but if it would be you know even further from Unicode, which is you know definitely a choice that you can make.
SPEAKER_00Alright, we still got a couple minutes. Uh and Max asks, aka Meme God, are there any frameworks for implementing array languages so users can pick symbols, array models, tacit models, etc.? I don't think so. Do you? You're not aware of any, are you?
SPEAKER_01I don't know of any, but it would definitely be a really cool thing to have. So though you know that's always a problem of like if everything is like different variations of the same stencil, uh, I don't know how good having all of the variations is. You know, you know, starting from scratch, you can do like more graphic design decisions, I guess, which uh you don't get by just you know picking and choosing between different types of things.
SPEAKER_00Yeah, it'd be pretty tricky to build build your own language like website because the way the primitives interact it'd probably be quite limited, but it's still an interesting idea. And yeah, Alice is saying that uh the problem is that if you're gonna go and create a bunch of more primitives, you're probably gonna end up going outside of Unicode, which is a pretty big ask. Anyways, we are at the the half hour mark, so I'll say thank you so much. I mean, like I I said in one of my previous YouTube videos, this was long overdue. And I can't confirm who we hopefully are gonna be having on the next array cast, but hopefully we'll have a guest and be a similar conversation to this catching up on the the latest and greatest. Yeah, hopefully uh the next time we chat won't be a year from now, and and by then we'll have I mean, even if we're not talking about what's the latest developments with uh projects, it's always nice to chat just about I don't know, design, tacit model, primitives, etc. There's no endless or shortage of topics to chat about when chatting about these different array languages. So great to chat, Madeline, and uh hopefully we'll we'll do this again sometime soon.
SPEAKER_01Thanks for having me. Always nice to talk with you.
SPEAKER_00Awesome.