diff options
author | EmacsConf <emacsconf-org@gnu.org> | 2024-12-07 10:00:13 -0500 |
---|---|---|
committer | EmacsConf <emacsconf-org@gnu.org> | 2024-12-07 10:00:13 -0500 |
commit | 158aaf4b679ca29cb3aaaf30e0d81c7cf31c57b2 (patch) | |
tree | 91eb7bc7ad3ed8d3e17993db64f8bccf1a0a9eb3 /2024/captions/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.vtt | |
parent | 83ec74d236063bab8c6fe2d6d2fcee037d7c054d (diff) | |
download | emacsconf-wiki-158aaf4b679ca29cb3aaaf30e0d81c7cf31c57b2.tar.xz emacsconf-wiki-158aaf4b679ca29cb3aaaf30e0d81c7cf31c57b2.zip |
Automated commit
Diffstat (limited to '2024/captions/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.vtt')
-rw-r--r-- | 2024/captions/emacsconf-2024-gypsum--gypsum-my-clone-of-emacs-and-elisp-written-in-scheme--ramin-honary--main.vtt | 1108 |
1 files changed, 1108 insertions, 0 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. |