summaryrefslogtreecommitdiffstats
path: root/2024/info/guile-after.md
blob: 7687afec44dc2cc125efd7ffe63666b718764aa4 (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
<!-- Automatically generated by emacsconf-publish-after-page -->


<a name="guile-mainVideo-transcript"></a>
# Transcript

[[!template text="""Hello everyone. I'm Robin Templeton, and I'm going to talk""" start="00:00:00.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""about Emacs Beguiled and recent progress on the Guile-Emacs""" start="00:00:03.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""project.""" start="00:00:07.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""First of all, if you're not familiar with Guile, it's an""" start="00:00:13.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""implementation of the Scheme programming language, which""" start="00:00:16.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""is a dialect of Lisp, and in the same family as Emacs Lisp, and""" start="00:00:20.240" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile is GNU's official extension language. The goal of""" start="00:00:24.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the Guile-Emacs project is to use Guile as the basis for""" start="00:00:28.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Emacs's Lisp support. It has two main components: a new""" start="00:00:32.680" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Emacs Lisp compiler built on top of Guile, and a variant of""" start="00:00:37.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Emacs in which the built-in Lisp implementation is""" start="00:00:41.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""entirely replaced with Guile Elisp. We expect the""" start="00:00:45.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""combination of these two projects to have several""" start="00:00:50.240" video="mainVideo-guile" id="subtitle"]]
[[!template text="""benefits. One is improved performance. Another is""" start="00:00:53.440" video="mainVideo-guile" id="subtitle"]]
[[!template text="""increased expressiveness for Elisp and making it easier to""" start="00:00:58.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""extend and experiment with the language. Finally, it""" start="00:01:03.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""will reduce Emacs's reliance on C for two reasons. Guile will""" start="00:01:07.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""be responsible for the language implementation, so Emacs""" start="00:01:13.080" video="mainVideo-guile" id="subtitle"]]
[[!template text="""will no longer have to include a Lisp interpreter. It""" start="00:01:16.960" video="mainVideo-guile" id="subtitle"]]
[[!template text="""will also become possible to implement much more of Emacs in""" start="00:01:21.560" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Lisp than is currently feasible. Of course, this raises""" start="00:01:25.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the question of why Guile is suitable for this project. And""" start="00:01:30.280" video="mainVideo-guile" id="subtitle"]]
[[!template text="""we chose Guile for a few reasons. Guile is primarily a Scheme""" start="00:01:34.120" video="mainVideo-guile" id="subtitle"]]
[[!template text="""implementation, but it also has built-in support for""" start="00:01:38.080" video="mainVideo-guile" id="subtitle"]]
[[!template text="""multiple languages using its compiler tower. To add""" start="00:01:41.120" video="mainVideo-guile" id="subtitle"]]
[[!template text="""support for a new language to Guile, you only have to write a""" start="00:01:44.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""compiler from the source language to Tree-IL, which is""" start="00:01:50.080" video="mainVideo-guile" id="subtitle"]]
[[!template text="""essentially a low-level, minimal representation of""" start="00:01:53.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Scheme. All of Guile's compiler optimizations occur at the""" start="00:01:57.440" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Tree-IL layer or lower, so you don't need to worry about the""" start="00:02:02.480" video="mainVideo-guile" id="subtitle"]]
[[!template text="""lower-level details of the compiler when initially""" start="00:02:07.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""implementing your language. Guile also has some Lisp""" start="00:02:10.160" video="mainVideo-guile" id="subtitle"]]
[[!template text="""features that are very rare in Scheme implementations. For""" start="00:02:14.640" video="mainVideo-guile" id="subtitle"]]
[[!template text="""example, it has a nil value that counts as both false and an""" start="00:02:18.880" video="mainVideo-guile" id="subtitle"]]
[[!template text="""empty list, just like in Elisp, and it also has a version of""" start="00:02:22.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the Common Lisp Object System and its metaobject protocol,""" start="00:02:27.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""which is called GOOPS.""" start="00:02:32.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""The idea of Guile-Emacs has a pretty long history, going back""" start="00:02:37.240" video="mainVideo-guile" id="subtitle"]]
[[!template text="""at least three decades. There have been about half a dozen""" start="00:02:42.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""previous implementation attempts. But the current""" start="00:02:45.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""iteration began with a series of six Summer of Code""" start="00:02:48.520" video="mainVideo-guile" id="subtitle"]]
[[!template text="""internships: Daniel Kraft's in 2009, and then my""" start="00:02:51.520" video="mainVideo-guile" id="subtitle"]]
[[!template text="""internships from 2010 to 2014. My basic implementation""" start="00:02:56.280" video="mainVideo-guile" id="subtitle"]]
[[!template text="""strategy was pretty straightforward. I implemented a core""" start="00:03:02.520" video="mainVideo-guile" id="subtitle"]]
[[!template text="""subset of Elisp, which was enough to run some batch mode""" start="00:03:06.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""programs outside of Emacs. In Emacs, I modified the garbage""" start="00:03:09.680" video="mainVideo-guile" id="subtitle"]]
[[!template text="""collector and the data structures for Lisp objects to use""" start="00:03:15.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""their libguile equivalents. I replaced Emacs' Lisp""" start="00:03:19.680" video="mainVideo-guile" id="subtitle"]]
[[!template text="""evaluator with the one provided by Guile Elisp.""" start="00:03:24.680" video="mainVideo-guile" id="subtitle"]]
[[!template text="""After a little over a year of work, at the end of the 2014""" start="00:03:32.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""internship, I ended up with a fully functional prototype of""" start="00:03:35.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile-Emacs. It used Guile Elisp alone as its Lisp""" start="00:03:41.080" video="mainVideo-guile" id="subtitle"]]
[[!template text="""implementation and was completely compatible with Emacs""" start="00:03:46.040" video="mainVideo-guile" id="subtitle"]]
[[!template text="""functionality and with external extensions. One caveat""" start="00:03:53.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""was that performance was pretty bad, because I was focused""" start="00:03:57.560" video="mainVideo-guile" id="subtitle"]]
[[!template text="""on correctness, as well as ease of integration with the""" start="00:04:01.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Emacs C code. But it was nonetheless a major milestone for""" start="00:04:05.640" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the project. Let's take just a moment to look at""" start="00:04:10.560" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile-Elisp.""" start="00:04:15.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""For starters, we have access to Guile modules. If we call""" start="00:04:19.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile's <i>version</i> function, we can see that we're running""" start="00:04:23.880" video="mainVideo-guile" id="subtitle"]]
[[!template text="""under Guile 3.0. We have access to some of the numeric tower via""" start="00:04:26.960" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the arithmetic functions. We also have multiple values. We""" start="00:04:33.880" video="mainVideo-guile" id="subtitle"]]
[[!template text="""have to be careful to use Guile's <i>values</i> procedure here, not""" start="00:04:41.280" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the CL library's, but you can see that this works properly""" start="00:04:45.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""rather than being an emulation. Finally, we have tail""" start="00:04:48.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""call elimination. Naturally, we're going to use factorial""" start="00:04:52.880" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to demonstrate it. If <i>n</i> is zero, return the answer, else""" start="00:04:58.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""recurse with <i>n</i> less one and <i>n</i> times <i>a</i>.""" start="00:05:07.160" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Of course, this definition works correctly, but it gets""" start="00:05:14.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""more interesting if we communicate the answer with an""" start="00:05:17.120" video="mainVideo-guile" id="subtitle"]]
[[!template text="""error,""" start="00:05:21.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""in order to look at a backtrace. You can see here that there are no""" start="00:05:27.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""calls to <i>fact</i> visible in between the request to evaluate and""" start="00:05:32.360" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the error communicating the answer. That's because""" start="00:05:37.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""this tail call has been optimized into effectively a goto.""" start="00:05:42.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""This is essential for any kind of serious functional""" start="00:05:53.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""programming.""" start="00:05:55.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""That's a peek at Guile-Elisp. In 2015, I left university""" start="00:06:00.280" video="mainVideo-guile" id="subtitle"]]
[[!template text="""to go work on web technologies, and the project was dormant""" start="00:06:05.360" video="mainVideo-guile" id="subtitle"]]
[[!template text="""for a very long time. But that's been changing recently.""" start="00:06:09.480" video="mainVideo-guile" id="subtitle"]]
[[!template text="""During the last few months, I've been working with Larry""" start="00:06:14.680" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Valkama to rebase Guile-Emacs onto the development branch""" start="00:06:17.040" video="mainVideo-guile" id="subtitle"]]
[[!template text="""of upstream Emacs, including the past decade's worth of""" start="00:06:23.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""upstream development. What we've ended up with is a series""" start="00:06:28.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""of rebases onto different versions of Emacs. The older ones""" start="00:06:33.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""tend to work pretty well. The newer ones have increasingly""" start="00:06:38.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""bad problems where they haven't been properly adjusted for""" start="00:06:44.240" video="mainVideo-guile" id="subtitle"]]
[[!template text="""changes in the Emacs implementation. But we do have by now a""" start="00:06:49.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""version of Emacs 30 which boots correctly and can be used for""" start="00:06:55.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""interactive debugging, as well as the ability to bisect the""" start="00:06:58.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""revisions of Emacs and find out where regressions were""" start="00:07:04.960" video="mainVideo-guile" id="subtitle"]]
[[!template text="""introduced. Our immediate goal is of course to complete""" start="00:07:08.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the rebase. At the same time, we want to improve Guile Elisp's""" start="00:07:13.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""performance to at least be competitive with ordinary Emacs""" start="00:07:19.720" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Lisp. Just to characterize the performance situation,""" start="00:07:22.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile Elisp is usually about half as fast as ordinary Elisp,""" start="00:07:29.280" video="mainVideo-guile" id="subtitle"]]
[[!template text="""while Guile Scheme is quite often an order of magnitude""" start="00:07:34.480" video="mainVideo-guile" id="subtitle"]]
[[!template text="""faster than ordinary Elisp, and that's based on micro""" start="00:07:37.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""benchmarks like the Gabriel benchmarks. But there's""" start="00:07:43.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""clearly a lot of room to improve our compiler's output.""" start="00:07:47.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""If you want to mark your calendars, we're expecting to have a""" start="00:07:52.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""usable version of Guile-Emacs 30 out sometime next spring. We're""" start="00:07:57.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""also going to put some effort into either extracting old""" start="00:08:04.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""work or doing new work that could be contributed upstream.""" start="00:08:06.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""On the Guile side, we'll probably start out with optimizing""" start="00:08:13.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the dynamic binding facilities, which are used very seldom""" start="00:08:17.560" video="mainVideo-guile" id="subtitle"]]
[[!template text="""in Scheme, but are used all the time in traditional Lisp""" start="00:08:22.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""dialects. On the Emacs side, we'll be working initially on""" start="00:08:27.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""abstracting away the details of the Lisp implementation""" start="00:08:31.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""where they're not relevant. And that will clean up the Emacs""" start="00:08:35.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""code base a bit. It'll make it easier to integrate Emacs and""" start="00:08:40.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile Elisp. It will probably be helpful for anyone who""" start="00:08:44.280" video="mainVideo-guile" id="subtitle"]]
[[!template text="""is working on ordinary Elisp on their own.""" start="00:08:49.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We're also going to be adding new features to Emacs Lisp.""" start="00:08:51.560" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We've seen a few of them already. The numeric tower, tail""" start="00:08:57.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""call optimization, Common Lisp compatibility. We're also""" start="00:09:01.640" video="mainVideo-guile" id="subtitle"]]
[[!template text="""going to provide access to Fibers, which is a Guile library""" start="00:09:05.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""based on ideas from Concurrent ML that provides much more""" start="00:09:10.360" video="mainVideo-guile" id="subtitle"]]
[[!template text="""powerful facilities for concurrent and parallel""" start="00:09:14.640" video="mainVideo-guile" id="subtitle"]]
[[!template text="""programming than what Emacs currently offers.""" start="00:09:17.680" video="mainVideo-guile" id="subtitle"]]
[[!template text="""This plan meets Guile-Emacs' basic goals, and it's work""" start="00:09:20.680" video="mainVideo-guile" id="subtitle"]]
[[!template text="""that we could maybe get integrated upstream in a reasonable""" start="00:09:33.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""amount of time. But it's also worth considering what more we""" start="00:09:36.880" video="mainVideo-guile" id="subtitle"]]
[[!template text="""can do, and what effect Guile-Emacs might have on Emacs if it""" start="00:09:41.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""becomes simply Emacs.""" start="00:09:47.240" video="mainVideo-guile" id="subtitle"]]
[[!template text="""For context, the amount of C code in Emacs has increased by""" start="00:09:49.080" video="mainVideo-guile" id="subtitle"]]
[[!template text="""around 50% in the last decade, and now it constitutes around""" start="00:09:54.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""a quarter of the code base. C can be a bit of a barrier to""" start="00:09:58.560" video="mainVideo-guile" id="subtitle"]]
[[!template text="""customizing and extending Emacs. For example, there are""" start="00:10:06.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""about 1500 C subroutines. Around 500 are used in C code, as""" start="00:10:13.280" video="mainVideo-guile" id="subtitle"]]
[[!template text="""well as available to Lisp code, and being written in C means""" start="00:10:20.440" video="mainVideo-guile" id="subtitle"]]
[[!template text="""that they can't be practically redefined. The use of C can""" start="00:10:26.520" video="mainVideo-guile" id="subtitle"]]
[[!template text="""become a barrier to extending Emacs or customizing its""" start="00:10:31.520" video="mainVideo-guile" id="subtitle"]]
[[!template text="""behavior. We might consider writing as much of Emacs as""" start="00:10:35.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""possible in Lisp. One way to speed up this process would""" start="00:10:40.480" video="mainVideo-guile" id="subtitle"]]
[[!template text="""be to provide a Common Lisp implementation for Guile. Note""" start="00:10:46.040" video="mainVideo-guile" id="subtitle"]]
[[!template text="""that between Guile Elisp and Guile Scheme, we have all of""" start="00:10:52.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the essential ingredients for a Common Lisp environment.""" start="00:10:56.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We can also share code with other Common Lisp""" start="00:10:58.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""implementations such as SBCL and SICL. Overall, the""" start="00:11:03.280" video="mainVideo-guile" id="subtitle"]]
[[!template text="""duration of the project will be better measured in months""" start="00:11:12.480" video="mainVideo-guile" id="subtitle"]]
[[!template text="""rather than years, despite Common Lisp's reputation for""" start="00:11:15.960" video="mainVideo-guile" id="subtitle"]]
[[!template text="""being a large language. This could have multiple uses, of""" start="00:11:19.480" video="mainVideo-guile" id="subtitle"]]
[[!template text="""course. It could be a model for future improvements to""" start="00:11:23.960" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Elisp, because Elisp and CL can interact directly without""" start="00:11:29.200" video="mainVideo-guile" id="subtitle"]]
[[!template text="""problems. And it would be very easy for Elisp to borrow""" start="00:11:38.400" video="mainVideo-guile" id="subtitle"]]
[[!template text="""language features from Common Lisp. But for the purpose of a""" start="00:11:41.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""C to Lisp transition, it would also provide us with instant""" start="00:11:45.480" video="mainVideo-guile" id="subtitle"]]
[[!template text="""access to a huge number of high-quality libraries for""" start="00:11:49.560" video="mainVideo-guile" id="subtitle"]]
[[!template text="""things that Guile is not necessarily equipped to deal with,""" start="00:11:52.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""such as access to low-level Windows APIs, as well as lots of""" start="00:11:58.160" video="mainVideo-guile" id="subtitle"]]
[[!template text="""other libraries, such as interfaces to GUI toolkits for a""" start="00:12:03.880" video="mainVideo-guile" id="subtitle"]]
[[!template text="""variety of operating systems.""" start="00:12:08.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""At a certain point, this has technical advantages. If""" start="00:12:12.080" video="mainVideo-guile" id="subtitle"]]
[[!template text="""most of Emacs is written in Lisp, then we could consider""" start="00:12:21.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""using Guile Hoot to compile Emacs to WebAssembly, making it""" start="00:12:26.120" video="mainVideo-guile" id="subtitle"]]
[[!template text="""available perhaps in web browsers or on systems with the""" start="00:12:30.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""WebAssembly System Interface. But it would also be a great""" start="00:12:35.160" video="mainVideo-guile" id="subtitle"]]
[[!template text="""victory for practical software freedom. That's the idea""" start="00:12:40.680" video="mainVideo-guile" id="subtitle"]]
[[!template text="""that Freedom One, the freedom to study and modify programs,""" start="00:12:44.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""should not just be legally and technically possible, but""" start="00:12:48.360" video="mainVideo-guile" id="subtitle"]]
[[!template text="""should be actively encouraged by our computing""" start="00:12:52.040" video="mainVideo-guile" id="subtitle"]]
[[!template text="""environments. Emacs is really one of the archetypal""" start="00:12:54.720" video="mainVideo-guile" id="subtitle"]]
[[!template text="""examples of this, but we can and should go further.""" start="00:12:58.960" video="mainVideo-guile" id="subtitle"]]
[[!template text="""When Emacs is implemented primarily in Lisp, the entirety""" start="00:13:02.520" video="mainVideo-guile" id="subtitle"]]
[[!template text="""of the system will be transparent to examination and open to""" start="00:13:10.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""modification. Every part of Emacs will be instantaneously""" start="00:13:14.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""inspectable, redefinable, and debuggable.""" start="00:13:20.360" video="mainVideo-guile" id="subtitle"]]
[[!template text="""This will be a fundamental change in what is possible to""" start="00:13:23.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""do with Emacs extensions. For example, one experiment I'd""" start="00:13:30.560" video="mainVideo-guile" id="subtitle"]]
[[!template text="""be interested in is using the Common Lisp Interface Manager""" start="00:13:36.160" video="mainVideo-guile" id="subtitle"]]
[[!template text="""as the basis for Emacs's user interface. Screwlisp is""" start="00:13:40.320" video="mainVideo-guile" id="subtitle"]]
[[!template text="""giving a talk about McCLIM later today, but for present""" start="00:13:46.480" video="mainVideo-guile" id="subtitle"]]
[[!template text="""purposes, just think of it as a super-powered version of""" start="00:13:52.880" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Emacs's concept of interactive functions. It would be a""" start="00:13:55.920" video="mainVideo-guile" id="subtitle"]]
[[!template text="""pretty long-term project in Emacs as it currently exists,""" start="00:14:01.280" video="mainVideo-guile" id="subtitle"]]
[[!template text="""but it would be almost trivial if Emacs were customizable at""" start="00:14:04.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""the lowest layers via Lisp.""" start="00:14:10.520" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We'll certainly be looking at the practicality of these""" start="00:14:11.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""kinds of changes as we continue developing Guile-Emacs.""" start="00:14:19.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Finally, how can you get involved with and support Guile""" start="00:14:23.840" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Emacs? One way to help is just by trying it out and letting us""" start="00:14:31.720" video="mainVideo-guile" id="subtitle"]]
[[!template text="""know what your experiences are like. There will be a""" start="00:14:36.000" video="mainVideo-guile" id="subtitle"]]
[[!template text="""snapshot available on the Codeberg project site of the""" start="00:14:40.520" video="mainVideo-guile" id="subtitle"]]
[[!template text="""version that I'm using to give this presentation. It will be""" start="00:14:44.080" video="mainVideo-guile" id="subtitle"]]
[[!template text="""available both as a Guix package and as a portable tarball.""" start="00:14:48.760" video="mainVideo-guile" id="subtitle"]]
[[!template text="""This will be more interesting as we get closer to a complete""" start="00:14:52.720" video="mainVideo-guile" id="subtitle"]]
[[!template text="""rebase. We're also always happy to talk to potential""" start="00:14:58.800" video="mainVideo-guile" id="subtitle"]]
[[!template text="""contributors or potential collaborators from other""" start="00:15:05.480" video="mainVideo-guile" id="subtitle"]]
[[!template text="""projects.""" start="00:15:10.880" video="mainVideo-guile" id="subtitle"]]
[[!template text="""We can always use bug reports, and we're interested in what""" start="00:15:11.600" video="mainVideo-guile" id="subtitle"]]
[[!template text="""kind of features people actually want to see in Guile-Emacs.""" start="00:15:18.160" video="mainVideo-guile" id="subtitle"]]
[[!template text="""Guile-Emacs is also being developed by a small worker""" start="00:15:21.720" video="mainVideo-guile" id="subtitle"]]
[[!template text="""cooperative, so donations are a pretty direct way to""" start="00:15:27.360" video="mainVideo-guile" id="subtitle"]]
[[!template text="""support the project. If you do nothing else, I recommend""" start="00:15:32.160" video="mainVideo-guile" id="subtitle"]]
[[!template text="""going to the website and subscribing to our mailing lists so""" start="00:15:36.040" video="mainVideo-guile" id="subtitle"]]
[[!template text="""that you can keep up with news on the project. If you're""" start="00:15:40.720" video="mainVideo-guile" id="subtitle"]]
[[!template text="""watching this at EmacsConf, there will be a Q&A session""" start="00:15:45.880" video="mainVideo-guile" id="subtitle"]]
[[!template text="""immediately following this, and thanks for watching!""" start="00:15:49.240" video="mainVideo-guile" id="subtitle"]]

Questions or comments? Please e-mail [robin@terpri.org](mailto:robin@terpri.org?subject=Comment%20for%20EmacsConf%202023%20guile%3A%20Beguiling%20Emacs%3A%20Guile-Emacs%20relaunched%21)


<!-- End of emacsconf-publish-after-page -->