summaryrefslogtreecommitdiffstats
path: root/2024
diff options
context:
space:
mode:
Diffstat (limited to '2024')
-rw-r--r--2024/captions/emacsconf-2024-guile--beguiling-emacs-guileemacs-relaunched--robin-templeton--main.vtt601
-rw-r--r--2024/info/guile-after.md204
-rw-r--r--2024/info/guile-before.md8
-rw-r--r--2024/schedule-image.md2
4 files changed, 810 insertions, 5 deletions
diff --git a/2024/captions/emacsconf-2024-guile--beguiling-emacs-guileemacs-relaunched--robin-templeton--main.vtt b/2024/captions/emacsconf-2024-guile--beguiling-emacs-guileemacs-relaunched--robin-templeton--main.vtt
new file mode 100644
index 00000000..b4e7cdc8
--- /dev/null
+++ b/2024/captions/emacsconf-2024-guile--beguiling-emacs-guileemacs-relaunched--robin-templeton--main.vtt
@@ -0,0 +1,601 @@
+WEBVTT captioned by sachac and robin
+
+00:00:00.000 --> 00:00:03.839
+Hello everyone. I'm Robin Templeton, and I'm going to talk
+
+00:00:03.840 --> 00:00:07.919
+about Emacs Beguiled and recent progress on the Guile-Emacs
+
+00:00:07.920 --> 00:00:13.919
+project.
+
+00:00:13.920 --> 00:00:16.839
+First of all, if you're not familiar with Guile, it's an
+
+00:00:16.840 --> 00:00:20.239
+implementation of the Scheme programming language, which
+
+00:00:20.240 --> 00:00:24.799
+is a dialect of Lisp, and in the same family as Emacs Lisp, and
+
+00:00:24.800 --> 00:00:28.759
+Guile is GNU's official extension language. The goal of
+
+00:00:28.760 --> 00:00:32.679
+the Guile-Emacs project is to use Guile as the basis for
+
+00:00:32.680 --> 00:00:37.599
+Emacs's Lisp support. It has two main components: a new
+
+00:00:37.600 --> 00:00:41.919
+Emacs Lisp compiler built on top of Guile, and a variant of
+
+00:00:41.920 --> 00:00:45.199
+Emacs in which the built-in Lisp implementation is
+
+00:00:45.200 --> 00:00:50.239
+entirely replaced with Guile Elisp. We expect the
+
+00:00:50.240 --> 00:00:53.439
+combination of these two projects to have several
+
+00:00:53.440 --> 00:00:57.999
+benefits. One is improved performance. Another is
+
+00:00:58.000 --> 00:01:03.839
+increased expressiveness for Elisp and making it easier to
+
+00:01:03.840 --> 00:01:07.839
+extend and experiment with the language. Finally, it
+
+00:01:07.840 --> 00:01:13.079
+will reduce Emacs's reliance on C for two reasons. Guile will
+
+00:01:13.080 --> 00:01:16.959
+be responsible for the language implementation, so Emacs
+
+00:01:16.960 --> 00:01:21.559
+will no longer have to include a Lisp interpreter. It
+
+00:01:21.560 --> 00:01:25.759
+will also become possible to implement much more of Emacs in
+
+00:01:25.760 --> 00:01:30.279
+Lisp than is currently feasible. Of course, this raises
+
+00:01:30.280 --> 00:01:34.119
+the question of why Guile is suitable for this project. And
+
+00:01:34.120 --> 00:01:38.079
+we chose Guile for a few reasons. Guile is primarily a Scheme
+
+00:01:38.080 --> 00:01:41.119
+implementation, but it also has built-in support for
+
+00:01:41.120 --> 00:01:44.399
+multiple languages using its compiler tower. To add
+
+00:01:44.400 --> 00:01:50.079
+support for a new language to Guile, you only have to write a
+
+00:01:50.080 --> 00:01:53.399
+compiler from the source language to Tree-IL, which is
+
+00:01:53.400 --> 00:01:57.439
+essentially a low-level, minimal representation of
+
+00:01:57.440 --> 00:02:02.479
+Scheme. All of Guile's compiler optimizations occur at the
+
+00:02:02.480 --> 00:02:07.599
+Tree-IL layer or lower, so you don't need to worry about the
+
+00:02:07.600 --> 00:02:10.159
+lower-level details of the compiler when initially
+
+00:02:10.160 --> 00:02:14.639
+implementing your language. Guile also has some Lisp
+
+00:02:14.640 --> 00:02:18.879
+features that are very rare in Scheme implementations. For
+
+00:02:18.880 --> 00:02:22.599
+example, it has a nil value that counts as both false and an
+
+00:02:22.600 --> 00:02:27.759
+empty list, just like in Elisp, and it also has a version of
+
+00:02:27.760 --> 00:02:32.319
+the Common Lisp Object System and its metaobject protocol,
+
+00:02:32.320 --> 00:02:37.239
+which is called GOOPS.
+
+00:02:37.240 --> 00:02:42.199
+The idea of Guile-Emacs has a pretty long history, going back
+
+00:02:42.200 --> 00:02:45.319
+at least three decades. There have been about half a dozen
+
+00:02:45.320 --> 00:02:48.519
+previous implementation attempts. But the current
+
+00:02:48.520 --> 00:02:51.519
+iteration began with a series of six Summer of Code
+
+00:02:51.520 --> 00:02:56.279
+internships: Daniel Kraft's in 2009, and then my
+
+00:02:56.280 --> 00:03:02.519
+internships from 2010 to 2014. My basic implementation
+
+00:03:02.520 --> 00:03:06.319
+strategy was pretty straightforward. I implemented a core
+
+00:03:06.320 --> 00:03:09.679
+subset of Elisp, which was enough to run some batch mode
+
+00:03:09.680 --> 00:03:15.399
+programs outside of Emacs. In Emacs, I modified the garbage
+
+00:03:15.400 --> 00:03:19.679
+collector and the data structures for Lisp objects to use
+
+00:03:19.680 --> 00:03:24.679
+their libguile equivalents. I replaced Emacs' Lisp
+
+00:03:24.680 --> 00:03:32.199
+evaluator with the one provided by Guile Elisp.
+
+00:03:32.200 --> 00:03:35.919
+After a little over a year of work, at the end of the 2014
+
+00:03:35.920 --> 00:03:41.079
+internship, I ended up with a fully functional prototype of
+
+00:03:41.080 --> 00:03:46.039
+Guile-Emacs. It used Guile Elisp alone as its Lisp
+
+00:03:46.040 --> 00:03:53.319
+implementation and was completely compatible with Emacs
+
+00:03:53.320 --> 00:03:57.559
+functionality and with external extensions. One caveat
+
+00:03:57.560 --> 00:04:01.399
+was that performance was pretty bad, because I was focused
+
+00:04:01.400 --> 00:04:05.639
+on correctness, as well as ease of integration with the
+
+00:04:05.640 --> 00:04:10.559
+Emacs C code. But it was nonetheless a major milestone for
+
+00:04:10.560 --> 00:04:15.759
+the project. Let's take just a moment to look at
+
+00:04:15.760 --> 00:04:19.599
+Guile-Elisp.
+
+00:04:19.600 --> 00:04:23.879
+For starters, we have access to Guile modules. If we call
+
+00:04:23.880 --> 00:04:26.959
+Guile's <i>version</i> function, we can see that we're running
+
+00:04:26.960 --> 00:04:33.879
+under Guile 3.0. We have access to some of the numeric tower via
+
+00:04:33.880 --> 00:04:41.279
+the arithmetic functions. We also have multiple values. We
+
+00:04:41.280 --> 00:04:45.599
+have to be careful to use Guile's <i>values</i> procedure here, not
+
+00:04:45.600 --> 00:04:48.839
+the CL library's, but you can see that this works properly
+
+00:04:48.840 --> 00:04:52.879
+rather than being an emulation. Finally, we have tail
+
+00:04:52.880 --> 00:04:57.999
+call elimination. Naturally, we're going to use factorial
+
+00:04:58.000 --> 00:05:07.159
+to demonstrate it. If <i>n</i> is zero, return the answer, else
+
+00:05:07.160 --> 00:05:14.199
+recurse with <i>n</i> less one and <i>n</i> times <i>a</i>.
+
+00:05:14.200 --> 00:05:17.119
+Of course, this definition works correctly, but it gets
+
+00:05:17.120 --> 00:05:21.759
+more interesting if we communicate the answer with an
+
+00:05:21.760 --> 00:05:27.759
+error,
+
+00:05:27.760 --> 00:05:32.359
+in order to look at a backtrace. You can see here that there are no
+
+00:05:32.360 --> 00:05:37.839
+calls to <i>fact</i> visible in between the request to evaluate and
+
+00:05:37.840 --> 00:05:42.199
+the error communicating the answer. That's because
+
+00:05:42.200 --> 00:05:53.319
+this tail call has been optimized into effectively a goto.
+
+00:05:53.320 --> 00:05:55.759
+This is essential for any kind of serious functional
+
+00:05:55.760 --> 00:06:00.279
+programming.
+
+00:06:00.280 --> 00:06:05.359
+That's a peek at Guile-Elisp. In 2015, I left university
+
+00:06:05.360 --> 00:06:09.479
+to go work on web technologies, and the project was dormant
+
+00:06:09.480 --> 00:06:14.679
+for a very long time. But that's been changing recently.
+
+00:06:14.680 --> 00:06:17.039
+During the last few months, I've been working with Larry
+
+00:06:17.040 --> 00:06:23.399
+Valkama to rebase Guile-Emacs onto the development branch
+
+00:06:23.400 --> 00:06:28.319
+of upstream Emacs, including the past decade's worth of
+
+00:06:28.320 --> 00:06:33.399
+upstream development. What we've ended up with is a series
+
+00:06:33.400 --> 00:06:38.839
+of rebases onto different versions of Emacs. The older ones
+
+00:06:38.840 --> 00:06:44.239
+tend to work pretty well. The newer ones have increasingly
+
+00:06:44.240 --> 00:06:49.799
+bad problems where they haven't been properly adjusted for
+
+00:06:49.800 --> 00:06:55.599
+changes in the Emacs implementation. But we do have by now a
+
+00:06:55.600 --> 00:06:58.919
+version of Emacs 30 which boots correctly and can be used for
+
+00:06:58.920 --> 00:07:04.959
+interactive debugging, as well as the ability to bisect the
+
+00:07:04.960 --> 00:07:08.919
+revisions of Emacs and find out where regressions were
+
+00:07:08.920 --> 00:07:13.199
+introduced. Our immediate goal is of course to complete
+
+00:07:13.200 --> 00:07:19.719
+the rebase. At the same time, we want to improve Guile Elisp's
+
+00:07:19.720 --> 00:07:22.799
+performance to at least be competitive with ordinary Emacs
+
+00:07:22.800 --> 00:07:29.279
+Lisp. Just to characterize the performance situation,
+
+00:07:29.280 --> 00:07:34.479
+Guile Elisp is usually about half as fast as ordinary Elisp,
+
+00:07:34.480 --> 00:07:37.839
+while Guile Scheme is quite often an order of magnitude
+
+00:07:37.840 --> 00:07:43.319
+faster than ordinary Elisp, and that's based on micro
+
+00:07:43.320 --> 00:07:47.799
+benchmarks like the Gabriel benchmarks. But there's
+
+00:07:47.800 --> 00:07:52.319
+clearly a lot of room to improve our compiler's output.
+
+00:07:52.320 --> 00:07:57.759
+If you want to mark your calendars, we're expecting to have a
+
+00:07:57.760 --> 00:08:04.199
+usable version of Guile-Emacs 30 out sometime next spring. We're
+
+00:08:04.200 --> 00:08:06.799
+also going to put some effort into either extracting old
+
+00:08:06.800 --> 00:08:13.599
+work or doing new work that could be contributed upstream.
+
+00:08:13.600 --> 00:08:17.559
+On the Guile side, we'll probably start out with optimizing
+
+00:08:17.560 --> 00:08:22.839
+the dynamic binding facilities, which are used very seldom
+
+00:08:22.840 --> 00:08:27.199
+in Scheme, but are used all the time in traditional Lisp
+
+00:08:27.200 --> 00:08:31.399
+dialects. On the Emacs side, we'll be working initially on
+
+00:08:31.400 --> 00:08:35.919
+abstracting away the details of the Lisp implementation
+
+00:08:35.920 --> 00:08:39.999
+where they're not relevant. And that will clean up the Emacs
+
+00:08:40.000 --> 00:08:44.279
+code base a bit. It'll make it easier to integrate Emacs and
+
+00:08:44.280 --> 00:08:49.919
+Guile Elisp. It will probably be helpful for anyone who
+
+00:08:49.920 --> 00:08:51.559
+is working on ordinary Elisp on their own.
+
+00:08:51.560 --> 00:08:57.199
+We're also going to be adding new features to Emacs Lisp.
+
+00:08:57.200 --> 00:09:01.639
+We've seen a few of them already. The numeric tower, tail
+
+00:09:01.640 --> 00:09:05.919
+call optimization, Common Lisp compatibility. We're also
+
+00:09:05.920 --> 00:09:10.359
+going to provide access to Fibers, which is a Guile library
+
+00:09:10.360 --> 00:09:14.639
+based on ideas from Concurrent ML that provides much more
+
+00:09:14.640 --> 00:09:17.679
+powerful facilities for concurrent and parallel
+
+00:09:17.680 --> 00:09:20.679
+programming than what Emacs currently offers.
+
+00:09:20.680 --> 00:09:33.759
+This plan meets Guile-Emacs' basic goals, and it's work
+
+00:09:33.760 --> 00:09:36.879
+that we could maybe get integrated upstream in a reasonable
+
+00:09:36.880 --> 00:09:41.799
+amount of time. But it's also worth considering what more we
+
+00:09:41.800 --> 00:09:47.239
+can do, and what effect Guile-Emacs might have on Emacs if it
+
+00:09:47.240 --> 00:09:49.079
+becomes simply Emacs.
+
+00:09:49.080 --> 00:09:54.599
+For context, the amount of C code in Emacs has increased by
+
+00:09:54.600 --> 00:09:58.559
+around 50% in the last decade, and now it constitutes around
+
+00:09:58.560 --> 00:10:06.399
+a quarter of the code base. C can be a bit of a barrier to
+
+00:10:06.400 --> 00:10:13.279
+customizing and extending Emacs. For example, there are
+
+00:10:13.280 --> 00:10:20.439
+about 1500 C subroutines. Around 500 are used in C code, as
+
+00:10:20.440 --> 00:10:26.519
+well as available to Lisp code, and being written in C means
+
+00:10:26.520 --> 00:10:31.519
+that they can't be practically redefined. The use of C can
+
+00:10:31.520 --> 00:10:35.839
+become a barrier to extending Emacs or customizing its
+
+00:10:35.840 --> 00:10:40.479
+behavior. We might consider writing as much of Emacs as
+
+00:10:40.480 --> 00:10:46.039
+possible in Lisp. One way to speed up this process would
+
+00:10:46.040 --> 00:10:52.199
+be to provide a Common Lisp implementation for Guile. Note
+
+00:10:52.200 --> 00:10:56.199
+that between Guile Elisp and Guile Scheme, we have all of
+
+00:10:56.200 --> 00:10:58.839
+the essential ingredients for a Common Lisp environment.
+
+00:10:58.840 --> 00:11:03.279
+We can also share code with other Common Lisp
+
+00:11:03.280 --> 00:11:12.479
+implementations such as SBCL and SICL. Overall, the
+
+00:11:12.480 --> 00:11:15.959
+duration of the project will be better measured in months
+
+00:11:15.960 --> 00:11:19.479
+rather than years, despite Common Lisp's reputation for
+
+00:11:19.480 --> 00:11:23.959
+being a large language. This could have multiple uses, of
+
+00:11:23.960 --> 00:11:29.199
+course. It could be a model for future improvements to
+
+00:11:29.200 --> 00:11:38.399
+Elisp, because Elisp and CL can interact directly without
+
+00:11:38.400 --> 00:11:41.319
+problems. And it would be very easy for Elisp to borrow
+
+00:11:41.320 --> 00:11:45.479
+language features from Common Lisp. But for the purpose of a
+
+00:11:45.480 --> 00:11:49.559
+C to Lisp transition, it would also provide us with instant
+
+00:11:49.560 --> 00:11:52.599
+access to a huge number of high-quality libraries for
+
+00:11:52.600 --> 00:11:58.159
+things that Guile is not necessarily equipped to deal with,
+
+00:11:58.160 --> 00:12:03.879
+such as access to low-level Windows APIs, as well as lots of
+
+00:12:03.880 --> 00:12:08.799
+other libraries, such as interfaces to GUI toolkits for a
+
+00:12:08.800 --> 00:12:12.079
+variety of operating systems.
+
+00:12:12.080 --> 00:12:21.799
+At a certain point, this has technical advantages. If
+
+00:12:21.800 --> 00:12:26.119
+most of Emacs is written in Lisp, then we could consider
+
+00:12:26.120 --> 00:12:30.759
+using Guile Hoot to compile Emacs to WebAssembly, making it
+
+00:12:30.760 --> 00:12:35.159
+available perhaps in web browsers or on systems with the
+
+00:12:35.160 --> 00:12:40.679
+WebAssembly System Interface. But it would also be a great
+
+00:12:40.680 --> 00:12:44.759
+victory for practical software freedom. That's the idea
+
+00:12:44.760 --> 00:12:48.359
+that Freedom One, the freedom to study and modify programs,
+
+00:12:48.360 --> 00:12:52.039
+should not just be legally and technically possible, but
+
+00:12:52.040 --> 00:12:54.719
+should be actively encouraged by our computing
+
+00:12:54.720 --> 00:12:58.959
+environments. Emacs is really one of the archetypal
+
+00:12:58.960 --> 00:13:02.519
+examples of this, but we can and should go further.
+
+00:13:02.520 --> 00:13:10.919
+When Emacs is implemented primarily in Lisp, the entirety
+
+00:13:10.920 --> 00:13:14.599
+of the system will be transparent to examination and open to
+
+00:13:14.600 --> 00:13:20.359
+modification. Every part of Emacs will be instantaneously
+
+00:13:20.360 --> 00:13:23.319
+inspectable, redefinable, and debuggable.
+
+00:13:23.320 --> 00:13:30.559
+This will be a fundamental change in what is possible to
+
+00:13:30.560 --> 00:13:36.159
+do with Emacs extensions. For example, one experiment I'd
+
+00:13:36.160 --> 00:13:40.319
+be interested in is using the Common Lisp Interface Manager
+
+00:13:40.320 --> 00:13:46.479
+as the basis for Emacs's user interface. Screwlisp is
+
+00:13:46.480 --> 00:13:52.879
+giving a talk about McCLIM later today, but for present
+
+00:13:52.880 --> 00:13:55.919
+purposes, just think of it as a super-powered version of
+
+00:13:55.920 --> 00:14:01.279
+Emacs's concept of interactive functions. It would be a
+
+00:14:01.280 --> 00:14:04.799
+pretty long-term project in Emacs as it currently exists,
+
+00:14:04.800 --> 00:14:10.519
+but it would be almost trivial if Emacs were customizable at
+
+00:14:10.520 --> 00:14:11.599
+the lowest layers via Lisp.
+
+00:14:11.600 --> 00:14:19.599
+We'll certainly be looking at the practicality of these
+
+00:14:19.600 --> 00:14:23.839
+kinds of changes as we continue developing Guile-Emacs.
+
+00:14:23.840 --> 00:14:31.719
+Finally, how can you get involved with and support Guile
+
+00:14:31.720 --> 00:14:35.999
+Emacs? One way to help is just by trying it out and letting us
+
+00:14:36.000 --> 00:14:40.519
+know what your experiences are like. There will be a
+
+00:14:40.520 --> 00:14:44.079
+snapshot available on the Codeberg project site of the
+
+00:14:44.080 --> 00:14:48.759
+version that I'm using to give this presentation. It will be
+
+00:14:48.760 --> 00:14:52.719
+available both as a Guix package and as a portable tarball.
+
+00:14:52.720 --> 00:14:58.799
+This will be more interesting as we get closer to a complete
+
+00:14:58.800 --> 00:15:05.479
+rebase. We're also always happy to talk to potential
+
+00:15:05.480 --> 00:15:10.879
+contributors or potential collaborators from other
+
+00:15:10.880 --> 00:15:11.599
+projects.
+
+00:15:11.600 --> 00:15:18.159
+We can always use bug reports, and we're interested in what
+
+00:15:18.160 --> 00:15:21.719
+kind of features people actually want to see in Guile-Emacs.
+
+00:15:21.720 --> 00:15:27.359
+Guile-Emacs is also being developed by a small worker
+
+00:15:27.360 --> 00:15:32.159
+cooperative, so donations are a pretty direct way to
+
+00:15:32.160 --> 00:15:36.039
+support the project. If you do nothing else, I recommend
+
+00:15:36.040 --> 00:15:40.719
+going to the website and subscribing to our mailing lists so
+
+00:15:40.720 --> 00:15:45.879
+that you can keep up with news on the project. If you're
+
+00:15:45.880 --> 00:15:49.239
+watching this at EmacsConf, there will be a Q&A session
+
+00:15:49.240 --> 00:15:57.080
+immediately following this, and thanks for watching!
diff --git a/2024/info/guile-after.md b/2024/info/guile-after.md
index 7ffcb322..7687afec 100644
--- a/2024/info/guile-after.md
+++ b/2024/info/guile-after.md
@@ -1,6 +1,210 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<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"]]
+
Questions or comments? Please e-mail [robin@terpri.org](mailto:robin@terpri.org?subject=Comment%20for%20EmacsConf%202023%20guile%3A%20Beguiling%20Emacs%3A%20Guile-Emacs%20relaunched%21)
diff --git a/2024/info/guile-before.md b/2024/info/guile-before.md
index e4d8e729..0181acac 100644
--- a/2024/info/guile-before.md
+++ b/2024/info/guile-before.md
@@ -1,19 +1,19 @@
<!-- Automatically generated by emacsconf-publish-before-page -->
The following image shows where the talk is in the schedule for Sat 2024-12-07. Solid lines show talks with Q&A via BigBlueButton. Dashed lines show talks with Q&A via IRC or Etherpad.<div class="schedule-in-context schedule-svg-container" data-slug="guile">
-<svg width="700" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="700" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2024/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(11,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2024/talks/papers" title="Writing academic papers in Org-Roam" data-slug="papers"> <title> 9:10- 9:20 Writing academic papers in Org-Roam</title> <rect x="13" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(24,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> papers</text></g></a> <a href="/2024/talks/project" title="Managing writing project metadata with org-mode" data-slug="project"> <title> 9:40-10:00 Managing writing project metadata with org-mode</title> <rect x="54" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(79,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> project</text></g></a> <a href="/2024/talks/org-update" title="The Future of Org" data-slug="org-update"> <title> 10:20-11:00 The Future of Org</title> <rect x="109" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(161,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-update</text></g></a> <a href="/2024/talks/color" title="Colour your Emacs with ease" data-slug="color"> <title> 11:20-11:30 Colour your Emacs with ease</title> <rect x="192" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(203,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> color</text></g></a> <a href="/2024/talks/theme" title="My journey of finding and creating the “perfect” Emacs theme" data-slug="theme"> <title> 1:00- 1:10 My journey of finding and creating the “perfect” Emacs theme</title> <rect x="329" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(340,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> theme</text></g></a> <a href="/2024/talks/water" title="Watering my (digital) plant with Emacs timers" data-slug="water"> <title> 1:30- 1:45 Watering my (digital) plant with Emacs timers</title> <rect x="370" y="15" opacity="0.5" width="20" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(388,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> water</text></g></a> <a href="/2024/talks/shell" title="Emacs as a shell" data-slug="shell"> <title> 1:55- 2:35 Emacs as a shell</title> <rect x="404" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(456,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> shell</text></g></a> <a href="/2024/talks/casual" title="Re-imagining the Emacs user experience with Casual Suite" data-slug="casual"> <title> 2:45- 3:05 Re-imagining the Emacs user experience with Casual Suite</title> <rect x="473" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(498,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> casual</text></g></a> <a href="/2024/talks/hyperdrive" title="New in hyperdrive.el: quick install, peer graph, transclusion!" data-slug="hyperdrive"> <title> 3:25- 3:45 New in hyperdrive.el: quick install, peer graph, transclusion!</title> <rect x="528" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(553,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperdrive</text></g></a> <a href="/2024/talks/writing" title="Emacs Writing Studio" data-slug="writing"> <title> 4:05- 4:15 Emacs Writing Studio</title> <rect x="583" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(594,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2024/talks/emacs30" title="Emacs 30 Highlights" data-slug="emacs30"> <title> 4:25- 4:50 Emacs 30 Highlights</title> <rect x="610" y="15" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(642,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> emacs30</text></g></a> <a href="/2024/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:00- 5:10 Saturday closing remarks</title> <rect x="658" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(669,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2024/talks/gypsum" title="Gypsum: my clone of Emacs and ELisp written in Scheme" data-slug="gypsum"> <title> 10:00-10:20 Gypsum: my clone of Emacs and ELisp written in Scheme</title> <rect x="82" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(107,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gypsum</text></g></a> <a href="/2024/talks/rust" title="An experimental Emacs core in Rust" data-slug="rust"> <title> 10:40-11:00 An experimental Emacs core in Rust</title> <rect x="137" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rust</text></g></a> <a href="/2024/talks/p-search" title="p-search: a local search engine in Emacs" data-slug="p-search"> <title> 11:20-11:45 p-search: a local search engine in Emacs</title> <rect x="192" y="75" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(224,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> p-search</text></g></a> <a href="/2024/talks/julia" title="Exploring shared philosophies in Julia and Emacs" data-slug="julia"> <title> 1:00- 1:10 Exploring shared philosophies in Julia and Emacs</title> <rect x="329" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(340,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> julia</text></g></a> <a href="/2024/talks/guile" title="Beguiling Emacs: Guile-Emacs relaunched!" data-slug="guile"> <title> 1:25- 1:45 Beguiling Emacs: Guile-Emacs relaunched!</title> <rect stroke-width="3" x="363" y="75" opacity="0.8" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(388,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> guile</text></g></a> <a href="/2024/talks/secrets" title="Committing secrets with git using sops-mode" data-slug="secrets"> <title> 1:55- 2:05 Committing secrets with git using sops-mode</title> <rect x="404" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(415,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> secrets</text></g></a> <a href="/2024/talks/mcclim" title="Elisp and McCLIM" data-slug="mcclim"> <title> 2:25- 3:25 Elisp and McCLIM</title> <rect x="446" y="75" opacity="0.5" width="82" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(526,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mcclim</text></g></a> <a href="/2024/talks/maxima" title="Emacs, eev, and Maxima - now!" data-slug="maxima"> <title> 3:45- 4:05 Emacs, eev, and Maxima - now!</title> <rect x="555" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(580,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maxima</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(82,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(164,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(247,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(329,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(411,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(494,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(576,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
+<svg width="700" height="150" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Schedule for Saturday</title> <rect width="700" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2024/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(11,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2024/talks/papers" title="Writing academic papers in Org-Roam" data-slug="papers"> <title> 9:10- 9:20 Writing academic papers in Org-Roam</title> <rect x="13" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(24,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> papers</text></g></a> <a href="/2024/talks/project" title="Managing writing project metadata with org-mode" data-slug="project"> <title> 9:40-10:00 Managing writing project metadata with org-mode</title> <rect x="54" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(79,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> project</text></g></a> <a href="/2024/talks/org-update" title="The Future of Org" data-slug="org-update"> <title> 10:20-11:00 The Future of Org</title> <rect x="109" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(161,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-update</text></g></a> <a href="/2024/talks/color" title="Colour your Emacs with ease" data-slug="color"> <title> 11:20-11:30 Colour your Emacs with ease</title> <rect x="192" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(203,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> color</text></g></a> <a href="/2024/talks/theme" title="My journey of finding and creating the “perfect” Emacs theme" data-slug="theme"> <title> 1:00- 1:10 My journey of finding and creating the “perfect” Emacs theme</title> <rect x="329" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(340,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> theme</text></g></a> <a href="/2024/talks/water" title="Watering my (digital) plant with Emacs timers" data-slug="water"> <title> 1:30- 1:45 Watering my (digital) plant with Emacs timers</title> <rect x="370" y="15" opacity="0.5" width="20" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(388,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> water</text></g></a> <a href="/2024/talks/shell" title="Emacs as a shell" data-slug="shell"> <title> 1:55- 2:35 Emacs as a shell</title> <rect x="404" y="15" opacity="0.5" width="54" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(456,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> shell</text></g></a> <a href="/2024/talks/casual" title="Re-imagining the Emacs user experience with Casual Suite" data-slug="casual"> <title> 2:45- 3:05 Re-imagining the Emacs user experience with Casual Suite</title> <rect x="473" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(498,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> casual</text></g></a> <a href="/2024/talks/hyperdrive" title="New in hyperdrive.el: quick install, peer graph, transclusion!" data-slug="hyperdrive"> <title> 3:25- 3:45 New in hyperdrive.el: quick install, peer graph, transclusion!</title> <rect x="528" y="15" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(553,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperdrive</text></g></a> <a href="/2024/talks/writing" title="Emacs Writing Studio" data-slug="writing"> <title> 4:05- 4:15 Emacs Writing Studio</title> <rect x="583" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(594,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2024/talks/emacs30" title="Emacs 30 Highlights" data-slug="emacs30"> <title> 4:25- 4:50 Emacs 30 Highlights</title> <rect x="610" y="15" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(642,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> emacs30</text></g></a> <a href="/2024/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:00- 5:10 Saturday closing remarks</title> <rect x="658" y="15" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(669,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2024/talks/gypsum" title="Gypsum: my clone of Emacs and ELisp written in Scheme" data-slug="gypsum"> <title> 10:00-10:20 Gypsum: my clone of Emacs and ELisp written in Scheme</title> <rect x="82" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(107,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gypsum</text></g></a> <a href="/2024/talks/rust" title="An experimental Emacs core in Rust" data-slug="rust"> <title> 10:40-11:00 An experimental Emacs core in Rust</title> <rect x="137" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(162,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rust</text></g></a> <a href="/2024/talks/p-search" title="p-search: a local search engine in Emacs" data-slug="p-search"> <title> 11:20-11:45 p-search: a local search engine in Emacs</title> <rect x="192" y="75" opacity="0.5" width="34" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(224,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> p-search</text></g></a> <a href="/2024/talks/julia" title="Exploring shared philosophies in Julia and Emacs" data-slug="julia"> <title> 1:00- 1:10 Exploring shared philosophies in Julia and Emacs</title> <rect x="329" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(340,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> julia</text></g></a> <a href="/2024/talks/guile" title="Beguiling Emacs: Guile-Emacs relaunched!" data-slug="guile"> <title> 1:25- 1:45 Beguiling Emacs: Guile-Emacs relaunched!</title> <rect stroke-width="3" x="363" y="75" opacity="0.8" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(388,133)"> <text font-weight="bold" fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> guile</text></g></a> <a href="/2024/talks/secrets" title="Committing secrets with git using sops-mode" data-slug="secrets"> <title> 1:55- 2:05 Committing secrets with git using sops-mode</title> <rect x="404" y="75" opacity="0.5" width="13" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(415,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> secrets</text></g></a> <a href="/2024/talks/mcclim" title="Elisp and McCLIM" data-slug="mcclim"> <title> 2:25- 3:25 Elisp and McCLIM</title> <rect x="446" y="75" opacity="0.5" width="82" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(526,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mcclim</text></g></a> <a href="/2024/talks/maxima" title="Emacs, eev, and Maxima - now!" data-slug="maxima"> <title> 3:45- 4:05 Emacs, eev, and Maxima - now!</title> <rect x="555" y="75" opacity="0.5" width="27" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(580,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maxima</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(82,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(164,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(247,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(329,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(411,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(494,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(576,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></svg>
</div>
[[!toc ]]
-Format: 20-min talk ; Q&A: IRC <https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev> Etherpad: <https://pad.emacsconf.org/2024-guile>
+Format: 20-min talk ; Q&A: ask questions via Etherpad/IRC; we'll e-mail the speaker and post answers on this wiki page after the conference Etherpad: <https://pad.emacsconf.org/2024-guile>
Etherpad: <https://pad.emacsconf.org/2024-guile>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Processing uploaded video
+Status: Now playing on the conference livestream
<div>Times in different time zones:</div><div class="times" start="2024-12-07T18:25:00Z" end="2024-12-07T18:45:00Z"><div class="conf-time">Saturday, Dec 7 2024, ~1:25 PM - 1:45 PM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 7 2024, ~12:25 PM - 12:45 PM CST (US/Central)<br />Saturday, Dec 7 2024, ~11:25 AM - 11:45 AM MST (US/Mountain)<br />Saturday, Dec 7 2024, ~10:25 AM - 10:45 AM PST (US/Pacific)<br />Saturday, Dec 7 2024, ~6:25 PM - 6:45 PM UTC <br />Saturday, Dec 7 2024, ~7:25 PM - 7:45 PM CET (Europe/Paris)<br />Saturday, Dec 7 2024, ~8:25 PM - 8:45 PM EET (Europe/Athens)<br />Saturday, Dec 7 2024, ~11:55 PM - 12:15 AM IST (Asia/Kolkata)<br />Sunday, Dec 8 2024, ~2:25 AM - 2:45 AM +08 (Asia/Singapore)<br />Sunday, Dec 8 2024, ~3:25 AM - 3:45 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2024/watch/dev/">Find out how to watch and participate</a></strong></div>
-
+<div class="vid"><div></div><div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2024-guile">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-guile--beguiling-emacs-guileemacs-relaunched--robin-templeton--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-guile--beguiling-emacs-guileemacs-relaunched--robin-templeton--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-guile--beguiling-emacs-guileemacs-relaunched--robin-templeton--main.webm">Download --main.webm (61MB)</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file
diff --git a/2024/schedule-image.md b/2024/schedule-image.md
index 9fa45911..a7ed7595 100644
--- a/2024/schedule-image.md
+++ b/2024/schedule-image.md
@@ -1 +1 @@
-<div class="schedule-svg-container"><svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2024/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2024/talks/papers" title="Writing academic papers in Org-Roam" data-slug="papers"> <title> 9:10- 9:20 Writing academic papers in Org-Roam</title> <rect x="15" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> papers</text></g></a> <a href="/2024/talks/project" title="Managing writing project metadata with org-mode" data-slug="project"> <title> 9:40-10:00 Managing writing project metadata with org-mode</title> <rect x="62" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(91,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> project</text></g></a> <a href="/2024/talks/org-update" title="The Future of Org" data-slug="org-update"> <title> 10:20-11:00 The Future of Org</title> <rect x="125" y="15" opacity="0.8" width="62" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(185,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-update</text></g></a> <a href="/2024/talks/color" title="Colour your Emacs with ease" data-slug="color"> <title> 11:20-11:30 Colour your Emacs with ease</title> <rect x="219" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(232,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> color</text></g></a> <a href="/2024/talks/theme" title="My journey of finding and creating the “perfect” Emacs theme" data-slug="theme"> <title> 1:00- 1:10 My journey of finding and creating the “perfect” Emacs theme</title> <rect x="376" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(389,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> theme</text></g></a> <a href="/2024/talks/water" title="Watering my (digital) plant with Emacs timers" data-slug="water"> <title> 1:30- 1:45 Watering my (digital) plant with Emacs timers</title> <rect x="423" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(444,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> water</text></g></a> <a href="/2024/talks/shell" title="Emacs as a shell" data-slug="shell"> <title> 1:55- 2:35 Emacs as a shell</title> <rect x="462" y="15" opacity="0.8" width="62" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(522,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> shell</text></g></a> <a href="/2024/talks/casual" title="Re-imagining the Emacs user experience with Casual Suite" data-slug="casual"> <title> 2:45- 3:05 Re-imagining the Emacs user experience with Casual Suite</title> <rect x="541" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(570,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> casual</text></g></a> <a href="/2024/talks/hyperdrive" title="New in hyperdrive.el: quick install, peer graph, transclusion!" data-slug="hyperdrive"> <title> 3:25- 3:45 New in hyperdrive.el: quick install, peer graph, transclusion!</title> <rect x="603" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperdrive</text></g></a> <a href="/2024/talks/writing" title="Emacs Writing Studio" data-slug="writing"> <title> 4:05- 4:15 Emacs Writing Studio</title> <rect x="666" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2024/talks/emacs30" title="Emacs 30 Highlights" data-slug="emacs30"> <title> 4:25- 4:50 Emacs 30 Highlights</title> <rect x="698" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(735,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> emacs30</text></g></a> <a href="/2024/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:00- 5:10 Saturday closing remarks</title> <rect x="752" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(765,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2024/talks/gypsum" title="Gypsum: my clone of Emacs and ELisp written in Scheme" data-slug="gypsum"> <title> 10:00-10:20 Gypsum: my clone of Emacs and ELisp written in Scheme</title> <rect x="94" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(123,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gypsum</text></g></a> <a href="/2024/talks/rust" title="An experimental Emacs core in Rust" data-slug="rust"> <title> 10:40-11:00 An experimental Emacs core in Rust</title> <rect x="156" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(185,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rust</text></g></a> <a href="/2024/talks/p-search" title="p-search: a local search engine in Emacs" data-slug="p-search"> <title> 11:20-11:45 p-search: a local search engine in Emacs</title> <rect x="219" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(256,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> p-search</text></g></a> <a href="/2024/talks/julia" title="Exploring shared philosophies in Julia and Emacs" data-slug="julia"> <title> 1:00- 1:10 Exploring shared philosophies in Julia and Emacs</title> <rect x="376" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(389,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> julia</text></g></a> <a href="/2024/talks/guile" title="Beguiling Emacs: Guile-Emacs relaunched!" data-slug="guile"> <title> 1:25- 1:45 Beguiling Emacs: Guile-Emacs relaunched!</title> <rect x="415" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(444,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> guile</text></g></a> <a href="/2024/talks/secrets" title="Committing secrets with git using sops-mode" data-slug="secrets"> <title> 1:55- 2:05 Committing secrets with git using sops-mode</title> <rect x="462" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(475,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> secrets</text></g></a> <a href="/2024/talks/mcclim" title="Elisp and McCLIM" data-slug="mcclim"> <title> 2:25- 3:25 Elisp and McCLIM</title> <rect x="509" y="75" opacity="0.8" width="94" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(601,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mcclim</text></g></a> <a href="/2024/talks/maxima" title="Emacs, eev, and Maxima - now!" data-slug="maxima"> <title> 3:45- 4:05 Emacs, eev, and Maxima - now!</title> <rect x="635" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(664,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maxima</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,150)"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2024/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:10 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2024/talks/links" title="Unlocking linked data: replacing specialized apps with an Org-based semantic wiki" data-slug="links"> <title> 9:10- 9:20 Unlocking linked data: replacing specialized apps with an Org-based semantic wiki</title> <rect x="15" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="/2024/talks/regex" title="Emacs regex compilation and future directions for expressive pattern matching" data-slug="regex"> <title> 9:30- 9:50 Emacs regex compilation and future directions for expressive pattern matching</title> <rect x="47" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(76,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> regex</text></g></a> <a href="/2024/talks/learning" title="Survival of the skillest: Thriving in the learning jungle" data-slug="learning"> <title> 10:00-10:20 Survival of the skillest: Thriving in the learning jungle</title> <rect x="94" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(123,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> learning</text></g></a> <a href="/2024/talks/blee" title="About Blee: enveloping our own autonomy directed digital ecosystem with Emacs" data-slug="blee"> <title> 10:30-11:15 About Blee: enveloping our own autonomy directed digital ecosystem with Emacs</title> <rect x="141" y="15" opacity="0.8" width="70" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(209,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> blee</text></g></a> <a href="/2024/talks/hyperbole" title="Fun things with GNU Hyperbole" data-slug="hyperbole"> <title> 11:30-11:45 Fun things with GNU Hyperbole</title> <rect x="235" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(256,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperbole</text></g></a> <a href="/2024/talks/pgmacs" title="PGmacs: browsing and editing PostgreSQL databases from Emacs" data-slug="pgmacs"> <title> 1:40- 1:55 PGmacs: browsing and editing PostgreSQL databases from Emacs</title> <rect x="439" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> pgmacs</text></g></a> <a href="/2024/talks/literate" title="Literate programming for the 21st Century" data-slug="literate"> <title> 2:15- 2:35 Literate programming for the 21st Century</title> <rect x="494" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(523,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> literate</text></g></a> <a href="/2024/talks/students" title="An example of a cohesive student workflow in Emacs" data-slug="students"> <title> 3:00- 3:10 An example of a cohesive student workflow in Emacs</title> <rect x="564" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(577,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> students</text></g></a> <a href="/2024/talks/sharing" title="So you want to be an Emacs-fluencer?" data-slug="sharing"> <title> 3:20- 3:40 So you want to be an Emacs-fluencer?</title> <rect x="596" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(625,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sharing</text></g></a> <a href="/2024/talks/transducers" title="Transducers: finally, ergonomic data processing for Emacs!" data-slug="transducers"> <title> 4:00- 4:30 Transducers: finally, ergonomic data processing for Emacs!</title> <rect x="658" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(703,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> transducers</text></g></a> <a href="/2024/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg></div> \ No newline at end of file
+<div class="schedule-svg-container"><svg width="800" height="300" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <title> Graphical view of the schedule</title> <g transform="translate(0,0)"> <title> Schedule for Saturday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Saturday</text> <a href="/2024/talks/sat-open" title="Saturday opening remarks" data-slug="sat-open"> <title> 9:00- 9:10 Saturday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-open</text></g></a> <a href="/2024/talks/papers" title="Writing academic papers in Org-Roam" data-slug="papers"> <title> 9:10- 9:20 Writing academic papers in Org-Roam</title> <rect x="15" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> papers</text></g></a> <a href="/2024/talks/project" title="Managing writing project metadata with org-mode" data-slug="project"> <title> 9:40-10:00 Managing writing project metadata with org-mode</title> <rect x="62" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(91,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> project</text></g></a> <a href="/2024/talks/org-update" title="The Future of Org" data-slug="org-update"> <title> 10:20-11:00 The Future of Org</title> <rect x="125" y="15" opacity="0.8" width="62" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(185,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> org-update</text></g></a> <a href="/2024/talks/color" title="Colour your Emacs with ease" data-slug="color"> <title> 11:20-11:30 Colour your Emacs with ease</title> <rect x="219" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(232,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> color</text></g></a> <a href="/2024/talks/theme" title="My journey of finding and creating the “perfect” Emacs theme" data-slug="theme"> <title> 1:00- 1:10 My journey of finding and creating the “perfect” Emacs theme</title> <rect x="376" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(389,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> theme</text></g></a> <a href="/2024/talks/water" title="Watering my (digital) plant with Emacs timers" data-slug="water"> <title> 1:30- 1:45 Watering my (digital) plant with Emacs timers</title> <rect x="423" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(444,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> water</text></g></a> <a href="/2024/talks/shell" title="Emacs as a shell" data-slug="shell"> <title> 1:55- 2:35 Emacs as a shell</title> <rect x="462" y="15" opacity="0.8" width="62" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(522,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> shell</text></g></a> <a href="/2024/talks/casual" title="Re-imagining the Emacs user experience with Casual Suite" data-slug="casual"> <title> 2:45- 3:05 Re-imagining the Emacs user experience with Casual Suite</title> <rect x="541" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(570,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> casual</text></g></a> <a href="/2024/talks/hyperdrive" title="New in hyperdrive.el: quick install, peer graph, transclusion!" data-slug="hyperdrive"> <title> 3:25- 3:45 New in hyperdrive.el: quick install, peer graph, transclusion!</title> <rect x="603" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(632,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperdrive</text></g></a> <a href="/2024/talks/writing" title="Emacs Writing Studio" data-slug="writing"> <title> 4:05- 4:15 Emacs Writing Studio</title> <rect x="666" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(679,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> writing</text></g></a> <a href="/2024/talks/emacs30" title="Emacs 30 Highlights" data-slug="emacs30"> <title> 4:25- 4:50 Emacs 30 Highlights</title> <rect x="698" y="15" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(735,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> emacs30</text></g></a> <a href="/2024/talks/sat-close" title="Saturday closing remarks" data-slug="sat-close"> <title> 5:00- 5:10 Saturday closing remarks</title> <rect x="752" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(765,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sat-close</text></g></a> <a href="/2024/talks/gypsum" title="Gypsum: my clone of Emacs and ELisp written in Scheme" data-slug="gypsum"> <title> 10:00-10:20 Gypsum: my clone of Emacs and ELisp written in Scheme</title> <rect x="94" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(123,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> gypsum</text></g></a> <a href="/2024/talks/rust" title="An experimental Emacs core in Rust" data-slug="rust"> <title> 10:40-11:00 An experimental Emacs core in Rust</title> <rect x="156" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(185,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> rust</text></g></a> <a href="/2024/talks/p-search" title="p-search: a local search engine in Emacs" data-slug="p-search"> <title> 11:20-11:45 p-search: a local search engine in Emacs</title> <rect x="219" y="75" opacity="0.8" width="39" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(256,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> p-search</text></g></a> <a href="/2024/talks/julia" title="Exploring shared philosophies in Julia and Emacs" data-slug="julia"> <title> 1:00- 1:10 Exploring shared philosophies in Julia and Emacs</title> <rect x="376" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(389,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> julia</text></g></a> <a href="/2024/talks/guile" title="Beguiling Emacs: Guile-Emacs relaunched!" data-slug="guile"> <title> 1:25- 1:45 Beguiling Emacs: Guile-Emacs relaunched!</title> <rect x="415" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(444,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> guile</text></g></a> <a href="/2024/talks/secrets" title="Committing secrets with git using sops-mode" data-slug="secrets"> <title> 1:55- 2:05 Committing secrets with git using sops-mode</title> <rect x="462" y="75" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(475,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> secrets</text></g></a> <a href="/2024/talks/mcclim" title="Elisp and McCLIM" data-slug="mcclim"> <title> 2:25- 3:25 Elisp and McCLIM</title> <rect x="509" y="75" opacity="0.8" width="94" height="59" stroke="black" stroke-dasharray="" fill="skyblue"></rect> <g transform="translate(601,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> mcclim</text></g></a> <a href="/2024/talks/maxima" title="Emacs, eev, and Maxima - now!" data-slug="maxima"> <title> 3:45- 4:05 Emacs, eev, and Maxima - now!</title> <rect x="635" y="75" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="skyblue"></rect> <g transform="translate(664,133)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> maxima</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g> <g transform="translate(0,150)"> <title> Schedule for Sunday</title> <rect width="800" height="150" x="0" y="0" fill="white"></rect> <text font-size="10" fill="black" y="12" x="3"> Sunday</text> <a href="/2024/talks/sun-open" title="Sunday opening remarks" data-slug="sun-open"> <title> 9:00- 9:10 Sunday opening remarks</title> <rect x="0" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(13,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-open</text></g></a> <a href="/2024/talks/links" title="Unlocking linked data: replacing specialized apps with an Org-based semantic wiki" data-slug="links"> <title> 9:10- 9:20 Unlocking linked data: replacing specialized apps with an Org-based semantic wiki</title> <rect x="15" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(28,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> links</text></g></a> <a href="/2024/talks/regex" title="Emacs regex compilation and future directions for expressive pattern matching" data-slug="regex"> <title> 9:30- 9:50 Emacs regex compilation and future directions for expressive pattern matching</title> <rect x="47" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(76,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> regex</text></g></a> <a href="/2024/talks/learning" title="Survival of the skillest: Thriving in the learning jungle" data-slug="learning"> <title> 10:00-10:20 Survival of the skillest: Thriving in the learning jungle</title> <rect x="94" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(123,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> learning</text></g></a> <a href="/2024/talks/blee" title="About Blee: enveloping our own autonomy directed digital ecosystem with Emacs" data-slug="blee"> <title> 10:30-11:15 About Blee: enveloping our own autonomy directed digital ecosystem with Emacs</title> <rect x="141" y="15" opacity="0.8" width="70" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(209,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> blee</text></g></a> <a href="/2024/talks/hyperbole" title="Fun things with GNU Hyperbole" data-slug="hyperbole"> <title> 11:30-11:45 Fun things with GNU Hyperbole</title> <rect x="235" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(256,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> hyperbole</text></g></a> <a href="/2024/talks/pgmacs" title="PGmacs: browsing and editing PostgreSQL databases from Emacs" data-slug="pgmacs"> <title> 1:40- 1:55 PGmacs: browsing and editing PostgreSQL databases from Emacs</title> <rect x="439" y="15" opacity="0.8" width="23" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(460,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> pgmacs</text></g></a> <a href="/2024/talks/literate" title="Literate programming for the 21st Century" data-slug="literate"> <title> 2:15- 2:35 Literate programming for the 21st Century</title> <rect x="494" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(523,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> literate</text></g></a> <a href="/2024/talks/students" title="An example of a cohesive student workflow in Emacs" data-slug="students"> <title> 3:00- 3:10 An example of a cohesive student workflow in Emacs</title> <rect x="564" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(577,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> students</text></g></a> <a href="/2024/talks/sharing" title="So you want to be an Emacs-fluencer?" data-slug="sharing"> <title> 3:20- 3:40 So you want to be an Emacs-fluencer?</title> <rect x="596" y="15" opacity="0.8" width="31" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(625,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sharing</text></g></a> <a href="/2024/talks/transducers" title="Transducers: finally, ergonomic data processing for Emacs!" data-slug="transducers"> <title> 4:00- 4:30 Transducers: finally, ergonomic data processing for Emacs!</title> <rect x="658" y="15" opacity="0.8" width="47" height="59" stroke="black" stroke-dasharray="" fill="peachpuff"></rect> <g transform="translate(703,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> transducers</text></g></a> <a href="/2024/talks/sun-close" title="Sunday closing remarks" data-slug="sun-close"> <title> 4:50- 5:00 Sunday closing remarks</title> <rect x="737" y="15" opacity="0.8" width="15" height="59" stroke="black" stroke-dasharray="5,5,5" fill="peachpuff"></rect> <g transform="translate(750,73)"> <text fill="black" x="0" y="0" font-size="10" transform="rotate(-90)"> sun-close</text></g></a> <g transform="translate(0,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 9 AM</text></g> <g transform="translate(94,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 10 AM</text></g> <g transform="translate(188,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 11 AM</text></g> <g transform="translate(282,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 12 PM</text></g> <g transform="translate(376,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 1 PM</text></g> <g transform="translate(470,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 2 PM</text></g> <g transform="translate(564,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 3 PM</text></g> <g transform="translate(658,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 4 PM</text></g> <g transform="translate(752,15)"> <line stroke="darkgray" x1="0" y1="0" x2="0" y2="120"></line> <text fill="black" x="0" y="133" font-size="10" text-anchor="left"> 5 PM</text></g></g></svg></div> \ No newline at end of file