WEBVTT
00:00:00.000 --> 00:00:06.519
Okay, so I'm going to look at some of the questions showing up
00:00:06.520 --> 00:00:08.499
in the etherpad we got here.
NOTE Q: Have you considered using CRDTs to share buffers between threads and merge any concurrent edits automatically?
00:00:08.500 --> 00:00:09.439
It says, have you considered
00:00:09.440 --> 00:00:12.799
using a CRDT to share buffers between threads and merge any
00:00:12.800 --> 00:00:16.039
concurrent edits automatically? So I have looked at that.
00:00:16.040 --> 00:00:20.559
And the problem with CRDTs is that even though they give you a
00:00:20.560 --> 00:00:22.839
mathematically correct answer when you're trying to merge
00:00:22.840 --> 00:00:26.479
two conflicts, it's not always a useful answer. Like, it's
00:00:26.480 --> 00:00:29.199
not coherent. If you have two things trying to edit the same
00:00:29.200 --> 00:00:31.359
thing, there's no good way to resolve that. And so they
00:00:31.360 --> 00:00:33.559
really work well when you have two people working live, both
00:00:33.560 --> 00:00:35.639
editing the same document, because they can fix any
00:00:35.640 --> 00:00:37.199
particular issues like that, like you would with Google
00:00:37.200 --> 00:00:39.919
Docs. But you have different packages that aren't aware of
00:00:39.920 --> 00:00:42.159
each other, and you're going to run into problems. And so
00:00:42.160 --> 00:00:44.999
this is something, if you read from the Xi editor, which was
00:00:45.000 --> 00:00:48.039
one of the first ones to use CRDTs, in the retrospective, he
00:00:48.040 --> 00:00:52.359
talks about how they had this problem, where the CRDTs They
00:00:52.360 --> 00:00:53.999
give you an answer, but it's not always an answer that's
00:00:54.000 --> 00:00:59.079
useful. And so I feel like locks at least are going to make it.
00:00:59.080 --> 00:01:00.439
It's not going to be as efficient if you have a whole bunch of
00:01:00.440 --> 00:01:02.319
packages, but I don't imagine there's going to be a ton of
00:01:02.320 --> 00:01:04.799
those. It can actually, I think it'll be more useful in
00:01:04.800 --> 00:01:05.873
practice.
NOTE Q: Why hosted on GitHub? GitHub is nonfree. Is it possible to report bugs/send patches without using GitHub?
00:01:05.874 --> 00:01:11.239
I host on GitHub because that's what I know.
00:01:11.240 --> 00:01:13.239
If there's a way to host it on somewhere else, I'd be
00:01:13.240 --> 00:01:15.439
interested in doing that. If you're interested in setting
00:01:15.440 --> 00:01:17.799
patches without using GitHub, you could always send an
00:01:17.800 --> 00:01:22.959
email. I'm more than happy to accept email patches.
NOTE Q: Do you think it's possible to achieve 100% compatibility with current Emacs code?
00:01:22.960 --> 00:01:24.959
Do you think it's possible to achieve with the current Emacs
00:01:24.960 --> 00:01:29.719
code? I do. I think, I think you can do that. Um, like I said,
00:01:29.720 --> 00:01:33.279
there's a couple things inside there that are intentional
00:01:33.280 --> 00:01:37.919
breaks with existing Emacs code. And some of those being
00:01:37.920 --> 00:01:43.159
like functions are immutable. As well as having data shared
00:01:43.160 --> 00:01:44.759
switch between different threads, which means there's
00:01:44.760 --> 00:01:46.599
going to be some copying going on. So there's going to be
00:01:46.600 --> 00:01:48.399
subtle things that are going to be different. And we've
00:01:48.400 --> 00:01:50.359
really got to think about those intentionally, but I'm
00:01:50.360 --> 00:01:54.519
really going for bug compatibility with GNU Emacs so that
00:01:54.520 --> 00:01:57.159
you can take an existing Elisp package and just run it and it
00:01:57.160 --> 00:01:59.879
just works, 'cause I think that's one of the big strengths of
00:01:59.880 --> 00:02:03.399
the Emacs ecosystem is the millions of lines of Elisp that
00:02:03.400 --> 00:02:07.479
people have written.
00:02:07.480 --> 00:02:11.912
Um, So I'm not, okay...
NOTE Q: so you're re-implementing elisp in rust? have you considered using a more modern lisp, such as scheme? [11:03]
00:02:11.913 --> 00:02:14.279
So since you're re-implementing Elisp and
00:02:14.280 --> 00:02:17.039
Rust, have you considered using more modern Lisp such as
00:02:17.040 --> 00:02:20.919
Scheme? So I'm not re-implementing Elisp and Rust. I'm
00:02:20.920 --> 00:02:25.439
re-implementing the C in Rust. In fact, I would like to make
00:02:25.440 --> 00:02:30.479
more of the core that's written in C in Elisp instead of C or
00:02:30.480 --> 00:02:33.839
Rust, because then it's actually introspectible. There's
00:02:33.840 --> 00:02:38.719
a talk by Tom Tromney that he gave a while ago about Emacs
00:02:38.720 --> 00:02:42.239
should be Emacs Lisp. I kind of like that philosophy,
00:02:42.240 --> 00:02:44.799
that as much of it as should be Elisp as possible, and we
00:02:44.800 --> 00:02:48.079
should only have C or Rust or some systems level language for
00:02:48.080 --> 00:02:52.319
really low-level stuff. Using a more modern LISP such as
00:02:52.320 --> 00:02:54.839
Scheme. I know there's, I mean, there's two talks, I think,
00:02:54.840 --> 00:02:58.239
in this conference about using Scheme inside Emacs. And I
00:02:58.240 --> 00:03:00.719
looked at this at one point about what if you wrote it inside
00:03:00.720 --> 00:03:03.919
Common LISP, because that's also has some really low level
00:03:03.920 --> 00:03:05.879
details. And then you could go from Elisp down to Common
00:03:05.880 --> 00:03:09.199
Lisp. But the problem is, is under the hood, you still need a
00:03:09.200 --> 00:03:12.559
systems language. You can't, you still need either C or Rust
00:03:12.560 --> 00:03:15.639
or something underneath the Common Lisp to implement the
00:03:15.640 --> 00:03:17.799
primitives. And so it's not going to give you just two
00:03:17.800 --> 00:03:19.719
languages, you know, you'll have three. You'll have the
00:03:19.720 --> 00:03:24.919
elisp, common lisp, and C under the hood. And so in this case
00:03:24.920 --> 00:03:29.559
we just have the two. We have the Elisp and the rest.
00:03:29.560 --> 00:03:42.999
All right that's all the questions I see there. Let
00:03:43.000 --> 00:03:54.079
me go look at... Okay,
00:03:54.080 --> 00:04:01.399
so I see into the chat.
NOTE Q: Do you have specific features from the Rust compiler that are missing (or are nightly-only) that you would take advantage of?
00:04:01.400 --> 00:04:03.839
Does it features from the Rust compiler that are missing
00:04:03.840 --> 00:04:06.239
that way you would take advantage of? Oh, that is a great
00:04:06.240 --> 00:04:10.679
question. Um, there's a handful of them. Uh, I should've
00:04:10.680 --> 00:04:13.599
written down a list of these. One of them is Polonius, which
00:04:13.600 --> 00:04:17.959
is the new borrow checker because we're trying to be used
00:04:17.960 --> 00:04:21.759
lifetime to track our objects. We often run into situations
00:04:21.760 --> 00:04:24.239
where we've kind of got a hack around things because the
00:04:24.240 --> 00:04:26.199
limitations with the borrow checker. And so I have a whole
00:04:26.200 --> 00:04:29.559
bunch of like notes inside there about where. A better
00:04:29.560 --> 00:04:34.959
Polonius would help inside there and help ease some of the
00:04:34.960 --> 00:04:40.599
issues. Another thing is enum variances types, because
00:04:40.600 --> 00:04:42.999
right now we have an object which is defined as a big enum that
00:04:43.000 --> 00:04:46.079
had all the possible objects, but if we want to have a subset
00:04:46.080 --> 00:04:47.479
of those objects or just pass in one of those objects, we've
00:04:47.480 --> 00:04:50.079
got to define a new struct. And so we have a whole bunch of
00:04:50.080 --> 00:04:52.839
boilerplate code to define that all out. And if we had
00:04:52.840 --> 00:04:56.719
variances types, that would make the code a lot easier.
00:04:56.720 --> 00:05:00.079
Another one is the allocator API. Right now we're kind of
00:05:00.080 --> 00:05:02.479
working around it, but ultimately we're going to need our
00:05:02.480 --> 00:05:07.719
own allocator. And the allocator API is still nightly only.
00:05:07.720 --> 00:05:10.919
So there's a couple more. I'll look at that more, but that's a
00:05:10.920 --> 00:05:24.279
great question.
00:05:24.280 --> 00:05:26.879
Let's see.
NOTE Q: Can remacs be reused?
00:05:26.880 --> 00:05:30.799
Okay. I see a question you might not have noticed just asking
00:05:30.800 --> 00:05:37.159
about reuse of Remacs. Oh, yes, so I have reused some of Remacs
00:05:37.160 --> 00:05:40.159
code, and some taken, like I mentioned, taken some of their
00:05:40.160 --> 00:05:45.319
ideas, but ultimately we're using a different model
00:05:45.320 --> 00:05:49.439
because under the hood in Remacs, everything is just defined
00:05:49.440 --> 00:05:53.799
as an opaque external type that's defined inside Emacs and
00:05:53.800 --> 00:05:56.159
so it just pulls those in interacts with those and passes
00:05:56.160 --> 00:05:58.879
them back into C. We're trying to see what we can do if we
00:05:58.880 --> 00:06:02.279
say okay we're not going to take the same... So they're bound to
00:06:02.280 --> 00:06:06.839
the implementation details of Emacs, and we don't want to do
00:06:06.840 --> 00:06:09.559
that. We've re-implemented all the core types
00:06:09.560 --> 00:06:12.559
ourselves. So that means that we can't just take the
00:06:12.560 --> 00:06:16.559
Remacs code one for one and use it in our project, but we can
00:06:16.560 --> 00:06:18.799
take a lot of their ideas. I've spent some time reading
00:06:18.800 --> 00:06:20.439
through their documentation, different things about how
00:06:20.440 --> 00:06:23.856
they approached strings and GC
00:06:23.857 --> 00:06:24.759
and different stuff like that.
00:06:24.760 --> 00:07:23.599
Looks like all the questions.
NOTE Q: What are you thoughts on the GUI layer. Any plans on how to reimplement it?
00:07:23.600 --> 00:07:26.199
Okay, so another question. What are your thoughts on the GUI
00:07:26.200 --> 00:07:30.959
layer? Any plans on how to reimplement it? This is something
00:07:30.960 --> 00:07:34.079
I've thought a lot about, but I still don't have a solid plan
00:07:34.080 --> 00:07:37.253
for. I'm not really a GUI person. I mostly work with
00:07:37.254 --> 00:07:42.719
low-level. And so my two thoughts is you can go the GTK route.
00:07:42.720 --> 00:07:45.519
There's Rust bindings for that. That's well understood.
00:07:45.520 --> 00:07:48.319
It's got a good support. But there's also some interesting
00:07:48.320 --> 00:07:53.919
projects to try and do GUI in Rust, native Rust, and have it
00:07:53.920 --> 00:07:57.399
use Rust idioms and stuff like that. And so those are things
00:07:57.400 --> 00:08:01.439
like Druid and there's eGUI and a bunch of those that are that
00:08:01.440 --> 00:08:05.359
way. And I've never used one of them, but I'd be interested to
00:08:05.360 --> 00:08:08.879
try that out first and see how well does this work and how well
00:08:08.880 --> 00:08:21.239
supported is this doing a Rust-first GUI.
NOTE Q: If money could fix the problem, how much would it cost to ship this with feature parity before 2026?
00:08:21.240 --> 00:08:23.639
If money could fix the problem, how much would it cost to ship
00:08:23.640 --> 00:08:28.399
this with feature parity before 2026? Ooh, in a year. Uh,
00:08:28.400 --> 00:08:32.079
that's a good question. Even if we had the money, it would
00:08:32.080 --> 00:08:36.639
take more than just me, even if I was working on it full time.
00:08:36.640 --> 00:08:40.630
Um, I don't know. That's a good question.
00:08:40.631 --> 00:08:41.769
I would think it would take a team
00:08:41.770 --> 00:08:45.239
of at least a handful of people to get this
00:08:45.240 --> 00:08:48.559
shipping within one year. Because there's still a lot of
00:08:48.560 --> 00:08:50.759
work to do. And even once you have everything implemented,
00:08:50.760 --> 00:08:55.119
there's a lot of bug finding and smoothing it out so that it
00:08:55.120 --> 00:08:57.519
runs as well as Emacs, which has been, you know, battle
00:08:57.520 --> 00:08:58.359
tested for a long time.
00:08:58.360 --> 00:09:06.599
Um, okay, so this might be a good moment for me to break in and
00:09:06.600 --> 00:09:09.039
just say that we've got about 10 minutes left before we
00:09:09.040 --> 00:09:12.519
resume new talks on on both tracks. Of course, we're happy to
00:09:12.520 --> 00:09:18.119
keep this. This chat open and keep the recording going here,
00:09:18.120 --> 00:09:21.599
which will share after the conference as long as as long as
00:09:21.600 --> 00:09:28.349
there's discussion here. Thank you.
NOTE GObject implementation
00:09:28.350 --> 00:09:29.119
GTK project has
00:09:29.120 --> 00:09:31.079
automatic binding with a framework called GObject
00:09:31.080 --> 00:09:33.599
introspection, which is what I'm using for gypsum project.
00:09:33.600 --> 00:09:35.959
Probably Rust has a G object implementation, which you can
00:09:35.960 --> 00:09:39.119
use. Yeah, I know it has some GTK bindings. Um, I'm not sure if
00:09:39.120 --> 00:09:41.954
it's specifically GObject, but that's a good path
00:09:41.955 --> 00:09:44.335
because I feel like the problem
00:09:44.336 --> 00:09:46.759
with the Rust GUIs is that they're all
00:09:46.760 --> 00:09:50.359
very new. And so, you know, everything works in a demo, but
00:09:50.360 --> 00:09:52.319
you need something that can work across all different
00:09:52.320 --> 00:09:54.319
devices and all different platforms and have really good
00:09:54.320 --> 00:09:56.599
support and good accessibility and stuff like that.
NOTE Q: elisp is implemented in c, so if you're not implementing elisp in rust, are you using/keeping the c implementation of elisp?
00:09:56.600 --> 00:10:03.399
All right, Elisp is implemented in C. So if you're not
00:10:03.400 --> 00:10:07.359
implementing Elisp in Rust, we're keeping the C
00:10:07.360 --> 00:10:13.639
implementation of Elisp. So let me see if I can do a better job
00:10:13.640 --> 00:10:18.439
of explaining this. So inside Emacs, you have about a
00:10:18.440 --> 00:10:21.519
million lines of Elisp. And underneath that, you have the C,
00:10:21.520 --> 00:10:24.079
which is the primitives everything's implemented yet. And
00:10:24.080 --> 00:10:27.079
so we're keeping all of the Elisp, and we're just taking that
00:10:27.080 --> 00:10:30.559
C layer and replacing it with Rust. And so when you call a
00:10:30.560 --> 00:10:33.079
built-in function, it's calling into a Rust function
00:10:33.080 --> 00:10:40.079
instead of a C function under the hood. So all the Elisp stays
00:10:40.080 --> 00:10:42.679
Elisp, but the C becomes Rust.
NOTE Clarifying rewriting Elisp in Rust
00:10:42.680 --> 00:10:54.599
So looking at the IRC chat, it feels to me like maybe there's a
00:10:54.600 --> 00:10:59.159
little bit of confusion around what do we mean when we say
00:10:59.160 --> 00:11:04.839
rewriting Elisp in Rust, right? I think there are some
00:11:04.840 --> 00:11:07.399
people that are like, A, we're reinventing ELISP, and
00:11:07.400 --> 00:11:09.679
there's other people that are like, no, we're trying to be
00:11:09.680 --> 00:11:12.879
byte-for-byte compatible with Rust.
00:11:12.880 --> 00:11:17.500
So some people are questioning your no answer on that.
00:11:17.501 --> 00:11:20.000
Aren't you really, maybe, is what I'm reading in there.
00:11:20.001 --> 00:11:21.769
Do you want to respond to that?
00:11:21.770 --> 00:11:26.119
Yeah, I'm trying to think about how I can make this
00:11:26.120 --> 00:11:29.559
clearer. So the Elisp stays Elisp. We're not changing the
00:11:29.560 --> 00:11:33.239
Elisp at all, or at least very minimally. We want to be able to
00:11:33.240 --> 00:11:36.519
take, like I said, bug compatible. So whatever works inside
00:11:36.520 --> 00:11:39.999
existing Emacs, you can take all the Lisp and you can run it in
00:11:40.000 --> 00:11:43.599
Rune and it works the same. So the Elisp stays the same. It's
00:11:43.600 --> 00:11:47.119
just the under the hood core that is getting replaced. And
00:11:47.120 --> 00:11:49.199
this in turn adds some new features such as
00:11:49.200 --> 00:11:52.799
multi-threading. So it's not exactly compatible, but
00:11:52.800 --> 00:11:55.559
you should be able to use your existing code and the Elisp will
00:11:55.560 --> 00:12:00.639
stay Elisp. So the idea is that anything that I've written as
00:12:00.640 --> 00:12:04.559
an Emacs user, my config, my custom packages, whatever it
00:12:04.560 --> 00:12:08.999
may be, that's all going to be valid code. If you take, you
00:12:09.000 --> 00:12:13.163
know, the Elisp implementation as being the C code
00:12:13.164 --> 00:12:15.745
and the parts of Elisp written in Elisp
00:12:15.746 --> 00:12:18.448
that represent opportunity space
00:12:18.449 --> 00:12:20.799
thinking about Rust as an implementation language...
00:12:20.800 --> 00:12:24.479
Okay fine. You know, you can make a semantic argument, okay
00:12:24.480 --> 00:12:25.995
we're re-implementing, we're creating
00:12:25.996 --> 00:12:29.018
an alternate implementation of Elisp
00:12:29.019 --> 00:12:31.639
but what Elisp is isn't the problem
00:12:31.640 --> 00:12:35.039
space here. That's a fixed, a given, if you will.
00:12:35.040 --> 00:12:36.065
Is that all right?
00:12:36.066 --> 00:12:39.199
That's a good way of saying it. Okay. Yeah, what you
00:12:39.200 --> 00:12:42.559
said makes sense. I was kind of responding to some comments,
00:12:42.560 --> 00:12:44.959
like I'm not sure it connected for everybody. Makes a lot of
00:12:44.960 --> 00:12:47.399
sense. Yeah, I wasn't sure how much I needed to expand on that
00:12:47.400 --> 00:12:51.119
and explain that, but I appreciate you jumping in.
00:12:51.120 --> 00:12:57.907
Um, okay. So if I were just going to, but...
NOTE Q: Will your Rust implementation also be able to run Emacs bytecode? Or are you implementing it at the Lisp level?
00:12:57.908 --> 00:13:02.239
Will your Rust implementation also be able to run Emacs bytecode or the
00:13:02.240 --> 00:13:04.359
implemented at the Lisp level? So I already have a bytecode
00:13:04.360 --> 00:13:06.759
interpreter inside there that runs the existing Elisp
00:13:06.760 --> 00:13:09.519
bytecode. And so that was one of the first things I did was
00:13:09.520 --> 00:13:11.679
bootstrap the interpreter and then bootstrap the bytecode
00:13:11.680 --> 00:13:14.999
engine. And so we compile, we use the... because the bytecode
00:13:15.000 --> 00:13:19.079
compiler is written in Emacs Lisp. So you bootstrap that
00:13:19.080 --> 00:13:22.919
and it gives you the Emacs bytecode. I have a bytecode
00:13:22.920 --> 00:13:26.039
engine that runs the bytecode. So that's already done. And
00:13:26.040 --> 00:13:28.239
you can potentially, on top of that, do something like the
00:13:28.240 --> 00:13:31.999
data compilation or a JIT. But we have both an
00:13:32.000 --> 00:13:47.019
interpreter and a bytecode compiler.
00:13:47.020 --> 00:13:50.799
And I'll just break in one more time to say with about five
00:13:50.800 --> 00:13:56.319
minutes left in our live time with this Q&A session, which
00:13:56.320 --> 00:13:58.439
we're happy to keep going as long as there are questions.
00:13:58.440 --> 00:14:03.959
Coming up in five minutes, we'll have a talk on color on the
00:14:03.960 --> 00:14:09.639
gen track. And then right here, we'll have the p-search
00:14:09.640 --> 00:14:09.959
talk.
00:14:09.960 --> 00:14:20.099
Thank you.
NOTE Q: Is it possible to bootstrap with just the bytecode interpreter?
00:14:20.100 --> 00:14:22.559
Is it possible to bootstrap with just the bytecode
00:14:22.560 --> 00:14:25.759
interpreter? So I'll have to put in a link to one of my blog
00:14:25.760 --> 00:14:28.519
posts. So that was my original idea was to say, I don't want to
00:14:28.520 --> 00:14:31.559
have an interpreter, a bytecode interpreter and a native
00:14:31.560 --> 00:14:33.180
compiler. I want to just have just one.
00:14:33.181 --> 00:14:36.741
So I'm only going to have the bytecode.
00:14:36.742 --> 00:14:37.708
And so that's what I did initially.
00:14:37.709 --> 00:14:42.079
The problem with that is, is that a bunch of the early bootstrap
00:14:42.080 --> 00:14:45.117
Emacs code is written with the assumption
00:14:45.118 --> 00:14:47.278
that it's going to be interpreted.
00:14:47.279 --> 00:14:49.019
This is especially true with macros,
00:14:49.020 --> 00:14:50.821
where you'll have a function defined,
00:14:50.822 --> 00:14:52.642
you'll evaluate part of the function.
00:14:52.643 --> 00:14:55.599
The other half of the function has macros in it
00:14:55.600 --> 00:14:59.719
that are not defined yet, but it doesn't matter because they
00:14:59.720 --> 00:15:02.399
don't get used. But with the bytecode interpreter, it
00:15:02.400 --> 00:15:04.639
expands all macros when it gets the function definition.
00:15:04.640 --> 00:15:08.799
And so those weren't macros when the function was expanded,
00:15:08.800 --> 00:15:12.359
and therefore they got instantiated as functions, but
00:15:12.360 --> 00:15:15.759
they're not functions, they're macros. And so I initially
00:15:15.760 --> 00:15:18.999
spent a bunch of time trying to work around this, trying to
00:15:19.000 --> 00:15:21.599
move code around, work stuff around, refactor the code to
00:15:21.600 --> 00:15:24.759
try and get it to work with only bytecode interpreter. And
00:15:24.760 --> 00:15:27.039
eventually I just gave up. I said, you know what, I'm just
00:15:27.040 --> 00:15:30.039
going to write an actual interpreter to handle this because
00:15:30.040 --> 00:15:33.799
trying to handle all these lazy macros is too much work. And
00:15:33.800 --> 00:15:35.759
everything in the bootstrap is built with the assumption
00:15:35.760 --> 00:15:37.799
that you have lazy macro expansion.
00:15:37.800 --> 00:15:45.159
I'm guessing the Emacs bytecode interpreter isn't
00:15:45.160 --> 00:15:45.959
complete.
00:15:45.960 --> 00:15:52.279
So it's mostly complete. There's a handful of opcodes that
00:15:52.280 --> 00:15:55.239
aren't implemented that are pretty easy to add that I
00:15:55.240 --> 00:15:57.879
haven't run into. And there's some of them that are
00:15:57.880 --> 00:16:00.119
deprecated that aren't implemented, but it's essentially
00:16:00.120 --> 00:16:00.479
complete.
00:16:00.480 --> 00:16:11.999
We also provide a bytecode JIT compilation via libgcc the
00:16:12.000 --> 00:16:17.344
way Emacs currently does it. Eventually I would like to...
00:16:17.345 --> 00:16:22.919
I'm more inclined to have a proper runtime JIT than an
00:16:22.920 --> 00:16:27.399
ahead-of-time compiler like libgcc, like the current
00:16:27.400 --> 00:16:29.919
Emacs native compilation, because it allows you to take
00:16:29.920 --> 00:16:34.559
type information and actually apply that to the code, which
00:16:34.560 --> 00:17:03.959
can let you do more aggressive optimizations to it.
NOTE What would it take to bootstrap Guile in Rune?
00:17:03.960 --> 00:17:06.319
He said, we may either get a new Emacs with an ancient C core
00:17:06.320 --> 00:17:09.039
with a modern Lisp, or an Emacs with modern core, but stuck
00:17:09.040 --> 00:17:11.879
with ancient Elisp. So there was another project I was
00:17:11.880 --> 00:17:16.639
talking to, one of the Guile implementations, about how we
00:17:16.640 --> 00:17:19.119
could potentially, he was like, what would it take to
00:17:19.120 --> 00:17:24.479
bootstrap Guile in Rune, where you have both, you could have
00:17:24.480 --> 00:17:27.399
Elisp and Guile running inside this project. And so we've
00:17:27.400 --> 00:17:28.999
started that discussion, which I think would be, which
00:17:29.000 --> 00:17:33.999
would be interesting. But it's tricky too, because
00:17:34.000 --> 00:17:36.199
fundamentally Elisp and Guile are two different
00:17:36.200 --> 00:17:38.119
languages. They have different semantics. They have
00:17:38.120 --> 00:17:39.879
different ways of handling things. You've really got to
00:17:39.880 --> 00:17:42.479
consider both of those when you're trying to make them work
00:17:42.480 --> 00:17:42.799
together.
00:17:42.800 --> 00:17:57.319
How would you do the native module system? What would be
00:17:57.320 --> 00:17:59.799
different? We can do the same thing. We have an FFI. So I
00:17:59.800 --> 00:18:03.839
haven't looked into it a ton, but I feel like it could be
00:18:03.840 --> 00:18:06.359
similar. And I'm actually interested, there's a couple
00:18:06.360 --> 00:18:12.759
projects on GitHub right now to have an FFI written in Elisp.
00:18:12.760 --> 00:18:17.239
So you don't even need to create a separate C or Rust module,
00:18:17.240 --> 00:18:21.679
because you can actually write native modules in Rust or C.
00:18:21.680 --> 00:18:25.559
And so you can just have direct bindings to a C FFI written in
00:18:25.560 --> 00:18:27.799
Elisp. You don't need any C code inside there. And I think
00:18:27.800 --> 00:18:33.699
that would be an interesting approach to look at as well.
00:18:33.700 --> 00:18:35.839
Oh, Ramin. Yeah, that's right. We were talking about that,
00:18:35.840 --> 00:18:41.539
about bootstrapping Scheme.
00:18:41.540 --> 00:18:45.519
And at this point, we have broken away from, uh, from this
00:18:45.520 --> 00:18:47.399
talk, but we're continuing to record and this will all be
00:18:47.400 --> 00:18:50.439
published. I'd say, go ahead and keep going as long as you'd
00:18:50.440 --> 00:18:54.959
like in here. And, um, thanks once again for the awesome
00:18:54.960 --> 00:18:58.639
discussion. Thank you so much. So I'll just pay attention to
00:18:58.640 --> 00:19:02.919
the ether pad and the chat and see.
00:19:02.920 --> 00:19:05.919
That sounds good. I'll keep an eye on IRC. And if there are
00:19:05.920 --> 00:19:08.559
more questions here, I'll bounce people toward the ether
00:19:08.560 --> 00:19:12.760
pad or this, uh, chat room. All right, thank you.