Transcript
Transcript prepared by Bob Therriault and Sanjay Cherian
Show Notes
Transcript
00:00:00 [Stephen Taylor]
But my mate Dave, this is when we were both about 16, 17 at school, was also working on a programming project in Fortran to play noughts and crosses. And he'd never got his program to stop cheating, but it did at one point shut down two nuclear reactors and evacuate an atomic energy research plant.
00:00:20 [MUSIC]
00:00:32 [Conor Hoekstra]
Welcome to another episode of ArrayCast. I'm your host, Conor. And today with us, we have our four main panelists. We're going to go around and do brief introduction before we get into our topic for today. So we'll start with Bob, then go to Stephen, then to Adám, and then to Marshall.
00:00:45 [Bob Therriault]
I'm Bob Therriault, and I am part of the J WIKI group and doing lots of stuff with J and I am enthusiastic about J.
0:00:53 [ST]
I'm Stephen Taylor. I'm an APL and q enthusiast and occasionally get enthusiastic about J.
00:00:59 [Adám Brudzewsky]
I'm Adám Brudzewsky. I'm kind of enthusiastic about all array languages. And I think I'm finally beginning to get how some of that k stuff works as well.
00:01:10 [Marshall Lochbaum]
I'm Marshall Lochbaum. I've worked with J and Dyalog in the past. Now I'm known for BQN, which is the language I made.
00:01:16 [CH]
And as mentioned before, my name is Conor. I am a programming language polyglot, but a massive fan of the, all the array languages, including the more fringe array languages that have been mentioned before, such asKAP and Jelly, which I will be adding to the list of languages that we discuss more on this podcast, but not today. Today we have a topic that we're going to get to still in a second, because we've got a couple of announcements. First we'll go to Adám and then we'll go to Bob.
00:01:47 [AB]
Okay. So we just had the Dyalog 23 user meeting last week [01], which was a blast for me. It was the first live user meeting I attended since 2019. And if you missed it, which obviously most people did, then you have a little bit of chance to catch up on what was said there, but looking at the materials that were presented there. So the videos aren't up yet. They will be processed and released little by little this side of new year. However, most people's slides are available already. And even some of the materials that were used in like workshops are available as well. So if you're really curious, go and have a look there and more things will be coming up. It was, it was really amazing to be there. Lots of interesting things presented. And I think maybe the most important and most giving takeaway from there was that there were a lot of people from different, doing different kinds of work using APL. It wasn't all just financial industry people doing things. And there were people doing physics modeling, various people doing it. There were people who were doing sales systems and graphics and things. And also I think we're slowly getting towards that point where people are seeing that it's good to grow the community. So we even had somebody from Simcorp who does financial software presenting a little project that he has made that is a free open source thing in APL that he wants to contribute to the community. Think about running APL underneath C-sharp. But I think that's kind of a turning point where these commercial customers of APL want to help grow the community.
00:03:46 [CH]
Yeah, that's awesome. We will definitely, if it's open source, leave a link in the description for folks that want to check that out and maybe be inspired and contribute their own open source array language project. And I think with that, we'll hop over to Bob for our last announcement.
00:03:58 [BT]
And particularly appropriately, you talked about putting a link in because my announcement is about Apple Podcasts apparently want to clip our show notes after about three notes, which extremely limits the number of show notes that you can get access to through Apple Podcasts. I don't subscribe through Apple Podcasts. I use Overcast. I get all the show notes. That's no problem. If you go to our website, which is really my announcement, if you're having trouble getting to our show notes, go to our website. It's got all the show notes on it. So they're all accessible easily. But if you're actually doing it through your pod catcher, your pod catcher isn't catching them, let me know. We're working with Apple to see if we can get that straightened out, but they're a big company. I'm not sure how long it'll take. In the meantime, if you're not seeing all the notes, you can see it at the website, which is arraycast.com. And that's my announcement. Sorry about that. But that's my announcement.
00:04:55 [AB]
Can't we just have the first link in our show notes be to the full list on our own website?
00:05:01 [CH]
Yeah, I was literally going to say the same thing. Someone once asked for that, and I kind of thought it was odd because I use the exact same markdown file for my website as I do for the show notes. So that means on the website, the first link is a recursive link to itself. But on the podcast app, if people don't have troubles or whatever, and some people just don't like dealing with the podcast interface, and if you go to a website in Chrome or whatever, it's just a better experience. But yeah, I was going to say the same thing. Maybe we can start doing that.
00:05:31 [BT]
That's a good solution. I'll happily, because I do the same thing. The show notes are copied over to my podcast accumulator. And so I have to take that copy and do some adjustments. And I can easily put in one link. That's easy to do. And it'll take you back to the website. Problem solved.
00:05:50 [CH]
I mean, and hopefully full problem solved if Apple can sort their stuff out. But unsurprising that, you know, they're doing something special that's causing their customers problems. Anyways, getting to our topic for today. I mean, I will announce the topic and then we're going to take a tangent. The topic for today is game programming in the array languages. And I think this is going to be a precursor to potentially one or multiple episodes where we bring on guests from the community that have been doing some work in this space to TBA. I think actually we got messages from both of the people that I had in mind. Their names are Brian and David, right?
00:06:27 [BT]
David Zwitser and Brian. [02] Whose last name no one's going to remember. No, yeah, no. I can almost see it. But no, I won't even try and pronounce. It's not that hard to pronounce. It's just I'm not familiar enough with the name to say it and I'm not doing it.
00:06:41 [CH]
I think his GitHub username is like Brian ED. And yeah, so David was unnamed but mentioned when I think I said in the last episode that he had some YouTube videos showing, you know, programming some games in BQN. And then Brian is the individual that has worked on the library, Raylib, or at least the bindings to BQN, which we will get to in a second. And I think probably Marshall will throw it to you when we start that discussion because you probably have, at least in the BQN space, the most familiar with those libraries. However, however, before we get to that, let's look at the time. It is, the time is noted and we're going to timebox this to five minutes. I promise though this won't become tacit number six, but we're going to make it tacit number 5.01 because I do have a follow-up question that I need answered and I can't wait. I would say two weeks, but we already have the next episode guests lined up and I think we might even tentatively have the next, the two lined up. So that means six weeks. I can't wait six weeks, folks. And I could just ask Marshall, but I want the listener to hear the answer too. So I can't remember. I think Adám, you mentioned that when we were having the discussion about trains last time, that it's not a given that you would have the three train, the two train, three train model and have three trains be monadic and dyadic forks. And you mentioned that you could just use two glyphs to represent your three trains. And I think you mentioned that this is what KAP does explicitly. And then I went and took a look at KAP, super interesting language. I hope we can get Elias, the author of KAP [03]. Note that KAP, I love, I love the fact there's a tangent within a tangent. KAP is written in Kotlin. So we've got most of the array languages like up until a certain point, including BQN were written in C. Then we've got Uiua written in.
00:08:30 [ML]
Well, not for open source stuff. If you look at, we've got a nice wiki page on the list of open source languages and it's kind of incredible how many different languages are represented there. Because there's like Go and I think there's one in D and there's Java, of course. I mean, there's all sorts of source languages that have been used. For the big stuff, it's mostly C.
00:08:54 [CH]
Yeah. That's true. But so, but it was just interesting that we had Kai on to talk about Uiua and that's in Rust. We're hoping to get Elias on to talk about KAP and that's written in Kotlin. Anyways, tangent over within a tangent back to the original tangent. And so my question is, I guess, mostly for Marshall, because when I started taking a look at this, I did start to build out a couple of my classic problems that I like to solve, max consecutive ones, Kadanes, et cetera, which make use of forks. And sure enough, you put basically like a double less than, double greater than for the two symbols in between, which is very nice because they are symmetric. And I think if you roll the tape back, I even said, you know, I'd actually have to think about this. If you had something symmetric like the before and after in BQN, maybe it would be nice. And the final thing to note about KAP before I ask my question is that KAP does not have three trains. They only have two trains and you spell the fork, monadic and dyadic with these two glyphs, which means that you don't get this, you know, even odd when you have a three train, it's a fork, then a four train, it's a two train plus the three train that forms a unary. You just get basically two train, two train, two train, two train, which means you can spell a sequence of unary function compositions nicely. And I haven't played around with KAP enough to know if I like that model better. But my question to Marshall is, my guess is that you, although KAP came out in 2020, which is the same time when BQN came out, so maybe.
00:10:20 [ML]
Yeah, well, and it added forks much later. It added that syntax. I think KAP was actually using the APL style forks with just putting functions, a train of functions. And it added those in maybe 21 or 22, which was after I stopped really making pretty much any changes to BQN.
00:10:43 [CH]
Interesting. So my question is, yeah, did you know about KAP's no three train model with the two glyphs for forks? Or even if you didn't know about it, had you considered it? And if yes, why do you prefer the three train model? If no, now that you know about it, having decided that, do you think it's like, which one do you think is better? Or do you definitively know?
00:11:08 [ML]
Well, I can't really say. I mean, I know the three trains written with just bases is definitely what I'm used to. I mean, it's a question of do you add. Like one of these requires more syntax, right? If you're adding special symbols for trains, you have to add more syntax. So it's a question of whether. And of course, there's also k, which just has the two trains and doesn't add this syntax. So it's, do you want to. How much effort do you want to put into supporting trains is one question. I haven't really spent a lot of time in any language that doesn't do the APL style train. So I can't say much about, you know, which is actually nicer to program in. I can only say that the three trains and so on are what I'm used to. And the thing to understand about BQN is that it's not my attempt to make the best possible language. It is my attempt to make a solid version of APL that I know is good. So when possible, I was sticking with APL. If I didn't know what the consequences of some decision were, I just wouldn't do it. So there were some things that I was very sure about. And other people may disagree. And they may still to this day think that I'm wrong about. But I made changes that I was sure would work. And I didn't make changes that would be speculative. I've left that to other dialects. So I think it's good that people are working with this and trying other ways to do things. That BQN is fundamentally supposed to, you know, stick with APL tradition. And that's the tradition that was explored at the time.
00:12:43 [CH]
That is very interesting. And I also, like I said, I have not played around with it enough. I mean, I've only played around with it for like the last, in the last 24 hours. And I think one of the consequences is that the AGH forks, [04] which we need to find a better name for, aka the forks where the left hind is an array, typically it's a scalar. I don't think those are, you can't just plop those in to the no three-train KAP model. Although the nice thing is that you get reverse compose, which is proposed for, or has been talked about for Dyalog APL, which is the analog of compose, aka gets you like the sigma combinator compared to S, which a lot of the times, like you have an extra combinator, which actually for certain cases where the left hind is, or actually when the right hind is identity in a three fork or three train, you know, so, so you, you, you lose three trains, you gain successive B combinators, aka two trains just in a row. And then you also have reverse compose.
00:13:52 [AB]
Hold on, you're speaking about the AGH trains, the KAP does the thing about that the k/q also do with even time APL, that if you have a constant followed by a function, then that's considered as if that constant is bound as left argument to the function. And since KAP says that any sequence of functions is just a top of a top, then I believe that array function function will be as if the array and the function are bound together as a monadic function that's applied a top of the rightmost function, effectively an AGH train, spelled identically, but syntactically actually works differently. The thing about how it is in k, right, if you have an array function function, or verb verb, then it will look like an AGH train, it works like an AGH train, it just isn't. But effectively it's the same thing.
00:14:49 [ML]
Well, and also, I mean, if you're separating the idea of the syntax from its actual implementation in KAP, these symbols for the train should actually be more versatile because you could make a language where actually either side could be a constant. So now that you've got a specific syntax for it, you could have an FGB train or whatever you want to call it, where the right side is an array, or you could have it be both sides are arrays and then it just ignores your argument entirely and passes those arrays to the function.
00:15:20 [CH]
Which is famously a problem you run into where you can only have that scalar array on the left, which means a lot of times you have to do this trick where you're commuting the binary operation in the middle just so that you can get the scalar on the left, which
00:15:31 [AB]
You can make the constant function. Now we even have that in Dyalog as well. So now you can write the absolute value divided by two, right? And then just put, you put this to the right, the two makes it into constant function. It just works.
00:15:49 [BT]
And in J to do that, you just give it an infinite rank and make it a verb. And then it just works like a verb. [05]
00:15:55 [CH]
I have never understood the, well, we're going to have to save that. We got to talk about that more in a future episode is that I've never understood in J this what is it called function rank? Like it's a concept that is not existing in the other array.
00:16:11 [ML]
With the rank infinity thing, that's just the rank operator. So that's not really related to function rank because you're not even passing it a function. So there's no function to have that.
00:16:20 [BT]
You're just saying whatever, whatever I feed to you, you're going to feed back and you can, you can change the rank. You can go less than infinity rank and then you'll get multiples of whatever you send in. So if you send a three item list in and make it rank zero, well, I guess rank negative one, if it's items you're counting, you'll get three identical copies of the, of the noun or the.
00:16:42 [ML]
Yeah. That actually works the same way in BQN, but by a more general mechanism, it's basically just that the, if you have an array instead of a function, it treats it as a constant function.
00:16:53 [AB]
So it's like in the APL, you have the add operator does exactly this. If you could feed it a left upper end, that's an array. It just uses it as if it was a constant function.
00:17:04 [CH]
All right. We, we, I apologize, folks. I failed as a podcast host. It's now been 10 minutes, twice the allotted time. So this was really more like tacit episode 5.1
00:17:14 [ML]
We're all shocked.
00:17:17 [BT]
I think it took five minutes to get the question out.
00:17:19 [CH]
That's fine. Yeah, it did. I saw it took like three and a half or four minutes. So I only gave Marshall, which was not fair. And I think we did get an answer though. We got an answer is that BQN and we got some, I learned something. BQN is not aimed at being this idyllic, you know, one array language to rule them all. It was aimed at being a very solid language that, you know, improved on some mistakes, made some changes, but did not take risks on things. So like, oh, let's, let's play around with this idea and see how it turns out because that's not what Marshall wanted to do. But the last thing that I'll mention is, so we're definitely gonna talk about KAP more. We're gonna talk about all this stuff more in future episode. And I'm traveling right now, but I'll be back in Toronto in November. So probably by mid November, I'm going to do a live stream of exploring the Jelly [06] language and creating something that I will be calling Jello, Hello Jello, which will be a, I don't want to call it a transpiler, but a tool for basically writing named strings or keywords that then does a conversion into Jelly because my Lord. Could this possibly be Uiua inspired? Not Uiua inspired actually. I mean, the genesis of my, I mean, I've, I'm already obsessed with combinators, but Uiua's removing ambivalence has really like peaked a new sort of curiosity on like what's possible in combinator land. Because I just kind of figured that, and also it was a combination of the conversations I had at Minnowbrook. But anyways, to say, to wrap this up, interested in exploring combinator stuff. And I took a look at Jelly because I had remembered Adám saying something about the, you know, every single, you know, composition of functions that have fixed arity forms a different pattern. And I was like, you know, I tried to look into that, but it's just, you know, the, the character set that they choose. I know this is, you know, it's the pot calling the kettle black because we're all our languages have symbols, but it is very, very difficult. And like, I don't actually know how to use the website correctly because you can, there's a little search bar that you can search the name of the glyph. And so I think like, I can't remember actually what range is, if it's capital R, I think R is for iota or range. And then J is for, capital J is for iota or range of the length of an array. But so you've got like a single letter R and J. And I think most of the primitives that map from Ks and Js and APLs and stuff map to single letters. But then you've got all this sort of, you know, what do you call the things that go on top of letters and whatnot?
00:19:58 [ML]
Diacritics.
00:19:59 [CH]
Where are they called?
00:20:00 [AB]
Diacritics.
00:20:02 [CH]
Diacritics?
00:20:03 [AB]
Diacritics.
00:20:04 [CH]
All right, so they got all those things, but like, I, one, I'm not going to remember that stuff, probably because I'm not going to spend a ton of time with Jelly, but what I want is just to be able to type iota, have a little program, convert that to the R. And then also too, the one thing that I'm really curious is that in the docs, it talks about calling these chains by the arity of the symbols. So when you have a monadic fork, I don't actually know that this maps to in Jelly, but if a fork did map to Jelly, you would call that a one-two-one train because that's the arity of the functions. And if you had a dyadic fork, it would map.
00:20:41 [ML]
Or two-one-one possibly.
00:20:44
Two-one-one?
00:20:45 [ML]
It's the prefix ordering, right?
00:20:47 [CH]
Okay, okay. Yeah. Modulo, modulo, prefix, infix, all that stuff. But the idea, like the spelling in APL would be one-two-one and the dyadic fork would be two-two-two. And I came up with this idea all on my own, which is what I was calling point-free lambdas, which we can talk about in another episode. Anyways, point is, that was a very long announcement to the fact that I will be exploring Jelly. I think I said on like a 10 episodes ago, I'd become an expert in Jelly at some point. And then the learning curve, it's just very hard to type. And I don't even know how to evaluate it. Like I think you have to hop between different tabs. Anyways, we'll let Adám have the final say. And then dear listener, we will get to game programming in array languages.
00:21:25 [AB]
Well, Jelly is actually, of all the array languages, or somehow traced from APL, possibly with some exceptions of descendants of Jelly itself, Jelly is actually special in its choice of Unicode characters. In that I believe most any modern computer comes with the Jelly keyboard built in. I didn't expect that, huh? You don't need any special thing, any special setup, because there's actually something, you don't believe me.
00:21:58 [CH]
Eh, I don't know about that. I don't know how to, I mean, one, I didn't even know the name for a diacritic. And two, I definitely don't know how to type it. It's got to be some special key combination, which.
00:22:05 [AB]
But actually, and it's very cleverly chosen, there's a scheme to that whole thing about dots below and above, and it's all inverses of something else as a dot, things like that. But there's actually something called the US International Keyboard.
00:22:17 [CH]
I feel like this counts, just because it's got US in front of it doesn't, doesn't make it not a special type of keyboard.
00:22:23 [AB]
OK so, but the US international keyboard.
00:22:26 [ML]
He didn't say it wasn't special, he said it came with your computer.
00:22:28 [AB]
It comes with your computer. So that is a keyboard that is identical to the normal US keyboard, except the tilde, backtick, the hat, double quote and single quote are dead keys. So if you push them, nothing happens until you push the next key, and then they create some kind of combination with that. Okay, so it's like the backtick keyboard that you know from RIDE and TryAPL and so on.
00:22:53 [CH]
I mean, with this argument, can't. Isn't that like the same as saying like BQN comes with. Only on Linux.
00:22:59 [AB]
No, no, because, because the US.
000:23:02 [CH]
But like you generate those symbols that are not visible on your keyboard by going: backtick, hitting a character, and then poof: a symbol that's not visible on your keyboard shows up. It sounds like you're making the same argument. It's just that ... [sentence left incomplete].
00:23:13 [AB]
No, no, but two points here. Two points here ... [sentence left incomplete].
00:23:15 [ML]
But this is a standard keyboard.
00:23:17 [AB]
Yeah, this is a standard keyboard that ships with all modern operating systems that you can find on Wikipedia. It's not something special. That's what I'm saying. I think any Linux and Windows and probably Mac as well, probably just a setting. You just switch to that keyboard because it's used for ... [sentence left incomplete].
00:23:33 [CH]
Hmm. I see. I see. You don't have to go to BQNPAD [https://bqnpad.mechanize.systems/].
00:23:34 [AB]
Yeah, exactly. You don't have to use any kind of special software; it will just work everywhere. And the mappings actually make sense. Like if you ... [sentence left incomplete]..
00:23:42 [CH]
[Laughs]. The mappings ... [sentence left incomplete]. Shots fired. How do you feel about this, Marshall? [laughs]
00:23:46 [ML]
I don't think that was the point. [chuckles]
00:23:47 [CH]
[laughs]
00:23:49 [AB]
[chuckles]. I believe if you hit the quote key and then some character, then you'll get something like a quote on top of a letter and so on. If you hit a double quote and then ... [sentence left incomplete]..
00:24:01 [CH]
So it's a regular system where you get the same sort of diacritics on top of different letters by the key combinations.
00:24:09 [AB]
Exactly. And so the reason that those characters are chosen like that is so that they should be immediately typable using the standard keyboard rather than forcing you to use some kind of special keyboard for it.
00:24:19 [ML]
I had thought that the reason was actually it was just in the first 256 Unicode characters, so they fit in one byte for code golf purposes. Is that actually the case?
00:24:28 [AB]
No, no. This is actually chosen so that Dennis from the Jelly language could just type it on this US International keyboard [chuckles].
00:24:34 [ML]
OK.
00:24:35 [CH]
Well, we'll try and get Dennis on. I've heard he's sort of retired from, you know, the public spotlight. But stay tuned. Kap, Jelly ... 25 minutes later, folks. And we will redeem ourselves because as promised at the top of the episode, we are going to hopefully have David, Brian, and other folks to talk about this topic in more detail, in future episodes so I feel less bad about taking the first 25 minutes. I promise to try and do better next time. (I do tacit 6.1 after the actual tacit episode). Back to, or I should say [chuckles] our original topic was game programming in array languages. And I think I'll throw it to Marshall. I'm not sure if we want to do like a round-robin of what the state of the art in all the different array languages [is]. I mean, I'm sure some have much less support than others, but definitely there has been, or at least I've seen a trend on YouTube of different folks showing, you know, I think the coolest one is a seven minute video of how to implement the snake game in APL. [07] It's kind of sped up a bit so it's definitely more than seven minutes of coding. But the video is seven minutes. I don't know, Marshall, maybe you take it away.
00:25:43 [AB]
Wasn't it BQN?
00:25:45 [CH]
Did I say something else?
00:25:46 [AB]
You said APL.
00:25:46 [CH]
No sorry. Yeah, it was BQN.
00:25:48 [ML]
This is just a few weeks ago. David Zwitser (I don't know if that's necessarily the correct pronunciation), but he's been working with BQN. He's been a BQN programmer for a while, but now what he's done ... [sentence left incomplete]. And I guess the development that leads to this is that Brian has been spending quite a while to bind a framework called Raylib to BQN. So the way that this works is that you have this tool, Raylib, which does graphics and everything and I assume it's written in C or something (I've never actually checked), but it has an interface through C. And so BQN has our foreign function interface that calls native functions. Through that, Brian's written bindings that call all these Raylib functions, but not only allow you to use them, but allow you to use them in a way that's kind of idiomatic in BQN, that's much nicer. And so David's taken that and he said: "well, I want to try out writing some video games". I suspect he's not the only one to do so, but what he has done is put his whole process of making them into some videos. So there's two pretty long ones, which are kind of less edited. You'll see there are sections where he's debugging something and he just speeds through it, and then at the end of it says: "okay, I figured it out". But I found them very watchable actually. He's got one (I think it's the first ..., yeah, the first one) where he implements a lot of asteroids. It's not the full thing, but you have the ship and you can move it around and you can shoot the asteroids. And I think the shooting is not kind of fully implemented, but basically a pretty good portion of asteroids. You can get a clear idea of how you would finish the game from there.
00:27:34 [ML]
Then the second one, he implemented a full (enough to be playable) version of Snake. So you can see how he builds up. And actually it's pretty interesting, especially if you compare this to Snake videos. So there's this long Snake video where he's working out a lot of things about how you would build a game in BQN. And he does it in a very object-oriented style, which is neat to me because one of the things that I found while I was developing BQN is that it does support this style. I thought it was really cool that you can use a paradigm that traditionally array programmers hate, but I've found a lot of uses for object-oriented stuff. But in my way of thinking, I guess he was at the beginning using objects so much that it got in the way of the programming, but it helps make a framework for kind of organizing how you think about things. So you say: "I've got this thing that I need to add to the game. What is it?". Well, you don't really have to think about it because you say: "all right, I'll start by making an object and then I'll make its methods; what do I need to do?". Then once you've got this all together, what he did in this short Snake video (that's only seven minutes), is he moved to a much more array style where there's not necessarily everything is an object where there's more use of arrays. And there's some use of arrays in all the videos, like he's using arrays for points and everything. There's clearly array programming going on. So the array side of BQN is helpful too. But in this short Snake video, he kind of condenses things. He uses objects much more carefully, I guess, for the things that are really more object like. And so he's able to build this whole Snake game in like a page of code. So it's a really cool way to walk through and see, [how] you could make a video game if you wanted, and here's how, and just get a really quick idea of what are the patterns you need to use. What sort of methods are involved.
00:29:19 [CH]
So I guess my first question is: Raylib is the name of the backend library with the FFI C bindings. RAY-BQN, I believe, is the library that Brian's been working on. Which I'm not sure if David has contributed those examples, but I think there's 10 examples of games and one of them is actually Snake, but that example of Snake is slightly different (or drastically different) because I think David's uses all four arrow keys, whereas the demo in the RAY-BQN one uses only two arrow keys, because really you only need a turn left and turn right. And then the other two arrow keys (the up and downs) are for increasing the speed of the snake, so it's a different implementation of the game. And I played around with it and got that stuff up and working. It wasn't too much hassle getting that stuff up. You need to make sure you've got the dependencies for Raylib to work and whatnot, but the docs are good enough that it only took me like 20 or 30 minutes to get that up and running. So my question is, though: is BQN the first language that has ... [sentence left incomplete]. I'm not going to be the best at describing how Raylib feels, but it kind of just feels like a game engine built on top of an HTML canvas kind of thing. You've got the ability to draw your objects and whatnot and (I can't remember what the name of the function is that gets run that sort of updates the screen). But it's pretty simple, but a lot of the times for these kinds of games, that's exactly what you want. And even sometimes it's more than what you want. If you're designing a board game, you don't even really need that refresh. You sometimes just want to trigger that. But so my question is, does J or APL have, maybe not the same thing of FFIs linking to some game library or do they have some other facility? I've definitely seen Tomas Gustafsson's, [08] I think his name was. He has that demo, which is like a 3D boat simulation. So clearly he's doing some massive graphics stuff. But if I recall, he is also hooking into some, I can't remember if it was some "open insert letter, insert letter" library. But yeah, what is the state of the art in other array languages or is BQN now leading the charge on this front?
00:31:44 [ML]
Well, yeah. So not to comment on the state of the art, but do other languages do this? Yes, definitely. I mean, there's a whole range of ways that you can do this. So what I've worked with is J in the past, and I know I've made some simple games in J and a lot of what I used for this was actually their Windows based ... [sentence left incomplete]. I can't remember what it's called, but basically, there's a tool where you can build up GUI stuff that's pretty linked to Windows and was kind of later ported to, I think they're on Qt now.
00:32:20 [BT]
Yeah, jQt, yeah.
00:32:21 [ML]
J's been through all sorts of different UI frameworks. So there's all sorts of different things. And also, if you want to do 3D stuff in J, I know when I was using it, the standard was OpenGL, which they had some reasonably nice bindings to. One of the things about this is that everything (all the frameworks that people want to use), they're all constantly shifting underfoot. One thing is it used to be that you could just be sure everyone was on Windows. And now there are quite a lot of Mac and Linux users. So you really want something cross-platform. There are other considerations too, so if you really want to know the whole landscape, you have to keep yourself updated. And I'm not too updated on what different languages have done here.
00:33:05 [BT]
And for J, jQt is probably what you would develop in, and they've got actually a web window that you can develop in and just basically treat it like HTML. It can be a canvas. It can be SVG. You can do all those things in terms of your graphics. It does support OpenGL, so you can do that stuff as well. But I guess when I think of games, it's interactivity, right? And I would say the areas that I've seen it used, not so much for games, but one is Michal Wallace's TangentStorm. We had him on a while ago. He's using it as a presentation method. And I think he's using media execution to be able to do that. But essentially, he can program and present at the same time and do things with it in terms of it becoming an interactive presentation tool. And the other one I'm thinking of is what Ed Gottsman's put together for the Search in Wiki. It's very quick [chuckles]. It's very interactive. And it's a search. And he sort of modeled it after wanting [it] to be as quick as Twitch; that kind of a very active way of searching things. I think he's accomplished it. And that's the other way that I see people using interactivity; he's using jQt. I think he's using isidraw, which is a command within jQt to be able to create things that you can see on the screen. But I think that just shows the possibility. I haven't seen anybody doing any extensive graphics or any things like that. Maybe ... (it's not really a game) I wrote an application called Jig, which allows you to look at a noun and blow it open. If it's boxes, you can tell the levels of boxes, what type of a noun it is just by looking at it, because it basically creates the noun, interrogates the information, and piles it out onto a SVG object so you can see what you're dealing with, which is kind of useful. But I wouldn't call it a game; it's just interactive.
00:35:15 [CH]
Adám?
00:35:16 [AB]
I don't really know what is with other APLs than Dyalog in this regard. Obviously Dyalog has a solid, [chuckles] well-tested C interface, so it can call things like that. And it can communicate with other things like Python and .NET. But natively, on Windows, it has what's often referred to as Quad-WC [09] (it's not an entirely precise name for it). But basically, it has a very nice, tight integration with WinForms, which is a bit old technology by now, but it still works strong. All the flagship applications are still using Win32 API for things. There you can definitely have graphical games with interactivity, real-time stuff. In fact, if you have a normal install of Dyalog, then there's a spider solitaire implemented like this. It looks a little bit rough; it could be polished up more. And we are working on improving the bitmaps there so that modern screens doesn't make pocket-sized (stamp-sized) playing cards. And then we have the HTML renderer, which again, you could do anything there that you could do in a browser. But it doesn't have to have its own browser; it can run local desktop as well. And you have direct access to a method called ExecuteJavaScript. You can send commands like that. You can get callbacks for things without having to go through a whole network thing. And then we have what at least used to be called MiServer (still kind of called MiServer but folded into something called DUI), which is the kind of framework to deal with widgets and make some things easier when building HTML content and interactivity. And I've used that myself for several games and little applications, including interactivity. And some of them you can even play online in your browser. We'll have links to some of this. So for example, my children were small (still), and they were just learning the alphabet; we speak Yiddish at home. They were learning the Yiddish alphabet. And I figured instead of me trying to repeat it and show them books; it's all boring. Let me just write a little game to teach them this instead. So I did that. It has this game where it shows a keyboard, and you can take the mouse and click on keyboard buttons, and it says the sound of the ... [sentence left incomplete]. You can see the button going in and says the name of the letter. And then it also gives you the children tasks. It will say the name of a letter and then have them click on the right key on the screen. And there's a 2048 game implemented like that. So there are definitely options.
00:38:01 [CH]
Steven, you were gonna add something? Yeah.
00:38:04 [ST]
Yeah. I love using fairly simple games for teaching. And if you go to https://code.kx.com/q/learn, you can find quite a number of them there. I'll come back to that topic in a moment. But I'd like to say I've got a history with games which started quite early. My very first programming project, and I'm talking hundreds of years ago when I was using a hand-operated card punch [Conor laughs] and ran programs in Fortran and Batch, was to do a very simple neural network. But the second one I wanted to do a space war game. And I was pleased to discover that the name of the program that I wanted, Space War, had a maximum of eight characters. It took eight characters, which was as long as I could give a program name in those days. I never really got Space War operating, though I took it with me to university and played with it there. But my mate Dave (this is when we were both about 16 [or] 17 at school), was also working on a programming project in Fortran to play Noughts and Crosses. And he never got his program to stop cheating, but it did at one point shut down two nuclear reactors and evacuate an atomic energy research plant.
00:39:32 [CH]
What???
00:39:33 [ML]
We decided to play Global Thermonuclear War instead!
00:39:34 [CH]
[laughs]
00:39:37 [ST]
The plant no longer exists, but in Dorset there's a place at Winfred Newburgh: United Kingdom Atomic Energy Research Institute establishment. That was it. We had rights once a week. We could come in and run our programs; get a little stripy paper printout. And if you were real quick ... [sentence left incomplete]. I mean, most of the results we got were [where] the compiler threw stuff out because of typos. But we'd moved on from the hand-operated card punches and we had electric card punches there. If you were real fast, you could correct your typos, push the deck back in and have a second run before you went away and came back the next week. Anyway, Dave's program had been taking longer and longer to run. And when it was thrown out because it ran out of time (compiler error), he typed up a new job card and put it back into the deck. Our decks were those beige colored IBM cards, but the job card was an orange one. And we'd been told to type on the job card simply "T=3, J=3", which in those days meant that the program would get thrown out of the computer after an elapsed time of three minutes, and it had a priority of three. Dave simply typed himself a new card, with "J=99, T=99", and put the deck back in [chuckles]. What he didn't know was. this is before Fortran 77. The guys down at Winfred had hacked their own Fortran so that they got a primitive form of multitasking because the main job of the computer was running the reactor experiments. Apparently [with] experimental nuclear reactors, you don't sit there with a bunch of controls, but you write a program for what's supposed to happen. And those programs have priority and they were buffered always from hell. But the multitasking was inefficient and there was plenty of space to run other programs while the reactor experiments were running. That was the job queue that our stuff went into. Another feature of EgTran was you could have variable arrays in it. Normally in Fortran [10] (in the standard Fortran in those days), at the beginning of the program, you declared what arrays you're going to use and how big they were going to be. That was it; fixed. But in their version of Fortran, which they called EggTran (after Thomas Hardy's Egdon Heath, which was nearby), you could declare arrays on the fly. And Dave had a subroutine which declared arrays on the fly, and what he didn't know was that he was stuck in an open loop and the parameters for the array size were growing. His program was like a tumor in the middle of memory, and eventually it ran up against the memory limits. There was no way that it would literally interfere with or taint the reactor programs, which were buffered always from hell. But computer internal security in those days was pretty simple. Basically when it ran out of memory, it just rang the alarm bell and shut everything down. We knew nothing about this. We were hanging around in the punch card room waiting for the stripy paper to be ready so we could go back to school. We heard in the distance something that sounded like sirens. Imagine something like a university campus; we're up on the second or third floor looking out of the window. We see these huge plumes of steam emerging from the Dragon and Zebra reactor buildings. And after a few minutes from the other buildings, people start emerging from the doors and walking briskly to the car park, taking their cars. And a line of cars forms and heads towards the gate. We don't know anything about what's going on. We think maybe we won't wait for the stripy paper, but we'll go down and go back to school and we'll hear about all this next week [chuckles]. The following week we returned. It had taken them, I think, two days to pick through the core dump from the computer. The mainframe had dumped itself over an emergency landline to the Atomic Weapons Research Institute at Harwell, where there was a reserved tape drive, which had spun into life, I suppose, alarming people: "God, we lost Winfred". They picked their way through the core dump and figured out what was going on. And then half a day after that, they spent getting the reactors heated up again and resuming course. They were very nice about it. We're happy [they] let us continue working there. I guess they just really didn't want anybody to hear very much about it [laughs].
00:44:49 [CH]
I was going to say, that story is amazing. It reminds me on a different scale of (I can't remember if they fired the intern) but there was an intern that managed to spam everyone with a LinkedIn account or something, just with an email, like with the title "test". I can't remember if that intern got in trouble or got fired or something, but I think the majority of the engineering community was like: "I mean, that shouldn't be possible" [chuckles]. An intern shouldn't have access to be able to email every single user of the platform. So that's what I was thinking, is like, this is incredible. I can't imagine our listeners didn't thoroughly enjoy that story. But my thought in my head is like, how do these kids, essentially, with punch cards, have the ability to do something they're not supposed to do, but that's the thing. The intern wasn't supposed to send that email, but should they even be able to send that email? How is it that you put a couple 99s and then you were able to affect the nuclear plant / simulation? That just seems wild, that there's not guards in place to make sure that that's not a low probability of happening, but that just shouldn't happen [laughs]. That's nuts.
00:46:06 [ST]
That was 1968 and that's the reason why we have security now.
00:46:13 [CH]
It was the honor system back then.
00:46:14 [ML]
But it's, I mean, they knew it was a problem for other programs to possibly interfere, but it's this side channel of your program could cause the machine to be shut down that you don't, you don't expect when you're on a multi-user kind of thing.
00:46:28 [BT]
It sounds to me like the nuclear group had a fairly enlightened approach to it, letting you come back on because essentially they're using you as beta testers for their system. And they want you to, I mean, if anybody's going to find cracks, it's going to be somebody who doesn't know what they're doing.
00:46:44 [ST]
That's a very good point. That's a very good principle. I should remember that. So if you want someone who going to find cracks, use someone who doesn't know what they're, what they're doing. I'm so often the person who doesn't know what he's doing. I'm coming back to teaching. I love using simple games for this because it's so commonly follows this pattern. You can write the game engine. I mean, the game engine for 2048,[11] once I spotted somebody last week playing it, playing on the bus coming in from New Jersey, took about three or four lines of APL to write and then replicate in q.
00:47:21 [AB]
How long were your lines?
00:47:23 [ST]
2048 is pretty simple. And then you can add a fairly simple GUI, sorry, a fairly simple terminal user interface. You do the whole thing in character and you can sit there and play it and check out that it is as addictive as the one you have on your phone. And then you can add a GUI interface and use the IPC based, baked into q to run a browser from it. So with a fairly small amount of code, you can cover quite a lot and learn quite a lot. So I've been using 2048 in the last couple of weeks for my tutorials and teaching that. I'm very strong on using games for teaching.
00:48:11 [ML]
I guess Wordle is the newer one now. It's probably even simpler.
00:48:14 [AB]
But you need a dictionary.
00:48:16 [ML]
Well, you just need a list of words, right? Or, oh, you have to check that all the users inputs are words, don't they? You can either trust them or you can import a dictionary.
00:48:24 [AB]
I was just surprised because once it was a CodeGolf challenge to create a simple 2048 game that was playable. Slightly simplified in that the new number that comes in is always two and never four, which could happen in the real game. And I believe I won the CodeGolf challenge at the time in APL with 151 bytes over five lines of code. But that's one line is very long.
00:48:48 [ML]
30 bytes per line, right? That doesn't seem that long.
00:48:51 [AB]
No, that's one long line. And four short lines.
00:48:52 [ML]
Well, that's just presentation.
00:48:57 [CH]
Well, that's something that actually I found very interesting. At one point when I just discovered Uiua, I was like, I got to make a decision. You know, what language do I like better, BQN or Uiua? But I can't use these just simple, you know, CodeGolf, LeetCode, you know, they're fun to do, but it's not actual. Well, I shouldn't say it's not actual programming. It uses a lot of skills that are useful in programming, but it's not an actual, you know, application. Right? I should just code a small game. And then I was like, I'll choose Mastermind because I've already used the exact matches in a couple talks I've given. But the near matches, which is the other problem, which I'm not going to explain, but it's just there's two different problems you have to solve, is a little bit more complicated. But then I ended up being like, very unhappy, not because I didn't like the code, but because the game actually ends up being like, just those two, like, it's two lines of code. One is three characters for BQN and Uiua. And the other one, sure, maybe it's like 10 or 15, but I was like, I implemented the whole logic in like less than 20 characters. And then the other, you know, 10 lines of code is just, you know, a little recursive function in order to be able to output. And then at first I was doing numbers and like in order for like exact matches and near matches. So you'd get back two numbers that the sum of them was less than four, less than or equal to four. And I was like, wait a second, I can just, I have these two numbers. I can turn them into red and white circles if I put them in a string and just do replicate. And so like in another two lines of code, or like, oh, sorry, two characters or three characters, I then converted my numbers into actual Unicode. And I was just like, wow, like it's so easy to express the logic of these games that those aren't even like, you know, and in the Python version of it, it's like, I can't remember 20, 30 lines of code. Like it's, I would consider that like a decently sized, you know, program. It's not trivial. It's not one function. But because these array languages are so concise and so to the point, you almost need like an even more complicated, like what is a big enough problem in Python or Java or C++ to determine how you feel about it. You know, just trivially, you're not writing some huge application. It's almost not enough for the array languages because you get your logic done in like two functions, two lines. And then you're like, okay, well, I didn't really code that much. But I spent 30 minutes figuring out the UI stuff. And I'm not sure if that was the same thing that David found when he was doing the object oriented versus like array versions of his snake game. But anyways, just yeah, something that I've encountered that.
00:51:29 [AB]
Dyalog APL ships with the, with the dfns workspace that contains a one line implementation of mastermind interactive. But again, in text form, we started off with this and saying like, how do you actually make a nice graphical looking game doing a text based one is often very simple, even in C.
00:51:48 [ML]
But this is a good time to bring up the, actually the blog post that gave me the idea for doing an episode on video games is this game Draculark [12]. And the idea there is not to make a more complicated game, but instead to do it on the Commodore SuperPet. This is not an old game. It's as far as I know, it was made like this year, but there's a blog post that walks through it all. And it was done, you know, in the way that you would make an APL game in the 80s or something. And so that seemed like a pretty neat idea too, that you could, that you could work with. And I think this was not even either. It wasn't a nested APL that they had access to where they didn't use any array nesting. So it was an old school APL. And so it's interesting also to see what you can do with just a very restricted style of APL programming where, you know, I said, oh, it's great to have the objects and everything, but what if really all you have is, you know, one variable is one array and it contains numbers or characters. What can you do with that? And it turns out there's a lot that's possible there as well.
00:52:57 [ST]
So the Commodore Pet is not dead, but only sleeping.
00:53:00 [ML]
I suppose so.
00:53:02 [BT]
The other game I can think of in its Dyalog APL is John Schole's Game of Life, which is one line, right? So it's not really an interactive game.
00:53:12 [AB]
Is that a game though?
00:53:12 [ML]
It's a zero player game is what Conway called it.
00:53:15 [AB]
I have an, I believe I have somewhere also in that, with that my server. Yeah. And that I mentioned, I have an interactive version of it, meaning it can just play like normal, but you can also go in and click on the grid to add or delete a live cell. And then, but that it's just taking the Game of Life as implemented in a defense workspace and wrapping a little bit of graphics around that. But yeah, it's amazing where you can do a small amount of code.
00:53:46 [CH]
You mentioned too, Stephen, that at codekx.com, because I was not even sure that q would be usable for, but I guess you're saying, so you're saying that you've done 2048 on the terminal. Does q?
00:54:00 [AB]
These are all text, right? The ones that are.
00:54:04 [CH]
Yeah. Does q have support for any graphical stuff? I was thinking it wouldn't, because it's such a financial, or I shouldn't say financial, it's such a perf centric language that I would imagine that there hasn't been too much investment in like a GUI or that kind of thing. But I could be wrong.
00:54:21 [ST]
Well, the GUI is not native to the language and you're right about that, but it's a general purpose programming language and you've got IPC baked into it. So it's trivial to run a web server from your app and just deliver HTML.
00:54:38 [CH]
Right. Similar to, yeah, a couple of the other. Adám mentioned that as an option.
00:54:43 [ML]
I haven't tried it, but if I wanted to do like game type programming in k, the first thing that I might go for is John Ernest's Special k.
00:54:51 [CH]
Yeah. I was going to say we should mention that.
00:54:53 [ML]
Because yeah, that's very media oriented and I'm sure it has some interactivity.
00:54:59 [CH]
He has a snake game as well in that.
00:55:01 [ST]
But again, it's really nice for the teaching of this stuff because the game is such a small domain. You don't need to know finance or engineering or anything like that. And as Adám keeps pointing out, the core of the logic is just a few lines. So you get to build something that's small, but non-trivial and important architectural layers. You've got the functional core of the logic. You've got some kind of looping structure for playing the game. And then you can put on top of that, the GUI user phase or the IPC for multiplayer game. And you're not spending a lot of time having to generate a lot of code. You're kind of getting there and learning principles. So for a study and teaching, this is brilliant.
00:55:51 [CH]
Yeah, I agree. A lot of people get into software development and programming because of their fondness for gaming. And it is a very, very rewarding way to program, whether it's gaming or just any kind of instant feedback. And so REPL is another example of why it's like you get to instantly see the results and why I love BQMpad. Because you're not even getting new lines. You're just getting live feedback, like updates of your result is like when you're game programming. And the first thing you do is you whip up a little panel. And then when I was programming the Scrabble game, then you have your 15 by 15 grid. And just even seeing the 15 by 15 grid is like, oh my God, that's so cool. And then you have to, you know, some of the tiles have different colors for triple word, double word. And then it's a very simple thing to like, go get the RGB codes for the colors you need. And like, I even found like an old school, I think it's the 1969 deluxe version, which has this very like, there's a bunch of different Scrabble themes, but like that color theme is my favorite because it's the one I used as a kid. And I went and like, you know, did a color picker to get the exact colors of that, got the RGB codes from some website. And then you just, you create literally like a 15 by 15 grid, or you can create like a hash map of and store the indices. But like, it's, it only takes, you know, 10 to 15 minutes to get the info you need to get that to update. And then you go from, you know, a blank canvas to a 15 by 15 grid to a 15 by 15 grid with the colors. And you're just like, holy smokes, you know, I'm actually doing something versus if you're doing some, you know, non graphical thing, you get to see the result. But I think it's less exciting and less rewarding than seeing some kind of, you know, GUI being updated as you program.
00:57:37 [AB]
That's true. Actually, both with the GUI and the non GUI, that's something I really like about this, I mentioned before, QuadWC in Dyalog, that it's all object oriented. And I can, as soon as I change the value somewhere, things are changing on the screen in front of me. I can hand type things to change things. I can run a little loop that changes things, certain things will move smoothly around. But actually, maybe I think the most fun thing I have in Dyalog is if you, we have this integrated IDE, and you can open character variables, like a character matrix, or vector characters. And if you have such an editor window open as part of the IDE, and you change the value of that array from outside the editor, of course, you can change it in the editor as well. But if you change it from outside the editor, then the editor is instantly updated, which means you can, with no code, get real time updates on some code that changes things. And you can easily make like a game of life. Of course, it doesn't do interactivity, other than you could go and change what's in the editor. But you can make a game of life that runs in the editor itself, and various kind of illustrations and things. Of course, it doesn't do color, of course, there's a lot of limitations. But it's not just low code, it's literally no code, just change your variable.
00:59:01 [CH]
I wonder, I'm not sure, Marshall, if you know the answer to this, but when I was, because I didn't watch the longer version, assuming that there was a longer version of the Snake game, I only watched the short one. But a lot of the times it looked like he was switching desktops to one that had the Snake game and then one that he was developing in.And it looked like when he did the switch, he wasn't recompiling or relaunching the window. And so he'd add a box and it would just instantly show up. Whereas when I was trying to build up a small game using the RAY-BQN, each time I made some change, I would have to go and relaunch the window. Was that just a magic of video editing, or was he actually making live changes?
00:59:47 [ML]
I think he probably had some sort of editor set up for that, it would be my guess. We'll have to ask him because it's not clear in the video.
00:59:53 [CH]
That is really cool. And that is, you know, Clojure is the example that I can think of, that when you're developing in Clojure [13] scripts for websites, they typically use a tool called Shadow CLJS. And you can pipe in, there's a compile command, but there's also a watch command. So developing when you have a watch command is so cool, because then you just keep the game or the webpage on one page, and then you make changes. And as you save, it just automatically updates what you're working on. And if you have an error in your code, it'll just show a 404 or something will go haywire. But then you can just go Control Z and fix it. That is the epitome of real-time feedback. I mean, it's similar to BQN pad, right? You're just typing and you have to hit save. Yeah, BQN just waits for 400 milliseconds or whatever it is.
01:00:45 [ML]
Well, there you don't have to press enter. So what I do is, I mean, since I would be doing a key command to save anyway, I just do a different key command to save and also update the thing that I'm working on if I want to do something interactively. So that depends on being able to, I usually do this in Vim, but whatever editor, if you can script it, you can do something like that.
01:01:07 [ST]
Yeah, I want to point out, if you do as Adám says, you get a game engine going in a few lines of code and you do that in functional form so that you're basically got two arguments, state and a move, producing a new state, then you've got something that you can use to search a tree of move possibilities. And the code for doing that is very small. Now you move from a game engine that will just do the move state into something that starts to be smart, looking for better solutions.
01:01:46 [CH]
Yeah, it's very, very cool.
01:01:48 [ST]
That's good programming technique, coding technique to do that.
01:01:51 [CH]
Yeah, I'm pretty sure most JavaScript, I don't know if you call them frameworks or whatever, they have this kind of live updating. And I think that was, I mean, back in the day Erlang, I think was one of the first, they called it hot reloading. It wasn't necessarily for graphics, but you could make live edits to your code without taking the system down. And there are certain, I definitely know certain frameworks and languages where like that's not possible. And it's like, especially if you're like designing something graphical, like it's very irritating if every single time you make a change, you've got to go run a couple commands and then launch something and yeah, super nice to have that hot reloading and live edits. It's being reflected in what you're working on. So I was going to say earlier, I'm not sure if this sets the record in that little bit where we did our round robin of, you know, APL, J, k, q, BQN. I think we got more links in like a six minute period than we have on any other episode. So we will be sure to add all the links for all the languages if you want to go check out this stuff to maybe start playing around with whatever your favorite array language is and doing some GUI game programming. I hope if I can figure out how to get RAY-BQN working correctly, because I ran into a few issues on Linux and I posted some issues and I know that Brian, I think is working on fixing them and may actually already have fixed them. I just haven't revisited to check. I hope to either make some YouTube videos or live stream converting my Python Scrabble game or at least a subset of it. Because the Python version has a ton of extra stuff that is really unnecessary for like a minimal Scrabble game. But I think that's super interesting because in order for it to be efficient, you need to have a kind of try or DAWG data structure. DAWG as in D-A-W-G, which is a directed acyclic word graph. I don't think actually my implementation uses the full DAWG. It just uses a prefix tree, which is good enough. But the point is, those are node-based containers, which will be interesting to see how well that fits into the array model slash BQN or if there's some alternative array solution that's just as efficient that I just don't have my brain wrapped around yet. But anyway, stay tuned. I'm not sure there are any other final thoughts that we want to say other than sending folks to all the links that will be in the show notes. Adám?
01:04:18 [AB]
One more link. Yeah, I think we can't stop this without mentioning and the same thing, boasting a little bit. The oldest game implemented in APL that I've gotten my hands on, so Marshall reminded me that I've done this work. So there's this old code for and code collections for the APL 360, these old tapes. And I managed to get extracts from the contents of those, a game called Kingdom [14] that was written in 1974, which it's really a port from another game called Hammurabi or Sumer. And it's not really very interesting, the game. It's like you have this kingdom and you have to decide what you're going to do every season, if you're going to hire more soldiers, if you're going to, how much grain you're going to use and so on. But the curious thing is that this was written for APL 360 in 1974, and there are all these cool new array languages coming up, but APL is very proud of being backwards compatible. So I looked at how little do I need to change to make this run on state of the art APL interpreter today. It turned out there were three things I needed to change. Being the lack of nested arrays, there was this shortcut syntax for printing numbers and text next to each other with a semicolon in between them. That's not supported anymore. So you had to like format the numbers and concatenate with the text. And then there are these I-beams for system things. Those are specific to the 360 system, had to be replaced with some system variables today. But there were two of those. So three things I had to change, and then it just runs on a modern day system. And it's very playable, possibly slightly addictive too.
01:06:05 [CH]
All right, well, we will throw a link for that in the show notes as well. And if you are listening to this and you have your own personal game project, feel free to email us and we could potentially announce that on a future episode just as an announcement. Maybe we should put together a repo where people can, like, you know, they have all these different amazing C++ libraries and, you know, we could have amazing array language games and we could just link them so people can, you know, have a place to go and check out what's possible. And the email that you can email us at is?
01:06:34 [BT]
The email you can email us at is Contact@Arraycast.com. [16] And on a future episode, we will have David Zwitser and I found Brian's name.
01:06:47 [CH]
Oh, here we go.
01:06:49 [BT]
It's Brian Ellingsgaard. And I hope I'm pronouncing that close to right, but Brian Ellingsgaard. And we will have them on future episodes because these guys are actually doing games. And I think rather than us talking about how games might be done in our systems, well, their feedback would be really useful about how they're actually implementing this stuff. And I think that's about it.
01:07:12 [AB]
Oh, and remember, it's Ellingsgaal.
01:07:14 [BT]
It's Ellingsgaal?
01:07:15 [AB]
Yeah, because double A in old Danish spelling. He's from the Faroe Islands. His name is Danish.
01:07:20 [BT]
Okay. So, Brian Ellingskog. Ellingskog. Skol, Skoog or Skog?
01:07:26 [AB]
Oh, like, you know, like from Marvel, they say guard, Asgaard, this kind of thing. It's missing the little ring on top of the A to make it a yard, go.
01:07:37 [CH]
Asgord. Asgord? I like Asgard better because I've heard Thor say it so much.
01:07:48 [AB]
Tor, not Thor. Anyway.
01:07:51 [CH]
Tor? Oh, man, Marvel just completely.
01:07:52 [AB]
What do you think, does Americans know?
01:07:56 [ML]
Well, Thor pronounces it Asgard and Tor pronounces it Asgord.
01:08:00 [AB]
Yeah, that's correct. Yeah.
01:08:04 [CH]
I don't know if it's just like the audible bias of hearing it so much, but Asgard and Thor definitely sound better to my ears.
01:08:12 [ML]
Thor sounds a lot more thundery to me, I have to say.
01:08:14 [CH]
That's true. Maybe they pronounce thunder, tunder.
01:08:17 [AB]
Yeah, exactly. Thunder in Danish is called tården, so it fits with Thor makes tården in Asgord. Not Thor makes thunder in Asgard. Mangling the Scandinavians. But coming back to those diacritics, I guess those Americans just don't know how to type a little ring.
01:08:33 [BT]
I think there's three words you need to say, Conor.
01:08:37 [CH]
All right, with that, we will say, Happy array programming.
01:08:40 [All]
Happy array programming.
01:08:42 [BT]
And sorry about the mispronunciation, Brian.
[MUSIC]