Become a Creator today!Start creating today - Share your story with the world!
Start for free
00:00:00
00:00:01
#85 Clojure Dart Duo: Christophe and Baptiste image

#85 Clojure Dart Duo: Christophe and Baptiste

defn
Avatar
23 Plays2 years ago
Christophe (clojure) Grand (master) and Baptiste share the behind scenes of Clojure Dart project. Check it out on: https://github.com/Tensegritics/ClojureDart
Transcript

Introduction of Guests

00:00:15
Speaker
Welcome to Deaf and all the way from France. Christophe, long time friend. I mean, as old as closure, I think. Yes. He's in the closure since the beginning of the closure, the genesis and then Baptiste that I don't know much about. So I think I know everything about Christophe. I don't know anything about Baptiste. So I think we can wrap it up. This is the baptism of fire.
00:00:42
Speaker
So,

Christophe's Closure Journey

00:00:43
Speaker
welcome. So maybe a little bit of introduction, right? So you guys choose who wants to, you know, tell a little bit about yourself and then get us into the into the projects later. Go ahead, Christophe. You're the oldest. Priority to the... Just before being to this, you know.
00:01:07
Speaker
Don't don't reveal it. People are not seeing the video. Nobody knows who is older here. OK, so I've been part of the community since almost the beginning. I stumbled on the long wage when it was something like three months old. And since then, I've been more or less a member of the community.
00:01:37
Speaker
And I've been working exclusively in Closure for at least 10 years. I don't count, but at least 10 years.

Development of Closure Literature

00:01:50
Speaker
And I've co-sold a long time ago a book, I thought already on Closure. It was the first book, I thought really, who break, rather who broke the
00:02:06
Speaker
the OLE mantra, no list book. Is that true? There was no mantra saying no list books? Yeah, because basically the reasoning was that there were already many list books of quality and they didn't solve them. So OLE was actually saying you knew list books at the time.
00:02:33
Speaker
But closure was not quite the least. It was a scheme and common list. So you're like a close, pop a closure and you just snuck it in there. It was not me directly because the, I got the, the job sold on the first, first also sold the project to, to, to already,
00:03:00
Speaker
Then he find that it was too much for itself. He asked Chasseme Rick to join. Then the original also departed to another thing. So Chasseme had to join. So really it was a sad, sad, sad, sad thing. But anyway, I was, I wasn't involved in a,
00:03:27
Speaker
getting the food stuck into the door for following. And yeah, and for now, about three years, I've been working with Baptiste.

Baptiste Discovers Closure

00:03:42
Speaker
We have been pairing on most projects and a bit more than two years ago, Baptiste started to wonder about creating the
00:03:54
Speaker
a new list for coding mobile, but then I believe that he is going to pick the story from there and maybe introduce himself to me.
00:04:05
Speaker
Yeah, and you believed I was crazy also. I still do. I'm basically a classical software engineer. I started here in Paris for French startups.
00:04:30
Speaker
doing a boring JavaScript and PHP. So something like six, seven years ago, I was asking myself if this job worked for me because I lost the love, basically.
00:04:49
Speaker
And I discovered closure thanks to Uncle Bob, a video of Uncle Bob.

Collaboration on Project Portkey

00:04:59
Speaker
And once I tried, I took, I think it was something like three months live. And since then, I tried to almost work exclusively in closure.
00:05:15
Speaker
We, because the community is so small here in France, uh, I rapidly met everyone. Um, thanks to, uh, Irama, which is, uh, the main organizer, the meetup here in Paris. Um, and then later on I, uh, I met Christophe, uh, for a project he wrote, uh, Portkey. I don't know if you've heard about it.
00:05:44
Speaker
Anyway, we worked together on Portkey and from there it was a love story.

ClosureDart Project Overview

00:05:57
Speaker
Fraternity.
00:06:00
Speaker
Yeah, but already I prefer. Brotherly love, you mean. I think we started the building together because we...
00:06:15
Speaker
I think we forgot to, at least I forgot to say that I also was an independent programmer, even before a closure, before my encounter rates closure. We started three years ago with Christophe to build a project together and it worked well. And then right around the first COVID,
00:06:44
Speaker
the first lockdown here in France. I was really motivated to try some tiny lists and it ends up being a little bigger. That's basically how ClosureDart started.
00:07:05
Speaker
Yeah, because Christophe, as I know, you mean you have been in closure forever, as you said from the beginning. And then mostly you're working on the JVM side, right? If I remember correctly. So go ahead.

Technical Development of ClosureDart

00:07:20
Speaker
I don't know why I was just going to say that I've done some closure script, but for client work, new open source
00:07:31
Speaker
Yeah, yeah. Because I mean, there was a lot of contributions from you into the core and you did plenty of projects around closure. Then how did you think about getting into it? Let's talk about the biggest project that you guys are working on right now. I mean, if we go through all your projects, Christophe, I think we need like 10 series of talking about every possible thing. So let's start with the hard topic, as they say. How, why and how did you
00:07:58
Speaker
you know, think about picking up closure on Dart. Like, what was the motivation?
00:08:04
Speaker
Maybe that's for Baptiste, because he started it, you know? Yeah, quickly before Christophe answers. So I personally always wanted to implement a small Lisp, specifically on mobile devices, because I thought that
00:08:31
Speaker
React Native, I had experience with React Native and it was very painful for me. And anyway, I just wanted to learn how to implement a small list.
00:08:48
Speaker
What was the question again? For me, it was a learning experience. That's about it. Learning something. And when I talked about it to Christophe, he doesn't care about writing a small list because it's so easy, everyone can do.
00:09:12
Speaker
It's for him. Right. But writing a closure is a step above. So yeah. But why did you choose Dart, for instance, or like the other obvious target is TypeScript. So, you know, why would you go with Dart? Well, we already have JavaScript, so that's covered. So you want to do something new, let's say, but why would you go with Dart rather than TypeScript or
00:09:41
Speaker
or camel or something like that, you know, I was really impressed by, um, the dot VM and ecosystem and basically rich, uh, they, that reaches, uh, mobile, uh, desktop applications, even backend. Uh, I was also impressed by the auto-reloading experience.
00:10:08
Speaker
And also I heard people in the closure community talked about it. So there were...
00:10:23
Speaker
I'm very bad at names, and it's very embarrassing. Don't worry about it. David Nolan. David? David Nolan. Yeah, but he's not the only one. Mike Fikes. Maybe Mike Fikes. Anyway... You know who you are. Yeah, right. Work it out. We're not that big.
00:10:47
Speaker
And also, I looked a little bit also at the author of that. I mean, it was mainly impressive. And who wants to do Swift? Who wants to do... Cut clean. Cut clean, stuff like that. Yeah.
00:11:14
Speaker
But it is, so how is the, how is, because obviously as you mentioned, as you guys know already that we have this closure script ecosystem on top of JavaScript. So JavaScript is technically on mobile with all React Native and all this stuff. And if you switch to Dart, then that would mean that you're, you know, it's a new VM, new module structure, new compilation units, everything is new right now. So is it that different or compilation wise?
00:11:45
Speaker
Okay. So first, my point of view, that photo was not, were not on my radar at all until Betty started playing with the idea. And so I ignored what he was doing as usual.
00:12:10
Speaker
But over the next month... That was the reason why you fell in love with his work. He is ignoring me. You know this perception bias where once you start paying attention about something, you spot it everywhere. Yeah, exactly.
00:12:38
Speaker
I don't remember the name of it. Contamination bias. Contamination bias. So over the next months, I've heard or read several people. I trust seeing good things. I don't like that I don't. You did already. He so means me on a daily basis. I'm used to it.
00:13:06
Speaker
So, you mean you trust more? No, that's not bad. From judgment I trust. It's saying good things about either flutter or dart. And so, okay, okay, maybe Betis has some other point and I should pay better attention.
00:13:35
Speaker
So that, as for, as for it's a very good developer experience, we start recording the stuff and it compiles to native. Because we talked about the VM, but the VM is just used for development. The VM is,
00:14:01
Speaker
is what enables all the dynamism, the auto-reloading and so on. But everything which is dynamic must disappear or at best as a huge performance degradation once you compile to native. So, yeah, it was because it was targeting native and that you can write wages
00:14:29
Speaker
well, FFI to directly target native API if you need so. So it was a more direct way to target the platform rather than still being inside the JavaScript engine. And the Flutter,
00:14:59
Speaker
is cross-platform and has a rather OK API with good performance. So technically, we can just make the Flutter apps in Closure Dart. So that's the whole idea, right? Exactly. Yeah.
00:15:21
Speaker
So how different is it? Because I'm now curious about what exactly is available in Closure Dart right now, starting from the Closure features, like all the persistent data structures, and core async, and transducers. And so how far are you guys already? And then how

Compiler Development Phases

00:15:41
Speaker
one-to-one is it if I'm switching from Closure to Closure Dart?
00:15:46
Speaker
So the biggest feature that we are missing right now is the ripple. We made a proof of concept right at the beginning of the project to be sure that we could make a ripple, but we did not shift it on the first release because
00:16:08
Speaker
There is still a few months left on this, uh, in this future. And, uh, we, we are still thinking that, uh, the current, uh, compiler is enough to make a great applications. Uh, so other missing features right now, um, sorted sets, any sorted collections, um,
00:16:37
Speaker
We have, uh, we have something, but we did not shift it because, uh, nevermind. It's because, uh, I did not reuse the some existing, uh, implementation in the compiler. Uh, what else is missing? Uh, we don't have core racing, but we do have, uh, async handling, um, in that you have, uh, like, like in JavaScript, you have async await, uh,
00:17:10
Speaker
We have a special macro await so that you can use existing Dart libraries without using them or basically the future API. We have a closure string, template, work, test. You can test with closure Dart application.
00:17:37
Speaker
Maybe I can, I think there's probably a list of all these things, but maybe we can just take a slightly different view of it, which is when you came to build that compiler, what was your approach? Did you say, okay, we're going to make
00:17:51
Speaker
a copy of the Closerscript compiler, we're going to take all of the prototypes and all of these kinds of things. Or did you start from scratch or you're emitting Dart, not code? What is the actual technical approach that you took to the compiler itself? That's how we started. Basically, that's how I started.
00:18:15
Speaker
with the closure script design, compiler design. And once Christophe was convinced, he looked at my code. After he talked to more trusting parties, as he said. He looked at my code and told me that it was great, but we were going to delete everything. It's too good for this life.
00:18:46
Speaker
I almost regret at that time. Hey, as they say, like the greatest code is the code that you can delete, you know? Of course. No bugs. And then nobody can blame your code anymore. Or at least the first version of it here. So the tricky part is that we are learning doubts.
00:19:10
Speaker
And we were writing the compiler at the same time. So we had to at the very beginning, we had to rewrite everything, I think three or four times to find a design that fitted our need. And on top of that, that went from
00:19:32
Speaker
Sound safety, no, not having sound safety and basically to demand each user to type almost everything. That one was way more dynamic than that two.
00:20:02
Speaker
And that too still inherited some dynamic features from that one that we leverage at the start to provide the compiler. But progressively we realized that we could... So the first iterations were quite easy because we were using the dynamic features of Dart.
00:20:26
Speaker
But it required a lot of typing things, and the code generated was not good. But still, it helped us bootstrap. And plus, at some time, there was the release of Dart 2.12, I believe, where they switched to making types non-enable by default.
00:20:55
Speaker
So previously, when you said in that, that a variable was going to all the string, it could all the string on it. After this change, it would have to only all the string. And you wanted to do this like a maybe sort option types on every time. Yeah, you have to put a question mark at the end of the talk to say that it can be new.
00:21:24
Speaker
And something like Kotlin, right? I think Kotlin does something similar, I think. Yeah, I think. Even Swift? Swift. Yeah, yeah, Swift. Yeah. Yeah. Yeah, Swift and most of the ML community. Yeah, yeah. And so it was a big change. And
00:21:49
Speaker
As far as I remember, there have been at least three phases in the deployment of the compiler. It was the first part where we tried to write a minimal compiler in Dart, which would bootstrap itself. And then we could switch to writing some parts of the compiler in the subset of closure that the Dart compiler would support.
00:22:19
Speaker
And then, hot patching the compiler as we go on. But it was a bit too ambitious. And at some point, we say, OK, we are going to form more practical bootstrapping. I was cross-compiling before. So we assume that we have a working pleasure implementation. The compiler is written in the CHGC.
00:22:48
Speaker
And so for now, it runs only on the JVM. But the goal is to have the compiler to be able to compile itself and have the compiler be freed from the JVM. And so once we started writing the compiler enclosure, we make good progress. And then the second made soon.
00:23:15
Speaker
was when we started to introduce proper type inference and start relaying on dynamism everywhere. Because unlike dynamism in DART is a bit akin to reflective access in enclosure on the JBM, except that it's going to fail more often. Right.
00:23:40
Speaker
Because there are plenty of places where you won't be able to resolve what you want. And plus it goes against the tree shaking done by the dot compiler. So there are a lot of reasons.
00:24:02
Speaker
remember Christophe's that we needed to introduce type because when writing Flutter applications, there were parts of it where you had to type
00:24:19
Speaker
type parameters, methods, stuff like that. So, um, at some point in development, uh, it was a necessity to, to introduce type and the art part of it was, uh, once you had just a little bit of type, uh, it spreads everywhere and we needed to have a fine control of, um, of type emission. Hmm.
00:24:46
Speaker
But are the types carried all the way up to the native code, or are they just erased somewhere in between? Between DARTs and native code? Yeah. That's what we read, but we don't check native code right now. Okay. Well, native code being assume, there's no types in assume. Yeah. Yeah. Yeah.
00:25:11
Speaker
So just backing up then, so you started off with the ClosureScript perspective with the protocols and all that kind of stuff.

Dart as a Hosting Platform

00:25:17
Speaker
And like you say, with the ClosureScript, there's no types there as such, there's classes and prototypes and things like that. No, not exactly. The ClosureScript perspective was scrapped once I joined. Yeah. And then you moved more to a JVM approach.
00:25:38
Speaker
But we kept the idea of trying to use prototypes everywhere. So I believe that we only have one interface, which is the protocol interface.
00:25:58
Speaker
And everything else is built on top of protocols like Closure Script. So it's an in-between between the Closure JVM and the Closure Script. And because the tight system of Dart is more stringent than the one of Java or rather than the JVM, it's also a bit more difficult to target.
00:26:28
Speaker
For example, the generics are not erased on that. So how does that compare to the CLR one, for example, then? Because it's the same thing there, like with C-sharp and F-sharp. They don't erase the generics. So is it a similar approach to the CLR compiler? Batista is a little experience with the CLR compiler.
00:26:51
Speaker
Yes. So I have a little bit more experience than you in this, you know, compiler, but maybe not enough to compare. What can I say for, for closure that is, uh, basically all, um, data structure have, uh, generics. And, uh, so let, let's take, uh, that system vector. Um, if you create enclosure that, uh, persistent vector, it will be.
00:27:19
Speaker
in pure darts, a person that tour of dynamic, right? Yeah. Yeah. But let's say you want to use it. You want to, you only use your person that tour to wrap widgets, flutter widgets, basically, um, it's like reactor components. Uh, so, so you wrap 10 flutter widgets in your persistent vector.
00:27:43
Speaker
The way we are dealing with this is we analyze all packages that you have. And at call sites, we cast the persistent widgets, has the persistent widgets of widgets, have a persistent vector of widgets. So basically in the end, it will be a persistent vector of widgets.
00:28:10
Speaker
But it won't work for the generic vectors, right? If I have the data vectors and I have like ints and whatever, some other things in a vector, then that approach will not potentially work. Then it will still be dynamic then all the way. So if you have a vector of a string and an int or whatever. Yeah, it will be a person vector of dynamic, but it's OK. In pure closure, that's OK. Yeah, yeah.
00:28:38
Speaker
We spent a lot of time, and we are still working on this, we spent a lot of time in having a fully great interrupt story. Because in the end, this compiler will be used for
00:28:57
Speaker
for replacing JavaScript application on native targets like iOS, but also on MacOS, Windows, Linux application. So it's really important for us to have an excellent interrupt

Flutter's Cross-Platform Capabilities

00:29:13
Speaker
story. That's why we analyze all your packages and we cast ourselves
00:29:20
Speaker
Uh, on the cold side, for example, you can use, um, like I said, uh, the person vector has, uh, if, if a method needs a list, a dark list. So, uh, what was your question again? No, we're just still talking about the compiler compilation. We're talking about how the types flow basically between, you know, the, the, the stuff that you've got and then the compiled output. That's, that's a, that's the way it's different with the CLL because there's no erasure.
00:29:50
Speaker
versus the JVM where there is erasure. That was the original discussion. Okay. So, so, but this was giving the example that you have a vector and that you have to pass the vector to, to a first term method, which expects a list of strings. So we have this Victor, which is dynamic, which can hold anything, but
00:30:20
Speaker
At this moment, it's certainly typed as, well, vector is a subtype of .list. So it's okay. It's a .list, but maybe not of the right type for its items. But the part of the .list API does a cast method, which allows to change the type of items.
00:30:51
Speaker
If you do that in an actual that list, it's going to create a worker around the original list, which is basically just a lie about what is inside the
00:31:08
Speaker
the list and it moves the check from compilation time to runtime. It's going to check at runtime. When you try to retrieve an item, it's going to check whether it's of the prototype. And if it's not, you get a new one. And so we use almost the same trick for percent data structure. In that the percent data structure has
00:31:36
Speaker
two sets of method, the DAT one for compatibility and then it's worked. And the pressure one, the pressure one is always dynamic. It's always return a dynamic or object question mark for the items. But then the list part is fully typed. And when you cast for interrupt purpose, when you cast
00:32:06
Speaker
a vector, what is happening just that the root, the root object of the vector is going to change to a root object with a proper list type. But the tree behind is still going to be completely shared with the original. It's still a person vector, they are still equal. It's just the type marker for
00:32:37
Speaker
For that, we charge a change. But how does it affect the equality, then? So the equality of the hash that doesn't depend on the type marker, if I compare this? Yeah. Well, we are lucky that that has no equality defined on collection.
00:33:03
Speaker
Oh, right. Somehow it's reasonable because maybe not reasonable, but it can be defended because in Java you defined a content which are defined by the content of mutable structure.
00:33:33
Speaker
So the equality and dash value of something may change over time. So it's not, it can be given that if it's miserable, you shouldn't have an equality which is different than the identity. And this is the point of view of DAW. So
00:34:05
Speaker
So the persistent vectors and all the persistent connection enclosure have their own equity semantics. And they work well. But you can compare to a dot list because a dot list is only equal to itself. Oh, okay.
00:34:30
Speaker
And in terms of the compilation process, what is the one that Closure Dart is producing? Is it generating Dart code? And then that will be compiled by the Dart compiler? Or what does the pipeline look like? Exactly like you said. There's an intermediate representation below Dart, which is documented.
00:34:58
Speaker
But we should not want it to be stable. Right. It's documented. But at the very beginning, we looked into it. And the intermediate representation is documented with a big warning at the beginning. So yeah, we did not rely on that. So what about the obvious question is then, if you're doing that, do you have source maps for the code?
00:35:26
Speaker
Not yet. Yes, you have to understand that it's still a working compiler and you have almost all closure, but it's still for the brave. Also, the last check that was a long time ago, there was no source map
00:35:56
Speaker
support in Dart. Maybe we are even one of the only other languages on the WAM or targeting Dart. I don't know if there are many other languages targeting Dart. So when we started, it was a certainty. Right now, I've not checked. Maybe there are other languages, but I'm really not sure.
00:36:23
Speaker
And from the, from the closure point of view, I mean, closure doesn't have a specification, right?

Alignment with Original Closure

00:36:28
Speaker
Like Java. And, you know, so, so it, did that bother you? You can also blame Christopher there because he has been there since the beginning. Nobody bothered about, nobody bothered about spec, sorry, spec as in that's a different discussion, but nobody bothered about specification of the language, right? So there is no, uh, reference implementation or like Java, there is no language spec that you can verify that we have all the.
00:36:52
Speaker
all the things. So did that thing bother you? Is it still bothering you? Or does it bother you at all? Or you're thinking, ah, fuck it. We're going to make our own closure, our own list.
00:37:04
Speaker
Um, I will start Christophe. Uh, no, it did not buzz on me. Um, but there are funny, there are funny, um, behaviors, for example, uh, uh, I don't remember if it's get or NTH where you can have, uh,
00:37:28
Speaker
a float. Like, for example, let's say you want to get the first element of a vector, you can write enclosure and closure script, one point or two, for example. And there are many, there are lots of very small with behaviors to handle. And basically what we what we did is
00:37:56
Speaker
We looked at closure code and closure script code and trying to see what are the differences. And there are differences. So I'm making sure that you have the exact same bugs. Like we have closure bugs, we have the same thing as well. It's a very simple behavior. Bugs are part of the API.
00:38:19
Speaker
Exactly. Bigs are parts of the API, so we really try to be the closest to the closure. This is a question I've got for you. Sorry, go on, Christophe. Yeah, I was going to talk that we borrowed tests from both closure and closure script, and it adds a lot to
00:38:47
Speaker
to discover these corner cases. Because everyone is used to work in the safe subset of the language. They are things that we never do. And so it was really useful. But at the same time, it's dialect. So we can develop at some point. And the point of view, of course, is always to
00:39:16
Speaker
to specify what is working. And not to say explicitly, okay, the other thing is not working. It's left in the gray zone, where later on you can basically outside of the defined behavior, it's not forbidden behavior, it's undefined behavior. And in the future, a part of this undefined behavior may become defined. So
00:39:46
Speaker
part of the design, of course, or that was also in some little spaces where we had to deal with the platform, try to find the space right beside the different behaviors to add your own.

Challenges with Dart Platform

00:40:09
Speaker
Okay, I was gonna ask you another little question about like the interaction with the host. I know that, like, obviously, there's, there's, let's say there's a big mismatch between closure and Java and closure, closure script in JavaScript is a little bit easier in the sense that JavaScript is dynamic.
00:40:28
Speaker
And Dart is typed, so it's a bit more like the JVM. But did you find some of the types helped you a little bit with the compiler? Or did you find that there was a problem with the immutability and all this kind of stuff? Did the platform help you in some way to make it easier or was it always like, no, it was always a battle? For me, it was always a battle.
00:40:51
Speaker
I hate types, but I have to say that.
00:41:00
Speaker
It's very, very satisfying to see people write pure closure code and to see the generated code with all types inferred. Yeah, it's very satisfying, but no, it did not help. And that's also why we forgot about
00:41:28
Speaker
Writing the first part of the compiler and pure darts because at that time we were not Also, we were not great dart programmers but It would have been a way more difficult I think Yeah, and one thing that I I'd like to add about that language is that it's a little treacherous thing which
00:41:58
Speaker
There's something which is still in Prez or Dart that we still rely on tomorrow. It's very rare where that occurs. And that we will have to scrape at one point is how we deal with functions. When you, by functions, I mean the native function of Dart. When you read about a function in Dart, they tell you that you can pass
00:42:28
Speaker
any object with a call function, with a calling side as a function. And we tested it and it sent reasonable at the time. But the thing is that to proper test that, you have to fight the type system to prevent that from determining the
00:42:57
Speaker
the type of the object. And when you do so, you discover that it's not what you expect. It's not going to automatically call the call method on any object which is in function position. What it's going to do is a compile time.
00:43:16
Speaker
when it expects a function and that it gets an object whose type is determined to have a call method, then he is going to create a wrapper to adapt from the function to the object. So it's not a dynamic part of the language. It's purely some syntactic sugar with
00:43:46
Speaker
which happened at compile time and depend on types. So, yeah, it was a surprise to discover that things that we took for granted in the dynamic behavior were in fact just tricks and worked only in small places.
00:44:17
Speaker
You see, if you have an object and you pass it as a function, it's going to work. If you cast the subject as dynamic just to confuse the compiler and get the take plus, then the compiler won't be able to call it.
00:44:36
Speaker
Oh, so it doesn't know that it's like a function anymore because the whole type is changed. It needs to know the actual type at compile time of the object and the actual function signature, which is expected to generate at compile time a wrapper, a shim to adapt between the two.
00:45:04
Speaker
So how does how does that work for anonymous functions and stuff like that then? Well, in closure, if you're mapping an anonymous function into Dart, how does that how does that play out? It depends on the average. So if you have a function, a closure function with
00:45:28
Speaker
a fixed number of parameters, we are going to generate a pure dot function. But if, if you write a function with multiple arities or with a viable argument, the parameter. Yeah.
00:45:47
Speaker
We need to generate what we call an ifn object, which is basically a function with a dynamic invoke. Oh, they have that at the bottom level today in the VM. Not in Dart. Like invoke dynamic, like they have in the JVM. Yeah, no.
00:46:15
Speaker
they don't have in that you cannot write a function with multiple or a viable argument. Oh, I see. Okay. So we can have optional arguments, but not right. Okay.
00:46:34
Speaker
So when we compile closure to Dart, we have to check if we can generate a pure Dart function. And if so, we do it. And if not, we generate an object which is implementing the ifn protocol. And depending on your reality, we generate the right methods.
00:47:04
Speaker
And so if you pass a function to, for example, map the dark map on this, if you, if a function is a pure, is as a singularity, it's going to work. But if it's, if it has multiple or it is,
00:47:27
Speaker
you are going to have issues.

Compilation Process and Performance

00:47:29
Speaker
And I'm not sure if we have finished the work on that. But basically, since we have discovered that the magic of coding the call method on object was a lie and was just a comparative trick, we are going to do the same thing. Being that when you pass something to
00:47:55
Speaker
for example, to map of that. So we see that the map on the list for that expects a function of a given signature. Then we look at the inferred type of the object that we are trying to pass to this function. So either we can statically determine that we already have the correct type,
00:48:17
Speaker
Or we add runtime code, which is going to check the type at runtime and eventually create a wrapper to adapt and call the correct function. So it's not something that we can get around. And we saw it before because we believed in the promise of the call method.
00:48:47
Speaker
discovering big when writing a compiler is really a way to become knowledgeable in all the nuke and crannies of the package language. And so despite the fact that enclosure is formed upon to create wrappers,
00:49:10
Speaker
Yeah, we have to do so because that already does that itself. So why didn't Rome do like Romans? So how does it affect the performance of the runtime in that situation? Or is it kind of like not a big deal?
00:49:33
Speaker
the performance of the runtime that you can get, you can remove it by typing more the part of that method. We have no odd numbers to provide, plus we are still in flux. But definitely there's a cost to doing more stuff at the runtime. But we do stuff at the runtime when we can't be sure
00:50:00
Speaker
through typing experiments that we get the proper change. If you don't want the runtime cost, you have to be a bit more specific on your types. Also, like with Pure Closure, if you really want to have performances, you can still write type code very much. Yeah, I think pretty much similar to what we do in Closure.
00:50:29
Speaker
OK, you can give the hint so there is no reflection, or you can try to eliminate the reflection as much as possible. We have a one on dynamic warning. So if we cannot infer what you are trying to do, like, for example, you're trying to access a property, and we don't infer its type, we warn you. That's already good.
00:50:58
Speaker
It's usually enough to understand why it happened in the first place. There is also a layer in the Closure.compiler we call Magic Casting. Basically, we try to cast, if it makes sense, everything we can. So Christophe just talked about function wrapping. But we do it also for
00:51:28
Speaker
collections, right? We do it in a few places that you don't have to.

Dart Community and Ecosystem

00:51:36
Speaker
But compared to Java and CLR,
00:51:41
Speaker
because they have matured into something like, OK, you can write other languages on top of these things. But Dart, as far as maybe my knowledge is very limited on Dart, but I was thinking that it was supposed to be like a single language compiler, single language way of design, right? Or do you see some evolution towards Dart being a host language, like JVM and like
00:52:07
Speaker
or do you think it's just gonna be like Dart only sort of thing and then you have to do all these work at once. Where is the Dart community going in general?
00:52:19
Speaker
It's very active. The more I'm doing that, the more I'm impressed by the language and the community. The fact that you can reach lots of different operating system and that you have a flutter.
00:52:45
Speaker
I mean, it's very impressive. And yeah, there are tons of packages, tons of developer tools. So I'm not sure that people will write more compilers because writing compiler is a lot of work. But in the last three years,
00:53:13
Speaker
the community has grown a lot. I mean, it's very, very impressive. We were afraid of that, by the way. We were afraid that we were afraid of Google in the first place. Yeah, given given the amount of shit that they that they know pulled it up under.
00:53:34
Speaker
But that has been there for more than 10 years now. Yeah, yeah. Yeah, Christopher has something to say. What do you want to say, Christopher? All right. So, yeah, that seems that flatter because somehow flatter is still the killer reputation for that. Yeah. And the the the adoption seems to be growing still.
00:54:03
Speaker
What I was going to say was more from the point of whether or not Dart is shifting your pivoting to becoming more of a multi-language ecosystem. I haven't seen a sign of it, but still we have support from some core devs of Dart.
00:54:31
Speaker
They are not a style. We have seen some bad feedback from that community, obviously. What do you want? And also, Christophe did not help by writing
00:54:55
Speaker
A twine dart sucks. No, by writing, Christophe wrote a treat with the same code in dart and enclosure darts. He asked for people yelling at him. Oh yeah, I saw that treat where it was like a third of the size or something. Was that right? Yeah. You're getting a bit of flames. It was almost line by line translation of the example.
00:55:26
Speaker
So what was the reaction to that then? Because to me, I think it looks like, oh, okay, you've got a more expressive language in Clojure, so therefore that's the motivation to use it. But they don't like that, I guess. No, they were not very aggressive, just people asking. Basically, there were two profiles, people asking what's the point of not writing dark, so coming from doctors,
00:55:56
Speaker
We don't want to learn any language. And the other one was from Datos 2 defending their language, seeing that half the line differences were because of the ending curly braces become their own line. So rather than being
00:56:19
Speaker
than being the shorter by two-thirds, but only shorter by one half. Okay, yeah. I think this has been like the argument every time some Lisp shows up on any comparative platform. I think the first thing people point out, and then it's so easy to squabble about the syntax, right? I mean, people forget about the whole other experience, like the rep-leveling.
00:56:45
Speaker
the entire things that you get using closure or less. It's only about, oh, you know, less parentheses. Like, that's not the point, you know? So that's the least of the problems. But at the same time, I believe it was in this convo that one of the core conflict between top to down had an interesting point, which I rather adhere to, which is that
00:57:13
Speaker
questions are more focused on people to reach out to what doubt has to offer, which is mainly clutter and targeting and writing native application for the stuff and buy rather than trying to bring the doubt people to culture. It works both ways, but definitely I envision more
00:57:39
Speaker
because of people going to to further than the other way around. Yeah. Yeah. Yeah. I think it's like closure script, isn't it? I mean, you know, you will get a certain number of JavaScript people coming to it, but it's going to be mostly around as well. Yeah. Yeah.
00:57:56
Speaker
Because it's just a different way of thinking. I was just wondering whether... Sorry, Baptiste, you were going to say something on top of that. Yeah, just to finish the conversation session about the community.
00:58:12
Speaker
the huge parts of the huge killing, killing feature of the artist flutter. And, um, you, you can feel it when you're working, writing mobile applications, because basically it and it's, um, and China, it's a graphical engine here. Uh, so you have exactly the same application. Uh, if, uh, an Android or iOS or Mac OS and, um,

ClosureDart Roadmap

00:58:41
Speaker
If you've done a React Native or even Kotlin or Swift, for me, I really think it's a killer feature because battling with the host
00:58:58
Speaker
Android or iOS is a lost battle. It's too hard. I'm having this graphical engine and it's really a killer feature in my opinion. Yeah, I guess it's like a kind of like an equalizer. It's like the browser for native, you know, because then you can just target a specific like
00:59:24
Speaker
graphical engine, like you say, and you don't have to write the application twice because that's I mean, that is the ultimate goal, isn't it, of of all of these tools is to reduce the costs of this multi platform native world that we're living in. Right. The complexity is a global complexity.
00:59:44
Speaker
of your application, but you still, so it has, it has nothing to do with closure darts in itself, but you still have, you still have some times to, to battle with the host. So let's say I'm writing a small closure, closure dart application, or closure script application with react. If I want to do, what they call a share sheet, the extension, you know, when you are,
01:00:13
Speaker
browsing on Safari, you want to share something. So this has to be done in native. There are very small parts where you will struggle with, not necessarily native, but the SDK of the US you are writing to.
01:00:34
Speaker
Yeah, I think that was about to answer that as well, because I did some iOS development in Objective-C, and then I every time double around Swift, because you have all these frameworks that are coming with the system.
01:00:50
Speaker
that allow you to access the camera related things or ML engine on top of on device ML, for example, on these kinds of things. How easy is it to integrate with Flutter and then transitively how easy you can do this in ClosureDart? My opinion is it's pretty easy.
01:01:15
Speaker
It's just boring and time consuming. We've done it with Kristoff. So you know the WK WebView in Swift? So you have the same thing for Android. And the community plugin was not implementing some methods we needed to. So we had to add it.
01:01:46
Speaker
Yeah, it was, uh, it was okay. It was just, um, a little bit long because you have many interactions between, uh, well, it was more tied to the current plugin, uh, that plugin then, uh, you know, the interrupt story, but, uh, yeah, it's, uh, there is some, um, dot packages that, uh, tries to generate most of it. Um, um,
01:02:13
Speaker
So let's say you want to implement SQLite. You will give the header package, the header file, sorry. And this start package, which is an official one, will try to generate most of the methods. And you will still have to implement some of it, but not that much.
01:02:41
Speaker
Okay. Sorry. No, go ahead. Yes. So for own Dart FFI, they have a tool which is named Pion. I don't know if, at least for the C headers, it's Pion or it's something else. I don't remember. They are FFI tools.
01:03:10
Speaker
And one of them is named Pichon. And we'd like to support it or integrate it in the build process more so that you can reach to native API without having to leave pressure.
01:03:40
Speaker
basically. So trying to reduce the baller plate, but currently we are focusing on just getting the dancing to work well for regular development. And for example, in the recent weeks, we have worked on a small walker on Flutter, which is just about cutting down the baller plate and
01:04:08
Speaker
and integrating with the with the crucial way of adding state with a tone and already that's proved useful in the
01:04:22
Speaker
in the compressive reduction of what you need to know about Flutter to write an application. Yeah, it's very amazing in my opinion because we wrote applications without any closure layer, closure library, sorry. Yeah. So we have- Yeah, it's right in the world.
01:04:48
Speaker
Right. Straight into Europe. And it was pretty good. But now already the code would be way smaller than what we have. And like Christophe said, we are almost done on state handling. So it's also weird because our job
01:05:18
Speaker
is to ship the best compiler for Closure Dart. But we also said that we needed some to help the community to use Flutter because Flutter is very tied with Dart. We wrote a small, we are writing a small library on top of it. Nice. Well, in my interview, it's not very different than
01:05:49
Speaker
Well, you have some workers around the library
01:05:58
Speaker
Just to make the consumption more closure-y. But it's a problem. Yeah. So just one more question regarding the thing. So what is the tail call optimization story? What is the recursion story? Dart has that one already, and then it just translates well into, or it's still like a loop recur, sort of way, or a tramplaining. How does that work?
01:06:22
Speaker
Well, the same as JVM does nothing toward that recursion. So you have a loop greater. I don't know if we implemented the trample line. Well, it's not much of a function. Yeah. We did not.
01:06:40
Speaker
Yeah, so the other thing I was going to ask you was whether there was a sort of like with SWIFT, there was a sort of functional SWIFT movement inside of the community, let's say, you know, they're producing functional libraries with mutable collections and
01:06:57
Speaker
you know, teaching people how to use option types or whatever, which are in the language, but, you know, I think it's new to people. Is that true of Dart as well? Is there a sort of sub, is there a little sect inside of Dart which are interested in functional world? Because I mean, it's a, it's got a, it's got a, like I said, it's got types. So, you know, wherever there are types, there must be functional people coming to look at it and think, hmm, can we do functional programming? Can we do Haskell in this one?
01:07:25
Speaker
Yeah, so I don't know. But I don't know enough about the community. In your experience of interacting with it, is that something which is surfacing or? So in the language itself, you have immutable classes. But not truly immutable. Another little syntactic sugar is it, yeah.
01:07:50
Speaker
You did not let me finish. He thought you already said the immutable thing.
01:08:07
Speaker
Yeah. And in the community, you have, um, the dark package by the flutter team, the dot team, sorry. Um, which has a immutable collections. Uh, so I don't know how much it is, it is used in the community, but, um, there is activity around this, uh, yeah.
01:08:32
Speaker
And is that something which you can get inspiration from or use? Or is it just something like, well, it's an interesting thing there that maybe one day we can take advantage of?
01:08:48
Speaker
We already implemented almost all data, immutable data structures. We can leverage it maybe one day for Interop if it becomes a de facto data structures. But I think right now, the closure data structures are enough to write closure data applications.
01:09:17
Speaker
Sorry, go ahead. I don't see the community moving in this direction at the time. It's a very particularly minded community. And it comes from the language, from the design of the language itself. Yeah. The language provides some things to be done.
01:09:41
Speaker
only to be able to provide better user experience, for example. So, they, yeah, I'm not sure that it's going to be a fair deal going for tech FBE people.
01:10:09
Speaker
Okay, nice. So just to wrap up the conversation a little bit because we are almost one and a half hour now. So would you say that right now what Close It Out is like the alpha level or beta or it's even like 0.1 level so people can start building these ones or is there more work to be done to
01:10:32
Speaker
to bring it to, quote unquote, to be utilized in production. So my opinion is it can be used right now in production. We shipped one application that is live.
01:10:51
Speaker
in production. We don't have the closure expense yet because of the ripple. We don't have also the compiler is not bootstrapped yet. So we wrote the compiler enclosure and the
01:11:12
Speaker
The idea is to compile the compiler, to generate that by compiling the compiler, and then having a pure Dart compiler. Yeah. So right now, you still need the JVM version of the thing. Right. So it's not all changed yet. Also, obviously, it has been live for one month now.
01:11:38
Speaker
And community is very small. Obviously, there are not there are not a lot of documentation tutorials. There is not even a clue that websites. Basically, there is a ton of work to do. We do it on our free time. Yeah, there are
01:12:04
Speaker
There are people kind enough to sponsor us, but we are not close to being able to stop having clients. We need to live, basically.
01:12:22
Speaker
My opinions is it's, it can be used today. It's very promising. Um, there are almost all of closure, but if you use it today, uh, it will be, it will be like using closure script, uh, in the first year, we'll have maybe, uh, some writers growing stuff. But if you, if you like closure enough and, uh,
01:12:48
Speaker
You want to rapidly put prototype stuff. I think it's a very good language, but, and yes, obviously. Yeah. My point of view is maybe a bit

Sustaining ClosureDart

01:13:02
Speaker
more positive something than that is. Yeah, but you had a pretty long list of things
01:13:17
Speaker
You shall not get that. So before the Easter release, I was a bit afraid of the feedback and I feared of having the compiler breaks on a lot of things. And supposedly it worked well.
01:13:43
Speaker
And, uh, we add some, uh, some web new users trying stuff without getting impressive result without having a photo experience. I remember some, something more than Charles. I was convinced that the guy was experiencing flutter and no, he just picked treasure dark in the photo doc. And without asking us any questions, they got
01:14:11
Speaker
very interesting results with lots of animations and transitions. So I believe that for anyone which is motivated, it's possible to get things going. Sure, you'll find some bugs, but you can do it and put it in production.
01:14:36
Speaker
And we are not going to break too much stuff from now on. There will be some breaking changes. But globally, I believe that we are more beta than alpha. While before the release, I assumed that we were more alpha. And the fact that the Flutter Worker has
01:15:03
Speaker
has grown to be rather effective and will soon be even more. It's also a big part of it. And the last, about the documentation and Twitter stuff and so on, we are going to have an intern working on a visual art.
01:15:28
Speaker
She should start, not this week, but the week after, for about three months. And so, she's repenting as killer. And so, she's... Is this her penance, is it?
01:15:51
Speaker
And so she's new to both mobile development and culture. So she's going to learn culture with us. And I think that the time when you learn something, it's actually the time to write down your
01:16:15
Speaker
your experience and document it for the others. So basically, that's going at least the first months of our internship will be about writing down and documenting our experience. Yeah, yeah. Yeah, that's very good. Yeah. And like Christos said,
01:16:36
Speaker
It was very impressive to see that there were not that much bugs. Maybe because we don't have that much users. Yes. So every user gets one bug, that's it. No, but the bugs we had, most of them were
01:17:00
Speaker
It is certainly an impressive achievement and also undertaking the goal that you have set yourself to. As we were saying that on a language that is not really behaving like a host language, that means you need to know so much of detail and everything to get it to work.
01:17:23
Speaker
And it could be a really nice story for close people to have one more way of building, maybe better way of building the native applications. And that's an ambitious thing. Yeah. So maybe we can just change the mode of the conversation a little bit towards sustainability. Now you've done this thing. You've achieved this initial goal. And you already made some plans, Christophe, like you say, with interns through documentation. And you've got plans to
01:17:53
Speaker
to do the next few things but but how do you know crystal from Baptiste you know definite heroes of ours making this thing work how do you kind of like go from like being the heroes to like being like keeping this thing going over like next three to five years or whatever it takes you know the kind of really build the community and make it a first-class friend of closure you know.
01:18:21
Speaker
many small steps, documentation, video, the weapon, doing talks. I was more thinking about your own situation, you know, your business. Yeah, I mean, because you kind of like, you hinted at the fact that you've got to keep on working. And that's, you know, I see that with like, David Nolan and Mike Fikes, they've, they've got jobs.
01:18:45
Speaker
You know, so it's perfectly fine. Once you get to a certain sort of size of the code or stability of the code, then you're just kind of like tweaking things. Is that, is that your thinking going forward or do you have a different vision? Yeah. So we've not built closure darts for money, obviously. We spent a lot of money into it. But I strongly believe that for an open source project to
01:19:15
Speaker
to be stable and mature, you need some kind of business model. Um, so we have to find one basically because, so if we talk, sorry, Christopher, if we talk about sponsoring, um, you really have to,
01:19:38
Speaker
to get thousands of them to being able to invest your time because people are very nice and they give five, 10 euros and it means a lot, but of course you cannot live with a few hundred euros.
01:19:55
Speaker
Um, so yeah, we, I strongly believe that we need to find some kind of business model around it, uh, to make it bit better every year. And, uh, I've seen so much, uh, open source guys being burnt out, uh, because, uh, that they were investing their free time in the project. So, uh, I don't find that I want, um,
01:20:24
Speaker
Yeah, the cognitive tech example is, I feel is a perfect example of what you want to do. Being able to finance
01:20:39
Speaker
Alex Mina and other people full time on the Closure project is very valuable and you don't necessarily see it when you're using Closure, but it's important to have money flowing somewhere to finance people working on the compiler. For more immediate times, we hope that we'll get more contracts
01:21:09
Speaker
from clients asking to develop stuff in ClosureDart. So that would be a storm and it would also help us grow our team. Every time we do a ClosureDart project,
01:21:29
Speaker
Uh, it helps the compiler. Yeah, exactly. Yeah. So, uh, we can send them, uh, we worked with, uh, the Rome team, Rome research team. And, uh, we've done a lot with them and thanks to them, it helps a lot the compiler. Um, because basically we are dog fooding, uh, our compiler. So every time we spot something, uh,
01:21:58
Speaker
messy or every time we can upgrade the API, it's perfect. I mean, isn't there like, again, we were talking about this on some of the discussions, but aren't NewBank a very big Flutter user? So, you know, in some respects, you kind of, there could be a good target customer for this kind of stuff.
01:22:22
Speaker
NewBank is sponsoring the project. Thanks a lot to them if you're listening. Yes. I mean, we hope one day we have clients or users rather than clients like NewBank. It would be a huge win for the ClosureDot community. Yeah. And in terms of the maybe last question regarding the community,
01:22:47
Speaker
to contribute to close your dark like is it closure knowledge or is it the dark knowledge that is modified right now to to to build to help you out so in my opinion you don't need the knowledge in
01:23:03
Speaker
Well, you don't need that much knowledge in that language. You need to know closure. But the part that you need to know is not documented yet is how we built the compiler.
01:23:18
Speaker
But does it mean that you cannot help? No. You can help a lot with tutorials, documentation, and for small bugs, I think if
01:23:36
Speaker
We can help. We are very reachable on the ClosureDart Slack channel or Twitter. And yeah, one day we really need to have someone to film ourself, have someone fix a bug, for example, or stuff like that. Nice. And when they are too caught to ClosureDart,
01:24:06
Speaker
are the low-label parts where you really need to know that. And so some missing features, like the multi-method, are going to require some dark knowledge to design them properly. But there are a lot of low-hanging fruits in implementing missing pleasure functions, which are just missing because we didn't care, or because there are new things in 1.11.
01:24:35
Speaker
that we haven't ported and porting them is simply just a matter of copy-pasting. So this can be contributions to the project themselves. More people porting the test suite. And yeah, having the having gen tests working on COSRDAF would be great.
01:25:05
Speaker
We don't have them yet. And these are all things which are pretty, pretty removed from that itself. So it's more a matter of getting people to work on it than having the experience in that itself. Plus, yeah, just trying the visual data and documenting the pain points, what
01:25:34
Speaker
what went right, what went wrong, would be awesome. Nice. Also, I think people use a lot of Flutter for iOS and Android applications, but I really think it's a killer framework for desktop application.
01:25:57
Speaker
If you have to choose between electron and flutter, for me, there is no question. And we hope also to invest and document this field.
01:26:17
Speaker
But yeah, like Christophe said, there are not a lot, but there are missing functions. And most of it is because we don't choose these functions and we forgot to implement them. So once every two months, we try to do an Excel to see what's missing. Some of it is also because there are functions that don't make sense.
01:26:48
Speaker
But yes, it's very easy to help us to implement these functions.
01:26:53
Speaker
Yeah. Awesome. Yeah. Fantastic. Okay. Yeah. So I think that's okay. One and a half hour. Wow. I think this is, this is like an amazing project. As you said, like this is bringing like a really substantially useful tool into Closure community, right? So making it, making it available for Closure people to build all this stuff. Just like the way Closure script has changed, you know, a lot of things for Closure, people writing Closure.
01:27:22
Speaker
We were able to build web app and the whole innovation around reframe and using React and the web, I think.
01:27:29
Speaker
Flutter, you know, since now, Christophe says that it's, you know, it seems to be something. So I trust you, Christophe. It's like a chain of trust now. And so it all started from that east. And then now, okay, finally, I know Christophe says it's okay, it's reasonable things. I believe you. But it's, as I said, it's a really, you know, nice undertaking. And I did try Flutter, but then I was like, fuck, I'm not going to write Dart. That looks alien to me.
01:27:56
Speaker
Maybe I had the same complaints that people have towards closure. I have towards dark, like, the fuck is this? The syntax is meaningless. I think it's going to be a really, we hope it's going to be, you know, grow.
01:28:09
Speaker
Bigger and better and then you know new bank using it and maybe who knows Google will will say that oh, well, you know No, I was just saying big big congratulations on you know making them making the first release, you know, that's already a big
01:28:31
Speaker
Making it a prototype, making it work for one or two things is a different thing. Being able to build your fast production application with the language compiler framework that you invested so much on is an amazing achievement. Big congratulations on that one. Thanks for that. Hopefully you'll continue and then make it even better.
01:28:55
Speaker
And I think you guys are going to be at Closure D, if I'm not wrong, just to sort of think about the road trips you're doing or whatever, because we're going to be also at Closure D. Nice. And I think you're trying to host a workshop, Christophe. I saw something like that. Or what's going on there? Yeah, on the Friday afternoon, we are going to host a workshop, or maybe two, if the attendance is too large.
01:29:26
Speaker
about getting started with Clichaudat for writing mobile education. So that's Friday the 10th of June. Yeah. We should have it out before then. We should have this episode out before then, so you know, sign up if you can.
01:29:44
Speaker
I'll go back in time and then sign up if it is later. And Chris, we have to take our plane tickets, remember? I'll just check the pricing point. And so we will ask a workshop at the Strange Group too. Nice, nice. That's a really big audience then. Awesome.
01:30:13
Speaker
Nice. Then I think that's pretty much it. Our buddies, you were saying something. Did I miss? Yes. So I'd just like to give some visibility on what we are working on. Yeah. So Christophe and I work on the state management for the Flutter library. In parallel, we are
01:30:44
Speaker
Starting back, I will work on the repo. So basically the two main objectives of the next two months is state management and the repo. And then the big milestone will be after the repo, the big milestone will be having a self force compiler.
01:31:04
Speaker
maybe more than a year. Yeah, yeah. And yeah, one of our goal is to give visibility to people. Yeah. So it's for me. Thanks for having us. Yeah, I think the main thing that I would like to know, you know, to conclude this podcast, whether to publish this or not is, you know, is there any max mode or
01:31:32
Speaker
What is the editor that you guys use? That's all I need. What about Emacs mode? Yeah. For now, we are just choosing the Closure mode. Oh, so you use Emacs then? We both choose Emacs, yeah. Yes, that's perfect. And then Closure Dart is, you know, destined to be a successful project. One of us is a Grimpy Emacs user. I won't tell you.
01:32:00
Speaker
We don't need to know. We just need users. One of us always yell when using the Emacs. So I can just say now, closure.100% made in Emacs. So you should just put that as a tagline. It was made 100% in Emacs, yeah. Awesome. That's all we need to know. I'm going to publish this today.
01:32:26
Speaker
I have to confess, I modified Devs.idian with VI moments. It's OK. Every now and then, you can have a pizza every now and then. When you're having a healthy diet of Emacs, every now and then, you can eat some of the crap. That's OK. Anyway, on that bomb show, it's very funny to see Christophe use Emacs. I've never seen someone use Emacs like that.
01:32:55
Speaker
This has to be part of your workshop, by the way. It's a strange loop. Yeah, for a long time, his init file was like 10 lines. Wow. Okay. This is a minimalist.
01:33:14
Speaker
Anyway, it's really nice seeing you, Gustav, after so long. And I still owe you a big one because the first time I started with Closure, you're a very big inspiration. And you came all the way to Rotterdam to kickstart our tiny meetup there. And at that time, I think, as you know, we had like three people doing Closure in the entire Netherlands, probably.
01:33:37
Speaker
So, and also for the book and all the contributions that you made over the, or, you know, these years, there are too many projects to list. And, um, I know I'm glad that, but it stopped you into Floshedart. So, you know, building a completely new one. Um, so very happy for the, for the release and, you know, good luck with the, with the project. And that's it from us today, I think. And yeah, we'll see you at, uh, ClosureD. Perfect. Yeah. See you next time.
01:34:07
Speaker
Thank you for listening to this episode of DeafN and the awesome vegetarian music on the track is Melon Hamburger by Pizzeri and the show's audio is mixed by Wouter Delert. I'm pretty sure I butchered his name. Maybe you should insert your own name here, Delert. Wouter.
01:34:26
Speaker
If you'd like to support us, please do check out our Patreon page and you can show your appreciation to all the hard work or the lack of hard work that we're doing. And you can also catch up with either Ray with me for some unexplainable reason you want to interact with us, then do check us out on Slack, Closureion Slack or Closureverse or on Zulep or just at us at Deafened Podcast on Twitter.
01:34:53
Speaker
Enjoy your day and see you in the next episode.
01:35:31
Speaker
Happy Mother's Day, right? Raise the mother of this podcast.