summaryrefslogtreecommitdiffstats
path: root/2024/info/guile-after.md
blob: 8145932ffbc199df84b4903b8e1dc4c36b78c346 (plain) (blame)
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
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
<!-- Automatically generated by emacsconf-publish-after-page -->


<div class="transcript transcript-mainVideo"><a name="guile-mainVideo-transcript"></a><h1>Transcript</h1>

[[!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 project.""" 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 Tree-IL,""" 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 Tree-IL 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 Scheme 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 in 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 metaobject 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 libguile 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 <i>version</i> 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="""We 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 <i>values</i> procedure here,""" start="00:04:39.533" video="mainVideo-guile" id="subtitle"]]
[[!template text="""not the CL library's,""" 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 <i>n</i> is zero, return the answer,""" start="00:05:02.883" video="mainVideo-guile" id="subtitle"]]
[[!template text="""else recurse with <i>n</i> less one and <i>n</i> times <i>a</i>.""" 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="""in order 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 <i>fact</i> 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 numeric tower, tail call optimization,""" start="00:08:59.333" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Common Lisp 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 Guile 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 computing 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"]]

</div>

Captioner: sachac and robin

<div class="transcript transcript-qanda"><a name="guile-qanda-transcript"></a><h1>Q&A transcript (unedited)</h1>

[[!template text="""All right. Hey, thanks for bearing with us there. We had a""" start="00:00:00.000" video="qanda-guile" id="subtitle"]]
[[!template text="""couple of bumps in the road, a cross between a couple of""" start="00:00:08.120" video="qanda-guile" id="subtitle"]]
[[!template text="""different versions of our program that we deliver here,""" start="00:00:11.240" video="qanda-guile" id="subtitle"]]
[[!template text="""different ways that we bring this stream together between""" start="00:00:13.480" video="qanda-guile" id="subtitle"]]
[[!template text="""the recorded content that that speakers are putting""" start="00:00:17.960" video="qanda-guile" id="subtitle"]]
[[!template text="""together in advance in the live content, such as what you're""" start="00:00:22.360" video="qanda-guile" id="subtitle"]]
[[!template text="""seeing right here. So thanks go to Sacha and Leo, and""" start="00:00:26.880" video="qanda-guile" id="subtitle"]]
[[!template text="""everybody behind the stages gluing it all together. And""" start="00:00:31.040" video="qanda-guile" id="subtitle"]]
[[!template text="""we're back here now, and I'm speaking with Robin, who us""" start="00:00:34.360" video="qanda-guile" id="subtitle"]]
[[!template text="""ready to take on some of your questions and address some of""" start="00:00:40.200" video="qanda-guile" id="subtitle"]]
[[!template text="""the comments over here on the etherpad. If you want to jump in""" start="00:00:42.800" video="qanda-guile" id="subtitle"]]
[[!template text="""there, there's links in the chat. And thanks so much, Robin,""" start="00:00:46.880" video="qanda-guile" id="subtitle"]]
[[!template text="""for your talk. And it's also been a pleasure chatting with""" start="00:00:51.320" video="qanda-guile" id="subtitle"]]
[[!template text="""you just a little bit over the last couple of months on IRC.""" start="00:00:54.000" video="qanda-guile" id="subtitle"]]
[[!template text="""Yeah, absolutely. Great meeting you.""" start="00:00:57.920" video="qanda-guile" id="subtitle"]]
[[!template text="""All right. All right, everyone. I think I am streaming now.""" start="00:01:33.320" video="qanda-guile" id="subtitle"]]
[[!template text="""So let's look at it. Let's see. I see the IRC scrolling. So""" start="00:01:37.680" video="qanda-guile" id="subtitle"]]
[[!template text="""let's see where that's going. Yes, the Common Lisp is what I""" start="00:01:42.440" video="qanda-guile" id="subtitle"]]
[[!template text="""thought would piss people off. And because it's not part of""" start="00:01:47.200" video="qanda-guile" id="subtitle"]]
[[!template text="""either community, but I think it would be a good compromise""" start="00:01:50.520" video="qanda-guile" id="subtitle"]]
[[!template text="""for building a Lisp into a language that's more suitable for""" start="00:01:54.240" video="qanda-guile" id="subtitle"]]
[[!template text="""building large systems like the kind that we are building in""" start="00:01:57.840" video="qanda-guile" id="subtitle"]]
[[!template text="""Emacs today. I also left out an important part of the talk,""" start="00:02:01.880" video="qanda-guile" id="subtitle"]]
[[!template text="""which is part of the motivation for transitioning from C to""" start="00:02:07.280" video="qanda-guile" id="subtitle"]]
[[!template text="""Lisp. And that's the performance characteristics""" start="00:02:12.080" video="qanda-guile" id="subtitle"]]
[[!template text="""fundamentally change when you get a modern and high""" start="00:02:15.600" video="qanda-guile" id="subtitle"]]
[[!template text="""performance Lisp system involved. it starts getting less""" start="00:02:19.400" video="qanda-guile" id="subtitle"]]
[[!template text="""practical to just call out to C to speed up every operation.""" start="00:02:23.560" video="qanda-guile" id="subtitle"]]
[[!template text="""Among other things, you lose the ability to use more""" start="00:02:27.800" video="qanda-guile" id="subtitle"]]
[[!template text="""advanced control structures, like the limited""" start="00:02:31.560" video="qanda-guile" id="subtitle"]]
[[!template text="""continuations. And you also have to pay the overhead of""" start="00:02:34.760" video="qanda-guile" id="subtitle"]]
[[!template text="""calling out to our foreign function. So it gets to be an""" start="00:02:40.040" video="qanda-guile" id="subtitle"]]
[[!template text="""increasingly better deal to optimize your list""" start="00:02:43.880" video="qanda-guile" id="subtitle"]]
[[!template text="""implementation and provide ways for building faster list""" start="00:02:47.880" video="qanda-guile" id="subtitle"]]
[[!template text="""programs, such as type annotations, once you've gotten""" start="00:02:52.720" video="qanda-guile" id="subtitle"]]
[[!template text="""over a certain threshold of performance.""" start="00:02:55.880" video="qanda-guile" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Q: About fibers: My understanding is that the problem with making Elisp concurrent is that none of the data structures (buffer, cons, vector, window etc) are concurrency-safe.  How do fibers help with this?""" start="00:03:01.480" video="qanda-guile" id="subtitle"]]</div>[[!template text="""I'm going to look at the pad. Here we go. The first question is""" start="00:03:01.480" video="qanda-guile" id="subtitle"]]
[[!template text="""about fibers and whether they help with making Elisp""" start="00:03:07.360" video="qanda-guile" id="subtitle"]]
[[!template text="""concurrent in terms of its data structures. Yes, that's""" start="00:03:12.520" video="qanda-guile" id="subtitle"]]
[[!template text="""absolutely correct. Fibers by themselves do not provide""" start="00:03:18.280" video="qanda-guile" id="subtitle"]]
[[!template text="""thread safety for any of the existing Emacs data""" start="00:03:23.880" video="qanda-guile" id="subtitle"]]
[[!template text="""structures. What they are useful for is building things""" start="00:03:26.800" video="qanda-guile" id="subtitle"]]
[[!template text="""that don't use Emacs data structures, say a network client""" start="00:03:32.880" video="qanda-guile" id="subtitle"]]
[[!template text="""that reads input from a stream or in scheme, a port or a stream""" start="00:03:38.200" video="qanda-guile" id="subtitle"]]
[[!template text="""instead of a buffer. And we can also take a look at options for""" start="00:03:44.560" video="qanda-guile" id="subtitle"]]
[[!template text="""making more Emacs features concurrency safe or thread""" start="00:03:49.680" video="qanda-guile" id="subtitle"]]
[[!template text="""safe. For example, we could introduce the idea of a thread""" start="00:03:54.200" video="qanda-guile" id="subtitle"]]
[[!template text="""local buffer that didn't require locks for sharing between""" start="00:03:58.080" video="qanda-guile" id="subtitle"]]
[[!template text="""different threads. And I'm not sure how that would develop,""" start="00:04:03.040" video="qanda-guile" id="subtitle"]]
[[!template text="""but I'm sure the Emacs maintainers already have some ideas""" start="00:04:09.240" video="qanda-guile" id="subtitle"]]
[[!template text="""in this direction. Fibers will basically provide a""" start="00:04:12.320" video="qanda-guile" id="subtitle"]]
[[!template text="""high-performance system that you can use apart from""" start="00:04:17.520" video="qanda-guile" id="subtitle"]]
[[!template text="""ordinary Emacs-less constructs.""" start="00:04:22.160" video="qanda-guile" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Q: Do you have a rough idea of how much of Guile is written in C?""" start="00:04:28.080" video="qanda-guile" id="subtitle"]]</div>[[!template text="""Let's see. We have another question. Emacs is roughly 25% C.""" start="00:04:28.080" video="qanda-guile" id="subtitle"]]
[[!template text="""How much of Guile is in C?""" start="00:04:34.840" video="qanda-guile" id="subtitle"]]
[[!template text="""Well, part of my point about C is not so much that there, well,""" start="00:04:38.840" video="qanda-guile" id="subtitle"]]
[[!template text="""obviously, I phrased it a little provocatively, but the""" start="00:04:45.680" video="qanda-guile" id="subtitle"]]
[[!template text="""problem is not so much that there is C, but that there is so""" start="00:04:50.280" video="qanda-guile" id="subtitle"]]
[[!template text="""much C involved in every single layer of the application.""" start="00:04:54.720" video="qanda-guile" id="subtitle"]]
[[!template text="""So, for example, we're limited in our ability to use tools""" start="00:05:00.280" video="qanda-guile" id="subtitle"]]
[[!template text="""like limit continuations, which can be used to express""" start="00:05:04.560" video="qanda-guile" id="subtitle"]]
[[!template text="""buffer local variable binding in a few dozen lines, because""" start="00:05:08.160" video="qanda-guile" id="subtitle"]]
[[!template text="""Emacs has so much calling back and forth between guile and C,""" start="00:05:13.600" video="qanda-guile" id="subtitle"]]
[[!template text="""due to so much basic functionality being in primitive C""" start="00:05:21.840" video="qanda-guile" id="subtitle"]]
[[!template text="""subroutines. So that's one issue apart from the question of""" start="00:05:26.600" video="qanda-guile" id="subtitle"]]
[[!template text="""how much is in a particular language. To answer the question""" start="00:05:34.120" video="qanda-guile" id="subtitle"]]
[[!template text="""about Guile, Guile has about 165,000 lines of scheme code""" start="00:05:38.360" video="qanda-guile" id="subtitle"]]
[[!template text="""and about 160,000 lines of C code, so it's about half and""" start="00:05:45.880" video="qanda-guile" id="subtitle"]]
[[!template text="""half. And that shouldn't really be surprising given that it""" start="00:05:51.600" video="qanda-guile" id="subtitle"]]
[[!template text="""is actually focused on low-level things like building a""" start="00:05:55.880" video="qanda-guile" id="subtitle"]]
[[!template text="""high-performance bytecode compiler, and a just-in-time""" start="00:06:00.360" video="qanda-guile" id="subtitle"]]
[[!template text="""compiler, and so on, as well as providing its own fairly""" start="00:06:05.080" video="qanda-guile" id="subtitle"]]
[[!template text="""rich, but still far less complete than Emacs's standard""" start="00:06:09.720" video="qanda-guile" id="subtitle"]]
[[!template text="""library, in terms of Ice9 and other system libraries""" start="00:06:15.000" video="qanda-guile" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Q: A Common Lisp implementation for Guile sounds really cool! Is there already work on this underway?""" start="00:06:19.240" video="qanda-guile" id="subtitle"]]</div>[[!template text="""shipped with Guile. The next question is on a Common Lisp""" start="00:06:19.240" video="qanda-guile" id="subtitle"]]
[[!template text="""implementation for Guile, and whether work on it is""" start="00:06:24.360" video="qanda-guile" id="subtitle"]]
[[!template text="""underway. In fact, work on it is already underway. I've been""" start="00:06:27.760" video="qanda-guile" id="subtitle"]]
[[!template text="""working on it on and off in my spare time for a couple of years""" start="00:06:33.080" video="qanda-guile" id="subtitle"]]
[[!template text="""now. I've gotten, I think, a couple of chapters of the""" start="00:06:36.400" video="qanda-guile" id="subtitle"]]
[[!template text="""hyperspectin, if you want to measure it that way. But I've""" start="00:06:40.040" video="qanda-guile" id="subtitle"]]
[[!template text="""been focusing my work more on research and on what we need to""" start="00:06:43.520" video="qanda-guile" id="subtitle"]]
[[!template text="""do to have a LISP environment, a polyglot LISP environment,""" start="00:06:51.720" video="qanda-guile" id="subtitle"]]
[[!template text="""wherein the features of Common Lisp and Scheme and Emacs""" start="00:06:57.400" video="qanda-guile" id="subtitle"]]
[[!template text="""Lisp can all work easily and ergonomically together. So""" start="00:07:02.760" video="qanda-guile" id="subtitle"]]
[[!template text="""this involves things like the question of Lisps having""" start="00:07:08.920" video="qanda-guile" id="subtitle"]]
[[!template text="""Lisp1s versus Lisp2s. That is, a Lisp1-like scheme has one""" start="00:07:13.880" video="qanda-guile" id="subtitle"]]
[[!template text="""namespace, like every variable is a single name that can""" start="00:07:22.080" video="qanda-guile" id="subtitle"]]
[[!template text="""refer to one value, whereas in Lisp2s like EmacsLisp,""" start="00:07:27.600" video="qanda-guile" id="subtitle"]]
[[!template text="""symbols can have different definitions as functions and as""" start="00:07:32.000" video="qanda-guile" id="subtitle"]]
[[!template text="""variables, as well as other namespaces like property""" start="00:07:37.400" video="qanda-guile" id="subtitle"]]
[[!template text="""lists. So Kent Pittman has some interesting thoughts on""" start="00:07:41.120" video="qanda-guile" id="subtitle"]]
[[!template text="""this that I've been looking into. Another issue is the""" start="00:07:45.720" video="qanda-guile" id="subtitle"]]
[[!template text="""interaction between package and module systems. So I don't""" start="00:07:51.040" video="qanda-guile" id="subtitle"]]
[[!template text="""have really anything ready to publish just yet on this, but I""" start="00:07:57.520" video="qanda-guile" id="subtitle"]]
[[!template text="""have been looking into the background issues of""" start="00:08:01.840" video="qanda-guile" id="subtitle"]]
[[!template text="""integrating this into Guile in a useful way.""" start="00:08:05.280" video="qanda-guile" id="subtitle"]]
[[!template text="""And let's see, one other thing I was going to mention.""" start="00:08:08.120" video="qanda-guile" id="subtitle"]]
[[!template text="""Okay, I've lost it. But yeah, there is some work already. And""" start="00:08:15.720" video="qanda-guile" id="subtitle"]]
[[!template text="""if people are interested in moving Emacs in this direction,""" start="00:08:27.680" video="qanda-guile" id="subtitle"]]
[[!template text="""then we'll certainly start working on it in earnest.""" start="00:08:30.400" video="qanda-guile" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Q: Did switching from guile 2 to 3 give any performance benefits?""" start="00:08:34.480" video="qanda-guile" id="subtitle"]]</div>[[!template text="""Another question, did switching from Guile 2 to 3 give any""" start="00:08:34.480" video="qanda-guile" id="subtitle"]]
[[!template text="""performance benefits? Well, honestly, we're not really""" start="00:08:41.120" video="qanda-guile" id="subtitle"]]
[[!template text="""benchmarking stuff here because Guile Emacs has so much""" start="00:08:46.280" video="qanda-guile" id="subtitle"]]
[[!template text="""overhead from structuring the compiler to closely conform""" start="00:08:50.760" video="qanda-guile" id="subtitle"]]
[[!template text="""to Emacs in terms of like even things as simple as metadata""" start="00:08:55.760" video="qanda-guile" id="subtitle"]]
[[!template text="""layout for variable information.""" start="00:08:59.880" video="qanda-guile" id="subtitle"]]
[[!template text="""So I haven't actually noticed a perceptual change. I would""" start="00:09:03.880" video="qanda-guile" id="subtitle"]]
[[!template text="""guess based on the Gabriel benchmark results that is""" start="00:09:12.000" video="qanda-guile" id="subtitle"]]
[[!template text="""benefited from what somewhat from Gal 3's performance""" start="00:09:15.360" video="qanda-guile" id="subtitle"]]
[[!template text="""improvements but for Emacs I just don't know yet and working""" start="00:09:21.400" video="qanda-guile" id="subtitle"]]
[[!template text="""on the compiler's code generation and lowering the""" start="00:09:27.480" video="qanda-guile" id="subtitle"]]
[[!template text="""overhead is going to be the thing that provides the most""" start="00:09:30.200" video="qanda-guile" id="subtitle"]]
[[!template text="""return for improving that aspect of Gal Emacs.""" start="00:09:33.720" video="qanda-guile" id="subtitle"]]
[[!template text="""Let's see, I see SICL mentioned here, as well as SPCL. And it""" start="00:09:37.320" video="qanda-guile" id="subtitle"]]
[[!template text="""could certainly help with the implementation of""" start="00:09:54.080" video="qanda-guile" id="subtitle"]]
[[!template text="""Commonwealth and Guile, because a lot of the basic stuff is""" start="00:09:56.920" video="qanda-guile" id="subtitle"]]
[[!template text="""just providing a new interface to some bit of""" start="00:10:01.520" video="qanda-guile" id="subtitle"]]
[[!template text="""functionality. Like the sequence library, it's mostly""" start="00:10:05.560" video="qanda-guile" id="subtitle"]]
[[!template text="""stuff that we already have through SR5 and so on. The""" start="00:10:08.880" video="qanda-guile" id="subtitle"]]
[[!template text="""difficult, well, not the difficult but the time consuming""" start="00:10:13.280" video="qanda-guile" id="subtitle"]]
[[!template text="""parts are going to be all the little DSL sitcom on this path""" start="00:10:16.880" video="qanda-guile" id="subtitle"]]
[[!template text="""packed up inside it like pretty printing format loop and so""" start="00:10:21.600" video="qanda-guile" id="subtitle"]]
[[!template text="""on. It's for those high-level features that I think we could""" start="00:10:27.000" video="qanda-guile" id="subtitle"]]
[[!template text="""potentially share code with other Common Lisp""" start="00:10:32.360" video="qanda-guile" id="subtitle"]]
[[!template text="""implementations. And Common Lisp implementations do tend""" start="00:10:34.960" video="qanda-guile" id="subtitle"]]
[[!template text="""to be permissively licensed, SPCL's public domain, for""" start="00:10:39.040" video="qanda-guile" id="subtitle"]]
[[!template text="""example, so there's no barrier to sharing code with them.""" start="00:10:43.240" video="qanda-guile" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Q: Do you know if the Emacs maintainers are interested in switching to Guile as the engine for Emacs Lisp?""" start="00:10:46.440" video="qanda-guile" id="subtitle"]]</div>[[!template text="""There's another question about whether the Emacs""" start="00:10:46.440" video="qanda-guile" id="subtitle"]]
[[!template text="""maintainers are interested in switching to Guile as the""" start="00:10:52.720" video="qanda-guile" id="subtitle"]]
[[!template text="""engine for Emacs Lisp. I can't speak for the current""" start="00:10:55.680" video="qanda-guile" id="subtitle"]]
[[!template text="""maintainers. I can say that people have talked to previous""" start="00:10:59.200" video="qanda-guile" id="subtitle"]]
[[!template text="""Emacs maintainers about the whole idea, and their attitude""" start="00:11:05.440" video="qanda-guile" id="subtitle"]]
[[!template text="""was generally cautiously optimistic. As in, it's not""" start="00:11:10.440" video="qanda-guile" id="subtitle"]]
[[!template text="""something they, it's somewhat political, they didn't want""" start="00:11:15.480" video="qanda-guile" id="subtitle"]]
[[!template text="""to get into it, but they didn't think that it was a bad idea,""" start="00:11:18.800" video="qanda-guile" id="subtitle"]]
[[!template text="""and they wanted to know more about how it might evolve in the""" start="00:11:23.480" video="qanda-guile" id="subtitle"]]
[[!template text="""future. I can comment that Eli Zaretsky, who I believe is the""" start="00:11:25.920" video="qanda-guile" id="subtitle"]]
[[!template text="""current Emacs maintainer, is very concerned about""" start="00:11:31.880" video="qanda-guile" id="subtitle"]]
[[!template text="""cross-platform compatibility. And so if I can guess at his""" start="00:11:36.880" video="qanda-guile" id="subtitle"]]
[[!template text="""priorities correctly, I think that that's something that""" start="00:11:44.680" video="qanda-guile" id="subtitle"]]
[[!template text="""we'll have to make sure is rock solid before we propose any""" start="00:11:48.520" video="qanda-guile" id="subtitle"]]
[[!template text="""kind of upstreaming of Gala Emacs. but in general""" start="00:11:52.600" video="qanda-guile" id="subtitle"]]
[[!template text="""maintainers have been cautious but curious. So I just""" start="00:11:58.360" video="qanda-guile" id="subtitle"]]
[[!template text="""wanted to break in and note at this point that as lives I""" start="00:12:03.720" video="qanda-guile" id="subtitle"]]
[[!template text="""didn't sorry I couldn't do so more gracefully while we were""" start="00:12:06.720" video="qanda-guile" id="subtitle"]]
[[!template text="""still on stream but I wanted to let you know that just as of 10""" start="00:12:09.520" video="qanda-guile" id="subtitle"]]
[[!template text="""seconds ago or so we've had to cut away into our next talk but""" start="00:12:13.440" video="qanda-guile" id="subtitle"]]
[[!template text="""we can keep going here as long as we like. Okay, let's wrap up.""" start="00:12:17.400" video="qanda-guile" id="subtitle"]]
[[!template text="""There's only a couple questions left on the pad, so I'll""" start="00:12:22.200" video="qanda-guile" id="subtitle"]]
[[!template text="""answer those, and then I'll be available on IRC. So, the next""" start="00:12:25.400" video="qanda-guile" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Q: Do you think guile-emacs will be able to use or (collaborate with) some of the other awesome projects around Emacs Lisp?""" start="00:12:30.000" video="qanda-guile" id="subtitle"]]</div>[[!template text="""question is whether Guile Emacs will be able to collaborate""" start="00:12:30.000" video="qanda-guile" id="subtitle"]]
[[!template text="""with projects like Gypsum and""" start="00:12:33.320" video="qanda-guile" id="subtitle"]]
[[!template text="""the native compilation projects or the pre-scheme""" start="00:12:35.960" video="qanda-guile" id="subtitle"]]
[[!template text="""efforts. Oh, yes, that is one of the things I forgot to bring""" start="00:12:44.320" video="qanda-guile" id="subtitle"]]
[[!template text="""up in my talk. So, first of all, Gypsum is approaching a""" start="00:12:48.040" video="qanda-guile" id="subtitle"]]
[[!template text="""similar idea from a different direction. And we clearly""" start="00:12:53.200" video="qanda-guile" id="subtitle"]]
[[!template text="""have a different focus. My focus is on improving Emacs Lisp""" start="00:12:58.200" video="qanda-guile" id="subtitle"]]
[[!template text="""and making Emacs itself better by integrating Guile Elisp""" start="00:13:03.920" video="qanda-guile" id="subtitle"]]
[[!template text="""and Emacs, rather than replacing eLisp or deprecating it in""" start="00:13:09.280" video="qanda-guile" id="subtitle"]]
[[!template text="""any way. But given gypsum's requirements, I do think that we""" start="00:13:15.160" video="qanda-guile" id="subtitle"]]
[[!template text="""could share a lot of code required for emulating basic Emacs""" start="00:13:20.160" video="qanda-guile" id="subtitle"]]
[[!template text="""functionality. And this could even become interesting if""" start="00:13:26.440" video="qanda-guile" id="subtitle"]]
[[!template text="""we get to the point of rewriting parts of Emacs in Lisp. With""" start="00:13:29.840" video="qanda-guile" id="subtitle"]]
[[!template text="""respect to the native compilation effort, I'm familiar""" start="00:13:35.800" video="qanda-guile" id="subtitle"]]
[[!template text="""with it. I'm not that impressed with the results of it. It's a""" start="00:13:41.280" video="qanda-guile" id="subtitle"]]
[[!template text="""very impressive effort, but as far as I can tell, it's""" start="00:13:45.880" video="qanda-guile" id="subtitle"]]
[[!template text="""accelerating a bytecode interpreter that just simply has""" start="00:13:52.360" video="qanda-guile" id="subtitle"]]
[[!template text="""an out-of-date design, to be quite blunt. It's possible""" start="00:13:57.240" video="qanda-guile" id="subtitle"]]
[[!template text="""that Emacs's JIT has ideas that Guile should adopt, like""" start="00:14:02.720" video="qanda-guile" id="subtitle"]]
[[!template text="""perhaps libgccjit might perhaps be better than GNU""" start="00:14:08.920" video="qanda-guile" id="subtitle"]]
[[!template text="""Lightning, which is a relatively simple JIT that Guile""" start="00:14:14.040" video="qanda-guile" id="subtitle"]]
[[!template text="""uses.""" start="00:14:17.000" video="qanda-guile" id="subtitle"]]
[[!template text="""But it doesn't have to have a direct relationship to Guile""" start="00:14:17.640" video="qanda-guile" id="subtitle"]]
[[!template text="""Emacs. And as far as pre-scheme goes, I have been watching""" start="00:14:25.840" video="qanda-guile" id="subtitle"]]
[[!template text="""Flat Watson's work on pre-scheme with great interest""" start="00:14:31.160" video="qanda-guile" id="subtitle"]]
[[!template text="""because Scheme 48 used to be my favorite implementation.""" start="00:14:36.200" video="qanda-guile" id="subtitle"]]
[[!template text="""And I do think that it could be, it's a tool that we should look""" start="00:14:40.000" video="qanda-guile" id="subtitle"]]
[[!template text="""at when we're thinking about moving functionality into""" start="00:14:44.920" video="qanda-guile" id="subtitle"]]
[[!template text="""Lisp and could certainly make it easier to upstream some of""" start="00:14:47.880" video="qanda-guile" id="subtitle"]]
[[!template text="""the work we may end up doing.""" start="00:14:53.200" video="qanda-guile" id="subtitle"]]
[[!template text="""All right, do we have more questions?""" start="00:14:54.520" video="qanda-guile" id="subtitle"]]

<div class="transcript-heading">[[!template new="1" text="""Q: SBCL, ...You mentioned Robert Strandh's SICL along with SBCL---does that work help with the implementation of CL in Guile?""" start="00:15:04.200" video="qanda-guile" id="subtitle"]]</div>[[!template text="""There's a question about SICL and SBCL. I think I answered""" start="00:15:04.200" video="qanda-guile" id="subtitle"]]
[[!template text="""that earlier. It should help us implement Common Lisp when""" start="00:15:13.160" video="qanda-guile" id="subtitle"]]
[[!template text="""it comes to high-level features and the various large""" start="00:15:17.520" video="qanda-guile" id="subtitle"]]
[[!template text="""subcomponents of Common Lisp. Another important factor is""" start="00:15:25.000" video="qanda-guile" id="subtitle"]]
[[!template text="""that Guile already has decent support for the Common Lisp""" start="00:15:28.760" video="qanda-guile" id="subtitle"]]
[[!template text="""object system. Without that, it would be far more""" start="00:15:32.280" video="qanda-guile" id="subtitle"]]
[[!template text="""difficult. But I do expect that we can share code with other""" start="00:15:35.800" video="qanda-guile" id="subtitle"]]
[[!template text="""Common Lisp implementations. I've personally rated""" start="00:15:41.920" video="qanda-guile" id="subtitle"]]
[[!template text="""Common Lisp compiler code when working on Guile Hoot, for""" start="00:15:44.800" video="qanda-guile" id="subtitle"]]
[[!template text="""example. So there are definitely places where they can""" start="00:15:49.200" video="qanda-guile" id="subtitle"]]
[[!template text="""contribute.""" start="00:15:52.960" video="qanda-guile" id="subtitle"]]
[[!template text="""Regarding the Hoot project and its relationship to""" start="00:15:54.040" video="qanda-guile" id="subtitle"]]
[[!template text="""Galimax, it's a purely speculative thing. First of all,""" start="00:16:02.840" video="qanda-guile" id="subtitle"]]
[[!template text="""Hoot is only tested on Scheme-to-WebAssembly""" start="00:16:11.080" video="qanda-guile" id="subtitle"]]
[[!template text="""compilations. I've heard some suggestions that some uses""" start="00:16:17.080" video="qanda-guile" id="subtitle"]]
[[!template text="""of Tree.io may not be compatible with the Hoot compiler. I'm""" start="00:16:22.600" video="qanda-guile" id="subtitle"]]
[[!template text="""not sure if that's the case or not.""" start="00:16:26.440" video="qanda-guile" id="subtitle"]]
[[!template text="""But it is a complete enough project that if Emacs is, say, 90%""" start="00:16:30.000" video="qanda-guile" id="subtitle"]]
[[!template text="""Lisp, there's only a few thousand lines of C code to""" start="00:16:41.200" video="qanda-guile" id="subtitle"]]
[[!template text="""implement, then it would be entirely practical to compile""" start="00:16:45.120" video="qanda-guile" id="subtitle"]]
[[!template text="""Emacs WebAssembly, as long as we had a back end, like one""" start="00:16:49.160" video="qanda-guile" id="subtitle"]]
[[!template text="""based on the browser's document object model, or some sort""" start="00:16:54.160" video="qanda-guile" id="subtitle"]]
[[!template text="""of graphical interface through WASI. And that may have some""" start="00:16:58.120" video="qanda-guile" id="subtitle"]]
[[!template text="""interesting applications for portability to unusual""" start="00:17:04.440" video="qanda-guile" id="subtitle"]]
[[!template text="""platforms. It may even bring performance advantages in""" start="00:17:07.360" video="qanda-guile" id="subtitle"]]
[[!template text="""cases where the WebAssembly implementation is connected""" start="00:17:11.360" video="qanda-guile" id="subtitle"]]
[[!template text="""to a tracing just-in-time compiler, because that may be""" start="00:17:18.960" video="qanda-guile" id="subtitle"]]
[[!template text="""more appropriate to the high level of dynamism the Emacs""" start="00:17:22.760" video="qanda-guile" id="subtitle"]]
[[!template text="""list has than the kind of simple template JITs that both""" start="00:17:26.840" video="qanda-guile" id="subtitle"]]
[[!template text="""Emacs and Guile are using.""" start="00:17:32.440" video="qanda-guile" id="subtitle"]]
[[!template text="""What a fascinating point. Just to break into active""" start="00:17:34.520" video="qanda-guile" id="subtitle"]]
[[!template text="""listening a little so this doesn't, to you, feel like you're""" start="00:17:39.800" video="qanda-guile" id="subtitle"]]
[[!template text="""talking to yourself. I can see from chat and the questions""" start="00:17:44.000" video="qanda-guile" id="subtitle"]]
[[!template text="""still coming in, you know, comments. You know, it isn't, but""" start="00:17:46.920" video="qanda-guile" id="subtitle"]]
[[!template text="""I just want you to be able to hear and feel that. Yeah, great,""" start="00:17:51.440" video="qanda-guile" id="subtitle"]]
[[!template text="""great point there. All right. Thank you. And yes, if there""" start="00:17:55.000" video="qanda-guile" id="subtitle"]]
[[!template text="""are more questions, keep throwing them at me. I should""" start="00:18:00.680" video="qanda-guile" id="subtitle"]]
[[!template text="""probably also mention I will have to jump out myself, but the""" start="00:18:04.680" video="qanda-guile" id="subtitle"]]
[[!template text="""recording will automatically end when we all jump out or""" start="00:18:08.000" video="qanda-guile" id="subtitle"]]
[[!template text="""just drop a note anywhere, ping me, whatever. And I'll come""" start="00:18:10.800" video="qanda-guile" id="subtitle"]]
[[!template text="""along and shut off the recording and we'll trim it up before""" start="00:18:15.200" video="qanda-guile" id="subtitle"]]
[[!template text="""we publish it. I'm looking forward to reading through""" start="00:18:18.440" video="qanda-guile" id="subtitle"]]
[[!template text="""anything I do miss. Thank you. Sounds good.""" start="00:18:21.880" video="qanda-guile" id="subtitle"]]
[[!template text="""All right, I'm not seeing changes in the etherpad. So I'm""" start="00:18:30.200" video="qanda-guile" id="subtitle"]]
[[!template text="""going to close this in maybe 30 seconds if there are no more""" start="00:19:08.440" video="qanda-guile" id="subtitle"]]
[[!template text="""additions. Thanks, everyone, for the interesting and very""" start="00:19:15.000" video="qanda-guile" id="subtitle"]]
[[!template text="""pointed questions on some of the most significant areas. I""" start="00:19:21.160" video="qanda-guile" id="subtitle"]]
[[!template text="""appreciate everyone's feedback. I'm glad this provoked so""" start="00:19:26.400" video="qanda-guile" id="subtitle"]]
[[!template text="""much curiosity in people.""" start="00:19:31.920" video="qanda-guile" id="subtitle"]]
[[!template text="""Thank you, janneke.""" start="00:19:33.680" video="qanda-guile" id="subtitle"]]
[[!template text="""All right, I think we are done with the Q&A session, so I'm""" start="00:19:44.520" video="qanda-guile" id="subtitle"]]
[[!template text="""going to close this BBB and we can continue with the rest of""" start="00:19:51.440" video="qanda-guile" id="subtitle"]]
[[!template text="""EmacsConf.""" start="00:19:57.200" video="qanda-guile" id="subtitle"]]
[[!template text="""You are currently the only person in this conference.""" start="00:19:58.720" video="qanda-guile" id="subtitle"]]

</div>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 -->