summaryrefslogtreecommitdiffstats
path: root/2024/captions/emacsconf-2024-guile--beguiling-emacs-guileemacs-relaunched--robin-templeton--answers.vtt
blob: 510e556ea4de1fa7b723685e7934353ac67256fa (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
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
WEBVTT

00:00:00.000 --> 00:00:08.119
All right. Hey, thanks for bearing with us there. We had a

00:00:08.120 --> 00:00:11.239
couple of bumps in the road, a cross between a couple of

00:00:11.240 --> 00:00:13.479
different versions of our program that we deliver here,

00:00:13.480 --> 00:00:17.959
different ways that we bring this stream together between

00:00:17.960 --> 00:00:22.359
the recorded content that that speakers are putting

00:00:22.360 --> 00:00:26.879
together in advance in the live content, such as what you're

00:00:26.880 --> 00:00:31.039
seeing right here. So thanks go to Sacha and Leo, and

00:00:31.040 --> 00:00:34.359
everybody behind the stages gluing it all together. And

00:00:34.360 --> 00:00:40.199
we're back here now, and I'm speaking with Robin, who us

00:00:40.200 --> 00:00:42.799
ready to take on some of your questions and address some of

00:00:42.800 --> 00:00:46.879
the comments over here on the etherpad. If you want to jump in

00:00:46.880 --> 00:00:51.319
there, there's links in the chat. And thanks so much, Robin,

00:00:51.320 --> 00:00:53.999
for your talk. And it's also been a pleasure chatting with

00:00:54.000 --> 00:00:57.919
you just a little bit over the last couple of months on IRC.

00:00:57.920 --> 00:01:33.319
Yeah, absolutely. Great meeting you.

00:01:33.320 --> 00:01:37.679
All right. All right, everyone. I think I am streaming now.

00:01:37.680 --> 00:01:42.439
So let's look at it. Let's see. I see the IRC scrolling. So

00:01:42.440 --> 00:01:47.199
let's see where that's going. Yes, the Common Lisp is what I

00:01:47.200 --> 00:01:50.519
thought would piss people off. And because it's not part of

00:01:50.520 --> 00:01:54.239
either community, but I think it would be a good compromise

00:01:54.240 --> 00:01:57.839
for building a Lisp into a language that's more suitable for

00:01:57.840 --> 00:02:01.879
building large systems like the kind that we are building in

00:02:01.880 --> 00:02:07.279
Emacs today. I also left out an important part of the talk,

00:02:07.280 --> 00:02:12.079
which is part of the motivation for transitioning from C to

00:02:12.080 --> 00:02:15.599
Lisp. And that's the performance characteristics

00:02:15.600 --> 00:02:19.399
fundamentally change when you get a modern and high

00:02:19.400 --> 00:02:23.559
performance Lisp system involved. it starts getting less

00:02:23.560 --> 00:02:27.799
practical to just call out to C to speed up every operation.

00:02:27.800 --> 00:02:31.559
Among other things, you lose the ability to use more

00:02:31.560 --> 00:02:34.759
advanced control structures, like the limited

00:02:34.760 --> 00:02:40.039
continuations. And you also have to pay the overhead of

00:02:40.040 --> 00:02:43.879
calling out to our foreign function. So it gets to be an

00:02:43.880 --> 00:02:47.879
increasingly better deal to optimize your list

00:02:47.880 --> 00:02:52.719
implementation and provide ways for building faster list

00:02:52.720 --> 00:02:55.879
programs, such as type annotations, once you've gotten

00:02:55.880 --> 00:03:01.479
over a certain threshold of performance.

NOTE 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?

00:03:01.480 --> 00:03:07.359
I'm going to look at the pad. Here we go. The first question is

00:03:07.360 --> 00:03:12.519
about fibers and whether they help with making Elisp

00:03:12.520 --> 00:03:18.279
concurrent in terms of its data structures. Yes, that's

00:03:18.280 --> 00:03:23.879
absolutely correct. Fibers by themselves do not provide

00:03:23.880 --> 00:03:26.799
thread safety for any of the existing Emacs data

00:03:26.800 --> 00:03:32.879
structures. What they are useful for is building things

00:03:32.880 --> 00:03:38.199
that don't use Emacs data structures, say a network client

00:03:38.200 --> 00:03:44.559
that reads input from a stream or in scheme, a port or a stream

00:03:44.560 --> 00:03:49.679
instead of a buffer. And we can also take a look at options for

00:03:49.680 --> 00:03:54.199
making more Emacs features concurrency safe or thread

00:03:54.200 --> 00:03:58.079
safe. For example, we could introduce the idea of a thread

00:03:58.080 --> 00:04:03.039
local buffer that didn't require locks for sharing between

00:04:03.040 --> 00:04:09.239
different threads. And I'm not sure how that would develop,

00:04:09.240 --> 00:04:12.319
but I'm sure the Emacs maintainers already have some ideas

00:04:12.320 --> 00:04:17.519
in this direction. Fibers will basically provide a

00:04:17.520 --> 00:04:22.159
high-performance system that you can use apart from

00:04:22.160 --> 00:04:28.079
ordinary Emacs-less constructs.

NOTE Q: Do you have a rough idea of how much of Guile is written in C?

00:04:28.080 --> 00:04:34.839
Let's see. We have another question. Emacs is roughly 25% C.

00:04:34.840 --> 00:04:38.839
How much of Guile is in C?

00:04:38.840 --> 00:04:45.679
Well, part of my point about C is not so much that there, well,

00:04:45.680 --> 00:04:50.279
obviously, I phrased it a little provocatively, but the

00:04:50.280 --> 00:04:54.719
problem is not so much that there is C, but that there is so

00:04:54.720 --> 00:05:00.279
much C involved in every single layer of the application.

00:05:00.280 --> 00:05:04.559
So, for example, we're limited in our ability to use tools

00:05:04.560 --> 00:05:08.159
like limit continuations, which can be used to express

00:05:08.160 --> 00:05:13.599
buffer local variable binding in a few dozen lines, because

00:05:13.600 --> 00:05:21.839
Emacs has so much calling back and forth between guile and C,

00:05:21.840 --> 00:05:26.599
due to so much basic functionality being in primitive C

00:05:26.600 --> 00:05:34.119
subroutines. So that's one issue apart from the question of

00:05:34.120 --> 00:05:38.359
how much is in a particular language. To answer the question

00:05:38.360 --> 00:05:45.879
about Guile, Guile has about 165,000 lines of scheme code

00:05:45.880 --> 00:05:51.599
and about 160,000 lines of C code, so it's about half and

00:05:51.600 --> 00:05:55.879
half. And that shouldn't really be surprising given that it

00:05:55.880 --> 00:06:00.359
is actually focused on low-level things like building a

00:06:00.360 --> 00:06:05.079
high-performance bytecode compiler, and a just-in-time

00:06:05.080 --> 00:06:09.719
compiler, and so on, as well as providing its own fairly

00:06:09.720 --> 00:06:14.999
rich, but still far less complete than Emacs's standard

00:06:15.000 --> 00:06:19.239
library, in terms of Ice9 and other system libraries

NOTE Q: A Common Lisp implementation for Guile sounds really cool! Is there already work on this underway?

00:06:19.240 --> 00:06:24.359
shipped with Guile. The next question is on a Common Lisp

00:06:24.360 --> 00:06:27.759
implementation for Guile, and whether work on it is

00:06:27.760 --> 00:06:33.079
underway. In fact, work on it is already underway. I've been

00:06:33.080 --> 00:06:36.399
working on it on and off in my spare time for a couple of years

00:06:36.400 --> 00:06:40.039
now. I've gotten, I think, a couple of chapters of the

00:06:40.040 --> 00:06:43.519
hyperspectin, if you want to measure it that way. But I've

00:06:43.520 --> 00:06:51.719
been focusing my work more on research and on what we need to

00:06:51.720 --> 00:06:57.399
do to have a LISP environment, a polyglot LISP environment,

00:06:57.400 --> 00:07:02.759
wherein the features of Common Lisp and Scheme and Emacs

00:07:02.760 --> 00:07:08.919
Lisp can all work easily and ergonomically together. So

00:07:08.920 --> 00:07:13.879
this involves things like the question of Lisps having

00:07:13.880 --> 00:07:22.079
Lisp1s versus Lisp2s. That is, a Lisp1-like scheme has one

00:07:22.080 --> 00:07:27.599
namespace, like every variable is a single name that can

00:07:27.600 --> 00:07:31.999
refer to one value, whereas in Lisp2s like EmacsLisp,

00:07:32.000 --> 00:07:37.399
symbols can have different definitions as functions and as

00:07:37.400 --> 00:07:41.119
variables, as well as other namespaces like property

00:07:41.120 --> 00:07:45.719
lists. So Kent Pittman has some interesting thoughts on

00:07:45.720 --> 00:07:51.039
this that I've been looking into. Another issue is the

00:07:51.040 --> 00:07:57.519
interaction between package and module systems. So I don't

00:07:57.520 --> 00:08:01.839
have really anything ready to publish just yet on this, but I

00:08:01.840 --> 00:08:05.279
have been looking into the background issues of

00:08:05.280 --> 00:08:08.119
integrating this into Guile in a useful way.

00:08:08.120 --> 00:08:15.719
And let's see, one other thing I was going to mention.

00:08:15.720 --> 00:08:27.679
Okay, I've lost it. But yeah, there is some work already. And

00:08:27.680 --> 00:08:30.399
if people are interested in moving Emacs in this direction,

00:08:30.400 --> 00:08:34.479
then we'll certainly start working on it in earnest.

NOTE Q: Did switching from guile 2 to 3 give any performance benefits?

00:08:34.480 --> 00:08:41.119
Another question, did switching from Guile 2 to 3 give any

00:08:41.120 --> 00:08:46.279
performance benefits? Well, honestly, we're not really

00:08:46.280 --> 00:08:50.759
benchmarking stuff here because Guile Emacs has so much

00:08:50.760 --> 00:08:55.759
overhead from structuring the compiler to closely conform

00:08:55.760 --> 00:08:59.879
to Emacs in terms of like even things as simple as metadata

00:08:59.880 --> 00:09:03.879
layout for variable information.

00:09:03.880 --> 00:09:11.999
So I haven't actually noticed a perceptual change. I would

00:09:12.000 --> 00:09:15.359
guess based on the Gabriel benchmark results that is

00:09:15.360 --> 00:09:21.399
benefited from what somewhat from Gal 3's performance

00:09:21.400 --> 00:09:27.479
improvements but for Emacs I just don't know yet and working

00:09:27.480 --> 00:09:30.199
on the compiler's code generation and lowering the

00:09:30.200 --> 00:09:33.719
overhead is going to be the thing that provides the most

00:09:33.720 --> 00:09:37.319
return for improving that aspect of Gal Emacs.

00:09:37.320 --> 00:09:54.079
Let's see, I see SICL mentioned here, as well as SPCL. And it

00:09:54.080 --> 00:09:56.919
could certainly help with the implementation of

00:09:56.920 --> 00:10:01.519
Commonwealth and Guile, because a lot of the basic stuff is

00:10:01.520 --> 00:10:05.559
just providing a new interface to some bit of

00:10:05.560 --> 00:10:08.879
functionality. Like the sequence library, it's mostly

00:10:08.880 --> 00:10:13.279
stuff that we already have through SR5 and so on. The

00:10:13.280 --> 00:10:16.879
difficult, well, not the difficult but the time consuming

00:10:16.880 --> 00:10:21.599
parts are going to be all the little DSL sitcom on this path

00:10:21.600 --> 00:10:26.999
packed up inside it like pretty printing format loop and so

00:10:27.000 --> 00:10:32.359
on. It's for those high-level features that I think we could

00:10:32.360 --> 00:10:34.959
potentially share code with other Common Lisp

00:10:34.960 --> 00:10:39.039
implementations. And Common Lisp implementations do tend

00:10:39.040 --> 00:10:43.239
to be permissively licensed, SPCL's public domain, for

00:10:43.240 --> 00:10:46.439
example, so there's no barrier to sharing code with them.

NOTE Q: Do you know if the Emacs maintainers are interested in switching to Guile as the engine for Emacs Lisp?

00:10:46.440 --> 00:10:52.719
There's another question about whether the Emacs

00:10:52.720 --> 00:10:55.679
maintainers are interested in switching to Guile as the

00:10:55.680 --> 00:10:59.199
engine for Emacs Lisp. I can't speak for the current

00:10:59.200 --> 00:11:05.439
maintainers. I can say that people have talked to previous

00:11:05.440 --> 00:11:10.439
Emacs maintainers about the whole idea, and their attitude

00:11:10.440 --> 00:11:15.479
was generally cautiously optimistic. As in, it's not

00:11:15.480 --> 00:11:18.799
something they, it's somewhat political, they didn't want

00:11:18.800 --> 00:11:23.479
to get into it, but they didn't think that it was a bad idea,

00:11:23.480 --> 00:11:25.919
and they wanted to know more about how it might evolve in the

00:11:25.920 --> 00:11:31.879
future. I can comment that Eli Zaretsky, who I believe is the

00:11:31.880 --> 00:11:36.879
current Emacs maintainer, is very concerned about

00:11:36.880 --> 00:11:44.679
cross-platform compatibility. And so if I can guess at his

00:11:44.680 --> 00:11:48.519
priorities correctly, I think that that's something that

00:11:48.520 --> 00:11:52.599
we'll have to make sure is rock solid before we propose any

00:11:52.600 --> 00:11:58.359
kind of upstreaming of Gala Emacs. but in general

00:11:58.360 --> 00:12:03.719
maintainers have been cautious but curious. So I just

00:12:03.720 --> 00:12:06.719
wanted to break in and note at this point that as lives I

00:12:06.720 --> 00:12:09.519
didn't sorry I couldn't do so more gracefully while we were

00:12:09.520 --> 00:12:13.439
still on stream but I wanted to let you know that just as of 10

00:12:13.440 --> 00:12:17.399
seconds ago or so we've had to cut away into our next talk but

00:12:17.400 --> 00:12:22.199
we can keep going here as long as we like. Okay, let's wrap up.

00:12:22.200 --> 00:12:25.399
There's only a couple questions left on the pad, so I'll

00:12:25.400 --> 00:12:29.999
answer those, and then I'll be available on IRC. So, the next

NOTE Q: Do you think guile-emacs will be able to use or (collaborate with) some of the other awesome projects around Emacs Lisp?

00:12:30.000 --> 00:12:33.319
question is whether Guile Emacs will be able to collaborate

00:12:33.320 --> 00:12:35.959
with projects like Gypsum and

00:12:35.960 --> 00:12:44.319
the native compilation projects or the pre-scheme

00:12:44.320 --> 00:12:48.039
efforts. Oh, yes, that is one of the things I forgot to bring

00:12:48.040 --> 00:12:53.199
up in my talk. So, first of all, Gypsum is approaching a

00:12:53.200 --> 00:12:58.199
similar idea from a different direction. And we clearly

00:12:58.200 --> 00:13:03.919
have a different focus. My focus is on improving Emacs Lisp

00:13:03.920 --> 00:13:09.279
and making Emacs itself better by integrating Guile Elisp

00:13:09.280 --> 00:13:15.159
and Emacs, rather than replacing eLisp or deprecating it in

00:13:15.160 --> 00:13:20.159
any way. But given gypsum's requirements, I do think that we

00:13:20.160 --> 00:13:26.439
could share a lot of code required for emulating basic Emacs

00:13:26.440 --> 00:13:29.839
functionality. And this could even become interesting if

00:13:29.840 --> 00:13:35.799
we get to the point of rewriting parts of Emacs in Lisp. With

00:13:35.800 --> 00:13:41.279
respect to the native compilation effort, I'm familiar

00:13:41.280 --> 00:13:45.879
with it. I'm not that impressed with the results of it. It's a

00:13:45.880 --> 00:13:52.359
very impressive effort, but as far as I can tell, it's

00:13:52.360 --> 00:13:57.239
accelerating a bytecode interpreter that just simply has

00:13:57.240 --> 00:14:02.719
an out-of-date design, to be quite blunt. It's possible

00:14:02.720 --> 00:14:08.919
that Emacs's JIT has ideas that Guile should adopt, like

00:14:08.920 --> 00:14:14.039
perhaps libgccjit might perhaps be better than GNU

00:14:14.040 --> 00:14:16.999
Lightning, which is a relatively simple JIT that Guile

00:14:17.000 --> 00:14:17.639
uses.

00:14:17.640 --> 00:14:25.839
But it doesn't have to have a direct relationship to Guile

00:14:25.840 --> 00:14:31.159
Emacs. And as far as pre-scheme goes, I have been watching

00:14:31.160 --> 00:14:36.199
Flat Watson's work on pre-scheme with great interest

00:14:36.200 --> 00:14:39.999
because Scheme 48 used to be my favorite implementation.

00:14:40.000 --> 00:14:44.919
And I do think that it could be, it's a tool that we should look

00:14:44.920 --> 00:14:47.879
at when we're thinking about moving functionality into

00:14:47.880 --> 00:14:53.199
Lisp and could certainly make it easier to upstream some of

00:14:53.200 --> 00:14:54.519
the work we may end up doing.

00:14:54.520 --> 00:15:04.199
All right, do we have more questions?

NOTE Q: SBCL, ...You mentioned Robert Strandh's SICL along with SBCL---does that work help with the implementation of CL in Guile?

00:15:04.200 --> 00:15:13.159
There's a question about SICL and SBCL. I think I answered

00:15:13.160 --> 00:15:17.519
that earlier. It should help us implement Common Lisp when

00:15:17.520 --> 00:15:24.999
it comes to high-level features and the various large

00:15:25.000 --> 00:15:28.759
subcomponents of Common Lisp. Another important factor is

00:15:28.760 --> 00:15:32.279
that Guile already has decent support for the Common Lisp

00:15:32.280 --> 00:15:35.799
object system. Without that, it would be far more

00:15:35.800 --> 00:15:41.919
difficult. But I do expect that we can share code with other

00:15:41.920 --> 00:15:44.799
Common Lisp implementations. I've personally rated

00:15:44.800 --> 00:15:49.199
Common Lisp compiler code when working on Guile Hoot, for

00:15:49.200 --> 00:15:52.959
example. So there are definitely places where they can

00:15:52.960 --> 00:15:54.039
contribute.

00:15:54.040 --> 00:16:02.839
Regarding the Hoot project and its relationship to

00:16:02.840 --> 00:16:11.079
Galimax, it's a purely speculative thing. First of all,

00:16:11.080 --> 00:16:17.079
Hoot is only tested on Scheme-to-WebAssembly

00:16:17.080 --> 00:16:22.599
compilations. I've heard some suggestions that some uses

00:16:22.600 --> 00:16:26.439
of Tree.io may not be compatible with the Hoot compiler. I'm

00:16:26.440 --> 00:16:29.999
not sure if that's the case or not.

00:16:30.000 --> 00:16:41.199
But it is a complete enough project that if Emacs is, say, 90%

00:16:41.200 --> 00:16:45.119
Lisp, there's only a few thousand lines of C code to

00:16:45.120 --> 00:16:49.159
implement, then it would be entirely practical to compile

00:16:49.160 --> 00:16:54.159
Emacs WebAssembly, as long as we had a back end, like one

00:16:54.160 --> 00:16:58.119
based on the browser's document object model, or some sort

00:16:58.120 --> 00:17:04.439
of graphical interface through WASI. And that may have some

00:17:04.440 --> 00:17:07.359
interesting applications for portability to unusual

00:17:07.360 --> 00:17:11.359
platforms. It may even bring performance advantages in

00:17:11.360 --> 00:17:18.959
cases where the WebAssembly implementation is connected

00:17:18.960 --> 00:17:22.759
to a tracing just-in-time compiler, because that may be

00:17:22.760 --> 00:17:26.839
more appropriate to the high level of dynamism the Emacs

00:17:26.840 --> 00:17:32.439
list has than the kind of simple template JITs that both

00:17:32.440 --> 00:17:34.519
Emacs and Guile are using.

00:17:34.520 --> 00:17:39.799
What a fascinating point. Just to break into active

00:17:39.800 --> 00:17:43.999
listening a little so this doesn't, to you, feel like you're

00:17:44.000 --> 00:17:46.919
talking to yourself. I can see from chat and the questions

00:17:46.920 --> 00:17:51.439
still coming in, you know, comments. You know, it isn't, but

00:17:51.440 --> 00:17:54.999
I just want you to be able to hear and feel that. Yeah, great,

00:17:55.000 --> 00:18:00.679
great point there. All right. Thank you. And yes, if there

00:18:00.680 --> 00:18:04.679
are more questions, keep throwing them at me. I should

00:18:04.680 --> 00:18:07.999
probably also mention I will have to jump out myself, but the

00:18:08.000 --> 00:18:10.799
recording will automatically end when we all jump out or

00:18:10.800 --> 00:18:15.199
just drop a note anywhere, ping me, whatever. And I'll come

00:18:15.200 --> 00:18:18.439
along and shut off the recording and we'll trim it up before

00:18:18.440 --> 00:18:21.879
we publish it. I'm looking forward to reading through

00:18:21.880 --> 00:18:30.199
anything I do miss. Thank you. Sounds good.

00:18:30.200 --> 00:19:08.439
All right, I'm not seeing changes in the etherpad. So I'm

00:19:08.440 --> 00:19:14.999
going to close this in maybe 30 seconds if there are no more

00:19:15.000 --> 00:19:21.159
additions. Thanks, everyone, for the interesting and very

00:19:21.160 --> 00:19:26.399
pointed questions on some of the most significant areas. I

00:19:26.400 --> 00:19:31.919
appreciate everyone's feedback. I'm glad this provoked so

00:19:31.920 --> 00:19:33.679
much curiosity in people.

00:19:33.680 --> 00:19:44.519
Thank you, janneke.

00:19:44.520 --> 00:19:51.439
All right, I think we are done with the Q&A session, so I'm

00:19:51.440 --> 00:19:57.199
going to close this BBB and we can continue with the rest of

00:19:57.200 --> 00:19:58.719
EmacsConf.

00:19:58.720 --> 00:20:10.160
You are currently the only person in this conference.