Moscow ML’s minimalist C89 portability serves as a sharp critique of the bloated dependencies found in modern functional ecosystems. It proves that true engineering utility often lies in self-containment and simplicity rather than sheer scale.
Deep Dive
Prerequisite Knowledge
- No data available.
Where to go next
- No data available.
Deep Dive
This is Better Than OCamlAdded:
So hello everyone and welcome to yet another recreational programming session with Mr. Zuzen. So today we're going to be looking at into a standard ML and standard ML is a programming language general purpose high level modular functional programming language. It's a cousin of another famous function programming language language which is okamel right so as far as I know they're semantically closed but syntactically they're kind of different and on top of that standard ML is kind of dead.
So yeah, it was I suppose this last standard of standard ML was from 97 29 years ago. So uh yeah, but I mean some implementations still exist uh in a while. So this is how it looks like right? So this is a factorial in this language. So it kind of feels like an aamel but this is not in a camel, right?
And a camel if I remember correctly is just like you do functions through let right and here we have fun. So you are allowed to have fun in this language which is great. I think it is great. So there's a type inference, declarative definitions, you know, everything the functional programming nerds like. So and the thing about it is it has a lot of different implementations. So there's this website which I suppose aggregates different implementations. There's some definitions of the standard ML. I suppose we do not care about that.
There's some mailing lists. I don't even use an email. Who do you think I am?
Some sort of a boomer. I'm a millennial.
I use Discord.
I'm joking by the way. Uh email is great, right? So discussing software development uh like you know development project in a mail is actually rather great because it's creates like a natural natural barrier for spammers and stuff like that. Almost not entirely but I mean you get nowadays more spam on GitHub than you get on email surprisingly. At least for me. At least for me. Thank you so much. It's Petty. I hope I pronounced your nickname correctly. Thank you so much for at which sub. So there's different implementations, extensions and stuff like that. So there's a standard ML of New Jersey. There is a Moscow ML is was it actually it's is this developed in Russia? No, never heard about it. Maybe I heard about it kind of vaguely remember it. So what's up with that? Um authors and credits. It was created by Serge Romanenko uh at the Kelish Institute of Applied uh Mathematics Russian Academy. Okay. So it is kind of like developed by like one of the persons seems to be Russian, right?
So okay. Um so what should we look at by the way? Should we look at a standard New Jersey or Moscow ML? Um so in case of a standard New Jersey they release the last release was this year. So that means it is actively developed. When was the last release of the Moscow ML?
Um, so five years ago. [ __ ] dead.
Straight up dead, broski. Straight up dead. Okay, let's actually download this [ __ ] So 2026. We can try like different things. I'm going to give this one a try. If it doesn't work, we're going to move on to something else and we'll see what we can do with it. Unix x8664. It's downloading things, which is great. Uh, so it's going to take like a couple of minutes to download. Uh, so maybe we can chat with the chat while it is downloading. To be fair, I think it's going to finish downloading pretty quick. So should have downloaded Moscow. I suppose K KGB is not happy with me downloading New Jersey.
Uh, but yeah. So, we're going to go with New Jersey. Uh, so I hope it's not going to go down again.
I really hope it's not going to go down.
But anyways, so I already downloaded the New Jersey.
Uh, so smj. Let's go to maybe somewhere third party and let's move it there. Uh, I hope it is not a z bomb. Uh, so how can I check that it's not a zip bomb?
Can I do TA to FVT just to make sure?
I'm pretty sure it's not going to be Z bomb. Oh, yeah, it is not. Okay, this is great. So, only Microsoft doesn't know how to do proper tar balls. Um, everybody who uses Unix. Seriously, no, there's so many files in here. Dude, could have told me at least that I would have redirected that to Dev N. So, okay.
So, it's finished. All right. C++. Oh my god, it's C++. There's also boot AMD60 boot.
Damn. And there is build sh.
Wow. Not even CMake or anything. So this is primarily C++ as far as I can tell, right? There's a lot of stuff in C.
There's Okay, that's that's a little bit scary. I'm afraid that we'll be able to even build that. Uh I'm not even sure.
Okay. So there is a dependencies. Uh so here is the dependencies to build this system system from sources. It's not even compiler. It's a system, right? So it's an entire [ __ ] system.
I was hoping for a compiler, but a whole system is shipped with this entire shed.
That's probably why you have a boot in here. It's a whole [ __ ] operating system apparently. I don't [ __ ] know.
So you must have a several common software systems. C++ 17 you need a C++ compiler such as clang or GCC cmake but I didn't see any cake list.txt txt or anything like that. Autocon imagine depending on both cmake and auto conficers some of the dependencies. Um we're off to a great start. We're off to a great start. The building process for um the system from source code has changed from the leg. Oh my god. No, they they had the legacy system. Set version to the version of a SMLJ that you want to build. Okay, you set an environment variable, clone the repo.
Oh, it [ __ ] it's already cloned. I downloaded it. Whatever. And then just do build this age. You can do dash h to see list of options accepted by the build script. Great. As a version 2025.1, build a script will download. Oh my god.
But it's so I already have a boot kind of downloaded in here. So maybe it's not going to do that.
So as before, you can modify the config targets uh file to add remove components from the build. After successful running of the buildsh script, BSML will be the interactive system. Sounds pretty straightforward. What do you think, guys? Should we get give it a try?
Should we give it a try? So, let's [ __ ] go. I wonder how long is it going to take to build this entire shy.
Uh, so yeah, let's actually take a look at the options. So, yeah. So, you can generate documentation, emit feed feedback messages. So, developer install includes cross compiler support blah blah blah. So, it has a lev Are we back?
I hope we are back.
My internet is totally fine. Everything is totally fine. It's just my connection, streaming connection to Twitch just drops for whatever [ __ ] reason. I don't know who's responsible for that. Is if that's KGB, I can access the twitch.tv fine. So, if they're messing with something or maybe Twitch uh wipe coded their entire [ __ ] back end, so I can't stream anymore. Um, so I don't [ __ ] know what what's happening in here. But I'm not using VPN, by the way. So, uh, who [ __ ] knows? Who [ __ ] knows?
All right, so chat, this [ __ ] is begging for money. It wants some sort of gold.
So, which I suppose is maybe, you know, linker, some sort of a linker. So, there's a little bit of flickering going on. I apologize for that. So, is the flickering situation better? Gold digger. Okay. So, XPS query RS golden dict. Uh, bro, I don't have a gold. Make sure that gold is installed and that your host compiler can compile a sim program with what the [ __ ] is a fuse MD gold custom linker.
Like I don't have it installed. How do I even [ __ ] install that? Where did you even get that? Uh LD gold. Well, I mean LD gold. I don't have it. You see like it's just like it's not exist. If it existed, I would have probably have it in here. All right. Next compiler. Next compiler. So, Mosco ML. Um, right. So, we're going to download Tarball. Oh, they're just redirecting to GitHub. Um, maybe it's a gold linker. I don't [ __ ] know. Gold linker. Can't you just use a normal [ __ ] linker like all of the normal human beings? Uh, binil. Oh, so it's part of the binil. Okay. Uh okay. Or as binila na na na.
Uh okay. Xbps install. Let's go. So we're going to give it a try. So it seems to be standard. Uh right. So do I have It still doesn't exist. So, but maybe LD gold still does. None of that [ __ ] exists.
But maybe it's installed something. Uh, all right. So, yeah, there just like literally everything. LD gold. It doesn't exist. We can try to build this thing one more time. So, maybe it will find it somehow.
Okay. No, it doesn't support that. Um, so as you can see, gold or whatever, it's supposed to be part of the bin chills, but it's in my case it isn't.
Um, just build bin chills. No, we're not going to go that route. Um, we're not going to go that route. Okay, next implementation. Uh, next implementation.
What do we have in here? So, there's a Moscow ML. There's a Moscow PKG, whatever. Okay, so this is the tar bowl.
Maybe two old bino. I have no idea. Like if you can't work with just like a normal standard [ __ ] like I move on. I don't give a [ __ ] Uh so it's like I have more things to to try in here. Uh you don't you don't want other people to build your software? Fine. I'm not going to build it then. Um okay. So there's a Moscow. Let's see if this thing is buildable. Uh it's honestly [ __ ] like that is already a huge red flag. It's already a huge red flag. That means the project is a huge mess. Uh even if we solve that problem, more problems on their way, right? So it's just like these kind of projects are like an infinite source of problems. So I don't want to even touch that, right? Let's not even touch it uh at all. Um so this one is going to be something like that.
So t FVT. So what do we have in here? If it's not just doesn't build like like that for you know whatever. Okay.
What do we have chat? So we are unboxing uh what what is yeah there here it is.
So how do I build? There is a install txt. Okay. So in the previous project at least we had uh build.sh.
We at least had build.sh. Here we don't have [ __ ] Well I mean no build script. No problems. I guess that's that's very Russian solution uh I got to say. But let's take a look at the readmi. So uh implements the full new readmi. Okay.
System requirement list of files. Uh documentation files. Okay. This is great. And how do I build that? Or is that even a build? Right. So because here is the bin and there's nothing in here.
So install txt. So maybe this is what we need to do. System requires a binary installation requires 8 megabyte of disk space.
That's a lot especially in the current economy. Have you seen the prices of RAM? Have you seen the prices of all of the hardware like unreasonable to ask from users but anyway so requires 25 megabytes. Okay. For personal inst personal installation. So there's also nonpersonal move to your home folder and unpacked Moscow ML distribution using okay but this is exactly what I did and you imply that here are the binaries but there's no binaries in here this is why are you explaining this thing like this is a binary distribution when reality it is not okay so there's some [ __ ] in here.
Start. Okay.
How do I build it from the source code?
All right. So, let's take a look at the src. There you go. Here is the make files. We found them.
Uh, so maybe. Okay. So, maybe there is like a make in here. Uh, so edit make to Okay. Okay. Okay. Okay. Okay. Okay. So execute in moss ml src make world make install. Okay, so there's a lot of things in here. Installing Mosco ML and other Unixes. If you have Linux, FreeBSD, NetBSD, HP, what the [ __ ] this What is this?
This is Z Linuxes. Like, I don't even know half of them, but I mean, I'm I'm just too young. But I I recognize Spark San OS. Okay. Okay, I'll give you that.
I recognize spark osgi.
I don't know what the [ __ ] it is. I recognize meeps. I have no idea what is irrig.
Anyways, so choose a directory for the Moscow ML subdirectory to reside in such as user local for systemwide installation or home for personal installation. Download the unique source files from well I mean I already did that. Thank you very much. So, unpack by exit. I already did that. Thank you very much. Change directory to MOS ML SRC.
Yeah. Yeah. So, this is exactly what we have to do. Uh SRC uh uh SRC. Okay. Edit SRC. Make ink.
Okay. So, here is a make ink to suit your system. Set MOSML home to user local MOSML. Wait, wait, wait a second. Is it MOSML home? All right. So this is for siguin.
But where do I set that to suit your system? So uh MOSML home bizaar bizaar bizaar or home also the version of lib CPP or other minor things differ among different operating systems.
So I suppose yeah I suppose we can just use that as our prefix right if you want the runtime system to support dynamic linking of uh foreign C functions further uncommon this setup chat what do you think do we need a support uh dynamic linking of foreign C functions chat what do you think do we need a support for that yeah we we need support for that that's for sure that's for [ __ ] sure so uncomment setup for that okay so uh but I don't see that for and so in here I wonder if I can like have something like home right so there is a home in here and can I say home opt uh mossml okay so we can do moss ml Right. So this is basically what to do and I hope it's going to automatically expand to my home. Right. So it's going to be optl.
So then for the prefix this is all of the prefixes and stuff like that. Men dear. Okay. So that's understandable.
Version install program CP. Oh that's interesting. So you can change the way you install and you here install by copying. So it also needs Pearl. Do I have Pearl? Apparently I do have Pearl.
Cool. Uh so based libs um dynamic lib support to compile the runtime system camel run m with support for dynamic loading libraries uh DDLs dynamically loadable libraries DDLs did you mean DLS where what is DL to true it is already true so do we need anything else automatic detection of OS if Linux blah blah blah blah blah blah blah blah. I think I think that's fine, right? So, that's the only thing we need to change in here.
I'm not quite sure about this whole uh oh, by the way, home works, by the way. They they they literally said that.
I'm not sure about this moss home and it's only for sigin. So, I'm not using siguin. Uh I'm just like using Linux. I don't need this kind of [ __ ] if I use Linux. All right. Execute build make world and make install. So I suppose make world will make everything dynamically openable. I see. Uh doing make install will also install the documentation from MOSML SRC doc which is uh supplied pre-ompiled. It also available from okay cool. So let's go to MOS ML right and I'm going to src and I'm just doing make world. Let's [ __ ] of course So checking the sizes of integers. SH autoconf GCC.
So this architecture seems to be neither 32 bits nor 64 bits. Camel light won't run on this architecture.
Are you okay?
You know guys, I think I start to understand why this language is dead.
And nobody's updating the standard.
Nobody's [ __ ] new. I I think I start to understand that. It's kind of like it's like everybody who's working on this composite. Are you guys surprised that your language is stagnating?
Are you surprised? Anyways, so maybe it's that big. Well, yeah.
Honestly, it's kind of usually it's kind of a vicious cycle, right? So it's dead.
Nobody's using it. And since nobody's using it, it is dead and it's kind of kind of difficult to get out of that cycle. I do understand that. But I mean I just I'm trying to at least build this [ __ ] So and checking the sizes of integers and pointers and this architecture seems to be neither 32 bits nor 64 bits.
So I suppose this failing is a consequence of consequence of checking the sizes of integers or pointers which rises the question how the [ __ ] did you check the sizes of integers and pointers and come to the conclusion that is neither 32 bits nor 64 bits what kind of [ __ ] up methods did you use to come to this conclusion right like I I can't even imagine the [ __ ] up method of checking the sizes you came up with to come to this stupid [ __ ] con conclusion like what did you do? How did you check that? Let show me like grab time. Exactly. Honestly, this is fascinating. Like how can you [ __ ] that up? How can you [ __ ] that up? But you [ __ ] it up somehow. Okay, so um right. Let's see.
Uh grab I wonder if I can like literally find that somewhere. Okay, so checking checking this kind of stuff. All right.
Run test sizes C. Okay. So, where am I?
By the way, I'm inside of config. So, there is a sizes. Uh, so apparently, yeah. So, what is a run test? Uh, run test. Run test. Do you guys know what is this executable?
It kind of assumes that run test is available somewhere.
It's available somewhere. if this is like a supposed to be systemwide executable and if it doesn't exist this entire thing obviously will fail. So yeah run test executable and also we can try to do yeah go search and query uh xbps query rs run test let's see what is uh run test execute will do what the [ __ ] are you saying invoking run test so this is a full set of commands uh yeah by default run test Okay. Uh, this is Djang Gnu. I'm not even sure. Okay.
So, let's actually confirm that run test is not something that exists. Djangu.
Yeah. Uh, is not something that exists in here. Run test. Okay. It does exist in here, right? So, it's a Okay. Okay.
So, and on top of that in autoconf we have this sizes C. Okay. Uh let's try to find this file. Find type f name size t.
Okay. So here it is. What is that? What did you do?
Cool. So you check the size of an integer. You check the size of the long and you check the size of the pointer to the long. That is reasonable. So this one is supposed to be 32 bits. This supposed to be 64 bits. This one's supposed to be 64 bits. So the real question here is is that what the [ __ ] did you expect from the output of this entire [ __ ] So, okay. For it even has different messages and stuff like that.
Okay. Okay. This is a regular 32 32bit architecture. Okay. Wow. A 64bit.
Is this project this old?
It's so funny.
It's like holy [ __ ] 64 architecture.
What the [ __ ] Ah, never seen that before. Uh, so unfortunately camelite has never been tested in this case really. So size of integer camel light won't run. Okay, this check seems to be neither 32 bits nor 64 bits.
So run test what does run test do? It just compiles it and executes it.
Understandable. So let's go to the sizes, right? So this is a bunch of sizes. Let's compile this thing. So sizes uh see like yeah sizes C. There you go. So what is it?
Mhm.
It doesn't compile.
It doesn't compile.
Because you didn't include stddio.
Why didn't you include stddio?
Is okay.
And now it provides 488.
Uh where you can ignore the headers? I think in a in a very old standard. Okay.
So let's actually give it a try.
All right. So, STDC89.
Yeah. STDC89 works.
Yeah. So, GCC standard, you know, default standard actually cannot do that. So, can you do that in STDC99?
C99 already doesn't work. C99 already doesn't allow that, but 89 89 actually allows that. Okay.
So, let me see what we can do. Can we maybe uh modify something in here? So, GCC, can I do something like C89?
Uh, GNU 89.
Yeah, this is this is rather interesting. And by the way, this is allowed, right? So, here is an example. GCC macro. So, you can add additional flags in here.
Um, so you you think GNU 89 would be better. Uh, but I feel like since this project is so portable, I have a feeling that C89 should be fine. C89 should be fine. I want to take a look at some of the examples in here. Let me find all of the C files and not C files and whatnot.
Right. Okay. So, let's find the file name uh which is basically um this ch.
One more time, chat. One more time. Uh, so this stuff and this is going to be ch. There we go. So this is a bunch of files in here. Runtime hash. It has a hash function. Okay, that's cool.
Generic hash. Oh, it's a hash and primitive. Okay.
Oh my god. Look at this seat. Look at this sea. Holy [ __ ] It's preemptive.
This is so cute.
It's literally C89. Holy [ __ ] So where they even use default integer, right?
They use a default integer and local variables are declared before the beginning of the body.
We definitely have to do C89. We definitely have to do C89 because I believe it may not even compile with the modern compiler. So what's interesting is that maybe you can even compile it with some weird compiles like chibi or well I mean chibic is actually quite modern to be fair. It supports a lot of GCC extensions and stuff chokes at the smell of this code.
I mean like I feel like I like it better than you know CPP New Jersey because it smells of complexity. So, this smells of, you know, ancient stuff and New Jersey smells of complexity. Anyways, so uh yeah, let's let's give it a try. I'm going to do another world, right? Wow, a 64-bit architect and we fixed it. and oh my okay so if you're using C89 compile C989 Linux why the [ __ ] you're using C++ style comments can you be consistent at least within your own code base Okay. So, maybe we have to do GNO 89.
Okay. Okay. Fine.
All right. GNU 89. Let's go.
It's going. It's actually [ __ ] going.
Look at that. Look at the go. Hell yeah.
Hell [ __ ] yeah. So, yeah, we're building this [ __ ] and it's done. And it was actually fast. Hell yeah. Anyways, let's install that. So in terms of the prefix does it uh mention prefix anywhere or home or opt?
Okay. So it it mentions this prefix and this is the path that I expected to be installed in. So that means I can now go make install and it did some sort of installation where I would expect it. Uh most there you go.
Not bad honestly. I I will give some points to MOSML. There was some problems with the old code bases but that was not really fault of MOSML. Uh right. So it's just like GCC forces the standard on you like yeah you have to like patch it up and they did tell you uh actually what the [ __ ] just happened and they did tell you to modify make file.in to your liking, right? So adjust everything so it compiles on your system. They kind of warned you that you will have to go like your hands dirty and do some things, right? So, that was kind of expected.
That was kind of expected. So, so far so good. I really like that. So, that was better than New Jersey ML.
Uh, so yeah. And I'm not saying that because this is a Moscow ML, right? So, New Jersey ML like I literally asked for a linker that it's not installable on my machine, right? Okay.
Uh it's not like KGB is holding a gun to to to my head. Anyways, so we have this kind of stuff, right? MOSML, MOSML C, MOSML lex, and MOSML Yak. And there's also camel run M and so on and so forth.
Okay, so this is just the binaries that we got. This is just the binaries that we got. Uh oh yeah, somebody noticed this 911.
It's probably because it's a shell script. Yeah, it is a shell script. So and what it does uh is it uses camel run and it runs morosel ml top. So essentially it's kind of like a earl situation right. So essentially there is this thing which is an interpreter and everything is basically compiled down to the bite code that is then interpreted and stuff like that. I suppose that's what's going on in here. I think I think that's what's going on in here. Anyway, let's take a look at the includes. So here's the is Oh, it's it's in C.
Okay. So you kind of expect it to do some maybe C integration. So there's a MD5 sum. Um. All right. Okay. Okay. So this is a debugger. Waga. All right. All right. All right. Okay. So libs. Uh. So yeah.
Okay. So this is cool and share documentation. So PDF menu pretty cool. Uh so yeah, installation interactive system. So we already went through the installation, right?
Uh yeah, installation, get a copy of MOS ML system, blah blah blah, whatever.
Interactive system, you just start MOSML and you just start playing with it.
Okay, that's pretty cool. So there's a MOS ML lib. All right, so let me take a look at that. So this is the MOSSML library documentation. So this is the library functions. This is great. And there's a MOSML ref. And I'm not really sure. I suppose this is a reference guide for the language itself. Uh it's a reference guide for the language itself.
Um so funny enough, Clauddio Russo translates Claudio Russian. Yeah. So as far as I know in Latin languages, Russo is Russian.
Um, yeah. So, that's what I know. Okay.
There's some uh, you know, HTML stuff.
So, there's HTML pages. Let's take a look at that. So, not firefox uh, new buffer. Yeah. Oh, there you go.
Okay. So, oh, this is actually more convenient. So, this is a standard library. And here, can I can I give this star um on not yet. I think we need to start an interpreter first and just see if it's like working at all. Right. So, so far so good. This is documentation. Okay.
So, we got some documentation and stuff like that. So, there's most tools.
There's a cut dependencies. So, what is that? It's uh it's data. I suppose this is a byte code. I think this is a bite code, right? So, and you run it with run camel whatever. And what's that? It's also data. And it's probably not a bite code. It's it's basically programs. Um, all right. So, let me see what I can do.
I'm going to do something like optml bin moss ML. And in the manual, what do they say? Just run mossl.
Okay, so it works to exit quit.
Thank you for telling me that up front in here. I really appreciate that.
Right. So, now I know how to quit that.
So, now we can create a factorial.
Right. So I can maybe put that to the side. So fun factorial n right? So this is how we define a f function right. So if n is equal to zero and by the way it's not double equal it's just a regular equal then return one otherwise n multiplied by factorial n minus one.
There is no read line unfortunately right? So you have to kind of deal with that. So that defined a new function and then I can do factorial 10 and it gives me 10 factorial number. It works bad but so let's continue playing with this thing. So I I think one thing you probably want to do, you want to do aerial rep, right? So and because of that now you can just move around with normal read line stuff, right? So integration with red line is actually kind of nice in here. TCP speedrun. Uh I don't know maybe we can do read uh Ray lib speedrun.
So you can quit the interactive session by typing quit or control D. Okay, so under Unix control Z by new line on Windows help lib for an overview of a built-in function libraries. Okay, so I can do help lib and I supposed to put a semicolon, right? So don't forget the semicolon. Ooh, fancy. What is that?
Array mutable. Okay. Okay. Okay. So that's cool. And it's not less. It's its own pager. uh it's its own pager. So that means if I go down uh so I have to okay so I have to press uh enter to kind of scroll through things. So there is OS. Okay. So if I do Q uh Q and what if I put OS in it's it's integrated with with everything and it's just it's so such a also I love this [ __ ] I really like this small little thing and like yeah so it it all just works and everything. Okay, so type help for an overview built-in function libraries and for example help array for help on array operations C section section three for further information of MOSML. Okay, so help uh array. I really like how well documented all of that is. So the type array type array. Okay. So if I do array array uh right so put it like that it's a okay I'll try to read that it's a function that accepts a pupil. So you see here's an interesting thing in a camel right I know a little bit of a camel in a camel this star type you have type star type means pupil that has two elements type and type or maybe type one and type two. So and essentially this is a function that accepts a pupil first integer and this is probably a generic type right this is probably some sort of a generic type because this is how it usually is in Okamel and maybe the generic type is actually declared like in here right so here you declare generic type this is not a lifetime by the way right so this is not rust and so you accept this pupil and it gives you an array which is parameterized with that generic type so interesting thing about okamel like ML style languages is that generic types are usually written from right to left not left to right but right to left right so usually it would be like array uh a right but in the mail uh this is how it's usually written right so array is a generic type that accepts a type parameter and you pass that type parameter from uh left to right don't ask me why this is how ML languages work so I haven't looked into the subs for a while So thank you so much uh pigeon guided missile for twitch prime with the message f saggi. Yes. So it's from the times we had uh you know f situation Paulafan thank you so much for twitch prime. Thomas thank you so much for tw a panger your mom's a banger.
Okay so that's cool cool. I really like that. I want to I want to implement something in it. So what that means?
What that means I can do something like um so let me double check. If I do something like 69420 is that a pupil? It is a pupil and look at its type it actually checks out integer star integer. So what that means is that I can do 69420 and if I pass that to array array I suppose this is the value this array is going to be initialized with and this is the size of the array. So, we are going to we're going to have 69 for 20s, which is kind of too much. So, let's actually do something like uh six sevenths, right? Let's do that instead. And we get some sort of array, but we can't really see that. So, it's just an array. Not particularly useful, honestly. Not particularly useful. But what can I do with that array? So, this is array structure and so on and so forth. So I don't see any way to get any information out of that array unless we are just going here. Okay. So this is the constructor of the array. Uh you can find something within an array. Uh but maybe how do you get a value out of an array? Right? How you index it? So array the type one dimension it will array uh type admits.
So type ty array admits equality even if ty does not admits what a wonderful poop color this is because of the dark reader right so if I disable dark reader uh it's going to be that but I don't do that because I don't want to flash bang you right so it's because of the dark reader uh so array n returns a new array of length you can tabulate returns a new array of length from list you can construct things from a list so it's Suppose you can work with lists and stuff like that. You can fold.
You can do some other stuff. Apply a function. But I don't see how you index an array. Does anybody remember how index arrays in Okamel? Um, okay. Copy index.
So you can modify sub. Okay. Okay. Okay.
Okay. Okay. So sub returns the E element of I. Okay. Okay. So this is exactly what I wanted. So array sub uh let me take a look at its type. So here we are accept an array and I wonder how can I maybe take six sevens right so I'm taking six seven can I assign this like that so this is not how you create a variables I think it's something like val there we go so this is access so then I'm going to do array sub it type accepts a pupil right so that means I have to pass and I want to take the first one and oh yeah so array sub excuse me and it gives me seven right so two uh and if I go outside of the range it's going to throw an exception this entire thing has exceptions everything is self-explanatory well and I I have a little bit of experience with okamel I have experience with husk so for me it's kind of obvious what these things mean uh and I like it actually so the batch compiler and linker the batch compiler and linker invoked by Mosul ML But what's the entry point right? Okay.
So I can compile things, right? I can compile things.
Uh so most module stuff additional documentation uh interactive system. Okay. So this is interactive system uh online help.
Have you noticed how concise and short the entire manual is? No huge walls of text. There's like little paragraphs, but they're very concise and on point.
And there's examples.
This is the style of documentation I like. Right? This is the style of documentation that is kind of engaging.
It keeps you engaged and also structured. So, it's very easy to skip through. It is very easy to skip things.
I really like that. Uh I really like that. So, online documentation. I don't care about online documentation. Editing running ML programs. Unix and Emacs. You may run Mosul as a subshell under Emacs.
You should use Mosul version of SML mode for they ship an Emac mode for Okay. So, all right. All right. All right. So, MOSML. Um, so where is that?
um utilities or uh No, I don't see that. So there's Yeah. So it's kind of weird. Most util there's there's no utilities in here. I think they forgot to update documentation. Maybe it's in the tools, but we can try to maybe find a name Emac. There's no name Emac.
Uh utilities. Utilities. Uh no, doesn't exist.
So Mosul in case of error max can interpret Mosul errors.
Nah, can't see that. Can't see that.
Thank you. Thank you so much, Void Maner, for 39 months with a message.
Masqua ML, let's go. Uh 40 months already. I'm getting old. Thank you.
Thank you so much.
Uh so you're not getting old, you're getting aged like a fine wine.
So uh most of like I don't see utility we can try to maybe find uh so something like files with the name L.
This is very convenient in quotation marks. I have no idea what you're talking about. So you're probably reading something from the screen.
Anyways, so um yeah, so there's no utilities in here.
Did they move it somewhere? So is that a uh organization? Okay, so this is not organization. It's some individual. All right.
So there's no Emacs, unfortunately.
Chat, we lied to. We got lied to. Um we can try an interesting thing. What if I search for Emacs like generally?
All right. So there's some mentioning of Emacs.
It is mentioned in interesting. So din libs. So first of all, it is mentioned in documentation, right? So um Mosul version of SML mode for Emacs C Mosul. So this is not true.
It doesn't exist anymore. I suppose they forgot to update documentation. But furthermore, Emacs is mentioned in rejects. See, do you guys know what it is? You guys know what it is? This is a remote code execution. For those who doesn't know, in EMAC, you can embed little snippets of uh Emacs lisp that will get executed when you open a file. But because Emac trying to be safe, right? So, it will first ask you do you want to execute that? But I mean here what it does it just sets different variables right it just sets different variables I suppose and then you can answer no and it will not set them right so and they usually set yeah at the end right so so this is just setting a variable but you can like literally embed like snippets of emac lisp code that is going to be executed and it's useful when uh you need to configure some modes to view the file in a particular way so that's what you usually use for uh right so version control trim versions I don't know doesn't really matter so emac uh right so we need this for rejects and perhaps for emacs include files the emacs which turns on certain matching commands so essentially only in emacs there's some sort of very specific emacs support in these regular expressions uh okay so and there is a to-do notes with to-do I've now encountered the problem which probably you know describing here um problem myself possibly because Emacs always appends a new line at the end of the source code files when saved. So this is some okay so this is a to-do file where they keep track of different problems. This is their issue tracker.
Uh this is their issue tracker. Vim didn't ask up until few weeks ago. Oh yeah I know that in Vim you have also a similar mechanism and so Vim never asked uh right. So it always executed the code. It's kind of interesting. Emacs is actually super strict about that, right?
So they developed that system that asks the user long time ago and they have also very interesting cache. You can say okay always execute that snippet. So next time you open some file which contains exactly that snippet, uh it will just execute you without asking. So it just builds up a cache of safe snippets or something like that. So it has something like that.
So this is where if Visual Studio Code stole that from. Oh, okay. So Visual Studio Code also has something like that. Yeah, I see. So this is usually used for like per file customization of Emacs like a profile EMAC configuration.
So that's what it is effectively.
So road map EMAC mode for a road map structure of the So you're telling me this is not implemented? It's just it's on a road map.
So that Emacs extension was hallucinated. That's what you're telling me.
Check the install prefix. You think it's an install prefix? I don't believe that.
Uh so you you think something I looked through all of the files in in the installation folder. I looked through all of the files. There's nothing in there. So So I I don't know what you're talking about. Like I I've seen everything. So there's nothing. So I come to a conclusion that it's it's confabulated. It doesn't exist. It's it literally doesn't exist. Given the codebase is still in 88, I'm not surprised it's still in the road map.
Yeah.
So I suppose it's like a mythical Emac support. Mythical elusive Emac support.
Like why did you do command that? But you never actually edit that. It's like man that's so annoying. Uh MOS email emac support. I wonder if it's actually like discussed online.
Uh yeah, Mosqu owner obtaining the Yeah, I don't think SML mode in EMAC. So we're talking about that. We we may need like SML mode uh like a general. It says SML mode.
So what's right? So we need to install just a general SML mode. Um just the general SML mode.
Just the general SML mode. So SMLTSSL uh yeah. So it's not even in Malpa, but maybe it's in alpa uh list packages. So let me actually see.
Uh there's a tools folder. I already looked into the tools folder, guys.
Guys, I already looked into the tools folder, didn't I?
You're kidding. You're annoying me already. Anyway, so um SML, right? SML mode. So, there's a SML mode line.
Um okay, smoke. Now, this writing style, uh Emacs SML mode. Maybe there is just a general SML mode. The Reaper had Debian folder. Remember Emacs mode sensor?
Well, I mean I grabbed specifically for Emacs. That's the thing. I suspect that I would have found something in there. Okay, I'm I'm closing the chat.
Go away. Go away. You're wasting my time. SML mode. Okay, so there's the SML mode from New Jersey. Uh SML. Okay, so here's the SML mode. Um now SML mode provides just a few But is it Emacs?
Yeah, it's it's Emacs. So, which means that uh NJ did I already remove NJ? I think I feel like I did remove SML.
SML. Yeah, feel like I removed it.
There's only MOS MOSS ML MOS ML. So, which probably means that I have to download New Jersey one more time. So, but maybe I still have it in my downloading downloading folder. Not really. H I have to download it again.
God damn it. God [ __ ] damn it, chat.
I have to download it again. I literally removed it.
Okay, so let's try to do that one more time.
So, there is a use for New Jersey.
Apparently, there is a use for New Jersey.
Uh, okay. So, yeah.
I'm going to put it in here. SML New Jersey. And let's go.
Okay. So, there's a lot of I forgot that it has all the files.
Yeah. Tens of thousands of files.
Okay. So, all right. Let me try to find file name uh like L. So, there should be something.
Okay.
and lvm21 emac 11vm coding style.
All right. Uh so maybe we have to use Google or something, right? So emac uh standard ML mode.
Go away clanker. Nobody [ __ ] asked you. It points back to this thing. Okay.
There is a EMAC mirror, right? There is a Emac mirror and it's a kind of an interesting project that tries to mirror like old dead uh project and by the way it's by the same guy who develops maggit right so uh he's developing maggit and also support that so he he's still developing he's still going so not maggit though right so I don't see his recent commits doing any magit stuff but yeah mit is just like a g client for emac very popular one uh and yeah so mode major sml mode for editing standard. So there was not that many things in here. And look at that. It's just an SML. Nothing particularly special, which is great. So maybe I can just now go and into my Emacs local. And I have a bunch of things in here. So let me just get clone this entire stuff. Uh but I'm not too sure. Um I feel like since it's a single file, maybe I can just like use this single file in here.
just like downloaded row and maybe that's that's a good way to to deal with that, right? Because I already have uh this specific folder EMAC local in my search path, right? So I don't have to add another folder to the search path like SML mode. So that means I should be able to just load it up. Uh so here's the Emacs and specifically like Sum.
Look at that. So what I can do I can just require SML mode right and it's going to it's going to work. So that means now uh I can do SML mode and then we can have fun factorial n right if n is equal to zero then one otherwise factorial uh you know n minus one or something like that. Look at that.
Look at that. Look that. Look at look at look at that. That's pretty cool. Uh so in this particular mode by the way uh so what we have to do just we need to give it a star. We need to give it a star because it just worked.
Um first star by the way. First star.
Literally, I'm the only person for the last 14 years who needed this [ __ ] That's how dead the standard ML is. Just so you know, you you you thought it's that. No, it's even more dead than that, right? Some mere, you know, repository, 14 years, nobody [ __ ] needs that [ __ ] except me. But cool thing about MOSML at least is that it's simple and it works.
It just works out of the box and it's kind of [ __ ] insane that all of that [ __ ] works like what the [ __ ] excuse me.
So it also provides a bunch of interesting things in here like SML run and it suggests you to run SML command and we don't have SML right but we have MOSML which brings a question does Emacs integrate well with MOSML through this entire thing. So, so here's the thing. I need to set MOSML into my uh what is it called? Path. Forgot forgot the name of this thing. So, basher C, right? So, here's the bunch of things in here. So, I have a scheme in here. Do I really need it in here? I don't think so. So, MOSML, right? So, this is a MOSML.
Okay. So, MOSML bin that is cool, right? So, but this is not enough. I also want to do add that to the profile, right? I'm adding that to the profile. So I wonder if now MOS Okay, MossML is in my path, right? So this is great. This is absolutely great. So now can I have something like uh I'm going to maybe go Yeah. So this is a prop SML. We're trying.
Um furthermore maybe we need to add automatic uh like you know auto auto assignment auto mode right so essentially basically in MX uh it will match a regular expression and automatically assign uh a mode to a particular to a particular extension and whatnot.
Are we back?
I think we should be back.
I almost want to blame Twitch because my uh Do we have anybody else who's watching Twitch regularly? Right. So, does that happen to to other streamers regularly because like I don't [ __ ] know. It feels like a Twitch problem.
No, it doesn't. Okay. So, it's my problem then. Okay. Sure.
Uh not usually. I see. But I mean I'm kind of like if I'm streaming from a Russian IP so I'm pretty sure Twitch uh infrastructure doesn't give me that much priority.
So Russian internet probably I don't know that Twitch website seems to be fine.
Um anyway so so the only streamers I watch is the dynamic array guy and nothings too. Yeah nothings I suppose is more of a static array guy. So does he allocate a lot of static arrays? So it's more of a static but though he has its own dynamic array implementation but anyways so here's and it can do mainl and it automatically actually set up sml mode in here right. So here's the fun factorial n and if n uh if n is equal to zero can I do then the actually indentation is kind of cool uh right then else and factorial n minus one like this all right so if I do sml uh what if I run uh moss ml it automatically worked so which brings me to an interesting question can I just evaluate or Ctrl X E. All right. So you can't do that. What other SM like SML functions do we have? So send Oh.
All right.
So that's cool. And now I can just use this thing.
That's pretty cool.
How can I have side effects? Can I have like print? Uh, do I have print? Well, I'm okay.
What's the entry point of the of this language? Right. So, this is a very interesting question. uh what's the entry point? Uh so we can take a look at maybe a reference or some documentation, right? So here's a mosl. I'm sure I'm not sure if it's going to tell me. So maybe entry h and then all right so let's go through the manual non-standard primitives compile. Ooh, evaluate and compile will compile uh and elaborate the specification in a file use sig and I suppose sig is a signature file like headers or whatever you can compile from the from the rile right which is kind of cool I suppose this is great but how do I can I create just like an program executable or whatever so that's that's the real okay so it goes to understanding inferred type signatures.
All right. So, side effects. Yeah, you can have side effects. Um, I wonder if we can do some stuff, right? Can I define hello? Right. And in here, I'm going to do print hello world new line.
Right. So, this is what we have in here.
Uh, then I want to send a function. Um, did did it send a function? I'm not sure. Uh, MOSML.
Uh, MOSML. This one. Right. And there's several of these. Okay. So, this is just folders. Uh. Uhhuh.
Okay. Send function.
I don't I don't see how it's sended, but maybe I can do something like that. Oh, by the way, this is probably not the correct function definition. Yeah, this is not the correct function definition.
I suppose a function doesn't accept any arguments. It has to accept that. So this is like it accepts unit. So this is a unit type and you kind of accepting only a unit and you par matching unit.
Oh, this is funny. So and then several arguments is a pupil. So Oh, okay.
That's a really funny way to do that. I kind of like that. Okay. Okay. So this is hello. And if I send a function, it send that function in here. I can now execute that function. Here is hello.
So, and that raises the question, how do I uh run several statements with side effects if um semicolon is the end of the definition, comma, uh something like that. Comma doesn't seem to be the case.
Full bar, right? So, what how can I like run several of these things? I'm going to send this thing. This is not correct, right? So, but if I put semicolon in here, right, it's it's not correct. It's going to be just hello, right? So, this is not the correct thing. This is very interesting. I suppose this is something that should be answered in the reference, right? So, let me let me take a look at the reference of the or maybe we can take a look at the Wikipedia, right? So, I'm sure Wikipedia will tell us, right? So, there's a while loops in here. Uh, so you can have imperative style stuff. Uh, that's pretty great.
And where you have ah I see chat I see.
So it's still semicolons but you wrap this thing in parentheses.
I think that's what you do. I think that's what you do. So essentially we just do yeah in even emac mode kind of like indents everything properly. So full bar new line and I suppose at the end in here I just do that. Then I send the function. Did it send it? Um hopefully. Can I Oh, okay. Yeah, there we go. So, and if I do hello, hello. Yeah, it printed hello world fullb bar. All right. So, we can actually have like a procedure programming.
Uh so, we have a do notation for proper procedure programming. So, as far as I know, ML languages just allow you to do imperative procedural programming, right? So they're not very you know dogmatic as Huskell right they're not very dogmatic as Huskell by default it's very declarative it's very functional but at any point you can drop down to imperative programming and and this is fine right so the order of evaluation is defined anyway so you don't have to worry about that too much okay so what that means uh maybe one thing I can do I can basically generate Fibonacci numbers in in a like sort of like imperative style but um actually I can do that in a functional style with the side effects right so I want to have some sort of a function right oh I can do a fan by the way but it's probably for the types of the of the lambdas lambdas or whatn not right so this is going to be a fibonacci and uh we're going to accept like n's Fibonacci number or whatn not and I wonder if it's an integer or uh or something like that um yeah this one is interesting so what if I accept integer uh right so let's define a function increment which increments a thing by one right and now I'm going to send the function did it send it okay so if I do increment 68 uh it incremented it 69 okay the syntax is very intuitive if you are familiar with functional programming right this is kind of cool so this is going to be Fibonacci And um what we can do in here I suppose maybe we can accept A and B. Can I accept them like that? Probably not, right?
Probably not. But maybe I can do H. Yeah.
So let's do sum. I'm experimenting with things, chat. I'm experimenting with things. So a plus b. So I'm sending a function. Okay. So sum has this specific signature which makes sense. 3435 uh yeah you're supposed to actually use sort of like this notation 69. Okay that's great. But how can I say that one both of them are integer? How can I explicitly say that? I suppose the way you say that is something like this.
Right? So you destructurize a particular expression pupil and then you also say that the type of this thing is a pupil.
Uh right and I wonder if it's going to work. No it doesn't work.
Um so overload cannot be applied to argument int.
Ah so because of that you probably have to do something like that right?
Hm. So because what happened in here is that it I provided A without a type, right? I provided A without a type and then B with a type of pupil which kind of means that I can probably do something like that.
Okay.
Ah so you can provide types for the sub expressions right. So with this as a pattern that pattern matches a pupil and that binds each individual sub expression to these names and then you kind of hint the type for each of these sub expressions that's what's happening in here that is cool actually kind of right and it's naturally kind of looks like a function uh definition and stuff like that it's pretty cool I suppose uh so and it is a sum so we can we can actually confirm so I send the function then I do 34 yeah Okay, maybe we are ready to do a little bit of a Fibonacci stuff, right?
So, we're going to do uh we are going to first of all print the current Fibonacci number which is basically Hey, how do you print numbers? Okay, this is interesting. Uh so I can print integers.
That's cool. The strings. Um but how do you print numbers? If I print 69, of course.
Off [ __ ] course. Off [ __ ] course.
But uh maybe somewhere maybe somewhere in here we have some stuff for converting things strings right okay string manipulations um or maybe there is something like print f printers general printers or integers.
Uhhuh. So int operations operations on integers. Okay. So do you have anything for the string?
So yeah uh to string. So int to string 69.
Uh what was that?
Uhhuh. So there's a h is that just two string unbound. Uh, how do I just use an int?
Right. I remember I could just use array lowerase int. Is it lowerase int?
This is the module.
Don't backseat me.
Codecat. Codec cat. I'm taking away your VIP, please.
So, um yeah, this is rather weird because I do remember that I just used um array stuff in here. So, I can do array in here and it works. Which means I can do int to string in here. But I can't use int to string in here. And this is not something I can use uh to string. M yeah this is bizarre structure int. So description of structures so compatibility this is kind of um compatibility stuff.
Mhm. All right. So I feel like I feel a little bit overwhelmed. I want to make a small break. How long I'm already streaming? So I think I already steamed for one hour. So let's make a small break. I'm going to make a cup of tea and after that we're going to continue exploring this entire thing. I'm really fascinated by this implementation of SML.
Um it has MySQL. Really?
Oh wait, what? What? Where? Where did it go?
It refers to MySQL.
Oh, but then uh that is bizarre. Then it's not what is this halfbaked the Okay.
Windows user detected. Windows users.
Windows user. Windows user. Windows user. Ha.
Okay.
So yeah, this is how Yeah, you you can you can write back ends in this [ __ ] chat.
This is a production ready language.
It's it's not a toy scripting language.
You can write like business logic in it.
MySQL DB speedrun. I don't have a MySQL but install I never actually yeah I never worked with MySQL I worked with posgress uh but I can write the bot in it right so since it has a database and [ __ ] all right let's make a small break uh right I'm going to make a cup of tea and we're going to figure out how to convert integers I have a feeling that I maybe have to import some things I have to load the module somehow um so I'm not sure why array works. Is that because I I was doing help? This is interesting, right? So, because at one point I did help, right? And I feel like maybe it loaded it up. What if I do help intr uh like this?
Didn't load it up. So, what if it's to string? Okay, small break. So, uh yeah, I'm skipping the tune. Chat, I think I discovered the gem.
It's really cool small little language uh that is very easy to use for something like non-performance critical. I can see for example implemented like a chat bot in it. Uh right so it's kind of cool actually. It is kind of cool.
So found this mossl example. Uh so we can take a look at MOSML. It's inside of the MOSML. Oh, app load. Okay, thank you. Thank you so much.
We'll utilize that. So, we have you have to explicitly load it. Very interesting.
Uh, so side info mostljs repo has an emac mode inside the tools directory.
Interesting. Um, did you know that SMLJS was an inspiration for JB Blau mentioned in interview? Yes, I know. I I heard about it. But in my opinion, MOSML is better. At least I managed to compile it on my machine. So, it's Russian versus Russians versus Americans yet again. I'm sorry, but I mean it's just like Yeah, like it it asks for a weird linker. I don't have it on my machine. Yeah. KGB approved. Yeah.
Will you try M super project again? Yes.
I just need to find a better approach for it. Um it seems a lot less scary than Husk.
Yeah. So all of these ML languages are basically practical haslls, right?
Okamel is a practical Haskell. Standard ML is practical hasll. Um and what's interesting is is that they are older than Haskell, right? So the functional programming nerds originally come came up with a practical language, right? And then some sort of fundamentalists came came in and said that no we can't have any side effects and it turned into Haskell.
So it's just like I feel like fundamentalism in functional programming is not a good idea. Well generally fundamentalism is not a good idea right.
So but in functional programming it's just like yeah you get Haskell it's kind of kind of weird language.
Um so function programming nerds are mathematicians. So they don't want practical well get um the PRFP is just a cold it kind of feels like it right. So if you analyze it very thoroughly right so especially if you uh been in it for quite some time you then just realize yeah so it's just like everything must be pure is kind of like pulled out of their ass. It's just like why does it have to be this way?
Computers are by definition are impure.
They operate on a state. Why are we trying to hide all that out? Exactly.
Why? This is just like just this is how nature works, right? So just embrace the nature.
Can you do proofs on standard ML? I don't know. To do proofs, you need dependent types. Uh I don't think standard ML has depend dependent types.
So yeah, probably unlikely, but I don't know for sure. Or camel doesn't have dependent types. So as standard ML probably also doesn't have it.
So ML was originally designed for proof of citizen. So probably H that's interesting. But I mean what's interesting is that [ __ ] or rock as it's called today. It is implemented in a camel. So I don't know kind of hard to tell.
Clanker is telling me it's possible. Ask for an example. Ask for an example.
for a simple one.
And which clanker by the way? Bonsai. I hope not. It's not bonsai.
Uh so yeah, bonsai.
Anyway, SML is better than Lin. H. Lynn to me feels more powerful. is then sm isn't isn't basically like bonsai but we're on hate mode well I mean I don't know I don't hate it maybe I should bring it in into the into the uh into the string devh I don't have enough space for this shicy chat.
I have enough space. Uh but maybe I can clean up some space. Just a second.
Uh okay, I'm going to delete my porn. Um oh [ __ ] I don't have any porn. [ __ ] Okay.
Uh okay, let me remove some um banger folder. Yeah. Yeah.
about now 15. Okay, so like significant amount of poring has been deleted. So let me grab my tea by the way but an example they have wall. Thank you so much Dar.
Um, all right.
Okay, good.
Okay, good.
Okay, good.
Okay, good.
So, uh, llama CPP blpp.
So, releases. Let's take a look at the releases. What do we have?
Let's grab uh, Vulcan. Let's grab Vulcan.
Okay, that was pretty fast, not going to lie. All right. So, let me go to downloads.
Unpack this shy semin.
Uh, so hugging face.
Where is your autistic child? Bonsai.
So, Prisma, I suppose that's Yeah. So, it's it's them who actually developed this thing.
Don't tell me that it's not accessible.
Oh [ __ ] Oh [ __ ] It's not It's not accessible.
Oh no, it's it's fine. It's fine. So files and versions is a little bit weird. So which one should I what what's the differences between these files?
Update meta.
So there's um Okay, I suppose I will need to So this which one should I pick?
Which one should I pick? Q10 zero. I'm going to pick this one because it's less weird to me. Let's now uh maybe I download this thing. Wget.
Uhhuh.
Oh.
Sticking. Okay. Oh [ __ ] It outputs a long ass [ __ ] line that kills my Emacs. All right.
All right. So, it weighs What's interesting is that this language model weighs only like 1 gigabyte or something. It's very small, right? It's very small. And on top of that, people say it works like an iPhone or whatever.
Uh, so Q uh Q1 I think is like a nightly release. I see. All right.
So, let's do llama. Maybe it would be better to actually start it up from from the terminal. Llama server servar bonsai. So, does it reason by the way?
Does it reason?
I don't know, but maybe it's fine. So, it's rather fast. So it usually doesn't matter if it's reasoned or not. No, it doesn't reason. Okay.
Um, so the most annoying thing about llama CPP is that you have to set up the reasoning budget from uh from the command line, right? So that's how we do that. Have to do that. Hi.
Hello. I bonsai an AI system developed by Prism. How can I help you?
Okay. Can you uh prove theorems in SML?
Okay. Yes, I I mean it's I didn't mean literally you I Oh my god, I This is not what I meant. Okay, shut up.
Shut up. Holy [ __ ] It's dumb. Um, so all right. Can we can we start over, please? Can we start over? I'm going to set the system message. Respond respond with short and concise uh messages.
All right. Uh, hi.
Can you assist? Okay, so it's a short message. Can Okay, let's rephrase it.
Let's not confuse our autistic child. So is it possible? Is it possible to prove theoreance in SML?
Okay. Provide a simple example please.
I didn't think this is a smell.
I didn't think this is a smell.
This is in fact not I think I think I start to understand why Son likes this model.
Um, thank you.
You're welcome.
This is great.
Um, let's continue, shall we?
He tried his best. Yeah, understandable.
Um, I connected mine to open code in full a genetic mode. How does it perform? How does it perform? I hope it didn't delete your entire system. Was that I feel like I feel like it was kind of close to coke. It kind of confused SML with coke. And I suppose they are kind of similar like very close in embedded space, right? Very badly. Yeah, I can see that. Uh so I think they're kind of close in embedded space because coke for example implemented enocamel and a camel is related to sml so they're very close so I can see how it can confuse them. Um um all right so um I suppose we need to go back.
We are back. So on the break people told me that I have to do this upload thingy, right? So uh I think I Yeah. Yeah. So let's see what I have to do which is kind of which is kind of weird that I have to do it like that. So app load what is app though? It's a function.
Okay, this is interesting. So you apply ah look at that shed there is a function load that returns unit because it's provides a side effect and you and function apply applies an it's like a map but not really a map it's like for each you take a list. Oh my god this is so funny. Do you guys see what they did here? Do you guys see what they did here? They put all of the modules in a list and they for each it with load.
Load is not really a construction. Load is a function.
That is cool. That is very [ __ ] cool.
Anyways, so um 420 IQ mode. Yeah. Yeah.
Exactly. So sm file. So I suppose what I can do in here is probably load integer, right? So it loaded something, right? So then I can do to string and then I can do to string 60.
Thank you. Thank you so much. So that's that's kind of cool, right? So I can load in.
So you can actually do several of these things, but then you can sort of like contract them into a single thing in here. Um, all right. So we can do the following stuff. Do you have a pipe operator by the way? Do you have a pipe operator? Can I just uh 69 into ink? Is that something? Yeah, there's no I'm not even sure if it's support operators. I feel like yeah, maybe operators are not even supported.
But what we can do in here, we can do int to string uh a right. So that's what I do in here.
Uh then I'm going to send the function.
Something didn't work out. Something didn't work out. Then maybe I suspect because I supposed to do yeah cannot uh cannot access unit in before it has been loaded. Ah because I just send the function but I didn't reload the whole file. Okay. Okay. So that makes sense.
All right works. And I can do zero uh 01. Can I do it like that? Mhm. So I have to specifically put parentheses around it. And it did print something in here. I wonder if I do I have to do [ __ ] where I do print new line or do you have print alen? You don't have print alen.
So I have to explicitly do this kind of [ __ ] Right. So yeah, maybe there is some sort of a string concatenation. By the way, there must be some sort of a string concatenation.
So, SML mode XML mode there was a I need to open that HTML thing imaging though maybe I don't have to because I can always do something like there was a help and I'm looking for a string. Okay.
Uh yeah, that's weird. So string. Yeah. So this is what I'm looking for. Do you have concat? Uh, so search concat. Oh, that's great. It didn't [ __ ] work. I want my my HTML chats. I want my HTML.
So, share doc uh this stuff. MoSML lib index html. Maybe I already have a tab, but I think I kind of lost it. Uh, yeah.
So, let's close this one. So, string.
Mhm.
What do we have? So there's a conc cat which accepts a list and stuff like that. Is there something like print? Uh I remember there was a text io right there is a text io basic library basics library. Okay. So it's just like literally input output print by the way is from IO. Is there any other wait so the structure provides?
Uh-huh. input std in input out print.
Yeah, there is no really formatting in here, but nothing really stops us from just literally grabbing the whole thing.
Just print F C print.
Ah, it's not really that. So format not going to give us that useful information though there is a Unix stuff. So the module Unix is kind of interesting. Let's take a at Unix. Let's take a look at Unix. What do we have?
Oh, it's literally like a posics stuff.
So execute in environment. Wait asks the operating system to execute you can have knob. So there is a concatenation. Okay. So hello and I can probably do something like so you can have custom operators right so you you're telling me that you can oh okay I see how is it defined though so does that mean I can have a pipe operator does that mean I can have a pipe operator this is very important question so this the C stuff. Let's find shared mosl tools. Not really.
I think it's lib string signature. Mhm. This is just a signature. But do you have So this is UI. It's already compiled.
U Yeah, it's all compiled. [ __ ] But maybe we can find implementation of the string in original source code. Uh can we find a file with the name string XML? We can.
Let's take a look at it. It's a operator val OP equal op.
Fascinating. Uh so we can also try to maybe search specifically for kind of like a pipe operatorish thing and it's cannot find that.
So we can try to find find where op this is too much. It's not particularly useful.
Can I define the boundaries of the words? Okay. This is great. This is how we do that. This is how we define operators. Which raises a very interesting question. Uh yes. Oh, you can even define them like that.
Oh, this is great. Can I like really have a custom operator? Uh, I'm going to go into here. Uh, let me I don't really have to do that. So, it's going to be a function a.
You can't really do that. I usually define it as well. This is a Haskell.
What? What the [ __ ] are you talking about? The infix is not Oh, wait. It does have infix. Anyway, so there's a problem, a little bit of a problem in here. I type bar chat. I'm not even joking. Shift.
Who developed this mode?
I didn't ask for this [ __ ] F A and for now I'm going to just sum them up just to test things out.
out. Then I'm going to switch back to SML mode and I'm going to send it again to this thing. Oh, did it work? It didn't work. All right. Um, so that's very interesting. So, how did you suggest to do that? Infix fun.
Honestly, this doesn't make any sense to me. Uh, your message doesn't make any sense to me. because it's a single thing. Like what the [ __ ] are you even saying?
But um I suppose one thing we probably want to do in van Vim do that. By the way, speaking of Vim, um set FTSML But I mean it doesn't have an integration of like sending functions and [ __ ] like that. So no particular.
All right.
So uh maybe we need to do OP. Um I wonder Oh I I I found a way. Chat chat chat.
Listen listen. I type it like that and I just copy paste it. So that's that's how I can do that. Uh so in here I suppose so these values.
Mhm. So we can try to maybe Why did you modify that? So let's go back.
Do we have infix?
Okay. So there's some infix stuff. So I suppose you define it with infix 8. I suppose right infix 8 um operator like this right.
So this is how we do that. Then we need to do function yeah function um operator like this we accept x and f and we're applying f to x. All right. I suppose I also have to I don't even have to put Yeah, there should there's no need for all of this semic Oh, they don't put semicolons at the end of these things. So, the semicolons are not needed. Is that what you're trying to tell me? Oh, wow. All right. Anyway, so I'm going to try to send the whole thing. Uh, did it work? I didn't see it working, but I mean, I can copy paste it myself. Uh, yeah.
Semicolon Okay. So, do I have to do it like that then?
Okay. So, semicolon is needed in here.
And do I put it like that? Okay. So, can I now 68 increment?
[ __ ] finally. Okay, that's cool. So, now what I can do, I can pipe this [ __ ] like that.
Hell yeah, brother. Hell yeah. And yeah, it's kind of cool. But I mean, I'll still have to do this separate thing.
We can define our own print ln. Who said we can't do that? So, it's going to be s string. And effectively what we do is we just print s and print new line like so.
Who said we can't do that? Who said we can't? So, this is going to be print and yeah, it's basically it. There we go.
So, can I send this function? So, this is send the function uh emac. Shut the [ __ ] up. Send the function. Okay. So, I do Why you keep selecting shut? Shut the [ __ ] up. 01.
Boom. It did the thing. That is amazing.
So now what I want to do what I want to do now is effectively just call this thing like that right so I semicolon and stuff so a becomes b becomes a plus b that's it no separate variable is required as far as I can tell right so because it's a declarative language we can put some sort of a condition in here if a uh is less than 1 million. I wonder if I can do this kind of stuff in here then right then we do this stuff otherwise we return nothing so I suppose here we can put it like that so it's a recursive function is a tail recursive function by the way Chad I'm actually not sure I think it is I think it is a tail recursive function but maybe it is not can you see that that's uh I actually think so yeah but anyway is yeah you can't do that.
So send the function fib um 01 is this Fibonacci numbers.
>> That's pretty cool. So uh you can write imperative programs and I really like this kind of style of functional declarative programming where you can just have side effects right why not just allow to have side effects in your pure functional program it's convenient it's practical uh right so I really like that so I was also told that the entry point for the for the program is val uh underscore core, right? So that means I can actually do something like this. Uh, right. And then maybe I can do more main SML and it worked. But then it kind of Yeah, it kind of just like interprets everything and it's it's kind of weird.
So uh, let me close this stuff. Can I do MOSML C? All right. So it couldn't load this thing during the compilation, right? So if I comment it out, it tried to com it. Okay, it produced something, right? So we have UI and UO.
I suppose this is like a compiled interface file and compiled like object file. So then we have a.out which seems to be an executable. And by the way, it is marked as an executable. Let's take a look at what kind of file is that. It is.
Ah. Ah. It's a come. Ah, it's literally doing an Yeah.
It she bangs into this thing. Damn. Such a portable executable.
Imagine me handing you this executable and telling you run it and it Nice executable we've got there. Uh nice executable.
I suppose this is not a particularly expected path, right? So, but anyway, uh so what we're doing here and I I feel like it's not going to run properly.
Why didn't I have to load in in int compilation mode? But in a repel runtime mode, I had to excuse me.
So if I Okay, so if I try to just run it, it says you have to load it. But then it compiles just fine and it runs just fine.
Who developed this? Is what? How does that make any [ __ ] sense? How much time do I have? It's already two hours, chat. I'm already messing with this thing for 2 hours and we haven't done any uh ray lip speedrun but at least I can like actually have loops in here right so as you can see this is a loop this is condition so I can do recursively this kind of [ __ ] and I can see myself using this language for things right the fact that it has an integration with my SQL means that I can write a simple website in it right so some simple service some simple bot chatbot of some sort so it's kind of like There we go. Posgress posgress. Yep. Uh, so yeah, it's a serious language.
It's a [ __ ] serious language. So, how do you do dynamic stuff, right? FFI and everything. So, din. Uhhuh.
Look at that. Look at that. I'm clicking it. What's that? U dynamic linking with foreign function.
It is literally DL open chat chat.
Holy [ __ ] Structure din lip provides dynamic loading and calling of C functions using deal interface. A dynamic library is a collection of symbols, C variables, and F. So it can literally do FFI. That is insane. An ML value passed to or returned from a symbol has a type value as defined in S runtime ML values blah blah blah. The C function should use the macro. Oh, you must write a wrapper.
Yikes.
I thought they utilized something similar to libify where I could literally disgust disgusting. Uh so the function should use the macros defined there to access and produce a male values when it's literally like in a camel like it's literally like in a camel in the C function. Remember that the garbage collector may be activated whenever you allocate an ML value. Also remember that the garbage collector may move values from the young heap to the old one so that a C pointer u uh C pointing into ML heap may need to be updated. Use the push roots and pop roots macros uh to achieve this. Okay.
DL handle is a type of dynamic library.
Uh handle dynamic library sim. All right. So to create dynamic dynamically loadable library, assume file xyz.c contains your function. Okay, cool. To compile XYZ into XYZ O and then create a dynamic library XYZ do that, right? So it's on GCC you do the usual thing with position independent code and stuff like that. You get the thing. If O depends on another library, you may link that library blah blah blah blah blah blah.
Cool. So, DL open lip flag global doesn't really provide an example of a C function that can do this kind of thing. Uh so it they talk about using macros, right? So we talk about uh macros. So should use macros defined there. So what I'm thinking is uh in here chat we have includes right look at that and what was that ML values ML there we go here are ML values here they are so that's what you have to include in here uh yeah there's a lot of things so I think this is very similar to Okamel.
Okamel also has a very much Yeah, I remember. Okamel ML values.h.
Mhm.
Yeah, it's Yeah, it's literally a camel situation. It Oh my god, it's even the same file.
So you could write libify XML yourself theoretically. Yeah. Yeah, you could. But I mean, we don't really have time for that. It's Look at that.
It's it's literally the same file. So all of these ML systems, they basically kind of use the same file, but it's uh from a camel. So the copyright, this one doesn't even have any copyright. So this one uses the copyright of Enria, the developer of the of their camel.
Interesting. It's like down to the same comments, right? So look at that. I can even just grab this thing and search.
Maybe not for that but I can at least maybe search for this thing. Ah, it doesn't find. So they are not exactly uh right word for can we find them?
Yeah, there we go. So I can literally find the same lines in here at least. So but anyways um so one thing we can do by the way one thing we can do is in MOSML we could try to find anything that includes ML values.h or maybe just anything that refers do refers to ML values.h H there's quite a few things in here. Um yeah. Okay. So this is a runtime ins and everything. So examples. No not nothing in examples. But this file is very interesting. Look at that. This file is very interesting. So int of string. So I suppose int of string is a function.
It is.
Mhm. So ins Mhm. So I suppose yeah you define these kind of functions effectively right you define these kind of functions um and what I can do I think if it's that simple it shouldn't be that difficult if it's that simple it shouldn't be that difficult very profound statement I know a very profound statement uh so mainsl so we and try to do maybe let's literally call it ray liip ray lib c I'm going to include uh ml valuesh and we're going to do something like a value init um window we have to use a different name right so because we're going to be linking with uh ray lip so let's do sml init window right or maybe like ray lip init window so it's going to accept accept the value. How do you usually call the values?
Uh, so int Oh, it's it's basically s, but I mean I'm going to put accent here. So, and I'm going to include the stdio. Uh, right. So, just stdio.io that and I'm going to just print f the whole thing in here. So, what am I supposed to return?
I can return val long but is there any way for me to return something like val unit ml values do you have val uh val unit I can just return val unit I think I think like I'm literally guessing in here so yeah val unit if I try to compile the whole thing I'm pretty sure it is not going to compile gcc ray lib uh ray lib c and I'm supposed to use the share shared thing, right?
Where is my stuff? So, first I create O and then I link as shared, but I don't really have to do that. Uh, right. I can actually right away make it shared. Uh, you probably don't know that the author of the documentation, but you can literally do that. libra lib.so as so and uh so this is array lib and I can just say shared uh like this and it cannot find ml values which is rather expected. So what we can do is we can search for opt um mosml include I think right so it is an includes mosl include yeah let's also provide the full path uh moss ml can you see that okay uh is that because it's called include not include am I being silly yeah I'm being silly Okay, it's fine. I'm a little bit tired. All right, that is very cool. So, called object is not a function or a pointer. Why are you complaining about that? This is a macro.
So, all right, we got something like this in here. Something like this in here.
Called object is not a function or a point. Is that because if I do Well, yeah. Yeah. Yeah. So, I I'm not supposed to call it. I supposed to just do it like that. I see. Okay. So, I have to do that in a position independent style and I've got a saw library.
Okay, that's very cool. So, what's next?
So, I've got the SO file and then I can do DL open I suppose. Right. So, that's that's the stuff I can do. So essentially since I don't have to do this load when I compile stuff, I suppose I don't have to load this thing either, right? So I can just do din lib um din lib. But you know what's funny?
Let's just start up uh this thing.
Uh load din lib.
So din lib dl open I have to provide the string and flags and stuff like that.
All right. So the string is and we do have H.
Okay. So Emac doesn't automatically show but here is ray lib. So right. So stop autocompleting [ __ ] please. So flag what is a flag.
So I suppose it's a yeah let's do rtld lazy. And I suppose I will have to do something like then den RT RTL D lazy. So here is the funny thing.
It accepts not a tupole chat. Look at that. It accepts a structure.
So it's kind of like a named parameters in a sense.
It's kind of a named parameters. So I'm not 100% sure how to call that but maybe the way you call it you literally do something like this.
Let me try. So full equals 69. Is that a valid thing? Yes. So this is a valid thing. Yeah. K kW arguments. Yeah. KW arguments bar 420.
And did it work? Yeah, it did work. So now what I should be able to do is say lib then flags and then the last thing is going to be global not global. I don't not remember global uh if global is true then the library global symbols are made available for the okay I think I remember what it is global true uhhuh so and supposed to return me uh the handler so this is ray lib okay so what happened type clash expression of type a global did I [ __ ] up something. So, uh, yeah, I forgot something. Lib flag a single one.
Yeah. Yeah. So, I see what's going on.
All right. So, ray lib emac. Can you just not do that?
All right. We get a handle. So, now and this is a this is DL handle. It's actually DL handle. So, I have to search for the All right. Right. So if I do din lib uh dlim and this is ray lib and I'm looking for the symbol. What symbol did I put in there? It's a ray lib init window. I'm looking for that specific symbol. All right. So val init window.
I got a symbol init window symbol. All right. So and then I can call that symbol right. So I can essentially do din lib app app one. So that means I can just do something like init window and let's call it with unit because I don't even use its arguments.
Variable value polymorphism free type variable and top blah blah blah blah blah blah. What are you even [ __ ] talking about, bro?
Um, nothing happened by the way. So, uh, nothing really happened. So, that was weird. But maybe it didn't load this function whatsoever, right? So, maybe it didn't load anything. What if I provide like a random garbage in here? Okay, it throws an exception if you provide a garbage. Nice to know, right? So that means the fact that we managed to do that uh window it found it. It's just we didn't call it properly. Um right so app one sim handle and in here like I provide the sim handle and I'm supposed to actually provide something the most logical thing here I have to provide units. So applies the c function associated with symbol to argument one. Right? So the only thing you can do here is a symbol is is you know this thing uh init um meet window. Did I do it correctly or maybe I did something stupid?
Yeah, I don't know what's up with that.
Consent type I guess consent. Okay. So what if I provide like 69?
Yeah. doesn't and it says says the warning and stuff. Uh yeah, Ray lib. Oh, you know what happened also? I forgot to provide a new line in here.
And given that there's a little bit of like flushing going on in here, it might be kind of important. Okay, let's try to recompile the whole thing. Damn, I have to redo the whole setup in here. I have to do redo the whole setup in here which means that maybe I should retype it right. So let's actually type it in here. So we're loading an integer. We're loading din lab d lib. Right? So that's what we do. Uh lib array lib.
So let me find that thing in here. So that's one thing we did.
Um oh yeah we can actually like literally do it like that I think.
H. Is that the right thing to do? Oh, look at that. That's cool.
If I do it like that, is it going to work? So then V init window. Let me find init window.
Is that something I can do? I feel like it's something I can do.
So, and then it's just like I do init window, right? And if I do MOSML main SML.
All right.
It did things. Okay. Okay. It did things. If I put garbage in here, let me close this thing.
It throws an exception. So I can do [ __ ] like that. Great.
So din lib at one nothing.
[ __ ] yeah. [ __ ] you. Get it. Get it. So this is the message from ready the team.
Next thing we are going to include uh rail lib uh rail.h and we're going to call init window. But for now I'm going to hardcode stuff.
Hello from Moscow ML comrade.
So this is what we're going to do. Uh hello from Moscow ML comrade.
Um the buffering flushing ghost. Oh my god. Don't remind me. Please, please don't remind me. I I want to forget that as a as a nightmare. All right.
So, if I try to do GCC, right, it is not going to compile.
Let me grab this entire stuff and I'm going to create a make file. Uh, so lib rail lib.so, right? And it depends on ray. C. And in here, this is what we do.
So we are depending on mossml and also we are depending on opt rail lib and there was like a ray lip in there ray lib this thing and in here so this is just a lib actually uh include right so this is just an include and let's try to recompile the whole thing that was weird why didn't you find relie is that because I have to uh use quotes.
Maybe that's the reason.
Am I going crazy, chat? I think I am.
Ah, I see why. I hate make files. I hate make files. I hate make files. They're stupid. They're [ __ ] stupid. Okay.
All right. Cool. It compiled. Didn't require math, unfortunately. It didn't require linking by the way which is bad I think. So let me try to explicitly say that I want to link with ray lib A.
That's what I want to link with. Uh let's do B. Yeah. So it cannot find that which is understandable. Uh which means that I have to do this kind of thing.
So this is has to be L and lib.
All right. So it kind of linked uh can I see the dependencies? All right. So I linked all of that statically. And another thing I want to link with is actually math. It will need math. Um okay. So now if I do LDD it also [ __ ] [ __ ] where is the LDD? Yeah it also depends on math now. Great.
Very very good. Very very good. So in Ribbon scene here we're calling init window. This is awesome. I think this is absolutely awesome. And now let's do a most of them.
[ __ ] you. [ __ ] you. Can't close it back.
Bajing it's a abandoned project last update was five years ago it's written in C89 and I just run yeah I can you can write game in this thing by the way chats you can write game if you want to so we have to do now close this [ __ ] so but this is not great in my opinion because uh you have to you have to freaking um you know be able to assign and types and whatnot. So let's actually create something like function uh init window. So let's call this init window sim right.
So ra handle uh DLC rail leap handle uh right so this is a symbol and we're going to have init window which is going to accept uh integer then another integer another integer and the title which is going to be a string and it's not going to return anything. So in den we're going to do app we have to apply three of these things right so it's going to be that it's going to w h and title so that's what we have to do in here and as we initialize this entire thing uh right so I'm going to 800 by 600 and here um so hello from Moscow ML for real this time right so because we're assigning this thing in here uh So this is basically how we're going to be writing bindings. A lot of body plates. Yeah. So a lot of body plates. This is what happens when you don't use things like Librai. But I wouldn't expect using Libra for such an old uh thing from such an old thing. Okay. So yeah, I'm going to try to recompile everything. And I'm going to I wonder if it can also include like a O. So MOS uh MOSML, show me the help.
There's no asked. Can you just give me the help, mother flipper? All right, I want to remove this stuff and I want to compile moss mlc o main mainl.
Yeah. So none of that works in this mode, but that works. Okay. And main is perfect. So that means I can do main uh main uh main SML, right? So let's grab this compilation command and put it in here.
So I'm going to do make B and it recompiles all of them. So now we can run this entire thing. That's perfect.
That works.
But uh yeah, so the screen size and we didn't see the title either.
And then we didn't see the title either.
Excuse me. Um, so what we need to do in here, I suppose we need to have width, height, and title. So that raises the question how exactly we're going to do all of that.
So ML values.
Um, so let me take a look at ins, right?
So here's the FMT. And this is, by the way, probably a Okay. Okay. So there's a macro string value. All right. So string value. Hell you use that?
Are you [ __ ] serious, [ __ ] Um, okay.
Um, is there int value?
H.
What the [ __ ] is this [ __ ] I can't believe it's that easy.
All right, let's recompile everything.
Okay, it didn't crash at least, but it's kind of hard to tell if it did anything.
It's kind of hard to tell. But maybe one thing we can do, we can start looping.
Uh, right. So, can we just put something like loop um like this? So, semicolon here and like that. So, function loop equal loop. All right. So, just keep looping.
And it didn't loop because I forgot to call it.
That was the easiest cring integration in boilerplate FFI language I've ever seen. Usually strings are pain but it's just it just supports them right. So you can call string val and it just gives you an ultimate string. You just pass it to to C code. It's fine. Uh okay so let's implement another one value rel uh window should close uh right close and I suppose we have to accept at least unit right uh unit which we're going to ignore right um void unit and ml values uh bull oh okay so the well true or Not. So if window should uh should close if window should close uh we I suppose return value true otherwise otherwise return value false. You can even automatically probably generate all that stuff and sml maybe you can ask a clunker.
Uh yeah maybe we can ask bonsai to do that.
Can we ask Bonsai to do it? Will it?
Yeah. So maybe it will be able to do that. Uh does have unsigned integers? I don't know.
But anyways, so initial symbol window uh should close.
Mhm.
Window should close. There we go. And we have to Okay. window should close.
Um, yeah, we use window should close symbol.
This one accepts unit. This one accepts unit but returns a boolean. I hope that works properly.
Um, okay. So, yeah, essentially in here we can do the following thing. Uh if window should close then nothing otherwise keep looping something like that I suppose. Uh I wonder if you can have like there is a while loops you can probably do that with while loops. Um I remember seeing that in the Wikipedia article about standard ML.
Where was the while loop? Where was the while? Yeah, there you go. You can do [ __ ] like that. Which means we can try to do like while not or so this is dreferencing as far as I know, right? This is the referencing.
So I feel like not is the thing, but it could be just a function by the way.
Yeah, it's a function. So it's totally fine. By the way, we have pipe operator, right? So we have a pipe operator. So which means that we can do window should close and we pipe it to not right while window should not close we keep doing something I don't [ __ ] know what we keep doing but we keep doing something and we do we do end or anything like that I suppose oh you can also have end and end is for the let right so there's like a let blocks and whatnot So you can have let this be a little bit complicated but that's I guess fine. You know what I don't like it. I kind of like uh the declarative functional style. I think it's a little bit more you know expressive.
Okay. So let me try to uh recompile the whole thing. So what does it say? Yeah.
So it's actually uh app one. So the error messages are not bad. Uh I kind of like them. So they kind of they remind me of Campbell. Uh so and very close to a camel stuff. But this this one is not enough actually. We need to call begin drawing and end drawing in the body, right? Otherwise it may actually like a busy loop very like hardcore because you know it does a lot of stuff in begin drawing and end drawing. Uh begin um drawing drawing and then end drawing. So this is what we need to do. Okay. So let's try to generate bindings in here. Let's try to generate bindings. How can we instruct a clunker to generate bindings? Okay. So respond with short and concise. I can I can put that in the system prompt. Right. So yeah, we have that. We have that. Okay.
So this is SML, right? So this is SML and this is a main XML.
Let's go. Yeah, we're going to try to do bonsai. Uh, and we have C, right? So we have C and ray lib C. All right. Okay.
So generate uh bindings for generate SML bindings for ray lip lip functions.
Uh what do we need? Begin drawing.
Uh end drawing. End drawing. Close window. Close window. I could also ask maybe for clear background but I'm not sure if I'll be able to do uh the proper thing with the with the structures right because this thing kind of accepts structures uh right so would it be sufficient would it be sufficient uh ray li I think it would be sufficient okay so let me go soon.
Llama uh llama bonsai soai.
So, but bonsai is the dumbest model available out there. So, it's probably going to fail spectacularly, right? But we'll see see how it goes. Uh all right.
So, uh respond with shirts. Um, no. I could I think there was a settings somewhere.
Oh, yeah. Respond with short size messages. Okay. Save settings.
Um, SML bindings for RA functions.
All right. So, I think this should be enough for it to figure it out. Let's go.
Okay. Okay. Okay. It's doing it's doing things.
Mhm.
Mhm.
So this is so far functions that we already have.
What exactly are you supposed to use it for? chat generating bindings is the simplest task even GP I think GPT2 can even do that I'm not sure but I feel like GPT2 can do that uh but come on and I don't [ __ ] know I'm just bad at prompting okay I'm pulling the lever of a slot machine let's try one more Maybe it's just a fluke. Who knows?
I'm I'm pretty sure it's not going to be able to do that.
All right, [ __ ] off. It's useless. It's [ __ ] useless. We can ask a better clanker. Uh Duck AI.
Uh which one we going to be using? GPT5.
Now look, look how it's done by professionals. No, stop. Stop. I forgot. I forget. Make no mistakes.
Uh, right. Respond with short and concise messages.
Uh, generate for functions. Okay. Make no mistakes. Don't forget make no mistakes. All right.
Let's go.
Pressing the fingers.
Now we're [ __ ] talking. Now we're [ __ ] talking. Oh.
All right. That's cute. That That's very cute. All right. So that saved us some time. Uh it didn't Okay, it didn't print the ones that I provided. So it only printed the new ones. So I can actually copy paste them. Okay. So that's great.
Um, yeah. So, that's how it's supposed to be done by professional LLMs.
Uh, I'm going to copy paste this thing in here. Color past. Okay. Okay. Okay.
So, and this one also goes in here.
Where is my Where is my C code? Uhhuh. Cool.
So, now uh we can try to do some things in here. So, begin drawing. All right.
And drawing. Uh, end drawing. By the way, does SML support the um, hexadimal?
Holy [ __ ] it does. That's perfect. Uh, so clear background and FF 0000 FF.
Something like that. So, we should be able to do that. I wonder if we can do [ __ ] like this. It kind of looks like a proper programming language. Uh, we don't really need that stuff anymore.
And um, so this is SML wrappers.
I think I wait I forgot these things as well. SML symbols.
No, I didn't forget them. Yeah. So, essentially what I should have done, I should have put them in here. Uh, and it aligned them with a weird stuff.
Why did you Now I have to double check the C part.
[ __ ] clanker. I swear to God. Get clanked on. It's not It's not that critical, right? So I suppose it's not that critical, but it's kind of funny. It's kind of kind of stupid mistake. Stupid [ __ ] mistakes, man.
Uh, align equals we go. I wonder if I can do something like that even chat.
What do you guys think? Just align stuff like that. And just align equals. Look at that. Isn't that cool? It looks cool.
Looks cool. Uh, and um, yeah.
So, let's try to compile the whole thing. And, uh, yeah, it didn't [ __ ] work. Is that because of Yeah, there we go. And now it didn't work. Uh, but I can try to close it.
I'm an idiot.
I supposed to put so nothing in here then this thing in here and then I have to loop inside of this thing. So that's how we're supposed to do that. Yeah. So if window should close then you exit otherwise you do that. So that's what you're supposed to do. All right. Make B uh and boom can close that.
So rect uh draw rectangle.
All right. So draw rectangle.
So now put that in here.
And for the C part uh yeah it's more or less correct I suppose. Uh array lip like that.
And in here. So yeah, this is how we do that. I'm going to I suppose 80 80 draw rectangle and it's going to be zero. I suppose I have to do like a 0 0 100 200. The color is going to be let's do green like this.
Right. And now let's try to execute that.
All right. And it didn't [ __ ] work.
I'm surprised. Why did I not recompile everything properly?
Ha is in here.
Ah, this is because the clanker clanker just Okay, I honestly don't like it. I don't like that it did it this way. Right. So, yeah. So, it did it. So, when you do the hexadesimal a uh this is the kind of confusion that in win API they introduced because they want you to do that. It's literally like thinking like a Microsoft employee because they literally did the same thing in Win API. They fed too much MS like you know Microsoft Win API stuff into it.
All right. So and maybe instead of doing that uh we could have simplified it. Uh okay.
So you can do something like that. So XYZ and instead of the color stuff instead of the color stuff uh just do it like that.
Mhm.
Um okay. Maybe we can instruct it to not do that. Uh okay. Um, when you pass colors, don't do don't shuffle the components components.
Just pass the integers as is. Can can you see what I'm typing in there? Right.
And then uh like this uh C uh understood.
Okay.
Okay. Cool. So now if I try to do the following thing, right? So this is going to be like that. And doesn't compile.
Why doesn't it compile?
H.
So because it was un Oh [ __ ] It was actually unsigned.
Signed in.
All right. And this was a cola.
What was the previous code?
Inval.
Yeah. So, we have to take a pointer and do something like that. Yeah, that's what we have to do. So, the same goes here.
Can I modify the uh previous message in here?
Yeah, I can. This is great. Okay.
So, caller and then I can use get caller. No, go away.
Uh, all right.
So, let me double check. Yeah, works.
Need to modify this message.
Okay.
So that's pretty cool.
Yeah. And here is the interesting thing.
Yeah. Why coding right now? So we can have some sort of a position in here. X integers uh Y integer, right? And we can render that rectangle at X and Y. And then as we loop, we can increment it by one. Look at that declarative style programming. Look at that declarative.
And it doesn't [ __ ] work because you have to start from somewhere.
That was fast. Uh we need to set the target FPS. Set target FPS.
Mhm.
So then I'm going to copy paste it in here and copy paste this thing in here.
And so uh as far as I know you set target FPS um like in here somewhere, right?
Yeah. So now it's actually moving much slower. It's actually moving much slower. Uh so draw circle draw circle and so that's the thing and for the C part uh where is the rad okay so and the draw circle is just like this so instead of draw rectangle just do X Y the radius let's say radius is going to be 200. And the tint, let's pick maybe blue this time.
Let's pick maybe blue this time. It didn't like something.
H type clash expression type. Okay. XY int uh five. Why did you put five in here?
get clanked on. I just got clanked on, chat.
Literally got clanked on. So, there's like this small little mistake in here.
It's kind of funny. Uh, but anyway, so this is going to be 50/50. Uh, right.
So, something like that.
That's pretty cool. So, is it really red? So, how can I make it blue? Let's make it blue.
Let's make it blue. All right.
That's pretty cool. I want to actually make it maybe bright blue. Maybe even brighter. So something like 15. There we go.
Something like that. Uh thank you R baiting your compiler. Um so it should be app 4 not app five.
Understood.
Wait a second.
What the [ __ ] Sam.
Sam Alman. What the [ __ ] I said make no mistake and it did a mistake.
Is this what the RAM prices are for?
Really, was it worth it?
Um, didn't threaten his family. Rookie mistake.
I forgot to threaten his family. Uh, so yeah, understood. Uh, I said I said make no mistake.
Another another another mistake and a kitten will die.
Understood.
There we go. That's what I'm talking about. That's what I'm [ __ ] talking about. All right. Uh, so, um, yeah, it's pretty cool. Um, so what we're going to be doing, so we can maybe actually make it bounce around the edges and stuff like that.
Amazing. Can't believe it works. I mean, yeah, that's that's the magic of prompting. If it doesn't work for you, you're just not prompting it, right?
It can't be that stupid. You're just not prompting it, right? Okay. So, let me see. We can actually maybe assign some sort of a velocity velocity though. We can have like a floating point stuff.
Does it have a floating point by the way? So, five. Oh, yeah. It has real.
Um, so there was a get frame time. Get frame time.
All right.
So this is a get frame time and array lip c and get frame time. It uses float and it's camel copy double.
What the [ __ ] are you doing? Camel cop.
What? Wait a second. Did I get clanked on?
I'm I'm going to copy paste it. Okay, I'm going to copy paste it. I'm going to try to comp. I feel like I get got clanked on literally. Oh, and by the way, I accidentally copy pasted like includes and everything. So, this is what happens when you bite code.
[ __ ] It confused SML and a camel. It confused SML and the camel.
Okay, [ __ ] You asked for it. You [ __ ] asked for it.
Well, you know, you know what that means?
You literally just killed one kitten.
I think I overwhelmed it a little bit.
It's It's There's There's no camel pram one either. Is there no There's no camel param either. And I think I overwhelmed it a little bit.
SML. I I think I explicitly said that it is SML, right? I think I explicitly told it that it Yeah, SML. Uh yeah, maybe it forgot. Maybe it's just like um well started to forget things.
Can't debug five lines of code. Yeah. So essentially, uh how can we do that without the clunker? Um so ML values um real Um, so they're called real, right? So they're called real. There's a real code. H, so there's a int value. We have things like int value, but I do not see anything related to real. Uh, maybe there's something with floats. Okay, there's a double. It is all of that is double, right? So we just operate on the level of doubles in here. So reals are doubles. It there's no floats. 32 bit floats, unfortunately.
Okay. So what I suppose we have to do is maybe just that I think it is just that.
Mhm. It is just that but it's we taken yeah double value. This one is funny because we take it as a as a pointer.
H I want to see how it is used within the codebase. Let me let me see super quick. So third patch how do you use that? Is there any examples of how you use that within the codebase?
Um okay. Ah it's extracting the Yeah. So you are converting. Yeah. I'm being a little bit silly right now. I'm sorry chat. Uh ML value.
So double value.
Mhm.
How do you I'm I'm don't understand. I think I'm already tired. The clanker actually killed me. Copy double. You think it's a copy double? There's no copy double in here. Just give me a second, chat. Calm down. Calm down. Calm down. So, there was a val. There are things like V. Yeah. So, there should be val double. V double or Yeah. There is a val long long. Is there a val real? [ __ ] So there's none of that stuff.
Val HP. I'm not quite sure. So val boolean val unit, but there is no I just don't see it. While float.
There's no well float. I already tried that. There's no wall float. There's no wall double. There is no well real. None of that doesn't exist. You can extract double, right? You can extract double out of the value, but constructing double back. So, okay, there is um this one is interesting. You can store double val. You can store double wall. Okay.
So, let's call double t. It's kind of interesting. So, T is a float and double TT is TT.
It's very funny. I know Chad. But then if I want to create a value, right?
So can I just have so I have a union by the way uh latituncher.
Uh can I store okay let me see how it is used within the code base.
So show me some examples. I'm pretty pretty sure there's some examples that Mhm. Okay. Okay, there's something like this. Okay, that's cool. This is a elaborated example. I do not really like it.
So, there's that. Okay. Okay.
All right. That is very cool. So, there's also push roots. Oh, you So, for the garbage collector sake, you also have to be very careful in here. Yeah.
Yeah. Yeah. Okay. So, you have a value, you allocate a string of eight bytes, and you What?
Really? Is that how you do that? I can't believe that [ __ ] What the [ __ ] Wait.
So, value results. Okay. Then I allocate a string of eight bytes exactly 64-bit integers. Okay. Then I store double value into that result and that double value is TT right and then I suppose I return that result right so do you where is yeah yeah yeah so it is al string is like a alloc like aloc malik yeah so it is more like malo so yeah um as you can see clankers didn't take our job today They didn't take our job today. So if you want to have job security, program in SML. None of the clankers really know SML that well. So you have a job security.
So that's my advice for you. People always ask me like how do I survive in the age of AI? Program in obscure languages that nobody programs. So even clankers don't know how to program in them.
Do you think even people know how to code in the mail? Well, I mean I am coding in the mail right now. So kind of kind of I guess so doesn't really matter.
Okay. Uh let me see. Uh so AL [ __ ] this is something internal. I have a strange feeling that this is something internal. [ __ ] So values aloc string is not available in here but we have shon of other headers in here.
What if it exists in some of them look at that look at that. Okay.
Uh so alloc.h H um okay so and so loop yeah is supposed to accept dx uh dy by the way I well this is real right so all this real all of that is real real right so this is basically real we're going into the realm of you know floats I'm not super happy about it that means we we got to do a lot of conversions. Let's not do that. [ __ ] doubles. At least we learned how to return doubles, right? So, at least we kind of learned how to do that. This is not what I want. I'm sorry. Uh, right.
But we don't really need them. Though, I would like to maybe see if get frame returns anything useful. So, we can try to do something like this. So, a get frame. Uh, right. So, by the way, you can do [ __ ] like So, we can do [ __ ] like that. Then, uh we can How do I convert real? Um, right.
So, can I do load real? All right. Real to string 69420.
I guess it correctly. So, um, real to string and then I just print the whole thing.
So that's what we're doing. This is kind of stupid to do it like that. Usually you probably want to do it like that. So but I don't know. Um Okay. So something didn't work in here. Uh so this is a dx dy dx dx dy.
Okay. And it does look like the um delta time, right? So for 64 bits and what annoys me about this [ __ ] is that it allocates a small object on each frame. But at the same time it allocates it within its garbage collection system. So maybe it's fine. But in any case this is not what we're going to be using here anyway. So who cares? So the thing I want to do uh the thing I want to do so here's the radius. Uh right. So can I just have a radius in here which is a value radius integer 50. So then when I'm allocating this entire stuff. So this is going to be radius multiply by two. So it kind of starts with a little bit of a padding.
So then if I modify uh the radius make it like 100 right it looks like this. Okay. So get screen width and get screen uh height.
I should have not threatened it. I I should have not threatened it. Can I Can I remove a chain? Um so in llama CPP there is a way to like you know prune the whole chain of conversation and fork in another one and it's rather convenient when the clanker gets stuck in a like a really weird place and I just like I want to have this in here. Llama CPP interface is actually way better than duck ducki.
Thank you so much for all the subs by the way. Thank you so much for all the subs. Uh yeah so pass by. Okay. So you you are the only sub in here. Well, I mean at least this part is useful, right? So at least this part is useful.
So we're going to copy paste that at least.
Um um right.
So please get rid of camel programs.
Um, we are programming in SML, not a comma.
Yeah, this is what I wanted. I think definitely should have not threatened it. So, I wonder if I can literally just inline it, but I feel like So, val int. So, it's a val long long.
Yeah.
Well, I mean technically I think I can align it, right? So it will do that then transform this entire thing. I think it would be fine. Actually we can inline it like that. H All right.
So we can have get uh get width and get height. And uh so the question here is uh how can I have let Let me see.
So this is how you do let bindings. You do let and you do values and stuff like that. So what that means I can do let value w get screen width. Right. So then no separation value h get screen height.
Okay. And then in and something like that. I wonder if I put this stuff in here. Oh, it wants to. Yeah, let's actually put platinum here. So now we're supposed to have this W uh W and H inside of this entire thing. So which is rather convenient. So we can even have the time in here, but we decided that we're not going to be using the time.
So as we move this thing uh like that um interestingly we can also compute things like next x which is x + dx and next y which is y + dy. So this declarative style is actually going to be kind of cool. Um right. So I'm going to align this entire stuff and x and n y.
So yeah and now we need a way to check whether we are colliding with anything.
Um so colliding with the walls for instance with the walls. Uh so what I'm thinking it's more of a it has to be more of a sequential thing. So I'm not quite sure how exactly to approach this because the usually way I collide it. first check x like horizontal stuff and then check y.
So, uh here all of that stuff is declarative. So, it's kind of difficult to do it like that.
So, I'm not kind of sure.
I'm not kind of sure, but maybe I can just overwrite things. I kind of like the syntax. It's kind of cool, right?
So, a camel is inspired by it. Oh, there is also tagged unions by the way. Data type you can do [ __ ] like that. So, and it's an old language by the way. It's a language from 1983. So, 43 years ago.
So, all of this stuff that you see in Rust is very old ideas like a almost half of a century, half of a century old, right? So, all of this we don't really have that many new ideas in programming languages to be fair.
uh draw circle V and stuff. No, draw circle V is goes into floats. Uh and you saw how we deal with floats. It's it's a pain. I don't want to do that. Uh but anyway, so here is a new stuff. So the the usual way I do that, right, is basically I take nx and y and uh collides with walls with walls. Uh and in here I can also probably call WH, right? So because this is width and height. Um all right. And if it collides with walls, I do not assign this thing.
Yeah, the imperative style is just much better for for this kind of stuff.
No new ideas borrow check. Well, not that many, right? So I didn't say no. I think I didn't say no. No new ideas. Not that many. That's what I meant at least.
Maybe I misspoke.
You're missing the end. Maybe maybe I do miss the end. And by the way, if I if I use the end, I suppose I don't need this parenthesis anymore, right?
Uh but with the end, it just like looks a little bit better. So in here, I can probably The indentation here is a little bit too much. Oh [ __ ] I forgot the semicolon.
Spend three hours debugging.
Yeah, the I don't like this indentation.
You can totally do monets in in SML.
Well, you don't need monets. You can just program in a normal imperative language. So, you didn't need that [ __ ] Um, so if it collides with walls, right?
Then we have to update dx dy.
We can just do this stuff simultaneously. Okay.
Um, I feel like if we simultaneously do this kind of [ __ ] I'm actually confused, chat. Like, how do you do that in a in a declarative style? The thing that I usually do in imperative style, how do you even do that in a declarative style?
Because in an imperative style, maybe I should just write it down in imperative style and maybe I'll get some ideas, right?
So I'm going to do C mode.
So essentially you have XY DX dy right and there are variables they're modifiable and so on and so forth. Nothing particularly special in here. So you construct nx which is x + dx right then you take a vector n x and old y right old y and you check collides with walls right collides with walls. you provide W and H and you also have W and H in here that represent the walls, right? If it collides with the walls, uh what you do is that you switch the direction of the velocity. If the you don't collide that uh new x becomes the new x, right? This kind of the idea. If by moving in that direction you start colliding with walls, we don't make a step in that direction. instead we're switching the velocity and we're repeating the same thing for y and this idea is very much imperative right so and I don't really understand how to express this idea in a declarative style of uh sml and I'm not quite quite sure why so here I'm using potentially new uh x right so here's the thing so the problem uh here is that this x might might be old X or new X depending on what happened in here. So as you can see they kind of chain together. They kind of chain together.
So, and to make them not chain together, I suppose, well, you have a recursive call, right?
You have a recursive call um where you have x y dx dy, right? So, that's what you have.
And I suppose each of these things, they don't really have to honestly chain, right? They don't really have to chain. You might have always use an old X in here. Old X in here. And I feel like it would work.
Uh, and I feel like it would work. So, what you could have done, you could have put this ifs as expressions, as arguments in here, right? You could have literally checked okay collides with that uh then return that or that and that because of that and this is a very interesting thing. I feel like this entire condition should return a pair x dx.
So this is a very profound observation actually because what we're doing in here we have to pass them like this. So we have x position x and dx like that right and it's a it's a single argument right so the horizontal position and horizontal velocity is a single argument it is a single argument and the same for the vertical position and vertical velocity uh like that so I never done it like that but I feel like it may work right so you just like pass them slightly differently and now you can literally put these two conditions as arguments for the loop. So here's going to be if with some condition then returns one thing or returns another one. And here's another one. If then that else that. You see what I'm saying?
So essentially to make it declarative you put this if conditions inside of that loop call. Right? So and in here uh what we can do so we already have an X and stuff like that. uh collides with walls. I provide um new X but old Y uh and W and H. And if it does collide with the wall, um the result is going to be Mhm.
does collide with the wall. old X but reversed DX if it doesn't collide new X old DX I think I figured it out this is how we do the declarative check you see what I'm saying you see what I'm saying I think it may work it's just like the only problem that I had is I thought they have to chain with each other. As soon as I removed that constraint that this x is dependent on the previous thing and I just removed that dependency, it became actually uh possible to sort of express that declaratively.
So my problem was I actually put dependency between these things, right?
I should have actually made them independent.
Uh right. So and I I still need to implement collides with walls and stuff like that. But I mean already moving in the right direction. So yeah and because of that what I'm doing in here I'm actually calling it like this. So this is x position x velocity and then y position y velocity. So I'm passing two pairs not four arguments but two pairs.
So and that kind of works I think. So obviously it's not going to compile right. So yeah, because uh this is the Oh my god, it doesn't allow me to Are you for real?
H it didn't allow me to put a trailing comma. Uh but I mean for function goals, I guess it's fine. So negation. Uh the thing about negation is that as far as I know, you can do [ __ ] like that, right?
Yeah. So to negate the thing you have to use a different one. Yes. No.
Not quite sure. Okay. So if I have something like this and then um int to string.
Mhm. Okay. And then I print this string.
Negation isn't it? That's correct. Why does it print it like that though?
Is that to string implementation?
Add it to 69 to check. Okay, that's a good idea.
Okay. So I suppose not only you have to use tilda two string implementation also renders negative numbers with tilda.
Are you serious?
I'm not going to question that. So um all right. So let's try to compile that now. And collize with walls doesn't work. Okay. So that's understandable.
That's totally understandable. So fun.
And what do we have in here? So we have to have x uh y um w and h right so uh so and in here okay so we also need to know the radius right so without the radius we can't really tell uh but we already know the radius so because it's a global variable so it's totally fine so x minus radius x minus radius is greater than zero right g zero And I suppose it's and yeah, I guessed that X plus radius is a less.
Oh well, I mean this is kind of okay.
Is that less than that? Can I maybe put it like that? No.
No. and y - radius and y + radius h. I hope it's going to work, but I feel like it may [ __ ] up at some point. It doesn't allow me to to do things. Okay, so yeah, it doesn't like something in here. I swear to God, I have to wrap this mother flippers in parenthesis just like in Pascal or something.
Don't tell me I have to. What do I want?
What does it say? Syntax error.
Okay. So if I remove that.
Okay.
Okay.
What about end and this?
Why couldn't I chain those things together?
and is and also and is keyword chat.
All right. So, okamo logical and I'm going to ban everyone. I'm about to ban everyone now.
Okay. SML logical operators.
Just a simple example, mate. Man, just a simple example. OP and and also it's to signify that it is short circuiting. Right? Did I understand that correctly?
I ran out of folder anyway. So, Jesus Christ, man.
Okay. Doesn't work, by the way.
Um, I wonder why, though.
So, if it collides with the walls, we're using the old one and the X otherwise.
All right. So it's the opposite by the way. Do we have not? Uh yeah, we can do something like that. Yeah, let's make it faster. Uh so where is the radius?
Radius. Radius. I said that.
Can I define things out of order? I hope I can. So velocity and uh velocity is going to be two. All right. So it's going to be velocity.
Velocity. Boom. A [ __ ] Stinky boomer language doesn't allow me to define [ __ ] out of order. Oh my god.
All right, so let's make it even faster.
Let's make it four. I want it to actually go quicker. Boom.
Fully declarative, mother flippers.
Fully declarative.
That's pretty cool. Uh, none of that stateful [ __ ] None of that stateful [ __ ] Would be kind of cool if you could also change the color on each collision.
You know what I'm saying? But that's more difficult in my opinion. That's more difficult because collision may occur here and here. So how do you change the color in that specific case?
Like how do you detect that?
I don't know. I don't know.
Fully declarative looks inside code. But the logic I'm not talking about the rendering. The logic is fully declarative. So that's it's kind of cool. Uh so let's make it even faster.
Yeah, boy.
So, yeah, this language is useful. This language is useful. So, you can relatively easy interact with the C code. Um, yeah, it's cool.
So, I would use it for something, right?
So, my the first version of my chatbot was actually written in Haskell. I kind of got disappointed with Haskell, right?
So the tooling around H hasll sucked and also the language itself was a little bit analying.
Um, I can see myself implementing my boat in in SML, right? Specifically Moscow ML because it's actually like it's a very small low dependency thing, right? So the entire archive if you take a look at it. Uh, so what's the size of this archive?
Right, it's a 7 megabytes. That's that's the entire distribution of this thing and it's self-contained. And on top of that, it can interact with C code if you provide the wrappers and stuff like that. uh and it's functional, it's declarative and stuff like that. I can see using that for some I kind of want to write like a small service uh in this thing. So it already comes with bindings for Postgress for MySQL. So that means it can have a database and stuff. So yeah, do you like it better than Erlink?
Earlink is kind of slow for me. I don't know. And it's kind of clunky and everything. Maybe for scripting. Yeah, maybe for scripting. I also don't know how fast this thing is. Obviously, it's not native. It compiles down to this bite code and bite code I suppose in this interpreted. Is it jitted? Is it uh you know just in time compiled or something? Um yeah, based beam style stream maybe maybe I'll think about that. Right. So something like a small service that we can host on your mom. Uh right that serves something. Yeah, that's a cool idea. I think I think I discovered the gem. I really like Moscow ML. It's It's pretty cool. It's really cool.
So yeah. So for how long were you streaming? I was streaming for more than three hours. So but I think it was worth it, right? So it was fun. Uh yeah, it was definitely fun. Uh all right, that's it for today.
Thanks everyone who's watching right now. Really appreciate that. Have a good one and I see you all on the next recreation program session with I missed. I love you all.
Related Videos
Agentforce NOW AMA: Build with React and Salesforce Multi-Framework
SalesforceDevs
490 views•2026-05-28
How agent o11y differs from traditional o11y — Phil Hetzel, Braintrust
aiDotEngineer
450 views•2026-05-28
Re: 🗣️📍theprophedu📍2026 GST 103 CLASS (E-EXAM REVISION)
theprophedu
636 views•2026-06-04
WEB TECHNOLOGIES UNIT-2 | Degree 4th sem BCOM Computers web technologies unit-2 full explanation💯✅
LearnwithSahera
1K views•2026-05-29
More tests are always better? How to use AI to identify tests that bring little value
Alliance4Qualification
335 views•2026-05-29
Search Algorithms Explained in 60 Seconds! 🤖💨
samarthtuliofficial
218 views•2026-06-01
People of Game of Thrones using JavaScript DOM
AltCampus
296 views•2026-05-30
Instagram accounts got PWNed
EricParker
13K views•2026-06-03











