summaryrefslogtreecommitdiffstats
path: root/2024/talks/gypsum.md
diff options
context:
space:
mode:
Diffstat (limited to '2024/talks/gypsum.md')
-rw-r--r--2024/talks/gypsum.md466
1 files changed, 466 insertions, 0 deletions
diff --git a/2024/talks/gypsum.md b/2024/talks/gypsum.md
new file mode 100644
index 00000000..3ee7c4cd
--- /dev/null
+++ b/2024/talks/gypsum.md
@@ -0,0 +1,466 @@
+[[!meta title="Gypsum: my clone of Emacs and ELisp written in Scheme"]]
+[[!meta copyright="Copyright © 2024 Ramin Honary"]]
+[[!inline pages="internal(2024/info/gypsum-nav)" raw="yes"]]
+
+<!-- Initially generated with emacsconf-publish-talk-page and then left alone for manual editing -->
+<!-- You can manually edit this file to update the abstract, add links, etc. --->
+
+
+# Gypsum: my clone of Emacs and ELisp written in Scheme
+Ramin Honary (he/him)
+
+ - Source code: <https://codeberg.org/ramin_hal9001/gypsum>
+ - E-mail: <mailto:ramin.honary@gmail.com>
+ - ActivityPub: [@ramin_hal9001@fe.disroot.org](https://fe.disroot.org/@ramin_hal9001)
+ - Website: <https://tilde.town/~ramin_hal9001>
+
+[[!inline pages="internal(2024/info/gypsum-before)" raw="yes"]]
+
+## Slides
+
+### Introduction
+
+1. Ramin Honary
+
+ - Emacs enthusiast since 2017
+
+ - Software developer (full stack)
+
+ - I love Haskell, Scheme, functional programming
+
+ - Started learning Scheme about 2 years ago
+
+2. My project: an Emacs Clone
+
+ - Tentative name: "Gypsum"
+ - Its not a great name, open to suggestions.
+
+### Goal: to Clone **Emacs Lisp**
+
+- Many clones already:
+
+ - Edwin, Jed, jEdit, Jove, Lem, MG, Yi, Zile
+
+- These only clone the key bindings, not Elisp
+
+- Only XEmacs (a fork of GNU Emacs) provided an alternative Emacs Lisp
+
+### Most people don't use Emacs for the keybindings
+
+- Anecodtal, but yes really.
+
+- Use Emacs because of the power of Emacs Lisp
+
+- Emacs is as powerful as a system shell
+
+- A good language is what makes it powerful
+
+### Goal: use R7RS Standard Scheme
+
+- I want it to work on a many Scheme implementations
+
+- Guile is the reference implementation
+
+- (more about this later)
+
+### Goal: able to run any `init.el`
+
+- Should be able to use `init.el` without significant changes
+
+- Many invest significant time in their configs
+
+- Suddenly not having your config is disruptive
+
+- Such an Emacs clone would be more useful
+
+### Why do this?
+
+- I personally like Scheme's minimalism.
+
+- Use Scheme as more than just an academic language.
+
+- Seems to be a lot of interest in a project like this.
+
+- Talk of "Guile Emacs" for about 30 years
+
+### A long history of Guile Emacs (1/3)
+
+- **Early 90s**: Initial discussion between RMS, Tom Lord,
+ Aubrey Jaffer, begin work on replacing Emacs Lisp with Scheme.
+
+- **1999--2009**: Ken Raeburn's [Guile-Based Emacs](https://www.mit.edu/~raeburn/guilemacs/).
+ (My project is similar.)
+
+ > "*This project that I (Ken Raeburn) have started is for converting*
+ > *GNU Emacs to use Guile as its programming language. Support for*
+ > *Emacs Lisp will continue to exist, of course, but it may be*
+ > *through translation and/or interpretation; the Lisp engine itself*
+ > *may no longer be the core of the program.*"
+
+### A long history of Guile Emacs (2/3)
+
+- **2010**: Andy Wingo and Ludovic Courtes
+ take maintainership of Guile project.
+
+- **2009--2011**: Emacs Lisp interpreter implemented in Guile.
+ Still ships with Guile.
+
+- **2011**: Guile 2.0 is released
+
+- **2011--2015**: Robin Templeton's GSoC project.
+ (Is presenting later today!)
+
+### A long history of Guile Emacs (3/3)
+
+- **2020**: Vasilij Schneidermann published an overview called
+ "[The State of Emacs Lisp on Guile](https://emacsninja.com/posts/state-of-emacs-lisp-on-guile.html)".
+
+- **2020 to present**: Guile Emacs is dead? Andrea Corallo, GCC Emacs,
+ JIT-compiler for Emacs Lisp based on "libgccjit", brings into
+ question any need for combining Guile with Emacs.
+
+### Demo
+
+### GUI is barely working
+
+- I have almost no experience with Gtk or GObject Introspection
+
+- Hard to debug, crashes at C-level produce no stack traces
+
+- Using GDB requires rebuilding all of Gtk, GIO, GLib, etc.
+
+### Emacs Lisp parser based on Guile Emacs Lisp
+
+- Foked the Guile Emacs Lisp implementation for easier development
+
+- Have already submitted a patch to the parser upstream
+
+### Emacs Lisp interpter is barely working
+
+- Implementing my own interpreter in portable Scheme
+
+- Monadic pattern matcher
+
+### Can parse but not interpret "`subr.el`"
+
+- "`subr.el`" is the first ELisp file run by Emacs
+
+- A good way to determine what to work on first
+
+### A call for help
+
+### Latest Emacs has **1,393** built-in functions
+
+- I could never implement that many functions alone
+
+- Probably not all are required to create a useful editor
+
+### My job is to make contributing easy
+
+- Document the build and test process
+
+- Document the system architecture
+
+- Prioritize which built-in functions are most essential
+
+- Find low-hanging fruit, use as means to teach others
+
+### The work for which I will take responsibility
+
+- Clone enough Elisp to be able to run ERT tests
+
+- Then use GNU Emacs's own regression tests to test patches
+
+- Make sure there is a usable GUI
+
+- (Someday?) be able to contribute a patch from within
+
+### Quick architectural overview
+
+### The editor is based in Scheme, not Emacs Lisp
+
+- Config, scripting, packages all done in Scheme
+
+- Use of Emacs Lisp for scripting not encouraged
+
+- Should still be able to run your `init.el`
+
+- Ideally should be able to run ELPA packages
+
+### Difference with Robin Templeton's project
+
+- Guile-Emacs links Guile runtime into Emacs
+
+- Not a Scheme application
+
+- An IDE for Schemers
+
+### Emacs Lisp is an "environment"
+
+- "Environments" are a feature of Scheme
+
+- Scheme procedures can be called from Emacs Lisp
+
+- Scheme state can be mutated by Emacs Lisp
+
+- (See "`./gypsum/elisp-eval.scm`", "`new-env`")
+
+### "Functional Lenses"
+
+- Because R7RS does not standardize MOP (not even in "large")
+
+- Inspired by Haskell
+
+- Composes getters and setters
+
+- Single source file, easy to port
+
+- Ported to 3 other Schemes
+
+### A lot of work went into keymaps data structure
+
+- Keybindings are an important part of Emacs
+
+- Had to do this well from very beginning
+
+- Keybindings work correctly in demo
+
+### A lot of work went into separating GUI from Editor logic
+
+- "Parameters" are a feature of Scheme
+
+- Platform-specific APIs are always parameterized
+
+ - Windowing and widgets
+
+ - Translate key events to bindings
+
+ - Evaluating Scheme expressions
+
+ - Text buffering and rendering
+
+- (See "`./gypsum/editor-impl.scm`")
+
+### Monadic pattern matching
+
+- Simpler, more portable
+
+- (Not as feature-rich)
+
+- Easier than porting SRFI-241 ("Match") to Guile
+
+- No relation to SRFI-247 ("Syntatic Monads")
+
+- You can still use pattern matching
+
+### Monad pattern matching
+
+Example program
+
+
+ (define push-stack (put-with cons))
+ (define collatz
+ (many
+ push-stack
+ (either
+ (try (check (λ (n) (<= n 1)))
+ (success))
+ (try (check odd?)
+ (next (λ (n) (+ 1 (* 3 n)))))
+ (try (check even?)
+ (next (λ (n) (quotient n 2))))
+ (fail "not an integer")
+ )))
+
+### Conclusion
+
+- I am just getting the ball rolling
+
+- Helping others contribute is my top priority
+
+- ActivityPub :: `ramin_hal9001@fe.disroot.org`
+
+- E-mail :: <span class="spurious-link"
+ target="ramin.honary@gmail.com">*ramin.honary@gmail.com*</span>
+
+- Homepage :: <https://tilde.town/~ramin_hal9001>
+
+- Codeberg :: <https://codeberg.org/ramin_hal9001/gypsum>
+
+- This presentation :: <https://emacsconf.org/2024/talks/gypsum/>
+
+
+## Original presentation proposal
+I would like to demonstrate an Emacs clone I have been
+writing in Guile Scheme for the past year, which I am
+tentatively calling "Gypsum". Unlike other editors which
+only clone the Emacs keybindings (Edwin, Jed, jEdit, Jove,
+Lem, MG, Yi, Zile), I hope my Emacs clone will also fully
+clone the Emacs Lisp programming language well enough that
+many of the packages in ELPA, Non-GNU ELPA, and perhaps even
+MELPA, can be used in "Gypsum" without any modification. I
+would also like to talk a little bit about the how I am
+implementing it (the software architecture), and invite
+others to contribute.
+
+I think my project is of interest to many Emacs users
+because, firstly, I have personally spoken with a relatively
+large number of people who have expressed interest in making
+Emacs programmable in Scheme. Secondly, there is a good
+amount of prior art for Scheme implementations of
+Emacs. There are even builds of Emacs that link to Guile
+which provides a "scheme-eval" built-in function that
+translates between Elisp data types and Scheme data
+types. The Guile compiler itself ships with an Emacs Lisp
+compiler as well, although it does not provide enough of
+Emacs's built-in functions to be of much use.
+
+So by using Guile, we can make use of a lot of the prior
+art, in fact I am currently using the tokenizer and reader
+used in Guile's built-in Elisp interpreter to implement
+"Gypsum's" Elisp interpreter. That said, I have gone out of
+my way to make my code fully R7RS compliant, so I hope I can
+port it to other Scheme implementations like MIT Scheme,
+Gambit, Stklos, and perhaps Chez Scheme with Gwen Weinholt's
+R7-to-R6RS translator. I consider the Guile version of
+Gypsum to be the reference implementation of what I hope
+will become a fully cross-platform programming language and
+text editor written in portable R7RS Scheme.
+
+The reference implementation of "Gypsum" is a GUI
+application based on Gtk using a library called
+"Guile-GI". Guile-GI uses the GObject Introspection
+framework to automatically generate Scheme language bindings
+to libraries like Gtk and Glib which are written in the C
+programming language. There is not yet any terminal-emulator
+version of "Gypsum."
+
+The next step of the project will be to implement enough of
+Elisp that we can run tests written in the Emacs Regression
+Testing (ERT) framework. We can then incorporate the
+original GNU Emacs regression test suite into Gypsum. Any
+new API added to Gypsum Elisp will most likely already have
+regression tests we can use to make sure it is working in a
+way that is compatible with GNU Emacs Lisp. I would like to
+make it as easy as possible for people to contribute to this
+project, and having a list of APIs to be implemented each
+with a set of regression tests the APIs are expected to
+pass, is a very good way to do that.
+
+About the speaker:
+
+My name is Ramin Honary, I have been a professional software
+engineer of 16 years, lately mostly doing full-stack
+software development. I have always been fascinated with
+programming languages, and especially functional languages
+like Lisp and Haskell. I have been using Emacs
+since 2017. But lately it is with Scheme that I have been
+spending most of my free time. I am only a Scheme
+programming enthusiast, I am not involved with Scheme
+professionally.
+
+You may also like another talk by this speaker:
+[EmacsConf - 2022 - talks - Build a Zettelkasten with the Hyperbole Rolodex](https://emacsconf.org/2022/talks/rolodex/)
+
+# Discussion
+
+## Questions and answers
+
+- Q: Would it be possible to support a GUI toolkit other than GTK? Like how GNU Emacs still supports Lucid
+ - A: Yes this planed by having proper backend: emacs-lisp running
+ into a module and the GUI being another module. So normalized
+ communication. Currently GTK being standard implementation, also
+ done here.
+- Q: Do you plan to provide improvements to Elisp as a language, or is the focus on a compatibility layer to facilitate doing all new extensions, etc. in Scheme?
+ - A: Plan is to keep up-to-date with new releases. So new GNU
+ feature should be included with each release. But also intend to
+ have support for pure Scheme features.
+- Q: If Emacs Lisp support for Guile was documented
+ better, could you be nudged/convinced to (re)start using, and
+ contributing to that?
+ - A: Compatibility is the most important things. Documentation not
+ sufficient to convince users to switch.
+ - IRC: Where do you think elisp documentation should be improved? I've always found the built in documentation to be excellent
+ - janneke is referring to Guile's ELisp support, I believe; sorry, i meant the documentation of guile's elisp backend
+- Q: Why is being able to interpret all of \`init.el\` an useful goal?
+ Sure, there is a lot of code written in elisp - can we consider a
+ translator like utility to convert elisp to scheme, once guile-emacs
+ becomes a reality? 
+ - A: Probably, but first step is getting the interpretter working.
+ Emacs-lisp basically compiled down to intermediate
+ representation of the guile compiler \[this was one of the hard
+ things to get to work\]. But unclear how this works for other
+ schemes. Best solution probably translation elisp -\> scheme,
+ but this is not the approach that was done. Would be very cool
+ to have. Feel free to give a PR.
+- Q: What is the plan to handle elisp packages that depend on 3rd party/external libraries? (libgit/magit or rg/ripgrep)? 
+ - A: Will be tricky. If loading directly into the elisp process,
+ very hard. Cairo could help, but you need emacs lisp binding on
+ top of that. For magit, you can call regular process
+ communication via stdin/stdout; so you can reuse existing scheme
+ libraries. Dynamic libraries not a goal. Rg/ripgrep probably the
+ same with process communication.
+- Q: Why is it not feasible for the Emacs layer that interprets Emacs Lisp (the core in C) ot have a Scheme interpreter, instead of using Guile?
+ - A: Guile is a scheme. Not sure what you mean.
+ - A: Check presentation later of Robin Templeton ("Beguiling
+ Emacs: Guile-Emacs relaunched!"): the attempt exists by
+ translating elisp to guile. 
+ - thank you
+
+- Q: Not really a question, but how about Schemacs as a name?
+
+- - A: Cool name, but did not check if it is already used. Feel free
+ to discuss by email.
+- Q: I'm curious to know how the hell guile-emacs deals with all of the dynamically scoped modules out there. Is there any effort to automatically modularize and namespace stuff?
+
+## Notes
+
+- oo neat, i didn't know about that first bit of history
+- i've heard rms say that scheme (guile) is just a nicer
+ lisp; but didn't know there were concrete talks/attempts to use
+ guile for emacs that early
+- robin: yes, guile-elisp not being portable might be a
+ showstopper for ramin
+- I've heard good things about guile from guix people. Never really tried it out
+- FWIW, I think there have been various attempts to make an Emacs clone in Common Lisp. I guess lem is currently the most active. https://github.com/lem-project/lem/
+- I like how he edited his slide mid-presentation.
+- https://www.emacswiki.org/emacs/GuileEmacsHistory has some info on very efforts; i was surprised that there were so many (especially with old-school guile, eww ;))
+- joining for all the guiles and all the emacsen
+- He's got a long way to go.
+- of course there were, RMS had decreed that guile was the GNU scripting language and it was a bit embarrassing that it was so little-used...
+ - At least Guix uses it now.
+ - oh yes, guile 3 was a great step forward, and I do wonder how much of that was due to the impetus of its having real users :)
+- if you're interested in guile emacs, be sure to check out robin's guile talk this afternoon
+- nice, my silly https://gitlab.com/janneke/guimax also used guile-gi but this looks much more mature
+- developed actively til 2014, but more recent work is on a branch so may not be as obvious...
+- so...i guess that some basic documentation on elisp may be very helpful
+- wbn if you could join efforts somehow
+ - there should definitely be some overlap between the projects
+- I have 6500 interactive ones, according to Vertico...
+ - I got 8021 interactive ones ;)
+ - 7690 here
+ - 34557 callables \o/
+- working towards a similar goal approached from different directions
+ - however, working on guile's elisp backend may be a common ground
+- ramin's probably talking about subrs, i.e. primitives not themselves implemented in elisp
+- you mean providing modularization for elisp programs? or something else
+- Being more specific, removing the need to namespace every single internal variable/procedure in an elisp module. Maybe that isn't a goal, but I wish it were
+ - yes, i have some ideas for adapting the CL package system for that. it'd have to be opt-in, maybe some tools for automated refactoring
+- And... the part where we need more bandwidth for any core runtime efforts to be viable
+- my-special-module--loop-variable-3
+- How can I get involved with this? if I want to contribute
+ - hang out in #guile-emacs and/or subscribe to the mailing lists https://guile-emacs.org/
+- an embryonic re-implementation by ramin of emacs in guile, with their own new elisp interpreter that should be r7rs compatible
+- would love robin's guile-emacs and ramin's efforts to somehow share some of their efforts
+- Robin's talk mentions developing a better elisp in Scheme. Why can't your project leverage it?
+- guile-elisp is part of guile's compiler system (elisp -> tree-il -> cps -> bytecode), unless another scheme sets out to be guile-compatible in that respect it won't be portable at all
+- To be fair, I've been screwing around with chicken, guile, and racket. I haven't found any 2 scheme implementations to be compatible, even within SRFI implementations
+ - Just the basic syntax and semantics, nothing else
+ - yeah, scheme's lack of portable libraries in practice motivated me to suggest something that's sure to piss everyone off: Javascript
+- YouTube comment: Cool, great, amazing. Extremely ambitious. A clone like this project might be significant harder than for example Lem, which does not care about backward compatibility with Emacs. A clone also is somewhat harder to create a unique selling point for. Especially if Guile-Emacs is also going to be a thing now. Just my 2 cents up to discussions. Anyway I am excited and will follow it:)
+
+[[!inline pages="internal(2024/info/gypsum-after)" raw="yes"]]
+
+[[!inline pages="internal(2024/info/gypsum-nav)" raw="yes"]]
+
+