blob: 5b57f8861946474296ae43f12e0cc889dce73933 (
plain) (
tree)
|
|
[[!sidebar content=""]]
[[!meta title="Emacs was async before async was cool"]]
[[!meta copyright="Copyright © 2022 Michael Herstine"]]
[[!inline pages="internal(2022/info/async-nav)" raw="yes"]]
<!-- Initially generated with emacsconf-generate-talk-page and then left alone for manual editing -->
<!-- You can manually edit this file to update the abstract, add links, etc. --->
# Emacs was async before async was cool
Michael Herstine (IRC: sp1ff)
[[!inline pages="internal(2022/info/async-before)" raw="yes"]]
While async is all the rage in the JavaScript, Go and Rust
communities, Emacs has had the ability to (certain) asynchronous
processing all along. I learned this while writing an Emacs package to
program to my music server's API.
Music Player Daemon is a project that does what it says: hangs out in
the background & plays your music. It has an API that I wanted to call
from Emacs. I had just learned async Rust, so I decided to see if I
could do something similar here. It turns out I could: I wound-up
writing a little async runtime that allows callers to "send" commands
to the daemon by queueing them up and returning immediately. In the
background, as output from previous commands comes in, new commands
are dequeued and sent.
This required callers to provide callbacks in order to receive the
results of their commands, which led to a situation all too familiar
to Javascript programmers: callback hell. The coda to my story was
(finally) coming to understand Lisp macros in order to extend Emacs
Lisp with a more convenient construct for sending multiple commands.
This talk will dive into the details of the Emacs Lisp process API,
specifically the Low-Level Network Access API, with illustrations as
to how it can be used to build an asynchronous queue. It will also
introduce Lisp macros and how powerful they can be.
Outline:
- introduce myself & the problem
- go into more depth on the problem
- overview of the solution:
- sketch out the Emacs API available to me
- sketch out the purpose-built async runtime I came up with in Emacs Lisp
- coda: this worked but led to ugly code on the part of callers
- insight: in Lisp, the code is just data!
- non-trivial demo
[[!inline pages="internal(2022/info/async-after)" raw="yes"]]
[[!inline pages="internal(2022/info/async-nav)" raw="yes"]]
|