summaryrefslogtreecommitdiffstats
path: root/2024/info/guile-after.md
diff options
context:
space:
mode:
authorEmacsConf <emacsconf-org@gnu.org>2024-12-08 09:50:54 -0500
committerEmacsConf <emacsconf-org@gnu.org>2024-12-08 09:50:54 -0500
commit99170a2d2028cd466961cf59cb184c85829973e6 (patch)
treeeeeb48ab126fba9e082629215a2730aefbc5a810 /2024/info/guile-after.md
parent7987b2f3b0c3f8f80e7af8298cf854e75e2c4853 (diff)
downloademacsconf-wiki-99170a2d2028cd466961cf59cb184c85829973e6.tar.xz
emacsconf-wiki-99170a2d2028cd466961cf59cb184c85829973e6.zip
Automated commit
Diffstat (limited to '2024/info/guile-after.md')
-rw-r--r--2024/info/guile-after.md469
1 files changed, 269 insertions, 200 deletions
diff --git a/2024/info/guile-after.md b/2024/info/guile-after.md
index 75a895f9..d7ee06fd 100644
--- a/2024/info/guile-after.md
+++ b/2024/info/guile-after.md
@@ -4,206 +4,275 @@
<a name="guile-mainVideo-transcript"></a>
# Transcript
-[[!template text="""Hello everyone. I'm Robin Templeton, and I'm going to talk""" start="00:00:00.000" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""about Emacs Beguiled and recent progress on the Guile-Emacs""" start="00:00:03.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""project.""" start="00:00:07.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""First of all, if you're not familiar with Guile, it's an""" start="00:00:13.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""implementation of the Scheme programming language, which""" start="00:00:16.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""is a dialect of Lisp, and in the same family as Emacs Lisp, and""" start="00:00:20.240" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Guile is GNU's official extension language. The goal of""" start="00:00:24.800" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the Guile-Emacs project is to use Guile as the basis for""" start="00:00:28.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Emacs's Lisp support. It has two main components: a new""" start="00:00:32.680" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Emacs Lisp compiler built on top of Guile, and a variant of""" start="00:00:37.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Emacs in which the built-in Lisp implementation is""" start="00:00:41.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""entirely replaced with Guile Elisp. We expect the""" start="00:00:45.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""combination of these two projects to have several""" start="00:00:50.240" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""benefits. One is improved performance. Another is""" start="00:00:53.440" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""increased expressiveness for Elisp and making it easier to""" start="00:00:58.000" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""extend and experiment with the language. Finally, it""" start="00:01:03.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""will reduce Emacs's reliance on C for two reasons. Guile will""" start="00:01:07.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""be responsible for the language implementation, so Emacs""" start="00:01:13.080" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""will no longer have to include a Lisp interpreter. It""" start="00:01:16.960" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""will also become possible to implement much more of Emacs in""" start="00:01:21.560" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Lisp than is currently feasible. Of course, this raises""" start="00:01:25.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the question of why Guile is suitable for this project. And""" start="00:01:30.280" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""we chose Guile for a few reasons. Guile is primarily a Scheme""" start="00:01:34.120" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""implementation, but it also has built-in support for""" start="00:01:38.080" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""multiple languages using its compiler tower. To add""" start="00:01:41.120" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""support for a new language to Guile, you only have to write a""" start="00:01:44.400" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""compiler from the source language to Tree-IL, which is""" start="00:01:50.080" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""essentially a low-level, minimal representation of""" start="00:01:53.400" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Scheme. All of Guile's compiler optimizations occur at the""" start="00:01:57.440" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Tree-IL layer or lower, so you don't need to worry about the""" start="00:02:02.480" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""lower-level details of the compiler when initially""" start="00:02:07.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""implementing your language. Guile also has some Lisp""" start="00:02:10.160" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""features that are very rare in Scheme implementations. For""" start="00:02:14.640" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""example, it has a nil value that counts as both false and an""" start="00:02:18.880" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""empty list, just like in Elisp, and it also has a version of""" start="00:02:22.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the Common Lisp Object System and its metaobject protocol,""" start="00:02:27.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""which is called GOOPS.""" start="00:02:32.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""The idea of Guile-Emacs has a pretty long history, going back""" start="00:02:37.240" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""at least three decades. There have been about half a dozen""" start="00:02:42.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""previous implementation attempts. But the current""" start="00:02:45.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""iteration began with a series of six Summer of Code""" start="00:02:48.520" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""internships: Daniel Kraft's in 2009, and then my""" start="00:02:51.520" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""internships from 2010 to 2014. My basic implementation""" start="00:02:56.280" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""strategy was pretty straightforward. I implemented a core""" start="00:03:02.520" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""subset of Elisp, which was enough to run some batch mode""" start="00:03:06.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""programs outside of Emacs. In Emacs, I modified the garbage""" start="00:03:09.680" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""collector and the data structures for Lisp objects to use""" start="00:03:15.400" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""their libguile equivalents. I replaced Emacs' Lisp""" start="00:03:19.680" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""evaluator with the one provided by Guile Elisp.""" start="00:03:24.680" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""After a little over a year of work, at the end of the 2014""" start="00:03:32.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""internship, I ended up with a fully functional prototype of""" start="00:03:35.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Guile-Emacs. It used Guile Elisp alone as its Lisp""" start="00:03:41.080" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""implementation and was completely compatible with Emacs""" start="00:03:46.040" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""functionality and with external extensions. One caveat""" start="00:03:53.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""was that performance was pretty bad, because I was focused""" start="00:03:57.560" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""on correctness, as well as ease of integration with the""" start="00:04:01.400" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Emacs C code. But it was nonetheless a major milestone for""" start="00:04:05.640" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the project. Let's take just a moment to look at""" start="00:04:10.560" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Guile-Elisp.""" start="00:04:15.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""For starters, we have access to Guile modules. If we call""" start="00:04:19.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Guile's <i>version</i> function, we can see that we're running""" start="00:04:23.880" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""under Guile 3.0. We have access to some of the numeric tower via""" start="00:04:26.960" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the arithmetic functions. We also have multiple values. We""" start="00:04:33.880" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""have to be careful to use Guile's <i>values</i> procedure here, not""" start="00:04:41.280" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the CL library's, but you can see that this works properly""" start="00:04:45.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""rather than being an emulation. Finally, we have tail""" start="00:04:48.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""call elimination. Naturally, we're going to use factorial""" start="00:04:52.880" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""to demonstrate it. If <i>n</i> is zero, return the answer, else""" start="00:04:58.000" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""recurse with <i>n</i> less one and <i>n</i> times <i>a</i>.""" start="00:05:07.160" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Of course, this definition works correctly, but it gets""" start="00:05:14.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""more interesting if we communicate the answer with an""" start="00:05:17.120" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""error,""" start="00:05:21.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""in order to look at a backtrace. You can see here that there are no""" start="00:05:27.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""calls to <i>fact</i> visible in between the request to evaluate and""" start="00:05:32.360" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the error communicating the answer. That's because""" start="00:05:37.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""this tail call has been optimized into effectively a goto.""" start="00:05:42.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""This is essential for any kind of serious functional""" start="00:05:53.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""programming.""" start="00:05:55.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""That's a peek at Guile-Elisp. In 2015, I left university""" start="00:06:00.280" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""to go work on web technologies, and the project was dormant""" start="00:06:05.360" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""for a very long time. But that's been changing recently.""" start="00:06:09.480" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""During the last few months, I've been working with Larry""" start="00:06:14.680" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Valkama to rebase Guile-Emacs onto the development branch""" start="00:06:17.040" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""of upstream Emacs, including the past decade's worth of""" start="00:06:23.400" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""upstream development. What we've ended up with is a series""" start="00:06:28.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""of rebases onto different versions of Emacs. The older ones""" start="00:06:33.400" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""tend to work pretty well. The newer ones have increasingly""" start="00:06:38.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""bad problems where they haven't been properly adjusted for""" start="00:06:44.240" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""changes in the Emacs implementation. But we do have by now a""" start="00:06:49.800" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""version of Emacs 30 which boots correctly and can be used for""" start="00:06:55.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""interactive debugging, as well as the ability to bisect the""" start="00:06:58.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""revisions of Emacs and find out where regressions were""" start="00:07:04.960" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""introduced. Our immediate goal is of course to complete""" start="00:07:08.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the rebase. At the same time, we want to improve Guile Elisp's""" start="00:07:13.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""performance to at least be competitive with ordinary Emacs""" start="00:07:19.720" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Lisp. Just to characterize the performance situation,""" start="00:07:22.800" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Guile Elisp is usually about half as fast as ordinary Elisp,""" start="00:07:29.280" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""while Guile Scheme is quite often an order of magnitude""" start="00:07:34.480" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""faster than ordinary Elisp, and that's based on micro""" start="00:07:37.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""benchmarks like the Gabriel benchmarks. But there's""" start="00:07:43.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""clearly a lot of room to improve our compiler's output.""" start="00:07:47.800" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""If you want to mark your calendars, we're expecting to have a""" start="00:07:52.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""usable version of Guile-Emacs 30 out sometime next spring. We're""" start="00:07:57.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""also going to put some effort into either extracting old""" start="00:08:04.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""work or doing new work that could be contributed upstream.""" start="00:08:06.800" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""On the Guile side, we'll probably start out with optimizing""" start="00:08:13.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the dynamic binding facilities, which are used very seldom""" start="00:08:17.560" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""in Scheme, but are used all the time in traditional Lisp""" start="00:08:22.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""dialects. On the Emacs side, we'll be working initially on""" start="00:08:27.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""abstracting away the details of the Lisp implementation""" start="00:08:31.400" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""where they're not relevant. And that will clean up the Emacs""" start="00:08:35.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""code base a bit. It'll make it easier to integrate Emacs and""" start="00:08:40.000" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Guile Elisp. It will probably be helpful for anyone who""" start="00:08:44.280" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""is working on ordinary Elisp on their own.""" start="00:08:49.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""We're also going to be adding new features to Emacs Lisp.""" start="00:08:51.560" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""We've seen a few of them already. The numeric tower, tail""" start="00:08:57.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""call optimization, Common Lisp compatibility. We're also""" start="00:09:01.640" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""going to provide access to Fibers, which is a Guile library""" start="00:09:05.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""based on ideas from Concurrent ML that provides much more""" start="00:09:10.360" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""powerful facilities for concurrent and parallel""" start="00:09:14.640" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""programming than what Emacs currently offers.""" start="00:09:17.680" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""This plan meets Guile-Emacs' basic goals, and it's work""" start="00:09:20.680" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""that we could maybe get integrated upstream in a reasonable""" start="00:09:33.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""amount of time. But it's also worth considering what more we""" start="00:09:36.880" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""can do, and what effect Guile-Emacs might have on Emacs if it""" start="00:09:41.800" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""becomes simply Emacs.""" start="00:09:47.240" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""For context, the amount of C code in Emacs has increased by""" start="00:09:49.080" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""around 50% in the last decade, and now it constitutes around""" start="00:09:54.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""a quarter of the code base. C can be a bit of a barrier to""" start="00:09:58.560" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""customizing and extending Emacs. For example, there are""" start="00:10:06.400" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""about 1500 C subroutines. Around 500 are used in C code, as""" start="00:10:13.280" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""well as available to Lisp code, and being written in C means""" start="00:10:20.440" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""that they can't be practically redefined. The use of C can""" start="00:10:26.520" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""become a barrier to extending Emacs or customizing its""" start="00:10:31.520" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""behavior. We might consider writing as much of Emacs as""" start="00:10:35.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""possible in Lisp. One way to speed up this process would""" start="00:10:40.480" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""be to provide a Common Lisp implementation for Guile. Note""" start="00:10:46.040" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""that between Guile Elisp and Guile Scheme, we have all of""" start="00:10:52.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the essential ingredients for a Common Lisp environment.""" start="00:10:56.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""We can also share code with other Common Lisp""" start="00:10:58.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""implementations such as SBCL and SICL. Overall, the""" start="00:11:03.280" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""duration of the project will be better measured in months""" start="00:11:12.480" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""rather than years, despite Common Lisp's reputation for""" start="00:11:15.960" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""being a large language. This could have multiple uses, of""" start="00:11:19.480" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""course. It could be a model for future improvements to""" start="00:11:23.960" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Elisp, because Elisp and CL can interact directly without""" start="00:11:29.200" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""problems. And it would be very easy for Elisp to borrow""" start="00:11:38.400" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""language features from Common Lisp. But for the purpose of a""" start="00:11:41.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""C to Lisp transition, it would also provide us with instant""" start="00:11:45.480" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""access to a huge number of high-quality libraries for""" start="00:11:49.560" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""things that Guile is not necessarily equipped to deal with,""" start="00:11:52.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""such as access to low-level Windows APIs, as well as lots of""" start="00:11:58.160" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""other libraries, such as interfaces to GUI toolkits for a""" start="00:12:03.880" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""variety of operating systems.""" start="00:12:08.800" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""At a certain point, this has technical advantages. If""" start="00:12:12.080" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""most of Emacs is written in Lisp, then we could consider""" start="00:12:21.800" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""using Guile Hoot to compile Emacs to WebAssembly, making it""" start="00:12:26.120" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""available perhaps in web browsers or on systems with the""" start="00:12:30.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""WebAssembly System Interface. But it would also be a great""" start="00:12:35.160" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""victory for practical software freedom. That's the idea""" start="00:12:40.680" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""that Freedom One, the freedom to study and modify programs,""" start="00:12:44.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""should not just be legally and technically possible, but""" start="00:12:48.360" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""should be actively encouraged by our computing""" start="00:12:52.040" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""environments. Emacs is really one of the archetypal""" start="00:12:54.720" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""examples of this, but we can and should go further.""" start="00:12:58.960" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""When Emacs is implemented primarily in Lisp, the entirety""" start="00:13:02.520" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""of the system will be transparent to examination and open to""" start="00:13:10.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""modification. Every part of Emacs will be instantaneously""" start="00:13:14.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""inspectable, redefinable, and debuggable.""" start="00:13:20.360" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""This will be a fundamental change in what is possible to""" start="00:13:23.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""do with Emacs extensions. For example, one experiment I'd""" start="00:13:30.560" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""be interested in is using the Common Lisp Interface Manager""" start="00:13:36.160" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""as the basis for Emacs's user interface. Screwlisp is""" start="00:13:40.320" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""giving a talk about McCLIM later today, but for present""" start="00:13:46.480" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""purposes, just think of it as a super-powered version of""" start="00:13:52.880" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Emacs's concept of interactive functions. It would be a""" start="00:13:55.920" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""pretty long-term project in Emacs as it currently exists,""" start="00:14:01.280" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""but it would be almost trivial if Emacs were customizable at""" start="00:14:04.800" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""the lowest layers via Lisp.""" start="00:14:10.520" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""We'll certainly be looking at the practicality of these""" start="00:14:11.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""kinds of changes as we continue developing Guile-Emacs.""" start="00:14:19.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Finally, how can you get involved with and support Guile""" start="00:14:23.840" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Emacs? One way to help is just by trying it out and letting us""" start="00:14:31.720" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""know what your experiences are like. There will be a""" start="00:14:36.000" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""snapshot available on the Codeberg project site of the""" start="00:14:40.520" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""version that I'm using to give this presentation. It will be""" start="00:14:44.080" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""available both as a Guix package and as a portable tarball.""" start="00:14:48.760" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""This will be more interesting as we get closer to a complete""" start="00:14:52.720" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""rebase. We're also always happy to talk to potential""" start="00:14:58.800" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""contributors or potential collaborators from other""" start="00:15:05.480" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""projects.""" start="00:15:10.880" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""We can always use bug reports, and we're interested in what""" start="00:15:11.600" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""kind of features people actually want to see in Guile-Emacs.""" start="00:15:18.160" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""Guile-Emacs is also being developed by a small worker""" start="00:15:21.720" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""cooperative, so donations are a pretty direct way to""" start="00:15:27.360" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""support the project. If you do nothing else, I recommend""" start="00:15:32.160" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""going to the website and subscribing to our mailing lists so""" start="00:15:36.040" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""that you can keep up with news on the project. If you're""" start="00:15:40.720" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""watching this at EmacsConf, there will be a Q&A session""" start="00:15:45.880" video="mainVideo-guile" id="subtitle"]]
-[[!template text="""immediately following this, and thanks for watching!""" start="00:15:49.240" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Hello everyone, I'm Robin Templeton,""" start="00:00:00.000" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and I'm going to talk about Emacs Beguiled""" start="00:00:03.083" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and recent progress on the Guile Emacs project.""" start="00:00:05.766" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""First of all, if you're not familiar with Guile,""" start="00:00:13.883" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""it's an implementation of the Scheme programming language,""" start="00:00:16.450" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""which is a dialect of Lisp,""" start="00:00:19.733" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and in the same family as Emacs Lisp,""" start="00:00:22.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and Guile is GNU's official extension language.""" start="00:00:24.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""The goal of the Guile Emacs project""" start="00:00:28.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""is to use Guile as the basis for Emacs's Lisp support.""" start="00:00:30.400" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""It has two main components:""" start="00:00:34.966" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""a new Emacs Lisp compiler built on top of Guile,""" start="00:00:37.133" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and a variant of Emacs""" start="00:00:41.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""in which the built-in Lisp implementation""" start="00:00:42.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""is entirely replaced with Guile Elisp.""" start="00:00:45.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""We expect the combination of these two projects""" start="00:00:49.733" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""to have several benefits. One is improved performance.""" start="00:00:52.800" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Another is increased expressiveness for Elisp""" start="00:00:57.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and making it easier to extend""" start="00:01:00.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and experiment with the language.""" start="00:01:04.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Finally, it will reduce""" start="00:01:07.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Emacs's reliance on C for two reasons.""" start="00:01:08.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Guile will be responsible for the language implementation,""" start="00:01:12.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""so Emacs will no longer have to include a Lisp interpreter.""" start="00:01:16.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""It will also become possible""" start="00:01:21.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""to implement much more of Emacs in Lisp""" start="00:01:23.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""than is currently feasible.""" start="00:01:25.683" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Of course, this raises the question of""" start="00:01:29.250" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""why Guile is suitable for this product.""" start="00:01:31.133" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""And we chose Guile for a few reasons.""" start="00:01:34.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Guile is primarily a Scheme implementation,""" start="00:01:36.683" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""but it also has built-in support for multiple languages""" start="00:01:39.400" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""using its compiler tower.""" start="00:01:42.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""To add support for a new language to Guile,""" start="00:01:43.483" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""You only have to write a compiler""" start="00:01:46.883" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""from the source language to TRIAL[??],""" start="00:01:50.083" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""which is essentially a low-level,""" start="00:01:52.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""minimal representation of Scheme.""" start="00:01:55.800" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""All of Guile's compiler optimizations""" start="00:01:58.883" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""occur at the TRIAL[??] layer or lower,""" start="00:02:01.800" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""so you don't need to worry""" start="00:02:04.450" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""about the lower-level details of the compiler""" start="00:02:06.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""when initially implementing your language.""" start="00:02:09.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Guile also has some Lisp features""" start="00:02:12.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""that are very rare in schema implementations.""" start="00:02:14.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""For example, it has a nil value""" start="00:02:18.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""that counts as both false and an empty list,""" start="00:02:20.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""just like an Elisp,""" start="00:02:23.933" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and it also has a version of the Common Lisp object system""" start="00:02:25.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and its metoptic[??] protocol, which is called GOOPS.""" start="00:02:30.483" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""The idea of Guile Emacs has a pretty long history.""" start="00:02:37.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""going back at least three decades.""" start="00:02:40.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""There have been about""" start="00:02:43.883" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""half a dozen previous implementation attempts.""" start="00:02:44.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""But the current iteration began with""" start="00:02:48.000" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""a series of six Summer of Code internships,""" start="00:02:49.966" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Daniel Kraft's[??] in 2009,""" start="00:02:52.883" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and then my internships from 2010 to 2014.""" start="00:02:56.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""My basic implementation strategy""" start="00:03:01.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""was pretty straightforward.""" start="00:03:03.000" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""I implemented a core subset of Elisp,""" start="00:03:05.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""which was enough to run some batch mode programs""" start="00:03:07.483" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""outside of Emacs.""" start="00:03:10.400" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""In Emacs, I modified the garbage collector""" start="00:03:12.850" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and the data structures for Lisp objects""" start="00:03:15.283" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""to use their libgal equivalents.""" start="00:03:18.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""I replaced Emacs' Lisp evaluator""" start="00:03:23.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""with the one provided by guile-elisp.[??]""" start="00:03:26.966" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""After a little over a year of work""" start="00:03:32.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""at the end of the 2014 internship,""" start="00:03:34.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""I ended up with a fully functional prototype of Guile Emacs.""" start="00:03:37.966" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""It used Guile Elisp alone as its Lisp implementation""" start="00:03:44.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and was completely compatible with Emacs functionality""" start="00:03:48.933" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and with external extensions.""" start="00:03:53.933" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""One caveat was that performance was pretty bad,""" start="00:03:56.733" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""because I was focused on correctness,""" start="00:03:59.450" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""as well as ease of integration with the Emacs C code.""" start="00:04:03.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""But it was nonetheless a major milestone for the project.""" start="00:04:07.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Let's take just a moment to look at guile-elisp.""" start="00:04:11.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""For starters, we have access to guile modules.""" start="00:04:19.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""If we call guile's version function,""" start="00:04:23.250" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""we can see that we're running under guile 3.0,""" start="00:04:25.133" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""have access to some of the numeric tower""" start="00:04:30.533" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""via the arithmetic functions. We also have multiple values.""" start="00:04:33.250" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""We have to be careful to use Guile's values procedure here,""" start="00:04:39.533" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""not the CL libraries,""" start="00:04:43.966" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""but you can see that this works properly""" start="00:04:46.683" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""rather than being an emulation.""" start="00:04:48.850" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Finally, we have tail call elimination.""" start="00:04:51.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Naturally, we're going to use factorial to demonstrate it.""" start="00:04:54.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""If n is zero, return the answer,""" start="00:05:02.883" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""else recurse with n less one and n times a.""" start="00:05:05.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Of course this definition works correctly,""" start="00:05:14.283" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""but it gets more interesting""" start="00:05:16.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""if we communicate the answer with an error.""" start="00:05:18.966" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""or to look at a backtrace.""" start="00:05:25.100" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""You can see here that there are""" start="00:05:29.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""no calls to fact visible in between""" start="00:05:32.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""the request to evaluate""" start="00:05:35.533" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and the error communicating the answer.""" start="00:05:37.850" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""That's because this tail call""" start="00:05:42.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""has been optimized into effectively a goto.""" start="00:05:44.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""This is essential for any kind""" start="00:05:48.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""of serious functional programming.""" start="00:05:54.933" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""That's a peek at guile-elisp.""" start="00:06:00.116" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""In 2015, I left university to go work on web technologies,""" start="00:06:03.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and the project was dormant for a very long time.""" start="00:06:08.083" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""But that's been changing recently.""" start="00:06:11.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""During the last few months,""" start="00:06:13.450" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""I've been working with Larry Valkama[??]""" start="00:06:16.083" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""to rebase guile-emacs""" start="00:06:17.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""onto the development branch of upstream emacs,""" start="00:06:20.733" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""including the past decade's worth of upstream development.""" start="00:06:24.850" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""What we've ended up with is a series of""" start="00:06:29.683" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""rebases onto different versions of Emacs.""" start="00:06:34.267" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""The older ones tend to work pretty well.""" start="00:06:37.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""The newer ones have increasingly bad problems""" start="00:06:39.533" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""where they haven't been properly adjusted""" start="00:06:46.883" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""for changes in the Emacs implementation.""" start="00:06:49.800" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""but we do have by now a version of Emacs 30""" start="00:06:52.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""which boots correctly""" start="00:06:56.850" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and can be used for interactive debugging,""" start="00:06:57.800" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""as well as the ability to bisect the revisions of Emacs""" start="00:06:59.850" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and find out where regressions were introduced.""" start="00:07:06.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Our immediate goal is of course to complete the rebase.""" start="00:07:10.533" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""At the same time,""" start="00:07:14.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""we want to improve Guile Elisp's performance""" start="00:07:16.250" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""to at least be competitive with ordinary Emacs Lisp.""" start="00:07:20.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Just to characterize the performance situation,""" start="00:07:24.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Guile Elisp is usually about half""" start="00:07:29.283" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""as fast as ordinary Elisp,""" start="00:07:32.766" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""while Guile Scheme is quite often""" start="00:07:34.483" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""an order of magnitude faster than ordinary Elisp,""" start="00:07:37.850" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and that's based on micro benchmarks""" start="00:07:41.350" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""like the Gabriel[??] benchmarks.""" start="00:07:43.933" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""but there's clearly a lot of room""" start="00:07:46.233" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""to improve our compiler's output.""" start="00:07:50.900" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""If you want to mark your calendars,""" start="00:07:53.350" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""we're expecting to have a usable version of Guile Emacs 30""" start="00:07:56.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""out sometime next spring.""" start="00:08:00.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""We're also going to put some effort""" start="00:08:03.116" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""into either extracting old work""" start="00:08:05.450" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""or doing new work that could be contributed upstream.""" start="00:08:09.100" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""On the Guile side, we'll probably start out with""" start="00:08:12.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""optimizing the dynamic binding facilities,""" start="00:08:16.750" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""which are used very seldom in Scheme,""" start="00:08:21.233" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""but are used all the time in traditional Lisp dialects.""" start="00:08:23.450" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""On the Emacs side, we'll be working initially""" start="00:08:27.850" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""on abstracting away the details of the Lisp implementation""" start="00:08:31.400" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""where they're not relevant,""" start="00:08:35.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""And that will clean up the Emacs code base a bit.""" start="00:08:37.533" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""It'll make it easier to integrate Emacs and Guile Elisp.""" start="00:08:40.733" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""It will probably be helpful for anyone""" start="00:08:45.000" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""who is working on ordinary Elisp on their own.""" start="00:08:47.933" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""We're also going to be adding new features to Emacs Lisp.""" start="00:08:51.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""We've seen a few of them already.""" start="00:08:57.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""The new [??] tower, tail call optimization,""" start="00:08:59.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""common list compatibility.""" start="00:09:02.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""We're also going to provide access to Fibers,""" start="00:09:04.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""which is a guide library based on ideas from concurrent ML""" start="00:09:07.966" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""that provides much more powerful facilities""" start="00:09:12.483" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""for concurrent and parallel programming""" start="00:09:15.733" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""than what Emacs currently offers.""" start="00:09:18.283" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""This plan meets Guile Emacs' basic goals,""" start="00:09:24.666" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and it's work that we could maybe get integrated upstream""" start="00:09:32.250" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""in a reasonable amount of time.""" start="00:09:36.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""But it's also worth considering what more we can do,""" start="00:09:38.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and what effect Guile Emacs might have on Emacs""" start="00:09:42.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""if it becomes simply Emacs.""" start="00:09:46.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""For context, the amount of C code in Emacs""" start="00:09:50.666" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""has increased by around 50% in the last decade,""" start="00:09:54.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and now it constitutes around a quarter of the code base.""" start="00:09:57.400" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""C can be a bit of a barrier""" start="00:09:59.966" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""to customizing and extending Emacs.""" start="00:10:06.400" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""For example, there are about 1500 C subroutines.""" start="00:10:11.000" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Around 500 are used in C code,""" start="00:10:15.533" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""as well as available to Lisp code,""" start="00:10:19.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and being written in C means""" start="00:10:23.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""that they can't be practically redefined.""" start="00:10:25.800" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""the use of C can become a barrier to extending Emacs""" start="00:10:28.083" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""or customizing its behavior.""" start="00:10:34.450" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""We might consider writing""" start="00:10:36.250" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""as much of Emacs as possible in Lisp.""" start="00:10:39.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""One way to speed up this process""" start="00:10:42.916" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""would be to provide a common Lisp implementation for Guile.""" start="00:10:46.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Note that between guile-elisp and guile-scheme,""" start="00:10:49.400" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""we have all of the essential ingredients""" start="00:10:54.850" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""for a Common Lisp environment. We can also share code""" start="00:10:57.533" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""with other Common Lisp implementations""" start="00:11:03.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""such as SBCL and SICL[??].""" start="00:11:06.016" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Overall, the duration of the project""" start="00:11:10.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""will be better measured in months rather than years,""" start="00:11:13.800" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""despite Common Lisp's reputation""" start="00:11:16.933" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""for being a large language.""" start="00:11:19.483" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""This could have multiple uses, of course.""" start="00:11:21.216" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""It could be a model for future improvements to Elisp,""" start="00:11:24.483" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""because Elisp and CL can interact directly without problems.""" start="00:11:29.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and it would be very easy for Elisp""" start="00:11:34.883" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""to borrow language features from Common Lisp.""" start="00:11:38.400" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""But for the purpose of a C to Lisp transition,""" start="00:11:41.483" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""it would also provide us with instant access""" start="00:11:46.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""to a huge number of high-quality libraries""" start="00:11:50.083" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""for things that""" start="00:11:52.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Guile is not necessarily equipped to deal with,""" start="00:11:54.850" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""such as access to low-level Windows APIs,""" start="00:11:58.133" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""as well as lots of other libraries,""" start="00:12:01.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""such as interfaces to GUI toolkits""" start="00:12:05.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""for a variety of operating systems.""" start="00:12:10.000" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""At a certain point, this has technical advantages.""" start="00:12:13.866" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""If most of Emacs is written in Lisp,""" start="00:12:20.566" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""then we could consider using Guile Hoot""" start="00:12:24.216" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""to compile Emacs to WebAssembly,""" start="00:12:27.250" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""making it available perhaps in web browsers""" start="00:12:29.683" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""or on systems with the WebAssembly system interface.""" start="00:12:33.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""But it would also be a great victory""" start="00:12:37.250" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""for practical software freedom.""" start="00:12:41.283" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""That's the idea that freedom one,""" start="00:12:43.050" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""the freedom to study and modify programs,""" start="00:12:45.883" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""should not just be legally and technically possible,""" start="00:12:48.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""but should be actively encouraged""" start="00:12:51.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""by our competing environments.""" start="00:12:53.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Emacs is really one of the archetypal examples of this,""" start="00:12:57.083" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""but we can and should go further.""" start="00:13:00.133" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""When Emacs is implemented primarily in Lisp,""" start="00:13:03.216" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""the entirety of the system""" start="00:13:08.400" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""will be transparent to examination""" start="00:13:11.483" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and open to modification.""" start="00:13:14.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Every part of Emacs will be instantaneously inspectable,""" start="00:13:16.083" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""redefinable, and debuggable.""" start="00:13:21.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""This will be a fundamental change""" start="00:13:25.016" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""in what is possible to do with Emacs extensions.""" start="00:13:28.283" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""For example, one experiment I'd be interested in""" start="00:13:32.800" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""is using the Common Lisp Interface Manager""" start="00:13:37.000" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""as the basis for Emacs's user interface.""" start="00:13:40.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Screwlisp is giving a talk about McCLIM later today,""" start="00:13:43.250" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""but for present purposes,""" start="00:13:48.533" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""just think of it as a super-powered version""" start="00:13:53.250" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""of Emacs's concept of interactive functions.""" start="00:13:55.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""It would be a pretty long-term project""" start="00:13:58.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""in Emacs as it currently exists,""" start="00:14:02.800" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""but it would be almost trivial""" start="00:14:04.800" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""if Emacs were customizable at the lowest layers via Lisp.""" start="00:14:06.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""We'll certainly be looking at the practicality""" start="00:14:12.650" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""of these kinds of changes""" start="00:14:19.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""as we continue developing Guile Emacs.""" start="00:14:20.966" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Finally, how can you get involved""" start="00:14:25.133" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""with and support Guile Emacs?""" start="00:14:30.033" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""One way to help is just by trying it out""" start="00:14:32.500" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and letting us know what your experiences are like.""" start="00:14:35.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""There will be a snapshot available""" start="00:14:37.816" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""on the Codeberg project site""" start="00:14:41.483" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""of the version that I'm using to give this presentation.""" start="00:14:44.266" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""It will be available both as a Guix package""" start="00:14:47.000" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and as a portable tarball. This will be more interesting""" start="00:14:51.133" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""as we get closer to a complete rebase.""" start="00:14:55.933" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""We're also always happy to talk to potential contributors""" start="00:15:00.366" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""or potential collaborators from other projects.""" start="00:15:06.533" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""We can always use bug reports,""" start="00:15:12.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and we're interested in what kind of features""" start="00:15:16.450" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""people actually want to see in Guile Emacs.""" start="00:15:18.883" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""Guile Emacs is also being developed""" start="00:15:21.733" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""by a small worker cooperative,""" start="00:15:25.300" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""so donations are a pretty direct way to support the project.""" start="00:15:27.916" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""If you do nothing else, I recommend going to the website""" start="00:15:33.200" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and subscribing to our mailing lists""" start="00:15:37.166" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""so that you can keep up with news on the project.""" start="00:15:40.733" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""If you're watching this at Emacsconf,""" start="00:15:45.600" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""there will be a Q&A session immediately following this,""" start="00:15:47.333" video="mainVideo-guile" id="subtitle"]]
+[[!template text="""and thanks for watching.""" start="00:15:50.483" video="mainVideo-guile" id="subtitle"]]