[[!meta title="Old McCarthy Had a Form"]] [[!meta copyright="Copyright © 2021 Ian Eure"]] [[!inline pages="internal(2021/info/form-nav)" raw="yes"]] # Old McCarthy Had a Form Ian Eure Name Pronunciation: (EE-un YOU-r) Pronouns: he/him/his Preferred contact info: ian@retrospec.tv / ieure on Libera [[!inline pages="internal(2021/info/form-schedule)" raw="yes"]] Most practical languages are multi-paradigm, offering several abstractions for the programmer. But did you know that Emacs Lisp comes with a powerful system for object-oriented programming? Join me for a discussion of EIEIO, and learn how it can help you write more modular, flexible Emacs Lisp. # Discussion IRC nick: ieure - I didn't know that custom.el works with EIEIO that way, very nice - Dang Ian. What a talk, great demos. - Wow, that's a great talk. - Great talk. So with that Emacs is on pair with Smalltalk development environments now - For reference, transient.el, which we all know and love as the engine that drives the magit interface, is written via EIEIO afaik. - I reckon I should look more into it, I've always avoided it because I was afraid it wouldn't be /quite as nice/ as CLOS or GOOPS. - ieure: It's missing a few things (most documented in the manual: https://www.gnu.org/software/emacs/manual/html_mono/eieio.html#CLOS-compatibility), but it's solid and worth using. - Yeah when transient.el first came out I was impressed by how naturally it worked as part of that abstraction. - ieure: EIEIO all the things! I had to cut it, but you can use dynamic dispatch based on major-mode, like: (cl-defmethod whatever ((mode (derived-mode python-mode)))) and then (whatever major-mode). - Also really nice for things like 'window-system. I really like when callsites are clean and not cluttered with conditionals. - Can eieio do regexp dispatch? - ieure: Not currently, but it's possible to add. - okay, so I don't need to feel too bad about coding up my own vtable for those then - ieure: This is the thing that implements (thing (eql :whatever)) specialization, should be a good starting point if you want (thing (string-match-p "^foo")): - thanks for the pointer, but I think I have some more pressing cl-defgeneric reimplementations to make before I touch that - ieure: Extremely fair. One thing I didn't get to touch on is that you can extend generic functions from anywhere. So you don't have to patch up cl-generic.el, you can define a new method for a generic function defined anywhere, in any file. Which rules. # Outline - What is EIEIO? - Why OOP? - The CLOS Model - Classes - Generic Functions - Methods - Specialization - Method Qualifiers - Multiple Inheritance - Nice Properties - Practical Examples - Encapsulation - Example: `transmission.el` - Abstraction - Example: `sql.el` - Extensibility - Example: comint - Conclusion [[!inline pages="internal(2021/captions/form)" raw="yes"]] [[!inline pages="internal(2021/info/form-nav)" raw="yes"]]