summaryrefslogtreecommitdiffstats
path: root/2024
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--2024/captions/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.vtt1108
-rw-r--r--2024/info/gypsum-after.md377
-rw-r--r--2024/info/gypsum-before.md4
3 files changed, 1487 insertions, 2 deletions
diff --git a/2024/captions/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.vtt b/2024/captions/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.vtt
new file mode 100644
index 00000000..6d214518
--- /dev/null
+++ b/2024/captions/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.vtt
@@ -0,0 +1,1108 @@
+WEBVTT timed by sachac, captioned by ramin
+
+00:00:00.000 --> 00:00:02.780
+Hi, my name is Ramin Honary,
+
+00:00:02.781 --> 00:00:04.480
+and I'm here to talk to you today
+
+00:00:04.481 --> 00:00:08.940
+about my clone of Emacs and Emacs Lisp that I've written in
+
+00:00:08.941 --> 00:00:12.980
+Scheme so far.
+
+00:00:12.981 --> 00:00:19.102
+So I am an Emacs enthusiast since 2017,
+
+00:00:19.103 --> 00:00:22.664
+currently employed as a full stack developer,
+
+00:00:22.665 --> 00:00:25.225
+mostly working with Python and JavaScript,
+
+00:00:25.226 --> 00:00:27.079
+although my true love is functional
+
+00:00:27.080 --> 00:00:30.559
+programming, especially Haskell, and Scheme. I started
+
+00:00:30.560 --> 00:00:33.679
+learning Scheme about two years ago. And for the past year,
+
+00:00:33.680 --> 00:00:36.279
+I've been working on a project that I'm tentatively calling
+
+00:00:36.280 --> 00:00:40.794
+Gypsum. Naming things is hard. It's not a great name.
+
+00:00:40.795 --> 00:00:43.376
+I'm open to suggestions.
+
+00:00:43.377 --> 00:00:45.897
+But yes, this is the project in which
+
+00:00:45.898 --> 00:00:53.319
+I am trying to write an Emacs Lisp interpreter in Scheme.
+
+00:00:53.320 --> 00:00:58.199
+There are many clones already of Emacs. You've probably
+
+00:00:58.200 --> 00:01:04.799
+heard of Edwin, Jed, Jedit, Jove, Lem, MG, Yi, Zile. Edwin
+
+00:01:04.800 --> 00:01:10.519
+itself is also written in Scheme--MIT Scheme. These only
+
+00:01:10.520 --> 00:01:16.159
+clone the key bindings of Emacs and not Emacs Lisp itself.
+
+00:01:16.160 --> 00:01:21.199
+The only alternative to GNU Emacs that I'm aware of is
+
+00:01:21.200 --> 00:01:26.679
+XEmacs, which is a fork of GNU Emacs.
+
+00:01:26.680 --> 00:01:30.359
+Most people don't use Emacs for the key bindings. I mean,
+
+00:01:30.360 --> 00:01:34.039
+this is anecdotally speaking, but the people who I've
+
+00:01:34.040 --> 00:01:39.519
+talked to, I would say don't use Emacs for the key bindings.
+
+00:01:39.520 --> 00:01:42.679
+They use it really more because of the power of Emacs Lisp.
+
+00:01:42.680 --> 00:01:48.439
+Emacs is as powerful as any system shell, perhaps even more
+
+00:01:48.440 --> 00:01:53.105
+powerful than system shells like Bash.
+
+00:01:53.106 --> 00:01:55.207
+The reason why it's so powerful is because
+
+00:01:55.208 --> 00:01:56.959
+there's a good programming language
+
+00:01:56.960 --> 00:02:00.039
+which you can use to control everything on your system. You
+
+00:02:00.040 --> 00:02:01.732
+can control processes. You can load and save files.
+
+00:02:01.733 --> 00:02:06.416
+You can create files. You can configure things.
+
+00:02:06.417 --> 00:02:10.219
+You can capture the output of processes in buffers.
+
+00:02:10.220 --> 00:02:13.421
+You can filter text through buffers.
+
+00:02:13.422 --> 00:02:17.839
+And a good programming language is what
+
+00:02:17.840 --> 00:02:23.479
+you need in order to do all of this. So one big goal of this
+
+00:02:23.480 --> 00:02:29.239
+project is to try to stick as closely as possible to the R7RS
+
+00:02:29.240 --> 00:02:33.859
+standard Scheme definition. That is the latest Scheme
+
+00:02:33.860 --> 00:02:38.919
+standard: R7. And this is just because I want my project to
+
+00:02:38.920 --> 00:02:43.519
+work on many scheme implementations, not just Guile.
+
+00:02:43.520 --> 00:02:45.499
+Although Guile certainly is the reference
+
+00:02:45.500 --> 00:02:50.239
+implementation.
+
+00:02:50.240 --> 00:02:56.459
+So another goal is to be able to run any "init.el".
+
+00:02:56.460 --> 00:02:59.740
+So you can take your existing "init.el"
+
+00:02:59.741 --> 00:03:01.720
+and run it in my program without
+
+00:03:01.721 --> 00:03:05.340
+significant changes. That's one of my goals in the end.
+
+00:03:05.341 --> 00:03:07.315
+I should be able to do that.
+
+00:03:07.316 --> 00:03:09.119
+A lot of people invest significant
+
+00:03:09.120 --> 00:03:12.717
+time in their configs, and it's kind of disruptive
+
+00:03:12.718 --> 00:03:14.300
+if you want to change editors,
+
+00:03:14.301 --> 00:03:16.500
+not be able to use your Emacs Lisp
+
+00:03:16.501 --> 00:03:21.646
+config. And so I think a useful Emacs clone
+
+00:03:21.647 --> 00:03:25.127
+would be able to clone Emacs Lisp well enough
+
+00:03:25.128 --> 00:03:29.799
+that you can run your "init.el".
+
+00:03:29.800 --> 00:03:33.879
+And so overall, why am I doing this? It's just because I like
+
+00:03:33.880 --> 00:03:37.999
+the Scheme programming language. I love its simplicity and
+
+00:03:38.000 --> 00:03:42.439
+its power. It's an extremely well thought-out language.
+
+00:03:42.440 --> 00:03:46.159
+It's one of those languages where you can understand the
+
+00:03:46.160 --> 00:03:48.739
+entire language from top to bottom. You can read the entire
+
+00:03:48.740 --> 00:03:52.879
+specification and understand it yourself.
+
+00:03:52.880 --> 00:03:57.239
+It's like the computers I grew up with when I was a kid.
+
+00:03:57.240 --> 00:03:59.319
+They were all very simple computers
+
+00:03:59.320 --> 00:04:02.559
+in the late 80s, early 90s. And back then,
+
+00:04:02.560 --> 00:04:05.579
+theoretically, an engineer could understand the entire
+
+00:04:05.580 --> 00:04:07.959
+system at the software level all the way down to the circuit
+
+00:04:07.960 --> 00:04:12.159
+level. You can't do that nowadays. And so nowadays, my
+
+00:04:12.160 --> 00:04:16.859
+computer is not really a physical computer anymore. It's
+
+00:04:16.860 --> 00:04:21.079
+the Scheme language standard itself. That is the core of
+
+00:04:21.080 --> 00:04:25.599
+computation, of all of computation for me. And I would like
+
+00:04:25.600 --> 00:04:30.579
+to use it as more than just an academic curiosity. It was
+
+00:04:30.580 --> 00:04:36.359
+originally designed for teaching at MIT, but it's found use
+
+00:04:36.360 --> 00:04:41.399
+in industry. And the R7RS standard is still
+
+00:04:41.400 --> 00:04:44.270
+relatively new. It's over 10 years old at this point,
+
+00:04:44.271 --> 00:04:47.999
+but hasn't, I mean, the
+
+00:04:48.000 --> 00:04:52.980
+Scheme ecosystem itself is already fairly small.
+
+00:04:52.981 --> 00:04:54.341
+There still, I don't think,
+
+00:04:54.342 --> 00:04:56.359
+has been a whole lot of adoption of R7RS
+
+00:04:56.360 --> 00:04:58.785
+quite yet. Kind of a shame.
+
+00:04:58.786 --> 00:05:01.119
+So I'd like a project like this, a
+
+00:05:01.120 --> 00:05:04.009
+very large scale, kind of a killer-app-like project
+
+00:05:04.010 --> 00:05:05.920
+where you're developing a text editor
+
+00:05:05.921 --> 00:05:09.060
+and perhaps even an integrated development environment
+
+00:05:09.061 --> 00:05:11.920
+in Scheme, I think would be very useful
+
+00:05:11.921 --> 00:05:13.799
+just even as a study of, you know, what
+
+00:05:13.800 --> 00:05:18.461
+can this language do? And just overall,
+
+00:05:18.462 --> 00:05:21.220
+there seems to be a lot of interest in
+
+00:05:21.221 --> 00:05:24.320
+Guile-based Emacs and well, maybe a
+
+00:05:24.321 --> 00:05:27.163
+Scheme-based Emacs, but Guile in particular.
+
+00:05:27.164 --> 00:05:28.220
+There has been talk of
+
+00:05:28.221 --> 00:05:33.660
+changing Emacs Lisp or the core of the Emacs Lisp over to
+
+00:05:33.661 --> 00:05:38.469
+Guile for about 30 years or so,
+
+00:05:38.470 --> 00:05:41.199
+talks originally in the early
+
+00:05:41.200 --> 00:05:44.799
+mid 90s. There were discussions between Richard Stallman,
+
+00:05:44.800 --> 00:05:49.919
+Tom Lord, and Aubrey Jaffer. They considered
+
+00:05:49.920 --> 00:05:53.219
+actually replacing Emacs Lisp with Scheme.
+
+00:05:53.220 --> 00:05:56.827
+In 1999, and going for about 10 years,
+
+00:05:56.828 --> 00:06:01.079
+someone named Ken Raeburn actually started
+
+00:06:01.080 --> 00:06:07.240
+a project where he started writing Emacs in Guile.
+
+00:06:07.241 --> 00:06:11.859
+My project is very similar to this.
+
+00:06:11.860 --> 00:06:15.120
+Here's a quote from his webpage, which is still up, even
+
+00:06:15.121 --> 00:06:18.399
+though it hasn't been updated in 15 years.
+
+00:06:18.400 --> 00:06:20.519
+This project that I have started
+
+00:06:20.520 --> 00:06:23.101
+is for converting GNU Emacs to Guile
+
+00:06:23.102 --> 00:06:24.121
+as its programming language.
+
+00:06:24.122 --> 00:06:26.082
+Support for Emacs Lisp will continue to exist,
+
+00:06:26.083 --> 00:06:27.760
+of course, but it may be through
+
+00:06:27.761 --> 00:06:29.244
+translation and/or interpretation.
+
+00:06:29.245 --> 00:06:30.339
+The Lisp engine itself
+
+00:06:30.340 --> 00:06:32.906
+may no longer be the core of the program.
+
+00:06:32.907 --> 00:06:38.538
+And this is my goal as well. In 2010,
+
+00:06:38.539 --> 00:06:41.879
+Andy Wingo and Ludovic Courtes
+
+00:06:41.880 --> 00:06:46.402
+took maintainership of the Guile project.
+
+00:06:46.403 --> 00:06:52.719
+From 2009, so while Andy... 2009
+
+00:06:52.720 --> 00:06:59.399
+to 2011, the first Emacs Lisp interpreter was already being
+
+00:06:59.400 --> 00:07:02.089
+implemented in Guile. And even to this day,
+
+00:07:02.090 --> 00:07:05.651
+this Emacs Lisp interpreter ships with Guile.
+
+00:07:05.652 --> 00:07:06.599
+And so this was happening
+
+00:07:06.600 --> 00:07:10.112
+while Andy Wingo took control of the project.
+
+00:07:10.113 --> 00:07:13.833
+In 2011, so shortly after Andy Wingo
+
+00:07:13.834 --> 00:07:15.119
+took control of the project,
+
+00:07:15.120 --> 00:07:22.279
+Guile 2.0 was released. And also in 2011, in the summertime,
+
+00:07:22.280 --> 00:07:27.279
+someone named Robin Templeton, I believe it was a Google
+
+00:07:27.280 --> 00:07:33.519
+Summer of Code project, started actually trying to
+
+00:07:33.520 --> 00:07:38.719
+incorporate libguile, that's the guile interpreter, as a
+
+00:07:38.720 --> 00:07:45.199
+linkable or loadable library, linking it to the Emacs
+
+00:07:45.200 --> 00:07:49.179
+executable, and then providing some built-in functions in
+
+00:07:49.180 --> 00:07:54.759
+Emacs that allows you to call the scheme
+
+00:07:54.760 --> 00:07:58.739
+interpreter, the Guile Scheme interpreter, from Emacs.
+
+00:07:58.740 --> 00:08:02.239
+And so it's not like a wrapper around the REPL like Geiser or
+
+00:08:02.240 --> 00:08:08.959
+SLIME. It's actually the whole Scheme interpreter loaded
+
+00:08:08.960 --> 00:08:13.939
+into your Emacs process. And that means your Emacs will have
+
+00:08:13.940 --> 00:08:20.079
+the ability to actually load compiled Scheme programs and
+
+00:08:20.080 --> 00:08:25.879
+actually run them and share memory with Emacs Lisp
+
+00:08:25.880 --> 00:08:29.799
+processes. And, well, Robin Templeton will explain all of
+
+00:08:29.800 --> 00:08:33.039
+this. They're presenting today, and I'm very excited to
+
+00:08:33.040 --> 00:08:37.079
+actually see their presentation. They'll explain
+
+00:08:37.080 --> 00:08:40.179
+everything.
+
+00:08:40.180 --> 00:08:45.679
+So, let's see. Moving on. 2020, someone named Vasilij
+
+00:08:45.680 --> 00:08:49.039
+Schneidermann, I'm not sure how you pronounce that, published
+
+00:08:49.040 --> 00:08:53.639
+an overview called The State of Emacs Lisp on Guile. Let's see
+
+00:08:53.640 --> 00:08:58.399
+if I have that here. Yep, it's this page right here. He goes
+
+00:08:58.400 --> 00:09:04.879
+into detail about who has done what so far, and what can you do
+
+00:09:04.880 --> 00:09:09.759
+in Guile with Emacs Lisp so far, and so on. Like, what is the
+
+00:09:09.760 --> 00:09:12.717
+state of the project overall?
+
+00:09:12.718 --> 00:09:15.899
+And so (speak of the devil)
+
+00:09:15.900 --> 00:09:20.960
+(Andy Wingo on social media).
+
+00:09:20.961 --> 00:09:24.339
+So, 2020 to present. Guile Emacs
+
+00:09:24.340 --> 00:09:32.071
+is dead? So there's GCC Emacs now.
+
+00:09:32.072 --> 00:09:35.752
+Emacs Lisp now has its own JIT compiler.
+
+00:09:35.753 --> 00:09:39.259
+And it seems like over the past few years,
+
+00:09:39.260 --> 00:09:44.319
+Emacs Lisp has kind of moved off into the direction of
+
+00:09:44.320 --> 00:09:48.439
+becoming its own programming language in its own right,
+
+00:09:48.440 --> 00:09:51.839
+and it is decidedly Common Lisp-flavored. It is
+
+00:09:51.840 --> 00:09:54.166
+very similar to Common Lisp,
+
+00:09:54.167 --> 00:09:56.519
+and that seems to be the direction
+
+00:09:56.520 --> 00:10:00.719
+that it's headed now, and I don't know if there's really any
+
+00:10:00.720 --> 00:10:05.559
+interest anymore amongst the Emacs maintainers of
+
+00:10:05.560 --> 00:10:09.799
+continuing with a Guile-based Emacs.
+
+00:10:09.800 --> 00:10:13.319
+But as far as I know, there's still a lot of interest in the
+
+00:10:13.320 --> 00:10:19.599
+community amongst Scheme and Lisp and Emacs users who are
+
+00:10:19.600 --> 00:10:24.779
+interested in maybe continuing to try to get Guile to become
+
+00:10:24.780 --> 00:10:28.079
+the core of Emacs, or if not, you know, what Robin Templeton
+
+00:10:28.080 --> 00:10:31.639
+has been doing, at least trying to get Guile a
+
+00:10:31.640 --> 00:10:37.279
+language, a first class supported language in Emacs. So
+
+00:10:37.280 --> 00:10:39.999
+that's enough talking. Let me just show you what I have so
+
+00:10:40.000 --> 00:10:45.239
+far. The GUI is barely working, because I have very little
+
+00:10:45.240 --> 00:10:50.039
+experience with GTK or GObject Introspection. It's very
+
+00:10:50.040 --> 00:10:53.639
+difficult to debug, so it's very slow to develop. Any crash
+
+00:10:53.640 --> 00:10:58.199
+at C level produces no stack traces. So far, most of the
+
+00:10:58.200 --> 00:11:03.199
+crashes that I've experienced are due to simple mistakes
+
+00:11:03.200 --> 00:11:09.399
+like passing the wrong data type. So, so far, no, not a whole
+
+00:11:09.400 --> 00:11:14.174
+lot of need for GDB or rebuilding all GTK, glib,
+
+00:11:14.175 --> 00:11:17.877
+and so on with the debugging symbols.
+
+00:11:17.878 --> 00:11:19.319
+But yes, still development's been
+
+00:11:19.320 --> 00:11:25.499
+very slow. I'm learning as I go. I've chosen to use Guile GI as
+
+00:11:25.500 --> 00:11:30.499
+the foundation for the GUI. Let me just load it up quick here.
+
+00:11:30.600 --> 00:11:39.899
+"load main-guile.scm". And this will launch the GUI. I also
+
+00:11:39.900 --> 00:11:44.199
+happen to have a REPL that runs in a separate thread and
+
+00:11:44.200 --> 00:11:49.759
+submits any form that you type to be evaluated inside of the
+
+00:11:49.760 --> 00:11:57.079
+running GUI environment. But you can just type stuff. So
+
+00:11:57.080 --> 00:12:02.903
+"hello world." And of course there is...
+
+00:12:02.904 --> 00:12:08.059
+as you can see, it's not quite rendering correctly.
+
+00:12:08.060 --> 00:12:11.090
+This "*Messages*" thing here,
+
+00:12:11.091 --> 00:12:13.760
+that should be over here, obviously. I haven't been able to
+
+00:12:13.761 --> 00:12:17.820
+figure out how to get those little details down. But yeah,
+
+00:12:17.821 --> 00:12:23.215
+you can do M-:, and you get your eval,
+
+00:12:23.216 --> 00:12:26.637
+and you can just evaluate, like (what's an emacs,)
+
+00:12:26.638 --> 00:12:29.280
+(or what's a Scheme-specific thing?)
+
+00:12:29.281 --> 00:12:37.679
+Like "(import (srfi 1))", and
+
+00:12:37.680 --> 00:12:44.888
+let's see, do "(iota 20)", for example.
+
+00:12:44.889 --> 00:12:46.780
+And so that is the procedure
+
+00:12:46.781 --> 00:12:52.900
+that iterates and produces some 20 elements of a
+
+00:12:52.901 --> 00:12:58.419
+list. Or you can do something like, let's see,
+
+00:12:58.420 --> 00:13:08.114
+string-append "hello" with space "world".
+
+00:13:08.115 --> 00:13:10.259
+And you get the result and so on. And,
+
+00:13:10.260 --> 00:13:13.039
+you know, scheme allows you to return multiple values. So
+
+00:13:13.040 --> 00:13:14.998
+what I have done here is just
+
+00:13:14.999 --> 00:13:17.979
+every value is captured in a list
+
+00:13:17.980 --> 00:13:21.001
+and it prints all of the return values in the list.
+
+00:13:21.002 --> 00:13:23.462
+So if a procedure returns no values,
+
+00:13:23.463 --> 00:13:26.144
+you get an empty list.
+
+00:13:26.145 --> 00:13:29.405
+And that's that. It's still quite buggy.
+
+00:13:29.406 --> 00:13:31.519
+So like, here's a bug
+
+00:13:31.520 --> 00:13:37.319
+that I can reproduce fairly consistently.
+
+00:13:37.320 --> 00:13:41.407
+I can, yeah, if you do...
+
+00:13:41.408 --> 00:13:46.199
+there seems to be a problem with a
+
+00:13:46.200 --> 00:13:49.719
+widget being freed too soon, so it will crash. I'm going to
+
+00:13:49.720 --> 00:13:53.319
+try and solve that, hopefully, before this presentation
+
+00:13:53.320 --> 00:13:57.109
+goes live. Let's see here.
+
+00:13:57.110 --> 00:13:59.839
+The Emacs Lisp parser is based on
+
+00:13:59.840 --> 00:14:04.399
+Guile Emacs Lisp. So the Guile Emacs Lisp interpreter that
+
+00:14:04.400 --> 00:14:09.039
+ships with Guile, that is what I am using. I've actually
+
+00:14:09.040 --> 00:14:15.719
+copied and pasted the source code from the Guile source base
+
+00:14:15.720 --> 00:14:20.639
+into my own project so that I can iterate on it more quickly.
+
+00:14:20.640 --> 00:14:25.799
+And I've already had to make some modifications to the
+
+00:14:25.800 --> 00:14:29.899
+Emacs Lisp interpreter in Guile. So here's the evaluator.
+
+00:14:29.900 --> 00:14:33.079
+I've actually already modified the parser and the lexer a
+
+00:14:33.080 --> 00:14:37.858
+little bit. And it's at least able to parse
+
+00:14:37.859 --> 00:14:43.149
+all of the "subr.el" program, the Emacs Lisp program.
+
+00:14:43.150 --> 00:14:44.599
+It can actually load that, but not
+
+00:14:44.600 --> 00:14:47.570
+evaluate it, or parse it, but not evaluate it...
+
+00:14:47.571 --> 00:14:51.719
+Read, not eval.
+
+00:14:51.720 --> 00:14:53.959
+By the time this goes live, I will have submitted a patch
+
+00:14:53.960 --> 00:14:57.559
+upstream. And that's another goal of this project,
+
+00:14:57.560 --> 00:15:01.199
+incidentally, is that anything that we can contribute to
+
+00:15:01.200 --> 00:15:08.359
+Guile and any built-in functions that we can implement
+
+00:15:08.360 --> 00:15:10.999
+I would like to, for this project, I would like to try and
+
+00:15:11.000 --> 00:15:15.679
+contribute upstream to Guile. The Emacs Lisp interpreter
+
+00:15:15.680 --> 00:15:21.359
+is not working well, unfortunately. So this copy, this is
+
+00:15:21.360 --> 00:15:29.479
+the copy of the code base (from this commit in particular)
+
+00:15:29.480 --> 00:15:34.979
+and well, I can't get it working. I can't actually get the
+
+00:15:34.980 --> 00:15:37.759
+non-copy, the actual built-in version of
+
+00:15:37.760 --> 00:15:41.211
+the Emacs Lisp interpreter to work properly quite yet.
+
+00:15:41.212 --> 00:15:47.033
+So let me quick go to, (what is this here?)
+
+00:15:47.034 --> 00:15:51.879
+Guile Elisp. So suppose you have this
+
+00:15:51.880 --> 00:15:55.999
+"eval-elisp" procedure here and it takes
+
+00:15:56.000 --> 00:16:00.639
+an Elisp environment and then it evaluates an expression in that
+
+00:16:00.640 --> 00:16:03.599
+environment. And evaluates to a value. So this
+
+00:16:03.600 --> 00:16:05.084
+is the standard way of doing it in Guile.
+
+00:16:05.085 --> 00:16:06.039
+If you can see here,
+
+00:16:06.040 --> 00:16:09.946
+you've got this expression, "compile" expression.
+
+00:16:09.947 --> 00:16:16.859
+This is like "eval". And so actually trying to load this.
+
+00:16:16.860 --> 00:16:24.672
+So let's do "load gypsum". (Let's see here. This is, no),
+
+00:16:24.673 --> 00:16:35.759
+I wanted to "import gypsum backend guile Elisp".
+
+00:16:35.760 --> 00:16:39.039
+And if I actually want to do this... So elisp eval, first of all,
+
+00:16:39.040 --> 00:16:42.879
+it says it failed because there's an unbound variable
+
+00:16:42.880 --> 00:16:45.348
+"elisp-eval". Don't know what it's talking about.
+
+00:16:45.349 --> 00:16:48.229
+There's no such variable in any of my programs.
+
+00:16:48.230 --> 00:16:51.151
+I have no idea what's going on here.
+
+00:16:51.152 --> 00:16:59.279
+You can try to run eval elisp on some simple form like
+
+00:16:59.280 --> 00:17:04.759
+(+ 1 2). And it gives you this exception. This works.
+
+00:17:04.760 --> 00:17:09.579
+This is the same issue that I have with all of the,
+
+00:17:09.580 --> 00:17:13.200
+every version of the Emacs Lisp Interpreter in Guile.
+
+00:17:13.201 --> 00:17:18.751
+I can get it to work with this big ",L" mode.
+
+00:17:18.752 --> 00:17:21.593
+So I can actually do (+ 1 2) here.
+
+00:17:21.594 --> 00:17:26.816
+I can do "princ" like here.
+
+00:17:26.817 --> 00:17:30.119
+That all works fine. It gives me, for some reason,
+
+00:17:30.120 --> 00:17:34.940
+a stack trace here.
+
+00:17:34.941 --> 00:17:43.926
+And yeah, so it's a bit, it's not well-documented.
+
+00:17:43.927 --> 00:17:45.887
+The code base is fairly old.
+
+00:17:45.888 --> 00:17:50.399
+As I said, it was developed around 2011,
+
+00:17:50.400 --> 00:17:53.239
+and it's fairly opaque, and I have not been able to figure out
+
+00:17:53.240 --> 00:17:57.959
+how to get Emacs Lisp in Guile working smoothly. So I have
+
+00:17:57.960 --> 00:18:04.539
+started writing my own Emacs Lisp interpreter. And, uh,
+
+00:18:04.540 --> 00:18:13.399
+"gypsum/elisp/eval-tests.scm".
+
+00:18:13.400 --> 00:18:18.269
+It's, uh, not entirely ready.
+
+00:18:18.270 --> 00:18:21.695
+I can show you some of the tests at least.
+
+00:18:21.696 --> 00:18:25.036
+Here is a simple Emacs Lisp program
+
+00:18:25.037 --> 00:18:25.856
+that you can evaluate.
+
+00:18:25.857 --> 00:18:31.139
+You got "progn", "setq" a to 3, "setq" b to 5,
+
+00:18:31.140 --> 00:18:35.839
+"setq" c to the sum of a and b, return c.
+
+00:18:35.840 --> 00:18:39.059
+And this at least works correctly.
+
+00:18:39.060 --> 00:18:43.279
+As you can see here, the result is eight. Um, but
+
+00:18:43.280 --> 00:18:46.520
+the "let*" semantics are not completed yet.
+
+00:18:46.521 --> 00:18:51.103
+Lots of work left to do there.
+
+00:18:51.104 --> 00:18:54.464
+So in the time I have left, I guess I can just,
+
+00:18:54.465 --> 00:18:56.759
+talk a little bit about what my plans
+
+00:18:56.760 --> 00:18:59.387
+are for the future.
+
+00:18:59.388 --> 00:19:02.599
+I would like to begin by evaluating or
+
+00:19:02.600 --> 00:19:06.759
+actually loading the "subr.el" into my Emacs Lisp
+
+00:19:06.760 --> 00:19:09.639
+interpreter. I actually have tests set up for that as well,
+
+00:19:09.640 --> 00:19:15.909
+so I can actually select any form I want from "subr.el".
+
+00:19:15.910 --> 00:19:18.832
+I can just run this through my interpreter
+
+00:19:18.833 --> 00:19:21.593
+and test to see if everything is working
+
+00:19:21.594 --> 00:19:28.779
+once I get that far.
+
+00:19:28.780 --> 00:19:33.239
+And yeah, let me just say that this is my formal appeal to the
+
+00:19:33.240 --> 00:19:37.799
+community for help on this project. Emacs Lisp has
+
+00:19:37.800 --> 00:19:41.179
+1,393 built-in functions.
+
+00:19:41.180 --> 00:19:45.039
+I could never implement that many functions on my own, so if
+
+00:19:45.040 --> 00:19:47.599
+this project is going to be useful to anybody in any
+
+00:19:47.600 --> 00:19:51.114
+reasonable amount of time, I'm going to need help.
+
+00:19:51.115 --> 00:19:53.476
+And I know that there are people out there
+
+00:19:53.477 --> 00:19:56.398
+who are very interested in a Guile-based Emacs,
+
+00:19:56.399 --> 00:19:58.999
+and so if you're watching this,
+
+00:19:59.000 --> 00:20:00.521
+please feel free to contact me
+
+00:20:00.522 --> 00:20:05.699
+on social media or over e-mail.
+
+00:20:05.700 --> 00:20:09.647
+My job, the way I see it, is if there's enough interest,
+
+00:20:09.648 --> 00:20:12.064
+and I do get a lot of people interested in
+
+00:20:12.065 --> 00:20:13.199
+starting to contribute,
+
+00:20:13.200 --> 00:20:17.919
+my job will be to document the building and testing process
+
+00:20:17.920 --> 00:20:21.039
+and make sure that it is as easy as possible to contribute
+
+00:20:21.040 --> 00:20:24.079
+code to this project. I want to document the system
+
+00:20:24.080 --> 00:20:27.599
+architecture. I'll write blog posts. I'll do videos on
+
+00:20:27.600 --> 00:20:31.879
+PeerTube explaining how everything works. And I will
+
+00:20:31.880 --> 00:20:34.199
+prioritize which built-in functions
+
+00:20:34.200 --> 00:20:36.462
+I think are probably going to be the most necessary,
+
+00:20:36.463 --> 00:20:40.878
+the most essential to get the interpreter running,
+
+00:20:40.879 --> 00:20:42.559
+and then find low-hanging fruit,
+
+00:20:42.560 --> 00:20:46.519
+functions that are easy for people to implement
+
+00:20:46.520 --> 00:20:50.845
+as a good introduction to getting them started
+
+00:20:50.846 --> 00:20:53.947
+on contributing to the project.
+
+00:20:53.948 --> 00:20:56.679
+And then, of course, I will take
+
+00:20:56.680 --> 00:21:01.719
+responsibility myself of making sure that we can
+
+00:21:01.720 --> 00:21:03.774
+get the Elisp interpreter to the point
+
+00:21:03.775 --> 00:21:09.079
+where it can run the Emacs regression tests.
+
+00:21:09.080 --> 00:21:13.333
+These are the test suites that are used
+
+00:21:13.334 --> 00:21:20.359
+to test Emacs Lisp itself in the GNU Emacs code base. And so
+
+00:21:20.360 --> 00:21:24.559
+ERT is itself written in Emacs Lisp. And so
+
+00:21:24.560 --> 00:21:27.033
+I think if we implement enough of the built-in functions
+
+00:21:27.034 --> 00:21:29.933
+to be able to run ERT,
+
+00:21:29.934 --> 00:21:31.195
+then we can actually start
+
+00:21:31.196 --> 00:21:33.617
+using the GNU Emacs regression tests
+
+00:21:33.618 --> 00:21:39.248
+to test our own interpreter, our own Emacs clone.
+
+00:21:39.249 --> 00:21:41.199
+And of course, I'll make sure that there's at least
+
+00:21:41.200 --> 00:21:45.833
+one usable GUI. I'm currently working on Guile GI
+
+00:21:45.834 --> 00:21:51.396
+and GTK. It would be great to have an...
+
+00:21:51.397 --> 00:21:53.879
+ANSI terminal based...
+
+00:21:53.880 --> 00:21:58.219
+something that works in your terminal emulator.
+
+00:21:58.220 --> 00:22:00.283
+And yeah, it would be great if someday soon,
+
+00:22:00.284 --> 00:22:03.159
+hopefully, we get enough done
+
+00:22:03.160 --> 00:22:06.094
+that you can actually contribute a patch to this project
+
+00:22:06.095 --> 00:22:11.778
+from within the Gypsum editor itself.
+
+00:22:11.779 --> 00:22:13.380
+I was going to do an overview,
+
+00:22:13.381 --> 00:22:19.679
+but that would be for more of an hour-long presentation.
+
+00:22:19.680 --> 00:22:22.927
+So I'm out of time. I guess the last thing
+
+00:22:22.928 --> 00:22:25.449
+I should quickly say is there's no
+
+00:22:25.450 --> 00:22:27.159
+meta object protocol in this
+
+00:22:27.160 --> 00:22:29.001
+project. I think that's a little bit too difficult
+
+00:22:29.002 --> 00:22:30.962
+to port to various scheme implementations.
+
+00:22:30.963 --> 00:22:33.739
+So I've created a substitute, which I'm
+
+00:22:33.740 --> 00:22:36.959
+calling "functional lenses", which is inspired by the
+
+00:22:36.960 --> 00:22:42.059
+Haskell project of the same name.
+
+00:22:42.060 --> 00:22:47.511
+Everything in this project is based on functional lenses.
+
+00:22:47.512 --> 00:22:52.603
+Yeah, also a lot a work went into the keymaps data structure.
+
+00:22:52.604 --> 00:22:55.206
+The point being that I think I have
+
+00:22:55.207 --> 00:22:58.589
+a pretty good foundation here upon which we can build,
+
+00:22:58.590 --> 00:23:00.839
+even though there isn't an actual, there isn't
+
+00:23:00.840 --> 00:23:04.699
+a lot done in the actual prototype itself, not yet anyway,
+
+00:23:04.700 --> 00:23:08.419
+but I made sure to get the fundamentals down
+
+00:23:08.420 --> 00:23:11.080
+from the beginning. And so I think we have something
+
+00:23:11.081 --> 00:23:16.308
+like a solid foundation on which to build.
+
+00:23:16.309 --> 00:23:21.230
+So, I'm going to conclude it there.
+
+00:23:21.231 --> 00:23:24.599
+And here's my contact details. Like I said,
+
+00:23:24.600 --> 00:23:29.319
+this is a project, I'm appealing to the community of all
+
+00:23:29.320 --> 00:23:31.899
+people who are interested in Guile and Emacs to help
+
+00:23:31.900 --> 00:23:35.839
+contribute to this project. I see myself as just getting the
+
+00:23:35.840 --> 00:23:40.600
+ball rolling. Again, taking-off from the work
+
+00:23:40.601 --> 00:23:46.278
+that Ken Raeburn left behind, with my own
+
+00:23:46.279 --> 00:23:50.637
+from-the-ground-up implementation. So yeah,
+
+00:23:50.638 --> 00:23:53.858
+contact me: e-mail, you can take a look at my blog
+
+00:23:53.859 --> 00:23:57.419
+where I talk about what I have done.
+
+00:23:57.420 --> 00:24:00.759
+My source code, the code for this project, is up on
+
+00:24:00.760 --> 00:24:06.139
+Codeberg... The presentation... this
+
+00:24:06.140 --> 00:24:09.379
+presentation, the home page for this presentation, you
+
+00:24:09.380 --> 00:24:15.559
+can find more details there. Oh, I'm on
+
+00:24:15.560 --> 00:24:19.139
+ActivityPub as well, so my handle is
+
+00:24:19.140 --> 00:24:27.119
+@ramin_hal9001@fe.disroot.org, and I'm on everyday.
+
+00:24:27.120 --> 00:24:30.939
+So yeah, please feel free to contact me if you're interested,
+
+00:24:30.940 --> 00:24:35.640
+and thank you for your attention.
diff --git a/2024/info/gypsum-after.md b/2024/info/gypsum-after.md
index 9f7ec514..8cec71be 100644
--- a/2024/info/gypsum-after.md
+++ b/2024/info/gypsum-after.md
@@ -1,6 +1,383 @@
<!-- Automatically generated by emacsconf-publish-after-page -->
+<a name="gypsum-mainVideo-transcript"></a>
+# Transcript
+
+[[!template text="""Hi, my name is Ramin Honary,""" start="00:00:00.000" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and I'm here to talk to you today""" start="00:00:02.781" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""about my clone of Emacs and Emacs Lisp that I've written in""" start="00:00:04.481" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Scheme so far.""" start="00:00:08.941" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So I am an Emacs enthusiast since 2017,""" start="00:00:12.981" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""currently employed as a full stack developer,""" start="00:00:19.103" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""mostly working with Python and JavaScript,""" start="00:00:22.665" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""although my true love is functional""" start="00:00:25.226" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""programming, especially Haskell, and Scheme. I started""" start="00:00:27.080" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""learning Scheme about two years ago. And for the past year,""" start="00:00:30.560" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I've been working on a project that I'm tentatively calling""" start="00:00:33.680" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Gypsum. Naming things is hard. It's not a great name.""" start="00:00:36.280" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I'm open to suggestions.""" start="00:00:40.795" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""But yes, this is the project in which""" start="00:00:43.377" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I am trying to write an Emacs Lisp interpreter in Scheme.""" start="00:00:45.898" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""There are many clones already of Emacs. You've probably""" start="00:00:53.320" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""heard of Edwin, Jed, Jedit, Jove, Lem, MG, Yi, Zile. Edwin""" start="00:00:58.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""itself is also written in Scheme--MIT Scheme. These only""" start="00:01:04.800" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""clone the key bindings of Emacs and not Emacs Lisp itself.""" start="00:01:10.520" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""The only alternative to GNU Emacs that I'm aware of is""" start="00:01:16.160" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""XEmacs, which is a fork of GNU Emacs.""" start="00:01:21.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Most people don't use Emacs for the key bindings. I mean,""" start="00:01:26.680" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""this is anecdotally speaking, but the people who I've""" start="00:01:30.360" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""talked to, I would say don't use Emacs for the key bindings.""" start="00:01:34.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""They use it really more because of the power of Emacs Lisp.""" start="00:01:39.520" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Emacs is as powerful as any system shell, perhaps even more""" start="00:01:42.680" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""powerful than system shells like Bash.""" start="00:01:48.440" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""The reason why it's so powerful is because""" start="00:01:53.106" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""there's a good programming language""" start="00:01:55.208" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""which you can use to control everything on your system. You""" start="00:01:56.960" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""can control processes. You can load and save files.""" start="00:02:00.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""You can create files. You can configure things.""" start="00:02:01.733" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""You can capture the output of processes in buffers.""" start="00:02:06.417" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""You can filter text through buffers.""" start="00:02:10.220" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And a good programming language is what""" start="00:02:13.422" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""you need in order to do all of this. So one big goal of this""" start="00:02:17.840" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""project is to try to stick as closely as possible to the R7RS""" start="00:02:23.480" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""standard Scheme definition. That is the latest Scheme""" start="00:02:29.240" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""standard: R7. And this is just because I want my project to""" start="00:02:33.860" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""work on many scheme implementations, not just Guile.""" start="00:02:38.920" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Although Guile certainly is the reference""" start="00:02:43.520" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""implementation.""" start="00:02:45.500" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So another goal is to be able to run any &quot;init.el&quot;.""" start="00:02:50.240" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So you can take your existing &quot;init.el&quot;""" start="00:02:56.460" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and run it in my program without""" start="00:02:59.741" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""significant changes. That's one of my goals in the end.""" start="00:03:01.721" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I should be able to do that.""" start="00:03:05.341" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""A lot of people invest significant""" start="00:03:07.316" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""time in their configs, and it's kind of disruptive""" start="00:03:09.120" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""if you want to change editors,""" start="00:03:12.718" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""not be able to use your Emacs Lisp""" start="00:03:14.301" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""config. And so I think a useful Emacs clone""" start="00:03:16.501" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""would be able to clone Emacs Lisp well enough""" start="00:03:21.647" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""that you can run your &quot;init.el&quot;.""" start="00:03:25.128" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And so overall, why am I doing this? It's just because I like""" start="00:03:29.800" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""the Scheme programming language. I love its simplicity and""" start="00:03:33.880" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""its power. It's an extremely well thought-out language.""" start="00:03:38.000" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""It's one of those languages where you can understand the""" start="00:03:42.440" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""entire language from top to bottom. You can read the entire""" start="00:03:46.160" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""specification and understand it yourself.""" start="00:03:48.740" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""It's like the computers I grew up with when I was a kid.""" start="00:03:52.880" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""They were all very simple computers""" start="00:03:57.240" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""in the late 80s, early 90s. And back then,""" start="00:03:59.320" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""theoretically, an engineer could understand the entire""" start="00:04:02.560" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""system at the software level all the way down to the circuit""" start="00:04:05.580" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""level. You can't do that nowadays. And so nowadays, my""" start="00:04:07.960" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""computer is not really a physical computer anymore. It's""" start="00:04:12.160" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""the Scheme language standard itself. That is the core of""" start="00:04:16.860" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""computation, of all of computation for me. And I would like""" start="00:04:21.080" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""to use it as more than just an academic curiosity. It was""" start="00:04:25.600" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""originally designed for teaching at MIT, but it's found use""" start="00:04:30.580" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""in industry. And the R7RS standard is still""" start="00:04:36.360" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""relatively new. It's over 10 years old at this point,""" start="00:04:41.400" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""but hasn't, I mean, the""" start="00:04:44.271" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Scheme ecosystem itself is already fairly small.""" start="00:04:48.000" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""There still, I don't think,""" start="00:04:52.981" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""has been a whole lot of adoption of R7RS""" start="00:04:54.342" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""quite yet. Kind of a shame.""" start="00:04:56.360" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So I'd like a project like this, a""" start="00:04:58.786" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""very large scale, kind of a killer-app-like project""" start="00:05:01.120" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""where you're developing a text editor""" start="00:05:04.010" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and perhaps even an integrated development environment""" start="00:05:05.921" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""in Scheme, I think would be very useful""" start="00:05:09.061" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""just even as a study of, you know, what""" start="00:05:11.921" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""can this language do? And just overall,""" start="00:05:13.800" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""there seems to be a lot of interest in""" start="00:05:18.462" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Guile-based Emacs and well, maybe a""" start="00:05:21.221" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Scheme-based Emacs, but Guile in particular.""" start="00:05:24.321" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""There has been talk of""" start="00:05:27.164" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""changing Emacs Lisp or the core of the Emacs Lisp over to""" start="00:05:28.221" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Guile for about 30 years or so,""" start="00:05:33.661" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""talks originally in the early""" start="00:05:38.470" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""mid 90s. There were discussions between Richard Stallman,""" start="00:05:41.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Tom Lord, and Aubrey Jaffer. They considered""" start="00:05:44.800" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""actually replacing Emacs Lisp with Scheme.""" start="00:05:49.920" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""In 1999, and going for about 10 years,""" start="00:05:53.220" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""someone named Ken Raeburn actually started""" start="00:05:56.828" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""a project where he started writing Emacs in Guile.""" start="00:06:01.080" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""My project is very similar to this.""" start="00:06:07.241" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Here's a quote from his webpage, which is still up, even""" start="00:06:11.860" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""though it hasn't been updated in 15 years.""" start="00:06:15.121" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""This project that I have started""" start="00:06:18.400" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""is for converting GNU Emacs to Guile""" start="00:06:20.520" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""as its programming language.""" start="00:06:23.102" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Support for Emacs Lisp will continue to exist,""" start="00:06:24.122" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""of course, but it may be through""" start="00:06:26.083" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""translation and/or interpretation.""" start="00:06:27.761" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""The Lisp engine itself""" start="00:06:29.245" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""may no longer be the core of the program.""" start="00:06:30.340" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And this is my goal as well. In 2010,""" start="00:06:32.907" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Andy Wingo and Ludovic Courtes""" start="00:06:38.539" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""took maintainership of the Guile project.""" start="00:06:41.880" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""From 2009, so while Andy... 2009""" start="00:06:46.403" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""to 2011, the first Emacs Lisp interpreter was already being""" start="00:06:52.720" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""implemented in Guile. And even to this day,""" start="00:06:59.400" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""this Emacs Lisp interpreter ships with Guile.""" start="00:07:02.090" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And so this was happening""" start="00:07:05.652" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""while Andy Wingo took control of the project.""" start="00:07:06.600" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""In 2011, so shortly after Andy Wingo""" start="00:07:10.113" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""took control of the project,""" start="00:07:13.834" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Guile 2.0 was released. And also in 2011, in the summertime,""" start="00:07:15.120" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""someone named Robin Templeton, I believe it was a Google""" start="00:07:22.280" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Summer of Code project, started actually trying to""" start="00:07:27.280" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""incorporate libguile, that's the guile interpreter, as a""" start="00:07:33.520" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""linkable or loadable library, linking it to the Emacs""" start="00:07:38.720" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""executable, and then providing some built-in functions in""" start="00:07:45.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Emacs that allows you to call the scheme""" start="00:07:49.180" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""interpreter, the Guile Scheme interpreter, from Emacs.""" start="00:07:54.760" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And so it's not like a wrapper around the REPL like Geiser or""" start="00:07:58.740" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""SLIME. It's actually the whole Scheme interpreter loaded""" start="00:08:02.240" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""into your Emacs process. And that means your Emacs will have""" start="00:08:08.960" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""the ability to actually load compiled Scheme programs and""" start="00:08:13.940" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""actually run them and share memory with Emacs Lisp""" start="00:08:20.080" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""processes. And, well, Robin Templeton will explain all of""" start="00:08:25.880" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""this. They're presenting today, and I'm very excited to""" start="00:08:29.800" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""actually see their presentation. They'll explain""" start="00:08:33.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""everything.""" start="00:08:37.080" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So, let's see. Moving on. 2020, someone named Vasilij""" start="00:08:40.180" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Schneidermann, I'm not sure how you pronounce that, published""" start="00:08:45.680" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""an overview called The State of Emacs Lisp on Guile. Let's see""" start="00:08:49.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""if I have that here. Yep, it's this page right here. He goes""" start="00:08:53.640" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""into detail about who has done what so far, and what can you do""" start="00:08:58.400" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""in Guile with Emacs Lisp so far, and so on. Like, what is the""" start="00:09:04.880" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""state of the project overall?""" start="00:09:09.760" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And so (speak of the devil)""" start="00:09:12.718" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""(Andy Wingo on social media).""" start="00:09:15.900" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So, 2020 to present. Guile Emacs""" start="00:09:20.961" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""is dead? So there's GCC Emacs now.""" start="00:09:24.340" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Emacs Lisp now has its own JIT compiler.""" start="00:09:32.072" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And it seems like over the past few years,""" start="00:09:35.753" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Emacs Lisp has kind of moved off into the direction of""" start="00:09:39.260" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""becoming its own programming language in its own right,""" start="00:09:44.320" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and it is decidedly Common Lisp-flavored. It is""" start="00:09:48.440" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""very similar to Common Lisp,""" start="00:09:51.840" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and that seems to be the direction""" start="00:09:54.167" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""that it's headed now, and I don't know if there's really any""" start="00:09:56.520" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""interest anymore amongst the Emacs maintainers of""" start="00:10:00.720" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""continuing with a Guile-based Emacs.""" start="00:10:05.560" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""But as far as I know, there's still a lot of interest in the""" start="00:10:09.800" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""community amongst Scheme and Lisp and Emacs users who are""" start="00:10:13.320" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""interested in maybe continuing to try to get Guile to become""" start="00:10:19.600" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""the core of Emacs, or if not, you know, what Robin Templeton""" start="00:10:24.780" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""has been doing, at least trying to get Guile a""" start="00:10:28.080" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""language, a first class supported language in Emacs. So""" start="00:10:31.640" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""that's enough talking. Let me just show you what I have so""" start="00:10:37.280" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""far. The GUI is barely working, because I have very little""" start="00:10:40.000" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""experience with GTK or GObject Introspection. It's very""" start="00:10:45.240" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""difficult to debug, so it's very slow to develop. Any crash""" start="00:10:50.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""at C level produces no stack traces. So far, most of the""" start="00:10:53.640" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""crashes that I've experienced are due to simple mistakes""" start="00:10:58.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""like passing the wrong data type. So, so far, no, not a whole""" start="00:11:03.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""lot of need for GDB or rebuilding all GTK, glib,""" start="00:11:09.400" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and so on with the debugging symbols.""" start="00:11:14.175" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""But yes, still development's been""" start="00:11:17.878" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""very slow. I'm learning as I go. I've chosen to use Guile GI as""" start="00:11:19.320" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""the foundation for the GUI. Let me just load it up quick here.""" start="00:11:25.500" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""&quot;load main-guile.scm&quot;. And this will launch the GUI. I also""" start="00:11:30.600" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""happen to have a REPL that runs in a separate thread and""" start="00:11:39.900" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""submits any form that you type to be evaluated inside of the""" start="00:11:44.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""running GUI environment. But you can just type stuff. So""" start="00:11:49.760" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""&quot;hello world.&quot; And of course there is...""" start="00:11:57.080" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""as you can see, it's not quite rendering correctly.""" start="00:12:02.904" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""This &quot;*Messages*&quot; thing here,""" start="00:12:08.060" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""that should be over here, obviously. I haven't been able to""" start="00:12:11.091" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""figure out how to get those little details down. But yeah,""" start="00:12:13.761" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""you can do M-:, and you get your eval,""" start="00:12:17.821" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and you can just evaluate, like (what's an emacs,)""" start="00:12:23.216" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""(or what's a Scheme-specific thing?)""" start="00:12:26.638" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Like &quot;(import (srfi 1))&quot;, and""" start="00:12:29.281" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""let's see, do &quot;(iota 20)&quot;, for example.""" start="00:12:37.680" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And so that is the procedure""" start="00:12:44.889" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""that iterates and produces some 20 elements of a""" start="00:12:46.781" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""list. Or you can do something like, let's see,""" start="00:12:52.901" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""string-append &quot;hello&quot; with space &quot;world&quot;.""" start="00:12:58.420" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And you get the result and so on. And,""" start="00:13:08.115" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""you know, scheme allows you to return multiple values. So""" start="00:13:10.260" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""what I have done here is just""" start="00:13:13.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""every value is captured in a list""" start="00:13:14.999" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and it prints all of the return values in the list.""" start="00:13:17.980" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So if a procedure returns no values,""" start="00:13:21.002" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""you get an empty list.""" start="00:13:23.463" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And that's that. It's still quite buggy.""" start="00:13:26.145" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So like, here's a bug""" start="00:13:29.406" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""that I can reproduce fairly consistently.""" start="00:13:31.520" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I can, yeah, if you do...""" start="00:13:37.320" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""there seems to be a problem with a""" start="00:13:41.408" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""widget being freed too soon, so it will crash. I'm going to""" start="00:13:46.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""try and solve that, hopefully, before this presentation""" start="00:13:49.720" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""goes live. Let's see here.""" start="00:13:53.320" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""The Emacs Lisp parser is based on""" start="00:13:57.110" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Guile Emacs Lisp. So the Guile Emacs Lisp interpreter that""" start="00:13:59.840" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""ships with Guile, that is what I am using. I've actually""" start="00:14:04.400" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""copied and pasted the source code from the Guile source base""" start="00:14:09.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""into my own project so that I can iterate on it more quickly.""" start="00:14:15.720" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And I've already had to make some modifications to the""" start="00:14:20.640" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Emacs Lisp interpreter in Guile. So here's the evaluator.""" start="00:14:25.800" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I've actually already modified the parser and the lexer a""" start="00:14:29.900" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""little bit. And it's at least able to parse""" start="00:14:33.080" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""all of the &quot;subr.el&quot; program, the Emacs Lisp program.""" start="00:14:37.859" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""It can actually load that, but not""" start="00:14:43.150" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""evaluate it, or parse it, but not evaluate it...""" start="00:14:44.600" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Read, not eval.""" start="00:14:47.571" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""By the time this goes live, I will have submitted a patch""" start="00:14:51.720" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""upstream. And that's another goal of this project,""" start="00:14:53.960" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""incidentally, is that anything that we can contribute to""" start="00:14:57.560" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Guile and any built-in functions that we can implement""" start="00:15:01.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I would like to, for this project, I would like to try and""" start="00:15:08.360" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""contribute upstream to Guile. The Emacs Lisp interpreter""" start="00:15:11.000" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""is not working well, unfortunately. So this copy, this is""" start="00:15:15.680" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""the copy of the code base (from this commit in particular)""" start="00:15:21.360" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and well, I can't get it working. I can't actually get the""" start="00:15:29.480" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""non-copy, the actual built-in version of""" start="00:15:34.980" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""the Emacs Lisp interpreter to work properly quite yet.""" start="00:15:37.760" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So let me quick go to, (what is this here?)""" start="00:15:41.212" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Guile Elisp. So suppose you have this""" start="00:15:47.034" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""&quot;eval-elisp&quot; procedure here and it takes""" start="00:15:51.880" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""an Elisp environment and then it evaluates an expression in that""" start="00:15:56.000" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""environment. And evaluates to a value. So this""" start="00:16:00.640" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""is the standard way of doing it in Guile.""" start="00:16:03.600" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""If you can see here,""" start="00:16:05.085" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""you've got this expression, &quot;compile&quot; expression.""" start="00:16:06.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""This is like &quot;eval&quot;. And so actually trying to load this.""" start="00:16:09.947" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So let's do &quot;load gypsum&quot;. (Let's see here. This is, no),""" start="00:16:16.860" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I wanted to &quot;import gypsum backend guile Elisp&quot;.""" start="00:16:24.673" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And if I actually want to do this... So elisp eval, first of all,""" start="00:16:35.760" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""it says it failed because there's an unbound variable""" start="00:16:39.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""&quot;elisp-eval&quot;. Don't know what it's talking about.""" start="00:16:42.880" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""There's no such variable in any of my programs.""" start="00:16:45.349" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I have no idea what's going on here.""" start="00:16:48.230" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""You can try to run eval elisp on some simple form like""" start="00:16:51.152" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""(+ 1 2). And it gives you this exception. This works.""" start="00:16:59.280" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""This is the same issue that I have with all of the,""" start="00:17:04.760" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""every version of the Emacs Lisp Interpreter in Guile.""" start="00:17:09.580" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I can get it to work with this big &quot;,L&quot; mode.""" start="00:17:13.201" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So I can actually do (+ 1 2) here.""" start="00:17:18.752" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I can do &quot;princ&quot; like here.""" start="00:17:21.594" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""That all works fine. It gives me, for some reason,""" start="00:17:26.817" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""a stack trace here.""" start="00:17:30.120" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And yeah, so it's a bit, it's not well-documented.""" start="00:17:34.941" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""The code base is fairly old.""" start="00:17:43.927" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""As I said, it was developed around 2011,""" start="00:17:45.888" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and it's fairly opaque, and I have not been able to figure out""" start="00:17:50.400" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""how to get Emacs Lisp in Guile working smoothly. So I have""" start="00:17:53.240" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""started writing my own Emacs Lisp interpreter. And, uh,""" start="00:17:57.960" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""&quot;gypsum/elisp/eval-tests.scm&quot;.""" start="00:18:04.540" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""It's, uh, not entirely ready.""" start="00:18:13.400" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I can show you some of the tests at least.""" start="00:18:18.270" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Here is a simple Emacs Lisp program""" start="00:18:21.696" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""that you can evaluate.""" start="00:18:25.037" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""You got &quot;progn&quot;, &quot;setq&quot; a to 3, &quot;setq&quot; b to 5,""" start="00:18:25.857" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""&quot;setq&quot; c to the sum of a and b, return c.""" start="00:18:31.140" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And this at least works correctly.""" start="00:18:35.840" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""As you can see here, the result is eight. Um, but""" start="00:18:39.060" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""the &quot;let*&quot; semantics are not completed yet.""" start="00:18:43.280" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Lots of work left to do there.""" start="00:18:46.521" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So in the time I have left, I guess I can just,""" start="00:18:51.104" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""talk a little bit about what my plans""" start="00:18:54.465" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""are for the future.""" start="00:18:56.760" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I would like to begin by evaluating or""" start="00:18:59.388" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""actually loading the &quot;subr.el&quot; into my Emacs Lisp""" start="00:19:02.600" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""interpreter. I actually have tests set up for that as well,""" start="00:19:06.760" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""so I can actually select any form I want from &quot;subr.el&quot;.""" start="00:19:09.640" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I can just run this through my interpreter""" start="00:19:15.910" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and test to see if everything is working""" start="00:19:18.833" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""once I get that far.""" start="00:19:21.594" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And yeah, let me just say that this is my formal appeal to the""" start="00:19:28.780" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""community for help on this project. Emacs Lisp has""" start="00:19:33.240" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""1,393 built-in functions.""" start="00:19:37.800" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I could never implement that many functions on my own, so if""" start="00:19:41.180" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""this project is going to be useful to anybody in any""" start="00:19:45.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""reasonable amount of time, I'm going to need help.""" start="00:19:47.600" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And I know that there are people out there""" start="00:19:51.115" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""who are very interested in a Guile-based Emacs,""" start="00:19:53.477" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and so if you're watching this,""" start="00:19:56.399" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""please feel free to contact me""" start="00:19:59.000" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""on social media or over e-mail.""" start="00:20:00.522" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""My job, the way I see it, is if there's enough interest,""" start="00:20:05.700" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and I do get a lot of people interested in""" start="00:20:09.648" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""starting to contribute,""" start="00:20:12.065" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""my job will be to document the building and testing process""" start="00:20:13.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and make sure that it is as easy as possible to contribute""" start="00:20:17.920" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""code to this project. I want to document the system""" start="00:20:21.040" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""architecture. I'll write blog posts. I'll do videos on""" start="00:20:24.080" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""PeerTube explaining how everything works. And I will""" start="00:20:27.600" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""prioritize which built-in functions""" start="00:20:31.880" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I think are probably going to be the most necessary,""" start="00:20:34.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""the most essential to get the interpreter running,""" start="00:20:36.463" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and then find low-hanging fruit,""" start="00:20:40.879" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""functions that are easy for people to implement""" start="00:20:42.560" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""as a good introduction to getting them started""" start="00:20:46.520" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""on contributing to the project.""" start="00:20:50.846" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And then, of course, I will take""" start="00:20:53.948" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""responsibility myself of making sure that we can""" start="00:20:56.680" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""get the Elisp interpreter to the point""" start="00:21:01.720" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""where it can run the Emacs regression tests.""" start="00:21:03.775" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""These are the test suites that are used""" start="00:21:09.080" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""to test Emacs Lisp itself in the GNU Emacs code base. And so""" start="00:21:13.334" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""ERT is itself written in Emacs Lisp. And so""" start="00:21:20.360" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I think if we implement enough of the built-in functions""" start="00:21:24.560" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""to be able to run ERT,""" start="00:21:27.034" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""then we can actually start""" start="00:21:29.934" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""using the GNU Emacs regression tests""" start="00:21:31.196" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""to test our own interpreter, our own Emacs clone.""" start="00:21:33.618" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And of course, I'll make sure that there's at least""" start="00:21:39.249" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""one usable GUI. I'm currently working on Guile GI""" start="00:21:41.200" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and GTK. It would be great to have an...""" start="00:21:45.834" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""ANSI terminal based...""" start="00:21:51.397" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""something that works in your terminal emulator.""" start="00:21:53.880" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And yeah, it would be great if someday soon,""" start="00:21:58.220" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""hopefully, we get enough done""" start="00:22:00.284" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""that you can actually contribute a patch to this project""" start="00:22:03.160" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""from within the Gypsum editor itself.""" start="00:22:06.095" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I was going to do an overview,""" start="00:22:11.779" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""but that would be for more of an hour-long presentation.""" start="00:22:13.381" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So I'm out of time. I guess the last thing""" start="00:22:19.680" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""I should quickly say is there's no""" start="00:22:22.928" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""meta object protocol in this""" start="00:22:25.450" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""project. I think that's a little bit too difficult""" start="00:22:27.160" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""to port to various scheme implementations.""" start="00:22:29.002" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So I've created a substitute, which I'm""" start="00:22:30.963" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""calling &quot;functional lenses&quot;, which is inspired by the""" start="00:22:33.740" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Haskell project of the same name.""" start="00:22:36.960" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Everything in this project is based on functional lenses.""" start="00:22:42.060" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Yeah, also a lot a work went into the keymaps data structure.""" start="00:22:47.512" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""The point being that I think I have""" start="00:22:52.604" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""a pretty good foundation here upon which we can build,""" start="00:22:55.207" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""even though there isn't an actual, there isn't""" start="00:22:58.590" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""a lot done in the actual prototype itself, not yet anyway,""" start="00:23:00.840" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""but I made sure to get the fundamentals down""" start="00:23:04.700" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""from the beginning. And so I think we have something""" start="00:23:08.420" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""like a solid foundation on which to build.""" start="00:23:11.081" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So, I'm going to conclude it there.""" start="00:23:16.309" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""And here's my contact details. Like I said,""" start="00:23:21.231" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""this is a project, I'm appealing to the community of all""" start="00:23:24.600" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""people who are interested in Guile and Emacs to help""" start="00:23:29.320" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""contribute to this project. I see myself as just getting the""" start="00:23:31.900" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""ball rolling. Again, taking-off from the work""" start="00:23:35.840" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""that Ken Raeburn left behind, with my own""" start="00:23:40.601" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""from-the-ground-up implementation. So yeah,""" start="00:23:46.279" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""contact me: e-mail, you can take a look at my blog""" start="00:23:50.638" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""where I talk about what I have done.""" start="00:23:53.859" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""My source code, the code for this project, is up on""" start="00:23:57.420" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""Codeberg... The presentation... this""" start="00:24:00.760" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""presentation, the home page for this presentation, you""" start="00:24:06.140" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""can find more details there. Oh, I'm on""" start="00:24:09.380" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""ActivityPub as well, so my handle is""" start="00:24:15.560" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""@ramin_hal9001@fe.disroot.org, and I'm on everyday.""" start="00:24:19.140" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""So yeah, please feel free to contact me if you're interested,""" start="00:24:27.120" video="mainVideo-gypsum" id="subtitle"]]
+[[!template text="""and thank you for your attention.""" start="00:24:30.940" video="mainVideo-gypsum" id="subtitle"]]
+
+
+
+Captioner: ramin
+
Questions or comments? Please e-mail [ramin.honary@gmail.com](mailto:ramin.honary@gmail.com?subject=Comment%20for%20EmacsConf%202023%20gypsum%3A%20Gypsum%3A%20my%20clone%20of%20Emacs%20and%20ELisp%20written%20in%20Scheme)
diff --git a/2024/info/gypsum-before.md b/2024/info/gypsum-before.md
index 83a07e1b..88a13ba3 100644
--- a/2024/info/gypsum-before.md
+++ b/2024/info/gypsum-before.md
@@ -8,12 +8,12 @@ The following image shows where the talk is in the schedule for Sat 2024-12-07.
Format: 25-min talk ; Q&A: BigBlueButton conference room <https://media.emacsconf.org/2024/current/bbb-gypsum.html> Etherpad: <https://pad.emacsconf.org/2024-gypsum>
Etherpad: <https://pad.emacsconf.org/2024-gypsum>
Discuss on IRC: [#emacsconf-dev](https://chat.emacsconf.org/?join=emacsconf,emacsconf-dev)
-Status: Ready to stream
+Status: Now playing on the conference livestream
<div>Times in different time zones:</div><div class="times" start="2024-12-07T15:00:00Z" end="2024-12-07T15:20:00Z"><div class="conf-time">Saturday, Dec 7 2024, ~10:00 AM - 10:20 AM EST (US/Eastern)</div><div class="others"><div>which is the same as:</div>Saturday, Dec 7 2024, ~9:00 AM - 9:20 AM CST (US/Central)<br />Saturday, Dec 7 2024, ~8:00 AM - 8:20 AM MST (US/Mountain)<br />Saturday, Dec 7 2024, ~7:00 AM - 7:20 AM PST (US/Pacific)<br />Saturday, Dec 7 2024, ~3:00 PM - 3:20 PM UTC <br />Saturday, Dec 7 2024, ~4:00 PM - 4:20 PM CET (Europe/Paris)<br />Saturday, Dec 7 2024, ~5:00 PM - 5:20 PM EET (Europe/Athens)<br />Saturday, Dec 7 2024, ~8:30 PM - 8:50 PM IST (Asia/Kolkata)<br />Saturday, Dec 7 2024, ~11:00 PM - 11:20 PM +08 (Asia/Singapore)<br />Sunday, Dec 8 2024, ~12:00 AM - 12:20 AM JST (Asia/Tokyo)</div></div><div><strong><a href="/2024/watch/dev/">Find out how to watch and participate</a></strong></div>
-
+<div class="vid"><video controls preload="none" id="gypsum-mainVideo"><source src="https://media.emacsconf.org/2024/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.webm" />captions="""<track label="English" kind="captions" srclang="en" src="/2024/captions/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.vtt" default />"""<p><em>Your browser does not support the video tag. Please download the video instead.</em></p></video><div></div>Duration: 24:36 minutes<div class="files resources"><ul><li><a href="https://pad.emacsconf.org/2024-gypsum">Open Etherpad</a></li><li><a href="https://media.emacsconf.org/2024/current/bbb-gypsum.html">Open public Q&A</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--backstage--silences.tsv">Download --backstage--silences.tsv</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--intro.webm">Download --intro.webm</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.vtt">Download --main.vtt</a></li><li><a href="https://media.emacsconf.org/2024/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.webm">Download --main.webm (56MB)</a></li></ul></div></div>
# Description
<!-- End of emacsconf-publish-before-page --> \ No newline at end of file