1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
|
<!-- Automatically generated by emacsconf-publish-after-page -->
<a name="guile-mainVideo-transcript"></a>
# Transcript
[[!template text="""Hello everyone, I'm Robin Templeton,""" start="00:00:00.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and I'm going to talk about Emacs Beguiled""" start="00:00:03.083" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and recent progress on the Guile Emacs project.""" start="00:00:05.766" video="mainVideo-guile" id="subtitle"]]
[[!template text="""First of all, if you're not familiar with Guile,""" start="00:00:13.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""it's an implementation of the Scheme programming language,""" start="00:00:16.450" video="mainVideo-guile" id="subtitle"]]
[[!template text="""which is a dialect of Lisp,""" start="00:00:19.733" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and in the same family as Emacs Lisp,""" start="00:00:22.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and Guile is GNU's official extension language.""" start="00:00:24.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""The goal of the Guile Emacs project""" start="00:00:28.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""is to use Guile as the basis for Emacs's Lisp support.""" start="00:00:30.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""It has two main components:""" start="00:00:34.966" video="mainVideo-guile" id="subtitle"]]
[[!template text="""a new Emacs Lisp compiler built on top of Guile,""" start="00:00:37.133" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and a variant of Emacs""" start="00:00:41.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""in which the built-in Lisp implementation""" start="00:00:42.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""is entirely replaced with Guile Elisp.""" start="00:00:45.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We expect the combination of these two projects""" start="00:00:49.733" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to have several benefits. One is improved performance.""" start="00:00:52.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Another is increased expressiveness for Elisp""" start="00:00:57.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and making it easier to extend""" start="00:01:00.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and experiment with the language.""" start="00:01:04.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Finally, it will reduce""" start="00:01:07.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Emacs's reliance on C for two reasons.""" start="00:01:08.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile will be responsible for the language implementation,""" start="00:01:12.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""so Emacs will no longer have to include a Lisp interpreter.""" start="00:01:16.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""It will also become possible""" start="00:01:21.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to implement much more of Emacs in Lisp""" start="00:01:23.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""than is currently feasible.""" start="00:01:25.683" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Of course, this raises the question of""" start="00:01:29.250" video="mainVideo-guile" id="subtitle"]]
[[!template text="""why Guile is suitable for this product.""" start="00:01:31.133" video="mainVideo-guile" id="subtitle"]]
[[!template text="""And we chose Guile for a few reasons.""" start="00:01:34.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile is primarily a Scheme implementation,""" start="00:01:36.683" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but it also has built-in support for multiple languages""" start="00:01:39.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""using its compiler tower.""" start="00:01:42.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""To add support for a new language to Guile,""" start="00:01:43.483" video="mainVideo-guile" id="subtitle"]]
[[!template text="""You only have to write a compiler""" start="00:01:46.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""from the source language to TRIAL[??],""" start="00:01:50.083" video="mainVideo-guile" id="subtitle"]]
[[!template text="""which is essentially a low-level,""" start="00:01:52.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""minimal representation of Scheme.""" start="00:01:55.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""All of Guile's compiler optimizations""" start="00:01:58.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""occur at the TRIAL[??] layer or lower,""" start="00:02:01.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""so you don't need to worry""" start="00:02:04.450" video="mainVideo-guile" id="subtitle"]]
[[!template text="""about the lower-level details of the compiler""" start="00:02:06.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""when initially implementing your language.""" start="00:02:09.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile also has some Lisp features""" start="00:02:12.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""that are very rare in schema implementations.""" start="00:02:14.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""For example, it has a nil value""" start="00:02:18.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""that counts as both false and an empty list,""" start="00:02:20.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""just like an Elisp,""" start="00:02:23.933" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and it also has a version of the Common Lisp object system""" start="00:02:25.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and its metoptic[??] protocol, which is called GOOPS.""" start="00:02:30.483" video="mainVideo-guile" id="subtitle"]]
[[!template text="""The idea of Guile Emacs has a pretty long history.""" start="00:02:37.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""going back at least three decades.""" start="00:02:40.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""There have been about""" start="00:02:43.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""half a dozen previous implementation attempts.""" start="00:02:44.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""But the current iteration began with""" start="00:02:48.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""a series of six Summer of Code internships,""" start="00:02:49.966" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Daniel Kraft's[??] in 2009,""" start="00:02:52.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and then my internships from 2010 to 2014.""" start="00:02:56.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""My basic implementation strategy""" start="00:03:01.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""was pretty straightforward.""" start="00:03:03.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""I implemented a core subset of Elisp,""" start="00:03:05.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""which was enough to run some batch mode programs""" start="00:03:07.483" video="mainVideo-guile" id="subtitle"]]
[[!template text="""outside of Emacs.""" start="00:03:10.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""In Emacs, I modified the garbage collector""" start="00:03:12.850" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and the data structures for Lisp objects""" start="00:03:15.283" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to use their libgal equivalents.""" start="00:03:18.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""I replaced Emacs' Lisp evaluator""" start="00:03:23.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""with the one provided by guile-elisp.[??]""" start="00:03:26.966" video="mainVideo-guile" id="subtitle"]]
[[!template text="""After a little over a year of work""" start="00:03:32.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""at the end of the 2014 internship,""" start="00:03:34.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""I ended up with a fully functional prototype of Guile Emacs.""" start="00:03:37.966" video="mainVideo-guile" id="subtitle"]]
[[!template text="""It used Guile Elisp alone as its Lisp implementation""" start="00:03:44.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and was completely compatible with Emacs functionality""" start="00:03:48.933" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and with external extensions.""" start="00:03:53.933" video="mainVideo-guile" id="subtitle"]]
[[!template text="""One caveat was that performance was pretty bad,""" start="00:03:56.733" video="mainVideo-guile" id="subtitle"]]
[[!template text="""because I was focused on correctness,""" start="00:03:59.450" video="mainVideo-guile" id="subtitle"]]
[[!template text="""as well as ease of integration with the Emacs C code.""" start="00:04:03.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""But it was nonetheless a major milestone for the project.""" start="00:04:07.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Let's take just a moment to look at guile-elisp.""" start="00:04:11.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""For starters, we have access to guile modules.""" start="00:04:19.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""If we call guile's version function,""" start="00:04:23.250" video="mainVideo-guile" id="subtitle"]]
[[!template text="""we can see that we're running under guile 3.0,""" start="00:04:25.133" video="mainVideo-guile" id="subtitle"]]
[[!template text="""have access to some of the numeric tower""" start="00:04:30.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""via the arithmetic functions. We also have multiple values.""" start="00:04:33.250" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We have to be careful to use Guile's values procedure here,""" start="00:04:39.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""not the CL libraries,""" start="00:04:43.966" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but you can see that this works properly""" start="00:04:46.683" video="mainVideo-guile" id="subtitle"]]
[[!template text="""rather than being an emulation.""" start="00:04:48.850" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Finally, we have tail call elimination.""" start="00:04:51.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Naturally, we're going to use factorial to demonstrate it.""" start="00:04:54.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""If n is zero, return the answer,""" start="00:05:02.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""else recurse with n less one and n times a.""" start="00:05:05.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Of course this definition works correctly,""" start="00:05:14.283" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but it gets more interesting""" start="00:05:16.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""if we communicate the answer with an error.""" start="00:05:18.966" video="mainVideo-guile" id="subtitle"]]
[[!template text="""or to look at a backtrace.""" start="00:05:25.100" video="mainVideo-guile" id="subtitle"]]
[[!template text="""You can see here that there are""" start="00:05:29.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""no calls to fact visible in between""" start="00:05:32.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the request to evaluate""" start="00:05:35.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and the error communicating the answer.""" start="00:05:37.850" video="mainVideo-guile" id="subtitle"]]
[[!template text="""That's because this tail call""" start="00:05:42.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""has been optimized into effectively a goto.""" start="00:05:44.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""This is essential for any kind""" start="00:05:48.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""of serious functional programming.""" start="00:05:54.933" video="mainVideo-guile" id="subtitle"]]
[[!template text="""That's a peek at guile-elisp.""" start="00:06:00.116" video="mainVideo-guile" id="subtitle"]]
[[!template text="""In 2015, I left university to go work on web technologies,""" start="00:06:03.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and the project was dormant for a very long time.""" start="00:06:08.083" video="mainVideo-guile" id="subtitle"]]
[[!template text="""But that's been changing recently.""" start="00:06:11.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""During the last few months,""" start="00:06:13.450" video="mainVideo-guile" id="subtitle"]]
[[!template text="""I've been working with Larry Valkama[??]""" start="00:06:16.083" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to rebase guile-emacs""" start="00:06:17.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""onto the development branch of upstream emacs,""" start="00:06:20.733" video="mainVideo-guile" id="subtitle"]]
[[!template text="""including the past decade's worth of upstream development.""" start="00:06:24.850" video="mainVideo-guile" id="subtitle"]]
[[!template text="""What we've ended up with is a series of""" start="00:06:29.683" video="mainVideo-guile" id="subtitle"]]
[[!template text="""rebases onto different versions of Emacs.""" start="00:06:34.267" video="mainVideo-guile" id="subtitle"]]
[[!template text="""The older ones tend to work pretty well.""" start="00:06:37.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""The newer ones have increasingly bad problems""" start="00:06:39.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""where they haven't been properly adjusted""" start="00:06:46.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""for changes in the Emacs implementation.""" start="00:06:49.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but we do have by now a version of Emacs 30""" start="00:06:52.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""which boots correctly""" start="00:06:56.850" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and can be used for interactive debugging,""" start="00:06:57.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""as well as the ability to bisect the revisions of Emacs""" start="00:06:59.850" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and find out where regressions were introduced.""" start="00:07:06.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Our immediate goal is of course to complete the rebase.""" start="00:07:10.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""At the same time,""" start="00:07:14.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""we want to improve Guile Elisp's performance""" start="00:07:16.250" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to at least be competitive with ordinary Emacs Lisp.""" start="00:07:20.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Just to characterize the performance situation,""" start="00:07:24.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile Elisp is usually about half""" start="00:07:29.283" video="mainVideo-guile" id="subtitle"]]
[[!template text="""as fast as ordinary Elisp,""" start="00:07:32.766" video="mainVideo-guile" id="subtitle"]]
[[!template text="""while Guile Scheme is quite often""" start="00:07:34.483" video="mainVideo-guile" id="subtitle"]]
[[!template text="""an order of magnitude faster than ordinary Elisp,""" start="00:07:37.850" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and that's based on micro benchmarks""" start="00:07:41.350" video="mainVideo-guile" id="subtitle"]]
[[!template text="""like the Gabriel[??] benchmarks.""" start="00:07:43.933" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but there's clearly a lot of room""" start="00:07:46.233" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to improve our compiler's output.""" start="00:07:50.900" video="mainVideo-guile" id="subtitle"]]
[[!template text="""If you want to mark your calendars,""" start="00:07:53.350" video="mainVideo-guile" id="subtitle"]]
[[!template text="""we're expecting to have a usable version of Guile Emacs 30""" start="00:07:56.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""out sometime next spring.""" start="00:08:00.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We're also going to put some effort""" start="00:08:03.116" video="mainVideo-guile" id="subtitle"]]
[[!template text="""into either extracting old work""" start="00:08:05.450" video="mainVideo-guile" id="subtitle"]]
[[!template text="""or doing new work that could be contributed upstream.""" start="00:08:09.100" video="mainVideo-guile" id="subtitle"]]
[[!template text="""On the Guile side, we'll probably start out with""" start="00:08:12.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""optimizing the dynamic binding facilities,""" start="00:08:16.750" video="mainVideo-guile" id="subtitle"]]
[[!template text="""which are used very seldom in Scheme,""" start="00:08:21.233" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but are used all the time in traditional Lisp dialects.""" start="00:08:23.450" video="mainVideo-guile" id="subtitle"]]
[[!template text="""On the Emacs side, we'll be working initially""" start="00:08:27.850" video="mainVideo-guile" id="subtitle"]]
[[!template text="""on abstracting away the details of the Lisp implementation""" start="00:08:31.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""where they're not relevant,""" start="00:08:35.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""And that will clean up the Emacs code base a bit.""" start="00:08:37.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""It'll make it easier to integrate Emacs and Guile Elisp.""" start="00:08:40.733" video="mainVideo-guile" id="subtitle"]]
[[!template text="""It will probably be helpful for anyone""" start="00:08:45.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""who is working on ordinary Elisp on their own.""" start="00:08:47.933" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We're also going to be adding new features to Emacs Lisp.""" start="00:08:51.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We've seen a few of them already.""" start="00:08:57.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""The new [??] tower, tail call optimization,""" start="00:08:59.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""common list compatibility.""" start="00:09:02.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We're also going to provide access to Fibers,""" start="00:09:04.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""which is a guide library based on ideas from concurrent ML""" start="00:09:07.966" video="mainVideo-guile" id="subtitle"]]
[[!template text="""that provides much more powerful facilities""" start="00:09:12.483" video="mainVideo-guile" id="subtitle"]]
[[!template text="""for concurrent and parallel programming""" start="00:09:15.733" video="mainVideo-guile" id="subtitle"]]
[[!template text="""than what Emacs currently offers.""" start="00:09:18.283" video="mainVideo-guile" id="subtitle"]]
[[!template text="""This plan meets Guile Emacs' basic goals,""" start="00:09:24.666" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and it's work that we could maybe get integrated upstream""" start="00:09:32.250" video="mainVideo-guile" id="subtitle"]]
[[!template text="""in a reasonable amount of time.""" start="00:09:36.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""But it's also worth considering what more we can do,""" start="00:09:38.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and what effect Guile Emacs might have on Emacs""" start="00:09:42.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""if it becomes simply Emacs.""" start="00:09:46.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""For context, the amount of C code in Emacs""" start="00:09:50.666" video="mainVideo-guile" id="subtitle"]]
[[!template text="""has increased by around 50% in the last decade,""" start="00:09:54.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and now it constitutes around a quarter of the code base.""" start="00:09:57.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""C can be a bit of a barrier""" start="00:09:59.966" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to customizing and extending Emacs.""" start="00:10:06.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""For example, there are about 1500 C subroutines.""" start="00:10:11.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Around 500 are used in C code,""" start="00:10:15.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""as well as available to Lisp code,""" start="00:10:19.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and being written in C means""" start="00:10:23.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""that they can't be practically redefined.""" start="00:10:25.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the use of C can become a barrier to extending Emacs""" start="00:10:28.083" video="mainVideo-guile" id="subtitle"]]
[[!template text="""or customizing its behavior.""" start="00:10:34.450" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We might consider writing""" start="00:10:36.250" video="mainVideo-guile" id="subtitle"]]
[[!template text="""as much of Emacs as possible in Lisp.""" start="00:10:39.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""One way to speed up this process""" start="00:10:42.916" video="mainVideo-guile" id="subtitle"]]
[[!template text="""would be to provide a common Lisp implementation for Guile.""" start="00:10:46.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Note that between guile-elisp and guile-scheme,""" start="00:10:49.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""we have all of the essential ingredients""" start="00:10:54.850" video="mainVideo-guile" id="subtitle"]]
[[!template text="""for a Common Lisp environment. We can also share code""" start="00:10:57.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""with other Common Lisp implementations""" start="00:11:03.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""such as SBCL and SICL[??].""" start="00:11:06.016" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Overall, the duration of the project""" start="00:11:10.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""will be better measured in months rather than years,""" start="00:11:13.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""despite Common Lisp's reputation""" start="00:11:16.933" video="mainVideo-guile" id="subtitle"]]
[[!template text="""for being a large language.""" start="00:11:19.483" video="mainVideo-guile" id="subtitle"]]
[[!template text="""This could have multiple uses, of course.""" start="00:11:21.216" video="mainVideo-guile" id="subtitle"]]
[[!template text="""It could be a model for future improvements to Elisp,""" start="00:11:24.483" video="mainVideo-guile" id="subtitle"]]
[[!template text="""because Elisp and CL can interact directly without problems.""" start="00:11:29.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and it would be very easy for Elisp""" start="00:11:34.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to borrow language features from Common Lisp.""" start="00:11:38.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""But for the purpose of a C to Lisp transition,""" start="00:11:41.483" video="mainVideo-guile" id="subtitle"]]
[[!template text="""it would also provide us with instant access""" start="00:11:46.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to a huge number of high-quality libraries""" start="00:11:50.083" video="mainVideo-guile" id="subtitle"]]
[[!template text="""for things that""" start="00:11:52.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile is not necessarily equipped to deal with,""" start="00:11:54.850" video="mainVideo-guile" id="subtitle"]]
[[!template text="""such as access to low-level Windows APIs,""" start="00:11:58.133" video="mainVideo-guile" id="subtitle"]]
[[!template text="""as well as lots of other libraries,""" start="00:12:01.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""such as interfaces to GUI toolkits""" start="00:12:05.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""for a variety of operating systems.""" start="00:12:10.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""At a certain point, this has technical advantages.""" start="00:12:13.866" video="mainVideo-guile" id="subtitle"]]
[[!template text="""If most of Emacs is written in Lisp,""" start="00:12:20.566" video="mainVideo-guile" id="subtitle"]]
[[!template text="""then we could consider using Guile Hoot""" start="00:12:24.216" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to compile Emacs to WebAssembly,""" start="00:12:27.250" video="mainVideo-guile" id="subtitle"]]
[[!template text="""making it available perhaps in web browsers""" start="00:12:29.683" video="mainVideo-guile" id="subtitle"]]
[[!template text="""or on systems with the WebAssembly system interface.""" start="00:12:33.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""But it would also be a great victory""" start="00:12:37.250" video="mainVideo-guile" id="subtitle"]]
[[!template text="""for practical software freedom.""" start="00:12:41.283" video="mainVideo-guile" id="subtitle"]]
[[!template text="""That's the idea that freedom one,""" start="00:12:43.050" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the freedom to study and modify programs,""" start="00:12:45.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""should not just be legally and technically possible,""" start="00:12:48.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but should be actively encouraged""" start="00:12:51.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""by our competing environments.""" start="00:12:53.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Emacs is really one of the archetypal examples of this,""" start="00:12:57.083" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but we can and should go further.""" start="00:13:00.133" video="mainVideo-guile" id="subtitle"]]
[[!template text="""When Emacs is implemented primarily in Lisp,""" start="00:13:03.216" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the entirety of the system""" start="00:13:08.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""will be transparent to examination""" start="00:13:11.483" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and open to modification.""" start="00:13:14.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Every part of Emacs will be instantaneously inspectable,""" start="00:13:16.083" video="mainVideo-guile" id="subtitle"]]
[[!template text="""redefinable, and debuggable.""" start="00:13:21.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""This will be a fundamental change""" start="00:13:25.016" video="mainVideo-guile" id="subtitle"]]
[[!template text="""in what is possible to do with Emacs extensions.""" start="00:13:28.283" video="mainVideo-guile" id="subtitle"]]
[[!template text="""For example, one experiment I'd be interested in""" start="00:13:32.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""is using the Common Lisp Interface Manager""" start="00:13:37.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""as the basis for Emacs's user interface.""" start="00:13:40.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Screwlisp is giving a talk about McCLIM later today,""" start="00:13:43.250" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but for present purposes,""" start="00:13:48.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""just think of it as a super-powered version""" start="00:13:53.250" video="mainVideo-guile" id="subtitle"]]
[[!template text="""of Emacs's concept of interactive functions.""" start="00:13:55.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""It would be a pretty long-term project""" start="00:13:58.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""in Emacs as it currently exists,""" start="00:14:02.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but it would be almost trivial""" start="00:14:04.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""if Emacs were customizable at the lowest layers via Lisp.""" start="00:14:06.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We'll certainly be looking at the practicality""" start="00:14:12.650" video="mainVideo-guile" id="subtitle"]]
[[!template text="""of these kinds of changes""" start="00:14:19.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""as we continue developing Guile Emacs.""" start="00:14:20.966" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Finally, how can you get involved""" start="00:14:25.133" video="mainVideo-guile" id="subtitle"]]
[[!template text="""with and support Guile Emacs?""" start="00:14:30.033" video="mainVideo-guile" id="subtitle"]]
[[!template text="""One way to help is just by trying it out""" start="00:14:32.500" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and letting us know what your experiences are like.""" start="00:14:35.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""There will be a snapshot available""" start="00:14:37.816" video="mainVideo-guile" id="subtitle"]]
[[!template text="""on the Codeberg project site""" start="00:14:41.483" video="mainVideo-guile" id="subtitle"]]
[[!template text="""of the version that I'm using to give this presentation.""" start="00:14:44.266" video="mainVideo-guile" id="subtitle"]]
[[!template text="""It will be available both as a Guix package""" start="00:14:47.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and as a portable tarball. This will be more interesting""" start="00:14:51.133" video="mainVideo-guile" id="subtitle"]]
[[!template text="""as we get closer to a complete rebase.""" start="00:14:55.933" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We're also always happy to talk to potential contributors""" start="00:15:00.366" video="mainVideo-guile" id="subtitle"]]
[[!template text="""or potential collaborators from other projects.""" start="00:15:06.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We can always use bug reports,""" start="00:15:12.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and we're interested in what kind of features""" start="00:15:16.450" video="mainVideo-guile" id="subtitle"]]
[[!template text="""people actually want to see in Guile Emacs.""" start="00:15:18.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile Emacs is also being developed""" start="00:15:21.733" video="mainVideo-guile" id="subtitle"]]
[[!template text="""by a small worker cooperative,""" start="00:15:25.300" video="mainVideo-guile" id="subtitle"]]
[[!template text="""so donations are a pretty direct way to support the project.""" start="00:15:27.916" video="mainVideo-guile" id="subtitle"]]
[[!template text="""If you do nothing else, I recommend going to the website""" start="00:15:33.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and subscribing to our mailing lists""" start="00:15:37.166" video="mainVideo-guile" id="subtitle"]]
[[!template text="""so that you can keep up with news on the project.""" start="00:15:40.733" video="mainVideo-guile" id="subtitle"]]
[[!template text="""If you're watching this at Emacsconf,""" start="00:15:45.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""there will be a Q&A session immediately following this,""" start="00:15:47.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""and thanks for watching.""" start="00:15:50.483" video="mainVideo-guile" id="subtitle"]]
Captioner: sachac and robin
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)
<!-- End of emacsconf-publish-after-page -->
|