Back to the talks Previous by track: Committing secrets with git using sops-mode Next by track: Emacs, eev, and Maxima - now! Track: Development

Elisp and McCLIM

he or e/em/eir (Spivak, male and neuter pronouns are fine) - IRC: screwlisp, Mastodon: @screwtape@mastodon.sdf.org liberachat: screwlisp MOO: lambda.moo.mud.org Name: screwtape Moo mail preferred

Format: 35-min talk ; Q&A: BigBlueButton conference room
Etherpad: https://pad.emacsconf.org/2024-mcclim
Status: TO_CAPTION_QA

Talk

00:01.750 Introduction 03:21.702 Calendar 19:12.802 Inferior Lisp and McCLIM 29:10.964 Putting things together

Duration: 34:29 minutes

Q&A

00:00.000 I would love to see the GUI interacting with the scheduling stuff 00:57.560 Q: Or any other GUI stuff you've worked on in the past that you'd be comfortable showing? 03:07.400 Lispy Gopher Show 06:21.560 Lisp already did it 10:43.600 IELM 12:32.880 Q: Are we going to get a McCLIM LambdaMOO client?

Listen to just the audio:

Description

The gist is demoing using McCLIM common lisp interface manager implementation to make Sandewall 1978's lisp iconic example scheduler app, but to drive it to and from emacs lisp via slime and swank.

To start with, a beginner walkthrough on getting slime and common lisp and mcclim, and configuring and using them with emacs org-mode.

The default clim application-frame is made and its interactor used.

A CLIM command is then defined to refer the default describe to emacs lisp rather than the inferior lisp.

CLIM useage with no gui via slime / org-mode is demoed.

This is then used via emacs lisp.

CLIM's accepting-values is used to generate an anonymous gui that accepts a value into elisp.

A small final discussion on integrating the clim scheduler back and forth into org-agenda.

Bib:

      @article{sandewall1978programming,
        title={Programming in an Interactive Environment:
    the``Lisp''Experience},
        author={Sandewall, Erik},
        journal={ACM Computing Surveys (CSUR)},
        volume={10},
        number={1},
        pages={35--71},
        year={1978},
        publisher={ACM New York, NY, USA}
        }

        @inproceedings{strandh2002free,
        title={A free implementation of clim},
        author={Strandh, Robert and Moore, Timothy},
        booktitle={International Lisp Conference Proceedings},
        year={2002}
        }

        @article{fruhwirth2006guided,
        title={A Guided Tour of CLIM, Common Lisp Interface Manager},
        author={Fruhwirth, Clemens},
        journal={Lisp Pointers},
        year={2006}
        }

        @article{kochmanskimcclim,
        title={McCLIM Demonstration},
        author={Kochmanski, Daniel}
        }

        @inproceedings{kochmanski2020ecl,
        title={On ECL, the Embeddable Common Lisp (ELS keynote).},
        author={Kochmanski, Daniel},
        booktitle={ELS},
        year={2020}
        }

        @misc{beane2012quicklisp,
        title={Quicklisp},
        author={Beane, Zach},
        year={2012}
        }

        @misc{marsden2003slime,
        title={SLIME: The superior lisp interaction mode for emacs},
        author={Marsden, Eric and Gorrie, Luke and Eller, Helmut and others},
        year={2003},
        publisher={URL: https://common-lisp. net/project/slime/(visited on
    05/19/2017)}
        }

        @article{dominik2004org,
        title={Org mode manual},
        author={Dominik, Carsten},
        year={2004}
      }

Q&A in LambdaMOO:

As an experiment, screwlisp will also be taking questions from LambdaMOO. Here's how to join:

  1. Use M-x telnet to connect to lambda.moo.mud.org 8888. Alternatively, you can use a web-based client like https://mudslinger.net/play/ or rmoo.el (see rmoo.el note below)
  2. connect Guest to connect as a guest. If that doesn't work, please ask in #emacsconf-org and we'll try to get you sorted out.
  3. Agree to the terms by typing YES.
  4. Teleport to where the speaker is by typing @join screwtape.

To say something, start with " and omit the ending quotation mark, like this: "Hello everyone!. To say something to a specific person, start with a backtick (`) and the person's nick, then your message, like this: `sachac I made it to LambdaMOO. Use help communication to learn more about other communication tools, such as : for emoting and whisper for sending private messages.

rmoo.el note: You may need to define process-kill-without-query if it doesn't exist on your computer. Here's a use-package declaration that might be a good starting point. If your version of use-package doesn't support :vc yet, you can check out the code from https://github.com/toddsundsted/rmoo and add it to your load-path, or use M-x telnet for now.

(use-package rmoo
    :vc "https://github.com/toddsundsted/rmoo"
    :init
    (unless (fboundp 'process-kill-without-query)
        (defun process-kill-without-query (process &optional flag)
            (set-process-query-on-exit-flag process nil)
            t))
    :config
    (rmoo-worlds-add-new-moo "LambdaMOO" "lambda.moo.mud.org" "8888"))

You can also ask questions via BigBlueButton, Etherpad, or IRC, and the host will try to make sure your question gets to the speaker. Enjoy!

About the speaker:

I'm screwlisp from the lispy gopher climate, a weekly Wednesday 000UTC podcast (non-radio show) on aNONradio.net powered by sdf.org; (also the lesser-known Friday 1400UTC show, Zhen House Zhen Bonkwave.

We are fortunate to have many great people in our live chat that happens in LambdaMOO during the shows. Last week, we shared Rog's new writing on his current personal emacs modes with his decades of emacs useage. (Roger Crew). That's not what this talk is about though, though we often deal with emacs and McCLIM, which are what this talk is about. I have many friends who picked those up in some small part thanks to the show.

Discussion

  • Q: I would love to see the GUI interacting with the scheduling stuff you were working on initially, if I didn't miss it somewhere earlier.
    • A: Will do a follow-up video
  • Q:Or any other GUI stuff you've worked on in the past that you'd be comfortable showing?
  • Q: Are we going to get a McCLIM LambdaMOO client?
    • A: You're right, I should make that into a client for Common Lisp.
  • Q: is the expression being returned directly eval-able is elisp / ielm?
    • screwlisp: Yes I didn't think this ahead
    • screwlisp: Like I've just said, you have to call (slime-eval-sync)
    • screwlisp: After which you can get it out of your kill-ring, because it has syncronised -> to be there
    • screwlisp: I was going to ask you if you had a way for me to do that
  • Q: i wonder if there's a presentation type for readable output that is returned to elisp?
    • most of the time i assume the expression type will be readable on the other end, but CL has readtables and other things that would need translation
  • similar to the multiple package-archive options with emacs there is also UltraLisp which tracks upstream more closely, but can cause fun-to-debug package conflicts in some situations
    • screwlisp: I guess I should try that, basically melpa right, I occasionally use person quicklisp dists
  • screwlisp: 40ants has often done things I want to do
  • lol @ either it will be faster or you will be smug about it running slowly
    • screwlisp: Old computer challenge ;)
  • we did see a little bit of that
  • https://toobnix.org/c/screwtape_channel/videos
  • Is the MOO McCLIM app still going?
    • yes
    • telnet lambda.moo.mud.org 8888, connect Guest, Y, then @join screwtape
    • maybe something like this would work for slime eval assuming we still want to use emacs while CLIM window is open: (slime-eval-async '(cl:+ 2 2) (lambda (x) (print x)))
    • the second arg is a continuation so can bind it, insert in a buffer, etc
    • I think most emacs users use scratch buffer
  • thanks for the talk! great intro. look forward to IELM talk next :P
  • Thank you! 😊
  • Thanks for the talk, it was super interesting
  • May the source be with everyone
  • I use ielm as a repl but not a power user... sometimes I know I want to do more than a few M-:
  • (lazy-eval 'thanks)
  • screwlisp: "Yeah, I forgot now but during the talk there were a few tiny bits where it was different to slime that tripped me up
  • thanks for the talk screwlisp, always good to see lisp history being explored. i'll have to check out lambdamoo again
  • screwlisp: Quite a few people hang around during the Wednesday show (000UTC, anonradio.net)
  • screwlisp: Probably not a coincidence a lot of my emacs useage is the same as yduJ's who is normally there
  • what emacs mode/tool were you using to access the moo?
    • I dusted off rmoo.el, but it could definitely use some modernization =)
    • I went for the quick M-x telnet instructions for Guest
  • screwlisp: Can @request your nick with an email address

Transcript

[00:00:01.750] Introduction
Welcome everyone to my EmacsConf presentation, where we're going to look at Lisp's vdemo[??] app from 1978, but done in modern Elisp. Then we're going to look at getting inferior-lisp working, my dear Common Lisp. Then we're going to use the Common Lisp interface manager, the open source child of the Common Lisp interface manager, McCLIM, from inferior-lisp in Superior Lisp, which is the opposite order that I initially thought we were going to do things in, but this is how it's kind of turned out. So it's this article, I thought, from 1978, was interesting to us today. “Programming in an Interactive Environment: the ‘Lisp’ Experience.” Explaining what all these LISP programmers were doing to people unfamiliar with LISP programming. “LISP systems have been used for highly interactive programming for more than a decade.” This was from 1978. And we're just going to go and, almost verbatim, port the demo application for LISP out of 1978 Interlisp and into Emacs Lisp. And we're going to do it without Org Mode, because I think everyone is finding out how great Org Mode is already. For inferior Lisp, I thought instead of org-mode, we'll theme it around slime-mode and then it turned out most of this presentation happens in Emacs Lisp, because this is an Emacs Lisp conference. But I found out that there's ielm-mode, which is pretty similar to slime-mode, but in our hearts, we can imagine that this is an Emacs example, homed around slime-mode, Superior Lisp Interaction Mode for Emacs, instead of org-mode. Though, you know, I do secretly use org-mode as well, not very secretly. But that means we're kind of improvising, improvising a presentation mode. So we have this big buffer of Elisp, and let's just... This is me, not Sandewall, out of interest, let's make a keyboard macro, go get the S-expression wherever the cursor is, move it to the next S-expression, paste it in here, and the keyboard macro, alright. What was basically happening...
[00:03:21.702] Calendar
So the demo application in this case is a scheduling application. And so you can imagine improvising a calendar like this if you weren't existingly using an org-mode integrated calendar. So, you know, just have a list and maybe each list is of sublists, where the first element, the car of the sublist, I guess, is a sensible-sounding date format, like sat dec 7, this is clearly the first day of EmacsConf. Then after that, a list of basically from and to times, and then a quick written description of whatever event was at that time. So similar to what we were seeing recently as of me recording this in our Structure and Interpretation of Computer Programs study group, you have all these little methods, sorry, defuns. So hours of a time is actually just car of the time, minutes of the time, cadr of time. And so we all know these kind of little, basically turning car and cadr, which we do use into descriptive names like from and to. You can see how this lines up with the appointments. So for "reproducibly building emacs" described event, I guess from would be 16 25. Let's just grab that and literally use those, because we're in interactive programming, right? So we have this quoted form and then let's do from of that. Great. And let's do minutes. So from 16 25, 16 45 reproducibly building Emacs, so when I do from to that I get 16 25 when I do minutes to 16 25, I get 25 and a description of this number in octal and hexadecimal, out of interest. What was up next? Okay, getting nextday from a date. And so, what was it? Saturday, December 27th. So what happens? So this function, I guess this was part of Sandewall's personal exploration of atoms using symbols with property lists, with an attached property list to every symbol. And so you can kind of see how this works. I get whatever was keyed by the symbol nextweekday out of the day symbol, so I guess we would do... so if we had Sat December 6, I guess we get Sat Oh, it destructures that itself somehow, get nextweekday. Sorry, nextday. set December 6th But of course these weren't defined yet, so what if we (setf (get 'sat 'nextweekday) 'sun) and it's going to be sun right And then if we (nextday '(sat dec 6)), Sunday, December 7th. Yeah, so that kind of makes sense in an intuitive way. And you can see cond is being used. So if you're not a Lisp person, cond evaluates a condition. If the condition returns non-nil, it executes the code attached to that condition. It evaluates each of these conditions in terms and then stops when one returns non-nil, as you might expect as a Lisp programmer. Let's keep marching along. Okay, so we have to populate this. And this was an interesting one. As you can see, this was my attempt. let days mon tue wed, so forth. Then I used cl-loop from Emacs Lisp, you know, for day in days, for nex in cdr days, setf nextweekday. This I thought was surprisingly deep, was that Lisp programmers, Sandewall thought, are basically constantly trying to break new ground and they lose interest very quickly when that's not what they're doing. And he was making the point that breaking new ground involves solving a problem exactly once. And so you kind of should do it in the most expedient way possible to solve it kind of for the first time. And after that, it's not breaking new ground anymore. And so I thought that was a kind of fun point from Sandewall's paper that we could kind of chew on. Do something similar for months and month lengths. But as we can see, if I get Feb, nrdr days I think that characters in 1978, characters and symbols in 1978 were more precious which is why Sandewall was writing in this abbreviated way. We might write more verbosely these days. We get 28th but it is in fact a leap year, so let's just set that to be 29. Now, it's fine. Then I guess if we do, we were doing nextday. Sure, nextday. I don't know what day it was. let's assume it was Sunday Feb 28 some kind of typo crept in there, but we can deal with it. Let's just setf get sun nextweekday month. So once we've solved it once, we should be fine, right? Okay, I think I have to speed up a bit. Yeah, there we go, Monday February 29th and then what if we nextday... Tuesday March 1st. Okay, it basically seems to be working. And I'd argue it's actually fun that we kind of had to do that. Then, just imagining you're kind of functioning with other people: day begins at 900, ends at 1700, so kind of a 9:00 to 5:00, imagining... though perhaps, shorter is more appropriate, but let's not quibble about that. What was happening next in this app? holesin. Oh, yeah, so get me the free slots in from start time, list of appointments, remembering characters, I guess, were more precious is my theory. And then an end time, so if I go holesin and then from 900 to where I've written 9 space 0 0 and what are my appointments? So I have a list of appointments that need to have start times and finish times. So let's go 12 59 to 13 01. The description, I guess, can be test. And then let's finish that at 1700, like we kind of thought. Oops, some of these were meant to be arguments. Okay, there we go. And so the available times between nine and five, if there's one appointment from 12:59 to 1:01, are from 9 to 1259 and from 1 past 1 to 5, which is kind of what we were expecting. And so our appointment app is kind of coming along. Then we have commonholes, kind of works in a sensible way. Do we have, what are some common holes from two lists of appointments, I guess? commonholes. I guess, let's have one person have an appointment from 9 to 10. That's going to be their only appointment. And let's have another person have an appointment from 9.30 to 10.30. Oh, we didn't do beforetime yet. This is the order Sandewall implemented things in there. Ok, there. So the commonholes are from 9.30 to 10. That's actually the overlapping time. I'll re-record this if some kind of gremlin has crept into my things. And then, what did we first start by doing? Emacsconf track 1 and Emacsconf track 2, and we'll do it on Saturday, December 7. commontime, and I'm being prompted, of course. emacsconf-track-1, emacsconf-track-2, the date that we grabbed. Let's say we want five minutes. And, as always, I'm forgetting to quote things. And so my opportunities for common times between emacsconf-track-1 to emacsconf-track-2 on the first day of the conference, Saturday, December 7th, for five minutes. I have an opportunity between 9:20 and 9:40, 11:40 and 13:00, 13:10, 13:25, 13:45, 13:55, and 16:15 to 16:25. So I think that's all working. And it was done with almost exactly the same code, except for my loopy populating symbol plist bits earlier, in Interlisp in 1978 as Emacs Lisp in 2024. I thought that was pretty interesting that you could do that. I think setf get was put prop was the biggest difference in 1978 Interlisp and modern Emacs Lisp. And obviously modern Emacs Lisp has Common Lisp loop in it, kind of. It's another big difference. How are we doing for time? 17 minutes? Great, because now let's get a bit closer to what my talk title has promised. We're going to use Common Lisp from Emacs Lisp and we're going to use Common Lisp Interface Manager, the open source implementation of Common Lisp Interface Manager from Inferior Lisp from Emacs Lisp. And what we just went over in Sandewall's paper... This was the starting point, and Sandewall says, well, if you just kind of jammed these ideas using lists you just kind of made hour a synonym for car and minute a synonym for cadr and so forth, you can then make a whole bunch of improvements. Can we actually get a glimpse of the … No, I didn't really write this. Yeah, so you can see I basically just ported out of the Interlisp code in the text of this paper. Yeah, you see from lambda of appointment, car appointment, and that's defineq. I guess Interlisp in 1978 used defineq, whereas we used defun in Elisp, but I'd encourage you to explore that yourselves. But the extension that I wanted to develop today is, since Common Lisp interface manager is just Lisp, and Inferior Lisp is just Lisp, and Emacs Lisp is just Lisp, and Interlisp in 1978 is just Lisp, we could kind of use them all together in a kind of funky way. But a complaint you often hear, or a statement of confusion that you often hear as a Lisp person, people from other languages often can't kind of figure out how to get started with Lisp. So I'm just going to try and do everything here and now.
[00:19:12.802] Inferior Lisp and McCLIM
And this is the second piece of my three pieces, so let's just get inferior lisp and McCLIM happening. We normally use slime Superior Lisp Interaction Mode for Emacs, which we could get from Emacs's package manager. If I go package-list-packages and then we wait for however fast my network is, we're going to see how long it's been since I updated something. Yeah, but you see it's in MELPA, right? It's got to be somewhere here. Yeah, all right. So there's one slime available in non-GNU, one possibly more recent one available in the MELPA package repositories. I don't know about you, but I can sympathize with people who feel confused by this because I think if you look online, if you found a search engine result, it doesn't customize these like I customize them. So let's just do this. customize-variable. package-archives. Yeah and you can see here I've ins-ed gnu, non-gnu, and melpa. It's melpa, not melpa stable. Saved and set. So that's how I do that. We're just kind of totally get an inferior lisp working. And then, like we saw before, this might occur, buffer is still open. No. occur. slime. So we could install and execute that. I cloned slime since Common Lisp people might use slime and swank, like McCLIM does outside of Emacs. I think we can secretly see I've got it here already in my ~/.emacs.d/slime, but you could install it like that. The hotkey is I, and then execute the install. I realize you all already know this, but many of you might not yet be Common Lisp programmers, and you can use both Superior and Inferior Lisp. Instead of package archives in Emacs, in Inferior Lisp, and with great controversy, we often use QuickLisp. People sometimes complain QuickLisp releases get out of date quite quickly. But there was one recently, so they're pretty in date. And so there should be a … Yeah, so basically you download quicklisp.lisp, you check its SHA-256 sum. So I guess in, ooh, over here, if I press D, ~screwtape/downloads/quicklisp.lisp. Great. If we open a shell, we realize that this is just riveting for all of our experts there. sha256 ~/Downloads/quicklisp.lisp Your SHA-256 might be different to mine. Somebody please tell me during the actual conference, the right Emacs idiom to do this. I guess it will be tools decrypt something. But then once you have QuickLisp, let's go back to our shell. I'm on OpenBSD or a BSD, so I type pkg_add ecl to get embeddable Common Lisp. However, I think I already have it. And then, let's start ecl [embeddable Common Lisp]. Quicklisp inserts itself already, but just loading that quicklisp.lisp file kind of would get you here anyway. Now let's (ql:quickload :mcclim) I'm actually following my plan. McCLIM is kind of like Emacs in that it handles all sorts of graphical stuff like if you have GTK Emacs, you know, it can do really a lot of stuff. That's the reason why compiling and loading the McCLIM package takes a while and I do use my old computer laptop, my old computer challenge laptop all the time, so when you do this, your computer will be substantially faster or you will be feeling smug about how slow you're running your computer, and so there's no problem. Next, we're going to start Swank which is the Lisp part of Emacs's slime-mode. If I remember, we looked at this before in my .emacs.d, and then there should be slime/start-swank.lisp. Let's just grab that and load it. You don't have to type #p. The string will work as well as the path name, but it's kind of fun to do so. Now, slime-connect. You installed slime earlier. Default values. Oh, the reason we had to do this and not use Slime, start Slime normally was that CLIM, Common Lisp Interface Manager, McCLIM, implementation of the Common Lisp Interface Manager spec, also uses Swank and McCLIM really wants to be in the driver's seat. We can have our Emacs connect to the Swank that McCLIM was already running. So (in-package :clim-user)... I don't know if this is an Emacs Lisp idiom, so you normally have user packages to absorb user code just for fooling around. Then let's just use clim at all. And so clim does lots of things around presentations but one thing it does is automatically, to a large extent, generate graphical user interfaces. So there's a lot to it that's not about graphics, kind of richer interfaces than ANSI Common Lisp's character streams. But let's use it to grab a graphical pop-up that returns a value. So we have this accepting-values tool. t is just choose whatever you think the default stream is. We're going to want our own window, t as well, so just a keyword argument. After that, we can just write things like (accept 'string). And I'm just doing this in, for people only listening, I've just done this in my ECL Slime REPL. Enter a string: foo bar baz. Alt-Enter, I think, is the shortcut to return that. As you can see, its first return was "foo bar baz", and it had second and third returns, string being the type, presentation type that it got, and t, I think, to indicate that it exited successfully. We can also do expression, might be more interesting. There are a whole bunch of these. clim's examples folder is pretty good. And the documentation, everybody's documentation, McCLIM's documentation, you know, lispworks and franz's documentation will tell you about the different default presentation types you can accept. And they're pretty intuitive and they're kind of very Lisp compatible, which everything kind of is. We could accept an expression. foo bar baz. return "foo bar baz 123" because that's what I wrote.
[00:29:10.964] Putting things together
And now the kind of pièce de résistance of putting those things together. Let's just run over to our scratch buffer. Oh, or our ielm thing, right? That's what we're actually doing. So now, I think we're going to do, hang on, M-:. I think it's going to be slime-eval-save, because it'll eval asynchronously. There's a question of how to get the value out of the asynchronous slime evaluation. And so an obvious way is to yank it. I'm looking forward to learning from kickingvegas. He finally makes it stick in my brain how to... Options other than just starting to write a command in the minibuffer and then mashing Tab and looking at what the likely sounding results are. That's what I will be learning this conference, if anything. slime-eval-save and then, what was happening over here? (accepting-values (t :own-window t) (accept 'expression)). Kind of confusingly, slime-eval-save takes a string, but it works really well, I'd argue. I think it's about to work really well. Ok, this is great. So you can see I've used... Oh, please enter an expression. So we're doing an expression. And so let's write like (3 4/2 5/6). That's an expression, right? And now I've yanked it. I should have really been in scratch, because I just want to dump. Sorry, scratch. Dump whatever that did. Oh, yeah, and see, it kind of simplified that while it was reading it. So running in Elisp, (slime-eval-save "(accepting-values (t :own-window t), accept 'expression))"). And I got the three returns all the way from McCLIM to inferior-lisp to Elisp. 3, 2, 5/6. Second return, it was a presentation type of expression, returned successfully, key. Yeah, so that's pretty cool. How out of time are we? Oh, we did this in basically half an hour. Maybe we could stop and assume there will be a bit under half an hour of interactive discussion. And when I also watch this and also receive suggestions, there will be additions and changes to make, I think. But can we quickly defun accept-date? Let's not take any arguments. Let's do this. accept-date. Saturday, December 7th. Oh, it doesn't return it. But it gets pretty close to returning it. I guess it yanks it. I would have to call … I'm going to say it's slime-sync, at which point it will resolve the slime-eval-async. And then I could get the first value out of my kill-ring pop, right? Does kill ring pop what I want? You know, you tell me in the interactive feedback, which should be happening in LambdaMOO. Well, I'll record another draft of this later after getting some feedback. Or worse to worse, this is just what you'll hear. Hopefully we have some questions and constructive comments. All right, see everybody later. Thank you so much for being here. Please do drop in to my live show if you're so inclined on Wednesdays where you're not busy with cool Emacs conferences. The list be go for climate. Thank you to everyone who helped. Thank you to Sacha for really getting me into this conference and kind of getting me going and submitting this prerecorded talk. See everybody later.

Captioner: rodrigo

Q&A transcript (unedited)

[00:00:00.000] I would love to see the GUI interacting with the scheduling stuff
...volume of code I've written that. I will do a follow-up video with the kind of synchronized elisp-mode stuff because that is the point of the talk. Sorry for talking over you. Please continue. sachac is saying (car kill-ring). Oh, yeah, so this question, they're just asking in the
[00:00:57.560] Q: Or any other GUI stuff you've worked on in the past that you'd be comfortable showing?
Scratchpad, is there any other GUI stuff I've worked on in the past? I guess my Toobnix channel, I was doing a bunch of that, so just Common Lisp development, homed around McCLIM. What is my Toobnix channel? If you find a Toobnix channel and it has a name like Screwtape, that'll presumably be that. So Toobnix is SDF.org's PeerTube. Nope, not that one. Sacha's got it here in the IRC. I think it's screwtape_channels/videos. Yeah. So the author of mastodon.el, which hopefully lots of us are using for our mastodoning, I used the name Screwtape as my username, and I think Wintermute said some kind of exasperated Emacs theme. You know what? Screw Lisp. Then Mousebot of mastodon.el rechristened me screwlisp. So sometimes you see my name written one way, and sometimes you see my name written the other way. I quite like it. A lot of people thought that I was quitting Emacs when I changed my name to be mainly screwlisp. I love it. That's a great story. Thank you. It's so great to have a name from somebody else. I was just thrilled. So thank you, mousebot. Everyone use mousebot's mode. Welcome to Green Guest. I'm with you there. All my kids want to choose their own names, and I'm just like, more power to you. I'm very glad that my parents picked mine for me, and that's one thing I never had to think about. All right, so do we have to cut short so I can go back to watching MPV? of the other stuff. We don't have to, but you are not obligated to sit here one moment more answering our questions than, you know, but of course, you know, we've talked a little before, but I, so I have a pile of questions.
[00:03:07.400] Lispy Gopher Show
You promised to come on the Lispy Gopher show. That's right. I have so much to say. I could, I could, I could come right on your show and just talk to you there, but I'm just curious. Talk to us a little bit about that. Tell us more about the program. Oh, the Lispy Gopher climate. What do we do? So it's hosted by the Superdimensional Fortress, SDF.org, who are a public access Unix mainly. They do their own little radio thing as well. And so I guess for a few years now, I do a weekly show every zero hundred hours UTC. We always start off with kind of climate crisis topics, because that is a climate crisis topic. But there's a sort of joy in that, because Kent Pitman, who Kent Pitman you're familiar with from the Pit Manual and so forth, writes a kind of climate crisis haiku, which we kind of lead out with, and we kind of go into the discussions there. Then obviously the show has- It's a highlight, not gonna lie. Yeah, yeah, I love it. I try and do these dramatic readings, but it's often stumble over. Actually, when Sacha was on, there was an auxiliary poem that happened, which was pretty interesting, too. What was I going to say? Then, I mean, the way we got named the Lispy Gopher Climate was because, broadly speaking, I like to talk about kind of lisp, and most of my writing for a long time was on the Gopher. Though I accidentally locked myself out of the Gopher recently, so there hasn't been an update there for a while. I'm kind of around the IRCs and Mastodon quite a bit now. Lisp, I like to use the term Lisp inclusively, basically. Obviously this talk, I was making the point that I just could go through a 1978 paper written in, and so pre-D machine inter-LISP, right? And it basically just worked in modern Emacs LISP. Somebody was pointing out to me, who pointed out where I was like, I don't know what PUT is in, in Emacs Lisp, and somebody was saying definitely there's put in Emacs Lisp. So I'm going to come back to the recording of this talk, and I'm going to just pinpoint this moment the next time somebody says, we need to modernize Lisp. I'm going to say, no, no, no, this is modern Emacs Lisp. You see, here's people talking about, yeah, I'm just tripping over, not tripping over, I'm amused by your phrase there, but that's exactly how I see it too. And I take your point utterly that, you know, this tradition of Lisp of carrying forward ideas. And, you know, we, you know, especially in Emacs, it really is like a brain trust, right? Buckets of knowledge of how to get some sort of work done, or, you know, how to work with some kind of code or some kind of data. Yeah, but I had a kind of, interesting experience with some great friends of mine, whom I love dearly. Vidak, if you're watching this, I'm gossiping about you people over in Australia there.
[00:06:21.560] Lisp already did it
Where people come to you with really exciting ideas that seem to be very cutting edge and like, you know, very much the current talk of the day, like you can hear in other programming languages, and they're telling you how they think you might be able to do this in Lisp. And you have to say, well, you know, if we go back to the late 70s, where the Lisp community really kind of pioneered this topic already. Here's how we did it in the late 70s. And there's actually quite a kind of awkward, just kind of disjunction there. I mean, that's the thing, right? Where use of Emacs in particular use of Lisp in general will unravel somebody's whole big bag of wind that they've built up around why something has to be rebuilt and well right but that's just a function you know it's data so we'll probably just think about that as I don't know sitting in a variable. Oh, so that whole problem, like the elegance of a solution can entirely fall away once you fall back to an earlier way of thinking about it. And then, you know, look at the pieces you've carried forward the idea of the declarative language, right? Declaring user experience. Yeah. Once again, tangentially to, um, to the actual talk we've just watched, which I will try and follow up on as well. But one example was After watching me use the Common Lisp loop facility so much, Kent pointed out to me, hey, you know, why don't you try using Richard Waters' series iteration stuff, which was kind of lazy evaluation of series that Waters did. And so after criticizing Haskell for a long time, me kind of saying, hey, you know, I don't think this lazy evaluation is important. then Kent pointed out to me that, for example, the series, like what is it? AIM 1082 or something published in 1989 was Lazy Evaluation in LISP with series. And so I thought, well, once I realized that this was part of kind of almost classic LISP history to have lazy evaluation, I adopted series, I kind of had to rethink my LISP worldview to realize it did already include lazy evaluation, which I attributed to the late 80s. And then when I actually read a little bit further, lazy evaluation, depending on your research group, has been, was kind of established in the late 70s by Waters again, actually. Sorry for the anecdote, just kind of the interesting medley. Not at all. Yeah. Ellis over in the IRC has come up with a good slime about async. Oh, I see. So yeah, I guess that would work. I have to try that. OK, so you're just getting me reading this. They have had a stab at resolving our asynchronous calls thing more elegantly than me. Left as an exercise to the listener. It's one of the big virtues of something like a convention. It'll bring us together with other people that can kind of see past the boats in our eyes. Oh yeah, that's easy for me. Yeah, definitely. Hearing somebody else's kind of thought process from you and from just the past speaker who was Robin, I think, because this was in the morning for me, so I just kind of got up and caught some of Robin. Yeah, it's so great, kind of vicariously experiencing somebody else's Emacs usage and how it kind of subtly backs onto their own development flows. Yeah, so I really appreciate this talk. I'm constantly cribbing from everyone I meet. And yeah, this talk has been eye-popping, just watching you casually navigate Emacs, actually. Yeah, it's cool. Yeah, I enjoyed discovering IELM mode. That was going to be my other question for people. Are there any IELM Power users around? I could really go for an EmacsConf talk on IELM mode. Aha, yes. Very good. Note taken. Yeah. So, just thoughts for next year? Oh, well, I kind of want to get back onto the MPV, but thank you so much for this. You are cmak in the IRC, right? I am Corwin, same as you. So you're Corwin. There's also cmak, and I guess there are a few other people. Sorry that I'm tripping over the different people here. But you're going to come on the Lispy Gopher Climate later. Sure, I'm happy to. That sounds like fun. I always got a million things to talk about me or an opinion on everything. But of course, my favorite thing to talk about is just the huge thanks that, you know, sharing that, the generosity or the, you know, my appreciation for you and all the other members of the Emacs community that create talks like this and make the conference and the rest of the community so rich. Well, yeah, and thank you for your work. Sacha is just saying over in Lambda that when I say I want someone to give the talk, this means I'm volunteering to give the IELM talk. That's what I wrote down. Oh, yeah. I've been working for Sacha. I mean, helping Sacha with this conference for years. I know. No, I'm kidding. That would be cool. I will absolutely go to your ielm talk. I make a lot of use of that and could do more. Yeah, we're meant to suddenly
[00:12:32.880] Q: Are we going to get a McCLIM LambdaMOO client?
stop. But a guest over in Lambda also said, are we going to get a McCLIM LambdaMOO client? And I actually had all my kind of Moo stuff I'd written in Common Lisp, which I was thinking of just kind of jettisoning. But you're right, I should make that into a client for Common Lisp. Anyway, I'm going to hang up so I can keep watching the conference sounds good so we'll just cut away with the stream throw some music and a countdown uh back on give us just a second to make that on bbb and then i'll give you the big thumbs up thank you thank you recording here we'll get it all posted up uh right next to your awesome pre-recorded talk thanks again like it's been fun chatting and uh Yeah, definitely seeing you around in the conference channel off off season. So to speak, you're like, you're totally welcome to use our chat like it to the extent you need to IRC channel that's been working on great for me. It's fun to fun to see it. All right, I'm gonna hang up this thing. All right. Happy day flowy. Sorry, I mean, screwlisp. Oh my gosh, I have conference brain. Bye bye. All right, later, later.

Questions or comments? Please e-mail emacsconf-org-private@gnu.org

Back to the talks Previous by track: Committing secrets with git using sops-mode Next by track: Emacs, eev, and Maxima - now! Track: Development