summaryrefslogtreecommitdiffstats
path: root/2022/talks/async.md
diff options
context:
space:
mode:
Diffstat (limited to '2022/talks/async.md')
-rw-r--r--2022/talks/async.md103
1 files changed, 103 insertions, 0 deletions
diff --git a/2022/talks/async.md b/2022/talks/async.md
new file mode 100644
index 00000000..5b7fbbc8
--- /dev/null
+++ b/2022/talks/async.md
@@ -0,0 +1,103 @@
+[[!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.
+
+Michael is a developer and long-time Emacs user from the San Francisco
+Bay area. He hacks in C++, Lisp & Rust and thinks a lot about writing
+provably correct code. You can find him at:
+
+ - his [home page](https://www.unwoundstack.com)
+ - on IRC: sp1ff on Libera.Chat
+ - through [e-mail](mailto:sp1ff@pobox.com)
+ - or on [Github](https://github.com/sp1ff)
+
+# Discussion
+
+- Q: (Referencing the first half of your talk): How does this approach
+ compare to using tq.el, Emacs' built-in library for transaction
+ queues?
+ - A: Great question; should have mentioned that... I took a look,
+ but chose to just do it "by hand"; I wouldn't have used many
+ of the features offerred by tq.
+- Q: Have you considered using the aio.el library (written by Chris
+ Wellons) that implements async/await for Emacs lisp using promises?
+ It's implemented using Elisp's record data structure, and turns
+ the nested callback structure into regular-looking Elisp code
+ (without extra keywords etc). +1
+ - A: I wasn't aware, but thanks for the pointer-- will
+ definitely take a look
+- Q: not to take away from your excellent work, but are you aware that
+ EMMS has an MPD client? There's also mpc.el built into Emacs.
+ - A: Another great point; I am, along with mpdel (another MPD
+ client for Emacs). They are all full-fledge applications-- I
+ just wanted a small, tight toolkit
+- Q:Have you seen the Lonesome Pine Specials? I saw your music library
+ and figured you would be interested. My favorite is the one with
+ Edgar Meyer, Sam Bush, Jerry Douglas, and I think Bela Fleck and
+ Mark O'Connor?
+ - A: LOL I haven't, but I I think I will be!
+- Q: can you share the code to the macro that creates the callback
+ tree?
+ - A: <https://github.com/sp1ff/elmpd/blob/master/elmpd.el#L898>
+ - thanks!
+- Q: would using dynamic/special vars add anything interesting /
+ easier to async elisp in your opinion? i noticed you using `let` a
+ lot, but if you defined a variable hmm... not sure if i can :)  i
+ was just wondering if having dynamic binding in Elisp opposed to
+ something like JS adds some power to async programming
+ - A: lexical binding is easier to reason about :)
+- Q: There's another package (chuntaro?) in addition to wellon's aio
+ that also implements a coroutine trampoline on the emacs event loop.
+ any thoughts on the async/await paradigm generally red/blue
+ functions, etc?
+ - A: Longer discussion in the chat room, but I think it's a
+ promising if over-used approach to concurrency.
+- Q: How does your project compare to some of the other MPD clients?
+- Q: Any thoughts on the async await paradigm generally, red-blue functions, etc.?
+- Q: Do you think it's a viable future for Emacs to get out of callback hell?
+
+Comments from YouTube:
+
+- Thank you for the informative video Michael! Now I know a way to avoid callback hell in Emacs lisp!
+- Nice talk, thank you Michael!
+
+[[!inline pages="internal(2022/info/async-after)" raw="yes"]]
+
+[[!inline pages="internal(2022/info/async-nav)" raw="yes"]]
+
+